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');
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);
}
# $self->js->show('#dialog_flash_error');
# }
- $self->js->render($self);
+ $self->js->render;
}
#
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 {
my $class = {
sales_order => 'OrderItem',
- purchase_oder => 'OrderItem',
+ purchase_order => 'OrderItem',
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}};
$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;
}
}
my $class = {
sales_order => 'Order',
- purchase_oder => 'Order',
+ purchase_order => 'Order',
sales_quotation => 'Order',
request_quotation => 'Order',
+ purchase_invoice => 'PurchaseInvoice',
purchase_delivery_order => 'DeliveryOrder',
sales_delivery_order => 'DeliveryOrder',
}->{$::form->{type}};
- if ($::form->{type} eq 'invoice') {
+ if ($::form->{type} =~ /invoice|credit_note/) {
$class = $::form->{vc} eq 'customer' ? 'Invoice'
: $::form->{vc} eq 'vendor' ? 'PurchaseInvoice'
: do { die 'unknown invoice type' };
$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});
}
$obj->items(@items) if @items;
}
+ $obj->is_sales(!!$obj->customer_id) if $class eq 'SL::DB::DeliveryOrder';
return $obj;
}
1;
-