Merge branch 'fronkdev' into 'master'

Added preorderTrigger / added cif api docs

See merge request fronk/thetool!268
This commit is contained in:
Frank Schubert
2024-02-26 22:14:32 +00:00
7 changed files with 425 additions and 186 deletions

View File

@@ -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("<?=self::getUrl("Preorder", "Api")?>", {
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("<?=self::getUrl("Preorder","Api")?>",
{
'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("<?=self::getUrl("Preorder","Api")?>",
{
'do': "deleteWorkorder",
id: pid,
},
function(success) {
if(success.status == "OK") {
$("#preorder-detail-" + success.result.id + "-workorder td").each(function() {
$(this).html("<em class='text-monospace'>--gelöscht--</em>");
});
$("#preorder-detail-" + success.result.id + "-workorder-del").remove();
}
},
'json');
return false;
}
</script>
<?php include(realpath(dirname(__FILE__)."/../../$mfLayoutPackage")."/footer.php"); ?>

View File

@@ -113,10 +113,10 @@
<table class="table table-sm table-striped">
<tr>
<th>CIF Token:</th>
<td class="text-monospace"><?=$preorder->ciftoken?></td>
<td class="text-monospace" id="preorder-detail-ciftoken-<?=$preorder->id?>"><?=$preorder->ciftoken?></td>
</tr><tr>
<th>CIF Kabelnachbestell-Url:</th>
<td class="text-monospace"><?=$preorder->cifcableurl?></td>
<td class="text-monospace" id="preorder-detail-cifcableurl-<?=$preorder->id?>"><?=$preorder->cifcableurl?></td>
</tr><tr>
<th>Starterpaket versandt:</th>
<td class="text-monospace"><?=($preorder->logistics && $preorder->logistics->sent) ? '<i class="fas fa-fw fa-check text-success"></i> '.date("d.m.Y H:i", $preorder->logistics->sent) : '<i class="fas fa-fw fa-xmark text-danger"></i>'?></td>
@@ -466,187 +466,3 @@
</div>
<script type="text/javascript">
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("<?=self::getUrl("Preorder", "Api")?>", {
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("<?=self::getUrl("Preorder","Api")?>",
{
'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("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("<?=self::getUrl("Preorder","Api")?>",
{
'do': "deleteWorkorder",
id: pid,
},
function(success) {
if(success.status == "OK") {
$("#preorder-detail-" + success.result.id + "-workorder td").each(function() {
$(this).html("<em class='text-monospace'>--gelöscht--</em>");
});
$("#preorder-detail-" + success.result.id + "-workorder-del").remove();
}
},
'json');
return false;
}
</script>

View File

@@ -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;

View File

@@ -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;

View File

@@ -0,0 +1,46 @@
<?php
class Preorder_Statustrigger_145 {
private $log;
private $preorder;
private $new_status;
public function __construct(Preorder $preorder, Preorderstatus $new_status) {
$this->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;
}
}

View File

@@ -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();

View File

@@ -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