$greenDate"; break; default: return []; } $sql = "SELECT * FROM $table $whereClause ORDER BY deadlineDate ASC"; $result = $db->query($sql); $orders = []; while ($row = $result->fetch_assoc()) { $orders[] = new self($row); } return $orders; } // --- REFACTORED METHODS --- private static function buildWhereClause(array $filters, array $allowedCampaignIds): string { if (empty($allowedCampaignIds)) { return " WHERE 1=0"; } $sql = Helper::generateFilterCondition(array_map('intval', $allowedCampaignIds), 'p.preordercampaign_id'); if (!empty($filters['id'])) { $sql .= Helper::generateFilterCondition($filters['id'], 'w.id', true); } if (!empty($filters['status'])) { $sql .= Helper::generateFilterCondition($filters['status'], 'w.status', true); } if (!empty($filters['preordercampaign_id'])) { $sql .= Helper::generateFilterCondition($filters['preordercampaign_id'], 'p.preordercampaign_id'); } if (!empty($filters['companyName'])) { $sql .= Helper::generateFilterCondition($filters['companyName'], 'c.name'); } if (!empty($filters['deadlineDate'])) { $sql .= Helper::generateFilterCondition($filters['deadlineDate'], 'w.deadlineDate'); } if (!empty($filters['preorderInfo'])) { $searchColumns = "p.firstname|p.lastname|p.company|p.oaid|p.street|p.housenumber|p.zip|p.city|str.name|ort.name"; $sql .= Helper::generateFilterCondition($filters['preorderInfo'], $searchColumns); } if (!empty($filters['rimo_fcp_name'])) { $searchColumns = "hn.rimo_fcp_name"; $sql .= Helper::generateFilterCondition($filters['rimo_fcp_name'], $searchColumns); } return "WHERE " . ltrim(trim($sql), 'AND'); } public static function getAdminWorkorders(array $filters, ?int $limit, int $offset, array $order, array $allowedCampaignIds): array { $db = self::getDB(); $fronkDbName = FRONKDB_DBNAME; $addressDbName = defined('ADDRESSDB_DBNAME') ? ADDRESSDB_DBNAME : 'addressdb'; $sql = " SELECT w.id, w.status, w.deadlineDate, w.companyId, p.preordercampaign_id, hn.rimo_fcp_name, CONCAT_WS(' ', p.firstname, p.lastname) as customerName, p.ucode, p.company as customerCompany, p.oaid, c.name as companyName, str.name as street, hn.hausnummer, hn.stiege, we.bezeichner as apartment, plz.plz, ort.name as city FROM `$fronkDbName`.`RMLWorkorder` w JOIN `$fronkDbName`.`Preorder` p ON w.preorderId = p.id LEFT JOIN `$fronkDbName`.`Preordercampaign` pc ON p.preordercampaign_id = pc.id LEFT JOIN `$fronkDbName`.`RMLWorkorderCompany` c ON w.companyId = c.id LEFT JOIN `$addressDbName`.`Hausnummer` hn ON p.adb_hausnummer_id = hn.id LEFT JOIN `$addressDbName`.`Strasse` str ON hn.strasse_id = str.id LEFT JOIN `$addressDbName`.`Plz` plz ON hn.plz_id = plz.id LEFT JOIN `$addressDbName`.`Ortschaft` ort ON hn.ortschaft_id = ort.id LEFT JOIN `$addressDbName`.`Wohneinheit` we ON p.adb_wohneinheit_id = we.id "; $sql .= self::buildWhereClause($filters, $allowedCampaignIds); $sql .= " ORDER BY CASE WHEN w.deadlineDate IS NULL THEN 1 ELSE 0 END, w.deadlineDate ASC"; if (!empty($order['key'])) { $sortableColumns = ['id', 'status', 'deadlineDate', 'companyName', 'clusterName']; if (in_array($order['key'], $sortableColumns)) { $sortOrder = (strtoupper($order['order']) === 'DESC') ? 'DESC' : 'ASC'; $sql .= ", " . $db->real_escape_string($order['key']) . " " . $sortOrder; } } if ($limit !== null) { $sql .= " LIMIT " . intval($limit) . " OFFSET " . intval($offset); } $result = $db->query($sql); return $result ? $result->fetch_all(MYSQLI_ASSOC) : []; } public static function countAdminWorkorders(array $filters, array $allowedCampaignIds): int { $db = self::getDB(); $fronkDbName = FRONKDB_DBNAME; $addressDbName = defined('ADDRESSDB_DBNAME') ? ADDRESSDB_DBNAME : 'addressdb'; $sql = " SELECT COUNT(w.id) as count FROM `$fronkDbName`.`RMLWorkorder` w JOIN `$fronkDbName`.`Preorder` p ON w.preorderId = p.id LEFT JOIN `$fronkDbName`.`RMLWorkorderCompany` c ON w.companyId = c.id LEFT JOIN `$addressDbName`.`Hausnummer` hn ON p.adb_hausnummer_id = hn.id LEFT JOIN `$addressDbName`.`Strasse` str ON hn.strasse_id = str.id LEFT JOIN `$addressDbName`.`Plz` plz ON hn.plz_id = plz.id LEFT JOIN `$addressDbName`.`Ortschaft` ort ON hn.ortschaft_id = ort.id "; $sql .= self::buildWhereClause($filters, $allowedCampaignIds); $result = $db->query($sql); if ($result === false) return 0; $row = $result->fetch_assoc(); return $row['count'] ?? 0; } private static function buildCompanyWhereClause(array $filters, int $companyId): string { $sql = "c.addressId = " . $companyId; if (!empty($filters['id'])) { $sql .= Helper::generateFilterCondition($filters['id'], 'w.id', true); } if (!empty($filters['status'])) { $sql .= Helper::generateFilterCondition($filters['status'], 'w.status'); } if (!empty($filters['deadlineDate'])) { $sql .= Helper::generateFilterCondition($filters['deadlineDate'], 'w.deadlineDate'); } if (!empty($filters['appointmentDate'])) { $sql .= Helper::generateFilterCondition($filters['appointmentDate'], 'w.appointmentDate'); } if (!empty($filters['preorderInfo'])) { $searchColumns = "p.firstname|p.lastname|p.company|p.oaid|p.street|p.housenumber|p.zip|p.city|str.name|ort.name|p.phone|p.email"; $sql .= Helper::generateFilterCondition($filters['preorderInfo'], $searchColumns); } if (!empty($filters['rimo_fcp_name'])) { $searchColumns = "hn.rimo_fcp_name"; $sql .= Helper::generateFilterCondition($filters['rimo_fcp_name'], $searchColumns); } return "WHERE " . $sql; } public static function getCompanyWorkorders(array $filters, ?int $limit, int $offset, array $order, int $companyId): array { $db = self::getDB(); $fronkDbName = FRONKDB_DBNAME; $addressDbName = defined('ADDRESSDB_DBNAME') ? ADDRESSDB_DBNAME : 'addressdb'; $sql = " SELECT w.id, w.status, w.deadlineDate, w.appointmentDate, hn.rimo_fcp_name, CONCAT_WS(' ', p.firstname, p.lastname) as customerName, p.company as customerCompany, p.oaid, p.phone, p.email, str.name as street, hn.hausnummer, hn.stiege, we.bezeichner as apartment, plz.plz, ort.name as city FROM `$fronkDbName`.`RMLWorkorder` w JOIN `$fronkDbName`.`Preorder` p ON w.preorderId = p.id LEFT JOIN `$fronkDbName`.`RMLWorkorderCompany` c ON w.companyId = c.id LEFT JOIN `$addressDbName`.`Hausnummer` hn ON p.adb_hausnummer_id = hn.id LEFT JOIN `$addressDbName`.`Strasse` str ON hn.strasse_id = str.id LEFT JOIN `$addressDbName`.`Plz` plz ON hn.plz_id = plz.id LEFT JOIN `$addressDbName`.`Ortschaft` ort ON hn.ortschaft_id = ort.id LEFT JOIN `$addressDbName`.`Wohneinheit` we ON p.adb_wohneinheit_id = we.id "; $sql .= self::buildCompanyWhereClause($filters, $companyId); $orderBy = " ORDER BY CASE WHEN w.deadlineDate IS NULL THEN 1 ELSE 0 END, w.deadlineDate ASC"; if (!empty($order['key'])) { $sortableColumns = ['id', 'status', 'deadlineDate', 'appointmentDate']; if (in_array($order['key'], $sortableColumns)) { $sortOrder = (strtoupper($order['order']) === 'DESC') ? 'DESC' : 'ASC'; $orderBy = " ORDER BY " . $db->real_escape_string($order['key']) . " " . $sortOrder; } } $sql .= $orderBy; if ($limit !== null) { $sql .= " LIMIT " . intval($limit) . " OFFSET " . intval($offset); } $result = $db->query($sql); return $result ? $result->fetch_all(MYSQLI_ASSOC) : []; } public static function countCompanyWorkorders(array $filters, int $companyId): int { $db = self::getDB(); $fronkDbName = FRONKDB_DBNAME; $addressDbName = defined('ADDRESSDB_DBNAME') ? ADDRESSDB_DBNAME : 'addressdb'; $sql = " SELECT COUNT(w.id) as count FROM `$fronkDbName`.`RMLWorkorder` w JOIN `$fronkDbName`.`Preorder` p ON w.preorderId = p.id LEFT JOIN `$addressDbName`.`Hausnummer` hn ON p.adb_hausnummer_id = hn.id LEFT JOIN `$addressDbName`.`Strasse` str ON hn.strasse_id = str.id LEFT JOIN `$addressDbName`.`Plz` plz ON hn.plz_id = plz.id LEFT JOIN `$addressDbName`.`Ortschaft` ort ON hn.ortschaft_id = ort.id "; $sql .= self::buildCompanyWhereClause($filters, $companyId); $result = $db->query($sql); if ($result === false) { return 0; } $row = $result->fetch_assoc(); return $row['count'] ?? 0; } }