1163 lines
58 KiB
PHP
1163 lines
58 KiB
PHP
<?php
|
|
|
|
include '../managers/menu.php';
|
|
|
|
if (!UserHasPerm('production_statistics')) {
|
|
StopAndDie();
|
|
}
|
|
|
|
if (isset($_POST["func"])) {
|
|
if (htmlspecialchars($_POST["func"]) == "filter") {
|
|
|
|
if (!isset($_COOKIE['maxperpage'])) {
|
|
setcookie("maxperpage", "25", time() + (86400 * 90), "/");
|
|
$maxperpage = "25";
|
|
} else {
|
|
$maxperpage = $_COOKIE['maxperpage'];
|
|
}
|
|
|
|
setcookie("maxperpage", strval($maxperpage), time() + (86400 * 90), "/");
|
|
|
|
$perpageselect = "<option value='25'>25 db / oldal</option>
|
|
<option value='50'>50 db / oldal</option>
|
|
<option value='100'>100 db / oldal</option>
|
|
<option value='250'>250 db / oldal</option>
|
|
<option value='500'>500 db / oldal</option>
|
|
<option value='1000'>1000 db / oldal</option>";
|
|
$perpageselect = str_replace("value='".$maxperpage."'", "value='".$maxperpage."' selected", $perpageselect);
|
|
|
|
$json = json_encode(array(
|
|
'perpage' => $perpageselect,
|
|
'result' => 'ok'
|
|
));
|
|
|
|
echo $json;
|
|
|
|
} else if (htmlspecialchars($_POST["func"]) == "table") {
|
|
$maxperpage = intval(htmlspecialchars($_POST["perpage"]));
|
|
$cpage = intval(htmlspecialchars($_POST["cpage"]));
|
|
|
|
$item_id = htmlspecialchars(str_replace(' ', '+', $_POST['item_id']));
|
|
$score = htmlspecialchars($_POST["score"]);
|
|
$under_production = htmlspecialchars($_POST["under_production"]);
|
|
$under_boxing = htmlspecialchars($_POST["under_boxing"]);
|
|
|
|
$addquery = "";
|
|
$isfirst = true;
|
|
|
|
if ($cpage == 0) {
|
|
$cpage = 1;
|
|
}
|
|
setcookie("maxperpage", $maxperpage, time() + (86400 * 90), "/");
|
|
|
|
if ($item_id != "") {
|
|
$addquery = $addquery." WHERE item_id LIKE '%".$item_id."%'";
|
|
$isfirst = false;
|
|
}
|
|
|
|
if ($under_production == "1") {
|
|
if ($isfirst) {
|
|
$addquery = $addquery." WHERE under_production = '0'";
|
|
$isfirst = false;
|
|
} else {
|
|
$addquery = $addquery." and under_production = '0'";
|
|
}
|
|
}
|
|
|
|
if ($under_boxing == "1") {
|
|
if ($isfirst) {
|
|
$addquery = $addquery." WHERE under_boxing = '0'";
|
|
$isfirst = false;
|
|
} else {
|
|
$addquery = $addquery." and under_boxing = '0'";
|
|
}
|
|
}
|
|
|
|
if ($score != "") {
|
|
if ($isfirst && $score == "priority_score") {
|
|
$addquery = $addquery." WHERE priority_score IS NOT NULL";
|
|
} else if ($score == "priority_score") {
|
|
$addquery = $addquery." and priority_score IS NOT NULL";
|
|
} else if ($isfirst && $score == "boxing_score") {
|
|
$addquery = $addquery." WHERE boxing_score IS NOT NULL";
|
|
} else if ($score == "boxing_score") {
|
|
$addquery = $addquery." and boxing_score IS NOT NULL";
|
|
}
|
|
|
|
$addquery = $addquery." ORDER BY ".$score;
|
|
$isfirst = false;
|
|
}
|
|
|
|
$sql = mysqli_query($conn,"SELECT COUNT(*) FROM statistics_daily".$addquery);
|
|
$count = mysqli_fetch_array($sql)[0];
|
|
|
|
$maxpage = ceil($count / $maxperpage);
|
|
if (!($cpage >= 1 && $cpage <= $maxpage)) {
|
|
$cpage = 1;
|
|
}
|
|
|
|
$limit = ($cpage - 1) * $maxperpage;
|
|
|
|
$sql = mysqli_query($conn,"SELECT param_value FROM system_params WHERE param_key = 'inventory_alert'");
|
|
$inventory_alert = intval(mysqli_fetch_array($sql)[0]);
|
|
|
|
$sql = mysqli_query($conn,"SELECT param_value FROM system_params WHERE param_key = 'box_alert'");
|
|
$box_alert = intval(mysqli_fetch_array($sql)[0]);
|
|
|
|
$responseStr = '';
|
|
$query = "SELECT * FROM statistics_daily".$addquery." LIMIT $limit, $maxperpage";
|
|
if ($result = $conn->query($query)) {
|
|
while ($statistics_daily = $result->fetch_assoc()) {
|
|
|
|
if ($responseStr != "") {
|
|
$responseStr .= "|%|";
|
|
}
|
|
|
|
$sql = mysqli_query($conn,"SELECT total_consumption FROM statistics_annual WHERE item_id = '" . $statistics_daily['item_id'] . "' ORDER BY year DESC LIMIT 1");
|
|
$av_prod_sql = mysqli_fetch_array($sql);
|
|
$av_prod = "<span style='opacity: 0.7;'>N/A</span>";
|
|
$is_new = "0";
|
|
if ($av_prod_sql != null) {
|
|
if ($av_prod_sql[0] != 0) {
|
|
$av_prod = $av_prod_sql[0];
|
|
}
|
|
} else {
|
|
$sql = mysqli_query($conn,"SELECT data_status FROM pr_parameters WHERE item_id = '" . $statistics_daily['item_id'] . "'");
|
|
$data_stat = mysqli_fetch_array($sql)['data_status'];
|
|
if ($data_stat == 1) {
|
|
$is_new = "1";
|
|
}
|
|
}
|
|
|
|
$stock_endurance = ($score === "priority_score") ? intval($statistics_daily['stock_endurance']) : intval($statistics_daily['stock_box_endurance']);
|
|
$show_alert = ($score === "priority_score") ? $inventory_alert : $box_alert;
|
|
|
|
if ($show_alert > $stock_endurance) {
|
|
$stock_endurance = '<span style=\'color: #FF4D00;\'>' . $stock_endurance . '</span>';
|
|
}
|
|
|
|
$responseStr .= $statistics_daily['item_id'].'/!/'.$statistics_daily['warehouse_box'].'/!/'.(intval($statistics_daily['warehouse_total']) - intval($statistics_daily['warehouse_box'])).'/!/'.$stock_endurance.'/!/'.$av_prod.'/!/'.$statistics_daily['under_production'].'/!/'.$statistics_daily['under_boxing'].'/!/'.$is_new;
|
|
}
|
|
}
|
|
|
|
echo '{"result": "ok", "data": "'.$responseStr.'", "maxpage": "'.$maxpage.'", "cpage": "'.$cpage.'"}';
|
|
|
|
} else if (htmlspecialchars($_POST["func"]) == "OpenSettings") {
|
|
|
|
$keys = ['default_average_production', 'default_total_consumption', 'inventory_holding', 'inventory_alert', 'box_holding', 'box_alert'];
|
|
$placeholders = implode(',', array_fill(0, count($keys), '?'));
|
|
|
|
$stmt = $conn->prepare("SELECT param_key, param_value FROM system_params WHERE param_key IN ($placeholders)");
|
|
$stmt->bind_param(str_repeat('s', count($keys)), ...$keys);
|
|
$stmt->execute();
|
|
$result = $stmt->get_result();
|
|
|
|
$params = [];
|
|
while ($row = $result->fetch_assoc()) {
|
|
$params[$row['param_key']] = $row['param_value'];
|
|
}
|
|
|
|
$sql = mysqli_query($conn,"SELECT day_date FROM statistics_daily ORDER BY day_date ASC LIMIT 1");
|
|
$oldest_statistics = mysqli_fetch_array($sql)[0];
|
|
$statistics_daily = date('Y.m.d. H:i', $oldest_statistics);
|
|
|
|
echo json_encode([
|
|
'default_average_production' => $params['default_average_production'],
|
|
'default_total_consumption' => $params['default_total_consumption'],
|
|
'inventory_holding' => $params['inventory_holding'],
|
|
'inventory_alert' => $params['inventory_alert'],
|
|
'box_holding' => $params['box_holding'],
|
|
'box_alert' => $params['box_alert'],
|
|
'statistics_daily' => $statistics_daily,
|
|
'result' => 'ok'
|
|
]);
|
|
} else if (htmlspecialchars($_POST["func"]) == "SaveSettings") {
|
|
$params = [
|
|
'default_total_consumption' => htmlspecialchars($_POST["default_total_consumption"]),
|
|
'default_average_production' => htmlspecialchars($_POST["default_average_production"]),
|
|
'inventory_holding' => htmlspecialchars($_POST["inventory_holding"]),
|
|
'inventory_alert' => htmlspecialchars($_POST["inventory_alert"]),
|
|
'box_holding' => htmlspecialchars($_POST["box_holding"]),
|
|
'box_alert' => htmlspecialchars($_POST["box_alert"])
|
|
];
|
|
|
|
$stmt = $conn->prepare("UPDATE system_params SET param_value = ? WHERE param_key = ?");
|
|
|
|
foreach ($params as $key => $value) {
|
|
$stmt->bind_param('ss', $value, $key);
|
|
$stmt->execute();
|
|
}
|
|
$stmt->close();
|
|
|
|
echo json_encode(['result' => 'ok']);
|
|
} else if (htmlspecialchars($_POST["func"]) == "OpenInfo") {
|
|
$item_id = htmlspecialchars(str_replace(' ', '+', $_POST['item_id']));
|
|
|
|
$sql = mysqli_query($conn,"SELECT * FROM statistics_daily WHERE item_id = '$item_id'");
|
|
$statistics_daily = mysqli_fetch_array($sql);
|
|
|
|
$annual_result = mysqli_query($conn, "SELECT * FROM statistics_annual WHERE item_id = '$item_id' AND year = (SELECT MAX(year) FROM statistics_annual WHERE item_id = '$item_id') LIMIT 1");
|
|
$statistics_annual = mysqli_fetch_assoc($annual_result);
|
|
|
|
$sql = mysqli_query($conn,"SELECT * FROM system_params");
|
|
$system_params = [];
|
|
while ($row = mysqli_fetch_assoc($sql)) {
|
|
$system_params[$row['param_key']] = $row['param_value'];
|
|
}
|
|
|
|
echo json_encode([
|
|
'day_date' => date('Y.m.d. H:i', $statistics_daily['day_date']) ?? 'N/A',
|
|
'year' => $statistics_annual['year'] ?? 'N/A',
|
|
'warehouse_total' => $statistics_daily['warehouse_total'] ?? 'N/A',
|
|
'stock_endurance' => $statistics_daily['stock_endurance'] ?? 'N/A',
|
|
'under_production' => $statistics_daily['under_production'] ?? 'N/A',
|
|
'under_boxing' => $statistics_daily['under_boxing'] ?? 'N/A',
|
|
'under_sales' => $statistics_daily['under_sales'] ?? 'N/A',
|
|
'total_consumption' => $statistics_annual['total_consumption'] ?? 'N/A',
|
|
'average_production' => $statistics_annual['average_production'] ?? 'N/A',
|
|
'average_scrap' => $statistics_annual['average_scrap'] ?? 'N/A',
|
|
'inventory_alert' => $system_params['inventory_alert'],
|
|
'warehouse_box' => $statistics_daily['warehouse_box'] ?? 'N/A',
|
|
'warehouse_foil' => (intval($statistics_daily['warehouse_total']) - intval($statistics_daily['warehouse_box'])) ?? 'N/A',
|
|
'stock_box_endurance' => $statistics_daily['stock_box_endurance'] ?? 'N/A',
|
|
'free_stock' => $statistics_daily['free_stock'] ?? 'N/A',
|
|
'result' => 'ok'
|
|
]);
|
|
|
|
} else if (htmlspecialchars($_POST["func"]) == "CreateProduction") {
|
|
$item_id = htmlspecialchars(str_replace(' ', '+', $_POST['item_id']) ?? '');
|
|
$category = htmlspecialchars($_POST['type'] ?? '');
|
|
|
|
/* Tábla validálás */
|
|
$validCategories = [
|
|
'classic' => 'production_classic',
|
|
'injmold' => 'production_injmold',
|
|
'sporty' => 'production_sporty'
|
|
];
|
|
|
|
if (!array_key_exists($category, $validCategories)) {
|
|
echo json_encode(['result' => 'Érvénytelen típus']);
|
|
exit;
|
|
}
|
|
|
|
$sql_table = $validCategories[$category];
|
|
|
|
/* Gyártandó termék mennyisége */
|
|
$sql = mysqli_query($conn,"SELECT * FROM statistics_daily WHERE item_id = '$item_id'");
|
|
$statistics_daily = mysqli_fetch_array($sql);
|
|
|
|
if ($statistics_daily['priority_score'] == null || $statistics_daily['priority_score'] == '') {
|
|
echo json_encode(['result' => 'Ez a cikkszám nem vehető fel gyártásba!']);
|
|
exit();
|
|
}
|
|
|
|
$annual_result = mysqli_query($conn, "SELECT * FROM statistics_annual WHERE item_id = '$item_id' AND year = (SELECT MAX(year) FROM statistics_annual WHERE item_id = '$item_id') LIMIT 1");
|
|
$statistics_annual = mysqli_fetch_assoc($annual_result);
|
|
|
|
$sql = mysqli_query($conn,"SELECT * FROM system_params");
|
|
$system_params = [];
|
|
while ($row = mysqli_fetch_assoc($sql)) {
|
|
$system_params[$row['param_key']] = $row['param_value'];
|
|
}
|
|
|
|
$daily_consumption = ($statistics_annual["total_consumption"] ?? $system_params["default_total_consumption"]) / 365;
|
|
$inventory_holding_amount = $daily_consumption * ($system_params["inventory_holding"] + ($statistics_annual['average_production'] ?? $system_params['default_average_production']));
|
|
$to_invholding = $inventory_holding_amount - ($statistics_daily["warehouse_total"] ?? 0) + ($statistics_annual['average_scrap'] ?? 0);
|
|
|
|
$db_start = ceil($to_invholding / 10) * 10;
|
|
|
|
/* SQL */
|
|
$sql = mysqli_query($conn,"INSERT INTO $sql_table(item_id, db_start) VALUES ('$item_id', $db_start)");
|
|
$prid = mysqli_insert_id($conn);
|
|
|
|
$_GET['type'] = 'daily';
|
|
$_GET['item_id'] = $item_id;
|
|
$_GET['silent'] = true;
|
|
include '../managers/statistics.php';
|
|
|
|
/* Táblázati adatok kitöltése */
|
|
if ($category == "classic" || $category == "sporty") {
|
|
$sql = mysqli_query($conn,"SELECT tablesize_x, tablesize_y FROM pr_cutting_parameters WHERE item_id = '$item_id'");
|
|
$pr_cutting_parameters = mysqli_fetch_array($sql);
|
|
if ($pr_cutting_parameters != null) {
|
|
$tablesize_x = intval($pr_cutting_parameters['tablesize_x']) ?? 0;
|
|
$tablesize_y = intval($pr_cutting_parameters['tablesize_y']) ?? 0;
|
|
|
|
$sql = mysqli_query($conn,"SELECT sum(left_db) as left_db, sum(right_db) as right_db FROM warehouse_foil WHERE item_id = '$item_id'");
|
|
$value = mysqli_fetch_array($sql);
|
|
|
|
$difference = intval($value["left_db"]) - intval($value["right_db"]);
|
|
$remain_l = abs($difference);
|
|
$remain_r = abs($difference);
|
|
if ($difference > 0) {
|
|
$remain_r = 0;
|
|
} else {
|
|
$remain_l = 0;
|
|
}
|
|
|
|
$sql = mysqli_query($conn,"UPDATE $sql_table SET tablesize_x = $tablesize_x, tablesize_y = $tablesize_y, remain_r = $remain_r, remain_l = $remain_l WHERE pr_id = '$prid'");
|
|
}
|
|
}
|
|
|
|
echo json_encode(['result' => 'ok', 'db_start' => $db_start]);
|
|
|
|
} else if (htmlspecialchars($_POST["func"]) == "CreateBoxing") {
|
|
$item_id = htmlspecialchars(str_replace(' ', '+', $_POST['item_id']) ?? '');
|
|
|
|
$annual_result = mysqli_query($conn, "SELECT * FROM statistics_annual WHERE item_id = '$item_id' AND year = (SELECT MAX(year) FROM statistics_annual WHERE item_id = '$item_id') LIMIT 1");
|
|
$statistics_annual = mysqli_fetch_assoc($annual_result);
|
|
|
|
$sql = mysqli_query($conn,"SELECT warehouse_total, warehouse_box FROM statistics_daily WHERE item_id = '$item_id'");
|
|
$statistics_daily = mysqli_fetch_array($sql);
|
|
|
|
$sql = mysqli_query($conn,"SELECT * FROM system_params");
|
|
$system_params = [];
|
|
while ($row = mysqli_fetch_assoc($sql)) {
|
|
$system_params[$row['param_key']] = $row['param_value'];
|
|
}
|
|
|
|
$in_foil_warehouse = intval($statistics_daily['warehouse_total']) - intval($statistics_daily['warehouse_box']);
|
|
$daily_consumption = ($statistics_annual["total_consumption"] ?? $system_params["default_total_consumption"]) / 365;
|
|
$need_to_box = intval($system_params['box_holding']) * $daily_consumption - intval($statistics_daily['warehouse_box']);
|
|
|
|
$min_db = min(max(5, ceil($need_to_box)), $in_foil_warehouse);
|
|
|
|
$sql = mysqli_query($conn,"INSERT INTO production_boxing(item_id, db_start) VALUES ('$item_id', $min_db)");
|
|
echo json_encode(['result' => 'ok', 'db_start' => $min_db]);
|
|
|
|
$_GET['type'] = 'daily';
|
|
$_GET['item_id'] = $item_id;
|
|
$_GET['silent'] = true;
|
|
include '../managers/statistics.php';
|
|
|
|
} else if (htmlspecialchars($_POST["func"]) == "statistics") {
|
|
$data = [];
|
|
|
|
// Classic adatok
|
|
$classicQuery = "SELECT stage, COUNT(*) as item_count, SUM(db_start) as total_db_start FROM production_classic WHERE stage != 0 GROUP BY stage";
|
|
$classicResult = $conn->query($classicQuery);
|
|
if ($classicResult) {
|
|
while ($row = $classicResult->fetch_assoc()) {
|
|
$data[] = [
|
|
'stage' => $row['stage'],
|
|
'item_count' => $row['item_count'],
|
|
'is_boxing' => false,
|
|
'type' => 'classic',
|
|
'db_start' => $row['total_db_start']
|
|
];
|
|
}
|
|
}
|
|
|
|
// Sports adatok
|
|
$sportyQuery = "SELECT stage, COUNT(*) as item_count, SUM(db_start) as total_db_start FROM production_sporty WHERE stage != 0 GROUP BY stage";
|
|
$sportyResult = $conn->query($sportyQuery);
|
|
if ($sportyResult) {
|
|
while ($row = $sportyResult->fetch_assoc()) {
|
|
$data[] = [
|
|
'stage' => $row['stage'],
|
|
'item_count' => $row['item_count'],
|
|
'is_boxing' => false,
|
|
'type' => 'sporty',
|
|
'db_start' => $row['total_db_start']
|
|
];
|
|
}
|
|
}
|
|
|
|
// Injmold adatok
|
|
$injmoldQuery = "SELECT stage, COUNT(*) as item_count, SUM(db_start) as total_db_start FROM production_injmold WHERE stage != 0 GROUP BY stage";
|
|
$injmoldResult = $conn->query($injmoldQuery);
|
|
if ($injmoldResult) {
|
|
while ($row = $injmoldResult->fetch_assoc()) {
|
|
$data[] = [
|
|
'stage' => $row['stage'],
|
|
'item_count' => $row['item_count'],
|
|
'is_boxing' => false,
|
|
'type' => 'injmold',
|
|
'db_start' => $row['total_db_start']
|
|
];
|
|
}
|
|
}
|
|
|
|
// Boxing adatok
|
|
$boxingQuery = "SELECT stage, COUNT(*) as item_count, SUM(db_start) as total_db_start,
|
|
CASE
|
|
WHEN SUBSTRING_INDEX(item_id, '+', 1) REGEXP '^[0-9]+$' THEN 'classic'
|
|
WHEN SUBSTRING_INDEX(item_id, '+', 1) REGEXP '^CL[P|M]?[0-9]+$' THEN 'climair'
|
|
WHEN SUBSTRING_INDEX(item_id, '+', 1) REGEXP '^FR[0-9]{4}$' THEN 'injmold'
|
|
WHEN SUBSTRING_INDEX(item_id, '+', 1) REGEXP '^F[0-9]{4}$' THEN 'sporty'
|
|
ELSE 'unknown'
|
|
END AS category
|
|
FROM production_boxing
|
|
WHERE stage != 0
|
|
GROUP BY stage, category";
|
|
|
|
$boxingResult = $conn->query($boxingQuery);
|
|
if ($boxingResult) {
|
|
while ($row = $boxingResult->fetch_assoc()) {
|
|
$data[] = [
|
|
'stage' => $row['stage'],
|
|
'item_count' => $row['item_count'],
|
|
'is_boxing' => true,
|
|
'type' => $row['category'],
|
|
'db_start' => $row['total_db_start']
|
|
];
|
|
}
|
|
}
|
|
|
|
|
|
// Összesítő: classic, sporty, injmold
|
|
$stageTypes = [];
|
|
$totals = [];
|
|
|
|
foreach ($data as $item) {
|
|
if (in_array($item['type'], ['classic', 'sporty', 'injmold'])) {
|
|
$stage = $item['stage'];
|
|
$isBoxing = $item['is_boxing'] ? 'boxing' : 'production';
|
|
|
|
if (!isset($stageTypes[$stage])) {
|
|
$stageTypes[$stage] = [];
|
|
}
|
|
$stageTypes[$stage][] = $item['type'];
|
|
|
|
$key = $stage . '_' . $isBoxing;
|
|
|
|
if (!isset($totals[$key])) {
|
|
$totals[$key] = [
|
|
'stage' => $stage,
|
|
'item_count' => 0,
|
|
'is_boxing' => $item['is_boxing'],
|
|
'type' => 'total',
|
|
'db_start' => 0
|
|
];
|
|
}
|
|
$totals[$key]['item_count'] += $item['item_count'];
|
|
$totals[$key]['db_start'] += $item['db_start'];
|
|
}
|
|
}
|
|
|
|
foreach ($totals as $key => $total) {
|
|
list($stage, $isBoxing) = explode('_', $key);
|
|
|
|
$boxingTypes = array_filter($stageTypes[$stage], function($type) use ($data, $stage, $isBoxing) {
|
|
foreach ($data as $item) {
|
|
if ($item['stage'] == $stage && $item['type'] == $type &&
|
|
($item['is_boxing'] ? 'boxing' : 'production') == $isBoxing) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
});
|
|
|
|
if (count(array_unique($boxingTypes)) > 1) {
|
|
$data[] = $total;
|
|
}
|
|
}
|
|
|
|
|
|
echo json_encode(['result' => 'ok', 'data' => $data]);
|
|
}
|
|
exit();
|
|
}
|
|
|
|
?>
|
|
|
|
<!DOCTYPE html>
|
|
<html lang="hu" dir="ltr">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<link rel="stylesheet" href="../css/panel.css">
|
|
<script src="../js/feather-icons.js"></script>
|
|
<title>Kezelőfelület</title>
|
|
</head>
|
|
<style>
|
|
.InfoBox .panel {
|
|
transition: all 0.2s ease;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.InfoBox .panel-header {
|
|
transition: 0.2s;
|
|
cursor: pointer;
|
|
user-select: none;
|
|
text-align: center;
|
|
font-size: 23px;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.InfoBox .panel-content {
|
|
transition: max-height 0.2s ease, opacity 0.2s ease;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.InfoBox .panel-collapsed .panel-content {
|
|
opacity: 0;
|
|
pointer-events: none;
|
|
user-select: none;
|
|
}
|
|
|
|
.InfoBox .panel-expanded .panel-content {
|
|
opacity: 1;
|
|
}
|
|
|
|
.InfoBox .panel-collapsed .panel-header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
height: 100%;
|
|
min-height: 35px;
|
|
opacity: 0.4;
|
|
cursor: pointer;
|
|
}
|
|
.InfoBox .panel-collapsed .panel-header:hover {
|
|
opacity: 1;
|
|
}
|
|
|
|
</style>
|
|
<body>
|
|
<?php echo $menuhtml;?>
|
|
<div class="window closed" id="win">
|
|
<div class="topbar">
|
|
<p id="wintitle">Title</p>
|
|
<div class="btn fullscrn" onclick="fullscrn();" id="fullscrnbtn"></div>
|
|
<div class="btn close" onclick="closewin();"></div>
|
|
</div>
|
|
<div class="wapp" id="winapp"><div id="errorDIV"></div></div>
|
|
<div class="loading" id="winloading"></div>
|
|
</div>
|
|
<div class="loadingBG" id="loadingBG"><img src="../img/loading.gif"></div>
|
|
<div class="content">
|
|
<div id="errorDIV" style="z-index: 100; top: 50px; position: fixed; width: calc(100% - 260px);"></div>
|
|
|
|
<!-- Tartalmi rész kezdete -->
|
|
|
|
<h1>Gyártástervező</h1>
|
|
|
|
<a title="Statisztika" style="position: absolute; float: right; top: 65px; right: 15px;" onclick="Statistics()">
|
|
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAECklEQVR4nO2Yy0/UQBzHuyzC7pKoEbaJ3o0Jd6/yHyjp6kHey/stL+XgRWM8kNYAZ2+KCO4CCspDkPfyRsWTiF4wclEjGKMXkzHTdrrt7vzaDrKAZn/J9zYbPp/pb37TwnHxile84vXfFi+IIV4QZ7h/tXifhHD2/y83r4W45jconDXEXcN5jRw4V1+peYkcTTiryNG0ghyNKyihcVlJw5KaRZRQj7OAEuoWkLNuHjnr5pDzCk5ISe2smhmUWIMzraR6CiVWT8pxVo0zPEkm8FVr8HoCPg+CO6PAVfiqCTXjDE8Sw6vgnAW4Bg+AJxBww67bAZ/UwI9U4rxgENgP8FodeA0NfEIDl1MxZl/AHvgyA3jIGrxaB15lBFcyyiJgB3yJAXzWAJ6xvIMyt5Ah5xa3VXACHwaXU/6cQcAW+CID+IxhxyPhM9UYdz0MniRnhEEgRuCkVUCBCjp4UhnOsH2BqJFYvzeznPQ4LDBKBZdTOsQgsMtZTsDTe7fQ2akdQ9J7Pmk9DgkkAeBKBlkEzCZLyHKWR8KTkB4HBcro4Eklgyi55BmDwG5mue4SAgXUkQgLDFPB5RQ/ZRD4y1kOC+AeH4UFSungSgbsC1jN8rT2DXTy7qYhaW3vtEsIFFAPKChQQgdPLsLpZxAwuYTwjkfCk5BLCBIgBxQSSAbAcVyFTxgELGY5LKBcQqCAekBBgWI6uJLHLALmsxwUUC8iUEA9oLDAABXc5cfpsy9gdgnhHgcFykflHocFcI8PwgJF/chVpAOX4fuUFPQyCAAfFKTHIQHS45AAOaCQgIsG7u9FroIeOQwC9A8K0uNpbevRU6j1rdbj6cGP0TdxYFM7oBkLX6PgM+a+UMAVeHdBELnzgwwCwAeF9rJVrntnkW/PEctLKPqAAq3i14P3yODu/IAc2wKGD4rKvQbvZwAPKvB5j+TYFwA+KOY+fEOxrtD65yhwd143cud2MwgA7+WzG7EXmMUCeQEDuCe3Sw6DgPl7OWmXZK1dzFrFOMvNWyUQ3nUduCfnoRzbArsC119CRX8L3m0A9+R0Ik92J4OAxXt5+IAawc0nizLLzcDdALgn+4EcBgG7k8UOuHGWk5FIB++ignuyOlBKVgeDQOnQTKxmeeRk8UT0OQ08Jes+8ly+N83FqrzCHR/5TzTvk95zHHLQ1vE+cZ2s8/pEgTssxQtSjw7sBrTO65NuhkXFIHcY6kR2+1GvIP4kYKmXWs5Aa9OEltOaqCD9Onah9fj+0tKgfFKhtquCuGy1nhekFU3ioujnDrq8gjima4t6q/W8IDWEn4I4xh10eQXph7r7v1PPt5yyWo/X4LWqxHfuoMsriLcxiNcn3bL7G16QrvOCtM3ym3jFK14ctf4Ag4Cuu9EcaaIAAAAASUVORK5CYII=" alt="marketing">
|
|
</a>
|
|
|
|
|
|
<div style="width: 100%; min-height: 85px;">
|
|
<div style="display: inline; float: left;">
|
|
<p>Cikkszám: </p>
|
|
<input type="text" id="filter-item_id" placeholder="Cikkszám..." autocomplete="off" style="width: 147px; height: 17px;" onkeydown="if (event.keyCode == 13) {SendFilter();}">
|
|
</div><div style="display: inline; float: left; padding-left: 15px;">
|
|
<p>Rendezés: </p>
|
|
<select id="filter-score" onchange="SendFilter();">
|
|
<option value="priority_score">Gyártásterv</option>
|
|
<option value="boxing_score">Dobozolásterv</option>
|
|
</select>
|
|
</div><div style="display: inline; float: left; padding-left: 15px; width: 155px;">
|
|
<p>Gyártás alatt lévők: </p>
|
|
<div class="checkbox-wrapper">
|
|
<input type="checkbox" id="filter-under_production" onclick="SendFilter();">
|
|
<label for="filter-under_production" style="margin-left: 0px;">Elrejtés</label>
|
|
</div>
|
|
</div><div style="display: inline; float: left; padding-left: 15px; width: 155px;">
|
|
<p>Dobozolás alatt lévők: </p>
|
|
<div class="checkbox-wrapper">
|
|
<input type="checkbox" id="filter-under_boxing" onclick="SendFilter();">
|
|
<label for="filter-under_boxing" style="margin-left: 0px;">Elrejtés</label>
|
|
</div>
|
|
</div><div style="display: inline; float: left; padding-left: 15px;">
|
|
<p>Oldalanként: </p>
|
|
<select id="filter-perpage" onchange="SendFilter();"><option value="25">25 db / oldal</option></select>
|
|
</div><div style="display: inline; float: left; padding-left: 15px;">
|
|
<p style="color: #f5f5f5;">: </p>
|
|
<button onclick="SendFilter();">Szűrés</button>
|
|
</div>
|
|
|
|
<div style="display: inline; float: right; padding-right: 15px;">
|
|
<p style="color: #f5f5f5;">: </p>
|
|
<a title="Beállítások"><i class="icon" onclick="OpenSettings();" style="width: 35px; height: 35px; opacity: 0.6;"><i data-feather="settings"></i></i></a>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<br clear="all">
|
|
<div style="border-top: solid 1px rgb(211,220,228); width: calc(100% - 15px); height: 0px; margin-top: 15px;"></div>
|
|
<br clear="all">
|
|
|
|
<div style="width: 100%; margin-left: 10px; margin-top: 10px; display: inline; float: left;">
|
|
<div class="tables" style="width: 100%">
|
|
<table id="table">
|
|
<thead>
|
|
<tr style="top: 0px; position: sticky; z-index: 1;">
|
|
<th>Cikkszám</th>
|
|
<th>Raktáron</th>
|
|
<th>Készletkitartás <small style='opacity: 0.8;'>nap</small></th>
|
|
<th>Éves fogyás</th>
|
|
<th style="width: 100px;">Info</th>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tbody>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<br clear="all">
|
|
<div>
|
|
<p style="text-align: center; padding-bottom: 50px; color: #333333;"><span onclick="left();" style="cursor: pointer;">< </span><span id="cpage">0</span> / <span id="maxpage">0</span><span onclick="right();" style="cursor: pointer;"> ></span></p>
|
|
</div>
|
|
|
|
<br clear="all"><br><br>
|
|
|
|
<!-- Tartalmi rész vége -->
|
|
|
|
</div>
|
|
<script src="../js/default.js" type="text/javascript"></script>
|
|
<script type="text/javascript">
|
|
feather.replace();
|
|
|
|
function LoadFilter() {
|
|
const body = 'func=filter';
|
|
get_POST_information("productionstat.php", body, function(text) {
|
|
let response = JSON.parse(text);
|
|
if (response.result == "ok") {
|
|
document.getElementById('filter-perpage').innerHTML = response.perpage;
|
|
LoadTable();
|
|
} else {
|
|
GenerateAlerts("error", response.result);
|
|
}
|
|
}, function() {
|
|
GenerateAlerts("error", "Hálózati hiba!");
|
|
});
|
|
}
|
|
function SendFilter() {
|
|
document.getElementById('cpage').innerHTML = '1';
|
|
LoadTable();
|
|
}
|
|
function left() {
|
|
var cpage = document.getElementById("cpage").innerHTML;
|
|
if ((parseInt(cpage) - 1) >= 1) {
|
|
document.getElementById("cpage").innerHTML = parseInt(cpage) - 1;
|
|
LoadTable();
|
|
}
|
|
}
|
|
function right() {
|
|
var cpage = document.getElementById("cpage").innerHTML;
|
|
var maxpage = document.getElementById("maxpage").innerHTML;
|
|
if ((parseInt(cpage) + 1) <= parseInt(maxpage)) {
|
|
document.getElementById("cpage").innerHTML = parseInt(cpage) + 1;
|
|
LoadTable();
|
|
}
|
|
}
|
|
function LoadTable() {
|
|
Loading();
|
|
var item_id = document.getElementById('filter-item_id').value;
|
|
var score = document.getElementById('filter-score').value;
|
|
if (document.getElementById('filter-under_production').checked) { under_production = 1; } else { under_production = 0; }
|
|
if (document.getElementById('filter-under_boxing').checked) { under_boxing = 1; } else { under_boxing = 0; }
|
|
|
|
var perpage = document.getElementById("filter-perpage").value;
|
|
var cpage = document.getElementById("cpage").innerHTML;
|
|
|
|
const body = 'func=table&perpage=' + perpage + '&cpage=' + cpage + '&under_production=' + under_production + '&under_boxing=' + under_boxing + '&item_id=' + encodeURIComponent(item_id).replace(/%20/g, '+') + '&score=' + score;
|
|
|
|
get_POST_information("productionstat.php", body, function(text) {
|
|
Loading(false);
|
|
let response = JSON.parse(text);
|
|
if (response.result == "ok") {
|
|
var table = document.getElementById('table').getElementsByTagName('tbody')[0];
|
|
table.innerHTML = "";
|
|
document.getElementById("cpage").innerHTML = response.cpage;
|
|
document.getElementById("maxpage").innerHTML = response.maxpage;
|
|
|
|
var tableresponse = response.data;
|
|
if (tableresponse != "") {
|
|
if (tableresponse.includes("|%|")) {
|
|
var tablearr = tableresponse.split("|%|");
|
|
} else {
|
|
var tablearr = [tableresponse];
|
|
}
|
|
for (var i = 0; i < tablearr.length; i++) {
|
|
var datas = tablearr[i].split("/!/");
|
|
|
|
var newRow = table.insertRow();
|
|
var newCell_1 = newRow.insertCell(0);
|
|
var newCell_2 = newRow.insertCell(1);
|
|
var newCell_3 = newRow.insertCell(2);
|
|
var newCell_4 = newRow.insertCell(3);
|
|
var newCell_5 = newRow.insertCell(4);
|
|
|
|
newCell_1.innerHTML = datas[0];
|
|
newCell_2.innerHTML = "<div style='float:left;'>" + datas[1] + " <small style='opacity: 0.8;'>doboz</small></div><div style='float:right;'>" + datas[2] + " <small style='opacity: 0.8;'> pár fóliás</small></div>";
|
|
newCell_3.innerHTML = datas[3];
|
|
newCell_4.innerHTML = datas[4];
|
|
newCell_5.innerHTML = '<a style="cursor: pointer;" onclick="OpenInfo(\'' + datas[0] + '\')">Megnyitás</button>';
|
|
|
|
var margin_left = "10px";
|
|
if (datas[5] == "1") {
|
|
margin_left = "35px";
|
|
newCell_1.innerHTML += `<img style='margin-left: 10px; height: 20px; position: absolute;' title='Gyártás alatt' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAACXBIWXMAAAsTAAALEwEAmpwYAAADjElEQVR4nO2aXahUVRTH902h8gMjU0E0Rcyz1txUuBeUwI8CIa2HoqLHIATxKR8sStHWOnMxEhXRB8EXIXoobvmB1j1rzVRDYAa9WSqIRIlC+pCg4gfevCN7Prhzz5wzZ+ZOng/0D/vlsPdh/87a/7XX3jPGPIrKUXGFs/PYVJNlAesWZC0jy5+YL7xgsigkXQUsw1UQLTssm03WtHDH0AwkuVyHANK/cyTPmkyJ6Alg9eoQlUbyocmakAubxkBUQUaAdP88Kj1lsiIgPdAAcRhZ91qQmun/cPLFxSYrJsdaplpKpWfsM8ctvAqs/9Se30HSD4wp95i0C11v5Ys7fpjVlABYT4wuN/0JWddnAqhZ5R4kyTf6B0g+MVkUsHw5BoTlR5M1ARUXIel/voh8GtY/R6UpSN67wPIxkG7oHZC5Jo3RQNbrYRtljmQtsFz1Qd8DFkrUVxAUDZaBwL557UfSu037URrKHeggGsDyfRhELePd6Kfjk1IdDWMzm91rWoHYqLjySvKZiuSef5+pazWVJiLr/SgQcL3X05CpBluOYT3bemnJSI6Kz8dHYSqT2h4wmdNAXl/YGCRvY8tosB41cSvH8n7wZGQYSXcv2aWTm0eVe4D0UEg0frflTuwgq6k0EVh+bvGF/0JX1wWNdVx5u5rB5DySnETWjxLJVnU5VJgNJFciUuopu8ujq8vN4OAEk1Y55L3sN324B+SmrZRtWRK7qdsRkm5rB6QJjPSM3XcS8UboeZ5kaDwwtWz1rz3rmDQIPitOB5aL44YhvZaaKhhdb+V4QWop+IhJjfG5C5AKTOG1pDmMNW63IMB6IfHrJWT5teuIVKOyNTGIBZ8XpzXeCbdr8JCo3MKB7+YlAoKu90aHxh6xl3rAeimkz+FEQOzVaYdL6HR1nNdXiUBajA8k5zozteyrj82RvjN6/TrW+Av3DT0Za/HYcXYi763Gd/gv+DAJ4wPJe536YxGVngs4038V0Pe2Q978WECQ9Yvx+MOvOXtOPQ2kvzXD6LexgLTIPJH+CFymDb+KYb2FHNL+N/XmC9itP4Iu8sCXyR668cH1XkLWg500WylHvRdJ3vSPy5Ese2ggmZFTWbPemjQ2hwqz24Kwa7nT+inOBizDUX6rCFl/SXqyGL0nnWwjIjKY+EQ5KgPq15Eg9soGWL6xqa/yv5MUNWC9YD/0EtKZbfnksR7LdK0HngfOl1qKuVUAAAAASUVORK5CYII=' alt='construction-worker'>`;
|
|
}
|
|
|
|
if (datas[6] == "1") {
|
|
newCell_1.innerHTML += `<img style='margin-left: ${margin_left}; height: 20px; position: absolute;' title='Dobozolás alatt' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAACXBIWXMAAAsTAAALEwEAmpwYAAADZklEQVR4nO2aW4hNYRSAl3suT8ql3ErDrLVHQyheNA+SB+NaXpVHhZRHaq1tDDE8KIknbx4mT4w5a51hTlGUS8iLKEIhjPs1zOg/zugYZ875d7bmP/jqr3PZe5/9tdf617/22QD/+QeJOLuCxHLI+tYN97o2tuVQTZDYbhLrKTVQtBmq6Er0lBvI2gihQ2K5SiLE1gmhg6JvPERew18hIvYKQofYOivmiOgZCB1kbawoEmeWQTWAbDvLXI0mqCaQtdGFkMuZwjhTNVei6oi4dXgkuolEL+SXH2yvie08iW5o4NxQqAZm7Dw9Cdmu9Z/MeqmebTyEzDw+MYrErntMr1fdthAqJHrUo9gVqrcegxBB1o3eEoVRK7oVQgI5uxDFPiUVIbYvtXF2KYRAPdt4FHuQWOJHvljXDO6YPqASDZwb6rN2+lMDRc+lIoKsewdKggojBYnMGmLtTpAPN5HtuUeo3SbWVZV+n9IQQe6YSawv/SX0WcRaQ7EtyFd5P/HOiG3OHxOpOdA+gkRvJEjmTxRnFv04gTi7mEQ/eMp8ceELra1DUhdB1i1JYjgSXf/LMWJdQqJP/Y+j21IXcWulBHmxr7/jRNw2MUFo3kldBMXe+YWUnioVEqVOhlgPEtvHMuH5IHURd2PAU+RqfYuN9hFxr+uadAqyHSq1QkCxltRFXCeXILSOA/QM8hHpJeKOqQWhLjfboViL62/SF4kzy5IkO7FJEhFf6HdF8jKizQkStTuKs2uDFHEg6zrfxCfW97WcnQ8hijiQM3NJ7K5n8t+raW4fByGKOCLWscja7iXDehiKSJRrUnpAqjAPRlEmsa8VEv9h8W5uGf47Esh2Nl0RAJi8//xIVzvKh5c9gpCZd+TyMBI7mTS0woJ5sLsj4iFxy+UThEnPIBI74hHL96mpbZrbY1bz6QkQGii6p3INsSd1O7Lkti80VjchJIhtu0fteNHb5dXt0Nnuvfu8V2zAwTjbUKlfz1f9Qmfo2lw3YxVdpc0QAijWUSGcProusGg1e7/P920QAtj3xH4Op88Y2+qiqn+rxAz2GEIA++tJWLvdYrJ3u4hzYwqPZ5St8AMGlrqn9V1iY99tXd9eQno3hALFmZUkduX7QzF2sb+ew1V91+Xl75qwPiPWXVXzr9V/IF2+AY4NiVSfCQlXAAAAAElFTkSuQmCC' alt='manual-handling'>`;
|
|
if (datas[5] == "1") {
|
|
margin_left = "60px";
|
|
} else {
|
|
margin_left = "35px";
|
|
}
|
|
}
|
|
|
|
if (datas[7] == "1") {
|
|
newCell_1.innerHTML += `<span style='margin-left: ${margin_left}; height: 20px; position: absolute; color: var(--panelcolor); font-size: 14px; font-weight: bold; margin-top: 3px; cursor: default;' title='Új termék'>Új!</span>`;
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
} else {
|
|
GenerateAlerts("error", response.result);
|
|
}
|
|
}, function() {
|
|
Loading(false);
|
|
GenerateAlerts("error", "Hálózati hiba!");
|
|
});
|
|
}
|
|
LoadFilter();
|
|
|
|
function OpenSettings() {
|
|
Loading();
|
|
openwin();
|
|
wintitle.innerHTML = "Beállítások";
|
|
winapp.innerHTML = '<div id="errorDIV"></div>';
|
|
const body = 'func=OpenSettings';
|
|
get_POST_information("productionstat.php", body, function(text) {
|
|
Loading(false);
|
|
let response = JSON.parse(text);
|
|
if (response.result == "ok") {
|
|
winapp.innerHTML += '<p style="color: #333333; margin-bottom: 0px; margin-left: 0px; font-size: 23px; font-weight: bold;">Beállítások</p>';
|
|
winapp.innerHTML += `<p style="opacity: 0.8; margin-top: 0px;">Alapértelmezett paraméterek, statisztikai beállítások</p><br>
|
|
<button class="Feedback" id="settings-save-button" style="position: absolute; width: 70px; right: 57px; top: 80px;" onclick="SaveSettings();"><span class="button-text">Mentés</span><div class="loader"></div><div class="checkmark">✔</div><div class="crossmark">✖</div></button>
|
|
<p style="width: calc(100% - 35px); border-bottom: 1px solid #bdc3c7; margin-top: 5px;"></p>`;
|
|
|
|
winapp.innerHTML += `<div style="margin-bottom: 15px; height: 87px;">
|
|
<div style="display: inline; float: left;">
|
|
<p style="font-weight: bold;">Éves fogyás: </p>
|
|
<input value="${response.default_total_consumption}" defaultValue="${response.default_total_consumption}" onblur="if(this.value !== this.defaultValue) { SaveSettings(); this.defaultValue = this.value; }" type="number" id="default_total_consumption" min="0" placeholder="Éves fogyás..." autocomplete="off" style="width: 147px; height: 17px;">
|
|
</div><div style="display: inline; float: left; margin-left: 15px; padding-left: 15px; height: 87px; width: calc(100% - 230px); border-left: 1px solid #bdc3c7;">
|
|
<p style="text-align: justify;">Az éves fogyást határozza meg, hogyha az adott cikkszámnak nincsen erre vonatkozó paramétere.</p>
|
|
</div>
|
|
</div>`;
|
|
|
|
winapp.innerHTML += `<div style="margin-bottom: 15px; height: 87px;">
|
|
<div style="display: inline; float: left;">
|
|
<p style="font-weight: bold;">Gyártási átlagidő: </p>
|
|
<input value="${response.default_average_production}" defaultValue="${response.default_average_production}" onblur="if(this.value !== this.defaultValue) { SaveSettings(); this.defaultValue = this.value; }" type="number" id="default_average_production" min="0" placeholder="Gyártási átlagidő..." autocomplete="off" style="width: 147px; height: 17px;">
|
|
</div><div style="display: inline; float: left; margin-left: 15px; padding-left: 15px; height: 87px; width: calc(100% - 230px); border-left: 1px solid #bdc3c7;">
|
|
<p style="text-align: justify;">Átlagos gyártási időt határozza meg napokban, hogyha az adott cikkszámnak nincsen erre vonatkozó paramétere.</p>
|
|
</div>
|
|
</div>`;
|
|
|
|
winapp.innerHTML += `<div style="margin-bottom: 15px; height: 87px;">
|
|
<div style="display: inline; float: left;">
|
|
<p style="font-weight: bold;">Készletkitartás: </p>
|
|
<input value="${response.inventory_holding}" defaultValue="${response.inventory_holding}" onblur="if(this.value !== this.defaultValue) { SaveSettings(); this.defaultValue = this.value; }" type="number" id="inventory_holding" min="0" placeholder="Készletkitartás..." autocomplete="off" style="width: 147px; height: 17px;">
|
|
</div><div style="display: inline; float: left; margin-left: 15px; padding-left: 15px; height: 87px; width: calc(100% - 230px); border-left: 1px solid #bdc3c7;">
|
|
<p style="text-align: justify;">Napokban kifejezi azt hogy hány napos készletre tervezzen a gyártásnál.</p>
|
|
</div>
|
|
</div>`;
|
|
|
|
winapp.innerHTML += `<div style="margin-bottom: 15px; height: 87px;">
|
|
<div style="display: inline; float: left;">
|
|
<p style="font-weight: bold;">Kritikus készlet: </p>
|
|
<input value="${response.inventory_alert}" defaultValue="${response.inventory_alert}" onblur="if(this.value !== this.defaultValue) { SaveSettings(); this.defaultValue = this.value; }" type="number" id="inventory_alert" min="0" placeholder="Kritikus készlet..." autocomplete="off" style="width: 147px; height: 17px;">
|
|
</div><div style="display: inline; float: left; margin-left: 15px; padding-left: 15px; height: 87px; width: calc(100% - 230px); border-left: 1px solid #bdc3c7;">
|
|
<p style="text-align: justify;">Napokban kifejezi azt, mikortól jelezze a rendszer, hogy egy terméket fel kell venni gyártásba.</p>
|
|
</div>
|
|
</div>`;
|
|
|
|
winapp.innerHTML += `<div style="margin-bottom: 15px; height: 87px;">
|
|
<div style="display: inline; float: left;">
|
|
<p style="font-weight: bold;">Dobozos készlet: </p>
|
|
<input value="${response.box_holding}" defaultValue="${response.box_holding}" onblur="if(this.value !== this.defaultValue) { SaveSettings(); this.defaultValue = this.value; }" type="number" id="box_holding" min="0" placeholder="Dobozos készlet..." autocomplete="off" style="width: 147px; height: 17px;">
|
|
</div><div style="display: inline; float: left; margin-left: 15px; padding-left: 15px; height: 87px; width: calc(100% - 230px); border-left: 1px solid #bdc3c7;">
|
|
<p style="text-align: justify;">Napokban kifejezi azt hogy hány napos készletre tervezzen a dobozolásnál.</p>
|
|
</div>
|
|
</div>`;
|
|
|
|
winapp.innerHTML += `<div style="margin-bottom: 15px; height: 87px;">
|
|
<div style="display: inline; float: left;">
|
|
<p style="font-weight: bold;">Krit. dobozos készlet: </p>
|
|
<input value="${response.box_alert}" defaultValue="${response.box_alert}" onblur="if(this.value !== this.defaultValue) { SaveSettings(); this.defaultValue = this.value; }" type="number" id="box_alert" min="0" placeholder="Kritikus dobozos készlet..." autocomplete="off" style="width: 147px; height: 17px;">
|
|
</div><div style="display: inline; float: left; margin-left: 15px; padding-left: 15px; height: 87px; width: calc(100% - 230px); border-left: 1px solid #bdc3c7;">
|
|
<p style="text-align: justify;">Napokban kifejezi azt, mikortól jelezze a rendszer, hogy egy terméket fel kell venni dobozolásra.</p>
|
|
</div>
|
|
</div>`;
|
|
|
|
winapp.innerHTML += `<div style="margin-bottom: 15px; height: 87px;">
|
|
<div style="display: inline; float: left;">
|
|
<p style="font-weight: bold;">Napi statisztika: </p>
|
|
<button class="Feedback" id="settings-recalcdailystat-button" style="width: 165px;" onclick="RecalcDailyStat();"><span class="button-text">Újraszámolás</span><div class="loader"></div><div class="checkmark">✔</div><div class="crossmark">✖</div></button>
|
|
</div><div style="display: inline; float: left; margin-left: 15px; padding-left: 15px; height: 87px; width: calc(100% - 230px); border-left: 1px solid #bdc3c7;">
|
|
<p style="text-align: justify;">A gombra rányomva újraszámolja a napi statisztikát a mostani időpillanatban aktuális raktárkészlettel.</p>
|
|
<p style="text-align: justify;">Legutóbbi statisztika: <span style="color: var(--panelcolor);">${response.statistics_daily}</span></p>
|
|
</div>
|
|
</div>`;
|
|
|
|
} else {
|
|
GenerateAlerts("error", response.result);
|
|
}
|
|
}, function() {
|
|
Loading(false);
|
|
GenerateAlerts("error", "Hálózati hiba!");
|
|
});
|
|
}
|
|
var isSaving = false;
|
|
function SaveSettings() {
|
|
if (isSaving) {return;}
|
|
FeedbackButtonStatus('loading', 'settings-save-button');
|
|
|
|
var default_total_consumption = document.getElementById("default_total_consumption").value;
|
|
var default_average_production = document.getElementById("default_average_production").value;
|
|
var inventory_holding = document.getElementById("inventory_holding").value;
|
|
var inventory_alert = document.getElementById("inventory_alert").value;
|
|
var box_holding = document.getElementById("box_holding").value;
|
|
var box_alert = document.getElementById("box_alert").value;
|
|
|
|
const body = 'func=SaveSettings&default_total_consumption=' + encodeURIComponent(default_total_consumption).replace(/%20/g, '+')
|
|
+ '&default_average_production=' + encodeURIComponent(default_average_production).replace(/%20/g, '+')
|
|
+ '&inventory_holding=' + encodeURIComponent(inventory_holding).replace(/%20/g, '+')
|
|
+ '&inventory_alert=' + encodeURIComponent(inventory_alert).replace(/%20/g, '+')
|
|
+ '&box_holding=' + encodeURIComponent(box_holding).replace(/%20/g, '+')
|
|
+ '&box_alert=' + encodeURIComponent(box_alert).replace(/%20/g, '+');
|
|
|
|
get_POST_information("productionstat.php", body, function(text) {
|
|
isSaving = false;
|
|
let response = JSON.parse(text);
|
|
if (response.result == "ok") {
|
|
FeedbackButtonStatus('complete', 'settings-save-button');
|
|
} else {
|
|
FeedbackButtonStatus('failed', 'settings-save-button');
|
|
GenerateAlerts("error", response.result);
|
|
}
|
|
}, function() {
|
|
isSaving = false;
|
|
FeedbackButtonStatus('failed', 'settings-save-button');
|
|
GenerateAlerts("error", "Hálózati hiba!");
|
|
});
|
|
|
|
|
|
}
|
|
function RecalcDailyStat() {
|
|
FeedbackButtonStatus('loading', 'settings-recalcdailystat-button');
|
|
get_POST_information("../managers/statistics.php?type=daily", '', function(text) {
|
|
if (text == "Napi statisztika sikeresen frissítve.") {
|
|
FeedbackButtonStatus('complete', 'settings-recalcdailystat-button');
|
|
location.reload();
|
|
} else {
|
|
FeedbackButtonStatus('failed', 'settings-recalcdailystat-button');
|
|
GenerateAlerts("error", text);
|
|
}
|
|
}, function() {
|
|
FeedbackButtonStatus('failed', 'settings-recalcdailystat-button');
|
|
GenerateAlerts("error", "Hálózati hiba!");
|
|
});
|
|
}
|
|
|
|
function OpenInfo(item_id) {
|
|
Loading();
|
|
openwin();
|
|
wintitle.innerHTML = "Adatlap - " + item_id;
|
|
winapp.innerHTML = '<div id="errorDIV"></div>';
|
|
const body = 'func=OpenInfo&item_id=' + encodeURIComponent(item_id).replace(/%20/g, '+');
|
|
get_POST_information("productionstat.php", body, function(text) {
|
|
Loading(false);
|
|
let response = JSON.parse(text);
|
|
if (response.result == "ok") {
|
|
|
|
var stock_endurance_color = 'var(--panelcolor)';
|
|
if (response.stock_endurance != 'N/A' && parseInt(response.stock_endurance) < parseInt(response.inventory_alert)) {
|
|
stock_endurance_color = '#FF4D00';
|
|
}
|
|
|
|
var boxingbutton = 'disabled';
|
|
if (response.warehouse_foil != 'N/A' && parseInt(response.warehouse_foil) > 0) {
|
|
boxingbutton = '';
|
|
}
|
|
|
|
winapp.innerHTML += `<p style="color: #333333; margin-bottom: 0px; margin-left: 0px; font-size: 23px; font-weight: bold;">Adatlap - <span style="color: var(--panelcolor);">${item_id}</span></p>
|
|
<p style="opacity: 0.8; margin-top: 0px;">A cikkszámra vonatkozó gyártási és dobozolási paraméterek</p><br>
|
|
<p style="width: calc(100% - 35px); border-bottom: 1px solid #bdc3c7; margin-top: 5px;"></p>
|
|
<div style="display: flex; align-items: stretch;" class="InfoBox">
|
|
|
|
<div id="productionPanel" class="panel panel-collapsed" style="flex: 1; position: relative; padding-bottom: 35px;">
|
|
<p class="panel-header" onclick="toggleInfoPanel('productionPanel')">Gyártási paraméterek</p>
|
|
<div class="panel-content">
|
|
<p title="${response.day_date}" style="cursor: help;"><b>Raktárkészlet:</b><span style="color: var(--panelcolor); margin-left: 5px;">${response.warehouse_total}</span> <small style="opacity: 0.8;">pár</small></p>
|
|
<p title="${response.day_date}" style="cursor: help;"><b>Szabad raktárkészlet:</b><span style="color: var(--panelcolor); margin-left: 5px;">${response.free_stock}</span> <small style="opacity: 0.8;">pár</small></p>
|
|
<p title="${response.day_date}" style="cursor: help;"><b>Rendelés alatt:</b><span style="color: var(--panelcolor); margin-left: 5px;">${response.under_sales}</span> <small style="opacity: 0.8;">pár</small></p>
|
|
<p title="${response.day_date}" style="cursor: help;"><b>Készlet kitartás:</b><span style="color: ${stock_endurance_color}; margin-left: 5px;">${response.stock_endurance}</span> <small style="opacity: 0.8;">nap</small></p>
|
|
<p title="${response.year}" style="cursor: help;"><b>Éves fogyás:</b><span style="color: var(--panelcolor); margin-left: 5px;">${response.total_consumption}</span> <small style="opacity: 0.8;">pár</small></p>
|
|
<p title="${response.year}" style="cursor: help;"><b>Gyártási átlagidő:</b><span style="color: var(--panelcolor); margin-left: 5px;">${response.average_production}</span> <small style="opacity: 0.8;">nap</small></p>
|
|
<p title="${response.year}" style="cursor: help;"><b>Átlag selejtszám:</b><span style="color: var(--panelcolor); margin-left: 5px;">${response.average_scrap}</span> <small style="opacity: 0.8;">pár</small></p>
|
|
|
|
<button onclick="StartProduction('${item_id}', '${response.under_production}');" style="position: absolute; bottom: 0px; right: 0px;">Felvétel gyártásba</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div style="width: 1px; background-color: #bdc3c7; margin: 0 8px;"></div>
|
|
|
|
<div id="boxingPanel" class="panel panel-collapsed" style="flex: 1; position: relative; padding-bottom: 35px;">
|
|
<p class="panel-header" onclick="toggleInfoPanel('boxingPanel')">Dobozolási paraméterek</p>
|
|
<div class="panel-content">
|
|
<p title="${response.day_date}" style="cursor: help;"><b>Dobozos raktárkészlet:</b><span style="color: var(--panelcolor); margin-left: 5px;">${response.warehouse_box}</span> <small style="opacity: 0.8;">doboz</small></p>
|
|
<p title="${response.day_date}" style="cursor: help;"><b>Rendelés alatt:</b><span style="color: var(--panelcolor); margin-left: 5px;">${response.under_sales}</span> <small style="opacity: 0.8;">pár</small></p>
|
|
<p title="${response.day_date}" style="cursor: help;"><b>Fóliás raktárkészlet:</b><span style="color: var(--panelcolor); margin-left: 5px;">${response.warehouse_foil}</span> <small style="opacity: 0.8;">pár</small></p>
|
|
<p title="${response.day_date}" style="cursor: help;"><b>Dobozos készlet kitartás:</b><span style="color: var(--panelcolor); margin-left: 5px;">${response.stock_box_endurance}</span> <small style="opacity: 0.8;">nap</small></p>
|
|
|
|
<button onclick="StartBoxing('${item_id}', '${response.under_boxing}');" style="position: absolute; bottom: 0px; right: 0px;" ${boxingbutton}>Dobozolási feladat létrehozása</button>
|
|
</div>
|
|
</div>
|
|
|
|
</div>`;
|
|
|
|
var score = document.getElementById('filter-score').value;
|
|
if (score == "boxing_score") {
|
|
toggleInfoPanel('boxingPanel');
|
|
} else {
|
|
toggleInfoPanel('productionPanel');
|
|
}
|
|
|
|
} else {
|
|
GenerateAlerts("error", response.result);
|
|
}
|
|
|
|
}, function() {
|
|
Loading(false);
|
|
GenerateAlerts("error", "Hálózati hiba!");
|
|
});
|
|
}
|
|
function toggleInfoPanel(panelId) {
|
|
const panel = document.getElementById(panelId);
|
|
if (panel.classList.contains('panel-collapsed')) {
|
|
panel.classList.remove('panel-collapsed');
|
|
panel.classList.add('panel-expanded');
|
|
} else {
|
|
panel.classList.remove('panel-expanded');
|
|
panel.classList.add('panel-collapsed');
|
|
}
|
|
}
|
|
|
|
function StartProduction(item_id, under_production) {
|
|
if (under_production == "1") {
|
|
var html = `
|
|
<p><b>Ez a termék már gyártás alatt van! Biztos szeretné felvenni gyártásba?</b></p>
|
|
<button id="startProductionAlertBtnYes" style="float: right; margin-left: 15px; width: 60px;">Igen</button>
|
|
<button id="startProductionAlertBtnNo" style="float: right; background: var(--panelcolor); color: #f5f5f5; width: 60px; border: unset;">Nem</button>
|
|
`;
|
|
const overlay = CreateAlertBox('Figyelem!', html);
|
|
document.getElementById('startProductionAlertBtnYes').onclick = function () { StartProduction(item_id, "0"); CloseAlertBox(overlay); };
|
|
document.getElementById('startProductionAlertBtnNo').onclick = function () { CloseAlertBox(overlay); };
|
|
} else {
|
|
var classic_selected = '';
|
|
var sporty_selected = '';
|
|
var injmold_selected = '';
|
|
|
|
if (/^\d/.test(item_id)) {
|
|
classic_selected = 'selected';
|
|
} else if (item_id.startsWith('FR')) {
|
|
injmold_selected = 'selected';
|
|
} else if (item_id.startsWith('F')) {
|
|
sporty_selected = 'selected';
|
|
}
|
|
|
|
var html = `
|
|
<p><b>Válassza ki a gyártás típusát</b></p>
|
|
<select id="StartProductionType">
|
|
<option value="">-- Válasszon --</option>
|
|
<option value="classic" ${classic_selected}>Classic gyártás</option>
|
|
<option value="sporty" ${sporty_selected}>Sporty gyártás</option>
|
|
<option value="injmold" ${injmold_selected}>Fröccsöntött gyártás</option>
|
|
</select>
|
|
<button id="startProductionAlertBtn" style="float: right;">Indítás</button>
|
|
`;
|
|
|
|
const overlay = CreateAlertBox('Gyártás létrehozása', html);
|
|
|
|
document.getElementById('startProductionAlertBtn').onclick = function () {
|
|
CreateProduction(item_id, overlay);
|
|
};
|
|
}
|
|
}
|
|
function CreateProduction(item_id, overlay) {
|
|
var type = document.getElementById('StartProductionType').value;
|
|
CloseAlertBox(overlay);
|
|
if (type == null || type == "") {
|
|
GenerateAlerts('warning', 'Kérjük, válasszon ki egy típust!');
|
|
return;
|
|
}
|
|
|
|
Loading();
|
|
const body = 'func=CreateProduction&item_id=' + encodeURIComponent(item_id).replace(/%20/g, '+') + '&type=' + type;
|
|
get_POST_information("productionstat.php", body, function(text) {
|
|
Loading(false);
|
|
let response = JSON.parse(text);
|
|
if (response.result == "ok") {
|
|
GenerateAlerts("info", response.db_start + " pár cikkszám az ajánlott gyártási mennyiség.");
|
|
GenerateAlerts("success", "Sikeresen felvette gyártásba! Továbbiakat a <a href='./production' style='text-decoration: underline; color: white;'>termékgyártás</a> menuponton érheti el.");
|
|
LoadTable();
|
|
} else {
|
|
GenerateAlerts("error", response.result);
|
|
}
|
|
}, function() {
|
|
Loading(false);
|
|
GenerateAlerts("error", "Hálózati hiba!");
|
|
});
|
|
}
|
|
|
|
function StartBoxing(item_id, under_boxing) {
|
|
if (under_boxing == "1") {
|
|
var html = `
|
|
<p><b>Ez a termék már dobozolás alatt van! Biztos szeretné felvenni dobozolási feladatnak?</b></p>
|
|
<button id="startBoxingAlertBtnYes" style="float: right; margin-left: 15px; width: 60px;">Igen</button>
|
|
<button id="startBoxingAlertBtnNo" style="float: right; background: var(--panelcolor); color: #f5f5f5; width: 60px; border: unset;">Nem</button>
|
|
`;
|
|
const overlay = CreateAlertBox('Figyelem!', html);
|
|
document.getElementById('startBoxingAlertBtnYes').onclick = function () { StartBoxing(item_id, "0"); CloseAlertBox(overlay); };
|
|
document.getElementById('startBoxingAlertBtnNo').onclick = function () { CloseAlertBox(overlay); };
|
|
} else {
|
|
Loading();
|
|
const body = 'func=CreateBoxing&item_id=' + encodeURIComponent(item_id).replace(/%20/g, '+');
|
|
get_POST_information("productionstat.php", body, function(text) {
|
|
Loading(false);
|
|
let response = JSON.parse(text);
|
|
if (response.result == "ok") {
|
|
GenerateAlerts("info", response.db_start + " pár cikkszám az ajánlott dobozolási mennyiség.");
|
|
GenerateAlerts("success", "Sikeresen felvette dobozolási feladatnak! Továbbiakat a <a href='./boxing' style='text-decoration: underline; color: white;'>termékdobozolás</a> menuponton érheti el.");
|
|
LoadTable();
|
|
} else {
|
|
GenerateAlerts("error", response.result);
|
|
}
|
|
}, function() {
|
|
Loading(false);
|
|
GenerateAlerts("error", "Hálózati hiba!");
|
|
});
|
|
}
|
|
}
|
|
|
|
function Statistics() {
|
|
openwin();
|
|
wintitle.innerHTML = "Statisztika";
|
|
|
|
winapp.innerHTML = `<div id="errorDIV"></div>
|
|
<div class="statistics">
|
|
|
|
<div class="container"><div class="header"><h1>Gyártási és Dobozolási statisztika</h1><p>Valós idejű termelés és dobozolás monitorozás</p></div>
|
|
|
|
<div class="sections">
|
|
<div class="section-group"><h2 class="section-group-title">Gyártás</h2>
|
|
<div class="section"><h3 class="section-name">Előkészítés</h3><div class="section-articles" id="prodstat_prep"></div></div>
|
|
<div class="section"><h3 class="section-name">Szerszám előkészítése</h3><div class="section-articles" id="prodstat_tools"></div></div>
|
|
<div class="section"><h3 class="section-name">Terítékfelvágás</h3><div class="section-articles" id="prodstat_cut"></div></div>
|
|
<div class="section"><h3 class="section-name">Préselés</h3><div class="section-articles" id="prodstat_press"></div></div>
|
|
<div class="section"><h3 class="section-name">Feldolgozás</h3><div class="section-articles" id="prodstat_process"></div></div>
|
|
<div class="section"><h3 class="section-name">Utómunka</h3><div class="section-articles" id="prodstat_postprocess"></div></div>
|
|
<div class="section"><h3 class="section-name">Raktározás</h3><div class="section-articles" id="prodstat_warehouse"></div></div>
|
|
</div>
|
|
|
|
<div class="section-group"><h2 class="section-group-title">Dobozolás</h2>
|
|
<div class="section"><h3 class="section-name">Előkészítés</h3><div class="section-articles" id="boxstat_prep"></div></div>
|
|
<div class="section"><h3 class="section-name">Raktározás</h3><div class="section-articles" id="boxstat_warehouse"></div></div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>`;
|
|
|
|
const body = 'func=statistics';
|
|
get_POST_information("productionstat.php", body, function(text) {
|
|
let response = JSON.parse(text);
|
|
if (response.result == "ok") {
|
|
const sectionMap = {
|
|
boxing: {
|
|
1: 'boxstat_prep',
|
|
2: 'boxstat_warehouse'
|
|
},
|
|
production: {
|
|
1: 'prodstat_prep',
|
|
2: 'prodstat_tools',
|
|
3: 'prodstat_cut',
|
|
4: 'prodstat_press',
|
|
5: 'prodstat_process',
|
|
6: 'prodstat_postprocess',
|
|
7: 'prodstat_warehouse'
|
|
},
|
|
type: {
|
|
'classic': 'Classic',
|
|
'injmold': 'Fröccsöntött',
|
|
'sporty': 'Sporty',
|
|
'total': 'Összesen',
|
|
'boxing': 'Dobozolás'
|
|
}
|
|
};
|
|
|
|
response.data.forEach(item => {
|
|
let section_id;
|
|
/*let type = item.is_boxing ? 'boxing' : 'prod';*/
|
|
|
|
if (item.is_boxing) {
|
|
section_id = sectionMap.boxing[item.stage];
|
|
} else {
|
|
section_id = sectionMap.production[item.stage];
|
|
}
|
|
|
|
if (section_id) {
|
|
CreateStatElement(section_id, 'prod', sectionMap.type[item.type], item.item_count, item.db_start);
|
|
}
|
|
});
|
|
|
|
} else {
|
|
GenerateAlerts("error", response.result);
|
|
}
|
|
}, function() {
|
|
GenerateAlerts("error", "Hálózati hiba!");
|
|
});
|
|
|
|
}
|
|
function CreateStatElement(section_id, type, item_id, left, right) {
|
|
const section = document.getElementById(section_id);
|
|
if (type == "prod") {
|
|
section.innerHTML += `
|
|
<div class="article-card">
|
|
<div class="article-card-code">${item_id}</div>
|
|
<div class="article-card-stats">
|
|
<div class="article-card-stat">
|
|
<span class="article-card-label">Pár:</span>
|
|
<span class="article-card-value right">${right}</span>
|
|
</div>
|
|
<div class="article-card-stat">
|
|
<span class="article-card-label">Cikkszám:</span>
|
|
<span class="article-card-value left">${left}</span>
|
|
</div>
|
|
</div>
|
|
</div>`;
|
|
|
|
} else {
|
|
var percent = (parseInt(left) / parseInt(right) * 100).toFixed();
|
|
|
|
section.innerHTML += `
|
|
<div class="boxing-row">
|
|
<div class="boxing-header">
|
|
<div class="article-code">${item_id}</div>
|
|
<span class="boxing-label">${left}/${right}</span>
|
|
</div>
|
|
<div class="boxing-progress">
|
|
<div class="progress-bar">
|
|
<div class="progress-fill" style="width: ${percent}%;"></div>
|
|
</div>
|
|
<span class="progress-text">${percent}%</span>
|
|
</div>
|
|
</div>
|
|
`;
|
|
|
|
}
|
|
}
|
|
|
|
</script>
|
|
</body>
|
|
</html>
|