| Lines 19-24
          package Koha::MarcOrder;
      
      
        Link Here | 
        
          | 19 |  | 19 |  | 
        
          | 20 | use Modern::Perl; | 20 | use Modern::Perl; | 
        
          | 21 | use Try::Tiny qw( catch try ); | 21 | use Try::Tiny qw( catch try ); | 
            
              |  |  | 22 | use Net::FTP; | 
        
          | 22 |  | 23 |  | 
        
          | 23 | use base qw(Koha::Object); | 24 | use base qw(Koha::Object); | 
        
          | 24 |  | 25 |  | 
  
    | Lines 47-53
          use C4::Biblio      qw(
      
      
        Link Here | 
        
          | 47 |     AddBiblio | 48 |     AddBiblio | 
        
          | 48 |     GetMarcFromKohaField | 49 |     GetMarcFromKohaField | 
        
          | 49 |     TransformHtmlToXml | 50 |     TransformHtmlToXml | 
            
              | 50 |     GetMarcQuantity |  |  | 
        
          | 51 | ); | 51 | ); | 
        
          | 52 | use C4::Items   qw( AddItemFromMarc ); | 52 | use C4::Items   qw( AddItemFromMarc ); | 
        
          | 53 | use C4::Budgets qw( GetBudgetByCode ); | 53 | use C4::Budgets qw( GetBudgetByCode ); | 
  
    | Lines 70-75
          Koha::MarcOrder - Koha Marc Order Object class
      
      
        Link Here | 
        
          | 70 |  | 70 |  | 
        
          | 71 | =cut | 71 | =cut | 
        
          | 72 |  | 72 |  | 
            
              |  |  | 73 | =head3 create_order_lines_from_file | 
            
              | 74 |  | 
            
              | 75 |     my $result = Koha::MarcOrder->create_order_lines_from_file($args); | 
            
              | 76 |  | 
            
              | 77 |     Controller for file staging, basket creation and order line creation when using the cronjob in marc_ordering_process.pl | 
            
              | 78 |  | 
            
              | 79 | =cut | 
            
              | 80 |  | 
            
              | 81 | sub create_order_lines_from_file { | 
            
              | 82 |     my ( $self, $args ) = @_; | 
            
              | 83 |  | 
            
              | 84 |     my $filename = $args->{filename}; | 
            
              | 85 |     my $filepath = $args->{filepath}; | 
            
              | 86 |     my $profile  = $args->{profile}; | 
            
              | 87 |     my $agent    = $args->{agent}; | 
            
              | 88 |  | 
            
              | 89 |     my $success; | 
            
              | 90 |     my $error; | 
            
              | 91 |  | 
            
              | 92 |     my $vendor_id = $profile->vendor_id; | 
            
              | 93 |     my $budget_id = $profile->budget_id; | 
            
              | 94 |  | 
            
              | 95 |     my $vendor_record = Koha::Acquisition::Booksellers->find( { id => $vendor_id } ); | 
            
              | 96 |  | 
            
              | 97 |     my $basket_id = _create_basket_for_file( | 
            
              | 98 |         { | 
            
              | 99 |             filename  => $filename, | 
            
              | 100 |             vendor_id => $vendor_id | 
            
              | 101 |         } | 
            
              | 102 |     ); | 
            
              | 103 |  | 
            
              | 104 |     my $format = index( $filename, '.mrc' ) != -1 ? 'ISO2709' : 'MARCXML'; | 
            
              | 105 |     my $params = { | 
            
              | 106 |         record_type    => $profile->record_type, | 
            
              | 107 |         encoding       => $profile->encoding, | 
            
              | 108 |         format         => $format, | 
            
              | 109 |         filepath       => $filepath, | 
            
              | 110 |         filename       => $filename, | 
            
              | 111 |         comments       => undef, | 
            
              | 112 |         parse_items    => $profile->parse_items, | 
            
              | 113 |         matcher_id     => $profile->matcher_id, | 
            
              | 114 |         overlay_action => $profile->overlay_action, | 
            
              | 115 |         nomatch_action => $profile->nomatch_action, | 
            
              | 116 |         item_action    => $profile->item_action, | 
            
              | 117 |     }; | 
            
              | 118 |  | 
            
              | 119 |     try { | 
            
              | 120 |         my $import_batch_id = _stage_file($params); | 
            
              | 121 |  | 
            
              | 122 |         my $import_records = Koha::Import::Records->search( | 
            
              | 123 |             { | 
            
              | 124 |                 import_batch_id => $import_batch_id, | 
            
              | 125 |             } | 
            
              | 126 |         ); | 
            
              | 127 |  | 
            
              | 128 |         while( my $import_record = $import_records->next ){ | 
            
              | 129 |             my $result = add_biblio_from_import_record({ | 
            
              | 130 |                 import_batch_id => $import_batch_id, | 
            
              | 131 |                 import_record   => $import_record, | 
            
              | 132 |                 matcher_id      => $params->{matcher_id}, | 
            
              | 133 |                 overlay_action  => $params->{overlay_action}, | 
            
              | 134 |                 agent           => $agent, | 
            
              | 135 |             }); | 
            
              | 136 |             warn "Duplicates found in $result->{duplicates_in_batch}, record was skipped." if $result->{duplicates_in_batch}; | 
            
              | 137 |             next if $result->{skip}; | 
            
              | 138 |  | 
            
              | 139 |             my $order_line_details = add_items_from_import_record( | 
            
              | 140 |                 { | 
            
              | 141 |                     record_result => $result->{record_result}, | 
            
              | 142 |                     basket_id     => $basket_id, | 
            
              | 143 |                     vendor        => $vendor_record, | 
            
              | 144 |                     budget_id     => $budget_id, | 
            
              | 145 |                     agent         => $agent, | 
            
              | 146 |                 } | 
            
              | 147 |             ); | 
            
              | 148 |         } | 
            
              | 149 |         SetImportBatchStatus( $import_batch_id, 'imported' ) | 
            
              | 150 |             if Koha::Import::Records->search( { import_batch_id => $import_batch_id, status => 'imported' } )->count == | 
            
              | 151 |             Koha::Import::Records->search( { import_batch_id => $import_batch_id } )->count; | 
            
              | 152 |  | 
            
              | 153 |         $success = 1; | 
            
              | 154 |     } catch { | 
            
              | 155 |         $success = 0; | 
            
              | 156 |         $error   = $_; | 
            
              | 157 |     }; | 
            
              | 158 |  | 
            
              | 159 |     return $success ? { success => 1, error => '' } : { success => 0, error => $error }; | 
            
              | 160 | } | 
            
              | 161 |  | 
        
          | 73 | =head3 import_record_and_create_order_lines | 162 | =head3 import_record_and_create_order_lines | 
        
          | 74 |  | 163 |  | 
        
          | 75 |     my $result = Koha::MarcOrder->import_record_and_create_order_lines($args); | 164 |     my $result = Koha::MarcOrder->import_record_and_create_order_lines($args); | 
  
    | Lines 82-88
          sub import_record_and_create_order_lines {
      
      
        Link Here | 
        
          | 82 |     my ( $self, $args ) = @_; | 171 |     my ( $self, $args ) = @_; | 
        
          | 83 |  | 172 |  | 
        
          | 84 |     my $import_batch_id           = $args->{import_batch_id}; | 173 |     my $import_batch_id           = $args->{import_batch_id}; | 
          
            
              | 85 |     my $import_record_id_selected = $args->{import_record_id_selected} || (); | 174 |     my @import_record_id_selected = $args->{import_record_id_selected} || (); | 
        
          | 86 |     my $matcher_id                = $args->{matcher_id}; | 175 |     my $matcher_id                = $args->{matcher_id}; | 
        
          | 87 |     my $overlay_action            = $args->{overlay_action}; | 176 |     my $overlay_action            = $args->{overlay_action}; | 
        
          | 88 |     my $import_record             = $args->{import_record}; | 177 |     my $import_record             = $args->{import_record}; | 
  
    | Lines 125-130
          sub import_record_and_create_order_lines {
      
      
        Link Here | 
        
          | 125 |     }; | 214 |     }; | 
        
          | 126 | } | 215 | } | 
        
          | 127 |  | 216 |  | 
            
              |  |  | 217 | =head3 _create_basket_for_file | 
            
              | 218 |  | 
            
              | 219 |     my $basket_id = _create_basket_for_file({ | 
            
              | 220 |         filename  => $filename, | 
            
              | 221 |         vendor_id => $vendor_id | 
            
              | 222 |     }); | 
            
              | 223 |  | 
            
              | 224 |     Creates a basket ready to receive order lines based on the imported file | 
            
              | 225 |  | 
            
              | 226 | =cut | 
            
              | 227 |  | 
            
              | 228 | sub _create_basket_for_file { | 
            
              | 229 |     my ($args) = @_; | 
            
              | 230 |  | 
            
              | 231 |     my $filename  = $args->{filename}; | 
            
              | 232 |     my $vendor_id = $args->{vendor_id}; | 
            
              | 233 |  | 
            
              | 234 |     # aqbasketname.basketname has a max length of 50 characters so long file names will need to be truncated | 
            
              | 235 |     my $basketname = length($filename) > 50 ? substr( $filename, 0, 50 ) : $filename; | 
            
              | 236 |  | 
            
              | 237 |     my $basketno = NewBasket( | 
            
              | 238 |         $vendor_id, 0, $basketname, q{}, | 
            
              | 239 |         q{} . q{} | 
            
              | 240 |     ); | 
            
              | 241 |  | 
            
              | 242 |     return $basketno; | 
            
              | 243 | } | 
            
              | 244 |  | 
            
              | 245 | =head3 _stage_file | 
            
              | 246 |  | 
            
              | 247 |     $file->_stage_file($params) | 
            
              | 248 |  | 
            
              | 249 |     Stages a file directly using parameters from a marc ordering account and without using the background job | 
            
              | 250 |     This function is a mirror of Koha::BackgroundJob::StageMARCForImport->process but with the background job functionality removed | 
            
              | 251 |  | 
            
              | 252 | =cut | 
            
              | 253 |  | 
            
              | 254 | sub _stage_file { | 
            
              | 255 |     my ($args) = @_; | 
            
              | 256 |  | 
            
              | 257 |     my $record_type                = $args->{record_type}; | 
            
              | 258 |     my $encoding                   = $args->{encoding}; | 
            
              | 259 |     my $format                     = $args->{format}; | 
            
              | 260 |     my $filepath                   = $args->{filepath}; | 
            
              | 261 |     my $filename                   = $args->{filename}; | 
            
              | 262 |     my $marc_modification_template = $args->{marc_modification_template}; | 
            
              | 263 |     my $comments                   = $args->{comments}; | 
            
              | 264 |     my $parse_items                = $args->{parse_items}; | 
            
              | 265 |     my $matcher_id                 = $args->{matcher_id}; | 
            
              | 266 |     my $overlay_action             = $args->{overlay_action}; | 
            
              | 267 |     my $nomatch_action             = $args->{nomatch_action}; | 
            
              | 268 |     my $item_action                = $args->{item_action}; | 
            
              | 269 |  | 
            
              | 270 |     my ( $batch_id, $num_valid, $num_items, @import_errors ); | 
            
              | 271 |     my $num_with_matches = 0; | 
            
              | 272 |     my $checked_matches  = 0; | 
            
              | 273 |     my $matcher_failed   = 0; | 
            
              | 274 |     my $matcher_code     = ""; | 
            
              | 275 |  | 
            
              | 276 |     my $schema = Koha::Database->new->schema; | 
            
              | 277 |     try { | 
            
              | 278 |         $schema->storage->txn_begin; | 
            
              | 279 |  | 
            
              | 280 |         my ( $errors, $marcrecords ); | 
            
              | 281 |         if ( $format eq 'MARCXML' ) { | 
            
              | 282 |             ( $errors, $marcrecords ) = C4::ImportBatch::RecordsFromMARCXMLFile( $filepath, $encoding ); | 
            
              | 283 |         } elsif ( $format eq 'ISO2709' ) { | 
            
              | 284 |             ( $errors, $marcrecords ) = C4::ImportBatch::RecordsFromISO2709File( | 
            
              | 285 |                 $filepath, $record_type, | 
            
              | 286 |                 $encoding | 
            
              | 287 |             ); | 
            
              | 288 |         } else {    # plugin based | 
            
              | 289 |             $errors      = []; | 
            
              | 290 |             $marcrecords = C4::ImportBatch::RecordsFromMarcPlugin( | 
            
              | 291 |                 $filepath, $format, | 
            
              | 292 |                 $encoding | 
            
              | 293 |             ); | 
            
              | 294 |         } | 
            
              | 295 |  | 
            
              | 296 |         ( $batch_id, $num_valid, $num_items, @import_errors ) = BatchStageMarcRecords( | 
            
              | 297 |             $record_type,                $encoding, | 
            
              | 298 |             $marcrecords,                $filename, | 
            
              | 299 |             $marc_modification_template, $comments, | 
            
              | 300 |             '',                          $parse_items, | 
            
              | 301 |             0 | 
            
              | 302 |         ); | 
            
              | 303 |  | 
            
              | 304 |         if ($matcher_id) { | 
            
              | 305 |             my $matcher = C4::Matcher->fetch($matcher_id); | 
            
              | 306 |             if ( defined $matcher ) { | 
            
              | 307 |                 $checked_matches  = 1; | 
            
              | 308 |                 $matcher_code     = $matcher->code(); | 
            
              | 309 |                 $num_with_matches = BatchFindDuplicates( $batch_id, $matcher, 10 ); | 
            
              | 310 |                 SetImportBatchMatcher( $batch_id, $matcher_id ); | 
            
              | 311 |                 SetImportBatchOverlayAction( $batch_id, $overlay_action ); | 
            
              | 312 |                 SetImportBatchNoMatchAction( $batch_id, $nomatch_action ); | 
            
              | 313 |                 SetImportBatchItemAction( $batch_id, $item_action ); | 
            
              | 314 |                 $schema->storage->txn_commit; | 
            
              | 315 |             } else { | 
            
              | 316 |                 $matcher_failed = 1; | 
            
              | 317 |                 $schema->storage->txn_rollback; | 
            
              | 318 |             } | 
            
              | 319 |         } else { | 
            
              | 320 |             $schema->storage->txn_commit; | 
            
              | 321 |         } | 
            
              | 322 |  | 
            
              | 323 |         return $batch_id; | 
            
              | 324 |     } catch { | 
            
              | 325 |         warn $_; | 
            
              | 326 |         $schema->storage->txn_rollback; | 
            
              | 327 |         die "Something terrible has happened!" | 
            
              | 328 |             if ( $_ =~ /Rollback failed/ );    # TODO Check test: Rollback failed | 
            
              | 329 |     }; | 
            
              | 330 | } | 
            
              | 331 |  | 
        
          | 128 | =head3 _get_syspref_mappings | 332 | =head3 _get_syspref_mappings | 
        
          | 129 |  | 333 |  | 
        
          | 130 |     my $syspref_info = _get_syspref_mappings( $marcrecord, $syspref_name ); | 334 |     my $syspref_info = _get_syspref_mappings( $marcrecord, $syspref_name ); | 
  
    | Lines 234-240
          sub add_biblio_from_import_record {
      
      
        Link Here | 
        
          | 234 |     my ($args) = @_; | 438 |     my ($args) = @_; | 
        
          | 235 |  | 439 |  | 
        
          | 236 |     my $import_batch_id           = $args->{import_batch_id}; | 440 |     my $import_batch_id           = $args->{import_batch_id}; | 
          
            
              | 237 |     my $import_record_id_selected = $args->{import_record_id_selected} || (); | 441 |     my @import_record_id_selected = $args->{import_record_id_selected} || (); | 
        
          | 238 |     my $matcher_id                = $args->{matcher_id}; | 442 |     my $matcher_id                = $args->{matcher_id}; | 
        
          | 239 |     my $overlay_action            = $args->{overlay_action}; | 443 |     my $overlay_action            = $args->{overlay_action}; | 
        
          | 240 |     my $import_record             = $args->{import_record}; | 444 |     my $import_record             = $args->{import_record}; | 
  
    | Lines 247-253
          sub add_biblio_from_import_record {
      
      
        Link Here | 
        
          | 247 |             record_result       => 0, | 451 |             record_result       => 0, | 
        
          | 248 |             duplicates_in_batch => 0, | 452 |             duplicates_in_batch => 0, | 
        
          | 249 |             skip                => 1 | 453 |             skip                => 1 | 
          
            
              | 250 |         } if not grep { $_ eq $import_record->import_record_id } @{$import_record_id_selected}; | 454 |         } if not grep { $_ eq $import_record->import_record_id } @import_record_id_selected; | 
        
          | 251 |     } | 455 |     } | 
        
          | 252 |  | 456 |  | 
        
          | 253 |     my $marcrecord   = $import_record->get_marc_record || die "Couldn't translate marc information"; | 457 |     my $marcrecord   = $import_record->get_marc_record || die "Couldn't translate marc information"; | 
  
    | Lines 333-361
          sub add_items_from_import_record {
      
      
        Link Here | 
        
          | 333 |         my $marc_fields_to_order      = _get_syspref_mappings( $marcrecord, 'MarcFieldsToOrder' ); | 537 |         my $marc_fields_to_order      = _get_syspref_mappings( $marcrecord, 'MarcFieldsToOrder' ); | 
        
          | 334 |         my $marc_item_fields_to_order = _get_syspref_mappings( $marcrecord, 'MarcItemFieldsToOrder' ); | 538 |         my $marc_item_fields_to_order = _get_syspref_mappings( $marcrecord, 'MarcItemFieldsToOrder' ); | 
        
          | 335 |  | 539 |  | 
          
            
              | 336 |         my $item_fields = { | 540 |         my $item_fields = _create_item_fields_from_syspref( | 
            
              | 337 |             homebranch       => $marc_item_fields_to_order->{homebranch}, | 541 |             { | 
            
              | 338 |             holdingbranch    => $marc_item_fields_to_order->{holdingbranch}, | 542 |                 marc_fields_to_order      => $marc_fields_to_order, | 
            
              | 339 |             itype            => $marc_item_fields_to_order->{itype}, | 543 |                 marc_item_fields_to_order => $marc_item_fields_to_order, | 
            
              | 340 |             nonpublic_note   => $marc_item_fields_to_order->{nonpublic_note}, | 544 |                 budget_id                 => $budget_id | 
            
              | 341 |             public_note      => $marc_item_fields_to_order->{public_note}, | 545 |             } | 
            
              | 342 |             loc              => $marc_item_fields_to_order->{loc}, | 546 |         ); | 
            
              | 343 |             ccode            => $marc_item_fields_to_order->{ccode}, |  |  | 
            
              | 344 |             notforloan       => $marc_item_fields_to_order->{notforloan}, | 
            
              | 345 |             uri              => $marc_item_fields_to_order->{uri}, | 
            
              | 346 |             copyno           => $marc_item_fields_to_order->{copyno}, | 
            
              | 347 |             quantity         => $marc_item_fields_to_order->{quantity}, | 
            
              | 348 |             price            => $marc_item_fields_to_order->{price}, | 
            
              | 349 |             replacementprice => $marc_item_fields_to_order->{replacementprice}, | 
            
              | 350 |             itemcallnumber   => $marc_item_fields_to_order->{itemcallnumber}, | 
            
              | 351 |             budget_code      => $marc_item_fields_to_order->{budget_code}, | 
            
              | 352 |             c_quantity       => $marc_fields_to_order->{quantity}, | 
            
              | 353 |             c_budget_code    => $marc_fields_to_order->{budget_code}, | 
            
              | 354 |             c_price          => $marc_fields_to_order->{price}, | 
            
              | 355 |             c_discount       => $marc_fields_to_order->{discount}, | 
            
              | 356 |             c_sort1          => $marc_fields_to_order->{sort1}, | 
            
              | 357 |             c_sort2          => $marc_fields_to_order->{sort2}, | 
            
              | 358 |         }; | 
        
          | 359 |  | 547 |  | 
        
          | 360 |         my $order_line_fields = parse_input_into_order_line_fields( | 548 |         my $order_line_fields = parse_input_into_order_line_fields( | 
        
          | 361 |             { | 549 |             { | 
  
    | Lines 405-410
          sub add_items_from_import_record {
      
      
        Link Here | 
        
          | 405 |     } | 593 |     } | 
        
          | 406 | } | 594 | } | 
        
          | 407 |  | 595 |  | 
            
              |  |  | 596 |  | 
        
          | 408 | =head3 import_batches_list | 597 | =head3 import_batches_list | 
        
          | 409 |  | 598 |  | 
        
          | 410 | Fetches import batches matching the batch to be added to the basket and returns these to the template | 599 | Fetches import batches matching the batch to be added to the basket and returns these to the template | 
  
    | Lines 668-674
          my $order_line_fields = parse_input_into_order_line_fields(
      
      
        Link Here | 
        
          | 668 |     } | 857 |     } | 
        
          | 669 | ); | 858 | ); | 
        
          | 670 |  | 859 |  | 
            
              | 671 |  |  |  | 
        
          | 672 | =cut | 860 | =cut | 
        
          | 673 |  | 861 |  | 
        
          | 674 | sub parse_input_into_order_line_fields { | 862 | sub parse_input_into_order_line_fields { | 
  
    | Lines 682-729
          sub parse_input_into_order_line_fields {
      
      
        Link Here | 
        
          | 682 |     my $fields       = $args->{fields}; | 870 |     my $fields       = $args->{fields}; | 
        
          | 683 |     my $marcrecord   = $args->{marcrecord}; | 871 |     my $marcrecord   = $args->{marcrecord}; | 
        
          | 684 |  | 872 |  | 
          
            
              | 685 |     my $quantity        = $fields->{quantity} || 1; | 873 |     my $quantity          = $fields->{quantity} || 1; | 
            
              | 686 |     my @homebranches    = $client ? @{ $fields->{homebranches} }    : ( ( $fields->{homebranch} ) x $quantity ); | 874 |     my @homebranches      = $fields->{homebranches}      ? @{ $fields->{homebranches} }      : (); | 
            
              | 687 |     my @holdingbranches = $client ? @{ $fields->{holdingbranches} } : ( ( $fields->{holdingbranch} ) x $quantity ); | 875 |     my @holdingbranches   = $fields->{holdingbranches}   ? @{ $fields->{holdingbranches} }   : (); | 
            
              | 688 |     my @itypes          = $client ? @{ $fields->{itypes} }          : ( ( $fields->{itype} ) x $quantity ); | 876 |     my @itypes            = $fields->{itypes}            ? @{ $fields->{itypes} }            : (); | 
            
              | 689 |     my @nonpublic_notes = $client ? @{ $fields->{nonpublic_notes} } : ( ( $fields->{nonpublic_note} ) x $quantity ); | 877 |     my @nonpublic_notes   = $fields->{nonpublic_notes}   ? @{ $fields->{nonpublic_notes} }   : (); | 
            
              | 690 |     my @public_notes    = $client ? @{ $fields->{public_notes} }    : ( ( $fields->{public_note} ) x $quantity ); | 878 |     my @public_notes      = $fields->{public_notes}      ? @{ $fields->{public_notes} }      : (); | 
            
              | 691 |     my @locs            = $client ? @{ $fields->{locs} }            : ( ( $fields->{loc} ) x $quantity ); | 879 |     my @locs              = $fields->{locs}              ? @{ $fields->{locs} }              : (); | 
            
              | 692 |     my @ccodes          = $client ? @{ $fields->{ccodes} }          : ( ( $fields->{ccode} ) x $quantity ); | 880 |     my @ccodes            = $fields->{ccodes}            ? @{ $fields->{ccodes} }            : (); | 
            
              | 693 |     my @notforloans     = $client ? @{ $fields->{notforloans} }     : ( ( $fields->{notforloan} ) x $quantity ); | 881 |     my @notforloans       = $fields->{notforloans}       ? @{ $fields->{notforloans} }       : (); | 
            
              | 694 |     my @uris            = $client ? @{ $fields->{uris} }            : ( ( $fields->{uri} ) x $quantity ); | 882 |     my @uris              = $fields->{uris}              ? @{ $fields->{uris} }              : (); | 
            
              | 695 |     my @copynos         = $client ? @{ $fields->{copynos} }         : ( ( $fields->{copyno} ) x $quantity ); | 883 |     my @copynos           = $fields->{copynos}           ? @{ $fields->{copynos} }           : (); | 
            
              | 696 |     my @itemprices      = $client ? @{ $fields->{itemprices} }      : ( ( $fields->{price} ) x $quantity ); | 884 |     my @itemprices        = $fields->{itemprices}        ? @{ $fields->{itemprices} }        : (); | 
            
              | 697 |     my @replacementprices = | 885 |     my @replacementprices = $fields->{replacementprices} ? @{ $fields->{replacementprices} } : (); | 
            
              | 698 |         $client ? @{ $fields->{replacementprices} } : ( ( $fields->{replacementprice} ) x $quantity ); | 886 |     my @itemcallnumbers   = $fields->{itemcallnumbers}   ? @{ $fields->{itemcallnumbers} }   : (); | 
            
              | 699 |     my @itemcallnumbers = $client ? @{ $fields->{itemcallnumbers} } : ( ( $fields->{itemcallnumber} ) x $quantity ); |  |  | 
        
          | 700 |     my @coded_location_qualifiers = | 887 |     my @coded_location_qualifiers = | 
          
            
              | 701 |         $client ? @{ $fields->{coded_location_qualifiers} } : ( ( $fields->{coded_location_qualifier} ) x $quantity ); | 888 |         $fields->{coded_location_qualifiers} ? @{ $fields->{coded_location_qualifiers} } : (); | 
            
              | 702 |     my @barcodes            = $client ? @{ $fields->{barcodes} }       : ( ( $fields->{barcode} ) x $quantity ); | 889 |     my @barcodes            = $fields->{barcodes}     ? @{ $fields->{barcodes} }     : (); | 
            
              | 703 |     my @enumchrons          = $client ? @{ $fields->{enumchrons} }     : ( ( $fields->{enumchron} ) x $quantity ); | 890 |     my @enumchrons          = $fields->{enumchrons}   ? @{ $fields->{enumchrons} }   : (); | 
            
              | 704 |     my $c_quantity          = $client ? $fields->{c_quantity}          : $fields->{c_quantity}; | 891 |     my @budget_codes        = $fields->{budget_codes} ? @{ $fields->{budget_codes} } : (); | 
            
              | 705 |     my $c_budget_id         = $client ? $fields->{c_budget_id}         : $fields->{c_budget_id}; | 892 |     my $c_quantity          = $fields->{c_quantity}; | 
            
              | 706 |     my $c_discount          = $client ? $fields->{c_discount}          : $fields->{c_discount}; | 893 |     my $c_budget_id         = $fields->{c_budget_id}; | 
            
              | 707 |     my $c_sort1             = $client ? $fields->{c_sort1}             : $fields->{c_sort1}; | 894 |     my $c_discount          = $fields->{c_discount}; | 
            
              | 708 |     my $c_sort2             = $client ? $fields->{c_sort2}             : $fields->{c_sort2}; | 895 |     my $c_sort1             = $fields->{c_sort1}; | 
            
              | 709 |     my $c_replacement_price = $client ? $fields->{c_replacement_price} : $fields->{c_replacement_price}; | 896 |     my $c_sort2             = $fields->{c_sort2}; | 
            
              | 710 |     my $c_price             = $client ? $fields->{c_price}             : $fields->{c_price}; | 897 |     my $c_replacement_price = $fields->{c_replacement_price}; | 
            
              |  |  | 898 |     my $c_price             = $fields->{c_price}; | 
        
          | 711 |  | 899 |  | 
        
          | 712 |     # If using the cronjob, we want to default to the account budget if not mapped on the record | 900 |     # If using the cronjob, we want to default to the account budget if not mapped on the record | 
          
            
              | 713 |     my $item_budget_id; | 901 |     if ( !$client && ( !@budget_codes || scalar(@budget_codes) == 0 ) ) { | 
            
              | 714 |     if ( !$client && ( $fields->{budget_code} || $fields->{c_budget_code} ) ) { | 902 |         for ( 1 .. $quantity ) { | 
            
              | 715 |         my $budget_code = $fields->{budget_code} || $fields->{c_budget_code}; | 903 |             my $item_budget = GetBudgetByCode($c_budget_id); | 
            
              | 716 |         my $item_budget = GetBudgetByCode($budget_code); | 904 |             if ($item_budget) { | 
            
              | 717 |         if ($item_budget) { | 905 |                 push( @budget_codes, $item_budget ); | 
            
              | 718 |             $item_budget_id = $item_budget->{budget_id}; | 906 |             } else { | 
            
              | 719 |         } else { | 907 |                 push( @budget_codes, $budget_id ); | 
            
              | 720 |             $item_budget_id = $budget_id; | 908 |             } | 
        
          | 721 |         } | 909 |         } | 
            
              | 722 |     } else { |  |  | 
            
              | 723 |         $item_budget_id = $budget_id; | 
        
          | 724 |     } | 910 |     } | 
          
            
              | 725 |     my @budget_codes = $client ? @{ $fields->{budget_codes} } : ($item_budget_id); | 911 |     my $loop_limit = $quantity; | 
            
              | 726 |     my $loop_limit   = $client ? scalar(@homebranches)        : $quantity; |  |  | 
        
          | 727 |  | 912 |  | 
        
          | 728 |     my $order_line_fields = { | 913 |     my $order_line_fields = { | 
        
          | 729 |         biblionumber             => $biblionumber, | 914 |         biblionumber             => $biblionumber, | 
  
    | Lines 959-962
          sub _format_price_to_CurrencyFormat_syspref {
      
      
        Link Here | 
        
          | 959 |     return $price; | 1144 |     return $price; | 
        
          | 960 | } | 1145 | } | 
        
          | 961 |  | 1146 |  | 
            
              |  |  | 1147 | =head3 _create_item_fields_from_syspref | 
            
              | 1148 |  | 
            
              | 1149 | Takes the two sysprefs and returns the item fields required to process and create orderlines | 
            
              | 1150 |  | 
            
              | 1151 | my $item_fields = _create_item_fields_from_syspref( | 
            
              | 1152 |     { | 
            
              | 1153 |         marc_fields_to_order      => $marc_fields_to_order, | 
            
              | 1154 |         marc_item_fields_to_order => $marc_item_fields_to_order | 
            
              | 1155 |     } | 
            
              | 1156 | ); | 
            
              | 1157 |  | 
            
              | 1158 | =cut | 
            
              | 1159 |  | 
            
              | 1160 | sub _create_item_fields_from_syspref { | 
            
              | 1161 |     my ($args) = @_; | 
            
              | 1162 |  | 
            
              | 1163 |     my $marc_item_fields_to_order = $args->{marc_item_fields_to_order}; | 
            
              | 1164 |     my $marc_fields_to_order      = $args->{marc_fields_to_order}; | 
            
              | 1165 |     my $budget_id                 = $args->{budget_id}; | 
            
              | 1166 |  | 
            
              | 1167 |     my @homebranches      = (); | 
            
              | 1168 |     my @holdingbranches   = (); | 
            
              | 1169 |     my @itypes            = (); | 
            
              | 1170 |     my @nonpublic_notes   = (); | 
            
              | 1171 |     my @public_notes      = (); | 
            
              | 1172 |     my @locs              = (); | 
            
              | 1173 |     my @ccodes            = (); | 
            
              | 1174 |     my @notforloans       = (); | 
            
              | 1175 |     my @uris              = (); | 
            
              | 1176 |     my @copynos           = (); | 
            
              | 1177 |     my @budget_codes      = (); | 
            
              | 1178 |     my @itemprices        = (); | 
            
              | 1179 |     my @replacementprices = (); | 
            
              | 1180 |     my @itemcallnumbers   = (); | 
            
              | 1181 |  | 
            
              | 1182 |     foreach my $infoset (@$marc_item_fields_to_order) { | 
            
              | 1183 |         my $quantity = $infoset->{quantity} || 1; | 
            
              | 1184 |         for ( my $i = 0 ; $i < $quantity ; $i++ ) { | 
            
              | 1185 |             my $budget_code; | 
            
              | 1186 |             if ( !$infoset->{budget_code} ) { | 
            
              | 1187 |                 if ( $marc_fields_to_order->{budget_code} ) { | 
            
              | 1188 |                     $budget_code = $marc_fields_to_order->{budget_code}; | 
            
              | 1189 |                 } | 
            
              | 1190 |             } else { | 
            
              | 1191 |                 $budget_code = $infoset->{budget_code}; | 
            
              | 1192 |             } | 
            
              | 1193 |  | 
            
              | 1194 |             my $item_budget_id; | 
            
              | 1195 |             my $item_budget = GetBudgetByCode($budget_code); | 
            
              | 1196 |             if ($item_budget) { | 
            
              | 1197 |                 $item_budget_id = $item_budget->{budget_id}; | 
            
              | 1198 |             } else { | 
            
              | 1199 |                 $item_budget_id = $budget_id; | 
            
              | 1200 |             } | 
            
              | 1201 |  | 
            
              | 1202 |             push @homebranches,      $infoset->{homebranch}; | 
            
              | 1203 |             push @holdingbranches,   $infoset->{holdingbranch}; | 
            
              | 1204 |             push @itypes,            $infoset->{itype}; | 
            
              | 1205 |             push @nonpublic_notes,   $infoset->{nonpublic_note}; | 
            
              | 1206 |             push @public_notes,      $infoset->{public_note}; | 
            
              | 1207 |             push @locs,              $infoset->{loc}; | 
            
              | 1208 |             push @ccodes,            $infoset->{ccode}; | 
            
              | 1209 |             push @notforloans,       $infoset->{notforloan}; | 
            
              | 1210 |             push @uris,              $infoset->{uri}; | 
            
              | 1211 |             push @copynos,           $infoset->{copyno}; | 
            
              | 1212 |             push @budget_codes,      $item_budget_id; | 
            
              | 1213 |             push @itemprices,        $infoset->{price}; | 
            
              | 1214 |             push @replacementprices, $infoset->{replacementprice}; | 
            
              | 1215 |             push @itemcallnumbers,   $infoset->{itemcallnumber}; | 
            
              | 1216 |         } | 
            
              | 1217 |     } | 
            
              | 1218 |  | 
            
              | 1219 |     my $item_fields = { | 
            
              | 1220 |         quantity          => scalar(@homebranches), | 
            
              | 1221 |         homebranches      => \@homebranches, | 
            
              | 1222 |         holdingbranches   => \@holdingbranches, | 
            
              | 1223 |         itypes            => \@itypes, | 
            
              | 1224 |         nonpublic_notes   => \@nonpublic_notes, | 
            
              | 1225 |         public_notes      => \@public_notes, | 
            
              | 1226 |         locs              => \@locs, | 
            
              | 1227 |         ccodes            => \@ccodes, | 
            
              | 1228 |         notforloans       => \@notforloans, | 
            
              | 1229 |         uris              => \@uris, | 
            
              | 1230 |         copynos           => \@copynos, | 
            
              | 1231 |         budget_codes      => \@budget_codes, | 
            
              | 1232 |         itemprices        => \@itemprices, | 
            
              | 1233 |         replacementprices => \@replacementprices, | 
            
              | 1234 |         itemcallnumbers   => \@itemcallnumbers, | 
            
              | 1235 |         c_quantity        => $marc_fields_to_order->{quantity}, | 
            
              | 1236 |         c_budget_code     => $marc_fields_to_order->{budget_code}, | 
            
              | 1237 |         c_price           => $marc_fields_to_order->{price}, | 
            
              | 1238 |         c_discount        => $marc_fields_to_order->{discount}, | 
            
              | 1239 |         c_sort1           => $marc_fields_to_order->{sort1}, | 
            
              | 1240 |         c_sort2           => $marc_fields_to_order->{sort2}, | 
            
              | 1241 |     }; | 
            
              | 1242 |  | 
            
              | 1243 |     return $item_fields; | 
            
              | 1244 | } | 
            
              | 1245 |  | 
        
          | 962 | 1; | 1246 | 1; |