Bug 33133: Add fast cataloging to 'Cataloging' page
[koha-ffzg.git] / t / Prices.t
old mode 100644 (file)
new mode 100755 (executable)
index 92bb432..2217c27
 use Modern::Perl;
-use Test::More tests => 12;
+use Test::More;
 use Test::MockModule;
 
 use t::lib::Mocks;
 
+use Module::Load::Conditional qw/check_install/;
+
 BEGIN {
-    my $context_module = t::lib::Mocks::mock_dbh;
-    use_ok('C4::Acquisition');
-    use_ok('C4::Bookseller');
-    use_ok('C4::Context');
-    use_ok('Koha::Number::Price');
-};
+    if ( check_install( module => 'Test::DBIx::Class' ) ) {
+        plan tests => 15;
+    } else {
+        plan skip_all => "Need Test::DBIx::Class"
+    }
+}
+
+use_ok('C4::Context');
+use_ok('Koha::Number::Price');
+
+t::lib::Mocks::mock_preference( 'TaxRates', '0.02|0.05|0.196' );
 
-t::lib::Mocks::mock_preference( 'gist', '0.02|0.05|0.196' );
+use Test::DBIx::Class;
+
+my $db = Test::MockModule->new('Koha::Database');
+$db->mock( _new_schema => sub { return Schema(); } );
+Koha::Database::flush_schema_cache();
+
+fixtures_ok [
+    Currency => [
+        [ qw/ currency symbol rate active / ],
+        [ 'my_cur', '€', 1, 1, ],
+    ],
+    Aqbookseller => [
+        [ qw/ id name listincgst invoiceincgst / ],
+        [ 1, '0 0', 0, 0 ],
+        [ 2, '0 1', 0, 1 ],
+        [ 3, '1 0', 1, 0 ],
+        [ 4, '1 1', 1, 1 ],
+    ],
+    Aqbasket => [
+        [ qw/ basketno basketname booksellerid / ],
+        [ 1, '0 0', 1 ],
+        [ 2, '0 1', 2 ],
+        [ 3, '1 0', 3 ],
+        [ 4, '1 1', 4 ],
+    ],
+], 'add currency fixtures';
 
 my $bookseller_module = Test::MockModule->new('Koha::Acquisition::Bookseller');
 
-my ( $basketno_0_0,  $basketno_1_1,  $basketno_1_0,  $basketno_0_1 );
-my ( $invoiceid_0_0, $invoiceid_1_1, $invoiceid_1_0, $invoiceid_0_1 );
+my ( $basketno_0_0, $basketno_0_1, $basketno_1_0, $basketno_1_1 ) = (1, 2, 3, 4);
+my ( $invoiceid_0_0, $invoiceid_1_1 );
 my $today;
 
 for my $currency_format ( qw( US FR ) ) {
     t::lib::Mocks::mock_preference( 'CurrencyFormat', $currency_format );
-    subtest 'Configuration 1: 0 0' => sub {
-        plan tests => 7;
-        $bookseller_module->mock(
-            'fetch',
-            sub {
-                return { listincgst => 0, invoiceincgst => 0 };
-            }
-        );
+    subtest 'Configuration 1: 0 0 (Vendor List prices do not include tax / Invoice prices do not include tax)' => sub {
+        plan tests => 8;
 
         my $biblionumber_0_0 = 42;
 
-        my $order_0_0 = {
+        my $order_0_0 = Koha::Acquisition::Order->new({
             biblionumber     => $biblionumber_0_0,
             quantity         => 2,
-            listprice        => 82.000000,
-            unitprice        => 73.80000,
+            listprice        => 82,
+            unitprice        => 73.80,
             quantityreceived => 2,
             basketno         => $basketno_0_0,
             invoiceid        => $invoiceid_0_0,
             rrp              => 82.00,
             ecost            => 73.80,
-            gstrate          => 0.0500,
-            discount         => 10.0000,
+            tax_rate_on_ordering  => 0.0500,
+            tax_rate_on_receiving => 0.0500,
+            discount         => 10,
             datereceived     => $today
-        };
-        $order_0_0 = C4::Acquisition::populate_order_with_prices(
-            {
-                order        => $order_0_0,
-                booksellerid => 'just_something',
-                ordering     => 1,
-            }
-        );
+        });
+        $order_0_0->populate_with_prices_for_ordering();
 
-        # Note that this configuration is correct \o/
         compare(
             {
-                got      => $order_0_0->{rrpgsti},
+                got      => $order_0_0->rrp_tax_included,
                 expected => 86.10,
                 conf     => '0 0',
-                field    => 'rrpgsti'
+                field    => 'rrp_tax_included'
             }
         );
         compare(
             {
-                got      => $order_0_0->{rrpgste},
+                got      => $order_0_0->rrp_tax_excluded,
                 expected => 82.00,
                 conf     => '0 0',
-                field    => 'rrpgste'
+                field    => 'rrp_tax_excluded'
             }
         );
         compare(
             {
-                got      => $order_0_0->{ecostgsti},
+                got      => $order_0_0->ecost_tax_included,
                 expected => 77.49,
                 conf     => '0 0',
-                field    => 'ecostgsti'
+                field    => 'ecost_tax_included'
             }
         );
         compare(
             {
-                got      => $order_0_0->{ecostgste},
+                got      => $order_0_0->ecost_tax_excluded,
                 expected => 73.80,
                 conf     => '0 0',
-                field    => 'ecostgste'
+                field    => 'ecost_tax_excluded'
             }
         );
         compare(
             {
-                got      => $order_0_0->{gstvalue},
+                got      => $order_0_0->tax_value_on_ordering,
                 expected => 7.38,
                 conf     => '0 0',
-                field    => 'gstvalue'
+                field    => 'tax_value'
             }
         );
+
+        $order_0_0->populate_with_prices_for_receiving();
+
         compare(
             {
-                got      => $order_0_0->{totalgsti},
-                expected => 154.98,
+                got      => $order_0_0->unitprice_tax_included,
+                expected => 77.49,
                 conf     => '0 0',
-                field    => 'totalgsti'
+                field    => 'unitprice_tax_included'
             }
         );
         compare(
             {
-                got      => $order_0_0->{totalgste},
-                expected => 147.60,
+                got      => $order_0_0->unitprice_tax_excluded,
+                expected => 73.80,
                 conf     => '0 0',
-                field    => 'totalgste'
+                field    => 'unitprice_tax_excluded'
             }
         );
-    };
-
-    subtest 'Configuration 1: 1 1' => sub {
-        plan tests => 7;
-        $bookseller_module->mock(
-            'fetch',
-            sub {
-                return { listincgst => 1, invoiceincgst => 1 };
+        compare(
+            {
+                got      => $order_0_0->tax_value_on_receiving,
+                expected => 7.38,
+                conf     => '0 0',
+                field    => 'tax_value'
             }
         );
+    };
+
+    subtest 'Configuration 1: 1 1 (Vendor List prices do include tax / Invoice prices include tax)' => sub {
+        plan tests => 11;
 
         my $biblionumber_1_1 = 43;
-        my $order_1_1        = {
+        my $order_1_1        = Koha::Acquisition::Order->new({
             biblionumber     => $biblionumber_1_1,
             quantity         => 2,
-            listprice        => 82.000000,
-            unitprice        => 73.800000,
+            listprice        => 82,
+            unitprice        => 73.80,
             quantityreceived => 2,
             basketno         => $basketno_1_1,
             invoiceid        => $invoiceid_1_1,
             rrp              => 82.00,
             ecost            => 73.80,
-            gstrate          => 0.0500,
-            discount         => 10.0000,
+            tax_rate_on_ordering  => 0.0500,
+            tax_rate_on_receiving => 0.0500,
+            discount         => 10,
             datereceived     => $today
-        };
+        });
 
-        $order_1_1 = C4::Acquisition::populate_order_with_prices(
-            {
-                order        => $order_1_1,
-                booksellerid => 'just_something',
-                ordering     => 1,
-            }
-        );
+        $order_1_1->populate_with_prices_for_ordering();
 
-        # Note that this configuration is *not* correct
-        # gstvalue should be 7.03 instead of 7.02
         compare(
             {
-                got      => $order_1_1->{rrpgsti},
+                got      => $order_1_1->rrp_tax_included,
                 expected => 82.00,
                 conf     => '1 1',
-                field    => 'rrpgsti'
+                field    => 'rrp_tax_included'
             }
         );
         compare(
             {
-                got      => $order_1_1->{rrpgste},
+                got      => $order_1_1->rrp_tax_excluded,
                 expected => 78.10,
                 conf     => '1 1',
-                field    => 'rrpgste'
+                field    => 'rrp_tax_excluded'
             }
         );
         compare(
             {
-                got      => $order_1_1->{ecostgsti},
+                got      => $order_1_1->ecost_tax_included,
                 expected => 73.80,
                 conf     => '1 1',
-                field    => 'ecostgsti'
+                field    => 'ecost_tax_included'
             }
         );
         compare(
             {
-                got      => $order_1_1->{ecostgste},
+                got      => $order_1_1->ecost_tax_excluded,
                 expected => 70.29,
                 conf     => '1 1',
-                field    => 'ecostgste'
+                field    => 'ecost_tax_excluded'
+            }
+        );
+        compare(
+            {
+                got      => $order_1_1->tax_value_on_ordering,
+                expected => 7.03,
+                conf     => '1 1',
+                field    => 'tax_value'
             }
         );
+
+        $order_1_1->populate_with_prices_for_receiving();
+
         compare(
             {
-                got      => $order_1_1->{gstvalue},
-                expected => 7.02,
+                got      => $order_1_1->unitprice_tax_included,
+                expected => 73.80,
                 conf     => '1 1',
-                field    => 'gstvalue'
+                field    => 'unitprice_tax_included'
             }
         );
         compare(
             {
-                got      => $order_1_1->{totalgsti},
-                expected => 147.60,
+                got      => $order_1_1->unitprice_tax_excluded,
+                expected => 70.29,
                 conf     => '1 1',
-                field    => 'totalgsti'
+                field    => 'unitprice_tax_excluded'
             }
         );
         compare(
             {
-                got      => $order_1_1->{totalgste},
-                expected => 140.58,
+                got      => $order_1_1->tax_value_on_receiving,
+                expected => 7.03,
                 conf     => '1 1',
-                field    => 'totalgste'
+                field    => 'tax_value'
             }
         );
-    };
 
-    subtest 'Configuration 1: 1 0' => sub {
-        plan tests => 7;
-        $bookseller_module->mock(
-            'fetch',
-            sub {
-                return { listincgst => 1, invoiceincgst => 0 };
+        # When unitprice is 0.00
+        # Koha::Acquisition::Order::populate_with_prices_for_ordering() falls
+        # back to using ecost_tax_included and ecost_tax_excluded
+        $order_1_1        = Koha::Acquisition::Order->new({
+            biblionumber     => $biblionumber_1_1,
+            quantity         => 1,
+            listprice        => 10,
+            unitprice        => '0.00',
+            quantityreceived => 1,
+            basketno         => $basketno_1_1,
+            invoiceid        => $invoiceid_1_1,
+            rrp              => 10.00,
+            ecost            => 10.00,
+            tax_rate_on_ordering  => 0.1500,
+            tax_rate_on_receiving => 0.1500,
+            discount         => 0,
+            datereceived     => $today
+        });
+
+        $order_1_1->populate_with_prices_for_ordering();
+
+        compare(
+            {
+                got      => $order_1_1->ecost_tax_included,
+                expected => 10.00,
+                conf     => '1 1',
+                field    => 'ecost_tax_included'
+            }
+        );
+        compare(
+            {
+                got      => $order_1_1->ecost_tax_excluded,
+                expected => 8.70,
+                conf     => '1 1',
+                field    => 'ecost_tax_excluded'
+            }
+        );
+        compare(
+            {
+                got      => $order_1_1->tax_value_on_ordering,
+                expected => 1.30,
+                conf     => '1 1',
+                field    => 'tax_value'
             }
         );
+    };
+
+    subtest 'Configuration 1: 1 0 (Vendor List prices include tax / Invoice prices do not include tax)' => sub {
+        plan tests => 9;
 
         my $biblionumber_1_0 = 44;
-        my $order_1_0        = {
+        my $order_1_0 = Koha::Acquisition::Order->new({
             biblionumber     => $biblionumber_1_0,
             quantity         => 2,
-            listprice        => 82.000000,
-            unitprice        => 73.804500,
+            listprice        => 82,
+            unitprice        => 0,
             quantityreceived => 2,
-            basketno         => $basketno_1_1,
+            basketno         => $basketno_1_0,
             invoiceid        => $invoiceid_1_1,
-            rrp              => 82.01,
+            rrp              => 82.00,
             ecost            => 73.80,
-            gstrate          => 0.0500,
-            discount         => 10.0000,
+            tax_rate_on_ordering  => 0.0500,
+            tax_rate_on_receiving => 0.0500,
+            discount         => 10,
             datereceived     => $today
-        };
-
-        $order_1_0 = C4::Acquisition::populate_order_with_prices(
-            {
-                order        => $order_1_0,
-                booksellerid => 'just_something',
-                ordering     => 1,
-            }
-        );
+        });
 
-        # Note that this configuration is *not* correct!
-        # rrp gsti should be 82 (what we inserted!)
-        # gstvalue should be 7.03 instead of 7.02
+        $order_1_0->populate_with_prices_for_ordering();
 
         compare(
             {
-                got      => $order_1_0->{rrpgsti},
-                expected => 82.01,
+                got      => $order_1_0->rrp_tax_included,
+                expected => 82,
                 conf     => '1 0',
-                field    => 'rrpgsti'
+                field    => 'rrp_tax_included'
             }
         );
         compare(
             {
-                got      => $order_1_0->{rrpgste},
+                got      => $order_1_0->rrp_tax_excluded,
                 expected => 78.10,
                 conf     => '1 0',
-                field    => 'rrpgste'
+                field    => 'rrp_tax_excluded'
             }
         );
         compare(
             {
-                got      => $order_1_0->{ecostgsti},
+                got      => $order_1_0->ecost_tax_included,
                 expected => 73.80,
                 conf     => '1 0',
-                field    => 'ecostgsti'
+                field    => 'ecost_tax_included'
             }
         );
         compare(
             {
-                got      => $order_1_0->{ecostgste},
+                got      => $order_1_0->ecost_tax_excluded,
                 expected => 70.29,
                 conf     => '1 0',
-                field    => 'ecostgste'
+                field    => 'ecost_tax_excluded'
             }
         );
+        # If we order with unitprice = 0, tax is calculated from the ecost
+        # (note that in addorder.pl and addorderiso2709 the unitprice may/will be set to the ecost
         compare(
             {
-                got      => $order_1_0->{gstvalue},
-                expected => 7.02,
+                got      => $order_1_0->tax_value_on_ordering,
+                expected => 7.03,
                 conf     => '1 0',
-                field    => 'gstvalue'
+                field    => 'tax_value'
             }
         );
+        $order_1_0->unitprice(70.29);
+        $order_1_0->populate_with_prices_for_ordering();
+
+        # If a unitprice is provided at ordering, we calculate the tax from that
         compare(
             {
-                got      => $order_1_0->{totalgsti},
-                expected => 147.60,
+                got      => $order_1_0->tax_value_on_ordering,
+                expected => 6.69,
                 conf     => '1 0',
-                field    => 'totalgsti'
+                field    => 'tax_value'
             }
         );
+
+        $order_1_0->populate_with_prices_for_receiving();
+
         compare(
             {
-                got      => $order_1_0->{totalgste},
-                expected => 140.58,
+                got      => $order_1_0->unitprice_tax_included,
+                expected => 73.80,
                 conf     => '1 0',
-                field    => 'totalgste'
+                field    => 'unitprice_tax_included'
             }
         );
-    };
-
-    subtest 'Configuration 1: 0 1' => sub {
-        plan tests => 7;
-        $bookseller_module->mock(
-            'fetch',
-            sub {
-                return { listincgst => 0, invoiceincgst => 1 };
+        compare(
+            {
+                got      => $order_1_0->unitprice_tax_excluded,
+                expected => 70.29,
+                conf     => '1 0',
+                field    => 'unitprice_tax_excluded'
             }
         );
+        compare(
+            {
+                got      => $order_1_0->tax_value_on_receiving,
+                expected => 7.03,
+                conf     => '1 0',
+                field    => 'tax_value'
+            }
+        );
+    };
+
+    subtest 'Configuration 1: 0 1 (Vendor List prices do not include tax / Invoice prices include tax)' => sub {
+        plan tests => 9;
 
         my $biblionumber_0_1 = 45;
-        my $order_0_1        = {
+        my $order_0_1 = Koha::Acquisition::Order->new({
             biblionumber     => $biblionumber_0_1,
             quantity         => 2,
-            listprice        => 82.000000,
-            unitprice        => 73.800000,
+            listprice        => 82,
+            unitprice        => 0,
             quantityreceived => 2,
-            basketno         => $basketno_1_1,
+            basketno         => $basketno_0_1,
             invoiceid        => $invoiceid_1_1,
             rrp              => 82.00,
             ecost            => 73.80,
-            gstrate          => 0.0500,
-            discount         => 10.0000,
+            tax_rate_on_ordering  => 0.0500,
+            tax_rate_on_receiving => 0.0500,
+            discount         => 10,
             datereceived     => $today
-        };
+        });
 
-        $order_0_1 = C4::Acquisition::populate_order_with_prices(
-            {
-                order        => $order_0_1,
-                booksellerid => 'just_something',
-                ordering     => 1,
-            }
-        );
+        $order_0_1->populate_with_prices_for_ordering();
 
-        # Note that this configuration is correct \o/
         compare(
             {
-                got      => $order_0_1->{rrpgsti},
+                got      => $order_0_1->rrp_tax_included,
                 expected => 86.10,
-                conf     => '1 0',
-                field    => 'rrpgsti'
+                conf     => '0 1',
+                field    => 'rrp_tax_included'
             }
         );
         compare(
             {
-                got      => $order_0_1->{rrpgste},
+                got      => $order_0_1->rrp_tax_excluded,
                 expected => 82.00,
-                conf     => '1 0',
-                field    => 'rrpgste'
+                conf     => '0 1',
+                field    => 'rrp_tax_excluded'
             }
         );
         compare(
             {
-                got      => $order_0_1->{ecostgsti},
+                got      => $order_0_1->ecost_tax_included,
                 expected => 77.49,
-                conf     => '1 0',
-                field    => 'ecostgsti'
+                conf     => '0 1',
+                field    => 'ecost_tax_included'
             }
         );
         compare(
             {
-                got      => $order_0_1->{ecostgste},
+                got      => $order_0_1->ecost_tax_excluded,
                 expected => 73.80,
-                conf     => '1 0',
-                field    => 'ecostgste'
+                conf     => '0 1',
+                field    => 'ecost_tax_excluded'
             }
         );
+        # If we order with unitprice = 0, tax is calculated from the ecost
+        # (note that in addorder.pl and addorderiso2709 the unitprice may/will be set to the ecost
         compare(
             {
-                got      => $order_0_1->{gstvalue},
+                got      => $order_0_1->tax_value_on_ordering,
                 expected => 7.38,
-                conf     => '1 0',
-                field    => 'gstvalue'
+                conf     => '0 1',
+                field    => 'tax_value'
             }
         );
+        $order_0_1->unitprice(77.490000);
+        $order_0_1->populate_with_prices_for_ordering();
+
+        # If a unitprice is provided at ordering, we calculate the tax from that
         compare(
             {
-                got      => $order_0_1->{totalgsti},
-                expected => 154.98,
-                conf     => '1 0',
-                field    => 'totalgsti'
+                got      => $order_0_1->tax_value_on_ordering,
+                expected => 7.75,
+                conf     => '0 1',
+                field    => 'tax_value'
             }
         );
+        $order_0_1->populate_with_prices_for_receiving();
+
         compare(
             {
-                got      => $order_0_1->{totalgste},
-                expected => 147.60,
-                conf     => '1 0',
-                field    => 'totalgste'
+                got      => $order_0_1->unitprice_tax_included,
+                expected => 77.49,
+                conf     => '0 1',
+                field    => 'unitprice_tax_included'
+            }
+        );
+        compare(
+            {
+                got      => $order_0_1->unitprice_tax_excluded,
+                expected => 73.80,
+                conf     => '0 1',
+                field    => 'unitprice_tax_excluded'
+            }
+        );
+        compare(
+            {
+                got      => $order_0_1->tax_value_on_receiving,
+                expected => 7.38,
+                conf     => '0 1',
+                field    => 'tax_value'
             }
         );
     };
@@ -403,3 +500,10 @@ sub compare {
 "configuration $params->{conf}: $params->{field} should be correctly calculated"
     );
 }
+
+# format_for_editing
+for my $currency_format ( qw( US FR ) ) {
+    t::lib::Mocks::mock_preference( 'CurrencyFormat', $currency_format );
+    is( Koha::Number::Price->new( 1234567 )->format_for_editing, '1234567.00', 'format_for_editing should return unformated integer part with 2 decimals' );
+    is( Koha::Number::Price->new( 1234567.89 )->format_for_editing, '1234567.89', 'format_for_editing should return unformated integer part with 2 decimals' );
+}