|
package SL::Controller::DispositionManager;
|
|
|
|
use strict;
|
|
|
|
use parent qw(SL::Controller::Base);
|
|
|
|
use SL::Controller::Helper::GetModels;
|
|
use SL::Controller::Helper::ReportGenerator;
|
|
use SL::DB::Part;
|
|
use SL::DB::PurchaseBasketItem;
|
|
use SL::DB::Order;
|
|
use SL::DB::OrderItem;
|
|
use SL::DB::Vendor;
|
|
use SL::PriceSource;
|
|
use SL::Locale::String qw(t8);
|
|
use SL::Helper::Flash qw(flash flash_later);
|
|
use SL::DBUtils;
|
|
|
|
use Data::Dumper;
|
|
|
|
use Rose::Object::MakeMethods::Generic (
|
|
'scalar --get_set_init' => [ qw(models) ],
|
|
);
|
|
|
|
sub action_list_parts {
|
|
my ($self) = @_;
|
|
$self->prepare_report(t8('Reorder Level List'), $::form->{noshow} ? 1 : 0 );
|
|
|
|
my $objects = $::form->{noshow} ? [] : $self->models->get;
|
|
|
|
$self->_setup_list_action_bar;
|
|
$self->report_generator_list_objects(
|
|
report => $self->{report}, objects => $objects);
|
|
}
|
|
|
|
sub prepare_report {
|
|
my ($self, $title, $noshow ) = @_;
|
|
|
|
my $report = SL::ReportGenerator->new(\%::myconfig, $::form);
|
|
$self->{report} = $report;
|
|
|
|
my @columns = qw(
|
|
partnumber description available onhand rop ordered
|
|
);
|
|
my @visible = qw(
|
|
partnumber description available onhand rop ordered
|
|
);
|
|
my @sortable = qw(partnumber description);
|
|
|
|
my %column_defs = (
|
|
partnumber => {
|
|
sub => sub { $_[0]->partnumber },
|
|
text => t8('Part Number'),
|
|
obj_link => sub { $_[0]->presenter->link_to },
|
|
},
|
|
description => {
|
|
sub => sub { $_[0]->description },
|
|
text => t8('Part Description'),
|
|
obj_link => sub { $_[0]->presenter->link_to },
|
|
},
|
|
available => {
|
|
sub => sub { $::form->format_amount(\%::myconfig,$_[0]->onhandqty,2); },
|
|
text => t8('Available Stock'),
|
|
},
|
|
onhand => {
|
|
sub => sub { $::form->format_amount(\%::myconfig,$_[0]->stockqty,2); },
|
|
text => t8('Total Stock'),
|
|
},
|
|
rop => {
|
|
sub => sub { $::form->format_amount(\%::myconfig,$_[0]->rop,2); },
|
|
text => t8('Rop'),
|
|
},
|
|
ordered => {
|
|
sub => sub { $::form->format_amount(
|
|
\%::myconfig,$_[0]->get_open_ordered_qty,2); },
|
|
text => t8('Ordered purchase'),
|
|
},
|
|
);
|
|
|
|
map { $column_defs{$_}->{visible} = 1 } @visible;
|
|
|
|
$report->set_options(
|
|
controller_class => 'DispositionManager',
|
|
output_format => 'HTML',
|
|
title => t8($title),
|
|
allow_pdf_export => 1,
|
|
allow_csv_export => 1,
|
|
no_data_message => !$noshow,
|
|
);
|
|
$report->set_columns(%column_defs);
|
|
$report->set_column_order(@columns);
|
|
$report->set_export_options(qw(list_parts));
|
|
$report->set_options_from_form;
|
|
|
|
unless ( $noshow ) {
|
|
if ($report->{options}{output_format} =~ /^(pdf|csv)$/i) {
|
|
$self->models->disable_plugin('paginated');
|
|
}
|
|
$self->models->finalize; # for filter laundering
|
|
$self->models->set_report_generator_sort_options(
|
|
report => $report, sortable_columns => \@sortable
|
|
);
|
|
}
|
|
my $parts = $self->_get_parts(0);
|
|
my $top = $self->render('disposition_manager/list_parts', { output => 0 },
|
|
noshow => $noshow,
|
|
PARTS => $parts,
|
|
title => t8('Short onhand Ordered'),
|
|
);
|
|
my $bottom = $noshow ? undef : $self->render(
|
|
'disposition_manager/reorder_level_list/report_bottom',
|
|
{ output => 0}, models => $self->models );
|
|
$report->set_options(
|
|
raw_top_info_text => $top,
|
|
raw_bottom_info_text => $bottom,
|
|
);
|
|
}
|
|
|
|
sub action_add_to_purchase_basket{
|
|
my ($self) = @_;
|
|
|
|
my $employee = SL::DB::Manager::Employee->current;
|
|
|
|
my $parts_to_add = delete($::form->{ids}) || [];
|
|
foreach my $id (@{ $parts_to_add }) {
|
|
my $part = SL::DB::Manager::Part->find_by(id => $id)
|
|
or die "Can't find part with id: $id\n";
|
|
my $needed_qty = $part->order_qty < ($part->rop - $part->onhandqty) ?
|
|
$part->rop - $part->onhandqty
|
|
: $part->order_qty;
|
|
my $basket_part = SL::DB::PurchaseBasketItem->new(
|
|
part_id => $part->id,
|
|
qty => $needed_qty,
|
|
orderer_id => $employee->id,
|
|
)->save;
|
|
}
|
|
|
|
$self->redirect_to(
|
|
controller => 'DispositionManager',
|
|
action => 'show_basket',
|
|
);
|
|
|
|
}
|
|
|
|
sub action_show_basket {
|
|
my ($self) = @_;
|
|
|
|
$::request->{layout}->add_javascripts(
|
|
'kivi.DispositionManager.js', 'kivi.Part.js'
|
|
);
|
|
my $basket_items = SL::DB::Manager::PurchaseBasketItem->get_all(
|
|
query => [ cleared => 'F' ],
|
|
with_objects => [ 'part', 'part.makemodels' ]
|
|
);
|
|
$self->_setup_show_basket_action_bar;
|
|
$self->render(
|
|
'disposition_manager/show_purchase_basket',
|
|
BASKET_ITEMS => $basket_items,
|
|
title => t8('Purchase basket'),
|
|
);
|
|
}
|
|
|
|
sub action_show_vendor_items {
|
|
my ($self) = @_;
|
|
|
|
my $makemodels_parts;
|
|
if ($::form->{vendor_id}) {
|
|
$makemodels_parts = SL::DB::Manager::Part->get_all(
|
|
query => [
|
|
'purchase_basket_item.id' => undef,
|
|
'makemodels.make' => $::form->{vendor_id},
|
|
],
|
|
sort_by => 'onhand',
|
|
with_objects => [ 'makemodels', 'purchase_basket_item' ]
|
|
);
|
|
};
|
|
|
|
$self->render(
|
|
'disposition_manager/_show_vendor_parts',
|
|
{ layout => 0 },
|
|
MAKEMODEL_ITEMS => $makemodels_parts
|
|
);
|
|
}
|
|
|
|
sub action_transfer_to_purchase_order {
|
|
my ($self) = @_;
|
|
my @error_report;
|
|
|
|
my $basket_item_ids = $::form->{ids};
|
|
my $vendor_item_ids = $::form->{vendor_part_ids};
|
|
|
|
unless (($basket_item_ids && scalar @{ $basket_item_ids})
|
|
|| ( $vendor_item_ids && scalar @{ $vendor_item_ids}))
|
|
{
|
|
$self->js->flash('error', t8('There are no items selected'));
|
|
return $self->js->render();
|
|
}
|
|
|
|
my $vendor_id = $::form->{vendor_ids}->[0];
|
|
|
|
# check for same vendor
|
|
my %basket_id_vendor_id_map =
|
|
map {$::form->{basket_ids}->[$_] => $::form->{vendor_ids}->[$_]}
|
|
(0..$#{$::form->{vendor_ids}});
|
|
my @different_vendor_ids =
|
|
grep { $basket_id_vendor_id_map{$_} ne $vendor_id }
|
|
@{$basket_item_ids};
|
|
if (scalar @different_vendor_ids) {
|
|
$self->js->flash('error', t8('There are mulitple vendors selected'));
|
|
return $self->js->render();
|
|
}
|
|
|
|
$self->redirect_to(
|
|
controller => 'Order',
|
|
action => 'add_from_purchase_basket',
|
|
|