X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=bin%2Fmozilla%2Fcp.pl;h=888bf8a9f5669de2fdec483f375780eeb5c071d7;hb=4bd1e2f8b588972f10f92728301feacefd5ee4dd;hp=ea7e4308414717ff1ee72c20cb6bf9c9e82f2a29;hpb=07ccbf8dde5208f1615447aece57a76dc049d8d0;p=kivitendo-erp.git diff --git a/bin/mozilla/cp.pl b/bin/mozilla/cp.pl index ea7e43084..888bf8a9f 100644 --- a/bin/mozilla/cp.pl +++ b/bin/mozilla/cp.pl @@ -36,6 +36,7 @@ use SL::IS; use SL::IR; use SL::AR; use SL::AP; +use Data::Dumper; use strict; #use warnings; @@ -66,25 +67,31 @@ 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}"} = ""; if ($form->{"all_$form->{vc}"}) { + $form->{"select$form->{vc}"} .= "\n"; # 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 @@ -102,13 +109,14 @@ sub payment { # geben und hier reinparsen, oder besser multibox oder html auslagern? # Antwort: form->currency wird mit oldcurrency oder curr[0] überschrieben # Wofür macht das Sinn? - @curr = split(/:/, $form->{currencies}); - chomp $curr[0]; + @curr = $form->get_all_currencies(); $form->{defaultcurrency} = $form->{currency} = $form->{oldcurrency} = - $curr[0]; + $form->get_default_currency(\%myconfig); + # Entsprechend präventiv die Auswahlliste für Währungen + # auch mit value= zusammenbauen (s.a. oben bugfix 1771) $form->{selectcurrency} = ""; - map { $form->{selectcurrency} .= "\n" } @curr; &form_header; @@ -123,15 +131,26 @@ sub form_header { $auth->assert('cash'); my ($vc, $arap, $exchangerate); - my ($onload); if ($form->{ $form->{vc} } eq "") { map { $form->{"addr$_"} = "" } (1 .. 4); } + # 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" && $form->{"all_$form->{vc}"}){ + my ($customername) = split /--/, $form->{ $form->{vc} }; + $form->{ $form->{vc} } = $customername . "--" . $form->{customer_id}; + } + # bugfix 1771 + # geändert von + # offen: $form->{ARAP} kann raus? for my $item ($form->{vc}, "account", "currency", $form->{ARAP}) { + $form->{$item} = H($form->{$item}); $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 = @@ -147,14 +166,10 @@ sub form_header { $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 $::form->parse_html_template('cp/form_header', { is_customer => $form->{vc} eq 'customer', is_receipt => $form->{type} eq 'receipt', - onload => $onload, arap => $arap, vccontent => $vc, }); @@ -240,23 +255,78 @@ sub update { } } } - # Falls Suche über Rechnungsnummer und kein Kundenname vorhanden - if ($form->{invnumber} && !($form->{$form->{vc}})){ - $form->{open} ='Y'; # nur die offenen rechnungen - if ($form->{ARAP} eq 'AR'){ + + # 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); - # den ersten treffen nehmen und mit dem namen überschreiben - $form->{$form->{vc}} = $form->{AR}[0]{name}; - } else { - # s.o. nur für zahlungsausgang - AP->ap_transactions(\%myconfig, \%$form); - $form->{$form->{vc}} = $form->{AP}[0]{name}; + + # 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}; } } - # get customer and invoices - $updated = &check_name($form->{vc}); + + # 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"}|; @@ -271,6 +341,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}; @@ -391,14 +464,11 @@ sub check_form { $form->error($locale->text('Date missing!')) unless $form->{datepaid}; 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; @@ -415,10 +485,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"}); } }