Files
thetool/Layout/default/Preorderlogistics/Index.php
2025-08-13 14:20:03 +02:00

375 lines
16 KiB
PHP

<?php
$pagination_baseurl = $this->getUrl($Mod,"Index");
$pagination_baseurl_params = ["filter" => $filter];
$pagination_entity_name = "Bestellungen";
?>
<?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"><a href="<?=self::getUrl("Preordercampaign")?>">Vorbestellkampagnen</a></li>
<li class="breadcrumb-item active">Vorbestellungen</li>
</ol>
</div>
<h4 class="page-title">Vorbestellungen<?=(isset($campaign) && $campaign) ? " - ".$campaign->name : ""?></h4>
</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("Preorderlogistics")?>">
<div class="row mt-2">
<div class="col-sm-12 col-md-2">
<label class="form-label" for="filter_preordercampaign_id">Kampagne</label>
<select name="filter[preordercampaign_id]" id="filter_preordercampaign_id" class="form-control">
<option value="">Alle</option>
<?php foreach($my_campaigns as $c): ?>
<option value="<?=$c->id?>" <?=(isset($campaign) && $c->id == $campaign->id) ? "selected='selected'" : ""?>><?=$c->name?></option>
<?php endforeach; ?>
</select>
</div>
<div class="col-1">
<label class="form-label" for="filter_ucode">Bestellcode</label>
<input type="text" class="form-control" name="filter[ucode]" id="filter_ucode" value="<?=$filter['ucode'] ?? ""?>" />
</div>
<div class="col-1">
<label class="form-label" for="filter_oaid">OAID</label>
<input type="text" class="form-control" name="filter[oaid]" id="filter_oaid" value="<?=$filter['oaid'] ?? ""?>" />
</div>
<div class="col-2">
<label class="form-label" for="filter_sent">Status</label>
<select name="filter[sent]" id="filter_sent" class="form-control">
<option value="no">Noch nicht versendet</option>
<option value="yes" <?=(is_array($filter) && array_key_exists("sent", $filter) && $filter['sent'] == "yes") ? "selected='selected'" : ""?>>Versendet</option>
</select>
</div>
<div class="col-2">
<label class="form-label" for="filter_address">Anschlussadresse</label>
<input type="text" class="form-control" name="filter[address]" id="filter_address" value="<?=$filter['address'] ?? ""?>" />
</div>
<div class="col-2">
<label class="form-label" for="filter_kunde">Kunde</label>
<input type="text" class="form-control" name="filter[kunde]" id="filter_kunde" value="<?=$filter['kunde'] ?? ""?>" />
</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>
<div class="row mt-2">
<div class="col">
<button type="submit" class="btn btn-primary">Filter anwenden</button>
<?php if(isset($campaign) && $campaign->id): ?>
<a class="btn btn-secondary" href="<?=self::getUrl("Preorderlogistics", "Index", ['filter' => ['preordercampaign_id' => $campaign->id], "resetFilter" => 1])?>">Filter zurücksetzen</a>
<?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>
</div>
</div>
<div class="card">
<div class="card-body mb-3">
<div class="row">
<div class="col-12">
<div class="float-left">
<h4 class="header-title">Bestellungen</h4>
</div>
</div>
</div>
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination.php"); ?>
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination-summary.php"); ?>
<table class="table table-striped table-hover">
<tr>
<th></th>
<th></th>
<th>Status</th>
<th>Versandadresse</th>
<th>OAID</th>
<th>Bestellcode</th>
<th></th>
</tr>
<?php foreach($preorders as $preorder): ?>
<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>
<input type="checkbox" class="form-control pointer" name="sent" value="1"
id="sent-<?=$preorder->id?>" <?=($preorder->logistics && $preorder->logistics->sent) ? "checked='checked'" : ""?>
onchange="saveSent(<?=$preorder->id?>)" />
</label>
</td>
<td><?=$preorder->status->code?></td>
<td>
<?php if($preorder->adb_hausnummer_id): ?>
<?php if($preorder->company): ?>
<?=$preorder->company?><br />
<?=($preorder->firstname) ? $preorder->firstname : ""?>
<?=($preorder->lastname) ? $preorder->lastname : ""?>
<?php else: ?>
<?=$preorder->firstname?> <?=$preorder->lastname?>
<?php endif; ?>
<br />
<?=$preorder->adb_hausnummer->strasse->name?>
<?=$preorder->adb_hausnummer->hausnummer?><br />
<?=($preorder->adb_wohneinheit_id && (string)$preorder->adb_wohneinheit) ? (string)$preorder->adb_wohneinheit."<br />" : ""?>
<?=$preorder->adb_hausnummer->plz->plz?>
<?=$preorder->adb_hausnummer->ortschaft->name?><br />
<?=$preorder->adb_hausnummer->strasse->gemeinde->name?>
<?php else: ?>
<?=($preorder->company) ? $preorder->company : $preorder->firstname." ".$preorder->lastname?><br />
<?=$preorder->street?><?=($preorder->housenumber) ? " ".$preorder->housenumber : ""?><br />
<?=$preorder->zip?> <?=$preorder->city?>
<?php endif; ?>
</td>
<td class="text-pink"><span><?=$preorder->oaid?></span></td>
<td><?=$preorder->ucode?></td>
<td style="text-align: left; letter-spacing: 4px; font-size: 1.1em;">
</td>
</tr>
<?php endforeach; ?>
</table>
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination-summary.php"); ?>
<?php include(realpath(dirname(__FILE__)."/../")."/tpl/pagination.php"); ?>
</div>
</div>
</div>
</div>
<script type="text/javascript">
function printShippingSlip(id) {
var w = window.open("<?=self::getUrl("Preorderlogistics", "print")?>?id=" + id, "_blank", "popup=yes");
w.print();
}
function saveSent(id) {
if(!id) return;
var checked = $("#sent-" + id).is(":checked");
console.log(checked);
if(checked) {
var sent = 1;
} else {
var sent = 0;
}
$.post("<?=self::getUrl("Preorderlogistics", "Api")?>", {
do: "saveSent",
id: id,
sent: sent
},
function(success) {
console.log(success);
if(success.status == "OK") {
if(checked) {
$("#sent-label-" + success.result.preorder_id).show();
} else {
$("#sent-label-" + success.result.preorder_id).hide();
}
}
},
"json"
);
}
</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);
$(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"); ?>