DeliveryOrder: type data is_customer
[kivitendo-erp.git] / SL / Controller / DeliveryOrder / TypeData.pm
1 package SL::Controller::DeliveryOrder::TypeData;
2
3 use strict;
4 use Exporter qw(import);
5 use Scalar::Util qw(weaken);
6 use SL::Locale::String qw(t8);
7
8 use constant {
9   SALES_ORDER_TYPE             => 'sales_order',
10   PURCHASE_ORDER_TYPE          => 'purchase_order',
11   SALES_QUOTATION_TYPE         => 'sales_quotation',
12   REQUEST_QUOTATION_TYPE       => 'request_quotation',
13   PURCHASE_DELIVERY_ORDER_TYPE => 'purchase_delivery_order',
14   SALES_DELIVERY_ORDER_TYPE    => 'sales_delivery_order',
15 };
16
17 our @EXPORT_OK = qw(SALES_ORDER_TYPE PURCHASE_ORDER_TYPE SALES_QUOTATION_TYPE REQUEST_QUOTATION_TYPE);
18
19 use Rose::Object::MakeMethods::Generic scalar => [ qw(c) ];
20
21 my %type_data = (
22   SALES_ORDER_TYPE() => {
23     text => {
24       delete => t8('The order has been deleted'),
25       saved  => t8('The order has been saved'),
26       add    => t8("Add Sales Order"),
27       edit   => t8("Edit Sales Order"),
28     },
29     show_menu => {
30       save_and_quotation      => 1,
31       save_and_rfq            => 0,
32       save_and_sales_order    => 0,
33       save_and_purchase_order => 1,
34       save_and_delivery_order => 1,
35       save_and_ap_transaction => 0,
36       delete                  => sub { $::instance_conf->get_sales_order_show_delete },
37     },
38     workflow => {
39       to_order_type        => "purchase_order",
40       to_quotation_type    => "sales_quotation",
41       to_order_copy_shipto => 1,
42     },
43     properties => {
44       customervendor => "customer",
45       is_quotation   => 0,
46       is_customer    => 1,
47       nr_key         => "ordnumber",
48     },
49     part_classification_query => [ "used_for_sale" => 1 ],
50     right => "sales_order_edit",
51   },
52   PURCHASE_ORDER_TYPE() => {
53     text =>{
54       delete => t8('The order has been deleted'),
55       saved  => t8('The order has been saved'),
56       add    => t8("Add Purchase Order"),
57       edit   => t8("Edit Purchase Order"),
58     },
59     show_menu => {
60       save_and_quotation      => 0,
61       save_and_rfq            => 1,
62       save_and_sales_order    => 1,
63       save_and_purchase_order => 0,
64       save_and_delivery_order => 1,
65       save_and_ap_transaction => 1,
66       delete                  => sub { $::instance_conf->get_purchase_order_show_delete },
67     },
68     workflow => {
69       to_order_type        => "sales_order",
70       to_quotation_type    => "request_quotation",
71       to_order_copy_shipto => 0,
72     },
73     properties => {
74       customervendor => "vendor",
75       is_quotation   => 0,
76       is_customer    => 0,
77       nr_key         => "ordnumber",
78     },
79     part_classification_query => [ "used_for_purchase" => 1 ],
80     right => "purchase_order_edit",
81   },
82   SALES_QUOTATION_TYPE() => {
83     text => {
84       delete => t8('The quotation has been deleted'),
85       saved  => t8('The quotation has been saved'),
86       add    => t8("Add Quotation"),
87       edit   => t8("Edit Quotation"),
88     },
89     show_menu => {
90       save_and_quotation      => 0,
91       save_and_rfq            => 0,
92       save_and_sales_order    => 1,
93       save_and_purchase_order => 0,
94       save_and_delivery_order => 0,
95       save_and_ap_transaction => 0,
96       delete                  => 1,
97     },
98     workflow => {
99       to_order_type        => "sales_order",
100       to_quotation_type    => "request_quotation",
101       to_order_copy_shipto => 0,
102     },
103     properties => {
104       customervendor => "customer",
105       is_quotation   => 1,
106       is_customer    => 1,
107       nr_key         => "quonumber",
108     },
109     part_classification_query => [ "used_for_sale" => 1 ],
110     right => "sales_quotation_edit",
111   },
112   REQUEST_QUOTATION_TYPE() => {
113     text => {
114       delete => t8('The rfq has been deleted'),
115       saved  => t8('The rfq has been saved'),
116       add    => t8("Add Request for Quotation"),
117       edit   => t8("Edit Request for Quotation"),
118     },
119     show_menu => {
120       save_and_quotation      => 0,
121       save_and_rfq            => 0,
122       save_and_sales_order    => 0,
123       save_and_purchase_order => 1,
124       save_and_delivery_order => 0,
125       save_and_ap_transaction => 0,
126       delete                  => 1,
127     },
128     workflow => {
129       to_order_type        => "purchase_order",
130       to_quotation_type    => "request_quotation",
131       to_order_copy_shipto => 0,
132     },
133     properties => {
134       customervendor => "vendor",
135       is_quotation   => 1,
136       is_customer    => 0,
137       nr_key         => "quonumber",
138     },
139     part_classification_query => [ "used_for_purchase" => 1 ],
140     right => "request_quotation_edit",
141   },
142   SALES_DELIVERY_ORDER_TYPE() => {
143     text => {
144       delete => t8('Delivery Order has been deleted'),
145       saved  => t8('Delivery Order has been saved'),
146       add    => t8("Add Sales Delivery Order"),
147       edit   => t8("Edit Sales Delivery Order"),
148     },
149     show_menu => {
150       save_and_quotation      => 0,
151       save_and_rfq            => 0,
152       save_and_sales_order    => 0,
153       save_and_purchase_order => 0,
154       save_and_delivery_order => 0,
155       save_and_ap_transaction => 0,
156       delete                  => sub { $::instance_conf->get_sales_delivery_order_show_delete },
157     },
158     properties => {
159       customervendor => "customer",
160       is_customer    => 1,
161       nr_key         => "donumber",
162     },
163     part_classification_query => [ "used_for_sale" => 1 ],
164     right => "sales_delivery_order_edit",
165   },
166   PURCHASE_DELIVERY_ORDER_TYPE() => {
167     text => {
168       delete => t8('Delivery Order has been deleted'),
169       saved  => t8('Delivery Order has been saved'),
170       add    => t8("Add Purchase Delivery Order"),
171       edit   => t8("Edit Purchase Delivery Order"),
172     },
173     show_menu => {
174       save_and_quotation      => 0,
175       save_and_rfq            => 0,
176       save_and_sales_order    => 0,
177       save_and_purchase_order => 0,
178       save_and_delivery_order => 0,
179       save_and_ap_transaction => 0,
180       delete                  => sub { $::instance_conf->get_sales_delivery_order_show_delete },
181     },
182     properties => {
183       customervendor => "vendor",
184       is_customer    => 0,
185       nr_key         => "donumber",
186     },
187     part_classification_query => [ "used_for_purchase" => 1 ],
188     right => "purchase_delivery_order_edit",
189   },
190
191 );
192
193 sub new {
194   my ($class, $controller) = @_;
195   my $o = bless {}, $class;
196   $o->c($controller);
197   weaken($o->{c});
198
199   return $o;
200 }
201
202 sub valid_types {
203   [
204     SALES_ORDER_TYPE,
205     PURCHASE_ORDER_TYPE,
206     SALES_QUOTATION_TYPE,
207     REQUEST_QUOTATION_TYPE,
208     SALES_DELIVERY_ORDER_TYPE,
209     PURCHASE_DELIVERY_ORDER_TYPE,
210   ];
211 }
212
213 sub type {
214   $_[0]->c->type;
215 }
216
217 sub _get {
218   my ($self, $key) = @_;
219
220   my $ret = $type_data{$self->type}->{$key} // die "unknown property '$key'";
221
222   ref $ret eq 'CODE'
223     ? $ret->()
224     : $ret;
225 }
226
227 sub _get3 {
228   my ($self, $topic, $key) = @_;
229
230   my $ret = $type_data{$self->type}->{$topic}->{$key} // die "unknown property '$key' in topic '$topic'";
231
232   ref $ret eq 'CODE'
233     ? $ret->()
234     : $ret;
235 }
236
237 sub text {
238   my ($self, $string) = @_;
239   _get3($self, "text", $string);
240 }
241
242 sub show_menu {
243   my ($self, $string) = @_;
244   _get3($self, "show_menu", $string);
245 }
246
247 sub workflow {
248   my ($self, $string) = @_;
249   _get3($self, "workflow", $string);
250 }
251
252 sub properties {
253   my ($self, $string) = @_;
254   _get3($self, "properties", $string);
255 }
256
257 sub is_valid_type {
258   !!exists $type_data{$_[1]};
259 }
260
261 sub type_data {
262   $type_data{ $_[0]->type } // die "unknown type";
263 }
264
265 sub access {
266   _get($_[0], "right");
267 }
268
269 sub is_quotation {
270   _get3($_[0], "properties", "is_quotation");
271 }
272
273 sub customervendor {
274   _get3($_[0], "properties", "customervendor");
275 }
276
277 sub nr_key {
278   _get3($_[0], "properties", "nr_key");
279 }
280
281 sub part_classification_query {
282   my ($self, $string) = @_;
283   _get($self, "part_classification_query");
284 }
285
286 sub set_reqdate_by_type {
287   my ($self) = @_;
288
289   my $extra_days = $self->type eq SALES_QUOTATION_TYPE ? $::instance_conf->get_reqdate_interval       :
290                    $self->type eq SALES_ORDER_TYPE     ? $::instance_conf->get_delivery_date_interval : 1;
291
292   if (   ($self->type eq SALES_ORDER_TYPE     &&  $::instance_conf->get_deliverydate_on)
293       || ($self->type eq SALES_QUOTATION_TYPE &&  $::instance_conf->get_reqdate_on)
294       && (!$self->order->reqdate)) {
295     $self->c->order->reqdate(DateTime->today_local->next_workday(extra_days => $extra_days));
296   }
297 }
298
299 sub get_reqdate_by_type {
300   my ($self, $reqdate, $saved_reqdate) = @_;
301
302   if ($reqdate == $saved_reqdate) {
303     my $extra_days = $self->type eq SALES_QUOTATION_TYPE ? $::instance_conf->get_reqdate_interval       :
304                      $self->type eq SALES_ORDER_TYPE     ? $::instance_conf->get_delivery_date_interval : 1;
305
306     if (   ($self->type eq SALES_ORDER_TYPE     &&  !$::instance_conf->get_deliverydate_on)
307         || ($self->type eq SALES_QUOTATION_TYPE &&  !$::instance_conf->get_reqdate_on)) {
308       return '';
309     } else {
310       return DateTime->today_local->next_workday(extra_days => $extra_days);
311     }
312   } else {
313     return $reqdate;
314   }
315 }