default to a session cookie instead of setting an explicit timeout, weird timezone...
[freeside.git] / httemplate / edit / process / part_pkg_usage.html
1 % if ( $is_error ) {
2 %   $cgi->param('error' => \%part_pkg_usage);
3 % # internal redirect, because it's a lot of state to pass through
4 <& /browse/part_pkg_usage.html &>
5 % } else {
6 % # uh, not quite sure...
7 <%  $cgi->redirect($fsurl.'browse/part_pkg.cgi') %>
8 % }
9 <%init>
10 my %vars = $cgi->Vars;
11 my %part_pkg_usage;
12 my $is_error;
13 foreach my $pkgpart ($cgi->param('pkgpart')) {
14   next unless $pkgpart =~ /^\d+$/;
15   my $part_pkg = FS::part_pkg->by_key($pkgpart)
16     or die "unknown pkgpart $pkgpart";
17   my %old = map { $_->pkgusagepart => $_ } $part_pkg->part_pkg_usage;
18   $part_pkg_usage{$pkgpart} ||= [];
19   my @rows;
20   foreach (grep /^pkgpart$pkgpart/, keys %vars) {
21     /^pkgpart\d+_(\w+\D)(\d+)$/ or die "misspelled field name '$_'";
22     my $value = delete $vars{$_};
23     my $field = $1;
24     my $row = $2;
25     $rows[$row] ||= {};
26     $rows[$row]->{$field} = $value;
27   }
28
29   foreach my $row (@rows) {
30     next if !defined($row);
31     my $error;
32     my %classes;
33     foreach my $class (grep /^class/, keys %$row) {
34       $class =~ /^class(\d+)_$/;
35       my $classnum = $1;
36       $classes{$classnum} = delete $row->{$class};
37     }
38     my $usage = FS::part_pkg_usage->new($row);
39     $usage->set('pkgpart', $pkgpart);
40     if ( $usage->pkgusagepart and $row->{minutes} > 0 ) {
41       $error = $usage->replace(\%classes);
42       # and don't delete the existing one
43       delete($old{$usage->pkgusagepart});
44     } elsif ( $row->{minutes} > 0 ) {
45       $error = $usage->insert(\%classes);
46     } else {
47       next;
48     }
49     if ( $error ) {
50       $usage->set('error', $error);
51       $is_error = 1;
52     }
53     push @{ $part_pkg_usage{$pkgpart} }, $usage;
54   }
55
56   foreach my $usage (values %old) {
57     # all of these were not sent back by the client, so delete them
58     my $error = $usage->delete;
59     if ( $error ) {
60       $usage->set('error', $error);
61       $is_error = 1;
62       unshift @{ $part_pkg_usage{$pkgpart} }, $usage;
63     }
64   }
65
66 }
67 </%init>