X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=bin%2Fmozilla%2Fcp.pl;h=737cb307e73c30f6927acdadc4cf340bbdac9360;hb=ad1061cccd04a5b37e1b09b58055cad15c2f9761;hp=1f8f83aff7092eadd30db8fa31300ae1ec6319d2;hpb=1885c630e574acca0a1c2ce88971db1e8522ccaa;p=kivitendo-erp.git diff --git a/bin/mozilla/cp.pl b/bin/mozilla/cp.pl index 1f8f83aff..737cb307e 100644 --- a/bin/mozilla/cp.pl +++ b/bin/mozilla/cp.pl @@ -34,7 +34,10 @@ use SL::CP; use SL::IS; use SL::IR; -use strict ("vars", "subs"); +use SL::AR; +use SL::AP; +use Data::Dumper; +use strict; #use warnings; require "bin/mozilla/arap.pl"; @@ -64,27 +67,39 @@ sub payment { } else { CP->get_openvc(\%myconfig, \%$form); } - + # Auswahlliste für vc zusammenbauen + # Erweiterung für schliessende option und erweiterung um value + # für bugfix 1771 (doppelte Leerzeichen werden nicht 'gepostet') $form->{"select$form->{vc}"} = ""; + $form->{selectcustomer} .= "\n" if $form->{vc} eq "customer"; + if ($form->{"all_$form->{vc}"}) { # s.o. jb 12.10.2010 $form->{"$form->{vc}_id"} = $form->{"all_$form->{vc}"}->[0]->{id}; - map { $form->{"select$form->{vc}"} .= "\n" } @{ $form->{"all_$form->{vc}"} }; } - CP->paymentaccounts(\%myconfig, \%$form); + # Standard Konto für Umlaufvermögen + my $accno_arap = IS->get_standard_accno_current_assets(\%myconfig, \%$form); + # Entsprechend präventiv die Auswahlliste für Kontonummer + # auch mit value= zusammenbauen (s.a. oben bugfix 1771) + # Wichtig: Auch das Template anpassen, damit hidden input korrekt die " + # escaped. $form->{selectaccount} = ""; $form->{"select$form->{ARAP}"} = ""; - map { $form->{selectaccount} .= "\n"; + $form->{account} = "$_->{accno}--$_->{description}" if ($_->{accno} eq $accno_arap) } @{ $form->{PR}{"$form->{ARAP}_paid"} }; + + # Braucht man das hier überhaupt? Erstmal auskommentieren .. jan 18.12.2010 + # map { + # $form->{"select$form->{ARAP}"} .= + # "\n" } @curr; &form_header; @@ -110,55 +126,30 @@ sub payment { } sub form_header { - $lxdebug->enter_sub(); + $lxdebug->enter_sub; $auth->assert('cash'); - my ($vc, $vclabel, $allvc, $arap, $exchangerate); - my ($jsscript, $button1, $button2, $onload); - - $vclabel = ucfirst $form->{vc}; - $vclabel = $locale->text($vclabel); - - if ($form->{type} eq 'receipt') { - $form->{title} = $locale->text('Receipt'); - $form->{origtitle} = "Receipt"; - } - if ($form->{type} eq 'check') { - $form->{title} = $locale->text('Payment'); - $form->{origtitle} = "Payment"; - } - - # $locale->text('Customer') - # $locale->text('Vendor') + my ($vc, $arap, $exchangerate); if ($form->{ $form->{vc} } eq "") { map { $form->{"addr$_"} = "" } (1 .. 4); } - if ($form->{currency} ne $form->{defaultcurrency}) { - $form->{exchangerate} = - $form->format_amount(\%myconfig, $form->{exchangerate}); - if ($form->{forex}) { - $exchangerate = qq| - - | . $locale->text('Exchangerate') . qq| - {exchangerate}>$form->{exchangerate} - -|; - } else { - $exchangerate = qq| - - | . $locale->text('Exchangerate') . qq| - {exchangerate}> - -|; - } + # sometimes it happens that values in customer arrive without the signs '--' + # but in order to select the right option field we need values with '--' + if ($form->{vc} eq "customer"){ + my ($customername) = split /--/, $form->{ $form->{vc} }; + $form->{ $form->{vc} } = $customername . "--" . $form->{customer_id}; } - foreach my $item ($form->{vc}, "account", "currency", $form->{ARAP}) { + # bugfix 1771 + # geändert von + # offen: $form->{ARAP} kann raus? + for my $item ($form->{vc}, "account", "currency", $form->{ARAP}) { $form->{"select$item"} =~ s/ selected//; - $form->{"select$item"} =~ - s/option>\Q$form->{$item}\E/option selected>$form->{$item}/; + $form->{"select$item"} =~ s/option value="\Q$form->{$item}\E">\Q$form->{$item}\E/option selected value="$form->{$item}">$form->{$item}/; } $vc = @@ -166,306 +157,51 @@ sub form_header { ? qq|| : qq|{vc} size=35 value="$form->{$form->{vc}}">|; - if ($form->{all_vc}) { - $allvc = "checked"; - $form->{openinvoices} = ""; - } else { - $allvc = ""; - $form->{openinvoices} = 1; - } + $form->{openinvoices} = $form->{all_vc} ? "" : 1; # $locale->text('AR') # $locale->text('AP') - $form->{jsscript} = 1; - $jsscript = ""; - if ($form->{jsscript}) { - - # with JavaScript Calendar - $button1 = qq| - - text('button') . qq|> - |; - - #write Trigger - $jsscript = - Form->write_trigger(\%myconfig, "1", "datepaid", "BL", "trigger1"); - } else { - - # without JavaScript Calendar - $button1 = qq| - |; - } - $form->{javascript} .= qq||; $form->header; $arap = lc $form->{ARAP}; - $onload = qq|focus()|; - $onload .= qq|;setupDateFormat('|. $myconfig{dateformat} .qq|', '|. $locale->text("Falsches Datumsformat!") .qq|')|; - $onload .= qq|;setupPoints('|. $myconfig{numberformat} .qq|', '|. $locale->text("wrongformat") .qq|')|; - print qq| - - -
- -{defaultcurrency}> -{closedto}> -{vc}> -{type}> -{type}> - - -{ARAP}> -{openinvoices}> - - - - - - - - - - - - -$jsscript -|; - - if ($form->{openinvoices_other_currencies}) { - my $warning = $form->{vc} eq 'customer' ? $::locale->text('There are #1 more open invoices for this customer with other currencies.', $form->{openinvoices_other_currencies}) - : $::locale->text('There are #1 more open invoices from this vendor with other currencies.', $form->{openinvoices_other_currencies}); - - print qq| - - - - - -|; - } - $lxdebug->leave_sub(); + print $::form->parse_html_template('cp/form_header', { + is_customer => $form->{vc} eq 'customer', + is_receipt => $form->{type} eq 'receipt', + arap => $arap, + vccontent => $vc, + }); + + $lxdebug->leave_sub; } sub list_invoices { - $lxdebug->enter_sub(); - - $auth->assert('cash'); - - my (@column_index, %column_data, $colspan, $invoice); - my ($totalamount, $totaldue, $totalpaid); - - @column_index = qw(invnumber transdate amount due checked paid); - - $colspan = $#column_index + 1; - - $invoice = $locale->text('Invoices'); - - print qq| - - - - -|; + print $::form->parse_html_template('cp/invoices', { + invoices => \@invoices, + totals => \%total, + }); - $lxdebug->leave_sub(); + $::lxdebug->leave_sub; } sub form_footer { - $lxdebug->enter_sub(); - - $auth->assert('cash'); + $::lxdebug->enter_sub; + $::auth->assert('cash'); - print qq| - - - -
$form->{title}
- - - - - -
- - - - - {vc}"}) . qq|"> - {vc}_id"}) . qq|"> - {vc}"}) . qq|"> - - - - - - - - - - - - - -
$vclabel$vc
| . $locale->text('Address') . qq| - - - - - - - - - - - - - -
$form->{street}
$form->{zipcode}
$form->{city}
$form->{country}
-
| . $locale->text('Memo') . qq|
-
- - - - - - - - $button1 - - - - - - {oldcurrency}> - - $exchangerate - - - - - - - - -
| . $locale->text('Account') . qq| - -
| . $locale->text('Date') . qq|
| . $locale->text('Currency') . qq|
| . $locale->text('Source') . qq|
| . $locale->text('Amount') . qq|| . $form->format_amount(\%myconfig, $form->{amount}, 2) . qq|
-
-
| . $::locale->text('Note') . qq|: $warning
- - - - -|; - - $column_data{invnumber} = - qq|"; - $column_data{transdate} = - qq|"; - $column_data{amount} = - qq|"; - $column_data{due} = - qq|"; - $column_data{paid} = - qq|"; - $column_data{checked} = - qq|"; - - print qq| - -|; - map { print "$column_data{$_}\n" } @column_index; - print qq| - -|; - - for my $i (1 .. $form->{rowcount}) { - - my $j = 0; - - map { - $form->{"${_}_$i"} = - $form->parse_amount(\%myconfig, $form->{"${_}_$i"}) - } qw(amount due paid); - - $totalamount += $form->{"amount_$i"}; - $totaldue += $form->{"due_$i"}; - $totalpaid += $form->{"paid_$i"}; - - map { - $form->{"${_}_$i"} = - $form->format_amount(\%myconfig, $form->{"${_}_$i"}, 2) - } qw(amount due paid); - - $column_data{invnumber} = qq| - - {"id_$i"}>|; - $column_data{transdate} = qq| - {"transdate_$i"}>|; - $column_data{amount} = - qq| - {"amount_$i"}>|; - $column_data{due} = qq| - {"due_$i"}>|; - - $column_data{paid} = - qq||; - - $form->{"checked_$i"} = ($form->{"checked_$i"}) ? "checked" : ""; - $column_data{checked} = - qq||; - - $j++; - $j %= 2; - print qq| - -|; - map { print "$column_data{$_}\n" } @column_index; - print qq| - -|; + $::lxdebug->enter_sub; + $::auth->assert('cash'); + + my @columns = qw(amount due paid invnumber id transdate checked); + my (@invoices, %total); + for my $i (1 .. $::form->{rowcount}) { + push @invoices, +{ map { $_ => $::form->{"$_\_$i"} } @columns }; + $total{$_} += $invoices[-1]{$_} = $::form->parse_amount(\%::myconfig, $invoices[-1]{$_}) for qw(amount due paid); } - map { $column_data{$_} = "" } @column_index; - - $column_data{amount} = - qq||; - $column_data{due} = - qq||; - $column_data{paid} = - qq||; - - print qq| - -|; - map { print "$column_data{$_}\n" } @column_index; - print qq| - -
$invoice
| . $locale->text('Invoice') . "| . $locale->text('Date') . "| . $locale->text('Amount') . "| . $locale->text('Due') . "| . $locale->text('Amount') . "| . $locale->text('Select') . "
$form->{"invnumber_$i"}$form->{"transdate_$i"}$form->{"amount_$i"}$form->{"due_$i"}{"paid_$i"}>{"checked_$i"}>
 | - . $form->format_amount(\%myconfig, $totalamount, 2, " ") - . qq|| - . $form->format_amount(\%myconfig, $totaldue, 2, " ") - . qq|| - . $form->format_amount(\%myconfig, $totalpaid, 2, " ") - . qq|
-

-{rowcount}> + print $::form->parse_html_template('cp/form_footer'); -
- - -
- - - -|; - - $lxdebug->leave_sub(); + $::lxdebug->leave_sub; } sub update { @@ -519,15 +255,82 @@ sub update { } } - # get customer and invoices - $updated = &check_name($form->{vc}); + # search by customernumber + # the customernumber has to be correct otherwise nothing is found + if ($form->{vc} eq 'customer' and $form->{customernumber} and $form->{ARAP} eq 'AR') { + $form->{open} ='Y'; # only open invoices + # ar_transactions automatically searches by $form->{customer_id} or else + # $form->{customer} if available, and these variables will always be set + # so we have to empty these values first + $form->{customer_id} = ''; + $form->{customer} = ''; + AR->ar_transactions(\%myconfig, \%$form); + + # Here we just take the first returned value even if the custumernumber + # may not be unique + $form->{customer} = $form->{AR}[0]{name}; + $form->{customer_id} = $form->{AR}[0]{customer_id}; + } + + # search by invoicenumber, + if ($form->{invnumber}) { + $form->{open} ='Y'; # only open invoices + if ($form->{ARAP} eq 'AR'){ + # ar_transactions automatically searches by $form->{customer_id} or else + # $form->{customer} if available, and these variables will always be set + # so we have to empty these values first + $form->{customer_id} = ''; + $form->{customer} = ''; + AR->ar_transactions(\%myconfig, \%$form); + + # if you search for invoice '11' ar_transactions will also match invoices + # 112, 211, ... due to the LIKE + + # so there is now an extra loop that tries to match the invoice number + # exactly among all returned results, and then passes the customer_id instead of the name + # because the name may not be unique + + my $found_exact_invnumber_match = 0; + foreach my $i ( @{ $form->{AR} } ) { + next unless $i->{invnumber} eq $form->{invnumber}; + # found exactly matching invnumber + $form->{$form->{vc}} = $i->{name}; + $form->{customer_id} = $i->{customer_id}; + #$form->{"old${form->{vc}"} = $i->{customer_id}; + $found_exact_invnumber_match = 1; + }; + + unless ( $found_exact_invnumber_match ) { + # use first returned entry, may not be the correct one if invnumber doesn't + # match uniquely + $form->{$form->{vc}} = $form->{AR}[0]{name}; + $form->{customer_id} = $form->{AR}[0]{customer_id}; + }; + } else { + # s.o. nur für zahlungsausgang + AP->ap_transactions(\%myconfig, \%$form); + $form->{$form->{vc}} = $form->{AP}[0]{name}; + } + } - if ($new_name_selected || $updated) { + # determine customer/vendor + if ( $form->{customer_id} and ($form->{invnumber} or $form->{customernumber}) ) { + # we already know the exact customer_id, so fill $form with customer data + IS->get_customer(\%myconfig, \%$form); + $updated = 1; + } else { + # check_name is called with "customer" or "vendor" and otherwise uses contents of $form + # check_name also runs get_customer/get_vendor + $updated = &check_name($form->{vc}); + }; + + # if ($new_name_selected || $updated) { + # get open invoices from ar/ap using $form->{vc} and a.${vc}_id, i.e. customer_id CP->get_openinvoices(\%myconfig, \%$form); ($newvc) = split /--/, $form->{ $form->{vc} }; $form->{"old$form->{vc}"} = qq|$newvc--$form->{"$form->{vc}_id"}|; $updated = 1; - } + # } if ($form->{currency} ne $form->{oldcurrency}) { $form->{oldcurrency} = $form->{currency}; @@ -537,6 +340,9 @@ sub update { } } + if (!$form->{forex}) { # read exchangerate from input field (not hidden) + $form->{exchangerate} = $form->parse_amount(\%myconfig, $form->{exchangerate}); + } $form->{forex} = $form->check_exchangerate( \%myconfig, $form->{currency}, $form->{datepaid}, $buysell); $form->{exchangerate} = $form->{forex} if $form->{forex}; @@ -627,21 +433,16 @@ sub post { # Beim Aktualisieren wird das Konto übernommen # und jetzt auch Beleg und Datum - $form->{callback} = "cp.pl?action=payment&vc=$form->{vc}&type=$form->{type}&account=$form->{account}&$form->{currency}" . + $form->{callback} = "cp.pl?action=payment&vc=$form->{vc}&type=$form->{type}&account=$form->{account}&$form->{currency}" . "&datepaid=$form->{datepaid}&source=$form->{source}"; - my $msg1 = "$form->{origtitle} posted!"; - my $msg2 = "Cannot post $form->{origtitle}!"; + my $msg1 = $::form->{type} eq 'receipt' ? $::locale->text("Receipt posted!") : $::locale->text("Payment posted!"); + my $msg2 = $::form->{type} eq 'receipt' ? $::locale->text("Cannot post Receipt!") : $::locale->text("Cannot post Payment!"); - # $locale->text('Payment posted!') - # $locale->text('Receipt posted!') - # $locale->text('Cannot post Payment!') - # $locale->text('Cannot post Receipt!') # Die Nachrichten (Receipt posted!) werden nicht angezeigt. # Entweder wieder aktivieren oder komplett rausnehmen - $form->redirect($locale->text($msg1)) - if (CP->process_payment(\%myconfig, \%$form)); - $form->error($locale->text($msg2)); + $form->redirect($msg1) if (CP->process_payment(\%::myconfig, $::form)); + $form->error($msg2); $lxdebug->leave_sub(); } @@ -660,16 +461,13 @@ sub check_form { ::end_of_request(); } $form->error($locale->text('Date missing!')) unless $form->{datepaid}; - my $selected_check = 1; + my $selected_check = 1; for my $i (1 .. $form->{rowcount}) { - if ($form->{"checked_$i"}) { - if ($form->parse_amount(\%myconfig, $form->{"paid_$i"}, 2) <= 0) { # negativen Betrag eingegeben - $form->error($locale->text('Amount has to be greater then zero! Wrong row number: ') . $i); - } - undef($selected_check); - # last; # ich muss doch über alle buchungen laufen, da ich noch - # die freitext-eingabe der werte prüfen will + next unless $form->{"checked_$i"}; + if (abs($form->parse_amount(\%myconfig, $form->{"paid_$i"}, 2)) < 0.01) { + $form->error($locale->text('Row #1: amount has to be different from zero.', $i)); } + undef $selected_check; } $form->error($locale->text('No transaction selected!')) if $selected_check; @@ -686,10 +484,10 @@ sub check_form { if ($form->parse_amount(\%myconfig, $form->{"paid_$i"})) { $amount -= $form->parse_amount(\%myconfig, $form->{"paid_$i"}); - push(@{ $form->{paid} }, $form->{"paid_$i"}); - push(@{ $form->{due} }, $form->{"due_$i"}); - push(@{ $form->{invnumber} }, $form->{"invnumber_$i"}); - push(@{ $form->{invdate} }, $form->{"transdate_$i"}); + push(@{ $form->{paid} ||= [] }, $form->{"paid_$i"}); + push(@{ $form->{due} ||= [] }, $form->{"due_$i"}); + push(@{ $form->{invnumber} ||= [] }, $form->{"invnumber_$i"}); + push(@{ $form->{invdate} ||= [] }, $form->{"transdate_$i"}); } }