1 package SL::Controller::ShopOrder;
5 use parent qw(SL::Controller::Base);
7 use SL::BackgroundJob::ShopOrderMassTransfer;
8 use SL::System::TaskServer;
10 use SL::DB::ShopOrderItem;
15 use SL::Helper::Flash;
16 use SL::Locale::String;
17 use SL::Controller::Helper::ParseFilter;
18 use Rose::Object::MakeMethods::Generic
20 'scalar --get_set_init' => [ qw(shop_order shops transferred js) ],
23 __PACKAGE__->run_before('check_auth');
24 __PACKAGE__->run_before('setup');
28 sub action_get_orders {
33 my $active_shops = SL::DB::Manager::Shop->get_all(query => [ obsolete => 0 ]);
34 foreach my $shop_config ( @{ $active_shops } ) {
35 my $shop = SL::Shop->new( config => $shop_config );
36 my $connect = $shop->check_connectivity;
38 if( !$connect->{success} ){
40 number_of_orders => $connect->{data}->{version},
41 shop_id => $shop->config->description,
44 $new_orders = \%new_order;
46 $new_orders = $shop->connector->get_new_orders;
48 push @{ $orders_fetched }, $new_orders ;
51 foreach my $shop_fetched(@{ $orders_fetched }) {
52 if($shop_fetched->{error}){
53 flash_later('error', t8('From shop "#1" : #2 ', $shop_fetched->{shop_id}, $shop_fetched->{number_of_orders},));
55 flash_later('info', t8('From shop #1 : #2 shoporders have been fetched.', $shop_fetched->{shop_id}, $shop_fetched->{number_of_orders},));
58 $self->redirect_to(controller => "ShopOrder", action => 'list');
64 my %filter = ($::form->{filter} ? parse_filter($::form->{filter}) : query => [ transferred => 0, obsolete => 0 ]);
65 my $transferred = $::form->{filter}->{transferred_eq_ignore_empty} ne '' ? $::form->{filter}->{transferred_eq_ignore_empty} : '';
66 my $sort_by = $::form->{sort_by} ? $::form->{sort_by} : 'order_date';
67 $sort_by .=$::form->{sort_dir} ? ' DESC' : ' ASC';
68 my $shop_orders = SL::DB::Manager::ShopOrder->get_all( %filter, sort_by => $sort_by,
69 with_objects => ['shop_order_items', 'kivi_customer', 'shop'],
72 foreach my $shop_order(@{ $shop_orders }){
74 my $open_invoices = SL::DB::Manager::Invoice->get_all_count(
75 query => [customer_id => $shop_order->{kivi_customer_id},
76 paid => {lt_sql => 'amount'},
79 $shop_order->{open_invoices} = $open_invoices;
81 $self->_setup_list_action_bar;
82 $self->render('shop_order/list',
83 title => t8('ShopOrders'),
84 SHOPORDERS => $shop_orders,
91 my $id = $::form->{id} || {};
92 my $shop_order = SL::DB::ShopOrder->new( id => $id )->load( with => ['kivi_customer'] );
93 die "can't find shoporder with id $id" unless $shop_order;
95 my $proposals = $shop_order->check_for_existing_customers;
97 $self->render('shop_order/show',
98 title => t8('Shoporder'),
99 IMPORT => $shop_order,
100 PROPOSALS => $proposals,
105 sub action_delete_order {
108 $self->shop_order->obsolete(1);
109 $self->shop_order->save;
110 $self->redirect_to(controller => "ShopOrder", action => 'list', filter => { 'transferred:eq_ignore_empty' => 0 });
113 sub action_undelete_order {
116 $self->shop_order->obsolete(0);
117 $self->shop_order->save;
118 $self->redirect_to(controller => "ShopOrder", action => 'show', id => $self->shop_order->id);
121 sub action_transfer {
124 my $customer = SL::DB::Manager::Customer->find_by(id => $::form->{customer});
125 die "Can't find customer" unless $customer;
126 my $employee = SL::DB::Manager::Employee->current;
127 die "Can't find employee" unless $employee;
129 die "Can't load shop_order form form->import_id" unless $self->shop_order;
130 my $order = $self->shop_order->convert_to_sales_order(customer => $customer, employee => $employee);
132 if ($order->{error}){
133 flash_later('error',@{$order->{errors}});
134 $self->redirect_to(controller => "ShopOrder", action => 'show', id => $self->shop_order->id);
136 $order->db->with_transaction( sub {
137 $order->calculate_prices_and_taxes;
140 my $snumbers = "ordernumber_" . $order->ordnumber;
141 SL::DB::History->new(
142 trans_id => $order->id,
143 snumbers => $snumbers,
144 employee_id => SL::DB::Manager::Employee->current->id,
146 what_done => 'Shopimport -> Order',
148 foreach my $item(@{ $order->orderitems }){
149 $item->parse_custom_variable_values->save;
150 $item->{custom_variables} = \@{ $item->cvars_by_config };
154 $self->shop_order->transferred(1);
155 $self->shop_order->transfer_date(DateTime->now_local);
156 $self->shop_order->save;
157 $self->shop_order->link_to_record($order);
158 }) || die $order->db->error;
159 $self->redirect_to(controller => "oe.pl", action => 'edit', type => 'sales_order', vc => 'customer', id => $order->id);
163 sub action_mass_transfer {
165 my @shop_orders = @{ $::form->{id} || [] };
167 my $job = SL::DB::BackgroundJob->new(
170 package_name => 'ShopOrderMassTransfer',
172 shop_order_record_ids => [ @shop_orders ],
173 num_order_created => 0,
174 num_delivery_order_created => 0,
175 status => SL::BackgroundJob::ShopOrderMassTransfer->WAITING_FOR_EXECUTION(),
176 conversion_errors => [ ],
177 )->update_next_run_at;
179 SL::System::TaskServer->new->wake_up;
181 my $html = $self->render('shop_order/_transfer_status', { output => 0 }, job => $job);
184 ->html('#status_mass_transfer', $html)
185 ->run('kivi.ShopOrder.massTransferStarted')
189 sub action_transfer_status {
191 my $job = SL::DB::BackgroundJob->new(id => $::form->{job_id})->load;
192 my $html = $self->render('shop_order/_transfer_status', { output => 0 }, job => $job);
194 $self->js->html('#status_mass_transfer', $html);
195 $self->js->run('kivi.ShopOrder.massTransferFinished') if $job->data_as_hash->{status} == SL::BackgroundJob::ShopOrderMassTransfer->DONE();
200 sub action_apply_customer {
201 my ( $self, %params ) = @_;
202 my $shop = SL::DB::Manager::Shop->find_by( id => $self->shop_order->shop_id );
203 my $what = $::form->{create_customer}; # new from billing, customer or delivery address
204 my %address = ( 'name' => $::form->{$what.'_name'},
205 'department_1' => $::form->{$what.'_company'},
206 'department_2' => $::form->{$what.'_department'},
207 'street' => $::form->{$what.'_street'},
208 'zipcode' => $::form->{$what.'_zipcode'},
209 'city' => $::form->{$what.'_city'},
210 'email' => $::form->{$what.'_email'},
211 'country' => $::form->{$what.'_country'},
212 'phone' => $::form->{$what.'_phone'},
213 'email' => $::form->{$what.'_email'},
214 'greeting' => $::form->{$what.'_greeting'},
215 'taxincluded_checked' => $shop->pricetype eq "brutto" ? 1 : 0,
216 'taxincluded' => $shop->pricetype eq "brutto" ? 1 : 0,
217 'pricegroup_id' => (split '\/',$shop->price_source)[0] eq "pricegroup" ? (split '\/',$shop->price_source)[1] : undef,
218 'taxzone_id' => $shop->taxzone_id,
219 'currency' => $::instance_conf->get_currency_id,
220 #'payment_id' => 7345,# TODO hardcoded
223 if($::form->{cv_id}){
224 $customer = SL::DB::Customer->new(id => $::form->{cv_id})->load;
225 $customer->assign_attributes(%address);
228 $customer = SL::DB::Customer->new(%address);
231 my $snumbers = "customernumber_" . $customer->customernumber;
232 SL::DB::History->new(
233 trans_id => $customer->id,
234 snumbers => $snumbers,
235 employee_id => SL::DB::Manager::Employee->current->id,
237 what_done => 'Shopimport',
240 $self->redirect_to(action => 'show', id => $::form->{import_id});
245 $::auth->assert('shop_part_edit');
246 $::request->layout->use_javascript("${_}.js") for qw(kivi.ShopOrder);
250 $::auth->assert('shop_part_edit');
256 sub init_shop_order {
258 return SL::DB::ShopOrder->new(id => $::form->{import_id})->load if $::form->{import_id};
261 sub init_transferred {
262 [ { title => t8("all"), value => '' },
263 { title => t8("transferred"), value => 1 },
264 { title => t8("not transferred"), value => 0 }, ]
268 SL::DB::Shop->shops_dd;
271 sub _setup_list_action_bar {
274 for my $bar ($::request->layout->get('actionbar')) {
278 submit => [ '#shoporders', { action => "ShopOrder/list" } ],
282 link => [ $self->url_for(action => 'get_orders') ],
283 tooltip => t8('New shop orders'),
288 call => [ 'kivi.ShopOrder.setup', id => "mass_transfer" ],
289 tooltip => t8('Transfer all marked'),
303 SL::Controller::ShopOrder - Shoporder CRUD Controller
307 Fetches the shoporders and transfers them to orders.
309 Relations for shoporders
313 =item shop_order_items
325 =item C<action_get_orders>
327 Fetches the shoporders with the shopconnector class
331 List the shoporders by different filters.
332 From the List you can transfer shoporders into orders in batch where it is possible or one by one.
336 Shows one order. From here you can apply/change/select customer data and transfer the shoporder to an order.
338 =item C<action_delete>
340 Marks the shoporder as obsolete. It's for shoporders you don't want to transfer.
342 =item C<action_undelete>
344 Marks the shoporder obsolete = false
346 =item C<action_transfer>
348 Transfers one shoporder to an order.
350 =item C<action_apply_customer>
352 Applys a new customer from the shoporder.
356 =head1 TASKSERVER ACTIONS
360 =item C<action_mass_transfer>
362 Transfers more shoporders by backgroundjob called from the taskserver to orders.
364 =item C<action_transfer_status>
366 Shows the backgroundjobdata for the popup status window
382 =item C<init_shoporder>
384 =item C<init_transfered>
386 Transferstatuses for the filter dropdown
390 Filter dropdown Shops
396 Implements different payments, pricesources and pricegroups. Till now not needed.
404 W. Hahn E<lt>wh@futureworldsearch.netE<gt>