X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=bin%2Fmozilla%2Fap.pl;h=33d2eee3fb0d2c7725e5272dec7ea8cacf36b696;hb=e09347c89ca119213c4d8ba43083653cda793399;hp=4b2b4e1bd7e03fa23a2bef7217637018fde5c351;hpb=2e07a0cdb14d031d325b20f05e916105f385ac19;p=kivitendo-erp.git diff --git a/bin/mozilla/ap.pl b/bin/mozilla/ap.pl index 4b2b4e1bd..33d2eee3f 100644 --- a/bin/mozilla/ap.pl +++ b/bin/mozilla/ap.pl @@ -31,14 +31,20 @@ # #====================================================================== +use POSIX qw(strftime); +use List::Util qw(sum); + use SL::AP; +use SL::FU; use SL::IR; use SL::IS; use SL::PE; +use SL::ReportGenerator; require "bin/mozilla/arap.pl"; require "bin/mozilla/common.pl"; require "bin/mozilla/drafts.pl"; +require "bin/mozilla/reportgenerator.pl"; 1; @@ -75,13 +81,13 @@ require "bin/mozilla/drafts.pl"; sub add { $lxdebug->enter_sub(); + $auth->assert('general_ledger'); + return $lxdebug->leave_sub() if (load_draft_maybe()); $form->{title} = "Add"; - $form->{callback} = - "$form->{script}?action=add&login=$form->{login}&password=$form->{password}" - unless $form->{callback}; + $form->{callback} = "ap.pl?action=add" unless $form->{callback}; AP->get_transdate(\%myconfig, $form); $form->{initial_transdate} = $form->{transdate}; @@ -95,6 +101,8 @@ sub add { sub edit { $lxdebug->enter_sub(); + $auth->assert('general_ledger'); + $form->{title} = "Edit"; &create_links; @@ -106,6 +114,8 @@ sub edit { sub display_form { $lxdebug->enter_sub(); + $auth->assert('general_ledger'); + &form_header; &form_footer; @@ -115,6 +125,8 @@ sub display_form { sub create_links { $lxdebug->enter_sub(); + $auth->assert('general_ledger'); + $form->create_links("AP", \%myconfig, "vendor"); $taxincluded = $form->{taxincluded}; $duedate = $form->{duedate}; @@ -170,6 +182,8 @@ sub create_links { sub form_header { $lxdebug->enter_sub(); + $auth->assert('general_ledger'); + $title = $form->{title}; $form->{title} = $locale->text("$title Accounts Payables Transaction"); @@ -209,14 +223,19 @@ sub form_header { } $readonly = ($form->{id}) ? "readonly" : ""; - $form->{radier} = - ($form->current_date(\%myconfig) eq $form->{gldate}) ? 1 : 0; - $readonly = ($form->{radier}) ? "" : $readonly; + $form->{radier} = ($form->current_date(\%myconfig) eq $form->{gldate}) ? 1 : 0; + $readonly = ($form->{radier}) ? "" : $readonly; + + $form->{forex} = $form->check_exchangerate( \%myconfig, $form->{currency}, $form->{transdate}, 'sell'); + $form->{exchangerate} = $form->{forex} if $form->{forex}; + # format amounts $form->{exchangerate} = $form->format_amount(\%myconfig, $form->{exchangerate}); - + if ($form->{exchangerate} == 0) { + $form->{exchangerate} = ""; + } $form->{creditlimit} = $form->format_amount(\%myconfig, $form->{creditlimit}, 0, "0"); $form->{creditremaining} = @@ -279,12 +298,13 @@ selectvendor } | map({ push(@old_project_ids, $form->{"project_id_$_"}) if ($form->{"project_id_$_"}); } (1..$form->{"rowcount"})); - $form->get_lists("projects" => { "key" => "ALL_PROJECTS", - "all" => 0, - "old_id" => \@old_project_ids }, - "charts" => { "key" => "ALL_CHARTS", - "transdate" => $form->{transdate} }, - "taxcharts" => "ALL_TAXCHARTS"); + $form->get_lists("projects" => { "key" => "ALL_PROJECTS", + "all" => 0, + "old_id" => \@old_project_ids }, + "charts" => { "key" => "ALL_CHARTS", + "transdate" => $form->{transdate} }, + "taxcharts" => { "key" => "ALL_TAXCHARTS", + "module" => "AP" },); map({ $_->{link_split} = [ split(/:/, $_->{link}) ]; } @{ $form->{ALL_CHARTS} }); @@ -342,12 +362,12 @@ selectvendor } | # with JavaScript Calendar $button1 = qq| - $readonly + text('button') . qq|> |; $button2 = qq| - $readonly + text('button') . qq|> |; @@ -360,12 +380,18 @@ selectvendor } | # without JavaScript Calendar $button1 = - qq| $readonly|; + qq||; $button2 = - qq| $readonly|; + qq||; } + + my $follow_up_vc = $form->{vendor}; + $follow_up_vc =~ s/--.*?//; + my $follow_up_trans_info = "$form->{invnumber} ($follow_up_vc)"; + $form->{javascript} .= qq||; $form->{javascript} .= qq||; + $form->{javascript} .= qq||; $form->header; $onload = qq|;setupDateFormat('|. $myconfig{dateformat} .qq|', '|. $locale->text("Falsches Datumsformat!") .qq|')|; @@ -381,6 +407,11 @@ selectvendor } | {locked}> + + + + + | . ($form->{saved_message} ? qq|

$form->{saved_message}

| : "") . qq| @@ -396,7 +427,7 @@ selectvendor } |
- + @@ -468,8 +499,6 @@ $jsscript . $locale->text('Amount') . qq| - - - + $tax @@ -612,7 +638,7 @@ $jsscript $column_data{AP_paid} = ""; $column_data{source} = ""; $column_data{memo} = ""; - $column_data{paid_project_id} = ""; + $column_data{paid_project_id} = ""; print " @@ -647,6 +673,9 @@ $jsscript } $form->{"exchangerate_$i"} = $form->format_amount(\%myconfig, $form->{"exchangerate_$i"}); + if ($form->{"exchangerate_$i"} == 0) { + $form->{"exchangerate_$i"} = ""; + } $exchangerate = qq| |; if ($form->{currency} ne $form->{defaultcurrency}) { @@ -670,7 +699,7 @@ $jsscript $column_data{"exchangerate_$i"} = qq||; $column_data{"datepaid_$i"} = qq||; + |; $column_data{"source_$i"} = qq||; $column_data{"memo_$i"} = @@ -725,13 +754,24 @@ $jsscript sub form_footer { $lxdebug->enter_sub(); + $auth->assert('general_ledger'); + + my $follow_ups_block; + if ($form->{id}) { + my $follow_ups = FU->follow_ups('trans_id' => $form->{id}); + + if (@{ $follow_ups} ) { + my $num_due = sum map { $_->{due} * 1 } @{ $follow_ups }; + $follow_ups_block = qq|

| . $locale->text("There are #1 unfinished follow-ups of which #2 are due.", scalar @{ $follow_ups }, $num_due) . qq|

|; + } + } + print qq| +$follow_ups_block + - -{login}> -{password}> | . $cgi->hidden('-name' => 'draft_id', '-default' => [$form->{draft_id}]) . $cgi->hidden('-name' => 'draft_description', '-default' => [$form->{draft_description}]) @@ -760,13 +800,13 @@ sub form_footer { |; } - # ToDO: - insert a global check for stornos, so that a storno is only possible a limited time after saving it - print qq| | - if ($form->{id} && !IS->has_storno(\%myconfig, $form, 'ap') && !IS->is_storno(\%myconfig, $form, 'ap') && !$form->{paid_1}); + print qq| | + if ($form->{id} && !IS->has_storno(\%myconfig, $form, 'ap') && !IS->is_storno(\%myconfig, $form, 'ap', $form->{id}) && (($total_paid == 0) || ($total_paid eq ""))); print qq| + |; } elsif (($transdate > $closedto) && !$form->{id}) { print qq| @@ -775,13 +815,12 @@ sub form_footer { } # button for saving history if($form->{id} ne "") { - print qq| |; + print qq| |; } # /button for saving history - # mark_as_paid button - if($form->{id} ne "") { - print qq||; + # mark_as_paid button + if($form->{id} ne "") { + print qq| |; } # /mark_as_paid button print " @@ -796,21 +835,29 @@ sub form_footer { sub mark_as_paid { $lxdebug->enter_sub(); - &mark_as_paid_common(\%myconfig,"ap"); + + $auth->assert('general_ledger'); + + &mark_as_paid_common(\%myconfig,"ap"); + $lxdebug->leave_sub(); } sub update { $lxdebug->enter_sub(); + $auth->assert('general_ledger'); + my $display = shift; $form->{invtotal} = 0; + delete @{ $form }{ grep { m/^tax_\d+$/ } keys %{ $form } }; + map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) } qw(exchangerate creditlimit creditremaining); - @flds = qw(amount AP_amount projectnumber oldprojectnumber project_id); + @flds = qw(amount AP_amount projectnumber oldprojectnumber project_id taxchart); $count = 0; for $i (1 .. $form->{rowcount}) { $form->{"amount_$i"} = @@ -819,17 +866,15 @@ sub update { if ($form->{"amount_$i"}) { push @a, {}; $j = $#a; - if (!$form->{"korrektur_$i"}) { - ($taxkey, $rate) = split(/--/, $form->{"taxchart_$i"}); - if ($taxkey > 1) { - if ($form->{taxincluded}) { - $form->{"tax_$i"} = $form->{"amount_$i"} / ($rate + 1) * $rate; - } else { - $form->{"tax_$i"} = $form->{"amount_$i"} * $rate; - } + ($taxkey, $rate) = split(/--/, $form->{"taxchart_$i"}); + if ($taxkey > 1) { + if ($form->{taxincluded}) { + $form->{"tax_$i"} = $form->{"amount_$i"} / ($rate + 1) * $rate; } else { - $form->{"tax_$i"} = 0; + $form->{"tax_$i"} = $form->{"amount_$i"} * $rate; } + } else { + $form->{"tax_$i"} = 0; } $form->{"tax_$i"} = $form->round_amount($form->{"tax_$i"}, 2); @@ -842,18 +887,20 @@ sub update { map { $form->{invtotal} += $form->{"amount_$_"} } (1 .. $form->{rowcount}); - $form->{exchangerate} = $exchangerate - if ( - $form->{forex} = ( - $exchangerate = - $form->check_exchangerate( - \%myconfig, $form->{currency}, $form->{transdate}, 'sell' - ))); + $form->{forex} = $form->check_exchangerate( \%myconfig, $form->{currency}, $form->{transdate}, 'sell'); + $form->{exchangerate} = $form->{forex} if $form->{forex}; $form->{invdate} = $form->{transdate}; - $save_AP = $form->{AP}; - &check_name(vendor); - $form->{AP} = $save_AP; + my %saved_variables = map +( $_ => $form->{$_} ), qw(AP AP_amount_1 taxchart_1); + + my $vendor_changed = &check_name("vendor"); + + $form->{AP} = $saved_variables{AP}; + if ($saved_variables{AP_amount_1} =~ m/.--./) { + map { $form->{$_} = $saved_variables{$_} } qw(AP_amount_1 taxchart_1); + } else { + delete $form->{taxchart_1}; + } $form->{rowcount} = $count + 1; @@ -869,13 +916,8 @@ sub update { $totalpaid += $form->{"paid_$i"}; - $form->{"exchangerate_$i"} = $exchangerate - if ( - $form->{"forex_$i"} = ( - $exchangerate = - $form->check_exchangerate( - \%myconfig, $form->{currency}, $form->{"datepaid_$i"}, 'sell' - ))); + $form->{"forex_$i"} = $form->check_exchangerate( \%myconfig, $form->{currency}, $form->{"datepaid_$i"}, 'sell'); + $form->{"exchangerate_$i"} = $form->{"forex_$i"} if $form->{"forex_$i"}; } } @@ -885,6 +927,9 @@ sub update { $form->{oldinvtotal} = $form->{invtotal}; $form->{oldtotalpaid} = $totalpaid; + # notes + $form->{notes} = $form->{intnotes} if $vendor_changed; + &display_form; $lxdebug->leave_sub(); @@ -893,6 +938,11 @@ sub update { sub post_payment { $lxdebug->enter_sub(); + + $auth->assert('general_ledger'); + + $form->{defaultcurrency} = $form->get_default_currency(\%myconfig); + for $i (1 .. $form->{paidaccounts}) { if ($form->parse_amount(\%myconfig, $form->{"paid_$i"})) { $datepaid = $form->datetonum($form->{"datepaid_$i"}, \%myconfig); @@ -900,7 +950,7 @@ sub post_payment { $form->isblank("datepaid_$i", $locale->text('Payment date missing!')); $form->error($locale->text('Cannot post payment for a closed period!')) - if ($datepaid <= $closedto); + if ($form->date_closed($form->{"datepaid_$i"}, \%myconfig)); if ($form->{currency} ne $form->{defaultcurrency}) { $form->{"exchangerate_$i"} = $form->{exchangerate} @@ -925,6 +975,8 @@ sub post_payment { sub post { $lxdebug->enter_sub(); + $auth->assert('general_ledger'); + # check if there is a vendor, invoice and due date $form->isblank("transdate", $locale->text("Invoice Date missing!")); $form->isblank("duedate", $locale->text("Due Date missing!")); @@ -932,7 +984,7 @@ sub post { $closedto = $form->datetonum($form->{closedto}, \%myconfig); $transdate = $form->datetonum($form->{transdate}, \%myconfig); - $form->error($locale->text('Cannot post transaction for a closed period!')) if ($transdate <= $closedto); + $form->error($locale->text('Cannot post transaction for a closed period!')) if ($form->date_closed($form->{"transdate"}, \%myconfig)); my $zero_amount_posting = 1; for $i (1 .. $form->{rowcount}) { @@ -955,7 +1007,7 @@ sub post { $form->isblank("datepaid_$i", $locale->text('Payment date missing!')); $form->error($locale->text('Cannot post payment for a closed period!')) - if ($datepaid <= $closedto); + if ($form->date_closed($form->{"datepaid_$i"}, \%myconfig)); if ($form->{currency} ne $form->{defaultcurrency}) { $form->{"exchangerate_$i"} = $form->{exchangerate} @@ -979,6 +1031,7 @@ sub post { $form->{AP}{amount_1} = $debitaccno; $form->{AP}{payables} = $payablesaccno; $form->{taxkey} = $taxkey; + $form->{storno} = 0; $form->{id} = 0 if $form->{postasnew}; @@ -989,7 +1042,7 @@ sub post { $form->{addition} = "POSTED"; $form->save_history($form->dbconnect(\%myconfig)); } - # /saving the history + # /saving the history remove_draft() if $form->{remove_draft}; $form->redirect($locale->text('Transaction posted!')); } @@ -1001,6 +1054,8 @@ sub post { sub post_as_new { $lxdebug->enter_sub(); + $auth->assert('general_ledger'); + $form->{postasnew} = 1; # saving the history if(!exists $form->{addition} && $form->{id} ne "") { @@ -1008,7 +1063,7 @@ sub post_as_new { $form->{addition} = "POSTED AS NEW"; $form->save_history($form->dbconnect(\%myconfig)); } - # /saving the history + # /saving the history &post; $lxdebug->leave_sub(); @@ -1017,6 +1072,8 @@ sub post_as_new { sub use_as_template { $lxdebug->enter_sub(); + $auth->assert('general_ledger'); + map { delete $form->{$_} } qw(printed emailed queued invnumber invdate deliverydate id datepaid_1 source_1 memo_1 paid_1 exchangerate_1 AP_paid_1 storno); $form->{paidaccounts} = 1; $form->{rowcount}--; @@ -1029,6 +1086,8 @@ sub use_as_template { sub delete { $lxdebug->enter_sub(); + $auth->assert('general_ledger'); + $form->{title} = $locale->text('Confirm!'); $form->header; @@ -1042,6 +1101,7 @@ sub delete { |; foreach $key (keys %$form) { + next if (($key eq 'login') || ($key eq 'password') || ('' ne ref $form->{$key})); $form->{$key} =~ s/\"/"/g; print qq|\n|; } @@ -1066,6 +1126,9 @@ sub delete { sub yes { $lxdebug->enter_sub(); + + $auth->assert('general_ledger'); + if (AP->delete_transaction(\%myconfig, \%$form, $spool)) { # saving the history if(!exists $form->{addition}) { @@ -1073,7 +1136,7 @@ sub yes { $form->{addition} = "DELETED"; $form->save_history($form->dbconnect(\%myconfig)); } - # /saving the history + # /saving the history $form->redirect($locale->text('Transaction deleted!')); } $form->error($locale->text('Cannot delete transaction!')); @@ -1084,6 +1147,8 @@ sub yes { sub search { $lxdebug->enter_sub(); + $auth->assert('general_ledger | vendor_invoice_edit'); + # setup vendor selection $form->all_vc(\%myconfig, "vendor", "AP"); @@ -1276,8 +1341,6 @@ $jsscript
{nextsub}> -{login}> -{password}> @@ -1290,359 +1353,171 @@ $jsscript $lxdebug->leave_sub(); } -sub ap_transactions { +sub create_subtotal_row { $lxdebug->enter_sub(); - $form->{vendor} = $form->unescape($form->{vendor}); - ($form->{vendor}, $form->{vendor_id}) = split(/--/, $form->{vendor}); + my ($totals, $columns, $column_alignment, $subtotal_columns, $class) = @_; - AP->ap_transactions(\%myconfig, \%$form); + my $row = { map { $_ => { 'data' => '', 'class' => $class, 'align' => $column_alignment->{$_}, } } @{ $columns } }; - $callback = - "$form->{script}?action=ap_transactions&login=$form->{login}&password=$form->{password}"; - $href = $callback; + map { $row->{$_}->{data} = $form->format_amount(\%myconfig, $totals->{$_}, 2) } @{ $subtotal_columns }; - if ($form->{vendor}) { - $callback .= "&vendor=" . $form->escape($form->{vendor}, 1); - $href .= "&vendor=" . $form->escape($form->{vendor}); - $option .= $locale->text('Vendor') . " : $form->{vendor}"; - } - 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->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->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->escape($form->{notes}, 1); - $href .= "¬es=" . $form->escape($form->{notes}); - $option .= "\n
" if $option; - $option .= $locale->text('Notes') . " : $form->{notes}"; - } + $row->{tax}->{data} = $form->format_amount(\%myconfig, $totals->{amount} - $totals->{netamount}, 2); - if ($form->{transdatefrom}) { - $callback .= "&transdatefrom=$form->{transdatefrom}"; - $href .= "&transdatefrom=$form->{transdatefrom}"; - $option .= "\n
" if ($option); - $option .= - $locale->text('From') . " " - . $locale->date(\%myconfig, $form->{transdatefrom}, 1); - } - if ($form->{transdateto}) { - $callback .= "&transdateto=$form->{transdateto}"; - $href .= "&transdateto=$form->{transdateto}"; - $option .= "\n
" if ($option); - $option .= - $locale->text('Bis') . " " - . $locale->date(\%myconfig, $form->{transdateto}, 1); - } - if ($form->{open}) { - $callback .= "&open=$form->{open}"; - $href .= "&open=$form->{open}"; - $option .= "\n
" if ($option); - $option .= $locale->text('Open'); - } - if ($form->{closed}) { - $callback .= "&closed=$form->{closed}"; - $href .= "&closed=$form->{closed}"; - $option .= "\n
" if ($option); - $option .= $locale->text('Closed'); - } - if ($form->{globalproject_id}) { - $callback .= "&globalproject_id=" . E($form->{globalproject_id}); - $href .= "&globalproject_id=" . E($form->{globalproject_id}); - } + map { $totals->{$_} = 0 } @{ $subtotal_columns }; - @columns = - qw(transdate id type invnumber ordnumber name netamount tax amount paid datepaid - due duedate notes employee globalprojectnumber); + $lxdebug->leave_sub(); - $form->{"l_type"} = "Y"; + return $row; +} - foreach $item (@columns) { - if ($form->{"l_$item"} eq "Y") { - push @column_index, $item; +sub ap_transactions { + $lxdebug->enter_sub(); - # add column to href and callback - $callback .= "&l_$item=Y"; - $href .= "&l_$item=Y"; - } - } + $auth->assert('general_ledger | vendor_invoice_edit'); - if ($form->{l_subtotal} eq 'Y') { - $callback .= "&l_subtotal=Y"; - $href .= "&l_subtotal=Y"; - } + ($form->{vendor}, $form->{vendor_id}) = split(/--/, $form->{vendor}); - $column_header{id} = - qq||; - $column_header{transdate} = - qq||; - $column_header{type} = - ""; - $column_header{duedate} = - qq||; - $column_header{due} = - qq||; - $column_header{invnumber} = - qq||; - $column_header{ordnumber} = - qq||; - $column_header{name} = - qq||; - $column_header{netamount} = - qq||; - $column_header{tax} = - qq||; - $column_header{amount} = - qq||; - $column_header{paid} = - qq||; - $column_header{datepaid} = - qq||; - $column_header{notes} = - qq||; - $column_header{employee} = - ""; - $column_header{globalprojectnumber} = - qq||; + report_generator_set_default_sort('transdate', 1); - $form->{title} = $locale->text('AP Transactions'); + AP->ap_transactions(\%myconfig, \%$form); - $form->header; + $form->{title} = $locale->text('AP Transactions'); - print qq| - + my $report = SL::ReportGenerator->new(\%myconfig, $form); -
| . $locale->text('Vendor') . qq|$vendor $vendor | . $locale->text('Tax') . qq|| - . $locale->text('Korrektur') . qq| | . $locale->text('Taxkey') . qq| | @@ -525,8 +554,6 @@ $jsscript '-default' => $selected_taxchart)) . qq||; - my $korrektur = $form->{"korrektur_$i"} ? 'checked' : ''; - my $projectnumber = NTI($cgi->popup_menu('-name' => "project_id_$i", '-values' => \@project_values, @@ -537,8 +564,7 @@ $jsscript
$selectAP_amount {"amount_$i"}>{"tax_$i"}>$form->{"tax_$i"}$projectnumber
" . $locale->text('Account') . "" . $locale->text('Source') . "" . $locale->text('Memo') . "" . $locale->text('Project Number') . "" . $locale->text('Project Number') . "
$exchangerate - | - . $locale->text('ID') - . qq|| - . $locale->text('Date') - . qq|" . $locale->text('Type') . "| - . $locale->text('Due Date') - . qq|| . $locale->text('Amount Due') . qq|| - . $locale->text('Invoice') - . qq|| - . $locale->text('Order') - . qq|| - . $locale->text('Vendor') - . qq|| . $locale->text('Amount') . qq|| . $locale->text('Tax') . qq|| . $locale->text('Total') . qq|| . $locale->text('Paid') . qq|| - . $locale->text('Date Paid') - . qq|| . $locale->text('Notes') . qq|" - . $locale->text('Employee') . "| . $locale->text('Project Number') . qq|
- - - - - - - - - - - - - -
$form->{title}
$option
- - -|; + my @columns = + qw(transdate id type invnumber ordnumber name netamount tax amount paid datepaid + due duedate transaction_description notes employee globalprojectnumber); + + my @hidden_variables = map { "l_${_}" } @columns; + push @hidden_variables, "l_subtotal", qw(open closed vendor invnumber ordnumber transaction_description notes project_id transdatefrom transdateto); + + my $href = build_std_url('action=ap_transactions', grep { $form->{$_} } @hidden_variables); + + my %column_defs = ( + 'transdate' => { 'text' => $locale->text('Date'), }, + 'id' => { 'text' => $locale->text('ID'), }, + 'type' => { 'text' => $locale->text('Type'), }, + 'invnumber' => { 'text' => $locale->text('Invoice'), }, + 'ordnumber' => { 'text' => $locale->text('Order'), }, + 'name' => { 'text' => $locale->text('Vendor'), }, + 'netamount' => { 'text' => $locale->text('Amount'), }, + 'tax' => { 'text' => $locale->text('Tax'), }, + 'amount' => { 'text' => $locale->text('Total'), }, + 'paid' => { 'text' => $locale->text('Paid'), }, + 'datepaid' => { 'text' => $locale->text('Date Paid'), }, + 'due' => { 'text' => $locale->text('Amount Due'), }, + 'duedate' => { 'text' => $locale->text('Due Date'), }, + 'transaction_description' => { 'text' => $locale->text('Transaction description'), }, + 'notes' => { 'text' => $locale->text('Notes'), }, + 'employee' => { 'text' => $locale->text('Salesperson'), }, + 'globalprojectnumber' => { 'text' => $locale->text('Project Number'), }, + ); + + foreach my $name (qw(id transdate duedate invnumber ordnumber name datepaid employee shippingpoint shipvia transaction_description)) { + my $sortdir = $form->{sort} eq $name ? 1 - $form->{sortdir} : $form->{sortdir}; + $column_defs{$name}->{link} = $href . "&sort=$name&sortdir=$sortdir"; + } - map { print "\n$column_header{$_}" } @column_index; + my %column_alignment = map { $_ => 'right' } qw(netamount tax amount paid due); - print qq| - -|; + $form->{"l_type"} = "Y"; + map { $column_defs{$_}->{visible} = $form->{"l_${_}"} ? 1 : 0 } @columns; - # add sort and escape callback - $form->{callback} = "$callback&sort=$form->{sort}"; - $callback = $form->escape($form->{callback}); + $report->set_columns(%column_defs); + $report->set_column_order(@columns); - if (@{ $form->{AP} }) { - $sameitem = $form->{AP}->[0]->{ $form->{sort} }; - } + $report->set_export_options('ap_transactions', @hidden_variables, qw(sort sortdir)); - # sums and tax on reports by Antonio Gallardo - # - foreach $ap (@{ $form->{AP} }) { + $report->set_sort_indicator($form->{sort}, $form->{sortdir}); - if ($form->{l_subtotal} eq 'Y') { - if ($sameitem ne $ap->{ $form->{sort} }) { - &ap_subtotal; - $sameitem = $ap->{ $form->{sort} }; - } - } + my @options; + push @options, $locale->text('Vendor') . " : $form->{vendor}" if ($form->{vendor}); + push @options, $locale->text('Department') . " : " . (split /--/, $form->{department})[0] if ($form->{department}); + push @options, $locale->text('Invoice Number') . " : $form->{invnumber}" if ($form->{invnumber}); + push @options, $locale->text('Order Number') . " : $form->{ordnumber}" if ($form->{ordnumber}); + push @options, $locale->text('Notes') . " : $form->{notes}" if ($form->{notes}); + push @options, $locale->text('Transaction description') . " : $form->{transaction_description}" if ($form->{transaction_description}); + push @options, $locale->text('From') . " " . $locale->date(\%myconfig, $form->{transdatefrom}, 1) if ($form->{transdatefrom}); + push @options, $locale->text('Bis') . " " . $locale->date(\%myconfig, $form->{transdateto}, 1) if ($form->{transdateto}); + push @options, $locale->text('Open') if ($form->{open}); + push @options, $locale->text('Closed') if ($form->{closed}); - $column_data{netamount} = - ""; - $column_data{tax} = ""; - $column_data{amount} = - ""; - $column_data{paid} = - ""; - $column_data{due} = ""; - - $totalnetamount += $ap->{netamount}; - $totalamount += $ap->{amount}; - $totalpaid += $ap->{paid}; - $totaldue += ($ap->{amount} - $ap->{paid}); - - $subtotalnetamount += $ap->{netamount}; - $subtotalamount += $ap->{amount}; - $subtotalpaid += $ap->{paid}; - $subtotaldue += ($ap->{amount} - $ap->{paid}); - - $column_data{transdate} = ""; - $column_data{type} = ""; - $column_data{duedate} = ""; - $column_data{datepaid} = ""; - - $module = ($ap->{invoice}) ? "ir.pl" : $form->{script}; - - $column_data{invnumber} = - qq||; - $column_data{id} = ""; - $column_data{ordnumber} = ""; - $column_data{name} = ""; - $ap->{notes} =~ s/\r\n/
/g; - $column_data{notes} = ""; - $column_data{employee} = ""; - $column_data{globalprojectnumber} = - ""; - - $i++; - $i %= 2; - print " - -"; + $report->set_options('top_info_text' => join("\n", @options), + 'raw_bottom_info_text' => $form->parse_html_template('ap/ap_transactions_bottom'), + 'output_format' => 'HTML', + 'title' => $form->{title}, + 'attachment_basename' => $locale->text('vendor_invoice_list') . strftime('_%Y%m%d', localtime time), + ); + $report->set_options_from_form(); - map { print "\n$column_data{$_}" } @column_index; + # add sort and escape callback, this one we use for the add sub + $form->{callback} = $href .= "&sort=$form->{sort}"; - print qq| - -|; + # escape callback for href + $callback = $form->escape($href); - } + my @subtotal_columns = qw(netamount amount paid due); - if ($form->{l_subtotal} eq 'Y') { - &ap_subtotal; - } + my %totals = map { $_ => 0 } @subtotal_columns; + my %subtotals = map { $_ => 0 } @subtotal_columns; - # print totals - print qq| - -|; + my $idx = 0; - map { $column_data{$_} = "" } @column_index; - - $column_data{netamount} = - ""; - $column_data{tax} = ""; - $column_data{amount} = - ""; - $column_data{paid} = - ""; - $column_data{due} = - ""; + foreach $ap (@{ $form->{AP} }) { + $ap->{tax} = $ap->{amount} - $ap->{netamount}; + $ap->{due} = $ap->{amount} - $ap->{paid}; - map { print "$column_data{$_}\n" } @column_index; + map { $subtotals{$_} += $ap->{$_}; + $totals{$_} += $ap->{$_} } @subtotal_columns; - print qq| - -
" - . $form->format_amount(\%myconfig, $ap->{netamount}, 2, " ") - . "" - . $form->format_amount(\%myconfig, $ap->{amount} - $ap->{netamount}, - 2, " ") - . "" - . $form->format_amount(\%myconfig, $ap->{amount}, 2, " ") . "" - . $form->format_amount(\%myconfig, $ap->{paid}, 2, " ") . "" - . $form->format_amount(\%myconfig, $ap->{amount} - $ap->{paid}, - 2, " ") - . "$ap->{transdate} " . - ($ap->{invoice} ? $locale->text("Invoice (one letter abbreviation)") : - $locale->text("AP Transaction (abbreviation)")) - . "$ap->{duedate} $ap->{datepaid} $ap->{invnumber}$ap->{id}$ap->{ordnumber} $ap->{name}$ap->{notes} $ap->{employee} " . H($ap->{globalprojectnumber}) . "
 " - . $form->format_amount(\%myconfig, $totalnetamount, 2, " ") . "" - . $form->format_amount(\%myconfig, $totalamount - $totalnetamount, - 2, " ") - . "" - . $form->format_amount(\%myconfig, $totalamount, 2, " ") . "" - . $form->format_amount(\%myconfig, $totalpaid, 2, " ") . "" - . $form->format_amount(\%myconfig, $totaldue, 2, " ") . "
-

+ map { $ap->{$_} = $form->format_amount(\%myconfig, $ap->{$_}, 2) } qw(netamount tax amount paid due); -
-
{script}> + my $is_storno = $ap->{storno} && $ap->{storno_id}; + my $has_storno = $ap->{storno} && !$ap->{storno_id}; - + if ($ap->{invoice}) { + $ap->{type} = + $has_storno ? $locale->text("Invoice with Storno (abbreviation)") + : $is_storno ? $locale->text("Storno (one letter abbreviation)") + : $locale->text("Invoice (one letter abbreviation)"); + } else { + $ap->{type} = + $has_storno ? $locale->text("AP Transaction with Storno (abbreviation)") + : $is_storno ? $locale->text("AP Transaction Storno (one letter abbreviation)") + : $locale->text("AP Transaction (abbreviation)"); + } -{login}> -{password}> + my $row = { }; - + foreach my $column (@columns) { + $row->{$column} = { + 'data' => $ap->{$column}, + 'align' => $column_alignment{$column}, + }; + } - + $row->{invnumber}->{link} = build_std_url("script=" . ($ap->{invoice} ? 'ir.pl' : 'ap.pl'), 'action=edit') + . "&id=" . E($ap->{id}) . "&callback=${callback}"; -
+ my $row_set = [ $row ]; - - -|; + if (($form->{l_subtotal} eq 'Y') + && (($idx == (scalar @{ $form->{AP} } - 1)) + || ($ap->{ $form->{sort} } ne $form->{AP}->[$idx + 1]->{ $form->{sort} }))) { + push @{ $row_set }, create_subtotal_row(\%subtotals, \@columns, \%column_alignment, \@subtotal_columns, 'listsubtotal'); + } - $lxdebug->leave_sub(); -} + $report->add_data($row_set); -sub ap_subtotal { - $lxdebug->enter_sub(); + $idx++; + } - map { $column_data{$_} = " " } @column_index; - - $column_data{netamount} = - "" - . $form->format_amount(\%myconfig, $subtotalnetamount, 2, " ") - . ""; - $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, " ") . ""; - - $subtotalnetamount = 0; - $subtotalamount = 0; - $subtotalpaid = 0; - $subtotaldue = 0; - - print ""; - - map { print "\n$column_data{$_}" } @column_index; + $report->add_separator(); + $report->add_data(create_subtotal_row(\%totals, \@columns, \%column_alignment, \@subtotal_columns, 'listtotal')); - print qq| - -|; + $report->generate_with_headers(); $lxdebug->leave_sub(); } @@ -1650,31 +1525,14 @@ sub ap_subtotal { sub storno { $lxdebug->enter_sub(); + $auth->assert('general_ledger'); + if (IS->has_storno(\%myconfig, $form, 'ap')) { $form->{title} = $locale->text("Cancel Accounts Payables Transaction"); $form->error($locale->text("Transaction has already been cancelled!")); } - # negate amount/taxes - for my $i (1 .. $form->{rowcount}) { - $form->{"amount_$i"} *= -1; - $form->{"tax_$i"} *= -1; - } - - # format things - for my $i (1 .. $form->{rowcount}) { - for (qw(amount tax)) { - $form->{"${_}_$i"} = $form->format_amount(\%myconfig, $form->{"${_}_$i"}, 2) if $form->{"${_}_$i"}; - } - } - - $form->{storno} = 1; - $form->{storno_id} = $form->{id}; - $form->{id} = 0; - - $form->{invnumber} = "Storno-" . $form->{invnumber}; - - post(); + AP->storno($form, \%myconfig, $form->{id}); # saving the history if(!exists $form->{addition} && $form->{id} ne "") { @@ -1682,7 +1540,9 @@ sub storno { $form->{addition} = "STORNO"; $form->save_history($form->dbconnect(\%myconfig)); } - # /saving the history + # /saving the history + + $form->redirect(sprintf $locale->text("Transaction %d cancelled."), $form->{storno_id}); $lxdebug->leave_sub(); }