diff options
author | Ivan Kohler <ivan@freeside.biz> | 2014-07-16 06:17:05 -0700 |
---|---|---|
committer | Ivan Kohler <ivan@freeside.biz> | 2014-07-16 06:17:05 -0700 |
commit | 5f8111de04a4a914c72a1642722476db4728339c (patch) | |
tree | b7ae766bcb35d53828a1690ae78d9bff179dcbab /FS | |
parent | c7cc0522832d0e1c056f9bce46dd1b4b5551e612 (diff) |
REST API, RT#28181
Diffstat (limited to 'FS')
-rw-r--r-- | FS/FS/API.pm | 44 | ||||
-rw-r--r-- | FS/FS/Mason.pm | 1 | ||||
-rw-r--r-- | FS/FS/Record.pm | 12 | ||||
-rw-r--r-- | FS/FS/UI/REST.pm | 38 | ||||
-rw-r--r-- | FS/FS/cust_bill.pm | 8 | ||||
-rw-r--r-- | FS/FS/cust_main.pm | 1 | ||||
-rw-r--r-- | FS/FS/cust_main/API.pm | 63 | ||||
-rw-r--r-- | FS/FS/cust_pay.pm | 7 | ||||
-rw-r--r-- | FS/FS/cust_pkg.pm | 2 | ||||
-rw-r--r-- | FS/FS/cust_pkg/API.pm | 13 | ||||
-rw-r--r-- | FS/FS/cust_svc.pm | 7 | ||||
-rw-r--r-- | FS/FS/part_export/internal_diddb.pm | 12 | ||||
-rw-r--r-- | FS/FS/part_pkg.pm | 8 | ||||
-rw-r--r-- | FS/FS/part_pkg/API.pm | 17 |
14 files changed, 184 insertions, 49 deletions
diff --git a/FS/FS/API.pm b/FS/FS/API.pm index 2105409..a0f1dba 100644 --- a/FS/FS/API.pm +++ b/FS/FS/API.pm @@ -476,19 +476,6 @@ Returns general customer information. Takes a hash reference as parameter with t =cut -#some false laziness w/ClientAPI::Myaccount customer_info/customer_info_short - -use vars qw( @cust_main_editable_fields @location_editable_fields ); -@cust_main_editable_fields = qw( - first last company daytime night fax mobile -); -# locale -# payby payinfo payname paystart_month paystart_year payissue payip -# ss paytype paystate stateid stateid_state -@location_editable_fields = qw( - address1 address2 city county state zip country -); - sub customer_info { my( $class, %opt ) = @_; my $conf = new FS::Conf; @@ -498,39 +485,10 @@ sub customer_info { my $cust_main = qsearchs('cust_main', { 'custnum' => $opt{custnum} }) or return { 'error' => 'Unknown custnum' }; - my %return = ( - 'error' => '', - 'display_custnum' => $cust_main->display_custnum, - 'name' => $cust_main->first. ' '. $cust_main->get('last'), - 'balance' => $cust_main->balance, - 'status' => $cust_main->status, - 'statuscolor' => $cust_main->statuscolor, - ); - - $return{$_} = $cust_main->get($_) - foreach @cust_main_editable_fields; - - for (@location_editable_fields) { - $return{$_} = $cust_main->bill_location->get($_) - if $cust_main->bill_locationnum; - $return{'ship_'.$_} = $cust_main->ship_location->get($_) - if $cust_main->ship_locationnum; - } - - my @invoicing_list = $cust_main->invoicing_list; - $return{'invoicing_list'} = - join(', ', grep { $_ !~ /^(POST|FAX)$/ } @invoicing_list ); - $return{'postal_invoicing'} = - 0 < ( grep { $_ eq 'POST' } @invoicing_list ); - - #generally, the more useful data from the cust_main record the better. - # well, tell me what you want - - return \%return; + $cust_main->API_getinfo; } - =item location_info Returns location specific information for the customer. Takes a hash reference as parameter with the following keys: custnum,secret diff --git a/FS/FS/Mason.pm b/FS/FS/Mason.pm index 5476fd8..b7aa355 100644 --- a/FS/FS/Mason.pm +++ b/FS/FS/Mason.pm @@ -138,6 +138,7 @@ if ( -e $addl_handler_use_file ) { use FS::UI::Web qw(svc_url); use FS::UI::Web::small_custview qw(small_custview); use FS::UI::bytecount; + use FS::UI::REST qw( rest_auth rest_uri_remain encode_rest ); use FS::Msgcat qw(gettext geterror); use FS::Misc qw( send_email send_fax ocr_image states_hash counties cities state_label diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm index a684425..b226e17 100644 --- a/FS/FS/Record.pm +++ b/FS/FS/Record.pm @@ -367,6 +367,9 @@ sub qsearch { my @bind_type = (); my $dbh = dbh; foreach my $stable ( @stable ) { + + carp '->qsearch on cust_main called' if $stable eq 'cust_main' && $DEBUG; + #stop altering the caller's hashref my $record = { %{ shift(@record) || {} } };#and be liberal in receipt my $select = shift @select; @@ -994,6 +997,8 @@ sub AUTOLOAD { eval "use FS::$table"; die $@ if $@; + carp '->cust_main called' if $table eq 'cust_main' && $DEBUG; + my $pkey_value = $self->$column(); my %search = ( $foreign_column => $pkey_value ); @@ -1122,6 +1127,13 @@ sub hashref { $self->{'Hash'}; } +#fallback +sub API_getinfo { + my $self = shift; + +{ ( map { $_=>$self->$_ } $self->fields ), + }; +} + =item modified Returns true if any of this object's values have been modified with set (or via diff --git a/FS/FS/UI/REST.pm b/FS/FS/UI/REST.pm new file mode 100644 index 0000000..b6503ba --- /dev/null +++ b/FS/FS/UI/REST.pm @@ -0,0 +1,38 @@ +package FS::UI::REST; +use base qw( Exporter ); + +use strict; +use vars qw( @EXPORT_OK ); +use JSON::XS; +use FS::UID qw( adminsuidsetup ); +use FS::Conf; + +@EXPORT_OK = qw( rest_auth rest_uri_remain encode_rest ); + +sub rest_auth { + my $cgi = shift; + adminsuidsetup('fs_api'); + my $conf = new FS::Conf; + die 'Incorrect shared secret' + unless $cgi->param('secret') eq $conf->config('api_shared_secret'); +} + +sub rest_uri_remain { + my($r, $m) = @_; + + #wacky way to get this... surely there must be a better way + + my $path = $m->request_comp->path; + + $r->uri =~ /\Q$path\E\/?(.*)$/ or die "$path not in ". $r->uri; + + $1; + +} + +sub encode_rest { + #XXX HTTP Accept header to send other formats besides JSON + encode_json(shift); +} + +1; diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm index 4fb4a7d..7cee5d7 100644 --- a/FS/FS/cust_bill.pm +++ b/FS/FS/cust_bill.pm @@ -3243,6 +3243,14 @@ sub re_X { } +sub API_getinfo { + my $self = shift; + +{ ( map { $_=>$self->$_ } $self->fields ), + 'owed' => $self->owed, + #XXX last payment applied date + }; +} + =back =head1 CLASS METHODS diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index 9f382ac..f0a4799 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -8,6 +8,7 @@ use base qw( FS::cust_main::Packages FS::cust_main::Billing_ThirdParty FS::cust_main::Location FS::cust_main::Credit_Limit + FS::cust_main::API FS::otaker_Mixin FS::payinfo_Mixin FS::cust_main_Mixin FS::geocode_Mixin FS::Quotable_Mixin FS::Sales_Mixin FS::o2m_Common diff --git a/FS/FS/cust_main/API.pm b/FS/FS/cust_main/API.pm new file mode 100644 index 0000000..2637c7e --- /dev/null +++ b/FS/FS/cust_main/API.pm @@ -0,0 +1,63 @@ +package FS::cust_main::API; + +use strict; + +#some false laziness w/ClientAPI::Myaccount customer_info/customer_info_short + +use vars qw( + @cust_main_addl_fields @cust_main_editable_fields @location_editable_fields +); +@cust_main_addl_fields = qw( + agentnum salesnum refnum classnum usernum referral_custnum +); +@cust_main_editable_fields = qw( + first last company daytime night fax mobile +); +# locale +# payby payinfo payname paystart_month paystart_year payissue payip +# ss paytype paystate stateid stateid_state +@location_editable_fields = qw( + address1 address2 city county state zip country +); + +sub API_getinfo { + my( $self, %opt ) = @_; + + my %return = ( + 'error' => '', + 'display_custnum' => $self->display_custnum, + 'name' => $self->first. ' '. $self->get('last'), + 'balance' => $self->balance, + 'status' => $self->status, + 'statuscolor' => $self->statuscolor, + ); + + $return{$_} = $self->get($_) + foreach @cust_main_editable_fields; + + unless ( $opt{'selfservice'} ) { + $return{$_} = $self->get($_) + foreach @cust_main_addl_fields; + } + + for (@location_editable_fields) { + $return{$_} = $self->bill_location->get($_) + if $self->bill_locationnum; + $return{'ship_'.$_} = $self->ship_location->get($_) + if $self->ship_locationnum; + } + + my @invoicing_list = $self->invoicing_list; + $return{'invoicing_list'} = + join(', ', grep { $_ !~ /^(POST|FAX)$/ } @invoicing_list ); + $return{'postal_invoicing'} = + 0 < ( grep { $_ eq 'POST' } @invoicing_list ); + + #generally, the more useful data from the cust_main record the better. + # well, tell me what you want + + return \%return; + +} + +1; diff --git a/FS/FS/cust_pay.pm b/FS/FS/cust_pay.pm index 775c353..1044e43 100644 --- a/FS/FS/cust_pay.pm +++ b/FS/FS/cust_pay.pm @@ -892,6 +892,13 @@ sub unapplied_sql { } +sub API_getinfo { + my $self = shift; + my @fields = grep { $_ ne 'payinfo' } $self->fields; + +{ ( map { $_=>$self->$_ } @fields ), + }; +} + # _upgrade_data # # Used by FS::Upgrade to migrate to a new database. diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm index af1bd83..915f229 100644 --- a/FS/FS/cust_pkg.pm +++ b/FS/FS/cust_pkg.pm @@ -1,5 +1,5 @@ package FS::cust_pkg; -use base qw( FS::cust_pkg::Search +use base qw( FS::cust_pkg::Search 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 index 0000000..f87eed3 --- /dev/null +++ b/FS/FS/cust_pkg/API.pm @@ -0,0 +1,13 @@ +package FS::cust_pkg::API; + +use strict; + +sub API_getinfo { + my $self = shift; + + +{ ( map { $_=>$self->$_ } $self->fields ), + }; + +} + +1; diff --git a/FS/FS/cust_svc.pm b/FS/FS/cust_svc.pm index 8fc929f..df179f5 100644 --- a/FS/FS/cust_svc.pm +++ b/FS/FS/cust_svc.pm @@ -904,6 +904,13 @@ sub tickets { (@tickets); } +sub API_getinfo { + my $self = shift; + my $svc_x = $self->svc_x; + +{ ( map { $_=>$self->$_ } $self->fields ), + ( map { $svc_x=>$svc_x->$_ } $svc_x->fields ), + }; +} =back diff --git a/FS/FS/part_export/internal_diddb.pm b/FS/FS/part_export/internal_diddb.pm index bb97433..8771ae8 100644 --- a/FS/FS/part_export/internal_diddb.pm +++ b/FS/FS/part_export/internal_diddb.pm @@ -81,7 +81,7 @@ sub get_dids { }) ]; - } elsif ( $opt{'state'} ) { #return aracodes + } elsif ( $opt{'state'} ) { #return areacodes $hash{state} = $opt{state}; @@ -94,7 +94,15 @@ sub get_dids { ]; } else { - die "FS::part_export::internal_diddb::get_dids called without options\n"; + + #die "FS::part_export::internal_diddb::get_dids called without options\n"; + return [ map { $_->npa. '-'. $_->nxx. '-'. $_->station } + qsearch({ 'table' => 'phone_avail', + 'hashref' => \%hash, + 'order_by' => 'ORDER BY station', + }) + ]; + } } diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm index 2f06467..2ad7859 100644 --- a/FS/FS/part_pkg.pm +++ b/FS/FS/part_pkg.pm @@ -1,5 +1,7 @@ package FS::part_pkg; -use base qw( FS::m2m_Common FS::o2m_Common FS::option_Common ); +use base qw( FS::part_pkg::API + FS::m2m_Common FS::o2m_Common FS::option_Common + ); use strict; use vars qw( %plans $DEBUG $setup_hack $skip_pkg_svc_hack ); @@ -2017,8 +2019,8 @@ sub _pkgs_sql { #false laziness w/part_export & cdr my %info; foreach my $INC ( @INC ) { - warn "globbing $INC/FS/part_pkg/*.pm\n" if $DEBUG; - foreach my $file ( glob("$INC/FS/part_pkg/*.pm") ) { + warn "globbing $INC/FS/part_pkg/[a-z]*.pm\n" if $DEBUG; + foreach my $file ( glob("$INC/FS/part_pkg/[a-z]*.pm") ) { warn "attempting to load plan info from $file\n" if $DEBUG; $file =~ /\/(\w+)\.pm$/ or do { warn "unrecognized file in $INC/FS/part_pkg/: $file\n"; diff --git a/FS/FS/part_pkg/API.pm b/FS/FS/part_pkg/API.pm new file mode 100644 index 0000000..3210aa0 --- /dev/null +++ b/FS/FS/part_pkg/API.pm @@ -0,0 +1,17 @@ +package FS::part_pkg::API; + +use strict; + +sub API_getinfo { + my $self = shift; + #my( $self, %opt ) = @_; + + +{ ( map { $_=>$self->$_ } $self->fields ), + ( map { $_=>$self->option($_) } + qw(setup_fee recur_fee) + ), + }; + +} + +1; |