Revision 2bef4707
Von Tamino Steinert vor mehr als 1 Jahr hinzugefügt
SL/Controller/DispositionManager.pm | ||
---|---|---|
my ($self) = @_;
|
||
my @error_report;
|
||
|
||
my $basket_items_ids = $::form->{ids};
|
||
my $vendor_items_ids = $::form->{vendor_part_ids};
|
||
my $basket_item_ids = $::form->{ids};
|
||
my $vendor_item_ids = $::form->{vendor_part_ids};
|
||
|
||
unless (($basket_items_ids && scalar @{ $basket_items_ids})
|
||
|| ( $vendor_items_ids && scalar @{ $vendor_items_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 $v_id = $::form->{vendor_ids}->[0] ;
|
||
|
||
my ($vendor, $employee);
|
||
$vendor = SL::DB::Manager::Vendor->find_by(id => $v_id);
|
||
$employee = SL::DB::Manager::Employee->current;
|
||
|
||
|
||
my @orderitem_maps = (); # part, qty, orderer_id
|
||
if ($basket_items_ids && scalar @{ $basket_items_ids}) {
|
||
my $basket_items = SL::DB::Manager::PurchaseBasketItem->get_all(
|
||
query => [ id => $basket_items_ids ],
|
||
with_objects => ['part'],
|
||
);
|
||
push @orderitem_maps, map {{
|
||
part => $_->part,
|
||
qty => $_->qty,
|
||
orderer_id => $_->orderer_id,
|
||
}} @{$basket_items};
|
||
}
|
||
if ($vendor_items_ids && scalar @{ $vendor_items_ids}) {
|
||
my $vendor_items = SL::DB::Manager::Part->get_all(
|
||
query => [ id => $vendor_items_ids ] );
|
||
push @orderitem_maps, map {{
|
||
part => $_,
|
||
qty => $_->order_qty || 1,
|
||
orderer_id => $employee->id,
|
||
}} @{$vendor_items};
|
||
}
|
||
|
||
my $order = SL::DB::Order->new(
|
||
vendor_id => $vendor->id,
|
||
employee_id => $employee->id,
|
||
intnotes => $vendor->notes,
|
||
salesman_id => $employee->id,
|
||
payment_id => $vendor->payment_id,
|
||
delivery_term_id => $vendor->delivery_term_id,
|
||
taxzone_id => $vendor->taxzone_id,
|
||
currency_id => $vendor->currency_id,
|
||
transdate => DateTime->today_local
|
||
);
|
||
|
||
my @order_items;
|
||
my $i = 0;
|
||
foreach my $orderitem_map (@orderitem_maps) {
|
||
$i++;
|
||
my $part = $orderitem_map->{part};
|
||
my $qty = $orderitem_map->{qty};
|
||
my $orderer_id = $orderitem_map->{orderer_id};
|
||
|
||
my $order_item = SL::DB::OrderItem->new(
|
||
part => $part,
|
||
qty => $qty,
|
||
unit => $part->unit,
|
||
description => $part->description,
|
||
price_factor_id => $part->price_factor_id,
|
||
price_factor =>
|
||
$part->price_factor_id ? $part->price_factor->factor
|
||
: '',
|
||
orderer_id => $orderer_id,
|
||
position => $i,
|
||
);
|
||
|
||
my $price_source = SL::PriceSource->new(
|
||
record_item => $order_item, record => $order);
|
||
$order_item->sellprice(
|
||
$price_source->best_price ? $price_source->best_price->price
|
||
: 0);
|
||
$order_item->active_price_source(
|
||
$price_source->best_price ? $price_source->best_price->source
|
||
: '');
|
||
push @order_items, $order_item;
|
||
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();
|
||
}
|
||
|
||
$order->assign_attributes(orderitems => \@order_items);
|
||
|
||
$order->db->with_transaction( sub {
|
||
$order->calculate_prices_and_taxes;
|
||
$order->save;
|
||
|
||
my $snumbers = "ordernumber_" . $order->ordnumber;
|
||
SL::DB::History->new(
|
||
trans_id => $order->id,
|
||
snumbers => $snumbers,
|
||
employee_id => SL::DB::Manager::Employee->current->id,
|
||
addition => 'SAVED',
|
||
what_done => 'PurchaseBasket->Order',
|
||
)->save();
|
||
foreach my $item(@{ $order->orderitems }){
|
||
$item->parse_custom_variable_values->save;
|
||
$item->{custom_variables} = \@{ $item->cvars_by_config };
|
||
$item->save;
|
||
}
|
||
if ($basket_items_ids && scalar @{ $basket_items_ids}) {
|
||
SL::DB::Manager::PurchaseBasketItem->delete_all(
|
||
where => [ id => $basket_items_ids]);
|
||
}
|
||
return 1;
|
||
}) || die "error: " . $order->db->error;
|
||
|
||
$self->redirect_to(
|
||
controller => 'Order',
|
||
action => 'edit',
|
||
action => 'add_from_purchase_basket',
|
||
type => 'purchase_order',
|
||
vc => 'vendor',
|
||
id => $order->id,
|
||
basket_item_ids => $basket_item_ids,
|
||
vendor_item_ids => $vendor_item_ids,
|
||
vendor_id => $vendor_id,
|
||
);
|
||
}
|
||
|
||
... | ... | |
],
|
||
action => [
|
||
t8('Action'),
|
||
call => [ 'kivi.DispositionManager.create_order' ],
|
||
call => [ 'kivi.DispositionManager.create_purchase_order' ],
|
||
tooltip => t8('Create purchase order'),
|
||
],
|
||
action => [
|
SL/Controller/Order.pm | ||
---|---|---|
|
||
__PACKAGE__->run_before('check_auth_for_edit',
|
||
except => [ qw(edit show_customer_vendor_details_dialog price_popup load_second_rows close_quotations) ]);
|
||
__PACKAGE__->run_before('get_basket_info_from_from');
|
||
|
||
#
|
||
# actions
|
||
... | ... | |
);
|
||
}
|
||
|
||
sub action_add_from_purchase_basket {
|
||
my ($self) = @_;
|
||
|
||
my $basket_item_ids = $::form->{basket_item_ids};
|
||
my $vendor_item_ids = $::form->{vendor_item_ids};
|
||
my $vendor_id = $::form->{vendor_id};
|
||
|
||
|
||
unless (scalar @{ $basket_item_ids} || scalar @{ $vendor_item_ids}) {
|
||
$self->js->flash('error', t8('There are no items selected'));
|
||
return $self->js->render();
|
||
}
|
||
|
||
my $order = SL::DB::Order->create_from_purchase_basket(
|
||
$basket_item_ids, $vendor_item_ids, $vendor_id
|
||
);
|
||
|
||
$self->order($order);
|
||
|
||
$self->action_add();
|
||
}
|
||
|
||
# edit an existing order
|
||
sub action_edit {
|
||
my ($self) = @_;
|
||
... | ... | |
}
|
||
$self->js->val('[name="converted_from_orderitems_ids[+]"]', '');
|
||
$self->js->val('[name="converted_from_reclamation_items_ids[+]"]', '');
|
||
$self->js->val('[name="basket_item_ids[+]"]', '');
|
||
}
|
||
|
||
#
|
||
... | ... | |
return $item;
|
||
}
|
||
|
||
sub get_basket_info_from_from {
|
||
my ($self) = @_;
|
||
|
||
my $order = $self->order;
|
||
my $basket_item_ids = $::form->{basket_item_ids};
|
||
if (scalar @{ $basket_item_ids || [] }) {
|
||
for my $idx (0 .. $#{ $order->items_sorted }) {
|
||
my $order_item = $order->items_sorted->[$idx];
|
||
$order_item->{basket_item_id} = $basket_item_ids->[$idx];
|
||
}
|
||
}
|
||
}
|
||
|
||
# setup custom shipto from form
|
||
#
|
||
# The dialog returns form variables starting with 'shipto' and cvars starting
|
SL/DB/Order.pm | ||
---|---|---|
use List::MoreUtils qw(any);
|
||
|
||
use SL::DBUtils ();
|
||
use SL::DB::PurchaseBasketItem;
|
||
use SL::DB::MetaSetup::Order;
|
||
use SL::DB::Manager::Order;
|
||
use SL::DB::Helper::Attr;
|
||
... | ... | |
__PACKAGE__->before_save('_before_save_set_custom_shipto_module');
|
||
__PACKAGE__->after_save('_after_save_link_records');
|
||
__PACKAGE__->after_save('_after_save_close_reachable_intakes'); # uses linked records (order matters)
|
||
__PACKAGE__->before_save('_before_save_delete_from_purchase_basket');
|
||
|
||
# hooks
|
||
|
||
... | ... | |
return 1;
|
||
}
|
||
|
||
sub _before_save_delete_from_purchase_basket {
|
||
my ($self) = @_;
|
||
|
||
my @basket_item_ids = grep { $_ ne ''} map { $_->{basket_item_id} } $self->orderitems;
|
||
|
||
if (scalar @basket_item_ids) {
|
||
SL::DB::Manager::PurchaseBasketItem->delete_all(
|
||
where => [ id => \@basket_item_ids]
|
||
);
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
# methods
|
||
|
||
sub items { goto &orderitems; }
|
||
... | ... | |
return $cloned;
|
||
}
|
||
|
||
sub create_from_purchase_basket {
|
||
my ($class, $basket_item_ids, $vendor_item_ids, $vendor_id) = @_;
|
||
|
||
my ($vendor, $employee);
|
||
$vendor = SL::DB::Manager::Vendor->find_by(id => $vendor_id);
|
||
$employee = SL::DB::Manager::Employee->current;
|
||
|
||
my @orderitem_maps = (); # part, qty, orderer_id
|
||
if ($basket_item_ids && scalar @{ $basket_item_ids}) {
|
||
my $basket_items = SL::DB::Manager::PurchaseBasketItem->get_all(
|
||
query => [ id => $basket_item_ids ],
|
||
with_objects => ['part'],
|
||
);
|
||
push @orderitem_maps, map {{
|
||
basket_item_id => $_->id,
|
||
part => $_->part,
|
||
qty => $_->qty,
|
||
orderer_id => $_->orderer_id,
|
||
}} @{$basket_items};
|
||
}
|
||
if ($vendor_item_ids && scalar @{ $vendor_item_ids}) {
|
||
my $vendor_items = SL::DB::Manager::Part->get_all(
|
||
query => [ id => $vendor_item_ids ] );
|
||
push @orderitem_maps, map {{
|
||
basket_item_id => undef,
|
||
part => $_,
|
||
qty => $_->order_qty || 1,
|
||
orderer_id => $employee->id,
|
||
}} @{$vendor_items};
|
||
}
|
||
|
||
my $order = $class->new(
|
||
vendor_id => $vendor->id,
|
||
employee_id => $employee->id,
|
||
intnotes => $vendor->notes,
|
||
salesman_id => $employee->id,
|
||
payment_id => $vendor->payment_id,
|
||
delivery_term_id => $vendor->delivery_term_id,
|
||
taxzone_id => $vendor->taxzone_id,
|
||
currency_id => $vendor->currency_id,
|
||
transdate => DateTime->today_local
|
||
);
|
||
|
||
my @order_items;
|
||
my $i = 0;
|
||
foreach my $orderitem_map (@orderitem_maps) {
|
||
$i++;
|
||
my $part = $orderitem_map->{part};
|
||
my $qty = $orderitem_map->{qty};
|
||
my $orderer_id = $orderitem_map->{orderer_id};
|
||
|
||
my $order_item = SL::DB::OrderItem->new(
|
||
part => $part,
|
||
qty => $qty,
|
||
unit => $part->unit,
|
||
description => $part->description,
|
||
price_factor_id => $part->price_factor_id,
|
||
price_factor =>
|
||
$part->price_factor_id ? $part->price_factor->factor
|
||
: '',
|
||
orderer_id => $orderer_id,
|
||
position => $i,
|
||
);
|
||
$order_item->{basket_item_id} = $orderitem_map->{basket_item_id};
|
||
|
||
my $price_source = SL::PriceSource->new(
|
||
record_item => $order_item, record => $order);
|
||
$order_item->sellprice(
|
||
$price_source->best_price ? $price_source->best_price->price
|
||
: 0);
|
||
$order_item->active_price_source(
|
||
$price_source->best_price ? $price_source->best_price->source
|
||
: '');
|
||
push @order_items, $order_item;
|
||
}
|
||
|
||
$order->assign_attributes(orderitems => \@order_items);
|
||
|
||
$order->calculate_prices_and_taxes;
|
||
|
||
foreach my $item(@{ $order->orderitems }){
|
||
$item->parse_custom_variable_values;
|
||
$item->{custom_variables} = \@{ $item->cvars_by_config };
|
||
}
|
||
|
||
return $order;
|
||
}
|
||
|
||
sub new_from {
|
||
my ($class, $source, %params) = @_;
|
||
|
js/kivi.DispositionManager.js | ||
---|---|---|
$('#vendor_parts').load(url);
|
||
}
|
||
|
||
ns.create_order = function() {
|
||
ns.create_purchase_order = function() {
|
||
var data = $('#purchasebasket').serializeArray();
|
||
data.push({ name: 'action', value: 'DispositionManager/transfer_to_purchase_order' });
|
||
$.post("controller.pl", data, kivi.eval_json_result);
|
templates/design40_webpages/disposition_manager/show_purchase_basket.html | ||
---|---|---|
[% FOREACH basket_item = BASKET_ITEMS %]
|
||
|
||
<tr>
|
||
<td>[% L.checkbox_tag('ids[+]', "data-checkall"=1, checked = '1', value=basket_item.id) %] [% HTML.escape(basket_item.part.partsgroup.partsgroup) %]
|
||
<td>
|
||
[% L.checkbox_tag('ids[+]', "data-checkall"=1, checked = '1', value=basket_item.id) %]
|
||
[% L.hidden_tag('basket_ids[+]', basket_item.id) %]
|
||
</td>
|
||
<td> [% basket_item.part.presenter.part(target = '_blank') %]
|
||
[% P.button_tag(
|
templates/design40_webpages/order/tabs/_row.html | ||
---|---|---|
[% L.hidden_tag("converted_from_reclamation_items_ids[+]", ITEM.converted_from_reclamation_items_id) %]
|
||
[% L.hidden_tag("order.orderitems[+].id", ITEM.id, id='item_' _ ID) %]
|
||
[% L.hidden_tag("order.orderitems[].parts_id", ITEM.parts_id) %]
|
||
[% L.hidden_tag("basket_item_ids[+]", ITEM.basket_item_id) %]
|
||
</td>
|
||
<td class="center"><div name="position">[% HTML.escape(ITEM.position) %]</div></td>
|
||
<td><img src="image/updown.png" alt="[% LxERP.t8('reorder item') %]" class="dragdrop"></td>
|
templates/webpages/disposition_manager/show_purchase_basket.html | ||
---|---|---|
[% FOREACH basket_item = BASKET_ITEMS %]
|
||
|
||
<tr class="listrow">
|
||
<td>[% L.checkbox_tag('ids[+]', "data-checkall"=1, checked = '1', value=basket_item.id) %] [% HTML.escape(basket_item.part.partsgroup.partsgroup) %]
|
||
<td>
|
||
[% L.checkbox_tag('ids[+]', "data-checkall"=1, checked = '1', value=basket_item.id) %]
|
||
[% L.hidden_tag('basket_ids[+]', basket_item.id) %]
|
||
</td>
|
||
<td> [% basket_item.part.presenter.part(target = '_blank') %]
|
||
[% P.button_tag(
|
templates/webpages/order/tabs/_row.html | ||
---|---|---|
[% L.hidden_tag("converted_from_reclamation_items_ids[+]", ITEM.converted_from_reclamation_items_id) %]
|
||
[% L.hidden_tag("order.orderitems[+].id", ITEM.id, id='item_' _ ID) %]
|
||
[% L.hidden_tag("order.orderitems[].parts_id", ITEM.parts_id) %]
|
||
[% L.hidden_tag("purchase_basket_item_ids[+]", ITEM.purchase_basket_item_ids) %]
|
||
</td>
|
||
<td>
|
||
<div name="position" class="numeric">
|
Auch abrufbar als: Unified diff
DispositionManager: Lieferschein beim Erstellen nicht automatisch speichern