summaryrefslogtreecommitdiff
path: root/FS/FS/ClientAPI/MyAccount/contact.pm
blob: 72226e2dcee638475aa9698abdda2cd7b59a0d97 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package FS::ClientAPI::MyAccount::contact;

use strict;
use FS::Record qw( qsearchs );
use FS::cust_main;
use FS::cust_contact;
use FS::contact;

sub _custoragent_session_custnum {
  FS::ClientAPI::MyAccount::_custoragent_session_custnum(@_);
}

sub contact_passwd {
  my $p = shift;
  my($context, $session, $custnum) = _custoragent_session_custnum($p);
  return { 'error' => $session } if $context eq 'error';

  return { 'error' => 'Not logged in as a contact.' }
    unless $session->{'contactnum'};

  return { 'error' => 'Enter new password' }
    unless length($p->{'new_password'});

  my $contact = _contact( $session->{'contactnum'}, $custnum )
    or return { 'error' => "Email not found" };

  my $error = '';

  # use these svc_acct length restrictions??
  my $conf = new FS::Conf;
  $error = 'Password too short.'
    if length($p->{'new_password'}) < ($conf->config('passwordmin') || 6);
  $error = 'Password too long.'
    if length($p->{'new_password'}) > ($conf->config('passwordmax') || 8);

  $error ||= $contact->change_password($p->{'new_password'});

  return { 'error' => $error };

}

sub _contact {
  my( $contactnum, $custnum ) = @_;

  #my $search = { 'custnum' => $custnum };
  #$search->{'agentnum'} = $session->{'agentnum'} if $context eq 'agent';
  $custnum =~ /^(\d+)$/ or die "illegal custnum";
  my $search = " AND cust_contact.selfservice_access IS NOT NULL ".
               " AND cust_contact.selfservice_access = 'Y' ".
               " AND ( disabled IS NULL OR disabled = '' )".
               " AND cust_contact.custnum IS NOT NULL AND cust_contact.custnum = $1";
#  $search .= " AND agentnum = ". $session->{'agentnum'} if $context eq 'agent';

  qsearchs( {
    'table'     => 'contact',
    #'addl_from' => 'LEFT JOIN cust_main USING ( custnum ) ',
    'addl_from' => ' LEFT JOIN cust_contact USING ( contactnum ) '.
                   ' LEFT JOIN cust_main ON ( cust_contact.custnum = cust_main.custnum ) ',
    'hashref'   => { 'contactnum' => $contactnum, },
    'extra_sql' => $search, #important
  } );

}

sub list_contacts {
  my $p = shift;

  my($context, $session, $custnum) = _custoragent_session_custnum($p);
  return { 'error' => $session } if $context eq 'error';

  my $cust_main = qsearchs('cust_main', { custnum=>$custnum } );

  my @contacts = ( map {
    my $contact = $_->contact;
    my @contact_email = $contact->contact_email;
    { 'contactnum'         => $contact->contactnum,
      'class'              => $_->contact_classname,
      'first'              => $contact->first,
      'last'               => $contact->get('last'),
      'title'              => $contact->title,
      'emailaddress'       => join(',', map $_->emailaddress, @contact_email),
      #TODO: contact phone numbers
      'comment'            => $_->comment,
      'selfservice_access' => $_->selfservice_access,
      'disabled'           => $contact->disabled,
    };
  } $cust_main->cust_contact );

  return { 'error'    => '',
           'contacts' => \@contacts,
         };
}

sub edit_contact {
  my $p = shift;

  my($context, $session, $custnum) = _custoragent_session_custnum($p);
  return { 'error' => $session } if $context eq 'error';

  #shortcut: logged in as a contact?  that must be the one you want to edit
  my $contactnum = $p->{contactnum} || $session->{'contactnum'};

  my $contact = _contact( $contactnum, $custnum )
    or return { 'error' => "Email not found" };

  return { error => "Can't edit a multi-customer contact unless logged in as that contact" }
    if $contactnum != $session->{'contactnum'}
    && scalar( $contact->cust_contact ) > 1;

  #my $cust_contact = qsearchs('cust_contact', { contactnum => $contactnum,
  #                                              custnum    => $custnum,    } )
  #  or die "guru meditation #4200";

  #TODO: change more fields besides just these

  foreach (qw( first last title emailaddress )) {
    $contact->$_( $p->{$_} ) if length( $p->{$_} );
  }

  my $error = $contact->replace;

  return { 'error' => $error, };

}

sub delete_contact {
  my $p = shift;

  my($context, $session, $custnum) = _custoragent_session_custnum($p);
  return { 'error' => $session } if $context eq 'error';

  my $cust_contact = qsearchs('cust_contact', { contactnum => $p->{contactnum},
                                                custnum    => $custnum,       })
    or return { 'error' => 'Unknown contactnum' };

  my $contact = $cust_contact->contact;

  my $error = $cust_contact->delete;
  return { 'error' => $error } if $error;

  unless ( $contact->cust_contact ) {
    $contact->delete;
  }

  return { 'error' => '', };
}

1;