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>
|