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

(-)a/C4/Biblio.pm (-6 / +3 lines)
Lines 1194-1199 sub GetMarcBiblio { Link Here
1194
1194
1195
        C4::Biblio::_koha_marc_update_bib_ids( $record, $frameworkcode, $biblionumber,
1195
        C4::Biblio::_koha_marc_update_bib_ids( $record, $frameworkcode, $biblionumber,
1196
            $biblioitemnumber );
1196
            $biblioitemnumber );
1197
1197
        C4::Biblio::EmbedItemsInMarcBiblio( $record, $biblionumber, undef, $opac )
1198
        C4::Biblio::EmbedItemsInMarcBiblio( $record, $biblionumber, undef, $opac )
1198
          if ($embeditems);
1199
          if ($embeditems);
1199
1200
Lines 2816-2827 sub EmbedItemsInMarcBiblio { Link Here
2816
      : ();
2817
      : ();
2817
    # Convert to a hash for quick searching
2818
    # Convert to a hash for quick searching
2818
    my %hiddenitems = map { $_ => 1 } @hiddenitems;
2819
    my %hiddenitems = map { $_ => 1 } @hiddenitems;
2819
    foreach my $itemnumber ( map { $_->{itemnumber} } @items ) {
2820
    my $item_fields = C4::Items::GetMarcItems( $biblionumber, \@hiddenitems, $itemtag );
2820
        next if $hiddenitems{$itemnumber};
2821
    $marc->append_fields(@$item_fields);
2821
        my $item_marc = C4::Items::GetMarcItem( $biblionumber, $itemnumber );
2822
        push @item_fields, $item_marc->field($itemtag);
2823
    }
2824
    $marc->append_fields(@item_fields);
2825
}
2822
}
2826
2823
2827
=head1 INTERNAL FUNCTIONS
2824
=head1 INTERNAL FUNCTIONS
(-)a/C4/Items.pm (-64 / +91 lines)
Lines 65-73 BEGIN { Link Here
65
        ModDateLastSeen
65
        ModDateLastSeen
66
        ModItemTransfer
66
        ModItemTransfer
67
        DelItem
67
        DelItem
68
    
68
69
        CheckItemPreSave
69
        CheckItemPreSave
70
    
70
71
        GetItemsForInventory
71
        GetItemsForInventory
72
        GetItemsByBiblioitemnumber
72
        GetItemsByBiblioitemnumber
73
        GetItemsInfo
73
        GetItemsInfo
Lines 102-108 C4::Items - item management functions Link Here
102
102
103
=head1 DESCRIPTION
103
=head1 DESCRIPTION
104
104
105
This module contains an API for manipulating item 
105
This module contains an API for manipulating item
106
records in Koha, and is used by cataloguing, circulation,
106
records in Koha, and is used by cataloguing, circulation,
107
acquisitions, and serials management.
107
acquisitions, and serials management.
108
108
Lines 116-122 modification transaction must keep the items table Link Here
116
and the MARC XML in sync at all times.
116
and the MARC XML in sync at all times.
117
117
118
Consequently, all code that creates, modifies, or deletes
118
Consequently, all code that creates, modifies, or deletes
119
item records B<must> use an appropriate function from 
119
item records B<must> use an appropriate function from
120
C<C4::Items>.  If no existing function is suitable, it is
120
C<C4::Items>.  If no existing function is suitable, it is
121
better to add one to C<C4::Items> than to use add
121
better to add one to C<C4::Items> than to use add
122
one-off SQL statements to add or modify items.
122
one-off SQL statements to add or modify items.
Lines 222-228 sub ShelfToCart { Link Here
222
222
223
=head2 AddItemFromMarc
223
=head2 AddItemFromMarc
224
224
225
  my ($biblionumber, $biblioitemnumber, $itemnumber) 
225
  my ($biblionumber, $biblioitemnumber, $itemnumber)
226
      = AddItemFromMarc($source_item_marc, $biblionumber);
226
      = AddItemFromMarc($source_item_marc, $biblionumber);
227
227
228
Given a MARC::Record object containing an embedded item
228
Given a MARC::Record object containing an embedded item
Lines 237-243 sub AddItemFromMarc { Link Here
237
    # parse item hash from MARC
237
    # parse item hash from MARC
238
    my $frameworkcode = C4::Biblio::GetFrameworkCode( $biblionumber );
238
    my $frameworkcode = C4::Biblio::GetFrameworkCode( $biblionumber );
239
    my ($itemtag,$itemsubfield)=C4::Biblio::GetMarcFromKohaField("items.itemnumber",$frameworkcode);
239
    my ($itemtag,$itemsubfield)=C4::Biblio::GetMarcFromKohaField("items.itemnumber",$frameworkcode);
240
	
240
241
	my $localitemmarc=MARC::Record->new;
241
	my $localitemmarc=MARC::Record->new;
242
	$localitemmarc->append_fields($source_item_marc->field($itemtag));
242
	$localitemmarc->append_fields($source_item_marc->field($itemtag));
243
    my $item = &TransformMarcToKoha( $localitemmarc, $frameworkcode ,'items');
243
    my $item = &TransformMarcToKoha( $localitemmarc, $frameworkcode ,'items');
Lines 247-253 sub AddItemFromMarc { Link Here
247
247
248
=head2 AddItem
248
=head2 AddItem
249
249
250
  my ($biblionumber, $biblioitemnumber, $itemnumber) 
250
  my ($biblionumber, $biblioitemnumber, $itemnumber)
251
      = AddItem($item, $biblionumber[, $dbh, $frameworkcode, $unlinked_item_subfields]);
251
      = AddItem($item, $biblionumber[, $dbh, $frameworkcode, $unlinked_item_subfields]);
252
252
253
Given a hash containing item column names as keys,
253
Given a hash containing item column names as keys,
Lines 261-267 The final optional parameter, C<$unlinked_item_subfields>, contains Link Here
261
an arrayref containing subfields present in the original MARC
261
an arrayref containing subfields present in the original MARC
262
representation of the item (e.g., from the item editor) that are
262
representation of the item (e.g., from the item editor) that are
263
not mapped to C<items> columns directly but should instead
263
not mapped to C<items> columns directly but should instead
264
be stored in C<items.more_subfields_xml> and included in 
264
be stored in C<items.more_subfields_xml> and included in
265
the biblio items tag for display and indexing.
265
the biblio items tag for display and indexing.
266
266
267
=cut
267
=cut
Lines 309-315 sub AddItem { Link Here
309
309
310
=head2 AddItemBatchFromMarc
310
=head2 AddItemBatchFromMarc
311
311
312
  ($itemnumber_ref, $error_ref) = AddItemBatchFromMarc($record, 
312
  ($itemnumber_ref, $error_ref) = AddItemBatchFromMarc($record,
313
             $biblionumber, $biblioitemnumber, $frameworkcode);
313
             $biblionumber, $biblioitemnumber, $frameworkcode);
314
314
315
Efficiently create item records from a MARC biblio record with
315
Efficiently create item records from a MARC biblio record with
Lines 374-380 sub AddItemBatchFromMarc { Link Here
374
        # and there is no TransformMarcFieldToKoha
374
        # and there is no TransformMarcFieldToKoha
375
        my $temp_item_marc = MARC::Record->new();
375
        my $temp_item_marc = MARC::Record->new();
376
        $temp_item_marc->append_fields($item_field);
376
        $temp_item_marc->append_fields($item_field);
377
    
377
378
        # add biblionumber and biblioitemnumber
378
        # add biblionumber and biblioitemnumber
379
        my $item = TransformMarcToKoha( $temp_item_marc, $frameworkcode, 'items' );
379
        my $item = TransformMarcToKoha( $temp_item_marc, $frameworkcode, 'items' );
380
        my $unlinked_item_subfields = _get_unlinked_item_subfields($temp_item_marc, $frameworkcode);
380
        my $unlinked_item_subfields = _get_unlinked_item_subfields($temp_item_marc, $frameworkcode);
Lines 397-403 sub AddItemBatchFromMarc { Link Here
397
        push @itemnumbers, $itemnumber; # FIXME not checking error
397
        push @itemnumbers, $itemnumber; # FIXME not checking error
398
        $item->{'itemnumber'} = $itemnumber;
398
        $item->{'itemnumber'} = $itemnumber;
399
399
400
        logaction("CATALOGUING", "ADD", $itemnumber, "item") if C4::Context->preference("CataloguingLog"); 
400
        logaction("CATALOGUING", "ADD", $itemnumber, "item") if C4::Context->preference("CataloguingLog");
401
401
402
        my $new_item_marc = _marc_from_item_hash($item, $frameworkcode, $unlinked_item_subfields);
402
        my $new_item_marc = _marc_from_item_hash($item, $frameworkcode, $unlinked_item_subfields);
403
        $item_field->replace_with($new_item_marc->field($itemtag));
403
        $item_field->replace_with($new_item_marc->field($itemtag));
Lines 420-426 sub AddItemBatchFromMarc { Link Here
420
420
421
This function updates an item record based on a supplied
421
This function updates an item record based on a supplied
422
C<MARC::Record> object containing an embedded item field.
422
C<MARC::Record> object containing an embedded item field.
423
This API is meant for the use of C<additem.pl>; for 
423
This API is meant for the use of C<additem.pl>; for
424
other purposes, C<ModItem> should be used.
424
other purposes, C<ModItem> should be used.
425
425
426
This function uses the hash %default_values_for_mod_from_marc,
426
This function uses the hash %default_values_for_mod_from_marc,
Lines 539-549 C<$unlinked_item_subfields> contains an arrayref containing Link Here
539
subfields present in the original MARC
539
subfields present in the original MARC
540
representation of the item (e.g., from the item editor) that are
540
representation of the item (e.g., from the item editor) that are
541
not mapped to C<items> columns directly but should instead
541
not mapped to C<items> columns directly but should instead
542
be stored in C<items.more_subfields_xml> and included in 
542
be stored in C<items.more_subfields_xml> and included in
543
the biblio items tag for display and indexing.
543
the biblio items tag for display and indexing.
544
544
545
If one of the changed columns is used to calculate
545
If one of the changed columns is used to calculate
546
the derived value of a column such as C<items.cn_sort>, 
546
the derived value of a column such as C<items.cn_sort>,
547
this routine will perform the necessary calculation
547
this routine will perform the necessary calculation
548
and set the value.
548
and set the value.
549
549
Lines 771-777 sub CheckItemPreSave { Link Here
771
771
772
=head1 EXPORTED SPECIAL ACCESSOR FUNCTIONS
772
=head1 EXPORTED SPECIAL ACCESSOR FUNCTIONS
773
773
774
The following functions provide various ways of 
774
The following functions provide various ways of
775
getting an item record, a set of item records, or
775
getting an item record, a set of item records, or
776
lists of authorized values for certain item fields.
776
lists of authorized values for certain item fields.
777
777
Lines 947-955 sub GetItemsByBiblioitemnumber { Link Here
947
    my $sth = $dbh->prepare("SELECT * FROM items WHERE items.biblioitemnumber = ?") || die $dbh->errstr;
947
    my $sth = $dbh->prepare("SELECT * FROM items WHERE items.biblioitemnumber = ?") || die $dbh->errstr;
948
    # Get all items attached to a biblioitem
948
    # Get all items attached to a biblioitem
949
    my $i = 0;
949
    my $i = 0;
950
    my @results; 
950
    my @results;
951
    $sth->execute($bibitem) || die $sth->errstr;
951
    $sth->execute($bibitem) || die $sth->errstr;
952
    while ( my $data = $sth->fetchrow_hashref ) {  
952
    while ( my $data = $sth->fetchrow_hashref ) {
953
        # Foreach item, get circulation information
953
        # Foreach item, get circulation information
954
        my $sth2 = $dbh->prepare( "SELECT * FROM issues,borrowers
954
        my $sth2 = $dbh->prepare( "SELECT * FROM issues,borrowers
955
                                   WHERE itemnumber = ?
955
                                   WHERE itemnumber = ?
Lines 964-972 sub GetItemsByBiblioitemnumber { Link Here
964
        }
964
        }
965
        else {
965
        else {
966
            # set date_due to blank, so in the template we check itemlost, and withdrawn
966
            # set date_due to blank, so in the template we check itemlost, and withdrawn
967
            $data->{'date_due'} = '';                                                                                                         
967
            $data->{'date_due'} = '';
968
        }    # else         
968
        }    # else
969
        # Find the last 3 people who borrowed this item.                  
969
        # Find the last 3 people who borrowed this item.
970
        my $query2 = "SELECT * FROM old_issues, borrowers WHERE itemnumber = ?
970
        my $query2 = "SELECT * FROM old_issues, borrowers WHERE itemnumber = ?
971
                      AND old_issues.borrowernumber = borrowers.borrowernumber
971
                      AND old_issues.borrowernumber = borrowers.borrowernumber
972
                      ORDER BY returndate desc,timestamp desc LIMIT 3";
972
                      ORDER BY returndate desc,timestamp desc LIMIT 3";
Lines 980-987 sub GetItemsByBiblioitemnumber { Link Here
980
            $i2++;
980
            $i2++;
981
        }
981
        }
982
        push(@results,$data);
982
        push(@results,$data);
983
    } 
983
    }
984
    return (\@results); 
984
    return (\@results);
985
}
985
}
986
986
987
=head2 GetItemsInfo
987
=head2 GetItemsInfo
Lines 1165-1171 The intranet description for the Shelving Location as set in authorised_values ' Link Here
1165
1165
1166
=item C<$data-E<gt>{location_opac}>
1166
=item C<$data-E<gt>{location_opac}>
1167
1167
1168
The OPAC description for the Shelving Location as set in authorised_values 'LOC'.  Falls back to intranet description if no OPAC 
1168
The OPAC description for the Shelving Location as set in authorised_values 'LOC'.  Falls back to intranet description if no OPAC
1169
description is set.
1169
description is set.
1170
1170
1171
=item C<$data-E<gt>{itemcallnumber}>
1171
=item C<$data-E<gt>{itemcallnumber}>
Lines 1177-1183 Item's itemcallnumber Link Here
1177
Item's call number normalized for sorting
1177
Item's call number normalized for sorting
1178
1178
1179
=back
1179
=back
1180
  
1180
1181
=cut
1181
=cut
1182
1182
1183
sub GetItemsLocationInfo {
1183
sub GetItemsLocationInfo {
Lines 1185-1194 sub GetItemsLocationInfo { Link Here
1185
        my @results;
1185
        my @results;
1186
1186
1187
	my $dbh = C4::Context->dbh;
1187
	my $dbh = C4::Context->dbh;
1188
	my $query = "SELECT a.branchname as homebranch, b.branchname as holdingbranch, 
1188
	my $query = "SELECT a.branchname as homebranch, b.branchname as holdingbranch,
1189
			    location, itemcallnumber, cn_sort
1189
			    location, itemcallnumber, cn_sort
1190
		     FROM items, branches as a, branches as b
1190
		     FROM items, branches as a, branches as b
1191
		     WHERE homebranch = a.branchcode AND holdingbranch = b.branchcode 
1191
		     WHERE homebranch = a.branchcode AND holdingbranch = b.branchcode
1192
		     AND biblionumber = ?
1192
		     AND biblionumber = ?
1193
		     ORDER BY cn_sort ASC";
1193
		     ORDER BY cn_sort ASC";
1194
	my $sth = $dbh->prepare($query);
1194
	my $sth = $dbh->prepare($query);
Lines 1243-1249 sub GetHostItemsInfo { Link Here
1243
1243
1244
=head2 GetLastAcquisitions
1244
=head2 GetLastAcquisitions
1245
1245
1246
  my $lastacq = GetLastAcquisitions({'branches' => ('branch1','branch2'), 
1246
  my $lastacq = GetLastAcquisitions({'branches' => ('branch1','branch2'),
1247
                                    'itemtypes' => ('BK','BD')}, 10);
1247
                                    'itemtypes' => ('BK','BD')}, 10);
1248
1248
1249
=cut
1249
=cut
Lines 1252-1294 sub GetLastAcquisitions { Link Here
1252
	my ($data,$max) = @_;
1252
	my ($data,$max) = @_;
1253
1253
1254
	my $itemtype = C4::Context->preference('item-level_itypes') ? 'itype' : 'itemtype';
1254
	my $itemtype = C4::Context->preference('item-level_itypes') ? 'itype' : 'itemtype';
1255
	
1255
1256
	my $number_of_branches = @{$data->{branches}};
1256
	my $number_of_branches = @{$data->{branches}};
1257
	my $number_of_itemtypes   = @{$data->{itemtypes}};
1257
	my $number_of_itemtypes   = @{$data->{itemtypes}};
1258
	
1258
1259
	
1259
1260
	my @where = ('WHERE 1 '); 
1260
	my @where = ('WHERE 1 ');
1261
	$number_of_branches and push @where
1261
	$number_of_branches and push @where
1262
	   , 'AND holdingbranch IN (' 
1262
	   , 'AND holdingbranch IN ('
1263
	   , join(',', ('?') x $number_of_branches )
1263
	   , join(',', ('?') x $number_of_branches )
1264
	   , ')'
1264
	   , ')'
1265
	 ;
1265
	 ;
1266
	
1266
1267
	$number_of_itemtypes and push @where
1267
	$number_of_itemtypes and push @where
1268
	   , "AND $itemtype IN (" 
1268
	   , "AND $itemtype IN ("
1269
	   , join(',', ('?') x $number_of_itemtypes )
1269
	   , join(',', ('?') x $number_of_itemtypes )
1270
	   , ')'
1270
	   , ')'
1271
	 ;
1271
	 ;
1272
1272
1273
	my $query = "SELECT biblio.biblionumber as biblionumber, title, dateaccessioned
1273
	my $query = "SELECT biblio.biblionumber as biblionumber, title, dateaccessioned
1274
				 FROM items RIGHT JOIN biblio ON (items.biblionumber=biblio.biblionumber) 
1274
				 FROM items RIGHT JOIN biblio ON (items.biblionumber=biblio.biblionumber)
1275
			            RIGHT JOIN biblioitems ON (items.biblioitemnumber=biblioitems.biblioitemnumber)
1275
			            RIGHT JOIN biblioitems ON (items.biblioitemnumber=biblioitems.biblioitemnumber)
1276
			            @where
1276
			            @where
1277
			            GROUP BY biblio.biblionumber 
1277
			            GROUP BY biblio.biblionumber
1278
			            ORDER BY dateaccessioned DESC LIMIT $max";
1278
			            ORDER BY dateaccessioned DESC LIMIT $max";
1279
1279
1280
	my $dbh = C4::Context->dbh;
1280
	my $dbh = C4::Context->dbh;
1281
	my $sth = $dbh->prepare($query);
1281
	my $sth = $dbh->prepare($query);
1282
    
1282
1283
    $sth->execute((@{$data->{branches}}, @{$data->{itemtypes}}));
1283
    $sth->execute((@{$data->{branches}}, @{$data->{itemtypes}}));
1284
	
1284
1285
	my @results;
1285
	my @results;
1286
	while( my $row = $sth->fetchrow_hashref){
1286
	while( my $row = $sth->fetchrow_hashref){
1287
		push @results, {date => $row->{dateaccessioned} 
1287
		push @results, {date => $row->{dateaccessioned}
1288
						, biblionumber => $row->{biblionumber}
1288
						, biblionumber => $row->{biblionumber}
1289
						, title => $row->{title}};
1289
						, title => $row->{title}};
1290
	}
1290
	}
1291
	
1291
1292
	return @results;
1292
	return @results;
1293
}
1293
}
1294
1294
Lines 1492-1509 sub GetMarcItem { Link Here
1492
    # Tack on 'items.' prefix to column names so that C4::Biblio::TransformKohaToMarc will work.
1492
    # Tack on 'items.' prefix to column names so that C4::Biblio::TransformKohaToMarc will work.
1493
    # Also, don't emit a subfield if the underlying field is blank.
1493
    # Also, don't emit a subfield if the underlying field is blank.
1494
1494
1495
    
1495
1496
    return Item2Marc($itemrecord,$biblionumber);
1496
    return Item2Marc($itemrecord,$biblionumber);
1497
1497
1498
}
1498
}
1499
1500
=head2 GetMarcItems
1501
1502
  my @items_marc = GetMarcItems($biblionumber, \@hiddenitemnumbers);
1503
1504
Returns array of MARC::Records of the items for the biblio  passed in parameter.
1505
1506
=cut
1507
1508
sub GetMarcItems {
1509
    my ( $biblionumber, $hiddenitems, $itemtag ) = @_;
1510
    my $params;
1511
    $params->{biblionumber} = $biblionumber;
1512
    $params->{itemnumber} = {'not in' => @$hiddenitems} if defined $hiddenitems && scalar @$hiddenitems;
1513
    my $items = Koha::Items->search($params );
1514
    return unless $items;
1515
1516
    # Tack on 'items.' prefix to column names so that C4::Biblio::TransformKohaToMarc will work.
1517
    # Also, don't emit a subfield if the underlying field is blank.
1518
1519
    my $framework = Koha::Biblios->find( $biblionumber)->frameworkcode();
1520
    my @marc_items;
1521
    while ( my $this_item = $items->next() ){
1522
        push @marc_items, Item2Marc($this_item->unblessed,$biblionumber,$framework)->field($itemtag);
1523
    }
1524
    return \@marc_items;
1525
}
1526
1499
sub Item2Marc {
1527
sub Item2Marc {
1500
	my ($itemrecord,$biblionumber)=@_;
1528
	my ($itemrecord,$biblionumber, $frameworkcode)=@_;
1501
    my $mungeditem = { 
1529
    my $mungeditem = {
1502
        map {  
1530
        map {
1503
            defined($itemrecord->{$_}) && $itemrecord->{$_} ne '' ? ("items.$_" => $itemrecord->{$_}) : ()  
1531
            defined($itemrecord->{$_}) && $itemrecord->{$_} ne '' ? ("items.$_" => $itemrecord->{$_}) : ()
1504
        } keys %{ $itemrecord } 
1532
        } keys %{ $itemrecord }
1505
    };
1533
    };
1506
    my $framework = C4::Biblio::GetFrameworkCode( $biblionumber );
1534
    my $framework = $frameworkcode // C4::Biblio::GetFrameworkCode( $biblionumber );
1507
    my $itemmarc = C4::Biblio::TransformKohaToMarc(
1535
    my $itemmarc = C4::Biblio::TransformKohaToMarc(
1508
        $mungeditem, { no_split => 1},
1536
        $mungeditem, { no_split => 1},
1509
    );
1537
    );
Lines 1553-1559 my %derived_columns = ( Link Here
1553
    }
1581
    }
1554
);
1582
);
1555
1583
1556
=head2 _set_derived_columns_for_add 
1584
=head2 _set_derived_columns_for_add
1557
1585
1558
  _set_derived_column_for_add($item);
1586
  _set_derived_column_for_add($item);
1559
1587
Lines 1577-1583 sub _set_derived_columns_for_add { Link Here
1577
    }
1605
    }
1578
}
1606
}
1579
1607
1580
=head2 _set_derived_columns_for_mod 
1608
=head2 _set_derived_columns_for_mod
1581
1609
1582
  _set_derived_column_for_mod($item);
1610
  _set_derived_column_for_mod($item);
1583
1611
Lines 1680-1691 row specified by C<$itemnumber>. Link Here
1680
sub _get_single_item_column {
1708
sub _get_single_item_column {
1681
    my $column = shift;
1709
    my $column = shift;
1682
    my $itemnumber = shift;
1710
    my $itemnumber = shift;
1683
    
1711
1684
    my $dbh = C4::Context->dbh;
1712
    my $dbh = C4::Context->dbh;
1685
    my $sth = $dbh->prepare("SELECT $column FROM items WHERE itemnumber = ?");
1713
    my $sth = $dbh->prepare("SELECT $column FROM items WHERE itemnumber = ?");
1686
    $sth->execute($itemnumber);
1714
    $sth->execute($itemnumber);
1687
    my ($value) = $sth->fetchrow();
1715
    my ($value) = $sth->fetchrow();
1688
    return $value; 
1716
    return $value;
1689
}
1717
}
1690
1718
1691
=head2 _calc_items_cn_sort
1719
=head2 _calc_items_cn_sort
Lines 1703-1709 sub _calc_items_cn_sort { Link Here
1703
    $item->{'items.cn_sort'} = GetClassSort($source_values->{'items.cn_source'}, $source_values->{'itemcallnumber'}, "");
1731
    $item->{'items.cn_sort'} = GetClassSort($source_values->{'items.cn_source'}, $source_values->{'itemcallnumber'}, "");
1704
}
1732
}
1705
1733
1706
=head2 _set_defaults_for_add 
1734
=head2 _set_defaults_for_add
1707
1735
1708
  _set_defaults_for_add($item_hash);
1736
  _set_defaults_for_add($item_hash);
1709
1737
Lines 1714-1720 columns: Link Here
1714
1742
1715
=over 2
1743
=over 2
1716
1744
1717
=item * 
1745
=item *
1718
1746
1719
C<items.dateaccessioned>
1747
C<items.dateaccessioned>
1720
1748
Lines 1754-1760 Perform the actual insert into the C<items> table. Link Here
1754
1782
1755
sub _koha_new_item {
1783
sub _koha_new_item {
1756
    my ( $item, $barcode ) = @_;
1784
    my ( $item, $barcode ) = @_;
1757
    my $dbh=C4::Context->dbh;  
1785
    my $dbh=C4::Context->dbh;
1758
    my $error;
1786
    my $error;
1759
    $item->{permanent_location} //= $item->{location};
1787
    $item->{permanent_location} //= $item->{location};
1760
    _mod_item_dates( $item );
1788
    _mod_item_dates( $item );
Lines 1885-1891 sub MoveItemFromBiblio { Link Here
1885
    if ($return == 1) {
1913
    if ($return == 1) {
1886
        ModZebra( $tobiblio, "specialUpdate", "biblioserver" );
1914
        ModZebra( $tobiblio, "specialUpdate", "biblioserver" );
1887
        ModZebra( $frombiblio, "specialUpdate", "biblioserver" );
1915
        ModZebra( $frombiblio, "specialUpdate", "biblioserver" );
1888
	    # Checking if the item we want to move is in an order 
1916
	    # Checking if the item we want to move is in an order
1889
        require C4::Acquisition;
1917
        require C4::Acquisition;
1890
        my $order = C4::Acquisition::GetOrderFromItemnumber($itemnumber);
1918
        my $order = C4::Acquisition::GetOrderFromItemnumber($itemnumber);
1891
	    if ($order) {
1919
	    if ($order) {
Lines 2016-2022 routine accepts a hashref specifying the columns to update. Link Here
2016
2044
2017
sub _koha_modify_item {
2045
sub _koha_modify_item {
2018
    my ( $item ) = @_;
2046
    my ( $item ) = @_;
2019
    my $dbh=C4::Context->dbh;  
2047
    my $dbh=C4::Context->dbh;
2020
    my $error;
2048
    my $error;
2021
2049
2022
    my $query = "UPDATE items SET ";
2050
    my $query = "UPDATE items SET ";
Lines 2126-2137 sub _marc_from_item_hash { Link Here
2126
    if (@_) {
2154
    if (@_) {
2127
        $unlinked_item_subfields = shift;
2155
        $unlinked_item_subfields = shift;
2128
    }
2156
    }
2129
   
2157
2130
    # Tack on 'items.' prefix to column names so lookup from MARC frameworks will work
2158
    # Tack on 'items.' prefix to column names so lookup from MARC frameworks will work
2131
    # Also, don't emit a subfield if the underlying field is blank.
2159
    # Also, don't emit a subfield if the underlying field is blank.
2132
    my $mungeditem = { map {  (defined($item->{$_}) and $item->{$_} ne '') ? 
2160
    my $mungeditem = { map {  (defined($item->{$_}) and $item->{$_} ne '') ?
2133
                                (/^items\./ ? ($_ => $item->{$_}) : ("items.$_" => $item->{$_})) 
2161
                                (/^items\./ ? ($_ => $item->{$_}) : ("items.$_" => $item->{$_}))
2134
                                : ()  } keys %{ $item } }; 
2162
                                : ()  } keys %{ $item } };
2135
2163
2136
    my $item_marc = MARC::Record->new();
2164
    my $item_marc = MARC::Record->new();
2137
    foreach my $item_field ( keys %{$mungeditem} ) {
2165
    foreach my $item_field ( keys %{$mungeditem} ) {
Lines 2175-2181 sub _repack_item_errors { Link Here
2175
        $repacked_error->{'error_code'} = $error_code;
2203
        $repacked_error->{'error_code'} = $error_code;
2176
        $repacked_error->{'error_information'} = $error_ref->{$error_code};
2204
        $repacked_error->{'error_information'} = $error_ref->{$error_code};
2177
        push @repacked_errors, $repacked_error;
2205
        push @repacked_errors, $repacked_error;
2178
    } 
2206
    }
2179
2207
2180
    return @repacked_errors;
2208
    return @repacked_errors;
2181
}
2209
}
Lines 2225-2231 sub _get_unlinked_subfields_xml { Link Here
2225
        # use of tag 999 is arbitrary, and doesn't need to match the item tag
2253
        # use of tag 999 is arbitrary, and doesn't need to match the item tag
2226
        # used in the framework
2254
        # used in the framework
2227
        $marc->append_fields(MARC::Field->new('999', ' ', ' ', @$unlinked_item_subfields));
2255
        $marc->append_fields(MARC::Field->new('999', ' ', ' ', @$unlinked_item_subfields));
2228
        $marc->encoding("UTF-8");    
2256
        $marc->encoding("UTF-8");
2229
        $xml = $marc->as_xml("USMARC");
2257
        $xml = $marc->as_xml("USMARC");
2230
    }
2258
    }
2231
2259
Lines 2257-2263 sub _parse_unlinked_item_subfields_from_xml { Link Here
2257
2285
2258
  $count= &GetAnalyticsCount($itemnumber)
2286
  $count= &GetAnalyticsCount($itemnumber)
2259
2287
2260
counts Usage of itemnumber in Analytical bibliorecords. 
2288
counts Usage of itemnumber in Analytical bibliorecords.
2261
2289
2262
=cut
2290
=cut
2263
2291
2264
- 

Return to bug 21006