voip_cdr call rating by day and time, RT#4763
[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 %# dumper_html(\%vars, \%old_ints, {$rate_time->intervals}) %>
8 <%init>
9 my $error = '';
10 die "access denied" 
11     unless $FS::CurrentUser::CurrentUser->access_right('Configuration');
12 my $ratetimenum = $cgi->param('ratetimenum');
13 my $ratetimename = $cgi->param('ratetimename');
14 my $delete = $cgi->param('delete');
15
16 my %vars = $cgi->Vars;
17 #warn Dumper(\%vars)."\n";
18
19 my $rate_time;
20
21 my %old_ints;
22 if( $ratetimenum ) {
23   # editing
24   $rate_time = FS::rate_time->by_key($ratetimenum);
25
26   # make a list of existing intervals that will be deleted
27   foreach ($rate_time->intervals) {
28     $old_ints{$_->intervalnum} = $_;
29   }
30
31   if ( $delete ) {
32     $error = $rate_time->delete;
33     # intervals will be deleted later
34   }
35   elsif( $ratetimename ne $rate_time->ratetimename ) {
36     # the only case where the rate_time itself must be replaced
37     $rate_time->ratetimename($ratetimename);
38     $error = $rate_time->replace;
39   }
40 }
41 else { #!$ratetimenum, adding new
42   $rate_time = FS::rate_time->new({ ratetimename => $ratetimename });
43   $error = $rate_time->insert;
44   $ratetimenum = $rate_time->ratetimenum;
45 }
46
47 if(!$delete and !$error) {
48   foreach my $i (map { /stime(\d+)/ } keys(%vars)) {
49     my $stime = str2wtime($vars{"stime$i"});
50     my $etime = str2wtime($vars{"etime$i"});
51     next if !defined($stime) or !defined($etime);
52     #warn "$i: $stime-$etime";
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     my $new_int = FS::rate_time_interval->new({ ratetimenum => $ratetimenum,
67                                                 stime       => $stime,
68                                                 etime       => $etime, } );
69     $error = $new_int->insert;
70     #warn "inserting $stime-$etime\n";
71     last if $error;
72   }
73 }
74 if(!$error) {
75   foreach (values(%old_ints)) {
76     $error = $_->delete;
77     #warn "deleting ".$_->stime.' '.$_->etime."\n";
78     last if $error;
79   }
80 }
81
82 sub str2wtime {
83   my %days;
84   @days{qw(Sun Mon Tue Wed Thu Fri Sat)} = (0..6);
85   my $str = shift;
86   my ($d, $h, $m, $s, $ampm) = 
87     ($str =~ /^(\w{3}) (\d{2}):(\d{2}):(\d{2}) (\w{2})$/);
88   return () if !$d;
89   $h += 24*$days{$d} + ($ampm eq 'PM' ? 12 : 0);
90   $m += 60*$h;
91   $s += 60*$m;
92   return $s;
93 }
94 </%init>