c65e7ffe4baa712ed0604b4740cb702d56d5ba69
[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     },
41     properties => {
42       customervendor => "customer",
43       is_customer    => 1,
44       nr_key         => "donumber",
45       transfer       => 'out',
46       transnumber    => 'sdonumber',
47     },
48     part_classification_query => [ "used_for_sale" => 1 ],
49     right => "sales_delivery_order_edit",
50   },
51   PURCHASE_DELIVERY_ORDER_TYPE() => {
52     text => {
53       delete => t8('Delivery Order has been deleted'),
54       saved  => t8('Delivery Order has been saved'),
55       add    => t8("Add Purchase Delivery Order"),
56       edit   => t8("Edit Purchase Delivery Order"),
57       attachment => t8("purchase_delivery_order_list"),
58     },
59     show_menu => {
60       save_and_quotation      => 0,
61       save_and_rfq            => 0,
62       save_and_sales_order    => 0,
63       save_and_purchase_order => 0,
64       save_and_delivery_order => 0,
65       save_and_ap_transaction => 0,
66       save_and_invoice        => 0,
67       delete                  => sub { $::instance_conf->get_sales_delivery_order_show_delete },
68     },
69     properties => {
70       customervendor => "vendor",
71       is_customer    => 0,
72       nr_key         => "donumber",
73       transfer       => 'in',
74       transnumber    => 'pdonumber',
75     },
76     part_classification_query => [ "used_for_purchase" => 1 ],
77     right => "purchase_delivery_order_edit",
78   },
79   SUPPLIER_DELIVERY_ORDER_TYPE() => {
80     text => {
81       delete => t8('Delivery Order has been deleted'),
82       saved  => t8('Delivery Order has been saved'),
83       add    => t8("Add Supplier Delivery Order"),
84       edit   => t8("Edit Supplier Delivery Order"),
85       attachment => t8("supplier_delivery_order_list"),
86     },
87     show_menu => {
88       save_and_quotation      => 0,
89       save_and_rfq            => 0,
90       save_and_sales_order    => 0,
91       save_and_purchase_order => 0,
92       save_and_delivery_order => 0,
93       save_and_ap_transaction => 0,
94       save_and_invoice        => 0,
95       delete                  => sub { $::instance_conf->get_sales_delivery_order_show_delete },
96     },
97     properties => {
98       customervendor => "vendor",
99       is_customer    => 0,
100       nr_key         => "donumber",
101       transfer       => 'out',
102       transnumber    => 'sudonumber',
103     },
104     part_classification_query => [ "used_for_purchase" => 1 ],
105     right => "purchase_delivery_order_edit",
106   },
107   RMA_DELIVERY_ORDER_TYPE() => {
108     text => {
109       delete => t8('Delivery Order has been deleted'),
110       saved  => t8('Delivery Order has been saved'),
111       add    => t8("Add RMA Delivery Order"),
112       edit   => t8("Edit RMA Delivery Order"),
113       attachment => t8("rma_delivery_order_list"),
114     },
115     show_menu => {
116       save_and_quotation      => 0,
117       save_and_rfq            => 0,
118       save_and_sales_order    => 0,
119       save_and_purchase_order => 0,
120       save_and_delivery_order => 0,
121       save_and_ap_transaction => 0,
122       save_and_invoice        => 0,
123       delete                  => sub { $::instance_conf->get_sales_delivery_order_show_delete },
124     },
125     properties => {
126       customervendor => "customer",
127       is_customer    => 1,
128       nr_key         => "donumber",
129       transfer       => 'in',
130       transnumber    => 'rdonumber',
131     },
132     part_classification_query => [ "used_for_sale" => 1 ],
133     right => "sales_delivery_order_edit",
134   },
135 );
136
137 my @valid_types = (
138   SALES_DELIVERY_ORDER_TYPE,
139   PURCHASE_DELIVERY_ORDER_TYPE,
140   SUPPLIER_DELIVERY_ORDER_TYPE,
141   RMA_DELIVERY_ORDER_TYPE,
142 );
143
144 my %valid_types = map { $_ => $_ } @valid_types;
145
146 sub valid_types {
147   \@valid_types;
148 }
149
150 sub is_valid_type {
151   !!exists $type_data{$_[0]};
152 }
153
154 sub validate_type {
155   my ($type) = @_;
156
157   return $valid_types{$type} // croak "invalid type '$type'";
158 }
159
160 sub get {
161   my ($type, $key) = @_;
162
163   croak "invalid type '$type'" unless exists $type_data{$type};
164
165   my $ret = $type_data{$type}->{$key} // die "unknown property '$key'";
166
167   ref $ret eq 'CODE'
168     ? $ret->()
169     : $ret;
170 }
171
172 sub get3 {
173   my ($type, $topic, $key) = @_;
174
175   croak "invalid type '$type'" unless exists $type_data{$type};
176
177   my $ret = $type_data{$type}{$topic}{$key} // croak "unknown property '$key' in topic '$topic' for type '$type'";
178
179   ref $ret eq 'CODE'
180     ? $ret->()
181     : $ret;
182 }
183
184 1;