#===================================================================== # LedgerSMB Small Medium Business Accounting # http://www.ledgersmb.org/ # # Copyright (C) 2006 # This work contains copyrighted information from a number of sources all used # with permission. # # This file contains source code included with or based on SQL-Ledger which # is Copyright Dieter Simader and DWS Systems Inc. 2000-2005 and licensed # under the GNU General Public License version 2 or, at your option, any later # version. For a full list including contact information of contributors, # maintainers, and copyright holders, see the CONTRIBUTORS file. # # Original Copyright Notice from SQL-Ledger 2.6.17 (before the fork): # Copyright (c) 2003 # # Author: DWS Systems Inc. # Web: http://www.sql-ledger.org # # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #====================================================================== # # This file has not undergone any whitespace cleanup. # # printing routines for ar, ap # use Error qw(:try); use LedgerSMB::Template; # any custom scripts for this one if ( -f "bin/custom/arapprn.pl" ) { eval { require "bin/custom/arapprn.pl"; }; } if ( -f "bin/custom/$form->{login}_arapprn.pl" ) { eval { require "bin/custom/$form->{login}_arapprn.pl"; }; } 1; # end of main sub print { if ( $form->{media} !~ /screen/ ) { $form->error( $locale->text('Select postscript or PDF!') ) if $form->{format} !~ /(postscript|pdf)/; $old_form = new Form; for ( keys %$form ) { $old_form->{$_} = $form->{$_} } } if ( $form->{formname} =~ /(check|receipt)/ ) { if ( $form->{media} eq 'screen' ) { $form->error( $locale->text('Select postscript or PDF!') ) if $form->{format} !~ /(postscript|pdf)/; } } if ( !$form->{invnumber} ) { $invfld = 'sinumber'; $invfld = 'vinumber' if $form->{ARAP} eq 'AP'; $form->{invnumber} = $form->update_defaults( \%myconfig, $invfld ); if ( $form->{media} eq 'screen' ) { if ( $form->{media} eq 'screen' ) { &update; exit; } } } if ( $form->{formname} =~ /(check|receipt)/ ) { if ( $form->{media} ne 'screen' ) { for (qw(action header)) { delete $form->{$_} } $form->{invtotal} = $form->{oldinvtotal}; foreach $key ( keys %$form ) { $form->{$key} =~ s/&/%26/g; $form->{previousform} .= qq|$key=$form->{$key}&|; } chop $form->{previousform}; $form->{previousform} = $form->escape( $form->{previousform}, 1 ); } if ( $form->{paidaccounts} > 1 ) { if ( $form->{"paid_$form->{paidaccounts}"} ) { &update; exit; } elsif ( $form->{paidaccounts} > 2 ) { # select payment &select_payment; exit; } } else { $form->error( $locale->text('Nothing to print!') ); } } if ( $filename = $queued{ $form->{formname} } ) { $form->{queued} =~ s/$form->{formname} $filename//; unlink "${LedgerSMB::Sysconfig::spool}/$filename"; $filename =~ s/\..*$//g; } else { $filename = time; $filename .= $$; } $filename .= ( $form->{format} eq 'postscript' ) ? '.ps' : '.pdf'; if ( $form->{media} ne 'screen' ) { $form->{OUT} = "${LedgerSMB::Sysconfig::spool}/$filename"; $form{printmode} = '>'; } $form->{queued} .= " $form->{formname} $filename"; $form->{queued} =~ s/^ //; $printform = new Form; for ( keys %$form ) { $printform->{$_} = $form->{$_}; } if ( $form->{printandpost} ) { $form->{action} = 'post'; delete $form->{printandpost}; &post; } else { &{"print_$form->{formname}"}( $old_form, 1 ); } } sub print_check { my ( $old_form, $i ) = @_; $display_form = ( $form->{display_form} ) ? $form->{display_form} : "display_form"; if ( $form->{"paid_$i"} ) { @a = (); if ( exists $form->{longformat} ) { $form->{"datepaid_$i"} = $locale->date( \%myconfig, $form->{"datepaid_$i"}, $form->{longformat} ); } push @a, "source_$i", "memo_$i"; $form->format_string(@a); } $form->{amount} = $form->{"paid_$i"}; if ( ( $form->{formname} eq 'check' && $form->{vc} eq 'customer' ) || ( $form->{formname} eq 'receipt' && $form->{vc} eq 'vendor' ) ) { $form->{amount} =~ s/-//g; } for (qw(datepaid source memo)) { $form->{$_} = $form->{"${_}_$i"} } &{"$form->{vc}_details"}; @a = qw(name address1 address2 city state zipcode country); foreach $item (qw(invnumber ordnumber)) { $temp{$item} = $form->{$item}; delete $form->{$item}; push( @{ $form->{$item} }, $temp{$item} ); } push( @{ $form->{invdate} }, $form->{transdate} ); push( @{ $form->{due} }, $form->format_amount( \%myconfig, $form->{oldinvtotal}, 2 ) ); push( @{ $form->{paid} }, $form->{"paid_$i"} ); use LedgerSMB::CP; $c = CP->new( ( $form->{language_code} ) ? $form->{language_code} : $myconfig{countrycode} ); $c->init; ( $whole, $form->{decimal} ) = split /\./, $form->parse_amount( \%myconfig, $form->{amount} ); $form->{decimal} .= "00"; $form->{decimal} = substr( $form->{decimal}, 0, 2 ); $form->{text_decimal} = $c->num2text( $form->{decimal} * 1 ); $form->{text_amount} = $c->num2text($whole); $form->{integer_amount} = $form->format_amount( $myconfig, $whole ); ( $form->{employee} ) = split /--/, $form->{employee}; $form->{notes} =~ s/^\s+//g; push @a, "notes"; for (qw(company address tel fax businessnumber)) { $form->{$_} = $myconfig{$_}; } $form->{address} =~ s/\\n/\n/g; push @a, qw(company address tel fax businessnumber text_amount text_decimal); $form->format_string(@a); $form->{templates} = "$myconfig{templates}"; $form->{IN} = ( $form->{formname} eq 'transaction' ) ? lc $form->{ARAP} . "_$form->{formname}.html" : "$form->{formname}.html"; if ( $form->{format} =~ /(postscript|pdf)/ ) { $form->{IN} =~ s/html$/tex/; } if ( $form->{media} eq 'queue' ) { # save status $form->update_status( \%myconfig ); $form->{queued} = $form->{queued}; %audittrail = ( tablename => ($order) ? 'oe' : lc $ARAP, reference => $form->{"${inv}number"}, formname => $form->{formname}, action => 'queued', id => $form->{id} ); $form->{audittrail} .= $form->audittrail( "", \%myconfig, \%audittrail ); $form->{OUT} = "${LedgerSMB::Sysconfig::spool}/$filename"; $form->{printmode} = '>'; $form->{queued} .= " $form->{formname} $filename"; $form->{queued} =~ s/^ //; } if ( $form->{media} !~ /(screen|queue)/ ) { %queued = split / /, $form->{queued}; $form->{OUT} = ${LedgerSMB::Sysconfig::printer}{ $form->{media} }; $form->{printmode} = '|-'; if ( $form->{printed} !~ /$form->{formname}/ ) { $form->{printed} .= " $form->{formname}"; $form->{printed} =~ s/^ //; $form->update_status( \%myconfig ); } %audittrail = ( tablename => lc $form->{ARAP}, reference => $form->{invnumber}, formname => $form->{formname}, action => 'printed', id => $form->{id} ); %status = (); for (qw(printed audittrail)) { $status{$_} = $form->{$_} } $status{audittrail} .= $form->audittrail( "", \%myconfig, \%audittrail ); } $form->{fileid} = $invnumber; $form->{fileid} =~ s/(\s|\W)+//g; my $template = LedgerSMB::Template->new( user => \%myconfig, template => $form->{'formname'}, format => uc $form->{'format'} ); try { $template->render($form); $template->output(%{$form}); } catch Error::Simple with { my $E = shift; $form->error( $E->stacktrace ); }; if ( $form->{previousform} ) { $previousform = $form->unescape( $form->{previousform} ); for ( keys %$form ) { delete $form->{$_} } foreach $item ( split /&/, $previousform ) { ( $key, $value ) = split /=/, $item, 2; $value =~ s/%26/&/g; $form->{$key} = $value; } for (qw(exchangerate creditlimit creditremaining)) { $form->{$_} = $form->parse_amount( \%myconfig, $form->{$_} ); } for ( 1 .. $form->{rowcount} ) { $form->{"amount_$_"} = $form->parse_amount( \%myconfig, $form->{"amount_$_"} ); } for ( split / /, $form->{taxaccounts} ) { $form->{"tax_$_"} = $form->parse_amount( \%myconfig, $form->{"tax_$_"} ); } for $i ( 1 .. $form->{paidaccounts} ) { for (qw(paid exchangerate)) { $form->{"${_}_$i"} = $form->parse_amount( \%myconfig, $form->{"${_}_$i"} ); } } for (qw(printed audittrail)) { $form->{$_} = $status{$_} } &{"$display_form"}; } } sub print_receipt { my ( $old_form, $i ) = @_; &print_check( $old_form, $i ); } sub print_transaction { my ($old_form) = @_; $display_form = ( $form->{display_form} ) ? $form->{display_form} : "display_form"; &{"$form->{vc}_details"}; @a = qw(name address1 address2 city state zipcode country); $form->{invtotal} = 0; foreach $i ( 1 .. $form->{rowcount} - 1 ) { ( $form->{tempaccno}, $form->{tempaccount} ) = split /--/, $form->{"$form->{ARAP}_amount_$i"}; ( $form->{tempprojectnumber} ) = split /--/, $form->{"projectnumber_$i"}; $form->{tempdescription} = $form->{"description_$i"}; $form->format_string( qw(tempaccno tempaccount tempprojectnumber tempdescription)); push( @{ $form->{accno} }, $form->{tempaccno} ); push( @{ $form->{account} }, $form->{tempaccount} ); push( @{ $form->{description} }, $form->{tempdescription} ); push( @{ $form->{projectnumber} }, $form->{tempprojectnumber} ); push( @{ $form->{amount} }, $form->{"amount_$i"} ); $form->{subtotal} += $form->parse_amount( \%myconfig, $form->{"amount_$i"} ); } foreach $accno ( split / /, $form->{taxaccounts} ) { if ( $form->{"tax_$accno"} ) { $form->format_string("${accno}_description"); $tax += $form->parse_amount( \%myconfig, $form->{"tax_$accno"} ); $form->{"${accno}_tax"} = $form->{"tax_$accno"}; push( @{ $form->{tax} }, $form->{"tax_$accno"} ); push( @{ $form->{taxdescription} }, $form->{"${accno}_description"} ); $form->{"${accno}_taxrate"} = $form->format_amount( $myconfig, $form->{"${accno}_rate"} * 100 ); push( @{ $form->{taxrate} }, $form->{"${accno}_taxrate"} ); push( @{ $form->{taxnumber} }, $form->{"${accno}_taxnumber"} ); } } $tax = 0 if $form->{taxincluded}; push @a, $form->{ARAP}; $form->format_string(@a); $form->{paid} = 0; for $i ( 1 .. $form->{paidaccounts} - 1 ) { if ( $form->{"paid_$i"} ) { @a = (); $form->{paid} += $form->parse_amount( \%myconfig, $form->{"paid_$i"} ); if ( exists $form->{longformat} ) { $form->{"datepaid_$i"} = $locale->date( \%myconfig, $form->{"datepaid_$i"}, $form->{longformat} ); } push @a, "$form->{ARAP}_paid_$i", "source_$i", "memo_$i"; $form->format_string(@a); ( $accno, $account ) = split /--/, $form->{"$form->{ARAP}_paid_$i"}; push( @{ $form->{payment} }, $form->{"paid_$i"} ); push( @{ $form->{paymentdate} }, $form->{"datepaid_$i"} ); push( @{ $form->{paymentaccount} }, $account ); push( @{ $form->{paymentsource} }, $form->{"source_$i"} ); push( @{ $form->{paymentmemo} }, $form->{"memo_$i"} ); } } $form->{invtotal} = $form->{subtotal} + $tax; $form->{total} = $form->{invtotal} - $form->{paid}; use LedgerSMB::CP; $c = CP->new( ( $form->{language_code} ) ? $form->{language_code} : $myconfig{countrycode} ); $c->init; ( $whole, $form->{decimal} ) = split /\./, $form->{invtotal}; $form->{decimal} .= "00"; $form->{decimal} = substr( $form->{decimal}, 0, 2 ); $form->{text_decimal} = $c->num2text( $form->{decimal} * 1 ); $form->{text_amount} = $c->num2text($whole); $form->{integer_amount} = $form->format_amount( $myconfig, $whole ); for (qw(invtotal subtotal paid total)) { $form->{$_} = $form->format_amount( \%myconfig, $form->{$_}, 2 ); } ( $form->{employee} ) = split /--/, $form->{employee}; if ( exists $form->{longformat} ) { for (qw(duedate transdate)) { $form->{$_} = $locale->date( \%myconfig, $form->{$_}, $form->{longformat} ); } } $form->{notes} =~ s/^\s+//g; @a = ( "invnumber", "transdate", "duedate", "notes" ); for (qw(company address tel fax businessnumber)) { $form->{$_} = $myconfig{$_}; } $form->{address} =~ s/\\n/\n/g; push @a, qw(company address tel fax businessnumber text_amount text_decimal); $form->format_string(@a); $form->{invdate} = $form->{transdate}; $form->{templates} = "$myconfig{templates}"; $form->{IN} = ( $form->{formname} eq 'transaction' ) ? lc $form->{ARAP} . "_$form->{formname}.html" : "$form->{formname}.html"; if ( $form->{format} =~ /(postscript|pdf)/ ) { $form->{IN} =~ s/html$/tex/; } if ( $form->{media} eq 'queue' ) { %queued = split / /, $form->{queued}; if ( $filename = $queued{ $form->{formname} } ) { $form->{queued} =~ s/$form->{formname} $filename//; unlink "${LedgerSMB::Sysconfig::spool}/$filename"; $filename =~ s/\..*$//g; } else { $filename = time; $filename .= $$; } $filename .= ( $form->{format} eq 'postscript' ) ? '.ps' : '.pdf'; $form->{OUT} = "${LedgerSMB::Sysconfig::spool}/$filename"; $form->{printmode} = '>'; $form->{queued} .= " $form->{formname} $filename"; $form->{queued} =~ s/^ //; # save status $form->update_status( \%myconfig ); $old_form->{queued} = $form->{queued}; %audittrail = ( tablename => ($order) ? 'oe' : lc $ARAP, reference => $form->{"${inv}number"}, formname => $form->{formname}, action => 'queued', id => $form->{id} ); $old_form->{audittrail} .= $form->audittrail( "", \%myconfig, \%audittrail ); } if ( $form->{media} !~ /(queue|screen)/ ) { $form->{OUT} = ${LedgerSMB::Sysconfig::printer}{ $form->{media} }; $form->{printmode} = '|-'; if ( $form->{printed} !~ /$form->{formname}/ ) { $form->{printed} .= " $form->{formname}"; $form->{printed} =~ s/^ //; $form->update_status( \%myconfig ); } $old_form->{printed} = $form->{printed} if %$old_form; %audittrail = ( tablename => lc $form->{ARAP}, reference => $form->{"invnumber"}, formname => $form->{formname}, action => 'printed', id => $form->{id} ); $old_form->{audittrail} .= $form->audittrail( "", \%myconfig, \%audittrail ) if %$old_form; } $form->{fileid} = $form->{invnumber}; $form->{fileid} =~ s/(\s|\W)+//g; my $template = LedgerSMB::Template->new( user => \%myconfig, template => $form->{'formname'}, format => uc $form->{format} ); try { $template->render($form); $template->output(%{$form}); } catch Error::Simple with { my $E = shift; $form->error( $E->stacktrace ); }; if (%$old_form) { $old_form->{invnumber} = $form->{invnumber}; $old_form->{invtotal} = $form->{invtotal}; for ( keys %$form ) { delete $form->{$_} } for ( keys %$old_form ) { $form->{$_} = $old_form->{$_} } if ( !$form->{printandpost} ) { for (qw(exchangerate creditlimit creditremaining)) { $form->{$_} = $form->parse_amount( \%myconfig, $form->{$_} ); } for ( 1 .. $form->{rowcount} ) { $form->{"amount_$_"} = $form->parse_amount( \%myconfig, $form->{"amount_$_"} ); } for ( split / /, $form->{taxaccounts} ) { $form->{"tax_$_"} = $form->parse_amount( \%myconfig, $form->{"tax_$_"} ); } for $i ( 1 .. $form->{paidaccounts} ) { for (qw(paid exchangerate)) { $form->{"${_}_$i"} = $form->parse_amount( \%myconfig, $form->{"${_}_$i"} ); } } } &{"$display_form"}; } } sub vendor_details { IR->vendor_details( \%myconfig, \%$form ) } sub customer_details { IS->customer_details( \%myconfig, \%$form ) } sub select_payment { @column_index = ( "ndx", "datepaid", "source", "memo", "paid", "$form->{ARAP}_paid" ); # list payments with radio button on a form $form->header; $title = $locale->text('Select payment'); $column_data{ndx} = qq|<th width=1%> </th>|; $column_data{datepaid} = qq|<th>| . $locale->text('Date') . qq|</th>|; $column_data{source} = qq|<th>| . $locale->text('Source') . qq|</th>|; $column_data{memo} = qq|<th>| . $locale->text('Memo') . qq|</th>|; $column_data{paid} = qq|<th>| . $locale->text('Amount') . qq|</th>|; $column_data{"$form->{ARAP}_paid"} = qq|<th>| . $locale->text('Account') . qq|</th>|; print qq| <body> <form method=post action=$form->{script}> <table width=100%> <tr> <th class=listtop>$title</th> </tr> <tr space=5></tr> <tr> <td> <table width=100%> <tr class=listheading>|; for (@column_index) { print "\n$column_data{$_}" } print qq| </tr> |; $checked = "checked"; foreach $i ( 1 .. $form->{paidaccounts} - 1 ) { for (@column_index) { $column_data{$_} = qq|<td>$form->{"${_}_$i"}</td>|; } $paid = $form->{"paid_$i"}; $ok = 1; $column_data{ndx} = qq|<td><input name=ndx class=radio type=radio value=$i $checked></td>|; $column_data{paid} = qq|<td align=right>$paid</td>|; $checked = ""; $j++; $j %= 2; print qq| <tr class=listrow$j>|; for (@column_index) { print "\n$column_data{$_}" } print qq| </tr> |; } print qq| </table> </td> </tr> <tr> <td><hr size=3 noshade></td> </tr> </table> |; for (qw(action nextsub)) { delete $form->{$_} } $form->hide_form; print qq| <br> <input type=hidden name=nextsub value=payment_selected> |; if ($ok) { print qq| <button class="submit" type="submit" name="action" value="continue">| . $locale->text('Continue') . qq|</button>|; } print qq| </form> </body> </html> |; } sub payment_selected { &{"print_$form->{formname}"}( $form->{oldform}, $form->{ndx} ); } sub print_options { if ( $form->{selectlanguage} ) { $form->{"selectlanguage"} = $form->unescape( $form->{"selectlanguage"} ); $form->{"selectlanguage"} =~ s/ selected//; $form->{"selectlanguage"} =~ s/(<option value="\Q$form->{language_code}\E")/$1 selected/; $lang = qq|<select name=language_code>$form->{selectlanguage}</select> <input type=hidden name=selectlanguage value="| . $form->escape( $form->{selectlanguage}, 1 ) . qq|">|; } $form->{selectformname} = $form->unescape( $form->{selectformname} ); $form->{selectformname} =~ s/ selected//; $form->{selectformname} =~ s/(<option value="\Q$form->{formname}\E")/$1 selected/; $type = qq|<select name=formname>$form->{selectformname}</select> <input type=hidden name=selectformname value="| . $form->escape( $form->{selectformname}, 1 ) . qq|">|; $media = qq|<select name=media> <option value="screen">| . $locale->text('Screen'); $form->{selectformat} = qq|<option value="html">html\n|; if ( %{LedgerSMB::Sysconfig::printer} && ${LedgerSMB::Sysconfig::latex} ) { for ( sort keys %{LedgerSMB::Sysconfig::printer} ) { $media .= qq| <option value="$_">$_|; } } if ( ${LedgerSMB::Sysconfig::latex} ) { $form->{selectformat} .= qq| <option value="postscript">| . $locale->text('Postscript') . qq| <option value="pdf">| . $locale->text('PDF'); $media .= qq|<option value="queue">| . $locale->text('Queue'); } $format = qq|<select name=format>$form->{selectformat}</select>|; $format =~ s/(<option value="\Q$form->{format}\E")/$1 selected/; $format .= qq| <input type=hidden name=selectformat value="| . $form->escape( $form->{selectformat}, 1 ) . qq|">|; $media .= qq|</select>|; $media =~ s/(<option value="\Q$form->{media}\E")/$1 selected/; print qq| <table width=100%> <tr> <td>$type</td> <td>$lang</td> <td>$format</td> <td>$media</td> <td align=right width=90%> |; if ( $form->{printed} =~ /$form->{formname}/ ) { print $locale->text('Printed') . qq|<br>|; } if ( $form->{recurring} ) { print $locale->text('Scheduled'); } print qq| </td> </tr> </table> |; } sub print_and_post { $form->error( $locale->text('Select postscript or PDF!') ) if $form->{format} !~ /(postscript|pdf)/; $form->error( $locale->text('Select a Printer!') ) if $form->{media} eq 'screen'; $form->{printandpost} = 1; $form->{display_form} = "post"; &print; }