use SL::MoreCommon qw(restore_form save_form);
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);
if ($form->{storno}) {
$form->{title} = $locale->text('Add Storno Credit Note');
}
+
+ } elsif ($form->{type} eq "invoice_for_advance_payment") {
+ $form->{title} = $locale->text('Add Invoice for Advance Payment');
+
} else {
$form->{title} = $locale->text('Add Sales Invoice');
if ($form->{type} eq "credit_note") {
$form->{title} = $locale->text('Edit Credit Note');
$form->{title} = $locale->text('Edit Storno Credit Note') if $form->{storno};
+
+ } elsif ($form->{type} eq "invoice_for_advance_payment") {
+ $form->{title} = $locale->text('Edit Invoice for Advance Payment');
+ $form->{title} = $locale->text('Edit Storno Invoice for Advance Payment') if $form->{storno};
+
} else {
$form->{title} = $locale->text('Edit Sales Invoice');
$form->{title} = $locale->text('Edit Storno Invoice') if $form->{storno};
if ($form->{type} eq "credit_note") {
$form->{type} = "credit_note";
$form->{formname} = "credit_note";
+
+ } 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";
+
} else {
$form->{type} = "invoice";
$form->{formname} = "invoice";
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;
+ }
+
for my $bar ($::request->layout->get('actionbar')) {
$bar->add(
action => [
: !$form->{id} ? t8('This invoice has not been posted yet.')
: $is_linked_bank_transaction ? t8('This transaction is linked with a bank transaction. Please undo and redo the bank transaction booking if needed.')
: undef,
+ only_if => $form->{type} ne "invoice_for_advance_payment",
],
action => [ t8('Mark as paid'),
submit => [ '#form', { action => "mark_as_paid" } ],
disabled => !$may_edit_create ? t8('You must not change this invoice.')
: !$form->{id} ? t8('This invoice has not been posted yet.')
: undef,
- only_if => $::instance_conf->get_is_show_mark_as_paid,
+ only_if => $::instance_conf->get_is_show_mark_as_paid && $form->{type} ne "invoice_for_advance_payment",
],
], # end of combobox "Post"
: !$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.')
+ : undef,
+ only_if => $form->{type} eq "invoice_for_advance_payment",
+ ],
action => [
t8('Credit Note'),
submit => [ '#form', { action => "credit_note" } ],
$form->{"select$item"} =~ s/option>\Q$form->{$item}\E/option selected>$form->{$item}/;
}
+ $TMPL_VAR{is_type_invoice_for_advance_payment} = $form->{type} eq "invoice_for_advance_payment";
$TMPL_VAR{is_type_credit_note} = $form->{type} eq "credit_note";
$TMPL_VAR{is_format_html} = $form->{format} eq 'html';
$TMPL_VAR{dateformat} = $myconfig{dateformat};
}
print $form->parse_html_template('is/form_footer', {
+ is_type_invoice_for_advance_payment => ($form->{type} eq "invoice_for_advance_payment"),
is_type_credit_note => ($form->{type} eq "credit_note"),
totalpaid => $totalpaid,
paid_missing => $form->{invtotal} - $totalpaid,
$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 storno {
$main::lxdebug->enter_sub();
&prepare_invoice;
-
&display_form;
$main::lxdebug->leave_sub();