153 lines
5.2 KiB
JavaScript

document.addEventListener("DOMContentLoaded", () => {
const form = document.getElementById("invoiceForm");
const invoiceItems = document.getElementById("invoiceItems");
const addItemButton = document.getElementById("addItemButton");
// Initialiser avec une ligne de facturation par défaut
addInvoiceItem();
// Ajouter une ligne de facturation lorsqu'on clique sur le bouton
addItemButton.addEventListener("click", addInvoiceItem);
// Fonction pour créer une nouvelle ligne de facturation
function addInvoiceItem(description = "", amount = "") {
const itemId = Date.now(); // ID unique pour l'élément
const itemDiv = document.createElement("div");
itemDiv.className = "invoice-item grid grid-cols-5 gap-2";
itemDiv.dataset.id = itemId;
itemDiv.innerHTML = `
<div class="col-span-3">
<input type="text" name="item_description_${itemId}" placeholder="Description" value="${description}"
class="w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500">
</div>
<div class="col-span-1">
<input type="number" step="0.01" name="item_amount_${itemId}" placeholder="Montant" value="${amount}"
class="w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500">
</div>
<div class="col-span-1">
<button type="button" class="delete-item text-red-500 hover:text-red-700" data-id="${itemId}">
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
`;
// Ajouter un gestionnaire d'événements pour supprimer la ligne
const deleteButton = itemDiv.querySelector(".delete-item");
deleteButton.addEventListener("click", function () {
const id = this.getAttribute("data-id");
deleteInvoiceItem(id);
});
invoiceItems.appendChild(itemDiv);
}
// Fonction pour supprimer une ligne de facturation
function deleteInvoiceItem(id) {
const item = document.querySelector(`.invoice-item[data-id="${id}"]`);
if (item) {
item.remove();
}
// S'assurer qu'il reste au moins une ligne
if (invoiceItems.children.length === 0) {
addInvoiceItem();
}
}
// Fonction pour collecter toutes les lignes de facturation
function collectInvoiceItems() {
const items = [];
document.querySelectorAll(".invoice-item").forEach((item) => {
const id = item.dataset.id;
const description = item.querySelector(
`[name="item_description_${id}"]`
).value;
const amount = item.querySelector(`[name="item_amount_${id}"]`).value;
if (description && amount) {
items.push({ description, amount });
}
});
return items;
}
// Fonction pour valider le formulaire
function validateForm() {
const requiredFields = [
form.invoice_number,
form.amount,
form.recipient_name,
form.recipient_address,
form.recipient_postal_code,
form.recipient_town,
form.recipient_country,
];
for (const field of requiredFields) {
if (!field.value) {
showMessage(`Le champ ${field.name} est requis`, "error");
field.focus();
return false;
}
}
const items = collectInvoiceItems();
if (items.length === 0) {
showMessage("Ajoutez au moins une ligne de facturation", "error");
return false;
}
return true;
}
// Fonction pour afficher les messages
function showMessage(message, type = "success") {
const messageDiv = document.createElement("div");
messageDiv.className = `${type}-message fixed top-4 right-4 p-4 rounded-md shadow-lg ${
type === "success" ? "bg-green-500" : "bg-red-500"
} text-white`;
messageDiv.textContent = message;
document.body.appendChild(messageDiv);
// Afficher le message
setTimeout(() => messageDiv.classList.add("opacity-100"), 100);
// Supprimer le message après 3 secondes
setTimeout(() => {
messageDiv.classList.remove("opacity-100");
setTimeout(() => messageDiv.remove(), 300);
}, 3000);
}
// Gestionnaire de soumission du formulaire
form.addEventListener("submit", function (e) {
e.preventDefault();
if (!validateForm()) {
return;
}
// Récupérer les données du formulaire
const formData = {
language: form.language.value,
invoice_number: form.invoice_number.value,
amount: form.amount.value, // Montant total
currency: form.currency.value,
recipient_name: form.recipient_name.value,
recipient_address: form.recipient_address.value,
recipient_postal_code: form.recipient_postal_code.value,
recipient_town: form.recipient_town.value,
recipient_country: form.recipient_country.value,
recipient_vat_number: form.recipient_vat_number.value || null,
items: collectInvoiceItems(), // Ajouter les lignes de facturation
};
// Rediriger vers la page de prévisualisation avec les données
const queryString = encodeURIComponent(JSON.stringify(formData));
window.location.href = `/preview?data=${queryString}`;
});
});