Anzahlungs-Rg.: Workflow Anzahlungs-Rg. -> Anzahlungs-Rg.
authorBernd Bleßmann <bernd@kivitendo-premium.de>
Mon, 15 Nov 2021 12:01:45 +0000 (13:01 +0100)
committerJan Büren <jan@kivitendo.de>
Mon, 14 Feb 2022 12:52:01 +0000 (13:52 +0100)
bin/mozilla/is.pl
locale/de/all
locale/en/all

index a8b62a4..f54f854 100644 (file)
@@ -38,7 +38,7 @@ use SL::OE;
 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);
@@ -309,6 +309,14 @@ 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;
+  }
+
   for my $bar ($::request->layout->get('actionbar')) {
     $bar->add(
       action => [
@@ -393,6 +401,16 @@ 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.')
+                    :                     undef,
+          only_if  => $form->{type} eq "invoice_for_advance_payment",
+        ],
         action => [
           t8('Credit Note'),
           submit   => [ '#form', { action => "credit_note" } ],
@@ -1129,6 +1147,29 @@ 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 storno {
   $main::lxdebug->enter_sub();
 
@@ -1258,7 +1299,6 @@ sub credit_note {
 
   &prepare_invoice;
 
-
   &display_form;
 
   $main::lxdebug->leave_sub();
index 1ffd12f..f456c57 100755 (executable)
@@ -1622,6 +1622,7 @@ $self->{texts} = {
   'Function block actions'      => 'Funktionsblockaktionen',
   'Function block number format' => 'Format der Funktionsblocknummerierung',
   'Function/position'           => 'Funktion/Position',
+  'Further Invoice for Advance Payment' => 'Weitere Anzahlungsrechnung',
   'GL Transaction'              => 'Dialogbuchung',
   'GL Transaction (abbreviation)' => 'DB',
   'GL Transactions'             => 'Dialogbuchungen',
@@ -3849,6 +3850,7 @@ $self->{texts} = {
   'This group is valid for the following clients' => 'Diese Gruppe ist für die folgenden Mandanten gültig',
   'This has been changed in this version, therefore please change the "old" bins to some real warehouse bins.' => 'Das wurde in dieser Version umgestellt, bitte ändern Sie die Freitext-Lagerplätze auf vorhandene Lagerplätze.',
   'This has been changed in this version.' => 'Ab dieser Version ist dies nicht mehr so.',
+  'This invoice has already a further invoice for advanced payment.' => 'Diese Rechnung hat schon eine weitere Anzahlungsrechnung.',
   'This invoice has already been posted.' => 'Die Rechnung wurde bereits gebucht.',
   'This invoice has been canceled already.' => 'Die Rechnung wurde bereits storniert.',
   'This invoice has been linked with a sepa export, undo this first.' => 'Diese Rechnung ist mit einem SEPA-Export verknüpft. Bitte diese Verknüpfung zuerst aufheben.',
index 7682db7..900c365 100644 (file)
@@ -1622,6 +1622,7 @@ $self->{texts} = {
   'Function block actions'      => '',
   'Function block number format' => '',
   'Function/position'           => '',
+  'Further Invoice for Advance Payment' => '',
   'GL Transaction'              => '',
   'GL Transaction (abbreviation)' => '',
   'GL Transactions'             => '',
@@ -3844,6 +3845,7 @@ $self->{texts} = {
   'This group is valid for the following clients' => '',
   'This has been changed in this version, therefore please change the "old" bins to some real warehouse bins.' => '',
   'This has been changed in this version.' => '',
+  'This invoice has already a further invoice for advanced payment.' => '',
   'This invoice has already been posted.' => '',
   'This invoice has been canceled already.' => '',
   'This invoice has been linked with a sepa export, undo this first.' => '',