self-service delete_contact, RT#37375
[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::contact;
7
8 sub _custoragent_session_custnum {
9   FS::ClientAPI::MyAccount::_custoragent_session_custnum(@_);
10 }
11
12 sub contact_passwd {
13   my $p = shift;
14   my($context, $session, $custnum) = _custoragent_session_custnum($p);
15   return { 'error' => $session } if $context eq 'error';
16
17   return { 'error' => 'Not logged in as a contact.' }
18     unless $session->{'contactnum'};
19
20   return { 'error' => 'Enter new password' }
21     unless length($p->{'new_password'});
22
23   my $contact = _contact( $session->{'contactnum'}, $custnum )
24     or return { 'error' => "Email not found" };
25
26   my $error = '';
27
28   # use these svc_acct length restrictions??
29   my $conf = new FS::Conf;
30   $error = 'Password too short.'
31     if length($p->{'new_password'}) < ($conf->config('passwordmin') || 6);
32   $error = 'Password too long.'
33     if length($p->{'new_password'}) > ($conf->config('passwordmax') || 8);
34
35   $error ||= $contact->change_password($p->{'new_password'});
36
37   return { 'error' => $error };
38
39 }
40
41 sub _contact {
42   my( $contactnum, $custnum ) = @_;
43
44   #my $search = { 'custnum' => $custnum };
45   #$search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent';
46   $custnum =~ /^(\d+)$/ or die "illegal custnum";
47   my $search = " AND contact.selfservice_access IS NOT NULL ".
48                " AND contact.selfservice_access = 'Y' ".
49                " AND ( disabled IS NULL OR disabled = '' )".
50                " AND custnum = $1";
51 #  $search .= " AND agentnum = ". $session->{'agentnum'} if $context eq 'agent';
52
53   qsearchs( {
54     'table'     => 'contact',
55     'addl_from' => 'LEFT JOIN cust_main USING ( 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_email;
73     { 'contactnum'         => $_->contactnum,
74       'class'              => $_->contact_classname,
75       'first'              => $_->first,
76       'last'               => $_->get('last'),
77       'title'              => $_->title,
78       'emailaddress'       => join(',', map $_->emailaddress, @contact_email),
79       #TODO: contact phone numbers
80       'comment'            => $_->comment,
81       'selfservice_access' => $_->selfservice_access,
82       'disabled'           => $_->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   #TODO: change more fields besides just these
104
105   foreach (qw( first last title emailaddress )) {
106     $contact->$_( $p->{$_} ) if length( $p->{$_} );
107   }
108
109   my $error = $contact->replace;
110
111   return { 'error' => $error, };
112
113 }
114
115 sub delete_contact {
116   my $p = shift;
117
118   my($context, $session, $custnum) = _custoragent_session_custnum($p);
119   return { 'error' => $session } if $context eq 'error';
120
121   return { 'error' => 'Cannot delete the currently-logged in contact.' }
122     if $p->{contactnum} == $session->{contactnum};
123
124   my $contact = qsearchs('contact', { contactnum =>$ p->{contactnum},
125                                       custnum    => $custnum,         } )
126     or return { 'error' => 'Unknown contactnum' };
127
128   my $error = $contact->delete;
129   return { 'error' => $error } if $error;
130
131   return { 'error' => '', };
132 }
133
134 1;