package csc::Utils; use strict; use warnings; use Time::Local; # takes a catalyst session with a call list as returned # by the prov. interface and returns a reference to an # array (if $classifytime is false) or a hash (if # $classifytime is true) suited for TT display sub prepare_call_list { my ($c, $call_list, $classifytime, $filter, $only_unseen) = @_; my $callentries = $classifytime ? {} : []; my @time = localtime time; my $tmtdy = timelocal(0,0,0,$time[3],$time[4],$time[5]); if(defined $filter and length $filter) { $filter =~ s/\*/.*/g; } else { undef $filter; } my $user_cc = $c->session->{user}{data}{cc}; my $b = ''; foreach my $call (@$call_list) { my %callentry; $callentry{background} = $b ? '' : 'alt'; my @date = localtime $$call{start_time}; $date[5] += 1900; $date[4]++; $callentry{date} = sprintf("%02d.%02d.%04d %02d:%02d:%02d", @date[3,4,5,2,1,0]); if($$call{duration}) { my $duration = $$call{duration}; while($duration > 59) { my $left = sprintf("%02d", $duration % 60); $callentry{duration} = ":$left". (defined $callentry{duration} ? $callentry{duration} : ''); $duration = int($duration / 60); } $callentry{duration} = defined $callentry{duration} ? sprintf("%02d", $duration) . $callentry{duration} : sprintf("00:%02d", $duration); } elsif($$call{call_status} eq 'ok') { $callentry{duration} = '00:00'; } if(defined $$call{call_fee}) { # money is allways returned as euro cents $callentry{call_fee} = sprintf "€ %.04f", $$call{call_fee}/100; } else { $callentry{call_fee} = ''; } if(defined $$call{source_user} and $$call{source_user} eq $c->session->{user}{username} and $$call{source_domain} eq $c->session->{user}{domain}) { if($$call{call_status} eq 'ok') { $callentry{direction_icon} = 'anruf_aus_small.gif'; } else { $callentry{direction_icon} = 'anruf_aus_err_small.gif'; } if($$call{destination_user} =~ /^\d+$/) { my $partner = '00'.$$call{destination_user}; $partner =~ s/^00$user_cc/0/; $callentry{partner} = $partner; } else { $callentry{partner} = $$call{destination_user} .'@'. $$call{destination_domain}; } $callentry{partner_number} = $callentry{partner}; } elsif(defined $$call{destination_user} and $$call{destination_user} eq $c->session->{user}{username} and $$call{destination_domain} eq $c->session->{user}{domain}) { if($$call{call_status} eq 'ok') { $callentry{direction_icon} = 'anruf_ein_small.gif'; } else { $callentry{direction_icon} = 'anruf_ein_err_small.gif'; } if(!defined $$call{source_cli} or !length $$call{source_cli} or $$call{source_cli} !~ /^\d+$/) { if(!defined $$call{source_user} or !length $$call{source_user}) { $callentry{partner} = 'anonym'; } elsif($$call{source_user} =~ /^\d+$/) { my $partner = '00'.$$call{source_user}; $partner =~ s/^00$user_cc/0/; $callentry{partner} = $partner; } else { $callentry{partner} = $$call{source_user} .'@'. $$call{source_domain}; } } else { my $partner = '00'.$$call{source_cli}; $partner =~ s/^00$user_cc/0/; $callentry{partner} = $partner; } $callentry{partner_number} = $callentry{partner}; } elsif(defined $$call{callerid}) { # voicemail! if($$call{callerid} =~ /^\d+$/) { my $partner = '00'.$$call{callerid}; $partner =~ s/^00$user_cc/0/; $callentry{partner} = $partner; } else { $callentry{partner} = $$call{callerid}; } $callentry{partner_number} = $callentry{partner}; $callentry{id} = $$call{id}; $callentry{background} = 'abgehoert' unless $$call{unseen}; $callentry{unseen} = $$call{unseen}; } else { $c->log->error("***Utils::prepare_call_list no match on user in call list"); next; } if(exists $c->session->{user}{contacts_for_numbers}{$callentry{partner}}) { my $contact = $c->session->{user}{contacts}{$c->session->{user}{contacts_for_numbers}{$callentry{partner}}}; $callentry{partner} = $$contact{displayname}; if(defined $$contact{phonenumber} and $$contact{phonenumber} eq $callentry{partner_number}) { $callentry{partner_info} = $c->model('Provisioning')->localize('Web.Addressbook.Office'); } elsif(defined $$contact{homephonenumber} and $$contact{homephonenumber} eq $callentry{partner_number}) { $callentry{partner_info} = $c->model('Provisioning')->localize('Web.Addressbook.Home'); } elsif(defined $$contact{mobilenumber} and $$contact{mobilenumber} eq $callentry{partner_number}) { $callentry{partner_info} = $c->model('Provisioning')->localize('Web.Addressbook.Mobile'); } elsif(defined $$contact{faxnumber} and $$contact{faxnumber} eq $callentry{partner_number}) { $callentry{partner_info} = $c->model('Provisioning')->localize('Web.Addressbook.Fax'); } } if(defined $filter) { next unless $callentry{partner} =~ /$filter/i; } if(defined $only_unseen and $only_unseen) { next unless defined $callentry{unseen} and $callentry{unseen}; } if($classifytime) { if($$call{start_time} >= $tmtdy) { push @{$$callentries{today}}, \%callentry; } elsif($$call{start_time} >= $tmtdy - 86400) { push @{$$callentries{yesterday}}, \%callentry; } elsif($$call{start_time} >= $tmtdy - 86400 * 6) { push @{$$callentries{lastweek}}, \%callentry; } else { push @{$$callentries{previous}}, \%callentry; } } else { push @$callentries, \%callentry; } $b = !$b; } return $callentries; } # finito, l'amore 1;