From 8965012fa53fd05d851d2f5abed4e056ab758797 Mon Sep 17 00:00:00 2001 From: ivan Date: Sat, 21 Sep 2002 11:17:39 +0000 Subject: [PATCH] all taxes now have names. closes: Bug#15 --- FS/FS/cust_bill.pm | 20 ++++++++++++++------ FS/FS/cust_bill_pkg.pm | 5 ++++- FS/FS/cust_main.pm | 24 +++++++++++++++--------- FS/FS/cust_main_county.pm | 3 +++ FS/bin/freeside-setup | 22 ++++++++++++++++++++-- README.1.5.0pre1 | 3 +++ bin/create-history-tables | 13 +++++++++++-- httemplate/browse/cust_main_county.cgi | 11 ++++++++++- httemplate/docs/schema.dia | Bin 14438 -> 14438 bytes httemplate/docs/schema.html | 2 ++ httemplate/edit/cust_main_county.cgi | 5 ++++- httemplate/edit/process/cust_main_county.cgi | 17 +++++++++-------- 12 files changed, 95 insertions(+), 30 deletions(-) diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm index 258b32e15..f0667258c 100644 --- a/FS/FS/cust_bill.pm +++ b/FS/FS/cust_bill.pm @@ -510,10 +510,13 @@ sub send_csv { time2str("%x", $cust_bill_pkg->edate), ); - } else { #pkgnum Tax + } else { #pkgnum tax next unless $cust_bill_pkg->setup != 0; + my $itemdesc = defined $cust_bill_pkg->dbdef_table->column('itemdesc') + ? ( $cust_bill_pkg->itemdesc || 'Tax' ) + : 'Tax'; ($pkg, $setup, $recur, $sdate, $edate) = - ( 'Tax', sprintf("%10.2f",$cust_bill_pkg->setup), '', '', '' ); + ( $itemdesc, sprintf("%10.2f",$cust_bill_pkg->setup), '', '', '' ); } $csv->combine( @@ -858,7 +861,9 @@ sub print_text { } #new charges - foreach ( $self->cust_bill_pkg ) { + foreach ( ( grep { $_->pkgnum } $self->cust_bill_pkg ), #packages first + ( grep { ! $_->pkgnum } $self->cust_bill_pkg ), #then taxes + ) { if ( $_->pkgnum ) { @@ -882,8 +887,11 @@ sub print_text { map { [ " ". $_->[0]. ": ". $_->[1], '' ] } $cust_pkg->labels; } - } else { #pkgnum Tax - push @buf,["Tax", $money_char. sprintf("%10.2f",$_->setup) ] + } else { #pkgnum tax + my $itemdesc = defined $_->dbdef_table->column('itemdesc') + ? ( $_->itemdesc || 'Tax' ) + : 'Tax'; + push @buf,[$itemdesc, $money_char. sprintf("%10.2f",$_->setup) ] if $_->setup != 0; } } @@ -1031,7 +1039,7 @@ sub print_text { =head1 VERSION -$Id: cust_bill.pm,v 1.45 2002-09-17 10:21:47 ivan Exp $ +$Id: cust_bill.pm,v 1.46 2002-09-21 11:17:39 ivan Exp $ =head1 BUGS diff --git a/FS/FS/cust_bill_pkg.pm b/FS/FS/cust_bill_pkg.pm index 72f9ce4a9..5a1dcd2aa 100644 --- a/FS/FS/cust_bill_pkg.pm +++ b/FS/FS/cust_bill_pkg.pm @@ -47,6 +47,8 @@ supported: =item edate - ending date of recurring fee +=item itemdesc - Line item description (currentlty used only when pkgnum is 0) + =back sdate and edate are specified as UNIX timestamps; see L. Also @@ -111,6 +113,7 @@ sub check { || $self->ut_money('recur') || $self->ut_numbern('sdate') || $self->ut_numbern('edate') + || $self->ut_textn('itemdesc') ; return $error if $error; @@ -140,7 +143,7 @@ sub cust_pkg { =head1 VERSION -$Id: cust_bill_pkg.pm,v 1.3 2002-04-06 22:32:43 ivan Exp $ +$Id: cust_bill_pkg.pm,v 1.4 2002-09-21 11:17:39 ivan Exp $ =head1 BUGS diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index 84fd3d150..2701ac35d 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -904,10 +904,12 @@ sub bill { my( $total_setup, $total_recur ) = ( 0, 0 ); #my( $taxable_setup, $taxable_recur ) = ( 0, 0 ); my @cust_bill_pkg = (); - my $tax = 0;## + #my $tax = 0;## #my $taxable_charged = 0;## #my $charged = 0;## + my %tax; + foreach my $cust_pkg ( qsearch('cust_pkg', { 'custnum' => $self->custnum } ) ) { @@ -1101,7 +1103,10 @@ sub bill { } #if $cust_main_county->exempt_amount $taxable_charged = sprintf( "%.2f", $taxable_charged); - $tax += $taxable_charged * $cust_main_county->tax / 100 + + #$tax += $taxable_charged * $cust_main_county->tax / 100 + $tax{ $cust_main_county->taxname || 'Tax' } += + $taxable_charged * $cust_main_county->tax / 100 } #unless $self->tax =~ /Y/i # || $self->payby eq 'COMP' @@ -1134,16 +1139,17 @@ sub bill { # $taxable_charged * ( $cust_main_county->getfield('tax') / 100 ) # ); - $tax = sprintf("%.2f", $tax); - if ( $tax > 0 ) { + foreach my $taxname ( grep { $tax{$_} > 0 } keys %tax ) { + my $tax = sprintf("%.2f", $tax{$taxname} ); $charged = sprintf( "%.2f", $charged+$tax ); my $cust_bill_pkg = new FS::cust_bill_pkg ({ - 'pkgnum' => 0, - 'setup' => $tax, - 'recur' => 0, - 'sdate' => '', - 'edate' => '', + 'pkgnum' => 0, + 'setup' => $tax, + 'recur' => 0, + 'sdate' => '', + 'edate' => '', + 'itemdesc' => $taxname, }); push @cust_bill_pkg, $cust_bill_pkg; } diff --git a/FS/FS/cust_main_county.pm b/FS/FS/cust_main_county.pm index e41564d21..d8796e451 100644 --- a/FS/FS/cust_main_county.pm +++ b/FS/FS/cust_main_county.pm @@ -61,6 +61,8 @@ currently supported: =item exempt_amount +=item taxname - if defined, printed on invoices instead of "Tax" + =back =head1 METHODS @@ -110,6 +112,7 @@ sub check { || $self->ut_float('tax') || $self->ut_textn('taxclass') # ... || $self->ut_money('exempt_amount') + || $self->ut_textn('taxname') ; } diff --git a/FS/bin/freeside-setup b/FS/bin/freeside-setup index e8bb7ec62..f6a543fc8 100755 --- a/FS/bin/freeside-setup +++ b/FS/bin/freeside-setup @@ -189,7 +189,23 @@ foreach my $table ( grep { ! /^h_/ } $dbdef->tables ) { 'default' => '', 'local' => '', } ), - map { $tableobj->column($_) } $tableobj->columns + map { + my $column = $tableobj->column($_); + + #clone so as to not disturb the original + $column = DBIx::DBSchema::Column->new( { + map { $_ => $column->$_() } + qw( name type null length default local ) + } ); + + $column->type('int') + if $column->type eq 'serial'; + #$column->default('') + # if $column->default =~ /^nextval\(/i; + #( my $local = $column->local ) =~ s/AUTO_INCREMENT//i; + #$column->local($local); + $column; + } $tableobj->columns ], } ); $dbdef->addtable($h_tableobj); @@ -397,9 +413,10 @@ sub tables_hash_hack { 'recur', @money_type, 'sdate', @date_type, 'edate', @date_type, + 'itemdesc', 'varchar', 'NULL', $char_d, ], 'primary_key' => '', - 'unique' => [ ['pkgnum', 'invnum'] ], + 'unique' => [], 'index' => [ ['invnum'] ], }, @@ -504,6 +521,7 @@ sub tables_hash_hack { 'taxclass', 'varchar', 'NULL', $char_d, 'exempt_amount', @money_type, 'tax', 'real', '', '', #tax % + 'taxname', 'varchar', 'NULL', $char_d, ], 'primary_key' => 'taxnum', 'unique' => [], diff --git a/README.1.5.0pre1 b/README.1.5.0pre1 index ff3e5a6cc..57fc36af6 100644 --- a/README.1.5.0pre1 +++ b/README.1.5.0pre1 @@ -4,6 +4,9 @@ schema changes: *** get svc_broadband changes from pc-intouch *** otaker changes s/8/32 all otkaer fields *** optional: sequence changes + *** add column cust_main_county.taxname + *** add column cust_bill_pkg.itemdesc + *** drop index cust_bill_pkg1 install DBIx::DBSchema 0.21 install NetAddr::IP diff --git a/bin/create-history-tables b/bin/create-history-tables index d37d682d8..33eb0e5a3 100755 --- a/bin/create-history-tables +++ b/bin/create-history-tables @@ -2,7 +2,7 @@ use strict; use DBI; -use DBIx::DBSchema 0.20; +use DBIx::DBSchema 0.21; use DBIx::DBSchema::Table; use DBIx::DBSchema::Column; use DBIx::DBSchema::ColGroup::Unique; @@ -64,7 +64,16 @@ foreach my $table ( @tables ) { 'default' => '', 'local' => '', } ), - map { $tableobj->column($_) } $tableobj->columns + map { + my $column = $tableobj->column($_); + $column->type('int') + if $column->type eq 'serial'; + $column->default('') + if $column->default =~ /^nextval\(/i; + ( my $local = $column->local ) =~ s/AUTO_INCREMENT//i; + $column->local($local); + $column; + } $tableobj->columns ], } ); foreach my $statement ( $h_tableobj->sql_create_table($dbh) ) { diff --git a/httemplate/browse/cust_main_county.cgi b/httemplate/browse/cust_main_county.cgi index 991606087..c2473c4c8 100755 --- a/httemplate/browse/cust_main_county.cgi +++ b/httemplate/browse/cust_main_county.cgi @@ -21,7 +21,8 @@ print '

'. &table(). <Country State County - Taxclass + Taxclass
(per-package classification) + Tax name
(printed on invoices) Tax Exempt
per
month @@ -111,6 +112,14 @@ END } print ""; + print "{taxname} ) { + print ' BGCOLOR="#ffffff">'. $hashref->{taxname}; + } else { + print ' BGCOLOR="#cccccc">Tax'; + } + print ""; + print "$hashref->{tax}%". '$'. sprintf("%.2f", $hashref->{exempt_amount} || 0). ''. diff --git a/httemplate/docs/schema.dia b/httemplate/docs/schema.dia index c0842a60278d00905b511fb4b5f55ec06e94cb5e..746561550fa74f4ba39a340a37f07468b1a20f15 100644 GIT binary patch literal 14438 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 - recurring fee
  • sdate - starting date
  • edate - ending date +
  • itemdesc - Line item description (currently used only when pkgnum is 0)
  • cust_tax_exempt - Tax exemption record
      diff --git a/httemplate/edit/cust_main_county.cgi b/httemplate/edit/cust_main_county.cgi index 7ef37a48d..f3d28825a 100755 --- a/httemplate/edit/cust_main_county.cgi +++ b/httemplate/edit/cust_main_county.cgi @@ -15,7 +15,8 @@ print qq!
      (ALL)' , ""; + print qq!!; print qq!%!; print qq!\$$taxnum}) + my $taxnum = $1; + my $old = qsearchs('cust_main_county', { 'taxnum' => $taxnum }) or die "Couldn't find taxnum $taxnum!"; - my $exempt_amount = $cgi->param("exempt_amount$taxnum"); - next unless $old->tax ne $cgi->param("tax$taxnum") - || $old->exempt_amount ne $exempt_amount; + next unless $old->tax != $cgi->param("tax$taxnum") + || $old->exempt_amount != $cgi->param("exempt_amount$taxnum") + || $old->taxname ne $cgi->param("taxname$taxnum"); my %hash = $old->hash; $hash{tax} = $cgi->param("tax$taxnum"); - $hash{exempt_amount} = $exempt_amount; - my($new)=new FS::cust_main_county \%hash; - my($error)=$new->replace($old); + $hash{exempt_amount} = $cgi->param("exempt_amount$taxnum"); + $hash{taxname} = $cgi->param("taxname$taxnum"); + my $new = new FS::cust_main_county \%hash; + my $error = $new->replace($old); if ( $error ) { $cgi->param('error', $error); print $cgi->redirect(popurl(2). "cust_main_county.cgi?". $cgi->query_string ); -- 2.11.0
  • cust_credit - Credits. The equivalent of a negative cust_bill record.
      @@ -133,6 +134,7 @@
    • tax - % rate
    • taxclass
    • exempt_amount +
    • taxname - if defined, printed on invoices instead of "Tax"