summaryrefslogtreecommitdiff
path: root/FS/FS/part_export/cust_location_http.pm
blob: e2830db748ff968ca83b75174b242cf736e55bf8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package FS::part_export::cust_location_http;

use strict;
use base qw( FS::part_export::http );
use vars qw( %options %info );

use FS::cust_main::Location;

my @location_fields = ( qw( custnum prospectnum ), FS::cust_main::Location->location_fields );

tie %options, 'Tie::IxHash',
  'method' => { label   =>'Method',
                type    =>'select',
                #options =>[qw(POST GET)],
                options =>[qw(POST)],
                default =>'POST' },
  'location_url'   => { label   => 'Location URL' },
  'package_url'    => { label   => 'Package URL' },
  'ssl_no_verify'  => { label => 'Skip SSL certificate validation',
                        type  => 'checkbox',
                      },
  'include_fields' => { 'label' => 'Include fields',
                        'type'  => 'select',
                        'multiple' => 1,
                        'options' => [ @location_fields ] },
  'success_regexp' => {
    label  => 'Success Regexp',
    default => '',
  },
;

%info = (
  'svc'     => [qw( cust_location )],
  'desc'    => 'Send an HTTP or HTTPS GET or POST request, for customer locations',
  'options' => \%options,
  'no_machine' => 1,
  'notes'   => <<'END',
Send an HTTP or HTTPS GET or POST to the specified URLs on customer location
creation/update (action 'location') and package location assignment/change (action 'package').
Always sends locationnum, action and any fields specified in the 'Include fields' 
export option.  Action 'package' also sends pkgnum and old_pkgnum (because location
changes usually instigate a pkgnum change.)  Action 'location' only sends on replace 
if one of the specified fields changed.  Leave a URL blank to skip that action.
For HTTPS support, <a href="http://search.cpan.org/dist/Crypt-SSLeay">Crypt::SSLeay</a>
or <a href="http://search.cpan.org/dist/IO-Socket-SSL">IO::Socket::SSL</a> is required.
END
);

# we don't do anything on deletion because we generally don't delete locations
#
# we don't send blank custnum/prospectnum because we do a lot of inserting/replacing 
#   with blank values and then immediately overwriting, but that unfortunately
#   makes it difficult to indicate if this is the first time we've sent the location
#   to the customer--hence we don't distinguish creation from update in the cgi vars

# gets invoked by FS::part_export::http _export_insert
sub _export_command {
  my( $self, $action, $cust_location ) = ( shift, shift, shift );

  # redundant--cust_location exports don't get invoked by cust_location->delete,
  # or by any status trigger, but just to be clear, since http export has other actions...
  return '' unless $action eq 'insert';

  $self->_http_queue_standard(
    'action' => 'location',
    map { $_ => $cust_location->get($_) } ('locationnum', $self->_include_fields)
  );

}

sub _export_replace {
  my( $self, $new, $old ) = ( shift, shift, shift );

  my $changed = 0;
  foreach my $field ($self->_include_fields) {
    next if $new->get($field) eq $old->get($field);
    next if ($field =~ /latitude|longitude/) and $new->get($field) == $old->get($field);
    $changed = 1;
    last;
  }
  return '' unless $changed;

  $self->_http_queue_standard(
    'action' => 'location',
    map { $_ => $new->get($_) } ('locationnum', $self->_include_fields)
  );
}

# not to be confused with export_pkg_change, which is for svcs
sub export_pkg_location {
  my( $self, $cust_pkg ) = ( shift, shift, shift );

  return '' unless $cust_pkg->locationnum;

  my $cust_location = $cust_pkg->cust_location;

  $self->_http_queue_standard(
    'action' => 'package',
    (map { $_ => $cust_pkg->get($_) } ('pkgnum', 'change_pkgnum', 'locationnum')),
    (map { $_ => $cust_location->get($_) } $self->_include_fields),
  );
}

sub _http_queue_standard {
  my $self = shift;
  my %opts = @_;
  my $url;
  if ($opts{'action'} eq 'location') {
    $url = $self->option('location_url');
    return '' unless $url;
  } elsif ($opts{'action'} eq 'package') {
    $url = $self->option('package_url');
    return '' unless $url;
  } else {
    return "Bad action ".$opts{'action'};
  }
  $self->http_queue( '',
    ( $self->option('ssl_no_verify') ? 'ssl_no_verify' : '' ),
    $self->option('method'),
    $url,
    $self->option('success_regexp'),
    %opts
  );
}

sub _include_fields {
  my $self = shift;
  split( /\s+/, $self->option('include_fields') );
}

1;