3c700702068b47373fe9c494497e2ceaad599341
[kivitendo-erp.git] / t / shop / shop_order.t
1 use strict;
2 use Test::More;
3
4 use lib 't';
5 use Support::TestSetup;
6 use Carp;
7 use Test::Exception;
8 use SL::Dev::ALL;
9 use SL::DB::Shop;
10 use SL::DB::ShopOrder;
11 use SL::DB::ShopOrderItem;
12 use SL::Controller::ShopOrder;
13 use Data::Dumper;
14
15 my ($shop, $shop_order, $shop_part, $part, $customer, $employee);
16
17 sub reset_state {
18   my %params = @_;
19
20   clear_up();
21
22   $shop = SL::Dev::Shop::new_shop->save;
23   $part = SL::Dev::Part::new_part->save;
24   $shop_part = SL::Dev::Shop::new_shop_part(part => $part, shop => $shop)->save;
25
26   $employee = SL::DB::Manager::Employee->current || croak "No employee";
27
28   $customer = SL::Dev::CustomerVendor::new_customer(
29     name    => 'Evil Inc',
30     street  => 'Evil Street',
31     zipcode => '66666',
32     email   => 'evil@evilinc.com'
33   )->save;
34 }
35
36 sub save_shorcontroller_to_string {
37
38   my $output;
39   open(my $outputFH, '<', \$output) or die "OUTPUT";
40   my $oldFH = select $outputFH;
41   my $shor_controller = SL::Controller::ShopOrder->new;
42   $shor_controller->action_transfer;
43
44   select $oldFH;
45   close $outputFH;
46   return $output;
47 }
48 sub test_transfer {
49   my ( %params ) = @_;
50   $::form = Support::TestSetup->create_new_form;
51   $::form->{import_id} = $params{import_id};
52   $::form->{customer} =  $params{customer};
53   my $test_name = 'Test Controller Action Transfer';
54   save_shorcontroller_to_string();
55   my @links_record = RecordLinks->get_links( 'from_table' => 'shop_orders',
56                                             'from_id'    => $params{import_id},
57                                             'to_table'   => 'oe',
58                                           );
59   is($links_record[0]->{from_id}    , $params{import_id}, "record from id check");
60   is($links_record[0]->{from_table} , 'shop_orders'     , "record from table <shop_orders> check");
61   is($links_record[0]->{to_table}   , 'oe'              , "record to table <oe> check");
62 }
63
64 Support::TestSetup::login();
65
66 reset_state();
67
68 my $shop_trans_id = 1;
69
70 $shop_order = SL::Dev::Shop::new_shop_order(
71   shop              => $shop,
72   shop_trans_id     => $shop_trans_id,
73   amount            => 59.5,
74   billing_lastname  => 'Schmidt',
75   billing_firstname => 'Sven',
76   billing_company   => 'Evil Inc',
77   billing_street    => 'Evil Street',
78   billing_zipcode   => $customer->zipcode,
79   billing_email     => $customer->email,
80 );
81
82 my $shop_order_item = SL::DB::ShopOrderItem->new(
83   partnumber    => $part->partnumber,
84   position      => 1,
85   quantity      => 5,
86   price         => 10,
87   shop_trans_id => $shop_trans_id,
88 );
89 $shop_order->shop_order_items( [ $shop_order_item ] );
90 $shop_order->save;
91
92 note('testing check_for_existing_customers');
93 my $fuzzy_customers = $shop_order->check_for_existing_customers;
94
95 is(scalar @{ $fuzzy_customers }, 1, 'found 1 matching customer');
96 is($fuzzy_customers->[0]->name, 'Evil Inc', 'matched customer Evil Inc');
97
98 note('adding a not-so-similar customer');
99 my $customer_different = SL::Dev::CustomerVendor::new_customer(
100   name    => "Different Name",
101   street  => 'Good Straet', # difference large enough from "Evil Street"
102   zipcode => $customer->zipcode,
103   email   => "foo",
104 )->save;
105 $fuzzy_customers = $shop_order->check_for_existing_customers;
106 is(scalar @{ $fuzzy_customers }, 1, 'still only found 1 matching customer (zipcode equal + street dissimilar');
107
108 note('adding a similar customer');
109 my $customer_similar = SL::Dev::CustomerVendor::new_customer(
110   name    => "Different Name",
111   street  => 'Good Street', # difference not large enough from "Evil Street", street matches
112   zipcode => $customer->zipcode,
113   email   => "foo",
114 )->save;
115 $fuzzy_customers = $shop_order->check_for_existing_customers;
116 is(scalar @{ $fuzzy_customers }, 2, 'found 2 matching customers (zipcode equal + street similar)');
117
118 is($shop->description   , 'testshop' , 'shop description ok');
119 is($shop_order->shop_id , $shop->id  , "shop_id ok");
120
121 note('testing convert_to_sales_order');
122 my $order = $shop_order->convert_to_sales_order(employee => $employee, customer => $customer);
123 $order->calculate_prices_and_taxes;
124 $order->save;
125
126 is(ref($order), 'SL::DB::Order', 'order ok');
127 is($order->amount,    59.5, 'order amount ok');
128 is($order->netamount, 50,   'order netamount ok');
129
130 test_transfer( import_id => $shop_order->id , customer => $customer->id );
131
132 done_testing;
133
134 clear_up();
135
136 1;
137
138 sub clear_up {
139   "SL::DB::Manager::${_}"->delete_all(all => 1) for qw(OrderItem Order);
140   "SL::DB::Manager::${_}"->delete_all(all => 1) for qw(ShopPart Part ShopOrderItem ShopOrder Shop Customer);
141 }