From 9cdaefb98aa42fb7587bda4d8bebaccefe4c4ebb Mon Sep 17 00:00:00 2001 From: Kyle M Hall Date: Wed, 11 Sep 2013 13:04:22 -0400 Subject: [PATCH] Bug 10877 - Add "Order Record" processing Order Record Processing will allow a library to stage an "order record" file which is a standard marc file with some additional information in it about how to create items automatically ( quantity, itemtype, etc ). The location of these fields is defined in the system preference MarcFieldsToOrder from bug 7180. The workflow is thus: 1) A librarian uploads an "order record" file, and marks the batch as an order file during the staging process. 2) The librarian selects an acquisitions basket and chooses "from a staged order file" 3) From here, the librarian can view all the records that will be created, along with quantity and other data ( from bug 7180 ). The librarian will *not* see the item fields, as those are automatically created using the minimum data needed ( branches, itype ). 4) The librarian hits "save" and the items are automatically generated on order. Later ( using features not directly tied to this feature ), the librarian will receive a new marc batch file with items attached ( including itemnumbers ). The vendor will have this information because it was sent via EDI ( bug 7736 ). The librarian will then use the marc record staging feature to overlay those bare bones item records with the full data ( via bug 7131 ). --- C4/ImportBatch.pm | 25 +++++++--- acqui/addorderiso2709.pl | 54 +++++++++++++++++-- installer/data/mysql/kohastructure.sql | 1 + installer/data/mysql/updatedatabase.pl | 7 +++ .../en/includes/acquisitions-add-to-basket.inc | 1 + .../prog/en/modules/acqui/addorderiso2709.tt | 37 +++++++++++--- .../prog/en/modules/tools/stage-marc-import.tt | 4 ++ misc/stage_file.pl | 5 ++- tools/stage-marc-import.pl | 7 ++- 9 files changed, 117 insertions(+), 24 deletions(-) diff --git a/C4/ImportBatch.pm b/C4/ImportBatch.pm index a487cc6..a0e64f5 100644 --- a/C4/ImportBatch.pm +++ b/C4/ImportBatch.pm @@ -206,7 +206,8 @@ sub AddImportBatch { my (@fields, @vals); foreach (qw( matcher_id template_id branchcode overlay_action nomatch_action item_action - import_status batch_type file_name comments record_type )) { + import_status batch_type file_name comments + record_type is_order )) { if (exists $params->{$_}) { push @fields, $_; push @vals, $params->{$_}; @@ -319,7 +320,7 @@ sub ModAuthInBatch { ($batch_id, $num_records, $num_items, @invalid_records) = BatchStageMarcRecords($encoding, $marc_records, $file_name, $marc_modification_template, $comments, $branch_code, $parse_items, - $leave_as_staging, + $leave_as_staging, is_order, $progress_interval, $progress_callback); =cut @@ -334,6 +335,7 @@ sub BatchStageMarcRecords { my $branch_code = shift; my $parse_items = shift; my $leave_as_staging = shift; + my $is_order = shift; # optional callback to monitor status # of job @@ -353,6 +355,7 @@ sub BatchStageMarcRecords { file_name => $file_name, comments => $comments, record_type => $record_type, + is_order => $is_order, } ); if ($parse_items) { SetImportBatchItemAction($batch_id, 'always_add'); @@ -953,21 +956,29 @@ sub GetStagedWebserviceBatches { =head2 GetImportBatchRangeDesc - my $results = GetImportBatchRangeDesc($offset, $results_per_group); + my $results = GetImportBatchRangeDesc($offset, $results_per_group, $is_order); Returns a reference to an array of hash references corresponding to import_batches rows (sorted in descending order by import_batch_id) start at the given offset. +Pass in $is_order = 1 to get only batches marked as order records + =cut sub GetImportBatchRangeDesc { - my ($offset, $results_per_group) = @_; + my ($offset, $results_per_group,$is_order) = @_; + + my $is_order_limit = $is_order ? "AND is_order = 1" : q{}; my $dbh = C4::Context->dbh; - my $query = "SELECT * FROM import_batches - WHERE batch_type IN ('batch', 'webservice') - ORDER BY import_batch_id DESC"; + my $query = " + SELECT * FROM import_batches + WHERE batch_type IN ('batch', 'webservice') + $is_order_limit + ORDER BY import_batch_id DESC + "; + my @params; if ($results_per_group){ $query .= " LIMIT ?"; diff --git a/acqui/addorderiso2709.pl b/acqui/addorderiso2709.pl index 91c0a4c..899b265 100755 --- a/acqui/addorderiso2709.pl +++ b/acqui/addorderiso2709.pl @@ -58,12 +58,14 @@ my ($template, $loggedinuser, $cookie, $userflags) = get_template_and_user({ my $cgiparams = $input->Vars; my $op = $cgiparams->{'op'} || ''; my $booksellerid = $input->param('booksellerid'); +my $is_order = $input->param('is_order'); my $bookseller = GetBookSellerFromId($booksellerid); my $data; $template->param(scriptname => "/cgi-bin/koha/acqui/addorderiso2709.pl", booksellerid => $booksellerid, booksellername => $bookseller->{name}, + is_order => $is_order, ); if ($cgiparams->{'import_batch_id'} && $op eq ""){ @@ -81,7 +83,7 @@ if (! $cgiparams->{'basketno'}){ if ($op eq ""){ $template->param("basketno" => $cgiparams->{'basketno'}); #display batches - import_batches_list($template); + import_batches_list( $template, $is_order ); # # 2nd step = display the content of the choosen file # @@ -268,6 +270,35 @@ if ($op eq ""){ my @serials = $input->param('serial'); my @ind_tag = $input->param('ind_tag'); my @indicator = $input->param('indicator'); + + if ($is_order) { + my ( $notforloan_field, $notforloan_subfield ) = + GetMarcFromKohaField('items.notforloan'); + push( @tags, $notforloan_field ); + push( @subfields, $notforloan_subfield ); + push( @field_values, '-1' ); + + my ( $homebranch_field, $homebranch_subfield ) = + GetMarcFromKohaField('items.homebranch'); + push( @tags, $homebranch_field ); + push( @subfields, $homebranch_subfield ); + push( @field_values, C4::Context->userenv->{'branch'} ); + + my ( $holdingbranch_field, $holdingbranch_subfield ) = + GetMarcFromKohaField('items.holdingbranch'); + push( @tags, $holdingbranch_field ); + push( @subfields, $holdingbranch_subfield ); + push( @field_values, C4::Context->userenv->{'branch'} ); + + my $infos = get_infos_syspref($marcrecord, ['itype']); + my ( $itype_field, $itype_subfield ) = + GetMarcFromKohaField('items.itype'); + push( @tags, $itype_field ); + push( @subfields, $itype_subfield ); + push( @field_values, $infos->{itype} ); + warn "ITYPE: " . $infos->{itype}; + } + my $item; push @{ $item->{tags} }, $tags[0]; push @{ $item->{subfields} }, $subfields[0]; @@ -323,8 +354,8 @@ output_html_with_http_headers $input, $cookie, $template->output; sub import_batches_list { - my ($template) = @_; - my $batches = GetImportBatchRangeDesc(); + my ($template, $is_order) = @_; + my $batches = GetImportBatchRangeDesc(undef,undef,$is_order); my @list = (); foreach my $batch (@$batches) { @@ -419,6 +450,8 @@ sub import_biblios_list { item_action => $item_action ); batch_info($template, $batch); + + return \@list; } sub batch_info { @@ -462,8 +495,7 @@ sub add_matcher_list { $template->param(available_matchers => \@matchers); } -sub get_infos_syspref { - my ($record, $field_list) = @_; +sub GetMarcFieldsToOrderAsYAML { my $syspref = C4::Context->preference('MarcFieldsToOrder'); $syspref = "$syspref\n\n"; # YAML is anal on ending \n. Surplus does not hurt my $yaml = eval { @@ -471,8 +503,18 @@ sub get_infos_syspref { }; if ( $@ ) { warn "Unable to parse MarcFieldsToOrder syspref : $@"; - return (); + return; + } else { + return $yaml; } +} + +sub get_infos_syspref { + my ($record, $field_list) = @_; + + my $yaml = GetMarcFieldsToOrderAsYAML; + return unless $yaml; + my $r; for my $field_name ( @$field_list ) { next unless exists $yaml->{$field_name}; diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql index b46dc6a..71134ac 100644 --- a/installer/data/mysql/kohastructure.sql +++ b/installer/data/mysql/kohastructure.sql @@ -1004,6 +1004,7 @@ CREATE TABLE `import_batches` ( -- information about batches of marc records tha `record_type` enum('biblio', 'auth', 'holdings') NOT NULL default 'biblio', -- type of record in the batch `file_name` varchar(100), -- the name of the file uploaded `comments` mediumtext, -- any comments added when the file was uploaded + `is_order` tinyint(1) NOT NULL DEFAULT '0', -- defines if this is an Order Record for processing PRIMARY KEY (`import_batch_id`), KEY `branchcode` (`branchcode`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index c68ba51..baac4b5 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -8560,6 +8560,13 @@ if ( CheckVersion($DBversion) ) { SetVersion($DBversion); } +$DBversion = "3.13.00.XXX"; +if (C4::Context->preference("Version") < TransformToNum($DBversion)) { + $dbh->do("ALTER TABLE import_batches ADD is_order BOOLEAN NOT NULL DEFAULT '0' AFTER comments"); + print "Upgrade to $DBversion done (Bug 10877 - Add 'Order Record' processing)\n"; + SetVersion ($DBversion); + +} =head1 FUNCTIONS =head2 TableExists($table) diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/acquisitions-add-to-basket.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/acquisitions-add-to-basket.inc index 8e2961b..320bb92 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/acquisitions-add-to-basket.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/acquisitions-add-to-basket.inc @@ -18,6 +18,7 @@
  • From an external source
  • From a staged file
  • [% IF ( CAN_user_circulate ) %]
  • From titles with highest hold ratios
  • [% END %] +
  • From a staged order file
  • [% ELSE %]
    diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/addorderiso2709.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/addorderiso2709.tt index 0974e92..ebc75d6 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/addorderiso2709.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/addorderiso2709.tt @@ -138,7 +138,15 @@ return disableUnchecked($(this)); }); + $('#tabs').tabs(); + + [% IF is_order %] + $("#checkAll").click(); + + $("#all_budget_id").hide(); + $('label[for="all_budget_id"]').hide(); + [% END %] }); function disableUnchecked(form){ @@ -166,7 +174,9 @@
    @@ -185,6 +195,12 @@ [% END %] + [% IF is_order %] +

    + Cancel +

    + [% END %] + [% FOREACH biblio IN biblio_list %]
    @@ -261,11 +277,11 @@
    [% END %]
    + [% IF ( items && !is_order ) %]

    Item information

    Import all the checked items in the basket with the following parameters:

    - [% IF ( items ) %]
    Item [% IF ( NoACQframework ) %] @@ -297,8 +313,8 @@
    [% END %] - [% END %]
    + [% END %]

    Import all the checked items in the basket with the following accounting details (used only if no information is filled for the item):

    @@ -308,6 +324,7 @@ + [% UNLESS is_order %]
  • [% IF ( close ) %] Fund: @@ -340,6 +357,7 @@
  • [% END %] + [% END %]
  • @@ -348,6 +366,7 @@
  • + [% UNLESS is_order %]
  • The 2 following fields are available for your own usage. They can be useful for statistical purposes
    @@ -357,14 +376,16 @@
  • + [% END %]
    -
    - Cancel -
    +
    + + Cancel +
    [% ELSE %]
    @@ -403,8 +424,8 @@ [% END %] [% batch_lis.staged_date | $KohaDates with_hours => 1 %] - [% batch_lis.num_records %] - Add orders + [% batch_lis.num_biblios %] + Add orders [% END %] diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/stage-marc-import.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/stage-marc-import.tt index b9b17f5..aaebbd1 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/stage-marc-import.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/stage-marc-import.tt @@ -112,6 +112,10 @@ function CheckForm(f) { +
  • + + +
  • diff --git a/misc/stage_file.pl b/misc/stage_file.pl index 2e15466..a74428c 100755 --- a/misc/stage_file.pl +++ b/misc/stage_file.pl @@ -45,6 +45,7 @@ my $input_file = ""; my $batch_comment = ""; my $want_help = 0; my $no_replace ; +my $is_order = 0; my $item_action = 'always_add'; my $result = GetOptions( @@ -56,6 +57,7 @@ my $result = GetOptions( 'no-replace' => \$no_replace, 'comment:s' => \$batch_comment, 'authorities' => \$authorities, + 'is-order' => \$is_order, 'h|help' => \$want_help ); @@ -101,7 +103,7 @@ sub process_batch { print "... staging MARC records -- please wait\n"; my ($batch_id, $num_valid_records, $num_items, @import_errors) = - BatchStageMarcRecords($record_type, $encoding, $marc_records, $input_file, undef, $batch_comment, '', $add_items, 0, + BatchStageMarcRecords($record_type, $encoding, $marc_records, $input_file, undef, $batch_comment, '', $add_items, 0, $is_order, 100, \&print_progress_and_commit); print "... finished staging MARC records\n"; @@ -198,6 +200,7 @@ Parameters: the record batch; if the comment has spaces in it, surround the comment with quotation marks. + --is-order this file is a bibliographic order file --help or -h show this message. _USAGE_ } diff --git a/tools/stage-marc-import.pl b/tools/stage-marc-import.pl index e9d982d..4275dcc 100755 --- a/tools/stage-marc-import.pl +++ b/tools/stage-marc-import.pl @@ -55,6 +55,7 @@ my $parse_items = $input->param('parse_items'); my $item_action = $input->param('item_action'); my $comments = $input->param('comments'); my $record_type = $input->param('record_type'); +my $is_order = $input->param('is_order') eq 'on'; my $encoding = $input->param('encoding'); my $marc_modification_template = $input->param('marc_modification_template_id'); @@ -132,10 +133,12 @@ if ($completedJobID) { $marcrecord, $filename, $marc_modification_template, $comments, '', $parse_items, - 0, 50, - staging_progress_callback( $job, $dbh ) + 0, $is_order, + 50, staging_progress_callback( $job, $dbh ) ); + $dbh->commit(); + my $num_with_matches = 0; my $checked_matches = 0; my $matcher_failed = 0; -- 1.7.2.5