CHANGE_Client Invoice
This commit is contained in:
parent
f7db3c4513
commit
78ba1fc582
@ -27,6 +27,7 @@ use Mpdf\Mpdf;
|
|||||||
use CodeIgniter\API\ResponseTrait;
|
use CodeIgniter\API\ResponseTrait;
|
||||||
use App\Helpers\InvNoHelper;
|
use App\Helpers\InvNoHelper;
|
||||||
use App\Helpers\ClientDetailsUpdate;
|
use App\Helpers\ClientDetailsUpdate;
|
||||||
|
use Config\Services;
|
||||||
|
|
||||||
class Invoice extends BaseController
|
class Invoice extends BaseController
|
||||||
{
|
{
|
||||||
@ -145,6 +146,8 @@ class Invoice extends BaseController
|
|||||||
'status'=> $status,
|
'status'=> $status,
|
||||||
'isactive' => 1,
|
'isactive' => 1,
|
||||||
'branch_id'=> $this->session->get('logged_user_branch_id'),
|
'branch_id'=> $this->session->get('logged_user_branch_id'),
|
||||||
|
'paid_advance' => $this->request->getPost('paid_advance'),
|
||||||
|
'discount' => $this->request->getPost('discount'),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
@ -299,10 +302,11 @@ class Invoice extends BaseController
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public function download_invoice($invoice_id)
|
public function download_invoice($enc_id)
|
||||||
{
|
{
|
||||||
if(!$this->session->has('logged_user')) { return redirect()->to(base_url()); }
|
if(!$this->session->has('logged_user')) { return redirect()->to(base_url()); }
|
||||||
// Fetch the invoice data based on $invoice_id
|
// Fetch the invoice data based on $invoice_id
|
||||||
|
$invoice_id = base64_decode($enc_id);
|
||||||
$InvoiceModel = new InvoiceModel();
|
$InvoiceModel = new InvoiceModel();
|
||||||
$InvoiceChildModel = new InvoiceChildModel();
|
$InvoiceChildModel = new InvoiceChildModel();
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@ class InvoiceModel extends Model
|
|||||||
protected $table = 'invoice';
|
protected $table = 'invoice';
|
||||||
protected $primaryKey = 'invoice_id';
|
protected $primaryKey = 'invoice_id';
|
||||||
protected $allowedFields = ['invoice_id','invoice_number','sale_order','invoice_date','sales_commision','client_name','status','vehicle_reg_number','billing_address','billing_city','billing_state','billing_country','billing_postal_code','terms_condition','job_card_id','isactive',
|
protected $allowedFields = ['invoice_id','invoice_number','sale_order','invoice_date','sales_commision','client_name','status','vehicle_reg_number','billing_address','billing_city','billing_state','billing_country','billing_postal_code','terms_condition','job_card_id','isactive',
|
||||||
'type','mobile_no','email','invoice_child_id','order_number','mode_of_payment','subtotal','tax','discount','total','terms_condition','branch_id','vehicle_id' ];
|
'type','mobile_no','email','invoice_child_id','order_number','mode_of_payment','subtotal','tax','discount','total','terms_condition','branch_id','vehicle_id','paid_advance' ];
|
||||||
protected $beforeInsert = ['setCreatedBy'];
|
protected $beforeInsert = ['setCreatedBy'];
|
||||||
protected $beforeUpdate = ['setUpdatedBy'];
|
protected $beforeUpdate = ['setUpdatedBy'];
|
||||||
|
|
||||||
|
|||||||
@ -342,19 +342,23 @@
|
|||||||
<input type="text" class="form-control" id="invoicetax" name="invoice_tax" readonly
|
<input type="text" class="form-control" id="invoicetax" name="invoice_tax" readonly
|
||||||
value="<?= isset($invoice['tax']) ? $invoice['tax'] : '' ?>">
|
value="<?= isset($invoice['tax']) ? $invoice['tax'] : '' ?>">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- <div class="form-group">
|
|
||||||
<label for="discount">Discount Amount</label>
|
|
||||||
<input type="number" class="form-control" id="discount" name="discount" onchange="calculateGrandTotal(this.value)" min="0" readonly value="<?= isset($invoice['discount']) ? $invoice['discount'] : '' ?>" >
|
|
||||||
</div> -->
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="grandtotal">Total</label>
|
<label for="grandtotal">Total Amount</label>
|
||||||
<input type="text" class="form-control" id="grandtotal" name="grand_total" readonly
|
<input type="text" class="form-control" id="grandtotal" name="grand_total" readonly
|
||||||
value="<?= isset($invoice['total']) ? $invoice['total'] : '' ?>">
|
value="<?= isset($invoice['total']) ? $invoice['total'] : '' ?>">
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="discount">Discount Amount</label>
|
||||||
|
<input type="number" class="form-control" id="discount" name="discount" onchange="calculateBalance()" min="0" value="<?= isset($invoice['discount']) ? $invoice['discount'] : '' ?>" >
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="advance">Paid Advance</label>
|
||||||
|
<input type="number" class="form-control" id="paid_advance" name="paid_advance" onchange="calculateBalance()" min="0" value="<?= isset($invoice['paid_advance']) ? $invoice['paid_advance'] : '0.00' ?>" >
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="balance">Balance Amount</label>
|
||||||
|
<input type="text" class="form-control" id="balance" readonly >
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@ -1047,32 +1051,28 @@ $(document).ready(function() {
|
|||||||
|
|
||||||
|
|
||||||
// Function to calculate total discount
|
// Function to calculate total discount
|
||||||
function calculateDiscount() {
|
// function calculateDiscount() {
|
||||||
var totalDiscount = 0;
|
// var totalDiscount = 0;
|
||||||
$('.item-discount-amount').each(function(index, element) {
|
// $('.item-discount-amount').each(function(index, element) {
|
||||||
var discountAmount = parseFloat($(element).val()) || 0;
|
// var discountAmount = parseFloat($(element).val()) || 0;
|
||||||
var discountType = $(element).closest('tr').find('.item-discount-type').val();
|
// var discountType = $(element).closest('tr').find('.item-discount-type').val();
|
||||||
if (discountType === '%') {
|
// if (discountType === '%') {
|
||||||
var rate = $(element).closest('tr').find('.item-rate').val();
|
// var rate = $(element).closest('tr').find('.item-rate').val();
|
||||||
var quantity = $(element).closest('tr').find('.item-quantity').val();
|
// var quantity = $(element).closest('tr').find('.item-quantity').val();
|
||||||
var amount = rate * quantity;
|
// var amount = rate * quantity;
|
||||||
discountAmount = amount * discountAmount / 100;
|
// discountAmount = amount * discountAmount / 100;
|
||||||
}
|
// }
|
||||||
totalDiscount += discountAmount;
|
// totalDiscount += discountAmount;
|
||||||
});
|
// });
|
||||||
return totalDiscount;
|
// return totalDiscount;
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Function to calculate total
|
// Function to calculate total
|
||||||
function calculateTotal() {
|
function calculateTotal() {
|
||||||
var subtotal = calculateSubtotal();
|
var subtotal = calculateSubtotal();
|
||||||
|
|
||||||
var total_tax_amount = $('#invoicetax').val();
|
var total_tax_amount = $('#invoicetax').val();
|
||||||
|
|
||||||
// console.log(total_tax_amount + parseInt(subtotal));
|
// console.log(total_tax_amount + parseInt(subtotal));
|
||||||
|
var total = parseFloat(total_tax_amount) + parseFloat(subtotal);
|
||||||
var discount = calculateDiscount();
|
|
||||||
var total = parseFloat(total_tax_amount) + parseFloat(subtotal) - discount;
|
|
||||||
// return total;
|
// return total;
|
||||||
return Math.round(total);
|
return Math.round(total);
|
||||||
}
|
}
|
||||||
@ -1081,8 +1081,9 @@ $(document).ready(function() {
|
|||||||
function updateCalculations() {
|
function updateCalculations() {
|
||||||
$('#subtotal').val(calculateSubtotal().toFixed(2));
|
$('#subtotal').val(calculateSubtotal().toFixed(2));
|
||||||
$('#invoicetax').val(calculateTax().toFixed(2));
|
$('#invoicetax').val(calculateTax().toFixed(2));
|
||||||
$('#discount').val(calculateDiscount().toFixed(2));
|
// $('#discount').val(calculateDiscount().toFixed(2));
|
||||||
$('#grandtotal').val(calculateTotal().toFixed(2));
|
$('#grandtotal').val(calculateTotal().toFixed(2));
|
||||||
|
calculateBalance();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Event listener for discount change
|
// Event listener for discount change
|
||||||
@ -1139,6 +1140,8 @@ $(document).ready(function() {
|
|||||||
|
|
||||||
|
|
||||||
$('#itemTable tbody').append(newRow);
|
$('#itemTable tbody').append(newRow);
|
||||||
|
$('#discount').val(0);
|
||||||
|
$('#paid_advance').val(0);
|
||||||
initializeSelect2();
|
initializeSelect2();
|
||||||
updateCalculations();
|
updateCalculations();
|
||||||
initializeRowCalculations(newRow);
|
initializeRowCalculations(newRow);
|
||||||
@ -1160,8 +1163,7 @@ function initializeRowCalculations(row) {
|
|||||||
calculateAmount(row);
|
calculateAmount(row);
|
||||||
updateCalculations();
|
updateCalculations();
|
||||||
}
|
}
|
||||||
</script>
|
|
||||||
<script>
|
|
||||||
// Event listener for removing item
|
// Event listener for removing item
|
||||||
// Event listener for removing item
|
// Event listener for removing item
|
||||||
$(document).on('click', '.remove-item', function() {
|
$(document).on('click', '.remove-item', function() {
|
||||||
@ -1180,6 +1182,7 @@ $(document).on('click', '.remove-item', function() {
|
|||||||
// If successful, remove the row from the table
|
// If successful, remove the row from the table
|
||||||
$(this).closest('tr').remove();
|
$(this).closest('tr').remove();
|
||||||
updateCalculations(); // Update calculations after removing the row
|
updateCalculations(); // Update calculations after removing the row
|
||||||
|
calculateBalance();
|
||||||
} else {
|
} else {
|
||||||
// If not successful, display an error message
|
// If not successful, display an error message
|
||||||
// alert('Error occurred while deleting the item.');
|
// alert('Error occurred while deleting the item.');
|
||||||
@ -1780,4 +1783,48 @@ $(document).ready(function() {
|
|||||||
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
<script>
|
||||||
|
function calculateBalance() {
|
||||||
|
var total = parseFloat($('#grandtotal').val()) || 0;
|
||||||
|
var discount = parseFloat($('#discount').val()) || 0;
|
||||||
|
var advance = parseFloat($('#paid_advance').val()) || 0;
|
||||||
|
|
||||||
|
// Ensure discount or advance not negative
|
||||||
|
if (discount < 0) discount = 0;
|
||||||
|
if (advance < 0) advance = 0;
|
||||||
|
|
||||||
|
// If total of discount + advance exceeds total, fix it
|
||||||
|
if (discount + advance > total) {
|
||||||
|
var excess = (discount + advance) - total;
|
||||||
|
|
||||||
|
// Determine which field caused the excess (the last changed one)
|
||||||
|
// We can check active element
|
||||||
|
var lastChanged = document.activeElement.id;
|
||||||
|
|
||||||
|
if (lastChanged === 'discount') {
|
||||||
|
discount = total - advance;
|
||||||
|
$('#discount').val(discount.toFixed(2));
|
||||||
|
} else if (lastChanged === 'paid_advance') {
|
||||||
|
advance = total - discount;
|
||||||
|
$('#paid_advance').val(advance.toFixed(2));
|
||||||
|
} else {
|
||||||
|
// If unknown, just cap both
|
||||||
|
if (discount > total) discount = total;
|
||||||
|
if (advance > total - discount) advance = total - discount;
|
||||||
|
$('#discount').val(discount.toFixed(2));
|
||||||
|
$('#paid_advance').val(advance.toFixed(2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate balance
|
||||||
|
var balance = total - (discount + advance);
|
||||||
|
if (balance < 0) balance = 0;
|
||||||
|
|
||||||
|
// Update fields
|
||||||
|
$('#discount').val(discount.toFixed(2));
|
||||||
|
$('#paid_advance').val(advance.toFixed(2));
|
||||||
|
$('#balance').val(balance.toFixed(2));
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -79,7 +79,8 @@
|
|||||||
<div class="dropdown-menu dropdown-menu-right">
|
<div class="dropdown-menu dropdown-menu-right">
|
||||||
<a href="<?= "invoices/new/" . $value['invoice_id']; ?>" class="dropdown-item edit-button" onclick="datatableInvoice('invoice_tr<?php echo $index+1; ?>')"><i class="ri-pencil-line mr-2 text-muted font-18 vertical-middle"></i>Edit</a>
|
<a href="<?= "invoices/new/" . $value['invoice_id']; ?>" class="dropdown-item edit-button" onclick="datatableInvoice('invoice_tr<?php echo $index+1; ?>')"><i class="ri-pencil-line mr-2 text-muted font-18 vertical-middle"></i>Edit</a>
|
||||||
<!-- <a href="<?= "invoices/delete/" . $value['invoice_id']; ?>" class="dropdown-item delete-button" onclick="datatableInvoice('invoice_tr<?php echo $index+1; ?>')"><i class="ri-delete-bin-line mr-2 text-muted font-18 vertical-middle"></i>Delete</a> -->
|
<!-- <a href="<?= "invoices/delete/" . $value['invoice_id']; ?>" class="dropdown-item delete-button" onclick="datatableInvoice('invoice_tr<?php echo $index+1; ?>')"><i class="ri-delete-bin-line mr-2 text-muted font-18 vertical-middle"></i>Delete</a> -->
|
||||||
<a href="#" data-invoices-id="<?= $value['invoice_id']; ?>" class="dropdown-item preview-invoice" href="#" title="Preview Invoice"><i class="ri-book-read-line mr-2 text-muted font-18 vertical-middle"></i>Preview Invoice</a>
|
<a href="#" data-invoices-id="<?= $value['invoice_id']; ?>" data-enc-id="<?= base64_encode($value['invoice_id']); ?>" class="dropdown-item preview-invoice" href="#" title="Preview Invoice"><i class="ri-book-read-line mr-2 text-muted font-18 vertical-middle"></i>Preview Invoice</a>
|
||||||
|
<a href="#" data-invoices-id="<?= $value['invoice_id']; ?>" data-enc-id="<?= base64_encode($value['invoice_id']); ?>" class="dropdown-item pdf-invoice-link" href="#" title="Invoice pdf link"><i class="ri-file-copy-2-fill mr-2 text-muted font-18 vertical-middle"></i>Copy Invoice PDF as Link</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
@ -201,6 +202,8 @@
|
|||||||
|
|
||||||
$(document).on('click', '.preview-invoice', function() {
|
$(document).on('click', '.preview-invoice', function() {
|
||||||
var Id = $(this).data('invoices-id');
|
var Id = $(this).data('invoices-id');
|
||||||
|
var encId = $(this).data('enc-id');
|
||||||
|
var link = '<?= base_url("invoices/download/") ?>' + encId;
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: 'GET',
|
type: 'GET',
|
||||||
url: 'invoices/preview/'+Id,
|
url: 'invoices/preview/'+Id,
|
||||||
@ -210,7 +213,7 @@
|
|||||||
$('#PreviewInvoiceModal').modal('show');
|
$('#PreviewInvoiceModal').modal('show');
|
||||||
$('#PreviewInvoiceModalLabel').text('Invoice Preview ');
|
$('#PreviewInvoiceModalLabel').text('Invoice Preview ');
|
||||||
$('#PreviewInvoiceModal .modal-body').html(response.data);
|
$('#PreviewInvoiceModal .modal-body').html(response.data);
|
||||||
$('#downloadInvoiceButton').attr('href', '<?= base_url("invoices/download/") ?>' + Id);
|
$('#downloadInvoiceButton').attr('href', link);
|
||||||
$('#printInvoiceButton').attr('data-id', Id);
|
$('#printInvoiceButton').attr('data-id', Id);
|
||||||
}else{
|
}else{
|
||||||
$('#PreviewInvoiceModal').modal('hide');
|
$('#PreviewInvoiceModal').modal('hide');
|
||||||
@ -271,4 +274,20 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$(document).on('click', '.pdf-invoice-link', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
var Id = $(this).data('invoices-id');
|
||||||
|
var encId = $(this).data('enc-id');
|
||||||
|
var link = '<?= base_url("invoices/download/") ?>' + encId;
|
||||||
|
|
||||||
|
// Copy the link to clipboard
|
||||||
|
navigator.clipboard.writeText(link).then(() => {
|
||||||
|
alert("Invoice link copied! You can paste it into WhatsApp.");
|
||||||
|
}).catch(() => {
|
||||||
|
alert("Failed to copy link.");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
@ -228,16 +228,32 @@
|
|||||||
<td style="width: 33.3333%; height: 36px; text-align: right; font-size: small">Total</td>
|
<td style="width: 33.3333%; height: 36px; text-align: right; font-size: small">Total</td>
|
||||||
<td style="width: 25.7946%; height: 36px; text-align: right; font-size: small"><?= number_format($subTotal+$subTax, 2, '.', ''); ?></td>
|
<td style="width: 25.7946%; height: 36px; text-align: right; font-size: small"><?= number_format($subTotal+$subTax, 2, '.', ''); ?></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr style="height: 21px;">
|
|
||||||
<td style="width: 33.3333%; height: 21px;"> </td>
|
|
||||||
<td style="width: 33.3333%; height: 21px; text-align: right; font-size: small">Discount</td>
|
|
||||||
<td style="width: 25.7946%; height: 21px; text-align: right; font-size: small">0.00</td>
|
|
||||||
</tr>
|
|
||||||
<tr style="height: 36px;">
|
<tr style="height: 36px;">
|
||||||
<td style="width: 33.3333%; height: 36px;"> </td>
|
<td style="width: 33.3333%; height: 36px;"> </td>
|
||||||
<td style="width: 33.3333%; height: 36px; text-align: right; font-size: small"><strong>Grand Total</strong></td>
|
<td style="width: 33.3333%; height: 36px; text-align: right; font-size: small"><strong>Grand Total</strong></td>
|
||||||
<td style="width: 25.7946%; height: 36px; text-align: right; font-size: small"><strong>₹ <?= number_format($grandTotal, 2, '.', ''); ?></strong></td>
|
<td style="width: 25.7946%; height: 36px; text-align: right; font-size: small"><strong>₹ <?= number_format($grandTotal, 2, '.', ''); ?></strong></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr style="height: 36px;">
|
||||||
|
<td style="width: 33.3333%; height: 36px;"> </td>
|
||||||
|
<td style="width: 33.3333%; height: 36px; text-align: right; font-size: small">Discount</td>
|
||||||
|
<td style="width: 25.7946%; height: 36px; text-align: right; font-size: small"><?= isset($invoice[0]->discount) ? number_format((float)$invoice[0]->discount, 2, '.', '') : '0.00'; ?></td>
|
||||||
|
</tr>
|
||||||
|
<tr style="height: 36px;">
|
||||||
|
<td style="width: 33.3333%; height: 36px;"> </td>
|
||||||
|
<td style="width: 33.3333%; height: 36px; text-align: right; font-size: small">Paid Advance</td>
|
||||||
|
<td style="width: 25.7946%; height: 36px; text-align: right; font-size: small"><?= isset($invoice[0]->paid_advance) ? number_format((float)$invoice[0]->paid_advance, 2, '.', '') : '0.00'; ?></td>
|
||||||
|
</tr>
|
||||||
|
<tr style="height: 36px;">
|
||||||
|
<td style="width: 33.3333%; height: 36px;"> </td>
|
||||||
|
<td style="width: 33.3333%; height: 36px; text-align: right; font-size: small">Balance Amount</td>
|
||||||
|
<td style="width: 25.7946%; height: 36px; text-align: right; font-size: small">
|
||||||
|
<?php
|
||||||
|
$discount = (float) $invoice[0]->discount;
|
||||||
|
$paid_advance = (float) $invoice[0]->paid_advance;
|
||||||
|
$balance = $grandTotal - ($discount + $paid_advance); ?>
|
||||||
|
<strong>₹ <?= number_format(max(0, $balance), 2, '.', ''); ?></strong>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p> </p>
|
<p> </p>
|
||||||
|
|||||||
@ -421,6 +421,7 @@ $(document).ready(function() {
|
|||||||
}else{
|
}else{
|
||||||
var total_amount = parseFloat($("input[name='total_amount']").val());
|
var total_amount = parseFloat($("input[name='total_amount']").val());
|
||||||
var unitPrice = total_amount / parseFloat((tax / 100) + 1);
|
var unitPrice = total_amount / parseFloat((tax / 100) + 1);
|
||||||
|
if (isNaN(unitPrice)) unitPrice = 0;
|
||||||
$("input[name='unit_price']").val(unitPrice.toFixed(2));
|
$("input[name='unit_price']").val(unitPrice.toFixed(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user