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('vqa: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.
Usage:
freeside-ipifony-download
[ -v ]
+ [ -q ]
[ -a archivedir ]
[ -P port ]
[ -C category ]
$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);
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/
}
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>) {
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) {
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 ( $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
$num_errors++;
} else {
$num_charges++;
- $sum_charges += $hash{amount};
+ $sum_charges += $amount;
}
if ( $opt{e} and $is_e911{$hash{classname}} ) {
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 });
freeside-ipifony-download
[ -v ]
+ [ -q ]
[ -a archivedir ]
[ -P port ]
[ -C category ]
-v: Be verbose.
+-q: Include the quantity and unit price in the charge description.
+
-a I<archivedir>: Save a copy of the downloaded file to I<archivedir>.
-P I<port>: Connect to that TCP port.