wiki:partenaires:dev:integrationpiece

Intégrer une pièce dans Gestan depuis une extension

Cette fonction permet d'intégrer facilement un document d'achat ou de vente (devis, facture, etc) dans Gestan depuis une extension, en appelant une fonction spécifique.

Les pièces produites seront à l'état brouillon.

<Résultat> = gf_PIECE_Générer(<Type de pièce>, <Structure contenant les données >, <libellé retour>, "version")

Avec :

  • <Résultat> : Booléen, vrai si la pièce a été ajoutée, faux dans le cas contraire
  • <Type de pièce> : chaine, qui ne peut être que DEVIS, COMMANDE, FACTURE, AVOIR, BLIVR, DEMPRIXFOU, COMMANDEFOU, FACTUREFOU, AVOIRFOU, BRECEPT
  • <Structure contenant les données > : Structure, contenant toutes les données de la pièces à créer, voir ci-dessous
  • <libellé retour> : chaine, contenant le message d'erreur en cas de problème dans l'ajout
  • Le libellé “version” est le n° de version de la fonction. Il permet de s'assurer que le programme appelant est bien en phase avec la fonction, qui peut ainsi évoluer sans risques.

C'est une structure (type de variable Windev), contenant les données utiles à la génération de la pièce, les options de création, et un tableau de Structures contenant les données utiles à la génération des lignes de pièce.

Prenons un exemple :

LibERR est une chaîne

// Structure décrivant une ligne de facture
wLigne est une Structure
	CD_PRODUIT			est une chaîne
	QUANTITE			est un réel
	PU_VENTE_HT			est un monétaire
	LIB_LFACT			est une chaîne	
	TX_TVA_VENTE		est un réel
	TX_REMISE_LIGNE		est un réel
	UNITE_VENTE			est une chaîne
	IDFAMPROD			est un entier
	LIB_TITREFACT		est une chaîne
	LIB_LOTFACT			est une chaîne
	NUMORDRE			est un entier
FIN


// Structure décrivant une facture
wFacture est une Structure
	// Données de la facture
	IDCONTACT			est un entier sur 8
	IDCONTACT_LIVR		est un entier sur 8
	REFEXTERNECLT		est une chaîne
	NOMFAMILLE			est une chaîne
	PRENOM				est une chaîne
	RAISON_SOCIALE		est une chaîne
	ADRESSEL1			est une chaîne
	ADRESSEL2			est une chaîne
	CDREGION			est une chaîne
	CPOSTAL				est une chaîne
	VILLE				est une chaîne
	CDPAYS				est une chaîne
	EMAIL				est une chaîne
	IDCIVILITE			est un entier sur 8
	DT_FACTURE			est une chaîne
	IDDELPMT			est un entier sur 8
	ID2_MODEPAIEMENT	est un entier sur 8
	NATURE				est une chaîne
	VREF				est une chaîne
	REFEXTERNEFACT		est une chaîne
	TX_REMISE_GLOB		est un réel
	COMMENTAIRE			est une chaîne
	TRIERLIGNE			est un entier		// A alimenter si on veut un tri conforme à la pièce de départ quand on génère une pièce à partir d'une autre
	IDPROJET			est un entier sur 8
	IDTACHE				est un entier sur 8
	DOCUMENTLIE			est un tableau de 7 chaînes
	TABLOLIGNE			est un tableau	<agrandissement=1> de wLigne

	// Option de création
	TYPEREF				est un entier		// 0 (défaut) : on lit sur IDCONTACT; 1 : on lit sur REFEXTERNECLT
	CLTPRO				est un entier		// 1 si c'est un client privé, 2 si c'est un client pro (dans le cas ou l'ID client n'est pas renseigné et qu'on va le créer)
	USRSUIVI			est un booléen		// faux : la pièce sera suivie par le créateur; Vrai : la pièce sera suivie par le responsable du contact
	BFORCERPRIX			est un booléen		// Vrai si on lit exclusivement les prix dans le catalogue
	PRODUITEXIST		est un booléen		// Faux : un produit inexistant sera hors catalogue. Vrai : un produit inexistant sera rejeté
FIN

wMaFacture	est une wFacture
wTblLigne	est un tableau <agrandissement=1> de wLigne
wMaLigne	est une wLigne

// Alimentation des zones des lignes de facture
VariableRAZ(wMaLigne)
wMaLigne.CD_PRODUIT		= "SCOLTC4"
wMaLigne.QUANTITE		= 1
wMaLigne.TX_REMISE_LIGNE	= 12
wTblLigne[1]			= wMaLigne

VariableRAZ(wMaLigne)
wMaLigne.CD_PRODUIT	= "SCOLTC3"
wMaLigne.QUANTITE	= 5
wMaLigne.TX_REMISE_LIGNE= 0
wTblLigne[2]		= wMaLigne

// Alimentation des zones de la facture
wMaFacture.IDCONTACT		= 12
wMaFacture.TX_REMISE_GLOB	= 8
wMaFacture.DOCUMENTLIE[1]	= "C:\Facturation\Mon document.docx"
wMaFacture.DOCUMENTLIE[2]	= "C:\Facturation\Mon tableur.xlsx"
wMaFacture.TABLOLIGNE		= wTblLigne

SI gf_PIECE_Générer("FACTURE", wMaFacture , LibERR, "1.4") ALORS Info("OK, la pièce a été générée.") SINON Erreur(LibERR)

Regardons dans le détail :

Dans la stucture wFacture

  • IDCONTACT : obligatoirement renseigné si TYPEREF = 0 (sinon il n'est pas utilisé)
  • REFEXTERNECLT : référence externe client, obligatoirement renseignée si TYPEREF = 1 (sinon il n'est pas utilisé)
  • NOMFAMILLE, PRENOM, RAISON_SOCIALE, etc jusqu'à IDCIVILITE : ne sont à alimenter que si l'on veut écraser les valeurs du fichier CONTACT, ou qu'on veut créer un nouveau contact.
  • CLTPRO : pour une création de client, à alimenter à 1 si c'est un client particulier, 2 si c'est un client entreprise. Si non-alimenté (0), sera considéré comme un client entreprise
  • TYPEREF : si 0 : on lit le contact exclusivement sur l'ID; si 1 : on lit le contact sur REFEXTERNE. Si TYPEREF est à 0 et que IDCONTACT est aussi à zéro, le contact sera créé dans la base
  • DT_FACTURE : alimenté par la date du jour si non précisé
  • NATURE : alimenté par la première ligne du premier produit si non précisé
  • REFEXTERNEFACT : référence externe facture éventuelle
  • BFORCERPRIX : si 0, le prix du produit est lu dans la fiche produit. Sinon, on prend les prix transmis dans le tableau des lignes. Si non renseigné, c'est la valeur 0 qui est prise en compte (lecture dans la fiche produit)
  • TRIERLIGNE : si 0, l'ordre de tri sera celui par défaut de la pièce. Dans le cas de la génération d'une pièce depuis une autre (par ex Facture depuis Devis), cela permet de prendre l'ordre de tri non pas de la facture par défaut, mais du devis d'origine.
  • DOCUMENTLIE[1] à [7] peut contenir le chemin des documents éventuellement liés à la pièce.

Dans la structure wLigne

  • CD_PRODUIT : peut être un produit hors catalogue. Dans ce cas, il faut renseigner IDFAMPROD
  • QUANTITE : à renseigner obligatoirement
  • PU_VENTE_HT : si non-renseigné, prendra le prix de la fiche produit
  • LIB_LFACT : si non-renseigné, prendra le libellé produit
  • TX_TVA_VENTE : si non-renseigné, prendra le taux du client, ou si non spécifié, le taux produit
  • TX_REMISE_LIGNE : à renseigner si différent de 0
  • UNITE_VENTE est une chaîne
  • IDFAMPROD est un entier
  • LIB_TITREFACT : libellé éventuel du titre
  • LIB_LOTFACT : libellé éventuel du lot
  • NUMORDRE : n° d'ordre de classement pour les lignes

Cet exemple va créer une facture pour le contact ID n°12, avec une ligne de produit code SCOLTC4, quantité 1, remise 12%, une seconde ligne de produit SCOLTC3, quantité 5, sans remise. Une remise globale de 8% sera appliquée à la facture.

Magique, non ?!

Si ce paramètre est à faux (valeur par défaut), le prix de vente et la TVA seront lus dans le catalogue produit.

Dans le cas inverse, ils devront être transmis dans wLigne.

Si vous utilisez BFORCERPRIX à vrai, il ne faut pas oublier de renseigner le taux de TVA à appliquer.

Par exemple, pour calculer le taux de TVA client :

TX_TVA_Client est un réel
// Calcul du taux de TVA client
SELON CONTACT.REGIME_TVACLI
	CAS 2,4,5,6 : TX_TVA_Client =0 // 2=Exonéré, 4=ImportExport 5=Suspension 6=UE 7=Autre cas
	CAS 3 // Autres taux défini
		TX_TVA_Client =CONTACT.TX_TVACLI
	AUTRE CAS // 1 Normal, et 0 ou -1 (non défini=>Normal) et 8 (exo supp)
		HLitRecherche(TAUXTVA,DEF,1)
		TX_TVA_Client =TAUXTVA.TX_TVA
FIN

Quand vous générez une série de pièces à partir d'une sélection de pièces (par exemple, vous voulez générer 5 factures à partir de 5 devis), le tableau des lignes de pièces varie en nombre de lignes, étant agrandi dynamiquement.

Si votre première pièce a 3 lignes, et la suivante 4, tout va bien se passer.

En revanche, dans le cas contraire, une première pièce de 4 lignes et une suivante de 3, vous aller adresser à la procédure de création de pièces un tableau de lignes avec 4 lignes, dont une vide, qui sera refusée.

Pour ce faire, utilisez

TableauSupprimeTout(wTblLigne)

entre deux créations, ce qui supprimera le tableau (par opposition à VariableRAZ, qui ne fait que le remette à zéro).

Gestion de NUMORDRE

En création d'une facture ex nihilo, vous pouvez ne pas l'alimenter, il sera alimenté automatiquement dans l'ordre des insertions dans le fichier des lignes de facture.

En revanche, quand vous créez une pièce à partir d'une autre pièce (par ex une facture en titre/lot depuis un devis en titre/lot), il faut les recopier, pour retrouver le bon ordre des titres/lots dans la pièces générée.

Depuis le 22/4/20, cette fonction demande un n° de version dans l'appel, pour que les structures qui lui sont envoyées soient cohérentes.

Attention ! Si votre extension embarque une copie de la fonction gf_PIECE_Générer d'une ancienne version, c'est cette copie qui va être appelée par l'extension, et non pas la fonction gf_PIECE_Générer “core”. Aucune erreur ne sera donc détectée !

Il faut donc :

  • soit déclarer gf_PIECE_Générer en externe dans votre extension
  • soit la mettre à jour dans votre extension.
Version Date ObservationsVersion Gestan
1.4 01/01/25 Adaptation pour Gestan A1 A1.00.00
1.2 19/03/21 Ajout de la gestion des DEEE, et gestion de la recopie du numéro d'ordre de tri des lignes. 15.23.01
1.1 09/01/21 Ajout de la gestion des titres/lot + option de recopie du mode de tri des lignes. 15.19.06
1.0 22/04/20 Ajout de la gestion de version + gestion de REFEXTFACT
<N/A> 02/02/19 Version initiale

Extensions utilisant cette fonction

WARNING A renseigner obligatoirement par les auteurs concernés, pour information de mise à jour.

Extension Auteur
GESTAN_INTERORICS
PLUGIN_LOADPIECEICS
GESTAN_EASYVRPICS
GESTAN_WORDPRESSLCP
GESTAN_WOOCOMMERCELCP
GESTAN_FACTURETTELCP
GESTAN_DATASYNCCATS
GESTAN_ECOMMERCECATS

Autres articles “Développement”

  • wiki/partenaires/dev/integrationpiece.txt
  • Dernière modification : 2025/08/06 19:27
  • de eneuville