diff --git a/Layout/default/Preorder/Index.php b/Layout/default/Preorder/Index.php index 7c880862e..f9ffa4d52 100644 --- a/Layout/default/Preorder/Index.php +++ b/Layout/default/Preorder/Index.php @@ -705,5 +705,195 @@ setTimeout((id) => {maps["map-" + id].invalidateSize()}, 50, id); } } + + + // detail + function togglePortdata(pid) { + $("#preorder-detail-" + pid + "-patchposition-data-form input[name='patch_cluster']").val($("#preorder-detail-" + pid + "-patchposition-data-form input[name='patch_cluster']").data("default")); + $("#preorder-detail-" + pid + "-patchposition-data-form input[name='patch_shelf']").val($("#preorder-detail-" + pid + "-patchposition-data-form input[name='patch_shelf']").data("default")); + $("#preorder-detail-" + pid + "-patchposition-data-form input[name='patch_module']").val($("#preorder-detail-" + pid + "-patchposition-data-form input[name='patch_module']").data("default")); + + $("#preorder-detail-" + pid + "-patchposition-port-form input[name='patch_port']").val($("#preorder-detail-" + pid + "-patchposition-port-form input[name='patch_port']").data("default")); + + + $("#preorder-detail-" + pid + "-patchposition-data-form").toggle(); + $("#preorder-detail-" + pid + "-patchposition-string").toggle(); + + $("#preorder-detail-" + pid + "-patchposition-port-form").toggle(); + $("#preorder-detail-" + pid + "-patchposition-port").toggle(); + + $("#preorder-detail-" + pid + "-patchposition-edit").toggle(); + $("#preorder-detail-" + pid + "-patchposition-controls").toggle(); + + } + + function savePortdata(pid) { + if(!pid) return; + + var cluster = $("#preorder-detail-" + pid + "-patchposition-data-form input[name='patch_cluster']").val(); + var shelf = $("#preorder-detail-" + pid + "-patchposition-data-form input[name='patch_shelf']").val(); + var module = $("#preorder-detail-" + pid + "-patchposition-data-form input[name='patch_module']").val(); + var port = $("#preorder-detail-" + pid + "-patchposition-port-form input[name='patch_port']").val(); + + $.post("", { + do: "savePatchposition", + id: pid, + cluster: cluster, + shelf: shelf, + module: module, + port: port + }, + (success) => { + if(success.status == "OK") { + var pid = success.result.id; + var default_cluster = $("#preorder-detail-" + pid + "-patchposition-data-form input[name='patch_cluster']").data("default"); + var cluster = $("#preorder-detail-" + pid + "-patchposition-data-form input[name='patch_cluster']").val(); + var shelf = $("#preorder-detail-" + pid + "-patchposition-data-form input[name='patch_shelf']").val(); + var module = $("#preorder-detail-" + pid + "-patchposition-data-form input[name='patch_module']").val(); + var port = $("#preorder-detail-" + pid + "-patchposition-port-form input[name='patch_port']").val(); + + if(!cluster) cluster = default_cluster; + + $("#preorder-detail-" + pid + "-patchposition-data-form input[name='patch_cluster']").data("default", cluster); + $("#preorder-detail-" + pid + "-patchposition-data-form input[name='patch_shelf']").data("default", shelf); + $("#preorder-detail-" + pid + "-patchposition-data-form input[name='patch_module']").data("default", module); + $("#preorder-detail-" + pid + "-patchposition-port-form input[name='patch_port']").data("default", port); + $("#preorder-detail-" + pid + "-patchposition-string").text(cluster + "-" + shelf + "-" + module); + $("#preorder-detail-" + pid + "-patchposition-port").text(port); + togglePortdata(pid); + + } + }, + "json" + ); + } + + function toggleStatusControl(pid, sid) { + // set select to current status id + $("#preorder-detail-status-" + pid + "-input select").val($("#preorder-detail-status-" + pid + "-text").data("status-id")); + + // toggle controls + $("#preorder-detail-status-" + pid + "-text").toggle(); + $("#preorder-detail-status-" + pid + "-input").toggle(); + + return false; + } + + function savePreorderStatusControl(pid) { + if(!Number.isInteger(pid) || pid < 1) { + return false; + } + + var value = $("#preorder-detail-status-" + pid + "-input select").val(); + + //console.log("add opacity-5 to ") + $("#preorder-" + pid + "-body").addClass("opacity-5"); + $("#preorder-" + pid + "-body .loader-big").show(); + + // reset loading overlay if request times out + setTimeout(() => { + $("#preorder-" + pid + "-body").removeClass("opacity-5"); + $("#preorder-" + pid + "-body .loader-big").hide(); + }, 5000); + + $.post("", + { + 'do': "updateStatus", + id: pid, + status_id: value + }, + function(success) { + if(success.status == "OK") { + var updates = success.result.updates; + //console.log(updates); + + updates.forEach(function(u) { + //console.log(u); + // update detail status text + $("#preorder-detail-status-" + u.id + "-statustext").text(u.code + " - " + u.text); + $("#preorder-detail-status-" + u.id + "-text").addClass("text-success"); + setTimeout(() => { $("#preorder-detail-status-" + u.id + "-text").removeClass("text-success") }, 1500); + + // update list status text + $("#preorder-" + u.id + " .status").text(u.code + " - " + u.text); + $("#preorder-" + u.id + " .status").addClass("text-success"); + setTimeout(() => { $("#preorder-" + u.id + " .status").removeClass("text-success") }, 1500); + + // update status id data attribute + $("#preorder-detail-status-" + u.id + "-text").data("status-id", u.sid); + + if(u.bcode) { + $("#preorder-detail-building-status-" + u.id).text(u.bcode + " - " + u.btext); + } + if(u.ucode) { + $("#preorder-detail-unit-status-" + u.id).text(u.ucode + " - " + u.utext); + } + + if(u.ciftoken) { + $("#preorder-detail-ciftoken-" + u.id).text(u.ciftoken); + } + if(u.cifcableurl) { + $("#preorder-detail-cifcableurl-" + u.id).text(u.cifcableurl); + } + }); + /* + if("preorder" in update) { + // update detail status text + $("#preorder-detail-status-" + pid + "-statustext").text(update.preorder.status.code + " - " + update.preorder.status.text); + $("#preorder-detail-status-" + pid + "-text").addClass("text-success"); + setTimeout(() => { $("#preorder-detail-status-" + pid + "-text").removeClass("text-success") }, 1500); + + // update list status text + $("#preorder-" + pid + " .status").text(update.preorder.status.code + " - " + update.preorder.status.text); + $("#preorder-" + pid + " .status").addClass("text-success"); + setTimeout(() => { $("#preorder-" + pid + " .status").removeClass("text-success") }, 1500); + + // update status id data attribute + $("#preorder-detail-status-" + pid + "-text").data("status-id", update.preorder.status.id); + } + + if("building" in update) { + // update building status text + $("#preorder-detail-building-status-" + pid).text(update.building.status.code + " - " + update.building.status.text); + } + if("unit" in update) { + // update unit status text + $("#preorder-detail-unit-status-" + pid).text(update.unit.status.code + " - " + update.unit.status.text); + } + */ + toggleStatusControl(pid); + + } + + $("#preorder-" + pid + "-body").removeClass("opacity-5"); + $("#preorder-" + pid + "-body .loader-big").hide(); + }, + 'json'); + } + + function deleteWorkorder(pid) { + console.log("in delete workorder"); + if(!Number.isInteger(pid) || pid < 1) { + return false; + } + + $.post("", + { + 'do': "deleteWorkorder", + id: pid, + }, + function(success) { + if(success.status == "OK") { + $("#preorder-detail-" + success.result.id + "-workorder td").each(function() { + $(this).html("--gelöscht--"); + }); + + $("#preorder-detail-" + success.result.id + "-workorder-del").remove(); + } + }, + 'json'); + + return false; + } diff --git a/Layout/default/Preorder/include/preorder-detail.php b/Layout/default/Preorder/include/preorder-detail.php index 753ce14af..2fe7eb666 100644 --- a/Layout/default/Preorder/include/preorder-detail.php +++ b/Layout/default/Preorder/include/preorder-detail.php @@ -113,10 +113,10 @@ - + - + @@ -466,187 +466,3 @@ - \ No newline at end of file diff --git a/application/Preorder/Preorder.php b/application/Preorder/Preorder.php index 56f4c7e9e..bac244e20 100644 --- a/application/Preorder/Preorder.php +++ b/application/Preorder/Preorder.php @@ -48,6 +48,8 @@ class Preorder extends mfBaseModel { $this->save(); } + // run triggers based on new status + $this->runStatusTrigger(); // Cascade status changes down to adb_hausnummer and adb_wohneinheit $this->cascadeStatus(); // Cascade status changes down all active preorders with the same hausnummer @@ -56,6 +58,59 @@ class Preorder extends mfBaseModel { $this->in_after_save--; } + public function runStatusTrigger() { + if(!$this->id) return true; + if($this->status_id == $this->_old_data->status_id) return true; + + $this->log->debug(__METHOD__." running"); + + $new_status = $this->getProperty("status"); + $old_status = new Preorderstatus($this->_old_data->status_id); + + if(!$new_status->id || !$old_status->id) return true; + $this->log->debug(__METHOD__." status changed from '".($old_status ? $old_status->code : "")."' to '".$new_status->code."'"); + + if($new_status->code <= $old_status->code) return true; + + if(!defined("TT_PREORDER_STATUS_MATRIX") || !TT_PREORDER_STATUS_MATRIX) { + $this->log->error("config TT_PREORDER_STATUS_MATRIX not defined!"); + } + + // run every trigger bnetween old and new status code + foreach(TT_PREORDER_STATUS_MATRIX as $intermediate_code => $status) { + if($intermediate_code <= $old_status->code) continue; + if($intermediate_code > $new_status->code) continue; + + $code = $intermediate_code; + // find trigger for new status code + $classname = "Preorder_Statustrigger_$code"; + $filepath = __DIR__."/statustrigger/$code.php"; + + $this->log->debug(__METHOD__.": Looking for $classname in $filepath"); + + if(!file_exists($filepath)) { + $this->log->debug(__METHOD__.": $filepath not found"); + continue; + } + + require_once $filepath; + + if(!class_exists($classname)) { + $this->log->debug(__METHOD__.": $classname not found"); + continue; + } + + $trigger = new $classname($this, $new_status); + $trigger->run(); + + } + + + + return true; + + } + /* * Cascade status changes down to adb_hausnummer and adb_wohneinheit */ @@ -400,6 +455,7 @@ class Preorder extends mfBaseModel { $hausnummer = $this->getProperty("adb_hausnummer"); $wohneinheit = $this->getProperty("adb_wohneinheit"); + $campaign = $this->getProperty("campaign"); $a = []; $a["ciftoken"] = $this->ciftoken; diff --git a/application/Preorder/PreorderController.php b/application/Preorder/PreorderController.php index 076cdab90..dba08c0bc 100644 --- a/application/Preorder/PreorderController.php +++ b/application/Preorder/PreorderController.php @@ -1016,6 +1016,9 @@ class PreorderController extends mfBaseController { "text" => $affected_preorder->status->name, "bcode" => $affected_preorder->adb_hausnummer->status->code, "btext" => $affected_preorder->adb_hausnummer->status->name, + "ciftoken" => $affected_preorder->ciftoken, + "cifurl" => $affected_preorder->cifurl, + "cifcableurl" => $affected_preorder->cifcableurl, ]; if($preorder->adb_wohneinheit_id) { $up["ucode"] = $affected_preorder->adb_wohneinheit->status->code; diff --git a/application/Preorder/statustrigger/145.php b/application/Preorder/statustrigger/145.php new file mode 100644 index 000000000..7930e1d54 --- /dev/null +++ b/application/Preorder/statustrigger/145.php @@ -0,0 +1,46 @@ +log = mfLoghandler::singleton(); + + $this->preorder = $preorder; + $this->new_status = $new_status; + } + + public function run() { + $this->log->debug(__METHOD__.": running trigger"); + + $changes = false; + + if(!$this->preorder->ciftoken) { + $this->preorder->ciftoken = $this->preorder->createCiftoken(); + $changes = true; + } + + /*if(!$this->preorder->ciftoken) { + $this->log->warning("Error creating ciftoken for preorder ".$this->preorder->id); + return true; + }*/ + if(!$this->preorder->cifurl) { + $this->preorder->cifurl = $this->preorder->generateCifUrl(); + $changes = true; + } + + if(!$this->preorder->cifcableurl) { + $this->preorder->cifcableurl = $this->preorder->generateCifCableUrl(); + $changes = true; + } + + if($changes) { + $this->preorder->save(); + } + + return true; + } +} \ No newline at end of file diff --git a/application/UserToken/UserToken.php b/application/UserToken/UserToken.php index 57866cbd8..4cd271839 100644 --- a/application/UserToken/UserToken.php +++ b/application/UserToken/UserToken.php @@ -6,6 +6,7 @@ class UserToken extends mfBaseController public static function checkToken() { if (isset($_COOKIE[MFAPPNAME . '_remembertoken'])) { + $refresh = false; $cookie = explode(':', $_COOKIE[MFAPPNAME . '_remembertoken']); if (count($cookie) === 2) { $db = new FronkDB(); diff --git a/public/docs/preorder-api.yaml b/public/docs/preorder-api.yaml index 69883fe49..5df8b0e6a 100644 --- a/public/docs/preorder-api.yaml +++ b/public/docs/preorder-api.yaml @@ -14,6 +14,8 @@ tags: description: Abfrage von GWR-Daten - name: preorder description: Abfragen und Operationen zu Vorbestellungen + - name: Customer Installation Feedback + description: Kundenfeedback Lehrrohrverlegung paths: /addressdb/getClusters: get: @@ -806,6 +808,62 @@ paths: description: Unauthorized '404': description: Vorbestellung nicht gefunden + /preorder/customerInstallationFeedback: + get: + tags: + - Customer Installation Feedback + summary: Anschluss-/Kundendaten zu ciftoken + description: Gibt Anschluss-/Kundendaten zum abgefragten CIF-Token zurück. Dient zum Validieren des Anschlusses durch den Kunden + operationId: getCifData + parameters: + - name: ciftoken + in: query + description: Client Installation Feedback Token + required: true + schema: + type: string + responses: + '200': + description: Successful operation + content: + application/json: + schema: + type: object + properties: + status: + type: string + description: Status string + example: OK + result: + $ref: '#/components/schemas/cifResponseData' + '400': + description: ciftoken missing + '401': + description: Unauthorized + '404': + description: Invalid ciftoken + post: + tags: + - Customer Installation Feedback + summary: Bestellung auf Status 200 - Rohr im Gebäude setzen + description: Setzt Status der Bestellung auf 200 - Rohr im Gebäude. Wird gesetzt wenn beim Kunden die Lehrrohrinstallation abgeschlossen ist. (CIF) + operationId: setCifData + parameters: + - name: ciftoken + in: query + description: Client Installation Feedback Token + required: true + schema: + type: string + responses: + '200': + description: Successful operation + '400': + description: ciftoken missing + '401': + description: Unauthorized + '404': + description: Invalid ciftoken components: schemas: timestampString: @@ -1595,6 +1653,75 @@ components: type: integer description: Zeitpunkt der letzten Bearbeitung der Bestellung in Sekunden seit der Unix Epoche example: 1675206000 + cifResponseData: + type: object + properties: + ciftoken: + code: + type: string + description: Eindeutiger Code der Vorbestellung + example: A1B2C3D4 + oaid: + type: string + description: Open Access ID der Wohneinheit + example: AT-9999-abcdef01.001 + company: + type: string + description: Firmenname Kunde + example: + uid: + type: string + description: UID (wenn Firmenkunde) + example: + firstname: + type: string + description: Vorname Kunde + example: Vor + lastname: + type: string + description: Nachname Kunde + example: Nachname + street: + type: string + description: Straße Kunde + example: Beispielstraße + housenumber: + type: string + description: Hausnummer Kunde + example: 42 + zip: + type: string + description: PLZ Kunde + example: 9999 + city: + type: string + description: Gemeinde oder Ortschaft + example: Gemeinde/Ort + municipality: + type: string + description: Gemeinde + example: Gemeinde + district: + type: string + description: Ortschaft/Ortsteil + example: Ortschaft/Ortsteil + block: + type: string + description: Adresszusatz + example: null + stiege: + type: string + description: Adresszusatz + example: null + stock: + type: string + description: Adresszusatz + example: null + tuer: + type: string + description: Adresszusatz + example: null + securitySchemes: api_key_header: type: apiKey
CIF Token:ciftoken?>ciftoken?>
CIF Kabelnachbestell-Url:cifcableurl?>cifcableurl?>
Starterpaket versandt: logistics && $preorder->logistics->sent) ? ' '.date("d.m.Y H:i", $preorder->logistics->sent) : ''?>