1 package SL::Controller::PriceSource;
5 use parent qw(SL::Controller::Base);
7 use List::MoreUtils qw(any uniq apply);
8 use SL::Locale::String qw(t8);
11 use Rose::Object::MakeMethods::Generic
13 scalar => [ qw(record_item) ],
14 'scalar --get_set_init' => [ qw(record) ],
17 __PACKAGE__->run_before('check_auth');
23 sub action_price_popup {
26 my $record_item = _make_record_item($::form->{row});
28 if (($old_unit = $record_item->{__additional_form_attributes}{unit_old}) && $old_unit ne $record_item->unit) {
29 # reset unit changes. the way these interact on update breaks stuff
30 $record_item->unit_obj(SL::DB::Manager::Unit->find_by(name => $old_unit));
31 $self->js->val("select[name='unit_$::form->{row}']", $old_unit);
34 $self->render_price_dialog($record_item);
37 sub render_price_dialog {
38 my ($self, $record_item) = @_;
40 my $price_source = SL::PriceSource->new(record_item => $record_item, record => $self->record);
44 'kivi.io.price_chooser_dialog',
45 t8('Available Prices'),
46 $self->render('oe/price_sources_dialog', { output => 0 }, price_source => $price_source)
51 # $self->js->text('#dialog_flash_error_content', join ' ', @errors);
52 # $self->js->show('#dialog_flash_error');
64 if ($::form->{vc} eq 'customer') {
65 $::auth->assert('sales_edit_prices');
66 } elsif ($::form->{vc} eq 'vendor') {
67 $::auth->assert('purchase_edit_prices');
69 $::auth->assert('no_such_right');
77 sub _make_record_item {
81 sales_order => 'OrderItem',
82 purchase_order => 'OrderItem',
83 sales_quotation => 'OrderItem',
84 request_quotation => 'OrderItem',
85 invoice => 'InvoiceItem',
86 invoice_for_advance_payment => 'InvoiceItem',
87 final_invoice => 'InvoiceItem',
88 purchase_invoice => 'InvoiceItem',
89 credit_note => 'InvoiceItem',
90 purchase_delivery_order => 'DeliveryOrderItem',
91 sales_delivery_order => 'DeliveryOrderItem',
96 $class = 'SL::DB::' . $class;
98 my %translated_methods = (
99 'SL::DB::OrderItem' => {
101 orderitems_id => 'id',
103 'SL::DB::DeliveryOrderItem' => {
105 delivery_order_items_id => 'id',
107 'SL::DB::InvoiceItem' => {
113 eval "require $class";
115 my $obj = $::form->{"orderitems_id_$row"}
116 ? $class->meta->convention_manager->auto_manager_class_name->find_by(id => $::form->{"orderitems_id_$row"})
119 for my $key (grep { /_$row$/ } keys %$::form) {
121 $method =~ s/_$row$//;
122 $method = $translated_methods{$class}{$method} // $method;
123 my $value = $::form->{$key};
124 if ($obj->meta->column($method)) {
125 if ($obj->meta->column($method)->isa('Rose::DB::Object::Metadata::Column::Date')) {
126 $obj->${\"$method\_as_date"}($value);
127 } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::(?:Numeric|Float|DoublePrecsion)$/) {
128 $obj->${\"$method\_as_number"}($value);
129 } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::Boolean$/) {
130 $obj->$method(!!$value);
132 $obj->$method($value);
135 $obj->{__additional_form_attributes}{$method} = $value;
139 if ($::form->{"id_$row"}) {
140 $obj->part(SL::DB::Part->load_cached($::form->{"id_$row"}));
147 my ($with_items) = @_;
150 sales_order => 'Order',
151 purchase_order => 'Order',
152 sales_quotation => 'Order',
153 request_quotation => 'Order',
154 purchase_invoice => 'PurchaseInvoice',
155 purchase_delivery_order => 'DeliveryOrder',
156 sales_delivery_order => 'DeliveryOrder',
157 }->{$::form->{type}};
159 if ($::form->{type} =~ /invoice|credit_note/) {
160 $class = $::form->{vc} eq 'customer' ? 'Invoice'
161 : $::form->{vc} eq 'vendor' ? 'PurchaseInvoice'
162 : do { die 'unknown invoice type' };
165 return unless $class;
167 $class = 'SL::DB::' . $class;
169 eval "require $class";
171 my $obj = $::form->{id}
172 ? $class->meta->convention_manager->auto_manager_class_name->find_by(id => $::form->{id})
175 for my $method (keys %$::form) {
176 next unless $obj->can($method);
177 next unless $obj->meta->column($method);
179 if ($obj->meta->column($method)->isa('Rose::DB::Object::Metadata::Column::Date')) {
180 $obj->${\"$method\_as_date"}($::form->{$method});
181 } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::(?:Numeric|Float|DoublePrecsion)$/) {
182 $obj->${\"$method\_as\_number"}($::form->{$method});
183 } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::Boolean$/) {
184 $obj->$method(!!$::form->{$method});
186 $obj->$method($::form->{$method});
192 for my $i (1 .. $::form->{rowcount}) {
193 next unless $::form->{"id_$i"};
194 push @items, _make_record_item($i)
197 $obj->items(@items) if @items;
199 $obj->is_sales(!!$obj->customer_id) if $class eq 'SL::DB::DeliveryOrder';