Skip to content

Commit

Permalink
Add match_field and match_value to allow multiple accounts in the sam…
Browse files Browse the repository at this point in the history
…e file directory
  • Loading branch information
mblenk committed Sep 7, 2023
1 parent d750d4a commit c8f96b0
Show file tree
Hide file tree
Showing 7 changed files with 104 additions and 16 deletions.
46 changes: 46 additions & 0 deletions Koha/MarcOrder.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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;
24 changes: 22 additions & 2 deletions Koha/Schema/Result/MarcOrderAccount.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions admin/marc_order_accounts.pl
Original file line number Diff line number Diff line change
Expand Up @@ -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')) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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',
Expand All @@ -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 {
Expand Down
2 changes: 2 additions & 0 deletions installer/data/mysql/kohastructure.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,16 @@ MARC Order Accounts
<input type="text" name="download_directory" id="download_directory" size="20" value="[% account.download_directory | html %]" />
<div class="hint">The download directory specifies the directory in your koha installation that should be searched for new files.</div>
</li>
<li>
<label for="match_field">Match field: </label>
<input type="text" name="match_field" id="match_field" size="20" value="[% account.match_field | html %]" />
<div class="hint">(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.</div>
</li>
<li>
<label for="match_value">Match value: </label>
<input type="text" name="match_value" id="match_value" size="20" value="[% account.match_value | html %]" />
<div class="hint">(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.</div>
</li>
</ol>
</fieldset>
<fieldset class="rows">
Expand Down
20 changes: 12 additions & 8 deletions misc/cronjobs/marc_ordering_process.pl
Original file line number Diff line number Diff line change
Expand Up @@ -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++;
Expand All @@ -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";
Expand Down

0 comments on commit c8f96b0

Please sign in to comment.