summaryrefslogtreecommitdiff
path: root/httemplate/edit/process/part_pkg_usage.html
blob: eb6c37b820b3411ef2ba8f773e8b2964c4e24c9a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
% if ( $is_error ) {
%   $cgi->param('error' => \%part_pkg_usage);
% # internal redirect, because it's a lot of state to pass through
<& /browse/part_pkg_usage.html &>
% } else {
% # uh, not quite sure...
<%  $cgi->redirect($fsurl.'browse/part_pkg.cgi') %>
% }
<%init>
my %vars = $cgi->Vars;
my %part_pkg_usage;
my $is_error;
foreach my $pkgpart ($cgi->param('pkgpart')) {
  next unless $pkgpart =~ /^\d+$/;
  my $part_pkg = FS::part_pkg->by_key($pkgpart)
    or die "unknown pkgpart $pkgpart";
  my %old = map { $_->pkgusagepart => $_ } $part_pkg->part_pkg_usage;
  $part_pkg_usage{$pkgpart} ||= [];
  my @rows;
  foreach (grep /^pkgpart$pkgpart/, keys %vars) {
    /^pkgpart\d+_(\w+\D)(\d+)$/ or die "misspelled field name '$_'";
    my $value = delete $vars{$_};
    my $field = $1;
    my $row = $2;
    $rows[$row] ||= {};
    $rows[$row]->{$field} = $value;
  }

  foreach my $row (@rows) {
    next if !defined($row);
    my $error;
    my %classes;
    foreach my $class (grep /^class/, keys %$row) {
      $class =~ /^class(\d+)_$/;
      my $classnum = $1;
      $classes{$classnum} = delete $row->{$class};
    }
    my $usage = FS::part_pkg_usage->new($row);
    $usage->set('pkgpart', $pkgpart);
    if ( $usage->pkgusagepart and $row->{minutes} > 0 ) {
      $error = $usage->replace(\%classes);
      # and don't delete the existing one
      delete($old{$usage->pkgusagepart});
    } elsif ( $row->{minutes} > 0 ) {
      $error = $usage->insert(\%classes);
    } else {
      next;
    }
    if ( $error ) {
      $usage->set('error', $error);
      $is_error = 1;
    }
    push @{ $part_pkg_usage{$pkgpart} }, $usage;
  }

  foreach my $usage (values %old) {
    # all of these were not sent back by the client, so delete them
    my $error = $usage->delete;
    if ( $error ) {
      $usage->set('error', $error);
      $is_error = 1;
      unshift @{ $part_pkg_usage{$pkgpart} }, $usage;
    }
  }

}
</%init>