Merge branch 'test' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / SL / Controller / PriceSource.pm
index ab74da0..c0c113c 100644 (file)
@@ -5,14 +5,13 @@ use strict;
 use parent qw(SL::Controller::Base);
 
 use List::MoreUtils qw(any uniq apply);
-use SL::ClientJS;
 use SL::Locale::String qw(t8);
 use SL::PriceSource;
 
 use Rose::Object::MakeMethods::Generic
 (
  scalar => [ qw(record_item) ],
- 'scalar --get_set_init' => [ qw(js record) ],
+ 'scalar --get_set_init' => [ qw(record) ],
 );
 
 __PACKAGE__->run_before('check_auth');
@@ -25,6 +24,12 @@ sub action_price_popup {
   my ($self) = @_;
 
   my $record_item = _make_record_item($::form->{row});
+  my $old_unit;
+  if (($old_unit = $record_item->{__additional_form_attributes}{unit_old}) && $old_unit ne $record_item->unit) {
+    # reset unit changes. the way these interact on update breaks stuff
+    $record_item->unit_obj(SL::DB::Manager::Unit->find_by(name => $old_unit));
+    $self->js->val("select[name='unit_$::form->{row}']", $old_unit);
+  }
 
   $self->render_price_dialog($record_item);
 }
@@ -47,7 +52,7 @@ sub render_price_dialog {
 #     $self->js->show('#dialog_flash_error');
 #   }
 
-  $self->js->render($self);
+  $self->js->render;
 }
 
 
@@ -56,11 +61,13 @@ sub render_price_dialog {
 #
 
 sub check_auth {
-  $::auth->assert('edit_prices');
-}
-
-sub init_js {
-  SL::ClientJS->new
+  if ($::form->{vc} eq 'customer') {
+    $::auth->assert('sales_edit_prices');
+  } elsif ($::form->{vc} eq 'vendor') {
+    $::auth->assert('purchase_edit_prices');
+  } else {
+    $::auth->assert('no_such_right');
+  }
 }
 
 sub init_record {
@@ -76,7 +83,10 @@ sub _make_record_item {
     sales_quotation         => 'OrderItem',
     request_quotation       => 'OrderItem',
     invoice                 => 'InvoiceItem',
+    invoice_for_advance_payment => 'InvoiceItem',
+    final_invoice           => 'InvoiceItem',
     purchase_invoice        => 'InvoiceItem',
+    credit_note             => 'InvoiceItem',
     purchase_delivery_order => 'DeliveryOrderItem',
     sales_delivery_order    => 'DeliveryOrderItem',
   }->{$::form->{type}};
@@ -85,20 +95,44 @@ sub _make_record_item {
 
   $class = 'SL::DB::' . $class;
 
+  my %translated_methods = (
+    'SL::DB::OrderItem' => {
+      id                      => 'parts_id',
+      orderitems_id           => 'id',
+    },
+    'SL::DB::DeliveryOrderItem' => {
+      id                      => 'parts_id',
+      delivery_order_items_id => 'id',
+    },
+    'SL::DB::InvoiceItem' => {
+      id                      => 'parts_id',
+      invoice_id => 'id',
+    },
+  );
+
   eval "require $class";
 
   my $obj = $::form->{"orderitems_id_$row"}
           ? $class->meta->convention_manager->auto_manager_class_name->find_by(id => $::form->{"orderitems_id_$row"})
           : $class->new;
 
-  for my $method (apply { s/_$row$// } grep { /_$row$/ } keys %$::form) {
-    next unless $obj->meta->column($method);
-    if ($obj->meta->column($method)->isa('Rose::DB::Object::Metadata::Column::Date')) {
-      $obj->${\"$method\_as_date"}($::form->{"$method\_$row"});
-    } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::(?:Numeric|Float|DoublePrecsion)$/) {
-      $obj->${\"$method\_as_number"}($::form->{"$method\_$row"});
+  for my $key (grep { /_$row$/ } keys %$::form) {
+    my $method = $key;
+    $method =~ s/_$row$//;
+    $method = $translated_methods{$class}{$method} // $method;
+    my $value = $::form->{$key};
+    if ($obj->meta->column($method)) {
+      if ($obj->meta->column($method)->isa('Rose::DB::Object::Metadata::Column::Date')) {
+        $obj->${\"$method\_as_date"}($value);
+      } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::(?:Numeric|Float|DoublePrecsion)$/) {
+        $obj->${\"$method\_as_number"}($value);
+      } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::Boolean$/) {
+        $obj->$method(!!$value);
+      } else {
+        $obj->$method($value);
+      }
     } else {
-      $obj->$method($::form->{"$method\_$row"});
+      $obj->{__additional_form_attributes}{$method} = $value;
     }
   }
 
@@ -114,10 +148,9 @@ sub _make_record {
 
   my $class = {
     sales_order             => 'Order',
-    purchase_oder           => 'Order',
+    purchase_order          => 'Order',
     sales_quotation         => 'Order',
     request_quotation       => 'Order',
-    invoice                 => 'Invoice',
     purchase_invoice        => 'PurchaseInvoice',
     purchase_delivery_order => 'DeliveryOrder',
     sales_delivery_order    => 'DeliveryOrder',
@@ -147,6 +180,8 @@ sub _make_record {
       $obj->${\"$method\_as_date"}($::form->{$method});
     } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::(?:Numeric|Float|DoublePrecsion)$/) {
       $obj->${\"$method\_as\_number"}($::form->{$method});
+    } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::Boolean$/) {
+      $obj->$method(!!$::form->{$method});
     } else {
       $obj->$method($::form->{$method});
     }
@@ -161,9 +196,9 @@ sub _make_record {
 
     $obj->items(@items) if @items;
   }
+  $obj->is_sales(!!$obj->customer_id) if $class eq 'SL::DB::DeliveryOrder';
 
   return $obj;
 }
 
 1;
-