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>