Documentazione a supporto degli Scendari d'Uso
Per supportare i vari scenari d'uso gestiti, vengono forniti alcuni casi d'uso come esempi.
Nota: Sebbene l'utilizzo dei servizi consenta implementazioni diverse da quelle specificate, si ricorda che le funzionalità supportate sono quelle descritte nei Casi d'Uso indicati.
General Master Data
Default campo ditta nei data transfer object (DTO)
Nelle chiamate POST, è possibile specificare il campo 'ditta' o 'dittaCg18' all'interno del body della chiamata.
Un esempio pratico: Si desidera inserire un documento con tipo documento C-DDT per il cliente 1 e per la ditta 1000.
Fino alla versione 202403000, il campo 'ditta' doveva essere definito obbligatoriamente per ogni proprietà del body, per cui era necessario popolare il campo 'ditta' o 'dittaCg18' come nell'esempio json sotto riportato:
{
"ditta": "1000",
"valutaCg08": "EURO",
"anagraficaDocumentoDitta": {
"dittaCg18": "1000",
"codDocumMg36": "C-DDT",
"indStaperMg36": 1.0
},
"customerSupplierMG": {
"dittaCg18": "1000",
"tipocfCg40": 0,
"cliFor": 1
},
"sezdoc": "00",
"storageWH": {
"dittaCg18": "1000",
"codDep": "00"
},
"righe": [
{
"ditta": "1000",
"progrRiga": 1.0,
"codartMg66": "ART001",
"descart": "Descrizione articolo",
"qta1": 15.000
}
]
}
Dalla versione 202501000 è stata introdotta una logica di default per il campo 'ditta' nei Data Transfer Object (DTO), per cui se il valore del campo 'ditta' dell'entità "root" non viene fornito o è nullo, viene automaticamente popolato con il codice ditta ricavato dalla sessione utente corrente (parametro 'company'). Questa operazione si propaga a tutte le entità 'external' ed 'internal' associate.
Di conseguenza, prendendo in considerazione sempre l'esempio di cui sopra, l'utente ha sempre la stessa chiamata:
POST {{webapi_base_url}}/api/v1/{{scope}}/MG/Documento?company=1000
ma nelle proprietà del body non è più necessario definire il campo 'ditta' o 'dittaCg18', così come nell'esempio json sotto riportato:
{
"valutaCg08": "EURO",
"anagraficaDocumentoDitta": {
"codDocumMg36": "C-DDT",
"indStaperMg36": 1.0
},
"customerSupplierMG": {
"tipocfCg40": 0,
"cliFor": 1
},
"sezdoc": "00",
"storageWH": {
"codDep": "00"
},
"righe": [
{
"progrRiga": 1.0,
"codartMg66": "ART001",
"descart": "Descrizione articolo",
"qta1": 15.000
}
]
}
Nota Bene: Se si definisce comunque il campo 'ditta' in una proprietà del body, è necessario definirlo su tutte le proprietà che compongono il body.
Inserimento minimale di una anagrafica generale
Qui di seguito è riportato l'esempio di inserimento di un'anagrafica generale, con i dati minimi.
{{webapi_base_url}}/{{api}}/V2/{{scope}}/co/generalmasterdataco?company={{azienda}}
{
"city": "Misano",
"isValidGeneralMasterData": 1.0,
"legalName": "Anagrafica test WebApi ",
"nationCode": 86.0,
"taxCity": "Misano",
"taxLegalName": "Anagrafica prova WebApi",
"taxNationCode": 86.0
}
Inserimento minimale di un Cliente/Fornitore
Per inserire un cliente o un fornitore, è necessario aver precedentemente inserito i dati anagrafici comuni e, nel caso dell’inserimento di un cliente, indicare il codice corrispondente dei dati anagrafici comuni, come mostrato nell’esempio seguente:
{{webapi_base_url}}/{{api}}/v2/{{scope}}/co/CustomerSupplierCO?company={{azienda}}
{
"customerSupplierType": 0,
"generalMasterDataCode": 980,
"paymentTermCode": "201",
"currencyCode": "EURO",
"AgenteCode" : "Agente",
"OfficeCode": 1,
"VatCode": 22,
"additionalInformation": {
"macroAreaCode": "UE",
"areaCode": "ITA",
"zoneCode": null,
"macrocategoryCode": "MCQ",
"categoryCode": "CA1",
"subCategory": "SC1"
}
}
Ricerca di un Cliente/Fornitore per Codice Fiscale e/o Partita IVA
Tramite la chiamata
{{webapi_base_url}}/api/v1/{{scope}}/CO/lookup/CustomerSupplierCO?metadata=true&company={{defaultCompany}}&_op=search
è possibile effettuare la ricerca di un cliente per Partita IVA o Codice Fiscale o per Ragione sociale.
{
"filters":
{
"items":
[
{
"comparer": 0,
"propertyName": "CustomerSupplierCO_Tipocf",
"value": "0"
},
{
"operator": 1,
"items":
[
{
"propertyName": "CustomerSupplierCO_GeneralMasterDataCO_Partiva",
"comparer": 0,
"value": "25052733463"
},
{
"operator": 2,
"propertyName": "CustomerSupplierCO_GeneralMasterDataCO_Codfiscale",
"comparer": 30,
"value": "MRARSS13S08H501H"
},
{
"operator": 2,
"propertyName": "CustomerSupplierCO_GeneralMasterDataCO_RagSoAnag",
"comparer": 20,
"value": "ROSSI"
}
]
}
]
},
"pageSize": 5,
"pageNumber": 0
}
Ricerca di una Causale Contabile
Per effettuare la ricerca di una causale contabile è necessario utilizzare una richiesta POST. Ecco un esempio:
{{webapi_base_url}}/{{api}}/v2/{{scope}}/CO/AccountingReasonCodeCO/search?company={{azienda}}&getTotalCount=true
{
"filters": {
"items": [
{
"operator": 0,
"propertyName": "alias",
"comparer": 0,
"value": "FTV1"
}
]
},
"pageSize": 0,
"pageNumber": 0
}
Inserimento di un Anagrafica Agente
Per inserire un agente è necessario utilizzare una richiesta POST. Ecco un esempio:
{{webapi_base_url}}/{{api}}/v2/{{scope}}/co/AgentCO?company={{azienda}}
{
"code": "008",
"companyCode": 2.0,
"generalMasterDataCode": 2593,
"extensionData": [],
"additionalData": {},
"pluginData": {}
}
Inserimento di una Nazione
Per inserire una Nazione è necessario utilizzare una richiesta POST. Ecco un esempio:
{{webapi_base_url}}/{{api}}/v2/{{scope}}/co/NationCO?company={{azienda}}
{
"code": 811.0,
"currencyCode": "EURO",
"description": "Nazione Italia Webapi",
"euEntryDate": "1995-01-01T00:00:00",
"iso3166Alpha2": "IT",
"iso3166Alpha3": "ITA",
"iso3166Description": "ITALY",
"iso3166Number": "380",
"isoCode": "IT",
"isSepaStandardUsed": 1,
"nationType": 1.0,
"sianCode": null,
"vatNumberLength": "11"
}
MacroCategoria - Categoria - Sottocategoria
Creazione di una MacroCategoria
Per creare una macrocategoria, è necessario utilizzare una richiesta POST. Ecco un esempio:
{{webapi_base_url}}/api/v1/{{scope}}/CO/MacroCategoryCO?company={{defaultCompany}}
{
"descrmacrocat": "Test WebAPI - Macrocategoria",
"macrocat": "{{codMacroCat}}",
"tipocf": "{{TipoCF}}",
}
Questa è la response:
{
{
"descrmacrocat": "Test WebAPI - Macrocategoria",
"dittaCg18": 1000.0,
"macrocat": "MCQ",
"tipocf": 0.0,
"categorie": [],
"extensionData": [],
"additionalData": {},
"pluginData": {}
}
}
Creazione di una Categoria
Per creare una categoria associata a una macrocategoria, è necessario utilizzare una richiesta POST. Ecco un esempio:
{{webapi_base_url}}/{{api}}/v1/{{scope}}/CO/CategoryCO?company={{defaultCompany}}
{
"categ": "{{codCat}}",
"descrcat": "Test WebAPI - Categoria",
"macrocatMg10": "{{codMacroCat}}",
"tipocfMg10": "{{TipoCF}}"
}
Questa è la response:
{
"categ": "CA1",
"descrcat": "Test WebAPI - Categoria",
"dittaCg18": 1000.0,
"macrocatMg10": "MCQ",
"tipocfMg10": 0.0,
"extensionData": [],
"additionalData": {},
"pluginData": {}
}
Creazione di una SottoCategoria
Per creare una sottocategoria associata a una categoria, è necessario utilizzare una richiesta POST. Ecco un esempio:
{{webapi_base_url}}/{{api}}/v1/{{scope}}/CO/SubCategoryCO?company={{defaultCompany}}
{
"categMg11": "{{codCat}}",
"descrsottocat": "Test WebAPI - SottoCategoria",
"macrocatMg11": "{{codMacroCat}}",
"sottcat": "{{codSubCat}}",
"tipocfMg11": "{{TipoCF}}"
}
Questa è la response:
{
"categMg11": "CA1",
"descrsottocat": "Test WebAPI - SottoCategoria",
"dittaCg18": 1000.0,
"macrocatMg11": "MCQ",
"sottcat": "SCT",
"tipocfMg11": 0.0,
"extensionData": [],
"additionalData": {},
"pluginData": {}
}
Inserimento minimale di un codice articolo
Tramite la chiamata POST
{{webapi_base_url}}/api/v2/{{scope}}/WH/ItemWH?company={{defaultCompany}}
è possibile inserire un nuovo codice articolo.
Qui di seguito è riportato l'esempio di inserimento di un codice articolo, con i dati minimi.
{
{
"code": "{{ItemCode}}",
"companyCode": {{defaultCompany}},
"description": "Test webapi articolo",
"itemStatusCode": 50,
"vatCode": "22",
"createDate": "2024-05-08T00:00:00",
"updateDate": "2025-10-06T00:00:00",
"barcodes": [],
"currentStatus": {
"statoCorrente": {
"idStato": 4,
"seq": -1,
"indTipoStato": 0
}
},
"descriptions": [
{
"companyCode": 1000.0,
"description": "Test webapi articolo"
}
],
"intrastatData": null,
"packagings": [
{
"capacity": 0.0,
"companyCode": 1000.0,
"packagingCode": "CD",
"packagingPieces": 1.000,
}
],
"stocks": [
{
"companyCode": 1000.0,
"coverIndex": 0.000,
"isAutosaveStocksQuantity": 1,
"maxStock": 100.000,
"minStock": 10.000,
"storageCode": "00",
}
]
}
}
Servizio di lettura Barcode articoli
Il servizio di lettura della Barcode articoli consente di leggere, mediante chiamata search, gli articoli per i quali sono stati configurati e gestiti i codici Barcode. Ad esempio:
POST {{webapi_base_url}}/{{api}}/v2/{{scope}}/WH/ItemBarCodeWH/search?company={{defaultCompany}}
Con indicazione degli operatori di filtro nel body:
{
"filters": {
"operator": 0,
"items": [
{
"operator": 0,
"propertyName": "itemcode",
"comparer": 0,
"value": "ARTICOLO3"
}
]
},
"pageSize": 0,
"pageNumber": 0
}
Esempio di response:
{
"totalCount": 0,
"pageSize": 1,
"pageNumber": 0,
"data": [
{
"barcode": "0000000000079",
"barcodeType": 0.0,
"companyCode": 1000.0,
"hyperMediaId": null,
"isCheckdigitCalculation": 1.0,
"isPrintLabels": 1.0,
"isSendToCashRegisters": 1.0,
"itemCode": "ARTICOLO3",
"itemVariantCode": "",
"managementType": 0.0,
"originType": 1.0,
"piecesPerPackaging": 1.000,
"extensionData": [],
"additionalData": {},
"pluginData": {}
}
],
"extensionData": [],
"additionalData": {},
"pluginData": {}
}
Servizio di lettura e ricerca ItemStatusWH
Il servizio ItemStatusWH consente di leggere e cercare gli stati standard degli articoli. Ad esempio:
{{webapi_base_url}}/{{api}}/v1/{{scope}}/WH/ItemStatusWH/search?company={{defaultCompany}}
Con indicazione degli operatori di filtro nel body:
{
"filters": {
"items": [
{
"operator": 1,
"propertyName": "indStato",
"comparer": 0,
"value": 10
}
]
},
"pageSize": 0,
"pageNumber": 0
}
Esempio di response:
{
"totalCount": 0,
"pageSize": 1,
"pageNumber": 0,
"data": [
{
"descr": "In progettazione",
"indStato": 10.0,
"extensionData": [],
"additionalData": {},
"pluginData": {}
}
],
"extensionData": [],
"additionalData": {},
"pluginData": {}
}
Gestione degli stati parametrici su clienti-fornitori, articoli e documenti
Il servizio StateManagementService permette di visualizzare lo Stato Attuale di un oggetto, in base alla guid identificativa e consente di cambiare lo stato attuale con un suo stato disponibile.
Lo Stato Attuale è gestito per le seguenti entità:
- CustomerSupplierMG (solo GET)
- CustomerSupplierCO
- DocumentoCorpoMG
- DocumentoTestataMG
- ItemWH
E' possibile visualizzare e/o modificare lo Stato Attuale di un'oggetto, se da Interfaccia per l'entità interessata è stato definito un Flusso predefinito ed in base ai permessi relativi all'utente che si sta utilizzando.
Tramite una semplice chiamata GET è possibile visualizzare nella response lo Stato Attuale e gli Stati Disponibili per un determinato utente. Per esempio se si desidera verificare lo stato attuale del codice articolo SW6 per utente admin, la chiamata GET dovrà essere così strutturata:
GET {{webapi_base_url}}/{{api}}/v1/{{scope}}/WH/ItemWH/SW6?company={{defaultCompany}}&user=admin
e nella response è riportato lo stato del codice articolo preso in esame e degli stati disponibili per l'utente admin.
"statoAttualeCO": {
"statoCorrente": {
"idStato": 4,
"seq": -1,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
"statiDisponibili": [
{
"idStato": 3,
"seq": 3,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
{
"idStato": 4,
"seq": 4,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
{
"idStato": 5,
"seq": 5,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
{
"idStato": 6,
"seq": 6,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
}
}
Se si esegue la stessa chiamata GET, ma specificando un altro utente (che non ha gli stessi permessi dell'utente 'admin' di cui sopra), la response riporterà sempre lo stesso Stato Attuale, ma riporterà solo gli Stati disponibili per l'altro utente.
Tramite la chiamata PUT oppure PATCH invece è possibile modificare il valore dello Stato Attuale dell'entità presa in considerazione, per cui per esempio considerando sempre il codice articolo SW6 la chiamata PATCH deve essere così strutturata:
PATCH {{webapi_base_url}}/{{api}}/v1/{{scope}}/WH/ItemWH/SW6?company={{defaultCompany}}&user=admin
e nel body si deve indicare un nuovo idStato tra quelli disponibili :
{
"statoAttualeCO": {
"statoCorrente": {
"idStato": 5,
"seq":5,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
}
}
}
Tramite il servizio StateManagementService ed attraverso la relativa guid, è possibile visualizzare il currentState (che corrisponde allo StatoAttuale) esistente per l'oggetto preso in esame, ed i availableStates (che corrisponde all'elenco degli Stati disponibili). Ad esempio prendendo sempre in considerazione il codice articolo 'SW6' per l'utente admin, si esegue una chiamata GET, specificando la corrispondente guid del suddetto codice articolo:
GET {{webapi_base_url}}/{{api}}/v1/{{scope}}/CO/StateManagementService/{{guid}}?company={{defaultCompany}}&user=admin
e la response sarà così riportata:
{
"currentState": {
"idStato": 4,
"description": "In uso",
"seq": -1,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
"availableStates": [
{
"idStato": 3,
"description": "Rilasciato",
"seq": 3,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
{
"idStato": 4,
"description": "In uso",
"seq": 4,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
{
"idStato": 5,
"description": "In esaurimento",
"seq": 5,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
{
"idStato": 6,
"description": "Dismesso",
"seq": 6,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
}
]
}
Oppure
Per esempio se si desidera verificare lo StatoAttuale di un documento, si esegue una chiamata GET (come riportata), specificando la corrispondente guid della TestataDocumento
GET {{webapi_base_url}}/{{api}}/v1/{{scope}}/CO/StateManagementService/{{guidTestataDocumento}}?company={{defaultCompany}}&user=admin
e la response riporterà lo StatoAttuale (o currentState) del documento e gli eventuali Stati Disponibili (o availableStates) quindi sarà così riportata:
{
{
"currentState": {
"idStato": 41,
"description": "Confermato",
"seq": -1,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
"availableStates": [
{
"idStato": 40,
"description": "Acquisito",
"seq": 1,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
{
"idStato": 41,
"description": "Confermato",
"seq": 2,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
{
"idStato": 42,
"description": "Bloccato",
"seq": 3,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
{
"idStato": 43,
"description": "In spedizione",
"seq": 4,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
{
"idStato": 44,
"description": "Evaso",
"seq": 5,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
}
]
}
}
oppure se si desidera verificare lo StatoAttuale di una riga all'interno del documento preso in esame, con una semplice GET sul documento, si recupera la corrispondente guid identificativa della suddetta riga e poi si esegue la seguente chiamata GET per il servizio StateManagementCO:
GET {{webapi_base_url}}/{{api}}/v1/{{scope}}/CO/StateManagementService/{{guidRigaDocumento}}?company={{defaultCompany}}&user=admin
e la response riporterà lo StatoAttuale (o currentState) della riga documento e gli eventuali Stati Disponibili (o availableStates) quindi sarà così riportata:
{
{
"currentState": {
"idStato": 46,
"description": "In evasione",
"seq": -1,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
"availableStates": [
{
"idStato": 45,
"description": "Da evadere",
"seq": 1,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
{
"idStato": 46,
"description": "In evasione",
"seq": 2,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
{
"idStato": 47,
"description": "Evasa",
"seq": 3,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
{
"idStato": 48,
"description": "Bloccata",
"seq": 4,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
{
"idStato": 49,
"description": "Annullata",
"seq": 5,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
}
]
}
}
Tramite il servizio StateManagementService e l'azione setstate è anche possibile avanzare il 'currentState' esistente per un oggetto, sempre attraverso la relativa guid, indicando un nuovo 'idStato' tra quelli disponibili per l'utente utilizzato. In questo caso si esegue la seguente chiamata POST:
POST {{webapi_base_url}}/{{api}}/v1/{{scope}}/CO/StateManagementService/setstate?company={{defaultCompany}}&user=admin
e nel body si specifica la guid dell'oggetto in esame ed il nuovo idStato, specificandolo nel campo "newState" :
{
"guidObject": "{{guid}}",
"newState": 5,
"entityCodeForDefault": null
}
Per esempio, preso in esame un determinato cliente in stato 'Codificato' (idStato=7), dopo le opportune verifiche amministrative, si desidera avanzare lo stato del cliente, da 'Codificato' a 'In uso'(idStato=8) per cui si esegue la chiamata POST indicando nel body la guid del cliente:
POST {{webapi_base_url}}/{{api}}/v1/{{scope}}/CO/StateManagementService/setstate?company={{defaultCompany}}&user=admin
e nel body si specifica la guid dell'oggetto in esame (in questo caso del Cliente) ed il nuovo idStato, specificandolo nel campo "newState" :
{
"guidObject": "{{guidCliente}}",
"newState": 8,
"entityCodeForDefault": null
}
Si può anche verificare il caso in cui si definisce un Flusso predefinito in un secondo momento, per cui alla creazione di un codice articolo per esempio il codice 'AW1' lo StatoAttualeCO è NULL. Da Interfaccia si indica un flusso come 'Predefinito' per l'entità Articoli. A questo punto, tramite l'azione 'setstate' è possibile impostare il valore dello stato 'Predef.' appartenente al corrispondente 'Flusso predefinito' per entità Articoli.
In questo caso si esegue la stessa chiamata POST di cui sopra, impostando però il parametro "newState" a null ed "entityCodeForDefault": 6 (che corrisponde all'entità Articoli), specificando la guid dell'oggetto in esame (quindi la guid del codice articolo preso in esame AW1)
{
"guidObject": "{{guid}}",
"newState": null,
"entityCodeForDefault": 6
}
Nella response sarà riportato il "currentState" ed i "availableStates", come sotto riportato:
{
"currentState": {
"idStato": 10002,
"description": "articolo inserito",
"seq": -1,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
"availableStates": [
{
"idStato": 10002,
"description": "articolo inserito",
"seq": 1,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
{
"idStato": 10003,
"description": "articolo confermato",
"seq": 2,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
}
]
}
Tramite il servizio StateManagementService e l'azione history è anche possibile visionare i vari avanzamenti di stato dell'oggetto preso in esame, sempre attraverso la relativa guid. Si effettua una chiamata GET così strutturata:
GET {{webapi_base_url}}/{{api}}/v1/{{scope}}/CO/StateManagementService/history/{{guid}}?company={{defaultCompany}}
e nella response sarà riportato il "currentState" e lo "statusOperationHistory" con diverse informazioni:
{
"currentState": {
"idStato": 10003,
"description": "articolo confermato",
"seq": -1,
"indTipoStato": 0,
"extensionData": [],
"additionalData": {}
},
"statusOperationHistory": [
{
"idHistory": 135,
"idStatus": 10002,
"validityDate": "2025-03-10T00:00:00",
"updateDate": "2025-03-10T15:00:54.713",
"historyAuto": 0,
"statusDescription": "articolo inserito",
"flowDescription": "Flusso Prova",
"userDescription": "Utente amministratore",
"historyDelete": 1
},
{
"idHistory": 136,
"idStatus": 10003,
"validityDate": "2025-03-21T00:00:00",
"updateDate": "2025-03-21T15:03:39.033",
"historyAuto": 0,
"statusDescription": "articolo confermato",
"flowDescription": "Flusso Prova",
"userDescription": "Utente amministratore",
"historyDelete": 0
}
],
}
Inserimento di una Marca da associare ad un Articolo
Tramite il nuovo servizio BrandWh è possibile creare/inserire una Marca che successivamente può essere associata ad un articolo. Per inserire una nuova Marca occore utilizzare la chiamata di tipo POST, ecco un esempio:
POST {{webapi_base_url}}/api/v1/{{scope}}/WH/BrandWH?company={{defaultCompany}}&user=admin
Con il seguente body minimale:
{
"codMarca": "{{codMarca}}",
"descrmarca": "Marca di test"
}
La response che otterremo sarà:
{
"codMarca": "NikeTest",
"descrmarca": "Marca di test",
"dittaCg18": 1000.0,
"idmediaCg99": null,
"idprov": 8,
"extensionData": [],
"additionalData": {},
"pluginData": {}
}
Servizio BatchInventoryService per Interrogazione Inventario Lotti
Il servizio BatchInventoryService con relativa azione batchinventory consente di ottenere l'interrogazione dell'inventario lotti per gli articoli di magazzino gestiti a lotti, replicando il funzionamento della procedura "Interrogazione e stampa inventario lotti" da Interfaccia.
Nei parametri di input è possibile indicare anche delle condizioni di filtro, di ordinamento e di paginazione.
Per esempio, si esegue la verifica della situazione inventariale del codice articolo LOT_KIT (che gestisce i lotti) sul deposito principale, considerando i "Progressivi da elaborare" pari al parametro "In tempo reale". In questo caso si effettua la seguente chiamata POST:
{{webapi_base_url}}/{{api}}/v1/{{scope}}/WH/BatchInventoryService/batchinventory?company={{defaultCompany}}&user=admin
Nel Body della request in corrispondenza del parametro "searchParameters" si definisce il codice articolo "LOT_KIT" ed il codice deposito principale "00" così come sotto riportato:
{
"entriesCombination": 1,
"progressiveType": 1,
"searchParameters": {
"filterProperties": [
{
"propertyName": "ItemCode",
"fromValue": "LOT_KIT",
"toValue": "LOT_KIT"
},
{
"propertyName": "StorageCode",
"fromValue": "00",
"toValue": "00"
}
],
"pageSize": 0,
"pageNumber": 0
}
}
La response riporta i valori inventariali per codice articolo e per codice lotto, per cui nel nostro esempio il paragrafo "rows" è popolato da tutti i codici lotti movimentati (riportati in corrispondenza del parametro "lotCode") per il codice articolo LOT_KIT, così come sotto riportato:
{
"totalRowsFound": 2,
"totalRowsShowed": 2,
"pageNumber": 0,
"rows": [
{
"itemCode": "LOT_KIT ",
"itemVariantCode": " ",
"itemDescription": "articolo che gestisce i lotti",
"storageCode": "00",
"lotCode": "L1 ",
"lotDescription": "lotto1",
"dueDate": null,
"serialNumber": null,
"palletsCode": null,
"projectCode": null,
"locationCode": null,
"packagingCode": null,
"materialsDyeingCode": null,
"referenceNodeCode": null,
"totalLoadQuantity1": 24.000,
"totalUnloadQuantity1": 9.000,
"totalLoadQuantity2": 0.000,
"totalUnloadQuantity2": 0.000,
"initialStockQuantity1": 0.000,
"currentStockQuantity1": 15.000,
"actualStockQuantity1": 15.000,
"fiscalStockQuantity1": 15.000,
"prodCommQuantity1": 0.000,
"initialStockQuantity2": 0.000,
"currentStockQuantity2": 0.000,
"actualStockQuantity2": 0.000,
"fiscalStockQuantity2": 0.000,
"prodCommQuantity2": 0.000,
"freeUnload2Quantity2": 0.000,
"averageCostQuantity1": 546.670000,
"lastCost": 310.000000
},
{
"itemCode": "LOT_KIT ",
"itemVariantCode": " ",
"itemDescription": "articolo che gestisce i lotti",
"storageCode": "00",
"lotCode": "L2 ",
"lotDescription": "lotto2",
"dueDate": null,
"serialNumber": null,
"palletsCode": null,
"projectCode": null,
"locationCode": null,
"packagingCode": null,
"materialsDyeingCode": null,
"referenceNodeCode": null,
"totalLoadQuantity1": 16.000,
"totalUnloadQuantity1": 6.000,
"totalLoadQuantity2": 0.000,
"totalUnloadQuantity2": 0.000,
"initialStockQuantity1": 0.000,
"currentStockQuantity1": 10.000,
"actualStockQuantity1": 10.000,
"fiscalStockQuantity1": 10.000,
"prodCommQuantity1": 0.000,
"initialStockQuantity2": 0.000,
"currentStockQuantity2": 0.000,
"actualStockQuantity2": 0.000,
"fiscalStockQuantity2": 0.000,
"prodCommQuantity2": 0.000,
"freeUnload2Quantity2": 0.000,
"averageCostQuantity1": 546.670000,
"lastCost": 310.000000
},
]
}
NOTA BENE: Nel caso in cui si indica ProgressiveType=2, il parametro "year" è obbligatorio.
Contabilità Generale
Movimenti di Prima Nota V2
In questa sezione viene illustrato l’utilizzo delle WebAPI V2 per la gestione dei movimenti contabili attraverso i servizi GLEntryFI e InstalmentFI. Questi servizi consentono di registrare e gestire in modo integrato i movimenti di Prima Nota, sia IVA che NON IVA, con particolare attenzione alla creazione delle scadenze.
Ecco un esempio di inserimento Fattura Cliente:
{{webapi_base_url}}/{{api}}/V2/{{scope}}/fi/glentryfi?company={{defaultCompany}}
{
{
"accountingReasonCode": "1",
"Description": "Fattura di vendita",
"amount": 122.00,
"currencyCode": "EURO",
"customerSupplierId": 4,
"documentType": 1.0,
"registrationDate": "2025-12-24",
"documentDate": "2025-12-24",
"sectionalCode": "00",
"documentNumber": 0,
"rows": [
{
"operationType": 1,
"accountId": 3257,
"customerSupplierId": 4,
"amount": 122.00,
"signType": 1
},
{
"operationType": 3,
"accountId": 3686,
"amount": 100.00,
"signType": 2,
"vatRowNumber": 1.0
},
{
"operationType": 2,
"accountId": 3566,
"amount": 22.00,
"signType": 2
}
],
"vatRows": [
{
"rowNumber": 1.0,
"accountId": 3686,
"taxableAmount": 100.00,
"taxAmount": 22.00,
"vatCode": "22",
//"nonDeductibilityVatType" : 1,
"vatAccountingReasonCode": 0.0
}
]
}
Esempio di inserimento Giroconto Contabile:
{{webapi_base_url}}/{{api}}/V2/{{scope}}/fi/glentryfi?company={{defaultCompany}}
{
"accountingReasonCode": "109",
// "registrationDate": "2024-10-21",
"Description": "Giroconto contabile",
"amount": 9.00,
"sectionalCode": "00",
"currencyCode": "EURO",
"movementType": 0,
"officeCode": 0.0,
"rows": [
{
"accountId": 3399,
"amount": 10.00,
"signType": 1,
"operationType": 28
},
{
"accountId": 3382,
"amount": 10.00,
"signType": 2,
"officeCode": 1.0,
"currencyCode": "EURO"
}
],
"vatRows": []
}
Inserimento Scadenze
Servizio per la gestione delle scadenze e dei piani di pagamento, collegato alle registrazioni contabili effettuate con GLEntriFI. Per stabilire l'associazione tra le scadenze e il movimento contabile, è necessario passare il parametro registrationNumber generato dal servizio GLEntryFI al momento della registrazione.
Esempio di inserimento di una scadenza:
{{webapi_base_url}}/{{api}}/V2/{{scope}}/FI/InstalmentFI?company={{defaultCompany}}
{
"acceptanceType": 0,
"accountId": 3257,
"accountingReasonCode": "1",
"accountingRowNumber": 1.0,
"accountStatementProgressive": 0.0,
"accountType": 1.0,
"amount": 61.00,
"art62GoodsType": 0,
"billEffectNumber": 82.0,
"billEffectStatusTransactionType": 0.0,
"billEffectType": 13.0,
"billPresentationType": 0.0,
"billProgressive": 2.0, // progressivo scadenza
"billStatusType": 0.0,
"collectionFees": 0.0,
"commissionSettlementType": 0.0,
"companyCode": 1000,
"currencyAmount": 0.00,
"currencyCode": "EURO",
"currencyCollectionFees": 0.00,
"currencyDocumentTotal": 0.00,
"currencyOriginWithholdingsAmount": 0.00,
"currencyResidualAmount": 0.00,
"currencyResidualAmountExcludingEstimatedEntries": 0.00,
"currencyVatAmount": 0.00,
"currencyWithholdingsAmount": 0.00,
"customerSupplierId": 4,
"description": "Fattura di vendita",
"documentDate": "2025-12-24T00:00:00",
"documentNumber": "19",
"documentTotal": 122.00,
"dueDate": "2026-02-28T00:00:00",
"entryNumber": 9.0,
"entrySectionalCode": "00",
"entryYear": 2025.0,
"exchangeRate": 0.000000,
"exchangeRateAdjustmentOnAccount": 0.00,
"exchangeRateDate": "2025-12-24T00:00:00",
"instalmentNumber": 1.0,
"lastChangeDate": "2025-12-02T14:58:12.063",
"movementType": 0.0,
"originDueDate": "2026-02-28T00:00:00",
"originWithholdingsAmount": 0.00,
"paymentTermId": 56,
"progressiveNumber": 19.0,
"registrationDate": "2025-12-24T00:00:00",
"registrationNumber": "202500002642",
"residualAmount": 61.00,
"residualAmountExcludingEstimatedEntries": 61.00,
"returnExpenseMgmtType": 0.0,
"returnFees": 0.00,
"returnFeesChargedByBank": 0.00,
"sectionalCode": "00",
"stampDutyAmount": 0.0,
"stampDutyCurrencyAmount": 0.00,
"startingDueDate": "2025-12-24T00:00:00",
"totalInstalments": 2.0,
"vatAmount": 11.00
}
Framework
Dlevel e Dlevelkey
Tramite il servizio DlevelEntityName, è possibile recuperare un elenco di informazioni relative alle entità correlate, partendo da un DTO specifico, in modo da poter comprendere i nomi delle Entità (internalNameDeserialization e externalNameDeserialization) per poi valorizzare la proprietà dlevel richiesta in tutte le GET standard.
Il deserialization level è una sintassi che descrive quali rami del grafo, che costituisce l'aggregato, devono essere caricati in una lettura. Sintassi:
[] le parentesi quadre identificano le relazioni interne
le parentesi graffe identificano una relazione esterna
- identifica tutti i nomi di relazioni in quel contesto
Ad esempio, dato un 'DTO name:DocumentoTestataMGDTO si può eseguire la seguente chiamata:
GET {{webapi_base_url}}/api/v1/{{scope}}/FW/DlevelEntityName/DocumentoTestataMGDTO?company={{defaultCompany}}
che riporterà nella response le seguenti informazioni (riporto parziale della response):
[
{
"internalNameDeserialization": "DocumentoDatiAccompagnamentoMG",
"externalNameDeserialization": null,
"relatedDTOEntityName": "DocumentoDatiAccompagnamentoMGDTO",
"relatedDTOPropertyName": "DocumentoDatiAccompagnamentoMG"
},
{
"internalNameDeserialization": "RigheDocumento",
"externalNameDeserialization": null,
"relatedDTOEntityName": "DocumentoRigaMGDTO",
"relatedDTOPropertyName": "Righe"
},
{
"internalNameDeserialization": "DocumentoTestataAgentiMG",
"externalNameDeserialization": null,
"relatedDTOEntityName": "DocumentoTestataAgentiMGDTO",
"relatedDTOPropertyName": "DocumentoTestataAgentiMG"
},
]
Se si desidera visualizzare le informazioni relative all’entità interna 'RigheDocumento', si esegue la stessa chiamata indicando il EntityDTOName:DocumentoRigaMGDTO, per cui:
GET {{webapi_base_url}}/api/v1/{{scope}}/FW/DlevelEntityName/DocumentoRigaMGDTO?company={{defaultCompany}}
che riporterà nella response tutte le 'internalNameDeserialization' e le 'externalNameDeserialization' per il DTO specificato (riporto parziale della response):
[
{
"internalNameDeserialization": "DocumentoCorpoCOINMG",
"externalNameDeserialization": null,
"relatedDTOEntityName": "DocumentoRigaCOINMGDTO",
"relatedDTOPropertyName": "DocumentoRigaCOINMG"
},
{
"internalNameDeserialization": null,
"externalNameDeserialization": "CodIvaCO",
"relatedDTOEntityName": "VatCodeCODTO",
"relatedDTOPropertyName": "CodIva"
},
{
"internalNameDeserialization": "DocumentoCorpoProgettiMG",
"externalNameDeserialization": null,
"relatedDTOEntityName": "DocumentoRigaProgettiMGDTO",
"relatedDTOPropertyName": "DocumentoRigaProgettiMG"
},
{
"internalNameDeserialization": "RigaRiferimenti",
"externalNameDeserialization": null,
"relatedDTOEntityName": "DocumentoRigaRiferimentoMGDTO",
"relatedDTOPropertyName": "RigaRiferimenti"
},
{
"internalNameDeserialization": null,
"externalNameDeserialization": "OfficeCO",
"relatedDTOEntityName": "OfficeCODTO",
"relatedDTOPropertyName": "OfficeCO"
}
]
A questo punto si può eseguire la chiamata GET di un documento specifico e recuperare solo le informazioni desiderate, limitando ad esempio la chiamata GET :
all'entità esterna codici iva da result DocumentoRigaMGDTO ("externalNameDeserialization": "CodIvaCO")
all'entità interna progetti da result DocumentoRigaMGDTO ("internalNameDeserialization": "DocumentoCorpoProgettiMG")
all'entità esterna ClienteFornitore da result DocumentoTestataMGDTO ("externalNameDeserialization": "CustomerSupplierMG")
all'entità esterna AnagraficaDocumentoDitta da result DocumentoTestataMGDTO ("externalNameDeserialization": "CompanyDocumentMasterDataMG")
In questo caso la sintassi corretta si traduce in "[RigheDocumento[CodIvaCO][DocumentoCorpoProgettiMG]][CustomerSupplierMG],CompanyDocumentMasterDataMG}" e deve essere convertita nel formato URL-encoded per aggiungerlo come valore del parametro dlevel.
Quindi si esegue la chiamata GET del documento, il cui numreg corrisponde a 202500000024 e si valorizza nella chiamata anche il parametro dlevel=%5BRigheDocumento%7BCodIvaCO%2COfficeCO%7D%5BDocumentoCorpoProgettiMG%5D%5D%7BCustomerSupplierMG%2C%20CompanyDocumentMasterDataMG%7D: In questo modo nella response saranno riportati solo i valori dell'entità sopra descritte nell'esempio.
Si è reso disponibile anche il servizio DlevelKey, con cui è possibile avere un elenco di tutte le serializzazioni predefinite da usare nella proprietà dlevelkey e presente in tutte le chiamte GET standard del DTOname indicato come parametro nella chiamata.
Ad esempio, dato come 'DTO name' CustomerSupplierCODTO, tramite il servizio DlevelKey, se si esegue la seguente chiamata:
GET {{webapi_base_url}}/api/v1/{{scope}}/FW/DlevelEntityName/CustomerSupplierCODTO?company={{defaultCompany}}
e nella response saranno riportate alcune informazioni, tra cui il parametro 'dlevelkey':
[
{
"entityDTOName": "CustomerSupplierCODTO",
"dLevelKeyName": "DL_CustomerSupplierCO_GeneralMasterDataCO",
"deserializationLevel": "{GeneralMasterDataCO}"
},
{
"entityDTOName": "CustomerSupplierCODTO",
"dLevelKeyName": "DL_GLEntryFI_AnaGen",
"deserializationLevel": "{GeneralMasterDataCO}"
},
{
"entityDTOName": "CustomerSupplierCODTO",
"dLevelKeyName": "DL_IntrastatDataHeaderIN_AnaGen",
"deserializationLevel": "{GeneralMasterDataCO}"
}
]
At this point, for example, you execute a GET call for CustomerSupplierCO, with idclifor=5, and also set the dlevelkey parameter to DL_CustomerSupplierCO_GeneralMasterDataCO:
GET {{webapi_base_url}}/api/v1/{{scope}}/CO/CustomerSupplierCO/5?company={{defaultCompany}}
In this case, the response will display the properties of the root 'CustomerSupplier' and the entity {GeneralMasterDataCO} as shown in the JSON below:
{
"gmdUpdateAdditionalParams": null,
"clifor": 2.0,
"codAbiCg12": null,
"codCabCg13": null,
"codiceCg28": null,
"contoCg24": null,
"contorCg24": null,
"contratto": null,
"datavaliva": null,
"dittaCg18": 1000.0,
"flgArt62": 0,
"flgAttivo": 1.0,
"flgCointestati": 0.0,
"flgIntercompany": 0.0,
"ggscadfix": null,
"gruppoCg10": 80.0,
"guid": "a4630426-554a-4c95-be8b-4bb9bf52a0d2",
"idclifor": 5,
"idmediaCg99": null,
"indElenchimov3000": 99,
"intermedioCg40": null,
"lastchange": "2024-12-04T11:40:36.383",
"progREf08": null,
"tipocf": 1.0,
"idExtendedAttributeEntity": 3,
"idExtendedAttributeSubEntity": 4,
"generalMasterDataCO": {
"alias": null,
"auidAu04": null,
"cap": "20121 ",
"capcor": null,
"capfisc": "20121 ",
"cellnum": null,
"citta": "MILANO",
"cittacor": null,
"cittafisc": "MILANO",
"codfiscale": "00000452151",
"codice": 4,
"codiceCg07": 86.0,
"codiceCg15": null,
"codiceCgc0": null,
"codicecorCg07": null,
"codiceident": null,
"codicesfed": null,
"codrichiamo": null,
"cognome": null,
"comfisCg01": "F205",
"comnascita": null,
"comnascitaCg01": null,
"datanascita": null,
"datavalid": null,
"dtfinepec": null,
"dtiniziopec": null,
"faxnum": null,
"flgAnagval": 1.0,
"flgFattpa": 0,
"flgNoblacklist": 0.0,
"flgOmonimo": 0.0,
"flgPrsfis": 0.0,
"idmediaCg99": null,
"indemail": null,
"indFiscale": "Contrada Fattoria di Greg 1",
"indFiscaleEX": null,
"indirCor": null,
"indirCorEX": null,
"indirizzo": "Contrada Fattoria di Greg 1",
"indirizzoEX": null,
"indsoggrit": 0.0,
"indweb": null,
"lastchange": "2024-12-04T11:40:36.357",
"nome": null,
"partitaIVA": "00000452151",
"partiva": "00000452151",
"partivaEst": null,
"prov": "MI",
"provcor": null,
"provfisc": "MI",
"provnascita": null,
"ragSoAnag": "Greg",
"ragsoanagex": null,
"ragsocor": null,
"ragsocorex": null,
"ragsofisc": "Greg",
"ragsofiscex": null,
"rapazestCg16": null,
"sesso": 0.0,
"statofed": null,
"statofedfisc": null,
"statofiscCg07": 86.0,
"statonascitaCg07": null,
"tel1num": null,
"tel2num": null,
"idExtendedAttributeEntity": 1,
"idExtendedAttributeSubEntity": 2,
"extensionData": [],
"additionalData": {}
},
"extensionData": [],
"additionalData": {}
}
Metadata DTO
E' il servizio che, dato un EntityDTO di riferimento, produce una lista che contiene la mappatura del DTO. Per fare le analisi sulla struttura del DTO, sono forniti i seguenti strumenti:
- Servizio GET - FW/MetadataDTO/EntityDTOname
È stato introdotto un nuovo servizio GET nel modulo IntegrationInfrastructure per la risorsa MetadataDTO. Questo servizio richiede come parametro un EntityDtoName e consente di visualizzare la struttura dell'oggetto, comprese tutte le sue proprietà e le relazioni internal ed external.
Nella response sono visualizzate anche tutte le relazioni dell'entità DTO nel seguente modo:
-
Relazioni interne all’entità root o padre (che appartengono all’entità di partenza e vengono memorizzate dal CRUD nella stessa transazione)
-
Relazioni esterne all’entità (utilizzate per la semplice decodifica dei dati presenti su altre entità)
Ad esempio se si desidera visualizzare la struttura di DocumentoTestataMGDTO, si deve eseguire la seguente chiamata:
GET {{webapi_base_url}}/api/v1/{{scope}}/FW/MetadataDTO/CustomerSupplierCODTO?withdescriptions=true
Il servizio riporta in formato JSON la struttura dell’EntityDTOName. Qui di seguito è riportato solo una parte del json della response:
{
"name": "Documento",
"type": "DocumentoTestataMGDTO",
"entityName": "DocumentoTestataMG",
"properties": [
{
"propertyName": "bancaCg12",
"propertyType": "Decimal",
"isKey": false,
"mandatory": false,
"entityPropertyName": "BancaCg12",
"entityPropertyType": "System.Decimal",
"rangeValue": null,
"description": null,
"shortDescription": null,
"maxLength": 5,
"scale": 0
},
{
"propertyName": "cambio",
"propertyType": "Decimal",
"isKey": false,
"mandatory": false,
"entityPropertyName": "Cambio",
"entityPropertyType": "System.Decimal",
"rangeValue": null,
"description": null,
"shortDescription": null,
"maxLength": 12,
"scale": 6
},
{
"propertyName": "cauprestCg15",
"propertyType": "String",
"isKey": false,
"mandatory": false,
"entityPropertyName": "CauprestCg15",
"entityPropertyType": "System.String",
"rangeValue": null,
"description": null,
"shortDescription": null,
"maxLength": 4,
"scale": null
},
{
"propertyName": "causmagMg51",
"propertyType": "Decimal",
"isKey": false,
"mandatory": false,
"entityPropertyName": "CausmagMg51",
"entityPropertyType": "System.Decimal",
"rangeValue": null,
"description": null,
"shortDescription": null,
"maxLength": 4,
"scale": 0
},
]
}
Nella response sono riportate tutte le proprietà che compongono 'DocumentoTestataMGDTO', ma sono anche riportate tutte le relazioni, legate a 'DocumentoTestataMGDTO'. A titolo di esempio qui di seguito è riportata la relationName: "righe" :
"relationName": "righe",
"relationType": "DocumentoRigaMGDTO[]",
"entityRelationName": "RigheDocumento",
"entityRelationType": "DocumentoCorpoMG",
"multiplicity": "1:*",
"isExternal": false,
"meta": {
"name": "",
"type": "DocumentoRigaMGDTO",
"entityName": "DocumentoCorpoMG",
"properties": [
{
"propertyName": "alivacompCg28",
"propertyType": "String",
"isKey": false,
"mandatory": false,
"entityPropertyName": "AlivacompCg28",
"entityPropertyType": "System.String",
"rangeValue": null,
"description": null,
"shortDescription": null,
"maxLength": 4,
"scale": null
},
]
}
In questo caso si può eseguire una nuova chiamata GET su DocumentoRigaMGDTO per prendere visione di tutte le proprietà e di tutte le relazioni per il DocumentoRigaMGDTO, e così via.
Inoltre è anche possibile utilizzare alcuni parametri aggiuntivi: il Parametro withdescriptions=true che serve per visualizzare le descrizioni nelle proprietà e il parametro Headers: Accept=application/xml per avere un result in formato xml.
- Lookup Service - FW/lookup/MetadataDTOView
È stato introdotto un nuovo servizio che permette di vedere,tramite lookup, SOLO se le proprietà sono esposte sul DTO (sono visualizzate solo le righe con PropertyDTOName NOT NULL).
Si deve eseguire la seguente chiamata:
POST {{webapi_base_url}}/api/v1/{{scope}}/FW/lookup/MetadataDTOView?metadata=true&company={{defaultCompany}}&_op=search
Con tale lookup è possibile eseguire delle selezioni, ad esempio utilizzando il nome della tabella oppure il nome della colonna, per ricavare il nome dell’entità collegata.
Partendo da 'EntityName' presa in considerazione nel precedente esempio 'DocumentoTestataMG', si può eseguire la chiamata POST con il seguente body:
{
"filters": {
"items": [
{
"operator": 0,
"comparer": 0,
"propertyName": "EntityName",
"value": "DocumentoTestataMG"
}
],
"orderingProperties": {
"EntityName": 0
}
},
"pageSize": 0,
"pageNumber": 0
}
e nella response saranno riportate le proprietà esposte per il DTO preso in esame.
Oppure si può eseguire una selezione partendo dal nome della tabella. Ad esempio indicando come TableName=CG44_CLIFOR, come qui di seguito riportato:
{
"filters": {
"items": [
{
"operator": 0,
"comparer": 0,
"propertyName": "TableName",
"value": "CG44_CLIFOR"
}
],
"orderingProperties": {
"EntityName": 0
}
},
"pageSize": 0,
"pageNumber": 0
}
nella response saranno riportate tutte le proprietà esposte. Qui di seguito è riportato solo una parte del json della response a titolo di esempio:
{
"name": "MetadataDTOView",
"resources": [],
"pageNumber": 0,
"pageSize": 77,
"data": [
[
"CustomerSupplierCO",
"CustomerSupplierCODTO",
"Property",
null,
null,
"Tipocf",
"Tipocf",
"Tipo Cliente / Fornitore",
null,
"CG44_CLIFOR",
"CG44_TIPOCF",
"decimal",
1,
true,
null,
"0= Cliente - 1= Fornitore",
false
],
],
}
Oppure è anche possibile effettuare un'ulteriore selezione tramite il nome della colonna, per cui indicando FieldName=CG44_TIPOCF:
{
"filters": {
"items": [
{
"operator": 0,
"comparer": 0,
"propertyName": "FieldName",
"value": "CG44_TIPOCF"
}
],
"orderingProperties": {
"EntityName": 0
}
},
"pageSize": 0,
"pageNumber": 0
}
nella response saranno riportate tutte le proprietà esposte dove è utilizzato il suddetto FieldName:
{
"name": "MetadataDTOView",
"resources": [],
"pageNumber": 0,
"pageSize": 4,
"data": [
[
"CustomerSupplierCO",
"CustomerSupplierCODTO",
"Property",
null,
null,
"Tipocf",
"Tipocf",
"Tipo Cliente / Fornitore",
null,
"CG44_CLIFOR",
"CG44_TIPOCF",
"decimal",
1,
true,
null,
"0= Cliente - 1= Fornitore",
false
],
[
"CustomerSupplierFI",
"CustomerSupplierFIDTO",
"Property",
null,
null,
"Tipocf",
"Tipocf",
"Tipo Cliente / Fornitore",
null,
"CG44_CLIFOR",
"CG44_TIPOCF",
"decimal",
1,
true,
null,
"",
false
],
]
}
- Query Descriptor on FW/Lookup service
Nell'elenco delle lookup disponibili, richiamabile mediante il servizio Get di FWK "FW/Lookup", sono stati definiti i parametri obbligatory da indicare nella SearchDTO.
Ad esempio: il servizio FW/Lookup ci restituisce la Lookup relativa all'entità ProjectWH
{
"lookupName": "ItemProjectWH",
"description": "ItemProjectWH",
"href": "/api/v1/LDB_TESTWAPILEG/WH/Lookup/ItemProjectWH",
"typeQuery": "QueryDescriptor",
"parametersQueryDescriptor": "ProjectCode"
}
Per questa entità i parametri devono essere riporati nel modo di seguito indicato:
{
"parameters": {
"ProjectCode": "1"
}
}
Upload/Download CLOUD files
Il servizio EditPathFW consente di gestire l'upload e il download dei file su Cloud. In particolare mediante la chiamata:
POST {{webapi_base_url}}/{{api}}/v1/{{scope}}/FW/EditPathFW/uploadfile?company={{defaultCompany}}&user=admin
è possibile effettuare l'upload del file specificato nel body che dovrà essere di tipo form-data, nel quale devono essere specificati i seguenti valori Key con i relativi Value:
- file (di tipo file) e Value: --indicare il nome del file che si vuole caricare sul cloud
- fixedPathType (di tipo Text) e Value: UseFileTemp
- relativePath (di tipo Text) con Value: import

Con la chiamata:
POST {{webapi_base_url}}/{{api}}/v1/{{scope}}/FW/EditPathFW/getfilelist?company={{defaultCompany}}&user=admin
è possibile ottenere la lista dei file caricati sul cloud
{
"files": [
"nomefile.xxx"
]
}
E', inoltre, possibile effettuare il download del file, prima caricato sul cloud, con la seguente chiamata:
POST {{webapi_base_url}}/{{api}}/v1/{{scope}}/FW/EditPathFW/getfile?company={{defaultCompany}}&user=admin
Nel body con i parametri "esAttachment" e "deleteAfter" è possibile specificare se scaricare il file come allegato e se disporre l'eliminazione dopo averne effettuato il download.
{
"asAttachment": false,
"deleteAfter": false,
"filename": "TestFile.txt",
"fixedPathType": "UserFileTemp",
"relativePath": "import"
}
Infine è possibile eliminare il file precedentemente caricato sul cloud con il seguente servizio:
POST {{webapi_base_url}}/{{api}}/v1/{{scope}}/FW/EditPathFW/removefile?company={{defaultCompany}}&user=admin
riportando le seguenti informazioni nel body:
{
"filename": "filename.xxx",
"fixedPathType": "UserFileTemp",
"relativePath": "import"
}
Task Exec
Viene introdotto un servizio che consenta di poter eseguire azioni definite come "insiemi" presenti nel modulo "Schedulazione Applicativi" (legacy).

Nell'esempio della schermata si vuole creare una attività pianificata per il job con codice 4, che contiene il programma "3166" ("Schedulazione operazioni TS Commerce"). Quindi, proseguendo nella creazione della pianificazione si passa alla schermata seguente:

Viene quindi creata una nuova attività con codice 3222, nell'esempio "Attivita3222" e, dopo aver indicato l'utente tecnico per le schedulazioni Windows, mediante l'apposito pulsante è possibile intervenire sulla periodicità della pianificazione:

Si riporta di seguito la chiamata:
POST {{webapi_base_url}}/{{api}}/v1/{{scope}}/CO/PgmExec/pgmexecschedulerasync?company={{defaultCompany}}&user=admin'
con il relativo body:
{
"idTaskScheduled": "3222",
"timeoutSeconds": 90,
"skipIfRunning": true
}
Il numero indicato nel campo "idTaskScheduled" indica l'identificativo che rappresenta l'"insieme" delle attività schedulate. Ad esempio il valore 3122 indica l'insieme delle attività relative a TS Commerce
License Service
Dalla versione 2025002000 è stato introdotto il nuovo servizio LicenseFW che sostituisce il precedente FW/Licenze reso obsoleto. L'unica azione possibile attualmente è la GET per ottenere tutte le informazioni riguardo un id di licenza passato tramite parametro:
GET {{webapi_base_url}}/{{api}}/v1/{{scope}}/FW/LicenseFW/info/{{idLicenza}}?company={{defaultCompany}}
Un esempio di json di risposta è il seguente:
{
"codLicenza": 1055,
"numLicenza": "XXYYZZW0",
"keyAttivazione": "9gTE8Rwo",
"dataRilascio": "2025-04-14T00:00:00",
"partitaIvaCliente": "11281128112",
"partitaIvaRivenditore": "01030103010",
"licenzaDemo": 0,
"numeroPostazioni": 2,
"quantita": 0,
"isValid": true,
"extensionData": [],
"additionalData": {},
"pluginData": {}
}
AsyncSchedulerFW - Schedulazione applicativi
Con la build 2025003000 è stata introdotta la versione V2 dell'endpoint AsyncSchedulerFw. Questo endpoint permette di schedulare i programmi dell'applicativo. Ecco un esempio pratico:
Post {{webapi_base_url}}/{{api}}/v2/{{scope}}/fw/asyncschedulerfw?company={{defaultCompany}}
Un esempio di json di risposta è il seguente:
{
"additionalInfo": "Esecuzione di pulizia dei dettagli di elaborazione",
"asyncCatalogId": "CLEAN_PROCESSING_DETAILS",
"cronExpression": "0 0/30 * * * ?",
"endUtcDateTime": "2025-09-30T08:00:00.073",
"isDisabled": false,
"isWithCompany": true,
"lastExecutionUtcDateTime": "2025-09-26T08:00:00.073",
"nextExecutionUtcDateTime": "2025-09-26T08:30:00",
"serializedParameter": "{ \"daysToKeep\": 30 }",
"startUtcDateTime": "2023-02-20T15:03:31.29",
"extensionData": [],
"additionalData": {},
"pluginData": {}
}
Documenti
Inserimento documento con dati minimi
La risorsa "Documento" può essere utilizzata per inserire / eliminare / modificare un documento in TSE. La risorsa è utilizzabile per l'inserimento di un qualsiasi tipo di documento, basta semplicemente cambiare il codice documento nella chiamata.
Affinché le informazioni passate alla WebAPI documenti con il relativo DTO siano effettivamente recepite e memorizzate è necessario che il wizard del codice documento utilizzato le gestisca sull'interfaccia utente. Quindi in fase di progettazione della soluzione è opportuno effettuare sempre un doppio check per assicurarsi che un documento inserito da interfaccia utente con le medesime informazioni che vengono passate via WebAPI sia correttamente inserito.
L'inserimento di un documento può avvenire in modo sincrono con il metodo POST.
Si tenga presente che per inserire un documento non è necessario valorizzare tutte le proprietà del complesso DTO che lo rappresenta.Ecco un esempio di inserimento minimale del documento con le informazioni minimali di testata e Riga di tipo articolo, con codice articolo e quantità
Post {{webapi_base_url}}/{{api}}/v2/{{scope}}/MG/DocumentMG?company={{defaultCompany}}
con il seguente body:
{
{
"callOptions": {
"forceStampExpensesToZero": false,
"forceCollectionExpensesToZero": false,
"lockInsertExistingDocument": false,
"excludeLoadingMultipleAgents": true,
"excludeHeaderVat": false,
"disableLetterOfIntent": true,
"excludeCSExpensesFixedTexts": false,
"disableExistingItemCheck": false
},
"companyCode": 1000,
"currencyCode": "EURO",
"customerSupplierCode": 1.0,
"customerSupplierType": 0.0,
"documentCode": "CLI-ORDINE",
"documentDate": "2025-10-15T00:00:00",
"documentSubtype": 1.0,
"documentType": 21.0,
"documentTypeNumbering": 39.0,
"registrationDate": "2025-10-15T00:00:00",
"storageCode": "00",
"vatCode": "317",
"sectionalCode": "00",
"officeCode": "YYY",
"agents": [],
"rows": [
{
"callOptions": {
"forcePriceDiscount": false
},
"companyCode": 1000,
"description": "Descrizione articolo",
"itemCode": "ART001",
"qty1": 1.000,
"qty2": null,
"rowProgressive": 2.0,
"rowType": 0
}
],
"extensionData": [],
"additionalData": {},
"pluginData": {}
}
}
Alcune osservazioni/confronti sulla versione V2
il campo "ditta" o "dittaCg18" (il codice della ditta di lavoro) è stato rinominato in companyCode proprietà in DocumentHeaderV2MG.
"anagraficaDocumentoDitta": La proprietà è stata rimossa è gestita con il campo documentCode. Valorizzando il campo indicato il sistema riconosce autometicamente se il codice documento è standard o personalizzato.
"customerSupplierMG": La proprietà di tipo customerSupplierMGDTO è stata eliminata. Il cliente o il fornitore a cui viene intestato il documento è stato gestito con i campi customerSupplierCode e customerSupplierType
Ad esempio per intestare il documento al cliente con codice 123 è necessario valorizzare il campo "customerSupplierCode": 123 e "customerSupplierType": 0.0
{
"customerSupplierCode": 123,
"customerSupplierType": 0.0,
}
Si noti che "customerSupplierCode" è il codice del cliente (o del fornitore per documenti di tipo fornitore) e non il suo ID presente sulla tabella CG44_CLIFOR. Si ricorda infine che se il codice documento prevede il cliente o il fornitore, è necessario definire l'indicatore 'customerSupplierType' con i possibili valori del campo CG44_TIPOCF della tabella CG44_CLIFOR che sono:
0 per i clienti 1 per i fornitori
"sectionalCode": il sezionale della numerazione del documento (es. "sezdoc": "00")
"storageCode": il campo storageCode rappresenta il deposito da movimentare.
Quindi ad esempio, lavorando sulla ditta 100, per ordinare la merce sul deposito "00", sarà necessario valorizzare il campo storageCode in questo modo:
{
"storageCode": "00",
}
"Rows": l'array delle righe da inserire nel documento; è un array di oggetti di tipo DocumentRowV2MGDTO. La tipologia di riga attualmente gestite nel corpo documento sono le seguenti:
- Articolo (rowType = 0)
- Articolo manuale (rowType = 1)
- Descrittiva (rowType = 2)
- Spesa (rowType = 4)
- Testo Fisso (rowType = 6)
- Nodo (rowType = 15)
- Attività (rowType = 16)
- Spesa di progetto (rowType = 17)
Le altre tipologie utilizzabili dall'interfaccia di emissione diretta documenti non sono supportate.
A seconda della tipologia di riga che si desidera inserire nel documento, si deve specificare un diverso "rowType", come sopra descritto. Per ogni riga documento, occorre indicare almeno il progressivo riga, il codice e la quantità.
- Per le righe di tipo articolo occorre almeno indicare progressivo riga, codice articolo, descrizione articolo e quantità. La proprietà rowType prende il valore 0 di default, se non valorizzata.
{
"rowProgressive": 1.0,
"itemCode": "ART001",
"description": "Descrizione articolo ART001",
"qty1": 1.000
}
NOTA BENE: Nel caso in cui si inseriscano righe documento di tipo articolo e un codice articolo preveda l'esplosione automatica di righe aggiuntive, il rowProgressive è ricalcolato in automatico dalla procedura.
- Per le righe di tipo spesa varia occorre almeno indicare "rowType", "rowProgressive", quantità (normalmente unitaria) e codice spesa come nel seguente esempio:
{
{
"rowProgressive": 4,
"rowType": 4.0,
"qta1": 1.000,
"variousExpenseCode": "ST",
}
}
Recupero dei prezzi in inserimento delle righe Se i prezzi e gli sconti degli articoli di magazzino inseriti nel corpo del documento vengono passati con valore zero, allora la logica di business li valorizza in base alla configurazione del recupero prezzo impostata sulla parametrizzazione del codice documento utilizzato.
Se il prezzo e gli sconti passati nel DTO sono diversi da zero, allora i valori proposti dalla logica del recupero prezzo da configurazione verranno sovrascritti con i valori passati nel DTO.
Per quanto riguarda gli scenari dei Documenti, vengono resi disponibili direttamente all'interno della chiamata POST (Create) del modulo IntegrationMG\DocumentMG dello swagger alcuni esempi:

Tramite il Try it out sarà possibile eseguire automaticamente la chiamata, sostituendo i segnaposti indicati negli esempi con i relativi dati opportuni.
Esempi disponibili di Documenti su Swagger:
Default (complete): riporta il body completo di chiamata; Min required: Informazioni minimali obbligatorie di testata; Order: esempio di body di un documento di tipo Ordine; Delivery Note: esempio di body di un documento di tipo bolla; Invoice: esempio di body di un documento di tipo fattura; Transfer warehouses: esempio di body di un documento trasferimento tra depositi.