Optimize "Customer has a referring customer" condition, RT#74452
[freeside.git] / httemplate / misc / process / change_pkg_date.html
1 <& /elements/header-popup.html &>
2   <SCRIPT TYPE="text/javascript">
3     window.top.location.reload();
4   </SCRIPT>
5   </BODY>
6 </HTML>
7 <%init>
8
9 my $field = $cgi->param('field');
10
11 my ($acl, $isstart);
12 if ($field eq 'start_date') {
13   $acl = 'Change package start date';
14   $isstart = 1;
15 } elsif ($field eq 'contract_end') {
16   $acl = 'Change package contract end date';
17 } else {
18   die "Unknown date field";
19 }
20
21 my $curuser = $FS::CurrentUser::CurrentUser;
22 die "access denied"
23   unless $curuser->access_right($acl);
24
25 $cgi->param('pkgnum') =~ /^(\d+)$/
26   or die "illegal pkgnum";
27 my $pkgnum = $1;
28
29 my $cust_pkg = qsearchs({
30   table     => 'cust_pkg',
31   addl_from => ' JOIN cust_main USING (custnum) ',
32   hashref   => { 'pkgnum' => $pkgnum },
33   extra_sql => ' AND '. $curuser->agentnums_sql,
34 }) or die "Unknown pkgnum: $pkgnum";
35
36 my $cust_main = $cust_pkg->cust_main;
37
38 my $error;
39 my $date_value;
40 if ( $cgi->param('when') eq 'now' ) {
41   # blank start means start it the next time billing runs ("Now")
42   # blank contract end means it never ends ("Never")
43   $date_value = '';
44 } elsif ( $cgi->param('when') eq 'next_bill_date' ) {
45   $date_value = $cust_main->next_bill_date;
46 } elsif ( $cgi->param('when') eq 'date' ) {
47   $date_value = parse_datetime($cgi->param('date_value'));
48 }
49
50 if ( $isstart && $cust_pkg->setup ) {
51   # shouldn't happen
52   $error = 'This package has already started billing.';
53 } else {
54   local $FS::UID::AutoCommit = 0;
55   foreach my $pkg ($cust_pkg, $cust_pkg->supplemental_pkgs) {
56     last if $error;
57     $pkg->set($field, $date_value);
58     $error ||= $pkg->replace;
59   }
60   $error ? dbh->rollback : dbh->commit;
61 }
62
63 if ( $error ) {
64   $cgi->param('error', $error);
65   print $cgi->redirect($fsurl.'misc/change_pkg_date.html?', $cgi->query_string);
66 }
67 </%init>