Mappage BOD Purchase Order
Cette page documente la façon dont DocBits ingère les BODs SyncPurchaseOrder d'Infor M3 et mappe les champs sur les tables internes PURCHASE_ORDER_HEADER et Purchase Order Line.
Principes clés
Aucune conversion de devise dans DocBits. Les montants sont persistés exactement tels que M3 les délivre dans le BOD, avec leur
@currencyID. Trois montants d'en-tête sont disponibles :ExtendedAmount(devise de transaction),ExtendedBaseAmount(devise de base de la société),ExtendedReportAmount(devise de reporting).Aucune conversion d'unité de mesure dans DocBits. Les quantités sont stockées avec leur
@unitCode.ReceivedBaseUOMQuantityest la valeur UoM de base déjà calculée par M3 — DocBits la stocke telle quelle.Le statut de l'en-tête est pris dans le SXE stage lorsqu'il est disponible. DocBits lit
UserArea/Property[@name='poeh.stagecd'](valeurs1..8→ Ordered / Entered / Released / Allocated / Picked / Delivered / Invoiced / Cancelled) et l'utilise comme statut d'en-tête de référence. LeStatus/Codestandard est également stocké comme repli pour les BODs dans lesquelspoeh.stagecdn'est pas renseignée — l'émission de cette propriété UserArea dépend du tenant.Pas de logique automatique de statut sur quantité partielle. DocBits ne dérive pas de statut à partir des quantités reçues vs. commandées ; le statut délivré par M3 est repris tel quel.
CONO/AccountingEntityIDne fait pas partie du BOD PurchaseOrder. Le routage par numéro de société s'applique aux données de base fournisseurs (voir Supplier BOD Mapping) ; les bons de commande sont rattachés viaLocationID. Notez queLocationIDn'est pas globalement unique — lorsqu'une société M3 (CONO) est copiée entre environnements (par exemple PRD → TST), le mêmeLocationIDpeut exister sous plusieurs CONOs. Dans ces configurations, filtrez le flux BOD entrant sur l'AccountingEntityattendue dans votre DataFlow ION afin d'éviter les collisions entre environnements.
Mappage de l'en-tête
→ Table de données de base DocBits : PURCHASE_ORDER_HEADER
header_mappings = {
"purchase_order_number": "//DataArea/PurchaseOrder/PurchaseOrderHeader/DocumentID/ID",
"warehouse_id": "//DataArea/PurchaseOrder/PurchaseOrderHeader/ShipToParty/Location[@type='Warehouse']/ID",
"location_id": "//DataArea/Sync/LocationID",
"status": "//DataArea/PurchaseOrder/PurchaseOrderHeader/Status/Code",
"supplier_id": "//DataArea/PurchaseOrder/PurchaseOrderHeader/SupplierParty/PartyIDs/ID",
"supplier_name": "//DataArea/PurchaseOrder/PurchaseOrderHeader/SupplierParty/Name",
"order_date": "//DataArea/PurchaseOrder/PurchaseOrderHeader/OrderDateTime",
"requested_shipment_date": "//DataArea/PurchaseOrder/PurchaseOrderHeader/RequiredDeliveryDateTime",
"total_amount": "//DataArea/PurchaseOrder/PurchaseOrderHeader/ExtendedAmount",
"buyer_contact_id": "//DataArea/PurchaseOrder/PurchaseOrderHeader/CustomerParty/BuyerContact/ID",
"buyer_contact_name": "//DataArea/PurchaseOrder/PurchaseOrderHeader/CustomerParty/BuyerContact/Name",
"order_last_modified_by": "//DataArea/PurchaseOrder/PurchaseOrderHeader/LastModificationPerson/IDs/ID",
"order_last_modified_on": "//DataArea/PurchaseOrder/PurchaseOrderHeader/LastModificationDateTime",
"disponent_id": "//DataArea/PurchaseOrder/PurchaseOrderHeader/PlannerReference/IDs/ID",
"disponent_name": "//DataArea/PurchaseOrder/PurchaseOrderHeader/PlannerReference/Name",
"extended_amount": "//DataArea/PurchaseOrder/PurchaseOrderHeader/ExtendedAmount",
"extended_base_amount": "//DataArea/PurchaseOrder/PurchaseOrderHeader/ExtendedBaseAmount",
"extended_report_amount": "//DataArea/PurchaseOrder/PurchaseOrderHeader/ExtendedReportAmount",
"canceled_amount": "//DataArea/PurchaseOrder/PurchaseOrderHeader/CanceledAmount",
"canceled_base_amount": "//DataArea/PurchaseOrder/PurchaseOrderHeader/CanceledBaseAmount",
"canceled_reporting_amount": "//DataArea/PurchaseOrder/PurchaseOrderHeader/CanceledReportingAmount",
"type_code": "//DataArea/PurchaseOrder/PurchaseOrderHeader/Classification/Codes/Code[@listID='Purchase Order Types']",
"type_description": "//DataArea/PurchaseOrder/PurchaseOrderHeader/Classification[Codes/Code[@listID='Purchase Order Types']]/Description",
"sxe_stage": "//DataArea/PurchaseOrder/PurchaseOrderHeader/UserArea/Property/NameValue[@name='poeh.stagecd']/text()",
}Référence des champs d'en-tête
purchase_order_number
MPHEAD.IAPUNO
Numéro de bon de commande M3, clé primaire.
warehouse_id
—
Lit ShipToParty/Location[@type='Warehouse']/ID. L'attribut @type='Warehouse' est rarement défini par M3 ; le champ reste NULL dans ce cas. Utilisez location_id comme entrepôt natif M3.
location_id
MPHEAD.IAFACI
Division/site (entrepôt) M3 où le BOD a été émis. Utilisé pour le routage organisation/site dans DocBits, y compris la mise en correspondance avec les sites de facturation.
status
MPHEAD.IAPUSL
Status/Code brut du BOD. Utilisé en repli quand sxe_stage est vide.
sxe_stage
MPHEAD.IAPUSL
Statut d'en-tête de référence, lu depuis la propriété UserArea poeh.stagecd. Mappe les codes SXE M3 1..8 → Ordered, Entered, Released, Allocated, Picked, Delivered, Invoiced, Cancelled. Quand défini, il supplante status pour les décisions de workflow. Avec la préférence UPDATE_DOCUMENT_PURCHASE_ORDER_STATUS activée, DocBits propage ce statut sur les factures liées.
supplier_id
MPHEAD.IASUNO
Numéro de fournisseur sur le bon de commande.
supplier_name
CIDMAS.IDSUNM
Nom d'affichage du fournisseur.
order_date
MPHEAD.IAPUDT
Date de création du bon de commande dans M3.
requested_shipment_date
—
Lu depuis RequiredDeliveryDateTime au niveau en-tête s'il existe. La plupart des configurations M3 ne portent ce champ qu'au niveau ligne ; dans ce cas, utilisez requested_ship_date de la ligne.
total_amount
MPHEAD.IAOURR
Total de la commande en devise de transaction. Stocké tel quel depuis ExtendedAmount.
extended_amount
MPHEAD.IAOURR
Même source que total_amount. Conservé comme colonne brute distincte pour la traçabilité et les consommateurs en aval attendant le chemin BOD canonique.
extended_base_amount
MPHEAD.IAOUVA
Total exprimé dans la devise de base de la société. Rempli par M3 lorsque disponible — le remplissage dépend du tenant ; si vous ne parvenez pas à reproduire une valeur renseignée, merci de partager un BOD d'exemple.
extended_report_amount
MPHEAD.IAOUVB
Total exprimé dans la devise de reporting de la société. Le remplissage dépend du tenant (comme extended_base_amount).
canceled_amount / canceled_base_amount / canceled_reporting_amount
—
Montants d'annulation en devise de transaction / de base / de reporting. Renseignés par M3 uniquement après événements d'annulation.
type_code / type_description
—
Type de bon de commande depuis Classification/Codes/Code[@listID='Purchase Order Types'] (et sa Description). Exemples : P10 PO normale, P20 PO de réapprovisionnement. Stocké uniquement pour affichage — aucune logique de filtrage.
buyer_contact_id / buyer_contact_name
MPHEAD.IABUYE / utilisateur lié
Acheteur affecté à la PO.
order_last_modified_by / order_last_modified_on
MPHEAD.IACHID / MPHEAD.IALMDT
Champs d'audit.
disponent_id / disponent_name
MPHEAD.IARESP / utilisateur lié
Référence du planificateur.
Mappage des lignes
→ Table de données de base DocBits : Purchase Order
Référence des champs de ligne
item_id
MPLINE.IBITNO
Numéro d'article M3. Repli sur @schemeName='NonStock' pour articles non stockés.
supplier_item_id
MPLINE.IBSITE / Classification
Numéro d'article côté fournisseur. Résolu via trois replis (dans l'ordre) : ID[@schemeName='Supplier'] → Classification[@type='Supplier Item Code']/Codes/Code[@listID='Supplier Item Code'] → Item/SupplierItemID/ID.
description
MPLINE.IBPITT
Description de l'article de la ligne.
note
MSYTXL.TLTX60
Texte de note de ligne.
quantity
MPLINE.IBORQA
Quantité commandée. Stockée avec unit_of_measure (sans conversion).
open_quantity
CFQA - RVQA
Quantité encore ouverte (commandée moins reçue). Même unit_of_measure.
confirmed_quantity
—
Quantité confirmée par le fournisseur. M3 laisse vide ; rempli par les ERPs émettant BackOrderedQuantity.
received_quantity
MPLINE.IBRVQA
Quantité reçue.
received_base_mou_quantity
MPLINE.IBRVQA (UoM de base)
Quantité reçue convertie en unité de mesure de base par M3 lui-même. DocBits ne calcule pas — il stocke ce que M3 envoie. Utile pour la comptabilité de stock.
unit_of_measure
MPLINE.IBPUUN
UoM de transaction. S'applique à quantity, open_quantity, received_quantity.
unit_price
MPLINE.IBPUPR
Prix unitaire en devise de transaction.
unit_price_per / unit_code_price
MPLINE.IBCPUC / MPLINE.IBPPUN
Prix-par quantité et son code unité (modificateur de prix, ex. prix par 100 PCS).
total_amount
LNAM + EXEP
Total de ligne. Résolu via le repli [TotalAmount, ExtendedAmount] — quand TotalAmount manque, total_amount est égal à extended_amount. Quand les deux sont présents, TotalAmount peut inclure taxes/remises tandis que extended_amount vaut quantity × unit_price.
extended_amount
LNAM / LNA2
ExtendedAmount brut (sous-total de ligne hors taxes/remises).
currency
MPHEAD.IACUCD
Devise de transaction. Lue depuis TotalAmount/@currencyID, avec ExtendedAmount/@currencyID en repli.
status
MPLINE.IBPUST
Statut de ligne. Stocké pour reporting ; aucune logique de workflow DocBits n'en dérive.
buyer_id / buyer_name
MPLINE.IBBUYE / utilisateur lié
Acheteur au niveau ligne. buyer_name est rarement renseigné par M3 sur la ligne ; la référence acheteur fournisseur se trouve dans Supplier BOD Mapping.
geo_code
—
Code géographique pour moteurs fiscaux US/CA. Rempli uniquement par les ERPs qui l'émettent.
delivery_method
MPLINE.IBMODL
Mode de livraison de la ligne (code MODL M3).
promised_delivery_date
CODT, DWDT/TIHM
Date de livraison confirmée par le fournisseur.
requested_ship_date
MPLINE.IBDWDT
Date d'expédition demandée sur la ligne — date de livraison souhaitée opérationnellement pertinente.
sub_line_number
—
Identifiant optionnel de sous-ligne. Stocké si présent ; M3 le laisse typiquement vide.
schedule_line_number
—
Référence optionnelle à une ligne d'échéancier pour les POs à livraisons planifiées.
order_multiple / standard_quantity
MPLINE.IBOMUL / UserArea
Multiple de commande de la ligne (quantité minimale) et quantité standard d'emballage.
Questions fréquentes
Comment DocBits gère-t-il les bons de commande en devise étrangère ?
DocBits ne convertit pas les devises. Le montant de transaction (total_amount, extended_amount, unit_price) est stocké avec son @currencyID. Quand la société utilise une devise de base ou de reporting différente, M3 fournit des valeurs pré-converties via extended_base_amount et extended_report_amount — stockées comme colonnes additionnelles sur l'en-tête.
Comment DocBits dérive-t-il le statut de réception partielle ?
Il ne le fait pas. Le statut d'en-tête reflète le SXE stage M3 (poeh.stagecd) au moment de l'émission du BOD. Si vous avez besoin d'un indicateur de réception partielle, dérivez-le de open_quantity vs. quantity sur la table des lignes.
Quelle différence entre total_amount et extended_amount sur la ligne ?
Les deux colonnes existent pour compatibilité historique/UI. total_amount est résolu via [TotalAmount, ExtendedAmount] ; il est donc égal à extended_amount chaque fois que TotalAmount est absent. Quand M3 émet les deux, TotalAmount peut inclure taxes ou remises au-dessus de la valeur quantity × unit_price portée par extended_amount.
Pourquoi l'entrepôt est-il mappé sur deux chemins différents ?
warehouse_id lit ShipToParty/Location[@type='Warehouse']/ID, que la plupart des installations M3 laissent vide (l'attribut @type est rarement défini). location_id lit DataArea/Sync/LocationID, toujours rempli par M3 et correspondant à la division/site auquel la PO appartient. Traitez location_id comme identifiant d'entrepôt natif M3.
Certains champs sont documentés mais toujours vides (buyer_name, geo_code, confirmed_quantity, sub_line_number, …). Pourquoi sont-ils mappés ?
Ces mappages sont défensifs : le schéma BOD autorise les champs, et d'autres ERPs ou extensions M3 sur mesure peuvent les renseigner. Quand M3 les laisse vides, les colonnes sont simplement NULL dans DocBits.
Dois-je filtrer AccountingEntity (CONO) dans le DataFlow ION même si le BOD PurchaseOrder n'a pas de CONO ?
Oui, dans les environnements où la même société M3 a été copiée (par exemple PRD → TST, ou deux tenants parallèles). LocationID seul n'est pas unique entre CONOs dans ces configurations, et un BOD provenant d'une société copiée peut entrer en collision avec une société active. Le motif recommandé est de filtrer le flux entrant sur la valeur AccountingEntity attendue dans ION avant que le BOD n'atteigne DocBits.
Mes BODs ne contiennent jamais UserArea/Property[@name='poeh.stagecd'] — que se passe-t-il ?
DocBits bascule sur l'élément standard Status/Code dans l'en-tête. L'émission de poeh.stagecd dépend du tenant. Si vous attendez cette propriété mais ne la trouvez pas dans vos BODs, partagez un BOD d'exemple avec l'équipe DocBits afin que nous puissions confirmer la personnalisation M3 qui la produit.
ExtendedBaseAmount / ExtendedReportAmount sont-ils vraiment renseignés sur l'en-tête ?
Lorsque M3 les envoie sur l'en-tête, DocBits les stocke dans des colonnes dédiées (extended_base_amount, extended_report_amount). Le remplissage dépend de la configuration des devises M3 : les sociétés avec une devise de base/reporting différente de la devise de transaction les reçoivent généralement toutes deux. Si vous ne parvenez pas à reproduire une valeur renseignée dans votre propre tenant, partagez un BOD d'exemple afin que nous puissions vérifier ensemble les conditions.
Last updated