{"id":3511,"date":"2025-08-08T12:00:11","date_gmt":"2025-08-08T10:00:11","guid":{"rendered":"https:\/\/www.06planet.org\/?page_id=3511"},"modified":"2025-08-08T15:18:28","modified_gmt":"2025-08-08T13:18:28","slug":"commandes","status":"publish","type":"page","link":"https:\/\/www.06planet.org\/en\/commandes\/","title":{"rendered":"Commandes"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"3511\" class=\"elementor elementor-3511\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-d25c540 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"d25c540\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2cbd501\" data-id=\"2cbd501\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2b73fbc elementor-widget elementor-widget-html\" data-id=\"2b73fbc\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html>\r\n<head>\r\n  <meta charset=\"UTF-8\">\r\n  <title>Commande Hebdomadaire<\/title>\r\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n  <style>\r\n    body {\r\n      font-family: Arial, sans-serif;\r\n      padding: 10px;\r\n      background-color: #f4f4f4;\r\n      max-width: 400px;\r\n      margin: auto;\r\n    }\r\n    h1 {\r\n      font-size: 18px;\r\n      color: #2c3e50;\r\n    }\r\n    label {\r\n      display: block;\r\n      margin-top: 10px;\r\n      font-weight: bold;\r\n    }\r\n    input[type=\"number\"] {\r\n      width: 100%;\r\n      padding: 6px;\r\n      font-size: 16px;\r\n      margin-top: 5px;\r\n      box-sizing: border-box;\r\n    }\r\n    button {\r\n      display: block;\r\n      width: 100%;\r\n      margin-top: 10px;\r\n      padding: 10px;\r\n      font-size: 16px;\r\n      background-color: #3498db;\r\n      color: white;\r\n      border: none;\r\n      border-radius: 6px;\r\n      cursor: pointer;\r\n    }\r\n    button:hover {\r\n      background-color: #2980b9;\r\n    }\r\n    table {\r\n      width: 100%;\r\n      margin-top: 10px;\r\n      border-collapse: collapse;\r\n      background-color: white;\r\n    }\r\n    th, td {\r\n      padding: 6px;\r\n      text-align: left;\r\n      border: 1px solid #ccc;\r\n      font-size: 14px;\r\n    }\r\n    th {\r\n      background-color: #ecf0f1;\r\n    }\r\n  <\/style>\r\n<\/head>\r\n<body>\r\n  <h1>Commande Hebdomadaire<\/h1>\r\n\r\n  <label for=\"nbsem\">Semaine :<\/label>\r\n  <input type=\"number\" id=\"nbsem\" placeholder=\"ex : 32\" \/>\r\n\r\n  <button onclick=\"montrerProduits()\">Montrer les produits<\/button>\r\n  <button onclick=\"afficherBonDeLivraison()\">\u00c9diter le bon de livraison<\/button>\r\n  <div id=\"zoneBonLivraison\"><\/div>\r\n  <button id=\"btnValiderLivraison\" onclick=\"validerLivraison()\" style=\"display: none;\">Valider la livraison<\/button>\r\n  <button onclick=\"emettreFacture()\">\u00c9mettre une facture<\/button>\r\n  <div id=\"zoneFacture\"><\/div>\r\n\r\n<script>\r\nconst API_URL = \"https:\/\/script.google.com\/macros\/s\/AKfycbx9Y-6sa67_Ovc1jRQg67YtPseZBFb36eBgMswqE3ZwA90y7KMzKhj-E0pI-uXMUHsLxA\/exec\";\r\n\r\nlet produitsLivraison = [];\r\n\r\nfunction getSemaine() {\r\n  const val = parseInt(document.getElementById(\"nbsem\").value);\r\n  if (isNaN(val) || val <= 0) {\r\n    alert(\"Veuillez entrer un num\u00e9ro de semaine valide.\");\r\n    return null;\r\n  }\r\n  return val;\r\n}\r\n\r\nfunction montrerProduits() {\r\n  const semaine = getSemaine();\r\n  if (!semaine) return;\r\n\r\n  fetch(`${API_URL}?action=getProduitsParSemaine&semaine=${semaine}`)\r\n    .then(res => res.json())\r\n    .then(afficherProduits)\r\n    .catch(error => alert(\"Erreur : \" + error.message));\r\n}\r\n\r\nfunction afficherProduits(produits) {\r\n  const zone = document.getElementById(\"zoneBonLivraison\");\r\n\r\n  if (!produits || produits.length === 0) {\r\n    zone.innerHTML = \"<p>Aucun produit disponible pour cette semaine.<\/p>\";\r\n    return;\r\n  }\r\n\r\n  let html = \"<table><tr><th>Produit<\/th><th>Qt\u00e9 livrable<\/th><th>Prix<\/th><th>Qt\u00e9 souhait\u00e9e<\/th><\/tr>\";\r\n  produits.forEach((item, index) => {\r\n    html += `<tr>\r\n      <td>${item.nom || ''}<\/td>\r\n      <td>${item.quantite || 0}<\/td>\r\n      <td>${item.prix ?? ''}<\/td>\r\n      <td><input type=\"number\" id=\"commande_${index}\" data-col=\"${item.colonne}\" value=\"${item.quantiteCommandee || ''}\" \/><\/td>\r\n    <\/tr>`;\r\n  });\r\n  html += \"<\/table>\";\r\n  zone.innerHTML = html;\r\n\r\n  if (!document.getElementById(\"btnPasserCommande\")) {\r\n    const btn = document.createElement(\"button\");\r\n    btn.id = \"btnPasserCommande\";\r\n    btn.textContent = \"Passer la commande\";\r\n    btn.onclick = passerCommande;\r\n    btn.style.marginTop = \"10px\";\r\n    zone.appendChild(btn);\r\n  }\r\n}\r\n\r\n\r\n\/\/ --- helper JSONP ---\r\nfunction jsonpRequest(url, paramsObj, onResponse) {\r\n  \/\/ construit query string\r\n  const params = new URLSearchParams();\r\n  for (const k in paramsObj) {\r\n    if (paramsObj[k] !== undefined && paramsObj[k] !== null) {\r\n      params.append(k, paramsObj[k]);\r\n    }\r\n  }\r\n\r\n  const callbackName = \"cb_\" + Math.random().toString(36).substring(2, 15);\r\n  window[callbackName] = function(data) {\r\n    try { onResponse(null, data); } finally {\r\n      \/\/ cleanup\r\n      delete window[callbackName];\r\n      const tag = document.getElementById(callbackName);\r\n      if (tag) tag.remove();\r\n    }\r\n  };\r\n\r\n  params.append(\"callback\", callbackName);\r\n\r\n  const script = document.createElement(\"script\");\r\n  script.id = callbackName;\r\n  script.src = url + \"?\" + params.toString();\r\n  script.onerror = function(e) {\r\n    delete window[callbackName];\r\n    script.remove();\r\n    onResponse(new Error(\"Erreur JSONP \/ chargement script\"), null);\r\n  };\r\n  document.body.appendChild(script);\r\n}\r\n\r\n\/\/ --- Remplacement de passerCommande() en JSONP ---\r\nfunction passerCommande() {\r\n  const semaine = getSemaine();\r\n  if (!semaine) return;\r\n\r\n  const commandes = [];\r\n  document.querySelectorAll(\"input[id^='commande_']\").forEach(input => {\r\n    const col = input.getAttribute(\"data-col\");\r\n    const qte = parseFloat(input.value) || 0;\r\n    commandes.push({ col, qte });\r\n  });\r\n\r\n  if (commandes.length === 0) {\r\n    alert(\"Aucun produit s\u00e9lectionn\u00e9.\");\r\n    return;\r\n  }\r\n\r\n  \/\/ Pr\u00e9pare les donn\u00e9es et les encode\r\n  const payload = {\r\n    semaine: semaine,\r\n    commandes: commandes\r\n  };\r\n\r\n  jsonpRequest(API_URL, {\r\n    action: \"enregistrerCommandes\",\r\n    data: JSON.stringify(payload)\r\n  }, function(err, data) {\r\n    if (err) {\r\n      console.error(\"Erreur JSONP:\", err);\r\n      alert(\"Erreur lors de l'enregistrement de la commande (connexion).\");\r\n      return;\r\n    }\r\n    console.log(\"R\u00e9ponse commande (JSONP):\", data);\r\n    if (data && data.success) {\r\n      alert(data.message || \"Commande enregistr\u00e9e.\");\r\n    } else {\r\n      alert(\"Erreur : \" + (data && data.message ? data.message : \"R\u00e9ponse invalide\"));\r\n    }\r\n  });\r\n}\r\n\r\n\/\/ --- Remplacement de validerLivraison() en JSONP ---\r\nfunction validerLivraison() {\r\n  const semaine = getSemaine();\r\n  if (!semaine) return;\r\n\r\n  const livraisons = produitsLivraison.map((item, index) => {\r\n    const qteRecue = document.getElementById(\"recue_\" + index).value;\r\n    return { colonne: item.colonne, qteRecue: Number(qteRecue || 0) };\r\n  });\r\n\r\n  console.log(\"Validation livraison (pr\u00e9pare JSONP)\", {\r\n    action: \"validerQuantitesRecues\",\r\n    semaine,\r\n    livraisons\r\n  });\r\n\r\n  const payload = {\r\n    semaine: semaine,\r\n    livraisons: livraisons\r\n  };\r\n\r\n  jsonpRequest(API_URL, {\r\n    action: \"validerQuantitesRecues\",\r\n    data: JSON.stringify(payload)\r\n  }, function(err, data) {\r\n    if (err) {\r\n      console.error(\"Erreur JSONP:\", err);\r\n      alert(\"Erreur lors de la validation (connexion).\");\r\n      return;\r\n    }\r\n    console.log(\"R\u00e9ponse livraison (JSONP):\", data);\r\n    if (data && data.success) {\r\n      alert(data.message || \"Livraison valid\u00e9e.\");\r\n    } else {\r\n      alert(\"Erreur : \" + (data && data.message ? data.message : \"R\u00e9ponse invalide\"));\r\n    }\r\n  });\r\n}\r\n\r\n\r\n\r\nfunction afficherBonDeLivraison() {\r\n  const semaine = getSemaine();\r\n  if (!semaine) return;\r\n\r\n  fetch(`${API_URL}?action=getProduitsCommandesPourLivraison&semaine=${semaine}`)\r\n    .then(res => res.json())\r\n    .then(afficherTableauLivraison)\r\n    .catch(e => alert(\"Erreur : \" + e.message));\r\n}\r\n\r\nfunction afficherTableauLivraison(data) {\r\n  produitsLivraison = data;\r\n  const zone = document.getElementById(\"zoneBonLivraison\");\r\n\r\n  if (!data || data.length === 0) {\r\n    zone.innerHTML = \"<p>Aucun produit command\u00e9 cette semaine.<\/p>\";\r\n    return;\r\n  }\r\n\r\n  let html = \"<table><tr><th>Produit<\/th><th>Qt\u00e9 command\u00e9e<\/th><th>Prix<\/th><th>Qt\u00e9 re\u00e7ue<\/th><\/tr>\";\r\n  data.forEach((item, index) => {\r\n    html += `<tr>\r\n      <td>${item.nom}<\/td>\r\n      <td>${item.quantite}<\/td>\r\n      <td>${item.prix}<\/td>\r\n      <td><input type=\"number\" id=\"recue_${index}\" data-col=\"${item.colonne}\" value=\"${item.quantite}\" \/><\/td>\r\n    <\/tr>`;\r\n  });\r\n  html += \"<\/table>\";\r\n  zone.innerHTML = html;\r\n\r\n  document.getElementById(\"btnValiderLivraison\").style.display = \"block\";\r\n}\r\n\r\nfunction emettreFacture() {\r\n  const semaine = getSemaine();\r\n  if (!semaine) {\r\n    alert(\"Veuillez saisir un num\u00e9ro de semaine.\");\r\n    return;\r\n  }\r\n\r\n  fetch(`${API_URL}?action=getFactureParSemaine&semaine=${semaine}`)\r\n    .then(res => res.json())\r\n    .then(afficherFacture)\r\n    .catch(e => alert(\"Erreur : \" + e.message));\r\n}\r\n\r\nfunction afficherFacture(facture) {\r\n  const zone = document.getElementById('zoneFacture');\r\n  zone.innerHTML = '';\r\n\r\n  if (facture.length === 0) {\r\n    zone.innerHTML = \"<p>Aucune donn\u00e9e de facture disponible pour cette semaine.<\/p>\";\r\n    return;\r\n  }\r\n\r\n  let totalGlobal = 0;\r\n  const table = document.createElement(\"table\");\r\n\r\n  const headerRow = table.insertRow();\r\n  [\"Produit\", \"Qt\u00e9 re\u00e7ue\", \"Prix\/kg\", \"Total\"].forEach(text => {\r\n    const th = document.createElement(\"th\");\r\n    th.innerText = text;\r\n    th.style.border = \"1px solid black\";\r\n    th.style.padding = \"6px\";\r\n    th.style.backgroundColor = \"#ddd\";\r\n    headerRow.appendChild(th);\r\n  });\r\n\r\n  facture.forEach(item => {\r\n    const row = table.insertRow();\r\n    const total = item.qteRecu * item.prix;\r\n    totalGlobal += total;\r\n\r\n    [item.nom, item.qteRecu, item.prix.toFixed(2) + \" \u20ac\", total.toFixed(2) + \" \u20ac\"].forEach(val => {\r\n      const cell = row.insertCell();\r\n      cell.innerText = val;\r\n      cell.style.border = \"1px solid black\";\r\n      cell.style.padding = \"6px\";\r\n    });\r\n  });\r\n\r\n  const totalRow = table.insertRow();\r\n  totalRow.style.fontWeight = \"bold\";\r\n  const cellLabel = totalRow.insertCell();\r\n  cellLabel.colSpan = 3;\r\n  cellLabel.innerText = \"Total \u00e0 payer\";\r\n  const cellTotal = totalRow.insertCell();\r\n  cellTotal.innerText = totalGlobal.toFixed(2) + \" \u20ac\";\r\n\r\n  zone.appendChild(table);\r\n\r\n  const boutonDownload = document.createElement(\"button\");\r\n  boutonDownload.innerText = \"T\u00e9l\u00e9charger la facture (PDF)\";\r\n  boutonDownload.onclick = () => telechargerFacturePDF(getSemaine());\r\n  boutonDownload.style.marginTop = \"15px\";\r\n  zone.appendChild(boutonDownload);\r\n}\r\n\r\nfunction telechargerFacturePDF(semaine) {\r\n  fetch(`${API_URL}?action=genererFacturePDF&semaine=${semaine}`)\r\n    .then(res => res.json())\r\n    .then(res => {\r\n      if (!res.success) {\r\n        alert(res.message);\r\n        return;\r\n      }\r\n\r\n      const byteCharacters = atob(res.base64);\r\n      const byteNumbers = Array.from(byteCharacters, c => c.charCodeAt(0));\r\n      const byteArray = new Uint8Array(byteNumbers);\r\n      const blob = new Blob([byteArray], { type: \"application\/pdf\" });\r\n      const url = URL.createObjectURL(blob);\r\n\r\n      const link = document.createElement(\"a\");\r\n      link.href = url;\r\n      link.download = res.filename;\r\n      link.click();\r\n    });\r\n}\r\n\r\n\/\/ \ud83d\udd13 Rendre les fonctions visibles pour le HTML (onclick)\r\nwindow.montrerProduits = montrerProduits;\r\nwindow.afficherBonDeLivraison = afficherBonDeLivraison;\r\nwindow.passerCommande = passerCommande;\r\nwindow.validerLivraison = validerLivraison;\r\nwindow.emettreFacture = emettreFacture;\r\nwindow.telechargerFacturePDF = telechargerFacturePDF;\r\n<\/script>\r\n<\/body>\r\n<\/html>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Commande Hebdomadaire Commande Hebdomadaire Semaine : Montrer les produits \u00c9diter le bon de livraison Valider la livraison \u00c9mettre une facture<\/p>","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-3511","page","type-page","status-publish"],"_links":{"self":[{"href":"https:\/\/www.06planet.org\/en\/wp-json\/wp\/v2\/pages\/3511","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.06planet.org\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.06planet.org\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.06planet.org\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.06planet.org\/en\/wp-json\/wp\/v2\/comments?post=3511"}],"version-history":[{"count":40,"href":"https:\/\/www.06planet.org\/en\/wp-json\/wp\/v2\/pages\/3511\/revisions"}],"predecessor-version":[{"id":3556,"href":"https:\/\/www.06planet.org\/en\/wp-json\/wp\/v2\/pages\/3511\/revisions\/3556"}],"wp:attachment":[{"href":"https:\/\/www.06planet.org\/en\/wp-json\/wp\/v2\/media?parent=3511"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}