1 package SL::Controller::DeliveryOrder::TypeData;
4 use Exporter qw(import);
5 use Scalar::Util qw(weaken);
6 use SL::Locale::String qw(t8);
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',
17 our @EXPORT_OK = qw(SALES_ORDER_TYPE PURCHASE_ORDER_TYPE SALES_QUOTATION_TYPE REQUEST_QUOTATION_TYPE);
19 use Rose::Object::MakeMethods::Generic scalar => [ qw(c) ];
22 SALES_ORDER_TYPE() => {
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"),
30 save_and_quotation => 1,
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 },
39 to_order_type => "purchase_order",
40 to_quotation_type => "sales_quotation",
41 to_order_copy_shipto => 1,
44 customervendor => "customer",
47 nr_key => "ordnumber",
49 part_classification_query => [ "used_for_sale" => 1 ],
50 right => "sales_order_edit",
52 PURCHASE_ORDER_TYPE() => {
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"),
60 save_and_quotation => 0,
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 },
69 to_order_type => "sales_order",
70 to_quotation_type => "request_quotation",
71 to_order_copy_shipto => 0,
74 customervendor => "vendor",
77 nr_key => "ordnumber",
79 part_classification_query => [ "used_for_purchase" => 1 ],
80 right => "purchase_order_edit",
82 SALES_QUOTATION_TYPE() => {
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"),
90 save_and_quotation => 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,
99 to_order_type => "sales_order",
100 to_quotation_type => "request_quotation",
101 to_order_copy_shipto => 0,
104 customervendor => "customer",
107 nr_key => "quonumber",
109 part_classification_query => [ "used_for_sale" => 1 ],
110 right => "sales_quotation_edit",
112 REQUEST_QUOTATION_TYPE() => {
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"),
120 save_and_quotation => 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,
129 to_order_type => "purchase_order",
130 to_quotation_type => "request_quotation",
131 to_order_copy_shipto => 0,
134 customervendor => "vendor",
137 nr_key => "quonumber",
139 part_classification_query => [ "used_for_purchase" => 1 ],
140 right => "request_quotation_edit",
142 SALES_DELIVERY_ORDER_TYPE() => {
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"),
150 save_and_quotation => 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 },
159 customervendor => "customer",
161 nr_key => "donumber",
163 part_classification_query => [ "used_for_sale" => 1 ],
164 right => "sales_delivery_order_edit",
166 PURCHASE_DELIVERY_ORDER_TYPE() => {
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"),
174 save_and_quotation => 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 },
183 customervendor => "vendor",
185 nr_key => "donumber",
187 part_classification_query => [ "used_for_purchase" => 1 ],
188 right => "purchase_delivery_order_edit",
194 my ($class, $controller) = @_;
195 my $o = bless {}, $class;
206 SALES_QUOTATION_TYPE,
207 REQUEST_QUOTATION_TYPE,
208 SALES_DELIVERY_ORDER_TYPE,
209 PURCHASE_DELIVERY_ORDER_TYPE,
218 my ($self, $key) = @_;
220 my $ret = $type_data{$self->type}->{$key} // die "unknown property '$key'";
228 my ($self, $topic, $key) = @_;
230 my $ret = $type_data{$self->type}->{$topic}->{$key} // die "unknown property '$key' in topic '$topic'";
238 my ($self, $string) = @_;
239 _get3($self, "text", $string);
243 my ($self, $string) = @_;
244 _get3($self, "show_menu", $string);
248 my ($self, $string) = @_;
249 _get3($self, "workflow", $string);
253 my ($self, $string) = @_;
254 _get3($self, "properties", $string);
258 !!exists $type_data{$_[1]};
262 $type_data{ $_[0]->type } // die "unknown type";
266 _get($_[0], "right");
270 _get3($_[0], "properties", "is_quotation");
274 _get3($_[0], "properties", "customervendor");
278 _get3($_[0], "properties", "nr_key");
281 sub part_classification_query {
282 my ($self, $string) = @_;
283 _get($self, "part_classification_query");
286 sub set_reqdate_by_type {
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;
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));
299 sub get_reqdate_by_type {
300 my ($self, $reqdate, $saved_reqdate) = @_;
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;
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)) {
310 return DateTime->today_local->next_workday(extra_days => $extra_days);