]> wagnertech.de Git - mfinanz.git/blob - SL/Controller/PriceSource.pm
Merge branch 'master' of http://wagnertech.de/git/mfinanz
[mfinanz.git] / SL / Controller / PriceSource.pm
1 package SL::Controller::PriceSource;
2
3 use strict;
4
5 use parent qw(SL::Controller::Base);
6
7 use List::MoreUtils qw(any uniq apply);
8 use SL::Locale::String qw(t8);
9 use SL::PriceSource;
10
11 use Rose::Object::MakeMethods::Generic
12 (
13  scalar => [ qw(record_item) ],
14  'scalar --get_set_init' => [ qw(record) ],
15 );
16
17 __PACKAGE__->run_before('check_auth');
18
19 #
20 # actions
21 #
22
23 sub action_price_popup {
24   my ($self) = @_;
25
26   my $record_item = _make_record_item($::form->{row});
27   my $old_unit;
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);
32   }
33
34   $self->render_price_dialog($record_item);
35 }
36
37 sub render_price_dialog {
38   my ($self, $record_item) = @_;
39
40   my $price_source = SL::PriceSource->new(record_item => $record_item, record => $self->record);
41
42   $self->js
43     ->run(
44       'kivi.io.price_chooser_dialog',
45       t8('Available Prices'),
46       $self->render('oe/price_sources_dialog', { output => 0 }, price_source => $price_source)
47     )
48     ->reinit_widgets;
49
50 #   if (@errors) {
51 #     $self->js->text('#dialog_flash_error_content', join ' ', @errors);
52 #     $self->js->show('#dialog_flash_error');
53 #   }
54
55   $self->js->render;
56 }
57
58
59 #
60 # internal stuff
61 #
62
63 sub check_auth {
64   if ($::form->{vc} eq 'customer') {
65     $::auth->assert('sales_edit_prices');
66   } elsif ($::form->{vc} eq 'vendor') {
67     $::auth->assert('purchase_edit_prices');
68   } else {
69     $::auth->assert('no_such_right');
70   }
71 }
72
73 sub init_record {
74   _make_record();
75 }
76
77 sub _make_record_item {
78   my ($row) = @_;
79
80   my $class = {
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',
92   }->{$::form->{type}};
93
94   return unless $class;
95
96   $class = 'SL::DB::' . $class;
97
98   my %translated_methods = (
99     'SL::DB::OrderItem' => {
100       id                      => 'parts_id',
101       orderitems_id           => 'id',
102     },
103     'SL::DB::DeliveryOrderItem' => {
104       id                      => 'parts_id',
105       delivery_order_items_id => 'id',
106     },
107     'SL::DB::InvoiceItem' => {
108       id                      => 'parts_id',
109       invoice_id => 'id',
110     },
111   );
112
113   eval "require $class";
114
115   my $obj = $::form->{"orderitems_id_$row"}
116           ? $class->meta->convention_manager->auto_manager_class_name->find_by(id => $::form->{"orderitems_id_$row"})
117           : $class->new;
118
119   for my $key (grep { /_$row$/ } keys %$::form) {
120     my $method = $key;
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::(?:Big)?(?:Int(?:eger)?|Serial)$/) {
130         $obj->$method(($value // '') eq '' ? undef : $value * 1);
131       } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::Boolean$/) {
132         $obj->$method(!!$value);
133       } else {
134         $obj->$method($value);
135       }
136     } else {
137       $obj->{__additional_form_attributes}{$method} = $value;
138     }
139   }
140
141   if ($::form->{"id_$row"}) {
142     $obj->part(SL::DB::Part->load_cached($::form->{"id_$row"}));
143   }
144
145   return $obj;
146 }
147
148 sub _make_record {
149   my ($with_items) = @_;
150
151   my $class = {
152     sales_order             => 'Order',
153     purchase_order          => 'Order',
154     sales_quotation         => 'Order',
155     request_quotation       => 'Order',
156     purchase_invoice        => 'PurchaseInvoice',
157     purchase_delivery_order => 'DeliveryOrder',
158     sales_delivery_order    => 'DeliveryOrder',
159   }->{$::form->{type}};
160
161   if ($::form->{type} =~ /invoice|credit_note/) {
162     $class = $::form->{vc} eq 'customer' ? 'Invoice'
163            : $::form->{vc} eq 'vendor'   ? 'PurchaseInvoice'
164            : do { die 'unknown invoice type' };
165   }
166
167   return unless $class;
168
169   $class = 'SL::DB::' . $class;
170
171   eval "require $class";
172
173   my $obj = $::form->{id}
174           ? $class->meta->convention_manager->auto_manager_class_name->find_by(id => $::form->{id})
175           : $class->new;
176
177   for my $method (keys %$::form) {
178     next unless $obj->can($method);
179     next unless $obj->meta->column($method);
180
181     if ($obj->meta->column($method)->isa('Rose::DB::Object::Metadata::Column::Date')) {
182       $obj->${\"$method\_as_date"}($::form->{$method});
183     } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::(?:Numeric|Float|DoublePrecsion)$/) {
184       $obj->${\"$method\_as\_number"}($::form->{$method});
185     } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::(?:Big)?(?:Int(?:eger)?|Serial)$/) {
186       $obj->$method(($::form->{$method} // '') eq '' ? undef : $::form->{$method} * 1)
187     } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::Boolean$/) {
188       $obj->$method(!!$::form->{$method});
189     } else {
190       $obj->$method($::form->{$method});
191     }
192   }
193
194   if ($with_items) {
195     my @items;
196     for my $i (1 .. $::form->{rowcount}) {
197       next unless $::form->{"id_$i"};
198       push @items, _make_record_item($i)
199     }
200
201     $obj->items(@items) if @items;
202   }
203   $obj->is_sales(!!$obj->customer_id) if $class eq 'SL::DB::DeliveryOrder';
204
205   return $obj;
206 }
207
208 1;