X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/fd751746775f9da6743a3ac1de12cd48cc87bb9b..2cf35cb6f7e1ae4d0adb0cc36d804528f84ffb0b:/SL/Controller/DeliveryOrder.pm diff --git a/SL/Controller/DeliveryOrder.pm b/SL/Controller/DeliveryOrder.pm index a43ddd88d..80a215566 100644 --- a/SL/Controller/DeliveryOrder.pm +++ b/SL/Controller/DeliveryOrder.pm @@ -4,6 +4,7 @@ use strict; use parent qw(SL::Controller::Base); use SL::Helper::Flash qw(flash_later); +use SL::Helper::Number qw(_format_number_units _parse_number); use SL::Presenter::Tag qw(select_tag hidden_tag div_tag); use SL::Locale::String qw(t8); use SL::SessionFile::Random; @@ -25,6 +26,7 @@ use SL::DB::Language; use SL::DB::RecordLink; use SL::DB::Shipto; use SL::DB::Translation; +use SL::DB::TransferType; use SL::Helper::CreatePDF qw(:all); use SL::Helper::PrintOptions; @@ -77,6 +79,16 @@ sub action_add { ); } +sub action_add_from_order { + my ($self) = @_; + # this interfers with init_order + $self->{converted_from_oe_id} = delete $::form->{id}; + + # TODO copy data and remember to link them on save + + $self->action_add; +} + # edit an existing order sub action_edit { my ($self) = @_; @@ -395,7 +407,7 @@ sub action_save_and_show_email_dialog { email_form => $email_form, show_bcc => $::auth->assert('email_bcc', 'may fail'), FILES => \%files, - is_customer => $self->cv eq 'customer', + is_customer => $self->type_data->is_customer, ALL_EMPLOYEES => $self->{all_employees}, ); @@ -653,6 +665,7 @@ sub action_add_item { ITEM => $item, ID => $item_id, SELF => $self, + in_out => $self->type_data->transfer, ); if ($::form->{insert_before_item_id}) { @@ -740,6 +753,7 @@ sub action_add_multi_items { ITEM => $item, ID => $item_id, SELF => $self, + in_out => $self->type_data->transfer, ); if ($::form->{insert_before_item_id}) { @@ -872,6 +886,59 @@ sub action_return_from_create_part { } +sub action_stock_in_out_dialog { + my ($self) = @_; + + my $part = SL::DB::Part->load_cached($::form->{parts_id}) or die "need parts_id"; + my $stock = $::form->{stock}; + my $unit = $::form->{unit}; + my $qty = _parse_number($::form->{qty_as_number}); + + my $inout = $self->type_data->transfer; + + my @contents = DO->get_item_availability(parts_id => $part->id); + my $stock_info = DO->unpack_stock_information(packed => $stock); + + $self->merge_stock_data($stock_info, \@contents, $part); + + $self->render("delivery_order/stock_dialog", { layout => 0 }, + WHCONTENTS => $self->order->delivered ? $stock_info : \@contents, + part => $part, + do_qty => $qty, + do_unit => $unit, + ); + +} + +sub merge_stock_data { + my ($self, $stock_info, $contents, $part) = @_; + # TODO rewrite to mapping + + if (!$self->order->delivered) { + for my $row (@$contents) { + $row->{available_qty} = _format_number_units($row->{qty}, $row->{unit}, $part->unit); + + for my $sinfo (@{ $stock_info }) { + next if $row->{bin_id} != $sinfo->{bin_id} || + $row->{warehouse_id} != $sinfo->{warehouse_id} || + $row->{chargenumber} ne $sinfo->{chargenumber} || + $row->{bestbefore} ne $sinfo->{bestbefore}; + + $row->{"stock_$_"} = $sinfo->{$_} + for qw(qty unit error delivery_order_items_stock_id); + } + } + + } else { + for my $sinfo (@{ $stock_info }) { + my $bin = SL::DB::Bin->load_cached($sinfo->{bin_id}); + $sinfo->{warehouse_description} = $bin->warehouse->description; + $sinfo->{bin_description} = $bin->escription; + map { $sinfo->{"stock_$_"} = $sinfo->{$_} } qw(qty unit); + } + } +} + # load the second row for one or more items # # This action gets the html code for all items second rows by rendering a template for @@ -939,6 +1006,50 @@ sub action_update_row_from_master_data { $self->js->render(); } +sub action_transfer_stock { + my ($self) = @_; + + if ($self->order->delivered) { + return $self->js->flash("error", t8('The parts for this order have already been transferred'))->render; + } + + my $errors = $self->save; + + if (@$errors) { + $self->js->flash('error', $_) for @$errors; + return $self->js->render; + } + + my $order = $self->order; + + # TODO move to type data + my $trans_type = $self->type_data->properties('transfer') eq 'in' + ? SL::DB::Manager::TransferType->find_by(direction => "id", description => "stock") + : SL::DB::Manager::TransferType->find_by(direction => "out", deescription => "shipped"); + + my @transfer_requests; + + for my $item (@{ $order->items_sorted }) { + for my $stock (@{ $item->delivery_order_stock_entries }) { + my $transfer = SL::DB::Inventory->new_from($stock); + $transfer->trans_type($trans_type); + + push @transfer_requests, $transfer; + }; + } + + if (!@transfer_requests) { + $self->js->flash("error", t8("No stock to transfer"))->render; + } + + SL::DB->with_transaction(sub { + $_->save for @transfer_requests; + $self->order->update_attributes(deliverd => 1); + }); + + $self->js->flash("info", t8("Stock transfered"))->render; +} + sub js_load_second_row { my ($self, $item, $item_id, $do_parse) = @_; @@ -1530,7 +1641,6 @@ sub workflow_sales_or_purchase_order { ); } - sub pre_render { my ($self) = @_; @@ -1582,6 +1692,8 @@ sub pre_render { } } @all_objects; } + $self->{template_args}{in_out} = $self->type_data->transfer; + $self->get_item_cvpartnumber($_) for @{$self->order->items_sorted}; $::request->{layout}->use_javascript("${_}.js") for qw(kivi.SalesPurchase kivi.DeliveryOrder kivi.File ckeditor/ckeditor ckeditor/adapters/jquery @@ -1694,6 +1806,23 @@ sub setup_edit_action_bar { only_if => $self->type_data->show_menu("delete"), ], + combobox => [ + action => [ + t8('Transfer out'), + submit => [ '#order_form', { action => "DeliveryOrder/transfer_stock" } ], + disabled => $self->order->delivered ? t8('The parts for this order have already been transferred') : undef, + only_if => $self->type_data->properties('transfer') eq 'out', + confirm => t8('Do you really want to transfer the stock and set this order to delivered?'), + ], + action => [ + t8('Transfer in'), + submit => [ '#order_form', { action => "DeliveryOrder/transfer_stock" } ], + disabled => $self->order->delivered ? t8('The parts for this order have already been transferred') : undef, + only_if => $self->type_data->properties('transfer') eq 'in', + confirm => t8('Do you really want to transfer the stock and set this order to delivered?'), + ], + ], + combobox => [ action => [ t8('more') @@ -1928,6 +2057,24 @@ sub store_pdf_to_webdav_and_filemanagement { return @errors; } +sub calculate_stock_in_out { + my ($self, $item) = @_; + + return "" if !$item->part || !$item->part->unit || !$item->unit; + + my $in_out = $self->type_data->transfer; + + my $do_qty = $item->qty; + my $sum = sum0 map { + $_->unit_obj->convert_to($_->qty, $item->unit_obj) + } $item->delivery_order_stock_entries; + + my $matches = $do_qty == $sum; + my $content = _format_number_units($sum, 2, $item->unit_obj, $item->part->unit_obj); + + return $content; +} + sub init_type_data { SL::Controller::DeliveryOrder::TypeData->new($_[0]); }