View | Details | Raw Unified | Return to bug 17536
Collapse All | Expand All

(-)a/Koha/EDI.pm (-116 / +35 lines)
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
- 

Return to bug 17536