87a06dcfd59eebff716ecc3f349b4c6d049f4334
[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 use Data::Dumper 'Dumper';
10
11 @ISA = qw(FS::part_export);
12
13 my %templates;
14 my %queues;
15 my %template_select = (
16   type          => 'select',
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   'queue' => {
34     label     => 'Queue',
35     type      => 'select',
36     option_label  => sub {
37       $queues{$_[0]};
38     },
39     option_values => sub {
40       %queues = FS::TicketSystem->queues();
41       sort {$queues{$a} cmp $queues{$b}} keys %queues;
42     },
43   },
44   'insert_template' => {
45     label     => 'Insert',
46     %template_select
47   },
48   'replace_template' => {
49     label     => 'Replace',
50     %template_select
51   },
52   'delete_template' => {
53     label     => 'Delete',
54     %template_select
55   },
56   'suspend_template' => {
57     label     => 'Suspend',
58     %template_select
59   },
60   'unsuspend_template' => {
61     label     => 'Unsuspend',
62     %template_select
63   },
64   'requestor' => {
65     label     => 'Requestor',
66     'type'    => 'select',
67     option_label => sub {
68       my @labels = (
69         'Template From: address',
70         'Customer\'s invoice address',
71       );
72       $labels[shift];
73     },
74     option_values => sub { (0, 1) },
75   },
76 );
77
78 %info = (
79   'svc'      => [qw( svc_acct )], #others?
80   'desc'     =>
81     'Create an RT ticket',
82   'options'  => \%options,
83   'nodomain' => '',
84   'notes'    => <<'END'
85 Create a ticket in RT.  The subject and body of the ticket 
86 will be generated from a message template.
87 END
88 );
89
90 sub _export_ticket {
91   my( $self, $action, $svc ) = (shift, shift, shift);
92   my $msgnum = $self->option($action.'_template');
93   return if !$msgnum;
94
95   my $msg_template = FS::msg_template->by_key($msgnum);
96   return "Template $msgnum not found\n" if !$msg_template;
97
98   my $cust_pkg = $svc->cust_svc->cust_pkg;
99   my $cust_main = $svc->cust_svc->cust_pkg->cust_main if $cust_pkg;
100   my $custnum = $cust_main->custnum if $cust_main;
101   my $svcnum = $svc->svcnum if $action ne 'delete';
102
103   my %msg;
104   if ( $action eq 'replace' ) {
105     my $old = shift;
106     %msg = $msg_template->prepare(
107       'cust_main' => $cust_main,
108       'object'    => [ $svc, $old ],
109     );
110
111   }
112   else {
113     %msg = $msg_template->prepare(
114       'cust_main' => $cust_main,
115       'object'    => $svc,
116     );
117   }
118   my $requestor = $msg{'from'};
119   $requestor = [ $cust_main->invoicing_list_emailonly ]
120     if $cust_main and $self->option('requestor') == 1;
121
122   my $err_or_ticket = FS::TicketSystem->create_ticket(
123     '', #session should already exist
124     'queue'     => $self->option('queue'),
125     'subject'   => $msg{'subject'},
126     'requestor' => $requestor,
127     'message'   => $msg{'html_body'},
128     'mime_type' => 'text/html',
129     'custnum'   => $custnum,
130     'svcnum'    => $svcnum,
131   );
132   if( ref($err_or_ticket) ) {
133     return '';
134   }
135   else {
136     return $err_or_ticket;
137   }
138 }
139
140 sub _export_insert {
141   my($self, $svc) = (shift, shift);
142   $self->_export_ticket('insert', $svc);
143 }
144
145 sub _export_replace {
146   my($self, $new, $old) = (shift, shift, shift);
147   $self->_export_ticket('replace', $new, $old);
148 }
149
150 sub _export_delete {
151   my($self, $svc) = (shift, shift);
152   $self->_export_ticket('delete', $svc);
153 }
154
155 sub _export_suspend {
156   my($self, $svc) = (shift, shift);
157   $self->_export_ticket('suspend', $svc);
158 }
159
160 sub _export_unsuspend {
161   my($self, $svc) = (shift, shift);
162   $self->_export_ticket('unsuspend', $svc);
163 }
164
165 1;