ActionBar: nicht mehr benötigte Lieferadressenmaske entfernt
[kivitendo-erp.git] / bin / mozilla / ap.pl
index dc02d13..b45cb99 100644 (file)
 #======================================================================
 
 use POSIX qw(strftime);
-use List::Util qw(max sum);
+use List::Util qw(first max sum);
 use List::UtilsBy qw(sort_by);
 
 use SL::AP;
 use SL::FU;
 use SL::GL;
+use SL::Helper::Flash qw(flash);
 use SL::IR;
 use SL::IS;
 use SL::ReportGenerator;
+use SL::DB::Currency;
 use SL::DB::Default;
 use SL::DB::PurchaseInvoice;
+use SL::DB::RecordTemplate;
+use SL::DB::Tax;
 use SL::Webdav;
 use SL::Locale::String qw(t8);
 
-require "bin/mozilla/arap.pl";
 require "bin/mozilla/common.pl";
 require "bin/mozilla/reportgenerator.pl";
 
@@ -85,6 +88,129 @@ use strict;
 # $locale->text('Nov')
 # $locale->text('Dec')
 
+sub load_record_template {
+  $::auth->assert('ap_transactions');
+
+  # Load existing template and verify that its one for this module.
+  my $template = SL::DB::RecordTemplate
+    ->new(id => $::form->{id})
+    ->load(
+      with_object => [ qw(customer payment currency record_items record_items.chart) ],
+    );
+
+  die "invalid template type" unless $template->template_type eq 'ap_transaction';
+
+  $template->substitute_variables;
+
+  # Clean the current $::form before rebuilding it from the template.
+  my $form_defaults = delete $::form->{form_defaults};
+  delete @{ $::form }{ grep { !m{^(?:script|login)$}i } keys %{ $::form } };
+
+  # Fill $::form from the template.
+  my $today                   = DateTime->today_local;
+  $::form->{title}            = "Add";
+  $::form->{currency}         = $template->currency->name;
+  $::form->{direct_debit}     = $template->direct_debit;
+  $::form->{globalproject_id} = $template->project_id;
+  $::form->{AP_chart_id}      = $template->ar_ap_chart_id;
+  $::form->{transdate}        = $today->to_kivitendo;
+  $::form->{duedate}          = $today->to_kivitendo;
+  $::form->{rowcount}         = @{ $template->items };
+  $::form->{paidaccounts}     = 1;
+  $::form->{$_}               = $template->$_ for qw(department_id ordnumber taxincluded notes);
+
+  if ($template->vendor) {
+    $::form->{vendor_id} = $template->vendor_id;
+    $::form->{vendor}    = $template->vendor->name;
+    $::form->{duedate}     = $template->vendor->payment->calc_date(reference_date => $today)->to_kivitendo if $template->vendor->payment;
+  }
+
+  my $row = 0;
+  foreach my $item (@{ $template->items }) {
+    $row++;
+
+    my $active_taxkey = $item->chart->get_active_taxkey;
+    my $taxes         = SL::DB::Manager::Tax->get_all(
+      where   => [ chart_categories => { like => '%' . $item->chart->category . '%' }],
+      sort_by => 'taxkey, rate',
+    );
+
+    my $tax   = first { $item->tax_id          == $_->id } @{ $taxes };
+    $tax    //= first { $active_taxkey->tax_id == $_->id } @{ $taxes };
+    $tax    //= $taxes->[0];
+
+    if (!$tax) {
+      $row--;
+      next;
+    }
+
+    $::form->{"AP_amount_chart_id_${row}"}          = $item->chart_id;
+    $::form->{"previous_AP_amount_chart_id_${row}"} = $item->chart_id;
+    $::form->{"amount_${row}"}                      = $::form->format_amount(\%::myconfig, $item->amount1, 2);
+    $::form->{"taxchart_${row}"}                    = $item->tax_id . '--' . $tax->rate;
+    $::form->{"project_id_${row}"}                  = $item->project_id;
+  }
+
+  $::form->{$_} = $form_defaults->{$_} for keys %{ $form_defaults // {} };
+
+  flash('info', $::locale->text("The record template '#1' has been loaded.", $template->template_name));
+
+  update(
+    keep_rows_without_amount => 1,
+    dont_add_new_row         => 1,
+  );
+}
+
+sub save_record_template {
+  $::auth->assert('ap_transactions');
+
+  my $template = $::form->{record_template_id} ? SL::DB::RecordTemplate->new(id => $::form->{record_template_id})->load : SL::DB::RecordTemplate->new;
+  my $js       = SL::ClientJS->new(controller => SL::Controller::Base->new);
+  my $new_name = $template->template_name_to_use($::form->{record_template_new_template_name});
+
+  $js->dialog->close('#record_template_dialog');
+
+  my @items = grep {
+    $_->{chart_id} && (($_->{tax_id} // '') ne '')
+  } map {
+    +{ chart_id   => $::form->{"AP_amount_chart_id_${_}"},
+       amount1    => $::form->parse_amount(\%::myconfig, $::form->{"amount_${_}"}),
+       tax_id     => (split m{--}, $::form->{"taxchart_${_}"})[0],
+       project_id => $::form->{"project_id_${_}"} || undef,
+     }
+  } (1..($::form->{rowcount} || 1));
+
+  $template->assign_attributes(
+    template_type  => 'ap_transaction',
+    template_name  => $new_name,
+
+    currency_id    => SL::DB::Manager::Currency->find_by(name => $::form->{currency})->id,
+    ar_ap_chart_id => $::form->{AP_chart_id}      || undef,
+    vendor_id      => $::form->{vendor_id}        || undef,
+    department_id  => $::form->{department_id}    || undef,
+    project_id     => $::form->{globalproject_id} || undef,
+    taxincluded    => $::form->{taxincluded}  ? 1 : 0,
+    direct_debit   => $::form->{direct_debit} ? 1 : 0,
+    ordnumber      => $::form->{ordnumber},
+    notes          => $::form->{notes},
+
+    items          => \@items,
+  );
+
+  eval {
+    $template->save;
+    1;
+  } or do {
+    return $js
+      ->flash('error', $::locale->text("Saving the record template '#1' failed.", $new_name))
+      ->render;
+  };
+
+  return $js
+    ->flash('info', $::locale->text("The record template '#1' has been saved.", $new_name))
+    ->render;
+}
+
 sub add {
   $main::lxdebug->enter_sub();
 
@@ -175,7 +301,6 @@ sub create_links {
   IR->get_vendor(\%myconfig, \%$form);
 
   $form->{$_}        = $saved{$_} for keys %saved;
-  $form->{oldvendor} = "$form->{vendor}--$form->{vendor_id}";
   $form->{rowcount}  = 1;
   $form->{AP_chart_id} = $form->{acc_trans} && $form->{acc_trans}->{AP} ? $form->{acc_trans}->{AP}->[0]->{chart_id} : $form->{AP_links}->{AP}->[0]->{chart_id};
 
@@ -185,17 +310,7 @@ sub create_links {
   # currencies
   $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
 
-  $form->{selectcurrency} = "";
-  map { my $quoted = H($_); $form->{selectcurrency} .= "<option value=\"${quoted}\">${quoted}\n" } $form->get_all_currencies(\%myconfig);
-
-  # vendors
-  if (@{ $form->{all_vendor} || [] }) {
-    $form->{vendor} = qq|$form->{vendor}--$form->{vendor_id}|;
-    map { my $quoted = H($_->{name} . "--" . $_->{id}); $form->{selectvendor} .= "<option value=\"${quoted}\">${quoted}\n" }
-      (@{ $form->{all_vendor} });
-  }
-
-  $::form->{ALL_DEPARTMENTS} = SL::DB::Manager::Department->get_all;
+  $::form->{ALL_DEPARTMENTS} = SL::DB::Manager::Department->get_all_sorted;
 
   $form->{employee} = "$form->{employee}--$form->{employee_id}";
 
@@ -239,7 +354,7 @@ sub form_header {
 
   $::form->{invoice_obj} = SL::DB::PurchaseInvoice->new(id => $::form->{id})->load if $::form->{id};
 
-  $form->{initial_focus} = !($form->{amount_1} * 1) ? 'vendor' : 'row_' . $form->{rowcount};
+  $form->{initial_focus} = !($form->{amount_1} * 1) ? 'vendor_id' : 'row_' . $form->{rowcount};
 
   $form->{title_} = $form->{title};
   $form->{title} = $form->{title} eq 'Add' ? $locale->text('Add Accounts Payables Transaction') : $locale->text('Edit Accounts Payables Transaction');
@@ -247,12 +362,6 @@ sub form_header {
   # type=submit $locale->text('Add Accounts Payables Transaction')
   # type=submit $locale->text('Edit Accounts Payables Transaction')
 
-  # set option selected
-  foreach my $item (qw(vendor currency)) {
-    my $to_replace         =  H($form->{$item});
-    $form->{"select$item"} =~ s/ selected//;
-    $form->{"select$item"} =~ s/>\Q${to_replace}\E/ selected>${to_replace}/;
-  }
   my $readonly = $form->{id} ? "readonly" : "";
 
   $form->{radier} = ($::instance_conf->get_ap_changeable == 2)
@@ -324,16 +433,10 @@ sub form_header {
     $charts{$item->{accno}} = $item;
   }
 
-  my %taxcharts = ();
-  foreach my $item (@{ $form->{ALL_TAXCHARTS} }) {
-    $taxcharts{$item->{id}} = $item;
-  }
-
-  my $follow_up_vc         =  $form->{vendor};
-  $follow_up_vc            =~ s/--.*?//;
+  my $follow_up_vc         = $form->{vendor_id} ? SL::DB::Vendor->load_cached($form->{vendor_id})->name : '';
   my $follow_up_trans_info =  "$form->{invnumber} ($follow_up_vc)";
 
-  $::request->layout->add_javascripts("autocomplete_chart.js", "show_vc_details.js", "show_history.js", "follow_up.js", "kivi.Draft.js", "kivi.GL.js");
+  $::request->layout->add_javascripts("autocomplete_chart.js", "autocomplete_customer.js", "show_vc_details.js", "show_history.js", "follow_up.js", "kivi.Draft.js", "kivi.GL.js", "kivi.RecordTemplate.js", "kivi.File.js");
   my $transdate = $::form->{transdate} ? DateTime->from_kivitendo($::form->{transdate}) : DateTime->today_local;
   my $first_taxchart;
 
@@ -348,8 +451,9 @@ sub form_header {
     my ($default_taxchart, $taxchart_to_use);
     my $amount_chart_id   = $form->{"AP_amount_chart_id_$i"} || $default_ap_amount_chart_id;
     my $chart_has_changed = $::form->{"previous_AP_amount_chart_id_$i"} && ($amount_chart_id != $::form->{"previous_AP_amount_chart_id_$i"});
+    my @taxcharts         = GL->get_active_taxes_for_chart($amount_chart_id, $transdate);
 
-    foreach my $item ( GL->get_active_taxes_for_chart($amount_chart_id, $transdate) ) {
+    foreach my $item (@taxcharts) {
       my $key             = $item->id . "--" . $item->rate;
       $first_taxchart   //= $item;
       $default_taxchart   = $item if $item->{is_default};
@@ -360,6 +464,7 @@ sub form_header {
     my $selected_taxchart            = $taxchart_to_use->id . '--' . $taxchart_to_use->rate;
     $form->{"selected_taxchart_$i"}  = $selected_taxchart;
     $form->{"AP_amount_chart_id_$i"} = $amount_chart_id;
+    $form->{"taxcharts_$i"}          = \@taxcharts;
   }
 
   $form->{taxchart_value_title_sub} = sub {
@@ -430,6 +535,7 @@ sub form_header {
 
   print $form->parse_html_template('ap/form_header', {
     today => DateTime->today,
+    currencies => SL::DB::Manager::Currency->get_all_sorted,
   });
 
   $main::lxdebug->leave_sub();
@@ -484,6 +590,8 @@ sub show_draft {
 }
 
 sub update {
+  my %params = @_;
+
   $main::lxdebug->enter_sub();
 
   my $form     = $main::form;
@@ -505,7 +613,7 @@ sub update {
   my (@a, $j, $totaltax);
   for my $i (1 .. $form->{rowcount}) {
     $form->{"amount_$i"} = $form->parse_amount(\%myconfig, $form->{"amount_$i"});
-    if ($form->{"amount_$i"}) {
+    if ($form->{"amount_$i"} || $params{keep_rows_without_amount}) {
       push @a, {};
       $j = $#a;
       my ($taxkey, $rate) = split(/--/, $form->{"taxchart_$i"});
@@ -528,9 +636,11 @@ sub update {
 
   $form->{invdate} = $form->{transdate};
 
-  my $vendor_changed = &check_name("vendor");
+  if (($form->{previous_vendor_id} || $form->{vendor_id}) != $form->{vendor_id}) {
+    IR->get_vendor(\%::myconfig, $form);
+  }
 
-  $form->{rowcount} = $count + 1;
+  $form->{rowcount} = $count + ($params{dont_add_new_row} ? 0 : 1);
 
   $form->{invtotal} =
     ($form->{taxincluded}) ? $form->{invtotal} : $form->{invtotal} + $totaltax;
@@ -556,7 +666,7 @@ sub update {
   $form->{oldinvtotal}  = $form->{invtotal};
   $form->{oldtotalpaid} = $totalpaid;
 
-  &display_form;
+  display_form();
 
   $main::lxdebug->leave_sub();
 }
@@ -631,7 +741,7 @@ sub post {
   # check if there is a vendor, invoice, due date and invnumber
   $form->isblank("transdate", $locale->text("Invoice Date missing!"));
   $form->isblank("duedate",   $locale->text("Due Date missing!"));
-  $form->isblank("vendor",    $locale->text('Vendor missing!'));
+  $form->isblank("vendor_id", $locale->text('Vendor missing!'));
   $form->isblank("invnumber", $locale->text('Invoice Number missing!'));
 
   if ($myconfig{mandatory_departments} && !$form->{department_id}) {
@@ -686,8 +796,7 @@ sub post {
   }
 
   # if old vendor ne vendor redo form
-  my ($vendor) = split /--/, $form->{vendor};
-  if ($form->{oldvendor} ne "$vendor--$form->{vendor_id}") {
+  if (($form->{previous_customer_id} || $form->{customer_id}) != $form->{customer_id}) {
     &update;
     $::dispatcher->end_request;
   }
@@ -711,7 +820,7 @@ sub post {
     }
     # /saving the history
     # Dieser Text wird niemals ausgegeben: Probleme beim redirect?
-    $form->redirect($locale->text('Transaction posted!')) unless $inline;
+    $form->redirect($locale->text('AP transaction posted.')) unless $inline;
   } else {
     $form->error($locale->text('Cannot post transaction!'));
   }
@@ -834,18 +943,16 @@ sub search {
   my %myconfig = %main::myconfig;
   my $locale   = $main::locale;
 
-  # setup customer selection
-  $form->all_vc(\%myconfig, "vendor", "AP");
-
   $form->{title}    = $locale->text('AP Transactions');
 
-  $form->get_lists("projects"     => { "key" => "ALL_PROJECTS", "all" => 1 },
-                   "vendors"      => "ALL_VC");
+  $form->get_lists(projects => { "key" => "ALL_PROJECTS", "all" => 1 });
 
-  $::form->{ALL_DEPARTMENTS} = SL::DB::Manager::Department->get_all;
+  $::form->{ALL_DEPARTMENTS} = SL::DB::Manager::Department->get_all_sorted;
   # constants and subs for template
   $form->{vc_keys}   = sub { "$_[0]->{name}--$_[0]->{id}" };
 
+  $::request->layout->add_javascripts("autocomplete_project.js");
+
   $form->header;
   print $form->parse_html_template('ap/search', { %myconfig });
 
@@ -882,8 +989,6 @@ sub ap_transactions {
 
   $main::auth->assert('vendor_invoice_edit');
 
-  ($form->{vendor}, $form->{vendor_id}) = split(/--/, $form->{vendor});
-
   report_generator_set_default_sort('transdate', 1);
 
   AP->ap_transactions(\%myconfig, \%$form);