Merge branch 'test' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / SL / DB / DeliveryOrder / TypeData.pm
1 package SL::DB::DeliveryOrder::TypeData;
2
3 use strict;
4 use Carp;
5 use Exporter qw(import);
6 use Scalar::Util qw(weaken);
7 use SL::Locale::String qw(t8);
8
9 use constant {
10   SALES_DELIVERY_ORDER_TYPE    => 'sales_delivery_order',
11   PURCHASE_DELIVERY_ORDER_TYPE => 'purchase_delivery_order',
12   SUPPLIER_DELIVERY_ORDER_TYPE => 'supplier_delivery_order',
13   RMA_DELIVERY_ORDER_TYPE      => 'rma_delivery_order',
14 };
15
16 my @export_types = qw(SALES_DELIVERY_ORDER_TYPE PURCHASE_DELIVERY_ORDER_TYPE SUPPLIER_DELIVERY_ORDER_TYPE RMA_DELIVERY_ORDER_TYPE);
17 my @export_subs = qw(valid_types validate_type is_valid_type get get3);
18
19 our @EXPORT_OK = (@export_types, @export_subs);
20 our %EXPORT_TAGS = (types => \@export_types, subs => \@export_subs);
21
22 my %type_data = (
23   SALES_DELIVERY_ORDER_TYPE() => {
24     text => {
25       delete => t8('Delivery Order has been deleted'),
26       saved  => t8('Delivery Order has been saved'),
27       add    => t8("Add Sales Delivery Order"),
28       edit   => t8("Edit Sales Delivery Order"),
29       attachment => t8("sales_delivery_order_list"),
30     },
31     show_menu => {
32       save_and_quotation      => 0,
33       save_and_rfq            => 0,
34       save_and_sales_order    => 0,
35       save_and_purchase_order => 0,
36       save_and_delivery_order => 0,
37       save_and_ap_transaction => 0,
38       save_and_invoice        => 0,
39       delete                  => sub { $::instance_conf->get_sales_delivery_order_show_delete },
40       new_controller          => 0,
41     },
42     properties => {
43       customervendor => "customer",
44       is_customer    => 1,
45       nr_key         => "donumber",
46       transfer       => 'out',
47       transnumber    => 'sdonumber',
48     },
49     part_classification_query => [ "used_for_sale" => 1 ],
50     rights => {
51       edit => "sales_delivery_order_edit",
52       view => "sales_delivery_order_edit | sales_delivery_order_view",
53     },
54   },
55   PURCHASE_DELIVERY_ORDER_TYPE() => {
56     text => {
57       delete => t8('Delivery Order has been deleted'),
58       saved  => t8('Delivery Order has been saved'),
59       add    => t8("Add Purchase Delivery Order"),
60       edit   => t8("Edit Purchase Delivery Order"),
61       attachment => t8("purchase_delivery_order_list"),
62     },
63     show_menu => {
64       save_and_quotation      => 0,
65       save_and_rfq            => 0,
66       save_and_sales_order    => 0,
67       save_and_purchase_order => 0,
68       save_and_delivery_order => 0,
69       save_and_ap_transaction => 0,
70       save_and_invoice        => 0,
71       delete                  => sub { $::instance_conf->get_sales_delivery_order_show_delete },
72       new_controller          => 0,
73     },
74     properties => {
75       customervendor => "vendor",
76       is_customer    => 0,
77       nr_key         => "donumber",
78       transfer       => 'in',
79       transnumber    => 'pdonumber',
80     },
81     part_classification_query => [ "used_for_purchase" => 1 ],
82     rights => {
83       edit => "purchase_delivery_order_edit",
84       view => "purchase_delivery_order_edit | purchase_delivery_order_view",
85     },
86   },
87   SUPPLIER_DELIVERY_ORDER_TYPE() => {
88     text => {
89       delete => t8('Supplier Delivery Order has been deleted'),
90       saved  => t8('Supplier Delivery Order has been saved'),
91       add    => t8("Add Supplier Delivery Order"),
92       edit   => t8("Edit Supplier Delivery Order"),
93       attachment => t8("supplier_delivery_order_list"),
94     },
95     show_menu => {
96       save_and_quotation      => 0,
97       save_and_rfq            => 0,
98       save_and_sales_order    => 0,
99       save_and_purchase_order => 0,
100       save_and_delivery_order => 0,
101       save_and_ap_transaction => 0,
102       save_and_invoice        => 0,
103       delete                  => sub { $::instance_conf->get_sales_delivery_order_show_delete },
104       new_controller          => 1,
105     },
106     properties => {
107       customervendor => "vendor",
108       is_customer    => 0,
109       nr_key         => "donumber",
110       transfer       => 'out',
111       transnumber    => 'sudonumber',
112     },
113     part_classification_query => [ "used_for_purchase" => 1 ],
114     rights => {
115       edit => "purchase_delivery_order_edit",
116       view => "purchase_delivery_order_edit | purchase_delivery_order_view",
117     },
118   },
119   RMA_DELIVERY_ORDER_TYPE() => {
120     text => {
121       delete => t8('Delivery Order has been deleted'),
122       saved  => t8('Delivery Order has been saved'),
123       add    => t8("Add RMA Delivery Order"),
124       edit   => t8("Edit RMA Delivery Order"),
125       attachment => t8("rma_delivery_order_list"),
126     },
127     show_menu => {
128       save_and_quotation      => 0,
129       save_and_rfq            => 0,
130       save_and_sales_order    => 0,
131       save_and_purchase_order => 0,
132       save_and_delivery_order => 0,
133       save_and_ap_transaction => 0,
134       save_and_invoice        => 0,
135       delete                  => sub { $::instance_conf->get_sales_delivery_order_show_delete },
136       new_controller          => 1,
137     },
138     properties => {
139       customervendor => "customer",
140       is_customer    => 1,
141       nr_key         => "donumber",
142       transfer       => 'in',
143       transnumber    => 'rdonumber',
144     },
145     part_classification_query => [ "used_for_sale" => 1 ],
146     rights => {
147       edit => "sales_delivery_order_edit",
148       view => "sales_delivery_order_edit | sales_delivery_order_view",
149     },
150   },
151 );
152
153 my @valid_types = (
154   SALES_DELIVERY_ORDER_TYPE,
155   PURCHASE_DELIVERY_ORDER_TYPE,
156   SUPPLIER_DELIVERY_ORDER_TYPE,
157   RMA_DELIVERY_ORDER_TYPE,
158 );
159
160 my %valid_types = map { $_ => $_ } @valid_types;
161
162 sub valid_types {
163   \@valid_types;
164 }
165
166 sub is_valid_type {
167   !!exists $type_data{$_[0]};
168 }
169
170 sub validate_type {
171   my ($type) = @_;
172
173   return $valid_types{$type} // croak "invalid type '$type'";
174 }
175
176 sub get {
177   my ($type, $key) = @_;
178
179   croak "invalid type '$type'" unless exists $type_data{$type};
180
181   my $ret = $type_data{$type}->{$key} // die "unknown property '$key'";
182
183   ref $ret eq 'CODE'
184     ? $ret->()
185     : $ret;
186 }
187
188 sub get3 {
189   my ($type, $topic, $key) = @_;
190
191   croak "invalid type '$type'" unless exists $type_data{$type};
192
193   my $ret = $type_data{$type}{$topic}{$key} // croak "unknown property '$key' in topic '$topic' for type '$type'";
194
195   ref $ret eq 'CODE'
196     ? $ret->()
197     : $ret;
198 }
199
200 1;