X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;ds=sidebyside;f=bin%2Fmozilla%2Fis.pl;h=502525782e9220b9f863467ca5c0b7cd4ff85be9;hb=6768ddad54d2a675939e1167536f4943628de2bb;hp=1650303486dbf652e4d163ed8e3e28b117361e79;hpb=4dd985fec12f1d30595c8b9d0c9b3b8942f1fea8;p=kivitendo-erp.git diff --git a/bin/mozilla/is.pl b/bin/mozilla/is.pl index 165030348..502525782 100644 --- a/bin/mozilla/is.pl +++ b/bin/mozilla/is.pl @@ -35,17 +35,20 @@ use SL::FU; use SL::IS; use SL::PE; use SL::OE; +use SL::MoreCommon qw(restore_form save_form); use Data::Dumper; use DateTime; +use List::MoreUtils qw(uniq); use List::Util qw(max sum); +use List::UtilsBy qw(sort_by); +use English qw(-no_match_vars); use SL::DB::Default; use SL::DB::Customer; +use SL::DB::PaymentTerm; require "bin/mozilla/io.pl"; -require "bin/mozilla/invoice_io.pl"; require "bin/mozilla/arap.pl"; -require "bin/mozilla/drafts.pl"; use strict; @@ -61,7 +64,7 @@ sub add { $main::auth->assert('invoice_edit'); - return $main::lxdebug->leave_sub() if (load_draft_maybe()); + $form->{show_details} = $::myconfig{show_form_details}; if ($form->{type} eq "credit_note") { $form->{title} = $locale->text('Add Credit Note'); @@ -92,11 +95,11 @@ sub edit { $main::auth->assert('invoice_edit'); + $form->{show_details} = $::myconfig{show_form_details}; $form->{taxincluded_changed_by_user} = 1; # show history button $form->{javascript} = qq||; - #/show hhistory button my ($language_id, $printer_id); if ($form->{print_and_post}) { @@ -137,8 +140,6 @@ sub invoice_links { $form->{vc} = 'customer'; # create links - $form->{webdav} = $::instance_conf->get_webdav; - $form->create_links("AR", \%myconfig, "customer"); if ($form->{all_customer}) { @@ -170,7 +171,7 @@ sub invoice_links { $form->restore_vars(qw(salesman_id)) if $editing; - # build vendor/customer drop down comatibility... don't ask + # build vendor/customer drop down compatibility... don't ask if (@{ $form->{"all_customer"} }) { $form->{"selectcustomer"} = 1; $form->{customer} = qq|$form->{customer}--$form->{"customer_id"}|; @@ -272,16 +273,6 @@ sub prepare_invoice { $form->{rowcount} = $i; } - - # get pricegroups for parts - IS->get_pricegroups_for_parts(\%myconfig, \%$form); - - # 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(); } @@ -299,29 +290,46 @@ sub form_header { my %TMPL_VAR = (); my @custom_hiddens; + if ($form->{id}) { + require SL::DB::Invoice; + $TMPL_VAR{invoice_obj} = SL::DB::Invoice->new(id => $form->{id})->load; + } $form->{employee_id} = $form->{old_employee_id} if $form->{old_employee_id}; $form->{salesman_id} = $form->{old_salesman_id} if $form->{old_salesman_id}; $form->{defaultcurrency} = $form->get_default_currency(\%myconfig); - 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("projects" => { "key" => "ALL_PROJECTS", - "all" => 0, - "old_id" => \@old_project_ids }, - "taxzones" => "ALL_TAXZONES", + $form->get_lists("taxzones" => ($form->{id} ? "ALL_TAXZONES" : "ALL_ACTIVE_TAXZONES"), "currencies" => "ALL_CURRENCIES", "customers" => "ALL_CUSTOMERS", "departments" => "all_departments", "price_factors" => "ALL_PRICE_FACTORS"); - $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 => [ + # Projects + my @old_project_ids = uniq grep { $_ } map { $_ * 1 } ($form->{"globalproject_id"}, map { $form->{"project_id_$_"} } 1..$form->{"rowcount"}); + my @old_ids_cond = @old_project_ids ? (id => \@old_project_ids) : (); + my @customer_cond; + if ($::instance_conf->get_customer_projects_only_in_sales) { + @customer_cond = ( + or => [ + customer_id => $::form->{customer_id}, + billable_customer_id => $::form->{customer_id}, + ]); + } + my @conditions = ( + or => [ + and => [ active => 1, @customer_cond ], + @old_ids_cond, + ]); + + $TMPL_VAR{ALL_PROJECTS} = SL::DB::Manager::Project->get_all_sorted(query => \@conditions); + $form->{ALL_PROJECTS} = $TMPL_VAR{ALL_PROJECTS}; # make projects available for second row drop-down in io.pl + $TMPL_VAR{ALL_EMPLOYEES} = SL::DB::Manager::Employee->get_all_sorted(query => [ or => [ id => $::form->{employee_id}, deleted => 0 ] ]); + $TMPL_VAR{ALL_SALESMEN} = SL::DB::Manager::Employee->get_all_sorted(query => [ or => [ id => $::form->{salesman_id}, deleted => 0 ] ]); + $TMPL_VAR{ALL_SHIPTO} = SL::DB::Manager::Shipto->get_all_sorted(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 => [ + $TMPL_VAR{ALL_CONTACTS} = SL::DB::Manager::Contact->get_all_sorted(query => [ or => [ cp_cv_id => $::form->{"$::form->{vc}_id"} * 1, and => [ @@ -370,18 +378,26 @@ sub form_header { $TMPL_VAR{dateformat} = $myconfig{dateformat}; $TMPL_VAR{numberformat} = $myconfig{numberformat}; + push @custom_hiddens, map { "shiptocvar_" . $_->name } @{ SL::DB::Manager::CustomVariableConfig->get_all(where => [ module => 'ShipTo' ]) }; + # hiddens $TMPL_VAR{HIDDENS} = [qw( - id action type media format queued printed emailed title vc discount + id type media format queued printed emailed title vc discount title creditlimit creditremaining tradediscount business closedto locked shipped storno storno_id - max_dunning_level dunning_amount - shiptoname shiptostreet shiptozipcode shiptocity shiptocountry shiptocontact shiptophone shiptofax + max_dunning_level dunning_amount dunning_description + shiptoname shiptostreet shiptozipcode shiptocity shiptocountry shiptogln shiptocontact shiptophone shiptofax 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 rowcount callback draft_id draft_description customer_discount gldate + convert_from_do_ids convert_from_oe_ids convert_from_ar_ids useasnew + invoice_id + show_details ), @custom_hiddens, map { $_.'_rate', $_.'_description', $_.'_taxnumber' } split / /, $form->{taxaccounts}]; + $::request->{layout}->use_javascript(map { "${_}.js" } qw(kivi.Draft kivi.SalesPurchase ckeditor/ckeditor ckeditor/adapters/jquery kivi.io autocomplete_customer autocomplete_part client_js)); + + $TMPL_VAR{payment_terms_obj} = get_payment_terms_for_invoice(); + $form->{duedate} = $TMPL_VAR{payment_terms_obj}->calc_date(reference_date => $form->{invdate}, due_date => $form->{duedate})->to_kivitendo if $TMPL_VAR{payment_terms_obj}; + $form->header(); print $form->parse_html_template("is/form_header", \%TMPL_VAR); @@ -389,6 +405,25 @@ sub form_header { $main::lxdebug->leave_sub(); } +sub _sort_payments { + my @fields = qw(acc_trans_id gldate datepaid source memo paid AR_paid); + my @payments = + grep { $_->{paid} != 0 } + map { + my $idx = $_; + +{ map { ($_ => delete($::form->{"${_}_${idx}"})) } @fields } + } (1..$::form->{paidaccounts}); + + @payments = sort_by { DateTime->from_kivitendo($_->{datepaid}) } @payments; + + $::form->{paidaccounts} = max scalar(@payments), 1; + + foreach my $idx (1 .. scalar(@payments)) { + my $payment = $payments[$idx - 1]; + $::form->{"${_}_${idx}"} = $payment->{$_} for @fields; + } +} + sub form_footer { $main::lxdebug->enter_sub(); @@ -428,13 +463,22 @@ sub form_footer { } } + my $grossamount = $form->{invtotal}; + $form->{invtotal} = $form->round_amount( $form->{invtotal}, 2, 1 ); + $form->{rounding} = $form->round_amount( + $form->{invtotal} - $form->round_amount($grossamount, 2), + 2 + ); + # follow ups if ($form->{id}) { - $form->{follow_ups} = FU->follow_ups('trans_id' => $form->{id}) || []; + $form->{follow_ups} = FU->follow_ups('trans_id' => $form->{id}, 'not_done' => 1) || []; $form->{follow_ups_unfinished} = ( sum map { $_->{due} * 1 } @{ $form->{follow_ups} } ) || 0; } # payments + _sort_payments(); + my $totalpaid = 0; $form->{paidaccounts}++ if ($form->{"paid_$form->{paidaccounts}"}); $form->{paid_indices} = [ 1 .. $form->{paidaccounts} ]; @@ -453,6 +497,11 @@ sub form_footer { ($form->current_date(\%myconfig) eq $form->{"gldate_$i"})); } + #deaktivieren von gebuchten Zahlungen ausserhalb der Bücherkontrolle, vorher prüfen ob heute eingegeben + if ($form->date_closed($form->{"gldate_$i"})) { + $form->{"changeable_$i"} = 0; + } + $form->{"selectAR_paid_$i"} = $form->{selectAR_paid}; if (!$form->{"AR_paid_$i"}) { $form->{"selectAR_paid_$i"} =~ s/option>$accno_arap--(.*?)$accno_arap--$1; @@ -476,6 +525,7 @@ sub form_footer { show_delete => ($::instance_conf->get_is_changeable == 2) ? ($form->current_date(\%myconfig) eq $form->{gldate}) : ($::instance_conf->get_is_changeable == 1), + today => DateTime->today, }); ##print $form->parse_html_template('is/_payments'); # parser ##print $form->parse_html_template('webdav/_list'); # parser @@ -547,11 +597,8 @@ sub update { my $rows = scalar @{ $form->{item_list} }; - # 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); - } + $form->{"discount_$i"} = $form->parse_amount(\%myconfig, $form->{"discount_$i"}) / 100.0; + $form->{"discount_$i"} ||= $form->{customer_discount}; if ($rows) { $form->{"qty_$i"} = $form->parse_amount(\%myconfig, $form->{"qty_$i"}); @@ -561,8 +608,8 @@ sub update { if ($rows > 1) { - select_item(mode => 'IS'); - ::end_of_request(); + select_item(mode => 'IS', pre_entered_qty => $form->{"qty_$i"}); + $::dispatcher->end_request; } else { @@ -582,14 +629,27 @@ sub update { if ($sellprice) { $form->{"sellprice_$i"} = $sellprice; } else { + my $record = _make_record(); + my $price_source = SL::PriceSource->new(record_item => $record->items->[$i-1], record => $record); + my $best_price = $price_source->best_price; + my $best_discount = $price_source->best_discount; + + if ($best_price) { + $::form->{"sellprice_$i"} = $best_price->price; + $::form->{"active_price_source_$i"} = $best_price->source; + } + if ($best_discount) { + $::form->{"discount_$i"} = $best_discount->discount; + $::form->{"active_discount_source_$i"} = $best_discount->source; + } + # if there is an exchange rate adjust sellprice - $form->{"sellprice_$i"} *= (1 - $form->{tradediscount}); $form->{"sellprice_$i"} /= $exchangerate; } $form->{"listprice_$i"} /= $exchangerate; - my $amount = $form->{"sellprice_$i"} * $form->{"qty_$i"} * (1 - $form->{"discount_$i"} / 100); + my $amount = $form->{"sellprice_$i"} * $form->{"qty_$i"} * (1 - $form->{"discount_$i"}); map { $form->{"${_}_base"} = 0 } split / /, $form->{taxaccounts}; map { $form->{"${_}_base"} += $amount } split / /, $form->{"taxaccounts_$i"}; map { $amount += ($form->{"${_}_base"} * $form->{"${_}_rate"}) } split / /, $form->{"taxaccounts_$i"} if !$form->{taxincluded}; @@ -598,13 +658,8 @@ sub update { map { $form->{"${_}_$i"} = $form->format_amount(\%myconfig, $form->{"${_}_$i"}, $decimalplaces) } qw(sellprice lastcost); - $form->{"qty_$i"} = $form->format_amount(\%myconfig, $form->{"qty_$i"}); - - # get pricegroups for parts - IS->get_pricegroups_for_parts(\%myconfig, \%$form); - - # build up html code for prices_$i - &set_pricegroup($i); + $form->{"qty_$i"} = $form->format_amount(\%myconfig, $form->{"qty_$i"}); + $form->{"discount_$i"} = $form->format_amount(\%myconfig, $form->{"discount_$i"} * 100.0); } &display_form; @@ -639,6 +694,7 @@ sub post_payment { $main::auth->assert('invoice_edit'); + $form->mtime_ischanged('ar') ; my $invdate = $form->datetonum($form->{invdate}, \%myconfig); $form->{defaultcurrency} = $form->get_default_currency(\%myconfig); @@ -655,28 +711,28 @@ sub post_payment { $form->isblank("exchangerate_$i", $locale->text('Exchangerate for payment missing!')); } + $form->error($locale->text('Cannot post transaction above the maximum future booking date!')) + if ($form->date_max_future($form->{"datepaid_$i"}, \%myconfig)); + + #Zusätzlich noch das Buchungsdatum in die Bücherkontrolle einbeziehen + # (Dient zur Prüfung ob ZE oder ZA geprüft werden soll) + $form->error($locale->text('Cannot post payment for a closed period!')) + if ($form->date_closed($form->{"datepaid_$i"}) && !$form->date_closed($form->{"gldate_$i"}, \%myconfig)); } } - # 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}; relink_accounts(); - $form->redirect($locale->text('Payment posted!')) - if (IS->post_payment(\%myconfig, \%$form)); - $form->error($locale->text('Cannot post payment!')); - + if ( IS->post_payment(\%myconfig, \%$form) ) { + $form->{snumbers} = qq|invnumber_| . $form->{invnumber}; + $form->{what_done} = 'invoice'; + $form->{addition} = "PAYMENT POSTED"; + $form->save_history; + $form->redirect($locale->text('Payment posted!')) + } else { + $form->error($locale->text('Cannot post payment!')); + }; $main::lxdebug->leave_sub(); } @@ -689,6 +745,7 @@ sub post { my $locale = $main::locale; $main::auth->assert('invoice_edit'); + $form->mtime_ischanged('ar'); $form->{defaultcurrency} = $form->get_default_currency(\%myconfig); $form->isblank("invdate", $locale->text('Invoice Date missing!')); @@ -702,7 +759,7 @@ sub post { # if oldcustomer ne customer redo form if (&check_name('customer')) { &update; - ::end_of_request(); + $::dispatcher->end_request; } if ($myconfig{mandatory_departments} && !$form->{department_id}) { @@ -735,8 +792,13 @@ sub post { $form->isblank("datepaid_$i", $locale->text('Payment date missing!')); + $form->error($locale->text('Cannot post transaction above the maximum future booking date!')) + if ($form->date_max_future($form->{"datepaid_$i"}, \%myconfig)); + + #Zusätzlich noch das Buchungsdatum in die Bücherkontrolle einbeziehen + # (Dient zur Prüfung ob ZE oder ZA geprüft werden soll) $form->error($locale->text('Cannot post payment for a closed period!')) - if ($form->date_closed($form->{"datepaid_$i"}, \%myconfig)); + if ($form->date_closed($form->{"datepaid_$i"}) && !$form->date_closed($form->{"gldate_$i"}, \%myconfig)); if ($form->{currency} ne $form->{defaultcurrency}) { $form->{"exchangerate_$i"} = $form->{exchangerate} @@ -765,15 +827,52 @@ sub post { } relink_accounts(); - $form->error($locale->text('Cannot post invoice!')) - unless IS->post_invoice(\%myconfig, \%$form); - remove_draft() if $form->{remove_draft}; + + my $terms = get_payment_terms_for_invoice(); + $form->{duedate} = $terms->calc_date(reference_date => $form->{invdate}, due_date => $form->{due_due})->to_kivitendo if $terms; + + # If transfer_out is requested, get rose db handle and do post and + # transfer out in one transaction. Otherwise just post the invoice. + if ($::instance_conf->get_is_transfer_out && $form->{type} ne 'credit_note' && !$form->{storno}) { + require SL::DB::Inventory; + my $rose_db = SL::DB::Inventory->new->db; + my @errors; + + if (!$rose_db->with_transaction(sub { + if (!eval { + if (!IS->post_invoice(\%myconfig, \%$form, $rose_db->dbh)) { + push @errors, $locale->text('Cannot post invoice!'); + die 'posting error'; + } + my $err = IS->transfer_out(\%$form, $rose_db->dbh); + if (@{ $err }) { + push @errors, @{ $err }; + die 'transfer error'; + } + + 1; + }) { + push @errors, $EVAL_ERROR; + die 'transaction error'; + } + + 1; + })) { + push @errors, $rose_db->error; + $form->error($locale->text('Cannot post invoice and/or transfer out! Error message:') . "\n" . join("\n", @errors)); + } + } else { + if (!IS->post_invoice(\%myconfig, \%$form)) { + $form->error($locale->text('Cannot post invoice!')); + } + } if(!exists $form->{addition}) { - $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->{snumbers} = 'invnumber' .'_'. $form->{invnumber}; # ($form->{type} eq 'credit_note' ? 'cnnumber' : 'invnumber') .'_'. $form->{invnumber}; + $form->{what_done} = 'invoice'; + $form->{addition} = $form->{print_and_post} ? "PRINTED AND POSTED" : + $form->{storno} ? "STORNO" : + "POSTED"; $form->save_history; } @@ -781,7 +880,7 @@ sub 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->{callback} = build_std_url(qw(action edit id callback saved_message)); $form->redirect; } @@ -795,7 +894,7 @@ sub print_and_post { $main::auth->assert('invoice_edit'); - my $old_form = new Form; + my $old_form = Form->new; $form->{no_redirect_after_post} = 1; $form->{print_and_post} = 1; &post(); @@ -813,16 +912,19 @@ sub use_as_new { $main::auth->assert('invoice_edit'); - 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; + delete @{ $form }{qw(printed emailed queued invnumber invdate exchangerate forex deliverydate id datepaid_1 gldate_1 acc_trans_id_1 source_1 memo_1 paid_1 exchangerate_1 AP_paid_1 storno locked)}; $form->{rowcount}--; - $form->{invdate} = $form->current_date(\%myconfig); - $form->{duedate} = $form->get_duedate(\%myconfig, $form->{invdate}) || $form->{invdate}; + $form->{paidaccounts} = 1; + $form->{invdate} = $form->current_date(\%myconfig); + my $terms = get_payment_terms_for_invoice(); + $form->{duedate} = $terms ? $terms->calc_date(reference_date => $form->{invdate})->to_kivitendo : $form->{invdate}; + $form->{employee_id} = SL::DB::Manager::Employee->current->id; + $form->{forex} = $form->check_exchangerate(\%myconfig, $form->{currency}, $form->{invdate}, 'buy'); + $form->{exchangerate} = $form->{forex} if $form->{forex}; - # remember pricegroups for "use as new" - IS->get_pricegroups_for_parts(\%myconfig, \%$form); - set_pricegroup($_) for 1 .. $form->{rowcount}; + $form->{"converted_from_invoice_id_$_"} = delete $form->{"invoice_id_$_"} for 1 .. $form->{"rowcount"}; + $form->{useasnew} = 1; &display_form; $main::lxdebug->leave_sub(); @@ -848,6 +950,12 @@ sub storno { $form->error($locale->text('Cannot storno invoice for a closed period!')); } + # save the history of invoice being stornoed + $form->{snumbers} = qq|invnumber_| . $form->{invnumber}; + $form->{what_done} = 'invoice'; + $form->{addition} = "STORNO"; + $form->save_history; + map({ my $key = $_; delete($form->{$key}) unless (grep({ $key eq $_ } qw(id login password type))); } keys(%{ $form })); invoice_links(); @@ -858,12 +966,17 @@ sub storno { $form->{paidaccounts} = 0; map { my $key = $_; delete $form->{$key} if grep { $key =~ /^$_/ } qw(datepaid_ gldate_ acc_trans_id_ source_ memo_ paid_ exchangerate_ AR_paid_) } keys %{ $form }; + # record link invoice to storno + $form->{convert_from_ar_ids} = $form->{id}; $form->{storno_id} = $form->{id}; $form->{storno} = 1; $form->{id} = ""; $form->{invnumber} = "Storno zu " . $form->{invnumber}; $form->{invdate} = DateTime->today->to_lxoffice; $form->{rowcount}++; + # set new ids for storno invoice + # set new persistent ids for storno invoice items + $form->{"converted_from_invoice_id_$_"} = delete $form->{"invoice_id_$_"} for 1 .. $form->{"rowcount"}; post(); $main::lxdebug->leave_sub(); @@ -877,7 +990,7 @@ sub preview { $main::auth->assert('invoice_edit'); $form->{preview} = 1; - my $old_form = new Form; + my $old_form = Form->new; for (keys %$form) { $old_form->{$_} = $form->{$_} } &print_form($old_form); @@ -885,49 +998,6 @@ sub preview { } -sub delete { - $main::lxdebug->enter_sub(); - - my $form = $main::form; - my $locale = $main::locale; - - $main::auth->assert('invoice_edit'); - - if ($form->{second_run}) { - $form->{print_and_post} = 0; - } - $form->header; - - print qq| -
-|; - - $main::lxdebug->leave_sub(); -} - sub credit_note { $main::lxdebug->enter_sub(); @@ -941,9 +1011,9 @@ sub credit_note { $form->{duedate} = $form->current_date(\%myconfig, $form->{invdate}, $form->{terms} * 1); + $form->{convert_from_ar_ids} = $form->{id}; $form->{id} = ''; $form->{rowcount}--; - $form->{shipto} = 1; $form->{title} = $locale->text('Add Credit Note'); @@ -963,11 +1033,8 @@ sub credit_note { # map { $form->{$_} = $form->parse_amount(\%myconfig, $form->{$_}) } # qw(creditlimit creditremaining); - for my $i (1 .. $form->{rowcount}) { - for (qw(listprice)) { - $form->{"${_}_${i}"} = $form->parse_amount(\%myconfig, $form->{"${_}_${i}"}) if $form->{"${_}_${i}"}; - } - } + # set new persistent ids for credit note and link previous invoice id + $form->{"converted_from_invoice_id_$_"} = delete $form->{"invoice_id_$_"} for 1 .. $form->{"rowcount"}; my $currency = $form->{currency}; &invoice_links; @@ -998,30 +1065,48 @@ sub credit_note { $main::lxdebug->leave_sub(); } -sub yes { - $main::lxdebug->enter_sub(); +sub display_form { + $::lxdebug->enter_sub; - my $form = $main::form; - my %myconfig = %main::myconfig; - my $locale = $main::locale; + $::auth->assert('invoice_edit'); - $main::auth->assert('invoice_edit'); + relink_accounts(); + + my $new_rowcount = $::form->{"rowcount"} * 1 + 1; + $::form->{"project_id_${new_rowcount}"} = $::form->{"globalproject_id"}; + + $::form->language_payment(\%::myconfig); - if (IS->delete_invoice(\%myconfig, \%$form)) { + Common::webdav_folder($::form); + + form_header(); + display_row(++$::form->{rowcount}); + form_footer(); + + $::lxdebug->leave_sub; +} + +sub delete { + $::auth->assert('invoice_edit'); + + if (IS->delete_invoice(\%::myconfig, $::form)) { # saving the history - if(!exists $form->{addition}) { - $form->{snumbers} = 'invnumber' .'_'. $form->{invnumber}; # ($form->{type} eq 'credit_note' ? 'cnnumber' : 'invnumber') .'_'. $form->{invnumber}; - $form->{addition} = "DELETED"; - $form->save_history; + if(!exists $::form->{addition}) { + $::form->{snumbers} = 'invnumber' .'_'. $::form->{invnumber}; + $::form->{what_done} = 'invoice'; + $::form->{addition} = "DELETED"; + $::form->save_history; } # /saving the history - $form->redirect($locale->text('Invoice deleted!')); + $::form->redirect($::locale->text('Invoice deleted!')); } - $form->error($locale->text('Cannot delete invoice!')); - - $main::lxdebug->leave_sub(); + $::form->error($::locale->text('Cannot delete invoice!')); } +sub post_and_e_mail { + e_mail(); +}; + sub e_mail { $main::lxdebug->enter_sub(); @@ -1043,3 +1128,18 @@ sub e_mail { $main::lxdebug->leave_sub(); } + +sub dispatcher { + for my $action (qw( + print update ship_to e_mail storno post_payment use_as_new credit_note + delete post order preview post_and_e_mail print_and_post + mark_as_paid + )) { + if ($::form->{"action_$action"}) { + call_sub($action); + return; + } + } + + $::form->error($::locale->text('No action defined.')); +}