X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=fs_selfservice%2FFS-SelfService%2FSelfService.pm;h=3ede27cd9d0dda94976b60d7d770ef5eaed63020;hp=9b3b71a8e04d9f367be196ad25e4f0d26091f759;hb=32db3ad86bcf04e4f34705a396b718061d333f20;hpb=5349c11e9b81136892c4630e68fce81747122a39 diff --git a/fs_selfservice/FS-SelfService/SelfService.pm b/fs_selfservice/FS-SelfService/SelfService.pm index 9b3b71a8e..3ede27cd9 100644 --- a/fs_selfservice/FS-SelfService/SelfService.pm +++ b/fs_selfservice/FS-SelfService/SelfService.pm @@ -1,7 +1,8 @@ package FS::SelfService; use strict; -use vars qw($VERSION @ISA @EXPORT_OK $DEBUG $dir $socket %autoload $tag); +use vars qw( $VERSION @ISA @EXPORT_OK $DEBUG + $skip_uid_check $dir $socket %autoload $tag ); use Exporter; use Socket; use FileHandle; @@ -24,6 +25,7 @@ $socket .= '.'.$tag if defined $tag && length($tag); 'passwd' => 'passwd/passwd', 'chfn' => 'passwd/passwd', 'chsh' => 'passwd/passwd', + 'login_info' => 'MyAccount/login_info', 'login' => 'MyAccount/login', 'logout' => 'MyAccount/logout', 'customer_info' => 'MyAccount/customer_info', @@ -35,7 +37,9 @@ $socket .= '.'.$tag if defined $tag && length($tag); 'payment_info' => 'MyAccount/payment_info', 'process_payment' => 'MyAccount/process_payment', 'process_payment_order_pkg' => 'MyAccount/process_payment_order_pkg', + 'process_payment_order_renew' => 'MyAccount/process_payment_order_renew', 'process_prepay' => 'MyAccount/process_prepay', + 'realtime_collect' => 'MyAccount/realtime_collect', 'list_pkgs' => 'MyAccount/list_pkgs', #add to ss (added?) 'list_svcs' => 'MyAccount/list_svcs', #add to ss (added?) 'list_svc_usage' => 'MyAccount/list_svc_usage', @@ -43,6 +47,8 @@ $socket .= '.'.$tag if defined $tag && length($tag); 'order_pkg' => 'MyAccount/order_pkg', #add to ss cgi! 'change_pkg' => 'MyAccount/change_pkg', 'order_recharge' => 'MyAccount/order_recharge', + 'renew_info' => 'MyAccount/renew_info', + 'order_renew' => 'MyAccount/order_renew', 'cancel_pkg' => 'MyAccount/cancel_pkg', #add to ss cgi! 'charge' => 'MyAccount/charge', #? 'part_svc_info' => 'MyAccount/part_svc_info', @@ -51,13 +57,23 @@ $socket .= '.'.$tag if defined $tag && length($tag); 'unprovision_svc' => 'MyAccount/unprovision_svc', 'myaccount_passwd' => 'MyAccount/myaccount_passwd', 'signup_info' => 'Signup/signup_info', + 'domain_select_hash' => 'Signup/domain_select_hash', # expose? 'new_customer' => 'Signup/new_customer', + 'capture_payment' => 'Signup/capture_payment', 'agent_login' => 'Agent/agent_login', 'agent_logout' => 'Agent/agent_logout', 'agent_info' => 'Agent/agent_info', 'agent_list_customers' => 'Agent/agent_list_customers', + 'mason_comp' => 'MasonComponent/mason_comp', + 'call_time' => 'PrepaidPhone/call_time', + 'call_time_nanpa' => 'PrepaidPhone/call_time_nanpa', + 'phonenum_balance' => 'PrepaidPhone/phonenum_balance', +); +@EXPORT_OK = ( + keys(%autoload), + qw( regionselector regionselector_hashref + expselect popselector domainselector didselector ) ); -@EXPORT_OK = ( keys(%autoload), qw( regionselector expselect popselector ) ); $ENV{'PATH'} ='/usr/bin:/usr/ucb:/bin'; $ENV{'SHELL'} = '/bin/sh'; @@ -66,8 +82,11 @@ $ENV{'CDPATH'} = ''; $ENV{'ENV'} = ''; $ENV{'BASH_ENV'} = ''; +#you can add BEGIN { $FS::SelfService::skip_uid_check = 1; } +#if you grant appropriate permissions to whatever user my $freeside_uid = scalar(getpwnam('freeside')); -die "not running as the freeside user\n" if $> != $freeside_uid; +die "not running as the freeside user\n" + if $> != $freeside_uid && ! $skip_uid_check; -e $dir or die "FATAL: $dir doesn't exist!"; -d $dir or die "FATAL: $dir isn't a directory!"; @@ -191,11 +210,16 @@ FS::SelfService - Freeside self-service API 'payname' => $payname, 'invoicing_list' => $invoicing_list, 'referral_custnum' => $referral_custnum, + 'agentnum' => $agentnum, 'pkgpart' => $pkgpart, + 'username' => $username, '_password' => $password, 'popnum' => $popnum, - 'agentnum' => $agentnum, + #OR + 'countrycode' => 1, + 'phonenum' => $phonenum, + 'pin' => $pin, } ); @@ -450,10 +474,14 @@ Array reference of all states in the current default country. Hash reference of card types; keys are card types, values are the exact strings passed to the process_payment function -=item paybatch +=cut -Unique transaction identifier (prevents multiple charges), passed to the -process_payment function +#this doesn't actually work yet +# +#=item paybatch +# +#Unique transaction identifier (prevents multiple charges), passed to the +#process_payment function =back @@ -519,19 +547,42 @@ Card expiration month Card expiration year -=item paybatch +=cut -Unique transaction identifier, returned from the payment_info function. -Prevents multiple charges. +#this doesn't actually work yet +# +#=item paybatch +# +#Unique transaction identifier, returned from the payment_info function. +#Prevents multiple charges. =back Returns a hash reference with a single key, B, empty on success, or an -error message on errors +error message on errors. + +=item process_payment_order_pkg + +Combines the B and B functions in one step. If the +payment processes sucessfully, the package is ordered. Takes a hash reference +as parameter with the keys of both methods. + +Returns a hash reference with a single key, B, empty on success, or an +error message on errors. + +=item process_payment_order_renew + +Combines the B and B functions in one step. If +the payment processes sucessfully, the renewal is processed. Takes a hash +reference as parameter with the keys of both methods. + +Returns a hash reference with a single key, B, empty on success, or an +error message on errors. =item list_pkgs -Returns package information for this customer. +Returns package information for this customer. For more detail on services, +see L. Takes a hash reference as parameter with a single key: B @@ -539,6 +590,14 @@ Returns a hash reference containing customer package information. The hash refe =over 4 +=item custnum + +Customer number + +=item error + +Empty on success, or an error message on errors. + =item cust_pkg HASHREF Array reference of hash references, each of which has the fields of a cust_pkg @@ -549,8 +608,9 @@ the internal FS:: objects, but hash references of columns and values. =item part_pkg fields -All fields of part_pkg (be careful with this information - it may reveal more -about your available packages than you would like users to know in aggregate) +All fields of part_pkg for this specific cust_pkg (be careful with this +information - it may reveal more about your available packages than you would +like users to know in aggregate) =cut @@ -558,7 +618,9 @@ about your available packages than you would like users to know in aggregate) =item part_svc -An array of hash references, each of which has the following keys: +An array of hash references indicating information on unprovisioned services +available for provisioning for this specific cust_pkg. Each has the following +keys: =over 4 @@ -573,11 +635,124 @@ about your available packages than you would like users to know in aggregate) =back +=item cust_svc + +An array of hash references indicating information on the customer services +already provisioned for this specific cust_pkg. Each has the following keys: + +=over 4 + +=item label + +Array reference with three elements: The first element is the name of this service. The second element is a meaningful user-specific identifier for the service (i.e. username, domain or mail alias). The last element is the table name of this service. + =back -=item error +=item svcnum -Empty on success, or an error message on errors. +Primary key for this service + +=item svcpart + +Service definition (see L) + +=item pkgnum + +Customer package (see L) + +=item overlimit + +Blank if the service is not over limit, or the date the service exceeded its usage limit (as a UNIX timestamp). + +=back + +=back + +=item list_svcs + +Returns service information for this customer. + +Takes a hash reference as parameter with a single key: B + +Returns a hash reference containing customer package information. The hash reference contains the following keys: + +=over 4 + +=item custnum + +Customer number + +=item svcs + +An array of hash references indicating information on all of this customer's +services. Each has the following keys: + +=over 4 + +=item svcnum + +Primary key for this service + +=item label + +Name of this service + +=item value + +Meaningful user-specific identifier for the service (i.e. username, domain, or +mail alias). + +=back + +Account (svc_acct) services also have the following keys: + +=over 4 + +=item username + +Username + +=item email + +username@domain + +=item seconds + +Seconds remaining + +=item upbytes + +Upload bytes remaining + +=item downbytes + +Download bytes remaining + +=item totalbytes + +Total bytes remaining + +=item recharge_amount + +Cost of a recharge + +=item recharge_seconds + +Number of seconds gained by recharge + +=item recharge_upbytes + +Number of upload bytes gained by recharge + +=item recharge_downbytes + +Number of download bytes gained by recharge + +=item recharge_totalbytes + +Number of total bytes gained by recharge + +=back =back @@ -595,13 +770,22 @@ Session identifier =item pkgpart -pkgpart of package to order +Package to order (see L). =item svcpart -optional svcpart, required only if the package definition does not contain -one svc_acct service definition with quantity 1 (it may contain others with -quantity >1) +Service to order (see L). + +Normally optional; required only to provision a non-svc_acct service, or if the +package definition does not contain one svc_acct service definition with +quantity 1 (it may contain others with quantity >1). A svcpart of "none" can +also be specified to indicate that no initial service should be provisioned. + +=back + +Fields used when provisioning an svc_acct service: + +=over 4 =item username @@ -621,10 +805,123 @@ Optional Access number number =back +Fields used when provisioning an svc_domain service: + +=over 4 + +=item domain + +Domain + +=back + +Fields used when provisioning an svc_phone service: + +=over 4 + +=item phonenum + +Phone number + +=item pin + +Voicemail PIN + +=item sip_password + +SIP password + +=back + +Fields used when provisioning an svc_external service: + +=over 4 + +=item id + +External numeric ID. + +=item title + +External text title. + +=back + Returns a hash reference with a single key, B, empty on success, or an error message on errors. The special error '_decline' is returned for declined transactions. +=item renew_info + +Provides useful info for early renewals. + +Takes a hash reference as parameter with the following keys: + +=over 4 + +=item session_id + +Session identifier + +=back + +Returns a hash reference. On errors, it contains a single key, B, with +the error message. Otherwise, contains a single key, B, pointing to +an array refernce of hash references. Each hash reference contains the +following keys: + +=over 4 + +=item bill_date + +(Future) Bill date. Indicates a future date for which billing could be run. +Specified as a integer UNIX timestamp. Pass this value to the B +function. + +=item bill_date_pretty + +(Future) Bill date as a human-readable string. (Convenience for display; +subject to change, so best not to parse for the date.) + +=item amount + +Base amount which will be charged if renewed early as of this date. + +=item renew_date + +Renewal date; i.e. even-futher future date at which the customer will be paid +through if the early renewal is completed with the given B. +Specified as a integer UNIX timestamp. + +=item renew_date_pretty + +Renewal date as a human-readable string. (Convenience for display; +subject to change, so best not to parse for the date.) + +=back + +=item order_renew + +Renews this customer early; i.e. runs billing for this customer in advance. + +Takes a hash reference as parameter with the following keys: + +=over 4 + +=item session_id + +Session identifier + +=item date + +Integer date as returned by the B function, indicating the advance +date for which to run billing. + +=back + +Returns a hash reference with a single key, B, empty on success, or an +error message on errors. + =item cancel_pkg Cancels a package for this customer. @@ -838,6 +1135,10 @@ comma-separated list of email addresses for email invoices. The special value ' referring customer number +=item agentnum + +Agent number + =item pkgpart pkgpart of initial package @@ -858,9 +1159,17 @@ Security phrase Access number (index, not the literal number) -=item agentnum +=item countrycode -Agent number +Country code (to be provisioned as a service) + +=item phonenum + +Phone number (to be provisioned as a service) + +=item pin + +Voicemail PIN =back @@ -1024,24 +1333,45 @@ END } $state_html .= ''; - $state_html .= ''; + my $country_html = ''; + if ( scalar( keys %cust_main_county ) > 1 ) { + + $country_html = qq('; + } else { + + $country_html = qq('; - my $country_html = qq!'; ($county_html, $state_html, $country_html); } +sub regionselector_hashref { + my ($county_html, $state_html, $country_html) = regionselector(@_); + { + 'county_html' => $county_html, + 'state_html' => $state_html, + 'country_html' => $country_html, + }; +} + #=item expselect HASHREF | LIST # #Takes as input a hashref or list of key/value pairs with the following keys: @@ -1243,6 +1573,103 @@ END } +=item domainselector HASHREF | LIST + +Takes as input a hashref or list of key/value pairs with the following keys: + +=over 4 + +=item pkgnum + +Package number + +=item domsvc + +Service number of the selected item. + +=back + +Returns an HTML fragment for domain selection. + +=cut + +sub domainselector { + my $param; + if ( ref($_[0]) ) { + $param = shift; + } else { + $param = { @_ }; + } + my $domsvc= $param->{'domsvc'}; + my $rv = + domain_select_hash(map {$_ => $param->{$_}} qw(pkgnum svcpart pkgpart) ); + my $domains = $rv->{'domains'}; + $domsvc = $rv->{'domsvc'} unless $domsvc; + + return '' + unless scalar(keys %$domains); + + if (scalar(keys %$domains) == 1) { + my $key; + foreach(keys %$domains) { + $key = $_; + } + return 'Domain'. $domains->{$key}. + '' + } + + my $text .= qq!Domain!; + + $text; + +} + +=item didselector HASHREF | LIST + +Takes as input a hashref or list of key/value pairs with the following keys: + +=over 4 + +=item field + +Field name for the returned HTML fragment. + +=item svcpart + +Service definition (see L) + +=back + +Returns an HTML fragment for DID selection. + +=cut + +sub didselector { + my $param; + if ( ref($_[0]) ) { + $param = shift; + } else { + $param = { @_ }; + } + + my $rv = mason_comp( 'comp'=>'/elements/select-did.html', + 'args'=>[ %$param ], + ); + + #hmm. + $rv->{'error'} || $rv->{'output'}; + +} + =back =head1 RESELLER FUNCTIONS @@ -1251,14 +1678,23 @@ Note: Resellers can also use the B and B functions with their active session, and the B and B functions with their active session and an additional I parameter. +For the most part, development of the reseller web interface has been +superceded by agent-virtualized access to the backend. + =over 4 =item agent_login +Agent login + =item agent_info +Agent info + =item agent_list_customers +List agent's customers. + =back =head1 BUGS