]> wagnertech.de Git - mfinanz.git/blob - t/controllers/disposition_manager/disposition_manager.t
date error in mapping
[mfinanz.git] / t / controllers / disposition_manager / disposition_manager.t
1 use strict;
2 use Test::More tests => 16;
3
4 use lib 't';
5 use Support::TestSetup;
6 use Test::Exception;
7 use SL::DB::Part;
8 use SL::DB::Inventory;
9 use SL::DB::MakeModel;
10 use SL::DB::PurchaseBasketItem;
11 use SL::DB::Order;
12 use SL::Controller::DispositionManager;
13 use DateTime;
14 use Data::Dumper;
15 use SL::Dev::Part qw(new_part);
16 use SL::Dev::Inventory qw(create_warehouse_and_bins set_stock);
17 use SL::Dev::CustomerVendor qw(new_vendor);
18
19 use utf8;
20
21 Support::TestSetup::login();
22 clear_up();
23
24 my ($wh, $bin) = create_warehouse_and_bins();
25 my $vendor = new_vendor()->save;
26
27 my $part1 = new_part(
28   partnumber   => 'TP 1',
29   description  => 'Testpart 1 rop no stock',
30   sellprice    => 5,
31   lastcost     => 3,
32   rop          => 20,
33   order_qty    => 1,
34   warehouse_id => $wh->id,
35   bin_id       => $bin->id,
36   makemodels   => [ _create_makemodel_for_vendor(vendor => $vendor) ],
37 )->save;
38
39 my $part2 = new_part(
40   partnumber   => 'TP 2',
41   description  => 'Testpart 2 norop',
42   rop          => 60,
43   order_qty    => 2,
44   makemodels   => [ _create_makemodel_for_vendor(vendor => $vendor) ],
45 )->save;
46 set_stock(part => $part2, bin_id => $bin->id, qty => 80);
47
48 for my $i (1 .. 10) {
49   my $part = new_part(
50     partnumber   => "TPO $i",
51     description  => "Testpart onhand $i",
52     rop          => 50,
53     order_qty    => $i+2,
54     sellprice    => 5,
55     lastcost     => 3,
56     warehouse_id => $wh->id,
57     bin_id       => $bin->id,
58     makemodels   => [ _create_makemodel_for_vendor(vendor => $vendor) ],
59   )->save;
60   set_stock(part => $part, bin_id => $bin->id, qty => ($i * 10));
61 }
62
63 my $controller = SL::Controller::DispositionManager->new();
64 my $reorder_parts = $controller->_get_parts;
65 is(scalar @{$reorder_parts}, 5, "found 5 parts where onhand < rop");
66
67 # die; # die here if you want to test making basket manually
68
69 note('creating purchase basket items');
70 $::form = Support::TestSetup->create_new_form;
71 $::form->{ids} = [ map { $_->id } @{$reorder_parts} ];
72
73 # call action_add_to_purchase_basket while redirecting rendered HTML output
74 my $output;
75 open(my $outputFH, '>', \$output) or die;
76 my $oldFH = select $outputFH;
77 $controller->action_add_to_purchase_basket;
78 select $oldFH;
79 close $outputFH;
80
81 is(SL::DB::Manager::PurchaseBasketItem->get_all_count(), 5, "5 items in purchase basket ok");
82
83 # die; # die here if you want to test creating purchase orders manually
84
85 note('making purchase order from purchase basket items');
86 my $purchase_basket_items = SL::DB::Manager::PurchaseBasketItem->get_all;
87 $::form = Support::TestSetup->create_new_form;
88 $::form->{ids}        = [ map { $_->id       } @{ $purchase_basket_items } ];
89 $::form->{basket_ids} = [ map { $_->id       } @{ $purchase_basket_items } ];
90 $::form->{vendor_ids} = [ map { $vendor->id  } @{ $purchase_basket_items } ];
91
92 open($outputFH, '>', \$output) or die;
93 $oldFH = select $outputFH;
94 my $ret = $controller->action_transfer_to_purchase_order;
95 select $oldFH;
96 close $outputFH;
97 is($ret, 1, "action_transfer_to_purchase_order ok");
98
99 my @basket_item_ids = map { $_->id } @{ $purchase_basket_items } ;
100 my $purchase_order = SL::DB::Order->create_from_purchase_basket(
101   \@basket_item_ids, [], $vendor->id
102 );
103 $purchase_order->save;
104
105 is(SL::DB::Manager::Order->get_all_count( where => [ SL::DB::Manager::Order->type_filter('purchase_order') ] ), 1, "1 purchase order created ok");
106 is(SL::DB::Manager::PurchaseBasketItem->get_all_count(), 0, "purchase basket empty after purchase order was created");
107
108 is( scalar @{$purchase_order->items}, 5, "Purchase order has 5 item ok");
109 my $first_item = $purchase_order->items_sorted->[0];
110 is( $first_item->parts_id, $part1->id, "Purchase order: first item is part1");
111 is( $first_item->qty, '20.00000', "Purchase order: first item has qty 20");
112 cmp_ok( $purchase_order->netamount, '==', 240, "Purchase order: netamount ok");
113 is( $first_item->active_price_source, 'makemodel/' . $part1->makemodels->[0]->id, "Purchase order: first item has correct active_price_source" . $first_item->part->partnumber);
114
115
116 my @vendor_item_ids = ( $part1->id, $part2->id );
117
118 my $purchase_order2 = SL::DB::Order->create_from_purchase_basket(
119   [], \@vendor_item_ids, $vendor->id
120 );
121
122 is( scalar @{$purchase_order2->items}, 2, "Purchase order 2 has 2 item ok");
123 my $item_1 = $purchase_order2->items_sorted->[0];
124 is( $item_1->parts_id, $part1->id, "Purchase order 2: first item is part1");
125 my $item_2 = $purchase_order2->items_sorted->[1];
126 is( $item_2->parts_id, $part2->id, "Purchase order 2: secound item is part2");
127 is( $item_1->qty, '1.00000', "Purchase order 2: first item has qty 1");
128 is( $item_2->qty, '2.00000', "Purchase order 2: secound item has qty 2");
129 is( $item_1->active_price_source, 'makemodel/' . $part1->makemodels->[0]->id, "Purchase order 2: first item has correct active_price_source" . $first_item->part->partnumber);
130
131 clear_up();
132 done_testing();
133
134 sub clear_up {
135   my %params = @_;
136   SL::DB::Manager::Inventory->delete_all(all => 1);
137   SL::DB::Manager::Order->delete_all(all => 1);
138   SL::DB::Manager::PurchaseBasketItem->delete_all(all => 1);
139   SL::DB::Manager::MakeModel->delete_all(all => 1);
140   SL::DB::Manager::Part->delete_all(all => 1);
141   SL::DB::Manager::Vendor->delete_all(all => 1);
142   SL::DB::Manager::Customer->delete_all(all => 1);
143   SL::DB::Manager::Bin->delete_all(all => 1);
144   SL::DB::Manager::Warehouse->delete_all(all => 1);
145 };
146
147 sub _create_makemodel_for_vendor {
148   my %params = @_;
149
150   my $vendor = delete $params{vendor};
151   die "no vendor" unless ref($vendor) eq 'SL::DB::Vendor';
152
153   my $mm = SL::DB::MakeModel->new(make          => $vendor->id,
154                                   model         => '',
155                                   lastcost      => 2,
156                                   sortorder     => 1,
157                                  );
158   $mm->assign_attributes( %params );
159   return $mm;
160 }
161
162 1;