]> wagnertech.de Git - mfinanz.git/blob - SL/BackgroundJob/ShopOrderMassTransfer.pm
Merge branch 'master' of http://wagnertech.de/git/mfinanz
[mfinanz.git] / SL / BackgroundJob / ShopOrderMassTransfer.pm
1 package SL::BackgroundJob::ShopOrderMassTransfer;
2
3 use strict;
4 use warnings;
5
6 use parent qw(SL::BackgroundJob::Base);
7
8 use SL::DBUtils;
9 use SL::DB::ShopOrder;
10 use SL::DB::ShopOrderItem;
11 use SL::DB::Order;
12 use SL::DB::History;
13 use SL::DB::DeliveryOrder;
14 use SL::DB::Inventory;
15 use Sort::Naturally ();
16 use SL::Locale::String qw(t8);
17
18 use constant WAITING_FOR_EXECUTION        => 0;
19 use constant CONVERTING_TO_ORDER          => 1;
20 use constant DONE                         => 2;
21
22 # Data format:
23 # my $data                  = {
24 #     shop_order_record_ids       => [ 603, 604, 605],
25 #     num_order_created           => 0,
26 #     orders_ids                  => [1,2,3]
27 #     conversion_errors         => [ { id => 603 , item => 2, message => "Out of stock"}, ],
28 # };
29 #
30
31 sub create_order {
32   my ( $self ) = @_;
33   my $job_obj = $self->{job_obj};
34   my $db      = $job_obj->db;
35   $job_obj->set_data(CONVERTING_TO_ORDER())->save;
36
37   my $data = $job_obj->data_as_hash;
38   foreach my $shop_order_id (@{ $data->{shop_order_record_ids} }) {
39     my $shop_order = SL::DB::ShopOrder->new(id => $shop_order_id)->load;
40     unless($shop_order){
41       push @{ $data->{conversion_errors} }, { id => $shop_order->id, number => $shop_order->shop_ordernumber, message => t8('Shoporder not found') };
42       $job_obj->update_attributes(data_as_hash => $data);
43     }
44     my $customer = SL::DB::Manager::Customer->find_by(id => $shop_order->{kivi_customer_id});
45     unless($customer){
46       push @{ $data->{conversion_errors} }, { id => $shop_order->id, number => $shop_order->shop_ordernumber, message => t8('Customer not found') };
47       $job_obj->update_attributes(data_as_hash => $data);
48     }
49     my $employee = SL::DB::Manager::Employee->current;
50     my $items = SL::DB::Manager::ShopOrderItem->get_all( where => [shop_order_id => $shop_order_id], );
51
52     if ($customer->{order_lock} == 0) {
53       $shop_order->{shop_order_items} = $items;
54
55       $db->with_transaction( sub {
56         my $order = $shop_order->convert_to_sales_order(customer => $customer, employee => $employee);
57
58         if ($order->{error}){
59           push @{ $data->{conversion_errors} }, { id => $shop_order->id, number => $shop_order->shop_ordernumber, message => \@{$order->{errors}} };
60           $job_obj->update_attributes(data_as_hash => $data);
61         }else{
62           $order->save;
63           $order->calculate_prices_and_taxes;
64           SL::DB::OrderVersion->new(oe_id => $order->id, version => 1)->save;
65           my $snumbers = "ordernumber_" . $order->ordnumber;
66           SL::DB::History->new(
67                             trans_id    => $order->id,
68                             snumbers    => $snumbers,
69                             employee_id => SL::DB::Manager::Employee->current->id,
70                             addition    => 'SAVED',
71                             what_done   => 'Shopimport->Order(MassTransfer)',
72                           )->save();
73           $shop_order->transferred(1);
74           $shop_order->transfer_date(DateTime->now_local);
75           $shop_order->save;
76           $shop_order->link_to_record($order);
77           $data->{num_order_created} ++;
78           push @{ $data->{orders_ids} }, $order->id;
79           push @{ $data->{shop_orders_ids} }, $shop_order->id;
80
81           $job_obj->update_attributes(data_as_hash => $data);
82         }
83         1;
84       })or do {
85         push @{ $data->{conversion_errors} }, { id => $shop_order->id, number => $shop_order->shop_ordernumber, message => $@ };
86         $job_obj->update_attributes(data_as_hash => $data);
87       }
88     }else{
89       push @{ $data->{conversion_errors} }, { id => $shop_order->id, number => $shop_order->shop_ordernumber, message => t8('Customerorderlock') };
90       $job_obj->update_attributes(data_as_hash => $data);
91     }
92   }
93 }
94
95 sub run {
96   my ($self, $job_obj) = @_;
97
98   $self->{job_obj}         = $job_obj;
99   $self->create_order;
100
101   $job_obj->set_data(status => DONE())->save;
102
103   return 1;
104 }
105 1;