View | Details | Raw Unified | Return to bug 20253
Collapse All | Expand All

(-)a/Koha/Edifact/Order.pm (+25 lines)
Lines 73-78 sub new { Link Here
73
    $self->{schema} = $database->schema;
73
    $self->{schema} = $database->schema;
74
74
75
    bless $self, $class;
75
    bless $self, $class;
76
77
    # Extract purchase order number for RFF+ON segment (after blessing)
78
    $self->{purchase_order_number} = $self->_get_purchase_order_number();
79
76
    return $self;
80
    return $self;
77
}
81
}
78
82
Lines 283-288 sub order_msg_header { Link Here
283
        $self->{recipient}->id_code_qualifier
287
        $self->{recipient}->id_code_qualifier
284
        );
288
        );
285
289
290
    # RFF Purchase order number (if configured)
291
    if ( $self->{purchase_order_number} ) {
292
        push @header, "RFF+ON:$self->{purchase_order_number}$seg_terminator";
293
    }
294
286
    # repeat for for other relevant parties
295
    # repeat for for other relevant parties
287
296
288
    # CUX currency
297
    # CUX currency
Lines 693-698 sub encode_text { Link Here
693
    return $string;
702
    return $string;
694
}
703
}
695
704
705
sub _get_purchase_order_number {
706
    my $self = shift;
707
708
    # If the vendor EDI account is configured to use purchase order numbers for basket names,
709
    # then the basket name IS the purchase order number
710
    my $vendor_config = $self->{recipient};
711
    if (   $vendor_config
712
        && $vendor_config->basket_name_source
713
        && $vendor_config->basket_name_source eq 'purchase_order_number' )
714
    {
715
        return $self->{basket}->basketname;
716
    }
717
718
    return;
719
}
720
696
1;
721
1;
697
__END__
722
__END__
698
723
(-)a/t/db_dependent/Koha/Edifact/Order.t (-3 / +140 lines)
Lines 20-26 Link Here
20
use Modern::Perl;
20
use Modern::Perl;
21
21
22
use Test::NoWarnings;
22
use Test::NoWarnings;
23
use Test::More tests => 4;
23
use Test::More tests => 5;
24
24
25
use Koha::Edifact::Order;
25
use Koha::Edifact::Order;
26
26
Lines 264-273 subtest 'filename() tests' => sub { Link Here
264
264
265
    my @orders = $schema->resultset('Aqorder')->search( { basketno => $order->basket->basketno } )->all;
265
    my @orders = $schema->resultset('Aqorder')->search( { basketno => $order->basket->basketno } )->all;
266
266
267
    my $dbic_vendor = $schema->resultset('VendorEdiAccount')->find( $vendor->{id} );
268
267
    my $edi_order = Koha::Edifact::Order->new(
269
    my $edi_order = Koha::Edifact::Order->new(
268
        {
270
        {
269
            orderlines => \@orders,
271
            orderlines => \@orders,
270
            vendor     => $vendor,
272
            vendor     => $dbic_vendor,
271
            ean        => $ean
273
            ean        => $ean
272
        }
274
        }
273
    );
275
    );
Lines 280-282 subtest 'filename() tests' => sub { Link Here
280
282
281
    $schema->storage->txn_rollback;
283
    $schema->storage->txn_rollback;
282
};
284
};
283
- 
285
286
subtest 'RFF+ON purchase order number generation' => sub {
287
    plan tests => 3;
288
289
    $schema->storage->txn_begin;
290
291
    # Create vendor with basket_name_source set to purchase_order_number
292
    my $vendor_po = $builder->build(
293
        {
294
            source => 'VendorEdiAccount',
295
            value  => {
296
                description        => 'Test vendor PO mode',
297
                basket_name_source => 'purchase_order_number',
298
                standard           => 'EUR',
299
            }
300
        }
301
    );
302
303
    # Create vendor with basket_name_source set to filename (default)
304
    my $vendor_filename = $builder->build(
305
        {
306
            source => 'VendorEdiAccount',
307
            value  => {
308
                description        => 'Test vendor filename mode',
309
                basket_name_source => 'filename',
310
                standard           => 'EUR',
311
            }
312
        }
313
    );
314
315
    # Create baskets with different naming schemes
316
    my $basket_po = $builder->build(
317
        {
318
            source => 'Aqbasket',
319
            value  => {
320
                basketname   => 'PO123456789',             # Purchase order number
321
                booksellerid => $vendor_po->{vendor_id},
322
            }
323
        }
324
    );
325
326
    my $basket_filename = $builder->build(
327
        {
328
            source => 'Aqbasket',
329
            value  => {
330
                basketname   => 'quote_file.ceq',                # Filename
331
                booksellerid => $vendor_filename->{vendor_id},
332
            }
333
        }
334
    );
335
336
    # Create biblio records for the orders
337
    my $biblio_po       = $builder->build_sample_biblio();
338
    my $biblio_filename = $builder->build_sample_biblio();
339
340
    # Create orders for the baskets
341
    my $order_po = $builder->build(
342
        {
343
            source => 'Aqorder',
344
            value  => {
345
                basketno     => $basket_po->{basketno},
346
                biblionumber => $biblio_po->biblionumber,
347
                orderstatus  => 'new',
348
                quantity     => 1,
349
                listprice    => '10.00',
350
            }
351
        }
352
    );
353
354
    my $order_filename = $builder->build(
355
        {
356
            source => 'Aqorder',
357
            value  => {
358
                basketno     => $basket_filename->{basketno},
359
                biblionumber => $biblio_filename->biblionumber,
360
                orderstatus  => 'new',
361
                quantity     => 1,
362
                listprice    => '10.00',
363
            }
364
        }
365
    );
366
367
    # Create EAN object
368
    my $ean = $builder->build(
369
        {
370
            source => 'EdifactEan',
371
            value  => { ean => '1234567890123' }
372
        }
373
    );
374
375
    # Get database objects
376
    my $dbic_vendor_po       = $schema->resultset('VendorEdiAccount')->find( $vendor_po->{id} );
377
    my $dbic_vendor_filename = $schema->resultset('VendorEdiAccount')->find( $vendor_filename->{id} );
378
    my $dbic_ean             = $schema->resultset('EdifactEan')->find( $ean->{ee_id} );
379
    my @orderlines_po        = $schema->resultset('Aqorder')->search( { basketno => $basket_po->{basketno} } );
380
    my @orderlines_filename  = $schema->resultset('Aqorder')->search( { basketno => $basket_filename->{basketno} } );
381
382
    # Test order generation with purchase order number
383
    my $order_obj_po = Koha::Edifact::Order->new(
384
        {
385
            orderlines => \@orderlines_po,
386
            vendor     => $dbic_vendor_po,
387
            ean        => $dbic_ean,
388
        }
389
    );
390
391
    # Test order generation with filename
392
    my $order_obj_filename = Koha::Edifact::Order->new(
393
        {
394
            orderlines => \@orderlines_filename,
395
            vendor     => $dbic_vendor_filename,
396
            ean        => $dbic_ean,
397
        }
398
    );
399
400
    # Test that purchase order number is extracted correctly
401
    is(
402
        $order_obj_po->{purchase_order_number}, 'PO123456789',
403
        'Purchase order number extracted from basket name when vendor configured for PO mode'
404
    );
405
406
    # Test that no purchase order number is extracted when vendor uses filename mode
407
    is(
408
        $order_obj_filename->{purchase_order_number}, undef,
409
        'No purchase order number when vendor configured for filename mode'
410
    );
411
412
    # Test that RFF+ON segment is included in order header when purchase order number present
413
    my $transmission = $order_obj_po->encode();
414
    like(
415
        $transmission, qr/RFF\+ON:PO123456789'/,
416
        'RFF+ON segment included in ORDER message when purchase order number present'
417
    );
418
419
    $schema->storage->txn_rollback;
420
};

Return to bug 20253