default to a session cookie instead of setting an explicit timeout, weird timezone...
[freeside.git] / FS / FS / ClientAPI / MyAccount / contact.pm
1 package FS::ClientAPI::MyAccount::contact;
2
3 use strict;
4 use FS::Record qw( qsearchs );
5 use FS::cust_main;
6 use FS::cust_contact;
7 use FS::contact;
8
9 sub _custoragent_session_custnum {
10   FS::ClientAPI::MyAccount::_custoragent_session_custnum(@_);
11 }
12
13 sub contact_passwd {
14   my $p = shift;
15   my($context, $session, $custnum) = _custoragent_session_custnum($p);
16   return { 'error' => $session } if $context eq 'error';
17
18   return { 'error' => 'Not logged in as a contact.' }
19     unless $session->{'contactnum'};
20
21   return { 'error' => 'Enter new password' }
22     unless length($p->{'new_password'});
23
24   my $contact = _contact( $session->{'contactnum'}, $custnum )
25     or return { 'error' => "Email not found" };
26
27   my $error = '';
28
29   # length checks now in is_password_allowed
30
31   $error ||= $contact->is_password_allowed($p->{'new_password'});
32
33   $error ||= $contact->change_password($p->{'new_password'});
34
35   return { 'error' => $error };
36
37 }
38
39 sub _contact {
40   my( $contactnum, $custnum ) = @_;
41
42   #my $search = { 'custnum' => $custnum };
43   #$search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent';
44   $custnum =~ /^(\d+)$/ or die "illegal custnum";
45   my $search = " AND cust_contact.selfservice_access IS NOT NULL ".
46                " AND cust_contact.selfservice_access = 'Y' ".
47                " AND ( disabled IS NULL OR disabled = '' )".
48                " AND cust_contact.custnum IS NOT NULL AND cust_contact.custnum = $1";
49 #  $search .= " AND agentnum = ". $session->{'agentnum'} if $context eq 'agent';
50
51   qsearchs( {
52     'table'     => 'contact',
53     #'addl_from' => 'LEFT JOIN cust_main USING ( custnum ) ',
54     'addl_from' => ' LEFT JOIN cust_contact USING ( contactnum ) '.
55                    ' LEFT JOIN cust_main ON ( cust_contact.custnum = cust_main.custnum ) ',
56     'hashref'   => { 'contactnum' => $contactnum, },
57     'extra_sql' => $search, #important
58   } );
59
60 }
61
62 sub list_contacts {
63   my $p = shift;
64
65   my($context, $session, $custnum) = _custoragent_session_custnum($p);
66   return { 'error' => $session } if $context eq 'error';
67
68   my $cust_main = qsearchs('cust_main', { custnum=>$custnum } );
69
70   my @contacts = ( map {
71     my $contact = $_->contact;
72     my @contact_email = $contact->contact_email;
73     { 'contactnum'         => $contact->contactnum,
74       'class'              => $_->contact_classname,
75       'first'              => $contact->first,
76       'last'               => $contact->get('last'),
77       'title'              => $contact->title,
78       'emailaddress'       => join(',', map $_->emailaddress, @contact_email),
79       #TODO: contact phone numbers
80       'comment'            => $_->comment,
81       'selfservice_access' => $_->selfservice_access,
82       #'disabled'           => $contact->disabled,
83     };
84   } $cust_main->cust_contact );
85
86   return { 'error'    => '',
87            'contacts' => \@contacts,
88          };
89 }
90
91 sub edit_contact {
92   my $p = shift;
93
94   my($context, $session, $custnum) = _custoragent_session_custnum($p);
95   return { 'error' => $session } if $context eq 'error';
96
97   #shortcut: logged in as a contact?  that must be the one you want to edit
98   my $contactnum = $p->{contactnum} || $session->{'contactnum'};
99
100   my $contact = _contact( $contactnum, $custnum )
101     or return { 'error' => "Email not found" };
102
103   return { error => "Can't edit a multi-customer contact unless logged in as that contact" }
104     if $contactnum != $session->{'contactnum'}
105     && scalar( $contact->cust_contact ) > 1;
106
107   #my $cust_contact = qsearchs('cust_contact', { contactnum => $contactnum,
108   #                                              custnum    => $custnum,    } )
109   #  or die "guru meditation #4200";
110
111   #TODO: change more fields besides just these
112
113   foreach (qw( first last title emailaddress )) {
114     $contact->$_( $p->{$_} ) if length( $p->{$_} );
115   }
116
117   my $error = $contact->replace;
118
119   return { 'error' => $error, };
120
121 }
122
123 sub delete_contact {
124   my $p = shift;
125
126   my($context, $session, $custnum) = _custoragent_session_custnum($p);
127   return { 'error' => $session } if $context eq 'error';
128
129   return { 'error' => 'Cannot delete the currently-logged in contact.' }
130     if $p->{contactnum} == $session->{contactnum};
131
132   my $cust_contact = qsearchs('cust_contact', { contactnum => $p->{contactnum},
133                                                 custnum    => $custnum,       })
134     or return { 'error' => 'Unknown contactnum' };
135
136   my $contact = $cust_contact->contact;
137
138   my $error = $cust_contact->delete;
139   return { 'error' => $error } if $error;
140
141   unless ( $contact->cust_contact || $contact->prospect_contact ) {
142     $contact->delete;
143   }
144
145   return { 'error' => '', };
146 }
147
148 sub new_contact {
149   my $p = shift;
150
151   my($context, $session, $custnum) = _custoragent_session_custnum($p);
152   return { 'error' => $session } if $context eq 'error';
153
154   #TODO: add phone numbers too
155   #TODO: specify a classnum by name and/or list_contact_classes method
156
157   my $contact = new FS::contact {
158     'custnum' => $custnum,
159     map { $_ => $p->{$_} }
160       qw( first last emailaddress classnum comment selfservice_access )
161   };
162
163   $contact->change_password_fields($p->{_password}) if length($p->{_password});
164
165   my $error = $contact->insert;
166   return { 'error' => $error, };
167 }
168
169 1;