diff --git a/application/RMLWorkorder/RMLWorkorderModel.php b/application/RMLWorkorder/RMLWorkorderModel.php index 920ca5fa2..88a422d3f 100644 --- a/application/RMLWorkorder/RMLWorkorderModel.php +++ b/application/RMLWorkorder/RMLWorkorderModel.php @@ -93,12 +93,14 @@ class RMLWorkorderModel extends TTCrudBaseModel { $sql = " SELECT w.id, w.status, w.deadlineDate, w.companyId, p.preordercampaign_id, hn.rimo_fcp_name, + n.owner_id as tenantId, 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`.`Network` n ON pc.network_id = n.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 @@ -135,6 +137,8 @@ class RMLWorkorderModel extends TTCrudBaseModel { SELECT COUNT(w.id) as count 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`.`Network` n ON pc.network_id = n.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 @@ -153,7 +157,7 @@ class RMLWorkorderModel extends TTCrudBaseModel { private static function buildCompanyWhereClause(array $filters, int $companyId): string { - $sql = "c.addressId = " . $companyId; + $sql = "w.companyId = " . $companyId; if (!empty($filters['id'])) { $sql .= Helper::generateFilterCondition($filters['id'], 'w.id', true); @@ -171,9 +175,9 @@ class RMLWorkorderModel extends TTCrudBaseModel { $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); - } + $searchColumns = "hn.rimo_fcp_name"; + $sql .= Helper::generateFilterCondition($filters['rimo_fcp_name'], $searchColumns); + } return "WHERE " . $sql; } @@ -192,7 +196,6 @@ class RMLWorkorderModel extends TTCrudBaseModel { 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 @@ -229,7 +232,6 @@ class RMLWorkorderModel extends TTCrudBaseModel { 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 diff --git a/application/RMLWorkorderAdmin/RMLWorkorderAdminController.php b/application/RMLWorkorderAdmin/RMLWorkorderAdminController.php index 213dba79f..1864fcb96 100644 --- a/application/RMLWorkorderAdmin/RMLWorkorderAdminController.php +++ b/application/RMLWorkorderAdmin/RMLWorkorderAdminController.php @@ -8,7 +8,7 @@ class RMLWorkorderAdminController extends TTCrud protected array $permissionCheck = ['RMLAdmin']; protected array $columns = [ -// ['key' => 'id', 'text' => 'Auftrag-Nr.', 'table' => ['sortable' => true]], + ['key' => 'id', 'text' => 'Auftrag-Nr.', 'table' => ['sortable' => false]], ['key' => 'preordercampaign_id', 'text' => 'Cluster', 'modal' => false, 'table' => ['filter' => 'select']], ['key' => 'preorderInfo', 'text' => 'Kunde / Projekt', 'modal' => false, 'table' => ['sortable' => false]], ['key' => 'rimo_fcp_name', 'text' => 'FCP', 'modal' => false, 'table' => ['sortable' => false]], @@ -23,7 +23,7 @@ class RMLWorkorderAdminController extends TTCrud ['value' => 'documented', 'text' => 'Dokumentiert', 'icon' => 'fas fa-file-alt text-success'], ['value' => 'completed', 'text' => 'Abgeschlossen', 'icon' => 'fas fa-check-double text-secondary'], ]]], - ['key' => 'deadlineDate', 'text' => 'Deadline', 'modal' => false, 'table' => ['filter' => 'date']], + ['key' => 'deadlineDate', 'text' => 'Deadline', 'modal' => false, 'table' => ['filter' => 'date', 'sortable' => false]], ]; private function getStatusText(string $statusKey): string { @@ -105,18 +105,32 @@ class RMLWorkorderAdminController extends TTCrud } private function createWorkordersFromPreorders() { - $newPreorders = PreorderModel::searchActive(['status_code' => 220, 'preorder_status_flags_all' => [3,5]]); - if (empty($newPreorders)) return; + $configs = RMLWorkorderTenantConfigModel::getAll(); + foreach ($configs as $config) { + $filters = json_decode($config->workorderCreationFilters, true); + if (empty($filters)) continue; - foreach ($newPreorders as $preorder) { - if (!RMLWorkorderModel::getFirst(['preorderId' => $preorder->id])) { - RMLWorkorderModel::create([ - 'preorderId' => $preorder->id, - 'clusterId' => $preorder->preordercampaign_id, - 'status' => 'new', - 'create' => time(), - 'createBy' => $this->user->id - ]); + $networks = NetworkModel::getAll(['owner_id' => $config->addressId]); + if(empty($networks)) continue; + + $tenantCampaigns = array_map(fn($n) => $n->id, PreordercampaignModel::getAll(['network_id' => array_map(fn($n) => $n->id, $networks)])); + if(empty($tenantCampaigns)) continue; + + $filters['preordercampaign_id'] = $tenantCampaigns; + + $newPreorders = PreorderModel::searchActive($filters); + if (empty($newPreorders)) continue; + + foreach ($newPreorders as $preorder) { + if (!RMLWorkorderModel::getFirst(['preorderId' => $preorder->id])) { + RMLWorkorderModel::create([ + 'preorderId' => $preorder->id, + 'clusterId' => $preorder->preordercampaign_id, + 'status' => 'new', + 'create' => time(), + 'createBy' => 0 // System User + ]); + } } } } @@ -262,9 +276,22 @@ class RMLWorkorderAdminController extends TTCrud } protected function getCompaniesAction() { + $tenantId = $this->request->tenantId ?? null; $companies = RMLWorkorderCompanyModel::getAll([], null, 0, ['key' => 'name', 'order' => 'ASC']); + + if ($tenantId) { + $companies = array_filter($companies, function($company) use ($tenantId) { + // RML Infrastruktur GmbH is always available as a fallback/default + if ($company->addressId == 4807 && empty($company->visibleForAddressId)) { + return true; + } + $visibleFor = !empty($company->visibleForAddressId) ? json_decode($company->visibleForAddressId, true) : []; + return in_array($tenantId, $visibleFor); + }); + } + $items = array_map(fn($c) => ['value' => $c->id, 'text' => $c->name], $companies); - self::returnJson($items); + self::returnJson(array_values($items)); // re-index } protected function addJournalAction() { @@ -329,7 +356,7 @@ class RMLWorkorderAdminController extends TTCrud $preorder = new Preorder($workorder->preorderId); if ($preorder) { - $preorder->status_id = 15; // Assuming 11 is the status for "fiber in building" + $preorder->status_id = 15; // Assuming 15 is the status for "completed" $preorder->edit_by = $this->user->id; $preorder->save(); } diff --git a/application/RMLWorkorderCompany/RMLWorkorderCompanyController.php b/application/RMLWorkorderCompany/RMLWorkorderCompanyController.php index c5b4fd51f..fde96e200 100644 --- a/application/RMLWorkorderCompany/RMLWorkorderCompanyController.php +++ b/application/RMLWorkorderCompany/RMLWorkorderCompanyController.php @@ -71,11 +71,12 @@ class RMLWorkorderCompanyController extends TTCrud $filters = $json['filters'] ?? []; $order = $json['order'] ?? ['key' => 'deadlineDate', 'order' => 'ASC']; - $companyId = $this->user->address_id; - if ($companyId === 0) { + $company = RMLWorkorderCompanyModel::getFirst(['addressId' => $this->user->address_id]); + if (!$company) { self::returnJson(['rows' => [], 'pagination' => array_merge($pagination, ['total_rows' => 0, 'total_pages' => 0, 'filtered_available' => 0])]); return; } + $companyId = $company->id; $workorders = RMLWorkorderModel::getCompanyWorkorders($filters, $pagination['per_page'], ($pagination['page'] - 1) * $pagination['per_page'], $order, $companyId); $totalCount = RMLWorkorderModel::countCompanyWorkorders($filters, $companyId); @@ -265,7 +266,7 @@ class RMLWorkorderCompanyController extends TTCrud } $workorder = RMLWorkorderModel::get($workorderId); - if ($workorder->status === 'correction_requested') { + if ($workorder->status === 'correction_requested' || $workorder->status === 'problem_solved') { $workorder->status = 'assigned'; RMLWorkorderModel::update((array)$workorder); $workorder = RMLWorkorderModel::get($workorderId); @@ -420,4 +421,34 @@ class RMLWorkorderCompanyController extends TTCrud 'journals' => $journals ]); } + + protected function getTenantConfigAction() { + if(empty($this->request->workorderId)) self::sendError("Workorder ID missing."); + + $workorder = RMLWorkorderModel::get($this->request->workorderId); + if (!$workorder) self::sendError("Workorder not found."); + + $preorder = new Preorder($workorder->preorderId); + if (!$preorder->id) self::sendError("Preorder not found."); + + $campaign = new Preordercampaign($preorder->preordercampaign_id); + if (!$campaign->id) self::sendError("Campaign not found."); + + $network = NetworkModel::getOne($campaign->network_id); + if (!$network) self::sendError("Network not found."); + + $tenantId = $network->owner_id; + + $tenantConfig = RMLWorkorderTenantConfigModel::getFirst(['addressId' => $tenantId]); + if (!$tenantConfig) { + $tenantConfig = RMLWorkorderTenantConfigModel::getFirst(['addressId' => 4807]); // RML Default + } + + if (!$tenantConfig) { + self::returnJson(['success' => false, 'message' => 'No tenant config found.']); + return; + } + + self::returnJson(['success' => true, 'documentationTypes' => json_decode($tenantConfig->documentationTypes, true)]); + } } \ No newline at end of file diff --git a/application/RMLWorkorderCompany/RMLWorkorderCompanyModel.php b/application/RMLWorkorderCompany/RMLWorkorderCompanyModel.php index a608e38c8..318d44d77 100644 --- a/application/RMLWorkorderCompany/RMLWorkorderCompanyModel.php +++ b/application/RMLWorkorderCompany/RMLWorkorderCompanyModel.php @@ -5,6 +5,7 @@ class RMLWorkorderCompanyModel extends TTCrudBaseModel { public int $id; public int $addressId; public string $name; + public ?string $visibleForAddressId; public int $create; public int $createBy; } \ No newline at end of file diff --git a/application/RMLWorkorderTenantConfig/RMLWorkorderTenantConfigModel.php b/application/RMLWorkorderTenantConfig/RMLWorkorderTenantConfigModel.php new file mode 100644 index 000000000..56a7458d1 --- /dev/null +++ b/application/RMLWorkorderTenantConfig/RMLWorkorderTenantConfigModel.php @@ -0,0 +1,12 @@ +getEnvironment() == "thetool") { + $companyTable = $this->table('RMLWorkorderCompany'); + if (!$companyTable->hasColumn('visibleForAddressId')) { + $companyTable->addColumn('visibleForAddressId', 'text', ['null' => true, 'default' => null, 'after' => 'name']) + ->save(); + } + + if (!$this->hasTable('RMLWorkorderTenantConfig')) { + $tenantConfigTable = $this->table('RMLWorkorderTenantConfig', ['id' => false, 'primary_key' => ['id']]); + $tenantConfigTable->addColumn('id', 'integer', ['identity' => true, 'signed' => false]) + ->addColumn('addressId', 'integer') + ->addColumn('name', 'string', ['limit' => 255]) + ->addColumn('documentationTypes', 'json') + ->addColumn('workorderCreationFilters', 'json') + ->addColumn('create', 'integer') + ->addColumn('createBy', 'integer') + ->addIndex(['addressId'], ['name' => 'addressId_idx']) + ->create(); + } + + $this->table('RMLWorkorderTenantConfig')->insert([ + [ + 'id' => 1, + 'addressId' => 4807, + 'name' => 'RML Standard', + 'documentationTypes' => '[{\"value\": \"photo_hup_mounted\", \"text\": \"Foto vom montierten HÜP\"}, {\"value\": \"photo_hup_open\", \"text\": \"Foto von dem offenen HÜP\"}, {\"value\": \"photo_splice_cassette_hup\", \"text\": \"Foto der Spleißkassette – HÜP\"}, {\"value\": \"photo_splice_cassette_fcp\", \"text\": \"Foto der Spleißkassette - FCP\"}, {\"value\": \"photo_hup_closed_stickers\", \"text\": \"Foto vom geschlossenen HÜP mit allen Aufklebern\"}, {\"value\": \"photo_fcp_labeled\", \"text\": \"Foto vom FCP beschriftet\"}, {\"value\": \"photo_patch_position_osp\", \"text\": \"Foto der Patch-Position - OSP-Seite\"}, {\"value\": \"photo_patch_position_anb\", \"text\": \"Foto der Patch-Position - ANB-Seite\"}, {\"value\": \"measurement_protocol_otdr\", \"text\": \"ODTR – Messung (1310nm & 1550nm)\"}]', + 'workorderCreationFilters' => '{\"status_code\": 220, \"preorder_status_flags_all\": [3, 5]}', + 'create' => 1724704509, + 'createBy' => 1 + ] + ])->save(); + + $this->execute("UPDATE RMLWorkorderCompany SET visibleForAddressId = '[4807]' WHERE visibleForAddressId IS NULL;"); + } + } + + public function down(): void + { + if ($this->getEnvironment() == "thetool") { + if ($this->hasTable('RMLWorkorderTenantConfig')) { + $this->table('RMLWorkorderTenantConfig')->drop()->save(); + } + + $companyTable = $this->table('RMLWorkorderCompany'); + if ($companyTable->hasColumn('visibleForAddressId')) { + $companyTable->removeColumn('visibleForAddressId') + ->save(); + } + } + } +} diff --git a/lib/Helper/Helper.php b/lib/Helper/Helper.php index faecfb081..e81644fc7 100644 --- a/lib/Helper/Helper.php +++ b/lib/Helper/Helper.php @@ -205,7 +205,7 @@ class Helper { if ($user->isAdmin()) $campaigns = PreordercampaignModel::getAll(); else { $networkIDs = array_unique(array_merge( - array_column($user->myNetworks(["netowner", "salespartner"]), 'id'), + array_column($user->myNetworks(["netowner"]), 'id'), json_decode($user->getFlag("preorder_networks")->value() ?: '[]') )); $campaigns = PreordercampaignModel::search(['network_id' => $networkIDs]); diff --git a/public/js/pages/RMLWorkorderAdmin/RMLWorkorderAdmin.js b/public/js/pages/RMLWorkorderAdmin/RMLWorkorderAdmin.js index b71fdff34..7dab9feda 100644 --- a/public/js/pages/RMLWorkorderAdmin/RMLWorkorderAdmin.js +++ b/public/js/pages/RMLWorkorderAdmin/RMLWorkorderAdmin.js @@ -7,7 +7,7 @@ Vue.component('r-m-l-workorder-admin', {
Prüfen Sie, ob alle erforderlichen Dokumente vorhanden und korrekt sind.
-