{% extends 'base.html.twig' %}
{% set currentPath = path(app.request.attributes.get('_route')) %}
{% block body %}
<div class="container">
<div class="row">
<div id="loader" class="col s12 progress" style="display:none"><div class="indeterminate"></div></div>
<div class="col s12">
<div class="card">
<div class="card-content">
<!-- <span class="card-title">Filters</span> -->
<div class="row">
<h5>Gestione Incassi / Rimborsi</h5>
<p class="hint blue-grey lighten-5">HINT - Per l'assegnazione delle Note di Credito selezionare Fatture/Rimborsi</p>
<div class="col s2">
<select name="filter-order-type">
<option value="fatture">Fatture</option>
<option value="note-credito">Note Credito</option>
<option value="corrispettivi">Corrispettivi</option>
</select>
</div>
<div class="col s2">
<select name="filter-tipo">
<option value="charge" selected>Incassi</option>
<option value="refund">Rimborsi</option>
<option value="not-managed">Non gestiti (chargeback / payment reversal / ecc...)</option>
</select>
</div>
<div class="col s2">
<select name="filter-source">
<option value="">Tipo pagamento</option>
<option value="shopify">Shopify</option>
<option value="paypal">Paypal</option>
<option value="amazon">Amazon</option>
<option value="klarna">Klarna</option>
</select>
</div>
</div>
<div class="row">
<div class="col s2">
<label>Transazione DA:</label>
<input type="text" name="filter-date-from" class="datepicker">
</div>
<div class="col s2">
<label>Transazione A:</label>
<input type="text" name="filter-date-to" class="datepicker">
</div>
<div class="col s3">
<div id="filter-orders-ids" class="chips chips-placeholder">
<input name="filter-orders-ids" placeholder="Filtra per ID Ordine">
</div>
</div>
</div>
<div class="row">
<div class="col s2">
<input id="filter-credit-notes-from" name="filter-credit-notes-from" placeholder="Note Credito DA">
</div>
<div class="col s2">
<input id="filter-credit-notes-to" name="filter-credit-notes-to" placeholder="Note Credito A">
</div>
<div class="col s2">
<button type="button" onclick="Manebi.getIncassi()" name="submit-filter" class="btn waves-effect waves-light">RECUPERA</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col s12">
<div class="card">
<div class="card-content">
<div id="incassi-table-results">
<div class="row">
<div class="col s4">Risultati: <span id="incassi-table-results-total"></span></div>
<div id="incassi-table-results-actions" class="col s8"></div>
</div>
</div>
<div class="row">
<div class="col s12"><div class="incassi-table-pagination"></div></div>
</div>
<table id="incassi-table" class="striped fixed_header">
<thead></thead>
<tbody></tbody>
</table>
<div class="row">
<div class="col s12"><div class="incassi-table-pagination"></div></div>
<div class="col s2"><label for="incassi-table-page-size-list">Page size: <select class="incassi-table-page-size-list" name="incassi-table-page-size-list" after-render="initMaterializeSelect"></select></label></div>
</div>
</div>
</div>
</div>
</div>
{% if incassiSenzaOrdine|length > 0 %}
<div class="row">
<div class="col s12 alert">
<div class="card">
<div class="card-content" style="color:red">
<strong>Attenzione! Ci sono {{ incassiSenzaOrdine|length }} incassi/rimborsi per i quali non è possibile associare un ordine (Fattura/Corrispettivo). Occorre importare gli ordini relativi a questi incassi/rimborsi per poterli esportare massivamente in Profis.</strong>
<hr/>
<table id="incassiSenzaOrdine" class="table">
<thead>
<tr>
<td>Ordine</td>
<td>Gestito</td>
<td>PaymentReference</td>
<td>Sorgente</td>
<td>Tipo (Incasso/Rimborso)</td>
<td>Totale</td>
<td>Data Transazione</td>
<td>Azioni</td>
</tr>
</thead>
<tbody>
{% for i in incassiSenzaOrdine %}
<tr id="iso-{{ i.id }}">
<td>{{ i.Order }}</td>
<td>{{ i.Gestito }}</td>
<td>{{ i.PaymentReference }}</td>
<td>{{ i.Source }}</td>
<td>{{ i.Type }}</td>
<td>{% if i.Type == "charge" %}{{ i['ChargeAmount'] }}{% else %}{{ i['RefundAmount'] }}{% endif %}</td>
<td>{{ i.Date }}</td>
<td><button type="button" onclick="Manebi.eliminaIncasso({{ i.id }})" class="btn-floating btn-small waves-effect waves-light red">X</button></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
{% endif %}
</div>
<!-- Modal Structure -->
<div id="NotaCreditoPreviewModal" class="modal modal-fixed-footer modal-fixed-header">
<div class="modal-header"></div>
<div class="modal-content"></div>
<div class="modal-footer">
<a href="#!" class="modal-close waves-effect waves-green btn btn-small">OK</a>
</div>
</div>
<div id="genericPopup" class="modal modal-fixed-footer modal-fixed-header">
<div class="modal-header"></div>
<div class="modal-content"></div>
<div class="modal-footer">
<a href="#!" class="modal-close waves-effect waves-green btn btn-small">CHIUDI</a>
</div>
</div>
{% block javascripts %}
<script src="{{ asset('tmb-data-table.v1_0.min.js') }}"></script>
<script>
var Manebi = {};
var urlAjax = "{{ currentPath }}";
var filterInstances = {'collapsible': {}, 'dates': {}, 'chips': {}, 'modals': {}, 'selects': {}};
var tableInvoices = null;
var incassiTableColumns = {
'Data Tansazione': {'headerName': 'Data Transazione', 'value': 'Date', 'sortable': true},
'Tipo': {'headerName': 'Tipo', 'value': 'Type', 'sortable': true},
'Source': {'headerName': 'Source', 'value': 'Source', 'sortable': true},
'Order': {'headerName': 'Ordine', 'value': 'Order', 'sortable': true},
'Fattura': {'headerName': 'Fattura', 'value': function(data){ return '<b>' + data['Fattura'] + '</b>'}, 'sortable': true},
'Corrispettivo': {'headerName': 'Corrispettivo', 'value': function(data){ return '<b>' + data['Corrispettivo'] + '</b>'}, 'sortable': true},
'Nota Credito': {'headerName': 'Nota Credito', 'value': function(data){ return '<b>' + data['NotaCreditoFormatted'] + '</b>'}, 'type': 'int', 'sortable': true, 'sort-by-value': 'NotaCredito'},
'Total Amount': {'headerName': 'Incasso Totale', 'value': function(data){ return getPrice(data.ChargeAmount,2) + ' '+ getCurrencySymbol(data.Currency)}, 'type': 'float', 'sortable': true, 'sort-by-value': 'ChargeAmount'},
'Charge Amount': {'headerName': 'Incasso Netto', 'value': function(data){ return getPrice(data.ChargeNet,2) + ' '+ getCurrencySymbol(data.Currency)}, 'type': 'float', 'sortable': true, 'sort-by-value': 'ChargeNet'},
'Charge Fee': {'headerName': 'Commissione', 'value': function(data){ return getPrice(data.ChargeFee,2) + ' '+ getCurrencySymbol(data.Currency)}, 'type': 'float', 'sortable': true, 'sort-by-value': 'ChargeFee'}
};
var rimborsiTableColumns = {
'Data Tansazione': {'headerName': 'Data Transazione', 'value': 'Date', 'sortable': true},
'Tipo': {'headerName': 'Tipo', 'value': 'Type', 'sortable': true},
'Source': {'headerName': 'Source', 'value': 'Source', 'sortable': true},
'Order': {'headerName': 'Ordine', 'value': 'Order', 'sortable': true},
'Paese': {'headerName': 'Paese', 'value': 'Shipping Country', 'sortable': true},
'Fattura': {'headerName': 'Fattura', 'value': function(data){ return '<b>' + data['Fattura'] + '</b>'}, 'sortable': true},
'Importo Fattura': {'headerName': 'Importo Fattura', 'value': function(data) { return getPrice(data.Total,2) + ' ' + getCurrencySymbol(data.Currency) }, 'sortable': true},
'Nota Credito': {'headerName': 'Nota Credito', 'value': function(data){ return '<b>' + data['NotaCreditoFormatted'] + '</b>'}, 'type': 'int', 'sortable': true, 'sort-by-value': 'NotaCredito'},
'Total Amount': {'headerName': 'Rimborso Totale', 'value': function(data){ return getPrice(data.RefundAmount,2) + ' '+ getCurrencySymbol(data.Currency) + ( (Math.abs(data.RefundAmount - data.Total) > 0.00 && Math.abs(data.RefundAmount - data.Total) <= 0.05) ? (' <i class="arrot">' + (data.RefundAmount - data.Total > 0 ? '+' : '') + getPrice(data.RefundAmount - data.Total,2) + ' ' + getCurrencySymbol(data.Currency) + '</i>') : '')}, 'type': 'float', 'sortable': true, 'sort-by-value': 'RefundAmount'},
'Rimborso Amount': {'headerName': 'Rimborso Netto', 'value': function(data){ return getPrice(data.RefundNet,2) + ' '+ getCurrencySymbol(data.Currency)}, 'type': 'float', 'sortable': true, 'sort-by-value': 'RefundNet'},
'Rimborso Fee': {'headerName': 'Rimborso Commissione', 'value': function(data){ return getPrice(data.RefundFee,2) + ' '+ getCurrencySymbol(data.Currency)}, 'type': 'float', 'sortable': true, 'sort-by-value': 'RefundFee'},
'Azioni': {'headerName': '', 'value': function(data){
var o = '<div id="notacredito-actions-'+data.id+'" style="width: 120px;">' +
(data['NotaCredito'] != '' ? ('<a href="/admin/pdf/note-credito/'+data['NotaCredito']+'?Order=' + encodeURIComponent(data['Order']) + '" class="btn-floating btn-small waves-effect waves-light red"><i class="material-icons">picture_as_pdf</i></a>') : '') +
(data['NotaCredito'] != '' && ( (Math.abs(data.RefundAmount - data.Subtotal) > 0.05) && (Math.abs(data.RefundAmount - data.Total) > 0.05) ) ? ' <button class="btn-floating btn-small blue" onclick="refundDetails('+data.id+',\'' + data.Order + '\',\'' + data['NotaCredito'] + '\')"><i class="material-icons">table_view</i></button>' : '') +
(data['NotaCredito'] != '' && ( (Math.abs(data.RefundAmount - data.Subtotal) > 0.05) && (Math.abs(data.RefundAmount - data.Total) > 0.05) && (data['NC_Prodotti'] == 0 && data['NC_Spedizioni'] == 0 )) ? ' <button class="btn-floating btn-small orange"><b style="color:black;font-size:16px">!</b></button>' : '') +
'</div>';
return o;
}
}
};
function getPrice(price, decimal)
{
var price = parseFloat(price);
return price.toFixed(decimal);
}
function getCurrencySymbol(cur)
{
switch(cur){
case 'EUR': return '€';
case 'USD': return '$';
default: return '';
}
}
function toggleElement(elId){
var x = document.getElementById(elId);
if (x.style.display === "none") {
x.style.display = "block";
} else {
x.style.display = "none";
}
}
function initMaterializeSelect(el) {
M.FormSelect.init(el, {});
}
document.addEventListener('DOMContentLoaded', function() {
//Initialize Collapsible
var elems = document.querySelectorAll('.collapsible');
for(var i = 0; i < elems.length; i++)
{
key = typeof(elems[i].getAttribute('id')) !== "undefined" ? elems[i].getAttribute('id') : i;
filterInstances.collapsible[key] = M.Collapsible.init(elems[i]);
}
// Initialize DatePicker
var elems = document.querySelectorAll('.datepicker');
for(var i = 0; i < elems.length; i++)
{
key = elems[i].getAttribute('name');
filterInstances.dates[key] = M.Datepicker.init(elems[i], {autoClose: true, format: "yyyy-mm-dd", showClearBtn: true});
}
// Initialize Chips
var elems = document.querySelectorAll('.chips');
for(var i = 0; i < elems.length; i++)
{
key = elems[i].getAttribute('id');
filterInstances.chips[key] = M.Chips.init(elems[i]);
}
var elems = document.querySelectorAll('select');
for(var i = 0; i < elems.length; i++)
{
key = elems[i].getAttribute('name');
filterInstances.selects[key] = M.FormSelect.init(elems[i]);
}
// Initialize Modals
var elems = document.querySelectorAll('.modal');
for(var i = 0; i < elems.length; i++)
{
key = elems[i].getAttribute('id');
filterInstances.modals[key] = M.Modal.init(elems[i], {'startingTop': '0%', 'endingTop': '0%', 'endingBottom': '10%'});
}
//Get Invoices
Manebi.getIncassi = function(){
window.toggleElement('loader');
var filter_type = document.querySelector('select[name="filter-tipo"]').value;
var filter_order_type = document.querySelector('select[name="filter-order-type"]').value;
var filter_source = document.querySelector('select[name="filter-source"]').value;
$.ajax({
url: urlAjax,
dataType: "json",
data: {
'filter': 1,
'filter-type': filter_type,
'filter-date-from': filterInstances.dates['filter-date-from'].toString(),
'filter-date-to': filterInstances.dates['filter-date-to'].toString(),
'filter-tipo': filterInstances.selects['filter-tipo'].el.value,
'filter-order-type': filterInstances.selects['filter-order-type'].el.value,
'filter-orders-ids': filterInstances.chips['filter-orders-ids'].chipsData,
'filter-credit-notes-from': document.querySelector('#filter-credit-notes-from').value,
'filter-credit-notes-to': document.querySelector('#filter-credit-notes-to').value,
'filter-source': filterInstances.selects['filter-source'].el.value,
}
}).then(function(data){
var actions = '';
if(filter_type == 'charge')
tableInvoices = new TmbDataTable('incassi-table', incassiTableColumns, {'pageSize': 50, 'selectable': true});
else
tableInvoices = new TmbDataTable('incassi-table', rimborsiTableColumns, {'pageSize': 50, 'selectable': true});
tableInvoices.setData(data.data).generateTable();
if( (filter_type == 'refund') && (filter_order_type == 'note-credito' || filter_order_type == 'corrispettivi') )
{
actions += '<button type="button" class="btn btn-small waves-effect waves-light" style="float:right;background-color:#36a700" onclick=\'Manebi.exportFile(\"' + filter_type + '\", \"exportCSVDetails\")\'><i class="material-icons">file_download</i> <span>CSV - DETTAGLI (TODO)</span></button>';
}
actions += '<button type="button" class="btn btn-small waves-effect waves-light" style="float:right;background-color:#36a700" onclick=\'Manebi.exportFile(\"' + filter_type + '\", \"exportCSV\")\'><i class="material-icons">file_download</i> <span>CSV</span></button>';
if( (filter_type == 'charge') || ( (filter_type == 'refund') && (filter_order_type == 'note-credito' || filter_order_type == 'corrispettivi') ) )
{
actions += '<button type="button" class="btn btn-small waves-effect waves-light" style="float:right;background-color:#36a700" onclick=\'Manebi.exportFile(\"' + filter_type + '\", \"exportProfis\")\'><i class="material-icons">import_export</i>XML PROFIS</button>';
if((filter_type == 'refund') && (filter_order_type == 'note-credito'))
actions += '<button type="button" class="btn btn-small waves-effect waves-light" style="float:right;background-color:#36a700" onclick=\'Manebi.exportFile(\"' + filter_type + '\", \"exportFatturaElettronica\")\'><i class="material-icons">import_export</i>Fattura Elettronica (Nota Credito)</button>';
}
if(filter_type == 'refund' && filter_order_type == "fatture")
{
actions += '<button type="button" class="btn btn-small waves-effect waves-light" style="margin-let:20px;float:right;background-color:#bb001a" onclick="Manebi.checkNumerazioneNotaCredito()">Assegna numerazione per Note di Credito</button>';
}
tableInvoices.setAction(actions);
window.toggleElement('loader');
});
}
Manebi.numerazioneNoteCredito = [];
/// Controlla la numerazione delle Note Credito
Manebi.checkNumerazioneNotaCredito = function() {
window.toggleElement('loader');
$.ajax({
url: urlAjax + '/assignNumNotaCredito',
dataType: "json",
data: {
'preview': true,
'filter-date-from': filterInstances.dates['filter-date-from'].toString(),
'filter-date-to': filterInstances.dates['filter-date-to'].toString(),
}
}).then(function(data){
if(data.status == 'ERROR'){
alert(data.message);
}
Manebi.numerazioneNoteCredito = data.rimborsi;
Manebi.popupPreviewNotaCredito(data);
window.toggleElement('loader');
});
}
/// Conferma e assegna i Numeri di Nota Credito
Manebi.confirmNumerazioneNotaCredito = function()
{
if(Manebi.numerazioneNoteCredito.length > 0)
{
$.ajax({
type: 'POST',
url: urlAjax + '/assignNumNotaCredito?confirm=1&preview=false',
dataType: "json",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(Manebi.numerazioneNoteCredito)
}).then(function(data){
if(data.status == 'ERROR'){
alert(data.message);
}
filterInstances.modals['NotaCreditoPreviewModal'].el.querySelector('.modal-content').innerHTML = '<p style="color:#339e00;font-weight:bold">'+ data.message + '<p>';
});
}
}
// Elimina incasso
Manebi.eliminaIncasso = function(id)
{
popup = filterInstances.modals['genericPopup'];
popup.el.querySelector('.modal-content').innerHTML = 'Sei sicuro di voler rimuovere l\'incasso/il rimborso selezionato? <div style="text:align_center"><button class="btn red" onclick="Manebi.eliminaIncassoConfirm('+id+')">CONFERMA RIMOZIONE INCASSO/RIMBORSO</button></div>';
popup.open();
}
Manebi.eliminaIncassoConfirm = function(id)
{
$.ajax({
url: urlAjax + '/delete/' + id,
type: "POST",
dataType: "json",
}).then(function(data){
if(data.status == 'OK'){;
popup = filterInstances.modals['genericPopup'];
popup.el.querySelector('.modal-content').innerHTML = '<b>Incasso/Rimborso eliminato!</b>';
var elem = document.querySelector('#iso-'+id);
elem.parentNode.removeChild(elem);
}else{
popup = filterInstances.modals['genericPopup'];
popup.el.querySelector('.modal-content').innerHTML = '<b>Attenzione! Non è stato possibile rimuovere l\'incasso/rimborso selezionato</b>';
}
});
}
Manebi.popupPreviewNotaCredito = function(data)
{
var rimborsi = data.rimborsi;
var message = typeof(data.message) !== "undefined" ? data.message : "";
filterInstances.modals['NotaCreditoPreviewModal'].el.querySelector('.modal-header').innerHTML = '<h4>Anteprima Note Credito</h4>';
var o = '<p><b>Ultima Nota di Credito assegnata</b></p><table id="note-credito-last" class="table"><tbody>\
<thead><tr><th>Ordine</th><th>Sorgente</th><th>Data Rimborso</th><th>Numero NC</th></tr></thead>';
for(i=0; i < 1; i++)
{
o += '<tr class="'+(rimborsi[i].Order == null ? 'error' : '')+'"><td><b>' + rimborsi[i].Order +'</b></td><td>' + rimborsi[i].Source + '</td><td>' + rimborsi[i].Date +'</td><td class="num-notacredito"><b>' + rimborsi[i].NotaCredito +'</b></td></tr>';
}
o += '<tr></tr></tbody></table>';
if(rimborsi.length > 1)
{
o += '<p>'+ message +'</p><table id="note-credito-preview" class="table"><tbody>\
<thead><tr><th>Ordine</th><th>Sorgente</th><th>Data Rimborso</th><th>Numero NC da assegnare</th></tr></thead>';
for(i=1; i<rimborsi.length; i++)
{
o += '<tr class="'+(rimborsi[i].Order == null ? 'error' : '')+'"><td><b>' + rimborsi[i].Order +'</b></td><td>' + rimborsi[i].Source + '</td><td>' + rimborsi[i].Date +'</td><td class="num-notacredito"><b>' + rimborsi[i].NotaCredito +'</b></td></tr>';
}
o += '<tr></tr></tbody></table>';
}else{
o += '<p><b>Non ci sono Note di Credito da assegnare</b></p>'
}
if((data.status == "OK"))
{
if(rimborsi.length > 1)
{
o = '<div style="text-align:center"><input type="button" class="btn waves-effect waves-light" onclick="Manebi.confirmNumerazioneNotaCredito()" value="CONFERMA E ASSEGNA NUMERAZIONE" /></div>' + o;
}
}
filterInstances.modals['NotaCreditoPreviewModal'].el.querySelector('.modal-content').innerHTML = o;
filterInstances.modals['NotaCreditoPreviewModal'].open();
}
// Get Invoice
Manebi.getIncasso = function(id) {
window.toggleElement('loader');
$.ajax({
url: urlAjax + '/' + id,
dataType: "json"
}).then(function(data){
if(data.status == 'OK' && (data.data.length > 0)){
var invoice = data.data[0];
Manebi.viewInvoice(invoice);
}
window.toggleElement('loader');
});
}
// Export Invoices in Profis XML
Manebi.exportFile = function(filter_type, export_type) {
var form = document.createElement("form");
form.setAttribute("id", export_type);
form.method = "POST";
form.action = urlAjax;
form.target = '_blank';
document.body.appendChild(form);
f = document.createElement("input");f.type='hidden';
f.setAttribute('name', 'filter-tipo');f.setAttribute('value', filterInstances.selects['filter-tipo'].el.value);
form.appendChild(f);
f = document.createElement("input");f.type='hidden';
f.setAttribute('name', 'filter-source');f.setAttribute('value', filterInstances.selects['filter-source'].el.value);
form.appendChild(f);
f = document.createElement("input");f.type='hidden';
f.setAttribute('name', 'filter-order-type');f.setAttribute('value', filterInstances.selects['filter-order-type'].el.value);
form.appendChild(f);
f = document.createElement("input");f.type='hidden';
f.setAttribute('name', export_type);f.setAttribute('value', 1);
form.appendChild(f);
f = document.createElement("input");f.type='hidden';
f.setAttribute('name', 'filter');f.setAttribute('value', 1);
form.appendChild(f);
f = document.createElement("input");f.type='hidden';
f.setAttribute('name', 'filter-date-from');f.setAttribute('value', filterInstances.dates['filter-date-from'].toString());
form.appendChild(f);
f = document.createElement("input");f.type='hidden';
f.setAttribute('name', 'filter-date-to');f.setAttribute('value', filterInstances.dates['filter-date-to'].toString());
form.appendChild(f);
var chips = filterInstances.chips['filter-orders-ids'].chipsData;
for(var i=0; i < chips.length; i++){
f = document.createElement("input");f.type='hidden';
f.setAttribute('name', 'filter-orders-ids['+i+'][tag]');f.setAttribute('value', chips[i].tag);
form.appendChild(f);
}
f = document.createElement("input");f.type='hidden';
f.setAttribute('name', 'filter-credit-notes-from');f.setAttribute('value', document.querySelector('#filter-credit-notes-from').value);
form.appendChild(f);
f = document.createElement("input");f.type='hidden';
f.setAttribute('name', 'filter-credit-notes-to');f.setAttribute('value', document.querySelector('#filter-credit-notes-to').value);
form.appendChild(f);
form.submit();
}
});
/**
* Refund Details
*/
function refundDetails(id, order, credit_note) {
console.log(order);
$.ajax({
url: '/admin/note-credito/' + credit_note,
data: {
'Order': order
},
dataType: "json"
}).then(function(data){
$('tr.credit-note-detail').remove();
if(data.status == 'OK'){
var prodotti_ordine = data.data.prodotti_ordine;
var prodotti_notacredito = data.data.prodotti_notacredito;
var shipping_notacredito = data.data.shipping_notacredito;
var o = '<tr class="credit-note-detail">';
o += '<td colspan="11"> \
<div style="text-align:center"><h5>Informazioni Nota Credito '+credit_note+'<h5></div>\
<table id="creditnote-detail-'+id+'" class="table table-striped credit-note-detail-table" style="background-color:#EEE">\
<thead><tr><th>Nome riga</th><th>SKU</th><th>Quantità</th><th>Prezzo</th><th>Quantità da rimborsare</th><th>Prezzo da rimborsare</th></tr></thead>\
<tbody>';
for(var i=0; i < prodotti_ordine.length; i++) {
var refundedQty = 0;
var refundedPrice = 0.00;
for (var j=0; j< prodotti_notacredito.length; j++) {
if(prodotti_notacredito[j].SKU == prodotti_ordine[i].SKU) {
refundedQty = prodotti_notacredito[j].QuantityRefund;
refundedPrice = Math.round(prodotti_notacredito[j].PriceRefund,2);
}
}
o += '<tr class="credit-note-product">\
<td><span class="creditnote-detail-name">'+prodotti_ordine[i].Name+'</span></td>\
<td><span class="creditnote-detail-sku">'+prodotti_ordine[i].SKU+'</span></td>\
<td><span class="creditnote-detail-quantity" data-value="'+prodotti_ordine[i].Quantity+'">' + prodotti_ordine[i].Quantity +'</span></td>\
<td><span class="creditnote-detail-price" data-value="'+prodotti_ordine[i].Price+'">' + getPrice(prodotti_ordine[i].Price, 2) + ' ' + getCurrencySymbol(data.data.Currency) +'</span></td>\
<td><input class="creditnote-detail-refund-quantity" type="number" value="'+refundedQty+'" min="0" max="'+prodotti_ordine[i].Quantity+'" onchange="calcRefundPrice(this)"></td>\
<td><input class="creditnote-detail-refund-price" type="text" value="'+refundedPrice+'" onchange="calcTotal()">'+ getCurrencySymbol(data.data.Currency) +'</td>\
</tr>';
}
for(var i=0; i < prodotti_notacredito.length; i++) {
if (prodotti_notacredito[i].SKU == '') {
o += '<tr class="creditnote-detail-new-row">\
<td><input class="creditnote-detail-name" "type="text" value="'+prodotti_notacredito[i].Name+'" placeholder="Nuova riga" style="width:100%"></td>\
<td></td><td></td><td></td>\
<td><input class="creditnote-detail-new-row-quantity" type="number" value="'+prodotti_notacredito[i].QuantityRefund+'" min="0"></td>\
<td><input class="creditnote-detail-new-row-price" type="text" value="'+getPrice(prodotti_notacredito[i].PriceRefund,2)+'" onchange="calcTotal()"> ' + getCurrencySymbol(data.data.Currency) +'</td></tr>';
}
}
o += '<tr class="creditnote-detail-new-row" style="display:none">\
<td><input class="creditnote-detail-name" "type="text" value="" placeholder="Nuova riga" style="width:100%"></td>\
<td></td><td></td><td></td>\
<td><input class="creditnote-detail-new-row-quantity" type="number" value="0" min="0"></td>\
<td><input class="creditnote-detail-new-row-price" type="text" value="0.00" onchange="calcTotal()"> ' + getCurrencySymbol(data.data.Currency) +'</td></tr>';
o += '<tr class="new-row"><td colspan="7"><button type="button" class="btn btn-medium waves-effect waves-light blue" onclick="newEmptyRow(this)">+ Nuova Riga</td></tr>';
if(data.data.Shipping > 0) {
var shippingPriceRefund = 0.00;
var shippingQtyRefund = 0;
if(typeof(shipping_notacredito['ShippingPriceRefund'])!== "undefined") {
shippingQtyRefund = 1;
shippingPriceRefund = parseFloat(getPrice(shipping_notacredito['ShippingPriceRefund'], 2));
}
o += '<tr class="credit-note-shipping">\
<td><b>RIMBORSO SPESE SPEDIZIONE:</b></td>\
<td></td>\
<td></td>\
<td><span class="creditnote-detail-shipping" data-value="'+data.data.Shipping+'">'+getPrice(data.data.Shipping,2)+'</span></td>\
<td><input class="creditnote-detail-refund-shipping-quantity" type="number" value="'+shippingQtyRefund+'" min="0" max="1" onclick="calcRefundShipping(this)" /></td>\
<td><input class="creditnote-detail-refund-shipping" type="text" value="'+shippingPriceRefund+'" onchange="calcTotal()" />' + getCurrencySymbol(data.data.Currency) +'</td>\
</tr>';
}
o += '<tr><td colspan="7"><hr/></td></tr>';
o += '<tr class="credit-note-total">\
<td colspan="4"></td>\
<td><b>Totale:</b> </td>\
<td><span value=""><input class="creditnote-detail-refund-total" type="text" value="0.00" onchange="calcTotal()" disabled></span> / <span class="credit-note-refund-amount" data-value="'+data.data.RefundAmount+'">'+getPrice(data.data.RefundAmount,2)+' '+ getCurrencySymbol(data.data.Currency) +'</span><td>\
</tr>';
o += '<tr><td colspan="7"><hr/></td></tr>';
o += '<tr><td colspan="7" style="text-align:center">\
<button id="credit-note-details-button-save" type="button" class="btn btn-medium waves-effect waves-light" onclick="saveNotaCreditoDetails('+id+')">Salva Dettagli Nota Credito</button>\
<button id="credit-note-details-button-cancel" type="button" class="btn btn-medium waves-effect waves-light red">Annulla</button>\
</td></tr>';
o += '</tbody>\
</table>\
</td>';
o += '</tr>';
$('#notacredito-actions-'+id).parent().parent().after(o);
calcTotal();
}
});
}
function calcRefundPrice(el)
{
var row = $(el).parent().parent();
var qty = el.value;
var price = parseFloat(row.find('span.creditnote-detail-price').data('value'));
row.find('input.creditnote-detail-refund-price').val(price * qty).change();
}
function calcRefundShipping(el)
{
var row = $(el).parent().parent();
var qty = el.value;
var price = parseFloat(row.find('span.creditnote-detail-shipping').data('value'));
row.find('input.creditnote-detail-refund-shipping').val(price * qty).change();
}
function calcTotal()
{
var sum = 0;
$('.creditnote-detail-refund-price').each(function(i,v){
//qty = parseInt($(this).parent().parent().find('input.creditnote-detail-refund-quantity').val());
sum += parseFloat(v.value);
});
$('.creditnote-detail-new-row-price').each(function(i,v){
sum += parseFloat(v.value);
});
$('.creditnote-detail-refund-shipping').each(function(i,v){sum += parseFloat(v.value);});
$('.creditnote-detail-refund-total').val(Math.round(sum * 100,2)/100).data('value', sum);
};
function newEmptyRow(el) {
var new_row = $('tr.creditnote-detail-new-row').eq(0).clone();
console.log(new_row);
$(el).parent().parent().before(new_row.show());
}
function saveNotaCreditoDetails(id) {
var post_data = {'id': id, 'products': [], 'shipping': [], 'total': 0.00};
var upload = true;
$('tr.credit-note-product').each(function(i,v){
var _product_data = {};
var $el = $(v);
_product_data['Name'] = $el.find('span.creditnote-detail-name').html();
_product_data['SKU'] = $el.find('span.creditnote-detail-sku').html();
_product_data['RefundQuantity'] = parseFloat($el.find('input.creditnote-detail-refund-quantity').val());
_product_data['RefundPrice'] = parseFloat($el.find('input.creditnote-detail-refund-price').val());
post_data['products'].push(_product_data);
});
$('tr.creditnote-detail-new-row').each(function(i,v){
var _product_data = {};
var $el = $(v);
_product_data['Name'] = $el.find('input.creditnote-detail-name').val();
_product_data['SKU'] = '';
if(_product_data['Name'] == '')
return true;
_product_data['RefundQuantity'] = parseFloat($el.find('input.creditnote-detail-new-row-quantity').val());
if(_product_data['RefundQuantity'] == 0) {
alert('Attenzione! specifica la quantità della Nuova Riga: '+_product_data['Name']);
upload = false;
return false;
}
_product_data['RefundPrice'] = parseFloat($el.find('input.creditnote-detail-new-row-price').val());
if(_product_data['RefundPrice'] == 0) {
alert('Attenzione! specifica il prezzo della Nuova Riga: '+_product_data['Name']);
upload = false;
return false;
}
post_data['products'].push(_product_data);
});
if(!upload)
return;
$('tr.credit-note-shipping').each(function(i,v){
var _product_data = {};
var $el = $(v);
_product_data['RefundQuantity'] = parseFloat($el.find('input.creditnote-detail-refund-shipping-quantity').val());
_product_data['RefundPrice'] = parseFloat($el.find('input.creditnote-detail-refund-shipping').val());
post_data['shipping'].push(_product_data);
});
post_data['total'] = parseFloat($('tr.credit-note-total').find('input.creditnote-detail-refund-total').val());
var refundAmount = getPrice($('tr.credit-note-total').find('span.credit-note-refund-amount').data('value'),2);
if( post_data['total'] != parseFloat(refundAmount) ) {
$('tr.credit-note-total').find('input.creditnote-detail-refund-total').addClass('error');
alert('Attenzione, il valore finale della nota credito non coincide con il totale rimborsato');
return;
}else{
$('tr.credit-note-total').find('input.creditnote-detail-refund-total').removeClass('error');
}
$.ajax({
url: '/admin/note-credito/',
type: "POST",
dataType: "json",
data: post_data
}).then(function(data) {
alert(data.message);
});
}
</script>
{% endblock %}
<style>
td, th {
padding: 2px 5px;
font-size: 0.9rem;
}
th.sortable {
text-decoration: underline;
}
th.sortable.asc::after {
content: '\2b61';
}
th.sortable.desc::after {
content: '\2b63';
}
table.striped > thead > tr{
background-color: #e4e4e4;
border-bottom: 1px solid #CCC !important;
}
tbody > tr > td:first-child{
background-color: #e4e4e4;
}
tr.selectable:hover > td{
cursor: pointer;
background-color: #BBB;
}
.modal {
max-height: 100%;
}
.modal.modal-fixed-footer {
height: 90%;
}
.incassi-table-pagination {
text-align: center;
display: flex;
flex-wrap: wrap;
justify-content: center;
}
.incassi-table-pagination .page {
display: inline;
padding: 3px;
}
.incassi-table-pagination .page a {
color: #000;
}
.incassi-table-pagination .page.active a {
font-weight: bold;
padding: 5px;
text-decoration: underline;
}
div.select-wrapper{
display:inline-block;
}
#incassiSenzaOrdine thead td
{
font-weight: bold;
color: #000;
}
#incassiSenzaOrdine td
{
color: #000;
}
#NotaCreditoPreviewModal tbody tr.error td {
font-weight: bold;
color: #f00;
border: 2px solid #F00;
}
button.btn.btn-small.waves-effect.waves-light {
margin: 0px 15px 0px 15px;
}
i.arrot {
color: brown;
font-size: 10px;
text-align: right;
}
tr.credit-note-detail {
background-color: #FFF !important;
}
table.credit-note-detail-table th{
border-bottom: 1px solid #DDD !important;
text-align:center;
}
table.credit-note-detail-table td {
text-align:center;
}
table.credit-note-detail-table input{
background-color: #FFF !important;
border: 1px solid #DDD !important;
}
table.credit-note-detail-table input[type="number"],
table.credit-note-detail-table input[type="text"]{
width: 30%;
text-align: center;
}
tbody > tr.credit-note-detail > td{
background-color: #EEE !important;
}
input.creditnote-detail-refund-total.error {
border: 1px solid #F00 !important;
}
</style>
{% endblock %}