80 lines
3.1 KiB
JavaScript
80 lines
3.1 KiB
JavaScript
$(document).ready(function() {
|
|
const productsBody = $('#fiscal-products-body');
|
|
const paymentsContainer = $('#fiscal-payments-container');
|
|
const addPaymentBtn = $('#add-payment-btn');
|
|
const paymentRowTemplate = $('#payment-row-template');
|
|
let paymentIndex = 0; // A counter for unique payment input names
|
|
|
|
// --- Core Calculation Function ---
|
|
function updateTotals() {
|
|
let productsTotal = 0;
|
|
productsBody.find('.product-row').each(function() {
|
|
const quantity = parseFloat($(this).find('.fiscal-quantity').val()) || 0;
|
|
const price = parseFloat($(this).find('.fiscal-price').val()) || 0;
|
|
const rowTotal = quantity * price;
|
|
$(this).find('.fiscal-row-total').text(rowTotal.toFixed(2));
|
|
productsTotal += rowTotal;
|
|
});
|
|
|
|
let discountsTotal = 0;
|
|
$('.discount-row').each(function() {
|
|
const discountValue = parseFloat($(this).find('.fiscal-discount-value').text().replace(',', '.')) || 0;
|
|
discountsTotal += Math.abs(discountValue);
|
|
});
|
|
|
|
const grandTotal = productsTotal - discountsTotal;
|
|
|
|
let paymentsTotal = 0;
|
|
paymentsContainer.find('.payment-row').each(function() {
|
|
const paymentAmount = parseFloat($(this).find('.payment-amount').val()) || 0;
|
|
paymentsTotal += paymentAmount;
|
|
});
|
|
|
|
// Update summary display
|
|
$('#fiscal-products-total').text(productsTotal.toFixed(2));
|
|
$('#fiscal-discounts-total').text(discountsTotal.toFixed(2));
|
|
$('#fiscal-grand-total').text(grandTotal.toFixed(2));
|
|
$('#fiscal-payments-total').text(paymentsTotal.toFixed(2));
|
|
|
|
const mismatchError = $('#fiscal-total-mismatch-error');
|
|
const createCheckBtn = $('#create-fiscal-check-btn');
|
|
|
|
if (Math.abs(grandTotal - paymentsTotal) > 0.001) {
|
|
mismatchError.show();
|
|
createCheckBtn.prop('disabled', true);
|
|
} else {
|
|
mismatchError.hide();
|
|
createCheckBtn.prop('disabled', grandTotal <= 0);
|
|
}
|
|
}
|
|
|
|
// --- Event Handlers ---
|
|
$('form').on('input', '.fiscal-quantity, .fiscal-price', updateTotals);
|
|
paymentsContainer.on('input', '.payment-amount', updateTotals);
|
|
|
|
addPaymentBtn.on('click', function() {
|
|
const newRow = $(paymentRowTemplate.html());
|
|
newRow.find('.payment-type').attr('name', `payments[${paymentIndex}][type]`);
|
|
newRow.find('.payment-amount').attr('name', `payments[${paymentIndex}][value]`);
|
|
paymentsContainer.append(newRow);
|
|
|
|
if (paymentsContainer.find('.payment-row').length === 1) {
|
|
const grandTotal = parseFloat($('#fiscal-grand-total').text());
|
|
if (grandTotal > 0) {
|
|
newRow.find('.payment-amount').val(grandTotal.toFixed(2));
|
|
}
|
|
}
|
|
|
|
paymentIndex++;
|
|
updateTotals();
|
|
});
|
|
|
|
paymentsContainer.on('click', '.remove-payment-btn', function() {
|
|
$(this).closest('.payment-row').remove();
|
|
updateTotals();
|
|
});
|
|
|
|
// --- Initial State ---
|
|
updateTotals();
|
|
addPaymentBtn.trigger('click');
|
|
}); |