summaryrefslogtreecommitdiff
path: root/FS
diff options
context:
space:
mode:
authorIvan Kohler <ivan@freeside.biz>2014-07-16 06:17:05 -0700
committerIvan Kohler <ivan@freeside.biz>2014-07-16 06:17:05 -0700
commit5f8111de04a4a914c72a1642722476db4728339c (patch)
treeb7ae766bcb35d53828a1690ae78d9bff179dcbab /FS
parentc7cc0522832d0e1c056f9bce46dd1b4b5551e612 (diff)
REST API, RT#28181
Diffstat (limited to 'FS')
-rw-r--r--FS/FS/API.pm44
-rw-r--r--FS/FS/Mason.pm1
-rw-r--r--FS/FS/Record.pm12
-rw-r--r--FS/FS/UI/REST.pm38
-rw-r--r--FS/FS/cust_bill.pm8
-rw-r--r--FS/FS/cust_main.pm1
-rw-r--r--FS/FS/cust_main/API.pm63
-rw-r--r--FS/FS/cust_pay.pm7
-rw-r--r--FS/FS/cust_pkg.pm2
-rw-r--r--FS/FS/cust_pkg/API.pm13
-rw-r--r--FS/FS/cust_svc.pm7
-rw-r--r--FS/FS/part_export/internal_diddb.pm12
-rw-r--r--FS/FS/part_pkg.pm8
-rw-r--r--FS/FS/part_pkg/API.pm17
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;