Files
thetool/scripts/workorder-mph-create-from-hausnummer.php
2026-01-27 11:26:23 +01:00

110 lines
4.1 KiB
PHP

#!/usr/bin/php
<?php
require("../config/config.php");
define('FRONKDB_SQLDEBUG',false);
error_reporting(E_ALL & ~(E_NOTICE | E_STRICT | E_DEPRECATED));
require_once(LIBDIR."/mvcfronk/mfRouter/mfRouter.php");
require_once(LIBDIR."/mvcfronk/mfBase/mfBaseModel.php");
require_once(LIBDIR."/mvcfronk/mfBase/mfBaseController.php");
$me = new User(1);
echo "[" . date('Y-m-d H:i:s') . "] Starting WorkorderMph creation from Hausnummer\n";
$db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
// Build netzgebiet filter
$netzgebietIds = defined('TT_WORKORDER_MPH_NETZGEBIET_IDS') ? TT_WORKORDER_MPH_NETZGEBIET_IDS : [];
$netzgebietFilter = '';
if (!empty($netzgebietIds)) {
$escapedIds = array_map(fn($id) => $db->escape($id), $netzgebietIds);
$netzgebietFilter = " AND hn.netzgebiet_id IN (" . implode(',', $escapedIds) . ")";
}
// Find Hausnummer with >2 Wohneinheiten and state not in grossplaning/not2connect
$sql = "
SELECT hn.id, hn.netzgebiet_id, COUNT(we.id) as we_count
FROM Hausnummer hn
LEFT JOIN Wohneinheit we ON hn.id = we.hausnummer_id
WHERE COALESCE(hn.rimo_ex_state, '') NOT IN ('grossplaning', 'not2connect')
AND COALESCE(hn.rimo_op_state, '') NOT IN ('grossplaning', 'not2connect')
$netzgebietFilter
GROUP BY hn.id
HAVING we_count > 2
";
$result = $db->query($sql);
$hausnummern = $result ? $result->fetch_all(MYSQLI_ASSOC) : [];
echo "[" . date('Y-m-d H:i:s') . "] Found " . count($hausnummern) . " Hausnummern with >2 Wohneinheiten\n";
// Get valid hausnummer IDs
$validHausnummerIds = array_column($hausnummern, 'id');
$createdCount = 0;
$reactivatedCount = 0;
foreach ($hausnummern as $hn) {
// Check if WorkorderMph already exists
$existing = WorkorderMphModel::getFirst(['hausnummerId' => $hn['id']]);
if (!$existing) {
// Create new WorkorderMph
WorkorderMphModel::create([
'hausnummerId' => $hn['id'],
'status' => 'new',
'create' => time(),
'createBy' => 1 // System user
]);
$createdCount++;
echo "[" . date('Y-m-d H:i:s') . "] Created new WorkorderMph for Hausnummer ID {$hn['id']}\n";
} elseif ($existing->status === 'archived') {
// Reactivate archived workorder
$existing->status = 'new';
$existing->companyId = null;
$existing->deadlineDate = null;
$existing->appointmentDate = null;
WorkorderMphModel::update((array)$existing);
WorkorderMphJournalModel::create([
'workorderMphId' => $existing->id,
'text' => 'Arbeitsauftrag wurde automatisch reaktiviert.',
'statusChange' => 'archiviert -> neu',
'create' => time(),
'createBy' => 1,
]);
$reactivatedCount++;
echo "[" . date('Y-m-d H:i:s') . "] Reactivated WorkorderMph #{$existing->id} for Hausnummer ID {$hn['id']}\n";
}
}
echo "[" . date('Y-m-d H:i:s') . "] Created: $createdCount, Reactivated: $reactivatedCount\n";
// Archive workorders for Hausnummer that are no longer in allowed netzgebiete or don't meet criteria
if (!empty($netzgebietIds)) {
$allWorkorders = WorkorderMphModel::getAll(['status' => ['new', 'assigned', 'scheduled', 'in_progress']]);
$archivedCount = 0;
foreach ($allWorkorders as $workorder) {
if (!in_array($workorder->hausnummerId, $validHausnummerIds)) {
$workorder->status = 'archived';
WorkorderMphModel::update((array)$workorder);
WorkorderMphJournalModel::create([
'workorderMphId' => $workorder->id,
'text' => 'Arbeitsauftrag automatisch archiviert (Netzgebiet deaktiviert oder Kriterien nicht mehr erfüllt).',
'statusChange' => 'active -> archived',
'create' => time(),
'createBy' => 1,
]);
$archivedCount++;
echo "[" . date('Y-m-d H:i:s') . "] Archived WorkorderMph #{$workorder->id}\n";
}
}
echo "[" . date('Y-m-d H:i:s') . "] Archived: $archivedCount\n";
}
echo "[" . date('Y-m-d H:i:s') . "] WorkorderMph creation/update completed successfully\n";