Bug 24158: Convert actual cost in an other currency when receiving
authorJonathan Druart <jonathan.druart@bugs.koha-community.org>
Wed, 4 Dec 2019 16:40:17 +0000 (17:40 +0100)
committerMartin Renvoize <martin.renvoize@ptfs-europe.com>
Wed, 25 Mar 2020 13:52:05 +0000 (13:52 +0000)
This patch adds a currency dropdown list to the Actual cost field when
receiving items in the acquisition module.
The idea is to let the librarian entered a price in a foreign currency
that will automatically be converted in the local currency ('active').
This converted value will be use as the actual cost once the form is
submitted.

Test plan:
- Create several currencies with different rates
- Create an order, close the basket and receive
- On the receipt page you will notice a new "change currency" checkbox
right close to the 'Actual cost' input.
- Check it
=> The 'Actual cost' input is readonly and a new line appears at the
bottom.
- Enter a number and select a currency
=> The 'Actual cost' input is automatically filled with the converted
value
- Save
=> The converted Actual cost has been inserted in the database.

Sponsored-by: Athlone Institute of Technology
Signed-off-by: Devinim <nazli@devinim.com.tr>
Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

acqui/orderreceive.pl
koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt

index 0b9ef23..f676ae8 100755 (executable)
@@ -114,7 +114,8 @@ unless ( $results and @$results) {
 my $order = $results->[0];
 my $order_object = Koha::Acquisition::Orders->find( $ordernumber );
 my $basket = $order_object->basket;
-my $active_currency = Koha::Acquisition::Currencies->get_active;
+my $currencies = Koha::Acquisition::Currencies->search;
+my $active_currency = $currencies->get_active;
 
 # Check if ACQ framework exists
 my $acq_fw = GetMarcStructure( 1, 'ACQ', { unsafe => 1 } );
@@ -228,8 +229,8 @@ $template->param(
     booksellerid          => $order->{'booksellerid'},
     freight               => $freight,
     name                  => $bookseller->name,
-    cur_active_sym        => $active_currency->symbol,
-    cur_active            => $active_currency->currency,
+    active_currency       => $active_currency,
+    currencies            => scalar $currencies->search({ rate => { '!=' => 1 } }),
     invoiceincgst         => $bookseller->invoiceincgst,
     title                 => $order->{'title'},
     author                => $order->{'author'},
index a2159ea..a4a996a 100644 (file)
             <input type="hidden" name="tax_rate" value="0" />
         [% END %]
 
-        <li><label for="rrp">Retail price: </label>[% rrp | $Price %] <span class="hint">(adjusted for [% cur_active | html %], [% IF (invoiceincgst == 1) %]tax inclusive[% ELSE %]tax exclusive[% END %])</span></li>
+        <li><label for="rrp">Retail price: </label>[% rrp | $Price %] <span class="hint">(adjusted for [% active_currency.currency | html %], [% IF (invoiceincgst == 1) %]tax inclusive[% ELSE %]tax exclusive[% END %])</span></li>
         <li>
             <label for="replacementprice">Replacement price:</label>
             <input type="text" size="20" name="replacementprice" id="replacementprice" value="[% replacementprice | $Price on_editing => 1 %]" />
         <li><label for="ecost">Budgeted cost: </label>[% ecost | $Price %] <span class="hint">[% IF (invoiceincgst == 1) %](tax inclusive)[% ELSE %](tax exclusive)[% END %]</span></li>
         <li>
             <label for="unitprice">Actual cost:</label>
-            <input type="text" size="20" name="unitprice" id="unitprice" value="[% unitprice | $Price on_editing => 1 %]" /> <span class="hint">[% IF (invoiceincgst == 1) %](tax inclusive)[% ELSE %](tax exclusive)[% END %]</span>
+            <input type="text" size="20" name="unitprice" id="unitprice" value="[% unitprice | $Price on_editing => 1 %]" />
+            <span class="hint">[% IF (invoiceincgst == 1) %](tax inclusive)[% ELSE %](tax exclusive)[% END %]</span>
+            <label style="font-weight: inherit; float:none;"><input type="checkbox" name="change_currency">Change currency</label>
+        </li>
+        <li id="select_currency">
+            <label for="unitprice_currency"></label>
+            <input type="text" size="20" name="unitprice" id="unitprice_currency" value="" />
+            [% IF currencies.count %]
+                <select name="currency">
+                    <option value="[% active_currency.rate %]" selected="selected">[% active_currency.currency %] ([% active_currency.symbol %])</option>
+                    [% FOR currency IN currencies %]
+                        <option value="[% currency.rate %]">[% currency.currency %] ([% currency.symbol %])</option>
+                    [% END %]
+                </select>
+            [% END %]
         </li>
         <li><label for="order_internalnote">Internal note: </label><textarea name="order_internalnote" width="40" rows="8" >[% order_internalnote | html %]</textarea></li>
         [% IF order_vendornote %]
                     CheckNItems($(this).val());
                 });
             [% END %]
+
+            $("input[name='change_currency']").on("change", function(){
+                if ( $(this).is(":checked") ) {
+                    $("#select_currency").show();
+                    $("#unitprice").prop("readonly", "true");
+                } else {
+                    $("#select_currency").hide();
+                    $("#unitprice").prop("readonly", "");
+                }
+            }).change();
+
+            function update_unitprice() {
+                var rate = Number($("select[name='currency'] option:selected").val());
+                var unitprice = $("#unitprice_currency").val();
+                var new_unitprice = Number( unitprice * rate ).toFixed(2);
+                $("#unitprice").val(new_unitprice);
+            }
+            $("select[name='currency']").on("change", function(){update_unitprice()} );
+            $("#unitprice_currency").on("change", function(){update_unitprice()} );
         });
     </script>
 [% END %]