diff --git a/docker/schema_family.sql b/docker/schema_family.sql index ef57872..a38758a 100644 --- a/docker/schema_family.sql +++ b/docker/schema_family.sql @@ -355,6 +355,17 @@ CREATE TABLE IF NOT EXISTS pf_holidays_ideas ( notes TEXT DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +CREATE TABLE IF NOT EXISTS `pf_holidays_attachments` ( + `id` INT NOT NULL AUTO_INCREMENT, + `holiday_id` INT NOT NULL, + `item_id` INT DEFAULT NULL, + `file_name` VARCHAR(255) NOT NULL, + `file_path` VARCHAR(255) NOT NULL, + `uploaded_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + CONSTRAINT `fk_holiday_attachment` FOREIGN KEY (`holiday_id`) REFERENCES `pf_holidays`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + CREATE TABLE IF NOT EXISTS pf_geocode_cache ( q_hash CHAR(64) PRIMARY KEY, q VARCHAR(255), diff --git a/migrate-voyages.php b/migrate-voyages.php deleted file mode 100644 index 90b7fd6..0000000 --- a/migrate-voyages.php +++ /dev/null @@ -1,38 +0,0 @@ -🗺️ Migration : Ajout du Véhicule aux Voyages
⏳ Chargement des documents...
'; + + const holidayId = document.querySelector('input[name="holiday_id"]').value; + + // 🔥 On va chercher les documents existants ! + fetch( + `/modules/holidays/includes/api/get_attachments.php?holiday_id=${holidayId}&item_id=${sortOrder}`, + ) + .then((response) => response.json()) + .then((data) => { + listContainer.innerHTML = ""; // On vide le message de chargement + + if (data.success && data.files.length > 0) { + data.files.forEach((f) => { + // On rend le nom du fichier cliquable pour ouvrir le document dans un nouvel onglet + const docHtml = ` +Aucun document pour cette étape.
'; + } + }) + .catch(() => { + listContainer.innerHTML = + 'Erreur lors du chargement.
'; + }); +} + +function closeDocsModal() { + document.getElementById("docsModal").style.display = "none"; + document.body.classList.remove("no-scroll"); +} + +function handleFileUpload(input) { + // 1. LE VERROU : Si un envoi est déjà en cours, on bloque tout ! + if (window.isUploadingDocs) return; + + if (!input.files || input.files.length === 0) return; + + // On ferme le verrou + window.isUploadingDocs = true; + + const file = input.files[0]; + const holidayId = document.querySelector('input[name="holiday_id"]').value; + const statusDiv = document.getElementById("uploadStatus"); + const listContainer = document.getElementById("docsListContainer"); + + if (file.size > 5 * 1024 * 1024) { + statusDiv.innerHTML = + "Fichier trop lourd (Max 5Mo)."; + input.value = ""; + window.isUploadingDocs = false; // On rouvre le verrou + return; + } + + statusDiv.innerHTML = + "⏳ Envoi en cours..."; + + const fd = new FormData(); + fd.append("holiday_id", holidayId); + fd.append("item_id", window.currentDocsStepId); + fd.append("file", file); + + fetch("/modules/holidays/includes/api/upload_attachment.php", { + method: "POST", + body: fd, + }) + .then((response) => response.json()) + .then((data) => { + if (data.success) { + statusDiv.innerHTML = `✅ Sauvegardé !`; + + const emptyMsg = listContainer.querySelector("p"); + if (emptyMsg) emptyMsg.remove(); + + const docHtml = ` +Aucun document pour cette étape.
'; + } + } else { + alert("Erreur : " + data.error); + row.style.opacity = "1"; + } + }) + .catch(() => { + alert("Erreur réseau lors de la suppression."); + row.style.opacity = "1"; + }); +} + +// ============================================================================ +// GÉNÉRATION DU CARNET DE VOYAGE (PDF Côté Client) - VERSION TEXTE BRUT +// ============================================================================ +window.generateTravelBook = function () { + const element = document.getElementById("travelBookTemplate"); + const btn = document.querySelector('button[onclick="generateTravelBook()"]'); + + if (!element) { + alert("Erreur : Le modèle de carnet de voyage est introuvable."); + return; + } + + const originalText = btn.innerHTML; + btn.innerHTML = "⏳ Génération..."; + btn.disabled = true; + + // Options ajustées avec un fond blanc forcé + const opt = { + margin: 10, // 10mm de marge + filename: "Carnet_de_Route.pdf", + image: { type: "jpeg", quality: 0.98 }, + html2canvas: { scale: 2, useCORS: true, backgroundColor: "#ffffff" }, + jsPDF: { unit: "mm", format: "a4", orientation: "portrait" }, + }; + + // 🔥 L'ASTUCE MAGIQUE : + // On extrait le HTML en texte brut et on l'encapsule dans un bloc 100% blanc. + // Plus aucun conflit possible avec l'affichage de ta page web ! + const htmlString = ` +