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

(-)a/C4/Acquisition.pm (-35 / +15 lines)
Lines 1048-1063 sub ModOrderBiblioitemNumber { Link Here
1048
1048
1049
=head3 ModReceiveOrder
1049
=head3 ModReceiveOrder
1050
1050
1051
  &ModReceiveOrder($biblionumber, $ordernumber, $quantityreceived, $user,
1051
  &ModReceiveOrder($biblionumber, $ordernumber, $quantityreceived, $receiveditems);
1052
    $unitprice, $booksellerinvoicenumber, $biblioitemnumber,
1053
    $freight, $bookfund, $rrp);
1054
1052
1055
Updates an order, to reflect the fact that it was received, at least
1053
Updates an order, to reflect the fact that it was received, at least
1056
in part. All arguments not mentioned below update the fields with the
1054
in part.
1057
same name in the aqorders table of the Koha database.
1058
1055
1059
If a partial order is received, splits the order into two.  The received
1056
If a partial order is received, splits the order into two.  The received
1060
portion must have a booksellerinvoicenumber.
1057
portion must have a booksellerinvoicenumber. If $receiveditems are supplied,
1058
the rest of the items will be moved to the new order.
1061
1059
1062
Updates the order with bibilionumber C<$biblionumber> and ordernumber
1060
Updates the order with bibilionumber C<$biblionumber> and ordernumber
1063
C<$ordernumber>.
1061
C<$ordernumber>.
Lines 1066-1081 C<$ordernumber>. Link Here
1066
1064
1067
1065
1068
sub ModReceiveOrder {
1066
sub ModReceiveOrder {
1069
    my (
1067
    my ( $biblionumber, $ordernumber,  $quantrec, $receiveditems ) = @_;
1070
        $biblionumber,    $ordernumber,  $quantrec, $user, $cost,
1071
        $invoiceno, $freight, $rrp, $budget_id, $datereceived
1072
    )
1073
    = @_;
1074
    my $dbh = C4::Context->dbh;
1068
    my $dbh = C4::Context->dbh;
1075
#     warn "DATE BEFORE : $daterecieved";
1069
#     warn "DATE BEFORE : $daterecieved";
1076
#    $daterecieved=POSIX::strftime("%Y-%m-%d",CORE::localtime) unless $daterecieved;
1070
#    $daterecieved=POSIX::strftime("%Y-%m-%d",CORE::localtime) unless $daterecieved;
1077
#     warn "DATE REC : $daterecieved";
1071
#     warn "DATE REC : $daterecieved";
1078
    $datereceived = C4::Dates->output('iso') unless $datereceived;
1079
    my $suggestionid = GetSuggestionFromBiblionumber( $dbh, $biblionumber );
1072
    my $suggestionid = GetSuggestionFromBiblionumber( $dbh, $biblionumber );
1080
    if ($suggestionid) {
1073
    if ($suggestionid) {
1081
        ModSuggestion( {suggestionid=>$suggestionid,
1074
        ModSuggestion( {suggestionid=>$suggestionid,
Lines 1093-1128 sub ModReceiveOrder { Link Here
1093
    $sth->finish();
1086
    $sth->finish();
1094
1087
1095
    if ( $order->{quantity} > $quantrec ) {
1088
    if ( $order->{quantity} > $quantrec ) {
1096
        $sth=$dbh->prepare("
1097
            UPDATE aqorders
1098
            SET quantityreceived=?
1099
                , datereceived=?
1100
                , booksellerinvoicenumber=?
1101
                , unitprice=?
1102
                , freight=?
1103
                , rrp=?
1104
                , quantity=?
1105
            WHERE biblionumber=? AND ordernumber=?");
1106
1107
        $sth->execute($quantrec,$datereceived,$invoiceno,$cost,$freight,$rrp,$quantrec,$biblionumber,$ordernumber);
1108
        $sth->finish;
1109
1110
        # create a new order for the remaining items, and set its bookfund.
1089
        # create a new order for the remaining items, and set its bookfund.
1111
        foreach my $orderkey ( "linenumber", "allocation" ) {
1090
        foreach my $orderkey ( "linenumber", "allocation" ) {
1112
            delete($order->{'$orderkey'});
1091
            delete($order->{'$orderkey'});
1113
        }
1092
        }
1114
        $order->{'quantity'} -= $quantrec;
1093
        $order->{'quantity'} -= $quantrec;
1115
        $order->{'quantityreceived'} = 0;
1094
        $order->{'quantityreceived'} = 0;
1116
        my $newOrder = NewOrder($order);
1095
        my (undef, $newOrder) = NewOrder($order);
1117
} else {
1096
1118
        $sth=$dbh->prepare("update aqorders
1097
        if ($receiveditems && @$receiveditems) {
1119
                            set quantityreceived=?,datereceived=?,booksellerinvoicenumber=?,
1098
            my $sql = "
1120
                                unitprice=?,freight=?,rrp=?
1099
                UPDATE aqorders_items
1121
                            where biblionumber=? and ordernumber=?");
1100
                SET ordernumber = ?
1122
        $sth->execute($quantrec,$datereceived,$invoiceno,$cost,$freight,$rrp,$biblionumber,$ordernumber);
1101
                WHERE ordernumber = ?
1123
        $sth->finish;
1102
                AND itemnumber NOT IN (".join(",", map "?", @$receiveditems).")";
1103
            $dbh->do($sql, undef, $newOrder, $ordernumber, @$receiveditems);
1104
        }
1124
    }
1105
    }
1125
    return $datereceived;
1126
}
1106
}
1127
#------------------------------------------------------------#
1107
#------------------------------------------------------------#
1128
1108
(-)a/C4/Biblio.pm (-3 / +3 lines)
Lines 2471-2477 sub TransformMarcToKohaOneField { Link Here
2471
2471
2472
=head2 PrepareItemrecordDisplay
2472
=head2 PrepareItemrecordDisplay
2473
2473
2474
  PrepareItemrecordDisplay($itemrecord,$bibnum,$itemumber,$frameworkcode);
2474
  PrepareItemrecordDisplay($bibnum,$itemumber,$defaultvalues,$frameworkcode);
2475
2475
2476
Returns a hash with all the fields for Display a given item data in a template
2476
Returns a hash with all the fields for Display a given item data in a template
2477
2477
Lines 2650-2663 sub PrepareItemrecordDisplay { Link Here
2650
                            $subfield_data{random}     = int(rand(1000000));    # why do we need 2 different randoms?
2650
                            $subfield_data{random}     = int(rand(1000000));    # why do we need 2 different randoms?
2651
                            my $index_subfield = int(rand(1000000));
2651
                            my $index_subfield = int(rand(1000000));
2652
                            $subfield_data{id} = "tag_".$tag."_subfield_".$subfield."_".$index_subfield;
2652
                            $subfield_data{id} = "tag_".$tag."_subfield_".$subfield."_".$index_subfield;
2653
                            $subfield_data{marc_value} = qq[<input tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255"
2653
                            $subfield_data{marc_value} = qq[<input tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255" value="$defaultvalue"
2654
                                onfocus="Focus$function_name($subfield_data{random}, '$subfield_data{id}');"
2654
                                onfocus="Focus$function_name($subfield_data{random}, '$subfield_data{id}');"
2655
                                 onblur=" Blur$function_name($subfield_data{random}, '$subfield_data{id}');" />
2655
                                 onblur=" Blur$function_name($subfield_data{random}, '$subfield_data{id}');" />
2656
                                <a href="#" class="buttonDot" onclick="Clic$function_name('$subfield_data{id}'); return false;" title="Tag Editor">...</a>
2656
                                <a href="#" class="buttonDot" onclick="Clic$function_name('$subfield_data{id}'); return false;" title="Tag Editor">...</a>
2657
                                $javascript];
2657
                                $javascript];
2658
                        } else {
2658
                        } else {
2659
                            warn "Plugin Failed: $plugin";
2659
                            warn "Plugin Failed: $plugin";
2660
                            $subfield_data{marc_value} = qq(<input tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255" />); # supply default input form
2660
                            $subfield_data{marc_value} = qq(<input tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255" value="$defaultvalue" />); # supply default input form
2661
                        }
2661
                        }
2662
                }
2662
                }
2663
                elsif ( $tag eq '' ) {       # it's an hidden field
2663
                elsif ( $tag eq '' ) {       # it's an hidden field
(-)a/C4/ImportBatch.pm (-2 / +2 lines)
Lines 547-556 sub BatchCommitItems { Link Here
547
            $updsth->execute();
547
            $updsth->execute();
548
            $num_items_errored++;
548
            $num_items_errored++;
549
        } else {
549
        } else {
550
            my ($item_biblionumber, $biblioitemnumber, $itemnumber) = AddItemFromMarc($item_marc, $biblionumber);
550
            my $item = AddItemFromMarc($item_marc, $biblionumber);
551
            my $updsth = $dbh->prepare("UPDATE import_items SET status = ?, itemnumber = ? WHERE import_items_id = ?");
551
            my $updsth = $dbh->prepare("UPDATE import_items SET status = ?, itemnumber = ? WHERE import_items_id = ?");
552
            $updsth->bind_param(1, 'imported');
552
            $updsth->bind_param(1, 'imported');
553
            $updsth->bind_param(2, $itemnumber);
553
            $updsth->bind_param(2, $item->{itemnumber});
554
            $updsth->bind_param(3, $row->{'import_items_id'});
554
            $updsth->bind_param(3, $row->{'import_items_id'});
555
            $updsth->execute();
555
            $updsth->execute();
556
            $updsth->finish();
556
            $updsth->finish();
(-)a/C4/Items.pm (-7 / +12 lines)
Lines 194-204 sub CartToShelf { Link Here
194
194
195
=head2 AddItemFromMarc
195
=head2 AddItemFromMarc
196
196
197
  my ($biblionumber, $biblioitemnumber, $itemnumber) 
197
  my $item = AddItemFromMarc($source_item_marc, $biblionumber);
198
      = AddItemFromMarc($source_item_marc, $biblionumber);
199
198
200
Given a MARC::Record object containing an embedded item
199
Given a MARC::Record object containing an embedded item
201
record and a biblionumber, create a new item record.
200
record and a biblionumber, create a new item record or update
201
existing one.
202
202
203
=cut
203
=cut
204
204
Lines 214-226 sub AddItemFromMarc { Link Here
214
	$localitemmarc->append_fields($source_item_marc->field($itemtag));
214
	$localitemmarc->append_fields($source_item_marc->field($itemtag));
215
    my $item = &TransformMarcToKoha( $dbh, $localitemmarc, $frameworkcode ,'items');
215
    my $item = &TransformMarcToKoha( $dbh, $localitemmarc, $frameworkcode ,'items');
216
    my $unlinked_item_subfields = _get_unlinked_item_subfields($localitemmarc, $frameworkcode);
216
    my $unlinked_item_subfields = _get_unlinked_item_subfields($localitemmarc, $frameworkcode);
217
    if (my $itemnumber = $item->{itemnumber}) {
218
        return ModItem($item, $biblionumber, $itemnumber, $dbh, $frameworkcode, $unlinked_item_subfields);
219
    }
217
    return AddItem($item, $biblionumber, $dbh, $frameworkcode, $unlinked_item_subfields);
220
    return AddItem($item, $biblionumber, $dbh, $frameworkcode, $unlinked_item_subfields);
218
}
221
}
219
222
220
=head2 AddItem
223
=head2 AddItem
221
224
222
  my ($biblionumber, $biblioitemnumber, $itemnumber) 
225
  my $item = AddItem($item, $biblionumber[, $dbh, $frameworkcode, $unlinked_item_subfields]);
223
      = AddItem($item, $biblionumber[, $dbh, $frameworkcode, $unlinked_item_subfields]);
224
226
225
Given a hash containing item column names as keys,
227
Given a hash containing item column names as keys,
226
create a new Koha item record.
228
create a new Koha item record.
Lines 272-278 sub AddItem { Link Here
272
   
274
   
273
    logaction("CATALOGUING", "ADD", $itemnumber, "item") if C4::Context->preference("CataloguingLog");
275
    logaction("CATALOGUING", "ADD", $itemnumber, "item") if C4::Context->preference("CataloguingLog");
274
    
276
    
275
    return ($item->{biblionumber}, $item->{biblioitemnumber}, $itemnumber);
277
    return $item;
276
}
278
}
277
279
278
=head2 AddItemBatchFromMarc
280
=head2 AddItemBatchFromMarc
Lines 451-456 sub ModItemFromMarc { Link Here
451
        $item->{$item_field} = $default_values_for_mod_from_marc{$item_field} unless (exists $item->{$item_field});
453
        $item->{$item_field} = $default_values_for_mod_from_marc{$item_field} unless (exists $item->{$item_field});
452
    }
454
    }
453
    my $unlinked_item_subfields = _get_unlinked_item_subfields( $localitemmarc, $frameworkcode );
455
    my $unlinked_item_subfields = _get_unlinked_item_subfields( $localitemmarc, $frameworkcode );
456
    $itemnumber ||= $item->{itemnumber};
454
457
455
    ModItem($item, $biblionumber, $itemnumber, $dbh, $frameworkcode, $unlinked_item_subfields); 
458
    ModItem($item, $biblionumber, $itemnumber, $dbh, $frameworkcode, $unlinked_item_subfields); 
456
    return $item;
459
    return $item;
Lines 458-464 sub ModItemFromMarc { Link Here
458
461
459
=head2 ModItem
462
=head2 ModItem
460
463
461
  ModItem({ column => $newvalue }, $biblionumber, 
464
  my $item = ModItem({ column => $newvalue }, $biblionumber, 
462
                  $itemnumber[, $original_item_marc]);
465
                  $itemnumber[, $original_item_marc]);
463
466
464
Change one or more columns in an item record and update
467
Change one or more columns in an item record and update
Lines 522-527 sub ModItem { Link Here
522
    ModZebra( $biblionumber, "specialUpdate", "biblioserver", undef, undef );
525
    ModZebra( $biblionumber, "specialUpdate", "biblioserver", undef, undef );
523
526
524
    logaction("CATALOGUING", "MODIFY", $itemnumber, Dumper($item)) if C4::Context->preference("CataloguingLog");
527
    logaction("CATALOGUING", "MODIFY", $itemnumber, Dumper($item)) if C4::Context->preference("CataloguingLog");
528
529
    return $item;
525
}
530
}
526
531
527
=head2 ModItemTransfer
532
=head2 ModItemTransfer
(-)a/acqui/addorder.pl (-3 / +2 lines)
Lines 261-269 if ( $orderinfo->{quantity} ne '0' ) { Link Here
261
                                    $itemhash{$item}->{'indicator'},
261
                                    $itemhash{$item}->{'indicator'},
262
                                    'ITEM');
262
                                    'ITEM');
263
            my $record=MARC::Record::new_from_xml($xml, 'UTF-8');
263
            my $record=MARC::Record::new_from_xml($xml, 'UTF-8');
264
            my ($biblionumber,$bibitemnum,$itemnumber) = AddItemFromMarc($record,$$orderinfo{biblionumber});
264
            my $item = AddItemFromMarc($record,$$orderinfo{biblionumber});
265
            NewOrderItem($itemnumber, $$orderinfo{ordernumber});
265
            NewOrderItem($item->{itemnumber}, $$orderinfo{ordernumber});
266
267
        }
266
        }
268
    }
267
    }
269
268
(-)a/acqui/addorderiso2709.pl (-2 / +2 lines)
Lines 260-267 if ($op eq ""){ Link Here
260
            my $xml = TransformHtmlToXml( \@tags, \@subfields, \@field_values, \@ind_tag, \@indicator );
260
            my $xml = TransformHtmlToXml( \@tags, \@subfields, \@field_values, \@ind_tag, \@indicator );
261
            my $record = MARC::Record::new_from_xml( $xml, 'UTF-8' );
261
            my $record = MARC::Record::new_from_xml( $xml, 'UTF-8' );
262
            for (my $qtyloop=1;$qtyloop <=$quantity;$qtyloop++) {
262
            for (my $qtyloop=1;$qtyloop <=$quantity;$qtyloop++) {
263
                my ( $biblionumber, $bibitemnum, $itemnumber ) = AddItemFromMarc( $record, $biblionumber );
263
                my $item = AddItemFromMarc( $record, $biblionumber );
264
                NewOrderItem( $itemnumber, $ordernumber );
264
                NewOrderItem( $item->{itemnumber}, $ordernumber );
265
            }
265
            }
266
        } else {
266
        } else {
267
            SetImportRecordStatus( $biblio->{'import_record_id'}, 'imported' );
267
            SetImportRecordStatus( $biblio->{'import_record_id'}, 'imported' );
(-)a/acqui/booksellers.pl (-3 / +4 lines)
Lines 111-123 for my $vendor (@suppliers) { Link Here
111
    
111
    
112
    for my $basket ( @{$baskets} ) {
112
    for my $basket ( @{$baskets} ) {
113
        my $authorisedby = $basket->{authorisedby};
113
        my $authorisedby = $basket->{authorisedby};
114
        my $basketbranch = GetMember( borrowernumber => $authorisedby )->{branchcode};
114
        my $basketbranch = '';
115
        $basketbranch = GetMember( borrowernumber => $authorisedby )->{branchcode} if $authorisedby;
115
        
116
        
116
        if ($userenv->{'flags'} & 1 || #user is superlibrarian
117
        if ($userenv->{'flags'} & 1 || #user is superlibrarian
117
               (haspermission( $uid, { acquisition => q{*} } ) && #user has acq permissions and
118
               (haspermission( $uid, { acquisition => q{*} } ) && #user has acq permissions and
118
                   ($viewbaskets eq 'all' || #user is allowed to see all baskets
119
                   ($viewbaskets eq 'all' || #user is allowed to see all baskets
119
                   ($viewbaskets eq 'branch' && $authorisedby && $userbranch eq $basketbranch) || #basket belongs to user's branch
120
                   ($viewbaskets eq 'branch' && $userbranch eq $basketbranch) || #basket belongs to user's branch
120
                   ($basket->{authorisedby} &&  $viewbaskets == 'user' && $authorisedby == $loggedinuser) #user created this basket
121
                   ($basket->{authorisedby} &&  $viewbaskets == 'user' && $authorisedby eq $loggedinuser) #user created this basket
121
                   ) 
122
                   ) 
122
                ) 
123
                ) 
123
           ) { 
124
           ) { 
(-)a/acqui/finishreceive.pl (-62 / +63 lines)
Lines 26-35 use CGI; Link Here
26
use C4::Auth;
26
use C4::Auth;
27
use C4::Output;
27
use C4::Output;
28
use C4::Context;
28
use C4::Context;
29
use C4::Dates;
29
use C4::Acquisition;
30
use C4::Acquisition;
30
use C4::Biblio;
31
use C4::Biblio;
31
use C4::Items;
32
use C4::Items;
32
use C4::Search;
33
use List::MoreUtils qw/any/;
33
use List::MoreUtils qw/any/;
34
34
35
my $input=new CGI;
35
my $input=new CGI;
Lines 42-117 my $ordernumber=$input->param('ordernumber'); Link Here
42
my $origquantityrec=$input->param('origquantityrec');
42
my $origquantityrec=$input->param('origquantityrec');
43
my $quantityrec=$input->param('quantityrec');
43
my $quantityrec=$input->param('quantityrec');
44
my $quantity=$input->param('quantity');
44
my $quantity=$input->param('quantity');
45
my $unitprice=$input->param('cost');
46
my $invoiceno=$input->param('invoice');
45
my $invoiceno=$input->param('invoice');
47
my $datereceived=$input->param('datereceived');
46
my $datereceived=$input->param('datereceived') || C4::Dates->output('iso');
48
my $replacement=$input->param('rrp');
49
my $gst=$input->param('gst');
47
my $gst=$input->param('gst');
50
my $freight=$input->param('freight');
48
my $freight=$input->param('freight');
51
my $supplierid = $input->param('supplierid');
49
my $supplierid = $input->param('supplierid');
52
my $cnt=0;
50
my $cnt=0;
53
my $error_url_str;
51
my $error_url_str = '';
54
my $ecost = $input->param('ecost');
55
my $note = $input->param("note");
56
52
57
my %tplorder = ( 'quantity'                  =>     $input->param('quantity') || '',
58
                             'quantityreceived'   =>     $input->param('quantityrec') || '',
59
                             'notes'                      =>      $input->param("note") || '',
60
                             'rrp'                          =>      $input->param('rrp') || '',
61
                             'ecost'                      =>      $input->param('ecost') || '',
62
                             'unitprice'                =>      $input->param('cost') || '',
63
                     );
64
my $order = GetOrder($ordernumber);
53
my $order = GetOrder($ordernumber);
65
if ( any { $order->{$_} ne $tplorder{$_} } qw(quantity quantityreceived notes rrp ecost unitprice) ) {
54
$order->{booksellerinvoicenumber} = $invoiceno;
66
    $order->{quantity} = $tplorder{quantity} if $tplorder{quantity};
55
$order->{datereceived} = $datereceived;
67
    $order->{quantityreceived} = $tplorder{quantityreceived} if $tplorder{quantityreceived};
56
$order->{freight} = $freight;
68
    $order->{notes} = $tplorder{notes} if $tplorder{notes};
57
$order->{quantity} = $quantity;
69
    $order->{rrp} = $tplorder{rrp} if $tplorder{rrp};
58
$order->{quantityreceived} = $quantityrec;
70
    $order->{ecost} = $tplorder{ecost} if $tplorder{ecost};
59
$order->{notes} = $input->param("note");
71
    $order->{unitprice} = $tplorder{unitprice} if $tplorder{unitprice};
60
$order->{rrp} = $input->param('rrp');
72
    ModOrder($order);
61
$order->{ecost} = $input->param('ecost');
73
}
62
$order->{unitprice} = $input->param('cost');
63
ModOrder($order);
74
64
75
#need old recievedate if we update the order, parcel.pl only shows the right parcel this way FIXME
65
#need old recievedate if we update the order, parcel.pl only shows the right parcel this way FIXME
76
if ($quantityrec > $origquantityrec ) {
66
77
    # now, add items if applicable
67
# now, add or update items if applicable
78
    if (C4::Context->preference('AcqCreateItem') eq 'receiving') {
68
my @tags         = $input->param('tag');
79
        my @tags         = $input->param('tag');
69
my @subfields    = $input->param('subfield');
80
        my @subfields    = $input->param('subfield');
70
my @field_values = $input->param('field_value');
81
        my @field_values = $input->param('field_value');
71
my @serials      = $input->param('serial');
82
        my @serials      = $input->param('serial');
72
my @itemid       = $input->param('itemid');
83
        my @itemid       = $input->param('itemid');
73
my @ind_tag      = $input->param('ind_tag');
84
        my @ind_tag      = $input->param('ind_tag');
74
my @indicator    = $input->param('indicator');
85
        my @indicator    = $input->param('indicator');
75
#Rebuilding ALL the data for items into a hash
86
        #Rebuilding ALL the data for items into a hash
76
# parting them on $itemid.
87
        # parting them on $itemid.
77
my %itemhash;
88
        my %itemhash;
78
my $countdistinct;
89
        my $countdistinct;
79
my $range=scalar(@itemid);
90
        my $range=scalar(@itemid);
80
for (my $i=0; $i<$range; $i++){
91
        for (my $i=0; $i<$range; $i++){
81
    unless ($itemhash{$itemid[$i]}){
92
            unless ($itemhash{$itemid[$i]}){
82
        $countdistinct++;
93
            $countdistinct++;
83
    }
94
            }
84
    push @{$itemhash{$itemid[$i]}->{'tags'}},$tags[$i];
95
            push @{$itemhash{$itemid[$i]}->{'tags'}},$tags[$i];
85
    push @{$itemhash{$itemid[$i]}->{'subfields'}},$subfields[$i];
96
            push @{$itemhash{$itemid[$i]}->{'subfields'}},$subfields[$i];
86
    push @{$itemhash{$itemid[$i]}->{'field_values'}},$field_values[$i];
97
            push @{$itemhash{$itemid[$i]}->{'field_values'}},$field_values[$i];
87
    push @{$itemhash{$itemid[$i]}->{'ind_tag'}},$ind_tag[$i];
98
            push @{$itemhash{$itemid[$i]}->{'ind_tag'}},$ind_tag[$i];
88
    push @{$itemhash{$itemid[$i]}->{'indicator'}},$indicator[$i];
99
            push @{$itemhash{$itemid[$i]}->{'indicator'}},$indicator[$i];
89
}
100
        }
90
my $error;
101
        foreach my $item (keys %itemhash){
91
my %itemnumbers = map { $_ => 1 } GetItemnumbersFromOrder($ordernumber);
102
            my $xml = TransformHtmlToXml( $itemhash{$item}->{'tags'},
92
my @received;
103
                                    $itemhash{$item}->{'subfields'},
93
foreach my $id (keys %itemhash){
104
                                    $itemhash{$item}->{'field_values'},
94
    my $xml = TransformHtmlToXml( $itemhash{$id}->{'tags'},
105
                                    $itemhash{$item}->{'ind_tag'},
95
                                  $itemhash{$id}->{'subfields'},
106
                                    $itemhash{$item}->{'indicator'},'ITEM');
96
                                  $itemhash{$id}->{'field_values'},
107
            my $record=MARC::Record::new_from_xml($xml, 'UTF-8');
97
                                  $itemhash{$id}->{'ind_tag'},
108
            my ($biblionumber,$bibitemnum,$itemnumber) = AddItemFromMarc($record,$biblionumber);
98
                                  $itemhash{$id}->{'indicator'},'ITEM');
109
        }
99
    my $record=MARC::Record::new_from_xml($xml, 'UTF-8');
100
    my $item = AddItemFromMarc($record,$biblionumber);
101
    my $itemnumber = $item ? $item->{itemnumber} : undef;
102
    if ($itemnumber) {
103
        push @received, $itemnumber;
104
        NewOrderItem($itemnumber, $ordernumber) unless $itemnumbers{$itemnumber};
105
    } else {
106
        $error++;
110
    }
107
    }
111
    
108
}
109
110
if ($error) {
111
    $error_url_str = "&error=Datbase+write+error";
112
}
113
elsif ($quantityrec != $origquantityrec ) {
112
    # save the quantity received.
114
    # save the quantity received.
113
	if( $quantityrec > 0 ) {
115
    ModReceiveOrder($biblionumber,$ordernumber, $quantityrec, \@received);
114
    	$datereceived = ModReceiveOrder($biblionumber,$ordernumber, $quantityrec ,$user,$unitprice,$invoiceno,$freight,$replacement,undef,$datereceived);
115
	}
116
}
116
}
117
    print $input->redirect("/cgi-bin/koha/acqui/parcel.pl?invoice=$invoiceno&supplierid=$supplierid&freight=$freight&gst=$gst&datereceived=$datereceived$error_url_str");
117
118
print $input->redirect("/cgi-bin/koha/acqui/parcel.pl?invoice=$invoiceno&supplierid=$supplierid&freight=$freight&gst=$gst&datereceived=$datereceived$error_url_str");
(-)a/acqui/orderreceive.pl (-34 / +29 lines)
Lines 85-105 my $search = $input->param('receive'); Link Here
85
my $invoice      = $input->param('invoice');
85
my $invoice      = $input->param('invoice');
86
my $freight      = $input->param('freight');
86
my $freight      = $input->param('freight');
87
my $datereceived = $input->param('datereceived');
87
my $datereceived = $input->param('datereceived');
88
89
90
$datereceived = $datereceived ? C4::Dates->new($datereceived, 'iso') : C4::Dates->new();
88
$datereceived = $datereceived ? C4::Dates->new($datereceived, 'iso') : C4::Dates->new();
91
89
92
my $bookseller = GetBookSellerFromId($supplierid);
90
my $bookseller = GetBookSellerFromId($supplierid);
93
my $input_gst = ($input->param('gst') eq '' ? undef : $input->param('gst'));
91
my $input_gst = ($input->param('gst') eq '' ? undef : $input->param('gst'));
94
my $gst= $input_gst // $bookseller->{gstrate} // C4::Context->preference("gist") // 0;
92
my $gst= $input_gst // $bookseller->{gstrate} // C4::Context->preference("gist") // 0;
95
my $results = SearchOrder($ordernumber,$search);
93
my $results = SearchOrder($ordernumber,$search);
96
97
98
my $count   = scalar @$results;
94
my $count   = scalar @$results;
99
my $order 	= GetOrder($ordernumber);
100
101
102
my $date = @$results[0]->{'entrydate'};
103
95
104
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
96
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
105
    {
97
    {
Lines 114-160 my ( $template, $loggedinuser, $cookie ) = get_template_and_user( Link Here
114
106
115
# prepare the form for receiving
107
# prepare the form for receiving
116
if ( $count == 1 ) {
108
if ( $count == 1 ) {
117
    if (C4::Context->preference('AcqCreateItem') eq 'receiving') {
109
    my $order 	= GetOrder($results->[0]->{ordernumber});
110
    my $biblionumber = $order->{biblionumber};
111
112
    my @itemloop;
113
    if ( my @itemnumbers = GetItemnumbersFromOrder($ordernumber) ) {
114
        @itemloop = map PrepareItemrecordDisplay($biblionumber,$_), @itemnumbers;
115
    }
116
    elsif (C4::Context->preference('AcqCreateItem') eq 'receiving') {
118
        # prepare empty item form
117
        # prepare empty item form
119
        my $cell = PrepareItemrecordDisplay('','','','ACQ');
118
        my $cell = PrepareItemrecordDisplay('','','','ACQ');
120
        unless ($cell) {
119
        unless ($cell) {
121
            $cell = PrepareItemrecordDisplay('','','','');
120
            $cell = PrepareItemrecordDisplay('','','','');
122
            $template->param('NoACQframework' => 1);
121
            $template->param('NoACQframework' => 1);
123
        }
122
        }
124
        my @itemloop;
125
        push @itemloop,$cell;
123
        push @itemloop,$cell;
126
        
127
        $template->param(items => \@itemloop);
128
    }
124
    }
125
        
126
    $template->param(items => \@itemloop) if @itemloop;
129
127
130
    if ( @$results[0]->{'quantityreceived'} == 0 ) {
128
    if ( $order->{'unitprice'} == 0 ) {
131
        @$results[0]->{'quantityreceived'} = '';
129
        $order->{'unitprice'} = '';
132
    }
133
    if ( @$results[0]->{'unitprice'} == 0 ) {
134
        @$results[0]->{'unitprice'} = '';
135
    }
130
    }
136
    $template->param(
131
    $template->param(
137
        count                 => 1,
132
        count                 => 1,
138
        biblionumber          => @$results[0]->{'biblionumber'},
133
        biblionumber          => $biblionumber,
139
        ordernumber           => @$results[0]->{'ordernumber'},
134
        ordernumber           => $order->{'ordernumber'},
140
        biblioitemnumber      => @$results[0]->{'biblioitemnumber'},
135
        biblioitemnumber      => $order->{'biblioitemnumber'},
141
        supplierid            => @$results[0]->{'booksellerid'},
136
        supplierid            => $supplierid,
142
        freight               => $freight,
137
        freight               => $freight,
143
        gst                   => $gst,
138
        gst                   => $gst,
144
        name                  => $bookseller->{'name'},
139
        name                  => $bookseller->{'name'},
145
        date                  => format_date($date),
140
        date                  => format_date($order->{'entrydate'}),
146
        title                 => @$results[0]->{'title'},
141
        title                 => $order->{'title'},
147
        author                => @$results[0]->{'author'},
142
        author                => $order->{'author'},
148
        copyrightdate         => @$results[0]->{'copyrightdate'},
143
        copyrightdate         => $order->{'copyrightdate'},
149
        isbn                  => @$results[0]->{'isbn'},
144
        isbn                  => $order->{'isbn'},
150
        seriestitle           => @$results[0]->{'seriestitle'},
145
        seriestitle           => $order->{'seriestitle'},
151
        bookfund              => @$results[0]->{'bookfundid'},
146
        bookfund              => $order->{'bookfundid'},
152
        quantity              => @$results[0]->{'quantity'},
147
        quantity              => $order->{'quantity'},
153
        quantityreceivedplus1 => @$results[0]->{'quantityreceived'} + 1,
148
        quantityreceived      => scalar(@itemloop) || 1,
154
        quantityreceived      => @$results[0]->{'quantityreceived'},
149
        origquantityrec       => $order->{'quantityreceived'},
155
        rrp                   => @$results[0]->{'rrp'},
150
        rrp                   => $order->{'rrp'},
156
        ecost                 => @$results[0]->{'ecost'},
151
        ecost                 => $order->{'ecost'},
157
        unitprice             => @$results[0]->{'unitprice'},
152
        unitprice             => $order->{'unitprice'},
158
        invoice               => $invoice,
153
        invoice               => $invoice,
159
        datereceived          => $datereceived->output(),
154
        datereceived          => $datereceived->output(),
160
        datereceived_iso          => $datereceived->output('iso'),
155
        datereceived_iso          => $datereceived->output('iso'),
(-)a/cataloguing/additem.pl (-4 / +4 lines)
Lines 347-354 if ($op eq "additem") { Link Here
347
	push @errors,"barcode_not_unique" if($exist_itemnumber);
347
	push @errors,"barcode_not_unique" if($exist_itemnumber);
348
	# if barcode exists, don't create, but report The problem.
348
	# if barcode exists, don't create, but report The problem.
349
    unless ($exist_itemnumber) {
349
    unless ($exist_itemnumber) {
350
	    my ($oldbiblionumber,$oldbibnum,$oldbibitemnum) = AddItemFromMarc($record,$biblionumber);
350
	    my $item = AddItemFromMarc($record,$biblionumber);
351
        set_item_default_location($oldbibitemnum);
351
        set_item_default_location($item->{biblioitemnumber});
352
    }
352
    }
353
	$nextop = "additem";
353
	$nextop = "additem";
354
	if ($exist_itemnumber) {
354
	if ($exist_itemnumber) {
Lines 414-421 if ($op eq "additem") { Link Here
414
414
415
		# Adding the item
415
		# Adding the item
416
        if (!$exist_itemnumber) {
416
        if (!$exist_itemnumber) {
417
            my ($oldbiblionumber,$oldbibnum,$oldbibitemnum) = AddItemFromMarc($record,$biblionumber);
417
	        my $item = AddItemFromMarc($record,$biblionumber);
418
            set_item_default_location($oldbibitemnum);
418
            set_item_default_location($item->{biblioitemnumber});
419
419
420
            # We count the item only if it was really added
420
            # We count the item only if it was really added
421
            # That way, all items are added, even if there was some already existing barcodes
421
            # That way, all items are added, even if there was some already existing barcodes
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt (-19 / +17 lines)
Lines 42-56 Link Here
42
            <p class="required">No ACQ framework, using default. You should create a framework with code ACQ, the items framework would be used</p>
42
            <p class="required">No ACQ framework, using default. You should create a framework with code ACQ, the items framework would be used</p>
43
        [% END %]
43
        [% END %]
44
44
45
        [% itemid = 1 %]
45
        [% FOREACH item IN items %]
46
        [% FOREACH item IN items %]
46
        <div id="outeritemblock">
47
        <div id="itemblock[% itemid %]">
47
        <div id="itemblock">
48
            <ol>[% FOREACH iteminformatio IN item.iteminformation %]<li style="[% iteminformatio.hidden %];">
48
            <ol>[% FOREACH iteminformatio IN item.iteminformation %]<li style="[% iteminformatio.hidden %];">
49
                <div class="subfield_line" id="subfield[% iteminformatio.serialid %][% iteminformatio.countitems %][% iteminformatio.subfield %][% iteminformatio.random %]">
49
                <div class="subfield_line" id="subfield[% iteminformatio.serialid %][% iteminformatio.countitems %][% iteminformatio.subfield %][% iteminformatio.random %]">
50
                                
50
                                
51
                    <label>[% iteminformatio.subfield %] - [% IF ( iteminformatio.mandatory ) %]<b>[% END %][% iteminformatio.marc_lib %][% IF ( iteminformatio.mandatory ) %] *</b>[% END %]</label>
51
                    <label>[% iteminformatio.subfield %] - [% IF ( iteminformatio.mandatory ) %]<b>[% END %][% iteminformatio.marc_lib %][% IF ( iteminformatio.mandatory ) %] *</b>[% END %]</label>
52
                    [% iteminformatio.marc_value %]
52
                    [% iteminformatio.marc_value %]
53
                    <input type="hidden" name="itemid" value="1" />
53
                    <input type="hidden" name="itemid" value="[% itemid %]" />
54
                    <input type="hidden" name="kohafield" value="[% iteminformatio.kohafield %]" />
54
                    <input type="hidden" name="kohafield" value="[% iteminformatio.kohafield %]" />
55
                    <input type="hidden" name="tag" value="[% iteminformatio.tag %]" />
55
                    <input type="hidden" name="tag" value="[% iteminformatio.tag %]" />
56
                    <input type="hidden" name="subfield" value="[% iteminformatio.subfield %]" />
56
                    <input type="hidden" name="subfield" value="[% iteminformatio.subfield %]" />
Lines 62-79 Link Here
62
                </div></li>
62
                </div></li>
63
            [% END %]
63
            [% END %]
64
            </ol>
64
            </ol>
65
            <a style="cursor: pointer; color: grey; font-size: 180%;" onclick="cloneItemBlock('itemblock[% item.itemBlockIndex %]')">+</a>
65
            <a style="cursor: pointer; color: grey; font-size: 180%;" onclick="cloneItemBlock('itemblock[% itemid %]')">+</a>&nbsp;
66
            <a style="display:none; cursor: pointer; color: grey; font-size: 180%;" onclick="deleteItemBlock('itemblock[% item.itemBlockIndex %]')">-</a>
66
            <a style="cursor: pointer; color: grey; font-size: 180%;" onclick="deleteItemBlock('itemblock[% itemid %]')">-</a>
67
68
            <input type="hidden" name="moditem" value="" /> 
69
            <input type="hidden" name="tag" value="[% item.itemtagfield %]" />
70
            <input type="hidden" name="subfield" value="[% item.itemtagsubfield %]" />
71
            <input type="hidden" name="serial" value="[% item.serialid %]" />
72
            <input type="hidden" name="bibnum" value="[% item.biblionumber %]" />
73
            <input type="hidden" name="itemid" value="[% itemid %]" />
74
            <input type="hidden" name="field_value" value="[% item.itemnumber %]" />
67
        </div><!-- /iteminformation -->
75
        </div><!-- /iteminformation -->
68
        </div>
76
        [% itemid = itemid + 1 %]
69
        
70
        <input type="hidden" name="moditem" value="" /> 
71
        <input type="hidden" name="tag" value="[% item.itemtagfield %]" />
72
        <input type="hidden" name="subfield" value="[% item.itemtagsubfield %]" />
73
        <input type="hidden" name="serial" value="[% item.serialid %]" />
74
        <input type="hidden" name="bibnum" value="[% item.biblionumber %]" />
75
        <input type="hidden" name="itemid" value="1" />
76
        <input type="hidden" name="field_value" value="[% item.itemnumber %]" />
77
        [% END %] <!-- /items -->
77
        [% END %] <!-- /items -->
78
    </fieldset>
78
    </fieldset>
79
    [% END %] <!-- items -->
79
    [% END %] <!-- items -->
Lines 101-114 Link Here
101
            [% IF ( quantityreceived ) %]
101
            [% IF ( quantityreceived ) %]
102
                [% IF ( edit ) %]
102
                [% IF ( edit ) %]
103
                    <input type="text" size="20" name="quantityrec" id="quantity" value="[% quantityreceived %]" />
103
                    <input type="text" size="20" name="quantityrec" id="quantity" value="[% quantityreceived %]" />
104
                    <input id="origquantityrec" READONLY type="hidden" name="origquantityrec" value="[% quantityreceived %]" />
105
                [% ELSE %]
104
                [% ELSE %]
106
                [% IF ( items ) %]
105
                [% IF ( items ) %]
107
                    <input READONLY type="text" size="20" name="quantityrec" id="quantity" value="[% quantityreceivedplus1 %]" />
106
                    <input READONLY type="text" size="20" name="quantityrec" id="quantity" value="[% quantityreceived %]" />
108
                [% ELSE %]
107
                [% ELSE %]
109
                    <input type="text" size="20" name="quantityrec" id="quantity" value="[% quantityreceivedplus1 %]" />
108
                    <input type="text" size="20" name="quantityrec" id="quantity" value="[% quantityreceived %]" />
110
                [% END %]
109
                [% END %]
111
                <input id="origquantityrec" READONLY type="hidden" name="origquantityrec" value="[% quantityreceived %]" />
112
                [% END %]
110
                [% END %]
113
            [% ELSE %]
111
            [% ELSE %]
114
                [% IF ( items ) %]
112
                [% IF ( items ) %]
Lines 116-123 Link Here
116
                [% ELSE %]
114
                [% ELSE %]
117
                    <input type="text" size="20" id="quantity" name="quantityrec" value="1" />
115
                    <input type="text" size="20" id="quantity" name="quantityrec" value="1" />
118
                [% END %]
116
                [% END %]
119
                <input id="origquantityrec" READONLY type="hidden" name="origquantityrec" value="0" />
120
            [% END %]
117
            [% END %]
118
            <input id="origquantityrec" type="hidden" name="origquantityrec" value="[% origquantityrec %]" />
121
		</li>
119
		</li>
122
        <li><label for="rrp">Replacement cost: </label><input type="text" size="20" name="rrp" id="rrp" value="[% rrp %]" /></li>
120
        <li><label for="rrp">Replacement cost: </label><input type="text" size="20" name="rrp" id="rrp" value="[% rrp %]" /></li>
123
        <li><label for="ecost">Budgeted cost: </label><input type="text" size="20" name="ecost" id="ecost" value="[% ecost %]" /></li>
121
        <li><label for="ecost">Budgeted cost: </label><input type="text" size="20" name="ecost" id="ecost" value="[% ecost %]" /></li>
(-)a/t/db_dependent/lib/KohaTest.pm (-10 / +6 lines)
Lines 572-587 sub add_biblios { Link Here
572
        ok( $biblionumber, "the biblionumber is $biblionumber" );
572
        ok( $biblionumber, "the biblionumber is $biblionumber" );
573
        ok( $biblioitemnumber, "the biblioitemnumber is $biblioitemnumber" );
573
        ok( $biblioitemnumber, "the biblioitemnumber is $biblioitemnumber" );
574
        if ( $param{'add_items'} ) {
574
        if ( $param{'add_items'} ) {
575
            # my @iteminfo = AddItem( {}, $biblionumber );
575
            # my $item = AddItem( {}, $biblionumber );
576
            my @iteminfo = AddItemFromMarc( $marcrecord, $biblionumber );
576
            my $item = AddItemFromMarc( $marcrecord, $biblionumber );
577
            is( $iteminfo[0], $biblionumber,     "biblionumber is $biblionumber" );
577
            is( $item->{biblionumber},     "biblionumber is $biblionumber" );
578
            is( $iteminfo[1], $biblioitemnumber, "biblioitemnumber is $biblioitemnumber" );
578
            is( $item->{biblioitemnumber}, "biblioitemnumber is $biblioitemnumber" );
579
            ok( $iteminfo[2], "itemnumber is $iteminfo[2]" );
579
            ok( $item->{itemnumber}, "itemnumber is $item->{itemnumber}" );
580
        push @{ $self->{'items'} },
580
            push @{ $self->{'items'} }, $item;
581
          { biblionumber     => $iteminfo[0],
582
            biblioitemnumber => $iteminfo[1],
583
            itemnumber       => $iteminfo[2],
584
          };
585
        }
581
        }
586
        push @{$self->{'biblios'}}, $biblionumber;
582
        push @{$self->{'biblios'}}, $biblionumber;
587
    }
583
    }
(-)a/t/db_dependent/lib/KohaTest/Acquisition/GetParcel.pm (-12 / +5 lines)
Lines 43-60 sub one_parcel : Test( 17 ) { Link Here
43
    
43
    
44
    ok( $basketno, "my basket number is $basketno" );
44
    ok( $basketno, "my basket number is $basketno" );
45
    ok( $ordernumber,   "my order number is $ordernumber" );
45
    ok( $ordernumber,   "my order number is $ordernumber" );
46
    my $datereceived = ModReceiveOrder( $self->{'biblios'}[0],             # biblionumber
46
    ModReceiveOrder( $self->{'biblios'}[0],             # biblionumber
47
                                        $ordernumber,       # $ordernumber,
47
                     $ordernumber,       # $ordernumber,
48
                                        undef,         # $quantrec,
48
                     1,         # $quantrec,
49
                                        undef,         # $user,
49
                   );
50
                                        undef,         # $cost,
50
    pass( "the parcel was received" );
51
                                        $invoice,         # $invoiceno,
52
                                        undef,         # $freight,
53
                                        undef,         # $rrp,
54
                                        $self->{'bookfundid'},         # $bookfund,
55
                                        $today,         # $datereceived
56
                                   );
57
    is( $datereceived, $today, "the parcel was received on $datereceived" );
58
51
59
    my @parcel = GetParcel( $self->{'booksellerid'}, $invoice, $today );
52
    my @parcel = GetParcel( $self->{'booksellerid'}, $invoice, $today );
60
    is( scalar @parcel, 1, 'we found one (1) parcel.' )
53
    is( scalar @parcel, 1, 'we found one (1) parcel.' )
(-)a/t/db_dependent/lib/KohaTest/Acquisition/GetParcels.pm (-12 / +6 lines)
Lines 271-288 sub create_order { Link Here
271
271
272
    my ( $basketno, $ordernumber ) = $self->create_new_basket( %param );
272
    my ( $basketno, $ordernumber ) = $self->create_new_basket( %param );
273
273
274
    my $datereceived = ModReceiveOrder( $self->{'biblios'}[0],             # biblionumber
274
    ModReceiveOrder( $self->{'biblios'}[0],             # biblionumber
275
                                        $ordernumber,       # $ordernumber,
275
                     $ordernumber,       # $ordernumber,
276
                                        undef,         # $quantrec,
276
                     1,         # $quantrec,
277
                                        undef,         # $user,
277
                   );
278
                                        undef,         # $cost,
278
    # XXX Needs proper tests for partial receiving
279
                                        $param{'invoice'},         # $invoiceno,
279
    pass( "the parcel was received" );
280
                                        undef,         # $freight,
281
                                        undef,         # $rrp,
282
                                        $self->{'bookfundid'},         # $bookfund,
283
                                        $param{'date'},         # $datereceived
284
                                   );
285
    is( $datereceived, $param{'date'}, "the parcel was received on $datereceived" );
286
280
287
}
281
}
288
282
(-)a/t/db_dependent/lib/KohaTest/Biblio/ModBiblio.pm (-4 / +3 lines)
Lines 31-40 sub add_bib_to_modify : Test( startup => 3 ) { Link Here
31
    $self->{'bib_to_modify'} = $bibnum;
31
    $self->{'bib_to_modify'} = $bibnum;
32
32
33
    # add an item
33
    # add an item
34
    my ($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem({ homebranch => 'CPL', holdingbranch => 'CPL' } , $bibnum);
34
    my $item = AddItem({ homebranch => 'CPL', holdingbranch => 'CPL' } , $bibnum);
35
35
36
    cmp_ok($item_bibnum, '==', $bibnum, "new item is linked to correct biblionumber"); 
36
    cmp_ok($item->{biblionumber}, '==', $bibnum, "new item is linked to correct biblionumber"); 
37
    cmp_ok($item_bibitemnum, '==', $bibitemnum, "new item is linked to correct biblioitemnumber"); 
37
    cmp_ok($item->{biblioitemnumber}, '==', $bibitemnum, "new item is linked to correct biblioitemnumber"); 
38
38
39
    $self->reindex_marc(); 
39
    $self->reindex_marc(); 
40
40
41
- 

Return to bug 3966