send_email export, RT#10884
[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   'notes'    => ' 
89   Send an email message.  The subject and body of the message
90   will be generated from a message template.'
91 );
92
93 sub _export {
94   my( $self, $action, $svc ) = (shift, shift, shift);
95   my $conf = new FS::Conf;
96
97   my $msgnum = $self->option($action.'_template');
98   return if !$msgnum;
99
100   my $msg_template = FS::msg_template->by_key($msgnum);
101   return "Template $msgnum not found\n" if !$msg_template;
102
103   my $cust_pkg = $svc->cust_svc->cust_pkg;
104   my $cust_main = $svc->cust_svc->cust_pkg->cust_main if $cust_pkg;
105   my $custnum = $cust_main->custnum if $cust_main;
106   my $svcnum = $svc->svcnum if $action ne 'delete';
107
108   my @to = split(',', $self->option('to_address') || '');
109   push @to, $cust_main->invoicing_list_emailonly 
110     if $self->option('to_customer') and $cust_main;
111   if ( !@to ) {
112     warn 'No destination address for send_email export: custnum '.$cust_main->custnum;
113     # warn, don't die, but also avoid sending the template with _no_ 'to'=> 
114     # param, which would send to the customer by default.
115     return;
116   }
117
118   if ( $action eq 'replace' ) {
119     my $old = shift;
120     return $msg_template->send(
121       'cust_main' => $cust_main,
122       'object'    => [ $svc, $old ],
123       'to'        => join(',', @to),
124     );
125   }
126   else {
127     return $msg_template->send(
128       'cust_main' => $cust_main,
129       'object'    => $svc,
130       'to'        => join(',', @to),
131     );
132   }
133 }
134
135 sub _export_insert {
136   my($self, $svc) = (shift, shift);
137   $self->_export('insert', $svc);
138 }
139
140 sub _export_replace {
141   my($self, $new, $old) = (shift, shift, shift);
142   $self->_export('replace', $new, $old);
143 }
144
145 sub _export_delete {
146   my($self, $svc) = (shift, shift);
147   $self->_export('delete', $svc);
148 }
149
150 sub _export_suspend {
151   my($self, $svc) = (shift, shift);
152   $self->_export('suspend', $svc);
153 }
154
155 sub _export_unsuspend {
156   my($self, $svc) = (shift, shift);
157   $self->_export('unsuspend', $svc);
158 }
159
160 1;