use FS::cust_pay;
use FS::cust_credit;
use FS::cust_refund;
+use FS::cust_pkg;
=head1 NAME
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
$prefix;
}
-=item county_state_county
+=item county_state_country
Returns a string consisting of just the county, state and country.
--- /dev/null
+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;
use FS::Conf;
use FS::part_tag;
use FS::Record qw( qsearchs );
+use FS::cust_location::API;
=item API_getinfo FIELD => VALUE, ...
);
# 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 ) = @_;
use strict;
+use FS::cust_location::API;
+
sub API_getinfo {
my $self = shift;
}
+# 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;