vid); $opt_box = db_get_opt_box($user->vid); $opt_invcond = db_load_enum('inventory', 'invcond', true, true); $opt_equipment = db_get_opt_equip($user->vid, [-1 => _('― none ―')]); // ========== 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 'filter': $flt = array(); $flt['stor'] = gpc_get_string($_POST, 'flt_stor'); //$flt['box'] = gpc_get_string($_POST, 'flt_box'); $flt['cond'] = gpc_get_string($_POST, 'flt_cond'); $flt['txt'] = gpc_get_string($_POST, 'flt_txt'); db_save_filter($flt, 201); $action = ACT_DEFAULT; break; case 'freset': db_clear_filter(201); $action = ACT_DEFAULT; break; case 'insert': $p[':invname'] = gpc_get_string($_POST, 'invname'); $p[':number'] = gpc_get_int($_POST, 'number'); $p[':conttype'] = gpc_get_string($_POST, 'conttype'); $p[':sid'] = gpc_get_int($_POST, 'sid'); $p[':boxid'] = gpc_get_int($_POST, 'boxid'); $p[':invcond'] = 'good'; $id = db_exec_insert('inventory', $p); $action = ACT_VIEW; break; case 'update': $p[':invid'] = $id; $p[':invname'] = gpc_get_string($_POST, 'invname'); $p[':number'] = gpc_get_int($_POST, 'number'); $p[':conttype'] = gpc_get_string($_POST, 'conttype'); $p[':sid'] = gpc_get_int($_POST, 'sid'); $p[':boxid'] = gpc_get_int($_POST, 'boxid'); $p[':weight'] = min(gpc_get_float($_POST, 'weight'), 999.99); // limit max value $p[':price'] = gpc_get_currency($_POST, 'price'); $p[':purchdate'] = gpc_get_date($_POST, 'purchdate'); $p[':invcond'] = gpc_get_string($_POST, 'invcond'); $p[':remarks'] = gpc_get_string($_POST, 'remarks', 150); $p[':eid'] = gpc_get_int($_POST, 'eid'); db_exec_update('inventory', $p, 'invid'); $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']); $sth = $pdo->prepare("DELETE FROM inventory WHERE invid=?"); $sth->execute([$id]); $g_message->Add(sprintf(_('Deleted inventory no. %d'), $id)); $action = ACT_DEFAULT; break; default: $g_error->Add(sprintf(_('Unknown function!'), $submit)); $valid = FALSE; } // ========== ACTIONS END ===================================================== require 'header.php'; // ========== PAGE CONTENT ==================================================== if ($action == ACT_DEFAULT): // ========== VARIANT: default behavior ======================================= page_caption_search($pagetitle); $flt = db_get_filter($user->id, 201); /* The only way to find out whether the inventory is on the current boat is to use the box assignment. But this is also intentional to allow easy rearrangement. */ $w = array('vid=:vid'); $p = array(':vid' => $user->vid); if ($flt->stor == -1) { $w[] = 'i.sid IS NULL'; } elseif ($flt->stor > 0) { $w[] = 'i.sid=:sid'; $p[':sid'] = $flt->stor; } if (strlen($flt->cond) > 2 ) { $w[] = 'invcond=:invcond'; $p[':invcond'] = $flt->cond; } if (strlen($flt->txt) > 1) { $w[] = 'invname LIKE :txt'; $p[':txt'] = '%'.$flt->txt.'%'; } $where = join(' AND ', $w); $order = ' ORDER BY invname'; $sql = "SELECT " . "(SELECT COUNT(*) FROM inventory AS i JOIN storage AS s ON (i.conttype='storage' AND i.sid=s.sid) WHERE $where)" . "+" . "(SELECT COUNT(*) FROM inventory AS i JOIN box AS b ON (i.conttype='box' AND i.boxid=b.boxid) JOIN storage AS s ON (b.sid=s.sid) WHERE $where)"; $sth = $pdo->prepare($sql); try { $sth->execute($p); } catch(PDOException $e) { $g_error->Add($e->getMessage()); $g_error->Add($sql); $g_error->Add(print_r($p, true)); $g_error->PrintOut(); } $numrows = $sth->fetchColumn(); $page = gpc_get_int($_REQUEST, 'p', 1); $rows_pp = gpc_get_int($_REQUEST, 'n', $g_rows_pp); $lastpage = ceil($numrows/$rows_pp); $sql = "SELECT i.invid, i.invname, i.number, i.invcond, i.eid, s.sname AS container " . "FROM inventory AS i JOIN storage AS s ON (i.conttype='storage' AND i.sid=s.sid)"; $sql .= ' WHERE ' . $where; $sql .= " UNION SELECT i.invid, i.invname, i.number, i.invcond, i.eid, b.label AS container " . "FROM inventory AS i JOIN box AS b ON (i.conttype='box' AND i.boxid=b.boxid) " . " JOIN storage AS s ON (b.sid=s.sid) "; $sql .= ' WHERE ' . $where; $sql .= $order; // if pagination: $sql .= ' LIMIT ' . ($page - 1) * $g_rows_pp . ',' . $g_rows_pp; $sth = $pdo->prepare($sql); try { $sth->execute($p); } catch(PDOException $e) { $g_error->Add($e->getMessage()); $g_error->Add($sql); $g_error->Add(print_r($p, true)); $g_error->PrintOut(); } $res = $sth->fetchAll(); // Filter $opt_special = array( -2 => _('― all ―'), -1 => _('― none ―') ); ?>
', "\n"; echo "\n"; echo "| ', _('Box type')," | ", $inventory->conttype, " |
|---|---|
| ", _('Container')," | ", sprintf(_('%s in %s'), $box['label'], $storagename); echo " |
| ", _('Location ID'), " | ", $inventory->locationid, " |
| ", _('Number'), " | ", $inventory->number, " |
| ", _('Weight'), " | ", format_float($inventory->weight, 2, 'kg'), " |
| ", _('Price'), " | ", format_currency($inventory->price), " |
| ", _('Purchase date'), " | ", $inventory->purchdate, " |
| ", _('Condition'), " | ", $opt_invcond[$inventory->invcond], " |
| ", _('Remarks'), " | ", nl2br($inventory->remarks), " |