contact self-service pw changes, RT#37023
[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 contact.selfservice_access IS NOT NULL ".
49                " AND contact.selfservice_access = 'Y' ".
50                " AND ( disabled IS NULL OR disabled = '' )".
51                " AND 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     'hashref'   => { 'contactnum' => $contactnum, },
58     'extra_sql' => $search, #important
59   } );
60
61 }
62
63 sub list_contacts {
64   my $p = shift;
65
66   my($context, $session, $custnum) = _custoragent_session_custnum($p);
67   return { 'error' => $session } if $context eq 'error';
68
69   my $cust_main = qsearchs('cust_main', { custnum=>$custnum } );
70
71   my @contacts = ( map {
72     my $contact = $_->contact;
73     my @contact_email = $_->contact_email;
74     { 'contactnum'         => $_->contactnum,
75       'class'              => $_->contact_classname,
76       'first'              => $_->first,
77       'last'               => $_->get('last'),
78       'title'              => $_->title,
79       'emailaddress'       => join(',', map $_->emailaddress, @contact_email),
80       #TODO: contact phone numbers
81       'comment'            => $_->comment,
82       'selfservice_access' => $_->selfservice_access,
83       'disabled'           => $_->disabled,
84     };
85   } $cust_main->cust_contact );
86
87   return { 'error'    => '',
88            'contacts' => \@contacts,
89          };
90 }
91
92 sub edit_contact {
93   my $p = shift;
94
95   my($context, $session, $custnum) = _custoragent_session_custnum($p);
96   return { 'error' => $session } if $context eq 'error';
97
98   #shortcut: logged in as a contact?  that must be the one you want to edit
99   my $contactnum = $p->{contactnum} || $session->{'contactnum'};
100
101   my $contact = _contact( $contactnum, $custnum )
102     or return { 'error' => "Email not found" };
103
104   #TODO: change more fields besides just these
105
106   foreach (qw( first last title emailaddress )) {
107     $contact->$_( $p->{$_} ) if length( $p->{$_} );
108   }
109
110   my $error = $contact->replace;
111
112   return { 'error' => $error, };
113
114 }
115
116 sub delete_contact {
117   my $p = shift;
118
119   my($context, $session, $custnum) = _custoragent_session_custnum($p);
120   return { 'error' => $session } if $context eq 'error';
121
122   my $contact = qsearchs('contact', { contactnum =>$ p->{contactnum},
123                                       custnum    => $custnum,         } )
124     or return { 'error' => 'Unknown contactnum' };
125
126   my $error = $contact->delete;
127   return { 'error' => $error } if $error;
128
129   return { 'error' => '', };
130 }
131
132 1;