72226e2dcee638475aa9698abdda2cd7b59a0d97
[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   # 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);
35
36   $error ||= $contact->change_password($p->{'new_password'});
37
38   return { 'error' => $error };
39
40 }
41
42 sub _contact {
43   my( $contactnum, $custnum ) = @_;
44
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';
53
54   qsearchs( {
55     'table'     => 'contact',
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
61   } );
62
63 }
64
65 sub list_contacts {
66   my $p = shift;
67
68   my($context, $session, $custnum) = _custoragent_session_custnum($p);
69   return { 'error' => $session } if $context eq 'error';
70
71   my $cust_main = qsearchs('cust_main', { custnum=>$custnum } );
72
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,
86     };
87   } $cust_main->cust_contact );
88
89   return { 'error'    => '',
90            'contacts' => \@contacts,
91          };
92 }
93
94 sub edit_contact {
95   my $p = shift;
96
97   my($context, $session, $custnum) = _custoragent_session_custnum($p);
98   return { 'error' => $session } if $context eq 'error';
99
100   #shortcut: logged in as a contact?  that must be the one you want to edit
101   my $contactnum = $p->{contactnum} || $session->{'contactnum'};
102
103   my $contact = _contact( $contactnum, $custnum )
104     or return { 'error' => "Email not found" };
105
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;
109
110   #my $cust_contact = qsearchs('cust_contact', { contactnum => $contactnum,
111   #                                              custnum    => $custnum,    } )
112   #  or die "guru meditation #4200";
113
114   #TODO: change more fields besides just these
115
116   foreach (qw( first last title emailaddress )) {
117     $contact->$_( $p->{$_} ) if length( $p->{$_} );
118   }
119
120   my $error = $contact->replace;
121
122   return { 'error' => $error, };
123
124 }
125
126 sub delete_contact {
127   my $p = shift;
128
129   my($context, $session, $custnum) = _custoragent_session_custnum($p);
130   return { 'error' => $session } if $context eq 'error';
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 ) {
142     $contact->delete;
143   }
144
145   return { 'error' => '', };
146 }
147
148 1;