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

(-)a/Koha/EDI.pm (-39 / +83 lines)
Lines 614-665 sub transfer_items { Link Here
614
}
614
}
615
615
616
sub process_quote {
616
sub process_quote {
617
    my $quote = shift;
617
    my $quote_message = shift;
618
618
619
    $quote->status('processing');
619
    $quote_message->status('processing');
620
    $quote->update;
620
    $quote_message->update;
621
621
622
    my $edi = Koha::Edifact->new( { transmission => $quote->raw_msg, } );
622
    my $edi = Koha::Edifact->new( { transmission => $quote_message->raw_msg, } );
623
623
624
    my $messages       = $edi->message_array();
624
    my $messages       = $edi->message_array();
625
    my $process_errors = 0;
625
    my $process_errors = 0;
626
    my $logger         = Koha::Logger->get( { interface => 'edi' } );
626
    my $logger         = Koha::Logger->get( { interface => 'edi' } );
627
    my $schema         = Koha::Database->new()->schema();
627
    my $schema         = Koha::Database->new()->schema();
628
    my $message_count  = 0;
628
    my $message_count  = 0;
629
    my $split_message;
629
    my @added_baskets;    # if auto & multiple baskets need to order all
630
    my @added_baskets;    # if auto & multiple baskets need to order all
630
631
631
    if ( @{$messages} && $quote->vendor_id ) {
632
    if ( @{$messages} && $quote_message->vendor_id ) {
632
        foreach my $msg ( @{$messages} ) {
633
        foreach my $msg ( @{$messages} ) {
633
            ++$message_count;
634
            ++$message_count;
634
            my $basketno =
635
            my $basketno = NewBasket(
635
              NewBasket( $quote->vendor_id, 0, $quote->filename, q{},
636
                $quote_message->vendor_id, 0, $quote_message->filename, q{},
636
                q{} . q{} );
637
                q{} . q{}
638
            );
637
            push @added_baskets, $basketno;
639
            push @added_baskets, $basketno;
638
            if ( $message_count > 1 ) {
640
            if ( $message_count > 1 ) {
639
                my $m_filename = $quote->filename;
641
                my $m_filename = $quote_message->filename;
640
                $m_filename .= "_$message_count";
642
                $m_filename .= "_$message_count";
641
                $schema->resultset('EdifactMessage')->create(
643
                $split_message = $schema->resultset('EdifactMessage')->create(
642
                    {
644
                    {
643
                        message_type  => $quote->message_type,
645
                        message_type  => $quote_message->message_type,
644
                        transfer_date => $quote->transfer_date,
646
                        transfer_date => $quote_message->transfer_date,
645
                        vendor_id     => $quote->vendor_id,
647
                        vendor_id     => $quote_message->vendor_id,
646
                        edi_acct      => $quote->edi_acct,
648
                        edi_acct      => $quote_message->edi_acct,
647
                        status        => 'recmsg',
649
                        status        => 'recmsg',
648
                        basketno      => $basketno,
650
                        basketno      => $basketno,
649
                        raw_msg       => q{},
651
                        raw_msg       => q{},
650
                        filename      => $m_filename,
652
                        filename      => $m_filename,
651
                    }
653
                    }
652
                );
654
                );
653
            }
655
            } else {
654
            else {
656
                $quote_message->basketno($basketno);
655
                $quote->basketno($basketno);
656
            }
657
            }
657
            $logger->trace("Created basket :$basketno");
658
            $logger->trace("Created basket :$basketno");
658
            my $items  = $msg->lineitems();
659
            my $items  = $msg->lineitems();
659
            my $refnum = $msg->message_refno;
660
            my $refnum = $msg->message_refno;
660
661
661
            for my $item ( @{$items} ) {
662
            for my $item ( @{$items} ) {
662
                if ( !quote_item( $item, $quote, $basketno ) ) {
663
                my $message = $split_message // $quote_message;
664
                if ( !quote_item( $item, $message, $basketno ) ) {
663
                    ++$process_errors;
665
                    ++$process_errors;
664
                }
666
                }
665
            }
667
            }
Lines 670-681 sub process_quote { Link Here
670
        $status = 'error';
672
        $status = 'error';
671
    }
673
    }
672
674
673
    $quote->status($status);
675
    $quote_message->status($status);
674
    $quote->update;    # status and basketno link
676
    $quote_message->update;    # status and basketno link
675
                       # Do we automatically generate orders for this vendor
677
                               # Do we automatically generate orders for this vendor
676
    my $v = $schema->resultset('VendorEdiAccount')->search(
678
    my $v = $schema->resultset('VendorEdiAccount')->search(
677
        {
679
        {
678
            vendor_id => $quote->vendor_id,
680
            vendor_id => $quote_message->vendor_id,
679
        }
681
        }
680
    )->single;
682
    )->single;
681
    if ( $v->auto_orders ) {
683
    if ( $v->auto_orders ) {
Lines 687-711 sub process_quote { Link Here
687
                }
689
                }
688
            );
690
            );
689
            Koha::Acquisition::Baskets->find($b)->close;
691
            Koha::Acquisition::Baskets->find($b)->close;
692
690
            # Log the approval
693
            # Log the approval
691
            if (C4::Context->preference("AcquisitionLog")) {
694
            if ( C4::Context->preference("AcquisitionLog") ) {
692
                my $approved = Koha::Acquisition::Baskets->find( $b );
695
                my $approved = Koha::Acquisition::Baskets->find($b);
693
                logaction(
696
                logaction(
694
                    'ACQUISITIONS',
697
                    'ACQUISITIONS',
695
                    'APPROVE_BASKET',
698
                    'APPROVE_BASKET',
696
                    $b,
699
                    $b,
697
                    to_json($approved->unblessed)
700
                    to_json( $approved->unblessed )
698
                );
701
                );
699
            }
702
            }
700
        }
703
        }
701
    }
704
    }
702
705
703
704
    return;
706
    return;
705
}
707
}
706
708
707
sub quote_item {
709
sub quote_item {
708
    my ( $item, $quote, $basketno ) = @_;
710
    my ( $item, $quote_message, $basketno ) = @_;
709
711
710
    my $schema = Koha::Database->new()->schema();
712
    my $schema = Koha::Database->new()->schema();
711
    my $logger = Koha::Logger->get( { interface => 'edi' } );
713
    my $logger = Koha::Logger->get( { interface => 'edi' } );
Lines 714-719 sub quote_item { Link Here
714
    # So this call should not fail unless that has
716
    # So this call should not fail unless that has
715
    my $basket = Koha::Acquisition::Baskets->find( $basketno );
717
    my $basket = Koha::Acquisition::Baskets->find( $basketno );
716
    unless ( $basket ) {
718
    unless ( $basket ) {
719
        $quote_message->add_to_edifact_errors(
720
            {
721
                section => "",
722
                details => "Failed to create basket"
723
            }
724
        );
717
        $logger->error('Skipping order creation no valid basketno');
725
        $logger->error('Skipping order creation no valid basketno');
718
        return;
726
        return;
719
    }
727
    }
Lines 721-727 sub quote_item { Link Here
721
    my $bib = _check_for_existing_bib( $item->item_number_id() );
729
    my $bib = _check_for_existing_bib( $item->item_number_id() );
722
    if ( !defined $bib ) {
730
    if ( !defined $bib ) {
723
        $bib = {};
731
        $bib = {};
724
        my $bib_record = _create_bib_from_quote( $item, $quote );
732
        my $bib_record = _create_bib_from_quote( $item, $quote_message );
725
733
726
        # Check for and add default 008 as this is a mandatory field
734
        # Check for and add default 008 as this is a mandatory field
727
        $bib_record = _handle_008_field($bib_record);
735
        $bib_record = _handle_008_field($bib_record);
Lines 742-747 sub quote_item { Link Here
742
    $order_quantity ||= 1;    # quantity not necessarily present
750
    $order_quantity ||= 1;    # quantity not necessarily present
743
    if ( $gir_count > 1 ) {
751
    if ( $gir_count > 1 ) {
744
        if ( $gir_count != $order_quantity ) {
752
        if ( $gir_count != $order_quantity ) {
753
            $quote_message->add_to_edifact_errors(
754
                {
755
                    section => "GIR",
756
                    details => "Order for $order_quantity items, $gir_count segments present"
757
                }
758
            );
745
            $logger->error(
759
            $logger->error(
746
                "Order for $order_quantity items, $gir_count segments present");
760
                "Order for $order_quantity items, $gir_count segments present");
747
        }
761
        }
Lines 752-758 sub quote_item { Link Here
752
    if (!$price) {
766
    if (!$price) {
753
        $price = $item->price_gross;
767
        $price = $item->price_gross;
754
    }
768
    }
755
    my $vendor = Koha::Acquisition::Booksellers->find( $quote->vendor_id );
769
    my $vendor = Koha::Acquisition::Booksellers->find( $quote_message->vendor_id );
756
770
757
    # NB quote will not include tax info it only contains the list price
771
    # NB quote will not include tax info it only contains the list price
758
    my $ecost = _discounted_price( $vendor->discount, $price, $item->price_info_inclusive );
772
    my $ecost = _discounted_price( $vendor->discount, $price, $item->price_info_inclusive );
Lines 822-833 sub quote_item { Link Here
822
    my $skip = '0';
836
    my $skip = '0';
823
    if ( !$budget ) {
837
    if ( !$budget ) {
824
        if ( $item->quantity > 1 ) {
838
        if ( $item->quantity > 1 ) {
825
            carp 'Skipping line with no budget info';
839
            $quote_message->add_to_edifact_errors(
840
                {
841
                    section => "GIR",
842
                    details => "Skipped GIR line with invalid budget: " . $item->girfield('fund_allocation')
843
                }
844
            );
826
            $logger->trace('girfield skipped for invalid budget');
845
            $logger->trace('girfield skipped for invalid budget');
827
            $skip++;
846
            $skip++;
828
        }
847
        } else {
829
        else {
848
            $quote_message->add_to_edifact_errors(
830
            carp 'Skipping line with no budget info';
849
                {
850
                    section => "GIR",
851
                    details => "Skipped orderline line with invalid budget: " . $item->girfield('fund_allocation')
852
                }
853
            );
831
            $logger->trace('orderline skipped for invalid budget');
854
            $logger->trace('orderline skipped for invalid budget');
832
            return;
855
            return;
833
        }
856
        }
Lines 854-860 sub quote_item { Link Here
854
        $ordernumber{ $budget->budget_id } = $o;
877
        $ordernumber{ $budget->budget_id } = $o;
855
878
856
        if ( C4::Context->preference('AcqCreateItem') eq 'ordering' ) {
879
        if ( C4::Context->preference('AcqCreateItem') eq 'ordering' ) {
857
            $item_hash = _create_item_from_quote( $item, $quote );
880
            $item_hash = _create_item_from_quote( $item, $quote_message );
858
881
859
            my $created = 0;
882
            my $created = 0;
860
            while ( $created < $order_quantity ) {
883
            while ( $created < $order_quantity ) {
Lines 881-886 sub quote_item { Link Here
881
                        $rota->add_item($itemnumber);
904
                        $rota->add_item($itemnumber);
882
                        $logger->trace("Item added to rota $rota->id");
905
                        $logger->trace("Item added to rota $rota->id");
883
                    } else {
906
                    } else {
907
                        $quote_message->add_to_edifact_errors(
908
                            {
909
                                section => "LRP",
910
                                details => "No rota found for passed $lrp in orderline"
911
                            }
912
                        );
884
                        $logger->error("No rota found matching $lrp in orderline");
913
                        $logger->error("No rota found matching $lrp in orderline");
885
                    }
914
                    }
886
                }
915
                }
Lines 899-905 sub quote_item { Link Here
899
            if ( !$budget ) {
928
            if ( !$budget ) {
900
                my $bad_budget =
929
                my $bad_budget =
901
                  $item->girfield( 'fund_allocation', $occurrence );
930
                  $item->girfield( 'fund_allocation', $occurrence );
902
                carp 'Skipping line with no budget info';
931
                $quote_message->add_to_edifact_errors(
932
                    {
933
                        section => "GIR",
934
                        details => "Skipped GIR line with invalid budget: $bad_budget"
935
                    }
936
                );
903
                $logger->trace(
937
                $logger->trace(
904
                    "girfield skipped for invalid budget:$bad_budget");
938
                    "girfield skipped for invalid budget:$bad_budget");
905
                ++$occurrence;    ## lets look at the next one not this one again
939
                ++$occurrence;    ## lets look at the next one not this one again
Lines 931-937 sub quote_item { Link Here
931
965
932
                if ( C4::Context->preference('AcqCreateItem') eq 'ordering' ) {
966
                if ( C4::Context->preference('AcqCreateItem') eq 'ordering' ) {
933
                    if ( !defined $item_hash ) {
967
                    if ( !defined $item_hash ) {
934
                        $item_hash = _create_item_from_quote( $item, $quote );
968
                        $item_hash = _create_item_from_quote( $item, $quote_message );
935
                    }
969
                    }
936
                    my $new_item = {
970
                    my $new_item = {
937
                        itype =>
971
                        itype =>
Lines 986-994 sub quote_item { Link Here
986
                            { key => 'stockrotationrotas_title' } );
1020
                            { key => 'stockrotationrotas_title' } );
987
                        if ($rota) {
1021
                        if ($rota) {
988
                            $rota->add_item($itemnumber);
1022
                            $rota->add_item($itemnumber);
989
                            $logger->trace("Item added to rota $rota->id");
1023
                            $logger->trace("Item added to rota " .$rota->id);
990
                        }
1024
                        }
991
                        else {
1025
                        else {
1026
                            $quote_message->add_to_edifact_errors(
1027
                                {
1028
                                    section => "LRP",
1029
                                    details => "No rota found for passed $lrp in orderline"
1030
                                }
1031
                            );
992
                            $logger->error(
1032
                            $logger->error(
993
                                "No rota found matching $lrp in orderline");
1033
                                "No rota found matching $lrp in orderline");
994
                        }
1034
                        }
Lines 1059-1064 sub quote_item { Link Here
1059
                            $logger->trace("Item added to rota $rota->id");
1099
                            $logger->trace("Item added to rota $rota->id");
1060
                        }
1100
                        }
1061
                        else {
1101
                        else {
1102
                            $quote_message->add_to_edifact_errors(
1103
                                {
1104
                                    section => "LRP",
1105
                                    details => "No rota found for passed $lrp in orderline"
1106
                                }
1107
                            );
1062
                            $logger->error(
1108
                            $logger->error(
1063
                                "No rota found matching $lrp in orderline");
1109
                                "No rota found matching $lrp in orderline");
1064
                        }
1110
                        }
Lines 1070-1076 sub quote_item { Link Here
1070
        }
1116
        }
1071
    }
1117
    }
1072
    return 1;
1118
    return 1;
1073
1074
}
1119
}
1075
1120
1076
sub get_edifact_ean {
1121
sub get_edifact_ean {
1077
- 

Return to bug 38689