diff --git a/application/RMLWorkorderAdmin/RMLWorkorderAdminController.php b/application/RMLWorkorderAdmin/RMLWorkorderAdminController.php index adf46352f..846aae84a 100644 --- a/application/RMLWorkorderAdmin/RMLWorkorderAdminController.php +++ b/application/RMLWorkorderAdmin/RMLWorkorderAdminController.php @@ -26,6 +26,25 @@ class RMLWorkorderAdminController extends TTCrud ['key' => 'deadlineDate', 'text' => 'Deadline', 'modal' => false, 'table' => ['filter' => 'date']], ]; + private function getStatusText(string $statusKey): string { + $statusColumn = null; + foreach ($this->columns as $column) { + if ($column['key'] === 'status') { + $statusColumn = $column; + break; + } + } + + if ($statusColumn) { + foreach ($statusColumn['table']['filterOptions'] as $option) { + if ($option['value'] === $statusKey) { + return $option['text']; + } + } + } + return ucfirst(str_replace('_', ' ', $statusKey)); // Fallback + } + protected function indexAction() { $campaigns = Helper::getPreorderCampaignFromUser($this->user, true); @@ -105,20 +124,52 @@ class RMLWorkorderAdminController extends TTCrud protected function getDocumentationAction() { if(empty($this->request->workorderId)) self::sendError("Workorder ID missing."); - $docs = RMLWorkorderDocumentationModel::getAll(['workorderId' => $this->request->workorderId], null, 0, ['key' => 'create', 'order' => 'DESC']); + $docs = RMLWorkorderDocumentationModel::getAll(['workorderId' => $this->request->workorderId], null, 0, ['key' => 'create', 'order' => 'ASC']); $journals = RMLWorkorderJournalModel::getAll(['workorderId' => $this->request->workorderId], null, 0, ['key' => 'create', 'order' => 'DESC']); - $users = UserModel::search(); + + $translationMap = [ + 'photo_hup_mounted' => 'Foto_montierter_HÜP', + 'photo_hup_open' => 'Foto_offener_HÜP', + 'photo_splice_cassette_hup' => 'Foto_Spleißkassette_HÜP', + 'photo_splice_cassette_fcp' => 'Foto_Spleißkassette_FCP', + 'photo_hup_closed_stickers' => 'Foto_geschlossener_HÜP_mit_Aufklebern', + 'photo_fcp_labeled' => 'Foto_FCP_beschriftet', + 'photo_patch_position_osp' => 'Foto_Patch-Position_OSP-Seite', + 'photo_patch_position_anb' => 'Foto_Patch-Position_ANB-Seite', + 'measurement_protocol_otdr' => 'ODTR_Messung', + 'other' => 'Sonstiges_Dokument' + ]; + + $responseDocs = []; + $typeCounts = []; foreach($docs as $doc) { $file = new File($doc->fileId); - $doc->fileName = $file->orig_filename ?? $file->filename; - $doc->userName = UserModel::getOne($doc->createBy)->name ?? 'Unbekannt'; - $doc->mimetype = $file->mimetype ?? 'application/octet-stream'; + $documentTypeKey = $doc->documentType; + + $typeCounts[$documentTypeKey] = ($typeCounts[$documentTypeKey] ?? 0) + 1; + + $originalFilename = $file->orig_filename ?? $file->filename; + $extension = pathinfo($originalFilename, PATHINFO_EXTENSION); + $translatedType = $translationMap[$documentTypeKey] ?? $documentTypeKey; + $newFilename = "{$translatedType}_{$typeCounts[$documentTypeKey]}." . strtolower($extension); + + $responseDocs[] = [ + 'id' => $doc->id, + 'fileId' => $doc->fileId, + 'fileName' => $newFilename, + 'description' => $doc->description, + 'documentType' => $documentTypeKey, + 'userName' => UserModel::getOne($doc->createBy)->name ?? 'Unbekannt', + 'mimetype' => $file->mimetype ?? 'application/octet-stream', + ]; } + foreach($journals as $journal) { $journal->createByName = UserModel::getOne($journal->createBy)->name ?? 'Unbekannt'; } - self::returnJson(['docs' => $docs, 'journals' => $journals]); + + self::returnJson(['docs' => $responseDocs, 'journals' => $journals]); } private function assignSingleWorkorder($workorderId, $companyId, $deadline, $userId) { @@ -200,9 +251,9 @@ class RMLWorkorderAdminController extends TTCrud RMLWorkorderJournalModel::create([ 'workorderId' => $workorder->id, - 'text' => $post['text'], + 'text' => "Korrektur angefordert. Grund: " . $post['text'], 'fileIds' => !empty($post['fileIds']) ? json_encode($post['fileIds']) : null, - 'statusChange' => "$oldStatus -> correction_requested", + 'statusChange' => $this->getStatusText($oldStatus) . " -> " . $this->getStatusText('correction_requested'), 'create' => time(), 'createBy' => $this->user->id, ]); @@ -283,7 +334,7 @@ class RMLWorkorderAdminController extends TTCrud RMLWorkorderJournalModel::create([ 'workorderId' => $workorder->id, 'text' => 'Dokumentation wurde akzeptiert und der Auftrag abgeschlossen.', - 'statusChange' => "$oldStatus -> completed", + 'statusChange' => $this->getStatusText($oldStatus) . " -> " . $this->getStatusText('completed'), 'create' => time(), 'createBy' => $this->user->id, ]); @@ -292,11 +343,6 @@ class RMLWorkorderAdminController extends TTCrud } protected function setToProblemSolvedAction() { -// const response = await axios.post(`${window.TT_CONFIG.BASE_PATH}/RMLWorkorderAdmin/setToProblemSolved`, { -// workorderId: row.id, -// text: text -// }); - $post = json_decode(file_get_contents('php://input'), true); if (empty($post['workorderId']) || empty($post['text'])) { @@ -317,13 +363,10 @@ class RMLWorkorderAdminController extends TTCrud $workorder->status = 'problem_solved'; RMLWorkorderModel::update((array)$workorder); - $oldStatusText = $oldStatus === 'intervention_required' ? 'Eingriff benötigt' : $oldStatus; - $problem_solved = 'Problem gelöst'; - RMLWorkorderJournalModel::create([ 'workorderId' => $workorder->id, - 'text' => $post['text'], - 'statusChange' => "$oldStatusText -> $problem_solved", + 'text' => "Problem behoben: " . $post['text'], + 'statusChange' => $this->getStatusText($oldStatus) . " -> " . $this->getStatusText('problem_solved'), 'create' => time(), 'createBy' => $this->user->id, ]); diff --git a/application/RMLWorkorderCompany/RMLWorkorderCompanyController.php b/application/RMLWorkorderCompany/RMLWorkorderCompanyController.php index 65435b536..c5b4fd51f 100644 --- a/application/RMLWorkorderCompany/RMLWorkorderCompanyController.php +++ b/application/RMLWorkorderCompany/RMLWorkorderCompanyController.php @@ -26,6 +26,25 @@ class RMLWorkorderCompanyController extends TTCrud protected array $additionalJSVariables = ['COMPANY_ID' => '0']; + private function getStatusText(string $statusKey): string { + $statusColumn = null; + foreach ($this->columns as $column) { + if ($column['key'] === 'status') { + $statusColumn = $column; + break; + } + } + + if ($statusColumn) { + foreach ($statusColumn['table']['filterOptions'] as $option) { + if ($option['value'] === $statusKey) { + return $option['text']; + } + } + } + return ucfirst(str_replace('_', ' ', $statusKey)); // Fallback + } + protected function prepareCrudConfig() { $company = RMLWorkorderCompanyModel::getFirst(['addressId' => $this->user->address_id]); if ($company) { @@ -197,7 +216,7 @@ class RMLWorkorderCompanyController extends TTCrud RMLWorkorderJournalModel::create([ 'workorderId' => $workorder->id, 'text' => "Eingriff benötigt: " . $post['journalText'], - 'statusChange' => "$oldStatus -> intervention_required", + 'statusChange' => $this->getStatusText($oldStatus) . " -> " . $this->getStatusText('intervention_required'), 'create' => time(), 'createBy' => $this->user->id, ]); @@ -205,7 +224,6 @@ class RMLWorkorderCompanyController extends TTCrud self::returnJson(['success' => true, 'message' => 'Eingriff wurde angefordert.']); } - protected function uploadDocumentationAction() { if (empty($_FILES['files']) || empty($_POST['workorderId'])) { @@ -271,20 +289,21 @@ class RMLWorkorderCompanyController extends TTCrud $translationMap = [ 'photo_hup_mounted' => 'Foto_montierter_HÜP', 'photo_hup_open' => 'Foto_offener_HÜP', - 'photo_splice_cassette' => 'Foto_Spleißkassette', + 'photo_splice_cassette_hup' => 'Foto_Spleißkassette_HÜP', + 'photo_splice_cassette_fcp' => 'Foto_Spleißkassette_FCP', 'photo_hup_closed_stickers' => 'Foto_geschlossener_HÜP_mit_Aufklebern', 'photo_fcp_labeled' => 'Foto_FCP_beschriftet', + 'photo_patch_position_osp' => 'Foto_Patch-Position_OSP-Seite', + 'photo_patch_position_anb' => 'Foto_Patch-Position_ANB-Seite', 'measurement_protocol_otdr' => 'ODTR_Messung', + 'other' => 'Sonstiges_Dokument' ]; foreach($docs as $doc) { $file = new File($doc->fileId); $documentTypeKey = $doc->documentType; - if (!isset($typeCounts[$documentTypeKey])) { - $typeCounts[$documentTypeKey] = 1; - } else { - $typeCounts[$documentTypeKey]++; - } + + $typeCounts[$documentTypeKey] = ($typeCounts[$documentTypeKey] ?? 0) + 1; $originalFilename = $file->orig_filename ?? $file->filename; $extension = pathinfo($originalFilename, PATHINFO_EXTENSION); @@ -295,6 +314,7 @@ class RMLWorkorderCompanyController extends TTCrud 'id' => $doc->id, 'fileId' => $doc->fileId, 'fileName' => $newFilename, + 'description' => $doc->description, 'documentType' => $documentTypeKey, 'mimetype' => $file->mimetype, ]; diff --git a/public/js/pages/RMLWorkorderAdmin/RMLWorkorderAdmin.css b/public/js/pages/RMLWorkorderAdmin/RMLWorkorderAdmin.css index 5a01d28bc..5726b74f1 100644 --- a/public/js/pages/RMLWorkorderAdmin/RMLWorkorderAdmin.css +++ b/public/js/pages/RMLWorkorderAdmin/RMLWorkorderAdmin.css @@ -1,33 +1,40 @@ /* - * CSS for Workorder Table Row Highlighting (Balanced Colors) + * CSS for Workorder Table Row Highlighting */ -/* 🔴 Urgent: Deadline passed or less than 1 week away */ +/* Urgent: Deadline passed or less than 1 week away */ .table-hover .tt-rml-workorder-urgent:hover, .tt-rml-workorder-urgent { - background-color: #f8d7da !important; /* Balanced Red */ + background-color: #fbe9e7 !important; /* Soft Red */ } -/* 🟠 High Priority: Deadline less than 2 weeks away */ -.table-hover .tt-rml-workorder-high:hover, -.tt-rml-workorder-high { - background-color: #ffd5a1 !important; /* Balanced Orange */ -} - -/* 🟡 Medium: Deadline less than 3 weeks away */ +/* Medium: Deadline less than 3 weeks away */ .table-hover .tt-rml-workorder-medium:hover, .tt-rml-workorder-medium { - background-color: #fff3cd !important; /* Balanced Yellow */ + background-color: #fff8e1 !important; /* Soft Yellow */ } -/* 🟢 On Track: Deadline more than 3 weeks away */ +/* On Track: Deadline more than 3 weeks away */ .table-hover .tt-rml-workorder-ontrack:hover, .tt-rml-workorder-ontrack { - background-color: #d4edda !important; /* Balanced Green */ + background-color: #e8f5e9 !important; /* Soft Green */ } -/* ⚫ Irrelevant: No deadline or status makes it not applicable */ +/* Irrelevant: No deadline or status makes it not applicable */ .table-hover .tt-rml-workorder-irrelevant:hover, .tt-rml-workorder-irrelevant { - background-color: #e9ecef !important; /* Balanced Grey */ -} \ No newline at end of file + background-color: #fafafa !important; /* Very light grey */ +} + +.table-hover .tt-rml-workorder-high:hover, +.tt-rml-workorder-high { + background-color: #f8d7da !important; /* A slightly more intense red for high priority issues */ +} + +.tt-file-gallery-item.border.border-danger { + border: 4px solid #f1556c!important; +} + +.RMLWorkorderCompany-table .modal-body { + overflow-y: hidden; +} diff --git a/public/js/pages/RMLWorkorderAdmin/RMLWorkorderAdmin.js b/public/js/pages/RMLWorkorderAdmin/RMLWorkorderAdmin.js index 90eb3b680..b71fdff34 100644 --- a/public/js/pages/RMLWorkorderAdmin/RMLWorkorderAdmin.js +++ b/public/js/pages/RMLWorkorderAdmin/RMLWorkorderAdmin.js @@ -55,7 +55,7 @@ Vue.component('r-m-l-workorder-admin', { additional-class="btn-link btn-sm p-0" title="Auftrag auf Problem behoben setzen" /> - +