ria/app/Views/stock/powerConsumptionDetails.php
2025-04-24 17:43:24 +05:30

2022 lines
82 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<style type="text/css">
.num {
text-align: right;
}
.fht-table,
.fht-table thead,
.fht-table tfoot,
.fht-table tbody,
.fht-table tr,
.fht-table th,
.fht-table td {
margin: 0;
}
.fht-table td {
text-align: center;
}
.grab {
cursor: grab;
/* Default open-hand cursor */
}
.grab:active {
cursor: grabbing;
/* Closed-hand cursor when dragging */
}
.fht-table td:hover {
background-color: rgb(170, 222, 167);
color: rgb(2, 2, 2);
transform: scale(1.25);
/* Increases size by 25% */
transition: transform 0.5s ease-in-out;
/* Smooth scaling effect */
}
.fht-table tr:hover {
background-color: rgb(170, 222, 167);
color: rgb(2, 2, 2);
}
.fht-table {
border: 0 none;
height: auto;
width: auto;
border-collapse: collapse;
border-spacing: 0;
/*table-layout: fixed; Algoritmo de distribucion fijo */
white-space: nowrap;
}
.fht-table th,
.fht-table td {
overflow: hidden;
}
.fht-table-wrapper,
.fht-table-wrapper .fht-thead,
.fht-table-wrapper .fht-tfoot,
.fht-table-wrapper .fht-fixed-column .fht-tbody,
.fht-table-wrapper .fht-fixed-body .fht-tbody,
.fht-table-wrapper .fht-tbody {
overflow: hidden;
position: relative;
}
.fht-table-wrapper .fht-fixed-body .fht-tbody,
.fht-table-wrapper .fht-tbody {
overflow: auto;
}
.fht-table-wrapper .fht-table .fht-cell {
overflow: hidden;
height: 1px;
}
.fht-table-wrapper .fht-fixed-column,
.fht-table-wrapper .fht-fixed-body {
top: 0;
left: 0;
position: absolute;
}
.fht-table-wrapper .fht-fixed-column {
z-index: 1;
}
.fht-fixed-body .fht-thead table {
margin-right: 20px;
border: 0 none;
}
/*For Examples*/
.ContenedorTabla {
height: 500px;
margin: 0 auto;
overflow: auto;
width: auto;
position: relative;
}
.header,
.main {
display: inline-block;
height: auto;
width: 100%;
}
.titulosHeader {
border-bottom: 1px solid #e8bb25;
height: auto;
margin-bottom: 10px;
padding-bottom: 8px;
padding-top: 8px;
width: 100%;
}
._Separador {
background-color: #fff;
height: 12px;
border-left: 1px solid #ccc;
border-right: 1px solid #ccc;
width: 7px;
}
._Separador div {
width: 4px;
}
/*style excel*/
.excel_cell {
border: 1px solid #CCC;
color: #222;
text-align: center;
font-size: 13px;
font-weight: normal;
padding: 4px;
white-space: pre-line;
empty-cells: show;
}
._cell_header {
background-color: #EEE;
}
._cell_Default {
background-color: #FFF;
text-align: left;
}
.excel_cell div {
width: 30px;
height: 20px;
}
.celda_encabezado_general {
background-color: #50bbd9;
border: 1px solid #ccc;
color: #ffffff;
font-weight: bold;
padding: 6px 10px;
text-align: center;
}
.celda_encabezado_total {
background-color: #ffffff !important;
border: 1px solid #ffffff;
color: #ffffff !important;
font-weight: bold;
padding: 6px 10px;
text-align: center;
}
.celda_normal {
/*background-color: #fff;*/
/* <!-- ad9271 into ffffff brown-light to green-light --> */
text-align: center;
border: 1px solid #ccc;
padding: 5px 6px;
}
/* Make entire thead sticky */
.fht-table thead {
position: sticky;
top: 0;
z-index: 20;
/* Ensure the entire header stays above table rows */
background-color: #50bbd9;
/* Header background color */
}
.dropdown-menu {
z-index: 25;
}
/* Ensure each <th> in thead stays sticky */
.fht-table thead th {
position: sticky;
top: 0;
z-index: 11;
/* Higher than table rows but lower than first column */
background-color: #50bbd9;
/* Green background */
color: #ffffff;
border: 2px solid;
padding: 10px;
}
/* Sticky First Column */
.fht-table th:nth-child(1),
.fht-table td:nth-child(1) {
position: sticky;
left: 0;
background-color: #50bbd9;
z-index: 15;
/* Ensures it stays above other cells */
border-right: 2px solid #ddd;
color: #ffffff;
}
.table-responsive {
overflow-x: auto;
overflow-y: auto;
max-height: 450px;
max-width: 100%;
position: relative;
}
td {
min-width: 100px;
max-width: 100px;
}
tfoot tr {
background-color: rgb(235, 236, 203);
}
body[data-layout-mode=horizontal] .container-fluid {
max-width: 100%;
}
.card-body {
padding-top: 0;
padding-bottom: 0;
}
.card {
margin-bottom: 5px;
}
#powerStockDetailsTableId {
/* Replace with your table's actual ID or selector */
border-collapse: collapse;
}
.hidden-row {
display: none;
}
</style>
<?php
$date = DateTime::createFromFormat('M-Y', $month);
$startDate = $date->modify('first day of this month')->format('Y-m-d');
$endDate = $date->modify('last day of this month')->format('Y-m-d');
$datesInMonth = [];
$period = new DatePeriod(
new DateTime($startDate),
new DateInterval('P1D'),
(new DateTime($endDate))->modify('+1 day')
);
foreach ($period as $day) {
$datesInMonth[] = $day->format('Y-m-d');
}
?>
<div class="content-page">
<div class="content">
<!-- Start Content-->
<div class="container-fluid">
<!-- start page title -->
<div>
<div class="row">
<div class="col-6">
<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);">Stocks</a></li>
<li class="breadcrumb-item active">
<h4 class="page-title">Power Consumption Stock Details </h4>
</li>
</ol>
</div>
</div>
</div>
<div class="col-6 text-right">
<!-- Right-aligned buttons or links can be added here -->
</div>
</div>
<div class="row">
<div class="col-12">
<div class="card" id="fullscreenDiv">
<div class="card-body">
<div id="successMessage"
style="
display: none;
position: absolute;
top: 10px;
left: 50%;
transform: translateX(-50%);
background: green;
color: white;
padding: 10px;
border-radius: 5px;
z-index: 1000;">
</div>
<form id="changeMonthForm" action="<?= base_url('powerConsumptionDetails'); ?>" method="post">
<div class="row">
<div class="col-2">
<input type="text" name="month" id="month" value="<?php echo "$month" ?>"
class="form-control mt-2"
style="z-index:30;" readonly>
</div>
<div class="col-10 text-right d-flex" style="justify-content: end;">
<input type="text" id="searchInput" placeholder="Search..."
class="mt-2"
style=" padding: 8px;margin-bottom: 10px;width: 250px;border: 2px solid rgb(123, 11, 214);
border-radius: 5px;margin-right:15px;">
<?php
if ($month == date('M-Y')) {
?>
<i class="fa fa-cog btn-lg mt-2"
style="font-size: x-large; cursor:pointer; color:rgb(95, 102, 105)"
title="Customize"
data-target="#customizeModalId"
data-toggle="modal">
</i>
<?php
}
?>
<i class="fa fa-rocket btn-lg mt-2"
title="Navigation"
data-toggle="modal"
data-target="#bs-example-modal-lg"
style="font-size: x-large; cursor:pointer; color: #bd0906">
</i>
<i class="fa fa-download btn-lg mt-2"
title="Excel Download"
style="font-size: x-large; cursor:pointer; color: #0b7cba"
id="powerConsumptionExport">
</i>
<i class="fe-maximize noti-icon btn-lg mt-2"
title="Full Screen"
style="font-size: x-large; cursor:pointer; color:rgb(241, 9, 136)"
onclick="toggleDivFullscreen()">
</i>
<i class="fas fa-save auditor-restricted-btn btn-lg mt-2"
title="Save"
style="font-size: x-large; cursor:pointer; color:rgb(31, 132, 3)"
id="saveId">
</i>
</div>
</div>
</form>
<form action="<?= base_url('powerConsumptionDetails'); ?>" method="post">
<!-- modal placed here for submission of form -->
<!---------------------------------------
this modal is used to customize table header
1)list table header order
2)choose which material/machines you want
------------------------------------------------------------>
<div>
<div class="modal fade" id="customizeModalId" tabindex="-1" role="dialog" aria-labelledby="customizeModalLabel" aria-hidden="true">
<div class="modal-dialog modal-md">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="customizeModalLabel">Customize</h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
</div>
<div class="modal-body">
<div class="row">
<!-- Dropdown to add back removed items -->
<div class="col">
<div class="form-group">
<label for="customizeHeader"> Add For This Month </label>
<select id="customizeHeader" class="form-control select2" onchange="addBackToList()">
<option value="">Select</option>
<?php
foreach ($activeElectricMachines as $index => $activeElectricMachine) { ?>
<option value="<?= $activeElectricMachine['id'] ?>">
<?= $activeElectricMachine['id'] ?> - <?= $activeElectricMachine['machine_name'] ?>
</option>
<?php
}
?>
</select>
</div>
</div>
</div>
<div class="row">
<div class="col">
<h5>List of Selected Items</h5>
<div id="selectedItemsContainer">
<ul id="sortableList">
<?php foreach ($electricMachines as $electricMachine): ?>
<div class="sortable-item" draggable="true" id="<?= $electricMachine['id'] ?>_container">
<input type="checkbox"
id="<?= $electricMachine['id'] ?>_checkboxId"
name="customisedMachineCodes[]"
value="<?= $electricMachine['id'] ?>"
onclick="removeSelectedMaterial(this)"
checked>
<label class="grab" for="<?= $electricMachine['id'] ?>_checkboxId">
<?= $electricMachine['id'] ?> - <?= $electricMachine['machine_name']; ?>
</label>
<br>
</div>
<?php endforeach; ?>
</ul>
</div>
</div>
</div>
<button type="submit" class="btn btn-primary float-right"> Apply </button>
</div>
</div>
</div>
</div>
</div>
<!-- hidden fields -->
<input type="hidden" name="month" value="<?php echo "$month" ?>">
</form>
<div>
<div class="modal fade" id="bs-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true">
<div class="modal-dialog modal-md">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="myLargeModalLabel">Navigation Options</h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
</div>
<div class="modal-body">
<div class="row">
<!-- bag Dropdown -->
<div class="col-md-6">
<div class="form-group">
<label for="powerDropdown">Select Machine</label>
<select id="powerDropdown" class="form-control select2">
<option value="">Select Electric Machines</option>
<?php foreach ($electricMachines as $powerMachine): ?>
<option value=" <?= $powerMachine['machine_name'] ?>">
<?= $powerMachine['machine_name'] ?>
</option>
<?php endforeach; ?>
</select>
</div>
</div>
<!-- Date Dropdown -->
<div class="col-md-6">
<div class="form-group">
<label for="dateDropdown">Select Date</label>
<select id="dateDropdown" class="form-control select2">
<?php foreach ($datesInMonth as $selectDate): ?>
<?php $selectDate = DateTime::createFromFormat('Y-m-d', $selectDate)->format('d-m-Y'); ?>
<option value="<?= $selectDate ?>"><?= $selectDate ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
</div>
<button class="btn btn-primary float-right" onclick="navigateToPower()">Navigate</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
</div>
<div class="table-responsive" id="table-responsive">
<table id="powerStockDetailsTableId" class="fht-table">
<thead class="celda_encabezado_general" style="padding: 10px;">
<tr>
<th class="celda_encabezado_general" colspan="1"> Machine </th>
<th class="celda_encabezado_general" colspan="8">
150 KW Power
</th>
<?php foreach ($electricMachines as $electricMachine) { ?>
<!-- this will loop till machines present -->
<th class="celda_encabezado_general" colspan="3">
<?= $electricMachine['machine_name'] ?>
</th>
<?php } ?>
</tr>
<tr>
<th class="celda_encabezado_general" colspan="1">Date </th>
<th class="celda_encabezado_general">Opening Reading </th>
<th class="celda_encabezado_general">Final Reading</th>
<th class="celda_encabezado_general">Total Reading</th>
<th class="celda_encabezado_general">Total Units </th>
<th class="celda_encabezado_general">Average PF</th>
<th class="celda_encabezado_general">Present PF</th>
<th class="celda_encabezado_general">MD </th>
<th class="celda_encabezado_general">MF *60</th>
<?php foreach ($electricMachines as $powerMachine) { ?>
<!-- this will loop till machines present -->
<th class="celda_encabezado_general" style="display:none">Date</th>
<th class="celda_encabezado_general" style="display:none"> Machine Id</th>
<th class="celda_encabezado_general">Opening Units</th>
<th class="celda_encabezado_general">Final Units</th>
<th class="celda_encabezado_general">Total Units</th>
<?php } ?>
</tr>
</thead>
<tbody style="background-color: #fff;">
<?php if (!empty($totalPower)) {
$summary = [];
foreach ($groupedPowerConsumptionStockDetails as $groupedIndex => $powerStockDetails) {
$currentDate = date('Y-m-d');
?>
<tr class="<?=$powerStockDetails[0]['date'] > $currentDate ? "hidden-row" : "" ?>"
<?php
if ($powerStockDetails[0]['date'] === $currentDate) {
echo 'style="background: #cef0ad;"';
}
?>
>
<?php
$startDate = DateTime::createFromFormat('Y-m-d', $totalPower[$groupedIndex]['date'])->format('d-m-Y');
?>
<td class="celda_normal">
<?= $startDate ?>
</td>
<td class="celda_normal openingTP"
data-id="<?= $totalPower[$groupedIndex]['date'] ?>"
<?php if ($groupedIndex == 0): ?>
oninput="openingTPStockChange(this)"
contenteditable="true"
<?php endif; ?>><?= $totalPower[$groupedIndex]['opening_reading'] ?? ' ' ?></td>
<td class="celda_normal finalTP"
data-id="<?= $totalPower[$groupedIndex]['date'] ?>"
oninput="finalTPStockChange(this)"
contenteditable="true">
<?= $totalPower[$groupedIndex]['final_reading'] ?? ' ' ?>
</td>
<td class="celda_normal totalReadingTP"
data-id="<?= $totalPower[$groupedIndex]['date'] ?>">
<?= $totalPower[$groupedIndex]['total_reading'] ?? ' ' ?>
</td>
<td class="celda_normal totalUnitsTP"
data-id="<?= $totalPower[$groupedIndex]['date'] ?>">
<?= $totalPower[$groupedIndex]['total_units'] ?? ' ' ?>
</td>
<td class="celda_normal averagePfTP" contenteditable="true"
data-id="<?= $totalPower[$groupedIndex]['date'] ?>">
<?= $totalPower[$groupedIndex]['average_pf'] ?? ' ' ?>
</td>
<td class="celda_normal presentPfTP" contenteditable="true"
data-id="<?= $totalPower[$groupedIndex]['date'] ?>">
<?= $totalPower[$groupedIndex]['present_pf'] ?? ' ' ?>
</td>
<td class="celda_normal mdTP" contenteditable="true"
oninput="mdTPStockChange(this)"
data-id="<?= $totalPower[$groupedIndex]['date'] ?>">
<?= $totalPower[$groupedIndex]['md'] ?? ' ' ?>
</td>
<td class="celda_normal mfTP"
data-id="<?= $totalPower[$groupedIndex]['date'] ?>">
<?= $totalPower[$groupedIndex]['mf'] ?? ' ' ?>
</td>
<?php
//before closing outer loop
if (!isset($summary['openingReading'])) {
$summary['openingReading'] = 0;
$summary['finalReading'] = 0;
$summary['totalReading'] = 0;
$summary['totalUnits'] = 0;
$summary['averagePf'] = 0;
$summary['presentPf'] = 0;
$summary['md'] = 0;
$summary['mf'] = 0;
}
$summary['openingReading'] = " ";
$summary['finalReading'] = is_numeric($totalPower[$groupedIndex]['final_reading']) ? $totalPower[$groupedIndex]['final_reading'] : 0;
$summary['totalReading'] += is_numeric($totalPower[$groupedIndex]['total_reading']) ? $totalPower[$groupedIndex]['total_reading'] : 0;
$summary['totalUnits'] += is_numeric($totalPower[$groupedIndex]['total_units']) ? $totalPower[$groupedIndex]['total_units'] : 0;
$summary['averagePf'] = " ";
$summary['presentPf'] = " ";
$summary['md'] = " ";
$summary['mf'] = " ";
?>
<?php foreach ($powerStockDetails as $powerStockDetailIndex => $powerStock) { ?>
<td style="display:none">
<?= $powerStock['date'] ?>
</td>
<td style="display:none"
data-id="<?= $powerStock['date'] ?> <?= $powerStock['machine_id'] ?>"
class="machine_id">
<?= $powerStock['machine_id'] ?>
</td>
<td class="celda_normal openingUnits"
data-id="<?= $powerStock['date'] ?> <?= $powerStock['machine_id'] ?>"
<?php if ($groupedIndex == 0): ?>
oninput="openingUnitsChange(this)"
contenteditable="true"
<?php endif; ?>>
<?= $powerStock['opening_units'] ?? " " ?>
</td>
<td class="celda_normal closingUnits"
data-id="<?= $powerStock['date'] ?> <?= $powerStock['machine_id'] ?>"
oninput="closingUnitsChange(this)"
contenteditable="true">
<?= $powerStock['closing_units'] ?? " " ?>
</td>
<td class="celda_normal totalUnits"
data-id="<?= $powerStock['date'] ?> <?= $powerStock['machine_id'] ?>"
oninput="totalUnitsChange(this)"
contenteditable="true">
<?= $powerStock['total_units'] ?? " " ?>
</td>
<?php
//before closing inner loop we just adding the total values inside it
$machineId = $powerStock['machine_id']; // Unique identifier
// Initialize the material entry if it doesn't exist
if (!isset($summary["machineId_$machineId"])) {
$summary["machineId_$machineId"] = [
'opening_units' => "-",
'closing_units' => 0,
'total_units' => 0,
'machine_id' => $machineId,
];
}
// Sum values for the material
$summary["machineId_$machineId"]['opening_units'] = " ";
$summary["machineId_$machineId"]['closing_units'] = " ";
$summary["machineId_$machineId"]['total_units'] += is_numeric($powerStock['total_units']) ? $powerStock['total_units'] : 0;
} ?>
</tr>
<?php
}
?>
<tfoot>
<tr>
<td style="background-color:rgb(189, 9, 6); color:#ffff;">
<b> Total </b>
</td>
<td class="celda_normal openingTP"
data-id="footer openingTP">
</td>
<td class="celda_normal finalTP"
data-id="footer finalTP">
</td>
<td class="celda_normal totalReadingTP"
data-id="footer totalReadingTP">
<?= $summary['totalReading'] ?></td>
<td class="celda_normal totalUnitsTP"
data-id="footer totalUnitsTP">
<?= $summary['totalUnits'] ?></td>
<td class="celda_normal averagePf"
data-id="footer averagePf">
</td>
<td class="celda_normal presentPf"
data-id="footer presentPf">
</td>
<td class="celda_normal mdTP"
data-id="footer mdTP">
</td>
<td class="celda_normal mfTP"
data-id="footer mfTP">
</td>
<?php foreach ($summary as $each) {
if (is_array($each)) {
?>
<td class="celda_normal openingUnits"
data-id="footer <?=$each['machine_id']?>"> </td>
<td class="celda_normal closingUnits"
data-id="footer <?=$each['machine_id']?>"></td>
<td class="celda_normal totalUnits"
data-id="footer <?=$each['machine_id']?>"><?= $each['total_units'] ?></td>
<?php
}
}
?>
</tr>
</tfoot>
<!-- this else condition work if groupedpowerStockDetails is empty and creating new records
with initial values 0 for entire month -->
<?php } else { ?>
<?php foreach ($datesInMonth as $datesInMonthIndex => $dateInMonth) {
$currentDate = date('Y-m-d');
?>
<tr class="<?=$dateInMonth > $currentDate ? "hidden-row" : "" ?>"
<?php
if ($dateInMonth === $currentDate) {
echo 'style="background: #cef0ad;"';
}
?>
>
<?php
$startDate = DateTime::createFromFormat('Y-m-d', $dateInMonth)->format('d-m-Y');
?>
<td class="celda_normal">
<?= $startDate ?>
</td>
<td class="celda_normal openingTP"
data-id="<?= $dateInMonth ?>"
<?php if ($datesInMonthIndex == 0) { ?>
oninput="openingTPStockChange(this)"
contenteditable="true"
<?php } ?>>
<?php
if (empty($previousMonthTotalPowerMachineStockDetails)) {
echo " ";
} else {
echo $previousMonthTotalPowerMachineStockDetails[0]['final_reading'];
}
?>
</td>
<td class="celda_normal finalTP"
data-id="<?= $dateInMonth ?>"
oninput="finalTPStockChange(this)"
contenteditable="true">
<?php
if (empty($previousMonthTotalPowerMachineStockDetails)) {
echo " ";
} else {
echo $previousMonthTotalPowerMachineStockDetails[0]['final_reading'];
}
?>
</td>
<td class="celda_normal totalReadingTP"
data-id="<?= $dateInMonth ?>"> </td>
<td class="celda_normal totalUnitsTP"
data-id="<?= $dateInMonth ?>"> </td>
<td class="celda_normal averagePfTP" contenteditable="true"
data-id="<?= $dateInMonth ?>"> </td>
<td class="celda_normal presentPfTP" contenteditable="true"
data-id="<?= $dateInMonth ?>"> </td>
<td class="celda_normal mdTP" contenteditable="true"
oninput="mdTPStockChange(this)"
data-id="<?= $dateInMonth ?>"> </td>
<td class="celda_normal mfTP"
data-id="<?= $dateInMonth ?>"> </td>
<?php
foreach ($electricMachines as $powerMachineIndex => $powerMachine) {
?>
<!-- this will loop till machines present -->
<td class="celda_normal" style="display:none">
<?= $dateInMonth ?>
</td>
<td class="celda_normal" style="display:none"
data-id="<?= $dateInMonth ?> <?= $powerMachine['id'] ?>">
<?= $powerMachine['id'] ?>
</td>
<td class="celda_normal openingUnits"
<?php if ($datesInMonthIndex == 0) { ?>
oninput="openingUnitsChange(this)"
contenteditable="true"
<?php } ?>
data-id="<?= $dateInMonth ?> <?= $powerMachine['id'] ?>">
<?php
foreach ($previousMonthPowerConsumptionStockDetails as $index => $previousMonthPowerConsumptionStockDetail) {
if ($previousMonthPowerConsumptionStockDetail['machine_id'] == $powerMachine['id']) {
echo $previousMonthPowerConsumptionStockDetail['closing_units'];
break;
}
}
?>
</td>
<td class="celda_normal closingUnits"
data-id="<?= $dateInMonth ?> <?= $powerMachine['id'] ?>"
oninput="closingUnitsChange(this)"
contenteditable="true">
<?php
foreach ($previousMonthPowerConsumptionStockDetails as $index => $previousMonthPowerConsumptionStockDetail) {
if ($previousMonthPowerConsumptionStockDetail['machine_id'] == $powerMachine['id']) {
echo $previousMonthPowerConsumptionStockDetail['closing_units'];
break;
}
}
?>
</td>
<td class="celda_normal totalUnits"
data-id="<?= $dateInMonth ?> <?= $powerMachine['id'] ?>"
contenteditable="true"> </td>
<?php } ?>
</tr>
<?php } ?>
<tfoot>
<tr>
<td style="background-color:rgb(189, 9, 6); color:#ffff;">
<b> Total </b>
</td>
<td class="celda_normal openingTP"
data-id="footer openingTP">
</td>
<td class="celda_normal finalTP"
data-id="footer finalTP">
</td>
<td class="celda_normal totalReadingTP"
data-id="footer totalReadingTP">
</td>
<td class="celda_normal totalUnitsTP"
data-id="footer totalUnitsTP">
</td>
<td class="celda_normal averagePf"
data-id="footer averagePf">
</td>
<td class="celda_normal presentPf"
data-id="footer presentPf">
</td>
<td class="celda_normal mdTP"
data-id="footer mdTP">
</td>
<td class="celda_normal mfTP"
data-id="footer mfTP">
</td>
<?php foreach ($electricMachines as $each) {
if (is_array($each)) {
?>
<td class="celda_normal openingUnits"
data-id="footer <?=$each['id']?>"></td>
<td class="celda_normal closingUnits"
data-id="footer <?=$each['id']?>"></td>
<td class="celda_normal totalUnits"
data-id="footer <?=$each['id']?>"></td>
<?php
}
}
?>
</tr>
</tfoot>
<?php } ?>
</tbody>
</table>
</div>
</div>
</div> <!-- End card-body -->
</div> <!-- End card -->
</div> <!-- End col -->
</div> <!-- End row -->
</div>
</div> <!-- End container-fluid -->
</div>
</div>
<script>
$(document).ready(function() {
$('.select2').select2();
})
</script>
<script>
function navigateToPower() {
$('.close').click();
const powerDropdown = document.getElementById('powerDropdown');
const dateDropdown = document.getElementById('dateDropdown');
const selectedPower = powerDropdown.value;
const selectedDate = dateDropdown.value;
const table = document.getElementById('powerStockDetailsTableId');
const headerCells = table.querySelectorAll('thead tr:nth-child(1) th');
const rows = table.querySelectorAll('tbody tr');
let targetColumnIndex = -1;
headerCells.forEach((header, index) => {
if (header.innerText.replace(/\s+/g, '') === selectedPower.replace(/\s+/g, '')) {
targetColumnIndex = index;
return;
}
});
if (targetColumnIndex === -1) {
console.log("power column not found.");
return;
}
let targetRow = null;
rows.forEach(row => {
const dateCell = row.querySelector('td:first-child');
if (dateCell && dateCell.textContent.trim() === selectedDate) {
targetRow = row;
}
});
if (!targetRow) {
console.log("Date row not found.");
return;
}
targetColumnIndex = (targetColumnIndex * 5) + 3;
targetRow.cells[targetColumnIndex].scrollIntoView({
behavior: 'smooth',
inline: 'center',
block: 'center'
});
const highlightDuration = 10000;
for (let i = targetColumnIndex - 4; i <= targetColumnIndex; i++) {
const cell = targetRow.cells[i];
if (cell) {
cell.style.transition = "background-color 0.5s";
cell.style.backgroundColor = "#df9675";
setTimeout(() => {
cell.style.backgroundColor = "";
}, highlightDuration);
}
}
}
</script>
<script type="text/javascript">
$(document).ready(function() {
$('#saveId').click(function() {
//table to json function
var updatePowerConsumptionDetails = tableToJson();
showMessage('Updation may take a while, And we appreciate your patience..!!');
$.ajax({
data: {
updatePowerConsumptionDetails
},
type: "POST",
url: "<?php echo base_url() ?>updatePowerConsumptionDetails",
success: function(data) {
if (data) {
showMessage(data);
}
},
error: function(xhr, status, error) {
showMessage("An error occurred while processing the request. Please try again.");
console.error("Error Code:", xhr.status);
console.error("Error Message:", error);
console.error("Response Text:", xhr.responseText);
},
complete: function() {
console.log("Request completed.");
}
});
});
});
</script>
<script>
function tableToJson() {
const table = $('#powerStockDetailsTableId');
const summaryRowPart = [];
const readingsRowPart = [];
const allRow = [];
//this table to json is customized for powerStock not for all
table.find('tbody tr').each(function(index) {
const rowCells = $(this).find('td');
const date = rowCells.eq(0).text().trim();
const formattedDate = `${date.split('-')[2]}-${date.split('-')[1]}-${date.split('-')[0]}`;
const summaryRowData = {
date: formattedDate,
opening_reading: rowCells.eq(1).text().trim(),
final_reading: rowCells.eq(2).text().trim(),
total_reading: rowCells.eq(3).text().trim(),
total_units: rowCells.eq(4).text().trim(),
average_pf: rowCells.eq(5).text().trim(),
present_pf: rowCells.eq(6).text().trim(),
md: rowCells.eq(7).text().trim(),
mf: rowCells.eq(8).text().trim()
};
summaryRowPart.push(summaryRowData);
/** we get eight entries against a machines so we loop from 1 to 8 and so on
in a single row **/
for (let i = 9; i < rowCells.length; i += 5) {
const readingsRowData = {
date: rowCells.eq(i).text().trim(),
machine_id: rowCells.eq(i + 1).text().trim(),
opening_units: rowCells.eq(i + 2).text().trim(),
closing_units: rowCells.eq(i + 3).text().trim(),
total_units: rowCells.eq(i + 4).text().trim(),
};
readingsRowPart.push(readingsRowData);
}
});
allRow.push(summaryRowPart, readingsRowPart)
return JSON.stringify(allRow, null, 2);
}
</script>
<script>
function openingUnitsChange(tdElement) {
try {
let basicCheck =checkIsNumber(tdElement.innerText.trim());
if(basicCheck == 0){
alert("Kindly Enter Numbers only..!!");
return ;
}
let dataId = tdElement.getAttribute('data-id');
let [date, machine_id] = tdElement.getAttribute('data-id').split(' ');
let openingUnits = validateInput(tdElement.innerText);
let closingUnits = validateInput(document.querySelector(`td.closingUnits[data-id="${dataId}"]`).innerText);
let totalUnits = parseFloat(closingUnits) - parseFloat(openingUnits);
document.querySelector(`td.totalUnits[data-id="${dataId}"]`).innerText = parseFloat(totalUnits).toFixed(2);
updateStockValue(date, machine_id, closingUnits);
let table = document.getElementById('powerStockDetailsTableId');
let column1 = 'totalUnits';
calculateTotal(table,dataId,column1);
} catch (error) {
console.error("There is an error updating stock ..!!" + error);
}
}
function closingUnitsChange(tdElement) {
try {
let basicCheck =checkIsNumber(tdElement.innerText.trim());
if(basicCheck == 0){
alert("Kindly Enter Numbers only..!!");
return ;
}
let dataId = tdElement.getAttribute('data-id');
let [date, machine_id] = tdElement.getAttribute('data-id').split(' ');
let openingUnits = validateInput(document.querySelector(`td.openingUnits[data-id="${dataId}"]`).innerText);
let closingUnits = validateInput(tdElement.innerText);
let totalUnits = parseFloat(closingUnits) - parseFloat(openingUnits);
document.querySelector(`td.totalUnits[data-id="${dataId}"]`).innerText = parseFloat(totalUnits).toFixed(2);
updateStockValue(date, machine_id, closingUnits);
let table = document.getElementById('powerStockDetailsTableId');
let column1 = 'totalUnits';
calculateTotal(table,dataId,column1);
} catch (error) {
console.error("There is an error updating stock ..!!" + error);
}
}
function openingTPStockChange(tdElement) {
try {
let basicCheck =checkIsNumber(tdElement.innerText.trim());
if(basicCheck == 0){
alert("Kindly Enter Numbers only..!!");
return ;
}
let dataId = tdElement.getAttribute('data-id');
let openingTP = validateInput(tdElement.innerText);
let finalTP = validateInput(document.querySelector(`td.finalTP[data-id="${dataId}"]`).innerText);
let totalReadingTP = (Number(finalTP) - Number(openingTP));
let totalUnitsTP = totalReadingTP * 60;
document.querySelector(`td.totalReadingTP[data-id="${dataId}"]`).innerText = parseFloat(totalReadingTP).toFixed(2);
document.querySelector(`td.totalUnitsTP[data-id="${dataId}"]`).innerText = parseFloat(totalUnitsTP).toFixed(2);
updateTotalStockValue(dataId, finalTP);
let table = document.getElementById('powerStockDetailsTableId');
let column2 = 'totalReadingTP';
let column3 = 'totalUnitsTP';
calculateTotal(table,dataId,column2);
calculateTotal(table,dataId,column3);
} catch (error) {
console.error("There is an error updating stock ..!!" + error);
}
}
function finalTPStockChange(tdElement) {
try {
let basicCheck =checkIsNumber(tdElement.innerText.trim());
if(basicCheck == 0){
alert("Kindly Enter Numbers only..!!");
return ;
}
let dataId = tdElement.getAttribute('data-id');
let openingTP = validateInput(document.querySelector(`td.openingTP[data-id="${dataId}"]`).innerText);
let finalTP = validateInput(tdElement.innerText);
let totalReadingTP = (Number(finalTP) - Number(openingTP));
let totalUnitsTP = totalReadingTP * 60;
document.querySelector(`td.totalReadingTP[data-id="${dataId}"]`).innerText = parseFloat(totalReadingTP).toFixed(2);
document.querySelector(`td.totalUnitsTP[data-id="${dataId}"]`).innerText = parseFloat(totalUnitsTP).toFixed(2);
updateTotalStockValue(dataId, finalTP);
let table = document.getElementById('powerStockDetailsTableId');
let column2 = 'totalReadingTP';
let column3 = 'totalUnitsTP';
calculateTotal(table,dataId,column2);
calculateTotal(table,dataId,column3);
} catch (error) {
console.error("There is an error updating stock ..!!" + error);
}
}
function mdTPStockChange(tdElement) {
try {
let basicCheck =checkIsNumber(tdElement.innerText.trim());
if(basicCheck == 0){
alert("Kindly Enter Numbers only..!!");
return ;
}
let dataId = tdElement.getAttribute('data-id');
let mdTP = validateInput(tdElement.innerText);
document.querySelector(`td.mfTP[data-id="${dataId}"]`).innerText = parseFloat(mdTP * 60).toFixed(2);
// let table = document.getElementById('powerStockDetailsTableId');
// let column1 = 'mdTP';
// let cloumn2 = 'mfTP';
// calculateTotal(table,dataId,column1);
// calculateTotal(table,dataId,column2);
} catch (error) {
console.error("There is an error updating stock ..!!" + error);
}
}
function validateInput(input) {
if (input == '' || input == ' ' || input == '-') {
return 0;
}
if (typeof input === 'string' && input.split('').map(char => char.charCodeAt(0))[0] == 10) {
return 0;
}
// Validate against the regex
const isValid = /^-?\d*\.?\d*$/.test(input);
if (!isValid) {
alert('Invalid input! Please enter a valid number.');
return 0;
}
return input;
}
function checkIsNumber(input) {
const isValid = /^-?\d*\.?\d*$/.test(input);
if (!isValid) {
return 0;
}
}
</script>
<script>
function updateStockValue(date, machine_id, closingUnits) {
const table = $('#powerStockDetailsTableId');
const rows = [];
table.find('tbody tr').each(function() {
const rowCells = $(this).find('td');
let otherDate = rowCells.eq(0).text().trim();
otherDate = `${otherDate.split('-')[2]}-${otherDate.split('-')[1]}-${otherDate.split('-')[0]}`;
if (new Date(otherDate) > new Date(date)) {
let dataId = `${otherDate} ${machine_id}`;
document.querySelector(`td.openingUnits[data-id="${dataId}"]`).innerText = closingUnits == 0 ? " " : parseFloat(closingUnits).toFixed(2);
let openingUnits = validateInput(document.querySelector(`td.openingUnits[data-id="${dataId}"]`).innerText);
let totalUnits = validateInput(document.querySelector(`td.totalUnits[data-id="${dataId}"]`).innerText);
closingUnits = Math.abs(Number(openingUnits) + Number(totalUnits));
document.querySelector(`td.closingUnits[data-id="${dataId}"]`).innerText = closingUnits == 0 ? " " : parseFloat(closingUnits).toFixed(2);
}
})
}
function updateTotalStockValue(date, finalTP) {
const table = $('#powerStockDetailsTableId');
const rows = [];
table.find('tbody tr').each(function() {
const rowCells = $(this).find('td');
let otherDate = rowCells.eq(0).text().trim();
otherDate = `${otherDate.split('-')[2]}-${otherDate.split('-')[1]}-${otherDate.split('-')[0]}`;
if (new Date(otherDate) > new Date(date)) {
let dataId = `${otherDate}`;
document.querySelector(`td.openingTP[data-id="${dataId}"]`).innerText = finalTP == 0 ? " " : parseFloat(finalTP).toFixed(2);
let openingTP = validateInput(document.querySelector(`td.openingTP[data-id="${dataId}"]`).innerText);
let totalReadingTP = validateInput(document.querySelector(`td.totalReadingTP[data-id="${dataId}"]`).innerText);
finalTP = Number(openingTP) + Number(totalReadingTP);
let totalUnitsTP = Number(totalReadingTP * 60);
document.querySelector(`td.finalTP[data-id="${dataId}"]`).innerText = finalTP == 0 ? " " : parseFloat(finalTP).toFixed(2);
document.querySelector(`td.totalReadingTP[data-id="${dataId}"]`).innerText = totalReadingTP == 0 ? " " : parseFloat(totalReadingTP).toFixed(2);
document.querySelector(`td.totalUnitsTP[data-id="${dataId}"]`).innerText = totalUnitsTP == 0 ? " " : parseFloat(totalUnitsTP).toFixed(2);
}
})
}
</script>
<script>
$(document).ready(function() {
function exportTableToExcel(tableID, filename = '', dateColumns = []) {
let table = document.getElementById(tableID);
let cloneTable = table.cloneNode(true); // Clone the table to modify
// Remove hidden rows
$(cloneTable).find('tr').filter(function() {
return $(this).css('display') === 'none';
}).remove();
// Remove hidden columns
$(cloneTable).find('th, td').each(function() {
if ($(this).css('display') === 'none') {
$(this).remove();
}
});
// Format specified date columns
$(cloneTable).find('tbody tr').each(function() {
dateColumns.forEach(function(colIndex) {
let td = $(this).find('td').eq(colIndex);
let originalDate = td.text().trim();
let parts = originalDate.split('-');
if (parts.length === 3) {
let formattedDate = `${parts[2]}-${parts[1]}-${parts[0]}`;
td.text(formattedDate);
}
td.css("text-align", "left");
}.bind(this));
});
let ws = XLSX.utils.table_to_sheet(cloneTable);
// Set column width to 10 for all columns
let colCount = 0;
$(cloneTable).find('tr').each(function() {
let count = $(this).find('th, td').length;
if (count > colCount) colCount = count;
});
let wscols = [];
for (let i = 0; i < colCount; i++) {
wscols.push({ wch: 10 }); // Set width of 10 for all columns
}
ws['!cols'] = wscols;
let wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
XLSX.writeFile(wb, filename || 'export.xlsx');
}
// Power Stock Table Export
document.getElementById('powerConsumptionExport').addEventListener('click', function() {
exportTableToExcel('powerStockDetailsTableId', 'power_Consumption_details<?= $month ?>.xlsx', [0]);
});
});
</script>
<script>
document.addEventListener("keydown", function(event) {
if (event.key === "Enter") {
let activeElement = document.activeElement;
// Check if the focused element is inside a table
let cell = activeElement.closest("td, th");
let table = activeElement.closest("table");
if (table && cell) {
event.preventDefault(); // Prevent form submission
let columnIndex = cell.cellIndex; // Get the current column index
let currentRow = cell.parentElement; // Get the current row
let nextRow = currentRow.nextElementSibling; // Get the next row
// Move to the same column in the next row if available
if (nextRow) {
let nextCell = nextRow.cells[columnIndex];
if (nextCell) {
nextCell.focus();
}
}
}
}
});
</script>
<script>
document.addEventListener("DOMContentLoaded", function() {
const list = document.getElementById("sortableList");
let draggedItem = null;
function attachDragEvents(item) {
item.setAttribute("draggable", "true");
item.addEventListener("dragstart", (event) => {
draggedItem = event.target;
event.target.classList.add("dragging");
});
item.addEventListener("dragend", (event) => {
event.target.classList.remove("dragging");
});
}
list.addEventListener("dragover", (event) => {
event.preventDefault(); // Allow dropping
const dragging = document.querySelector(".dragging");
const closestItem = getClosestItem(list, event.clientY);
if (closestItem) {
list.insertBefore(dragging, closestItem);
} else {
list.appendChild(dragging);
}
});
function getClosestItem(container, y) {
const items = [...container.querySelectorAll(".sortable-item:not(.dragging)")];
return items.reduce((closest, child) => {
const box = child.getBoundingClientRect();
const offset = y - box.top - box.height / 2;
return offset < 0 && offset > closest.offset ? {
offset,
element: child
} :
closest;
}, {
offset: Number.NEGATIVE_INFINITY
}).element;
}
// Attach drag events to existing items
document.querySelectorAll(".sortable-item").forEach(attachDragEvents);
window.removeSelectedMaterial = function(checkbox) {
let container = checkbox.closest(".sortable-item");
let materialCode = checkbox.value;
let materialName = container.querySelector("label").innerText;
container.remove();
};
window.addBackToList = function() {
let dropdown = document.getElementById("customizeHeader");
let selectedOption = dropdown.options[dropdown.selectedIndex];
let containerId = `${selectedOption.value}_container`
let alreadyPresent = document.getElementById(containerId);
if(alreadyPresent){
return ;
}
if (selectedOption.value !== "") {
let materialCode = selectedOption.value;
let materialName = selectedOption.text;
let container = document.createElement("div");
container.classList.add("sortable-item");
container.id = materialCode + "_container";
container.innerHTML = `
<input type="checkbox" id="${materialCode}_checkboxId"
name="customisedMachineCodes[]" value="${materialCode}"
onclick="removeSelectedMaterial(this)" checked>
<label class="grab" for="${materialCode}_checkboxId"> ${materialName} </label>
<br>
`;
attachDragEvents(container);
document.getElementById("sortableList").appendChild(container);
}
};
});
</script>
<script>
$(document).ready(function() {
$('#customizeHeader').select2();
})
</script>
<script>
$('#month').change(function() {
$('#changeMonthForm').submit();
})
$('#month').datepicker({
format: 'M-yyyy',
viewMode: 'months',
minViewMode: 'months',
autoclose: true,
orientation: 'bottom',
startDate: new Date(2025, 0), // Jan is month 0
endDate: new Date() // current date as max
});
</script>
<script>
function toggleDivFullscreen() {
let div = document.getElementById("fullscreenDiv");
let tableResponsive = document.getElementById("table-responsive"); // Select the table container inside div
if (!document.fullscreenElement) {
div.requestFullscreen().then(() => {
div.style.width = "100vw"; // Full viewport width
div.style.height = "100vh"; // Full viewport height
// If .table-responsive exists, set its height to 90vh
if (tableResponsive) {
tableResponsive.style.maxHeight = "90vh";
tableResponsive.style.overflowY = "auto"; // Allow scrolling if needed
}
}).catch(err => console.log("Error enabling fullscreen:", err));
} else {
document.exitFullscreen().then(() => {
div.style.width = "100%";
div.style.height = "100%";
// Reset .table-responsive height when exiting fullscreen
// If .table-responsive exists, set its height to 90vh
if (tableResponsive) {
tableResponsive.style.maxHeight = "450px";
tableResponsive.style.overflowY = "auto"; // Allow scrolling if needed
}
}).catch(err => console.log("Error exiting fullscreen:", err));
}
}
$("#searchInput").on("keyup", function() {
let value = $(this).val().toLowerCase(); // Convert input to lowercase for case-insensitive search
$(".table-responsive tbody tr").filter(function() {
$(this).toggle($(this).text().toLowerCase().indexOf(value) > -1);
});
});
</script>
<script>
$(document).ready(function() {
$('.select2').select2({
dropdownParent: $('#fullscreenDiv')
});
// Initialize Select2 when the modal is shown inside full screen
$('#bs-example-modal-lg').on('shown.bs.modal', function() {
$('.select2').select2({
dropdownParent: $(this) // This ensures Select2 works in the modal
});
});
$('#customizeModalId').on('shown.bs.modal', function() {
$('.select2').select2({
dropdownParent: $(this) // This ensures Select2 works in the modal
});
});
});
</script>
<script>
//getting modal backdrop inside full screen
$(document).ready(function() {
function moveModalBackdropToFullscreen() {
setTimeout(() => {
$('.modal-backdrop').appendTo('#fullscreenDiv'); // Move backdrop inside fullscreen
}, 10); // Small delay ensures backdrop is created first
}
// Move the modal backdrop when a modal opens
$('#bs-example-modal-lg, #customizeModalId').on('show.bs.modal', function() {
moveModalBackdropToFullscreen();
});
// Ensure modals work properly in fullscreen mode
document.addEventListener("fullscreenchange", function() {
setTimeout(() => {
$('.modal-backdrop').remove(); // Remove any existing backdrops
moveModalBackdropToFullscreen();
}, 200);
});
});
</script>
<script>
function showMessage(msg) {
let msgBox = document.getElementById("successMessage");
msgBox.innerText = msg; // Set API message
msgBox.style.display = "block";
// Hide message after 3 seconds
setTimeout(() => {
msgBox.style.display = "none";
}, 5000);
}
</script>
<script>
function calculateTotal(table,dataId,column) {
let columnTotal = 0;
let rows = table.querySelectorAll('tbody tr');
let machineId = dataId.split(' ')[1]??'';
rows.forEach(row => {
let date = row.querySelector('td:first-child').innerText.trim().split('-');
date = date[2] + "-" + date[1] + "-" + date[0]; // Convert to YYYY-MM-DD format
let cell = null;
if(machineId) {
cell = row.querySelector(`td.${column}[data-id="${date} ${machineId}"]`);
}else{
cell = row.querySelector(`td.${column}[data-id="${date}"]`);
console.log('inside machine id not present');
}
if (cell) {
let value = parseFloat(cell.innerText.trim()) || 0;
columnTotal += value ;
}
});
if(machineId) {
// Update the total cell in the footer
let footerColumn = table.querySelector(`tfoot tr td.${column}[data-id="footer ${machineId}"]`);
if (footerColumn) {
footerColumn.innerText = columnTotal == 0 ? " " : columnTotal.toFixed(2);
}
// let footerColumnOpeningUnits = table.querySelector(`tfoot tr td.openingUnits[data-id="footer ${machineId}`)??0;
// let footerColumnClosingUnits = table.querySelector(`tfoot tr td.closingUnits[data-id="footer ${machineId}`)??0;
// let footerColumnTotalUnits = table.querySelector(`tfoot tr td.totalUnits[data-id="footer ${machineId}`)??0;
// footerColumnTotalUnits.innerText = (
// parseFloat(footerColumnClosingUnits.innerText.trim())
// -
// parseFloat(footerColumnOpeningUnits.innerText.trim())
// ) ?? '';
}else{
// Update the total cell in the footer for TD
let footerColumn = table.querySelector(`tfoot tr td.${column}[data-id="footer ${column}"]`);
if (footerColumn) {
footerColumn.innerText = columnTotal == 0 ? " " : columnTotal.toFixed(2);
}
// let footerColumnOpeningTP = table.querySelector(`tfoot tr td.openingTP[data-id="footer openingTP`);
// let footerColumnFinalTP = table.querySelector(`tfoot tr td.finalTP[data-id="footer finalTP`);
// let footerColumnTotalReadingTP = table.querySelector(`tfoot tr td.totalReadingTP[data-id="footer totalReadingTP`)??0;
// let footerColumnTotalUnitsTP = table.querySelector(`tfoot tr td.totalUnitsTP[data-id="footer totalUnitsTP`);
// let footerColumnMdTP = table.querySelector(`tfoot tr td.mdTP[data-id="footer mdTP`);
// let footerColumnMfTP = table.querySelector(`tfoot tr td.mfTP[data-id="footer mfTP`);
// footerColumnTotalReadingTP.innerText = ( parseFloat(footerColumnFinalTP.innerText.trim())
// -
// parseFloat(footerColumnOpeningTP.innerText.trim())
// ) ?? '';
// footerColumnTotalUnitsTP.innerText = ( parseFloat(footerColumnTotalReadingTP.innerText.trim())
// * 60
// ) ?? '';
// footerColumnMfTP.innerText = ( parseFloat(footerColumnMdTP.innerText.trim())
// * 60
// ) ?? '';
}
}
</script>