Merge branch 'master' into fronkdev
This commit is contained in:
@@ -99,6 +99,18 @@ $pagination_entity_name = "Zustimmungserklärungen";
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-2">
|
||||
<label class="form-label" for="filter_electric_approval">Elektriker freigegeben</label>
|
||||
<select name="filter[electric_approval]" id="filter_electric_approval" class="form-control">
|
||||
<option value="">Alle</option>
|
||||
<option value="!NULL" <?=(array_key_exists("electric_approval", $filter) && $filter["electric_approval"] == "!NULL") ? "selected='selected'" : ""?>>Ja</option>
|
||||
<option value="NULL" <?=(array_key_exists("electric_approval", $filter) && $filter["electric_approval"] == "NULL") ? "selected='selected'" : ""?>>Nein</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="row mt-2">
|
||||
|
||||
<div class="col-2">
|
||||
<label class="form-label" for="filter_conduit_installed_ftu">Leerrohr bis HAK</label>
|
||||
<select name="filter[conduit_installed_ftu]" id="filter_conduit_installed_ftu" class="form-control">
|
||||
@@ -108,10 +120,7 @@ $pagination_entity_name = "Zustimmungserklärungen";
|
||||
</select>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="row mt-2">
|
||||
|
||||
<div class="col-2">
|
||||
<div class="col-1">
|
||||
<label class="form-label" for="filter_inhouse_cabling">Inhouse erledigt</label>
|
||||
<select name="filter[inhouse_cabling]" id="filter_inhouse_cabling" class="form-control">
|
||||
<option value="">Alle</option>
|
||||
@@ -331,6 +340,8 @@ $pagination_entity_name = "Zustimmungserklärungen";
|
||||
<th>KG</th>
|
||||
<th>GST-Nr.</th>
|
||||
<th>Einlagezahl</th>
|
||||
<th>Wohneinheiten</th>
|
||||
<th>Bestellungen</th>
|
||||
<th class="text-center">Anzahl Eigentümer</th>
|
||||
<th>Anfrageresultat</th>
|
||||
<th></th>
|
||||
@@ -354,6 +365,8 @@ $pagination_entity_name = "Zustimmungserklärungen";
|
||||
<td><?=$item->kg?></td>
|
||||
<td><?=$item->gst?></td>
|
||||
<td><?=$item->ez?></td>
|
||||
<td><?=$item->adb_hausnummer->unit_count ?? ''?></td>
|
||||
<td><?=$item->preorder_count?></td>
|
||||
<td class="text-center">
|
||||
|
||||
<?php
|
||||
|
||||
@@ -144,7 +144,7 @@ $pagination_entity_name = "Adressen";
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Elektriker</th>
|
||||
<th>Freigabe Elektriker</th>
|
||||
<td class="text-monospace"><a data-toggle="modal" data-target="#electricianDateModal" href="#"><i class="fas fa-fw fa-edit"></i></a> <?=($item->inspection_date_electrician) ? date("d.m.Y", $item->inspection_date_electrician) : ""?></td>
|
||||
<td><input type="checkbox" id="inspection_electrician" class="switchery" data-size="small" data-color="#25b343" data-toggle-param="inspection_electrician" <?=($item->inspection_electrician) ? "checked='checked'" : ""?> /></td>
|
||||
<td>
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
<?php if(array_key_exists("status_id", $filter)): ?>
|
||||
<?=($filter['status_id'] == $status->id) ? "selected='selected'" : ""?>
|
||||
<?php else: ?>
|
||||
<?=($status->id == 3) ? "selected='selected'" : ""?>
|
||||
<?=(!in_array($me->id, ["145","62","56"]) && $status->id == 3) ? "selected='selected'" : ""?>
|
||||
<?php endif; ?>
|
||||
>
|
||||
<?=$status->code?> - <?=__($status->name."-t")?></option>
|
||||
@@ -104,6 +104,15 @@
|
||||
<input type="text" class="form-control" name="filter[building_street]" id="filter_building_street" value="<?=$filter['building_street']?>" />
|
||||
</div>
|
||||
|
||||
<div class="col-2">
|
||||
<label class="form-label" for="filter_linework_enabled">Baufreigabe</label>
|
||||
<select name="filter[linework_enabled]" id="filter_linework_enabled" class="form-control">
|
||||
<option value="">Alle</option>
|
||||
<option value="1" <?=(array_key_exists("linework_enabled", $filter) && $filter["linework_enabled"] == "1") ? "selected='selected'" : ""?>>Ja</option>
|
||||
<option value="0" <?=(array_key_exists("linework_enabled", $filter) && $filter["linework_enabled"] == "0") ? "selected='selected'" : ""?>>Nein</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+438
-185
@@ -1,198 +1,451 @@
|
||||
<?php
|
||||
$pagination_baseurl = $this->getUrl($Mod,"Index");
|
||||
$pagination_baseurl_params = ["filter" => $filter];
|
||||
$pagination_entity_name = "Patchungen";
|
||||
|
||||
if(!is_array($filter)) $filter = [];
|
||||
// --- Configuration ---
|
||||
$pagination_baseurl = $this->getUrl($Mod,"Index");
|
||||
$pagination_baseurl_params = ["filter" => $filter]; // Filters passed via GET
|
||||
$pagination_entity_name = "Patchungen";
|
||||
|
||||
// Ensure $filter is always an array
|
||||
if(!is_array($filter)) {
|
||||
$filter = [];
|
||||
}
|
||||
|
||||
// Helper function for safe output (assuming not already handled by framework/template engine)
|
||||
function e($string) {
|
||||
return htmlspecialchars($string ?? '', ENT_QUOTES, 'UTF-8');
|
||||
}
|
||||
|
||||
$additionalHead = [
|
||||
'<link rel="manifest" href="/assets/pwa/patching-manifest.json">'
|
||||
];
|
||||
|
||||
?>
|
||||
<?php include(realpath(dirname(__FILE__)."/../../$mfLayoutPackage")."/header.php"); ?>
|
||||
|
||||
<!-- start page title -->
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="page-title-box">
|
||||
<div class="page-title-right">
|
||||
<ol class="breadcrumb m-0">
|
||||
<li class="breadcrumb-item"><a href="<?=self::getUrl("Dashboard")?>"><?=MFAPPNAME_SLUG?></a></li>
|
||||
<li class="breadcrumb-item active">Patchungen</li>
|
||||
</ol>
|
||||
</div>
|
||||
<h4 class="page-title">Patchungen</h4>
|
||||
<div class="col-12">
|
||||
<div class="page-title-box">
|
||||
<div class="page-title-right">
|
||||
<ol class="breadcrumb m-0">
|
||||
<li class="breadcrumb-item"><a href="<?=e(self::getUrl("Dashboard"))?>"><?=e(MFAPPNAME_SLUG)?></a></li>
|
||||
<li class="breadcrumb-item active">Patchungen</li>
|
||||
</ol>
|
||||
</div>
|
||||
<h4 class="page-title">Patchungen</h4>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end page title -->
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body mb-3">
|
||||
<h4 class="header-title mb-3">Filter</h4>
|
||||
|
||||
<form method="get" action="<?=self::getUrl("Patching")?>">
|
||||
<div class="row">
|
||||
<div class="col-1">
|
||||
<label class="form-label" for="filter_network_id">Netzgebiet</label>
|
||||
<select name="filter[network_id]" id="filter_network_id" class="form-control">
|
||||
<option></option>
|
||||
<?php foreach($mynetworks as $fnet): ?>
|
||||
<option value="<?=$fnet->id?>" <?=($filter['network_id'] == $fnet->id) ? "selected='selected'" : ""?>><?=$fnet->name?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-2">
|
||||
<label class="form-label" for="filter_pop_id">POP</label>
|
||||
<select name="filter[pop_id]" id="filter_pop_id" class="form-control">
|
||||
<option></option>
|
||||
<?php foreach($mynetworks as $fnet): ?>
|
||||
<?php if(is_array($fnet->pops) && count($fnet->pops)): ?>
|
||||
<optgroup label="<?=$fnet->name?>">
|
||||
<?php foreach($fnet->pops as $pop): ?>
|
||||
<option value="<?=$pop->id?>" <?=($filter['pop_id'] == $pop->id) ? "selected='selected'" : ""?>><?=$pop->name?></option>
|
||||
<?php endforeach; ?>
|
||||
</optgroup>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-2">
|
||||
<label class="form-label" for="filter_patched">Patchstatus</label>
|
||||
<select name="filter[patched]" id="filter_patched" class="form-control">
|
||||
<option value="0" <?=($filter['patched'] < 1) ? "selected='selected'" : ""?>>Nicht gepatched</option>
|
||||
<option value="1" <?=($filter['patched'] == 1) ? "selected='selected'" : ""?>>Gepatched</option>
|
||||
<option value="2" <?=($filter['patched'] == 2) ? "selected='selected'" : ""?>>Vorpatchen</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-2">
|
||||
<label class="form-label" for="filter_hide_delayed_finish">Verzögerte Herstellung</label>
|
||||
<select name="filter[hide_delayed_finish]" id="filter_hide_delayed_finish" class="form-control">
|
||||
<option value="0" <?=(array_key_exists("hide_delayed_finish", $filter) &&$filter['hide_delayed_finish'] != 1) ? "selected='selected'" : ""?>>Anzeigen</option>
|
||||
<option value="1" <?=(!array_key_exists("hide_delayed_finish", $filter) || $filter['hide_delayed_finish'] == 1) ? "selected='selected'" : ""?>>Nicht anzeigen</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-1">
|
||||
<label class="form-label" for="filter_code">Objekt ID</label>
|
||||
<input type="text" class="form-control" name="filter[code]" id="filter_code" value="<?=$filter['code']?>" />
|
||||
</div>
|
||||
|
||||
<div class="col-2">
|
||||
<label class="form-label" for="filter_street">Straße</label>
|
||||
<input type="text" class="form-control" name="filter[street]" id="filter_street" value="<?=$filter['street']?>" />
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<div class="row mt-2">
|
||||
<div class="col">
|
||||
<button type="submit" class="btn btn-primary">Filter anwenden</button>
|
||||
<a class="btn btn-secondary" href="<?=self::getUrl("Patching")?>">Filter zurücksetzen</a>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body mb-3">
|
||||
<h4 class="header-title">Patchungen</h4>
|
||||
<div class="col-lg-12">
|
||||
|
||||
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination.php"); ?>
|
||||
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination-summary.php"); ?>
|
||||
<div class="card">
|
||||
<div class="card-body mb-3">
|
||||
<h4 class="header-title mb-3">Filter</h4>
|
||||
|
||||
|
||||
<table class="table table-striped table-hover">
|
||||
<tr class="table-bordered text-center">
|
||||
<th colspan="4">Standort</th>
|
||||
<th colspan="2">ODF</th>
|
||||
<th colspan="5">Abschluss/Device</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
<tr class="table-bordered">
|
||||
<th>Netzgebiet</th>
|
||||
<th>POP</th>
|
||||
<th>Kunde</th>
|
||||
<th>Standort</th>
|
||||
<th>Patchposition ODF</th>
|
||||
<th>ODF Port</th>
|
||||
<th>Typ</th>
|
||||
<th>Splitter / Gerät</th>
|
||||
<th>Port</th>
|
||||
<th>Gepatched</th>
|
||||
<th>Von</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
<?php foreach($terminations as $term): ?>
|
||||
<tr>
|
||||
<td><?=$term->building->network->name?></td>
|
||||
<td>
|
||||
<?php if($term->getPop()): ?>
|
||||
<?=$term->getPop()->name?>
|
||||
<?php else: ?>
|
||||
<?=$term->building->pop->name?>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td><?=($term->order->owner) ? $term->order->owner->customer_number : ""?><br /> <?=($term->order->owner) ? $term->order->owner->getCompanyOrName() : ""?></td>
|
||||
<td>
|
||||
<?=$term->building->street?><br />
|
||||
<?=$term->building->zip?> <?=$term->building->city?>
|
||||
</td>
|
||||
<td class="text-mono text-primary" title="Schrank: <?=($term->workflowitems["ist_schrank"]->value->id) ? $term->workflowitems["ist_schrank"]->value->value_string : $term->workflowitems["schrank"]->value->value_string?> / Einschub: <?=($term->workflowitems["ist_baugruppe"]->value->id) ? $term->workflowitems["ist_baugruppe"]->value->value_string : $term->workflowitems["baugruppe"]->value->value_string?> / Modul: <?=($term->workflowitems["ist_modul"]->value->id) ? $term->workflowitems["ist_modul"]->value->value_string : $term->workflowitems["modul"]->value->value_string?> / Port: <?=($term->workflowitems["ist_ports"]->value->id) ? $term->workflowitems["ist_ports"]->value->value_string : $term->workflowitems["ports"]->value->value_string?>">
|
||||
<?=($term->workflowitems["ist_schrank"]->value->id) ? $term->workflowitems["ist_schrank"]->value->value_string : $term->workflowitems["schrank"]->value->value_string?> /
|
||||
<?=($term->workflowitems["ist_baugruppe"]->value->id) ? $term->workflowitems["ist_baugruppe"]->value->value_string : $term->workflowitems["baugruppe"]->value->value_string?> /
|
||||
<?=($term->workflowitems["ist_modul"]->value->id) ? $term->workflowitems["ist_modul"]->value->value_string : $term->workflowitems["modul"]->value->value_string?> /
|
||||
<?=($term->workflowitems["ist_ports"]->value->id) ? $term->workflowitems["ist_ports"]->value->value_string : $term->workflowitems["ports"]->value->value_string?>
|
||||
</td>
|
||||
<td>
|
||||
<select name="linework_port" form="term-form-<?=$term->id?>" class="form-control">
|
||||
<?php foreach($term->getLineworkportPairs() as $ports): ?>
|
||||
<?php foreach($ports as $p): ?>
|
||||
<option value="<?=$p?>" <?=($term->patching->linework_ports == $p) ? "selected='selected'" : ""?>><?=$p?></option>
|
||||
<?php endforeach; ?>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<select name="device_type" form="term-form-<?=$term->id?>" class="form-control">
|
||||
<option></option>
|
||||
<option value="splitter" <?=($term->patching->device_type == "splitter") ? "selected='selected'" : ""?>>Splitter</option>
|
||||
<option value="pon" <?=($term->patching->device_type == "pon") ? "selected='selected'" : ""?>>Shared PON-Port</option>
|
||||
<option value="switch" <?=($term->patching->device_type == "switch") ? "selected='selected'" : ""?>>Switch</option>
|
||||
</select>
|
||||
</td>
|
||||
<td><input type="text" class="form-control" form="term-form-<?=$term->id?>" name="device_name" value="<?=$term->patching->device_name?>" placeholder="Splitte / Gerät" /></td>
|
||||
<td><input type="text" class="form-control" form="term-form-<?=$term->id?>" name="device_port" value="<?=$term->patching->device_port?>" placeholder="Port" /></td>
|
||||
<td><input type="checkbox" class="form-control" form="term-form-<?=$term->id?>" name="patched" value="1" <?=($term->patching->patched == 1) ? "checked='checked'" : ""?> /></td>
|
||||
<td <?=($term->patching->patched == 1 && $term->patching->patched_by) ? "title='Gepatched: ".date("d.m.Y H:i",$term->patching->patched_date)." von ".$term->patching->patcher->name." (".$term->patching->patcher->address->getCompanyOrName(true).")'" : ""?>>
|
||||
|
||||
<?php if($term->patching->patched == 1 && $term->patching->patched_by): ?>
|
||||
<?=($term->patching->patcher) ? $term->patching->patcher->getAbbrName() : ""?>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td>
|
||||
<form method="post" id="term-form-<?=$term->id?>" action="<?=self::getUrl("Patching","save", ["s" => $pagination['start'], "filter" => $filter])?>">
|
||||
<input type="hidden" name="termination_id" value="<?=$term->id?>" />
|
||||
<input type="submit" class="btn btn-primary" value="Speichern" />
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</table>
|
||||
|
||||
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination-summary.php"); ?>
|
||||
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination.php"); ?>
|
||||
</div>
|
||||
<form method="get" action="<?=e(self::getUrl("Patching"))?>">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-12 col-md-6 col-lg-2 mb-3">
|
||||
<label class="form-label" for="filter_network_id">Netzgebiet</label>
|
||||
<select name="filter[network_id]" id="filter_network_id" class="form-control">
|
||||
<option value=""></option>
|
||||
<?php foreach($mynetworks as $fnet): ?>
|
||||
<option value="<?=e($fnet->id)?>" <?=($filter['network_id'] ?? null == $fnet->id) ? "selected='selected'" : ""?>><?=e($fnet->name)?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-md-6 col-lg-2 mb-3">
|
||||
<label class="form-label" for="filter_pop_id">POP</label>
|
||||
<select name="filter[pop_id]" id="filter_pop_id" class="form-control">
|
||||
<option value=""></option>
|
||||
<?php foreach($mynetworks as $fnet): ?>
|
||||
<?php if(is_array($fnet->pops) && count($fnet->pops)): ?>
|
||||
<optgroup label="<?=e($fnet->name)?>">
|
||||
<?php foreach($fnet->pops as $pop): ?>
|
||||
<option value="<?=e($pop->id)?>" <?=($filter['pop_id'] ?? null == $pop->id) ? "selected='selected'" : ""?>><?=e($pop->name)?></option>
|
||||
<?php endforeach; ?>
|
||||
</optgroup>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-md-6 col-lg-2 mb-3">
|
||||
<label class="form-label" for="filter_patched">Patchstatus</label>
|
||||
<select name="filter[patched]" id="filter_patched" class="form-control">
|
||||
<option value="0" <?=((int)($filter['patched'] ?? 0) < 1) ? "selected='selected'" : ""?>>Nicht gepatched</option>
|
||||
<option value="1" <?=((int)($filter['patched'] ?? 0) == 1) ? "selected='selected'" : ""?>>Gepatched</option>
|
||||
<option value="2" <?=((int)($filter['patched'] ?? 0) == 2) ? "selected='selected'" : ""?>>Vorpatchen</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-md-6 col-lg-2 mb-3">
|
||||
<label class="form-label" for="filter_hide_delayed_finish">Verzögerte Herstellung</label>
|
||||
<select name="filter[hide_delayed_finish]" id="filter_hide_delayed_finish" class="form-control">
|
||||
<option value="0" <?=(isset($filter["hide_delayed_finish"]) && $filter['hide_delayed_finish'] != 1) ? "selected='selected'" : ""?>>Anzeigen</option>
|
||||
<option value="1" <?=(!isset($filter["hide_delayed_finish"]) || $filter['hide_delayed_finish'] == 1) ? "selected='selected'" : ""?>>Nicht anzeigen</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-md-6 col-lg-1 mb-3">
|
||||
<label class="form-label" for="filter_code">Objekt ID</label>
|
||||
<input type="text" class="form-control" name="filter[code]" id="filter_code" value="<?=e($filter['code'] ?? '')?>" />
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-md-6 col-lg-3 mb-3">
|
||||
<label class="form-label" for="filter_street">Straße</label>
|
||||
<input type="text" class="form-control" name="filter[street]" id="filter_street" value="<?=e($filter['street'] ?? '')?>" />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="row mt-2">
|
||||
<div class="col-12">
|
||||
<button type="submit" class="btn btn-primary">Filter anwenden</button>
|
||||
<a class="btn btn-secondary" href="<?=e(self::getUrl("Patching"))?>">Filter zurücksetzen</a>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-body mb-3">
|
||||
<h4 class="header-title">Patchungen</h4>
|
||||
|
||||
<?php // Include pagination controls - Top ?>
|
||||
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination.php"); ?>
|
||||
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination-summary.php"); ?>
|
||||
|
||||
<div class="table-responsive mt-3"> <?php // Added table-responsive wrapper and margin-top ?>
|
||||
<table class="table table-striped table-hover">
|
||||
<thead class="table-bordered"> <?php // Added thead and border class ?>
|
||||
<tr>
|
||||
<th colspan="4" class="text-center">Standort</th>
|
||||
<th colspan="2" class="text-center">ODF</th>
|
||||
<th colspan="5" class="text-center">Abschluss/Device</th>
|
||||
<th>Aktion</th> <?php // Renamed last header ?>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Netzgebiet</th>
|
||||
<th class="text-nowrap">POP</th> <?php // Added text-nowrap for min-width effect ?>
|
||||
<th class="text-nowrap">Kunde</th> <?php // Added text-nowrap ?>
|
||||
<th>Standort</th> <?php // Allow wrapping ?>
|
||||
<th class="text-nowrap">Patchposition ODF</th> <?php // Added text-nowrap ?>
|
||||
<th style="min-width: 105px">ODF Port</th> <?php // Select handles resize ok ?>
|
||||
<th style="min-width: 195px">Typ</th> <?php // Select handles resize ok ?>
|
||||
<th style="min-width: 190px" class="text-nowrap">Splitter / Gerät</th> <?php // Added text-nowrap ?>
|
||||
<th style="min-width: 90px" class="text-nowrap">Port</th> <?php // Added text-nowrap ?>
|
||||
<th>Gepatched</th>
|
||||
<th class="text-nowrap">Von</th> <?php // Added text-nowrap ?>
|
||||
<th class="text-nowrap">Speichern</th> <?php // Added text-nowrap ?>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach($terminations as $term): ?>
|
||||
<?php
|
||||
// --- Prepare complex data for cleaner output ---
|
||||
|
||||
// ODF Patch Position
|
||||
$wfItems = $term->workflowitems ?? [];
|
||||
$istSchrankValue = $wfItems["ist_schrank"]->value ?? null;
|
||||
$schrankValue = $wfItems["schrank"]->value ?? null;
|
||||
$istBaugruppeValue = $wfItems["ist_baugruppe"]->value ?? null;
|
||||
$baugruppeValue = $wfItems["baugruppe"]->value ?? null;
|
||||
$istModulValue = $wfItems["ist_modul"]->value ?? null;
|
||||
$modulValue = $wfItems["modul"]->value ?? null;
|
||||
$istPortsValue = $wfItems["ist_ports"]->value ?? null;
|
||||
$portsValue = $wfItems["ports"]->value ?? null;
|
||||
|
||||
$schrank = ($istSchrankValue && $istSchrankValue->id) ? $istSchrankValue->value_string : ($schrankValue ? $schrankValue->value_string : '');
|
||||
$baugruppe = ($istBaugruppeValue && $istBaugruppeValue->id) ? $istBaugruppeValue->value_string : ($baugruppeValue ? $baugruppeValue->value_string : '');
|
||||
$modul = ($istModulValue && $istModulValue->id) ? $istModulValue->value_string : ($modulValue ? $modulValue->value_string : '');
|
||||
$ports = ($istPortsValue && $istPortsValue->id) ? $istPortsValue->value_string : ($portsValue ? $portsValue->value_string : '');
|
||||
|
||||
$odfPositionTitle = "Schrank: " . e($schrank) . " / Einschub: " . e($baugruppe) . " / Modul: " . e($modul) . " / Port: " . e($ports);
|
||||
$odfPositionDisplay = e($schrank) . " / " . e($baugruppe) . " / " . e($modul) . " / " . e($ports);
|
||||
|
||||
// Patched By Info
|
||||
$patching = $term->patching ?? null;
|
||||
$patcher = $patching ? ($patching->patcher ?? null) : null;
|
||||
$patchedByTitle = '';
|
||||
$patchedByDisplay = '';
|
||||
if ($patching && $patching->patched == 1 && $patching->patched_by && $patcher) {
|
||||
$patcherName = $patcher->name ?? 'Unbekannt';
|
||||
$patcherCompany = $patcher->address ? $patcher->address->getCompanyOrName(true) : 'N/A';
|
||||
$patchedDate = date("d.m.Y H:i", $patching->patched_date);
|
||||
$patchedByTitle = "Gepatched: {$patchedDate} von " . e($patcherName) . " (" . e($patcherCompany) . ")";
|
||||
$patchedByDisplay = $patcher->getAbbrName() ?? '';
|
||||
}
|
||||
|
||||
// Customer Info
|
||||
$customer = $term->order->owner ?? null;
|
||||
$customerNumber = $customer ? $customer->customer_number : '';
|
||||
$customerName = $customer ? $customer->getCompanyOrName() : '';
|
||||
|
||||
// Location Info
|
||||
$building = $term->building ?? null;
|
||||
$networkName = $building ? ($building->network->name ?? '') : '';
|
||||
$popName = '';
|
||||
$termPop = $term->getPop(); // Call potentially expensive method once
|
||||
if ($termPop) {
|
||||
$popName = $termPop->name ?? '';
|
||||
} elseif ($building && $building->pop) {
|
||||
$popName = $building->pop->name ?? '';
|
||||
}
|
||||
$street = $building->street ?? '';
|
||||
$zip = $building->zip ?? '';
|
||||
$city = $building->city ?? '';
|
||||
|
||||
// Linework Ports
|
||||
$lineworkPorts = $term->getLineworkportPairs() ?? [];
|
||||
$currentLineworkPort = $patching ? $patching->linework_ports : null;
|
||||
|
||||
// Device Info
|
||||
$deviceType = $patching ? $patching->device_type : '';
|
||||
$deviceName = $patching ? $patching->device_name : '';
|
||||
$devicePort = $patching ? $patching->device_port : '';
|
||||
$isPatched = $patching ? ($patching->patched == 1) : false;
|
||||
?>
|
||||
<tr class="align-middle"> <?php // Added align-middle ?>
|
||||
<td><?=e($networkName)?></td>
|
||||
<td><?=e($popName)?></td>
|
||||
<td><?=e($customerNumber)?><br /><?=e($customerName)?></td>
|
||||
<td>
|
||||
<?=e($street)?><br />
|
||||
<?=e($zip)?> <?=e($city)?>
|
||||
</td>
|
||||
<td class="text-mono text-primary" title="<?=$odfPositionTitle?>">
|
||||
<?=$odfPositionDisplay?>
|
||||
</td>
|
||||
<td>
|
||||
<select name="linework_port" form="term-form-<?=e($term->id)?>" class="form-control"> <?php // Removed -sm ?>
|
||||
<?php foreach($lineworkPorts as $portGroup): ?>
|
||||
<?php foreach($portGroup as $p): ?>
|
||||
<option value="<?=e($p)?>" <?=($currentLineworkPort == $p) ? "selected='selected'" : ""?>><?=e($p)?></option>
|
||||
<?php endforeach; ?>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<select name="device_type" form="term-form-<?=e($term->id)?>" class="form-control"> <?php // Removed -sm ?>
|
||||
<option value=""></option>
|
||||
<option value="splitter" <?=($deviceType == "splitter") ? "selected='selected'" : ""?>>Splitter</option>
|
||||
<option value="pon" <?=($deviceType == "pon") ? "selected='selected'" : ""?>>Shared PON-Port</option>
|
||||
<option value="switch" <?=($deviceType == "switch") ? "selected='selected'" : ""?>>Switch</option>
|
||||
</select>
|
||||
</td>
|
||||
<td><input type="text" class="form-control device-name-input" form="term-form-<?=e($term->id)?>" name="device_name" value="<?=e($deviceName)?>" placeholder="Splitter / Gerät" /></td> <?php // Removed -sm ?>
|
||||
<td><input type="text" class="form-control" form="term-form-<?=e($term->id)?>" name="device_port" value="<?=e($devicePort)?>" placeholder="Port" /></td> <?php // Removed -sm ?>
|
||||
<td class="text-center"> <?php // Added text-center ?>
|
||||
<input type="hidden" name="patched" value="0" form="term-form-<?=e($term->id)?>" /> <?php // Ensure 0 is sent if checkbox is unchecked ?>
|
||||
<input type="checkbox" class="form-check-input" style="position:unset !important;height: 2em; width: 2em;" form="term-form-<?=e($term->id)?>" name="patched" value="1" <?=($isPatched) ? "checked='checked'" : ""?> /> <?php // Adjusted checkbox style slightly ?>
|
||||
</td>
|
||||
<td <?=!empty($patchedByTitle) ? 'title="' . $patchedByTitle . '"' : ''?>>
|
||||
<?=e($patchedByDisplay)?>
|
||||
</td>
|
||||
<td>
|
||||
<form method="post" id="term-form-<?=e($term->id)?>" action="<?=e(self::getUrl("Patching","save", ["s" => $pagination['start'] ?? 0, "filter" => $filter]))?>">
|
||||
<input type="hidden" name="termination_id" value="<?=e($term->id)?>" />
|
||||
<button type="submit" class="btn btn-primary">Speichern</button> <?php // Changed value to button text, removed -sm ?>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> <?php // End table-responsive ?>
|
||||
|
||||
<?php // Include pagination controls - Bottom ?>
|
||||
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination-summary.php"); ?>
|
||||
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination.php"); ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php include(realpath(dirname(__FILE__)."/../../$mfLayoutPackage")."/footer.php"); ?>
|
||||
<style>
|
||||
@media (max-width: 768px) {
|
||||
.pagination {
|
||||
overflow-x: auto;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
|
||||
.select2-selection__rendered {
|
||||
line-height: 38px !important;
|
||||
}
|
||||
.select2-container .select2-selection--single {
|
||||
height: 38px !important;
|
||||
}
|
||||
.select2-selection__arrow {
|
||||
height: 37px !important;
|
||||
}
|
||||
|
||||
@media all and (display-mode: standalone) {
|
||||
#topnav {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
padding-top: 0 !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
window.DEVICES = <?= json_encode($devices) ?>;
|
||||
window.DEVICES = window.DEVICES.filter(device => {
|
||||
return device.name.toLowerCase().includes('olt') || device.name.toLowerCase().includes('pon')
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
$(function() {
|
||||
if ('serviceWorker' in navigator) {
|
||||
navigator.serviceWorker.register('/Patching/sw', { scope: '/' })
|
||||
.then(registration => {
|
||||
console.log('Patching PWA Service Worker registered with scope:', registration.scope);
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Patching PWA Service Worker registration failed:', error);
|
||||
});
|
||||
}
|
||||
|
||||
if (typeof $().select2 === 'undefined') {
|
||||
console.error('Select2 library is not loaded.');
|
||||
// Optionally display an error to the user or fall back gracefully
|
||||
return; // Stop execution if Select2 is missing
|
||||
}
|
||||
|
||||
const ipNumRegex = /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})[/-](\d+)$/;
|
||||
|
||||
// Helper: Find device object by IP
|
||||
function findDeviceByIp(ip) {
|
||||
if (!window.DEVICES || !Array.isArray(window.DEVICES)) {
|
||||
console.error('DEVICES array not found or invalid.');
|
||||
return null;
|
||||
}
|
||||
return window.DEVICES.find(device => device.ip === ip);
|
||||
}
|
||||
|
||||
// Helper: Update the original hidden input field's value
|
||||
function updateOriginalInput($originalInput, ip, number) {
|
||||
const cleanNumber = String(number).trim(); // Ensure number is a string and trimmed
|
||||
if (ip && cleanNumber) {
|
||||
$originalInput.val(ip + '/' + cleanNumber).trigger('change'); // Update and trigger change
|
||||
} else {
|
||||
$originalInput.val('').trigger('change'); // Clear if incomplete and trigger change
|
||||
}
|
||||
}
|
||||
|
||||
// --- Initialize for each device name input ---
|
||||
$('.device-name-input').each(function() {
|
||||
const $originalInput = $(this);
|
||||
const $td = $originalInput.closest('td'); // Get the parent cell for structure
|
||||
let initialValue = $originalInput.val().trim();
|
||||
|
||||
// Create wrapper for the Select2 component (Select + Number Input)
|
||||
// Hide it initially
|
||||
const $selectWrapper = $('<div class="device-select-wrapper" style="display: none; align-items: center; gap: 5px;"></div>');
|
||||
const $select = $('<select class="form-control device-select" style="flex-grow: 1; width: auto;"></select>'); // Let flexbox handle width
|
||||
const $numberInput = $('<input type="number" class="form-control device-number" placeholder="Nr." style="width: 70px; flex-grow: 0; flex-shrink: 0;">'); // Fixed width number input
|
||||
|
||||
// Populate Select options
|
||||
$select.append('<option value="">Gerät auswählen...</option>'); // Placeholder
|
||||
if (window.DEVICES && Array.isArray(window.DEVICES)) {
|
||||
window.DEVICES.forEach(device => {
|
||||
// Display name and IP for clarity in dropdown
|
||||
const displayText = `${device.name} (${device.ip})`;
|
||||
$select.append($('<option></option>').val(device.ip).text(displayText));
|
||||
});
|
||||
} else {
|
||||
console.warn("DEVICES array is missing or invalid for row:", $originalInput.attr('form'));
|
||||
// Optionally add a disabled option indicating an error
|
||||
$select.append('<option value="" disabled>Device list error</option>');
|
||||
}
|
||||
|
||||
|
||||
$selectWrapper.append($select).append($numberInput);
|
||||
$td.append($selectWrapper); // Add the hidden wrapper to the cell
|
||||
|
||||
// Function to show Select2 component and hide original input
|
||||
function showSelectComponent(ip, number) {
|
||||
$originalInput.hide();
|
||||
$select.val(ip || '').trigger('change.select2'); // Set value and update Select2 display
|
||||
$numberInput.val(number || '');
|
||||
$selectWrapper.css('display', 'flex'); // Use flex to show side-by-side
|
||||
}
|
||||
|
||||
// Function to show original input and hide Select2 component
|
||||
function showOriginalInput() {
|
||||
$selectWrapper.hide();
|
||||
$originalInput.show();
|
||||
}
|
||||
|
||||
// Initial state determination
|
||||
const match = initialValue.match(ipNumRegex);
|
||||
if (match) {
|
||||
const initialIp = match[1];
|
||||
const initialNumber = match[2];
|
||||
const foundDevice = findDeviceByIp(initialIp);
|
||||
if (foundDevice) {
|
||||
// Valid format and known device -> Show Select2 component
|
||||
showSelectComponent(initialIp, initialNumber);
|
||||
} else {
|
||||
// Valid format but unknown device -> Show original input
|
||||
showOriginalInput();
|
||||
}
|
||||
} else if (!initialValue) {
|
||||
// Empty -> Show Select2 component (empty)
|
||||
showSelectComponent(null, null);
|
||||
} else {
|
||||
// Invalid format -> Show original input
|
||||
showOriginalInput();
|
||||
}
|
||||
|
||||
// Initialize Select2 *after* adding options and inserting into DOM
|
||||
$select.select2({
|
||||
width: 'style', // Adjust width based on container
|
||||
// dropdownParent: $td // Optional: Attach dropdown to cell if needed for positioning
|
||||
});
|
||||
|
||||
// --- Event Listeners ---
|
||||
|
||||
// Update original input when Select2 or number changes
|
||||
$select.on('change', function() {
|
||||
const selectedIp = $(this).val();
|
||||
const currentNumber = $numberInput.val();
|
||||
updateOriginalInput($originalInput, selectedIp, currentNumber);
|
||||
});
|
||||
|
||||
$numberInput.on('input change', function() { // Use 'input change' for better responsiveness
|
||||
const currentIp = $select.val();
|
||||
const selectedNumber = $(this).val();
|
||||
updateOriginalInput($originalInput, currentIp, selectedNumber);
|
||||
});
|
||||
|
||||
// Check original input on change/blur to potentially switch view
|
||||
$originalInput.on('change blur', function() {
|
||||
const currentValue = $(this).val().trim();
|
||||
const currentMatch = currentValue.match(ipNumRegex);
|
||||
if (currentMatch) {
|
||||
const currentIp = currentMatch[1];
|
||||
const currentNumber = currentMatch[2];
|
||||
const device = findDeviceByIp(currentIp);
|
||||
if (device) {
|
||||
// Switched to valid/known format -> Show Select2
|
||||
showSelectComponent(currentIp, currentNumber);
|
||||
}
|
||||
// else: Keep showing original input (valid format, but unknown device)
|
||||
}
|
||||
// else: Keep showing original input (invalid format)
|
||||
});
|
||||
|
||||
}); // End .each loop
|
||||
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
<?php include(realpath(dirname(__FILE__)."/../../$mfLayoutPackage")."/footer.php"); ?>
|
||||
@@ -74,7 +74,7 @@
|
||||
<?php if(array_key_exists("status_id", $filter)): ?>
|
||||
<?=($filter['status_id'] == $status->id) ? "selected='selected'" : ""?>
|
||||
<?php else: ?>
|
||||
<?=($status->id == 3) ? "selected='selected'" : ""?>
|
||||
<?=(!in_array($me->id, ["145","62","56"]) && $status->id == 3) ? "selected='selected'" : ""?>
|
||||
<?php endif; ?>
|
||||
>
|
||||
<?=$status->code?> - <?=__($status->name."-b")?></option>
|
||||
@@ -91,6 +91,15 @@
|
||||
<label class="form-label" for="filter_street">Straße</label>
|
||||
<input type="text" class="form-control" name="filter[street]" id="filter_street" value="<?=$filter['street']?>" />
|
||||
</div>
|
||||
|
||||
<div class="col-2">
|
||||
<label class="form-label" for="filter_pipework_enabled">Baufreigabe</label>
|
||||
<select name="filter[pipework_enabled]" id="filter_pipework_enabled" class="form-control">
|
||||
<option value="">Alle</option>
|
||||
<option value="1" <?=(array_key_exists("pipework_enabled", $filter) && $filter["pipework_enabled"] == "1") ? "selected='selected'" : ""?>>Ja</option>
|
||||
<option value="0" <?=(array_key_exists("pipework_enabled", $filter) && $filter["pipework_enabled"] == "0") ? "selected='selected'" : ""?>>Nein</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
@@ -99,7 +108,10 @@
|
||||
<div class="row mt-2">
|
||||
<div>
|
||||
<button type="submit" class="btn btn-primary">Filter anwenden</button>
|
||||
<a class="btn btn-secondary" href="<?=self::getUrl("Pipework")?>">Filter zurücksetzen</a>
|
||||
<a class="btn btn-secondary" href="<?=self::getUrl("Pipework")?>">Filter zurücksetzen</a>
|
||||
<?php if ($me->is(["Admin"])) :?>
|
||||
<a class="btn btn-outline-secondary" href="<?=self::getUrl("Pipework", "History")?>">Zur Historie</a>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div style="width: 512px;">
|
||||
<div class="row">
|
||||
|
||||
@@ -322,8 +322,8 @@ $pagination_entity_name = "Vorbestellungen";
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12 col-md-2">
|
||||
<label class="form-label" for="filter_rimo_workorder">Rimo Workorder Status</label>
|
||||
<div class="col-sm-12 col-md-1">
|
||||
<label class="form-label" for="filter_rimo_workorder">Workorder Status</label>
|
||||
<select name="filter[rimo_workorder_status][]" id="filter_rimo_workorder_status" multiple class="form-control">
|
||||
<option value="Clarify" <?=(isset($filter) && array_key_exists("rimo_workorder_status", $filter) && is_array($filter['rimo_workorder_status']) && in_array("Clarify", $filter['rimo_workorder_status'])) ? "selected='selected'" : ""?>>Clarify</option>
|
||||
<option value="Accepted" <?=(isset($filter) && array_key_exists("rimo_workorder_status", $filter) && is_array($filter['rimo_workorder_status'])&& in_array("Accepted", $filter['rimo_workorder_status'])) ? "selected='selected'" : ""?>>Accepted</option>
|
||||
@@ -335,6 +335,13 @@ $pagination_entity_name = "Vorbestellungen";
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12 col-md-1">
|
||||
<label class="form-label" for="filter_fcp">FCP</label>
|
||||
<select name="filter[fcp][]" id="filter_fcp" multiple class="form-control">
|
||||
<option value="">Kein FCP gefunden</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-12 col-md-2">
|
||||
<label class="form-label" for="filter_rimo_workorder_team_id">Rimo Workorder Assigned Team</label>
|
||||
<select name="filter[rimo_workorder_team_id]" id="filter_rimo_workorder_team_id" class="form-control">
|
||||
@@ -848,6 +855,8 @@ $pagination_entity_name = "Vorbestellungen";
|
||||
|
||||
});
|
||||
|
||||
//fetch fcps and show on map
|
||||
getFCPs(preorderMap);
|
||||
|
||||
// calculate center position
|
||||
mapCenterPos = GetCenterFromDegrees(all_coords);
|
||||
@@ -856,6 +865,23 @@ $pagination_entity_name = "Vorbestellungen";
|
||||
return true;
|
||||
}
|
||||
|
||||
async function getFCPs(map) {
|
||||
var fcp = await $.get("<?=self::getUrl("Preorder", "Api")?>", {
|
||||
do: "getFCPsForCampaign",
|
||||
campaign_id: "<?=$campaign->id?>"
|
||||
});
|
||||
|
||||
if(fcp.status == "OK") {
|
||||
fcp.result.forEach((fcp) => {
|
||||
var icon = L.MakiMarkers.icon({icon: "viewpoint", color: "yellow", size: "m"});
|
||||
var marker = L.marker([fcp.lat, fcp.lng], {icon: icon}).addTo(map);
|
||||
var google_maps_link = "https://www.google.com/maps/search/?api=1&query=" + fcp.lat + "," + fcp.lng;
|
||||
var popup_content = "<a href='" + google_maps_link + "' target='_blank'>Google Maps</a><br />" + fcp.text;
|
||||
marker.bindPopup(popup_content);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function centerMap() {
|
||||
preorderMap.setView(mapCenterPos, 12);
|
||||
}
|
||||
@@ -1483,4 +1509,45 @@ $pagination_entity_name = "Vorbestellungen";
|
||||
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
const fcpSelect = $("#filter_fcp");
|
||||
const campaignSelect = $("#filter_preordercampaign_id");
|
||||
const apiUrl = "<?=self::getUrl("Preorder", "Api")?>";
|
||||
|
||||
fcpSelect.select2({ data: [], placeholder: "Bitte Kampagne auswählen", allowClear: true });
|
||||
|
||||
campaignSelect.on("change", function() {
|
||||
const campaign_id = $(this).val();
|
||||
if (!campaign_id) {
|
||||
fcpSelect.empty().select2({ data: [], placeholder: "Bitte Kampagne auswählen", allowClear: true });
|
||||
return;
|
||||
}
|
||||
$.get(apiUrl, { do: "getFCPsForCampaign", campaign_id: campaign_id }, (success) => {
|
||||
let fcpData = [];
|
||||
let opts = { data: [], placeholder: "Bitte Kampagne auswählen", allowClear: true };
|
||||
if (success?.status === "OK" && Array.isArray(success.result)) {
|
||||
fcpData = success.result;
|
||||
fcpData.unshift({ id: "", text: "" });
|
||||
fcpData.sort((a, b) => {
|
||||
const aN = a.text.replace(/\D/g, ""), bN = b.text.replace(/\D/g, "");
|
||||
return aN && bN ? parseInt(aN, 10) - parseInt(bN, 10) : a.text.localeCompare(b.text);
|
||||
});
|
||||
opts = { data: fcpData, placeholder: "", allowClear: true };
|
||||
fcpSelect.empty().select2(opts);
|
||||
const searchParams = new URLSearchParams(window.location.search);
|
||||
const fcpValues = searchParams.getAll("filter[fcp][]");
|
||||
if (fcpValues && fcpValues.length > 0) {
|
||||
fcpSelect.val(fcpValues).trigger("change");
|
||||
}
|
||||
} else {
|
||||
fcpSelect.empty().select2(opts);
|
||||
}
|
||||
}, "json").fail(() => {
|
||||
fcpSelect.empty().select2({ data: [], placeholder: "Fehler", allowClear: true });
|
||||
});
|
||||
});
|
||||
campaignSelect.trigger("change");
|
||||
});
|
||||
</script>
|
||||
<?php include(realpath(dirname(__FILE__)."/../../$mfLayoutPackage")."/footer.php"); ?>
|
||||
@@ -12,6 +12,7 @@ if(!$no_filename) {
|
||||
$status_flags_header = [];
|
||||
foreach(PreorderStatusflagModel::getAll() as $sflag) {
|
||||
$status_flags_header[$sflag->code] = $sflag->code;
|
||||
$status_flags_header[$sflag->code . " Datum"] = $sflag->code . " Datum";
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -35,6 +36,16 @@ while($data = mysqli_fetch_object($res)):
|
||||
$statusflags = [];
|
||||
foreach($preorder->statusflags as $sflag) {
|
||||
$statusflags[$sflag->code] = $sflag->value->value ? 1 : 0;
|
||||
if($sflag->value->value) {
|
||||
$historyEntry = PreorderHistoryModel::getFirst([
|
||||
"preorder_id" => $preorder->id,
|
||||
"key" => "preorderstatusflag-".$sflag->id."-value",
|
||||
"new_value" => 1
|
||||
]);
|
||||
$statusflags[$sflag->code . " Datum"] = ($historyEntry) ? date("Y-m-d H:i:s", $historyEntry->create) : "";
|
||||
} else {
|
||||
$statusflags[$sflag->code . " Datum"] = "";
|
||||
}
|
||||
}
|
||||
|
||||
$discounts = [];
|
||||
|
||||
@@ -416,6 +416,33 @@
|
||||
<td class="text-monospace"><?=$preorder->adb_wohneinheit->ftu_data["id"]?>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3>FCP</h3>
|
||||
<?php
|
||||
if($preorder->fcp): ?>
|
||||
<table class="table table-sm table-striped">
|
||||
<tr>
|
||||
<th>FCP Name:</th>
|
||||
<td class="text-monospace"><?=$preorder->fcp->name?>
|
||||
</tr><tr>
|
||||
<th>FCP External ID:</th>
|
||||
<td class="text-monospace"><?=$preorder->fcp->rimo_id?>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>FCP Execution State:</th>
|
||||
<td class="text-monospace"><?=$preorder->fcp->rimo_ex_state?>
|
||||
</tr><tr>
|
||||
<th>FCP Operational State:</th>
|
||||
<td class="text-monospace"><?=($preorder->fcp->rimo_op_state != "Undefined") ? $preorder->fcp->rimo_op_state : ""?>
|
||||
</tr><tr>
|
||||
<th>FCP Building Type:</th>
|
||||
<td class="text-monospace"><?=$preorder->fcp->building_type?>
|
||||
</tr>
|
||||
</table>
|
||||
<?php else: ?>
|
||||
<p>Kein FCP zugewiesen</p>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -73,6 +73,10 @@
|
||||
<?php else: ?>
|
||||
<a class="btn btn-secondary" href="<?=self::getUrl("Preorderlogistics")?>">Filter zurücksetzen</a>
|
||||
<?php endif; ?>
|
||||
|
||||
<button id="printAllInView" type="button" class="btn btn-success">Alle in der Liste drucken</button>
|
||||
<button id="csvExportAddressesAndMarkAsSent" type="button" class="btn btn-success">CSV Export für Versand</button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@@ -106,7 +110,16 @@
|
||||
<th></th>
|
||||
</tr>
|
||||
<?php foreach($preorders as $preorder): ?>
|
||||
<tr class="preorder-list-tr" id="preorder-<?=$preorder->id?>">
|
||||
<tr class="preorder-list-tr" id="preorder-<?=$preorder->id?>"
|
||||
data-ucode="<?=$preorder->ucode?>"
|
||||
data-oaid="<?=$preorder->oaid?>"
|
||||
data-addr-name="<?=$preorder->company ? $preorder->company : $preorder->firstname." ".$preorder->lastname?>"
|
||||
data-addr-street="<?=$preorder->street?><?=($preorder->housenumber) ? " ".$preorder->housenumber : ""?>"
|
||||
data-addr-zip="<?=$preorder->zip?>"
|
||||
data-addr-city="<?=$preorder->city?>"
|
||||
data-phone="<?=$preorder->phone?>"
|
||||
data-email="<?=$preorder->email?>"
|
||||
>
|
||||
<td class="text-right align-middle"><button type="button" class="btn btn-sm btn-success font-weight-bold" onclick="printShippingSlip(<?=$preorder->id?>)"><i class="fas fa-fw fa-print"></i> DRUCKEN</button> </td>
|
||||
<td class="text-center align-middle">
|
||||
<label>Versandt <i class="fas fa-check text-success hidden" id="sent-label-<?=$preorder->id?>"></i>
|
||||
@@ -197,4 +210,108 @@
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
function printAllInView() {
|
||||
console.log("printAllInView");
|
||||
$("#printAllInView").html('<i class="fas fa-spinner fa-spin"></i> Bitte warten...');
|
||||
$("#printAllInView").prop("disabled", true);
|
||||
|
||||
var preorderIds = [];
|
||||
$(".preorder-list-tr").each(function() {
|
||||
var id = $(this).attr("id").replace("preorder-", "");
|
||||
preorderIds.push(id);
|
||||
});
|
||||
|
||||
var printUrls = preorderIds.map(function(id) {
|
||||
return "<?=self::getUrl("Preorderlogistics", "print")?>?id=" + id;
|
||||
});
|
||||
|
||||
var printWindows = [];
|
||||
var loadedCount = 0;
|
||||
var combinedHtml = "";
|
||||
|
||||
function loadAndCombine(url, index) {
|
||||
$.get(url, function(html) {
|
||||
combinedHtml += html;
|
||||
loadedCount++;
|
||||
|
||||
if (loadedCount === printUrls.length) {
|
||||
var combinedWindow = window.open("", "_blank");
|
||||
combinedWindow.document.write(combinedHtml);
|
||||
combinedWindow.document.close();
|
||||
// sleep for 1 second to allow the window to load
|
||||
setTimeout(function() {
|
||||
combinedWindow.focus();
|
||||
combinedWindow.print();
|
||||
}, 1000);
|
||||
|
||||
$("#printAllInView").html('Alle in der Liste drucken');
|
||||
$("#printAllInView").prop("disabled", false);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
printUrls.forEach(loadAndCombine);
|
||||
}
|
||||
$("#printAllInView").on("click", printAllInView);
|
||||
|
||||
async function csvExportAddressesAndMarkAsSent(){
|
||||
//show confirmation dialog to the user browser api
|
||||
if(!confirm("Möchten Sie die Adressen als CSV exportieren und als versendet markieren?")) {
|
||||
return;
|
||||
}
|
||||
|
||||
$("#csvExportAddressesAndMarkAsSent").html('<i class="fas fa-spinner fa-spin"></i> Bitte warten...');
|
||||
|
||||
// show a confirmation dialog to the user
|
||||
// use .preorder-list-tr and data-ucode, data-oaid, data-addr-name, data-addr-street, data-addr-zip, data-addr-city to export to csv
|
||||
// after exporting mark as sent for each preorder
|
||||
var preorderIds = [];
|
||||
$(".preorder-list-tr").each(function() {
|
||||
var id = $(this).attr("id").replace("preorder-", "");
|
||||
preorderIds.push(id);
|
||||
});
|
||||
|
||||
var csvData = "ucode,oaid,addr_name,addr_street,addr_zip,addr_city,phone,email\n";
|
||||
$(".preorder-list-tr").each(function() {
|
||||
var ucode = $(this).data("ucode");
|
||||
var oaid = $(this).data("oaid");
|
||||
var addr_name = $(this).data("addr-name");
|
||||
var addr_street = $(this).data("addr-street");
|
||||
var addr_zip = $(this).data("addr-zip");
|
||||
var addr_city = $(this).data("addr-city");
|
||||
var phone = $(this).data("phone");
|
||||
var email = $(this).data("email");
|
||||
|
||||
csvData += ucode + "," + oaid + "," + addr_name + "," + addr_street + "," + addr_zip + "," + addr_city + "," + phone + "," + email + "\n";
|
||||
});
|
||||
|
||||
// create a blob from the csv data
|
||||
var blob = new Blob([csvData], { type: "text/csv;charset=utf-8;" });
|
||||
var link = document.createElement("a");
|
||||
link.href = URL.createObjectURL(blob);
|
||||
link.setAttribute("download", "addresses.csv");
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
document.body.removeChild(link);
|
||||
// mark all as sent
|
||||
|
||||
for (const preorderId of preorderIds) {
|
||||
await $.post("<?=self::getUrl("Preorderlogistics", "Api")?>", {
|
||||
do: "saveSent",
|
||||
id: preorderId,
|
||||
sent: 1
|
||||
});
|
||||
|
||||
$("#sent-label-" + preorderId).show();
|
||||
$("#sent-" + preorderId).prop("checked", true);
|
||||
}
|
||||
|
||||
window.notify('success', 'Adressen als CSV exportiert und als versendet markiert');
|
||||
$("#csvExportAddressesAndMarkAsSent").html('CSV Export für Versand');
|
||||
}
|
||||
$("#csvExportAddressesAndMarkAsSent").on("click", csvExportAddressesAndMarkAsSent);
|
||||
|
||||
</script>
|
||||
|
||||
<?php include(realpath(dirname(__FILE__)."/../../$mfLayoutPackage")."/footer.php"); ?>
|
||||
|
||||
@@ -17,17 +17,18 @@
|
||||
<style>
|
||||
body {
|
||||
margin-top: 0;
|
||||
padding-top: 20pt;
|
||||
font-family: "Calibri", "Open Sans", "Dejavu Sans", dejavusans, sans-serif;
|
||||
font-size: 12pt;
|
||||
font-size: 11pt;
|
||||
}
|
||||
.container {
|
||||
padding-top: 20pt;
|
||||
margin-left: 64pt;
|
||||
margin-right: 64pt;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div>
|
||||
<div class="container">
|
||||
<div style="text-align: right;">
|
||||
<img src="<?=self::getResourcePath()?>assets/images/rml-logo-header.png" style="height:80pt;" />
|
||||
@@ -42,8 +43,9 @@
|
||||
<?php endif; ?>
|
||||
<?php if($preorder->lastname): ?>
|
||||
<?=$preorder->firstname?> <?=$preorder->lastname?><br />
|
||||
|
||||
<?php endif; ?>
|
||||
<?=$preorder->street?><br />
|
||||
<?=$preorder->street?> <?=$preorder->housenumber?><br />
|
||||
<?=$preorder->zip?> <?=$preorder->city?>
|
||||
</p>
|
||||
<p style="text-align: right; padding-top: 4pt;">Liezen, <?=date("d.m.Y")?></p>
|
||||
@@ -98,11 +100,10 @@
|
||||
<div>
|
||||
<p style="font-size: 8pt">PS: Für die Region, bleibt in der Region, gehört der Region. Dieser Mehrwert zeichnet unsere regionale Glasfaser-Offensive in den 29 Gemeinden des Bezirks Liezen aus. Sie sind mit Ihrem Glasfaseranschluss jetzt ein Teil davon.</p>
|
||||
</div>
|
||||
<br><br>
|
||||
</div>
|
||||
|
||||
<img src="<?=self::getResourcePath()?>assets/images/rml-preorderlogistic-footer.png" style="width:100%;margin-top: 12pt;margin-left:4pt;margin-right:4pt" />
|
||||
</div>
|
||||
|
||||
<div style="position: absolute; bottom:0;">
|
||||
<img src="<?=self::getResourcePath()?>assets/images/rml-preorderlogistic-footer.png" style="width:100%;" />
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
||||
@@ -21,6 +21,7 @@ $additionalCSS = [
|
||||
...$additionalCSS,
|
||||
'plugins/daterangepicker/daterangepicker.css',
|
||||
'plugins/vue/tt-components/css/tt-table.css',
|
||||
'plugins/vue/tt-components/css/tt-tooltip.css',
|
||||
'plugins/vue/tt-components/css/tt-loader.css',
|
||||
'plugins/vue/tt-components/css/tt-position-manager.css',
|
||||
];
|
||||
|
||||
@@ -75,6 +75,11 @@
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if(isset($additionalHead) && is_array($additionalHead) && count($additionalHead)):
|
||||
foreach($additionalHead as $head): ?>
|
||||
<?=$head?>
|
||||
<?php endforeach; endif;?>
|
||||
|
||||
<?php if(MFAPPNAME == "devthetool"): ?>
|
||||
<style type="text/css">
|
||||
body {
|
||||
|
||||
@@ -141,17 +141,16 @@
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if($me->is(["Admin"]) || $me->can(["Cpeprovisioning", "Cpeshipping"])): ?>
|
||||
<li class="has-submenu mobile-hide">
|
||||
<li class="has-submenu">
|
||||
<a href="#">
|
||||
<i class="fad fa-fw fa-running"></i>Netzbetrieb <div class="arrow-down"></div>
|
||||
</a>
|
||||
<ul class="submenu">
|
||||
<?php if($me->isAdmin() || $me->can("Cpeprovisioning")): ?><li><a href="<?=self::getUrl("Cpeprovisioning")?>"><i class="fad fa-fw fa-hdd text-info"></i> CPE Provisioning</a></li><?php endif; ?>
|
||||
<?php if($me->isAdmin() || $me->can("Cpeshipping")): ?><li><a href="<?=self::getUrl("Cpeshipping")?>"><i class="fad fa-fw fa-shipping-fast text-info"></i> CPE Versand</a></li><?php endif; ?>
|
||||
<?php if($me->isAdmin() || $me->can("Cpeprovisioning")): ?><li class="mobile-hide"><a href="<?=self::getUrl("Cpeprovisioning")?>"><i class="fad fa-fw fa-hdd text-info"></i> CPE Provisioning</a></li><?php endif; ?>
|
||||
<?php if($me->isAdmin() || $me->can("Cpeshipping")): ?><li class="mobile-hide"><a href="<?=self::getUrl("Cpeshipping")?>"><i class="fad fa-fw fa-shipping-fast text-info"></i> CPE Versand</a></li><?php endif; ?>
|
||||
<?php if($me->isAdmin()) : ?><li><a href="<?=self::getUrl("Domain")?>"><i class="fad fa-fw fa-globe text-info"></i> Domains</a></li><?php endif; ?>
|
||||
<?php if($me->isAdmin()) : ?><li><a href="<?=self::getUrl("IpNetwork")?>"><i class="fa-solid fa-network-wired text-info"></i> IPAM</a></li><?php endif; ?>
|
||||
<?php if($me->isAdmin()) : ?><li><a href="<?=self::getUrl("DeviceMonitoring/congestion")?>"><i class="fa-solid fa-block-brick-fire text-info"></i> Device Congestion</a></li><?php endif; ?>
|
||||
<?php if($me->isAdmin()) : ?><li><a href="<?=self::getUrl("MaintenanceNotification")?>"><i class="fa-solid fa-envelope-badge text-info"></i> Wartungsmeldungen</a></li><?php endif; ?>
|
||||
<?php if($me->isAdmin()) : ?><li class="mobile-hide"><a href="<?=self::getUrl("MaintenanceNotification")?>"><i class="fa-solid fa-envelope-badge text-info"></i> Wartungsmeldungen</a></li><?php endif; ?>
|
||||
<?php if($me->isAdmin()) : ?><li><a href="<?=self::getUrl("Radius")?>"><i class="fas fa-broadcast-tower text-info"></i> Radius</a></li><?php endif; ?>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -169,9 +168,10 @@
|
||||
<ul class="submenu">
|
||||
<?php if($me->can("WarehouseAdmin") || $me->can("WarehouseUser")): ?><li class="has-sub-submenu font-weight-bold"><a>XINON</a></li><?php endif; ?>
|
||||
<?php if($me->can("WarehouseAdmin") || $me->can("WarehouseUser")): ?><li><a href="<?=self::getUrl("WarehouseArticle")?>"><i class="far fa-fw fa-box text-info"></i> Artikel</a></li><?php endif; ?>
|
||||
<?php if($me->can("WarehouseAdmin")): ?><li><a href="<?=self::getUrl("WarehouseItem")?>"><i class="far fa-fw fa-boxes text-info"></i> Lagerbestand (WIP)</a></li><?php endif; ?>
|
||||
<?php if($me->can("WarehouseAdmin")): ?><li><a href="<?=self::getUrl("WarehouseOrderRecommendation")?>"><i class="far fa-fw fa-box-full text-info"></i> Bestellvorschläge (WIP)</a></li><?php endif; ?>
|
||||
<?php if($me->can("WarehouseAdmin")): ?><li><a href="<?=self::getUrl("WarehouseOrder")?>"><i class="far fa-fw fa-shopping-bag text-info"></i> Bestellungen (WIP)</a></li><?php endif; ?>
|
||||
<!-- --><?php //if($me->can("WarehouseAdmin")): ?><!--<li><a href="--><?php //=self::getUrl("WarehouseItem")?><!--"><i class="far fa-fw fa-boxes text-info"></i> Lagerbestand (WIP)</a></li>--><?php //endif; ?>
|
||||
<!-- --><?php //if($me->can("WarehouseAdmin")): ?><!--<li><a href="--><?php //=self::getUrl("WarehouseOrderRecommendation")?><!--"><i class="far fa-fw fa-box-full text-info"></i> Bestellvorschläge (WIP)</a></li>--><?php //endif; ?>
|
||||
<?php if($me->can("WarehouseAdmin")): ?><li><a href="<?=self::getUrl("WarehouseOrder")?>"><i class="far fa-fw fa-shopping-bag text-info"></i> Bestellungen</a></li><?php endif; ?>
|
||||
<?php if($me->can("WarehouseAdmin")): ?><li><a href="<?=self::getUrl("WarehouseOffer")?>"><i class="far fa-fw fa-file-signature text-info"></i> Angebote</a></li><?php endif; ?>
|
||||
<?php if($me->can("WarehouseAdmin") || $me->can("WarehouseUser")): ?><li><a href="<?=self::getUrl("WarehouseOrderRequest")?>"><i class="far fa-fw fa-shopping-cart text-info"></i> Bestellwünsche</a></li><?php endif; ?>
|
||||
<?php if($me->can("WarehouseAdmin") || $me->can("WarehouseUser")): ?><li><a href="<?=self::getUrl("WarehouseShippingNote")?>"><i class="far fa-fw fa-shipping-fast text-info"></i> Lieferscheine</a></li><?php endif; ?>
|
||||
|
||||
|
||||
@@ -50,13 +50,21 @@
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if(MFAPPNAME == "devthetool"): ?>
|
||||
<style type="text/css">
|
||||
<?php if(isset($additionalHead) && is_array($additionalHead) && count($additionalHead)):
|
||||
foreach($additionalHead as $head): ?>
|
||||
<?=$head?>
|
||||
<?php endforeach; endif;?>
|
||||
|
||||
<style>
|
||||
<?php if(MFAPPNAME == "devthetool"): ?>
|
||||
body {
|
||||
border-left: 8px dashed #f672a7;
|
||||
}
|
||||
<?php endif; ?>
|
||||
body {
|
||||
min-height: 100vh;
|
||||
}
|
||||
</style>
|
||||
<?php endif; ?>
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user