X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=sql-ledger%2Fbin%2Fmozilla%2Far.pl;h=8f98981e598264932dd2886511481354ef6aed06;hp=341c0380c316bc9f77240bc818cb80041b967e83;hb=32306b5f8ffe4ce594409aa6e89626740b225a39;hpb=52072fcd26f2faf57923f598c358e7f47c4e2643 diff --git a/sql-ledger/bin/mozilla/ar.pl b/sql-ledger/bin/mozilla/ar.pl index 341c0380c..8f98981e5 100644 --- a/sql-ledger/bin/mozilla/ar.pl +++ b/sql-ledger/bin/mozilla/ar.pl @@ -1,11 +1,12 @@ #===================================================================== # SQL-Ledger Accounting -# Copyright (c) 2001 +# Copyright (c) 2000 # # Author: Dieter Simader # Email: dsimader@sql-ledger.org # Web: http://www.sql-ledger.org # +# Contributors: # # 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 @@ -21,7 +22,7 @@ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #====================================================================== # -# Accounts Receivables +# Accounts Receivable # #====================================================================== @@ -31,6 +32,7 @@ use SL::IS; use SL::PE; require "$form->{path}/arap.pl"; +require "$form->{path}/arapprn.pl"; 1; # end of main @@ -67,7 +69,7 @@ require "$form->{path}/arap.pl"; sub add { $form->{title} = "Add"; - $form->{callback} = "$form->{script}?action=add&path=$form->{path}&login=$form->{login}&password=$form->{password}" unless $form->{callback}; + $form->{callback} = "$form->{script}?action=add&path=$form->{path}&login=$form->{login}&sessionid=$form->{sessionid}" unless $form->{callback}; &create_links; &display_form; @@ -97,14 +99,11 @@ sub create_links { $form->create_links("AR", \%myconfig, "customer"); $duedate = $form->{duedate}; - - $taxincluded = $form->{taxincluded}; - - IS->get_customer(\%myconfig, \%$form); - - $form->{duedate} = $duedate; - $form->{oldcustomer} = "$form->{customer}--$form->{customer_id}"; + $form->{formname} = "transaction"; + $form->{format} = "postscript" if $myconfig{printer}; + $form->{media} = $myconfig{printer}; + # currencies @curr = split /:/, $form->{currencies}; chomp $curr[0]; @@ -112,21 +111,56 @@ sub create_links { map { $form->{selectcurrency} .= "$_\n" } @curr; + IS->get_customer(\%myconfig, \%$form); + + $form->{duedate} = $duedate if $duedate; + $form->{notes} = $form->{intnotes} if !$form->{id}; + + $form->{oldcustomer} = "$form->{customer}--$form->{customer_id}"; + $form->{oldtransdate} = $form->{transdate}; + # customers if (@{ $form->{all_customer} }) { $form->{customer} = "$form->{customer}--$form->{customer_id}"; - map { $form->{selectcustomer} .= "$_->{name}--$_->{id}\n" } (@{ $form->{all_customer} }); + map { $form->{selectcustomer} .= qq|$_->{name}\n| } (@{ $form->{all_customer} }); } + # departments + if (@{ $form->{all_departments} }) { + $form->{selectdepartment} = "\n"; + $form->{department} = "$form->{department}--$form->{department_id}"; + + map { $form->{selectdepartment} .= qq|$_->{description}\n| } (@{ $form->{all_departments} }); + } + + $form->{employee} = "$form->{employee}--$form->{employee_id}"; + # sales staff + if (@{ $form->{all_employees} }) { + $form->{selectemployee} = ""; + map { $form->{selectemployee} .= qq|$_->{name}\n| } (@{ $form->{all_employees} }); + } + + # projects + if (@{ $form->{all_projects} }) { + $form->{selectprojectnumber} = "\n"; + map { $form->{selectprojectnumber} .= qq|$_->{projectnumber}\n| } (@{ $form->{all_projects} }); + } + + if (@{ $form->{all_languages} }) { + $form->{selectlanguage} = "\n"; + map { $form->{selectlanguage} .= qq|$_->{description}\n| } @{ $form->{all_languages} }; + } + # forex $form->{forex} = $form->{exchangerate}; $exchangerate = ($form->{exchangerate}) ? $form->{exchangerate} : 1; - + foreach $key (keys %{ $form->{AR_links} }) { foreach $ref (@{ $form->{AR_links}{$key} }) { if ($key eq 'AR_tax') { $form->{"selectAR_tax_$ref->{accno}"} = "$ref->{accno}--$ref->{description}\n"; + $form->{"calctax_$ref->{accno}"} = 1; next; } $form->{"select$key"} .= "$ref->{accno}--$ref->{description}\n"; @@ -140,6 +174,7 @@ sub create_links { $form->{"paid_$i"} = $form->{acc_trans}{$key}->[$i-1]->{amount} * -1; $form->{"datepaid_$i"} = $form->{acc_trans}{$key}->[$i-1]->{transdate}; $form->{"source_$i"} = $form->{acc_trans}{$key}->[$i-1]->{source}; + $form->{"memo_$i"} = $form->{acc_trans}{$key}->[$i-1]->{memo}; $form->{"forex_$i"} = $form->{"exchangerate_$i"} = $form->{acc_trans}{$key}->[$i-1]->{exchangerate}; @@ -150,18 +185,24 @@ sub create_links { $akey =~ s/AR_//; if ($key eq "AR_tax") { - $form->{"${key}_$form->{acc_trans}{$key}->[$i-1]->{accno}"} = "$form->{acc_trans}{$key}->[$i-1]->{accno}--$form->{acc_trans}{$key}->[$i-1]->{description}"; $form->{"${akey}_$form->{acc_trans}{$key}->[$i-1]->{accno}"} = $form->round_amount($form->{acc_trans}{$key}->[$i-1]->{amount} / $exchangerate, 2); - $totaltax += $form->{"${akey}_$form->{acc_trans}{$key}->[$i-1]->{accno}"}; + + if ($form->{"$form->{acc_trans}{$key}->[$i-1]->{accno}_rate"} > 0) { + $totaltax += $form->{"${akey}_$form->{acc_trans}{$key}->[$i-1]->{accno}"}; + $taxrate += $form->{"$form->{acc_trans}{$key}->[$i-1]->{accno}_rate"}; + } else { + $totalwithholding += $form->{"${akey}_$form->{acc_trans}{$key}->[$i-1]->{accno}"}; + $withholdingrate += $form->{"$form->{acc_trans}{$key}->[$i-1]->{accno}_rate"}; + } + } else { $form->{"${akey}_$i"} = $form->round_amount($form->{acc_trans}{$key}->[$i-1]->{amount} / $exchangerate, 2); if ($akey eq 'amount') { $form->{rowcount}++; $totalamount += $form->{"${akey}_$i"}; - $form->{"oldprojectnumber_$i"} = $form->{"projectnumber_$i"} = "$form->{acc_trans}{$key}->[$i-1]->{projectnumber}"; - $form->{"project_id_$i"} = "$form->{acc_trans}{$key}->[$i-1]->{project_id}"; + $form->{"projectnumber_$i"} = "$form->{acc_trans}{$key}->[$i-1]->{projectnumber}--$form->{acc_trans}{$key}->[$i-1]->{project_id}"; } $form->{"${key}_$i"} = "$form->{acc_trans}{$key}->[$i-1]->{accno}--$form->{acc_trans}{$key}->[$i-1]->{description}"; } @@ -169,26 +210,54 @@ sub create_links { } } - $form->{taxincluded} = $taxincluded if ($form->{id}); $form->{paidaccounts} = 1 if not defined $form->{paidaccounts}; if ($form->{taxincluded} && $totalamount) { - # add tax to amounts and invtotal + # add tax to individual amounts for $i (1 .. $form->{rowcount}) { - $taxamount = $totaltax * $form->{"amount_$i"} / $totalamount; + $taxamount = ($totaltax + $totalwithholding) * $form->{"amount_$i"} / $totalamount; $tax = $form->round_amount($taxamount, 2); $diff += ($taxamount - $tax); $form->{"amount_$i"} += $tax; } $form->{amount_1} += $form->round_amount($diff, 2); } + + # check if calculated is equal to stored + # taxincluded is terrible to calculate + # this works only if all taxes are checked + foreach $item (split / /, $form->{taxaccounts}) { + if ($form->{taxincluded}) { + if ($form->{"${item}_rate"} > 0) { + if ($taxrate) { + $taxamount = $form->round_amount(($totalamount + $totaltax + $totalwithholding) * $taxrate / (1 + $taxrate), 2) * $form->{"${item}_rate"} / $taxrate; + } + } else { + if ($withholdingrate) { + $taxamount = $form->round_amount(($totalamount + $totaltax + $totalwithholding) * $withholdingrate / (1 - $withholdingrate), 2) * $form->{"${item}_rate"} / $withholdingrate; + } + } + } else { + $taxamount = $totalamount * $form->{"${item}_rate"}; + } + $taxamount = $form->round_amount($taxamount, 2); + + $form->{"calctax_$item"} = 0; + if ($form->{"tax_$item"} == $taxamount) { + $form->{"calctax_$item"} = 1; + } + } - $form->{invtotal} = $totalamount + $totaltax; + $form->{invtotal} = $totalamount + $totaltax + $totalwithholding; $form->{rowcount}++ if $form->{id}; $form->{AR} = $form->{AR_1}; + $form->{rowcount} = 1 unless $form->{AR_amount_1}; - $form->{locked} = ($form->datetonum($form->{transdate}, \%myconfig) <= $form->datetonum($form->{closedto}, \%myconfig)); + $form->{locked} = ($form->{revtrans}) ? '1' : ($form->datetonum($form->{transdate}, \%myconfig) <= $form->datetonum($form->{closedto}, \%myconfig)); + + # readonly + $form->{readonly} = 1 if $myconfig{acs} =~ /AR--Add Transaction/; } @@ -196,37 +265,42 @@ sub create_links { sub form_header { $title = $form->{title}; - $form->{title} = $locale->text("$title Accounts Receivables Transaction"); + $form->{title} = $locale->text("$title AR Transaction"); $form->{taxincluded} = ($form->{taxincluded}) ? "checked" : ""; -# $locale->text('Add Accounts Receivables Transaction') -# $locale->text('Edit Accounts Receivables Transaction') +# $locale->text('Add AR Transaction') +# $locale->text('Edit AR Transaction') # set option selected - foreach $item (qw(AR customer currency)) { + foreach $item (qw(AR currency)) { $form->{"select$item"} =~ s/ selected//; - $form->{"select$item"} =~ s/option>\Q$form->{$item}\E/option selected>$form->{$item}/; + $form->{"select$item"} =~ s/\Q$form->{$item}\E/$form->{$item}/; } + foreach $item (qw(customer department employee)) { + $form->{"select$item"} = $form->unescape($form->{"select$item"}); + $form->{"select$item"} =~ s/ selected//; + $form->{"select$item"} =~ s/({selectprojectnumber} = $form->unescape($form->{selectprojectnumber}); + # format amounts $form->{exchangerate} = $form->format_amount(\%myconfig, $form->{exchangerate}); - $form->{creditlimit} = $form->format_amount(\%myconfig, $form->{creditlimit}, 0, "0"); - $form->{creditremaining} = $form->format_amount(\%myconfig, $form->{creditremaining}, 0, "0"); - $exchangerate = qq| {forex}> |; if ($form->{currency} ne $form->{defaultcurrency}) { if ($form->{forex}) { $exchangerate .= qq| - |.$locale->text('Exchangerate').qq| + |.$locale->text('Exchange Rate').qq| {exchangerate}>$form->{exchangerate} |; } else { $exchangerate .= qq| - |.$locale->text('Exchangerate').qq| + |.$locale->text('Exchange Rate').qq| {exchangerate}> |; } @@ -248,26 +322,60 @@ sub form_header { } $notes = qq|$form->{notes}|; + $department = qq| + + |.$locale->text('Department').qq| + $form->{selectdepartment} + + + +| if $form->{selectdepartment}; - $form->header; - - $n = ($form->{creditremaining} =~ /-/) ? "0" : "1"; + + $n = ($form->{creditremaining} < 0) ? "0" : "1"; $customer = ($form->{selectcustomer}) ? qq|$form->{selectcustomer}| : qq||; - + + $employee = qq| + +|; + + $employee = qq| + + |.$locale->text('Salesperson').qq| + $form->{selectemployee} + + +| if $form->{selectemployee}; + + $form->header; + print qq| {script}> {id}> + + + + + + + + {sort}> + {closedto}> {locked}> + +{oldtransdate}> + + - + $form->{title} @@ -280,7 +388,7 @@ sub form_header { |.$locale->text('Customer').qq| $customer - + {terms}> @@ -293,14 +401,13 @@ sub form_header { |.$locale->text('Credit Limit').qq| $form->{creditlimit} |.$locale->text('Remaining').qq| - $form->{creditremaining} + |.$form->format_amount(\%myconfig, $form->{creditremaining}, 0, "0").qq| {creditlimit}> {creditremaining}> - $taxincluded |.$locale->text('Currency').qq| $form->{selectcurrency} @@ -310,17 +417,20 @@ sub form_header { {fxloss_accno}> $exchangerate + $department + $taxincluded + $employee |.$locale->text('Invoice Number').qq| - + |.$locale->text('Order Number').qq| - + |.$locale->text('Invoice Date').qq| @@ -341,45 +451,52 @@ sub form_header { + {rowcount}> |; $amount = $locale->text('Amount'); - $project = $locale->text('Project'); for $i (1 .. $form->{rowcount}) { + + $selectAR_amount = $form->{selectAR_amount}; + $selectAR_amount =~ s/option>\Q$form->{"AR_amount_$i"}\E/option selected>$form->{"AR_amount_$i"}/; - $form->{"selectAR_amount"} =~ s/ selected//; - $form->{"selectAR_amount"} =~ s/option>\Q$form->{"AR_amount_$i"}\E/option selected>$form->{"AR_amount_$i"}/; + $selectprojectnumber = $form->{selectprojectnumber}; + $selectprojectnumber =~ s/({"amount_$i"} = $form->format_amount(\%myconfig, $form->{"amount_$i"}, 2); + $project = qq| + $selectprojectnumber +| if $form->{selectprojectnumber}; + print qq| $amount {"amount_$i"}> - $project - - {"project_id_$i"}> - - $form->{"selectAR_amount"} + + $selectAR_amount + $project |; $amount = ""; - $project = ""; } + $taxlabel = ($form->{taxincluded}) ? $locale->text('Tax Included') : $locale->text('Tax'); foreach $item (split / /, $form->{taxaccounts}) { + $form->{"calctax_$item"} = ($form->{"calctax_$item"}) ? "checked" : ""; + $form->{"tax_$item"} = $form->format_amount(\%myconfig, $form->{"tax_$item"}, 2); print qq| $taxlabel {"tax_$item"}> - + {"calctax_$item"}> $form->{"selectAR_tax_$item"} @@ -396,18 +513,18 @@ sub form_header { |.$locale->text('Total').qq| $form->{invtotal} + {oldinvtotal}> {oldtotalpaid}> - $form->{selectAR} - + |.$locale->text('Notes').qq| $notes @@ -417,16 +534,15 @@ sub form_header { - - |.$locale->text('Payments').qq| + + |.$locale->text('Payments').qq| |; - if ($form->{currency} eq $form->{defaultcurrency}) { - @column_index = qw(datepaid source paid AR_paid); + @column_index = qw(datepaid source memo paid AR_paid); } else { - @column_index = qw(datepaid source paid exchangerate AR_paid); + @column_index = qw(datepaid source memo paid exchangerate AR_paid); } $column_data{datepaid} = "".$locale->text('Date').""; @@ -434,6 +550,7 @@ sub form_header { $column_data{exchangerate} = "".$locale->text('Exch').""; $column_data{AR_paid} = "".$locale->text('Account').""; $column_data{source} = "".$locale->text('Source').""; + $column_data{memo} = "".$locale->text('Memo').""; print " @@ -443,6 +560,7 @@ sub form_header { "; + $form->{paidaccounts}++ if ($form->{"paid_$form->{paidaccounts}"}); for $i (1 .. $form->{paidaccounts}) { print " @@ -469,13 +587,14 @@ sub form_header { {"forex_$i"}> |; - $column_data{"paid_$i"} = qq|{"paid_$i"}>|; - $column_data{"AR_paid_$i"} = qq|$form->{"selectAR_paid_$i"}|; - $column_data{"exchangerate_$i"} = qq|$exchangerate|; - $column_data{"datepaid_$i"} = qq|{"datepaid_$i"}>|; - $column_data{"source_$i"} = qq||; + $column_data{paid} = qq|{"paid_$i"}>|; + $column_data{AR_paid} = qq|$form->{"selectAR_paid_$i"}|; + $column_data{exchangerate} = qq|$exchangerate|; + $column_data{datepaid} = qq|{"datepaid_$i"}>|; + $column_data{source} = qq||; + $column_data{memo} = qq||; - map { print qq|$column_data{"${_}_$i"}\n| } @column_index; + map { print qq|$column_data{$_}\n| } @column_index; print " @@ -500,13 +619,15 @@ sub form_header { sub form_footer { + &print_options; + print qq| {path}> {login}> -{password}> +{sessionid}> |; @@ -514,33 +635,40 @@ sub form_footer { $transdate = $form->datetonum($form->{transdate}, \%myconfig); $closedto = $form->datetonum($form->{closedto}, \%myconfig); - if ($form->{id}) { + if (! $form->{readonly}) { + if ($form->{id}) { print qq| |; - if (!$form->{revtrans}) { if (!$form->{locked}) { print qq| + + |; } - } - if ($transdate > $closedto) { print qq| |; - } - } else { - if ($transdate > $closedto) { - print qq| - |; + } else { + if ($transdate > $closedto) { + print qq| + + + |; + } } } + if ($form->{menubar}) { + require "$form->{path}/menu.pl"; + &menubar; + } + print " @@ -560,9 +688,9 @@ sub update { $form->{invtotal} = 0; - map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) } qw(exchangerate creditlimit creditremaining); + map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) } qw(exchangerate); - @flds = qw(amount AR_amount projectnumber oldprojectnumber project_id); + @flds = qw(amount AR_amount projectnumber); $count = 0; @a = (); for $i (1 .. $form->{rowcount}) { @@ -584,33 +712,72 @@ sub update { $form->{exchangerate} = $exchangerate if ($form->{forex} = ($exchangerate = $form->check_exchangerate(\%myconfig, $form->{currency}, $form->{transdate}, 'buy'))); - $form->{invdate} = $form->{transdate}; - &check_name(customer); + if (&check_name(customer)) { + $form->{notes} = $form->{intnotes} unless $form->{id}; + } - &check_project; + if ($form->{transdate} ne $form->{oldtransdate}) { + $form->{duedate} = $form->current_date(\%myconfig, $form->{transdate}, $form->{terms} * 1); + $form->{oldtransdate} = $form->{transdate}; + } + TAXCALC: # recalculate taxes + + @taxaccounts = split / /, $form->{taxaccounts}; + + map { $form->{"tax_$_"} = $form->parse_amount(\%myconfig, $form->{"tax_$_"}) } @taxaccounts; + if ($form->{taxincluded}) { $taxrate = 0; + $withholdingrate = 0; + + foreach $item (@taxaccounts) { + $form->{"calctax_$item"} = 1 if $form->{calctax}; + + if ($form->{"calctax_$item"}) { + if ($form->{"${item}_rate"} > 0) { + $taxrate += $form->{"${item}_rate"}; + } else { + $withholdingrate += $form->{"${item}_rate"}; + } + } + } + + foreach $item (@taxaccounts) { - map { $taxrate += $form->{"${_}_rate"} } split / /, $form->{taxaccounts}; + if ($form->{"calctax_$item"}) { + if ($form->{"${item}_rate"} > 0) { + if ($taxrate) { + $amount = $form->round_amount($form->{invtotal} * $taxrate / (1 + $taxrate), 2) * $form->{"${item}_rate"} / $taxrate; + $form->{"tax_$item"} = $form->round_amount($amount, 2); + $taxdiff += ($amount - $form->{"tax_$item"}); + } + } else { + if ($withholdingrate) { + $amount = $form->round_amount($form->{invtotal} * $withholdingrate / (1 - $withholdingrate), 2) * $form->{"${item}_rate"} / $withholdingrate; + $form->{"tax_$item"} = $form->round_amount($amount, 2); + $taxdiff += ($amount - $form->{"tax_$item"}); + } + } - foreach $item (split / /, $form->{taxaccounts}) { - $amount = ($form->{invtotal} * (1 - 1 / (1 + $taxrate)) * $form->{"${item}_rate"} / $taxrate) if $taxrate; - $form->{"tax_$item"} = $form->round_amount($amount, 2); - $taxdiff += ($amount - $form->{"tax_$item"}); - if (abs $taxdiff >= 0.005) { - $form->{"tax_$item"} += $form->round_amount($taxdiff, 2); - $taxdiff = 0; + if (abs($taxdiff) >= 0.005) { + $form->{"tax_$item"} += $form->round_amount($taxdiff, 2); + $taxdiff = 0; + } } $form->{"selectAR_tax_$item"} = qq|$item--$form->{"${item}_description"}|; $totaltax += $form->{"tax_$item"}; } } else { - foreach $item (split / /, $form->{taxaccounts}) { - $form->{"tax_$item"} = $form->round_amount($form->{invtotal} * $form->{"${item}_rate"}, 2); + foreach $item (@taxaccounts) { + $form->{"calctax_$item"} = 1 if $form->{calctax}; + + if ($form->{"calctax_$item"}) { + $form->{"tax_$item"} = $form->round_amount($form->{invtotal} * $form->{"${item}_rate"}, 2); + } $form->{"selectAR_tax_$item"} = qq|$item--$form->{"${item}_description"}|; $totaltax += $form->{"tax_$item"}; } @@ -640,7 +807,6 @@ TAXCALC: sub post { # check if there is an invoice number, invoice and due date - $form->isblank("invnumber", $locale->text('Invoice Number missing!')); $form->isblank("transdate", $locale->text('Invoice Date missing!')); $form->isblank("duedate", $locale->text('Due Date missing!')); $form->isblank("customer", $locale->text('Customer missing!')); @@ -650,7 +816,7 @@ sub post { $form->error($locale->text('Cannot post transaction for a closed period!')) if ($transdate <= $closedto); - $form->isblank("exchangerate", $locale->text('Exchangerate missing!')) if ($form->{currency} ne $form->{defaultcurrency}); + $form->isblank("exchangerate", $locale->text('Exchange rate missing!')) if ($form->{currency} ne $form->{defaultcurrency}); for $i (1 .. $form->{paidaccounts}) { if ($form->{"paid_$i"}) { @@ -662,7 +828,7 @@ sub post { if ($form->{currency} ne $form->{defaultcurrency}) { $form->{"exchangerate_$i"} = $form->{exchangerate} if ($transdate == $datepaid); - $form->isblank("exchangerate_$i", $locale->text('Exchangerate for payment missing!')); + $form->isblank("exchangerate_$i", $locale->text('Exchange rate for payment missing!')); } } } @@ -674,6 +840,8 @@ sub post { exit; } + $form->{invnumber} = $form->update_defaults(\%myconfig, "sinumber") unless $form->{invnumber}; + $form->{id} = 0 if $form->{postasnew}; $form->redirect($locale->text('Transaction posted!')) if (AR->post_transaction(\%myconfig, \%$form)); @@ -696,15 +864,15 @@ sub delete { $form->header; + delete $form->{header}; + print qq| {script}> |; - foreach $key (keys %$form) { - print qq|\n|; - } + $form->hide_form(); print qq| $form->{title} @@ -724,7 +892,7 @@ sub delete { sub yes { - $form->redirect($locale->text('Transaction deleted!')) if (AR->delete_transaction(\%myconfig, \%$form)); + $form->redirect($locale->text('Transaction deleted!')) if (AR->delete_transaction(\%myconfig, \%$form, $spool)); $form->error($locale->text('Cannot delete transaction!')); } @@ -732,17 +900,85 @@ sub yes { sub search { - # setup customer selection - $form->all_vc(\%myconfig, "customer"); - + $form->create_links("AR", \%myconfig, "customer"); + + $form->{selectAR} = "\n"; + map { $form->{selectAR} .= "$_->{accno}--$_->{description}\n" } @{ $form->{AR_links}{AR} }; + if (@{ $form->{all_customer} }) { - map { $customer .= "$_->{name}--$_->{id}\n" } @{ $form->{all_customer} }; + map { $customer .= qq|$_->{name}\n| } @{ $form->{all_customer} }; $customer = qq|\n$customer|; } else { $customer = qq||; } - + + # departments + if (@{ $form->{all_departments} }) { + $form->{selectdepartment} = "\n"; + + map { $form->{selectdepartment} .= qq|$_->{description}\n| } (@{ $form->{all_departments} }); + } + + $department = qq| + + |.$locale->text('Department').qq| + $form->{selectdepartment} + +| if $form->{selectdepartment}; + + $form->{title} = $locale->text('AR Transactions'); + + $invnumber = qq| + + |.$locale->text('Invoice Number').qq| + + + + |.$locale->text('Order Number').qq| + + + + |.$locale->text('Notes').qq| + + +|; + + $openclosed = qq| + + + |.$locale->text('Open').qq| + + |.$locale->text('Closed').qq| + +|; + + if ($form->{outstanding}) { + $form->{title} = $locale->text('AR Outstanding'); + $invnumber = ""; + $openclosed = ""; + } + + # accounting years + $form->{selectaccountingyear} = "\n"; + map { $form->{selectaccountingyear} .= qq|$_\n| } @{ $form->{all_years} }; + $form->{selectaccountingmonth} = "\n"; + map { $form->{selectaccountingmonth} .= qq||.$locale->text($form->{all_month}{$_}).qq|\n| } sort keys %{ $form->{all_month} }; + + $selectfrom = qq| + + |.$locale->text('Period').qq| + + $form->{selectaccountingmonth} + $form->{selectaccountingyear} + |.$locale->text('Current').qq| + |.$locale->text('Month').qq| + |.$locale->text('Quarter').qq| + |.$locale->text('Year').qq| + + +|; + $form->header; @@ -751,35 +987,37 @@ sub search { {script}> + +{outstanding}> + $form->{title} + + |.$locale->text('Account').qq| + $form->{selectAR} + |.$locale->text('Customer').qq| $customer + $department + $invnumber - |.$locale->text('Invoice Number').qq| - - - - |.$locale->text('Order Number').qq| - - - - |.$locale->text('Notes').qq| - + |.$locale->text('Ship via').qq| + |.$locale->text('From').qq| - |.$locale->text('to').qq| + |.$locale->text('To').qq| + $selectfrom @@ -790,12 +1028,7 @@ sub search { |.$locale->text('Include in Report').qq| - - - |.$locale->text('Open').qq| - - |.$locale->text('Closed').qq| - + $openclosed |.$locale->text('ID').qq| @@ -809,12 +1042,20 @@ sub search { |.$locale->text('Customer').qq| + + |.$locale->text('Salesperson').qq| + + |.$locale->text('Manager').qq| + + |.$locale->text('Amount').qq| |.$locale->text('Tax').qq| |.$locale->text('Total').qq| + + |.$locale->text('Currency').qq| @@ -826,12 +1067,14 @@ sub search { |.$locale->text('Amount Due').qq| - + |.$locale->text('Notes').qq| - - |.$locale->text('Salesperson').qq| + + |.$locale->text('Till').qq| + |.$locale->text('Shipping Point').qq| + |.$locale->text('Ship via').qq| @@ -853,7 +1096,7 @@ sub search { {path}> {login}> -{password}> +{sessionid}> @@ -869,33 +1112,57 @@ sub search { sub ar_transactions { - $form->{customer} = $form->unescape($form->{customer}); - ($form->{customer}, $form->{customer_id}) = split(/--/, $form->{customer}); - + if ($form->{customer}) { + $form->{customer} = $form->unescape($form->{customer}); + ($form->{customer}, $form->{customer_id}) = split(/--/, $form->{customer}); + } + AR->ar_transactions(\%myconfig, \%$form); - $callback = "$form->{script}?action=ar_transactions&path=$form->{path}&login=$form->{login}&password=$form->{password}"; - $href = $callback; + $href = "$form->{script}?action=ar_transactions&direction=$form->{direction}&oldsort=$form->{oldsort}&till=$form->{till}&outstanding=$form->{outstanding}&path=$form->{path}&login=$form->{login}&sessionid=$form->{sessionid}"; + + $href .= "&title=".$form->escape($form->{title}); + + $form->sort_order(); + + $callback = "$form->{script}?action=ar_transactions&direction=$form->{direction}&oldsort=$form->{oldsort}&till=$form->{till}&outstanding=$form->{outstanding}&path=$form->{path}&login=$form->{login}&sessionid=$form->{sessionid}"; + + $callback .= "&title=".$form->escape($form->{title},1); + if ($form->{AR}) { + $callback .= "&AR=".$form->escape($form->{AR},1); + $href .= "&AR=".$form->escape($form->{AR}); + $form->{AR} =~ s/--/ /; + $option = $locale->text('Account')." : $form->{AR}"; + } + if ($form->{customer}) { - $callback .= "&customer=".$form->escape($form->{customer}); - $href .= "&customer=".$form->escape($form->{customer}); - $option = $locale->text('Customer')." : $form->{customer}"; + $callback .= "&customer=".$form->escape($form->{customer},1)."--$form->{customer_id}"; + $href .= "&customer=".$form->escape($form->{customer})."--$form->{customer_id}"; + $option .= "\n" if ($option); + $option .= $locale->text('Customer')." : $form->{customer}"; + } + if ($form->{department}) { + $callback .= "&department=".$form->escape($form->{department},1); + $href .= "&department=".$form->escape($form->{department}); + ($department) = split /--/, $form->{department}; + $option .= "\n" if ($option); + $option .= $locale->text('Department')." : $department"; } if ($form->{invnumber}) { - $callback .= "&invnumber=$form->{invnumber}"; + $callback .= "&invnumber=".$form->escape($form->{invnumber},1); $href .= "&invnumber=".$form->escape($form->{invnumber}); $option .= "\n" if ($option); $option .= $locale->text('Invoice Number')." : $form->{invnumber}"; } if ($form->{ordnumber}) { - $callback .= "&ordnumber=$form->{ordnumber}"; + $callback .= "&ordnumber=".$form->escape($form->{ordnumber},1); $href .= "&ordnumber=".$form->escape($form->{ordnumber}); $option .= "\n" if ($option); $option .= $locale->text('Order Number')." : $form->{ordnumber}"; } if ($form->{notes}) { - $callback .= "¬es=$form->{notes}"; + $callback .= "¬es=".$form->escape($form->{notes},1); $href .= "¬es=".$form->escape($form->{notes}); $option .= "\n" if $option; $option .= $locale->text('Notes')." : $form->{notes}"; @@ -911,7 +1178,7 @@ sub ar_transactions { $callback .= "&transdateto=$form->{transdateto}"; $href .= "&transdateto=$form->{transdateto}"; $option .= "\n" if ($option); - $option .= $locale->text('to')." ".$locale->date(\%myconfig, $form->{transdateto}, 1); + $option .= $locale->text('To')." ".$locale->date(\%myconfig, $form->{transdateto}, 1); } if ($form->{open}) { $callback .= "&open=$form->{open}"; @@ -926,25 +1193,31 @@ sub ar_transactions { $option .= $locale->text('Closed'); } - @columns = $form->sort_columns(qw(transdate id invnumber ordnumber name netamount tax amount paid datepaid due duedate notes employee shippingpoint)); + @columns = $form->sort_columns(qw(transdate id invnumber ordnumber name netamount tax amount paid due curr datepaid duedate notes till employee manager shippingpoint shipvia)); foreach $item (@columns) { if ($form->{"l_$item"} eq "Y") { push @column_index, $item; + if ($form->{l_curr} && $item =~ /(amount|tax|paid|due)/) { + push @column_index, "fx_$item"; + } + # add column to href and callback $callback .= "&l_$item=Y"; $href .= "&l_$item=Y"; } } + + if ($form->{l_subtotal} eq 'Y') { $callback .= "&l_subtotal=Y"; $href .= "&l_subtotal=Y"; } - $column_header{id} = "".$locale->text('ID').""; + $column_header{id} = "".$locale->text('ID').""; $column_header{transdate} = "".$locale->text('Date').""; $column_header{duedate} = "".$locale->text('Due Date').""; $column_header{invnumber} = "".$locale->text('Invoice').""; @@ -957,12 +1230,17 @@ sub ar_transactions { $column_header{datepaid} = "" . $locale->text('Date Paid') . ""; $column_header{due} = "" . $locale->text('Amount Due') . ""; $column_header{notes} = "".$locale->text('Notes').""; - $column_header{employee} = "".$locale->text('Salesperson').""; - - $column_header{shippingpoint} = "" . $locale->text('Ship via') . ""; + $column_header{employee} = "".$locale->text('Salesperson').""; + $column_header{manager} = "".$locale->text('Manager').""; + $column_header{till} = "".$locale->text('Till').""; + $column_header{shippingpoint} = "" . $locale->text('Shipping Point') . ""; + $column_header{shipvia} = "" . $locale->text('Ship via') . ""; - $form->{title} = $locale->text('AR Transactions'); + $column_header{curr} = "" . $locale->text('Curr') . ""; + map { $column_header{"fx_$_"} = " " } qw(amount tax netamount paid due); + + $form->{title} = ($form->{title}) ? $form->{title} : $locale->text('AR Transactions'); $form->header; @@ -996,35 +1274,55 @@ sub ar_transactions { # escape callback for href $callback = $form->escape($callback); - if (@{ $form->{AR} }) { - $sameitem = $form->{AR}->[0]->{$form->{sort}}; + # flip direction + $direction = ($form->{direction} eq 'ASC') ? "ASC" : "DESC"; + $href =~ s/&direction=(\w+)&/&direction=$direction&/; + + if (@{ $form->{transactions} }) { + $sameitem = $form->{transactions}->[0]->{$form->{sort}}; } # sums and tax on reports by Antonio Gallardo # - foreach $ar (@{ $form->{AR} }) { + foreach $ar (@{ $form->{transactions} }) { if ($form->{l_subtotal} eq 'Y') { if ($sameitem ne $ar->{$form->{sort}}) { &ar_subtotal; } } + + if ($form->{l_curr}) { + map { $ar->{"fx_$_"} = $ar->{$_}/$ar->{exchangerate} } qw(netamount amount paid); + + map { $column_data{"fx_$_"} = "".$form->format_amount(\%myconfig, $ar->{"fx_$_"}, 2, " ")."" } qw(netamount amount paid); + + $column_data{fx_tax} = "".$form->format_amount(\%myconfig, $ar->{fx_amount} - $ar->{fx_netamount}, 2, " ").""; + $column_data{fx_due} = "".$form->format_amount(\%myconfig, $ar->{fx_amount} - $ar->{fx_paid}, 2, " ").""; + + $subtotalfxnetamount += $ar->{fx_netamount}; + $subtotalfxamount += $ar->{fx_amount}; + $subtotalfxpaid += $ar->{fx_paid}; + + $totalfxnetamount += $ar->{fx_netamount}; + $totalfxamount += $ar->{fx_amount}; + $totalfxpaid += $ar->{fx_paid}; + + } + + map { $column_data{$_} = "".$form->format_amount(\%myconfig, $ar->{$_}, 2, " ")."" } qw(netamount amount paid); - $column_data{netamount} = "".$form->format_amount(\%myconfig, $ar->{netamount}, 2, " ").""; $column_data{tax} = "".$form->format_amount(\%myconfig, $ar->{amount} - $ar->{netamount}, 2, " ").""; - $column_data{amount} = "".$form->format_amount(\%myconfig, $ar->{amount}, 2, " ").""; - $column_data{paid} = "".$form->format_amount(\%myconfig, $ar->{paid}, 2, " ").""; $column_data{due} = "".$form->format_amount(\%myconfig, $ar->{amount} - $ar->{paid}, 2, " ").""; + $subtotalnetamount += $ar->{netamount}; $subtotalamount += $ar->{amount}; $subtotalpaid += $ar->{paid}; - $subtotaldue += $ar->{amount} - $ar->{paid}; $totalnetamount += $ar->{netamount}; $totalamount += $ar->{amount}; $totalpaid += $ar->{paid}; - $totaldue += ($ar->{amount} - $ar->{paid}); $column_data{transdate} = "$ar->{transdate} "; $column_data{id} = "$ar->{id}"; @@ -1032,15 +1330,24 @@ sub ar_transactions { $column_data{duedate} = "$ar->{duedate} "; $module = ($ar->{invoice}) ? "is.pl" : $form->{script}; + $module = ($ar->{till}) ? "ps.pl" : $module; - $column_data{invnumber} = "{id}&path=$form->{path}&login=$form->{login}&password=$form->{password}&callback=$callback>$ar->{invnumber}"; + $column_data{invnumber} = "{id}&path=$form->{path}&login=$form->{login}&sessionid=$form->{sessionid}&callback=$callback>$ar->{invnumber}"; $column_data{ordnumber} = "$ar->{ordnumber} "; - $column_data{name} = "$ar->{name}"; + + + $name = $form->escape($ar->{name}); + $column_data{name} = "{customer_id}&sort=$form->{sort}>$ar->{name}"; + $ar->{notes} =~ s/\r\n//g; $column_data{notes} = "$ar->{notes} "; $column_data{shippingpoint} = "$ar->{shippingpoint} "; + $column_data{shipvia} = "$ar->{shipvia} "; $column_data{employee} = "$ar->{employee} "; - + $column_data{manager} = "$ar->{manager} "; + $column_data{till} = "$ar->{till} "; + $column_data{curr} = "$ar->{curr}"; + $i++; $i %= 2; print " @@ -1070,10 +1377,30 @@ sub ar_transactions { $column_data{tax} = "".$form->format_amount(\%myconfig, $totalamount - $totalnetamount, 2, " ").""; $column_data{amount} = "".$form->format_amount(\%myconfig, $totalamount, 2, " ").""; $column_data{paid} = "".$form->format_amount(\%myconfig, $totalpaid, 2, " ").""; - $column_data{due} = "".$form->format_amount(\%myconfig, $totaldue, 2, " ").""; + $column_data{due} = "".$form->format_amount(\%myconfig, $totalamount - $totalpaid, 2, " ").""; + + if ($form->{l_curr} && $form->{sort} eq 'curr' && $form->{l_subtotal}) { + $column_data{fx_netamount} = "".$form->format_amount(\%myconfig, $totalfxnetamount, 2, " ").""; + $column_data{fx_tax} = "".$form->format_amount(\%myconfig, $totalfxamount - $totalfxnetamount, 2, " ").""; + $column_data{fx_amount} = "".$form->format_amount(\%myconfig, $totalfxamount, 2, " ").""; + $column_data{fx_paid} = "".$form->format_amount(\%myconfig, $totalfxpaid, 2, " ").""; + $column_data{fx_due} = "".$form->format_amount(\%myconfig, $totalfxamount - $totalfxpaid, 2, " ").""; + } map { print "\n$column_data{$_}" } @column_index; + if ($myconfig{acs} !~ /AR--AR/) { + $i = 1; + $button{'AR--Add Transaction'}{code} = qq| |; + $button{'AR--Add Transaction'}{order} = $i++; + $button{'AR--Sales Invoice'}{code} = qq| |; + $button{'AR--Sales Invoice'}{order} = $i++; + + foreach $item (split /;/, $myconfig{acs}) { + delete $button{$item}; + } + } + print qq| @@ -1089,13 +1416,27 @@ sub ar_transactions { + +{customer_id}> + + {path}> {login}> -{password}> +{sessionid}> +|; + + if (! $form->{till}) { + foreach $item (sort { $a->{order} <=> $b->{order} } %button) { + print $item->{code}; + } + } - - + if ($form->{menubar}) { + require "$form->{path}/menu.pl"; + &menubar; + } + print qq| @@ -1112,12 +1453,22 @@ sub ar_subtotal { $column_data{tax} = "".$form->format_amount(\%myconfig, $subtotalamount - $subtotalnetamount, 2, " ").""; $column_data{amount} = "".$form->format_amount(\%myconfig, $subtotalamount, 2, " ").""; $column_data{paid} = "".$form->format_amount(\%myconfig, $subtotalpaid, 2, " ").""; - $column_data{due} = "".$form->format_amount(\%myconfig, $subtotaldue, 2, " ").""; + $column_data{due} = "".$form->format_amount(\%myconfig, $subtotalamount - $subtotalpaid, 2, " ").""; + + if ($form->{l_curr} && $form->{sort} eq 'curr' && $form->{l_subtotal}) { + $column_data{fx_tax} = "".$form->format_amount(\%myconfig, $subtotalfxamount - $subtotalfxnetamount, 2, " ").""; + $column_data{fx_amount} = "".$form->format_amount(\%myconfig, $subtotalfxamount, 2, " ").""; + $column_data{fx_paid} = "".$form->format_amount(\%myconfig, $subtotalfxpaid, 2, " ").""; + $column_data{fx_due} = "".$form->format_amount(\%myconfig, $subtotalfxmount - $subtotalfxpaid, 2, " ").""; + } $subtotalnetamount = 0; $subtotalamount = 0; $subtotalpaid = 0; - $subtotaldue = 0; + + $subtotalfxnetamount = 0; + $subtotalfxamount = 0; + $subtotalfxpaid = 0; $sameitem = $ar->{$form->{sort}};