362 lines
12 KiB
PHP
362 lines
12 KiB
PHP
<?php
|
|
/******************************************************************************
|
|
* YMS - Yacht Management Software
|
|
* Copyright (C) 2024-2026 Thomas Hooge
|
|
*
|
|
* SPDX-License-Identifier: WTFPL
|
|
******************************************************************************/
|
|
|
|
require 'globals.inc';
|
|
require 'lib/gpc.inc';
|
|
|
|
$pagetitle = _('Storage');
|
|
|
|
$id = gpc_get_int($_REQUEST, 'id', 0);
|
|
|
|
$opt_stype = db_get_options(3);
|
|
|
|
// ========== ACTIONS START ===================================================
|
|
|
|
switch ($submit = form_get_action()) {
|
|
|
|
case NULL: break;
|
|
|
|
case 'add': $action = ACT_ADD; break;
|
|
case 'view': $action = ACT_VIEW; break;
|
|
case 'edit': $action = ACT_EDIT; break;
|
|
case 'del': $action = ACT_DELETE; break;
|
|
|
|
case 'insert':
|
|
$p[':vid'] = $user->vid;
|
|
$p[':sname'] = gpc_get_string($_POST, 'sname');
|
|
$p[':stype'] = gpc_get_int($_POST, 'stype');
|
|
$id = db_exec_insert('storage', $p);
|
|
$action = ACT_VIEW;
|
|
break;
|
|
|
|
case 'update':
|
|
$p[':sid'] = $id;
|
|
$p[':sname'] = gpc_get_string($_POST, 'sname');
|
|
$p[':stype'] = gpc_get_string($_POST, 'stype');
|
|
$p[':x'] = gpc_get_int($_POST, 'x');
|
|
$p[':y'] = gpc_get_int($_POST, 'y');
|
|
$p[':z'] = gpc_get_int($_POST, 'z');
|
|
$p[':wx'] = gpc_get_int($_POST, 'wx');
|
|
$p[':wy'] = gpc_get_int($_POST, 'wy');
|
|
$p[':wz'] = gpc_get_int($_POST, 'wz');
|
|
$p[':remarks'] = gpc_get_string($_POST, 'remarks', 150);
|
|
db_exec_update('storage', $p, 'sid');
|
|
$action = ACT_VIEW;
|
|
break;
|
|
|
|
case 'delete':
|
|
// Security token needed!
|
|
if (gpc_get_string($_POST, 'token', 16) != $_SESSION['token']) {
|
|
$g_error->Add(_('Delete prohibited, invalid security token!'));
|
|
$action = ACT_VIEW;
|
|
break;
|
|
}
|
|
unset($_SESSION['token']);
|
|
// check if storage is empty
|
|
// - no assigned boxes
|
|
$sth = $pdo->prepare("SELECT COUNT(*) FROM box WHERE sid=?");
|
|
$sth->execute([$id]);
|
|
if ($sth->fetchColumn() > 0) {
|
|
$g_error->Add(_('Delete failed, assigned boxes detected!'));
|
|
$action = ACT_VIEW;
|
|
break;
|
|
}
|
|
// - no assigned equipment
|
|
$sth = $pdo->prepare("SELECT COUNT(*) FROM inventory WHERE conttype='storage' AND sid=?");
|
|
$sth->execute([$id]);
|
|
if ($sth->fetchColumn() > 0) {
|
|
$g_error->Add(_('Delete failed, assigned equipment detected!'));
|
|
$action = ACT_VIEW;
|
|
break;
|
|
}
|
|
$sth = $pdo->prepare("SELECT sname FROM storage WHERE sid=?");
|
|
$sth->execute([$id]);
|
|
$storagename = $sth->fetchcolumn();
|
|
$sth = $pdo->prepare("DELETE FROM storage WHERE sid=?");
|
|
$sth->execute([$id]);
|
|
$g_message->Add(sprintf(_('Deleted storage no. %d (%s)'), $id, $storagename));
|
|
$action = ACT_DEFAULT;
|
|
break;
|
|
|
|
default:
|
|
$g_error->Add(sprintf(_("Unknown function '%s'!"), $submit));
|
|
$valid = FALSE;
|
|
}
|
|
|
|
// ========== ACTIONS END =====================================================
|
|
|
|
require 'header.php';
|
|
|
|
// ========== PAGE CONTENT ====================================================
|
|
|
|
if ($action == ACT_DEFAULT):
|
|
// ========== VARIANT: default behavior =======================================
|
|
|
|
page_caption_search($pagetitle);
|
|
|
|
// Storage
|
|
// stype from dropdown
|
|
$sql = "SELECT sid, sname, x, y, z, angle, remarks "
|
|
. "FROM storage "
|
|
. "WHERE vid=? "
|
|
. "ORDER BY sid";
|
|
$sth = $pdo->prepare($sql);
|
|
$sth->execute([$user->vid]);
|
|
$res = $sth->fetchAll();
|
|
echo '<table class="table table-striped">', "\n";
|
|
echo "<thead>\n";
|
|
echo "<tr>";
|
|
echo '<th>#</th>';
|
|
echo "<th>", _('Name'), "</th>";
|
|
echo "<th>", _('Position'), "</th>";
|
|
echo "<th>", _('Remarks'), "</th>";
|
|
echo "<th> </th>";
|
|
echo "</tr>\n";
|
|
echo "</thead>\n";
|
|
$i = 0;
|
|
foreach ($res as $row) {
|
|
$i++; // record number
|
|
echo "<tr>\n";
|
|
echo '<td>', $i;
|
|
echo '<a class="text-nowrap" title="', _('View'), '" href="', $g_scriptname, '?f=view&id=', $row['sid'], '"><i class="bi bi-eye ms-2"></i></a>', "\n";
|
|
echo "</td>\n";
|
|
echo "<td>", $row['sname'], "</td>\n";
|
|
if ($row['angle'] != 0) {
|
|
$angle = " (" . $row['angle'] . "°)";
|
|
} else {
|
|
$angle = "";
|
|
}
|
|
echo "<td>", join(',', array($row['x'] ?? '?', $row['y'] ?? '?', $row['z'])), $angle, "</td>\n";
|
|
echo "<td>", $row['remarks'], "</td>\n";
|
|
// Edit current record button
|
|
echo "<td>";
|
|
echo '<a title="', _('Edit'), '" href="', $g_scriptname, '?f=edit&id=', $row['sid'], '"><i class="bi-pencil"></i></a>', "\n";
|
|
echo "</td>\n";
|
|
echo "</tr>\n";
|
|
}
|
|
// Table summary
|
|
$numrows = count($res);
|
|
table_rec_summary($i, $numrows, $numrows, 5);
|
|
echo "</table>\n";
|
|
|
|
form_add_button($g_scriptname);
|
|
|
|
// Boxes
|
|
echo "<h1>", _('Box'), "</h1>\n";
|
|
$sql = "SELECT boxid, sid, label, color, content, remarks "
|
|
. "FROM box "
|
|
. "ORDER BY label";
|
|
$sth = $pdo->query($sql);
|
|
$res = $sth->fetchAll();
|
|
echo '<table class="table table-striped">', "\n";
|
|
echo "<thead>\n";
|
|
echo "<tr>";
|
|
echo '<th>#</th>';
|
|
echo "<th>" . _('Label') . "</th>";
|
|
echo "<th>" . _('Color') . "</th>";
|
|
echo "<th>" . _('Content') . "</th>";
|
|
echo "<td></td>";
|
|
echo "</tr>\n";
|
|
$i = 0;
|
|
foreach ($res as $row) {
|
|
$i++; // record number
|
|
echo "<tr>\n";
|
|
echo '<td>', $i;
|
|
echo '<a class="text-nowrap" title="', _('View'), '" href="box.php?f=view&id=', $row['boxid'], '"><i class="bi bi-eye ms-2"></i></a>', "\n";
|
|
echo "</td>\n";
|
|
echo "<td>". $row['label'] ."</td>\n";
|
|
echo '<td>', format_color($row['color']), "</td>\n";
|
|
echo "<td>". $row['content'] ."</td>\n";
|
|
// Edit current record button
|
|
echo "<td>";
|
|
echo '<a title="', _('Edit'), '" href="box.php?f=edit&id=', $row['boxid'], '"><i class="bi-pencil"></i></a>', "\n";
|
|
echo "</td>\n";
|
|
echo "</tr>\n";
|
|
}
|
|
// Table summary
|
|
$numrows = count($res);
|
|
table_rec_summary($i, $numrows, $numrows, 4);
|
|
echo "</table>\n";
|
|
|
|
form_add_button('box.php');
|
|
|
|
elseif ($action == ACT_ADD):
|
|
// ========== VARIANT: add record =============================================
|
|
|
|
echo '<h2>', _('Add Storage'), "</h2>\n";
|
|
|
|
?>
|
|
|
|
<form method="post" action="<?=$g_scriptname?>">
|
|
<div class="mb-3">
|
|
<label for="sname" class="form-label"><?=_('Name')?></label>
|
|
<input type="text" class="form-control" id="sname" name="sname">
|
|
</div>
|
|
<?php
|
|
form_create_select('stype', _('Type'), $opt_stype);
|
|
?>
|
|
<button type="submit" name="submit[insert]" class="btn btn-primary"><?=_('Save')?></button>
|
|
<a href="<?=$g_scriptname?>" class="btn btn-secondary"><?=_('Back')?></a>
|
|
</form>
|
|
|
|
|
|
<?php
|
|
|
|
elseif ($action == ACT_VIEW):
|
|
// ========== VARIANT: view single record =====================================
|
|
|
|
$opt_unit = db_get_options(6);
|
|
$sql = "SELECT sid, sname, stype, capacity, capaunit, x, y, z, wx, wy, wz, angle, color, remarks "
|
|
. "FROM storage "
|
|
. "WHERE sid=?";
|
|
$sth = $pdo->prepare($sql);
|
|
$sth->execute([$id]);
|
|
$storage = $sth->fetch(PDO::FETCH_OBJ);
|
|
echo '<h2>', $storage->sname, "</h2>\n";
|
|
|
|
echo '<table class="table">', "\n";
|
|
echo '<tr><th style="width:33%">', _('Typ'),"</th><td>", $opt_stype[$storage->stype], "</td></tr>\n";
|
|
echo '<tr><th>', _('Capacity'),"</th><td>", $storage->capacity, ' ', $storage->capaunit, "</td></tr>\n";
|
|
echo '<tr><th>', _('Location (x, y, z)'),"</th><td>(", $storage->x, ', ', $storage->y, ', ', $storage->z, ")</td></tr>\n";
|
|
echo '<tr><th>', _('Width (wx, wy, wz)'),"</th><td>(", $storage->wx, ', ', $storage->wy, ', ', $storage->wz, ")</td></tr>\n";
|
|
echo '<tr><th>', _('Angle'),"</th><td>", $storage->angle, "°</td></tr>\n";
|
|
echo '<tr><th>', _('Color'),"</th><td>", $storage->color, "</td></tr>\n";
|
|
echo '<tr><th>', _('Remarks'),"</th><td>", $storage->remarks, "</td></tr>\n";
|
|
echo "</table>\n";
|
|
|
|
form_view_buttons($g_scriptname, $id);
|
|
|
|
// show assigned boxes here
|
|
echo '<h3>', _('Boxes in storage'), "</h3>\n";
|
|
|
|
$sql = "SELECT boxid, label, color FROM box WHERE sid=?";
|
|
$sth = $pdo->prepare($sql);
|
|
$sth->execute([$id]);
|
|
$res = $sth->fetchall();
|
|
if (count($res) > 0) {
|
|
echo '<table class="table table-sm">';
|
|
foreach ($res as $row) {
|
|
echo "<tr>";
|
|
echo '<td>', $row['label'], "</td>";
|
|
echo '<td>', format_color($row['color']), "</td>";
|
|
echo '<td><a title="', _('View'), '" href="box.php?f=view&id=', $row['boxid'], '"><i class="bi-eye"></i></a></td>';
|
|
echo "</tr>\n";
|
|
}
|
|
echo "</table>\n";
|
|
} else {
|
|
echo '<p>', _('No boxes contained'), "</p>\n";
|
|
}
|
|
|
|
echo '<h3>', _('Provisions in storage'), "</h3>\n";
|
|
|
|
$sql = "SELECT provid, provname, number, unit, storedate, shelflife FROM provisions WHERE sid=?";
|
|
$sth = $pdo->prepare($sql);
|
|
$sth->execute([$id]);
|
|
$res = $sth->fetchall();
|
|
if (count($res) > 0) {
|
|
echo '<table class="table table-sm">';
|
|
foreach ($res as $row) {
|
|
echo "<tr>";
|
|
echo "<td>", $row['provname'], "</td>";
|
|
echo "<td>", $row['number'], ' ', $opt_unit[$row['unit']], "</td>";
|
|
echo "<td>", $row['storedate'], ' - ', $row['shelflife'], "</td>";
|
|
echo "</tr>\n";
|
|
}
|
|
echo "</table>\n";
|
|
} else {
|
|
echo '<p>', _('No provisions contained'), "</p>\n";
|
|
}
|
|
|
|
elseif ($action == ACT_EDIT):
|
|
// ========== VARIANT: edit single record =====================================
|
|
|
|
echo '<h2>', _('Edit Storage'), "</h2>\n";
|
|
|
|
$sql = "SELECT sid, sname, stype, x, y, z, wx, wy, wz, remarks "
|
|
. "FROM storage "
|
|
. "WHERE sid=?";
|
|
$sth = $pdo->prepare($sql);
|
|
$sth->execute([$id]);
|
|
$storage = $sth->fetch(PDO::FETCH_OBJ);
|
|
|
|
?>
|
|
<form method="post" action="<?=$g_scriptname?>">
|
|
<input type="hidden" name="id" value="<?=$id?>">
|
|
<div class="mb-3">
|
|
<label for="sname" class="form-label"><?=_('Name')?></label>
|
|
<input type="text" class="form-control" id="sname" name="sname" value="<?=$storage->sname ?>">
|
|
</div>
|
|
<?php
|
|
form_create_select('stype', _('Type'), $opt_stype, $storage->stype);
|
|
?>
|
|
<div class="mb-3">
|
|
<label class="form-label"><?=_('Position (x, y, z) in mm')?></label>
|
|
<div class="row">
|
|
<div class="col">
|
|
<input type="number" class="form-control" id="x" name="x" min="0" value="<?=$storage->x ?>">
|
|
</div>
|
|
<div class="col">
|
|
<input type="number" class="form-control" id="y" name="y" value="<?=$storage->y ?>">
|
|
</div>
|
|
<div class="col">
|
|
<input type="number" class="form-control" id="z" name="z" value="<?=$storage->z ?>">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label class="form-label"><?=_('Width (x, y, z) in mm')?></label>
|
|
<div class="row">
|
|
<div class="col">
|
|
<input type="number" class="form-control" id="wx" name="wx" min="0" value="<?=$storage->wx ?>">
|
|
</div>
|
|
<div class="col">
|
|
<input type="number" class="form-control" id="wy" name="wy" min="0" value="<?=$storage->wy ?>">
|
|
</div>
|
|
<div class="col">
|
|
<input type="number" class="form-control" id="wz" name="wz" min="0" value="<?=$storage->wz ?>">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="remarks" class="form-label"><?=_('Remarks')?></label>
|
|
<textarea class="form-control" id="remarks" name="remarks" rows="3"><?=$storage->remarks ?></textarea>
|
|
</div>
|
|
<button type="submit" name="submit[update]" class="btn btn-primary"><?=_('Save')?></button>
|
|
<a href="<?=$g_scriptname?>?f=view&id=<?=$id?>" class="btn btn-secondary"><?=_('Back')?></a>
|
|
</form>
|
|
<?php
|
|
|
|
elseif ($action == ACT_DELETE):
|
|
// ========== VARIANT: delete record ==========================================
|
|
|
|
$_SESSION['token'] = bin2hex(random_bytes(8));
|
|
$sql = "SELECT sname, remarks FROM storage WHERE sid=?";
|
|
$sth = $pdo->prepare($sql);
|
|
$sth->execute([$id]);
|
|
$storage = $sth->fetch(PDO::FETCH_OBJ);
|
|
|
|
echo '<h2>', _('Delete Storage'), "</h2>\n";
|
|
|
|
echo '<p>', sprintf(_('Record no. %d'), $id), "</p>\n";
|
|
echo '<p>Name: ', $storage->sname, "</p>";
|
|
echo '<p>Remarks: ', $storage->remarks, "</p>";
|
|
|
|
echo '<p>', _('Deleting a storage is final. There is no way back. Only delete if you are absolute sure.'), "</p>\n";
|
|
|
|
form_delete_buttons($g_scriptname, $id, $_SESSION['token']);
|
|
|
|
else:
|
|
// ========== ERROR UNKNOWN VARIANT ===========================================
|
|
|
|
echo '<p>', _('Unknown function call: Please report to system development!'), "</p>\n";
|
|
|
|
endif; // $action == ...
|
|
// ========== END OF VARIANTS =================================================
|
|
|
|
include 'footer.php';
|