X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=fs_selfservice%2FFS-SelfService%2FSelfService.pm;h=765d6111b087fba4fb28dd4c57139b8aa9bd0478;hp=fe17fae5ddc61c2fbdf78f4b6188da5444ce67c6;hb=ad3bcb39580173f0ac1b6357cb49515d48af7ddf;hpb=66bf9d2b3998894588d73a10a459aa1453283ef1 diff --git a/fs_selfservice/FS-SelfService/SelfService.pm b/fs_selfservice/FS-SelfService/SelfService.pm index fe17fae5d..765d6111b 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; @@ -21,41 +22,113 @@ $socket .= '.'.$tag if defined $tag && length($tag); #maybe should ask ClientAPI for this list %autoload = ( - 'passwd' => 'passwd/passwd', - 'chfn' => 'passwd/passwd', - 'chsh' => 'passwd/passwd', - 'login' => 'MyAccount/login', - 'logout' => 'MyAccount/logout', - 'customer_info' => 'MyAccount/customer_info', - 'edit_info' => 'MyAccount/edit_info', #add to ss cgi! - 'invoice' => 'MyAccount/invoice', - 'invoice_logo' => 'MyAccount/invoice_logo', - 'list_invoices' => 'MyAccount/list_invoices', #? - 'cancel' => 'MyAccount/cancel', #add to ss cgi! - 'payment_info' => 'MyAccount/payment_info', - 'process_payment' => 'MyAccount/process_payment', - 'process_prepay' => 'MyAccount/process_prepay', - 'list_pkgs' => 'MyAccount/list_pkgs', #add to ss cgi (added?) - 'list_svcs' => 'MyAccount/list_svcs', #add to ss cgi (added?) - 'list_svc_usage' => 'MyAccount/list_svc_usage', - 'order_pkg' => 'MyAccount/order_pkg', #add to ss cgi! - 'change_pkg' => 'MyAccount/change_pkg', - 'order_recharge' => 'MyAccount/order_recharge', - 'cancel_pkg' => 'MyAccount/cancel_pkg', #add to ss cgi! - 'charge' => 'MyAccount/charge', #? - 'part_svc_info' => 'MyAccount/part_svc_info', - 'provision_acct' => 'MyAccount/provision_acct', - 'provision_external' => 'MyAccount/provision_external', - 'unprovision_svc' => 'MyAccount/unprovision_svc', - 'myaccount_passwd' => 'MyAccount/myaccount_passwd', - 'signup_info' => 'Signup/signup_info', - 'new_customer' => 'Signup/new_customer', - 'agent_login' => 'Agent/agent_login', - 'agent_logout' => 'Agent/agent_logout', - 'agent_info' => 'Agent/agent_info', - 'agent_list_customers' => 'Agent/agent_list_customers', + 'passwd' => 'passwd/passwd', + 'chfn' => 'passwd/passwd', + 'chsh' => 'passwd/passwd', + 'login_info' => 'MyAccount/login_info', + 'login_banner_image' => 'MyAccount/login_banner_image', + 'login' => 'MyAccount/login', + 'logout' => 'MyAccount/logout', + 'switch_acct' => 'MyAccount/switch_acct', + 'switch_cust' => 'MyAccount/switch_cust', + 'customer_info' => 'MyAccount/customer_info', + 'customer_info_short' => 'MyAccount/customer_info_short', + 'billing_history' => 'MyAccount/billing_history', + 'edit_info' => 'MyAccount/edit_info', #add to ss cgi! + 'invoice' => 'MyAccount/invoice', + 'invoice_pdf' => 'MyAccount/invoice_pdf', + 'legacy_invoice' => 'MyAccount/legacy_invoice', + 'legacy_invoice_pdf' => 'MyAccount/legacy_invoice_pdf', + 'invoice_logo' => 'MyAccount/invoice_logo', + 'list_invoices' => 'MyAccount/list_invoices', #? + 'cancel' => 'MyAccount/cancel', #add to ss cgi! + 'payment_info' => 'MyAccount/payment_info', + 'payment_info_renew_info' => 'MyAccount/payment_info_renew_info', + 'process_payment' => 'MyAccount/process_payment', + 'store_payment' => 'MyAccount/store_payment', + 'process_stored_payment' => 'MyAccount/process_stored_payment', + 'process_payment_order_pkg' => 'MyAccount/process_payment_order_pkg', + 'process_payment_change_pkg' => 'MyAccount/process_payment_change_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', + 'svc_status_html' => 'MyAccount/svc_status_html', + 'svc_status_hash' => 'MyAccount/svc_status_hash', + 'set_svc_status_hash' => 'MyAccount/set_svc_status_hash', + 'set_svc_status_listadd' => 'MyAccount/set_svc_status_listadd', + 'set_svc_status_listdel' => 'MyAccount/set_svc_status_listdel', + 'set_svc_status_vacationadd'=> 'MyAccount/set_svc_status_vacationadd', + 'set_svc_status_vacationdel'=> 'MyAccount/set_svc_status_vacationdel', + 'acct_forward_info' => 'MyAccount/acct_forward_info', + 'process_acct_forward' => 'MyAccount/process_acct_forward', + 'list_dsl_devices' => 'MyAccount/list_dsl_devices', + 'add_dsl_device' => 'MyAccount/add_dsl_device', + 'delete_dsl_device' => 'MyAccount/delete_dsl_device', + 'port_graph' => 'MyAccount/port_graph', + 'list_cdr_usage' => 'MyAccount/list_cdr_usage', + 'list_support_usage' => 'MyAccount/list_support_usage', + '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! + 'suspend_pkg' => 'MyAccount/suspend_pkg', #add to ss cgi! + 'charge' => 'MyAccount/charge', #? + 'part_svc_info' => 'MyAccount/part_svc_info', + 'provision_acct' => 'MyAccount/provision_acct', + 'provision_phone' => 'MyAccount/provision_phone', + 'provision_external' => 'MyAccount/provision_external', + 'unprovision_svc' => 'MyAccount/unprovision_svc', + 'myaccount_passwd' => 'MyAccount/myaccount_passwd', + 'reset_passwd' => 'MyAccount/reset_passwd', + 'check_reset_passwd' => 'MyAccount/check_reset_passwd', + 'process_reset_passwd' => 'MyAccount/process_reset_passwd', + 'list_tickets' => 'MyAccount/list_tickets', + 'create_ticket' => 'MyAccount/create_ticket', + 'get_ticket' => 'MyAccount/get_ticket', + 'adjust_ticket_priority' => 'MyAccount/adjust_ticket_priority', + 'did_report' => 'MyAccount/did_report', + 'signup_info' => 'Signup/signup_info', + 'skin_info' => 'MyAccount/skin_info', + 'access_info' => 'MyAccount/access_info', + 'domain_select_hash' => 'Signup/domain_select_hash', # expose? + 'new_customer' => 'Signup/new_customer', + 'new_customer_minimal' => 'Signup/new_customer_minimal', + 'capture_payment' => 'Signup/capture_payment', + #N/A 'clear_signup_cache' => 'Signup/clear_cache', + 'new_agent' => 'Agent/new_agent', + 'agent_login' => 'Agent/agent_login', + 'agent_logout' => 'Agent/agent_logout', + 'agent_info' => 'Agent/agent_info', + 'agent_list_customers' => 'Agent/agent_list_customers', + 'check_username' => 'Agent/check_username', + 'suspend_username' => 'Agent/suspend_username', + 'unsuspend_username' => 'Agent/unsuspend_username', + 'mason_comp' => 'MasonComponent/mason_comp', + 'call_time' => 'PrepaidPhone/call_time', + 'call_time_nanpa' => 'PrepaidPhone/call_time_nanpa', + 'phonenum_balance' => 'PrepaidPhone/phonenum_balance', + + 'start_thirdparty' => 'MyAccount/start_thirdparty', + 'finish_thirdparty' => 'MyAccount/finish_thirdparty', + + 'quotation_info' => 'MyAccount/quotation/quotation_info', + 'quotation_print' => 'MyAccount/quotation/quotation_print', + 'quotation_add_pkg' => 'MyAccount/quotation/quotation_add_pkg', + 'quotation_remove_pkg' => 'MyAccount/quotation/quotation_remove_pkg', + 'quotation_order' => 'MyAccount/quotation/quotation_order', + +); +@EXPORT_OK = ( + keys(%autoload), + qw( regionselector regionselector_hashref location_form + expselect popselector domainselector didselector + ) ); -@EXPORT_OK = ( keys(%autoload), qw( regionselector expselect popselector ) ); $ENV{'PATH'} ='/usr/bin:/usr/ucb:/bin'; $ENV{'SHELL'} = '/bin/sh'; @@ -64,8 +137,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!"; @@ -134,17 +210,43 @@ FS::SelfService - Freeside self-service API # "my account" functionality use FS::SelfService qw( login customer_info invoice cancel payment_info process_payment ); + #new-style login with an email address and password + # can also be used for svc_acct login, set $emailaddress to username@domain + my $rv = login ( { 'email' => $emailaddress, + 'password' => $password, + }, + ); + if ( $rv->{'error'} ) { + #handle login error... + } else { + #successful login + $session_id = $rv->{'session_id'}; + } + + #classic svc_acct-based login with separate username and password my $rv = login( { 'username' => $username, 'domain' => $domain, 'password' => $password, } ); + if ( $rv->{'error'} ) { + #handle login error... + } else { + #successful login + $session_id = $rv->{'session_id'}; + } + #svc_phone login with phone number and PIN + my $rv = login( { 'username' => $phone_number, + 'domain' => 'svc_phone', + 'password' => $pin, + } + ); if ( $rv->{'error'} ) { #handle login error... } else { #successful login - my $session_id = $rv->{'session_id'}; + $session_id = $rv->{'session_id'}; } my $customer_info = customer_info( { 'session_id' => $session_id } ); @@ -156,12 +258,35 @@ FS::SelfService - Freeside self-service API #!!! list_pkgs example - #!!! order_pkg example + #ordering a package with an svc_acct service + my $rv = order_pkg( { 'session_id' => $session_id, + 'pkgpart' => $pkgpart, + 'svcpart' => $svcpart, + 'username' => $username, + 'domsvc' => $domsvc, #svcnum of svc_domain + '_password' => $password, + } + ); + + #!!! ordering a package with an svc_domain service example + + #!!! ordering a package with an svc_phone service example + + #!!! ordering a package with an svc_external service example + + #!!! ordering a package with an svc_pbx service + + #ordering a package with no service + my $rv = order_pkg( { 'session_id' => $session_id, + 'pkgpart' => $pkgpart, + 'svcpart' => 'none', + } + ); #!!! cancel_pkg example # signup functionality - use FS::SelfService qw( signup_info new_customer ); + use FS::SelfService qw( signup_info new_customer new_customer_minimal ); my $signup_info = signup_info; @@ -189,11 +314,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, } ); @@ -219,6 +349,37 @@ see XXXX instead. =item passwd +Changes the password for an existing user in svc_acct. Takes a hash +reference with the following keys: + +=over 4 + +=item username + +Username of the account (required) + +=item domain + +Domain of the account (required) + +=item old_password + +Old password (required) + +=item new_password + +New password (required) + +=item new_gecos + +New gecos + +=item new_shell + +New Shell + +=back + =item chfn =item chsh @@ -236,12 +397,23 @@ following keys: =over 4 +=item email + +Email address (username@domain), instead of username and domain. Required for +contact-based self-service login, can also be used for svc_acct-based login. + =item username +Username + =item domain +Domain + =item password +Password + =back Returns a hash reference with the following keys: @@ -285,7 +457,9 @@ the following keys: invnum, date, owed An HTML fragment containing shipping and billing addresses. -=item The following fields are also returned: first last company address1 address2 city county state zip country daytime night fax ship_first ship_last ship_company ship_address1 ship_address2 ship_city ship_state ship_zip ship_country ship_daytime ship_night ship_fax payby payinfo payname month year invoicing_list postal_invoicing +=item The following fields are also returned + +first last company address1 address2 city county state zip country daytime night fax ship_first ship_last ship_company ship_address1 ship_address2 ship_city ship_state ship_zip ship_country ship_daytime ship_night ship_fax payby payinfo payname month year invoicing_list postal_invoicing =back @@ -389,14 +563,24 @@ Exact name on credit card (CARD/DCRD) =item address1 +Address line one + =item address2 +Address line two + =item city +City + =item state +State + =item zip +Zip or postal code + =item payby Customer's current default payment type. @@ -430,10 +614,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 @@ -446,6 +634,12 @@ hash reference as parameter with the following keys: =item session_id +Session identifier + +=item amount + +Amount + =item save If true, address and card information entered will be saved for subsequent @@ -459,16 +653,32 @@ payby to DCRD). This option only has meaning if B is set true. =item payname +Name on card + =item address1 +Address line one + =item address2 +Address line two + =item city +City + =item state +State + =item zip +Zip or postal code + +=item country + +Two-letter country code + =item payinfo Card number @@ -481,19 +691,52 @@ 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_change_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 @@ -501,6 +744,13 @@ 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 @@ -508,281 +758,976 @@ Array reference of hash references, each of which has the fields of a cust_pkg record (see L) as well as the fields below. Note these are not the internal FS:: objects, but hash references of columns and values. -=item all fields of part_pkg (XXXpare this down to a secure subset) +=over 4 + +=item part_pkg fields -=item part_svc - An array of hash references, each of which has the following keys: +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) -=over 4 +=cut -=item all fields of part_svc (XXXpare this down to a secure subset) +#XXX pare part_pkg fields down to a more secure subset -=item avail +=item part_svc -=back +An array of hash references indicating information on unprovisioned services +available for provisioning for this specific cust_pkg. Each has the following +keys: -=item error +=over 4 -Empty on success, or an error message on errors. +=item part_svc fields -=back +All fields of part_svc (be careful with this information - it may reveal more +about your available packages than you would like users to know in aggregate) -=item order_pkg +=cut -Orders a package for this customer. +#XXX pare part_svc fields down to a more secure subset -Takes a hash reference as parameter with the following keys: +=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 session_id +=item label -=item pkgpart +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 svcnum + +Primary key for this service =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 definition (see L) -=item username +=item pkgnum -=item _password +Customer package (see L) -=item sec_phrase +=item overlimit -=item popnum +Blank if the service is not over limit, or the date the service exceeded its usage limit (as a UNIX timestamp). =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. +=back -=item cancel_pkg +=item list_svcs -Cancels a package for this customer. +Returns service information for this customer. -Takes a hash reference as parameter with the following keys: +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 session_id +=item custnum -=item pkgpart +Customer number -=back +=item svcs -Returns a hash reference with a single key, B, empty on success, or an -error message on errors. +An array of hash references indicating information on all of this customer's +services. Each has the following keys: -=back +=over 4 -=head1 SIGNUP FUNCTIONS +=item svcnum -=over 4 +Primary key for this service -=item signup_info HASHREF +=item label -Takes a hash reference as parameter with the following keys: +Name of this service -=over 4 +=item value -=item session_id - Optional agent/reseller interface session +Meaningful user-specific identifier for the service (i.e. username, domain, or +mail alias). =back -Returns a hash reference containing information that may be useful in -displaying a signup page. The hash reference contains the following keys: +Account (svc_acct) services also have the following keys: =over 4 -=item cust_main_county +=item username -County/state/country data - array reference of hash references, each of which has the fields of a cust_main_county record (see L). Note these are not FS::cust_main_county objects, but hash references of columns and values. +Username -=item part_pkg +=item email -Available packages - array reference of hash references, each of which has the fields of a part_pkg record (see L). Each hash reference also has an additional 'payby' field containing an array reference of acceptable payment types specific to this package (see below and L). Note these are not FS::part_pkg objects, but hash references of columns and values. Requires the 'signup_server-default_agentnum' configuration value to be set, or -an agentnum specified explicitly via reseller interface session_id in the -options. +username@domain -=item agent +=item seconds -Array reference of hash references, each of which has the fields of an agent record (see L). Note these are not FS::agent objects, but hash references of columns and values. +Seconds remaining -=item agentnum2part_pkg +=item upbytes -Hash reference; keys are agentnums, values are array references of available packages for that agent, in the same format as the part_pkg arrayref above. +Upload bytes remaining -=item svc_acct_pop +=item downbytes -Access numbers - array reference of hash references, each of which has the fields of an svc_acct_pop record (see L). Note these are not FS::svc_acct_pop objects, but hash references of columns and values. +Download bytes remaining -=item security_phrase +=item totalbytes -True if the "security_phrase" feature is enabled +Total bytes remaining -=item payby +=item recharge_amount -Array reference of acceptable payment types for signup +Cost of a recharge -=over 4 +=item recharge_seconds -=item CARD (credit card - automatic) +Number of seconds gained by recharge -=item DCRD (credit card - on-demand - version 1.5+ only) +=item recharge_upbytes -=item CHEK (electronic check - automatic) +Number of upload bytes gained by recharge -=item DCHK (electronic check - on-demand - version 1.5+ only) +=item recharge_downbytes -=item LECB (Phone bill billing) +Number of download bytes gained by recharge -=item BILL (billing, not recommended for signups) +=item recharge_totalbytes -=item COMP (free, definately not recommended for signups) +Number of total bytes gained by recharge -=item PREPAY (special billing type: applies a credit (see FS::prepay_credit) and sets billing type to BILL) +=back =back -=item cvv_enabled +=item order_pkg -True if CVV features are available (1.5+ or 1.4.2 with CVV schema patch) +Orders a package for this customer. -=item msgcat +Takes a hash reference as parameter with the following keys: -Hash reference of message catalog values, to support error message customization. Currently available keys are: passwords_dont_match, invalid_card, unknown_card_type, and not_a (as in "Not a Discover card"). Values are configured in the web interface under "View/Edit message catalog". +=over 4 -=item statedefault +=item session_id -Default state +Session identifier -=item countrydefault +=item pkgpart -Default country +Package to order (see L). -=back +=item quantity -=item new_customer HASHREF +Quantity for this package order (default 1). -Creates a new customer. Takes a hash reference as parameter with the -following keys: +=item locationnum -=over 4 +Optional locationnum for this package order, for existing locations. -=item first - first name (required) +Or, for new locations, pass the following fields: address1*, address2, city*, +county, state*, zip*, country. (* = required in this case) -=item last - last name (required) +=item address1 -=item ss (not typically collected; mostly used for ACH transactions) +=item address 2 -=item company +=item city -=item address1 (required) +=item -=item address2 +=item svcpart -=item city (required) +Service to order (see L). -=item county +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. -=item state (required) +=back -=item zip (required) +Fields used when provisioning an svc_acct service: + +=over 4 + +=item username -=item daytime - phone +Username -=item night - phone +=item _password -=item fax - phone +Password -=item payby - CARD, DCRD, CHEK, DCHK, LECB, BILL, COMP or PREPAY (see L (required) +=item sec_phrase -=item payinfo - Card number for CARD/DCRD, account_number@aba_number for CHEK/DCHK, prepaid "pin" for PREPAY, purchase order number for BILL +Optional security phrase -=item paycvv - Credit card CVV2 number (1.5+ or 1.4.2 with CVV schema patch) +=item popnum -=item paydate - Expiration date for CARD/DCRD +Optional Access number number -=item payname - Exact name on credit card for CARD/DCRD, bank name for CHEK/DCHK +=back -=item invoicing_list - comma-separated list of email addresses for email invoices. The special value 'POST' is used to designate postal invoicing (it may be specified alone or in addition to email addresses), +Fields used when provisioning an svc_domain service: -=item referral_custnum - referring customer number +=over 4 -=item pkgpart - pkgpart of initial package +=item domain -=item username +Domain -=item _password +=back -=item sec_phrase - security phrase +Fields used when provisioning an svc_phone service: -=item popnum - access number (index, not the literal number) +=over 4 + +=item phonenum + +Phone number + +=item pin -=item agentnum - agent number +Voicemail PIN + +=item sip_password + +SIP password =back -Returns a hash reference with the following keys: +Fields used when provisioning an svc_external service: =over 4 -=item error Empty on success, or an error message on errors. The special error '_decline' is returned for declined transactions; other error messages should be suitable for display to the user (and are customizable in under Sysadmin | View/Edit message catalog) +=item id -=back +External numeric ID. -=item regionselector HASHREF | LIST +=item title -Takes as input a hashref or list of key/value pairs with the following keys: +External text title. + +=back + +Fields used when provisioning an svc_pbx service: =over 4 -=item selected_county +=item id -=item selected_state +Numeric ID. -=item selected_country +=item name -=item prefix - Specify a unique prefix string if you intend to use the HTML output multiple time son one page. +Text name. -=item onchange - Specify a javascript subroutine to call on changes +=back -=item default_state +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 default_country +=item change_pkg -=item locales - An arrayref of hash references specifying regions. Normally you can just pass the value of the I field returned by B. +Changes a package for this customer. -=back +Takes a hash reference as parameter with the following keys: -Returns a list consisting of three HTML fragments for county selection, -state selection and country selection, respectively. +=over 4 -=cut +=item session_id -#false laziness w/FS::cust_main_county (this is currently the "newest" version) -sub regionselector { - my $param; - if ( ref($_[0]) ) { - $param = shift; - } else { - $param = { @_ }; - } - $param->{'selected_country'} ||= $param->{'default_country'}; - $param->{'selected_state'} ||= $param->{'default_state'}; +Session identifier - my $prefix = exists($param->{'prefix'}) ? $param->{'prefix'} : ''; +=item pkgnum - my $countyflag = 0; +Existing customer package. - my %cust_main_county; +=item pkgpart -# unless ( @cust_main_county ) { #cache - #@cust_main_county = qsearch('cust_main_county', {} ); - #foreach my $c ( @cust_main_county ) { - foreach my $c ( @{ $param->{'locales'} } ) { +New package to order (see L). + +=item quantity + +Quantity for this package order (default 1). + +=back + +Returns a hash reference with the following keys: + +=over 4 + +=item error + +Empty on success, or an error message on errors. + +=item pkgnum + +On success, the new pkgnum + +=back + + +=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.) + +=item pkgnum + +Package that will be renewed. + +=item expire_date + +Expiration date of the package that will be renewed. + +=item expire_date_pretty + +Expiration date of the package that will be renewed, 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. + +Takes a hash reference as parameter with the following keys: + +=over 4 + +=item session_id + +Session identifier + +=item pkgpart + +pkgpart of package to cancel + +=back + +Returns a hash reference with a single key, B, empty on success, or an +error message on errors. + +=item provision_acct + +Provisions an account (svc_acct). + +Takes a hash references as parameter with the following keys: + +=over 4 + +=item session_id + +Session identifier + +=item pkgnum + +pkgnum of package into which this service is provisioned + +=item svcpart + +svcpart or service definition to provision + +=item username + +=item domsvc + +=item _password + +=back + +=item provision_phone + +Provisions a phone number (svc_phone). + +Takes a hash references as parameter with the following keys: + +=over 4 + +=item session_id + +Session identifier + +=item pkgnum + +pkgnum of package into which this service is provisioned + +=item svcpart + +svcpart or service definition to provision + +=item countrycode + +=item phonenum + +=item address1 + +=item address2 + +=item city + +=item county + +=item state + +=item zip + +=item country + +E911 Address (optional) + +=back + +=item provision_external + +Provisions an external service (svc_external). + +Takes a hash references as parameter with the following keys: + +=over 4 + +=item session_id + +Session identifier + +=item pkgnum + +pkgnum of package into which this service is provisioned + +=item svcpart + +svcpart or service definition to provision + +=item id + +=item title + +=back + +=back + +=head1 SIGNUP FUNCTIONS + +=over 4 + +=item signup_info HASHREF + +Takes a hash reference as parameter with the following keys: + +=over 4 + +=item session_id - Optional agent/reseller interface session + +=back + +Returns a hash reference containing information that may be useful in +displaying a signup page. The hash reference contains the following keys: + +=over 4 + +=item cust_main_county + +County/state/country data - array reference of hash references, each of which has the fields of a cust_main_county record (see L). Note these are not FS::cust_main_county objects, but hash references of columns and values. + +=item part_pkg + +Available packages - array reference of hash references, each of which has the fields of a part_pkg record (see L). Each hash reference also has an additional 'payby' field containing an array reference of acceptable payment types specific to this package (see below and L). Note these are not FS::part_pkg objects, but hash references of columns and values. Requires the 'signup_server-default_agentnum' configuration value to be set, or +an agentnum specified explicitly via reseller interface session_id in the +options. + +=item agent + +Array reference of hash references, each of which has the fields of an agent record (see L). Note these are not FS::agent objects, but hash references of columns and values. + +=item agentnum2part_pkg + +Hash reference; keys are agentnums, values are array references of available packages for that agent, in the same format as the part_pkg arrayref above. + +=item svc_acct_pop + +Access numbers - array reference of hash references, each of which has the fields of an svc_acct_pop record (see L). Note these are not FS::svc_acct_pop objects, but hash references of columns and values. + +=item security_phrase + +True if the "security_phrase" feature is enabled + +=item payby + +Array reference of acceptable payment types for signup + +=over 4 + +=item CARD + +credit card - automatic + +=item DCRD + +credit card - on-demand - version 1.5+ only + +=item CHEK + +electronic check - automatic + +=item DCHK + +electronic check - on-demand - version 1.5+ only + +=item LECB + +Phone bill billing + +=item BILL + +billing, not recommended for signups + +=item COMP + +free, definitely not recommended for signups + +=item PREPAY + +special billing type: applies a credit (see FS::prepay_credit) and sets billing type to BILL + +=back + +=item cvv_enabled + +True if CVV features are available (1.5+ or 1.4.2 with CVV schema patch) + +=item msgcat + +Hash reference of message catalog values, to support error message customization. Currently available keys are: passwords_dont_match, invalid_card, unknown_card_type, and not_a (as in "Not a Discover card"). Values are configured in the web interface under "View/Edit message catalog". + +=item statedefault + +Default state + +=item countrydefault + +Default country + +=back + +=item new_customer_minimal HASHREF + +Creates a new customer. + +Current differences from new_customer: An address is not required. promo_code +and reg_code are not supported. If invoicing_list and _password is passed, a +contact will be created with self-service access (no pkgpart or username is +necessary). No initial billing is run (this may change in a future version). + +Takes a hash reference as parameter with the following keys: + +=over 4 + +=item first + +first name (required) + +=item last + +last name (required) + +=item ss + +(not typically collected; mostly used for ACH transactions) + +=item company + +Company name + +=item address1 + +Address line one + +=item address2 + +Address line two + +=item city + +City + +=item county + +County + +=item state + +State + +=item zip + +Zip or postal code + +=item daytime + +Daytime phone number + +=item night + +Evening phone number + +=item fax + +Fax number + +=item payby + +CARD, DCRD, CHEK, DCHK, LECB, BILL, COMP or PREPAY (see L (required) + +=item payinfo + +Card number for CARD/DCRD, account_number@aba_number for CHEK/DCHK, prepaid "pin" for PREPAY, purchase order number for BILL + +=item paycvv + +Credit card CVV2 number (1.5+ or 1.4.2 with CVV schema patch) + +=item paydate + +Expiration date for CARD/DCRD + +=item payname + +Exact name on credit card for CARD/DCRD, bank name for CHEK/DCHK + +=item invoicing_list + +comma-separated list of email addresses for email invoices. The special value 'POST' is used to designate postal invoicing (it may be specified alone or in addition to email addresses), + +=item referral_custnum + +referring customer number + +=item agentnum + +Agent number + +=item pkgpart + +pkgpart of initial package + +=item username + +Username + +=item _password + +Password + +=item sec_phrase + +Security phrase + +=item popnum + +Access number (index, not the literal number) + +=item countrycode + +Country code (to be provisioned as a service) + +=item phonenum + +Phone number (to be provisioned as a service) + +=item pin + +Voicemail PIN + +=back + +Returns a hash reference with the following keys: + +=over 4 + +=item error + +Empty on success, or an error message on errors. The special error '_decline' is returned for declined transactions; other error messages should be suitable for display to the user (and are customizable in under Configuration | View/Edit message catalog) + +=back + +=item new_customer HASHREF + +Creates a new customer. Takes a hash reference as parameter with the +following keys: + +=over 4 + +=item first + +first name (required) + +=item last + +last name (required) + +=item ss + +(not typically collected; mostly used for ACH transactions) + +=item company + +Company name + +=item address1 (required) + +Address line one + +=item address2 + +Address line two + +=item city (required) + +City + +=item county + +County + +=item state (required) + +State + +=item zip (required) + +Zip or postal code + +=item daytime + +Daytime phone number + +=item night + +Evening phone number + +=item fax + +Fax number + +=item payby + +CARD, DCRD, CHEK, DCHK, LECB, BILL, COMP or PREPAY (see L (required) + +=item payinfo + +Card number for CARD/DCRD, account_number@aba_number for CHEK/DCHK, prepaid "pin" for PREPAY, purchase order number for BILL + +=item paycvv + +Credit card CVV2 number (1.5+ or 1.4.2 with CVV schema patch) + +=item paydate + +Expiration date for CARD/DCRD + +=item payname + +Exact name on credit card for CARD/DCRD, bank name for CHEK/DCHK + +=item invoicing_list + +comma-separated list of email addresses for email invoices. The special value 'POST' is used to designate postal invoicing (it may be specified alone or in addition to email addresses), + +=item referral_custnum + +referring customer number + +=item agentnum + +Agent number + +=item pkgpart + +pkgpart of initial package + +=item username + +Username + +=item _password + +Password + +=item sec_phrase + +Security phrase + +=item popnum + +Access number (index, not the literal number) + +=item countrycode + +Country code (to be provisioned as a service) + +=item phonenum + +Phone number (to be provisioned as a service) + +=item pin + +Voicemail PIN + +=back + +Returns a hash reference with the following keys: + +=over 4 + +=item error + +Empty on success, or an error message on errors. The special error '_decline' is returned for declined transactions; other error messages should be suitable for display to the user (and are customizable in under Configuration | View/Edit message catalog) + +=back + +=item regionselector HASHREF | LIST + +Takes as input a hashref or list of key/value pairs with the following keys: + +=over 4 + +=item selected_county + +Currently selected county + +=item selected_state + +Currently selected state + +=item selected_country + +Currently selected country + +=item prefix + +Specify a unique prefix string if you intend to use the HTML output multiple time son one page. + +=item onchange + +Specify a javascript subroutine to call on changes + +=item default_state + +Default state + +=item default_country + +Default country + +=item locales + +An arrayref of hash references specifying regions. Normally you can just pass the value of the I field returned by B. + +=back + +Returns a list consisting of three HTML fragments for county selection, +state selection and country selection, respectively. + +=cut + +#false laziness w/FS::cust_main_county (this is currently the "newest" version) +sub regionselector { + my $param; + if ( ref($_[0]) ) { + $param = shift; + } else { + $param = { @_ }; + } + $param->{'selected_country'} ||= $param->{'default_country'}; + $param->{'selected_state'} ||= $param->{'default_state'}; + + my $prefix = exists($param->{'prefix'}) ? $param->{'prefix'} : ''; + + my $countyflag = 0; + + my %cust_main_county; + +# unless ( @cust_main_county ) { #cache + #@cust_main_county = qsearch('cust_main_county', {} ); + #foreach my $c ( @cust_main_county ) { + foreach my $c ( @{ $param->{'locales'} } ) { #$countyflag=1 if $c->county; $countyflag=1 if $c->{county}; #push @{$cust_main_county{$c->country}{$c->state}}, $c->county; @@ -852,6 +1797,18 @@ END my $county_html = $script_html; if ( $countyflag ) { $county_html .= qq!'; } else { $county_html .= @@ -863,28 +1820,95 @@ END foreach my $state ( sort keys %{ $cust_main_county{$param->{'selected_country'}} } ) { my $text = $state || '(n/a)'; my $selected = $state eq $param->{'selected_state'} ? 'SELECTED' : ''; - $state_html .= "\n" + $state_html .= "\n" } $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 location_form HASHREF | LIST + +Takes as input a hashref or list of key/value pairs with the following keys: + +=over 4 + +=item session_id + +Current customer session_id + +=item no_asterisks + +Omit red asterisks from required fields. + +=item address1_label + +Label for first address line. + +=back + +Returns an HTML fragment for a location form (address, city, state, zip, +country) + +=cut + +sub location_form { + my $param; + if ( ref($_[0]) ) { + $param = shift; + } else { + $param = { @_ }; + } + + my $session_id = delete $param->{'session_id'}; + + my $rv = mason_comp( 'session_id' => $session_id, + 'comp' => '/elements/location.html', + 'args' => [ %$param ], + ); + + #hmm. + $rv->{'error'} || $rv->{'output'}; + +} + + #=item expselect HASHREF | LIST # #Takes as input a hashref or list of key/value pairs with the following keys: @@ -951,7 +1975,11 @@ Takes as input a hashref or list of key/value pairs with the following keys: =item popnum -=item pops - An arrayref of hash references specifying access numbers. Normally you can just pass the value of the I field returned by B. +Access number number + +=item pops + +An arrayref of hash references specifying access numbers. Normally you can just pass the value of the I field returned by B. =back @@ -1048,6 +2076,8 @@ END $text .= "}\n\n"; + $param->{'acstate'} = '' unless defined($param->{'acstate'}); + $text .= qq!' + } + + my $text .= qq!!; + + $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 @@ -1090,14 +2218,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
' + unless scalar(keys %$domains); + + if (scalar(keys %$domains) == 1) { + my $key; + foreach(keys %$domains) { + $key = $_; + } + return '
Domain'. $domains->{$key}. + '
Domain