Bug 22721: Remove frameworkcode parameter in GetMarcFromKohaField calls
[koha-equinox.git] / t / db_dependent / Items / AutomaticItemModificationByAge.t
1 #!/usr/bin/perl
2
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;
9
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;
17
18 my $schema = Koha::Database->new->schema;
19 $schema->storage->txn_begin;
20 my $dbh = C4::Context->dbh;
21
22 my $builder = t::lib::TestBuilder->new;
23
24 # create two branches
25 my $library = $builder->build( { source => 'Branch' })->{branchcode};
26 my $library2 = $builder->build( { source => 'Branch' })->{branchcode};
27
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);
34
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);
40
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");
47
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'),
53 );
54 my ($biblionumber, undef) = C4::Biblio::AddBiblio($record, $frameworkcode);
55
56 my ($item_bibnum, $item_bibitemnum, $itemnumber) = C4::Items::AddItem(
57     {
58         homebranch => $library,
59         holdingbranch => $library,
60         new_status => 'new_value',
61         ccode => 'FIC',
62     },
63     $biblionumber
64 );
65
66 my $item = Koha::Items->find( $itemnumber );
67 is ( $item->new_status, 'new_value', q|AddItem insert the 'new_status' field| );
68
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|);
72
73 # Update the items.new_status field if items.ccode eq 'FIC' => should be updated
74 my @rules = (
75     {
76         conditions => [
77             {
78                 field => 'items.ccode',
79                 value => 'FIC',
80             },
81         ],
82         substitutions => [
83             {
84                 field => 'items.new_status',
85                 value => 'updated_value',
86              },
87         ],
88         age => '0',
89     },
90 );
91
92 C4::Items::ToggleNewStatus( { rules => \@rules } );
93
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| );
98
99 # Update the items.new_status field if items.ccode eq 'DONT_EXIST' => should not be updated
100 @rules = (
101     {
102         conditions => [
103             {
104                 field => 'items.ccode',
105                 value => 'DONT_EXIST',
106             },
107         ],
108         substitutions => [
109             {
110                 field => 'items.new_status',
111                 value => 'new_updated_value',
112              },
113         ],
114         age => '0',
115     },
116 );
117
118 C4::Items::ToggleNewStatus( { rules => \@rules } );
119
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| );
124
125 # Play with age
126 my $dt_today = dt_from_string;
127 my $days5ago = $dt_today->add_duration( DateTime::Duration->new( days => -5 ) );
128
129 C4::Items::ModItem( { dateaccessioned => $days5ago }, $biblionumber, $itemnumber );
130
131 @rules = (
132     {
133         conditions => [
134             {
135                 field => 'items.ccode',
136                 value => 'FIC',
137             },
138         ],
139         substitutions => [
140             {
141                 field => 'items.new_status',
142                 value => 'new_updated_value',
143              },
144         ],
145         age => '10',
146     },
147 );
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|);
151
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|);
157
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|);
163
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|);
169
170 # Field deletion
171 @rules = (
172     {
173         conditions => [
174             {
175                 field => 'items.ccode',
176                 value => 'FIC',
177             },
178         ],
179         substitutions => [
180             {
181                 field => 'items.new_status',
182                 value => '',
183              },
184         ],
185         age => '0',
186     },
187 );
188
189 C4::Items::ToggleNewStatus( { rules => \@rules } );
190
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| );
195
196 # conditions multiple
197 @rules = (
198     {
199         conditions => [
200             {
201                 field => 'items.ccode',
202                 value => 'FIC',
203             },
204             {
205                 field => 'items.homebranch',
206                 value => $library,
207             },
208         ],
209         substitutions => [
210             {
211                 field => 'items.new_status',
212                 value => 'new_value',
213              },
214         ],
215         age => '0',
216     },
217 );
218
219 C4::Items::ToggleNewStatus( { rules => \@rules } );
220
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|);
223
224 @rules = (
225     {
226         conditions => [
227             {
228                 field => 'items.ccode',
229                 value => 'FIC',
230             },
231             {
232                 field => 'items.homebranch',
233                 value => 'DONT_EXIST',
234             },
235         ],
236         substitutions => [
237             {
238                 field => 'items.new_status',
239                 value => 'new_updated_value',
240              },
241         ],
242         age => '0',
243     },
244 );
245
246 C4::Items::ToggleNewStatus( { rules => \@rules } );
247
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|);
250
251 @rules = (
252     {
253         conditions => [
254             {
255                 field => 'items.ccode',
256                 value => 'FIC|NFIC',
257             },
258             {
259                 field => 'items.homebranch',
260                 value => "$library|$library2",
261             },
262         ],
263         substitutions => [
264             {
265                 field => 'items.new_status',
266                 value => 'new_updated_value',
267              },
268         ],
269         age => '0',
270     },
271 );
272
273 C4::Items::ToggleNewStatus( { rules => \@rules } );
274
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|);
277
278 @rules = (
279     {
280         conditions => [
281             {
282                 field => 'biblioitems.itemtype',
283                 value => 'ITEMTYPE_T',
284             },
285         ],
286         substitutions => [
287             {
288                 field => 'items.new_status',
289                 value => 'another_new_updated_value',
290              },
291         ],
292         age => '0',
293     },
294 );
295
296 C4::Items::ToggleNewStatus( { rules => \@rules } );
297
298 $modified_item = Koha::Items->find( $itemnumber );
299 is( $modified_item->new_status, 'another_new_updated_value', q|ToggleNewStatus: conditions on biblioitems|);
300
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|);
306
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;