|
Lines 27-33
use Business::ISBN;
Link Here
|
| 27 |
use DateTime; |
27 |
use DateTime; |
| 28 |
use C4::Context; |
28 |
use C4::Context; |
| 29 |
use Koha::Database; |
29 |
use Koha::Database; |
| 30 |
use C4::Acquisition qw( NewBasket CloseBasket ModOrder); |
30 |
use C4::Acquisition qw( NewBasket CloseBasket ModOrder ModReceiveOrder); |
| 31 |
use C4::Suggestions qw( ModSuggestion ); |
31 |
use C4::Suggestions qw( ModSuggestion ); |
| 32 |
use C4::Items qw(AddItem); |
32 |
use C4::Items qw(AddItem); |
| 33 |
use C4::Biblio qw( AddBiblio TransformKohaToMarc GetMarcBiblio ); |
33 |
use C4::Biblio qw( AddBiblio TransformKohaToMarc GetMarcBiblio ); |
|
Lines 270-325
sub process_invoice {
Link Here
|
| 270 |
|
270 |
|
| 271 |
# ModReceiveOrder does not validate that $ordernumber exists validate here |
271 |
# ModReceiveOrder does not validate that $ordernumber exists validate here |
| 272 |
if ($order) { |
272 |
if ($order) { |
|
|
273 |
my $received_items = |
| 274 |
receipt_items( $schema, $line, $ordernumber ); |
| 273 |
|
275 |
|
| 274 |
# check suggestions |
276 |
my $price = _get_invoiced_price($line); |
| 275 |
my $s = $schema->resultset('Suggestion')->search( |
277 |
ModReceiveOrder( |
| 276 |
{ |
278 |
{ |
| 277 |
biblionumber => $order->biblionumber->biblionumber, |
279 |
biblionumber => $order->biblionumber->biblionumber, |
|
|
280 |
ordernumber => $ordernumber, |
| 281 |
quantityreceived => $line->quantity, |
| 282 |
cost => $price, |
| 283 |
ecost => $order->ecost, |
| 284 |
invoiceid => $invoiceid, |
| 285 |
rrp => $order->rrp, |
| 286 |
budget_id => $order->budget_id, |
| 287 |
datereceived => $msg_date, |
| 288 |
received_items => $received_items, |
| 289 |
order_internalnote => $order->order_internalnote, |
| 290 |
order_vendornote => $order->order_vendornote, |
| 278 |
} |
291 |
} |
| 279 |
)->single; |
292 |
); |
| 280 |
if ($s) { |
|
|
| 281 |
ModSuggestion( |
| 282 |
{ |
| 283 |
suggestionid => $s->suggestionid, |
| 284 |
STATUS => 'AVAILABLE', |
| 285 |
} |
| 286 |
); |
| 287 |
} |
| 288 |
|
| 289 |
my $price = _get_invoiced_price($line); |
| 290 |
|
| 291 |
if ( $order->quantity > $line->quantity ) { |
| 292 |
my $ordered = $order->quantity; |
| 293 |
|
| 294 |
# part receipt |
| 295 |
$order->orderstatus('partial'); |
| 296 |
$order->quantity( $ordered - $line->quantity ); |
| 297 |
$order->update; |
| 298 |
my $received_order = $order->copy( |
| 299 |
{ |
| 300 |
ordernumber => undef, |
| 301 |
quantity => $line->quantity, |
| 302 |
quantityreceived => $line->quantity, |
| 303 |
orderstatus => 'complete', |
| 304 |
unitprice => $price, |
| 305 |
invoiceid => $invoiceid, |
| 306 |
datereceived => $msg_date, |
| 307 |
} |
| 308 |
); |
| 309 |
transfer_items( $schema, $line, $order, |
| 310 |
$received_order ); |
| 311 |
receipt_items( $schema, $line, |
| 312 |
$received_order->ordernumber ); |
| 313 |
} |
| 314 |
else { # simple receipt all copies on order |
| 315 |
$order->quantityreceived( $line->quantity ); |
| 316 |
$order->datereceived($msg_date); |
| 317 |
$order->invoiceid($invoiceid); |
| 318 |
$order->unitprice($price); |
| 319 |
$order->orderstatus('complete'); |
| 320 |
$order->update; |
| 321 |
receipt_items( $schema, $line, $ordernumber ); |
| 322 |
} |
| 323 |
} |
293 |
} |
| 324 |
else { |
294 |
else { |
| 325 |
$logger->error( |
295 |
$logger->error( |
|
Lines 366-385
sub receipt_items {
Link Here
|
| 366 |
my $item = $schema->resultset('Item')->find( $ilink->itemnumber ); |
336 |
my $item = $schema->resultset('Item')->find( $ilink->itemnumber ); |
| 367 |
if ( !$item ) { |
337 |
if ( !$item ) { |
| 368 |
my $i = $ilink->itemnumber; |
338 |
my $i = $ilink->itemnumber; |
| 369 |
$logger->warn( |
339 |
$logger->warn("Cannot find item for $i : Order:$ordernumber"); |
| 370 |
"Cannot find aqorder item for $i :Order:$ordernumber"); |
|
|
| 371 |
next; |
340 |
next; |
| 372 |
} |
341 |
} |
| 373 |
my $b = $item->homebranch->branchcode; |
342 |
my $b = $item->homebranch->branchcode; |
|
|
343 |
if ( !defined $b ) { |
| 344 |
$b = 'undef'; |
| 345 |
} |
| 374 |
if ( !exists $branch_map{$b} ) { |
346 |
if ( !exists $branch_map{$b} ) { |
| 375 |
$branch_map{$b} = []; |
347 |
$branch_map{$b} = []; |
| 376 |
} |
348 |
} |
| 377 |
push @{ $branch_map{$b} }, $item; |
349 |
push @{ $branch_map{$b} }, $item; |
| 378 |
} |
350 |
} |
|
|
351 |
|
| 352 |
my $received_items = []; |
| 379 |
my $gir_occurrence = 0; |
353 |
my $gir_occurrence = 0; |
| 380 |
while ( $gir_occurrence < $quantity ) { |
354 |
while ( $gir_occurrence < $quantity ) { |
| 381 |
my $branch = $inv_line->girfield( 'branch', $gir_occurrence ); |
355 |
my $branch = $inv_line->girfield( 'branch', $gir_occurrence ); |
| 382 |
my $item = shift @{ $branch_map{$branch} }; |
356 |
my $barcode = $inv_line->girfield( 'barcode', $gir_occurrence ); |
|
|
357 |
my $item = shift @{ $branch_map{$branch} }; |
| 358 |
if ( !defined $item ) { |
| 359 |
$item = shift @{ $branch_map{undef} }; |
| 360 |
} |
| 361 |
|
| 383 |
if ($item) { |
362 |
if ($item) { |
| 384 |
my $barcode = $inv_line->girfield( 'barcode', $gir_occurrence ); |
363 |
my $barcode = $inv_line->girfield( 'barcode', $gir_occurrence ); |
| 385 |
if ( $barcode && !$item->barcode ) { |
364 |
if ( $barcode && !$item->barcode ) { |
|
Lines 398-403
sub receipt_items {
Link Here
|
| 398 |
} |
377 |
} |
| 399 |
} |
378 |
} |
| 400 |
|
379 |
|
|
|
380 |
push @{$received_items}, $item->itemnumber; |
| 401 |
$item->update; |
381 |
$item->update; |
| 402 |
} |
382 |
} |
| 403 |
else { |
383 |
else { |
|
Lines 405-463
sub receipt_items {
Link Here
|
| 405 |
} |
385 |
} |
| 406 |
++$gir_occurrence; |
386 |
++$gir_occurrence; |
| 407 |
} |
387 |
} |
| 408 |
return; |
388 |
return $received_items; |
| 409 |
|
|
|
| 410 |
} |
| 411 |
|
| 412 |
sub transfer_items { |
| 413 |
my ( $schema, $inv_line, $order_from, $order_to ) = @_; |
| 414 |
|
| 415 |
# Transfer x items from the orig order to a completed partial order |
| 416 |
my $quantity = $inv_line->quantity; |
| 417 |
my $gocc = 0; |
| 418 |
my %mapped_by_branch; |
| 419 |
while ( $gocc < $quantity ) { |
| 420 |
my $branch = $inv_line->girfield( 'branch', $gocc ); |
| 421 |
if ( !exists $mapped_by_branch{$branch} ) { |
| 422 |
$mapped_by_branch{$branch} = 1; |
| 423 |
} |
| 424 |
else { |
| 425 |
$mapped_by_branch{$branch}++; |
| 426 |
} |
| 427 |
++$gocc; |
| 428 |
} |
| 429 |
my $logger = Log::Log4perl->get_logger(); |
| 430 |
my $o1 = $order_from->ordernumber; |
| 431 |
my $o2 = $order_to->ordernumber; |
| 432 |
$logger->warn("transferring $quantity copies from order $o1 to order $o2"); |
| 433 |
|
| 434 |
my @item_links = $schema->resultset('AqordersItem')->search( |
| 435 |
{ |
| 436 |
ordernumber => $order_from->ordernumber, |
| 437 |
} |
| 438 |
); |
| 439 |
foreach my $ilink (@item_links) { |
| 440 |
my $ino = $ilink->itemnumber; |
| 441 |
my $item = $schema->resultset('Item')->find( $ilink->itemnumber ); |
| 442 |
my $i_branch = $item->homebranch; |
| 443 |
if ( exists $mapped_by_branch{$i_branch} |
| 444 |
&& $mapped_by_branch{$i_branch} > 0 ) |
| 445 |
{ |
| 446 |
$ilink->ordernumber( $order_to->ordernumber ); |
| 447 |
$ilink->update; |
| 448 |
--$quantity; |
| 449 |
--$mapped_by_branch{$i_branch}; |
| 450 |
$logger->warn("Transferred item $item"); |
| 451 |
} |
| 452 |
else { |
| 453 |
$logger->warn("Skipped item $item"); |
| 454 |
} |
| 455 |
if ( $quantity < 1 ) { |
| 456 |
last; |
| 457 |
} |
| 458 |
} |
| 459 |
|
389 |
|
| 460 |
return; |
|
|
| 461 |
} |
390 |
} |
| 462 |
|
391 |
|
| 463 |
sub process_quote { |
392 |
sub process_quote { |
|
Lines 1080-1098
Koha::EDI
Link Here
|
| 1080 |
|
1009 |
|
| 1081 |
receipt_items( schema_obj, invoice_line, ordernumber) |
1010 |
receipt_items( schema_obj, invoice_line, ordernumber) |
| 1082 |
|
1011 |
|
| 1083 |
receipts the items recorded on this invoice line |
1012 |
checks the items recorded on this invoice line, updating their barcodes if supplied |
| 1084 |
|
1013 |
by the vendor |
| 1085 |
no meaningful return |
|
|
| 1086 |
|
| 1087 |
=head2 transfer_items |
| 1088 |
|
| 1089 |
transfer_items(schema, invoice_line, originating_order, receiving_order) |
| 1090 |
|
| 1091 |
Transfer the items covered by this invoice line from their original |
| 1092 |
order to another order recording the partial fulfillment of the original |
| 1093 |
order |
| 1094 |
|
1014 |
|
| 1095 |
no meaningful return |
1015 |
returns an arrayref of matched itemnumbers |
| 1096 |
|
1016 |
|
| 1097 |
=head2 get_edifact_ean |
1017 |
=head2 get_edifact_ean |
| 1098 |
|
1018 |
|
| 1099 |
- |
|
|