fa6c799ad5e433a2a54d467818a014e89f7ce7d8
[freeside.git] / FS / FS / cdr / callplus.pm
1 package FS::cdr::callplus;
2 use base qw( FS::cdr );
3
4 use strict;
5 use vars qw( %info );
6 use FS::Record qw( qsearchs );
7 use Time::Local 'timelocal';
8
9 # Date format in the Date/Time col: "13/07/2016 2:40:32 p.m."
10 # d/m/y H:M:S, leading zeroes stripped, 12-hour with "a.m." or "p.m.".
11 # There are also separate d/m/y and 24-hour time columns, but parsing
12 # those separately is hard (DST issues).
13
14 %info = (
15   'name'          => 'CallPlus',
16   'weight'        => 610,
17   'header'        => 1,
18   'type'          => 'csv',
19   'import_fields' => [
20     'uniqueid',           # ID
21     '',                   # Billing Group (charged_party?)
22     'src',                # Origin Number
23     'dst',                # Destination Number
24     '',                   # Description (seems to be dest caller id?)
25     '',                   # Status
26     '',                   # Terminated
27     '',                   # Date
28     '',                   # Time
29     sub {                 # Date/Time
30       # this format overlaps one of the existing parser cases, so give it
31       # its own special parser
32       my ($cdr, $value) = @_;
33       $value =~ m[^(\d{1,2})/(\d{1,2})/(\d{4}) (\d{1,2}):(\d{2}):(\d{2}) (a\.m\.|p\.m\.)$]
34         or die "unparseable date: $value";
35       my ($day, $mon, $year, $hour, $min, $sec) = ( $1, $2, $3, $4, $5, $6 );
36       $hour = $hour % 12;
37       if ($7 eq 'p.m.') {
38         $hour = 12;
39       }
40       $cdr->set('startdate',
41                 timelocal($sec, $min, $hour, $day, $mon-1, $year)
42                );
43     },
44     sub {                 # Call Length (seconds)
45       my ($cdr, $value) = @_;
46       $cdr->set('duration', $value);
47       $cdr->set('billsec', $value);
48     },
49     sub {                 # Call Cost (NZD)
50       my ($cdr,$value) = @_;
51       $value =~ s/^\$//;
52       $cdr->upstream_price($value);
53     },
54     skip(4),              # Smartcode, Smartcode Description, Type, SubType
55   ],
56 );
57
58 sub skip { map {''} (1..$_[0]) }
59
60 1;