Revert "Banktransactions - beim Speichern der Rechnung Zahlungsart prüfen"
[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_order          => 'OrderItem',
76     sales_quotation         => 'OrderItem',
77     request_quotation       => 'OrderItem',
78     invoice                 => 'InvoiceItem',
79     purchase_invoice        => 'InvoiceItem',
80     credit_note             => 'InvoiceItem',
81     purchase_delivery_order => 'DeliveryOrderItem',
82     sales_delivery_order    => 'DeliveryOrderItem',
83   }->{$::form->{type}};
84
85   return unless $class;
86
87   $class = 'SL::DB::' . $class;
88
89   eval "require $class";
90
91   my $obj = $::form->{"orderitems_id_$row"}
92           ? $class->meta->convention_manager->auto_manager_class_name->find_by(id => $::form->{"orderitems_id_$row"})
93           : $class->new;
94
95   for my $method (apply { s/_$row$// } grep { /_$row$/ } keys %$::form) {
96     next unless $obj->meta->column($method);
97     if ($obj->meta->column($method)->isa('Rose::DB::Object::Metadata::Column::Date')) {
98       $obj->${\"$method\_as_date"}($::form->{"$method\_$row"});
99     } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::(?:Numeric|Float|DoublePrecsion)$/) {
100       $obj->${\"$method\_as_number"}($::form->{"$method\_$row"});
101     } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::Boolean$/) {
102       $obj->$method(!!$::form->{$method});
103     } else {
104       $obj->$method($::form->{"$method\_$row"});
105     }
106   }
107
108   if ($::form->{"id_$row"}) {
109     $obj->part(SL::DB::Part->load_cached($::form->{"id_$row"}));
110   }
111
112   return $obj;
113 }
114
115 sub _make_record {
116   my ($with_items) = @_;
117
118   my $class = {
119     sales_order             => 'Order',
120     purchase_order          => 'Order',
121     sales_quotation         => 'Order',
122     request_quotation       => 'Order',
123     purchase_invoice        => 'PurchaseInvoice',
124     purchase_delivery_order => 'DeliveryOrder',
125     sales_delivery_order    => 'DeliveryOrder',
126   }->{$::form->{type}};
127
128   if ($::form->{type} =~ /invoice|credit_note/) {
129     $class = $::form->{vc} eq 'customer' ? 'Invoice'
130            : $::form->{vc} eq 'vendor'   ? 'PurchaseInvoice'
131            : do { die 'unknown invoice type' };
132   }
133
134   return unless $class;
135
136   $class = 'SL::DB::' . $class;
137
138   eval "require $class";
139
140   my $obj = $::form->{id}
141           ? $class->meta->convention_manager->auto_manager_class_name->find_by(id => $::form->{id})
142           : $class->new;
143
144   for my $method (keys %$::form) {
145     next unless $obj->can($method);
146     next unless $obj->meta->column($method);
147
148     if ($obj->meta->column($method)->isa('Rose::DB::Object::Metadata::Column::Date')) {
149       $obj->${\"$method\_as_date"}($::form->{$method});
150     } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::(?:Numeric|Float|DoublePrecsion)$/) {
151       $obj->${\"$method\_as\_number"}($::form->{$method});
152     } elsif ((ref $obj->meta->column($method)) =~ /^Rose::DB::Object::Metadata::Column::Boolean$/) {
153       $obj->$method(!!$::form->{$method});
154     } else {
155       $obj->$method($::form->{$method});
156     }
157   }
158
159   if ($with_items) {
160     my @items;
161     for my $i (1 .. $::form->{rowcount}) {
162       next unless $::form->{"id_$i"};
163       push @items, _make_record_item($i)
164     }
165
166     $obj->items(@items) if @items;
167   }
168   $obj->is_sales(!!$obj->customer_id) if $class eq 'SL::DB::DeliveryOrder';
169
170   return $obj;
171 }
172
173 1;
174