Bug 22721: Remove frameworkcode parameter in GetMarcFromKohaField calls
[koha.git] / t / db_dependent / Items / AutomaticItemModificationByAge.t
blob33f85ecbbbdd032eb579e82d6c5d517885069214
1 #!/usr/bin/perl
3 use Modern::Perl;
4 use Test::More tests => 17;
5 use MARC::Record;
6 use MARC::Field;
7 use DateTime;
8 use DateTime::Duration;
10 use C4::Items;
11 use C4::Biblio;
12 use C4::Context;
13 use Koha::DateUtils;
14 use Koha::Items;
15 use t::lib::Mocks;
16 use t::lib::TestBuilder;
18 my $schema = Koha::Database->new->schema;
19 $schema->storage->txn_begin;
20 my $dbh = C4::Context->dbh;
22 my $builder = t::lib::TestBuilder->new;
24 # create two branches
25 my $library = $builder->build( { source => 'Branch' })->{branchcode};
26 my $library2 = $builder->build( { source => 'Branch' })->{branchcode};
28 my $frameworkcode = ''; # Use Default for Koha to MARC mappings
29 $dbh->do(q|
30 DELETE FROM marc_subfield_structure
31 WHERE ( kohafield = 'items.new_status' OR kohafield = 'items.stocknumber' )
32 AND frameworkcode = ?
33 |, undef, $frameworkcode);
35 my $new_tagfield = 'i';
36 $dbh->do(qq|
37 INSERT INTO marc_subfield_structure(tagfield, tagsubfield, kohafield, frameworkcode)
38 VALUES ( 952, ?, 'items.new_status', ? )
39 |, undef, $new_tagfield, $frameworkcode);
41 # Clear cache
42 my $cache = Koha::Caches->get_instance();
43 $cache->clear_from_cache("MarcStructure-0-$frameworkcode");
44 $cache->clear_from_cache("MarcStructure-1-$frameworkcode");
45 $cache->clear_from_cache("default_value_for_mod_marc-");
46 $cache->clear_from_cache("MarcSubfieldStructure-$frameworkcode");
48 my $record = MARC::Record->new();
49 $record->append_fields(
50 MARC::Field->new('100', ' ', ' ', a => 'Moffat, Steven'),
51 MARC::Field->new('245', ' ', ' ', a => 'Silence in the library'),
52 MARC::Field->new('942', ' ', ' ', c => 'ITEMTYPE_T'),
54 my ($biblionumber, undef) = C4::Biblio::AddBiblio($record, $frameworkcode);
56 my ($item_bibnum, $item_bibitemnum, $itemnumber) = C4::Items::AddItem(
58 homebranch => $library,
59 holdingbranch => $library,
60 new_status => 'new_value',
61 ccode => 'FIC',
63 $biblionumber
66 my $item = Koha::Items->find( $itemnumber );
67 is ( $item->new_status, 'new_value', q|AddItem insert the 'new_status' field| );
69 my ( $tagfield, undef ) = GetMarcFromKohaField( 'items.itemnumber' );
70 my $marc_item = C4::Items::GetMarcItem( $biblionumber, $itemnumber );
71 is( $marc_item->subfield($tagfield, $new_tagfield), 'new_value', q|Koha mapping is correct|);
73 # Update the items.new_status field if items.ccode eq 'FIC' => should be updated
74 my @rules = (
76 conditions => [
78 field => 'items.ccode',
79 value => 'FIC',
82 substitutions => [
84 field => 'items.new_status',
85 value => 'updated_value',
88 age => '0',
92 C4::Items::ToggleNewStatus( { rules => \@rules } );
94 my $modified_item = Koha::Items->find( $itemnumber );
95 is( $modified_item->new_status, 'updated_value', q|ToggleNewStatus: The new_status value is updated|);
96 $marc_item = C4::Items::GetMarcItem( $biblionumber, $itemnumber );
97 is( $marc_item->subfield($tagfield, $new_tagfield), 'updated_value', q|ToggleNewStatus: The new_status value is updated| );
99 # Update the items.new_status field if items.ccode eq 'DONT_EXIST' => should not be updated
100 @rules = (
102 conditions => [
104 field => 'items.ccode',
105 value => 'DONT_EXIST',
108 substitutions => [
110 field => 'items.new_status',
111 value => 'new_updated_value',
114 age => '0',
118 C4::Items::ToggleNewStatus( { rules => \@rules } );
120 $modified_item = Koha::Items->find( $itemnumber );
121 is( $modified_item->new_status, 'updated_value', q|ToggleNewStatus: The new_status value is not updated|);
122 $marc_item = C4::Items::GetMarcItem( $biblionumber, $itemnumber );
123 is( $marc_item->subfield($tagfield, $new_tagfield), 'updated_value', q|ToggleNewStatus: The new_status value is not updated| );
125 # Play with age
126 my $dt_today = dt_from_string;
127 my $days5ago = $dt_today->add_duration( DateTime::Duration->new( days => -5 ) );
129 C4::Items::ModItem( { dateaccessioned => $days5ago }, $biblionumber, $itemnumber );
131 @rules = (
133 conditions => [
135 field => 'items.ccode',
136 value => 'FIC',
139 substitutions => [
141 field => 'items.new_status',
142 value => 'new_updated_value',
145 age => '10',
148 C4::Items::ToggleNewStatus( { rules => \@rules } );
149 $modified_item = Koha::Items->find( $itemnumber );
150 is( $modified_item->new_status, 'updated_value', q|ToggleNewStatus: Age = 10 : The new_status value is not updated|);
152 $rules[0]->{age} = 5;
153 $rules[0]->{substitutions}[0]{value} = 'new_updated_value5';
154 C4::Items::ToggleNewStatus( { rules => \@rules } );
155 $modified_item = Koha::Items->find( $itemnumber );
156 is( $modified_item->new_status, 'new_updated_value5', q|ToggleNewStatus: Age = 5 : The new_status value is updated|);
158 $rules[0]->{age} = '';
159 $rules[0]->{substitutions}[0]{value} = 'new_updated_value_empty_string';
160 C4::Items::ToggleNewStatus( { rules => \@rules } );
161 $modified_item = Koha::Items->find( $itemnumber );
162 is( $modified_item->new_status, 'new_updated_value_empty_string', q|ToggleNewStatus: Age = '' : The new_status value is updated|);
164 $rules[0]->{age} = undef;
165 $rules[0]->{substitutions}[0]{value} = 'new_updated_value_undef';
166 C4::Items::ToggleNewStatus( { rules => \@rules } );
167 $modified_item = Koha::Items->find( $itemnumber );
168 is( $modified_item->new_status, 'new_updated_value_undef', q|ToggleNewStatus: Age = undef : The new_status value is updated|);
170 # Field deletion
171 @rules = (
173 conditions => [
175 field => 'items.ccode',
176 value => 'FIC',
179 substitutions => [
181 field => 'items.new_status',
182 value => '',
185 age => '0',
189 C4::Items::ToggleNewStatus( { rules => \@rules } );
191 $modified_item = Koha::Items->find( $itemnumber );
192 is( $modified_item->new_status, '', q|ToggleNewStatus: The new_status value is empty|);
193 $marc_item = C4::Items::GetMarcItem( $biblionumber, $itemnumber );
194 is( $marc_item->subfield($tagfield, $new_tagfield), undef, q|ToggleNewStatus: The new_status field is removed from the item marc| );
196 # conditions multiple
197 @rules = (
199 conditions => [
201 field => 'items.ccode',
202 value => 'FIC',
205 field => 'items.homebranch',
206 value => $library,
209 substitutions => [
211 field => 'items.new_status',
212 value => 'new_value',
215 age => '0',
219 C4::Items::ToggleNewStatus( { rules => \@rules } );
221 $modified_item = Koha::Items->find( $itemnumber );
222 is( $modified_item->new_status, 'new_value', q|ToggleNewStatus: conditions multiple: all match, the new_status value is updated|);
224 @rules = (
226 conditions => [
228 field => 'items.ccode',
229 value => 'FIC',
232 field => 'items.homebranch',
233 value => 'DONT_EXIST',
236 substitutions => [
238 field => 'items.new_status',
239 value => 'new_updated_value',
242 age => '0',
246 C4::Items::ToggleNewStatus( { rules => \@rules } );
248 $modified_item = Koha::Items->find( $itemnumber );
249 is( $modified_item->new_status, 'new_value', q|ToggleNewStatus: conditions multiple: at least 1 condition does not match, the new_status value is not updated|);
251 @rules = (
253 conditions => [
255 field => 'items.ccode',
256 value => 'FIC|NFIC',
259 field => 'items.homebranch',
260 value => "$library|$library2",
263 substitutions => [
265 field => 'items.new_status',
266 value => 'new_updated_value',
269 age => '0',
273 C4::Items::ToggleNewStatus( { rules => \@rules } );
275 $modified_item = Koha::Items->find( $itemnumber );
276 is( $modified_item->new_status, 'new_updated_value', q|ToggleNewStatus: conditions multiple: the 2 conditions match, the new_status value is updated|);
278 @rules = (
280 conditions => [
282 field => 'biblioitems.itemtype',
283 value => 'ITEMTYPE_T',
286 substitutions => [
288 field => 'items.new_status',
289 value => 'another_new_updated_value',
292 age => '0',
296 C4::Items::ToggleNewStatus( { rules => \@rules } );
298 $modified_item = Koha::Items->find( $itemnumber );
299 is( $modified_item->new_status, 'another_new_updated_value', q|ToggleNewStatus: conditions on biblioitems|);
301 # Run twice
302 t::lib::Mocks::mock_preference('CataloguingLog', 1);
303 my $actions_nb = $schema->resultset('ActionLog')->count();
304 C4::Items::ToggleNewStatus( { rules => \@rules } );
305 is( $schema->resultset('ActionLog')->count(), $actions_nb, q|ToggleNewStatus: no substitution does not generate action logs|);
307 # Cleanup
308 $cache = Koha::Caches->get_instance();
309 $cache->clear_from_cache("MarcStructure-0-$frameworkcode");
310 $cache->clear_from_cache("MarcStructure-1-$frameworkcode");
311 $cache->clear_from_cache("default_value_for_mod_marc-");
312 $cache->clear_from_cache("MarcSubfieldStructure-$frameworkcode");
313 $schema->storage->txn_rollback;