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 # use these svc_acct length restrictions??
30 my $conf = new FS::Conf;
31 $error = 'Password too short.'
32 if length($p->{'new_password'}) < ($conf->config('passwordmin') || 6);
33 $error = 'Password too long.'
34 if length($p->{'new_password'}) > ($conf->config('passwordmax') || 8);
36 $error ||= $contact->change_password($p->{'new_password'});
38 return { 'error' => $error };
43 my( $contactnum, $custnum ) = @_;
45 #my $search = { 'custnum' => $custnum };
46 #$search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent';
47 $custnum =~ /^(\d+)$/ or die "illegal custnum";
48 my $search = " AND cust_contact.selfservice_access IS NOT NULL ".
49 " AND cust_contact.selfservice_access = 'Y' ".
50 " AND ( disabled IS NULL OR disabled = '' )".
51 " AND cust_contact.custnum IS NOT NULL AND cust_contact.custnum = $1";
52 # $search .= " AND agentnum = ". $session->{'agentnum'} if $context eq 'agent';
56 #'addl_from' => 'LEFT JOIN cust_main USING ( custnum ) ',
57 'addl_from' => ' LEFT JOIN cust_contact USING ( contactnum ) '.
58 ' LEFT JOIN cust_main ON ( cust_contact.custnum = cust_main.custnum ) ',
59 'hashref' => { 'contactnum' => $contactnum, },
60 'extra_sql' => $search, #important
68 my($context, $session, $custnum) = _custoragent_session_custnum($p);
69 return { 'error' => $session } if $context eq 'error';
71 my $cust_main = qsearchs('cust_main', { custnum=>$custnum } );
73 my @contacts = ( map {
74 my $contact = $_->contact;
75 my @contact_email = $contact->contact_email;
76 { 'contactnum' => $contact->contactnum,
77 'class' => $_->contact_classname,
78 'first' => $contact->first,
79 'last' => $contact->get('last'),
80 'title' => $contact->title,
81 'emailaddress' => join(',', map $_->emailaddress, @contact_email),
82 #TODO: contact phone numbers
83 'comment' => $_->comment,
84 'selfservice_access' => $_->selfservice_access,
85 #'disabled' => $contact->disabled,
87 } $cust_main->cust_contact );
89 return { 'error' => '',
90 'contacts' => \@contacts,
97 my($context, $session, $custnum) = _custoragent_session_custnum($p);
98 return { 'error' => $session } if $context eq 'error';
100 #shortcut: logged in as a contact? that must be the one you want to edit
101 my $contactnum = $p->{contactnum} || $session->{'contactnum'};
103 my $contact = _contact( $contactnum, $custnum )
104 or return { 'error' => "Email not found" };
106 return { error => "Can't edit a multi-customer contact unless logged in as that contact" }
107 if $contactnum != $session->{'contactnum'}
108 && scalar( $contact->cust_contact ) > 1;
110 #my $cust_contact = qsearchs('cust_contact', { contactnum => $contactnum,
111 # custnum => $custnum, } )
112 # or die "guru meditation #4200";
114 #TODO: change more fields besides just these
116 foreach (qw( first last title emailaddress )) {
117 $contact->$_( $p->{$_} ) if length( $p->{$_} );
120 my $error = $contact->replace;
122 return { 'error' => $error, };
129 my($context, $session, $custnum) = _custoragent_session_custnum($p);
130 return { 'error' => $session } if $context eq 'error';
132 return { 'error' => 'Cannot delete the currently-logged in contact.' }
133 if $p->{contactnum} == $session->{contactnum};
135 my $cust_contact = qsearchs('cust_contact', { contactnum => $p->{contactnum},
136 custnum => $custnum, })
137 or return { 'error' => 'Unknown contactnum' };
139 my $contact = $cust_contact->contact;
141 my $error = $cust_contact->delete;
142 return { 'error' => $error } if $error;
144 unless ( $contact->cust_contact || $contact->prospect_contact ) {
148 return { 'error' => '', };
154 my($context, $session, $custnum) = _custoragent_session_custnum($p);
155 return { 'error' => $session } if $context eq 'error';
157 #TODO: add phone numbers too
158 #TODO: specify a classnum by name and/or list_contact_classes method
160 my $contact = new FS::contact {
161 'custnum' => $custnum,
162 map { $_ => $p->{$_} }
163 qw( first last emailaddress classnum comment selfservice_access )
166 $contact->change_password_fields($p->{_password}) if length($p->{_password});
168 my $error = $contact->insert;
169 return { 'error' => $error, };