X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;ds=inline;f=bin%2Fmozilla%2Fis.pl;h=a83e4bcc7e55682fa3208cd9a2cd7af001ce4995;hb=bc5c9dac50b13fd17e7ec567179c4dfb6acf3a02;hp=8e2046897565a7c4b45a32b10ed249b219d1330c;hpb=3b21dee36ce7c81b395e9c57629d57bf5bd640b9;p=kivitendo-erp.git diff --git a/bin/mozilla/is.pl b/bin/mozilla/is.pl index 8e2046897..a83e4bcc7 100644 --- a/bin/mozilla/is.pl +++ b/bin/mozilla/is.pl @@ -36,8 +36,12 @@ use SL::IS; use SL::PE; use SL::OE; use Data::Dumper; +use DateTime; use List::Util qw(max sum); +use SL::DB::Default; +use SL::DB::Customer; + require "bin/mozilla/io.pl"; require "bin/mozilla/invoice_io.pl"; require "bin/mozilla/arap.pl"; @@ -45,9 +49,6 @@ require "bin/mozilla/drafts.pl"; use strict; -my $edit; -my $print_post; - 1; # end of main @@ -76,8 +77,6 @@ sub add { $form->{callback} = "$form->{script}?action=add&type=$form->{type}" unless $form->{callback}; - $form->{jsscript} = "date"; - &invoice_links; &prepare_invoice; &display_form; @@ -93,18 +92,12 @@ sub edit { $main::auth->assert('invoice_edit'); + $form->{taxincluded_changed_by_user} = 1; + # show history button $form->{javascript} = qq||; #/show hhistory button - if ($form->{type} eq "credit_note") { - $form->{title} = $locale->text('Edit Credit Note'); - $form->{title} = $locale->text('Edit Storno Credit Note') if $form->{storno}; - } else { - $form->{title} = $locale->text('Edit Sales Invoice'); - $form->{title} = $locale->text('Edit Storno Invoice') if $form->{storno}; - } - my ($language_id, $printer_id); if ($form->{print_and_post}) { $form->{action} = "print"; @@ -112,7 +105,16 @@ sub edit { $language_id = $form->{language_id}; $printer_id = $form->{printer_id}; } + &invoice_links; + if ($form->{type} eq "credit_note") { + $form->{title} = $locale->text('Edit Credit Note'); + $form->{title} = $locale->text('Edit Storno Credit Note') if $form->{storno}; + } else { + $form->{title} = $locale->text('Edit Sales Invoice'); + $form->{title} = $locale->text('Edit Storno Invoice') if $form->{storno}; + } + &prepare_invoice; if ($form->{print_and_post}) { $form->{language_id} = $language_id; @@ -135,8 +137,7 @@ sub invoice_links { $form->{vc} = 'customer'; # create links - $form->{webdav} = $main::webdav; - $form->{lizenzen} = $main::lizenzen; + $form->{webdav} = $::instance_conf->get_webdav; $form->create_links("AR", \%myconfig, "customer"); @@ -147,7 +148,11 @@ sub invoice_links { } } - $form->backup_vars(qw(payment_id language_id taxzone_id salesman_id taxincluded cp_id intnotes id shipto_id)); + my $editing = $form->{id}; + + $form->backup_vars(qw(payment_id language_id taxzone_id salesman_id + taxincluded currency cp_id intnotes id shipto_id + delivery_term_id)); IS->get_customer(\%myconfig, \%$form); @@ -156,20 +161,13 @@ sub invoice_links { $ref->{name} = $form->quote($ref->{name}); } - # Load data for a specific order and update form fields - my $order_data = OE->get_order_data_by_ordnumber(%$form) if $form->{ordnumber}; - - # Copy the fields we need to %form - for my $key (qw(payment_id salesman_id orddate taxzone_id quonumber)) { - $form->{$key} = $order_data->{$key}; - } - $form->restore_vars(qw(id)); IS->retrieve_invoice(\%myconfig, \%$form); - $form->restore_vars(qw(payment_id language_id taxzone_id intnotes cp_id shipto_id)); + $form->restore_vars(qw(payment_id language_id taxzone_id currency intnotes + cp_id shipto_id delivery_term_id)); $form->restore_vars(qw(taxincluded)) if $form->{id}; - $form->restore_vars(qw(salesman_id)) if $main::editing; + $form->restore_vars(qw(salesman_id)) if $editing; # build vendor/customer drop down comatibility... don't ask @@ -204,9 +202,11 @@ sub invoice_links { for my $i (1 .. scalar @{ $form->{acc_trans}{$key} }) { $form->{"AR_paid_$i"} = "$form->{acc_trans}{$key}->[$i-1]->{accno}--$form->{acc_trans}{$key}->[$i-1]->{description}"; + $form->{"acc_trans_id_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{acc_trans_id}; # reverse paid $form->{"paid_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{amount} * -1; $form->{"datepaid_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{transdate}; + $form->{"gldate_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{gldate}; $form->{"exchangerate_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{exchangerate}; $form->{"forex_$i"} = $form->{"exchangerate_$i"}; $form->{"source_$i"} = $form->{acc_trans}{$key}->[$i - 1]->{source}; @@ -263,15 +263,25 @@ sub prepare_invoice { (my $dec_qty) = ($form->{"qty_$i"} =~ /\.(\d+)/); $dec_qty = length $dec_qty; + $form->{"lastcost_$i"} = $form->format_amount(\%myconfig, $form->{"lastcost_$i"}, $decimalplaces); + $form->{"qty_$i"} = $form->format_amount(\%myconfig, $form->{"qty_$i"}, $dec_qty); + $form->{"sellprice_pg_$i"} = join ('--', $form->{"sellprice_$i"}, $form->{"pricegroup_id_$i"}); + $form->{rowcount} = $i; } # get pricegroups for parts IS->get_pricegroups_for_parts(\%myconfig, \%$form); - set_pricegroup($_) for 1 .. $form->{rowcount}; + + # Problem: set_pricegroup resets the sellprice of old invoices to the price + # currently defined in the pricegroup, which is a problem if the price has + # changed, as the old invoice gets the new price + # set_pricegroup must never be called, when an old invoice is initially loaded + + # set_pricegroup($_) for 1 .. $form->{rowcount}; } $main::lxdebug->leave_sub(); } @@ -282,11 +292,11 @@ sub form_header { my $form = $main::form; my %myconfig = %main::myconfig; my $locale = $main::locale; - my $cgi = $main::cgi; + my $cgi = $::request->{cgi}; $main::auth->assert('invoice_edit'); - our %TMPL_VAR = (); + my %TMPL_VAR = (); my @custom_hiddens; $form->{employee_id} = $form->{old_employee_id} if $form->{old_employee_id}; @@ -294,29 +304,32 @@ sub form_header { $form->{defaultcurrency} = $form->get_default_currency(\%myconfig); - my $set_duedate_url = "$form->{script}?action=set_duedate"; - - push @ { $form->{AJAX} }, new CGI::Ajax( 'set_duedate' => $set_duedate_url ); - my @old_project_ids = ($form->{"globalproject_id"}); map { push @old_project_ids, $form->{"project_id_$_"} if $form->{"project_id_$_"}; } 1..$form->{"rowcount"}; - $form->get_lists("contacts" => "ALL_CONTACTS", - "shipto" => "ALL_SHIPTO", - "projects" => { "key" => "ALL_PROJECTS", + $form->get_lists("projects" => { "key" => "ALL_PROJECTS", "all" => 0, "old_id" => \@old_project_ids }, - "employees" => "ALL_EMPLOYEES", - "salesmen" => "ALL_SALESMEN", "taxzones" => "ALL_TAXZONES", "currencies" => "ALL_CURRENCIES", "customers" => "ALL_CUSTOMERS", "departments" => "all_departments", "price_factors" => "ALL_PRICE_FACTORS"); - $TMPL_VAR{sales_employee_labels} = sub { $_[0]->{name} || $_[0]->{login} }; - $TMPL_VAR{shipto_labels} = sub { join "; ", grep { $_ } map { $_[0]->{"shipto${_}" } } qw(name department_1 street city) }; - $TMPL_VAR{contact_labels} = sub { join(', ', $_[0]->{"cp_name"}, $_[0]->{"cp_givenname"}) . ($_[0]->{cp_abteilung} ? " ($_[0]->{cp_abteilung})" : "") }; + $TMPL_VAR{ALL_EMPLOYEES} = SL::DB::Manager::Employee->get_all(query => [ or => [ id => $::form->{employee_id}, deleted => 0 ] ]); + $TMPL_VAR{ALL_SALESMEN} = SL::DB::Manager::Employee->get_all(query => [ or => [ id => $::form->{salesman_id}, deleted => 0 ] ]); + $TMPL_VAR{ALL_SHIPTO} = SL::DB::Manager::Shipto->get_all(query => [ + or => [ trans_id => $::form->{"$::form->{vc}_id"} * 1, and => [ shipto_id => $::form->{shipto_id} * 1, trans_id => undef ] ] + ]); + $TMPL_VAR{ALL_CONTACTS} = SL::DB::Manager::Contact->get_all(query => [ + or => [ + cp_cv_id => $::form->{"$::form->{vc}_id"} * 1, + and => [ + cp_cv_id => undef, + cp_id => $::form->{cp_id} * 1 + ] + ] + ]); $TMPL_VAR{department_labels} = sub { "$_[0]->{description}--$_[0]->{id}" }; # customer @@ -331,17 +344,17 @@ sub form_header { my @values = map { $_ } @{ $form->{ALL_CURRENCIES} }; my %labels = map { $_ => $_ } @{ $form->{ALL_CURRENCIES} }; $form->{currency} = $form->{defaultcurrency} unless $form->{currency}; - $TMPL_VAR{show_exchangerate} = $form->{currency} ne $form->{defaultcurrency}; - $TMPL_VAR{currencies} = NTI($cgi->popup_menu('-name' => 'currency', '-default' => $form->{"currency"}, - '-values' => \@values, '-labels' => \%labels)) if scalar @values; + $form->{show_exchangerate} = $form->{currency} ne $form->{defaultcurrency}; + $TMPL_VAR{currencies} = NTI($::request->{cgi}->popup_menu('-name' => 'currency', '-default' => $form->{"currency"}, + '-values' => \@values, '-labels' => \%labels, + '-onchange' => "document.getElementById('update_button').click();" + )) if scalar @values; push @custom_hiddens, "forex"; push @custom_hiddens, "exchangerate" if $form->{forex}; $TMPL_VAR{creditwarning} = ($form->{creditlimit} != 0) && ($form->{creditremaining} < 0) && !$form->{update}; $TMPL_VAR{is_credit_remaining_negativ} = $form->{creditremaining} =~ /-/; - $form->{fokus} = "invoice.customer"; - my $follow_up_vc = $form->{customer}; $follow_up_vc =~ s/--\d*\s*$//; $TMPL_VAR{customer_name} = $follow_up_vc; @@ -363,12 +376,12 @@ sub form_header { title creditlimit creditremaining tradediscount business closedto locked shipped storno storno_id max_dunning_level dunning_amount shiptoname shiptostreet shiptozipcode shiptocity shiptocountry shiptocontact shiptophone shiptofax - shiptoemail shiptodepartment_1 shiptodepartment_2 message email subject cc bcc taxaccounts cursor_fokus + shiptoemail shiptodepartment_1 shiptodepartment_2 shiptocp_gender message email subject cc bcc taxaccounts cursor_fokus convert_from_do_ids convert_from_oe_ids + show_details ), @custom_hiddens, map { $_.'_rate', $_.'_description', $_.'_taxnumber' } split / /, $form->{taxaccounts}]; - $form->{jsscript} = 1; $form->header(); print $form->parse_html_template("is/form_header", \%TMPL_VAR); @@ -386,7 +399,6 @@ sub form_footer { $main::auth->assert('invoice_edit'); $form->{invtotal} = $form->{invsubtotal}; - $form->{oldinvtotal} = $form->{invtotal}; # note rows $form->{rows} = max 2, @@ -396,7 +408,12 @@ sub form_footer { # tax, total and subtotal calculations my ($tax, $subtotal); - $form->{taxaccounts_array} = [ split / /, $form->{taxaccounts} ]; + $form->{taxaccounts_array} = [ split(/ /, $form->{taxaccounts}) ]; + + if( $form->{customer_id} && !$form->{taxincluded_changed_by_user} ) { + my $customer = SL::DB::Customer->new(id => $form->{customer_id})->load(); + $form->{taxincluded} = defined($customer->taxincluded_checked) ? $customer->taxincluded_checked : $myconfig{taxincluded_checked}; + } foreach my $item (@{ $form->{taxaccounts_array} }) { if ($form->{"${item}_base"}) { @@ -422,19 +439,43 @@ sub form_footer { $form->{paidaccounts}++ if ($form->{"paid_$form->{paidaccounts}"}); $form->{paid_indices} = [ 1 .. $form->{paidaccounts} ]; + # Standard Konto für Umlaufvermögen + my $accno_arap = IS->get_standard_accno_current_assets(\%myconfig, \%$form); + for my $i (1 .. $form->{paidaccounts}) { + $form->{"changeable_$i"} = 1; + if (SL::DB::Default->get->payments_changeable == 0) { + # never + $form->{"changeable_$i"} = ($form->{"acc_trans_id_$i"})? 0 : 1; + } elsif (SL::DB::Default->get->payments_changeable == 2) { + # on the same day + $form->{"changeable_$i"} = (($form->{"gldate_$i"} eq '') || + ($form->current_date(\%myconfig) eq $form->{"gldate_$i"})); + } + $form->{"selectAR_paid_$i"} = $form->{selectAR_paid}; - $form->{"selectAR_paid_$i"} =~ s/option>\Q$form->{"AR_paid_$i"}\E/option selected>$form->{"AR_paid_$i"}/; + if (!$form->{"AR_paid_$i"}) { + $form->{"selectAR_paid_$i"} =~ s/option>$accno_arap--(.*?)$accno_arap--$1; + } else { + $form->{"selectAR_paid_$i"} =~ s/option>\Q$form->{"AR_paid_$i"}\E/option selected>$form->{"AR_paid_$i"}/; + } + $totalpaid += $form->{"paid_$i"}; } + $form->{oldinvtotal} = $form->{invtotal}; + + $form->{ALL_DELIVERY_TERMS} = SL::DB::Manager::DeliveryTerm->get_all_sorted(); + print $form->parse_html_template('is/form_footer', { is_type_credit_note => ($form->{type} eq "credit_note"), totalpaid => $totalpaid, paid_missing => $form->{invtotal} - $totalpaid, print_options => print_options(inline => 1), show_storno => $form->{id} && !$form->{storno} && !IS->has_storno(\%myconfig, $form, "ar") && !$totalpaid, - show_delete => ($form->current_date(\%myconfig) eq $form->{gldate}), + show_delete => ($::instance_conf->get_is_changeable == 2) + ? ($form->current_date(\%myconfig) eq $form->{gldate}) + : ($::instance_conf->get_is_changeable == 1), }); ##print $form->parse_html_template('is/_payments'); # parser ##print $form->parse_html_template('webdav/_list'); # parser @@ -463,24 +504,28 @@ sub update { $main::auth->assert('invoice_edit'); - my ($recursive_call) = shift; - -# map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) } qw(exchangerate creditlimit creditremaining) unless $recursive_call; + my ($recursive_call) = @_; $form->{print_and_post} = 0 if $form->{second_run}; - my $taxincluded = "checked" if $form->{taxincluded}; + my $taxincluded = $form->{taxincluded} ? "checked" : ''; $form->{update} = 1; &check_name("customer"); $form->{taxincluded} ||= $taxincluded; + if (!$form->{forex}) { # read exchangerate from input field (not hidden) + $form->{exchangerate} = $form->parse_amount(\%myconfig, $form->{exchangerate}) unless $recursive_call; + } $form->{forex} = $form->check_exchangerate(\%myconfig, $form->{currency}, $form->{invdate}, 'buy'); $form->{exchangerate} = $form->{forex} if $form->{forex}; for my $i (1 .. $form->{paidaccounts}) { next unless $form->{"paid_$i"}; map { $form->{"${_}_$i"} = $form->parse_amount(\%myconfig, $form->{"${_}_$i"}) } qw(paid exchangerate); + if (!$form->{"forex_$i"}) { #read exchangerate from input field (not hidden) + $form->{exchangerate} = $form->{"exchangerate_$i"}; + } $form->{"forex_$i"} = $form->check_exchangerate(\%myconfig, $form->{currency}, $form->{"datepaid_$i"}, 'buy'); $form->{"exchangerate_$i"} = $form->{"forex_$i"} if $form->{"forex_$i"}; } @@ -502,15 +547,22 @@ sub update { my $rows = scalar @{ $form->{item_list} }; - $form->{"discount_$i"} = $form->format_amount(\%myconfig, $form->{customer_discount} * 100); + # Falls kein Kundenrabatt vorhanden ist, den aktuellen Rabatt nicht mit 0% überschreiben, + # da hier der Anwender schon manual einen Wert eingetragen haben könnte (analog zu qty) Bugfix: 1412 + if ($form->{customer_discount}){ + $form->{"discount_$i"} = $form->format_amount(\%myconfig, $form->{customer_discount} * 100); + } if ($rows) { - $form->{"qty_$i"} = ($form->{"qty_$i"} * 1) ? $form->{"qty_$i"} : 1; + $form->{"qty_$i"} = $form->parse_amount(\%myconfig, $form->{"qty_$i"}); + if( !$form->{"qty_$i"} ) { + $form->{"qty_$i"} = 1; + } if ($rows > 1) { - &select_item; - exit; + select_item(mode => 'IS'); + ::end_of_request(); } else { @@ -544,20 +596,10 @@ sub update { $form->{creditremaining} -= $amount; - map { $form->{"${_}_$i"} = $form->format_amount(\%myconfig, $form->{"${_}_$i"}, $decimalplaces) } qw(sellprice listprice); + map { $form->{"${_}_$i"} = $form->format_amount(\%myconfig, $form->{"${_}_$i"}, $decimalplaces) } qw(sellprice lastcost); $form->{"qty_$i"} = $form->format_amount(\%myconfig, $form->{"qty_$i"}); - if ($main::lizenzen) { - if ($form->{"inventory_accno_$i"} ne "") { - $form->{"lizenzen_$i"} = qq||; - foreach my $item (@{ $form->{LIZENZEN}{ $form->{"id_$i"} } }) { - $form->{"lizenzen_$i"} .= qq||; - } - $form->{"lizenzen_$i"} .= qq||; - } - } - # get pricegroups for parts IS->get_pricegroups_for_parts(\%myconfig, \%$form); @@ -597,7 +639,7 @@ sub post_payment { $main::auth->assert('invoice_edit'); - our $invdate; + my $invdate = $form->datetonum($form->{invdate}, \%myconfig); $form->{defaultcurrency} = $form->get_default_currency(\%myconfig); for my $i (1 .. $form->{paidaccounts}) { @@ -606,8 +648,6 @@ sub post_payment { $form->isblank("datepaid_$i", $locale->text('Payment date missing!')); - $form->error($locale->text('Cannot post payment for a closed period!')) - if ($form->date_closed($form->{"datepaid_$i"}, \%myconfig)); if ($form->{currency} ne $form->{defaultcurrency}) { $form->{"exchangerate_$i"} = $form->{exchangerate} @@ -617,6 +657,18 @@ sub post_payment { } } } + # Abgeschlossene Zeiträume nur für den letzten (aktuellen) Zahlungseingang prüfen + # Details s.a. Bug 1502 + # Das Problem ist jetzt, dass man Zahlungseingänge nachträglich ändern kann + # Wobei dies für Installationen die sowieso nicht mit Bücherkontrolle arbeiten keinen + # keinen Unterschied macht. + # Optimal wäre, wenn gegen einen Zeitstempel des Zahlungsfelds geprüft würde ... + # Das Problem hierbei ist, dass in IS.pm post_invoice IMMER alle Zahlungseingänge aus $form + # erneut gespeichert werden. Prinzipiell wäre es besser NUR die Ãnderungen des Rechnungs- + # belegs (neue Zahlung aber nichts anderes) zu speichern ... + # Vielleicht könnte man ähnlich wie bei Rechnung löschen verfahren + $form->error($locale->text('Cannot post payment for a closed period!')) + if ($form->date_closed($form->{"datepaid_$form->{paidaccounts}"}, \%myconfig)); ($form->{AR}) = split /--/, $form->{AR}; ($form->{AR_paid}) = split /--/, $form->{AR_paid}; @@ -650,17 +702,27 @@ sub post { # if oldcustomer ne customer redo form if (&check_name('customer')) { &update; + ::end_of_request(); + } + + if ($myconfig{mandatory_departments} && !$form->{department_id}) { + $form->{saved_message} = $::locale->text('You have to specify a department.'); + update(); exit; } + if ($form->{second_run}) { $form->{print_and_post} = 0; } + remove_emptied_rows(); &validate_items; my $closedto = $form->datetonum($form->{closedto}, \%myconfig); my $invdate = $form->datetonum($form->{invdate}, \%myconfig); + $form->error($locale->text('Cannot post transaction above the maximum future booking date!')) + if ($form->date_max_future($invdate, \%myconfig)); $form->error($locale->text('Cannot post invoice for a closed period!')) if ($invdate <= $closedto); @@ -689,7 +751,7 @@ sub post { ($form->{AR_paid}) = split /--/, $form->{AR_paid}; $form->{storno} ||= 0; - $form->{label} = $locale->text('Invoice'); + $form->{label} = $form->{type} eq 'credit_note' ? $locale->text('Credit Note') : $locale->text('Invoice'); $form->{id} = 0 if $form->{postasnew}; @@ -708,15 +770,20 @@ sub post { remove_draft() if $form->{remove_draft}; if(!exists $form->{addition}) { - $form->{snumbers} = qq|invnumber_| . $form->{invnumber}; - $form->{addition} = $print_post ? "PRINTED AND POSTED" : - $form->{storno} ? "STORNO" : - "POSTED"; - $form->save_history($form->dbconnect(\%myconfig)); + $form->{snumbers} = 'invnumber' .'_'. $form->{invnumber}; # ($form->{type} eq 'credit_note' ? 'cnnumber' : 'invnumber') .'_'. $form->{invnumber}; + $form->{addition} = $form->{print_and_post} ? "PRINTED AND POSTED" : + $form->{storno} ? "STORNO" : + "POSTED"; + $form->save_history; } - $form->redirect( $form->{label} . " $form->{invnumber} " . $locale->text('posted!')) - unless $print_post; + if (!$form->{no_redirect_after_post}) { + $form->{action} = 'edit'; + $form->{script} = 'is.pl'; + $form->{saved_message} = $form->{label} . " $form->{invnumber} " . $locale->text('posted!'); + $form->{callback} = build_std_url(qw(action edit id saved_message)); + $form->redirect; + } $main::lxdebug->leave_sub(); } @@ -728,9 +795,9 @@ sub print_and_post { $main::auth->assert('invoice_edit'); - my $old_form = new Form; - $print_post = 1; - $form->{print_and_post} = 1; + my $old_form = new Form; + $form->{no_redirect_after_post} = 1; + $form->{print_and_post} = 1; &post(); &edit(); @@ -738,7 +805,7 @@ sub print_and_post { } -sub use_as_template { +sub use_as_new { $main::lxdebug->enter_sub(); my $form = $main::form; @@ -746,10 +813,17 @@ sub use_as_template { $main::auth->assert('invoice_edit'); - 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); + delete @{ $form }{qw(printed emailed queued invnumber invdate deliverydate id datepaid_1 gldate_1 acc_trans_id_1 source_1 memo_1 paid_1 exchangerate_1 AP_paid_1 storno locked)}; $form->{paidaccounts} = 1; $form->{rowcount}--; $form->{invdate} = $form->current_date(\%myconfig); + $form->{duedate} = $form->get_duedate(\%myconfig, $form->{invdate}) || $form->{invdate}; + $form->{employee_id} = SL::DB::Manager::Employee->current->id; + + # remember pricegroups for "use as new" + IS->get_pricegroups_for_parts(\%myconfig, \%$form); + set_pricegroup($_) for 1 .. $form->{rowcount}; + &display_form; $main::lxdebug->leave_sub(); @@ -771,8 +845,11 @@ sub storno { if (IS->has_storno(\%myconfig, $form, "ar")) { $form->error($locale->text("Invoice has already been storno'd!")); } + if ($form->datetonum($form->{invdate}, \%myconfig) <= $form->datetonum($form->{closedto}, \%myconfig)) { + $form->error($locale->text('Cannot storno invoice for a closed period!')); + } - map({ my $key = $_; delete($form->{$key}) unless (grep({ $key eq $_ } qw(id login password stylesheet type))); } keys(%{ $form })); + map({ my $key = $_; delete($form->{$key}) unless (grep({ $key eq $_ } qw(id login password type))); } keys(%{ $form })); invoice_links(); prepare_invoice(); @@ -780,12 +857,13 @@ sub storno { # Payments must not be recorded for the new storno invoice. $form->{paidaccounts} = 0; - map { my $key = $_; delete $form->{$key} if grep { $key =~ /^$_/ } qw(datepaid_ source_ memo_ paid_ exchangerate_ AR_paid_) } keys %{ $form }; + map { my $key = $_; delete $form->{$key} if grep { $key =~ /^$_/ } qw(datepaid_ gldate_ acc_trans_id_ source_ memo_ paid_ exchangerate_ AR_paid_) } keys %{ $form }; $form->{storno_id} = $form->{id}; $form->{storno} = 1; $form->{id} = ""; $form->{invnumber} = "Storno zu " . $form->{invnumber}; + $form->{invdate} = DateTime->today->to_lxoffice; $form->{rowcount}++; post(); @@ -822,8 +900,6 @@ sub delete { $form->header; print qq| -
-