+
-
+ })
+ .fail(err => console.error("Failed to save sent status:", err));
+ }
-
+ function getPreorderDataFromDOM() {
+ const preorderData = [];
+ $(".preorder-list-tr").each(function () {
+ const row = $(this);
+ preorderData.push({
+ id: row.attr("id").replace("preorder-", ""),
+ ucode: row.data("ucode"),
+ oaid: row.data("oaid"),
+ name: `"${row.data("addr-name")}"`,
+ street: `"${row.data("addr-street")}"`,
+ zip: row.data("addr-zip"),
+ city: `"${row.data("addr-city")}"`,
+ phone: row.data("phone"),
+ email: row.data("email")
+ });
+ });
+ return preorderData;
+ }
+
+ function generateCsv(preorderData) {
+ const headers = "ucode,oaid,addr_name,addr_street,addr_zip,addr_city,phone,email\n";
+ const rows = preorderData.map(d => `${d.ucode},${d.oaid},${d.name},${d.street},${d.zip},${d.city},${d.phone},${d.email}`);
+ return headers + rows.join("\n");
+ }
+
+ function downloadCsv(csvContent, filename = "addresses.csv") {
+ const blob = new Blob([csvContent], {type: "text/csv;charset=utf-8;"});
+ const link = document.createElement("a");
+ link.href = URL.createObjectURL(blob);
+ link.setAttribute("download", filename);
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+ }
+
+ async function printAllInView() {
+ const btn = $("#printAllInView");
+ btn.html('
Bitte warten...').prop("disabled", true);
+
+ const printUrls = $(".preorder-list-tr").map((_, el) => `= self::getUrl("Preorderlogistics", "print") ?>?id=${el.id.replace("preorder-", "")}`).get();
+ const requests = printUrls.map(url => $.get(url));
+
+ try {
+ const responses = await Promise.all(requests);
+ const combinedHtml = responses.join('
');
+ const combinedWindow = window.open("", "_blank");
+ combinedWindow.document.write(combinedHtml);
+ combinedWindow.document.close();
+ setTimeout(() => {
+ combinedWindow.focus();
+ combinedWindow.print();
+ }, 500);
+ } catch (error) {
+ console.error("Failed to fetch all documents for printing:", error);
+ } finally {
+ btn.html('Alle in der Liste drucken').prop("disabled", false);
+ }
+ }
+
+ function csvExportAddresses() {
+ const btn = $("#csvExportAddresses");
+ btn.html('
Bitte warten...').prop("disabled", true);
+ const preorders = getPreorderDataFromDOM();
+ const csvContent = generateCsv(preorders);
+ downloadCsv(csvContent);
+ btn.html('CSV Export für Versand').prop("disabled", false);
+ window.notify?.('success', 'Adressen als CSV exportiert');
+ }
+
+ async function csvExportAddressesAndMarkAsSent() {
+ if (!confirm("Möchten Sie die Adressen als CSV exportieren und alle als versendet markieren?")) return;
+ const btn = $("#csvExportAddressesAndMarkAsSent");
+ btn.html('
Bitte warten...').prop("disabled", true);
+
+ const preorders = getPreorderDataFromDOM();
+ const csvContent = generateCsv(preorders);
+ downloadCsv(csvContent);
+
+ const markAsSentPromises = preorders.map(p =>
+ $.post("= self::getUrl("Preorderlogistics", "Api") ?>", {do: "saveSent", id: p.id, sent: 1})
+ .done(() => {
+ $(`#sent-label-${p.id}`).show();
+ $(`#sent-${p.id}`).prop("checked", true);
+ })
+ );
+
+ try {
+ await Promise.all(markAsSentPromises);
+ window.notify?.('success', 'Adressen als CSV exportiert und als versendet markiert');
+ } catch (error) {
+ console.error("Failed to mark all orders as sent:", error);
+ window.notify?.('error', 'Fehler beim Markieren der Bestellungen');
+ } finally {
+ btn.html('CSV Export & als versendet markieren').prop("disabled", false);
+ }
+ }
+
+ $(document).ready(function () {
+ $("#printAllInView").on("click", printAllInView);
+ $("#csvExportAddresses").on("click", csvExportAddresses);
+ $("#csvExportAddressesAndMarkAsSent").on("click", csvExportAddressesAndMarkAsSent);
+
+ const fcpSelect = $("#filter_fcp");
+ const campaignSelect = $("#filter_preordercampaign_id");
+ const apiUrl = "= self::getUrl("Preorder", "Api") ?>";
+ const baseSelect2Options = {placeholder: "Bitte Kampagne auswählen", allowClear: true};
+
+ fcpSelect.select2({data: [], ...baseSelect2Options});
+
+ campaignSelect.on("change", function () {
+ const campaign_id = $(this).val();
+ if (!campaign_id) {
+ fcpSelect.empty().select2({data: [], ...baseSelect2Options});
+ return;
+ }
+
+ $.get(apiUrl, {do: "getFCPsForCampaign", campaign_id})
+ .done(response => {
+ let fcpData = [];
+ if (response?.status === "OK" && Array.isArray(response.result)) {
+ fcpData = response.result;
+ fcpData.unshift({id: "", text: ""});
+ fcpData.sort((a, b) => {
+ const aNum = parseInt(a.text.replace(/\D/g, ''), 10);
+ const bNum = parseInt(b.text.replace(/\D/g, ''), 10);
+ return !isNaN(aNum) && !isNaN(bNum) ? aNum - bNum : a.text.localeCompare(b.text);
+ });
+ }
+ fcpSelect.empty().select2({
+ data: fcpData,
+ placeholder: fcpData.length > 1 ? "FCP auswählen" : "Keine FCPs gefunden",
+ allowClear: true
+ });
+
+ const fcpValues = new URLSearchParams(window.location.search).getAll("filter[fcp][]");
+ if (fcpValues.length > 0) fcpSelect.val(fcpValues).trigger("change");
+ })
+ .fail(() => fcpSelect.empty().select2({data: [], placeholder: "Fehler beim Laden", allowClear: true}));
+ }).trigger("change");
+ });
+
+
+
\ No newline at end of file