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