#!/usr/bin/env python3
"""Brouillon pilier « PrestaShop + Pennylane + facture électronique 2026 »."""

from __future__ import annotations

import json
import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "scripts"))

from article_studio.config import load_config  # noqa: E402
from article_studio import wp_client  # noqa: E402

TITLE = (
    "PrestaShop et Pennylane : synchroniser vos ventes avant la facture électronique "
    "(guide complet 2026)"
)
SLUG = "prestashop-pennylane-synchronisation-facture-electronique-2026"
YOAST_TITLE = "PrestaShop Pennylane : synchro ventes et facture électronique 2026"
YOAST_DESC = (
    "Guide PrestaShop + Pennylane : calendrier facture électronique 2026-2027, "
    "synchronisation client et facture via API, module compatible PS 1.7.8 à 9.1."
)
FOCUS = "prestashop pennylane facture électronique"
EXCERPT = (
    "Calendrier facture électronique 2026-2027, rôle de Pennylane (PDP), trou PrestaShop "
    "et module de synchro automatique client + facture — guide opérationnel avant septembre."
)

BASE = "https://www.arnaud-merigeau.fr"
FE_GUIDE = f"{BASE}/facturation-electronique-prestashop-wordpress-2026/"
PROD_PENNYLANE = f"{BASE}/produit/module-prestashop-synchronisation-pennylane/"
PROD_EXPORT = f"{BASE}/produit/module-export-comptable-pour-prestashop/"
EXPORT_GUIDE = f"{BASE}/export-comptable-prestashop-2026-formats-erreurs-module-csv/"
MODULES_GUIDE = f"{BASE}/guide-modules-prestashop-indispensables-2026-ps8-ps9/"
DEMO_BO = "https://demo-prestashop.bnpj9981.odns.fr/backoffice"

IMG_HERO = f"{BASE}/wp-content/uploads/2026/07/product-pennylane-featured.png"
IMG_HERO_LOCAL = ROOT / "exports" / "pennylane-product" / "product-pennylane-featured.png"

CONTENT = f"""
<p>On est en <strong>juillet 2026</strong>. La réforme de la <strong>facture électronique</strong> n'est plus un sujet « pour plus tard » : dans moins de deux mois, toutes les entreprises assujetties à la TVA devront pouvoir <strong>recevoir</strong> des factures électroniques B2B. Si tu vends sur <strong>PrestaShop</strong> et que ton compta tourne sur <strong>Pennylane</strong>, la question urgente n'est pas seulement « quelle plateforme agréée choisir ? » — c'est : <em>est-ce que chaque vente web atterrit automatiquement dans Pennylane, client et facture compris ?</em></p>
<p>Ce guide est le complément opérationnel de mon <a href="{FE_GUIDE}">guide technique facturation électronique PrestaShop et WooCommerce</a>. Là-bas, on parle Factur-X, PDP, architectures serveur. Ici, on parle <strong>flux boutique → Pennylane</strong>, calendrier officiel, erreurs de marchands, et le <a href="{PROD_PENNYLANE}">module de synchronisation PrestaShop × Pennylane</a> que j'ai développé pour mes propres boutiques.</p>

<!--more-->

<h2>Sommaire</h2>
<ol>
<li><a href="#calendrier-officiel">Calendrier officiel facture électronique 2026-2027</a></li>
<li><a href="#pennylane-pdp">Pennylane et la réforme : PDP, API, e-reporting</a></li>
<li><a href="#trou-prestashop">Le trou PrestaShop : ce que la boutique ne fait pas seule</a></li>
<li><a href="#csv-vs-api">Export CSV mensuel vs synchronisation API temps réel</a></li>
<li><a href="#module-pennylane">Module PrestaShop Pennylane : fonctionnalités</a></li>
<li><a href="#configuration-module">Configuration pas à pas (10 minutes)</a></li>
<li><a href="#complement-export-comptable">Complément avec l'export comptable CSV</a></li>
<li><a href="#checklist-marchand">Checklist marchand PrestaShop + Pennylane</a></li>
<li><a href="#faq-pennylane-fe">Questions / réponses</a></li>
<li><a href="#conclusion-pennylane">Conclusion</a></li>
</ol>

<figure class="wp-block-image size-large"><img src="{IMG_HERO}" alt="Module PrestaShop synchronisation Pennylane — préparer la facture électronique" width="1200" height="675" loading="lazy" /><figcaption>PrestaShop + Pennylane : verrouiller le flux ventes → compta avant les échéances septembre 2026 et 2027.</figcaption></figure>

<h2 id="calendrier-officiel">1. Calendrier officiel facture électronique 2026-2027</h2>
<p>Le calendrier actuel (loi de finances 2024, Service-Public) distingue <strong>réception</strong> et <strong>émission</strong> :</p>
<table>
<thead><tr><th>Date</th><th>Entreprises concernées</th><th>Obligation</th></tr></thead>
<tbody>
<tr><td><strong>1er septembre 2026</strong></td><td>Toutes les entreprises assujetties à la TVA (B2B France)</td><td><strong>Réception</strong> de factures électroniques</td></tr>
<tr><td><strong>1er septembre 2026</strong></td><td>Grandes entreprises et ETI</td><td><strong>Émission</strong> de factures électroniques</td></tr>
<tr><td><strong>1er septembre 2027</strong></td><td>PME, TPE et micro-entreprises</td><td><strong>Émission</strong> de factures électroniques</td></tr>
</tbody>
</table>
<p>Concrètement :</p>
<ul>
<li>les factures B2B ne seront plus de simples PDF envoyés par mail — il faut des <strong>formats structurés</strong> (Factur-X, UBL, CII),</li>
<li>le flux passe par une <strong>plateforme agréée (PDP)</strong> ou le portail public de facturation,</li>
<li>l'<strong>e-reporting</strong> couvre aussi certaines opérations non facturées classiquement.</li>
</ul>
<p>Pour le détail technique (architectures PrestaShop, Factur-X, impacts serveur), voir le <a href="{FE_GUIDE}">guide facturation électronique PrestaShop 2026</a>.</p>

<h2 id="pennylane-pdp">2. Pennylane et la réforme : PDP, API, e-reporting</h2>
<p><strong>Pennylane</strong> est l'un des logiciels comptables cloud les plus adoptés par les PME françaises en 2026. Pennylane est <strong>immatriculée comme Plateforme Agréée (PDP)</strong> et connectée au réseau PEPPOL — un point clé pour la conformité à terme.</p>
<p>Ce que Pennylane gère bien :</p>
<ul>
<li>la comptabilité, la facturation et le rapprochement bancaire dans un seul outil,</li>
<li>la réception et l'émission de factures électroniques via son statut PDP (déploiement progressif),</li>
<li>une <strong>API v2</strong> pour connecter des outils métier (dont l'e-commerce).</li>
</ul>
<p>Ce que Pennylane ne fait <em>pas</em> nativement : lire ton PrestaShop et créer clients + factures à chaque commande web. C'est le rôle d'un <strong>connecteur</strong> ou d'un process manuel (export, ressaisie, CSV).</p>

<h2 id="trou-prestashop">3. Le trou PrestaShop : ce que la boutique ne fait pas seule</h2>
<p>PrestaShop génère des commandes, des factures PDF, parfois des exports. Il ne pousse pas automatiquement :</p>
<ul>
<li>le <strong>client</strong> structuré vers Pennylane (référence externe, adresse de facturation, SIRET/TVA si B2B),</li>
<li>la <strong>facture</strong> au format attendu par Pennylane (brouillon avec lignes HT/TVA, ou import PDF finalisé),</li>
<li>la <strong>traçabilité</strong> commande ↔ client Pennylane ↔ facture Pennylane.</li>
</ul>
<p>Sans automatisation, tu retombes sur :</p>
<ul>
<li>export CSV fin de mois + ressaisie,</li>
<li>oubli de commandes B2B (SIRET manquant sur la fiche client),</li>
<li>décalage entre la date de vente web et la date comptable Pennylane.</li>
</ul>
<p>À l'approche de septembre 2026, ce n'est plus tenable si tu dépasses quelques dizaines de commandes par mois.</p>

<h2 id="csv-vs-api">4. Export CSV mensuel vs synchronisation API temps réel</h2>
<table>
<thead><tr><th>Approche</th><th>Avantages</th><th>Limites</th></tr></thead>
<tbody>
<tr>
<td><strong>Export CSV mensuel</strong> (<a href="{PROD_EXPORT}">module export comptable</a>)</td>
<td>Écritures pour le cabinet (Quadra, Sage…), cron, multiboutique, historique</td>
<td>Pas temps réel ; fichier intermédiaire</td>
</tr>
<tr>
<td><strong>Synchro API Pennylane</strong> (<a href="{PROD_PENNYLANE}">module Pennylane</a>)</td>
<td>Client + facture à chaque statut commande, journal, renvoi manuel</td>
<td>Nécessite clé API Pennylane ; complète l'export cabinet</td>
</tr>
<tr>
<td><strong>Double saisie Excel</strong></td>
<td>Aucun (sauf urgence)</td>
<td>Erreurs, retard, non scalable</td>
</tr>
</tbody>
</table>
<p>Mon conseil terrain : si ton expert-comptable est sur Pennylane, commence par la <strong>synchro API temps réel</strong> pour les ventes web. Garde l'<a href="{EXPORT_GUIDE}">export comptable CSV</a> si ton cabinet veut aussi un fichier Quadra/Sage ou un contrôle mensuel croisé.</p>

<h2 id="module-pennylane">5. Module PrestaShop Pennylane : fonctionnalités</h2>
<p>J'ai packagé le connecteur que j'utilise sur des boutiques PrestaShop 8/9 : <a href="{PROD_PENNYLANE}"><strong>Module synchronisation Pennylane</strong></a> (v1.2.0, PS 1.7.8 à 9.1).</p>
<h3>5.1 Déclenchement et synchronisation</h3>
<ul>
<li>hook sur <strong>changement de statut commande</strong> (un ou plusieurs statuts configurables),</li>
<li>création ou réutilisation du <strong>client Pennylane</strong> (référence externe PrestaShop),</li>
<li>facture <strong>brouillon Pennylane</strong> (lignes produits, TVA, transport) ou <strong>import PDF</strong> PrestaShop finalisé,</li>
<li>table de traçabilité + verrou anti-doublon.</li>
</ul>
<h3>5.2 Back-office</h3>
<ul>
<li>configuration clé API (ou variable <code>PENNYLANE_API_KEY</code> dans un fichier <code>.env</code>),</li>
<li>test de connexion API,</li>
<li>modèles de facture Pennylane <strong>par boutique</strong> (multiboutique),</li>
<li>délai de paiement configurable,</li>
<li><strong>journal Pennylane</strong> paginé (500 entrées),</li>
<li>bloc sur fiche commande : statut, IDs Pennylane, <strong>renvoi manuel</strong>, lien PDF.</li>
</ul>
<h3>5.3 Démo</h3>
<p>Module installé sur ma démo : <a href="{DEMO_BO}">{DEMO_BO}</a> (demo@demo.fr / demodemo). Configuration : Modules → Pennylane.</p>

<h2 id="configuration-module">6. Configuration pas à pas (10 minutes)</h2>
<ol>
<li>Installer le module depuis le ZIP (Modules → Installer un module).</li>
<li>Renseigner la <strong>clé API Pennylane v2</strong> (Paramètres Pennylane → Intégrations / API).</li>
<li>Activer la synchronisation et choisir les <strong>statuts déclencheurs</strong> (souvent « Paiement accepté »).</li>
<li>Choisir le mode facture : <strong>brouillon</strong> ou <strong>import PDF</strong> PrestaShop.</li>
<li>En multiboutique : associer un modèle de facture Pennylane par boutique.</li>
<li>Passer une commande test → vérifier client + facture dans Pennylane et le journal du module.</li>
</ol>

<h2 id="complement-export-comptable">7. Complément avec l'export comptable CSV</h2>
<p>Le module Pennylane couvre le flux <strong>ventes → Pennylane en temps réel</strong>. Le <a href="{PROD_EXPORT}">module export comptable CSV</a> couvre le flux <strong>ventes → cabinet comptable</strong> (écritures débit/crédit, format Quadra, cron mensuel). Les deux sont complémentaires, pas concurrents.</p>
<p>Guide détaillé export : <a href="{EXPORT_GUIDE}">export comptable PrestaShop 2026</a>. Panorama modules : <a href="{MODULES_GUIDE}">guide modules PrestaShop indispensables 2026</a>.</p>

<h2 id="checklist-marchand">8. Checklist marchand PrestaShop + Pennylane</h2>
<ul>
<li>☐ Calendrier FE compris (réception 09/2026, émission PME 09/2027)</li>
<li>☐ Compte Pennylane actif + clé API v2</li>
<li>☐ Champs B2B sur fiches clients (SIRET, TVA intra) si ventes pro</li>
<li>☐ Module Pennylane installé + statuts déclencheurs configurés</li>
<li>☐ Commande test synchronisée (client + facture visibles Pennylane)</li>
<li>☐ Export CSV mensuel si le cabinet le demande en parallèle</li>
<li>☐ Lecture du <a href="{FE_GUIDE}">guide technique FE</a> pour la conformité Factur-X / PDP</li>
</ul>

<h2 id="faq-pennylane-fe">9. Questions / réponses</h2>
<h3>Le module remplace-t-il une plateforme agréée ?</h3>
<p>Non. Pennylane est la PDP. Le module connecte PrestaShop à Pennylane via API — il automatise la remontée des ventes, pas la conformité globale à elle seule.</p>
<h3>PrestaShop 9.1 est-il supporté ?</h3>
<p>Oui. Compatibilité déclarée 1.7.8 à 9.1.</p>
<h3>Différence avec le connecteur Addons Marketplace ?</h3>
<p>Plusieurs connecteurs existent. Celui-ci est développé et maintenu par <strong>Latoutfrancais - Arnaud Merigeau</strong>, avec journal intégré, renvoi manuel, multiboutique et support direct — même éditeur que l'<a href="{PROD_EXPORT}">export comptable CSV</a>.</p>
<h3>Et WooCommerce ?</h3>
<p>Ce guide cible PrestaShop. Pour WooCommerce + Pennylane, voir la section WooCommerce du <a href="{FE_GUIDE}">guide facturation électronique</a>.</p>

<h2 id="conclusion-pennylane">10. Conclusion</h2>
<p>La facture électronique impose un calendrier strict. Pennylane te place déjà du bon côté côté PDP. Il te reste à brancher <strong>PrestaShop</strong> sans export manuel — c'est exactement ce que fait le <a href="{PROD_PENNYLANE}">module de synchronisation Pennylane</a>.</p>
<p>→ <a href="{PROD_PENNYLANE}"><strong>Télécharger le module PrestaShop Pennylane</strong></a> (à partir de 99,94 € HT — PS 1.7.8 à 9.1, démo disponible)</p>
<p>Besoin d'un audit PrestaShop + Pennylane avant septembre ? <a href="{BASE}/contact/">Contacte-moi</a> avec ta version PrestaShop, ton volume mensuel et ton setup Pennylane.</p>
"""


def main() -> int:
    cfg = load_config()
    base = cfg.wp_base_url.rstrip("/")
    user = cfg.wp_user
    pwd = cfg.wp_application_password.replace(" ", "")

    featured_id = None
    if IMG_HERO_LOCAL.is_file():
        print("Upload image à la une…")
        media = wp_client.upload_media(
            base,
            user,
            pwd,
            IMG_HERO_LOCAL,
            alt_text="PrestaShop Pennylane synchronisation facture électronique 2026",
            title="prestashop-pennylane-facture-electronique-2026",
        )
        featured_id = media.get("id")
        hero_url = media.get("source_url", IMG_HERO)
        content = CONTENT.replace(IMG_HERO, hero_url)
        print(f"  media id={featured_id}")
    else:
        content = CONTENT.strip()

    post = wp_client.create_post(
        base,
        user,
        pwd,
        title=TITLE,
        content=content.strip(),
        excerpt=EXCERPT,
        status="draft",
        slug=SLUG,
        yoast_title=YOAST_TITLE,
        yoast_description=YOAST_DESC,
        yoast_focus=FOCUS,
        author=cfg.wp_author_id,
        featured_media_id=featured_id,
    )

    post_id = post.get("id")
    if post_id:
        extra = {"categories": [2, 44]}
        _, post = wp_client._request(
            "POST",
            f"{base}/wp-json/wp/v2/posts/{post_id}",
            user,
            pwd,
            data=json.dumps(extra).encode("utf-8"),
            headers={"Content-Type": "application/json"},
        )

    article_url = f"{base}/{SLUG}/"
    print(f"Brouillon créé — ID {post.get('id')}")
    print(f"URL : {post.get('link')}")
    print(f"Statut : {post.get('status')}")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
