1 package SL::Controller::PriceSource;
5 use parent qw(SL::Controller::Base);
7 use List::MoreUtils qw(any uniq apply);
9 use SL::Locale::String qw(t8);
12 use Rose::Object::MakeMethods::Generic
14 scalar => [ qw(record_item) ],
15 'scalar --get_set_init' => [ qw(js record) ],
18 __PACKAGE__->run_before('check_auth');
24 sub action_price_popup {
27 my $record_item = _make_record_item($::form->{row});
29 $self->render_price_dialog($record_item);
32 sub render_price_dialog {
33 my ($self, $record_item) = @_;
35 my $price_source = SL::PriceSource->new(record_item => $record_item, record => $self->record);
39 'kivi.io.price_chooser_dialog',
40 t8('Available Prices'),
41 $self->render('oe/price_sources_dialog', { output => 0 }, price_source => $price_source)
46 # $self->js->text('#dialog_flash_error_content', join ' ', @errors);
47 # $self->js->show('#dialog_flash_error');
50 $self->js->render($self);
59 $::auth->assert('edit_prices');
70 sub _make_record_item {
74 sales_order => 'OrderItem',
75 purchase_order => 'OrderItem',
76 sales_quotation => 'OrderItem',
77 request_quotation => 'OrderItem',
78 invoice => 'InvoiceItem',
79 purchase_invoice => 'InvoiceItem',
80 purchase_delivery_order => 'DeliveryOrderItem',
81 sales_delivery_order => 'DeliveryOrderItem',
86 $class = 'SL::DB::' . $class;
88 eval "require $class";
90 my $obj = $::form->{"orderitems_id_$row"}
91 ? $class->meta->convention_manager->auto_manager_class_name->find_by(id => $::form->{"orderitems_id_$row"})
94 for my $method (apply { s/_$row$// } grep { /_$row$/ } keys %$::form) {
95 next unless $obj->meta->column($method);
96 if ($obj->meta->column($method)->isa('Rose::DB::Object::Metadata::Column::Date')) {
97 $obj->${\"$method\_as_date"}($::form->{"$method\_$row"});
98 } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::(?:Numeric|Float|DoublePrecsion)$/) {
99 $obj->${\"$method\_as_number"}($::form->{"$method\_$row"});
101 $obj->$method($::form->{"$method\_$row"});
105 if ($::form->{"id_$row"}) {
106 $obj->part(SL::DB::Part->load_cached($::form->{"id_$row"}));
113 my ($with_items) = @_;
116 sales_order => 'Order',
117 purchase_oder => 'Order',
118 sales_quotation => 'Order',
119 request_quotation => 'Order',
120 invoice => 'Invoice',
121 purchase_invoice => 'PurchaseInvoice',
122 purchase_delivery_order => 'DeliveryOrder',
123 sales_delivery_order => 'DeliveryOrder',
124 }->{$::form->{type}};
126 if ($::form->{type} =~ /invoice|credit_note/) {
127 $class = $::form->{vc} eq 'customer' ? 'Invoice'
128 : $::form->{vc} eq 'vendor' ? 'PurchaseInvoice'
129 : do { die 'unknown invoice type' };
132 return unless $class;
134 $class = 'SL::DB::' . $class;
136 eval "require $class";
138 my $obj = $::form->{id}
139 ? $class->meta->convention_manager->auto_manager_class_name->find_by(id => $::form->{id})
142 for my $method (keys %$::form) {
143 next unless $obj->can($method);
144 next unless $obj->meta->column($method);
146 if ($obj->meta->column($method)->isa('Rose::DB::Object::Metadata::Column::Date')) {
147 $obj->${\"$method\_as_date"}($::form->{$method});
148 } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::(?:Numeric|Float|DoublePrecsion)$/) {
149 $obj->${\"$method\_as\_number"}($::form->{$method});
151 $obj->$method($::form->{$method});
157 for my $i (1 .. $::form->{rowcount}) {
158 next unless $::form->{"id_$i"};
159 push @items, _make_record_item($i)
162 $obj->items(@items) if @items;