1 package FS::ClientAPI::MyAccount::contact;
4 use FS::Record qw( qsearchs );
9 sub _custoragent_session_custnum {
10 FS::ClientAPI::MyAccount::_custoragent_session_custnum(@_);
15 my($context, $session, $custnum) = _custoragent_session_custnum($p);
16 return { 'error' => $session } if $context eq 'error';
18 return { 'error' => 'Not logged in as a contact.' }
19 unless $session->{'contactnum'};
21 return { 'error' => 'Enter new password' }
22 unless length($p->{'new_password'});
24 my $contact = _contact( $session->{'contactnum'}, $custnum )
25 or return { 'error' => "Email not found" };
29 # length checks now in is_password_allowed
31 $error ||= $contact->is_password_allowed($p->{'new_password'});
33 $error ||= $contact->change_password($p->{'new_password'});
35 return { 'error' => $error };
40 my( $contactnum, $custnum ) = @_;
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';
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
65 my($context, $session, $custnum) = _custoragent_session_custnum($p);
66 return { 'error' => $session } if $context eq 'error';
68 my $cust_main = qsearchs('cust_main', { custnum=>$custnum } );
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,
84 } $cust_main->cust_contact );
86 return { 'error' => '',
87 'contacts' => \@contacts,
94 my($context, $session, $custnum) = _custoragent_session_custnum($p);
95 return { 'error' => $session } if $context eq 'error';
97 #shortcut: logged in as a contact? that must be the one you want to edit
98 my $contactnum = $p->{contactnum} || $session->{'contactnum'};
100 my $contact = _contact( $contactnum, $custnum )
101 or return { 'error' => "Email not found" };
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;
107 #my $cust_contact = qsearchs('cust_contact', { contactnum => $contactnum,
108 # custnum => $custnum, } )
109 # or die "guru meditation #4200";
111 #TODO: change more fields besides just these
113 foreach (qw( first last title emailaddress )) {
114 $contact->$_( $p->{$_} ) if length( $p->{$_} );
117 my $error = $contact->replace;
119 return { 'error' => $error, };
126 my($context, $session, $custnum) = _custoragent_session_custnum($p);
127 return { 'error' => $session } if $context eq 'error';
129 return { 'error' => 'Cannot delete the currently-logged in contact.' }
130 if $p->{contactnum} == $session->{contactnum};
132 my $cust_contact = qsearchs('cust_contact', { contactnum => $p->{contactnum},
133 custnum => $custnum, })
134 or return { 'error' => 'Unknown contactnum' };
136 my $contact = $cust_contact->contact;
138 my $error = $cust_contact->delete;
139 return { 'error' => $error } if $error;
141 unless ( $contact->cust_contact || $contact->prospect_contact ) {
145 return { 'error' => '', };
151 my($context, $session, $custnum) = _custoragent_session_custnum($p);
152 return { 'error' => $session } if $context eq 'error';
154 #TODO: add phone numbers too
155 #TODO: specify a classnum by name and/or list_contact_classes method
157 my $contact = new FS::contact {
158 'custnum' => $custnum,
159 map { $_ => $p->{$_} }
160 qw( first last emailaddress classnum comment selfservice_access )
163 $contact->change_password_fields($p->{_password}) if length($p->{_password});
165 my $error = $contact->insert;
166 return { 'error' => $error, };