diff --git a/Koha/MarcOrder.pm b/Koha/MarcOrder.pm index a966684d5ee..3b138753297 100644 --- a/Koha/MarcOrder.pm +++ b/Koha/MarcOrder.pm @@ -850,4 +850,50 @@ sub create_order_lines { return; } + +=head3 match_file_to_account + + my $file_match = Koha::MarcOrder->match_file_to_account({ + filename => $filename, + filepath => $filepath, + profile => $profile + }); + + Used by the cronjob to detect whether a file matches the account and should be processed + +=cut + + +sub match_file_to_account { + my ($self, $args) = @_; + + my $match = 0; + my $filename = $args->{filename}; + my $filepath = $args->{filepath}; + my $profile = $args->{profile}; + my $format = index($filename, '.mrc') != -1 ? 'ISO2709' : 'MARCXML'; + + my ( $errors, $marcrecords ); + if ( $format eq 'MARCXML' ) { + ( $errors, $marcrecords ) = C4::ImportBatch::RecordsFromMARCXMLFile( $filepath, $profile->encoding ); + } elsif ( $format eq 'ISO2709' ) { + ( $errors, $marcrecords ) = C4::ImportBatch::RecordsFromISO2709File( + $filepath, $profile->record_type, + $profile->encoding + ); + } + + my $match_record = @{ $marcrecords }[0]; + my ( $field, $subfield ) = split /\$/, $profile->match_field; + + my $field_value = $match_record->subfield( $field, $subfield ); + my $match_value = $profile->match_value; + + if($field_value eq $match_value) { + $match = 1; + } + + return $match; +} + 1; \ No newline at end of file diff --git a/Koha/Schema/Result/MarcOrderAccount.pm b/Koha/Schema/Result/MarcOrderAccount.pm index 88f6119290c..be720da960e 100644 --- a/Koha/Schema/Result/MarcOrderAccount.pm +++ b/Koha/Schema/Result/MarcOrderAccount.pm @@ -116,6 +116,22 @@ type of record in the file file encoding +=head2 match_field + + data_type: 'varchar' + is_nullable: 1 + size: 10 + +the field that a vendor account has been mapped to in a marc record + +=head2 match_value + + data_type: 'varchar' + is_nullable: 1 + size: 50 + +the value to be matched against the marc record + =cut __PACKAGE__->add_columns( @@ -143,6 +159,10 @@ __PACKAGE__->add_columns( { data_type => "varchar", is_nullable => 1, size => 50 }, "encoding", { data_type => "varchar", is_nullable => 1, size => 50 }, + "match_field", + { data_type => "varchar", is_nullable => 1, size => 10 }, + "match_value", + { data_type => "varchar", is_nullable => 1, size => 50 }, ); =head1 PRIMARY KEY @@ -200,8 +220,8 @@ __PACKAGE__->belongs_to( ); -# Created by DBIx::Class::Schema::Loader v0.07049 @ 2023-07-18 16:31:16 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:vMLrmisXQnn2e60qW7ppnA +# Created by DBIx::Class::Schema::Loader v0.07049 @ 2023-09-07 08:55:26 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:6pN1TLuqkf9rQaeQ7Wf26A # You can replace this text with custom code or comments, and it will be preserved on regeneration diff --git a/admin/marc_order_accounts.pl b/admin/marc_order_accounts.pl index 7d19934ea64..8365e56ff2f 100644 --- a/admin/marc_order_accounts.pl +++ b/admin/marc_order_accounts.pl @@ -89,6 +89,8 @@ item_action => scalar $input->param('item_action'), record_type => scalar $input->param('record_type'), encoding => scalar $input->param('encoding') || 'UTF-8', + match_field => scalar $input->param('match_field'), + match_value => scalar $input->param('match_value'), }; if(scalar $input->param('id')) { diff --git a/installer/data/mysql/atomicupdate/bug_34355-add_marc_order_accounts.pl b/installer/data/mysql/atomicupdate/bug_34355-add_marc_order_accounts.pl index f0a5f2ab216..149afbeee96 100644 --- a/installer/data/mysql/atomicupdate/bug_34355-add_marc_order_accounts.pl +++ b/installer/data/mysql/atomicupdate/bug_34355-add_marc_order_accounts.pl @@ -1,14 +1,15 @@ use Modern::Perl; return { - bug_number => "34355", + bug_number => "34355", description => "Add a table to allow creation of MARC order accounts and a syspref to activate it.", - up => sub { + up => sub { my ($args) = @_; - my ($dbh, $out) = @$args{qw(dbh out)}; + my ( $dbh, $out ) = @$args{qw(dbh out)}; - unless( TableExists('marc_order_accounts') ) { - $dbh->do(q{ + unless ( TableExists('marc_order_accounts') ) { + $dbh->do( + q{ CREATE TABLE `marc_order_accounts` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'unique identifier and primary key', `description` varchar(250) NOT NULL COMMENT 'description of this account', @@ -22,11 +23,14 @@ `parse_items` tinyint(1) DEFAULT NULL COMMENT 'should items be parsed', `record_type` varchar(50) DEFAULT NULL COMMENT 'type of record in the file', `encoding` varchar(50) DEFAULT NULL COMMENT 'file encoding', + `match_field` varchar(10) DEFAULT NULL COMMENT 'the field that a vendor account has been mapped to in a marc record', + `match_value` varchar(50) DEFAULT NULL COMMENT 'the value to be matched against the marc record', PRIMARY KEY (`id`), CONSTRAINT `marc_ordering_account_ibfk_1` FOREIGN KEY (`vendor_id`) REFERENCES `aqbooksellers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `marc_ordering_account_ibfk_2` FOREIGN KEY (`budget_id`) REFERENCES `aqbudgets` (`budget_id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - }); + } + ); say $out "Added new table 'marc_order_accounts'"; } else { diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql index a59040f4bbb..35255ac3379 100644 --- a/installer/data/mysql/kohastructure.sql +++ b/installer/data/mysql/kohastructure.sql @@ -4111,6 +4111,8 @@ CREATE TABLE `marc_order_accounts` ( `parse_items` tinyint(1) DEFAULT NULL COMMENT 'should items be parsed', `record_type` varchar(50) DEFAULT NULL COMMENT 'type of record in the file', `encoding` varchar(50) DEFAULT NULL COMMENT 'file encoding', + `match_field` varchar(10) DEFAULT NULL COMMENT 'the field that a vendor account has been mapped to in a marc record', + `match_value` varchar(50) DEFAULT NULL COMMENT 'the value to be matched against the marc record', PRIMARY KEY (`id`), CONSTRAINT `marc_ordering_account_ibfk_1` FOREIGN KEY (`vendor_id`) REFERENCES `aqbooksellers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `marc_ordering_account_ibfk_2` FOREIGN KEY (`budget_id`) REFERENCES `aqbudgets` (`budget_id`) ON DELETE CASCADE ON UPDATE CASCADE diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/marc_order_accounts.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/marc_order_accounts.tt index 1ef0c0f1174..2b7ecc49262 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/marc_order_accounts.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/marc_order_accounts.tt @@ -126,6 +126,16 @@ MARC Order Accounts
The download directory specifies the directory in your koha installation that should be searched for new files.
+
  • + + +
    (Optional): If you have files from multiple vendors in the same file directory, the match field is the field in the marc record that will be checked to see if the file should be processed by this account.
    +
  • +
  • + + +
    (Optional): This is the value that will be checked against the match field to see if the file matches this account. If it does it will be processed by this account, if not it will be skipped.
    +
  • diff --git a/misc/cronjobs/marc_ordering_process.pl b/misc/cronjobs/marc_ordering_process.pl index c1a740401e3..0ab28c4a1d3 100644 --- a/misc/cronjobs/marc_ordering_process.pl +++ b/misc/cronjobs/marc_ordering_process.pl @@ -106,14 +106,18 @@ =head1 OPTIONS foreach my $filename ( @files ) { say sprintf "Creating order lines from file %s", $filename if $verbose; + my $full_path = "$working_dir/$filename"; + my $args = { + filename => $filename, + filepath => $full_path, + profile => $acct, + agent => 'cron' + }; + if($acct->match_field && $acct->match_value) { + my $file_match = Koha::MarcOrder->match_file_to_account($args); + next if !$file_match; + } if($confirm) { - my $full_path = "$working_dir/$filename"; - my $args = { - filename => $filename, - filepath => $full_path, - profile => $acct, - agent => 'cron' - }; my $result = Koha::MarcOrder->create_order_lines_from_file($args); if($result->{success}) { $files_processed++; @@ -125,7 +129,7 @@ =head1 OPTIONS }; } } - say sprintf "%s files processed", $files_processed unless $files_processed == 0; + say sprintf "%s file(s) processed", $files_processed unless $files_processed == 0; print "Moving to next account\n\n"; } print "Process complete\n";