Files
thetool/application/AssetManagement/AssetManagementModel.php
2026-01-19 06:51:56 +01:00

153 lines
5.8 KiB
PHP

<?php
class AssetManagementModel extends TTCrudBaseModel {
public int $id;
public string $name;
public ?string $description;
public ?string $category;
public ?int $mainImageId; // Renamed from imageId
public ?string $imageIds; // Changed to JSON (will be a string in PHP)
public string $assetNumber;
public string $location;
public ?int $serviceDueDate;
public ?int $mustReturnDate;
public int $create;
public int $createBy;
/**
* Retrieves all assets based on a filter, with special handling for 'assetDetails'.
*
* @param array $filter The filter criteria. If 'assetDetails' is present, it will perform a multi-field search.
* @param int|null $limit The maximum number of records to return.
* @param int $offset The starting offset for the records.
* @param array $order The ordering criteria.
* @return array An array of AssetManagementModel objects.
*/
public static function getAll($filter = [], $limit = null, $offset = 0, $order = ["key" => null]): array {
$db = self::getDB();
$table = self::getFullyQualifiedTable();
$customFilterSql = '';
// Check if the intelligent 'assetDetails' filter is being used.
if (!empty($filter['assetDetails'])) {
$searchTerms = explode(' ', $filter['assetDetails']);
$searchConditions = [];
foreach ($searchTerms as $term) {
if (empty(trim($term))) continue;
$escapedTerm = $db->real_escape_string($term);
$searchConditions[] = "(`name` LIKE '%$escapedTerm%' OR `assetNumber` LIKE '%$escapedTerm%' OR `description` LIKE '%$escapedTerm%' OR `category` LIKE '%$escapedTerm%')";
}
if (!empty($searchConditions)) {
// All search terms must be found (AND logic).
$customFilterSql = ' AND (' . implode(' AND ', $searchConditions) . ')';
}
// Remove the 'assetDetails' key to prevent errors in the standard filter generation.
}
unset($filter['assetDetails']);
$sqlFilter = self::getSQLFilter($filter);
if ($sqlFilter === '') {
if ($customFilterSql !== '') {
// If the base filter is empty but a custom filter exists, start with WHERE.
$sqlFilter = 'WHERE' . ltrim($customFilterSql, ' AND');
}
} else {
// If a base filter already exists, just append the custom one.
$sqlFilter .= $customFilterSql;
}
$sql = "SELECT * FROM $table $sqlFilter";
$sql .= $order['key'] === null ? " ORDER BY `id` ASC" : " ORDER BY `" . $order['key'] . "` " . $order['order'];
$sql .= $limit === null ? "" : " LIMIT " . $limit . " OFFSET " . $offset;
try {
$result = $db->query($sql);
} catch (Exception $e) {
echo $sql;
die($e->getMessage());
}
$rows = [];
$class = get_called_class();
while ($row = $result->fetch_assoc()) {
$rows[] = new $class($row);
}
return $rows;
}
/**
* Counts assets based on a filter, with special handling for 'assetDetails'.
*
* @param array $filter The filter criteria. If 'assetDetails' is present, it will perform a multi-field count.
* @return int The total count of matching records.
*/
public static function count($filter = []): int {
$db = self::getDB();
$table = self::getFullyQualifiedTable();
$customFilterSql = '';
// Check if the intelligent 'assetDetails' filter is being used.
if (!empty($filter['assetDetails'])) {
$searchTerms = explode(' ', $filter['assetDetails']);
$searchConditions = [];
foreach ($searchTerms as $term) {
if (empty(trim($term))) continue;
$escapedTerm = $db->real_escape_string($term);
// For each term, search in name, assetNumber, description, and category.
$searchConditions[] = "(`name` LIKE '%$escapedTerm%' OR `assetNumber` LIKE '%$escapedTerm%' OR `description` LIKE '%$escapedTerm%' OR `category` LIKE '%$escapedTerm%')";
}
if (!empty($searchConditions)) {
// All search terms must be found (AND logic).
$customFilterSql = ' AND (' . implode(' AND ', $searchConditions) . ')';
}
// Remove the 'assetDetails' key to prevent errors in the standard filter generation.
}
unset($filter['assetDetails']);
$sqlFilter = self::getSQLFilter($filter);
if ($sqlFilter === '') {
if ($customFilterSql !== '') {
// If the base filter is empty but a custom filter exists, start with WHERE.
$sqlFilter = 'WHERE' . ltrim($customFilterSql, ' AND');
}
} else {
// If a base filter already exists, just append the custom one.
$sqlFilter .= $customFilterSql;
}
$sql = "SELECT COUNT(*) as count FROM $table $sqlFilter";
$result = $db->query($sql);
return $result->fetch_assoc()['count'];
}
public static function getDistinctCategories(string $searchTerm = ''): array {
$db = self::getDB();
$table = self::getFullyQualifiedTable();
$sql = "SELECT DISTINCT `category` FROM $table WHERE `category` IS NOT NULL AND `category` != ''";
if (!empty($searchTerm)) {
$escapedTerm = $db->real_escape_string($searchTerm);
$sql .= " AND `category` LIKE '%$escapedTerm%'";
}
$sql .= " ORDER BY `category` ASC LIMIT 20";
$result = $db->query($sql);
$categories = [];
while ($row = $result->fetch_assoc()) {
$categories[] = $row['category'];
}
return $categories;
}
}