Bug 17672: Add damaged_on to items and deleteditems tables
authorNick Clemens <nick@bywatersolutions.com>
Wed, 19 Jul 2017 13:10:41 +0000 (13:10 +0000)
committerJonathan Druart <jonathan.druart@bugs.koha-community.org>
Sun, 18 Feb 2018 19:48:43 +0000 (16:48 -0300)
This patchset adds a 'damaged_on' column to store the date an item is
marked damaged, analogous to withdrawn_on and itemlost_on

To test:
1 - Apply patch
2 - Mark an item damaged via moredetail.pl (Items tab on left in
        details)
3 - Note the damaged on date apears below
4 - Unmark the item, the date is removed
5 - Go to the edit items screen (from top bar 'Edit->edit items')
6 - Mark item damaged - check db or moredetails.pl to see damaged_on
date
7 - Unmark item damaged - confirm date is removed
8 - prove t/db_dependent/Items.t

Signed-off-by: Owen Leonard <oleonard@myacpl.org>
Signed-off-by: Charles Farmer <charles.farmer@inLibro.com>
Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>
Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
C4/Items.pm
admin/columns_settings.yml
installer/data/mysql/atomicupdate/bug17672_add_damaged_on_column_to_items.perl [new file with mode: 0644]
installer/data/mysql/kohastructure.sql
koha-tmpl/intranet-tmpl/prog/en/columns.def
koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt
t/db_dependent/Items.t

index d0357f6..a3ecd87 100644 (file)
@@ -561,10 +561,10 @@ sub ModItem {
 
     $item->{'itemnumber'} = $itemnumber or return;
 
-    my @fields = qw( itemlost withdrawn );
+    my @fields = qw( itemlost withdrawn damaged );
 
     # Only call GetItem if we need to set an "on" date field
-    if ( $item->{itemlost} || $item->{withdrawn} ) {
+    if ( $item->{itemlost} || $item->{withdrawn} || $item->{damaged} ) {
         my $pre_mod_item = GetItem( $item->{'itemnumber'} );
         for my $field (@fields) {
             if (    defined( $item->{$field} )
index a5047e7..f56a745 100644 (file)
@@ -88,7 +88,8 @@ modules:
       itemst:
         # NOTE: These columns are in the same order as kohastructure.sql, and contain all items
         # columns except for the following internal/obsolete fields: stack, more_subfields_xml,
-        # cn_sort, permanent_location, itemlost_on, withdrawn_on, issues, renewals and reserves.
+        # cn_sort, permanent_location, damaged_on itemlost_on, withdrawn_on, issues, renewals and
+        # reserves.
         -
           columnname: barcode
         -
diff --git a/installer/data/mysql/atomicupdate/bug17672_add_damaged_on_column_to_items.perl b/installer/data/mysql/atomicupdate/bug17672_add_damaged_on_column_to_items.perl
new file mode 100644 (file)
index 0000000..7e6348a
--- /dev/null
@@ -0,0 +1,9 @@
+$DBversion = 'XXX';  # will be replaced by the RM
+if( CheckVersion( $DBversion ) ) {
+    $dbh->do( "ALTER TABLE items ADD COLUMN damaged_on DATETIME NULL AFTER damaged");
+    $dbh->do( "ALTER TABLE deleteditems ADD COLUMN damaged_on DATETIME NULL AFTER damaged");
+
+    # Always end with this (adjust the bug info)
+    SetVersion( $DBversion );
+    print "Upgrade to $DBversion done (Bug 17672: Add damaged_on to items and deleteditems tables)\n";
+}
index 4793951..0880df0 100644 (file)
@@ -637,6 +637,7 @@ CREATE TABLE `deleteditems` (
   `stack` tinyint(1) default NULL,
   `notforloan` tinyint(1) NOT NULL default 0, -- authorized value defining why this item is not for loan (MARC21 952$7)
   `damaged` tinyint(1) NOT NULL default 0, -- authorized value defining this item as damaged (MARC21 952$4)
+  `damaged_on` datetime DEFAULT NULL, -- the date and time an item was last marked as damaged, NULL if not damaged
   `itemlost` tinyint(1) NOT NULL default 0, -- authorized value defining this item as lost (MARC21 952$1)
   `itemlost_on` datetime DEFAULT NULL, -- the date and time an item was last marked as lost, NULL if not lost
   `withdrawn` tinyint(1) NOT NULL default 0, -- authorized value defining this item as withdrawn (MARC21 952$0)
@@ -897,6 +898,7 @@ CREATE TABLE `items` ( -- holdings/item information
   `stack` tinyint(1) default NULL,
   `notforloan` tinyint(1) NOT NULL default 0, -- authorized value defining why this item is not for loan (MARC21 952$7)
   `damaged` tinyint(1) NOT NULL default 0, -- authorized value defining this item as damaged (MARC21 952$4)
+  `damaged_on` datetime DEFAULT NULL, -- the date and time an item was last marked as damaged, NULL if not damaged
   `itemlost` tinyint(1) NOT NULL default 0, -- authorized value defining this item as lost (MARC21 952$1)
   `itemlost_on` datetime DEFAULT NULL, -- the date and time an item was last marked as lost, NULL if not lost
   `withdrawn` tinyint(1) NOT NULL default 0, -- authorized value defining this item as withdrawn (MARC21 952$0)
index 8d7c174..21c74f2 100644 (file)
 <field name="items.itype">Koha itemtype</field>
 <field name="items.stocknumber">Inventory number</field>
 <field name="items.damaged">Damaged status</field>
+<field name="items.damaged_on">Damaged on</field>
 <field name="items.materials">Materials specified</field>
 <field name="items.uri">Uniform Resource Identifier</field>
 <field name="items.more_subfields_xml">Additional subfields (XML)</field>
index 501012a..3fb7856 100644 (file)
                     &nbsp;
                 [% END %]
             </li>
+            [% IF ITEM_DAT.damaged != "" && ITEM_DAT.damaged_on %]
+                <li><span class="label">Damaged on:</span>[% ITEM_DAT.damaged_on | $KohaDates %] &nbsp;</li>
+            [% END %]
             [% END %]
 
             [% IF itemwithdrawnloop %]
index e10c15e..f8ac133 100755 (executable)
@@ -24,6 +24,7 @@ use C4::Biblio;
 use Koha::Database;
 use Koha::DateUtils qw( dt_from_string );
 use Koha::Library;
+use Koha::DateUtils;
 
 use t::lib::Mocks;
 use t::lib::TestBuilder;
@@ -108,6 +109,41 @@ subtest 'General Add, Get and Del tests' => sub {
     $schema->storage->txn_rollback;
 };
 
+subtest 'ModItem tests' => sub {
+    plan tests => 6;
+
+    $schema->storage->txn_begin;
+
+    my $builder = t::lib::TestBuilder->new;
+    my $item = $builder->build({
+        source => 'Item',
+        value  => {
+            itemlost     => 0,
+            damaged      => 0,
+            withdrawn    => 0,
+            itemlost_on  => undef,
+            damaged_on   => undef,
+            withdrawn_on => undef,
+        }
+    });
+
+    my @fields = qw( itemlost withdrawn damaged );
+    for my $field (@fields) {
+        $item->{$field} = 1;
+        ModItem( $item, $item->{biblionumber}, $item->{itemnumber} );
+        my $post_mod_item = Koha::Items->find({ itemnumber => $item->{itemnumber} })->unblessed;
+        is( output_pref({ str => $post_mod_item->{$field."_on"}, dateonly => 1 }), output_pref({ dt => dt_from_string(), dateonly => 1 }), "When updating $field, $field"."_on is updated" );
+
+        $item->{$field} = 0;
+        ModItem( $item, $item->{biblionumber}, $item->{itemnumber} );
+        $post_mod_item = Koha::Items->find({ itemnumber => $item->{itemnumber} })->unblessed;
+        is( $post_mod_item->{$field."_on"}, undef, "When clearing $field, $field"."_on is cleared" );
+    }
+
+    $schema->storage->txn_rollback;
+
+};
+
 subtest 'GetHiddenItemnumbers tests' => sub {
 
     plan tests => 9;
@@ -732,6 +768,7 @@ subtest '_mod_item_dates' => sub {
     # check if itemlost_on was not touched
     $item->{itemlost_on} = '12345678';
     $item->{withdrawn_on} = '12/31/2015 23:59:00';
+    $item->{damaged_on} = '01/20/2017 09:00:00';
     $orgitem = { %$item };
     C4::Items::_mod_item_dates($item);
     is_deeply( $item, $orgitem, 'Colums with _on are not touched' );