add dsl, circuit and fiber services to email and RT ticket exports, RT#84345
[freeside.git] / FS / FS / part_export / rt_ticket.pm
1 package FS::part_export::rt_ticket;
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::TicketSystem;
9
10 @ISA = qw(FS::part_export);
11
12 my %templates;
13 my %queues;
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 => { disabled => '' },
25                 order_by => 'ORDER BY msgnum ASC'
26               })
27     );
28     sort keys (%templates);
29   },
30 );
31
32 my %queue_select = (
33   type          => 'select',
34   freeform      => 1,
35   option_label  => sub {
36     $queues{$_[0]};
37   },
38   option_values => sub {
39     return (0) unless FS::Conf->new->config('ticket_system');
40     %queues = (0 => '', FS::TicketSystem->queues());
41     sort {$queues{$a} cmp $queues{$b}} keys %queues;
42   },
43 );
44
45 tie my %options, 'Tie::IxHash', (
46   'insert_queue' => {
47     before  => '
48 <TR><TD COLSPAN=2>
49 <TABLE>
50   <TR><TH></TH><TH>Queue</TH><TH>Template</TH></TR>
51   <TR><TD>New service</TD><TD>',
52     %queue_select,
53     after   => '</TD>'
54   },
55   'insert_template' => {
56     before  => '<TD>',
57     %template_select,
58     after   => '</TD></TR>
59 ',
60   },
61   'delete_queue' => {
62     before  => '
63   <TR><TD>Delete</TD><TD>',
64     %queue_select,
65     after   => '</TD>',
66   },
67   'delete_template' => {
68     before  => '<TD>',
69     %template_select,
70     after   => '</TD></TR>
71 ',
72   },
73   'replace_queue' => {
74     before  => '
75   <TR><TD>Modify</TD><TD>',
76     %queue_select,
77     after   => '</TD>',
78   },
79   'replace_template' => {
80     before  => '<TD>',
81     %template_select,
82     after   => '</TD></TR>
83 ',
84   },
85   'suspend_queue' => {
86     before  => '
87   <TR><TD>Suspend</TD><TD>',
88     %queue_select,
89     after   => '</TD>',
90   },
91   'suspend_template' => {
92     before  => '<TD>',
93     %template_select,
94     after   => '</TD></TR>
95 ',
96   },
97   'unsuspend_queue' => {
98     before  => '
99   <TR><TD>Unsuspend</TD><TD>',
100     %queue_select,
101     after   => '</TD>',
102   },
103   'unsuspend_template' => {
104     before  => '<TD>',
105     %template_select,
106     after   => '</TD></TR>
107   </TABLE>
108 </TD></TR>',
109   },
110   'requestor' => {
111     freeform  => 0,
112     label     => 'Requestor',
113     'type'    => 'select',
114     option_label => sub {
115       my @labels = (
116         'Template From: address',
117         'Customer\'s invoice address',
118       );
119       $labels[shift];
120     },
121     option_values => sub { (0, 1) },
122   },
123 );
124
125 %info = (
126   'svc'      => [qw( svc_acct svc_broadband svc_phone svc_domain svc_dsl
127                      svc_circuit svc_fiber
128                 )],
129   'desc'     =>
130   'Create an RT ticket',
131   'options'  => \%options,
132   'nodomain' => '',
133   'no_machine' => 1,
134   'notes'    => ' 
135   Create a ticket in RT.  The subject and body of the ticket 
136   will be generated from a message template.'
137 );
138
139 sub _export_ticket {
140   my( $self, $action, $svc ) = (shift, shift, shift);
141   my $conf = new FS::Conf;
142   die "rt_ticket export - no ticket system configured"
143     unless $conf->config('ticket_system');
144   
145   FS::TicketSystem->init();
146
147   my $msgnum = $self->option($action.'_template');
148   return if !$msgnum;
149
150   my $queue = $self->option($action.'_queue');
151   return if !$queue;
152
153   my $msg_template = FS::msg_template->by_key($msgnum);
154   return "Template $msgnum not found\n" if !$msg_template;
155
156   my $cust_pkg = $svc->cust_svc->cust_pkg;
157   my $cust_main = $svc->cust_svc->cust_pkg->cust_main if $cust_pkg;
158   my $custnum = $cust_main->custnum if $cust_main;
159   my $svcnum = $svc->svcnum if $action ne 'delete';
160
161   my %msg;
162   if ( $action eq 'replace' ) {
163     my $old = shift;
164     %msg = $msg_template->prepare(
165       'cust_main' => $cust_main,
166       'object'    => [ $svc, $old ],
167     );
168
169   }
170   else {
171     %msg = $msg_template->prepare(
172       'cust_main' => $cust_main,
173       'object'    => $svc,
174     );
175   }
176   my $requestor = $msg{'from'};
177   $requestor = [ $cust_main->invoicing_list_emailonly ]
178     if $cust_main and $self->option('requestor') == 1;
179
180   my $err_or_ticket = FS::TicketSystem->create_ticket(
181     '', #session should already exist
182     'queue'     => $queue,
183     'subject'   => $msg{'subject'},
184     'requestor' => $requestor,
185     'message'   => $msg{'html_body'},
186     'mime_type' => 'text/html',
187     'custnum'   => $custnum,
188     'svcnum'    => $svcnum,
189   );
190   if( ref($err_or_ticket) ) {
191     return '';
192   }
193   else {
194     return $err_or_ticket;
195   }
196 }
197
198 sub _export_insert {
199   my($self, $svc) = (shift, shift);
200   $self->_export_ticket('insert', $svc);
201 }
202
203 sub _export_replace {
204   my($self, $new, $old) = (shift, shift, shift);
205   $self->_export_ticket('replace', $new, $old);
206 }
207
208 sub _export_delete {
209   my($self, $svc) = (shift, shift);
210   $self->_export_ticket('delete', $svc);
211 }
212
213 sub _export_suspend {
214   my($self, $svc) = (shift, shift);
215   $self->_export_ticket('suspend', $svc);
216 }
217
218 sub _export_unsuspend {
219   my($self, $svc) = (shift, shift);
220   $self->_export_ticket('unsuspend', $svc);
221 }
222
223 1;