Revision 554ddc07
Von Werner Hahn vor fast 2 Jahren hinzugefügt
SL/Controller/DispositionManager.pm | ||
---|---|---|
use SL::DB::PurchaseBasketItem;
|
||
use SL::PriceSource;
|
||
use SL::Locale::String qw(t8);
|
||
use SL::Helper::Flash qw(flash);
|
||
|
||
use Data::Dumper;
|
||
|
||
sub action_list_parts {
|
||
... | ... | |
my $basket_part = SL::DB::PurchaseBasketItem->new(
|
||
parts_id => $part->id,
|
||
qty => $part->ordersize, # was ist wenn order_size < (rop-onhand) ist? sollte dann nicht (rop-onhand) genommen werden?
|
||
orderer => SL::DB::Manager::Employee->current;
|
||
orderer => SL::DB::Manager::Employee->current,
|
||
)->save;
|
||
}
|
||
$self->action_show_basket;
|
||
... | ... | |
sub action_show_basket {
|
||
my ( $self ) = @_;
|
||
|
||
$::request->{layout}->add_javascripts('kivi.DispositionManager.js');
|
||
$::request->{layout}->add_javascripts('kivi.DispositionManager.js', 'kivi.PartDetail.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 => "Purchase basket" );
|
||
}
|
||
|
||
sub action_show_vendor_items {
|
||
my ( $self ) = @_;
|
||
|
||
my $makemodels_parts = SL::DB::Manager::Part->get_all( query => [ 'makemodels.make' => $::form->{v_id}, '!id' => ['5599'], ], sort_by => 'onhand', with_objects => [ 'makemodels' ]);
|
||
$self->render('disposition_manager/_show_vendor_parts', { layout => 0 }, MAKEMODEL_ITEMS => $makemodels_parts);
|
||
}
|
||
|
||
sub action_transfer_to_purchase_order {
|
||
|
||
my ( $self ) = @_;
|
||
require SL::DB::Order;
|
||
require SL::DB::OrderItem;
|
||
require SL::DB::Part;
|
||
require SL::DB::Vendor;
|
||
my @error_report;
|
||
|
||
unless (($::form->{ids} && scalar @{ $::form->{ids}}) || ( $::form->{vendor_part_ids} && scalar @{ $::form->{vendor_part_ids}})) {
|
||
die 'There are no items selected';
|
||
}
|
||
my $v_id = $::form->{vendor_ids}->[0] ;
|
||
|
||
my ($vendor, $employee);
|
||
$vendor = SL::DB::Manager::Vendor->find_by(id => $v_id) or die "Can't find vendor";
|
||
$employee = SL::DB::Manager::Employee->current or die "Can't find employee";
|
||
|
||
my $basket_items = SL::DB::Manager::PurchaseBasketItem->get_all( query => [ id => \@{ $::form->{ids} } ] );
|
||
|
||
my $basket_items;
|
||
$basket_items = SL::DB::Manager::PurchaseBasketItem->get_all( query => [ id => \@{ $::form->{ids} } ] ) if ($::form->{ids} && scalar @{ $::form->{ids}});
|
||
|
||
my $vendor_items;
|
||
$vendor_items = SL::DB::Manager::Part->get_all( query => [ id => \@{ $::form->{vendor_part_ids} } ] ) if ($::form->{vendor_part_ids} && scalar @{ $::form->{vendor_part_ids}});
|
||
|
||
# create order first so we have a record for PriceSource
|
||
my $order = SL::DB::Order->new(
|
||
... | ... | |
my $i = 0;
|
||
my @items;
|
||
|
||
foreach my $basket_item ( @{ $basket_items } ) {
|
||
$i++;
|
||
my $mm = SL::DB::Manager::MakeModel->get_first( query => [ make => $vendor->id, parts_id => $basket_item->parts_id] );
|
||
|
||
my $current_order_item = SL::DB::OrderItem->new(
|
||
part => $basket_item->part,
|
||
description => $basket_item->part->description,
|
||
qty => $basket_item->qty || 1,
|
||
unit => $basket_item->part->unit,
|
||
position => $i,
|
||
);
|
||
if ($::form->{ids} && scalar @{ $::form->{ids}}) {
|
||
foreach my $basket_item ( @{ $basket_items } ) {
|
||
$i++;
|
||
|
||
my $current_order_item = SL::DB::OrderItem->new(
|
||
part => $basket_item->part,
|
||
description => $basket_item->part->description,
|
||
qty => $basket_item->part->min_order_qty || 1,
|
||
unit => $basket_item->part->unit,
|
||
position => $i,
|
||
orderer_id => $basket_item->orderer->id,
|
||
);
|
||
|
||
my $price_source = SL::PriceSource->new(record_item => $current_order_item, record => $order);
|
||
$current_order_item->sellprice($price_source->best_price->price);
|
||
$current_order_item->active_price_source($price_source->best_price->source);
|
||
push(@items, $current_order_item);
|
||
}
|
||
}
|
||
|
||
my $price_source = SL::PriceSource->new(record_item => $current_order_item, record => $order);
|
||
$current_order_item->sellprice($price_source->best_price->price);
|
||
$current_order_item->active_price_source($price_source->best_price->source);
|
||
push(@items, $current_order_item);
|
||
if ($::form->{vendor_part_ids} && scalar @{ $::form->{vendor_part_ids}}) {
|
||
foreach my $vendor_item ( @{ $vendor_items } ) {
|
||
$i++;
|
||
|
||
my $current_order_item = SL::DB::OrderItem->new(
|
||
part => $vendor_item,
|
||
description => $vendor_item->description,
|
||
qty => $vendor_item->min_order_qty || 1,
|
||
unit => $vendor_item->unit,
|
||
position => $i,
|
||
orderer_id => $employee->id,
|
||
);
|
||
|
||
my $price_source = SL::PriceSource->new(record_item => $current_order_item, record => $order);
|
||
$current_order_item->sellprice($price_source->best_price->price);
|
||
$current_order_item->active_price_source($price_source->best_price->source);
|
||
push(@items, $current_order_item);
|
||
}
|
||
}
|
||
|
||
$order->orderitems( [ @items ] );
|
||
|
||
$order->db->with_transaction( sub {
|
||
$order->calculate_prices_and_taxes;
|
||
$order->save;
|
||
... | ... | |
$item->{custom_variables} = \@{ $item->cvars_by_config };
|
||
$item->save;
|
||
}
|
||
SL::DB::Manager::PurchaseBasketItem->delete_all( where => [ id => \@{ $::form->{ids} }]);
|
||
SL::DB::Manager::PurchaseBasketItem->delete_all( where => [ id => \@{ $::form->{ids} }]) if ($::form->{ids} && scalar @{ $::form->{ids}});
|
||
return 1;
|
||
}) || die "error: " . $order->db->error;
|
||
$self->redirect_to(controller => "oe.pl", action => 'edit', type => 'purchase_order', vc => 'vendor', id => $order->id);
|
||
... | ... | |
$bar->add(
|
||
action => [
|
||
t8('Reload'),
|
||
submit => [ '#purchasebasket', { action => "DispositionManager/show_basket" } ],
|
||
link => $self->url_for(controller => 'DispositionManager', action => 'show_basket'),
|
||
],
|
||
action => [
|
||
t8('Action'),
|
||
... | ... | |
|
||
Shows a list with parts which are in the basket.
|
||
This list can be filtered by vendor. Then you can create a purchase order.
|
||
When filtered by vendor, a table with the parts from the vendor of the purchase basket and
|
||
a table with all parts from the vendor will be shown. From there you can mark
|
||
the parts and create an order
|
||
|
||
=item C<action_transfer_to_purchase_order>
|
||
|
SL/DB/Part.pm | ||
---|---|---|
|
||
foreach my $mm ( @{$_[0]->makemodels} ){
|
||
my $vendor = SL::DB::Manager::Vendor->get_first( where => [ id => $mm->make ] );
|
||
my @tmp = ({ title => $vendor->name . " (" . $::form->format_amount(\%::myconfig, $mm->lastcost, 2) . ")", value => $vendor->{id} });
|
||
my @tmp = ({ title => $vendor->vendornumber . "--" .$vendor->name . " (" . $::form->format_amount(\%::myconfig, $mm->lastcost, 2) . ")", value => $vendor->{id} });
|
||
push @vendor_dd, @tmp;
|
||
}
|
||
return \@vendor_dd;
|
js/kivi.DispositionManager.js | ||
---|---|---|
namespace('kivi.DispositionManager', function(ns) {
|
||
ns.sort_vendors = function() {
|
||
ns.display_vendor_parts($('#vendor_id2').val());
|
||
$("table tr").each(function(index) {
|
||
if ( index !== 0 ) {
|
||
$row = $(this);
|
||
//alert( $row.find("select[name='vendor_ids[]']").val() + '!=' + $('#cv_id').val());
|
||
if( $row.find("select[name='vendor_ids[]']").val() != $('#cv_id').val()) {
|
||
if( $row.find("select[name='vendor_ids[]']").val() != $('#vendor_id2').val()) {
|
||
$row.remove();
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
ns.display_vendor_parts = function(vendor_id) {
|
||
var url = 'controller.pl?action=DispositionManager/show_vendor_items&v_id=' + vendor_id;
|
||
$('#vendor_parts').load(url);
|
||
}
|
||
|
||
ns.create_order = function() {
|
||
var data = $('#purchasebasket').serializeArray();
|
||
data.push({ name: 'action', value: 'DispositionManager/transfer_to_purchase_order' });
|
||
|
||
$.post("controller.pl", data, kivi.eval_json_result);
|
||
}
|
||
|
||
ns.show_detail_dialog = function(part_id,partnumber) {
|
||
if ( part_id && partnumber ) {
|
||
var title = kivi.t8('Details of article number "#1"',[partnumber]);
|
||
kivi.popup_dialog({
|
||
url: 'controller.pl',
|
||
data: {
|
||
action: 'Part/showdetails',
|
||
id : part_id,
|
||
},
|
||
id: 'detail_menu',
|
||
dialog: { title: title
|
||
, width: 1000
|
||
, height: 450
|
||
, modal: false }
|
||
});
|
||
}
|
||
return true;
|
||
};
|
||
});
|
sql/Pg-upgrade2/hmo_purchase_basket.sql | ||
---|---|---|
-- @tag: hmo_purchase_basket
|
||
-- @description: Änderungen HMO für Dispositionsmanager. Neue Spalte Besteller in orderitems und delivery_order_items
|
||
-- @depends: purchase_basket
|
||
-- @ignore: 0
|
||
|
||
ALTER TABLE purchase_basket_items DROP COLUMN description;
|
||
ALTER TABLE purchase_basket_items ADD COLUMN orderer_id INTEGER REFERENCES employee(id);
|
||
ALTER TABLE orderitems ADD COLUMN orderer_id INTEGER REFERENCES employee(id);
|
||
ALTER TABLE delivery_order_items ADD COLUMN orderer_id INTEGER REFERENCES employee(id);
|
templates/webpages/disposition_manager/_show_vendor_parts.html | ||
---|---|---|
[%- USE HTML -%][%- USE LxERP -%][%- USE L -%][%- USE T8 -%][% USE P %]
|
||
[% USE Dumper %]
|
||
<h2>[% 'All parts of vendor odered by onhand' | $T8 %]</h2>
|
||
<table width="100%">
|
||
<thead>
|
||
<tr class="listheading">
|
||
<th>[% 'Purchase basket' | $T8 %] </th>
|
||
<th>[% 'Partnumber' | $T8 %] </th>
|
||
<th>[% 'Description' | $T8 %] </th>
|
||
<th>[% 'Onhand / Ordered' | $T8 %] </th>
|
||
<th>[% 'Rop' | $T8 %] </th>
|
||
<th>[% 'Order quantity' | $T8 %] </th>
|
||
<th>[% 'Vendor' | $T8 %] </th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
[% FOREACH makemodel_item = MAKEMODEL_ITEMS %]
|
||
|
||
[% # Dumper.dump_html('TEST') %]
|
||
[% # Dumper.dump_html(basket_item) %]
|
||
[% SET select_size = basket_item.part.vendor_dropdown.size %]
|
||
<tr class="listrow">
|
||
<td>[% L.checkbox_tag('vendor_part_ids[+]', checked = '0', value=makemodel_item.id) %]</td>
|
||
<td>[% HTML.escape(makemodel_item.partnumber) %]
|
||
[% IF makemodel_item.id %]
|
||
<img class="odbuttons" onclick="kivi.DispositionManager.show_detail_dialog('[% makemodel_item.id %]','[% makemodel_item.partnumber %]')" src="image/icons/svg/information.svg"
|
||
title="[% 'Article details' | $T8 %]">
|
||
[% END %]
|
||
</td>
|
||
<td>[% HTML.escape(makemodel_item.description) %]</td>
|
||
<td class="numeric">[% makemodel_item.onhand_as_number %] / [% makemodel_item.get_ordered_qty %]</td>
|
||
<td class="numeric">[% makemodel_item.rop_as_number %] </td>
|
||
<td class="numeric">[% makemodel_item.qty_as_number %] </td>
|
||
<td>[% L.select_tag('vendor_ids[]', makemodel_item.vendor_dropdown, value_key = 'value', title_key = 'title', default = makemodel_item.makemodels.item(0).make, size = select_size, style='width: 350px;' ) %]</td>
|
||
</tr>
|
||
[% END %]
|
||
</tbody>
|
||
</table>
|
templates/webpages/disposition_manager/show_purchase_basket.html | ||
---|---|---|
<h1>[% title %]</h1>
|
||
[% # Dumper.dump_html(BASKET_ITEMS) %]
|
||
<form id="purchasebasket" style="margin:1em;">
|
||
[% P.customer_vendor.picker('vendor_id2', '', type='vendor', fat_set_item=1) %]<br>
|
||
<div>id from change: <span id='change3'></span></div>
|
||
[% L.hidden_tag('cv_id', '') %]
|
||
[% P.customer_vendor.picker('vendor_id2', '', type='vendor') %]<br>
|
||
<div>
|
||
<table id="baskettable" width="100%">
|
||
<thead>
|
||
<tr class="listheading">
|
||
<th>[% L.checkbox_tag('check_all') %][% 'Purchase basket' | $T8 %] </th>
|
||
<th>[% L.checkbox_tag("", id="check_all", checkall="[data-checkall=1]") %][% 'Purchase basket' | $T8 %] </th>
|
||
<th>[% 'Partnumber' | $T8 %] </th>
|
||
<th>[% 'Description' | $T8 %] </th>
|
||
<th>[% 'Onhand' | $T8 %] </th>
|
||
... | ... | |
[% SET select_size = basket_item.part.vendor_dropdown.size %]
|
||
[% # IF !basket_item.part.get_ordered_qty(part.id) %]
|
||
<tr class="listrow">
|
||
<td>[% L.checkbox_tag('ids[+]', checked = '1', value=basket_item.id) %]</td>
|
||
<td>[% HTML.escape(basket_item.part.partnumber) %] </td>
|
||
<td>[% L.checkbox_tag('ids[+]', "data-checkall"=1, checked = '1', value=basket_item.id) %]</td>
|
||
<td>[% HTML.escape(basket_item.part.partnumber) %]
|
||
[% IF basket_item.part.id %]
|
||
<img class="odbuttons" onclick="kivi.DispositionManager.show_detail_dialog('[% basket_item.part.id %]','[% basket_item.part.partnumber %]')" src="image/icons/svg/information.svg"
|
||
title="[% 'Article details' | $T8 %]">
|
||
[% END %]
|
||
</td>
|
||
<td>[% HTML.escape(basket_item.part.description) %]</td>
|
||
<td class="numeric">[% basket_item.part.onhand_as_number %] </td>
|
||
<td class="numeric">[% basket_item.part.rop_as_number %] </td>
|
||
... | ... | |
[% END %]
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
<hr>
|
||
|
||
<div id="vendor_parts"></div>
|
||
</form>
|
||
<hr>
|
||
<script type="text/javascript">
|
||
<!--
|
||
|
||
$('#vendor_id2').change(function() { $('#change3').html($('#vendor_id2').val()) })
|
||
$('#vendor_id2').on('set_item:CustomerVendorPicker', function(e,o) {
|
||
$('#cv_id').val(o.id)
|
||
$('#vendor_id2').change('set_item:CustomerVendorPicker', function(e,o) {
|
||
kivi.DispositionManager.sort_vendors();
|
||
})
|
||
$(function() {
|
||
$('#check_all').checkall('INPUT[name^="id"]');
|
||
});
|
||
-->
|
||
</script>
|
Auch abrufbar als: Unified diff
Dispositionsmanager Zusätzliche Artikel des Lieferanten anzeigen