summaryrefslogtreecommitdiff
path: root/httemplate/edit/process
diff options
context:
space:
mode:
Diffstat (limited to 'httemplate/edit/process')
-rwxr-xr-xhttemplate/edit/process/REAL_cust_pkg.cgi35
-rw-r--r--httemplate/edit/process/access_group.html15
-rw-r--r--httemplate/edit/process/access_user.html8
-rwxr-xr-xhttemplate/edit/process/addr_block/add.cgi21
-rwxr-xr-xhttemplate/edit/process/addr_block/allocate.cgi26
-rwxr-xr-xhttemplate/edit/process/addr_block/deallocate.cgi25
-rwxr-xr-xhttemplate/edit/process/addr_block/split.cgi20
-rwxr-xr-xhttemplate/edit/process/agent.cgi29
-rw-r--r--httemplate/edit/process/agent_payment_gateway.html26
-rwxr-xr-xhttemplate/edit/process/agent_type.cgi37
-rw-r--r--httemplate/edit/process/bulk-cust_svc.cgi4
-rwxr-xr-xhttemplate/edit/process/cust_bill_pay.cgi54
-rwxr-xr-xhttemplate/edit/process/cust_credit.cgi38
-rwxr-xr-xhttemplate/edit/process/cust_credit_bill.cgi55
-rwxr-xr-xhttemplate/edit/process/cust_main.cgi159
-rwxr-xr-xhttemplate/edit/process/cust_main_county-collapse.cgi36
-rwxr-xr-xhttemplate/edit/process/cust_main_county-expand.cgi59
-rwxr-xr-xhttemplate/edit/process/cust_main_county.cgi31
-rwxr-xr-xhttemplate/edit/process/cust_main_note.cgi34
-rwxr-xr-xhttemplate/edit/process/cust_pay.cgi56
-rwxr-xr-xhttemplate/edit/process/cust_pkg.cgi44
-rwxr-xr-xhttemplate/edit/process/cust_refund.cgi34
-rw-r--r--httemplate/edit/process/cust_svc.cgi30
-rwxr-xr-xhttemplate/edit/process/domain_record.cgi36
-rw-r--r--httemplate/edit/process/elements/process.html92
-rw-r--r--httemplate/edit/process/elements/svc_Common.html15
-rw-r--r--httemplate/edit/process/generic.cgi73
-rw-r--r--httemplate/edit/process/inventory_class.html5
-rw-r--r--httemplate/edit/process/msgcat.cgi21
-rwxr-xr-xhttemplate/edit/process/part_bill_event.cgi55
-rw-r--r--httemplate/edit/process/part_export.cgi40
-rwxr-xr-xhttemplate/edit/process/part_pkg.cgi62
-rwxr-xr-xhttemplate/edit/process/part_referral.html5
-rwxr-xr-xhttemplate/edit/process/part_svc.cgi4
-rw-r--r--httemplate/edit/process/payment_gateway.html34
-rw-r--r--httemplate/edit/process/pkg_class.html5
-rw-r--r--httemplate/edit/process/prepay_credit.cgi57
-rw-r--r--httemplate/edit/process/quick-charge.cgi43
-rw-r--r--httemplate/edit/process/quick-cust_pkg.cgi27
-rwxr-xr-xhttemplate/edit/process/rate.cgi4
-rwxr-xr-xhttemplate/edit/process/rate_region.cgi52
-rw-r--r--httemplate/edit/process/reg_code.cgi50
-rw-r--r--httemplate/edit/process/router.cgi68
-rwxr-xr-xhttemplate/edit/process/svc_acct.cgi50
-rwxr-xr-xhttemplate/edit/process/svc_acct_pop.cgi29
-rw-r--r--httemplate/edit/process/svc_broadband.cgi37
-rwxr-xr-xhttemplate/edit/process/svc_domain.cgi32
-rwxr-xr-xhttemplate/edit/process/svc_external.cgi30
-rwxr-xr-xhttemplate/edit/process/svc_forward.cgi30
-rw-r--r--httemplate/edit/process/svc_phone.html4
-rw-r--r--httemplate/edit/process/svc_www.cgi37
51 files changed, 1873 insertions, 0 deletions
diff --git a/httemplate/edit/process/REAL_cust_pkg.cgi b/httemplate/edit/process/REAL_cust_pkg.cgi
new file mode 100755
index 000000000..26e234fb0
--- /dev/null
+++ b/httemplate/edit/process/REAL_cust_pkg.cgi
@@ -0,0 +1,35 @@
+%
+%
+%my $pkgnum = $cgi->param('pkgnum') or die;
+%my $old = qsearchs('cust_pkg',{'pkgnum'=>$pkgnum});
+%my %hash = $old->hash;
+%$hash{'setup'} = $cgi->param('setup') ? str2time($cgi->param('setup')) : '';
+%$hash{'bill'} = $cgi->param('bill') ? str2time($cgi->param('bill')) : '';
+%$hash{'last_bill'} =
+% $cgi->param('last_bill') ? str2time($cgi->param('last_bill')) : '';
+%$hash{'expire'} = $cgi->param('expire') ? str2time($cgi->param('expire')) : '';
+%
+%my $new;
+%my $error;
+%if ( $hash{'bill'} != $old->bill # if the next bill date was changed
+% && $hash{'bill'} < time # to a date in the past
+% && ! $cgi->param('bill_areyousure') # and it wasn't confirmed
+% )
+%{
+% $error = '_bill_areyousure';
+%} else {
+% $new = new FS::cust_pkg \%hash;
+% $error = $new->replace($old);
+%}
+%
+%if ( $error ) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(2). "REAL_cust_pkg.cgi?". $cgi->query_string );
+%} else {
+% my $custnum = $new->custnum;
+% print $cgi->redirect(popurl(3). "view/cust_main.cgi?$custnum".
+% "#cust_pkg$pkgnum" );
+%}
+%
+%
+
diff --git a/httemplate/edit/process/access_group.html b/httemplate/edit/process/access_group.html
new file mode 100644
index 000000000..c80311586
--- /dev/null
+++ b/httemplate/edit/process/access_group.html
@@ -0,0 +1,15 @@
+<% include( 'elements/process.html',
+ 'table' => 'access_group',
+ 'viewall_dir' => 'browse',
+ 'process_m2m' => { 'link_table' => 'access_groupagent',
+ 'target_table' => 'agent',
+ },
+ 'process_m2name' => {
+ 'link_table' => 'access_right',
+ 'link_static' => { 'righttype' => 'FS::access_group', },
+ 'num_col' => 'rightobjnum',
+ 'name_col' => 'rightname',
+ 'names_list' => [ FS::AccessRight->rights() ],
+ },
+ )
+%>
diff --git a/httemplate/edit/process/access_user.html b/httemplate/edit/process/access_user.html
new file mode 100644
index 000000000..78857c525
--- /dev/null
+++ b/httemplate/edit/process/access_user.html
@@ -0,0 +1,8 @@
+<% include( 'elements/process.html',
+ 'table' => 'access_user',
+ 'viewall_dir' => 'browse',
+ 'process_m2m' => { 'link_table' => 'access_usergroup',
+ 'target_table' => 'access_group',
+ },
+ )
+%>
diff --git a/httemplate/edit/process/addr_block/add.cgi b/httemplate/edit/process/addr_block/add.cgi
new file mode 100755
index 000000000..85780c678
--- /dev/null
+++ b/httemplate/edit/process/addr_block/add.cgi
@@ -0,0 +1,21 @@
+%
+%
+%my $error = '';
+%my $ip_gateway = $cgi->param('ip_gateway');
+%my $ip_netmask = $cgi->param('ip_netmask');
+%
+%my $new = new FS::addr_block {
+% ip_gateway => $ip_gateway,
+% ip_netmask => $ip_netmask,
+% routernum => 0 };
+%
+%$error = $new->insert;
+%
+%if ( $error ) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(4). "browse/addr_block.cgi?". $cgi->query_string );
+%} else {
+% print $cgi->redirect(popurl(4). "browse/addr_block.cgi");
+%}
+%
+
diff --git a/httemplate/edit/process/addr_block/allocate.cgi b/httemplate/edit/process/addr_block/allocate.cgi
new file mode 100755
index 000000000..a94c0320f
--- /dev/null
+++ b/httemplate/edit/process/addr_block/allocate.cgi
@@ -0,0 +1,26 @@
+%
+%my $error = '';
+%my $blocknum = $cgi->param('blocknum');
+%my $routernum = $cgi->param('routernum');
+%
+%my $addr_block = qsearchs('addr_block', { blocknum => $blocknum });
+%my $router = qsearchs('router', { routernum => $routernum });
+%
+%if($addr_block) {
+% if ($router) {
+% $error = $addr_block->allocate($router);
+% } else {
+% $error = "Cannot find router with routernum $routernum";
+% }
+%} else {
+% $error = "Cannot find block with blocknum $blocknum";
+%}
+%
+%if ( $error ) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(4). "browse/addr_block.cgi?" . $cgi->query_string);
+%} else {
+% print $cgi->redirect(popurl(4). "browse/addr_block.cgi");
+%}
+%
+
diff --git a/httemplate/edit/process/addr_block/deallocate.cgi b/httemplate/edit/process/addr_block/deallocate.cgi
new file mode 100755
index 000000000..494c19f75
--- /dev/null
+++ b/httemplate/edit/process/addr_block/deallocate.cgi
@@ -0,0 +1,25 @@
+%
+%my $error = '';
+%my $blocknum = $cgi->param('blocknum');
+%
+%my $addr_block = qsearchs('addr_block', { blocknum => $blocknum });
+%
+%if($addr_block) {
+% my $router = $addr_block->router;
+% if ($router) {
+% $error = $addr_block->deallocate($router);
+% } else {
+% $error = "Block is not allocated to a router";
+% }
+%} else {
+% $error = "Cannot find block with blocknum $blocknum";
+%}
+%
+%if ( $error ) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(4). "browse/addr_block.cgi?" . $cgi->query_string);
+%} else {
+% print $cgi->redirect(popurl(4). "browse/addr_block.cgi");
+%}
+%
+
diff --git a/httemplate/edit/process/addr_block/split.cgi b/httemplate/edit/process/addr_block/split.cgi
new file mode 100755
index 000000000..617c3f8ce
--- /dev/null
+++ b/httemplate/edit/process/addr_block/split.cgi
@@ -0,0 +1,20 @@
+%
+%my $error = '';
+%my $blocknum = $cgi->param('blocknum');
+%my $addr_block = qsearchs('addr_block', { blocknum => $blocknum });
+%
+%if ( $addr_block) {
+% $error = $addr_block->split_block;
+%} else {
+% $error = "Unknown blocknum: $blocknum";
+%}
+%
+%
+%if ( $error ) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(4). "browse/addr_block.cgi?". $cgi->query_string );
+%} else {
+% print $cgi->redirect(popurl(4). "browse/addr_block.cgi");
+%}
+%
+
diff --git a/httemplate/edit/process/agent.cgi b/httemplate/edit/process/agent.cgi
new file mode 100755
index 000000000..5128d7ae8
--- /dev/null
+++ b/httemplate/edit/process/agent.cgi
@@ -0,0 +1,29 @@
+%
+%
+%my $agentnum = $cgi->param('agentnum');
+%
+%my $old = qsearchs('agent',{'agentnum'=>$agentnum}) if $agentnum;
+%
+%my $new = new FS::agent ( {
+% map {
+% $_, scalar($cgi->param($_));
+% } fields('agent')
+%} );
+%
+%my $error;
+%if ( $agentnum ) {
+% $error=$new->replace($old);
+%} else {
+% $error=$new->insert;
+% $agentnum=$new->getfield('agentnum');
+%}
+%
+%if ( $error ) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(2). "agent.cgi?". $cgi->query_string );
+%} else {
+% print $cgi->redirect(popurl(3). "browse/agent.cgi");
+%}
+%
+%
+
diff --git a/httemplate/edit/process/agent_payment_gateway.html b/httemplate/edit/process/agent_payment_gateway.html
new file mode 100644
index 000000000..436317ec4
--- /dev/null
+++ b/httemplate/edit/process/agent_payment_gateway.html
@@ -0,0 +1,26 @@
+%
+%
+%$cgi->param('agentnum') =~ /(\d+)$/ or die "illegal agentnum";
+%my $agent = qsearchs('agent', { 'agentnum' => $1 } );
+%die "agentnum $1 not found" unless $agent;
+%
+%#my $old
+%
+%my @new = map {
+% my $cardtype = $_;
+% new FS::agent_payment_gateway {
+% ( map { $_ => scalar($cgi->param($_)) }
+% fields('agent_payment_gateway')
+% ),
+% 'cardtype' => $cardtype,
+% };
+% }
+% $cgi->param('cardtype');
+%
+%foreach my $new (@new) {
+% my $error = $new->insert;
+% die $error if $error;
+%}
+%
+%
+<% $cgi->redirect(popurl(3). "browse/agent.cgi") %>
diff --git a/httemplate/edit/process/agent_type.cgi b/httemplate/edit/process/agent_type.cgi
new file mode 100755
index 000000000..b8d03705c
--- /dev/null
+++ b/httemplate/edit/process/agent_type.cgi
@@ -0,0 +1,37 @@
+%
+%
+%my $typenum = $cgi->param('typenum');
+%my $old = qsearchs('agent_type',{'typenum'=>$typenum}) if $typenum;
+%
+%my $new = new FS::agent_type ( {
+% map {
+% $_, scalar($cgi->param($_));
+% } fields('agent_type')
+%} );
+%
+%my $error;
+%if ( $typenum ) {
+% $error = $new->replace($old);
+%} else {
+% $error = $new->insert;
+% $typenum = $new->getfield('typenum');
+%}
+%#$error ||= $new->process_m2m( );
+%
+%if ( $error ) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(2). "agent_type.cgi?". $cgi->query_string );
+%} else {
+%
+% my $error = $new->process_m2m(
+% 'link_table' => 'type_pkgs',
+% 'target_table' => 'part_pkg',
+% 'params' => scalar($cgi->Vars)
+% );
+% die $error if $error;
+%
+% print $cgi->redirect(popurl(3). "browse/agent_type.cgi");
+%}
+%
+%
+
diff --git a/httemplate/edit/process/bulk-cust_svc.cgi b/httemplate/edit/process/bulk-cust_svc.cgi
new file mode 100644
index 000000000..ad4d67307
--- /dev/null
+++ b/httemplate/edit/process/bulk-cust_svc.cgi
@@ -0,0 +1,4 @@
+%
+% my $server = new FS::UI::Web::JSRPC 'FS::part_svc::process_bulk_cust_svc', $cgi;
+%
+<% $server->process %>
diff --git a/httemplate/edit/process/cust_bill_pay.cgi b/httemplate/edit/process/cust_bill_pay.cgi
new file mode 100755
index 000000000..962fc4eb9
--- /dev/null
+++ b/httemplate/edit/process/cust_bill_pay.cgi
@@ -0,0 +1,54 @@
+%
+%
+%$cgi->param('paynum') =~ /^(\d*)$/ or die "Illegal paynum!";
+%my $paynum = $1;
+%
+%my $cust_pay = qsearchs('cust_pay', { 'paynum' => $paynum } )
+% or die "No such paynum";
+%
+%my $cust_main = qsearchs('cust_main', { 'custnum' => $cust_pay->custnum } )
+% or die "Bogus credit: not attached to customer";
+%
+%my $custnum = $cust_main->custnum;
+%
+%my $new;
+%if ($cgi->param('invnum') =~ /^Refund$/) {
+% $new = new FS::cust_refund ( {
+% 'reason' => 'Refunding payment', #enter reason in UI
+% 'refund' => $cgi->param('amount'),
+% 'payby' => 'BILL',
+% #'_date' => $cgi->param('_date'),
+% 'payinfo' => 'Cash', #enter payinfo in UI
+% 'paynum' => $paynum,
+% } );
+%} else {
+% $new = new FS::cust_bill_pay ( {
+% map {
+% $_, scalar($cgi->param($_));
+% #} qw(custnum _date amount invnum)
+% } fields('cust_bill_pay')
+% } );
+%}
+%
+%my $error = $new->insert;
+%
+%if ( $error ) {
+%
+% $cgi->param('error', $error);
+%
+<% $cgi->redirect(popurl(2). "cust_bill_pay.cgi?". $cgi->query_string ) %>
+%
+%
+%} else {
+%
+% #print $cgi->redirect(popurl(3). "view/cust_main.cgi?$custnum");
+%
+%
+<% header('Payment application sucessful') %>
+ <SCRIPT TYPE="text/javascript">
+ window.top.location.reload();
+ </SCRIPT>
+
+ </BODY></HTML>
+% }
+
diff --git a/httemplate/edit/process/cust_credit.cgi b/httemplate/edit/process/cust_credit.cgi
new file mode 100755
index 000000000..19faca47a
--- /dev/null
+++ b/httemplate/edit/process/cust_credit.cgi
@@ -0,0 +1,38 @@
+%
+%
+%$cgi->param('custnum') =~ /^(\d*)$/ or die "Illegal custnum!";
+%my $custnum = $1;
+%
+%my $new = new FS::cust_credit ( {
+% map {
+% $_, scalar($cgi->param($_));
+% } fields('cust_credit')
+%} );
+%
+%my $error = $new->insert;
+%
+%if ( $error ) {
+% $cgi->param('error', $error);
+%
+%
+<% $cgi->redirect(popurl(2). "cust_credit.cgi?". $cgi->query_string ) %>
+%
+%
+%} else {
+%
+% if ( $cgi->param('apply') eq 'yes' ) {
+% my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum })
+% or die "unknown custnum $custnum";
+% $cust_main->apply_credits;
+% }
+% #print $cgi->redirect(popurl(3). "view/cust_main.cgi?$custnum");
+%
+%
+<% header('Credit sucessful') %>
+ <SCRIPT TYPE="text/javascript">
+ window.top.location.reload();
+ </SCRIPT>
+
+ </BODY></HTML>
+% }
+
diff --git a/httemplate/edit/process/cust_credit_bill.cgi b/httemplate/edit/process/cust_credit_bill.cgi
new file mode 100755
index 000000000..7509a3f02
--- /dev/null
+++ b/httemplate/edit/process/cust_credit_bill.cgi
@@ -0,0 +1,55 @@
+%
+%
+%$cgi->param('crednum') =~ /^(\d*)$/ or die "Illegal crednum!";
+%my $crednum = $1;
+%
+%my $cust_credit = qsearchs('cust_credit', { 'crednum' => $crednum } )
+% or die "No such crednum";
+%
+%my $cust_main = qsearchs('cust_main', { 'custnum' => $cust_credit->custnum } )
+% or die "Bogus credit: not attached to customer";
+%
+%my $custnum = $cust_main->custnum;
+%
+%my $new;
+%if ($cgi->param('invnum') =~ /^Refund$/) {
+% $new = new FS::cust_refund ( {
+% 'reason' => ( $cust_credit->reason || 'refund from credit' ),
+% 'refund' => $cgi->param('amount'),
+% 'payby' => 'BILL',
+% #'_date' => $cgi->param('_date'),
+% #'payinfo' => 'Cash',
+% 'payinfo' => 'Refund',
+% 'crednum' => $crednum,
+% } );
+%} else {
+% $new = new FS::cust_credit_bill ( {
+% map {
+% $_, scalar($cgi->param($_));
+% #} qw(custnum _date amount invnum)
+% } fields('cust_credit_bill')
+% } );
+%}
+%
+%my $error = $new->insert;
+%
+%if ( $error ) {
+%
+% $cgi->param('error', $error);
+%
+<% $cgi->redirect(popurl(2). "cust_credit_bill.cgi?". $cgi->query_string ) %>
+%
+%
+%} else {
+%
+% #print $cgi->redirect(popurl(3). "view/cust_main.cgi?$custnum");
+%
+%
+<% header('Credit application sucessful') %>
+ <SCRIPT TYPE="text/javascript">
+ window.top.location.reload();
+ </SCRIPT>
+
+ </BODY></HTML>
+% }
+
diff --git a/httemplate/edit/process/cust_main.cgi b/httemplate/edit/process/cust_main.cgi
new file mode 100755
index 000000000..33f7bb895
--- /dev/null
+++ b/httemplate/edit/process/cust_main.cgi
@@ -0,0 +1,159 @@
+%
+%
+%my $error = '';
+%
+%#unmunge stuff
+%
+%$cgi->param('tax','') unless defined $cgi->param('tax');
+%
+%$cgi->param('refnum', (split(/:/, ($cgi->param('refnum'))[0] ))[0] );
+%
+%#my $payby = $cgi->param('payby');
+%my $payby = $cgi->param('select'); # XXX key
+%
+%my %noauto = (
+% 'CARD' => 'DCRD',
+% 'CHEK' => 'DCHK',
+%);
+%$payby = $noauto{$payby}
+% if ! $cgi->param('payauto') && exists $noauto{$payby};
+%
+%$cgi->param('payby', $payby);
+%
+%if ( $payby ) {
+% if ( $payby eq 'CHEK' || $payby eq 'DCHK' ) {
+% $cgi->param('payinfo',
+% $cgi->param('payinfo1'). '@'. $cgi->param('payinfo2') );
+% }
+% $cgi->param('paydate',
+% $cgi->param( 'exp_month' ). '-'. $cgi->param( 'exp_year' ) );
+%}
+%
+%my @invoicing_list = split( /\s*\,\s*/, $cgi->param('invoicing_list') );
+%push @invoicing_list, 'POST' if $cgi->param('invoicing_list_POST');
+%push @invoicing_list, 'FAX' if $cgi->param('invoicing_list_FAX');
+%$cgi->param('invoicing_list', join(',', @invoicing_list) );
+%
+%
+%#create new record object
+%
+%my $new = new FS::cust_main ( {
+% map {
+% $_, scalar($cgi->param($_))
+%# } qw(custnum agentnum last first ss company address1 address2 city county
+%# state zip daytime night fax payby payinfo paydate payname tax
+%# otaker refnum)
+% } fields('cust_main')
+%} );
+%
+%if ( defined($cgi->param('same')) && $cgi->param('same') eq "Y" ) {
+% $new->setfield("ship_$_", '') foreach qw(
+% last first company address1 address2 city county state zip
+% country daytime night fax
+% );
+%}
+%
+%if ( $cgi->param('birthdate') && $cgi->param('birthdate') =~ /^([ 0-9\-\/]{0,10})$/ ) {
+% $new->setfield('birthdate', str2time($1));
+%}
+%
+%$new->setfield('paid', $cgi->param('paid') )
+% if $cgi->param('paid');
+%
+%#perhaps this stuff should go to cust_main.pm
+%my $cust_pkg = '';
+%my $svc_acct = '';
+%if ( $new->custnum eq '' ) {
+%
+% if ( $cgi->param('pkgpart_svcpart') ) {
+% my $x = $cgi->param('pkgpart_svcpart');
+% $x =~ /^(\d+)_(\d+)$/ or die "illegal pkgpart_svcpart $x\n";
+% my($pkgpart, $svcpart) = ($1, $2);
+% #false laziness: copied from FS::cust_pkg::order (which should become a
+% #FS::cust_main method)
+% my(%part_pkg);
+% # generate %part_pkg
+% # $part_pkg{$pkgpart} is true iff $custnum may purchase $pkgpart
+% my $agent = qsearchs('agent',{'agentnum'=> $new->agentnum });
+% #my($type_pkgs);
+% #foreach $type_pkgs ( qsearch('type_pkgs',{'typenum'=> $agent->typenum }) ) {
+% # my($pkgpart)=$type_pkgs->pkgpart;
+% # $part_pkg{$pkgpart}++;
+% #}
+% # $pkgpart_href->{PKGPART} is true iff $custnum may purchase $pkgpart
+% my $pkgpart_href = $agent->pkgpart_hashref;
+% #eslaf
+%
+% # this should wind up in FS::cust_pkg!
+% $error ||= "Agent ". $new->agentnum. " (type ". $agent->typenum. ") can't ".
+% "purchase pkgpart ". $pkgpart
+% #unless $part_pkg{ $pkgpart };
+% unless $pkgpart_href->{ $pkgpart };
+%
+% $cust_pkg = new FS::cust_pkg ( {
+% #later 'custnum' => $custnum,
+% 'pkgpart' => $pkgpart,
+% } );
+% #$error ||= $cust_pkg->check;
+%
+% #$cust_svc = new FS::cust_svc ( { 'svcpart' => $svcpart } );
+%
+% #$error ||= $cust_svc->check;
+%
+% $svc_acct = new FS::svc_acct ( {
+% 'svcpart' => $svcpart,
+% 'username' => $cgi->param('username'),
+% '_password' => $cgi->param('_password'),
+% 'popnum' => $cgi->param('popnum'),
+% } );
+%
+% #and just in case you were silly
+% $svc_acct->svcpart($svcpart);
+% $svc_acct->username($cgi->param('username'));
+% $svc_acct->_password($cgi->param('_password'));
+% $svc_acct->popnum($cgi->param('popnum'));
+%
+% #$error ||= $svc_acct->check;
+%
+% } elsif ( $cgi->param('username') ) { #good thing to catch
+% $error = "Can't assign username without a package!";
+% }
+%
+% use Tie::RefHash;
+% tie my %hash, 'Tie::RefHash';
+% %hash = ( $cust_pkg => [ $svc_acct ] ) if $cust_pkg;
+% $error ||= $new->insert( \%hash, \@invoicing_list );
+%
+% my $conf = new FS::Conf;
+% if ( $conf->exists('backend-realtime') && ! $error ) {
+%
+% my $berror = $new->bill;
+% $new->apply_payments;
+% $new->apply_credits;
+% $berror ||= $new->collect( 'realtime' => 1 );
+% warn "Warning, error billing during backend-realtime: $berror" if $berror;
+%
+% }
+%
+%} else { #create old record object
+%
+% my $old = qsearchs( 'cust_main', { 'custnum' => $new->custnum } );
+% $error ||= "Old record not found!" unless $old;
+% if ( defined dbdef->table('cust_main')->column('paycvv')
+% && length($old->paycvv)
+% && $new->paycvv =~ /^\s*\*+\s*$/ ) {
+% $new->paycvv($old->paycvv);
+% }
+% $error ||= $new->replace($old, \@invoicing_list);
+%
+%}
+%
+%if ( $error ) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(2). "cust_main.cgi?". $cgi->query_string );
+%} else {
+% print $cgi->redirect(popurl(3). "view/cust_main.cgi?". $new->custnum);
+%}
+%
+
+
diff --git a/httemplate/edit/process/cust_main_county-collapse.cgi b/httemplate/edit/process/cust_main_county-collapse.cgi
new file mode 100755
index 000000000..4bcaf1de3
--- /dev/null
+++ b/httemplate/edit/process/cust_main_county-collapse.cgi
@@ -0,0 +1,36 @@
+%
+%
+%my($query) = $cgi->keywords;
+%$query =~ /^(\d+)$/ or die "Illegal taxnum!";
+%my $taxnum = $1;
+%my $cust_main_county = qsearchs('cust_main_county', { 'taxnum' => $taxnum } )
+% or die "Unknown taxnum $taxnum";
+%
+%#really should do this in a .pm & start transaction
+%
+%foreach my $delete ( qsearch('cust_main_county', {
+% 'country' => $cust_main_county->country,
+% 'state' => $cust_main_county->state
+% } ) ) {
+%# unless ( qsearch('cust_main',{
+%# 'state' => $cust_main_county->getfield('state'),
+%# 'county' => $cust_main_county->getfield('county'),
+%# 'country' => $cust_main_county->getfield('country'),
+%# } ) ) {
+% my $error = $delete->delete;
+% die $error if $error;
+%# } else {
+% #should really fix the $cust_main record
+%# }
+%
+%}
+%
+%$cust_main_county->taxnum('');
+%$cust_main_county->county('');
+%my $error = $cust_main_county->insert;
+%die $error if $error;
+%
+%print $cgi->redirect(popurl(3). "browse/cust_main_county.cgi");
+%
+%
+
diff --git a/httemplate/edit/process/cust_main_county-expand.cgi b/httemplate/edit/process/cust_main_county-expand.cgi
new file mode 100755
index 000000000..e550e8b4a
--- /dev/null
+++ b/httemplate/edit/process/cust_main_county-expand.cgi
@@ -0,0 +1,59 @@
+%
+%
+%$cgi->param('taxnum') =~ /^(\d+)$/ or die "Illegal taxnum!";
+%my $taxnum = $1;
+%my $cust_main_county = qsearchs('cust_main_county',{'taxnum'=>$taxnum})
+% or die ("Unknown taxnum!");
+%
+%my @expansion;
+%if ( $cgi->param('delim') eq 'n' ) {
+% @expansion=split(/\n/,$cgi->param('expansion'));
+%} elsif ( $cgi->param('delim') eq 's' ) {
+% @expansion=split(' ',$cgi->param('expansion'));
+%} else {
+% die "Illegal delim!";
+%}
+%
+%@expansion=map {
+% unless ( /^\s*([\w\- ]+)\s*$/ ) {
+% $cgi->param('error', "Illegal item in expansion");
+% print $cgi->redirect(popurl(2). "cust_main_county-expand.cgi?". $cgi->query_string );
+% myexit();
+% }
+% $1;
+%} @expansion;
+%
+%foreach ( @expansion) {
+% my(%hash)=$cust_main_county->hash;
+% my($new)=new FS::cust_main_county \%hash;
+% $new->setfield('taxnum','');
+% if ( $cgi->param('taxclass') ) {
+% $new->setfield('taxclass', $_);
+% } elsif ( ! $cust_main_county->state ) {
+% $new->setfield('state',$_);
+% } else {
+% $new->setfield('county',$_);
+% }
+% #if (datasrc =~ m/Pg/)
+% #{
+% # $new->setfield('tax',0.0);
+% #}
+% my($error)=$new->insert;
+% die $error if $error;
+%}
+%
+%unless ( qsearch( 'cust_main', {
+% 'state' => $cust_main_county->state,
+% 'county' => $cust_main_county->county,
+% 'country' => $cust_main_county->country,
+% } )
+% || ! @expansion
+%) {
+% my($error)=($cust_main_county->delete);
+% die $error if $error;
+%}
+%
+%print $cgi->redirect(popurl(3). "browse/cust_main_county.cgi");
+%
+%
+
diff --git a/httemplate/edit/process/cust_main_county.cgi b/httemplate/edit/process/cust_main_county.cgi
new file mode 100755
index 000000000..2c3ebe866
--- /dev/null
+++ b/httemplate/edit/process/cust_main_county.cgi
@@ -0,0 +1,31 @@
+%
+%
+%foreach ( grep { /^tax\d+$/ } $cgi->param ) {
+% /^tax(\d+)$/ or die "Illegal form $_!";
+% my $taxnum = $1;
+% my $old = qsearchs('cust_main_county', { 'taxnum' => $taxnum })
+% or die "Couldn't find taxnum $taxnum!";
+% next unless $old->tax != $cgi->param("tax$taxnum")
+% || $old->exempt_amount != $cgi->param("exempt_amount$taxnum")
+% || $old->taxname ne $cgi->param("taxname$taxnum")
+% || $old->setuptax ne $cgi->param("setuptax$taxnum")
+% || $old->recurtax ne $cgi->param("recurtax$taxnum");
+% my %hash = $old->hash;
+% $hash{tax} = $cgi->param("tax$taxnum");
+% $hash{exempt_amount} = $cgi->param("exempt_amount$taxnum");
+% $hash{taxname} = $cgi->param("taxname$taxnum");
+% $hash{setuptax} = $cgi->param("setuptax$taxnum");
+% $hash{recurtax} = $cgi->param("recurtax$taxnum");
+% my $new = new FS::cust_main_county \%hash;
+% my $error = $new->replace($old);
+% if ( $error ) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(2). "cust_main_county.cgi?". $cgi->query_string );
+% myexit();
+% }
+%}
+%
+%print $cgi->redirect(popurl(3). "browse/cust_main_county.cgi");
+%
+%
+
diff --git a/httemplate/edit/process/cust_main_note.cgi b/httemplate/edit/process/cust_main_note.cgi
new file mode 100755
index 000000000..d9251f042
--- /dev/null
+++ b/httemplate/edit/process/cust_main_note.cgi
@@ -0,0 +1,34 @@
+%
+%
+%$cgi->param('custnum') =~ /^(\d+)$/
+% or die "Illegal custnum: ". $cgi->param('custnum');
+%my $custnum = $1;
+%
+%my $otaker = $FS::CurrentUser::CurrentUser->name;
+%$otaker = $FS::CurrentUser::CurrentUser->username
+% if ($otaker eq "User, Legacy");
+%
+%my $new = new FS::cust_main_note ( {
+% custnum => $custnum,
+% _date => time,
+% otaker => $otaker,
+% comments => $cgi->param('comment'),
+%} );
+%
+%my $error = $new->insert;
+%
+%if ($error) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(2). 'cust_main_note.cgi?'. $cgi->query_string );
+%}
+%
+%
+<% header('Note added') %>
+ <SCRIPT TYPE="text/javascript">
+ window.top.location.reload();
+ </SCRIPT>
+
+ </BODY></HTML>
+%
+%
+
diff --git a/httemplate/edit/process/cust_pay.cgi b/httemplate/edit/process/cust_pay.cgi
new file mode 100755
index 000000000..68342ee04
--- /dev/null
+++ b/httemplate/edit/process/cust_pay.cgi
@@ -0,0 +1,56 @@
+%
+%
+%$cgi->param('linknum') =~ /^(\d+)$/
+% or die "Illegal linknum: ". $cgi->param('linknum');
+%my $linknum = $1;
+%
+%$cgi->param('link') =~ /^(custnum|invnum|popup)$/
+% or die "Illegal link: ". $cgi->param('link');
+%my $field = my $link = $1;
+%$field = 'custnum' if $field eq 'popup';
+%
+%my $_date = str2time($cgi->param('_date'));
+%
+%my $new = new FS::cust_pay ( {
+% $field => $linknum,
+% _date => $_date,
+% map {
+% $_, scalar($cgi->param($_));
+% } qw(paid payby payinfo paybatch)
+% #} fields('cust_pay')
+%} );
+%
+%my $error = $new->insert;
+%
+%if ($error) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(2). 'cust_pay.cgi?'. $cgi->query_string );
+%} elsif ( $field eq 'invnum' ) {
+% print $cgi->redirect(popurl(3). "view/cust_bill.cgi?$linknum");
+%} elsif ( $field eq 'custnum' ) {
+% if ( $cgi->param('apply') eq 'yes' ) {
+% my $cust_main = qsearchs('cust_main', { 'custnum' => $linknum })
+% or die "unknown custnum $linknum";
+% $cust_main->apply_payments;
+% }
+% if ( $link eq 'popup' ) {
+%
+%
+<% header('Payment entered') %>
+ <SCRIPT TYPE="text/javascript">
+ window.top.location.reload();
+ </SCRIPT>
+
+ </BODY></HTML>
+%
+%
+% } elsif ( $link eq 'custnum' ) {
+% print $cgi->redirect(popurl(3). "view/cust_main.cgi?$linknum");
+% } else {
+% die "unknown link $link";
+% }
+%
+%}
+%
+%
+
diff --git a/httemplate/edit/process/cust_pkg.cgi b/httemplate/edit/process/cust_pkg.cgi
new file mode 100755
index 000000000..817c88087
--- /dev/null
+++ b/httemplate/edit/process/cust_pkg.cgi
@@ -0,0 +1,44 @@
+%
+%
+%my $error = '';
+%
+%#untaint custnum
+%$cgi->param('custnum') =~ /^(\d+)$/;
+%my $custnum = $1;
+%
+%my @remove_pkgnums = map {
+% /^(\d+)$/ or die "Illegal remove_pkg value!";
+% $1;
+%} $cgi->param('remove_pkg');
+%
+%my $error_redirect;
+%my @pkgparts;
+%if ( $cgi->param('new_pkgpart') =~ /^(\d+)$/ ) { #came from misc/change_pkg.cgi
+% $error_redirect = "misc/change_pkg.cgi";
+% @pkgparts = ($1);
+%} else { #came from edit/cust_pkg.cgi
+% $error_redirect = "edit/cust_pkg.cgi";
+% foreach my $pkgpart ( map /^pkg(\d+)$/ ? $1 : (), $cgi->param ) {
+% if ( $cgi->param("pkg$pkgpart") =~ /^(\d+)$/ ) {
+% my $num_pkgs = $1;
+% while ( $num_pkgs-- ) {
+% push @pkgparts,$pkgpart;
+% }
+% } else {
+% $error = "Illegal quantity";
+% last;
+% }
+% }
+%}
+%
+%$error ||= FS::cust_pkg::order($custnum,\@pkgparts,\@remove_pkgnums);
+%
+%if ($error) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(3). $error_redirect. '?'. $cgi->query_string );
+%} else {
+% print $cgi->redirect(popurl(3). "view/cust_main.cgi?$custnum");
+%}
+%
+%
+
diff --git a/httemplate/edit/process/cust_refund.cgi b/httemplate/edit/process/cust_refund.cgi
new file mode 100755
index 000000000..a579a02d8
--- /dev/null
+++ b/httemplate/edit/process/cust_refund.cgi
@@ -0,0 +1,34 @@
+%$cgi->param('custnum') =~ /^(\d*)$/ or die "Illegal custnum!";
+%my $custnum = $1;
+%my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
+% or die "unknown custnum $custnum";
+%
+%my $error = '';
+%if ( $cgi->param('payby') =~ /^(CARD|CHEK)$/ ) {
+% my $bop = $FS::payby::payby2bop{$1};
+% $cgi->param('refund') =~ /^(\d*)(\.\d{2})?$/
+% or die "illegal refund amount ". $cgi->param('refund');
+% my $refund = "$1$2";
+% $cgi->param('paynum') =~ /^(\d*)$/ or die "Illegal paynum!";
+% my $paynum = $1;
+% my $reason = $cgi->param('reason');
+% $error = $cust_main->realtime_refund_bop( $bop, 'amount' => $refund,
+% 'paynum' => $paynum,
+% 'reason' => $reason, );
+%} else {
+% die 'unimplemented';
+% #my $new = new FS::cust_refund ( {
+% # map {
+% # $_, scalar($cgi->param($_));
+% # } ( fields('cust_refund'), 'paynum' )
+% #} );
+% #$error = $new->insert;
+%}
+%
+%
+%if ( $error ) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(2). "cust_refund.cgi?". $cgi->query_string );
+%} else {
+% print $cgi->redirect(popurl(3). "view/cust_main.cgi?$custnum");
+%}
diff --git a/httemplate/edit/process/cust_svc.cgi b/httemplate/edit/process/cust_svc.cgi
new file mode 100644
index 000000000..3a07d1e7a
--- /dev/null
+++ b/httemplate/edit/process/cust_svc.cgi
@@ -0,0 +1,30 @@
+%
+%
+%my $svcnum = $cgi->param('svcnum');
+%
+%my $old = qsearchs('cust_svc',{'svcnum'=>$svcnum}) if $svcnum;
+%
+%my $new = new FS::cust_svc ( {
+% map {
+% $_, scalar($cgi->param($_));
+% } fields('cust_svc')
+%} );
+%
+%my $error;
+%if ( $svcnum ) {
+% $error=$new->replace($old);
+%} else {
+% $error=$new->insert;
+% $svcnum=$new->getfield('svcnum');
+%}
+%
+%if ( $error ) {
+% #$cgi->param('error', $error);
+% #print $cgi->redirect(popurl(2). "cust_svc.cgi?". $cgi->query_string );
+% eidiot($error);
+%} else {
+% my $svcdb = $new->part_svc->svcdb;
+% print $cgi->redirect(popurl(3). "view/$svcdb.cgi?$svcnum");
+%}
+%
+%
diff --git a/httemplate/edit/process/domain_record.cgi b/httemplate/edit/process/domain_record.cgi
new file mode 100755
index 000000000..87bdf6835
--- /dev/null
+++ b/httemplate/edit/process/domain_record.cgi
@@ -0,0 +1,36 @@
+%
+%
+%my $recnum = $cgi->param('recnum');
+%
+%my $old = qsearchs('agent',{'recnum'=>$recnum}) if $recnum;
+%
+%my $new = new FS::domain_record ( {
+% map {
+% $_, scalar($cgi->param($_));
+% } fields('domain_record')
+%} );
+%
+%my $error;
+%if ( $recnum ) {
+% $error=$new->replace($old);
+%} else {
+% $error=$new->insert;
+% $recnum=$new->getfield('recnum');
+%}
+%
+%if ( $error ) {
+%# $cgi->param('error', $error);
+%# print $cgi->redirect(popurl(2). "agent.cgi?". $cgi->query_string );
+% #no edit screen to send them back to
+%
+
+<!-- mason kludge -->
+%
+% eidiot($error);
+%} else {
+% my $svcnum = $new->svcnum;
+% print $cgi->redirect(popurl(3). "view/svc_domain.cgi?$svcnum");
+%}
+%
+%
+
diff --git a/httemplate/edit/process/elements/process.html b/httemplate/edit/process/elements/process.html
new file mode 100644
index 000000000..96d568754
--- /dev/null
+++ b/httemplate/edit/process/elements/process.html
@@ -0,0 +1,92 @@
+%
+%
+% # options example...
+% #
+% ###
+% ##req
+% ##
+% #
+% # 'table' =>
+% #
+% # #? 'primary_key' => #required when the dbdef doesn't know...???
+% # #? 'fields' => []
+% #
+% ###
+% ##opt
+% ###
+% #
+% # 'viewall_dir' => '', #'search' or 'browse', defaults to 'search'
+% # OR
+% # 'redirect' => 'view/table.cgi?', # value of primary key is appended
+% #
+% # 'edit_ext' => 'html', #defaults to 'html', you might want 'cgi' while the
+% # #naming is still inconsistent
+% #
+% # 'process_m2m' => { 'link_table' => 'link_table_name',
+% # 'target_table' => 'target_table_name',
+% # },
+% # 'process_m2name' => { 'link_table' => 'link_table_name',
+% # 'link_static' => { 'column' => 'value' },
+% # 'num_col' => 'column', #if column name is different in
+% # #link_table than source_table
+% # 'name_col' => 'name_column',
+% # 'names_list' => [ 'list', 'names' ],
+% # },
+%
+% my(%opt) = @_;
+%
+% #false laziness w/edit.html
+% my $table = $opt{'table'};
+% my $class = "FS::$table";
+% my $pkey = dbdef->table($table)->primary_key; #? $opt{'primary_key'} ||
+% my $fields = $opt{'fields'}
+% #|| [ grep { $_ ne $pkey } dbdef->table($table)->columns ];
+% || [ fields($table) ];
+%
+% my $pkeyvalue = $cgi->param($pkey);
+%
+% my $old = qsearchs( $table, { $pkey => $pkeyvalue } ) if $pkeyvalue;
+%
+% my $new = $class->new( {
+% map {
+% $_, scalar($cgi->param($_));
+% } @$fields
+% } );
+%
+% my $error;
+% if ( $pkeyvalue ) {
+% $error = $new->replace($old);
+% } else {
+% $error = $new->insert;
+% $pkeyvalue = $new->getfield($pkey);
+% }
+%
+% if ( !$error && $opt{'process_m2m'} ) {
+% $error = $new->process_m2m( %{ $opt{'process_m2m'} },
+% 'params' => scalar($cgi->Vars),
+% );
+% }
+%
+% if ( !$error && $opt{'process_m2name'} ) {
+% $error = $new->process_m2name( %{ $opt{'process_m2name'} },
+% 'params' => scalar($cgi->Vars),
+% );
+% }
+%
+% # XXX print?!?!
+%
+% if ( $error ) {
+% $cgi->param('error', $error);
+% my $edit_ext = $opt{'edit_ext'} || 'html';
+% print $cgi->redirect(popurl(2). "$table.$edit_ext?". $cgi->query_string );
+% } elsif ( $opt{'redirect'} ) {
+% print $cgi->redirect( $opt{'redirect'}. $pkeyvalue );
+% } else {
+% print $cgi->redirect( popurl(3).
+% ( $opt{'viewall_dir'} || 'search' ).
+% "/$table.html"
+% );
+% }
+%
+%
+
diff --git a/httemplate/edit/process/elements/svc_Common.html b/httemplate/edit/process/elements/svc_Common.html
new file mode 100644
index 000000000..8e8c99a42
--- /dev/null
+++ b/httemplate/edit/process/elements/svc_Common.html
@@ -0,0 +1,15 @@
+%
+%
+% my %opt = @_;
+% my $table = $opt{'table'};
+% $opt{'fields'} ||= [ fields($table) ];
+% push @{ $opt{'fields'} }, qw( pkgnum svcpart );
+%
+%
+<% include( 'process.html',
+ 'edit_ext' => 'cgi',
+ 'redirect' => popurl(3)."view/$table.cgi?",
+ %opt,
+ )
+%>
+
diff --git a/httemplate/edit/process/generic.cgi b/httemplate/edit/process/generic.cgi
new file mode 100644
index 000000000..e3ac113ae
--- /dev/null
+++ b/httemplate/edit/process/generic.cgi
@@ -0,0 +1,73 @@
+%# Welcome to generic.cgi.
+%#
+%# This script provides a generic edit/process/ backend for simple table
+%# editing. All it knows how to do is take the values entered into
+%# the script and insert them into the table specified by $cgi->param('table').
+%# If there's an existing record with the same primary key, it will be
+%# replaced. (Deletion will be added in the future.)
+%#
+%# also see elements/process.html, newer and somewhat along the same lines,
+%# though it still makes you setup a process file for the table.
+%# perhaps safer, perhaps more of a pain in the ass.
+%#
+%# Special cgi params for this script:
+%# table: the name of the table to be edited. The script will die horribly
+%# if it can't find the table.
+%# redirect_ok: URL to be displayed after a successful edit. The value of
+%# the record's primary key will be passed as a keyword.
+%# Defaults to (freeside root)/view/$table.cgi.
+%# redirect_error: URL to be displayed if there's an error. The original
+%# query string, plus the error message, will be passed.
+%# Defaults to $cgi->referer() (i.e. go back where you
+%# came from).
+%
+%
+%use FS::Record qw(qsearchs dbdef);
+%use DBIx::DBSchema;
+%use DBIx::DBSchema::Table;
+%
+%
+%my $error;
+%my $p2 = popurl(2);
+%my $p3 = popurl(3);
+%my $table = $cgi->param('table');
+%my $dbdef = dbdef or die "Cannot fetch dbdef!";
+%
+%my $dbdef_table = $dbdef->table($table) or die "Cannot fetch schema for $table";
+%
+%my $pkey = $dbdef_table->primary_key or die "Cannot fetch pkey for $table";
+%my $pkey_val = $cgi->param($pkey);
+%
+%
+%#warn "new FS::Record ( $table, (hashref) )";
+%my $new = FS::Record::new ( "FS::$table", {
+% map { $_, scalar($cgi->param($_)) } fields($table)
+%} );
+%
+%#warn 'created $new of class '.ref($new);
+%
+%if($pkey_val and (my $old = qsearchs($table, { $pkey, $pkey_val} ))) {
+% # edit
+% $error = $new->replace($old);
+%} else {
+% #add
+% $error = $new->insert;
+% $pkey_val = $new->getfield($pkey);
+% # New records usually don't have their primary keys set until after
+% # they've been checked/inserted, so grab the new $pkey_val so we can
+% # redirect to it.
+%}
+%
+%my $redirect_ok = (($cgi->param('redirect_ok')) ?
+% $cgi->param('redirect_ok') : $p3."browse/generic.cgi?$table");
+%my $redirect_error = (($cgi->param('redirect_error')) ?
+% $cgi->param('redirect_error') : $cgi->referer());
+%
+%if($error) {
+% $cgi->param('error', $error);
+% print $cgi->redirect($redirect_error . '?' . $cgi->query_string);
+%} else {
+% print $cgi->redirect($redirect_ok);
+%}
+%
+
diff --git a/httemplate/edit/process/inventory_class.html b/httemplate/edit/process/inventory_class.html
new file mode 100644
index 000000000..c7be9e8dd
--- /dev/null
+++ b/httemplate/edit/process/inventory_class.html
@@ -0,0 +1,5 @@
+<% include( 'elements/process.html',
+ 'table' => 'inventory_class',
+ 'viewall_dir' => 'browse',
+ )
+%>
diff --git a/httemplate/edit/process/msgcat.cgi b/httemplate/edit/process/msgcat.cgi
new file mode 100644
index 000000000..9711143d6
--- /dev/null
+++ b/httemplate/edit/process/msgcat.cgi
@@ -0,0 +1,21 @@
+%
+%
+%my $error;
+%foreach my $param ( grep { /^\d+$/ } $cgi->param ) {
+% my $old = qsearchs('msgcat', { msgnum=>$param } );
+% next if $old->msg eq $cgi->param($param); #no need to update identical records
+% my $new = new FS::msgcat { $old->hash };
+% $new->msg($cgi->param($param));
+% $error = $new->replace($old);
+% last if $error;
+%}
+%
+%if ( $error ) {
+% $cgi->param('error',$error);
+% print $cgi->redirect($p. "msgcat.cgi?". $cgi->query_string );
+%} else {
+% print $cgi->redirect(popurl(3). "browse/msgcat.cgi");
+%}
+%
+%
+
diff --git a/httemplate/edit/process/part_bill_event.cgi b/httemplate/edit/process/part_bill_event.cgi
new file mode 100755
index 000000000..4811d9c9b
--- /dev/null
+++ b/httemplate/edit/process/part_bill_event.cgi
@@ -0,0 +1,55 @@
+%
+%
+%my $eventpart = $cgi->param('eventpart');
+%
+%my $old = qsearchs('part_bill_event',{'eventpart'=>$eventpart}) if $eventpart;
+%
+%#s/days/seconds/
+%$cgi->param('seconds', int( $cgi->param('days') * 86400 ) );
+%
+%my $error;
+%if ( ! $cgi->param('plan_weight_eventcode') ) {
+% $error = "Must select an action";
+%} else {
+%
+% $cgi->param('plan_weight_eventcode') =~ /^([\w\-]+):(\d+):(.*)$/s
+% or die "illegal plan_weight_eventcode:".
+% $cgi->param('plan_weight_eventcode');
+% $cgi->param('plan', $1);
+% $cgi->param('weight', $2);
+% my $eventcode = $3;
+% my $plandata = '';
+% while ( $eventcode =~ /%%%(\w+)%%%/ ) {
+% my $field = $1;
+% my $value = join(', ', $cgi->param($field) );
+% $cgi->param($field, $value); #in case it errors out
+% $eventcode =~ s/%%%$field%%%/$value/;
+% $plandata .= "$field $value\n";
+% }
+% $cgi->param('eventcode', $eventcode);
+% $cgi->param('plandata', $plandata);
+%
+% my $new = new FS::part_bill_event ( {
+% map {
+% $_, scalar($cgi->param($_));
+% } fields('part_bill_event'),
+% } );
+%
+% if ( $eventpart ) {
+% $error = $new->replace($old);
+% } else {
+% $error = $new->insert;
+% $eventpart = $new->getfield('eventpart');
+% }
+%}
+%
+%if ( $error ) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(2). "part_bill_event.cgi?". $cgi->query_string );
+%} else {
+% print $cgi->redirect(popurl(3)."browse/part_bill_event.cgi");
+%}
+%
+%
+
+
diff --git a/httemplate/edit/process/part_export.cgi b/httemplate/edit/process/part_export.cgi
new file mode 100644
index 000000000..0dd9eabae
--- /dev/null
+++ b/httemplate/edit/process/part_export.cgi
@@ -0,0 +1,40 @@
+%
+%
+%my $exportnum = $cgi->param('exportnum');
+%
+%my $old = qsearchs('part_export', { 'exportnum'=>$exportnum } ) if $exportnum;
+%
+%#fixup options
+%#warn join('-', split(',',$cgi->param('options')));
+%my %options = map {
+% my $value = $cgi->param($_);
+% $value =~ s/\r\n/\n/g; #browsers? (textarea)
+% $_ => $value;
+%} split(',', $cgi->param('options'));
+%
+%my $new = new FS::part_export ( {
+% map {
+% $_, scalar($cgi->param($_));
+% } fields('part_export')
+%} );
+%
+%my $error;
+%if ( $exportnum ) {
+% #warn $old;
+% #warn $exportnum;
+% #warn $new->machine;
+% $error = $new->replace($old,\%options);
+%} else {
+% $error = $new->insert(\%options);
+%# $exportnum = $new->exportnum;
+%}
+%
+%if ( $error ) {
+% $cgi->param('error', $error );
+% print $cgi->redirect(popurl(2). "part_export.cgi?". $cgi->query_string );
+%} else {
+% print $cgi->redirect(popurl(3). "browse/part_export.cgi");
+%}
+%
+%
+
diff --git a/httemplate/edit/process/part_pkg.cgi b/httemplate/edit/process/part_pkg.cgi
new file mode 100755
index 000000000..204c751d9
--- /dev/null
+++ b/httemplate/edit/process/part_pkg.cgi
@@ -0,0 +1,62 @@
+%
+%
+%my $dbh = dbh;
+%
+%my $pkgpart = $cgi->param('pkgpart');
+%
+%my $old = qsearchs('part_pkg',{'pkgpart'=>$pkgpart}) if $pkgpart;
+%
+%#fixup plandata
+%my $plandata = $cgi->param('plandata');
+%my @plandata = split(',', $plandata);
+%$cgi->param('plandata',
+% join('', map { "$_=". join(', ', $cgi->param($_)). "\n" } @plandata )
+%);
+%
+%foreach (qw( setuptax recurtax disabled )) {
+% $cgi->param($_, '') unless defined $cgi->param($_);
+%}
+%
+%my $new = new FS::part_pkg ( {
+% map {
+% $_ => scalar($cgi->param($_));
+% } fields('part_pkg')
+%} );
+%
+%my %pkg_svc = map { $_ => scalar($cgi->param("pkg_svc$_")) }
+% map { $_->svcpart }
+% qsearch('part_svc', {} );
+%
+%my $error;
+%my $custnum = '';
+%if ( $cgi->param('taxclass') eq '(select)' ) {
+%
+% $error = 'Must select a tax class';
+%
+%} elsif ( $pkgpart ) {
+%
+% $error = $new->replace( $old,
+% pkg_svc => \%pkg_svc,
+% primary_svc => scalar($cgi->param('pkg_svc_primary')),
+% );
+%} else {
+%
+% $error = $new->insert( pkg_svc => \%pkg_svc,
+% primary_svc => scalar($cgi->param('pkg_svc_primary')),
+% cust_pkg => $cgi->param('pkgnum'),
+% custnum_ref => \$custnum,
+% );
+% $pkgpart = $new->pkgpart;
+%}
+%
+%if ( $error ) {
+% $cgi->param('error', $error );
+% print $cgi->redirect(popurl(2). "part_pkg.cgi?". $cgi->query_string );
+%} elsif ( $custnum ) {
+% print $cgi->redirect(popurl(3). "view/cust_main.cgi?$custnum");
+%} else {
+% print $cgi->redirect(popurl(3). "browse/part_pkg.cgi");
+%}
+%
+%
+
diff --git a/httemplate/edit/process/part_referral.html b/httemplate/edit/process/part_referral.html
new file mode 100755
index 000000000..14c1b7001
--- /dev/null
+++ b/httemplate/edit/process/part_referral.html
@@ -0,0 +1,5 @@
+<% include( 'elements/process.html',
+ 'table' => 'part_referral',
+ 'viewall_dir' => 'browse',
+ )
+%>
diff --git a/httemplate/edit/process/part_svc.cgi b/httemplate/edit/process/part_svc.cgi
new file mode 100755
index 000000000..97abc5baf
--- /dev/null
+++ b/httemplate/edit/process/part_svc.cgi
@@ -0,0 +1,4 @@
+%
+% my $server = new FS::UI::Web::JSRPC 'FS::part_svc::process', $cgi;
+%
+<% $server->process %>
diff --git a/httemplate/edit/process/payment_gateway.html b/httemplate/edit/process/payment_gateway.html
new file mode 100644
index 000000000..0b7e31395
--- /dev/null
+++ b/httemplate/edit/process/payment_gateway.html
@@ -0,0 +1,34 @@
+%
+%
+%my $gatewaynum = $cgi->param('gatewaynum');
+%
+%my $old = qsearchs('payment_gateway',{'gatewaynum'=>$gatewaynum}) if $gatewaynum;
+%
+%my $new = new FS::payment_gateway ( {
+% map {
+% $_, scalar($cgi->param($_));
+% } fields('payment_gateway')
+%} );
+%
+%my @options = split(/\r?\n/, $cgi->param('gateway_options') );
+%pop @options
+% if scalar(@options) % 2 && $options[-1] =~ /^\s*$/;
+%my %options = @options;
+%
+%my $error;
+%if ( $gatewaynum ) {
+% $error=$new->replace($old, \%options);
+%} else {
+% $error=$new->insert(\%options);
+% $gatewaynum=$new->getfield('gatewaynum');
+%}
+%
+%if ( $error ) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(2). "payment_gateway.html?". $cgi->query_string );
+%} else {
+% print $cgi->redirect(popurl(3). "browse/payment_gateway.html");
+%}
+%
+%
+
diff --git a/httemplate/edit/process/pkg_class.html b/httemplate/edit/process/pkg_class.html
new file mode 100644
index 000000000..183da805c
--- /dev/null
+++ b/httemplate/edit/process/pkg_class.html
@@ -0,0 +1,5 @@
+<% include( 'elements/process.html',
+ 'table' => 'pkg_class',
+ 'viewall_dir' => 'browse',
+ )
+%>
diff --git a/httemplate/edit/process/prepay_credit.cgi b/httemplate/edit/process/prepay_credit.cgi
new file mode 100644
index 000000000..fb15fd8e4
--- /dev/null
+++ b/httemplate/edit/process/prepay_credit.cgi
@@ -0,0 +1,57 @@
+%
+%my $hashref = {};
+%
+%my $agent = '';
+%if ( $cgi->param('agentnum') =~ /^(\d+)$/ ) {
+% $agent = qsearchs('agent', { 'agentnum' => $hashref->{agentnum}=$1 } );
+%}
+%
+%my $error = '';
+%
+%my $num = 0;
+%if ( $cgi->param('num') =~ /^\s*(\d+)\s*$/ ) {
+% $num = $1;
+%} else {
+% $error = 'Illegal number of prepaid cards: '. $cgi->param('num');
+%}
+%
+%$hashref->{amount} = $cgi->param('amount');
+%$hashref->{seconds} = $cgi->param('seconds') * $cgi->param('multiplier');
+%
+%$error ||= FS::prepay_credit::generate( $num,
+% scalar($cgi->param('type')),
+% $hashref
+% );
+%
+%unless ( ref($error) ) {
+% $cgi->param('error', $error );
+%
+<%
+ $cgi->redirect(popurl(3). "edit/prepay_credit.cgi?". $cgi->query_string )
+%>
+% } else {
+
+
+<% include("/elements/header.html", "$num prepaid cards generated".
+ ( $agent ? ' for '.$agent->agent : '' ),
+ menubar( 'Main menu' => popurl(3) )
+ )
+%>
+
+<FONT SIZE="+1">
+% foreach my $card ( @$error ) {
+
+ <code><% $card %></code>
+ -
+ <% $hashref->{amount} ? sprintf('$%.2f', $hashref->{amount} ) : '' %>
+ <% $hashref->{amount} && $hashref->{seconds} ? 'and' : '' %>
+ <% $hashref->{seconds} ? duration_exact($hashref->{seconds}) : '' %>
+ <br>
+% }
+
+
+</FONT>
+
+</BODY></HTML>
+% }
+
diff --git a/httemplate/edit/process/quick-charge.cgi b/httemplate/edit/process/quick-charge.cgi
new file mode 100644
index 000000000..70778c1cc
--- /dev/null
+++ b/httemplate/edit/process/quick-charge.cgi
@@ -0,0 +1,43 @@
+%
+%
+%#untaint custnum
+%$cgi->param('custnum') =~ /^(\d+)$/
+% or die 'illegal custnum '. $cgi->param('custnum');
+%my $custnum = $1;
+%
+%$cgi->param('amount') =~ /^\s*(\d+(\.\d{1,2})?)\s*$/
+% or die 'illegal amount '. $cgi->param('amount');
+%my $amount = $1;
+%
+%my( $error, $cust_main);
+%if ( $cgi->param('taxclass') eq '(select)' ) {
+%
+%
+% $error = 'Must select a tax class';
+%} else {
+%
+% my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } )
+% or die "unknown custnum $custnum";
+%
+% $error = $cust_main->charge(
+% $amount,
+% $cgi->param('pkg'),
+% '$'. sprintf("%.2f",$amount),
+% $cgi->param('taxclass')
+% );
+%
+%}
+%
+%if ($error) {
+%
+
+<!-- mason kludge -->
+%
+% eidiot($error);
+%} else {
+% print $cgi->redirect(popurl(3). "view/cust_main.cgi?$custnum" );
+%}
+%
+%
+
+
diff --git a/httemplate/edit/process/quick-cust_pkg.cgi b/httemplate/edit/process/quick-cust_pkg.cgi
new file mode 100644
index 000000000..7afc9f2bb
--- /dev/null
+++ b/httemplate/edit/process/quick-cust_pkg.cgi
@@ -0,0 +1,27 @@
+%
+%
+%#untaint custnum
+%$cgi->param('custnum') =~ /^(\d+)$/
+% or die 'illegal custnum '. $cgi->param('custnum');
+%my $custnum = $1;
+%$cgi->param('pkgpart') =~ /^(\d+)$/
+% or die 'illegal pkgpart '. $cgi->param('pkgpart');
+%my $pkgpart = $1;
+%
+%my @cust_pkg = ();
+%my $error = FS::cust_pkg::order($custnum, [ $pkgpart ], [], \@cust_pkg, );
+%
+%if ($error) {
+%
+
+<!-- mason kludge -->
+%
+% eidiot($error);
+%} else {
+% print $cgi->redirect(popurl(3). "view/cust_main.cgi?$custnum".
+% "#cust_pkg". $cust_pkg[0]->pkgnum );
+%}
+%
+%
+
+
diff --git a/httemplate/edit/process/rate.cgi b/httemplate/edit/process/rate.cgi
new file mode 100755
index 000000000..c81f883b7
--- /dev/null
+++ b/httemplate/edit/process/rate.cgi
@@ -0,0 +1,4 @@
+%
+% my $server = new FS::UI::Web::JSRPC 'FS::rate::process', $cgi;
+%
+<% $server->process %>
diff --git a/httemplate/edit/process/rate_region.cgi b/httemplate/edit/process/rate_region.cgi
new file mode 100755
index 000000000..753224565
--- /dev/null
+++ b/httemplate/edit/process/rate_region.cgi
@@ -0,0 +1,52 @@
+%
+%
+%my $regionnum = $cgi->param('regionnum');
+%
+%my $old = qsearchs('rate_region', { 'regionnum' => $regionnum } ) if $regionnum;
+%
+%my $new = new FS::rate_region ( {
+% map {
+% $_, scalar($cgi->param($_));
+% } ( fields('rate_region') )
+%} );
+%
+%my $countrycode = $cgi->param('countrycode');
+%my @npa = split(/\s*,\s*/, $cgi->param('npa'));
+%$npa[0] = '' unless @npa;
+%my @rate_prefix = map {
+% new FS::rate_prefix {
+% 'countrycode' => $countrycode,
+% 'npa' => $_,
+% }
+% } @npa;
+%
+%my @dest_detail = map {
+% my $ratenum = $_->ratenum;
+% new FS::rate_detail {
+% 'ratenum' => $ratenum,
+% map { $_ => $cgi->param("$_$ratenum") }
+% qw( min_included min_charge sec_granularity )
+% };
+%} qsearch('rate', {} );
+%
+%
+%my $error;
+%if ( $regionnum ) {
+% $error = $new->replace($old, 'rate_prefix' => \@rate_prefix,
+% 'dest_detail' => \@dest_detail, );
+%} else {
+% $error = $new->insert( 'rate_prefix' => \@rate_prefix,
+% 'dest_detail' => \@dest_detail, );
+% $regionnum = $new->getfield('regionnum');
+%}
+%
+%if ( $error ) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(2). "rate_region.cgi?". $cgi->query_string );
+%} else {
+% #print $cgi->redirect(popurl(3). "browse/rate_region.cgi");
+% print $cgi->redirect(popurl(3). "browse/rate.cgi");
+%}
+%
+%
+
diff --git a/httemplate/edit/process/reg_code.cgi b/httemplate/edit/process/reg_code.cgi
new file mode 100644
index 000000000..4fdea60fc
--- /dev/null
+++ b/httemplate/edit/process/reg_code.cgi
@@ -0,0 +1,50 @@
+%
+%
+%$cgi->param('agentnum') =~ /^(\d+)$/
+% or eidiot 'illegal agentnum '. $cgi->param('agentnum');
+%my $agentnum = $1;
+%my $agent = qsearchs('agent', { 'agentnum' => $agentnum } );
+%
+%my $error = '';
+%
+%my $num = 0;
+%if ( $cgi->param('num') =~ /^\s*(\d+)\s*$/ ) {
+% $num = $1;
+%} else {
+% $error = 'Illegal number of codes: '. $cgi->param('num');
+%}
+%
+%my @pkgparts =
+% map { /^pkgpart(.*)$/; $1 }
+% grep { $cgi->param($_) }
+% grep { /^pkgpart/ }
+% $cgi->param;
+%
+%$error ||= $agent->generate_reg_codes($num, \@pkgparts);
+%
+%unless ( ref($error) ) {
+% $cgi->param('error'. $error );
+%
+<%
+ $cgi->redirect(popurl(3). "edit/reg_code.cgi?". $cgi->query_string )
+%>
+% } else {
+
+
+<% include("/elements/header.html","$num registration codes generated for ". $agent->agent, menubar(
+ 'Main menu' => popurl(3),
+ 'View all agents' => popurl(3). 'browse/agent.cgi',
+) ) %>
+
+<PRE><FONT SIZE="+1">
+% foreach my $code ( @$error ) {
+
+ <% $code %>
+% }
+
+
+</FONT></PRE>
+
+</BODY></HTML>
+% }
+
diff --git a/httemplate/edit/process/router.cgi b/httemplate/edit/process/router.cgi
new file mode 100644
index 000000000..c69114ea4
--- /dev/null
+++ b/httemplate/edit/process/router.cgi
@@ -0,0 +1,68 @@
+%
+%
+%local $FS::UID::AutoCommit=0;
+%
+%sub check {
+% my $error = shift;
+% if($error) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(3) . "edit/router.cgi?". $cgi->query_string);
+% dbh->rollback;
+% exit;
+% }
+%}
+%
+%my $error = '';
+%my $routernum = $cgi->param('routernum');
+%my $routername = $cgi->param('routername');
+%my $old = qsearchs('router', { routernum => $routernum });
+%my @old_psr;
+%
+%my $new = new FS::router {
+% map {
+% ($_, scalar($cgi->param($_)));
+% } fields('router')
+%};
+%
+%if($old) {
+% $error = $new->replace($old);
+%} else {
+% $error = $new->insert;
+% $routernum = $new->routernum;
+%}
+%
+%check($error);
+%
+%if ($old) {
+% @old_psr = $old->part_svc_router;
+% foreach my $psr (@old_psr) {
+% if($cgi->param('svcpart_'.$psr->svcpart) eq 'ON') {
+% # do nothing
+% } else {
+% $error = $psr->delete;
+% }
+% }
+% check($error);
+%}
+%
+%foreach($cgi->param) {
+% if($cgi->param($_) eq 'ON' and /^svcpart_(\d+)$/) {
+% my $svcpart = $1;
+% if(grep {$_->svcpart == $svcpart} @old_psr) {
+% # do nothing
+% } else {
+% my $new_psr = new FS::part_svc_router { svcpart => $svcpart,
+% routernum => $routernum };
+% $error = $new_psr->insert;
+% }
+% check($error);
+% }
+%}
+%
+%
+%# Yay, everything worked!
+%dbh->commit or die dbh->errstr;
+%print $cgi->redirect(popurl(3). "browse/router.cgi");
+%
+%
+
diff --git a/httemplate/edit/process/svc_acct.cgi b/httemplate/edit/process/svc_acct.cgi
new file mode 100755
index 000000000..247a5b446
--- /dev/null
+++ b/httemplate/edit/process/svc_acct.cgi
@@ -0,0 +1,50 @@
+%
+%
+%$cgi->param('svcnum') =~ /^(\d*)$/ or die "Illegal svcnum!";
+%my $svcnum = $1;
+%
+%my $old;
+%if ( $svcnum ) {
+% $old = qsearchs('svc_acct', { 'svcnum' => $svcnum } )
+% or die "fatal: can't find account (svcnum $svcnum)!";
+%} else {
+% $old = '';
+%}
+%
+%#unmunge popnum
+%$cgi->param('popnum', (split(/:/, $cgi->param('popnum') ))[0] );
+%
+%#unmunge passwd
+%if ( $cgi->param('_password') eq '*HIDDEN*' ) {
+% die "fatal: no previous account to recall hidden password from!" unless $old;
+% $cgi->param('_password',$old->getfield('_password'));
+%}
+%
+%#unmunge usergroup
+%$cgi->param('usergroup', [ $cgi->param('radius_usergroup') ] );
+%
+%my $new = new FS::svc_acct ( {
+% map {
+% $_, scalar($cgi->param($_));
+% #} qw(svcnum pkgnum svcpart username _password popnum uid gid finger dir
+% # shell quota slipip)
+% } ( fields('svc_acct'), qw( pkgnum svcpart usergroup ) )
+%} );
+%
+%my $error;
+%if ( $svcnum ) {
+% $error = $new->replace($old);
+%} else {
+% $error = $new->insert;
+% $svcnum = $new->svcnum;
+%}
+%
+%if ( $error ) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(2). "svc_acct.cgi?". $cgi->query_string );
+%} else {
+% print $cgi->redirect(popurl(3). "view/svc_acct.cgi?" . $svcnum );
+%}
+%
+%
+
diff --git a/httemplate/edit/process/svc_acct_pop.cgi b/httemplate/edit/process/svc_acct_pop.cgi
new file mode 100755
index 000000000..9e9df7bf0
--- /dev/null
+++ b/httemplate/edit/process/svc_acct_pop.cgi
@@ -0,0 +1,29 @@
+%
+%
+%my $popnum = $cgi->param('popnum');
+%
+%my $old = qsearchs('svc_acct_pop',{'popnum'=>$popnum}) if $popnum;
+%
+%my $new = new FS::svc_acct_pop ( {
+% map {
+% $_, scalar($cgi->param($_));
+% } fields('svc_acct_pop')
+%} );
+%
+%my $error = '';
+%if ( $popnum ) {
+% $error = $new->replace($old);
+%} else {
+% $error = $new->insert;
+% $popnum=$new->getfield('popnum');
+%}
+%
+%if ( $error ) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(2). "svc_acct_pop.cgi?". $cgi->query_string );
+%} else {
+% print $cgi->redirect(popurl(3). "browse/svc_acct_pop.cgi");
+%}
+%
+%
+
diff --git a/httemplate/edit/process/svc_broadband.cgi b/httemplate/edit/process/svc_broadband.cgi
new file mode 100644
index 000000000..cf4604639
--- /dev/null
+++ b/httemplate/edit/process/svc_broadband.cgi
@@ -0,0 +1,37 @@
+%
+%
+%$cgi->param('svcnum') =~ /^(\d*)$/ or die "Illegal svcnum!";
+%my $svcnum = $1;
+%
+%my $old;
+%if ( $svcnum ) {
+% $old = qsearchs('svc_broadband', { 'svcnum' => $svcnum } )
+% or die "fatal: can't find broadband service (svcnum $svcnum)!";
+%} else {
+% $old = '';
+%}
+%
+%my $new = new FS::svc_broadband ( {
+% map {
+% ($_, scalar($cgi->param($_)));
+% } ( fields('svc_broadband'), qw( pkgnum svcpart ) )
+%} );
+%
+%my $error;
+%if ( $svcnum ) {
+% $error = $new->replace($old);
+%} else {
+% $error = $new->insert;
+% $svcnum = $new->svcnum;
+%}
+%
+%if ( $error ) {
+% $cgi->param('error', $error);
+% $cgi->param('ip_addr', $new->ip_addr);
+% print $cgi->redirect(popurl(2). "svc_broadband.cgi?". $cgi->query_string );
+%} else {
+% print $cgi->redirect(popurl(3). "view/svc_broadband.cgi?" . $svcnum );
+%}
+%
+%
+
diff --git a/httemplate/edit/process/svc_domain.cgi b/httemplate/edit/process/svc_domain.cgi
new file mode 100755
index 000000000..773143fe3
--- /dev/null
+++ b/httemplate/edit/process/svc_domain.cgi
@@ -0,0 +1,32 @@
+%
+%
+%#remove this to actually test the domains!
+%$FS::svc_domain::whois_hack = 1;
+%
+%$cgi->param('svcnum') =~ /^(\d*)$/ or die "Illegal svcnum!";
+%my $svcnum = $1;
+%
+%my $new = new FS::svc_domain ( {
+% map {
+% $_, scalar($cgi->param($_));
+% #} qw(svcnum pkgnum svcpart domain action purpose)
+% } ( fields('svc_domain'), qw( pkgnum svcpart action purpose ) )
+%} );
+%
+%my $error = '';
+%if ($cgi->param('svcnum')) {
+% $error="Can't modify a domain!";
+%} else {
+% $error=$new->insert;
+% $svcnum=$new->svcnum;
+%}
+%
+%if ($error) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(2). "svc_domain.cgi?". $cgi->query_string );
+%} else {
+% print $cgi->redirect(popurl(3). "view/svc_domain.cgi?$svcnum");
+%}
+%
+%
+
diff --git a/httemplate/edit/process/svc_external.cgi b/httemplate/edit/process/svc_external.cgi
new file mode 100755
index 000000000..97da6ba87
--- /dev/null
+++ b/httemplate/edit/process/svc_external.cgi
@@ -0,0 +1,30 @@
+%
+%
+%$cgi->param('svcnum') =~ /^(\d*)$/ or die "Illegal svcnum!";
+%my $svcnum =$1;
+%
+%my $old = qsearchs('svc_external',{'svcnum'=>$svcnum}) if $svcnum;
+%
+%my $new = new FS::svc_external ( {
+% map {
+% ($_, scalar($cgi->param($_)));
+% } ( fields('svc_external'), qw( pkgnum svcpart ) )
+%} );
+%
+%my $error = '';
+%if ( $svcnum ) {
+% $error = $new->replace($old);
+%} else {
+% $error = $new->insert;
+% $svcnum = $new->getfield('svcnum');
+%}
+%
+%if ($error) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(2). "svc_external.cgi?". $cgi->query_string );
+%} else {
+% print $cgi->redirect(popurl(3). "view/svc_external.cgi?$svcnum");
+%}
+%
+%
+
diff --git a/httemplate/edit/process/svc_forward.cgi b/httemplate/edit/process/svc_forward.cgi
new file mode 100755
index 000000000..3205312f1
--- /dev/null
+++ b/httemplate/edit/process/svc_forward.cgi
@@ -0,0 +1,30 @@
+%
+%
+%$cgi->param('svcnum') =~ /^(\d*)$/ or die "Illegal svcnum!";
+%my $svcnum =$1;
+%
+%my $old = qsearchs('svc_forward',{'svcnum'=>$svcnum}) if $svcnum;
+%
+%my $new = new FS::svc_forward ( {
+% map {
+% ($_, scalar($cgi->param($_)));
+% } ( fields('svc_forward'), qw( pkgnum svcpart ) )
+%} );
+%
+%my $error = '';
+%if ( $svcnum ) {
+% $error = $new->replace($old);
+%} else {
+% $error = $new->insert;
+% $svcnum = $new->getfield('svcnum');
+%}
+%
+%if ($error) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(2). "svc_forward.cgi?". $cgi->query_string );
+%} else {
+% print $cgi->redirect(popurl(3). "view/svc_forward.cgi?$svcnum");
+%}
+%
+%
+
diff --git a/httemplate/edit/process/svc_phone.html b/httemplate/edit/process/svc_phone.html
new file mode 100644
index 000000000..44235de63
--- /dev/null
+++ b/httemplate/edit/process/svc_phone.html
@@ -0,0 +1,4 @@
+<% include( 'elements/svc_Common.html',
+ 'table' => 'svc_phone',
+ )
+%>
diff --git a/httemplate/edit/process/svc_www.cgi b/httemplate/edit/process/svc_www.cgi
new file mode 100644
index 000000000..e9a52aff2
--- /dev/null
+++ b/httemplate/edit/process/svc_www.cgi
@@ -0,0 +1,37 @@
+%
+%
+%$cgi->param('svcnum') =~ /^(\d*)$/ or die "Illegal svcnum!";
+%my $svcnum = $1;
+%
+%my $old;
+%if ( $svcnum ) {
+% $old = qsearchs('svc_www', { 'svcnum' => $svcnum } )
+% or die "fatal: can't find website (svcnum $svcnum)!";
+%} else {
+% $old = '';
+%}
+%
+%my $new = new FS::svc_www ( {
+% map {
+% ($_, scalar($cgi->param($_)));
+% #} qw(svcnum pkgnum svcpart recnum usersvc)
+% } ( fields('svc_www'), qw( pkgnum svcpart ) )
+%} );
+%
+%my $error;
+%if ( $svcnum ) {
+% $error = $new->replace($old);
+%} else {
+% $error = $new->insert;
+% $svcnum = $new->svcnum;
+%}
+%
+%if ( $error ) {
+% $cgi->param('error', $error);
+% print $cgi->redirect(popurl(2). "svc_www.cgi?". $cgi->query_string );
+%} else {
+% print $cgi->redirect(popurl(3). "view/svc_www.cgi?" . $svcnum );
+%}
+%
+%
+