Merge branch 'fronkdev' of code.fronk.at:fronk/thetool into fronkdev

This commit is contained in:
Frank Schubert
2025-03-28 13:43:31 +01:00
27 changed files with 2350 additions and 175 deletions
+19 -8
View File
@@ -22,18 +22,29 @@
<h3>RTR Reporting CSVs herunterladen</h3>
<div class="card">
<div class="card-body">
<div class="row col mb-3">
<a class="btn btn-primary" href="<?=self::getUrl("Admin", "rtrReporting", ["do" => "a10report"])?>"><i class="fas fa-fw fa-download"></i> A10</a>
</div>
<div class="row col mb-3">
<a class="btn btn-primary" href="<?=self::getUrl("Admin", "rtrReporting", ["do" => "b10report"])?>"><i class="fas fa-fw fa-download"></i> B10</a>
</div>
<div class="row col mb-3">
<a class="btn btn-primary" href="<?=self::getUrl("Admin", "rtrReporting", ["do" => "c10report"])?>"><i class="fas fa-fw fa-download"></i> C10</a>
<div class="row">
<div class="col-6">
<div class="row col mb-3">
<a class="btn btn-primary" href="<?=self::getUrl("Admin", "rtrReporting", ["do" => "a10report"])?>"><i class="fas fa-fw fa-download"></i> A10</a>
</div>
<div class="row col mb-3">
<a class="btn btn-primary" href="<?=self::getUrl("Admin", "rtrReporting", ["do" => "b10report"])?>"><i class="fas fa-fw fa-download"></i> B10</a>
</div>
<div class="row col mb-3">
<a class="btn btn-primary" href="<?=self::getUrl("Admin", "rtrReporting", ["do" => "c10report"])?>"><i class="fas fa-fw fa-download"></i> C10</a>
</div>
</div>
<div class="col-6">
<div class="row col mb-3">
<a class="btn btn-primary" href="<?=self::getUrl("Admin", "rtrReporting", ["do" => "activeVoiceNumbersReport"])?>"><i class="fas fa-fw fa-download"></i> Aktive Telefonnummern</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
+7 -3
View File
@@ -8,8 +8,12 @@
<li class="breadcrumb-item"><a href="<?= self::getUrl("Dashboard") ?>"><?= MFAPPNAME_SLUG ?></a></li>
<li class="breadcrumb-item"><a href="<?=self::getUrl("ConstructionConsentProject")?>">Zustimmungserklärungsprojekte</a></li>
<li class="breadcrumb-item"><a href="<?=self::getUrl("ConstructionConsent")?>">Zustimmungserklärungen</a></li>
<?php if(isset($item)): ?>
<li class="breadcrumb-item"><a href="<?=self::getUrl("ConstructionConsent", "View", ["id" => $item->id])?>"><?=htmlentities($item->name)?></a></li>
<li class="breadcrumb-item active">bearbeiten</li>
<?php endif; ?>
<li class="breadcrumb-item active">
<?= ($Action == "add") ? "Neue " : "" ?>Zustimmungserklärung <?= ($Action == "edit") ? "bearbeiten " : "" ?>
</li>
</ol>
</div>
<h4 class="page-title">Zustimmungserklärung</h4>
@@ -37,7 +41,7 @@
<label class="col-lg-2 col-form-label" for="constructionconsentproject_id">Projekt *</label>
<div class="col-lg-10">
<select class="form-control" name="constructionconsentproject_id" id="constructionconsentproject_id">
<?php foreach(ConstructionConsentProject::getAll() as $project): ?>
<?php foreach(ConstructionConsentProject::search(['id' => $allowed_projects]) as $project): ?>
<option value="<?=$project->id?>" <?=(isset($project_id) && $project_id == $project->id || isset($item) && $item->constructionconsentproject_id == $project->id) ? "selected='selected'" : ""?>><?=$project->name?></option>
<?php endforeach; ?>
</select>
@@ -204,7 +208,7 @@
<h5 class="card-header">Plan Vorschau <button type='button' id="delete-rimo-plan" class='ml-2 btn btn-sm btn-outline-danger pointer <?=($item->file && $item->file->file && $item->file->file->fileExists()) ? "" : "hidden" ?>' onclick='deletePlan()'><i class='fas fa-fw fa-trash'></i> Plan löschen</button></h5>
<div class="card-body" id="rimo-plan-container">
<input type="hidden" name="submit_plan_file_id" id="submit_plan_file_id" value="" />
<img id="plan_preview" style="max-width: 1200px;" <?=($item->file && $item->file->file && $item->file->file->fileExists()) ? "src=".$item->file->file->asDataUrl()."" : "" ?> />
<img id="plan_preview" style="max-width: 1200px;" <?=(isset($item) && $item->file && $item->file->file && $item->file->file->fileExists()) ? "src=".$item->file->file->asDataUrl()."" : "" ?> />
</div>
</div>
+9 -7
View File
@@ -37,7 +37,7 @@ $pagination_entity_name = "Zustimmungserklärungen";
<label class="form-label" for="filter_project_id">Projekt</label>
<select name="filter[project_id]" id="filter_project_id" class="form-control">
<option value="">Alle</option>
<?php foreach(ConstructionConsentProject::getAll() as $p): ?>
<?php foreach(ConstructionConsentProject::search(['id' => $allowed_projects]) as $p): ?>
<option value="<?=$p->id?>" <?=(is_array($filter) && array_key_exists("project_id", $filter) && $p->id == $filter["project_id"]) ? "selected='selected'" : ""?>><?=$p->name?></option>
<?php endforeach; ?>
</select>
@@ -328,10 +328,10 @@ $pagination_entity_name = "Zustimmungserklärungen";
<th>Name</th>
<th>Objekttyp</th>
<th>Objektadresse</th>
<th>KG</th>
<th>GST-Nr.</th>
<th>Einlagezahl</th>
<th class="text-center">Anzahl Eigentümer</th>
<th>Anfragestatus</th>
<th>Anfrageresultat</th>
<th></th>
</tr>
@@ -351,9 +351,9 @@ $pagination_entity_name = "Zustimmungserklärungen";
<?=$item->adb_hausnummer->strasse->gemeinde->name?>
<?php endif; ?>
</td>
<td><?=$item->kg?></td>
<td><?=$item->gst?></td>
<td><?=$item->ez?></td>
<td class="text-center">
<?php
@@ -364,14 +364,16 @@ $pagination_entity_name = "Zustimmungserklärungen";
<?=$owner_count?>
<?php } ?>
</td>
<td><?=($item->status) ? __($item->status,"consent") : ""?></td>
<td>
<?php
// Determine the status based on the counts
$status_class = 'blue'; // Default to blue (all open)
if (isset($item->owner_result_counts['denied']) && $item->owner_result_counts['denied'] > 0) {
$status_class = 'red'; // Red if at least one denied
$approve_override = $item->approve_override;
if (isset($approve_override) && $approve_override) {
$status_class = 'green'; // Blue if approve override
} elseif (isset($item->owner_result_counts['denied']) && $item->owner_result_counts['denied'] > 0) {
$status_class = 'red';
// Red if at least one denied
} elseif ((isset($item->owner_result_counts['unresolvable']) && $item->owner_result_counts['unresolvable'] > 0) ||
(isset($item->owner_result_counts['moved']) && $item->owner_result_counts['moved'] > 0)) {
$status_class = 'yellow'; // Yellow if at least one unresolvable or moved
+124 -13
View File
@@ -111,6 +111,12 @@ $pagination_entity_name = "Adressen";
Die Nutzung der Liegenschaft seitens BB dient der Eigenversorgung der GE und/oder dessen Nutzer(in) und wird dieser entgeltlos zugestimmt
</td>
</tr>
<tr>
<th>Genehmigung überschreiben</th>
<td>
<input type="checkbox" id="approve_override" class="switchery" data-size="small" data-color="#25b343" data-toggle-param="approve_override" <?=($item->approve_override) ? "checked='checked'" : ""?> />
</td>
</tr>
<?php if($item->object_type == "building"): ?>
<tr>
<td colspan="2"><h4>Metadaten</h4></td>
@@ -223,15 +229,21 @@ $pagination_entity_name = "Adressen";
<th></th>
</tr>
<?php foreach($item->contacts as $type => $contacts): ?>
<?php foreach($contacts as $contact): ?>
<tr>
<?php foreach($contacts as $contact):
if (substr($contact->phone, 0, 2) != "43" && substr($contact->phone, 0, 2) != "49" && substr($contact->phone, 0, 1) != "0") {
$phone = "0".$contact->phone;
} else {
$phone = $contact->phone;
}
?>
<tr id="contact-data-<?=$contact->id?>" data-name="<?=$contact->name?>" data-phone="<?=$phone?>" data-fax="<?=$contact->fax?>" data-email="<?=$contact->email?>" data-type="<?=$contact->type?>" data-street="<?=$contact->street?>" data-zip="<?=$contact->zip?>" data-city="<?=$contact->city?>" data-country="<?=$contact->country?>">
<td class="text-monospace"><?=__($contact->type, "consent")?></td>
<td><?=$contact->name?></td>
<td><?=$contact->phone?></td>
<td><?=$phone?></td>
<td><?=$contact->fax?></td>
<td><?=$contact->email?></td>
<td>
<!--a href="<?=self::getUrl("ConstructionConsentContact", "edit", ["contact_id" => $contact->id])?>" title="Ansprechpartner bearbeiten"><i class="far fa-fw fa-edit"></i></a-->
<a href="#" title="Ansprechpartner bearbeiten" onclick="editContact(<?=$contact->id?>); return false;"><i class="far fa-fw fa-edit"></i></a>
<a href="<?=self::getUrl("ConstructionConsentContact", "delete", ["contact_id" => $contact->id])?>" onclick="if(!confirm('Ansprechpartner wirklich löschen?')) return false;" class="text-danger" title="Löschen"><i class="fas fa-trash"></i></a>
</td>
</tr>
@@ -303,8 +315,14 @@ $pagination_entity_name = "Adressen";
<th>Ergebnis</th>
<th></th>
</tr>
<?php foreach($item->owners as $owner): ?>
<tr id="owner-data-<?=$owner->id?>" data-title="<?=$owner->title?>" data-firstname="<?=$owner->firstname?>" data-lastname="<?=$owner->lastname?>" data-street="<?=$owner->street?>" data-zip="<?=$owner->zip?>" data-city="<?=$owner->city?>" data-country="<?=$owner->country?>" data-phone="<?=$owner->phone?>" data-phone2="<?=$owner->phone2?>" data-fax="<?=$owner->fax?>" data-email="<?=$owner->email?>" data-birthdate="<?=($owner->birthdate) ? (new DateTime($owner->birthdate))->format("d.m.Y"): ""?>">
<?php foreach($item->owners as $owner):
if (substr($owner->phone, 0, 2) != "43" && substr($owner->phone, 0, 2) != "49" && substr($owner->phone, 0, 1) != "0") {
$phone = "0".$owner->phone;
} else {
$phone = $owner->phone;
}
?>
<tr id="owner-data-<?=$owner->id?>" data-title="<?=$owner->title?>" data-firstname="<?=$owner->firstname?>" data-lastname="<?=$owner->lastname?>" data-street="<?=$owner->street?>" data-zip="<?=$owner->zip?>" data-city="<?=$owner->city?>" data-country="<?=$owner->country?>" data-phone="<?=$phone?>" data-phone2="<?=$owner->phone2?>" data-fax="<?=$owner->fax?>" data-email="<?=$owner->email?>" data-birthdate="<?=($owner->birthdate) ? (new DateTime($owner->birthdate))->format("d.m.Y"): ""?>">
<td style="font-size: 1.4em;">
<a href="<?=self::getUrl("ConstructionConsent", "Download", ["owner_id" => $owner->id])?>" title="Zustimmungserklärungsformular herunterladen"><i class="far fa-fw fa-file-download"></i></a>
</td>
@@ -316,7 +334,7 @@ $pagination_entity_name = "Adressen";
<?=$owner->country?>
</td>
<td>
<?=$owner->phone?><br />
<?=$phone?><br />
<?=$owner->fax?><br />
<?=$owner->email?>
</td>
@@ -461,6 +479,15 @@ $pagination_entity_name = "Adressen";
</button>
</div>
<div class="modal-body">
<?php if ($is_admin): ?>
<div class="form-group">
<label for="owner_id_not_included" class="col-form-label">Besitzer aus Vorbestellung suchen:</label>
<select class="form-control" name="owner_id_not_included" id="search-owner">
<option></option>
</select>
</div>
<hr>
<?php endif; ?>
<input type="hidden" name="constructionconsent_id" value="<?=$item->id?>" />
<input type="hidden" name="id" value="" />
@@ -556,12 +583,6 @@ $pagination_entity_name = "Adressen";
<input type="hidden" name="owner_id" id="owner-upload-owner_id" value="" />
<div class="form-group">
<label for="owner-upload-name" class="col-form-label">Name *</label>
<input type="text" class="form-control" name="name" id="owner-upload-name" />
<small>Beschreibender Kurzname, z.B: Zustimmung oder Ablehnung</small>
</div>
<div class="form-group">
<label for="consentOwnerUpload" class="col-form-label">Datei auswählen *</label>
<input type="file" class="form-control" name="consentOwnerUpload" id="consentOwnerUpload" />
@@ -592,6 +613,7 @@ $pagination_entity_name = "Adressen";
<div class="modal-body">
<input type="hidden" name="constructionconsent_id" value="<?=$item->id?>" />
<input type="hidden" name="contact_id" value="" />
<div class="form-group">
<label for="street" class="col-form-label">Kontakttyp:</label>
@@ -851,6 +873,25 @@ $pagination_entity_name = "Adressen";
}
function editContact(contact_id) {
if(!contact_id) return;
$("#newContactModal input[name=contact_id]").val(contact_id);
$("#newContactModal input[name=type]").val($("#contact-data-" + contact_id).data("type"));
$("#newContactModal textarea[name=name]").val($("#contact-data-" + contact_id).data("name"));
$("#newContactModal input[name=street]").val($("#contact-data-" + contact_id).data("street"));
$("#newContactModal input[name=zip]").val($("#contact-data-" + contact_id).data("zip"));
$("#newContactModal input[name=city]").val($("#contact-data-" + contact_id).data("city"));
$("#newContactModal input[name=phone]").val($("#contact-data-" + contact_id).data("phone"));
$("#newContactModal input[name=fax]").val($("#contact-data-" + contact_id).data("fax"));
$("#newContactModal input[name=email]").val($("#contact-data-" + contact_id).data("email"));
$("#newContactModelLabel").text("Ansprechpartner bearbeiten");
$("#newContactModal").modal("show");
}
function toggleStatusControl(oid) {
// set select to current status id
$("#status-" + oid + "-input select").val($("#status-" + oid + "-text").data("status-id"));
@@ -1033,6 +1074,76 @@ $pagination_entity_name = "Adressen";
});
}
$(document).ready(function() {
$('#search-owner').select2({
dropdownParent: $('#newOwnerModal'),
ajax: {
url: "<?=self::getUrl("ConstructionConsentOwner", "searchOwner")?>",
dataType: 'json',
delay: 250,
data: function(params) {
return {
search: params.term
};
},
processResults: function(data) {
return {
results: data.map(function(item) {
return {
id: item.id,
text: item.text,
fullData: item
};
})
};
},
cache: true
},
minimumInputLength: 2,
placeholder: 'Besitzer suchen...'
});
$('#search-owner').on('select2:select', function(e) {
var selectedData = e.params.data.fullData;
$("#newOwnerModal input[name=firstname]").val(selectedData.firstname);
$("#newOwnerModal input[name=lastname]").val(selectedData.lastname);
$("#newOwnerModal input[name=street]").val(selectedData.street);
$("#newOwnerModal input[name=zip]").val(selectedData.zip);
$("#newOwnerModal input[name=city]").val(selectedData.city);
$("#newOwnerModal input[name=phone]").val(selectedData.phone);
$("#newOwnerModal input[name=email]").val(selectedData.email);
});
$("#approve_override").on("change", function() {
const reason = prompt("Bitte geben Sie einen Grund für das Überschreiben der Genehmigung ein:");
if (reason != null) {
$.post("<?php echo self::getUrl("ConstructionConsentJournal", "save")?>", {
consent_id: <?=$item->id?>,
text: `Genehmigung überschreiben wurde ${$(this).prop("checked") ? "aktiviert" : "deaktiviert"} | Begründung: ${reason}`
}, function(success) {
if (success.status != "OK") {
notify("error", "Status konnte nicht gespeichert werden");
} else {
notify("success", "Status erfolgreich gespeichert");
}
}, 'json');
$.get("<?php echo self::getUrl("ConstructionConsent", "approveOverride")?>", {
consent_id: <?=$item->id?>,
checked: $(this).prop("checked") ? 1 : 0
}, function(success) {
if (success.status != "OK") {
notify("error", "Status konnte nicht gespeichert werden");
setTimeout(() => {location.reload()}, 150);
} else {
notify("success", "Status erfolgreich gespeichert");
setTimeout(() => {location.reload()}, 150);
}
}, 'json');
}
});
});
</script>
+5 -1
View File
@@ -184,7 +184,11 @@
function(success) {
console.log(success);
if(success.status == "OK") {
$("#sent-label-" + success.result.preorder_id).show();
if(checked) {
$("#sent-label-" + success.result.preorder_id).show();
} else {
$("#sent-label-" + success.result.preorder_id).hide();
}
}
},
"json"
+37
View File
@@ -257,6 +257,38 @@ $siteTitle = "Benutzer";
</div>
</div>
</div>
<div class="card">
<div class="card-body">
<h4 class="card-title mb-3">Zustimmungserklärungen</h4>
<div class="form-group" id="constructionconsent-projects-container">
<label for="constructionconsent_projects">Zustimmungserklärungsprojekte:</label>
<?php
$constructionConsent_projects = [];
if($user->id) {
$constructionConsent_projects = json_decode((new WorkerFlag($user->id, "constructionConsent_projects"))->value());
if(!$constructionConsent_projects) {
$constructionConsent_projects = [];
}
}
?>
<select name="constructionconsent_projects[]" id="constructionconsent_projects"
class="form-control" multiple="multiple">
<?php foreach(ConstructionConsentProject::getAll() as $project): ?>
<option value="<?=$project->id?>" <?=(in_array($project->id, $constructionConsent_projects)) ? "selected='selected'" : ""?>><?=$project->name?></option>
<?php endforeach; ?>
</select>
<small>Benutzer kann nur Zustimmungserklärungen in diesen Projekten sehen</small>
</div>
</div>
</div>
<div class="card">
<div class="card-body">
@@ -481,6 +513,11 @@ $siteTitle = "Benutzer";
placeholder: "",
closeOnSelect: false
});
$("#constructionconsent_projects").select2({
allowClear: true,
placeholder: "",
closeOnSelect: false
});
<?php if(!$user || (!$user->is("preorderfront") && !$user->is("preorderaddressreporting")) ): ?>
//$("#preorder-network-container").hide();
+3 -3
View File
@@ -11,7 +11,7 @@
</a>
<ul class="submenu">
<li><a href="<?=self::getUrl("Preorder")?>"><i class="far fa-fw fa-calendar-lines text-info"></i> Vorbestellung</a></li>
<?php if($me->is(["Admin","netowner","salespartner"]) && in_array($me->address_id, [1,209,5908,2187])): ?>
<?php if ($me->isAdmin() || !empty(json_decode((new WorkerFlag($me->id, "constructionConsent_projects"))->value() ?? '[]'))): ?>
<li><a href="<?=self::getUrl("ConstructionConsentProject")?>"><i class="far fa-fw fa-clipboard-question text-info"></i> Zustimmungserklärungen</a></li>
<?php endif; ?>
</ul>
@@ -92,7 +92,7 @@
</li>
<?php endif; ?>
<?php if($me->is(["Admin", "netowner", "salespartner"]) && ($me->is("employee") || $me->can(["Fibu", "Billing", "Preorderpricing", "Preorderbilling"])) || in_array($me->address_id, [1,209,5908,2187])): ?>
<?php if($me->is(["Admin", "netowner", "salespartner"]) && ($me->is("employee") || $me->can(["Fibu", "Billing", "Preorderpricing", "Preorderbilling"])) || !empty(json_decode((new WorkerFlag($me->id, "constructionConsent_projects"))->value() ?? '[]'))): ?>
<li class="has-submenu mobile-hide">
<a href="#">
<i class="fas fa-fw fa-money-from-bracket"></i> Backoffice <div class="arrow-down"></div>
@@ -112,7 +112,7 @@
<?php if($me->is(["Admin","netowner","salespartner"]) && $me->can("Preorderbilling")): ?>
<li><a href="<?=self::getUrl("PreorderBilling")?>"><i class="far fa-fw fa-cash-register text-info"></i> Vorbestellkampagnen Verrechnung</a></li>
<?php endif; ?>
<?php if($me->is(["Admin","netowner","salespartner"]) && in_array($me->address_id, [1,209,5908,2187])): ?>
<?php if($me->isAdmin() || !empty(json_decode((new WorkerFlag($me->id, "constructionConsent_projects"))->value() ?? '[]'))): ?>
<li><a href="<?=self::getUrl("ConstructionConsentProject")?>"><i class="far fa-fw fa-clipboard-question text-info"></i> Zustimmungserklärungen</a></li>
<?php endif; ?>