You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

324 lines
11 KiB
PHP

<?php
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
class Component implements JsonSerializable {
private $componentid = "";
private $component = [];
private $exists = false;
public function __construct($componentid) {
global $database;
$this->componentid = $componentid;
if (Component::exists($componentid)) {
$this->exists = true;
$this->component = $database->get("components", ["machineid", "serial", "typeid [Int]", "tested", "capacity", "model", "price [Number]", "manufacturer", "publicnotes", "privatenotes"], ["compid" => $componentid]);
}
}
public static function create(): Component {
return new Component(Component::generateId());
}
public static function exists($id): bool {
global $database;
return $database->has('components', ['compid' => $id]);
}
public static function getTypes() {
global $database;
$types = $database->select("component_types", ["typeid (id)", "typename (name)"]);
$list = [];
foreach ($types as $t) {
$list[$t['id']] = $t['name'];
}
return $list;
}
public function toArray() {
global $Strings;
if ($this->exists) {
return [
"info" => [
"id" => $this->getID(),
"machineid" => $this->getMachineID(),
"serial" => $this->getSerial(),
"type" => $this->getTypeID(),
"tested" => $this->getTestedDate(),
"capacity" => $this->getCapacity(),
"model" => $this->getModel(),
"price" => $this->getPrice(),
"manufacturer" => $this->getManufacturer(),
"publicnotes" => $this->getPublicNotes(),
"privatenotes" => $this->getPrivateNotes()
],
"formdata" => [
"types" => $this->getTypes(),
"inputtypes" => [
"machineid" => "text",
"serial" => "text",
"type" => "number",
"tested" => "datetime",
"capacity" => "text",
"model" => "text",
"price" => "number",
"manufacturer" => "text",
"privatenotes" => "textarea",
"publicnotes" => "textarea"
],
"labels" => [
"machineid" => $Strings->get("Machine ID", false),
"serial" => $Strings->get("Serial", false),
"type" => $Strings->get("Type", false),
"tested" => $Strings->get("Tested", false),
"capacity" => $Strings->get("Capacity", false),
"model" => $Strings->get("Model", false),
"price" => $Strings->get("Price", false),
"manufacturer" => $Strings->get("Manufacturer", false),
"privatenotes" => $Strings->get("Private Notes", false),
"publicnotes" => $Strings->get("Public Notes", false)
],
"icons" => []
]
];
}
return [];
}
/**
* Render the component's info to HTML
* @param bool $public
*/
public function toHTML(bool $public = true): string {
global $Strings;
$func = function($param) {
return $param;
};
$line = function($type) use ($public): string {
global $Strings, $SETTINGS;
if ($type == "TestedDate") {
if (!empty($this->getTestedDate())) {
return "<b>" . $Strings->get("Tested On", false) . ":</b> " . date($SETTINGS["date_format"], strtotime($this->getTestedDate())) . "<br />";
}
return "";
}
if ($type == "Price") {
if (!empty($this->getPrice())) {
return "<b>" . $Strings->get("Price", false) . ":</b> $" . number_format($this->getPrice(), 2) . "<br />";
}
return "";
}
if ($type == "PublicNotes") {
if (!empty($this->getPublicNotes())) {
return "<div><b>" . ($public ? $Strings->get("Notes", false) : $Strings->get("Public Notes", false)) . ":</b><br /><div class=\"ml-3\">" . htmlspecialchars($this->getPublicNotes()) . "</div></div>";
}
return "";
}
if ($type == "PrivateNotes") {
if (!empty($this->getPrivateNotes()) && $public == false) {
return "<div><b>" . $Strings->get("Private Notes", false) . ":</b><br /><div class=\"ml-3\">" . htmlspecialchars($this->getPublicNotes()) . "</div></div>";
}
return "";
}
if (empty($this->{"get$type"}())) {
return "";
}
return "<b>" . $Strings->get($type, false) . ":</b> " . htmlspecialchars($this->{"get$type"}()) . "<br />";
};
$html = "";
if ($public == false) {
$html .= <<<HTML
<div class="float-right">
<a class="btn btn-danger btn-sm" href="./action.php?action=unlinkcomponent&source=viewmachine&id={$func($this->getID())}&machine={$func($this->getMachineID())}"><i class="fas fa-unlink"></i> Detach</a>
<a class="btn btn-primary btn-sm" href="./app.php?page=editcomponent&id={$func($this->getID())}"><i class="fas fa-edit"></i> Edit</a>
</div>
HTML;
}
$html .= <<<HTML
<b>{$func($this->getTypeName())}</b><br />
{$line("Model")}
{$line("Capacity")}
{$line("Serial")}
{$line("TestedDate")}
{$line("Price")}
{$line("Manufacturer")}
{$line("PrivateNotes")}
{$line("PublicNotes")}
HTML;
return $html;
}
public function jsonSerialize() {
return $this->toArray();
}
public function save() {
global $database;
if ($this->exists) {
$database->update("components", $this->component, ["compid" => $this->componentid]);
} else {
$data = $this->component;
$data["compid"] = $this->componentid;
$database->insert("components", $data);
$this->exists = true;
}
}
public function delete() {
global $database;
$database->delete("components", ["compid" => $this->componentid]);
}
public function getID(): string {
return $this->componentid . "";
}
public function getMachineID(): string {
if (!empty($this->component["machineid"])) {
return $this->component["machineid"];
}
return "";
}
public function getSerial(): string {
if (!empty($this->component["serial"])) {
return $this->component["serial"];
}
return "";
}
public function getTypeID(): int {
if (!empty($this->component["typeid"])) {
return $this->component["typeid"] * 1;
}
return 0;
}
public function getTypeName(): string {
return Component::getTypes()[$this->getTypeID()];
}
public function getTestedDate(): string {
if (!empty($this->component["tested"])) {
return $this->component["tested"];
}
return "";
}
public function getCapacity(): string {
if (!empty($this->component["capacity"])) {
return $this->component["capacity"];
}
return "";
}
public function getModel(): string {
if (!empty($this->component["model"])) {
return $this->component["model"];
}
return "";
}
public function getPrice(): float {
if (!empty($this->component["price"])) {
return $this->component["price"] * 1.0;
}
return 0.0;
}
public function getManufacturer(): string {
if (!empty($this->component["manufacturer"])) {
return $this->component["manufacturer"];
}
return "";
}
public function getPublicNotes(): string {
if (!empty($this->component["publicnotes"])) {
return $this->component["publicnotes"];
}
return "";
}
public function getPrivateNotes(): string {
if (!empty($this->component["privatenotes"])) {
return $this->component["privatenotes"];
}
return "";
}
public function setMachineID($id) {
$this->component["machineid"] = $id;
}
public function setSerial(string $serial) {
$this->component["serial"] = $serial;
}
public function setTypeID(int $id) {
if (!empty(Component::getTypes()[$id])) {
$this->component["typeid"] = $id;
}
}
public function setTestedDate(string $tested) {
$this->component["tested"] = date("Y-m-d H:i:s", strtotime($tested));
}
public function clearTestedDate() {
$this->component["tested"] = null;
}
public function setCapacity(string $capacity) {
$this->component["capacity"] = $capacity;
}
public function setModel(string $model) {
$this->component["model"] = $model;
}
public function setPrice(float $price) {
$this->component["price"] = $price;
}
public function setManufacturer(string $manufacturer) {
$this->component["manufacturer"] = $manufacturer;
}
public function setPrivateNotes(string $notes) {
$this->component["privatenotes"] = $notes;
}
public function setPublicNotes(string $notes) {
$this->component["publicnotes"] = $notes;
}
/**
* Generate a random ID number that is not in use.
* Default: 681#####[check digit]
* @global $database
* @param int $min Optional minimum number.
* @param int $max Optional maximum number.
* @return int
*/
public static function generateId(int $min = 68100000, int $max = 68199999): int {
global $database;
do {
$id = random_int($min, $max);
// If default gen add check digit
if ($id >= 68100000 && $id <= 68199999) {
$id = ("$id" . CheckDigit::S10($id)) * 1;
}
} while ($database->has('components', ['compid' => $id]) || $database->has('machines', ['machineid' => $id]));
return $id;
}
}