checkpoint tax editors and correct a blunder
[freeside.git] / httemplate / edit / process / part_pkg.cgi
index 5d9c235..94bff0f 100755 (executable)
-%
-%
-%my $dbh = dbh;
-%my $conf = new FS::Conf;
-%
-%my $pkgpart = $cgi->param('pkgpart');
-%
-%my $old = qsearchs('part_pkg',{'pkgpart'=>$pkgpart}) if $pkgpart;
-%
-%tie my %plans, 'Tie::IxHash', %{ FS::part_pkg::plan_info() };
-%my $href = $plans{$cgi->param('plan')}->{'fields'};
-%
-%#fixup plandata
-%my $error;
-%my $plandata = $cgi->param('plandata');
-%my @plandata = split(',', $plandata);
-%$cgi->param('plandata', 
-%  join('', map { my $parser = sub { shift };
-%                 $parser = $href->{$_}{parse} if exists($href->{$_}{parse});
-%                 my $value = join(', ', &$parser($cgi->param($_)));
-%                 my $check = $href->{$_}{check};
-%                 if ( $check && ! &$check($value) ) {
-%                   $value = join(', ', $cgi->param($_));
-%                   $error ||= "Illegal ". ($href->{$_}{name}||$_). ": $value";
-%                 }
-%                 "$_=$value\n";
-%               } @plandata )
-%);
-%
-%foreach (qw( setuptax recurtax disabled )) {
-%  $cgi->param($_, '') unless defined $cgi->param($_);
-%}
-%
-%my @agents;
-%foreach ($cgi->param('agent_type')) {
-%  /^(\d+)$/;
-%  push @agents, $1 if $1;
-%}
-%
-%my $new = new FS::part_pkg ( {
-%  map {
-%    $_ => scalar($cgi->param($_));
-%  } fields('part_pkg')
-%} );
-%
-%my $oldAutoCommit = $FS::UID::AutoCommit;
-%local $FS::UID::AutoCommit = 0;
-%
-%my %pkg_svc = map { $_ => scalar($cgi->param("pkg_svc$_")) }
-%              map { $_->svcpart }
-%              qsearch('part_svc', {} );
-%
-%my $custnum = '';
-%if ( $error ) {
-%
-% # fall through
-%
-%} elsif ( $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;
-%}
-%
-%unless ( $error || $conf->exists('agent_defaultpkg') ) {
-%  my $error = $new->process_m2m(
-%    'link_table'   => 'type_pkgs',
-%    'target_table' => 'agent_type',
-%    'params'       => \@agents,
-%  );
-%}
 %if ( $error ) {
 %  $dbh->rollback if $oldAutoCommit;
 %  $cgi->param('error', $error );
-%  print $cgi->redirect(popurl(2). "part_pkg.cgi?". $cgi->query_string );
+<% $cgi->redirect(popurl(2). "part_pkg.cgi?". $cgi->query_string ) %>
 %} elsif ( $custnum )  {
 %  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
-%  print $cgi->redirect(popurl(3). "view/cust_main.cgi?$custnum");
+<% $cgi->redirect(popurl(3). "view/cust_main.cgi?$custnum") %>
 %} else {
 %  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
-%  print $cgi->redirect(popurl(3). "browse/part_pkg.cgi");
+<% $cgi->redirect(popurl(3). "browse/part_pkg.cgi") %>
 %}
-%
-%
+<%init>
+
+my $dbh = dbh;
+my $conf = new FS::Conf;
+
+my $pkgpart = $cgi->param('pkgpart');
+
+my $old = qsearchs('part_pkg',{'pkgpart'=>$pkgpart}) if $pkgpart;
+
+tie my %plans, 'Tie::IxHash', %{ FS::part_pkg::plan_info() };
+my $href = $plans{$cgi->param('plan')}->{'fields'};
+
+#fixup plandata
+my $error;
+my $plandata = $cgi->param('plandata');
+my @plandata = split(',', $plandata);
+$cgi->param('plandata', 
+  join('', map { my $parser = sub { shift };
+                 $parser = $href->{$_}{parse} if exists($href->{$_}{parse});
+                 my $value = join(', ', &$parser($cgi->param($_)));
+                 my $check = $href->{$_}{check};
+                 if ( $check && ! &$check($value) ) {
+                   $value = join(', ', $cgi->param($_));
+                   $error ||= "Illegal ". ($href->{$_}{name}||$_). ": $value";
+                 }
+                 "$_=$value\n";
+               } @plandata )
+);
+
+foreach (qw( setuptax recurtax disabled )) {
+  $cgi->param($_, '') unless defined $cgi->param($_);
+}
+
+my @agents;
+foreach ($cgi->param('agent_type')) {
+  /^(\d+)$/;
+  push @agents, $1 if $1;
+}
+$error = "At least one agent type must be specified."
+  unless( scalar(@agents) ||
+          $cgi->param('clone') && $cgi->param('clone') =~ /^\d+$/ ||
+          !$pkgpart && $conf->exists('agent-defaultpkg')
+        );
+
+$cgi->param('tax_override') =~ /^([\d,]+)$/;
+my (@tax_overrides) = (grep "$_", split (",", $1));
+
+my $new = new FS::part_pkg ( {
+  map {
+    $_ => scalar($cgi->param($_));
+  } fields('part_pkg')
+} );
+
+my $oldAutoCommit = $FS::UID::AutoCommit;
+local $FS::UID::AutoCommit = 0;
+
+my %pkg_svc = map { $_ => scalar($cgi->param("pkg_svc$_")) }
+              map { $_->svcpart }
+              qsearch('part_svc', {} );
+
+my $curuser = $FS::CurrentUser::CurrentUser;
+
+my $custnum = '';
+if ( $error ) {
+
+ # fall through
+
+} elsif ( $cgi->param('taxclass') eq '(select)' ) {
+
+  $error = 'Must select a tax class';
+
+} elsif ( $pkgpart ) {
+
+  die "access denied"
+    unless $curuser->access_right('Edit package definitions')
+        || $curuser->access_right('Edit global package definitions');
+
+  $error = $new->replace( $old,
+                          pkg_svc     => \%pkg_svc,
+                          primary_svc => scalar($cgi->param('pkg_svc_primary')),
+                        );
+} else {
+
+  die "access denied"
+    unless $curuser->access_right('Edit package definitions')
+        || $curuser->access_right('Edit global package definitions')
+        || ( $cgi->param('pkgnum') && $curuser->access_right('Customize customer package') );
+
+  $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;
+}
+
+unless ( $error || $conf->exists('agent_defaultpkg') ) {
+  $error = $new->process_m2m(
+    'link_table'   => 'type_pkgs',
+    'target_table' => 'agent_type',
+    'params'       => \@agents,
+  );
+}
+
+unless ( $error  ) {
+  $error = $new->process_m2m(
+    'link_table'   => 'part_pkg_taxoverride',
+    'target_table' => 'tax_class',
+    'params'       => \@tax_overrides,
+  );
+}
 
+</%init>