X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=bin%2Fmozilla%2Fis.pl;h=837bde7f996d599ce2a4989ce733ba0fb47b21d0;hb=59f6b67c2936ef72e9c5ee3629fe49876bd9f484;hp=b6d6d34045296ba6ca19f5d9c19a7298b6779438;hpb=a4193657f8fb28966959276593999192abf70ca2;p=kivitendo-erp.git diff --git a/bin/mozilla/is.pl b/bin/mozilla/is.pl index b6d6d3404..837bde7f9 100644 --- a/bin/mozilla/is.pl +++ b/bin/mozilla/is.pl @@ -36,9 +36,11 @@ use SL::FU; use SL::IS; use SL::OE; use SL::MoreCommon qw(restore_form save_form); +use SL::RecordLinks; + use Data::Dumper; use DateTime; -use List::MoreUtils qw(uniq); +use List::MoreUtils qw(any uniq); use List::Util qw(max sum); use List::UtilsBy qw(sort_by); use English qw(-no_match_vars); @@ -249,6 +251,7 @@ sub prepare_invoice { } elsif ($form->{type} eq "invoice_for_advance_payment") { $form->{type} = "invoice_for_advance_payment"; + $form->{formname} = "invoice_for_advance_payment"; } elsif ($form->{formname} eq "proforma" ) { $form->{type} = "invoice"; @@ -308,6 +311,21 @@ sub setup_is_action_bar { if ($::instance_conf->get_warn_no_delivery_order_for_invoice && !$form->{id}) { $warn_unlinked_delivery_order = 1 unless $form->{convert_from_do_ids}; } + + my $has_further_invoice_for_advance_payment; + if ($form->{id} && $form->{type} eq "invoice_for_advance_payment") { + my $invoice_obj = SL::DB::Invoice->load_cached($form->{id}); + my $lr = $invoice_obj->linked_records(direction => 'to', to => ['Invoice']); + $has_further_invoice_for_advance_payment = any {'SL::DB::Invoice' eq ref $_ && "invoice_for_advance_payment" eq $_->type} @$lr; + } + + my $has_final_invoice; + if ($form->{id} && $form->{type} eq "invoice_for_advance_payment") { + my $invoice_obj = SL::DB::Invoice->load_cached($form->{id}); + my $lr = $invoice_obj->linked_records(direction => 'to', to => ['Invoice']); + $has_final_invoice = any {'SL::DB::Invoice' eq ref $_ && "invoice" eq $_->invoice_type} @$lr; + } + for my $bar ($::request->layout->get('actionbar')) { $bar->add( action => [ @@ -392,6 +410,28 @@ sub setup_is_action_bar { : !$form->{id} ? t8('This invoice has not been posted yet.') : undef, ], + action => [ + t8('Further Invoice for Advance Payment'), + submit => [ '#form', { action => "further_invoice_for_advance_payment" } ], + checks => [ 'kivi.validate_form' ], + disabled => !$may_edit_create ? t8('You must not change this invoice.') + : !$form->{id} ? t8('This invoice has not been posted yet.') + : $has_further_invoice_for_advance_payment ? t8('This invoice has already a further invoice for advanced payment.') + : $has_final_invoice ? t8('This invoice has already a final invoice.') + : undef, + only_if => $form->{type} eq "invoice_for_advance_payment", + ], + action => [ + t8('Final Invoice'), + submit => [ '#form', { action => "final_invoice" } ], + checks => [ 'kivi.validate_form' ], + disabled => !$may_edit_create ? t8('You must not change this invoice.') + : !$form->{id} ? t8('This invoice has not been posted yet.') + : $has_further_invoice_for_advance_payment ? t8('This invoice has a further invoice for advanced payment.') + : $has_final_invoice ? t8('This invoice has already a final invoice.') + : undef, + only_if => $form->{type} eq "invoice_for_advance_payment", + ], action => [ t8('Credit Note'), submit => [ '#form', { action => "credit_note" } ], @@ -984,6 +1024,12 @@ sub post { $form->isblank("exchangerate", $locale->text('Exchangerate missing!')) if ($form->{currency} ne $form->{defaultcurrency}); + # advance payment allows only one tax + if ($form->{type} eq 'invoice_for_advance_payment') { + my @current_taxaccounts = (split(/ /, $form->{taxaccounts})); + $form->error($locale->text('Cannot post invoice for advance payment with more than one tax')) + if (scalar @current_taxaccounts > 1); + } for my $i (1 .. $form->{paidaccounts}) { if ($form->parse_amount(\%myconfig, $form->{"paid_$i"})) { @@ -1128,6 +1174,85 @@ sub use_as_new { $main::lxdebug->leave_sub(); } +sub further_invoice_for_advance_payment { + my $form = $main::form; + my %myconfig = %main::myconfig; + + $main::auth->assert('invoice_edit'); + + delete @{ $form }{qw(printed emailed queued invnumber invdate exchangerate forex deliverydate datepaid_1 gldate_1 acc_trans_id_1 source_1 memo_1 paid_1 exchangerate_1 AP_paid_1 storno locked)}; + $form->{convert_from_ar_ids} = $form->{id}; + $form->{id} = ''; + $form->{rowcount}--; + $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}; + + $form->{"converted_from_invoice_id_$_"} = delete $form->{"invoice_id_$_"} for 1 .. $form->{"rowcount"}; + + &display_form; +} + +sub final_invoice { + my $form = $main::form; + my %myconfig = %main::myconfig; + + $main::auth->assert('invoice_edit'); + + # search all related invoices for advance payment + # + # (order) -> invoice for adv. payment 1 -> invoice for adv. payment 2 -> invoice for adv. payment 3 -> final invoice + # + # we are currently in the last invoice for adv. payment (3 in this example) + my $related_invoices = IS->_get_invoices_for_advance_payment($form->{id}); + + delete @{ $form }{qw(printed emailed queued invnumber invdate exchangerate forex deliverydate datepaid_1 gldate_1 acc_trans_id_1 source_1 memo_1 paid_1 exchangerate_1 AP_paid_1 storno locked)}; + + $form->{convert_from_ar_ids} = $form->{id}; + $form->{id} = ''; + $form->{type} = 'invoice'; + $form->{title} = t8('Edit Final Invoice'); + $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}; + + foreach my $i (1 .. $form->{"rowcount"}) { + delete $form->{"id_$i"}; + delete $form->{"invoice_id_$i"}; + delete $form->{"parts_id_$i"}; + delete $form->{"partnumber_$i"}; + delete $form->{"description_$i"}; + } + + remove_emptied_rows(1); + + my $i = 0; + foreach my $ri (@$related_invoices) { + foreach my $item (@{$ri->items_sorted}) { + $i++; + $form->{"id_$i"} = $item->parts_id; + $form->{"partnumber_$i"} = $item->part->partnumber; + $form->{"discount_$i"} = $item->discount*100.0; + $form->{"sellprice_$i"} = $item->fxsellprice; + $form->{$_ . "_" . $i} = $item->$_ for qw(description longdescription qty price_factor_id unit sellprice active_price_source active_discount_source); + + $form->{$_ . "_" . $i} = $form->format_amount(\%myconfig, $form->{$_ . "_" . $i}) for qw(qty sellprice discount); + } + } + $form->{rowcount} = $i; + + update(); + $::dispatcher->end_request; +} + sub storno { $main::lxdebug->enter_sub(); @@ -1257,7 +1382,6 @@ sub credit_note { &prepare_invoice; - &display_form; $main::lxdebug->leave_sub();