- #=====================================================================
- # 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} ) {
- &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->{'media'});
- }
- 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->{media});
- }
- 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;
- }
|