RT#29296: API stuff: Add new locations [v3 reconcile, includes backport of FS::cust_p...
authorJonathan Prykop <jonathan@freeside.biz>
Tue, 19 Apr 2016 02:47:51 +0000 (21:47 -0500)
committerJonathan Prykop <jonathan@freeside.biz>
Fri, 22 Apr 2016 20:23:43 +0000 (15:23 -0500)
FS/FS/API.pm
FS/FS/cust_location.pm
FS/FS/cust_location/API.pm [new file with mode: 0644]
FS/FS/cust_pkg.pm
FS/FS/cust_pkg/API.pm [new file with mode: 0644]

index c595dae..f9f28c1 100644 (file)
@@ -7,6 +7,7 @@ use FS::cust_location;
 use FS::cust_pay;
 use FS::cust_credit;
 use FS::cust_refund;
+use FS::cust_pkg;
 
 =head1 NAME
 
@@ -743,6 +744,57 @@ sub location_info {
   return \%return;
 }
 
+=item change_package_location
+
+Updates package location. Takes a list of keys and values 
+as paramters with the following keys: 
+
+pkgnum
+
+secret
+
+locationnum - pass this, or the following keys (don't pass both)
+
+address1
+
+address2
+
+city
+
+county
+
+state
+
+zip
+
+country
+
+On error, returns a hashref with an 'error' key.
+On success, returns a hashref with 'pkgnum' and 'locationnum' keys,
+containing the new values.
+
+=cut
+
+sub change_package_location {
+  my $self = shift;
+  my %opt  = @_;
+  return _shared_secret_error() unless _check_shared_secret($opt{'secret'});
+
+  my $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $opt{'pkgnum'} })
+    or return { 'error' => 'Unknown pkgnum' };
+
+  my %changeopt;
+  $changeopt{'pkgnum'} = $pkgnum;
+
+  my $cust_location = FS::cust_location->new({
+    'custnum' => $cust_pkg->custnum,
+    %location_hash,
+  });
+  $changeopt{'cust_location'} = $cust_location;
+
+  $cust_pkg->API_change(%changeopt);
+}
+
 =item bill_now OPTION => VALUE, ...
 
 Bills a single customer now, in the same fashion as the "Bill now" link in the
index 2736b50..818838e 100644 (file)
@@ -722,7 +722,7 @@ sub label_prefix {
   $prefix;
 }
 
-=item county_state_county
+=item county_state_country
 
 Returns a string consisting of just the county, state and country.
 
diff --git a/FS/FS/cust_location/API.pm b/FS/FS/cust_location/API.pm
new file mode 100644 (file)
index 0000000..7d9140f
--- /dev/null
@@ -0,0 +1,34 @@
+package FS::cust_location::API;
+
+use strict;
+
+# this gets used by FS::cust_main::API and FS::cust_pkg::API,
+# so don't use FS::cust_main or FS::cust_pkg here
+
+# some of these could probably be included, but in general,
+# probably a bad idea to expose everything in 
+# cust_main::Location::location_fields by default
+#
+#locationname
+#district
+#latitude
+#longitude
+#censustract
+#censusyear
+#geocode
+#coord_auto
+#addr_clean
+
+sub API_editable_fields {
+  return qw(
+    address1
+    address2
+    city
+    county
+    state
+    zip
+    country
+  );
+}
+
+1;
index 876a625..4221e34 100644 (file)
@@ -1,5 +1,5 @@
 package FS::cust_pkg;
-use base qw( FS::otaker_Mixin FS::cust_main_Mixin FS::Sales_Mixin
+use base qw( FS::cust_pkg::API FS::otaker_Mixin FS::cust_main_Mixin FS::Sales_Mixin
              FS::contact_Mixin FS::location_Mixin
              FS::m2m_Common FS::option_Common );
 
diff --git a/FS/FS/cust_pkg/API.pm b/FS/FS/cust_pkg/API.pm
new file mode 100644 (file)
index 0000000..6e03b8e
--- /dev/null
@@ -0,0 +1,61 @@
+package FS::cust_pkg::API;
+
+use strict;
+
+use FS::cust_location::API;
+
+sub API_getinfo {
+  my $self = shift;
+
+  +{ ( map { $_=>$self->$_ } $self->fields ),
+   };
+
+}
+
+# currently only handles location change...
+# eventually have it handle all sorts of package changes
+sub API_change {
+  my $self = shift;
+  my %opt = @_;
+
+  return { 'error' => 'Cannot change canceled package' }
+    if $self->cancel;
+
+  my %changeopt;
+
+  # update location--accepts raw fields OR location
+  my %location_hash;
+  foreach my $field (FS::cust_location::API::API_editable_fields()) {
+    $location_hash{$field} = $opt{$field} if $opt{$field};
+  }
+  return { 'error' => 'Cannot pass both locationnum and location fields' }
+    if $opt{'locationnum'} && %location_hash;
+
+  if (%location_hash) {
+    my $cust_location = FS::cust_location->new({
+      'custnum' => $self->custnum,
+      %location_hash,
+    });
+    $changeopt{'cust_location'} = $cust_location;
+  } elsif ($opt{'locationnum'}) {
+    $changeopt{'locationnum'} = $opt{'locationnum'};
+  }
+
+  # not quite "nothing changed" because passed changes might be identical to current record,
+  #   we don't currently check for that, don't want to imply that we do...but maybe we should?
+  return { 'error' => 'No changes passed to method' }
+    unless $changeopt{'cust_location'} || $changeopt{'locationnum'};
+
+  $changeopt{'keep_dates'} = 1;
+
+  my $pkg_or_error = $self->change( \%changeopt );
+  my $error = ref($pkg_or_error) ? '' : $pkg_or_error;
+
+  return { 'error' => $error } if $error;
+
+  # return all fields?  we don't yet expose them through FS::API
+  return { map { $_ => $pkg_or_error->get($_) } qw( pkgnum locationnum ) };
+
+}
+
+1;