10 use Support::TestSetup;
11 use Support::TestRoutines qw(test_deeply);
13 use List::MoreUtils qw(pairwise);
15 use SL::DB::DeliveryOrder;
16 use SL::DB::Reclamation;
17 use SL::DB::ReclamationReason;
20 use SL::DB::Department;
22 use SL::DB::PaymentTerm;
23 use SL::DB::DeliveryTerm;
27 use SL::Model::Record;
29 use Rose::DB::Object::Helpers qw(clone);
31 use SL::Dev::ALL qw(:ALL);
47 DeliveryOrder DeliveryOrderItem
48 Reclamation ReclamationItem
52 Department PaymentTerm DeliveryTerm
54 "SL::DB::Manager::${_}"->delete_all(all => 1);
56 SL::DB::Manager::Employee->delete_all(where => [ login => 'testuser' ]);
64 $unit = SL::DB::Manager::Unit->find_by(name => 'kg') || die "Can't find unit 'kg'";
66 $employee = SL::DB::Employee->new(
67 'login' => 'testuser',
68 'name' => 'Test User',
71 $department = SL::DB::Department->new(
72 'description' => 'Test Department',
75 $payment_term = create_payment_terms(
76 'description' => '14Tage 2%Skonto, 30Tage netto',
77 'description_long' => "Innerhalb von 14 Tagen abzüglich 2 % Skonto, innerhalb von 30 Tagen rein netto.|Bei einer Zahlung bis zum <%skonto_date%> gewähren wir 2 % Skonto (EUR <%skonto_amount%>) entspricht EUR <%total_wo_skonto%>.Bei einer Zahlung bis zum <%netto_date%> ist der fällige Betrag in Höhe von <%total%> <%currency%> zu überweisen.",
78 'percent_skonto' => '0.02',
83 $delivery_term = SL::DB::DeliveryTerm->new(
84 'description' => 'Test Delivey Term',
85 'description_long' => 'Test Delivey Term Test Delivey Term',
90 push @parts, new_part(
91 partnumber => 'Part_1_KG',
94 push @parts, new_service(
95 partnumber => 'Serv_1',
97 push @parts, new_part(
98 partnumber => 'Part_2',
100 push @parts, new_service(
101 partnumber => 'Serv_2'
104 $reclamation_reason = SL::DB::ReclamationReason->new(
105 name => "test_reason",
111 Support::TestSetup::login();
117 my $sales_reclamation = SL::Dev::Record::create_sales_reclamation(
119 employee => $employee,
120 shippingpoint => "sp",
121 transaction_description => "td1",
122 payment => $payment_term,
123 delivery_term => $delivery_term,
125 reclamation_items => [
126 SL::Dev::Record::create_reclamation_item(
127 part => $parts[0], qty => 3, sellprice => 70,
128 reason => $reclamation_reason,
130 SL::Dev::Record::create_reclamation_item(
131 part => $parts[1], qty => 10, sellprice => 50,
132 reason => $reclamation_reason,
137 my $purchase_reclamation = SL::Dev::Record::create_purchase_reclamation(
139 employee => $employee,
140 shippingpoint => "sp",
141 transaction_description => "td2",
142 payment => $payment_term,
143 delivery_term => $delivery_term,
145 reclamation_items => [
146 SL::Dev::Record::create_reclamation_item(
147 part => $parts[0], qty => 3, sellprice => 70,
148 reason => $reclamation_reason,
150 SL::Dev::Record::create_reclamation_item(
151 part => $parts[1], qty => 10, sellprice => 50,
152 reason => $reclamation_reason,
158 my $sales_delivery_order = SL::Dev::Record::create_sales_delivery_order(
160 employee => $employee,
161 shippingpoint => "sp",
162 transaction_description => "td3",
163 payment_terms => $payment_term,
164 delivery_term => $delivery_term,
166 orderitems => [ SL::Dev::Record::create_delivery_order_item(part => $parts[0], qty => 3, sellprice => 70),
167 SL::Dev::Record::create_delivery_order_item(part => $parts[1], qty => 10, sellprice => 50),
171 my $purchase_delivery_order = SL::Dev::Record::create_purchase_delivery_order(
173 employee => $employee,
174 shippingpoint => "sp",
175 transaction_description => "td4",
176 payment_terms => $payment_term,
177 delivery_term => $delivery_term,
179 orderitems => [ SL::Dev::Record::create_delivery_order_item(part => $parts[0], qty => 3, sellprice => 70),
180 SL::Dev::Record::create_delivery_order_item(part => $parts[1], qty => 10, sellprice => 50),
184 # convert order → reclamation
185 my $converted_sales_reclamation = SL::Model::Record->new_from_workflow($sales_delivery_order, 'sales_reclamation');
186 $converted_sales_reclamation->items_sorted->[0]->reason($reclamation_reason);
187 $converted_sales_reclamation->items_sorted->[1]->reason($reclamation_reason);
188 $converted_sales_reclamation->save->load;
189 my $converted_purchase_reclamation = SL::Model::Record->new_from_workflow($purchase_delivery_order, 'purchase_reclamation');
190 $converted_purchase_reclamation->items_sorted->[0]->reason($reclamation_reason);
191 $converted_purchase_reclamation->items_sorted->[1]->reason($reclamation_reason);
192 $converted_purchase_reclamation->save->load;
194 # convert reclamation → order
195 my $converted_sales_delivery_order = SL::Model::Record->new_from_workflow($sales_reclamation, 'rma_delivery_order')->save->load;
196 my $converted_purchase_delivery_order = SL::Model::Record->new_from_workflow($purchase_reclamation, 'supplier_delivery_order')->save->load;
199 #get items before strip
200 my @purchase_reclamation_items = @{$purchase_reclamation->items_sorted};
201 my @sales_reclamation_items = @{$sales_reclamation->items_sorted};
202 my @converted_purchase_reclamation_items = @{$converted_purchase_reclamation->items_sorted};
203 my @converted_sales_reclamation_items = @{$converted_sales_reclamation->items_sorted};
204 my @purchase_delivery_order_items = @{$purchase_delivery_order->items_sorted};
205 my @sales_delivery_order_items = @{$sales_delivery_order->items_sorted};
206 my @converted_purchase_delivery_order_items = @{$converted_purchase_delivery_order->items_sorted};
207 my @converted_sales_delivery_order_items = @{$converted_sales_delivery_order->items_sorted};
210 ### TESTS #####################################################################
212 ## created sales und purchase reclamation should be nearly the same
213 my $sales_reclamation_tmp = clone($sales_reclamation);
214 my $purchase_reclamation_tmp = clone($purchase_reclamation);
215 # clean different values
217 record_type customer_id vendor_id
220 transaction_description
223 $sales_reclamation_tmp->$_(undef);
224 $purchase_reclamation_tmp->$_(undef);
226 pairwise { my $first_tmp = clone($a); my $second_tmp = clone($b);
231 $first_tmp->$_(undef);
232 $second_tmp->$_(undef);
234 is_deeply($first_tmp->strip->as_tree, $second_tmp->strip->as_tree);
235 } @purchase_reclamation_items, @sales_reclamation_items;
236 is_deeply($purchase_reclamation_tmp->strip->as_tree, $sales_reclamation_tmp->strip->as_tree);
238 ## created sales und purchase delivery_order should be nearly the same
239 my $sales_delivery_order_tmp = clone($sales_delivery_order);
240 my $purchase_delivery_order_tmp = clone($purchase_delivery_order);
241 # clean different values
243 customer_id vendor_id
246 transaction_description
249 $sales_delivery_order_tmp->$_(undef);
250 $purchase_delivery_order_tmp->$_(undef);
252 pairwise { my $first_tmp = clone($a); my $second_tmp = clone($b);
257 $first_tmp->$_(undef);
258 $second_tmp->$_(undef);
260 is_deeply($first_tmp->strip->as_tree, $second_tmp->strip->as_tree);
261 } @purchase_delivery_order_items, @sales_delivery_order_items;
262 is_deeply($purchase_delivery_order_tmp->strip->as_tree, $sales_delivery_order_tmp->strip->as_tree);
265 ## converted have to be linked to parent
267 my $linked_sales_delivery_order = $converted_sales_reclamation->linked_records->[0];
268 my $linked_sales_reclamation = $converted_sales_delivery_order->linked_records->[0];
269 is_deeply($linked_sales_delivery_order->strip->as_tree, $sales_delivery_order->strip->as_tree);
270 is_deeply($linked_sales_reclamation->strip->as_tree, $sales_reclamation->load->strip->as_tree);
273 my $linked_purchase_delivery_order = $converted_purchase_reclamation->linked_records->[0];
274 my $linked_purchase_reclamation = $converted_purchase_delivery_order->linked_records->[0];
275 is_deeply($linked_purchase_delivery_order->strip->as_tree, $purchase_delivery_order->strip->as_tree);
276 is_deeply($linked_purchase_reclamation->strip->as_tree, $purchase_reclamation->load->strip->as_tree);
279 ## converted should be nearly the same
280 my @different_record_values = qw(
281 id employee_id itime mtime reqdate transdate
283 amount exchangerate netamount
286 cusordnumber cv_record_number
287 donumber record_number
288 vendor_confirmation_number
290 my @different_record_item_values = qw(
291 id delivery_order_id reclamation_id itime mtime
292 cusordnumber marge_price_factor ordnumber transdate orderer_id
293 description reason_description_ext reason_description_int reason_id
298 test_deeply($a->strip->as_tree, $b->strip->as_tree,
299 "sales_delivery_order_items to sales_reclamation_items",
300 @different_record_item_values
302 } @sales_delivery_order_items, @converted_sales_reclamation_items;
303 test_deeply($sales_delivery_order->strip->as_tree, $converted_sales_reclamation->strip->as_tree,
304 "sales_delivery_order to sales_reclamation",
305 @different_record_values
309 test_deeply($a->strip->as_tree, $b->strip->as_tree,
310 "sales_reclamation_items to sales_delivery_order_items",
311 @different_record_item_values
313 } @sales_reclamation_items, @converted_sales_delivery_order_items;
314 test_deeply($sales_reclamation->strip->as_tree, $converted_sales_delivery_order->strip->as_tree,
315 "sales_reclamation to sales_delivery_order",
316 @different_record_values
322 test_deeply($a->strip->as_tree, $b->strip->as_tree,
323 "purchase_delivery_order_items to purchase_reclamation_items",
324 @different_record_item_values
326 } @purchase_delivery_order_items, @converted_purchase_reclamation_items;
327 test_deeply($purchase_delivery_order->strip->as_tree, $converted_purchase_reclamation->strip->as_tree,
328 "purchase_delivery_order to purchase_reclamation",
329 @different_record_values
333 test_deeply($a->strip->as_tree, $b->strip->as_tree,
334 "purchase_reclamation_items to purchase_delivery_order_items",
335 @different_record_item_values
337 } @purchase_reclamation_items, @converted_purchase_delivery_order_items;
338 test_deeply($purchase_reclamation->strip->as_tree, $converted_purchase_delivery_order->strip->as_tree,
339 "purchase_reclamation to purchase_delivery_order",
340 @different_record_values
345 #diag Dumper($purchase_reclamation->strip->as_tree);
346 #diag Dumper($linked_purchase_reclamation->strip->as_tree);