6e49d424f9828d51706fb69eaa95c61d3ba5c45e
[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_DELIVERY_ORDER_TYPE    => 'sales_delivery_order',
10   PURCHASE_DELIVERY_ORDER_TYPE => 'purchase_delivery_order',
11   SUPPLIER_DELIVERY_ORDER_TYPE => 'supplier_delivery_order',
12   RMA_DELIVERY_ORDER_TYPE      => 'rma_delivery_order',
13 };
14
15 our @EXPORT_OK = qw(SALES_DELIVERY_ORDER_TYPE PURCHASE_DELIVERY_ORDER_TYPE SUPPLIER_DELIVERY_ORDER_TYPE RMA_DELIVERY_ORDER_TYPE);
16
17 use Rose::Object::MakeMethods::Generic scalar => [ qw(c) ];
18
19 my %type_data = (
20   SALES_DELIVERY_ORDER_TYPE() => {
21     text => {
22       delete => t8('Delivery Order has been deleted'),
23       saved  => t8('Delivery Order has been saved'),
24       add    => t8("Add Sales Delivery Order"),
25       edit   => t8("Edit Sales Delivery Order"),
26     },
27     show_menu => {
28       save_and_quotation      => 0,
29       save_and_rfq            => 0,
30       save_and_sales_order    => 0,
31       save_and_purchase_order => 0,
32       save_and_delivery_order => 0,
33       save_and_ap_transaction => 0,
34       save_and_invoice        => 0,
35       delete                  => sub { $::instance_conf->get_sales_delivery_order_show_delete },
36     },
37     properties => {
38       customervendor => "customer",
39       is_customer    => 1,
40       nr_key         => "donumber",
41       transfer       => 'out',
42     },
43     part_classification_query => [ "used_for_sale" => 1 ],
44     right => "sales_delivery_order_edit",
45   },
46   PURCHASE_DELIVERY_ORDER_TYPE() => {
47     text => {
48       delete => t8('Delivery Order has been deleted'),
49       saved  => t8('Delivery Order has been saved'),
50       add    => t8("Add Purchase Delivery Order"),
51       edit   => t8("Edit Purchase Delivery Order"),
52     },
53     show_menu => {
54       save_and_quotation      => 0,
55       save_and_rfq            => 0,
56       save_and_sales_order    => 0,
57       save_and_purchase_order => 0,
58       save_and_delivery_order => 0,
59       save_and_ap_transaction => 0,
60       save_and_invoice        => 0,
61       delete                  => sub { $::instance_conf->get_sales_delivery_order_show_delete },
62     },
63     properties => {
64       customervendor => "vendor",
65       is_customer    => 0,
66       nr_key         => "donumber",
67       transfer       => 'in',
68     },
69     part_classification_query => [ "used_for_purchase" => 1 ],
70     right => "purchase_delivery_order_edit",
71   },
72   SUPPLIER_DELIVERY_ORDER_TYPE() => {
73     text => {
74       delete => t8('Delivery Order has been deleted'),
75       saved  => t8('Delivery Order has been saved'),
76       add    => t8("Add Supplier Delivery Order"),
77       edit   => t8("Edit Supplier Delivery Order"),
78     },
79     show_menu => {
80       save_and_quotation      => 0,
81       save_and_rfq            => 0,
82       save_and_sales_order    => 0,
83       save_and_purchase_order => 0,
84       save_and_delivery_order => 0,
85       save_and_ap_transaction => 0,
86       save_and_invoice        => 0,
87       delete                  => sub { $::instance_conf->get_sales_delivery_order_show_delete },
88     },
89     properties => {
90       customervendor => "vendor",
91       is_customer    => 0,
92       nr_key         => "donumber",
93       transfer       => 'out',
94     },
95     part_classification_query => [ "used_for_purchase" => 1 ],
96     right => "purchase_delivery_order_edit",
97   },
98   RMA_DELIVERY_ORDER_TYPE() => {
99     text => {
100       delete => t8('Delivery Order has been deleted'),
101       saved  => t8('Delivery Order has been saved'),
102       add    => t8("Add RMA Delivery Order"),
103       edit   => t8("Edit RMA Delivery Order"),
104     },
105     show_menu => {
106       save_and_quotation      => 0,
107       save_and_rfq            => 0,
108       save_and_sales_order    => 0,
109       save_and_purchase_order => 0,
110       save_and_delivery_order => 0,
111       save_and_ap_transaction => 0,
112       save_and_invoice        => 0,
113       delete                  => sub { $::instance_conf->get_sales_delivery_order_show_delete },
114     },
115     properties => {
116       customervendor => "customer",
117       is_customer    => 0,
118       nr_key         => "donumber",
119       transfer       => 'in',
120     },
121     part_classification_query => [ "used_for_sale" => 1 ],
122     right => "sales_delivery_order_edit",
123   },
124 );
125
126 sub new {
127   my ($class, $controller) = @_;
128   my $o = bless {}, $class;
129   $o->c($controller);
130   weaken($o->{c});
131
132   return $o;
133 }
134
135 sub valid_types {
136   [
137     SALES_DELIVERY_ORDER_TYPE,
138     PURCHASE_DELIVERY_ORDER_TYPE,
139     SUPPLIER_DELIVERY_ORDER_TYPE,
140     RMA_DELIVERY_ORDER_TYPE,
141   ];
142 }
143
144 sub type {
145   $_[0]->c->type;
146 }
147
148 sub _get {
149   my ($self, $key) = @_;
150
151   my $ret = $type_data{$self->type}->{$key} // die "unknown property '$key'";
152
153   ref $ret eq 'CODE'
154     ? $ret->()
155     : $ret;
156 }
157
158 sub _get3 {
159   my ($self, $topic, $key) = @_;
160
161   my $ret = $type_data{$self->type}->{$topic}->{$key} // die "unknown property '$key' in topic '$topic'";
162
163   ref $ret eq 'CODE'
164     ? $ret->()
165     : $ret;
166 }
167
168 sub text {
169   my ($self, $string) = @_;
170   _get3($self, "text", $string);
171 }
172
173 sub show_menu {
174   my ($self, $string) = @_;
175   _get3($self, "show_menu", $string);
176 }
177
178 sub workflow {
179   my ($self, $string) = @_;
180   _get3($self, "workflow", $string);
181 }
182
183 sub properties {
184   my ($self, $string) = @_;
185   _get3($self, "properties", $string);
186 }
187
188 sub is_valid_type {
189   !!exists $type_data{$_[1]};
190 }
191
192 sub type_data {
193   $type_data{ $_[0]->type } // die "unknown type";
194 }
195
196 sub access {
197   _get($_[0], "right");
198 }
199
200 sub is_quotation {
201   _get3($_[0], "properties", "is_quotation");
202 }
203
204 sub customervendor {
205   _get3($_[0], "properties", "customervendor");
206 }
207
208 sub nr_key {
209   _get3($_[0], "properties", "nr_key");
210 }
211
212 sub part_classification_query {
213   my ($self, $string) = @_;
214   _get($self, "part_classification_query");
215 }
216
217 sub set_reqdate_by_type {
218   my ($self) = @_;
219
220   if (!$self->c->order->reqdate) {
221     $self->c->order->reqdate(DateTime->today_local->next_workday(extra_days => 1));
222   }
223 }
224
225 sub get_reqdate_by_type {
226   my ($self, $reqdate, $saved_reqdate) = @_;
227
228   if ($reqdate == $saved_reqdate) {
229     return DateTime->today_local->next_workday(extra_days => 1);
230   } else {
231     return $reqdate;
232   }
233 }