X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2Fbin%2Ffreeside-ipifony-download;h=10faa74831361c1c0afa3151ea3446cc9e7407e2;hp=837cc33299c97286c16220d586d2daadff8ca172;hb=ff27c3f36240aee48ed50153dd5d8fe3ac3f2443;hpb=49e08fcef54f4c4a3463d91f1cfcb69f121b2c5a diff --git a/FS/bin/freeside-ipifony-download b/FS/bin/freeside-ipifony-download index 837cc3329..10faa7483 100644 --- a/FS/bin/freeside-ipifony-download +++ b/FS/bin/freeside-ipifony-download @@ -9,10 +9,11 @@ use FS::UID qw(adminsuidsetup); use FS::Record qw(qsearch qsearchs); use FS::cust_main; use FS::Conf; +use File::Copy qw(copy); use Text::CSV; my %opt; -getopts('va:P:C:e:', \%opt); +getopts('vqNa:P:C:e:', \%opt); # Product codes that are subject to flat rate E911 charges. For these # products, the'quantity' field represents the number of lines. @@ -30,6 +31,8 @@ sub HELP_MESSAGE { ' Usage: freeside-ipifony-download [ -v ] + [ -q ] + [ -N ] [ -a archivedir ] [ -P port ] [ -C category ] @@ -116,7 +119,7 @@ die "failed to connect to '$sftpuser\@$host'\n(".$sftp->error.")\n" $sftp->setcwd($path) if $path; -my $files = $sftp->ls('.', wanted => qr/\.csv$/, names_only => 1); +my $files = $sftp->ls('ready', wanted => qr/\.csv$/, names_only => 1); if (!@$files) { print STDERR "No charge files found.\n" if $opt{v}; exit(-1); @@ -129,23 +132,23 @@ my %is_e911 = map {$_ => 1} @E911_CODES; FILE: foreach my $filename (@$files) { print STDERR "Retrieving $filename\n" if $opt{v}; - $sftp->get("$filename", "$tmpdir/$filename"); + $sftp->get("ready/$filename", "$tmpdir/$filename"); if($sftp->error) { warn "failed to download $filename\n"; next FILE; } # make sure server archive dir exists - if ( !$sftp->stat('Archive') ) { - print STDERR "Creating $path/Archive\n" if $opt{v}; - $sftp->mkdir('Archive'); + if ( !$sftp->stat('done') ) { + print STDERR "Creating $path/done\n" if $opt{v}; + $sftp->mkdir('done'); if($sftp->error) { # something is seriously wrong die "failed to create archive directory on server:\n".$sftp->error."\n"; } } #move to server archive dir - $sftp->rename("$filename", "Archive/$filename"); + $sftp->rename("ready/$filename", "done/$filename"); if($sftp->error) { warn "failed to archive $filename on server:\n".$sftp->error."\n"; } # process it anyway, I guess/ @@ -159,11 +162,6 @@ FILE: foreach my $filename (@$files) { } open my $fh, "<$tmpdir/$filename"; - my $header = <$fh>; - if ($header !~ /^"cust_id"/) { - warn "warning: $filename has incorrect header row:\n$header\n"; - # but try anyway - } my $csv = Text::CSV->new; # orthodox CSV my %hash; while (my $line = <$fh>) { @@ -172,6 +170,11 @@ FILE: foreach my $filename (@$files) { next FILE; }; @hash{@fields} = $csv->fields(); + if ( $hash{custnum} =~ /^cust/ ) { + # there appears to be a header row + print STDERR "skipping header row\n" if $opt{v}; + next; + } my $cust_main = $cust_main{$hash{custnum}} ||= FS::cust_main->by_key($hash{custnum}); if (!$cust_main) { @@ -182,14 +185,31 @@ FILE: foreach my $filename (@$files) { if $opt{v}; my $amount = sprintf('%.2f',$hash{quantity} * $hash{unit_price}); + + # bill the charge on the customer's next bill date, if that's within + # the current calendar month; otherwise bill it immediately + # (see RT#24325) + my $next_bill_date = $cust_main->next_bill_date; + if ( $next_bill_date ) { + my ($bill_month, $bill_year) = (localtime($next_bill_date))[4, 5]; + my ($this_month, $this_year) = (localtime(time))[4, 5]; + if ( $opt{N} or + $this_month == $bill_month and $this_year == $bill_year ) { + $cust_main->set('charge_date', $next_bill_date); + } + } + # construct arguments for $cust_main->charge my %charge_opt = ( - amount => $amount, + amount => $hash{unit_price}, quantity => $hash{quantity}, - start_date => $cust_main->next_bill_date, + start_date => $cust_main->get('charge_date'), pkg => $hash{date_desc}, taxclass => $TAXCLASSES{ $hash{taxclass} }, ); + if ( $opt{q} ) { + $charge_opt{pkg} .= ' (' . $hash{quantity} . ' @ $' . $hash{unit_price} . ' ea)'; + } if (my $classname = $hash{classname}) { if (!exists($classnum_of{$classname}) ) { # then look it up @@ -221,7 +241,7 @@ FILE: foreach my $filename (@$files) { $num_errors++; } else { $num_charges++; - $sum_charges += $hash{amount}; + $sum_charges += $amount; } if ( $opt{e} and $is_e911{$hash{classname}} ) { @@ -242,7 +262,7 @@ foreach my $custnum ( keys (%e911_qty) ) { my $cust_pkg = FS::cust_pkg->new({ pkgpart => $opt{e}, custnum => $custnum, - start_date => $cust_main->next_bill_date, + start_date => $cust_main->get('charge_date'), quantity => $quantity, }); my $error = $cust_main->order_pkg({ cust_pkg => $cust_pkg }); @@ -277,6 +297,8 @@ freeside-ipifony-download - Download and import invoice items from IPifony. freeside-ipifony-download [ -v ] + [ -q ] + [ -N ] [ -a archivedir ] [ -P port ] [ -C category ] @@ -293,10 +315,19 @@ have an authorization key to connect as that user. I: the SFTP server. +I: the path on the server to the working directory. The working +directory is the one containing the "ready/" and "done/" subdirectories. + =head1 OPTIONAL PARAMETERS -v: Be verbose. +-q: Include the quantity and unit price in the charge description. + +-N: Always bill the charges on the customer's next bill date, if they have +one. Otherwise, charges will be billed on the next bill date only if it's +within the current calendar month. + -a I: Save a copy of the downloaded file to I. -P I: Connect to that TCP port.