stock changes 08-04-2025

This commit is contained in:
vadivelJ96 2025-04-08 17:59:23 +05:30
parent 0eb8ce8e28
commit 0883be155c
4 changed files with 384 additions and 305 deletions

View File

@ -330,6 +330,7 @@ $routes->post('updateGasShortage','Inwardgateregister::updateGasShortage');
$routes->get('gasCylinderEntered','Inwardgateregister::gasCylinderEntered');
$routes->get('gasCylinderPending','Inwardgateregister::gasCylinderPending');
$routes->get('gasCylinderReturned','Inwardgateregister::gasCylinderReturned');
$routes->post('gasCylindersByIgr','Inwardgateregister::gasCylindersByIgr');
$routes->post('getGasShortageDetail',"Inwardgateregister::getGasShortageDetail");

View File

@ -1696,6 +1696,26 @@ function updateIGRWeight(){
]);
}
}
public function gasCylindersByIgr(){
$IGRNO = $this->request->getPost('IGRNO');
$gasMaterialCodes = $this->rawMaterialDetails_model->getAllGasMaterialCode();
$gasMaterialCodes = array_column($gasMaterialCodes,'MaterialCode');
$cylinderDetails = $this->inwardgateregister_model->gasCylindersByIgr($IGRNO , $gasMaterialCodes);
$response = [
'status' => 'success',
'message' => 'Gas cylinders retrieved successfully.',
'data' => $cylinderDetails
];
return $this->response->setJSON($response);
}
/*
********************************************************* sec_gas_shortage_ends **************************************************************

View File

@ -1515,4 +1515,41 @@ class Inwardgateregister_model extends Model
return $result;
}
public function gasCylindersByIgr($IGRNO, $gasMaterialCodes) {
$builder = $this->db->table('t_igr_master as t_igrm')
->select("
t_igrm.IGRNO,
tgsd.fullCylinderDate,
tgsd.cylinderNo,
tgsd.grossWeight,
tgsd.emptyCylinderDate,
tgsd.tareWeight,
tgsd.netWeight,
tgsd.actualWeight,
tgsd.shortage,
tgsd.invoiceNo,
t_igrm.DeliveryChellanDate,
t_igrm.DriverName,
t_igrm.VehicleNo
")
->join('t_igr_details tigrd', 'tigrd.IGRNO = t_igrm.IGRNO')
->join('t_purchaseorder_master tpom', 'tpom.PONO = t_igrm.PONO', 'left')
->join('t_supplierdetailsn tsd', 'tsd.SupplierID = tpom.SupplierID')
->join('t_gasshortagedetails tgsd', 'tgsd.IGRNO = t_igrm.IGRNO', 'left')
->whereIn('tigrd.MaterialCode', $gasMaterialCodes)
->where("DATE(tigrd.CreatedDate) >= '2025-04-01'")
->where('tgsd.gas_cylinder_status', 'gas_returned')
->where('t_igrm.IGRNO', $IGRNO); // Direct where clause on IGRNO in master table
$result = $builder->get()->getResultArray();
return $result;
}
}

View File

@ -3,17 +3,15 @@
<!-- Flatpickr JS -->
<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
<style>
.num {
text-align: right;
}
#Inwardgateregistertable1 thead tr th{
#Inwardgateregistertable1 thead tr th {
width: 150px;
width: 150px;
word-wrap: break-word;
white-space: normal;
white-space: normal;
}
th {
@ -75,27 +73,26 @@
.footer-textarea {
width: 100%;
padding: 10px;
border-radius: 5px;
border: 1px solid #ccc;
width: 100%;
padding: 10px;
border-radius: 5px;
border: 1px solid #ccc;
}
.send-btn {
padding: 10px 20px;
background-color: #2ecc71; /* Green color */
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
padding: 10px 20px;
background-color: #2ecc71;
/* Green color */
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}
.send-btn:hover {
background-color: #27ae60; /* Darker green on hover */
background-color: #27ae60;
/* Darker green on hover */
}
</style>
<script>
$(function() {
@ -117,22 +114,25 @@
/* background-color: darkgrey; */
outline: 1px solid slategrey;
}
.igr-remarks{
.igr-remarks {
position: relative;
}
.igr-remarks i{
.igr-remarks i {
font-size: 14px;
}
.igr-remarks span{
.igr-remarks span {
position: absolute;
top: -5px;
right: -6px;
background-color: transparent;
border-radius: 50px!important;
border-radius: 50px !important;
font-weight: 600;
width: 14px;
box-shadow: 0 0 20px 0 rgba(0,0,0,0.2);
color:#35462c;
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2);
color: #35462c;
}
</style>
<script type="text/javascript" src="<?php echo base_url(); ?>public/assets/Autocomplete/jquery.autocomplete.js"></script>
@ -148,14 +148,14 @@
<div class="row">
<div class="col-12">
<div class="page-title-box page-title-box-alt">
<div class="page-title-right">
<ol class="breadcrumb m-0">
<li class="breadcrumb-item"><a href="javascript: void(0);">Inward</a></li>
<li class="breadcrumb-item active">
<h4 class="page-title">Gas Cylinder Returned </h4>
</li>
</ol>
</div>
<div class="page-title-right">
<ol class="breadcrumb m-0">
<li class="breadcrumb-item"><a href="javascript: void(0);">Inward</a></li>
<li class="breadcrumb-item active">
<h4 class="page-title">Gas Cylinder Returned </h4>
</li>
</ol>
</div>
</div>
</div>
@ -171,30 +171,30 @@
<div class="card">
<div class="row">
<div class="col-md-8">
<form class="Date-filter-form" style="margin-top: 14px;margin-bottom: -11px;margin-left: 33px;" method="post" action="<?= base_url('ViewIGR'); ?>">
<label for="fromDate">From:</label>
<input class="form-control date_range form-date-search"
value=""
id="fromDate" name="fromDate" placeholder="Select From Date" autocomplete="off" required>
<form class="Date-filter-form" style="margin-top: 14px;margin-bottom: -11px;margin-left: 33px;" method="post" action="<?= base_url('ViewIGR'); ?>">
<label for="toDate">To:</label>
<input class="form-control date_range to-date-search"
value=""
id="toDate" name="toDate" placeholder="Select To Date" autocomplete="off" required>
<label for="fromDate">From:</label>
<input class="form-control date_range form-date-search"
value=""
id="fromDate" name="fromDate" placeholder="Select From Date" autocomplete="off" required>
<button type="submit" class="range_search_button" >
<i class="fe-search" aria-hidden="true" class="icon-button" title="Search"></i>
</button>
<i class="fe-rotate-cw range_reset_button"
style="cursor:pointer;"
aria-hidden="true" class="icon-button" id="resetButton" title="Reset"></i>
<div class="error" id="error"></div>
</form>
</div>
<label for="toDate">To:</label>
<input class="form-control date_range to-date-search"
value=""
id="toDate" name="toDate" placeholder="Select To Date" autocomplete="off" required>
<button type="submit" class="range_search_button">
<i class="fe-search" aria-hidden="true" class="icon-button" title="Search"></i>
</button>
<i class="fe-rotate-cw range_reset_button"
style="cursor:pointer;"
aria-hidden="true" class="icon-button" id="resetButton" title="Reset"></i>
<div class="error" id="error"></div>
</form>
</div>
<!-- <div class="col-md-4">
<button id="downloadExcel" class="btn btn-primary" style="margin-top: 14px;margin-bottom: -11px;margin-right: 25px;float: right;">Download Excel</button>
</div> -->
@ -203,76 +203,92 @@
<table id="view_inward_gate_register" class="table table-bordered table-hover">
<thead>
<tr>
<!-- basic details -->
<th>Full Cylinder Date</th>
<!-- basic details -->
<th>Full Cylinder Date</th>
<th>IGR No</th>
<th>Supplier</th>
<th>Supplier</th>
<th>Bill/Invoice No</th>
<th>Cylinder Name</th>
<!-- cylinderdetails -->
<!-- cylinderdetails -->
<th>Gross Weight</th>
<th>Empty Cylinder Date</th>
<th>Tare Weight</th>
<th>Net Weight</th>
<th>Tare Weight</th>
<th>Net Weight</th>
<th>Actual Weight</th>
<th>Shortage</th>
<th>Cylinder Count</th>
<th>Cylinder Pending</th>
<!-- least details -->
<!-- least details -->
<th>Bill Date</th>
<th>Driver Name</th>
<th>Vehicle No</th>
<th>Download</th>
</tr>
</thead>
<tbody>
<?php if(empty($gasCylinderReturnedList)){?>
<p align="center" > No Gas Cylinder Returned in the Given Dates..!!</p>
<?php }else{ ?>
<?php if (empty($gasCylinderReturnedList)) { ?>
<p align="center"> No Gas Cylinder Returned in the Given Dates..!!</p>
<?php } else { ?>
<?php foreach($gasCylinderReturnedList as $index => $gasCylinder):
$gasCylinder['MaterialRcvdDate'] = date('d-m-Y',strtotime($gasCylinder['MaterialRcvdDate']));
$gasCylinder['DeliveryChellanDate'] = date('d-m-Y',strtotime($gasCylinder['DeliveryChellanDate']));
$gasCylinder['emptyCylinderDate'] = date('d-m-Y',strtotime($gasCylinder['emptyCylinderDate']));
?>
<?php foreach ($gasCylinderReturnedList as $index => $gasCylinder):
$gasCylinder['MaterialRcvdDate'] = date('d-m-Y', strtotime($gasCylinder['MaterialRcvdDate']));
$gasCylinder['DeliveryChellanDate'] = date('d-m-Y', strtotime($gasCylinder['DeliveryChellanDate']));
$gasCylinder['emptyCylinderDate'] = date('d-m-Y', strtotime($gasCylinder['emptyCylinderDate']));
?>
<tr>
<!-- basic details -->
<td><?=$gasCylinder['MaterialRcvdDate']?></td>
<td><?=$gasCylinder['IGRNO-']?></td>
<td><?=$gasCylinder['SupplierName']?></td>
<td><?=$gasCylinder['DeliveryChellanOrInvoiceNo']?></td>
<td><?=$gasCylinder['MaterialName']?></td>
<!-- cylinderdetails -->
<td><?=$gasCylinder['grossWeight']?></td>
<td><?=$gasCylinder['emptyCylinderDate']?></td>
<td><?=$gasCylinder['tareWeight']?></td>
<td><?=$gasCylinder['netWeight']?></td>
<td><?=$gasCylinder['actualWeight']?></td>
<td><?=$gasCylinder['shortage']?></td>
<td><?=$gasCylinder['gasCylinderPendingCount']?></td>
<tr>
<!-- basic details -->
<td><?= $gasCylinder['MaterialRcvdDate'] ?></td>
<td><?= $gasCylinder['IGRNO-'] ?></td>
<td><?= $gasCylinder['SupplierName'] ?></td>
<td><?= $gasCylinder['DeliveryChellanOrInvoiceNo'] ?></td>
<td><?= $gasCylinder['MaterialName'] ?></td>
<!-- least details -->
<td><?=$gasCylinder['DeliveryChellanDate']?></td>
<td><?=$gasCylinder['DriverName']?></td>
<td><?=$gasCylinder['VehicleNo']?></td>
<!-- cylinderdetails -->
<td><?= $gasCylinder['grossWeight'] ?></td>
<td><?= $gasCylinder['emptyCylinderDate'] ?></td>
<td><?= $gasCylinder['tareWeight'] ?></td>
<td><?= $gasCylinder['netWeight'] ?></td>
<td><?= $gasCylinder['actualWeight'] ?></td>
<td><?= $gasCylinder['shortage'] ?></td>
<td><?= $gasCylinder['gasCylinderCount'] ?></td>
<td><?= $gasCylinder['gasCylinderPendingCount'] ?></td>
</tr>
<?php endforeach ?>
<?php } ?>
<!-- least details -->
<td><?= $gasCylinder['DeliveryChellanDate'] ?></td>
<td><?= $gasCylinder['DriverName'] ?></td>
<td><?= $gasCylinder['VehicleNo'] ?></td>
<td style="text-align: center;">
<i class="fa fa-download"
onclick="downloadExcel(this)"
title="Download" aria-hidden="true"
style="font-size:large;
cursor:pointer;
color:rgb(23, 162, 162);">
</i>
</td>
</tr>
<?php endforeach ?>
<?php } ?>
</tbody>
</table>
<div>
<div style="display: none;" id="excelTableDiv"></div>
</div>
</div> <!-- end card body-->
</div> <!-- end card -->
@ -304,31 +320,41 @@
console.log("Received date string:", dateString);
// Split the date string into date and time components
var dateTimeParts = dateString.split(' ');
var dateParts = dateTimeParts[0].split('-');
var timeParts = dateTimeParts[1].split(':');
var dateTimeParts = dateString?.split(' ');
var dateParts = dateTimeParts[0]?.split('-');
var timeParts = dateTimeParts[1]?.split(':');
// Extract individual components
var year = parseInt(dateParts[0], 10);
var month = parseInt(dateParts[1], 10) - 1; // Months are zero-based in JavaScript
var day = parseInt(dateParts[2], 10);
var hours = parseInt(timeParts[0], 10);
var minutes = parseInt(timeParts[1], 10);
var seconds = parseInt(timeParts[2], 10);
var hours = 0;
var minutes = 0;
var seconds = 0;
if(timeParts){
// Extract time components
hours = parseInt(timeParts[0], 10);
minutes = parseInt(timeParts[1], 10);
seconds = parseInt(timeParts[2], 10);
}
// Create a new Date object
var date = new Date(year, month, day, hours, minutes, seconds);
// Extract date components
var day = date.getDate().toString().padStart(2, '0');
var month = (date.getMonth() + 1).toString().padStart(2, '0'); // Months are zero-based
var year = date.getFullYear();
day = date.getDate().toString().padStart(2, '0');
month = (date.getMonth() + 1).toString().padStart(2, '0'); // Months are zero-based
year = date.getFullYear();
// Extract time components
var hours = date.getHours().toString().padStart(2, '0');
var minutes = date.getMinutes().toString().padStart(2, '0');
var seconds = date.getSeconds().toString().padStart(2, '0');
hours = date.getHours().toString().padStart(2, '0');
minutes = date.getMinutes().toString().padStart(2, '0');
seconds = date.getSeconds().toString().padStart(2, '0');
var formattedDate = '';
// Format the date and time in DD-MM-YYYY HH:MM:SS format
if (flag == 1) {
@ -355,9 +381,8 @@
<!-- data table related initialization -->
<script>
$(document).ready(function() {
// this code for table date filed ordering
// this code for table date filed ordering
$.fn.dataTable.ext.type.order['date-dd-mm-yyyy-pre'] = function(date) {
if (!date) return 0;
@ -367,27 +392,29 @@
var orderColumnIndex = <?php echo (session()->get('roleText') == 'Auditor') ? 6 : 0; ?>;
table = $('#view_inward_gate_register').DataTable({
dom: 'Blfrtip',
buttons: [
{
extend: 'excel',
text: 'Excel',
exportOptions: {
columns: ':not(:last-child)' // Exclude the last column
}
dom: 'Blfrtip',
buttons: [{
extend: 'excel',
text: 'Excel',
exportOptions: {
columns: ':not(:last-child)' // Exclude the last column
}
],
}],
pageLength: 10,
lengthMenu: [
[10, 20, 30, 50, -1],
[10, 20, 30, 50, "All"]
],
responsive: false,
ordering: true,
columnDefs: [
{ targets: parseInt(orderColumnIndex), type: 'date-dd-mm-yyyy' } // Apply custom sorting
],
order: [[parseInt(orderColumnIndex), 'desc']],
responsive: false,
ordering: true,
columnDefs: [{
targets: parseInt(orderColumnIndex),
type: 'date-dd-mm-yyyy'
} // Apply custom sorting
],
order: [
[parseInt(orderColumnIndex), 'desc']
],
language: {
paginate: {
next: '<i class="fas fa-angle-right"></i>', // Next button icon
@ -400,7 +427,7 @@
$("#resetButton").click(function() {
$("#fromDate").val('');
$("#toDate").val('');
window.location="gasCylinderReturned"
window.location = "gasCylinderReturned"
});
// Automatically focus and open the To Date picker when From Date is selected
@ -422,198 +449,192 @@
<!-- data table related date filter -->
<script>
$(document).ready(function() {
$('#fromDate , #toDate').change(function() {
let fromDate = $('#fromDate').val();
let toDate = $('#toDate').val();
$(document).ready(function() {
$('#fromDate , #toDate').change(function() {
let fromDateObj = new Date(fromDate.split('-').reverse().join('-'));
let toDateObj = new Date(toDate.split('-').reverse().join('-'));
if (fromDateObj > toDateObj) {
alert('Incorrect Date Applied For Filter..!!');
$('#toDate').attr('min', fromDate);
$('#toDate').val('');
}
});
});
let fromDate = $('#fromDate').val();
let toDate = $('#toDate').val();
</script>
let fromDateObj = new Date(fromDate.split('-').reverse().join('-'));
let toDateObj = new Date(toDate.split('-').reverse().join('-'));
if (fromDateObj > toDateObj) {
alert('Incorrect Date Applied For Filter..!!');
$('#toDate').attr('min', fromDate);
$('#toDate').val('');
<!-- while Opening gasEnteredDetails modal -->
<script>
$(document).on('click', '.gas-entered-details', function() {
let row = $(this).closest("tr");
let fullCylinderDate = row.find("td:eq(0)").text().trim();
let igrNo = row.find("td:eq(1)").text().trim();
let supplierName = row.find("td:eq(2)").text().trim();
let invoiceNo = row.find("td:eq(3)").text().trim();
let billDate = row.find("td:eq(4)").text().trim();
let driverName = row.find("td:eq(5)").text().trim();
let vehicleNo = row.find("td:eq(6)").text().trim();
let cylinderName = row.find("td:eq(7)").text().trim();
let cylinderCount = parseInt(row.find("td:eq(8)").text().trim(), 10);
// Convert fullCylinderDate to YYYY-MM-DD
if (fullCylinderDate) {
let dateParts = fullCylinderDate.split("-");
fullCylinderDate = `${dateParts[2]}-${dateParts[1]}-${dateParts[0]}`;
}
// Convert billDate to YYYY-MM-DD
if (billDate) {
let dateParts = billDate.split("-");
billDate = `${dateParts[2]}-${dateParts[1]}-${dateParts[0]}`;
}
// Assign values to modal inputs
$('#fullCylinderDate').val(fullCylinderDate);
$('#IGRNO').val(igrNo);
$('#supplierName').val(supplierName);
$('#invoiceNo').val(invoiceNo);
$('#billDate').val(billDate);
$('#driverName').val(driverName);
$('#vehicleNo').val(vehicleNo);
$('#cylinderName').val(cylinderName);
$('#cylinderCount').val(cylinderCount);
// Clear previous cylinder inputs
$('#cylinderDiv').html("");
// Generate cylinder input fields dynamically
if (cylinderCount > 0) {
let inputFields = `
<div class="form-group row">
<div class="col-md-4"><label>Cylinder Number</label> <span class="text-danger">*</span> </div>
<div class="col-md-4"><label>Gross Weight</label> <span class="text-danger">*</span> </div>
<div class="col-md-4"><label>Actual Weight</label> <span class="text-danger">*</span> </div>
</div>`;
for (let i = 1; i <= cylinderCount; i++) {
inputFields += `
<div class="form-group row dynamicField">
<div class="col-md-4">
<input type="text" class="form-control" name="cylinderNumber[]" placeholder="Cylinder ${i}" required>
</div>
<div class="col-md-4">
<input type="number" class="form-control" name="grossWeight[]" placeholder="Gross Weight ${i}" required>
</div>
<div class="col-md-4">
<input type="number" class="form-control" name="actualWeight[]" placeholder="Actual Weight ${i}" required>
</div>
</div>`;
}
$('#cylinderDiv').html(inputFields);
}
// Show the modal
$('#gasEnteredDetails').modal('show');
});
</script>
<!-- while closing gasEnteredDetails modal -->
<script>
$(document).ready(function(){
$('#gasEnteredDetails').on("hide.bs.modal", function(e){
$('#fullCylinderDate').val(" ");
$('#IGRNO').val(" ");
$('#supplierName').val(" ");
$('#invoiceNo').val(" ");
$('#billDate').val(" ");
$('#driverName').val(" ");
$('#vehicleNo').val(" ");
$('#cylinderName').val(" ");
$('#cylinderCount').val(" ");
$('#cylinderDiv').html("");
}
});
});
</script>
<!-- end of add gas shortage calculator -->
<!-- ajax call for gas Shortage -->
<script>
function downloadExcel(clickedElement) {
$(document).ready(function () {
$("#gasEnteredDetails form").submit(function (event) {
event.preventDefault(); // Prevent form reload
var row = $(clickedElement).closest("tr");
var igrNo = row.find("td:eq(1)").text().trim();
var cylinderPendingCount = row.find("td:eq(12)").text().trim();
let method = $("#gasEnteredDetails").data("form"); // Get form type
cylinderPendingCount = parseInt(cylinderPendingCount, 10);
// Collecting form data
let formData = {
fullCylinderDate: $("#fullCylinderDate").val(),
IGRNO: $("#IGRNO").val(),
supplierName: $("#supplierName").val(),
invoiceNo: $("#invoiceNo").val(),
billDate: $("#billDate").val(),
driverName: $("#driverName").val(),
vehicleNo: $("#vehicleNo").val(),
cylinderName: $('#cylinderName').val(),
cylinderCount: $("#cylinderCount").val(),
cylinders: [] // Array to store cylinder details
};
// Loop through dynamically generated cylinder inputs
$("#cylinderDiv .form-group.row.dynamicField").each(function () {
let cylinderData = {
cylinderNo : $(this).find("input[name='cylinderNumber[]']").val(),
grossWeight : $(this).find("input[name='grossWeight[]']").val(),
actualWeight: $(this).find("input[name='actualWeight[]']").val(),
};
formData.cylinders.push(cylinderData);
});
console.log(formData); // Debugging - Check if data is correct
$('#loader').show(); // Show loader
$.ajax({
type: "POST",
url: "<?php echo base_url()?>/updateGasShortage", // Adjust endpoint as needed
data: JSON.stringify(formData), // Send data as JSON
contentType: "application/json",
dataType: "json",
success: function (response) {
if (response.status === "success") {
alert("Gas Shortage Data Saved Successfully!");
$('#gasEnteredDetails').modal('hide'); // Close modal
} else {
alert("Error: " + response.message);
}
},
error: function (xhr, status, error) {
console.log(xhr.responseText);
alert("Something went wrong! Please try again.");
},
complete: function () {
console.log("AJAX request completed.");
$('#loader').hide();
}
});
});
});
</script>
if (cylinderPendingCount > 0) {
alert("Please clear the " + cylinderPendingCount + " pending cylinders before downloading the Excel file.");
return false;
}
$("#loader").show();
$.ajax({
type: "POST",
url: "<?php echo base_url() ?>gasCylindersByIgr",
data: {
IGRNO: igrNo
},
success: function(response) {
$("#loader").hide();
if (response.status === "success") {
console.log(response.data); // Debugging - Check if data is correct
let tableHTML = `
<table border="1" id="excelTable" >
<thead>
<tr>
<th>IGRNO</th>
<th>Full Cylinder Date</th>
<th>Cylinder No</th>
<th>Gross Weight</th>
<th>Empty Cylinder Return Date</th>
<th>Tare Weight</th>
<th>Net Weight</th>
<th>Actual Weight</th>
<th>Shortage</th>
<th>Bill No</th>
<th>Bill Date</th>
<th>Driver Name</th>
<th>Vehicle No</th>
</tr>
</thead>
<tbody>
`;
let totalShortage = 0;
let totalNetWeight = 0;
let totalActualWeight = 0;
response.data.forEach(item => {
totalShortage += Number(item.shortage);
totalNetWeight += Number(item.netWeight);
totalActualWeight += Number(item.actualWeight);
item.fullCylinderDate = formatDateTime(item.fullCylinderDate, 1);
item.emptyCylinderDate = formatDateTime(item.emptyCylinderDate, 1);
item.DeliveryChellanDate = formatDateTime(item.DeliveryChellanDate, 1);
tableHTML += `
<tr>
<td>${item.IGRNO}</td>
<td>${item.fullCylinderDate}</td>
<td>${item.cylinderNo}</td>
<td>${item.grossWeight}</td>
<td>${item.emptyCylinderDate}</td>
<td>${item.tareWeight}</td>
<td>${item.netWeight}</td>
<td>${item.actualWeight}</td>
<td>${item.shortage}</td>
<td>${item.invoiceNo}</td>
<td>${item.DeliveryChellanDate}</td>
<td>${item.DriverName}</td>
<td>${item.VehicleNo}</td>
</tr>
`;
});
tableHTML += `
</tbody>
<tfoot>
<tr class="empty-row">
<td colspan="13">&nbsp;</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td> Weight</td>
<td>${totalNetWeight}</td>
<td>${totalActualWeight}</td>
<td>${totalShortage}</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tfoot>
</table>
`;
$("#excelTableDiv").html(tableHTML);
let table = document.getElementById('excelTable');
let filename = "GasCylinderReturned_" + igrNo + ".xlsx";
let rows = [];
// Extract table data row-by-row
$(table).find('tr').each(function(rowIndex) {
let rowData = [];
$(this).find('th, td').each(function(colIndex) {
// Skip hidden columns
if ($(this).css('display') === 'none') return;
let cellText = $(this).text().trim();
rowData.push(cellText);
});
// Add the cleaned row only if it has data
if (rowData.length > 0) {
rows.push(rowData);
}
});
// Create a worksheet from array (no DOM needed!)
let ws = XLSX.utils.aoa_to_sheet(rows);
// Define column widths (in character units)
const columnWidth = 15; // Set your desired width here
const wscols = [];
for (let i = 0; i < Object.keys(response.data[0]).length; i++) {
wscols.push({
wch: columnWidth
});
}
ws['!cols'] = wscols;
let wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
XLSX.writeFile(wb, filename || 'export.xlsx');
}
},
error: function(xhr, status, error) {
console.log(xhr.responseText);
alert("Something went wrong! Please try again.");
},
complete: function() {
console.log("AJAX request completed.");
$("#loader").hide(); // Hide loader
}
});
}
</script>