Koha/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/invoices.tt
Jonathan Druart 48bf9b1d91
Bug 30718: Use flatpickr's altInput
The idea rely on the KohaDates TT plugin for the date formatting. We
should not have any output_pref calls in pl or pm (there are some
exceptions, for ILSDI for instance).

Also flatpickr will deal with the places where dates are inputed. We
will pass the raw SQL value (what we call 'iso' in Koha::DateUtils), and
the controller will receive the same value, no need to additional
conversion.
Note that DBIC has the capability to auto-deflate DateTime objects,
which makes things way easier. We can either pass the value we receive
from the controller, or pass a DT object to our methods.

Signed-off-by: Victor Grousset/tuxayo <victor@tuxayo.net>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
2022-08-19 08:26:31 -03:00

507 lines
34 KiB
Text

[% USE raw %]
[% USE Asset %]
[% USE KohaDates %]
[% USE Branches %]
[% SET footerjs = 1 %]
[% INCLUDE 'doc-head-open.inc' %]
<title>Invoices &rsaquo; Acquisitions &rsaquo; Koha</title>
[% INCLUDE 'doc-head-close.inc' %]
</head>
<body id="acq_invoices" class="acq">
[% INCLUDE 'header.inc' %]
[% INCLUDE 'acquisitions-search.inc' %]
<nav id="breadcrumbs" aria-label="Breadcrumb" class="breadcrumb">
<ol>
<li>
<a href="/cgi-bin/koha/mainpage.pl">Home</a>
</li>
<li>
<a href="/cgi-bin/koha/acqui/acqui-home.pl">Acquisitions</a>
</li>
<li>
<a href="#" aria-current="page">Invoices</a>
</li>
</ol>
</nav>
<div class="main container-fluid">
<div class="row">
<div class="col-sm-10 col-sm-push-2">
<main>
[% INCLUDE 'blocking_errors.inc' %]
<h1>Invoices</h1>
[% IF ( do_search ) %]
[% IF invoices %]
[% BLOCK invoices_table %]
[% IF closed %]
[% SET tab = 'closed' %]
[% ELSE %]
[% SET tab = 'opened' %]
[% END %]
<input type="checkbox" style="vertical-align: middle;" id="show_only_subscription_[% tab | html %]" class="show_only_subscription" data-tableid="[% tab | html %]resultst"/>
<label for="show_only_subscription_[% tab | html %]">
Show only subscriptions
</label>
<p><a id="CheckAll[% tab | html %]table" data-cb="[% tab | html %]" class="checkall" href="#"><i class="fa fa-check"></i> Select all</a> | <a id="UncheckAll[% tab | html %]table" data-cb="[% tab | html %]" class="uncheckall" href="#"><i class="fa fa-remove"></i> Clear all</a></p>
<table id="[% tab | html %]resultst" class="result">
<thead>
<tr>
[% IF CAN_user_acquisition_merge_invoices %]
<th>&nbsp;</th>
[% END %]
<th>&nbsp;</th>
<th>Invoice number</th>
<th>Vendor</th>
<th>Shipment date</th>
<th>Billing date</th>
<th>Received bibliographic records</th>
<th>Received items</th>
<th>Status</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
[% FOREACH invoice IN invoices %]
<tr data-invoiceid="[% invoice.invoiceid | html %]" data-booksellerid="[% invoice.booksellerid | html %]" data-shipmentdate="[% invoice.shipmentdate | $KohaDates %]" data-billingdate="[% invoice.billingdate | $KohaDates %]" data-shipmentcost="[% invoice.shipmentcost | html %]" data-shipment_budgetid="[% invoice.shipmentcost_budgetid | html %]" data-closedate="[% invoice.closedate | $KohaDates %]">
[% IF CAN_user_acquisition_merge_invoices %]
<td>[% invoice.is_linked_to_subscriptions | html %]</td>
[% END %]
<td><input type="checkbox" class="select-invoice" value="[% invoice.invoiceid | html %]" /></td>
<td><a href="/cgi-bin/koha/acqui/invoice.pl?invoiceid=[% invoice.invoiceid | uri %]">[% invoice.invoicenumber | html %]</a></td>
<td><a href="/cgi-bin/koha/acqui/supplier.pl?booksellerid=[% invoice.booksellerid | uri %]">[% invoice.suppliername | html %]</a></td>
<td data-order="[% invoice.shipmentdate | html %]">
[% invoice.shipmentdate | $KohaDates %]
</td>
<td data-order="[% invoice.billingdate | html %]">
[% invoice.billingdate | $KohaDates %]
</td>
<td>[% invoice.receivedbiblios | html %]</td>
<td>[% invoice.receiveditems | html %]</td>
<td>
[% IF invoice.closedate %]
<span>Closed on [% invoice.closedate | $KohaDates %]</span>
[% ELSE %]
<span>Open</span>
[% END %]
</td>
<td>
<div class="btn-group dropup">
<a class="btn btn-default btn-xs dropdown-toggle" id="invoiceactions[% invoice.invoiceid | html %]" role="button" data-toggle="dropdown" href="#">
Actions <b class="caret"></b>
</a>
<ul class="dropdown-menu pull-right" role="menu" aria-labelledby="invoiceactions[% invoice.invoiceid | html %]">
<li><a href="/cgi-bin/koha/acqui/invoice.pl?invoiceid=[% invoice.invoiceid | uri %]"><i class="fa fa-search"></i> Details</a></li>
[% IF invoice.closedate %]
[% IF CAN_user_acquisition_reopen_closed_invoices %]
<li><a href="invoice.pl?op=reopen&amp;invoiceid=[% invoice.invoiceid | uri %]&amp;referer=/cgi-bin/koha/acqui/invoices.pl%3Fop=do_search%26invoicenumber=[% invoicenumber | uri %]%26supplier=[% booksellerid | uri %]%26shipmentdatefrom=[% shipmentdatefrom | $KohaDates %]%26shipmentdateto=[% shipmentdateto | $KohaDates %]%26billingdatefrom=[% billingdatefrom | $KohaDates %]%26billingdateto=[% billingdateto | $KohaDates %]%26isbneanissn=[% isbneanissn | uri %]%26title=[% title | uri %]%26author=[% author | uri %]%26publisher=[% publisher | uri %]%26publicationyear=[% publicationyear | uri %]%26branch=[% branch | uri %]"><i class="fa fa-refresh"></i> Reopen</a></li>
[% END %]
[% ELSE %]
[% IF CAN_user_acquisition_edit_invoices %]
<li><a href="invoice.pl?op=close&amp;invoiceid=[% invoice.invoiceid | uri %]&amp;referer=/cgi-bin/koha/acqui/invoices.pl%3Fop=do_search%26invoicenumber=[% invoicenumber | uri %]%26supplier=[% booksellerid | uri %]%26shipmentdatefrom=[% shipmentdatefrom | $KohaDates %]%26shipmentdateto=[% shipmentdateto | $KohaDates %]%26billingdatefrom=[% billingdatefrom | $KohaDates %]%26billingdateto=[% billingdateto | $KohaDates %]%26isbneanissn=[% isbneanissn | uri %]%26title=[% title | uri %]%26author=[% author | uri %]%26publisher=[% publisher | uri %]%26publicationyear=[% publicationyear | uri %]%26branch=[% branch | uri %]"><i class="fa fa-times-circle"></i> Close</a></li>
[% END %]
[% END # /IF invoice.closedate %]
[% UNLESS invoice.receivedbiblios || invoice.receiveditems %]
[% IF CAN_user_acquisition_delete_invoices %]
<li><a href="invoice.pl?op=delete&amp;invoiceid=[% invoice.invoiceid | uri %]&amp;referer=/cgi-bin/koha/acqui/invoices.pl%3Fop=do_search%26invoicenumber=[% invoicenumber | uri %]%26supplier=[% booksellerid | uri %]%26shipmentdatefrom=[% shipmentdatefrom | $KohaDates %]%26shipmentdateto=[% shipmentdateto | $KohaDates %]%26billingdatefrom=[% billingdatefrom | $KohaDates %]%26billingdateto=[% billingdateto | $KohaDates %]%26isbneanissn=[% isbneanissn | uri %]%26title=[% title | uri %]%26author=[% author | uri %]%26publisher=[% publisher | uri %]%26publicationyear=[% publicationyear | uri %]%26branch=[% branch | uri %]" class="delete_invoice"><i class="fa fa-trash"></i> Delete</a></li>
[% END %]
[% END %]
</ul>
</div> <!-- /.btn-group dropup -->
</td>
</tr>
[% END # /FOREACH invoice %]
</tbody>
</table> <!-- /#[% tab | html %]resultst -->
[% IF CAN_user_acquisition_merge_invoices %]
[% IF tab == 'closed' %]
<a class="btn btn-default merge" id="merge_closed" href="#merge_invoices" data-table="closedresultst"><i class="fa fa-compress"></i> Merge selected invoices</a>
<a class="btn btn-default" id="open_sel" href="#reopen_selected" data-table="closedresultst" data-op="reopen" data-referer="referer=/cgi-bin/koha/acqui/invoices.pl%3Fop=do_search%26invoicenumber=[% invoicenumber | uri %]%26supplier=[% booksellerid | uri %]%26shipmentdatefrom=[% shipmentdatefrom | $KohaDates %]%26shipmentdateto=[% shipmentdateto | $KohaDates %]%26billingdatefrom=[% billingdatefrom | $KohaDates %]%26billingdateto=[% billingdateto | $KohaDates %]%26isbneanissn=[% isbneanissn | uri %]%26title=[% title | uri %]%26author=[% author | uri %]%26publisher=[% publisher | uri %]%26publicationyear=[% publicationyear | uri %]%26branch=[% branch | uri %]"><i class="fa fa-refresh"></i> Reopen selected invoices</a>
[% ELSE %]
<a class="btn btn-default merge" id="merge_open" href="#merge_invoices" data-table="openedresultst"><i class="fa fa-compress"></i> Merge selected invoices</a>
<a class="btn btn-default" id="close_sel" href="#close_selected" data-table="openedresultst" data-op="close" data-referer="referer=/cgi-bin/koha/acqui/invoices.pl%3Fop=do_search%26invoicenumber=[% invoicenumber | uri %]%26supplier=[% booksellerid | uri %]%26shipmentdatefrom=[% shipmentdatefrom | $KohaDates %]%26shipmentdateto=[% shipmentdateto | $KohaDates %]%26billingdatefrom=[% billingdatefrom | $KohaDates %]%26billingdateto=[% billingdateto | $KohaDates %]%26isbneanissn=[% isbneanissn | uri %]%26title=[% title | uri %]%26author=[% author | uri %]%26publisher=[% publisher | uri %]%26publicationyear=[% publicationyear | uri %]%26branch=[% branch | uri %]"><i class="fa fa-times-circle"></i> Close selected invoices</a>
[% END # /IF tab == 'closed' %]
[% END # /IF CAN_user_acquisition_merge_invoices %]
[% END # /BLOCK invoices_table %]
<div id="invoicestabs" class="toptabs">
<ul class="nav nav-tabs" role="tablist">
<li role="presentation" class="active"><a href="#opened" aria-controls="opened" role="tab" data-toggle="tab">Open invoices ([% openedinvoices.size || 0 | html %])</a></li>
<li role="presentation"><a href="#closed" aria-controls="closed" role="tab" data-toggle="tab">Closed invoices ([% closedinvoices.size || 0 | html %]) </a></li>
</ul>
<div class="tab-content">
<div id="opened" role="tabpanel" class="tab-pane active">
[% IF openedinvoices %]
[% INCLUDE invoices_table invoices = openedinvoices %]
[% ELSE %]
<div class="dialog message">
<p>Your search returned no open invoices.</p>
</div>
[% END %]
</div> <!-- /#opened -->
<div id="closed" role="tabpanel" class="tab-pane">
[% IF closedinvoices %]
[% INCLUDE invoices_table invoices = closedinvoices closed = 1 %]
[% ELSE %]
<div class="dialog message">
<p>Your search returned no closed invoices.</p>
</div>
[% END %]
</div> <!-- /#closed -->
</div> <!-- /.tab-content -->
</div> <!-- /#invoicestabs -->
<div id="merge_invoices">
<form id="merge_invoice_form" action="/cgi-bin/koha/acqui/invoice.pl" method="post">
<fieldset class="rows">
<ol>
<li><h2>Merge invoices</h2></li>
<li>
<table id="merge_table">
<thead>
<tr>
<th>Invoice number</th>
<th>Shipment date</th>
<th>Billing date</th>
<th>Shipment cost</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</li>
<li>
<label for="merge_invoicenumber" class="required">Invoice number:</label>
<input type="text" size="10" id="merge_invoicenumber" name="invoicenumber" value="" class="required" required="required" />
<span class="required">Required</span>
</li>
<li>
<label for="merge_shipmentdate">Shipment date:</label>
<input type="text" size="10" id="merge_shipmentdate" name="shipmentdate" value="" class="flatpickr" />
<div class="hint">[% INCLUDE 'date-format.inc' %]</div>
</li>
<li>
<label for="merge_billingdate">Billing date:</label>
<input type="text" size="10" id="merge_billingdate" name="billingdate" value="" class="flatpickr" />
<div class="hint">[% INCLUDE 'date-format.inc' %]</div>
</li>
<li>
<label for="merge_shipmentcost">Shipment cost:</label>
<input type="text" size="10" id="merge_shipmentcost" name="shipmentcost" value="" />
</li>
<li>
<label for="merge_shipment_budgetid">Fund:</label>
<select id="merge_shipment_budgetid" name="shipment_budget_id">
<option value="">No fund</option>
[% FOREACH budget IN budgets_loop %]
<option value="[% budget.budget_id | html %]">[% budget.budget_name | html %]</option>
[% END %]
</select>
</li>
<li>
<span class="label">Status:</span> <span id="merge_status"></span>
</li>
<li>
<input type="submit" value="Merge" />
</li>
</ol>
<input type="hidden" name="op" value="mod" />
<input type="hidden" id="merge_invoiceid" name="invoiceid" value="" />
</fieldset> <!-- /.rows -->
</form> <!-- /#merge_invoice_form -->
</div> <!-- /#merge_invoices -->
[% ELSE # IF invoices %]
<p>Sorry, but there are no results for your search.</p>
<p>Search was:
<ul>
[% IF ( invoicenumber ) %]
<li>Invoice number: [% invoicenumber | html %]</li>
[% END %]
[% IF booksellerid %]
<li>Vendor: [% suppliername | html %]</li>
[% END %]
[% IF shipmentdatefrom %]
<li>
<span>Shipment date:</span>
[% IF shipmentdateto %]
<span>From [% shipmentdatefrom | $KohaDates %]</span>
<span>To [% shipmentdateto | $KohaDates %]</span>
[% ELSE %]
<span>All since [% shipmentdatefrom | $KohaDates %]</span>
[% END %]
</li>
[% ELSE %]
[% IF shipmentdateto %]
<li>
Shipment date:
All until [% shipmentdateto | $KohaDates %]
</li>
[% END %]
[% END %]
[% IF billingdatefrom %]
<li>
<span>Billing date:</span>
[% IF billingdateto %]
<span>From [% billingdatefrom | $KohaDates %]</span>
<span>To [% billingdateto | $KohaDates %]</span>
[% ELSE %]
<span>All since [% billingdatefrom | $KohaDates %]</span>
[% END %]
</li>
[% ELSE %]
[% IF billingdateto %]
<li>
Billing date:
All until [% billingdateto | $KohaDates %]
</li>
[% END %]
[% END %]
[% IF ( isbneanissn ) %]
<li>ISBN/EAN/ISSN: [% isbneanissn | html %]</li>
[% END %]
[% IF ( title ) %]
<li>Title: [% title | html %]</li>
[% END %]
[% IF ( author ) %]
<li>Author: [% author | html %]</li>
[% END %]
[% IF ( publisher ) %]
<li>Publisher: [% publisher | html %]</li>
[% END %]
[% IF ( publicationyear ) %]
<li>Publication year: [% publicationyear | html %]</li>
[% END %]
[% IF ( branch ) %]
<li>Library: [% Branches.GetName( branch ) | html %]</li>
[% END %]
</ul>
</p>
[% END # /IF invoices %]
[% ELSE %]
<p>Use the search form on the left to find invoices.</p>
[% END %]<!-- do_search -->
</main>
</div> <!-- /.col-sm-10.col-sm-push-2 -->
<div class="col-sm-2 col-sm-pull-10">
<aside>
<form action="" method="get">
<fieldset class="sidebar brief">
<h3>Search filters</h3>
<ol>
<li>
<label for="invoicenumber">Invoice number</label>
<input type="text" id="invoicenumber" name="invoicenumber" value="[% invoicenumber | html %]"
class="focus" />
</li>
<li>
<label for="supplier">Vendor:</label>
<select id="supplier" name="supplierid">
<option value="">All</option>
[% FOREACH supplier IN suppliers_loop %]
[% IF ( supplier.selected ) %]
<option selected="selected" value="[% supplier.booksellerid | html %]">[% supplier.suppliername | html %]</option>
[% ELSE %]
<option value="[% supplier.booksellerid | html %]">[% supplier.suppliername | html %]</option>
[% END %]
[% END %]
</select>
</li>
<li>
<fieldset class="brief">
<legend>Shipment date</legend>
<ol>
<li>
<label for="shipmentdatefrom">From:</label>
<input type="text" id="shipmentdatefrom" name="shipmentdatefrom" size="10" value="[% shipmentdatefrom | html %]" class="flatpickr" data-date_to="shipmentdateto" />
<div class="hint">[% INCLUDE 'date-format.inc' %]</div>
</li>
<li>
<label for="shipmentdateto">To:</label>
<input type="text" id="shipmentdateto" name="shipmentdateto" size="10" value="[% shipmentdateto | html %]" class="flatpickr" />
<div class="hint">[% INCLUDE 'date-format.inc' %]</div>
</li>
</ol>
</fieldset>
</li>
<li>
<fieldset class="brief">
<legend>Billing date</legend>
<ol>
<li>
<label for="billingdatefrom">From:</label>
<input type="text" id="billingdatefrom" name="billingdatefrom" size="10" value="[% billingdatefrom | html %]" class="flatpickr" data-date_to="billingdateto" />
<div class="hint">[% INCLUDE 'date-format.inc' %]</div>
</li>
<li>
<label for="billingdateto">To:</label>
<input type="text" id="billingdateto" name="billingdateto" size="10" value="[% billingdateto | html %]" class="flatpickr" />
<div class="hint">[% INCLUDE 'date-format.inc' %]</div>
</li>
</ol>
</fieldset>
</li>
<li>
<label for="isbneanissn">ISBN / EAN / ISSN:</label>
<input type="text" id="isbneanissn" name="isbneanissn" value="[% isbneanissn | html %]" />
</li>
<li>
<label for="title">Title:</label>
<input type="text" id="title" name="title" value="[% title | html %]" />
</li>
<li>
<label for="author">Author:</label>
<input type="text" id="author" name="author" value="[% author | html %]" />
</li>
<li>
<label for="publisher">Publisher:</label>
<input type="text" id="publisher" name="publisher" value="[% publisher | html %]" />
</li>
<li>
<label for="publicationyear">Publication year:</label>
<input type="text" id="publicationyear" name="publicationyear" value="[% publicationyear | html %]" />
</li>
<li>
<label for="branch">Library:</label>
<select id="branch" name="branch">
<option value="">All</option>
[%# FIXME Should not we filter the libraries %]
[% PROCESS options_for_libraries libraries => Branches.all( selected => branch, unfiltered => 1 ) %]
</select>
</li>
</ol>
<fieldset class="action">
<input type="submit" value="Search" />
</fieldset>
</fieldset> <!-- /.sidebar.brief -->
<input type="hidden" name="op" id="op" value="do_search" />
</form>
[% INCLUDE 'acquisitions-menu.inc' %]
</aside>
</div> <!-- /.col-sm-2.col-sm-pull-10 -->
</div> <!-- /.row -->
[% MACRO jsinclude BLOCK %]
[% Asset.js("js/acquisitions-menu.js") | $raw %]
[% INCLUDE 'datatables.inc' %]
[% INCLUDE 'calendar.inc' %]
<script>
$(document).ready(function() {
$('[id^="CheckAll"]').click( function() {
var table_id = "#" + $(this).attr('data-cb') + "resultst";
$(table_id).find('.select-invoice[type="checkbox"]').each( function() {
$(this).prop("checked" , true );
});
});
$('[id^="UncheckAll"]').click( function() {
var table_id = "#" + $(this).attr('data-cb') + "resultst";
$(table_id).find('.select-invoice[type="checkbox"]').each( function() {
$(this).prop("checked" , false );
});
});
$(".delete_invoice").click(function(){
return confirmDelete(_("Are you sure you want to delete this invoice?"));
});
var resultst = $("table.result").dataTable($.extend(true, {}, dataTablesDefaults, {
bPaginate: false,
aoColumnDefs: [
{ "bSortable": false, "aTargets": [1, -1] },
{ "bVisible": false, "aTargets": [0] }
],
autoWidth: false
}));
$(".show_only_subscription").prop("checked", false);
$(".show_only_subscription").click(function(){
var table_id = $(this).attr("data-tableid");
if ( $(this).prop("checked") ) {
$('#'+table_id).dataTable().fnFilter( "1", 0, true );
} else {
$('#'+table_id).dataTable().fnFilter( '', 0 );
}
});
$('#open_sel,#close_sel').click(function () {
var referer = $(this).attr("data-referer");
var op = $(this).attr("data-op");
var table = $(this).data('table');
var invoice_link = "invoice.pl?op="+op;
if ($('#' + table + ' .select-invoice:checked').length) {
$('#' + table + ' .select-invoice:checked').each(function () {
var row = $(this).parents('tr');
invoice_link = invoice_link + "&amp;invoiceid="+$(row).attr('data-invoiceid');
});
window.location.href =invoice_link +"&amp;"+referer;
} else {
alert ("Please select at least one invoice." );
}
});
$('.merge').click(function (ev) {
var booksellerid;
var mismatch;
var invoices = [ ];
var table = $(this).data('table');
if ($('#' + table + ' .select-invoice:checked').size() < 2) {
alert(_("You must select at least two invoices to merge."));
return false;
}
$('#' + table + ' .select-invoice:checked').each(function () {
var row = $(this).parents('tr');
booksellerid = booksellerid || $(row).attr('data-booksellerid');
if (booksellerid !== $(row).attr('data-booksellerid')) {
mismatch = true;
}
invoices.push({ 'invoiceid': $(row).attr('data-invoiceid'),
'invoicenumber': $(row).find('td:nth-child(2) a').text(),
'shipmentdate': $(row).attr('data-shipmentdate'),
'billingdate': $(row).attr('data-billingdate'),
'shipmentcost': $(row).attr('data-shipmentcost'),
'shipment_budgetid': $(row).attr('data-shipment_budgetid'),
'closedate': $(row).attr('data-closedate'), });
$('#merge_invoice_form').append('<input type="hidden" name="merge" value="' + $(row).attr('data-invoiceid') + '" />');
});
if (mismatch) {
alert(_("All invoices for merging must be from the same vendor"));
} else {
$('#merge_table tbody').empty();
$.each(invoices, function (idx, invoice) {
var row = $('<tr data-invoiceid="' + invoice.invoiceid + '"><td>' + invoice.invoicenumber + '</td><td>' + invoice.shipmentdate + '</td><td>' + invoice.billingdate + '</td><td>' + invoice.shipmentcost + '</td></tr>');
$(row).appendTo('#merge_table tbody');
$(row).click(function () {
$('#merge_table tbody tr').removeClass('active');
$(this).addClass('active');
$.each(['invoiceid', 'shipmentdate', 'billingdate', 'shipmentcost', 'shipment_budgetid', 'invoicenumber'], function (idx, prop) {
$('#merge_' + prop).val(invoice[prop]);
});
if (invoice.closedate) {
$('#merge_status').text(_("Closed on %s").format(invoice.closedate));
} else {
$('#merge_status').text(_("Open"));
}
});
});
$('#merge_table tbody tr:first').click();
$('#merge_invoices').show();
}
});
});
</script>
[% END %]
[% INCLUDE 'intranet-bottom.inc' %]