import torrus 1.0.9
[freeside.git] / httemplate / edit / process / rate_time.cgi
1 % if ( $error ) {
2 %   $cgi->param('error', $error);
3 <% $cgi->redirect(popurl(2). "rate_time.cgi?". $cgi->query_string ) %>
4 % } else {
5 <% $cgi->redirect(popurl(3). "browse/rate_time.html" ) %>
6 % }
7 <%init>
8 my $error = '';
9 die "access denied" 
10     unless $FS::CurrentUser::CurrentUser->access_right('Configuration');
11 my $ratetimenum = $cgi->param('ratetimenum');
12 my $ratetimename = $cgi->param('ratetimename');
13 my $delete = $cgi->param('delete');
14
15 my %vars = $cgi->Vars;
16 #warn Dumper(\%vars)."\n";
17
18 my $rate_time;
19
20 my %old_ints;
21 if( $ratetimenum ) {
22   # editing
23   $rate_time = FS::rate_time->by_key($ratetimenum);
24
25   # make a list of existing intervals that will be deleted
26   foreach ($rate_time->intervals) {
27     $old_ints{$_->intervalnum} = $_;
28   }
29
30   if ( $delete ) {
31     $error = $rate_time->delete;
32     # intervals will be deleted later
33   }
34   elsif( $ratetimename ne $rate_time->ratetimename ) {
35     # the only case where the rate_time itself must be replaced
36     $rate_time->ratetimename($ratetimename);
37     $error = $rate_time->replace;
38   }
39 }
40 else { #!$ratetimenum, adding new
41   $rate_time = FS::rate_time->new({ ratetimename => $ratetimename });
42   $error = $rate_time->insert;
43   $ratetimenum = $rate_time->ratetimenum;
44 }
45
46 my @new_ints;
47 if(!$delete and !$error) {
48   foreach my $i (map { /^sd(\d+)$/ } keys(%vars)) {
49     my $stime = l2wtime(@vars{"sd$i", "sh$i", "sm$i", "sa$i"});
50     my $etime = l2wtime(@vars{"ed$i", "eh$i", "em$i", "ea$i"});
51     #warn "$i: $stime - $etime";
52     next if !defined($stime) or !defined($etime) or $etime == $stime;
53     # try to avoid needlessly wiping and replacing intervals every 
54     # time this is edited.
55     if( %old_ints ) {
56       my $this_int = qsearchs('rate_time_interval', 
57                                     { ratetimenum => $ratetimenum,
58                                       stime       => $stime,
59                                       etime       => $etime, } );
60       if($this_int) { 
61         delete $old_ints{$this_int->intervalnum};
62         #warn "not deleting $stime-$etime\n";
63         next; #$i
64       }
65     }
66     push @new_ints, FS::rate_time_interval->new({ ratetimenum => $ratetimenum,
67                                                   stime       => $stime,
68                                                   etime       => $etime, } );
69   }
70 }
71 if(!$error) {
72   foreach (values(%old_ints)) {
73     $error = $_->delete;
74     #warn "deleting ".$_->stime.' '.$_->etime."\n";
75     last if $error;
76   }
77 }
78 if(!$error) {
79   # do this last to avoid overlap errors with deleted intervals
80   foreach (@new_ints) {
81     $error = $_->insert;
82     #warn "inserting $stime-$etime\n";
83     last if $error;
84   }
85 }
86
87 sub l2wtime {
88   my ($d, $h, $m, $a) = @_;
89   $h = ($h % 12) + 24*$d + 12*$a;
90   $m += 60*$h;
91   return 60*$m
92 }
93 </%init>