Inoltro degli ordini finali, completi di dettagli di spedizione, fatturazione e termini di pagamento.
Ordini di Acquisto (Purchase Orders)
L’Ordine di Acquisto (OrderRequest) è il documento ufficiale con cui il cliente (l’acquirente) formalizza l’acquisto verso il fornitore.
Supporto in F-Merchant: centrale in tutti i progetti in cui F-Merchant riceve l’ordine finale dal sistema procurement del buyer.
Direzione tipica: dal buyer o dal network verso F-Merchant, con successivo allineamento verso ERP e logistica.
Chi deve leggerla: integration developer, ERP team, operations team che gestisce evasione e sincronizzazione stato ordine.
Sistemi coinvolti di solito: piattaforma eProcurement buyer, F-Merchant, ERP del fornitore, sistemi di fulfillment o magazzino.
Contiene tutte le informazioni tecniche e legali per procedere all’evasione.
Checklist minima di implementazione
Per ricevere correttamente un OrderRequest servono almeno:
- endpoint di ricezione stabile e autenticato;
- riconoscimento corretto di buyer, destinatario e credenziali tecniche;
- mapping affidabile di
orderID, righe, SKU, quantità, valuta e unità di misura; - gestione coerente degli indirizzi
ShipToeBillTo; - instradamento verso ERP, OMS o middleware senza perdere riferimenti di riga;
- regole chiare per
new,updateedelete.
Se l’ordine entra ma non mantiene chiavi e riferimenti fino all’ERP, il flusso è solo formalmente integrato.
Struttura dell’OrderRequest
L’Ordine in cXML è strutturato in tre macro-sezioni:
- OrderRequestHeader: Contiene le intestazioni (Numero Ordine, Date, Indirizzi di spedizione e fatturazione, Termini di pagamento).
- ItemOut: I dettagli di ogni singola riga d’ordine (Prodotto, Quantità, Prezzo Unitario, Specifiche).
- Sommario (Summary): Il totale dell’ordine e dei costi aggiuntivi stimati (tasse, spedizioni preventivate).
<OrderRequest>
<OrderRequestHeader orderID="PO-12345" orderDate="2026-03-02" type="new">
<Total>
<Money currency="EUR">1250.00</Money>
</Total>
<ShipTo>
<Address>
<Name xml:lang="it">Sede Operativa Acquirente</Name>
<PostalAddress>
<Street>Via Roma 10</Street>
<City>Milano</City>
<PostalCode>20121</PostalCode>
<Country isoCountryCode="IT">Italia</Country>
</PostalAddress>
</Address>
</ShipTo>
<BillTo>
<Address>
<Name xml:lang="it">Ufficio Amministrativo Acquirente</Name>
<PostalAddress>
<Street>Corso Europa 22</Street>
<City>Roma</City>
<PostalCode>00186</PostalCode>
<Country isoCountryCode="IT">Italia</Country>
</PostalAddress>
</Address>
</BillTo>
</OrderRequestHeader>
<ItemOut quantity="10" lineNumber="1">
<ItemID>
<SupplierPartID>PROD-A</SupplierPartID>
</ItemID>
<ItemDetail>
<UnitPrice>
<Money currency="EUR">125.00</Money>
</UnitPrice>
<Description xml:lang="it">Prodotto A</Description>
<UnitOfMeasure>EA</UnitOfMeasure>
</ItemDetail>
</ItemOut>
</OrderRequest>
Campi minimi richiesti
In un progetto reale, questi campi sono quasi sempre indispensabili:
| Campo | Obbligatorio | Perché serve |
|---|---|---|
OrderRequestHeader@orderID | Sì | identifica univocamente l’ordine buyer |
OrderRequestHeader@orderDate | Sì | data formale di emissione |
OrderRequestHeader@type | Sì | distingue new, update, delete |
Total/Money | Sì | controlli di coerenza economica |
ShipTo | Quasi sempre | necessario per evasione e logistica |
BillTo | Quasi sempre | necessario per fatturazione e matching amministrativo |
ItemOut@quantity | Sì | quantità ordinata |
ItemOut@lineNumber | Sì | correlazione di riga |
ItemID/SupplierPartID | Sì | identificazione articolo lato fornitore |
UnitPrice/Money | Sì | prezzo unitario di riferimento |
Elementi come centro di costo, riferimenti contrattuali, tax detail o commenti possono essere opzionali a livello standard, ma spesso vengono resi obbligatori dalle regole del buyer.
Esempio minimo valido di ordine
Questo è un esempio più essenziale, utile per capire il nucleo minimo da far passare in test:
<OrderRequest>
<OrderRequestHeader orderID="PO-2026-00421" orderDate="2026-03-02T09:15:00+01:00" type="new">
<Total>
<Money currency="EUR">250.00</Money>
</Total>
<ShipTo>
<Address>
<Name xml:lang="it">Magazzino Cliente</Name>
</Address>
</ShipTo>
</OrderRequestHeader>
<ItemOut quantity="2" lineNumber="1">
<ItemID>
<SupplierPartID>SKU-001</SupplierPartID>
</ItemID>
<ItemDetail>
<UnitPrice>
<Money currency="EUR">125.00</Money>
</UnitPrice>
<Description xml:lang="it">Prodotto A</Description>
<UnitOfMeasure>EA</UnitOfMeasure>
</ItemDetail>
</ItemOut>
</OrderRequest>
Se questo scenario minimo non viene gestito in modo robusto, il resto del progetto va fermato e corretto prima di aggiungere casi più ricchi.
Sequenza visiva del flusso
Buyer Procurement F-Merchant ERP / OMS
| | |
| ---- OrderRequest ------> | |
| | -- crea ordine interno -->|
| | <- esito / ID interno ----|
| | |
| <--- stato tecnico / ack? | |
| | |
Lettura pratica del diagramma:
- il buyer trasmette l’
OrderRequesta F-Merchant; - F-Merchant valida, mappa e crea l’ordine applicativo;
- l’ordine viene propagato a ERP o OMS;
- i sistemi downstream restituiscono l’esito utile per proseguire con conferme ed evasione.
Dal Carrello all’Ordine
Il percorso che porta alla generazione di un Ordine di Acquisto attraversa tre passaggi distinti:
- PunchOutOrderMessage: Al termine della sessione di shopping sul sito del fornitore, il carrello viene restituito al sistema e-procurement dell’acquirente sotto forma di PunchOutOrderMessage. In questa fase non esiste ancora alcun impegno formale.
- Purchase Requisition (Richiesta di Acquisto): Il carrello viene convertito in una richiesta interna, sottoposta al flusso di approvazione aziendale (limiti di spesa, autorizzazioni gerarchiche, verifiche di budget).
- OrderRequest (Ordine di Acquisto): Solo dopo l’approvazione finale il sistema genera e trasmette l’OrderRequest al fornitore.
L’OrderRequest rappresenta il primo documento che impegna formalmente l’acquirente al pagamento. Tutto ciò che precede — il carrello e la richiesta di acquisto — ha valore esclusivamente interno e non vincola in alcun modo verso il fornitore.
Note di implementazione F-Merchant
Nel contesto F-Merchant, l’ordine in ingresso deve essere tradotto senza ambiguità in un ordine applicativo e poi, di norma, inoltrato a ERP o sistemi di fulfillment. I punti critici sono:
- deduplicazione degli ordini in caso di retry o ritrasmissione buyer;
- mantenimento del legame tra
orderIDbuyer e ordine interno F-Merchant; - mapping delle righe tramite
SupplierPartIDo codici equivalenti stabili; - normalizzazione di quantità, unità di misura, valuta e imposte;
- separazione tra dato ricevuto e dato eventualmente ricalcolato internamente.
Una buona integrazione non si limita a “creare un ordine”: deve anche dimostrare tracciabilità tra documento ricevuto, ordine interno e movimento ERP.
Mapping minimo consigliato
| Dato cXML | Significato | Target tipico in F-Merchant | Nota |
|---|---|---|---|
orderID | numero ordine buyer | riferimento esterno ordine | non deve essere perso nei sistemi downstream |
orderDate | data ordine | timestamp documento esterno | utile per audit e SLA |
type | stato logico del messaggio | azione applicativa | guida new, update, delete |
SupplierPartID | codice articolo buyer-fornitore | SKU/catalog reference | chiave primaria del mapping riga |
lineNumber | numero riga ordine | riferimento riga interno/ERP | indispensabile per conferme e fatture |
ShipTo | destinazione merce | anagrafica spedizione | va validata contro indirizzi ammessi |
BillTo | destinatario fattura | anagrafica amministrativa | utile per matching fiscale/contabile |
Money/@currency | valuta ordine o riga | valuta ordine interno | mismatch qui produce rifiuti o rilavorazioni |
Errori comuni e cause tipiche
| Problema | Causa frequente | Effetto |
|---|---|---|
| Ordine duplicato | retry buyer senza deduplica lato fornitore | doppia creazione ordine |
| Riga non riconosciuta | SupplierPartID non mappato o obsoleto | ordine parziale o rifiutato |
| Totale non coerente | rounding, imposte o prezzi divergenti | contestazione o blocco ERP |
| Spedizione non processabile | ShipTo incompleto o non ammesso | evasione ferma |
| Update gestito come nuovo ordine | ignorato type="update" | disallineamento operativo |
| Cancellazione non propagata | delete non instradato ai sistemi downstream | evasione di ordine annullato |
Test minimi consigliati
Prima del go-live, almeno questi test dovrebbero essere obbligatori:
- ricezione di un ordine
newcon una riga valida; - ricezione di un ordine multi-riga con quantità e prezzi corretti;
- ordine con SKU sconosciuto e gestione del rifiuto o dell’eccezione;
- retry dello stesso
orderIDper verificare la deduplica; - aggiornamento
type="update"con modifica quantità; - cancellazione
type="delete"con verifica di propagazione verso ERP o OMS.
Gestione delle Modifiche
L’attributo type dell’elemento OrderRequestHeader consente di gestire l’intero ciclo di vita dell’ordine senza dover ricorrere a comunicazioni fuori sistema:
new: Identifica un ordine originale, trasmesso per la prima volta al fornitore.update: Indica una modifica a un ordine già emesso. Le casistiche più comuni includono il cambio di quantità su una riga, l’aggiunta di nuovi articoli o l’aggiornamento dell’indirizzo di spedizione.delete: Richiede la cancellazione completa dell’ordine. Il fornitore, una volta ricevuto il messaggio, è tenuto a interrompere l’evasione.
Grazie a questo meccanismo, ogni variazione viene tracciata in modo strutturato e resta collegata all’ordine originario tramite il campo orderID.
Collegamento ai Contratti Quadro
Quando l’ordine fa riferimento a un Contratto Quadro (Master Agreement), l’elemento MasterAgreementIDInfo all’interno dell’OrderRequestHeader permette di collegare la riga d’ordine al contratto di riferimento. Questo consente al sistema e-procurement di monitorare automaticamente la spesa effettiva rispetto al valore pattuito nell’accordo, offrendo piena visibilità sul consumo del budget contrattuale.