Workorder mph/improve

This commit is contained in:
Luca Haid
2025-12-13 21:27:43 +00:00
parent 1435923200
commit 0755df5408
19 changed files with 658 additions and 122 deletions
@@ -7,10 +7,11 @@ class WorkorderMphCompanyController extends WorkorderMphBaseController
protected array $permissionCheck = ['RMLCompany'];
protected array $columns = [
['key' => 'id', 'text' => 'Auftrags-Nr.', 'table' => ['sortable' => true]],
['key' => 'hausnummerInfo', 'text' => 'Adresse', 'modal' => false, 'table' => ['sortable' => false]],
['key' => 'wohneinheitCount', 'text' => 'WE', 'modal' => false, 'table' => ['sortable' => false]],
['key' => 'additionalInfo', 'text' => 'Notiz', 'modal' => false, 'table' => ['sortable' => true]],
['key' => 'id', 'text' => 'Auftrags-Nr.', 'table' => ['sortable' => true, 'filter' => 'numberRange']],
['key' => 'hausnummerInfo', 'text' => 'Adresse', 'modal' => false, 'table' => ['filter' => 'search', 'sortable' => false]],
['key' => 'netzgebietName', 'text' => 'Netzgebiet', 'modal' => false, 'table' => ['filter' => 'select', 'sortable' => false]],
['key' => 'rimoFcpName', 'text' => 'FCP', 'modal' => false, 'table' => ['filter' => 'search', 'sortable' => false]],
['key' => 'additionalInfo', 'text' => 'Notiz', 'modal' => false, 'table' => ['sortable' => false]],
['key' => 'deadlineDate', 'text' => 'Deadline', 'modal' => false, 'table' => ['filter' => 'date', 'sortable' => true]],
['key' => 'appointmentDate', 'text' => 'Termin', 'modal' => false, 'table' => ['filter' => 'date', 'sortable' => true]],
];
@@ -23,6 +24,22 @@ class WorkorderMphCompanyController extends WorkorderMphBaseController
$company = WorkorderCompanyModel::getFirst(['addressId' => $this->user->address_id]);
$this->additionalJSVariables['COMPANY_ID'] = $company ? $company->id : 0;
// Populate netzgebiet filter options for this company's workorders
$netzgebietColIdx = array_search('netzgebietName', array_column($this->columns, 'key'));
if ($netzgebietColIdx !== false && $company) {
$db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
$fronkDbName = FRONKDB_DBNAME;
$sql = "SELECT DISTINCT ng.id, ng.name FROM Netzgebiet ng
INNER JOIN Hausnummer hn ON ng.id = hn.netzgebiet_id
INNER JOIN `$fronkDbName`.`WorkorderMph` wm ON wm.hausnummerId = hn.id
WHERE ng.name IS NOT NULL AND ng.name != '' AND wm.companyId = " . intval($company->id) . "
ORDER BY ng.name ASC";
$result = $db->query($sql);
$netzgebiete = $result ? $result->fetch_all(MYSQLI_ASSOC) : [];
$this->columns[$netzgebietColIdx]['table']['filterOptions'] = array_map(fn($ng) => ['value' => $ng['id'], 'text' => $ng['name']], $netzgebiete);
}
}
protected function getAction()
@@ -54,6 +71,8 @@ class WorkorderMphCompanyController extends WorkorderMphBaseController
$searchColumns = "str.name|hn.hausnummer|hn.stiege|plz.plz|ort.name|w.additionalInfo";
$whereClauses .= Helper::generateFilterCondition($filters['hausnummerInfo'], $searchColumns);
}
if (!empty($filters['netzgebietName'])) $whereClauses .= Helper::generateFilterCondition($filters['netzgebietName'], 'ng.id');
if (!empty($filters['rimoFcpName'])) $whereClauses .= Helper::generateFilterCondition($filters['rimoFcpName'], 'hn.rimo_fcp_name');
if (!empty($filters['deadlineDate'])) $whereClauses .= Helper::generateFilterCondition($filters['deadlineDate'], 'w.deadlineDate');
if (!empty($filters['appointmentDate'])) $whereClauses .= Helper::generateFilterCondition($filters['appointmentDate'], 'w.appointmentDate');
if (!empty($filters['additionalInfo'])) $whereClauses .= Helper::generateFilterCondition($filters['additionalInfo'], 'w.additionalInfo');
@@ -63,18 +82,21 @@ class WorkorderMphCompanyController extends WorkorderMphBaseController
w.id, w.status, w.deadlineDate, w.appointmentDate, w.additionalInfo,
CONCAT_WS(' ', str.name, hn.hausnummer, hn.stiege) as hausnummerInfo,
str.name as street, hn.hausnummer, hn.stiege, plz.plz, ort.name as city,
ng.id as netzgebietName,
hn.rimo_fcp_name as rimoFcpName,
(SELECT COUNT(*) FROM `$addressDbName`.`Wohneinheit` we WHERE we.hausnummer_id = hn.id) as wohneinheitCount
FROM `$fronkDbName`.`WorkorderMph` w
LEFT JOIN `$addressDbName`.`Hausnummer` hn ON w.hausnummerId = 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`.`Netzgebiet` ng ON hn.netzgebiet_id = ng.id
$whereClauses
";
$orderBy = "";
if (!empty($order['key'])) {
$sortableColumns = ['id', 'status', 'deadlineDate', 'additionalInfo', 'appointmentDate'];
$sortableColumns = ['id', 'status', 'deadlineDate', 'appointmentDate'];
if (in_array($order['key'], $sortableColumns)) {
$sortOrder = (strtoupper($order['order']) === 'DESC') ? 'DESC' : 'ASC';
$orderBy = " ORDER BY " . $db->escape($order['key']) . " " . $sortOrder;
@@ -90,8 +112,9 @@ class WorkorderMphCompanyController extends WorkorderMphBaseController
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`.`Netzgebiet` ng ON hn.netzgebiet_id = ng.id
$whereClauses";
$totalCount = $db->query($countSql)->fetch_assoc()['count'];
$totalCount = (int)$db->query($countSql)->fetch_assoc()['count'];
// Add pagination
if ($pagination['per_page'] !== null) {
@@ -104,10 +127,10 @@ class WorkorderMphCompanyController extends WorkorderMphBaseController
self::returnJson([
'rows' => $rows,
'pagination' => [
'page' => $pagination['page'],
'per_page' => $pagination['per_page'],
'page' => (int)$pagination['page'],
'per_page' => (int)$pagination['per_page'],
'total_rows' => $totalCount,
'total_pages' => ceil($totalCount / $pagination['per_page']),
'total_pages' => (int)ceil($totalCount / $pagination['per_page']),
'filtered_available' => $totalCount
]
]);
@@ -190,14 +213,6 @@ class WorkorderMphCompanyController extends WorkorderMphBaseController
$workorder = WorkorderMphModel::get($this->postData['workorderId']);
if (!$workorder) self::sendError("Arbeitsauftrag nicht gefunden.");
// Validate that all required Wohneinheiten have notes
$wohneinheiten = WorkorderMphWohneinheitModel::getAll(['workorderMphId' => $workorder->id]);
foreach ($wohneinheiten as $we) {
if (empty($we->note)) {
self::sendError("Bitte fügen Sie für jede Wohneinheit eine Notiz hinzu, bevor Sie den Auftrag abschließen.");
}
}
$oldStatus = $workorder->status;
$workorder->status = 'documented';
WorkorderMphModel::update((array)$workorder);
@@ -253,4 +268,34 @@ class WorkorderMphCompanyController extends WorkorderMphBaseController
WorkorderMphDocumentationModel::delete($doc->id);
self::returnJson(['success' => true, 'message' => 'Dokumentation gelöscht.']);
}
protected function updateAdditionalInfoAction()
{
if (empty($this->postData['workorderMphId'])) self::sendError("Arbeitsauftrags-ID fehlt.");
$workorder = WorkorderMphModel::get($this->postData['workorderMphId']);
if (!$workorder) self::sendError("Arbeitsauftrag nicht gefunden.");
// Verify company access
$company = WorkorderCompanyModel::getFirst(['addressId' => $this->user->address_id]);
if (!$company || $workorder->companyId != $company->id) {
self::sendError("Keine Berechtigung für diesen Arbeitsauftrag.");
}
$oldInfo = $workorder->additionalInfo;
$newInfo = $this->postData['additionalInfo'] ?? '';
$workorder->additionalInfo = $newInfo;
WorkorderMphModel::update((array)$workorder);
if ($oldInfo !== $newInfo) {
WorkorderMphJournalModel::create([
'workorderMphId' => $workorder->id,
'text' => "Notiz geändert: " . ($newInfo ?: '(leer)'),
'create' => time(),
'createBy' => $this->user->id,
]);
}
self::returnJson(['success' => true, 'message' => 'Notiz aktualisiert.', 'newInfo' => $newInfo]);
}
}