---
 C4/Items.pm            |   84 +++++++++++++++++++++++++----------------------
 t/db_dependent/Items.t |   33 +++++++++++++++++++
 2 files changed, 78 insertions(+), 39 deletions(-)
 create mode 100755 t/db_dependent/Items.t

diff --git a/C4/Items.pm b/C4/Items.pm
index 61126d9..9a1e81f 100644
--- a/C4/Items.pm
+++ b/C4/Items.pm
@@ -604,25 +604,20 @@ sub DelItem {
     
     _koha_delete_item( $dbh, $itemnumber );
 
-    # get the MARC record
-    my $record = GetMarcBiblio($biblionumber);
-    my $frameworkcode = GetFrameworkCode($biblionumber);
-
-    # backup the record
-    my $copy2deleted = $dbh->prepare("UPDATE deleteditems SET marc=? WHERE 
itemnumber=?");
-    $copy2deleted->execute( $record->as_usmarc(), $itemnumber );
-
+#This looks quite odd to me Why would we need to save the whole bibliorecord ?
+#    # get the MARC record
+#    my $record = GetMarcBiblio($biblionumber);
+#
+#    # backup the record
+#    my $copy2deleted = $dbh->prepare("UPDATE deleteditems SET marc=? WHERE 
itemnumber=?");
+#    $copy2deleted->execute( $record->as_usmarc(), $itemnumber );
+#
     #search item field code
-    my ( $itemtag, $itemsubfield ) = 
GetMarcFromKohaField("items.itemnumber",$frameworkcode);
-    my @fields = $record->field($itemtag);
+#    my ( $itemtag, $itemsubfield ) = 
GetMarcFromKohaField("items.itemnumber",$frameworkcode);
 
     # delete the item specified
-    foreach my $field (@fields) {
-        if ( $field->subfield($itemsubfield) eq $itemnumber ) {
-            $record->delete_field($field);
-        }
-    }
-    &ModBiblioMarc( $record, $biblionumber, $frameworkcode );
+    my $frameworkcode = GetFrameworkCode($biblionumber);
+    _replace_item_field_in_biblio( undef, $biblionumber,$itemnumber, 
$frameworkcode );
     logaction("CATALOGUING", "DELETE", $itemnumber, "item") if 
C4::Context->preference("CataloguingLog");
 }
 
@@ -2268,13 +2263,15 @@ item information field.
 
 sub _add_item_field_to_biblio {
     my ($item_marc, $biblionumber, $frameworkcode) = @_;
+    my $dbh = C4::Context->dbh;
 
-    my $biblio_marc = GetMarcBiblio($biblionumber);
-    foreach my $field ($item_marc->fields()) {
-        $biblio_marc->append_fields($field);
-    }
+    my $biblio_xml = GetXmlBiblio($biblionumber);
+    my ($itemtag,$itemsubfield) = 
GetMarcFromKohaField("items.itemnumber",$frameworkcode);
+    my $itemField = $item_marc->field($itemtag);
+       my $itemXML = C4::Biblio::_field_xml_output($itemField);
+       substr($biblio_xml,-10,0,$itemXML);
+       $dbh->do(qq{UPDATE biblioitems set marcxml=? WHERE 
biblionumber=?},undef, $biblio_xml, $biblionumber);
 
-    ModBiblioMarc($biblio_marc, $biblionumber, $frameworkcode);
 }
 
 =head2 _replace_item_field_in_biblio
@@ -2297,27 +2294,36 @@ sub _replace_item_field_in_biblio {
     my $dbh = C4::Context->dbh;
     
     # get complete MARC record & replace the item field by the new one
-    my $completeRecord = GetMarcBiblio($biblionumber);
+    my $completeRecord = GetXmlBiblio($biblionumber);
     my ($itemtag,$itemsubfield) = 
GetMarcFromKohaField("items.itemnumber",$frameworkcode);
-    my $itemField = $ItemRecord->field($itemtag);
-    my @items = $completeRecord->field($itemtag);
-    my $found = 0;
-    foreach (@items) {
-        if ($_->subfield($itemsubfield) eq $itemnumber) {
-            $_->replace_with($itemField);
-            $found = 1;
-        }
-    }
+       my $itemXML;
+       if ($ItemRecord){
+           my $itemField = $ItemRecord->field($itemtag);
+               $itemXML = C4::Biblio::_field_xml_output($itemField);
+       }
+       my $done=0;
+       my $ofset_itemfield=0;
+       while (($ofset_itemfield=index($completeRecord,qq{<datafield 
tag="$itemtag" ind1=" " ind2=" ">},$ofset_itemfield ))>0){
+               my 
$ofset_itemfield_end=index(substr($completeRecord,$ofset_itemfield),qq{</datafield>});
+               warn "$ofset_itemfield $ofset_itemfield_end";
+               my 
$field_string=substr($completeRecord,$ofset_itemfield,$ofset_itemfield_end);
+               if (my 
$index=index($field_string,qq{code="$itemsubfield">$itemnumber</subfield})>0){
+                       
substr($completeRecord,$ofset_itemfield,$ofset_itemfield_end+length(qq{</datafield>}),"".$itemXML)
 and $done=1;
+                       $dbh->do(qq{UPDATE biblioitems set marcxml=? WHERE 
biblionumber=?},undef, $completeRecord, $biblionumber);
+                       return;
+               }
+               if ($ofset_itemfield_end>-1){
+                       $ofset_itemfield+= 
$ofset_itemfield_end+length(qq{</datafield>});
+               }
+               else {
+                       $ofset_itemfield=length($completeRecord); 
+               }
+       }
   
-    unless ($found) { 
-        # If we haven't found the matching field,
-        # just add it.  However, this means that
-        # there is likely a bug.
-        $completeRecord->append_fields($itemField);
+    unless ($done) { 
+               #Add XML at the end of record
+               
_add_item_field_to_biblio($ItemRecord,$biblionumber,$frameworkcode)
     }
-
-    # save the record
-    ModBiblioMarc($completeRecord, $biblionumber, $frameworkcode);
 }
 
 =head2 _repack_item_errors
diff --git a/t/db_dependent/Items.t b/t/db_dependent/Items.t
new file mode 100755
index 0000000..c3b4788
--- /dev/null
+++ b/t/db_dependent/Items.t
@@ -0,0 +1,33 @@
+use strict;
+use warnings;
+use Test::More tests=>18;
+
+BEGIN {use_ok('C4::Items') }
+use C4::Biblio;
+use C4::Dates;
+use C4::Debug;
+
+print "ok 1\n";
+use YAML;
+
+#
+# Budget Periods :
+#
+my $field=MARC::Field->new('200'," "," ",a=>"Title",b=>'itemtype');
+my $biblio=MARC::Record->new();
+$biblio->append_fields($field);
+my ($biblionumber)=AddBiblio($biblio,'');
+my 
($biblionumber,$biblioitemnumber,$itemnumber)=AddItem({barcode=>1231241,location=>"MyLOC"},$biblionumber);
+$debug && warn Dump(GetItem($itemnumber));
+my 
($biblionumber,$biblioitemnumber,$itemnumber2)=AddItem({barcode=>'ACAD',location=>"MyLOC2"},$biblionumber);
+$debug && warn Dump(GetItem($itemnumber2));
+my $bibliorecord=GetMarcBiblio($biblionumber);
+$debug && warn $bibliorecord->as_formatted;
+ModItem({dateaccessioned=>2009-01-01,location=>'TESTS2'},$biblionumber,$itemnumber);
+my $bibliorecord=GetMarcBiblio($biblionumber);
+$debug && warn $bibliorecord->as_formatted;
+print localtime;
+for (my $i=1;$i<10000;$i++){
+ModItem({location=>"TEST$i"},$biblionumber,$itemnumber2);
+}
+print localtime
-- 
1.6.3.3

_______________________________________________
Koha-patches mailing list
[email protected]
http://lists.koha.org/mailman/listinfo/koha-patches

Reply via email to