Merge branch 'master' of git.freeside.biz:/home/git/freeside
[freeside.git] / FS / FS / part_export / send_email.pm
1 package FS::part_export::send_email;
2
3 use vars qw(@ISA %info);
4 use Tie::IxHash;
5 use FS::part_export;
6 use FS::Record qw(qsearch qsearchs);
7 use FS::Conf;
8 use FS::msg_template;
9 use FS::Misc qw(send_email);
10
11 @ISA = qw(FS::part_export);
12
13 my %templates;
14 my %template_select = (
15   type          => 'select',
16   freeform      => 1,
17   option_label  => sub {
18     $templates{$_[0]};
19   },
20   option_values => sub {
21     %templates = (0 => '',
22       map { $_->msgnum, $_->msgname } 
23       qsearch({ table => 'msg_template',
24                 hashref => {},
25                 order_by => 'ORDER BY msgnum ASC'
26               })
27     );
28     sort keys (%templates);
29   },
30 );
31
32 tie my %options, 'Tie::IxHash', (
33   'insert_template' => {
34     before  => '
35 <TR><TD COLSPAN=2>
36 <TABLE>
37   <TR><TH></TH><TH>Template</TH></TR>
38   <TR><TD>New service</TD><TD>',
39     %template_select,
40     after   => '</TD></TR>
41 ',
42   },
43   'delete_template' => {
44     before  => '
45   <TR><TD>Delete</TD><TD>',
46     %template_select,
47     after   => '</TD></TR>
48 ',
49   },
50   'replace_template' => {
51     before => '
52   <TR><TD>Modify</TD><TD>',
53     %template_select,
54     after   => '</TD></TR>
55 ',
56   },
57   'suspend_template' => {
58     before  => '
59   <TR><TD>Suspend</TD><TD>',
60     %template_select,
61     after   => '</TD></TR>
62 ',
63   },
64   'unsuspend_template' => {
65     before  => '
66   <TR><TD>Unsuspend</TD><TD>',
67     %template_select,
68     after   => '</TD></TR>
69   </TABLE>
70 </TD></TR>',
71   },
72   'to_customer' => {
73     label   => 'Send to customer',
74     type    => 'checkbox',
75   },
76   'to_address' => {
77     label => 'Send to other address: ',
78     type      => 'text',
79   },
80 );
81
82 %info = (
83   'svc'      => [qw( svc_acct svc_broadband svc_phone svc_domain )],
84   'desc'     =>
85   'Send an email message',
86   'options'  => \%options,
87   'nodomain' => '',
88   'no_machine' => 1,
89   'notes'    => ' 
90   Send an email message.  The subject and body of the message
91   will be generated from a message template.'
92 );
93
94 sub _export {
95   my( $self, $action, $svc ) = (shift, shift, shift);
96   my $conf = new FS::Conf;
97
98   my $msgnum = $self->option($action.'_template');
99   return if !$msgnum;
100
101   my $msg_template = FS::msg_template->by_key($msgnum);
102   return "Template $msgnum not found\n" if !$msg_template;
103
104   my $cust_pkg = $svc->cust_svc->cust_pkg;
105   my $cust_main = $svc->cust_svc->cust_pkg->cust_main if $cust_pkg;
106   my $custnum = $cust_main->custnum if $cust_main;
107   my $svcnum = $svc->svcnum if $action ne 'delete';
108
109   my @to = split(',', $self->option('to_address') || '');
110   push @to, $cust_main->invoicing_list_emailonly 
111     if $self->option('to_customer') and $cust_main;
112   if ( !@to ) {
113     warn 'No destination address for send_email export: custnum '.$cust_main->custnum;
114     # warn, don't die, but also avoid sending the template with _no_ 'to'=> 
115     # param, which would send to the customer by default.
116     return;
117   }
118
119   if ( $action eq 'replace' ) {
120     my $old = shift;
121     return $msg_template->send(
122       'cust_main' => $cust_main,
123       'object'    => [ $svc, $old ],
124       'to'        => join(',', @to),
125     );
126   }
127   else {
128     return $msg_template->send(
129       'cust_main' => $cust_main,
130       'object'    => $svc,
131       'to'        => join(',', @to),
132     );
133   }
134 }
135
136 sub _export_insert {
137   my($self, $svc) = (shift, shift);
138   $self->_export('insert', $svc);
139 }
140
141 sub _export_replace {
142   my($self, $new, $old) = (shift, shift, shift);
143   $self->_export('replace', $new, $old);
144 }
145
146 sub _export_delete {
147   my($self, $svc) = (shift, shift);
148   $self->_export('delete', $svc);
149 }
150
151 sub _export_suspend {
152   my($self, $svc) = (shift, shift);
153   $self->_export('suspend', $svc);
154 }
155
156 sub _export_unsuspend {
157   my($self, $svc) = (shift, shift);
158   $self->_export('unsuspend', $svc);
159 }
160
161 1;