baed7d40bf8fee585f8fb2d36daf5d5e9688ff72
[kivitendo-erp.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::ClientJS;
9 use SL::Locale::String qw(t8);
10 use SL::PriceSource;
11
12 use Rose::Object::MakeMethods::Generic
13 (
14  scalar => [ qw(record_item) ],
15  'scalar --get_set_init' => [ qw(js record) ],
16 );
17
18 __PACKAGE__->run_before('check_auth');
19
20 #
21 # actions
22 #
23
24 sub action_price_popup {
25   my ($self) = @_;
26
27   my $record_item = _make_record_item($::form->{row});
28
29   $self->render_price_dialog($record_item);
30 }
31
32 sub render_price_dialog {
33   my ($self, $record_item) = @_;
34
35   my $price_source = SL::PriceSource->new(record_item => $record_item, record => $self->record);
36
37   $self->js
38     ->run(
39       'kivi.io.price_chooser_dialog',
40       t8('Available Prices'),
41       $self->render('oe/price_sources_dialog', { output => 0 }, price_source => $price_source)
42     )
43     ->reinit_widgets;
44
45 #   if (@errors) {
46 #     $self->js->text('#dialog_flash_error_content', join ' ', @errors);
47 #     $self->js->show('#dialog_flash_error');
48 #   }
49
50   $self->js->render($self);
51 }
52
53
54 #
55 # internal stuff
56 #
57
58 sub check_auth {
59   $::auth->assert('edit_prices');
60 }
61
62 sub init_js {
63   SL::ClientJS->new
64 }
65
66 sub init_record {
67   _make_record();
68 }
69
70 sub _make_record_item {
71   my ($row) = @_;
72
73   my $class = {
74     sales_order             => 'OrderItem',
75     purchase_oder           => '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',
82   }->{$::form->{type}};
83
84   return unless $class;
85
86   $class = 'SL::DB::' . $class;
87
88   eval "require $class";
89
90   my $obj = $::form->{"orderitems_id_$row"}
91           ? $class->meta->convention_manager->auto_manager_class_name->find_by(id => $::form->{"orderitems_id_$row"})
92           : $class->new;
93
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"});
100     } else {
101       $obj->$method($::form->{"$method\_$row"});
102     }
103   }
104
105   if ($::form->{"id_$row"}) {
106     $obj->part(SL::DB::Part->load_cached($::form->{"id_$row"}));
107   }
108
109   return $obj;
110 }
111
112 sub _make_record {
113   my ($with_items) = @_;
114
115   my $class = {
116     sales_order             => 'Order',
117     purchase_oder           => 'Order',
118     sales_quotation         => 'Order',
119     request_quotation       => 'Order',
120     purchase_delivery_order => 'DeliveryOrder',
121     sales_delivery_order    => 'DeliveryOrder',
122   }->{$::form->{type}};
123
124   if ($::form->{type} eq 'invoice') {
125     $class = $::form->{vc} eq 'customer' ? 'Invoice'
126            : $::form->{vc} eq 'vendor'   ? 'PurchaseInvoice'
127            : do { die 'unknown invoice type' };
128   }
129
130   return unless $class;
131
132   $class = 'SL::DB::' . $class;
133
134   eval "require $class";
135
136   my $obj = $::form->{id}
137           ? $class->meta->convention_manager->auto_manager_class_name->find_by(id => $::form->{id})
138           : $class->new;
139
140   for my $method (keys %$::form) {
141     next unless $obj->can($method);
142     next unless $obj->meta->column($method);
143
144     if ($obj->meta->column($method)->isa('Rose::DB::Object::Metadata::Column::Date')) {
145       $obj->${\"$method\_as_date"}($::form->{$method});
146     } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::(?:Numeric|Float|DoublePrecsion)$/) {
147       $obj->${\"$method\_as\_number"}($::form->{$method});
148     } else {
149       $obj->$method($::form->{$method});
150     }
151   }
152
153   if ($with_items) {
154     my @items;
155     for my $i (1 .. $::form->{rowcount}) {
156       next unless $::form->{"id_$i"};
157       push @items, _make_record_item($i)
158     }
159
160     $obj->items(@items) if @items;
161   }
162
163   return $obj;
164 }
165
166 1;
167