summaryrefslogtreecommitdiff
path: root/FS/FS
diff options
context:
space:
mode:
authorJonathan Prykop <jonathan@freeside.biz>2016-04-18 21:47:51 -0500
committerJonathan Prykop <jonathan@freeside.biz>2016-04-22 12:10:09 -0500
commit5c321cb0e6488b0b76fec03395ec815703867b22 (patch)
tree56f2476f724f7d8b38f4d34d7107ac1260cce8b9 /FS/FS
parentfd0483007b898b9944cc31fd5d6e90932fe2c8c0 (diff)
RT#29296: API stuff: Add new locations [change_package_location API call]
Diffstat (limited to 'FS/FS')
-rw-r--r--FS/FS/API.pm52
-rw-r--r--FS/FS/cust_location.pm2
-rw-r--r--FS/FS/cust_location/API.pm34
-rw-r--r--FS/FS/cust_main/API.pm5
-rw-r--r--FS/FS/cust_pkg/API.pm48
5 files changed, 137 insertions, 4 deletions
diff --git a/FS/FS/API.pm b/FS/FS/API.pm
index 32400f7..77ae03b 100644
--- a/FS/FS/API.pm
+++ b/FS/FS/API.pm
@@ -8,6 +8,7 @@ use FS::cust_location;
use FS::cust_pay;
use FS::cust_credit;
use FS::cust_refund;
+use FS::cust_pkg;
=head1 NAME
@@ -556,6 +557,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
diff --git a/FS/FS/cust_location.pm b/FS/FS/cust_location.pm
index 3588cee..f38e8ef 100644
--- a/FS/FS/cust_location.pm
+++ b/FS/FS/cust_location.pm
@@ -728,7 +728,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
index 0000000..7d9140f
--- /dev/null
+++ b/FS/FS/cust_location/API.pm
@@ -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;
diff --git a/FS/FS/cust_main/API.pm b/FS/FS/cust_main/API.pm
index 2d6da9e..f9ba140 100644
--- a/FS/FS/cust_main/API.pm
+++ b/FS/FS/cust_main/API.pm
@@ -4,6 +4,7 @@ use strict;
use FS::Conf;
use FS::part_tag;
use FS::Record qw( qsearchs );
+use FS::cust_location::API;
=item API_getinfo FIELD => VALUE, ...
@@ -22,9 +23,7 @@ use vars qw(
);
# locale
# ss stateid stateid_state
-@location_editable_fields = qw(
- address1 address2 city county state zip country
-);
+@location_editable_fields = FS::cust_location::API::API_editable_fields();
sub API_getinfo {
my( $self, %opt ) = @_;
diff --git a/FS/FS/cust_pkg/API.pm b/FS/FS/cust_pkg/API.pm
index f87eed3..6e03b8e 100644
--- a/FS/FS/cust_pkg/API.pm
+++ b/FS/FS/cust_pkg/API.pm
@@ -2,6 +2,8 @@ package FS::cust_pkg::API;
use strict;
+use FS::cust_location::API;
+
sub API_getinfo {
my $self = shift;
@@ -10,4 +12,50 @@ sub API_getinfo {
}
+# 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;