Monday, June 9, 2025

Get size of tables from SQL Data base for D365FO

 In order to check the tables size, you need to open the SQL server Management Studio and execute the below query

  1. In the Management Studio, click New Query or expand the Databases list and right click the needed database > New Query
  2. In the query editor, execute the below query by putting the correct database name

    USE <DatabaseName>
    GO

    SELECT
    t.Name AS TableName,
    s.Name AS SchemaName,
    p.Rows AS RowCounts,
    SUM(a.total_pages) * 8 AS TotalSpaceKB,
    SUM(a.used_pages) * 8 AS UsedSpaceKB,
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
    FROM
    sys.tables t
    INNER JOIN sys.indexes i ON t.object_id = i.object_id
    INNER JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
    INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id
    LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id
    WHERE t.Name NOT LIKE 'dt%'
    AND t.is_ms_shipped = 0
    AND i.object_id > 255
    GROUP BY t.Name, s.Name, p.Rows
    ORDER BY SUM(a.used_pages) * 8 DESC;
    GO
3.Once the query is executed, you will get the list of tables sorted by its used space
Tables size

Another one :

EXEC sp_spaceused 'generaljournalentry'

//for a specific table

Monday, May 26, 2025

X++ code to get the specific legal entities locations

 public void MultiSelectLookup(FormStringControl _control)

{
     Query          query = new  query();
     Container      cont;
     CompanyInfo    companyInfo = CompanyInfo::findDataArea("INMF");

 

     QueryBuildDataSource    qbds = query.addDataSource(tableNum(DirPartyPostalAddressView));

 

     QueryBuildRange    qbr1,qbr = qbds.addRange(fieldNum(DirPartyPostalAddressView,Party));
     qbr.value(SysQuery::value(companyInfo.RecId));

 

     qbr1 = qbds.addRange(fieldNum(DirPartyPostalAddressView, ValidTo));
     qbr1.value(strFmt(">%1", date2Str(today(), 123, DateDay::Digits2, DateSeparator::Slash,
                                  DateMonth::Digits2, DateSeparator::Slash, DateYear::Digits4)));
     qbds.addSelectionField(fieldNum(DirPartyPostalAddressView, LocationName));
     qbds.addSelectionField(fieldNum(DirPartyPostalAddressView, Address));
     sysLookupMultiSelectGrid::lookup(query, _control, _control, _control, cont);
}


---------------------------------------






Wednesday, May 7, 2025

Code to get the settled invoices for a payment journal in d365fo x++

 [ExtensionOf(classStr(LedgerJournalCheckPost))]

internal final class LedgerJournalCheckpost_Extension

{

    protected void runInternal()

    {

        PROZIPPaymentJournalStaging     ZIPPaymentJournalStaging;

        VendTrans                       vendTrans,vendTransloc;

        VendSettlement                  vendSettlement;

        LedgerJournalTrans              ledgerJournalTrans;

        LedgerJournalTable              ledgerJOurnalTableloc;

 

        next runInternal();

 

        if(ledgerJournalTable.Posted == NoYes::Yes && ledgerJournalTable.JournalType == LedgerJournalType::Payment)

        {

            while select ledgerJournalTrans

                where ledgerJournalTrans.JournalNum == ledgerJournalTable.JournalNum

            {

                select vendTrans

                    where vendTrans.RecId == ledgerJournalTrans.VendTransId;

 

                while select vendSettlement

                    where vendSettlement.TransCompany == vendTrans.DataAreaId

                    && vendSettlement.TransRecId == vendTrans.RecId

                    && vendSettlement.AccountNum == vendTrans.AccountNum

                {

                    select vendTransloc

                        where vendTransloc.RecId == vendSettlement.OffsetRecid;

 

                    select ledgerJOurnalTableloc 

                        where ledgerJOurnalTableloc.JournalNum == vendTransloc.JournalNum;

 

                        ZIPPaymentJournalStaging.PROProcessingStatus    = PROProcessingStatus::Unprocessed;

                        ZIPPaymentJournalStaging.InvoiceVoucher         = vendTransloc.Voucher;

                        ZIPPaymentJournalStaging.Invoice                = vendTransloc.Invoice;

                        ZIPPaymentJournalStaging.insert();

                    }

                }

            }

        }

    }

 

}

Thursday, April 17, 2025

Log level errors during full build and sync

 


If you’re encountering errors related to standard objects, try searching the error in ChatGPT. It can help identify the configuration key that needs to be enabled.

System Administration>setup>License configuration.

To enable the configuration key, system should be in maintenance mode.

Reference Link :

https://community.dynamics.com/forums/thread/details/?threadid=ae25b9ff-9379-ee11-8179-00224827e012


Wednesday, April 16, 2025

Decoding API from ZIP to D365f&o

My requirement is to retrieve invoice journal information from the ZIP application into D365 Finance & Operations.

In ZIP, the information is stored in JSON format. In the code, I’m accessing the ZIP API using the API key provided by the client. I decode the JSON response from the API and store the information into custom tables in D365.

From these custom tables, I will then create the invoice journals.

.......

using System.Net;

using System.Net.Security;

using System.IO.Path;

using Newtonsoft.Json.Linq.JObject;

using System.Collections;

using Newtonsoft.Json;

using Newtonsoft.Json.Linq;

public class PROZIPVendorInvoiceIntegrationService extends SysOperationServiceBase

{

    PROZIPVendorInvoiceStagingTable         VendorInvoiceStagingTable,VendorInvoiceStagingTableUpd;

    PROZIPVendorInvoiceLineStagingTable     VendorInvoiceLineStagingTable;

    public str getZIPRecords(str Url, str method)

    {

        System.Net.HttpWebRequest   request;

        System.Net.WebResponse      response;

        System.IO.Stream            responseStream, requestStream;

        System.IO.StreamReader      streamReader;

        System.Text.Encoding        utf8;

        System.Byte[]               bytes;

        System.Exception            ex;

        Notes                       token, requestJson, responseJson, errorMessage;

        URL                         endpointURL;

        SysInfoLogEnumerator        infoLogEnum;

        SysInfologMessageStruct     infoMessageStruct;

        System.Net.WebHeaderCollection  headers;

        VendParameters  vendparameters = VendParameters::find();


     

        //str                         getStatusResponse;

        System.Net.WebException       webException;

 

        try

        {

            System.Net.WebHeaderCollection httpHeader = new System.Net.WebHeaderCollection();

            //endpointURL = _Url;//"https://api.ziphq.com/vendors?include_attributes=true";//this.get_EndpointURL(); // Getting API URL

            endpointURL = "https://api.ziphq.com/invoices?include_attributes=true";//this.get_EndpointURL(); // Getting API URL

            new InteropPermission(InteropKind::ClrInterop).assert();

            request = System.Net.WebRequest::Create(endpointURL);

            utf8 = System.Text.Encoding::get_UTF8();


            headers = new System.Net.WebHeaderCollection();

            headers.Add(strFmt('Zip-Api-Key:%1',vendparameters.PROZIPKey));

           // headers.Add('accept:application/json');

            request.set_Headers(headers);

            request.set_Method(_method);

            request.set_ContentType('application/json');

            request.set_Accept('application/json');


            response = request.GetResponse();

            responseStream = response.GetResponseStream();

            streamReader = new System.IO.StreamReader(responseStream);

            responseJson = streamReader.ReadToEnd();


            info(strFmt('Success API Response is %1', responseJson));

            

            //this.readStatusResponse(responseJson);


            //getStatusResponse = new Amir_SuccessStatusResponse();

            //getStatusResponse = FormJsonSerializer::deserializeObject(classNum(Amir_SuccessStatusResponse), responseJson);

           

         

        }

        catch(webException)

        {

           // Amir_ErrorStatusResponse errorStatusResponse = new Amir_ErrorStatusResponse();

            // Handle WebException for error response

            if (webException.get_Response() != null)

            {

                System.Net.HttpWebResponse httpWebResponse;

                Notes responseString;


                // Get error response stream

                httpWebResponse = webException.get_Response() as System.Net.HttpWebResponse;

                responseStream = httpWebResponse.GetResponseStream();

                streamReader = new System.IO.StreamReader(responseStream);

                responseString = streamReader.ReadToEnd();


                // Log the error response body (usually in JSON format)

                error(strFmt("Error Response (JSON): %1", responseString));


           

                //errorStatusResponse = FormJsonSerializer::deserializeObject(classNum(Amir_ErrorStatusResponse), responseString);

           

           

                 

            }

        }

        return responseJson;

    }


    public void processOperation()

    {

        VendParameters      vendParmeters = VendParameters::find();

        str response = this.getZIPRecords(strFmt('%1?include_attributes=true', vendParmeters.PROZIPVendorInvoiceURL), 'GET');

        if (response != null)

        {

            this.readStatusResponse(response);

        }


    }


    /*Public static void Main(Args _args)

    {

        PROZIPVendorIntegrationService PROZIPVendorIntegrationService = new PROZIPVendorIntegrationService();

        VendParameters      vendParmeters = VendParameters::find();

        str response = PROZIPVendorIntegrationService.getZIPRecords(strFmt('%1?include_attributes=true', vendParmeters.PROZIPVendorURL), 'GET');

        if (response != null)

        {

            PROZIPVendorIntegrationService.readStatusResponse(response);

        }


    }*/


    boolean readStatusResponse(str _response)

    {

        

        boolean     ret;

        

        Newtonsoft.Json.Linq.JObject jObject;

        jObject = Newtonsoft.Json.Linq.JObject::Parse(_response);

        RecordInsertList    insertList = new RecordInsertList(tableNum(PROZIPVendorInvoiceStagingTable));

        

        //jToken = jObject.get_Item('data');

        //jObject = Newtonsoft.Json.Linq.JObject::Parse(jToken.ToString());

        Newtonsoft.Json.Linq.JArray jarray = jObject.get_Item('list');

        int countnum = jarray.Count;

        int rowCount;

        IEnumerator enumerator = jArray.GetEnumerator();

        //ttsbegin;

        while (enumerator.MoveNext())

        {

            rowCount++;

           

            try

            {

                //if (rowCount == 43)

                //{

                    //Header payload

                    ttsbegin;

                    JToken token            = enumerator.Current;

                    str ID                  = token.get_Item('id').ToString();

                    str type                = token.get_Item('type').ToString();

                    str description         = token.get_item('description').tostring();

                    str invoice_number      = token.get_Item('invoice_number').ToString();

                    str tax_amount          = token.get_Item('tax_amount').ToString();

                    str currency            = token.get_Item('currency').ToString();

                    str created_at          = token.get_Item('created_at').ToString();

                    str amount              = token.get_Item('amount').ToString();

                    str invoice_date        = token.get_Item('invoice_date').ToString();

                    str source              = token.get_Item('source').ToString();

                    str due_date            = token.get_Item('due_date').ToString();

                    str shipping_amount     = token.get_Item('shipping_amount').ToString();

                    str misc_amount         = token.get_Item('misc_amount').ToString();

                    str status              = token.get_Item('status').ToString();;

                

                    Newtonsoft.Json.Linq.JObject departmentsObject = token.get_Item('department') as Newtonsoft.Json.Linq.JObject;

                    str departments, name ,type2;

                    if (departmentsObject)

                    {

                        type2 = departmentsObject.get_item('type').ToString();

                        if(type2 == 'department')

                        {

                            departments = departmentsObject.get_item('name').ToString();

                        }

                    }


                    Newtonsoft.Json.Linq.JObject vendorObject = token.get_Item('vendor') as Newtonsoft.Json.Linq.JObject;

                    str vendName ;

                    str vendAccount;

                    if(vendorObject)

                    {

                        vendName = vendorObject.get_item('name').ToString();


                        Newtonsoft.Json.Linq.JArray vendorAccountloc = vendorObject.get_Item('external_data') as Newtonsoft.Json.Linq.JArray;

                        System.Collections.IEnumerator attrEnumerator = vendorAccountloc.GetEnumerator();


                        while (attrEnumerator.MoveNext())

                        {

                            Newtonsoft.Json.Linq.JObject vendorObjectId = attrEnumerator.get_Current() as Newtonsoft.Json.Linq.JObject;

                  

                            vendAccount = vendorObjectId.get_item('id').ToString();

                        }


                    }


                    select firstonly VendorInvoiceStagingTable

                    where VendorInvoiceStagingTable.ID == ID;

                    if (!VendorInvoiceStagingTable)

                    {

                        VendorInvoiceStagingTable.clear();

                        VendorInvoiceStagingTable.ID                = ID;

                        VendorInvoiceStagingTable.ProcessingStatus  = PROProcessingStatus::Unprocessed;

                        VendorInvoiceStagingTable.VendAccount       = vendAccount;

                        VendorInvoiceStagingTable.VendName          = vendName;

                        VendorInvoiceStagingTable.Status            = status;

                        VendorInvoiceStagingTable.insert();

                    }

                    else if(VendorInvoiceStagingTable.ProcessingStatus != PROProcessingStatus::Processed)

                    {

                        ttsbegin;

                        VendorInvoiceStagingTable.selectForUpdate(true);

                        VendorInvoiceStagingTable.ID                = ID;

                        VendorInvoiceStagingTable.type              = type;

                        if(pmfTableHasChanged(VendorInvoiceStagingTable))

                        {

                            VendorInvoiceStagingTable.ProcessingStatus  = PROProcessingStatus::Unprocessed;

                        }

                        VendorInvoiceStagingTable.ProcessingRemarks = "";

                        VendorInvoiceStagingTable.VendAccount       = vendAccount;

                        VendorInvoiceStagingTable.VendName          = vendName;

                        VendorInvoiceStagingTable.update();

                        ttscommit;

                    }

                    //Lines payload

                    Newtonsoft.Json.Linq.JArray         attributeArray = token.get_Item('line_items') as Newtonsoft.Json.Linq.JArray;

                    System.Collections.IEnumerator      attrEnumerator = attributeArray.GetEnumerator();


                    while (attrEnumerator.MoveNext())

                    {

                        Newtonsoft.Json.Linq.JObject attrObject = attrEnumerator.get_Current() as Newtonsoft.Json.Linq.JObject;

                  

                        str idloc                   = attrObject.get_Item('id').ToString();

                        str typeloc                 = attrObject.get_Item('type').ToString();

                        str quantity                = attrObject.get_Item('quantity').ToString();

                        str end_date                = attrObject.get_Item('end_date').ToString();

                        str secondary_line_type     = attrObject.get_Item('secondary_line_type').ToString();

                        str amortization_end_date   = attrObject.get_Item('amortization_end_date').ToString();

                        str currencyloc             = attrObject.get_Item('currency').ToString();

                        str amortization_start_date = attrObject.get_Item('amortization_start_date').ToString();

                        str total                   = attrObject.get_Item('total').ToString();

                        str end_date_iso            = attrObject.get_Item('end_date_iso').ToString();

                        str rate                    = attrObject.get_Item('rate').ToString();

                        str line_type               = attrObject.get_Item('line_type').ToString();

                        str descriptionloc          = attrObject.get_Item('description').ToString();

                        str start_date_iso          = attrObject.get_Item('start_date_iso').ToString();

                        str start_date              = attrObject.get_Item('start_date').ToString();

                  

                        //Newtonsoft.Json.Linq.JObject departmentsObjectloc = attrObject.get_Item('department') as Newtonsoft.Json.Linq.JObject;

                        //str departmentsloc, nameloc ,type2loc;

                        //if (departmentsObjectloc)

                        //{

                        //    type2loc = departmentsObjectloc.get_item('type').ToString();

                        //    if(type2loc == 'department')

                        //    departmentsloc = departmentsObjectloc.get_item('name').ToString();

                        //}


                        str expense_category  = attrObject.get_Item('expense_category').ToString();

                        str location = attrObject.get_Item('location').ToString();

                        str gl_code = attrObject.get_Item('gl_code').ToString();


                        Newtonsoft.Json.Linq.JArray     procArray = attrObject.get_Item('attributes') as Newtonsoft.Json.Linq.JArray;

                        System.Collections.IEnumerator  procEnumerator = procArray.GetEnumerator();

                        str procConfigid,procData,taxConfigid,taxData;

                        str nameloc,countryname;

                   

                        while(procEnumerator.moveNext())

                        {

                            Newtonsoft.Json.Linq.JObject  procObject = procEnumerator.get_Current() as Newtonsoft.Json.Linq.JObject;


                            str  procName  = procObject.get_Item('name').ToString();

                       

                            if(procname == "Procurement Categories")

                            {

                                procConfigid = procObject.get_Item('config_id').ToString();

                                procData  = procObject.get_Item('data').ToString();

                            }


                            if(procName == "Standard tax code")

                            {

                                taxConfigid = procObject.get_Item('config_id').ToString();

                                taxData  = procObject.get_Item('data').ToString();

                            }

                        

                            if (procName == 'department')

                            {

                                Newtonsoft.Json.Linq.JObject  departData = procObject.get_Item('data');

                                nameloc = departData.get_item('name').ToString();

                            }

                            if (procName == 'Country')

                            {

                              //  Newtonsoft.Json.Linq.JObject  countryData = procObject.get_Item('data');

                              countryname = procObject.get_item('data').ToString();

                            }

                        }

                        select firstonly VendorInvoiceLineStagingTable

                        where VendorInvoiceLineStagingTable.LineItemID == idloc;


                        if(!VendorInvoiceLineStagingTable)

                        {

                            VendorInvoiceLineStagingTable.ID                    =   ID;

                            VendorInvoiceLineStagingTable.LineItemID            = idloc;

                            VendorInvoiceLineStagingTable.insert();

                        }

                        else

                        {

                            ttsbegin;

                            VendorInvoiceLineStagingTable.selectForUpdate(true);

                            VendorInvoiceLineStagingTable.ID                    =   ID;

                            VendorInvoiceLineStagingTable.LineItemID            =   idloc;

                            VendorInvoiceLineStagingTable.update();

                            ttscommit;

                        }

                    }

                    Info(strFmt('%1,%2,%3, %4', ID, currency, type, Amount));

                    ttscommit;

               // }

            }

            catch

            {

                continue;

            }

        }

        insertList.insertDatabase();

        //info(strFmt("Row count %1", rowCount));

        //ttscommit;

        return ret;

    }

}

------------------------------

Payload ;

        "list": [ {

            "id": "067f50d7-d50a-7695-8000-ebbcb3813dff",

            "type": "invoice",

            "due_date": 1744070400,

            "description": "TEST",

            "shipping_amount": "0.00",

            "invoice_number": "TEST12345",

            "currency": "GBP",

            "created_at": 1744113021,

            "source": null,

            "amount": "60000.00",

            "tax_amount": "10000.00",

            "invoice_date": "2025-04-08",

            "misc_amount": "0.00",

            "vendor": {

                "id": "067bdfc4-0175-7d63-8000-3b42f209646c",

                "type": "vendor",

                "name": "Demo Vendor",

                "external_data": []

            },

            "subsidiary": {

                "id": "0673684d-ff3b-768d-8000-27ba51fb8a12",

                "type": "subsidiary",

                "name": "Trainline.com Ltd"

            },

            "department": {

                "id": "0673684b-c28e-78c3-8000-d27a49198bd2",

                "type": "department",

                "name": "607 Product"

            },

            "location": null,

            "posting_period": null,

            "line_items": [

                {

                    "id": "067f50f5-2934-7c27-8000-fcf78aa2def5",

                    "type": "line_item",

                    "description": "TEST",

                    "amortization_start_date": null,

                    "currency": "USD",

                    "start_date_iso": null,

                    "amortization_end_date": null,

                    "total": "60000",

                    "quantity": "1",

                    "end_date_iso": null,

                    "secondary_line_type": null,

                    "rate": "50000",

                    "end_date": null,

                    "start_date": null,

                    "line_type": 0,

                    "item_account": null,

                    "department": {

                        "id": "0673684b-c28e-78c3-8000-d27a49198bd2",

                        "type": "department",

                        "name": "607 Product"

                    },

                    "matched_purchase_order_line_item": null,

                    "expense_category": null,

                    "location": null,

                    "gl_code": null,

                    "amortization_schedule": {

                        "start_date": null,

                        "end_date": null,

                        "name": null

                    },

                    "attributes": [

                        {

                            "id": "067f50f5-2b20-767a-8000-f5f0371250ac",

                            "config_id": "067d9ce9-91a5-77ad-8000-323089dcc532",

                            "name": "Unit price",

                            "data": "50000",

                            "integration_data": null

                        },

                        {

                            "id": "067f50f5-2b21-7fc4-8000-177614b60e17",

                            "config_id": "067d9ce9-860d-7844-8000-a4ee87420651",

                            "name": "Department",

                            "data": {

                                "id": "0673684b-c28e-78c3-8000-d27a49198bd2",

                                "type": "department",

                                "display_name": "607 Product",

                                "name": "607 Product"

                            },

                            "integration_data": null

                        },

                        {

                            "id": "067f50f5-2b23-74c7-8000-35b5ab94c21b",

                            "config_id": "067d9ce9-9018-7848-8000-55627a0fe891",

                            "name": "Line description",

                            "data": "TEST",

                            "integration_data": null

                        },

                        {

                            "id": "067f50f5-2b24-7861-8000-da384410126b",

                            "config_id": "067d9ce9-7f40-7978-8000-246020c9fcdb",

                            "name": "Total price",

                            "data": "60000",

                            "integration_data": null

                        },

                        {

                            "id": "067f50f5-2b25-7be5-8000-fb9239115cb8",

                            "config_id": "067d9ce9-91a9-7ff0-8000-662f279f4ae5",

                            "name": "Total tax amount",

                            "data": "10000",

                            "integration_data": null

                        },

                        {

                            "id": "067f50f5-2b26-7e41-8000-d5a7879a9a77",

                            "config_id": "067d9ce9-a7ef-76a5-8000-0ec3dd2b2599",

                            "name": "Standard tax amount",

                            "data": "10000",

                            "integration_data": null

                        },

                        {

                            "id": "067f50f5-2b28-70e1-8000-c9404ff8e8c5",

                            "config_id": "067d9ce9-a7f3-7e28-8000-4b212118e441",

                            "name": "Withholding tax amount",

                            "data": null,

                            "integration_data": null

                        },

                        {

                            "id": "067f50f5-2b29-731a-8000-a03da8d04799",

                            "config_id": "067d9ce9-901f-7d84-8000-a24ceee266ad",

                            "name": "Line type",

                            "data": 0,

                            "integration_data": null

                        },

                        {

                            "id": "067f50f5-2b2a-7834-8000-e81059efc876",

                            "config_id": "067d9ce9-9029-7ba8-8000-10474fa073ab",

                            "name": "Quantity",

                            "data": "1",

                            "integration_data": null

                        },

                        {

                            "id": "067f50f5-2b2b-7b10-8000-3a1cd5003646",

                            "config_id": "067d9ce9-8623-72cf-8000-4991cb4be98c",

                            "name": "Category",

                            "data": null,

                            "integration_data": null

                        },

                        {

                            "id": "067f50f5-2c89-7563-8000-7cde80bfdd63",

                            "config_id": "067d9ce9-8627-760e-8000-78257d9dee11",

                            "name": "Account",

                            "data": null,

                            "integration_data": null

                        },

                        {

                            "id": "067f50f5-3073-75aa-8000-cfac10f0aaad",

                            "config_id": "067d9ce9-85fc-7fdd-8000-d68e25960133",

                            "name": "Currency",

                            "data": "USD",

                            "integration_data": null

                        },

                        {

                            "id": "067f50f5-3075-7602-8000-78b348f53e4a",

                            "config_id": "067ea7a0-98c6-7343-8000-f0040adaa93b",

                            "name": "Procurement Categories",

                            "data": "0003 - Maint/support software system costs",

                            "integration_data": {

                                "id": "067d14e7-a1fc-785c-8000-fd18784793c1",

                                "type": "lookup_option",

                                "key": "0003",

                                "name": "0003 - Maint/support software system costs"

                            }

                        },

                        {

                            "id": "067f50f5-971d-7a5f-8000-7991435a23aa",

                            "config_id": "067dafa9-006e-7c87-8000-d50222032c1f",

                            "name": "Country",

                            "data": "UK",

                            "integration_data": {

                                "id": "067b369f-7b24-7118-8000-41bcacfd7d84",

                                "type": "lookup_option",

                                "key": null,

                                "name": "UK"

                            }

                        },

                        {

                            "id": "067f50f8-35a0-745a-8000-944821ad7ce3",

                            "config_id": "067e52ad-c1e4-7096-8000-e71d9a609bb1",

                            "name": "Standard Tax Code (Temp)",

                            "data": "UK-STD",

                            "integration_data": {

                                "id": "067eee01-44ee-7f2b-8000-00fdaaba807e",

                                "type": "lookup_option",

                                "key": null,

                                "name": "UK-STD"

                            }

                        },

                        {

                            "id": "067f50f8-d619-7b82-8000-24a4b9295680",

                            "config_id": "067d9ce9-a7f8-7473-8000-0b0ec0423e12",

                            "name": "Standard tax code",

                            "data": "UK-STD*UK Standard 20% (qjl) - 20%",

                            "integration_data": null

                        },

                        {

                            "id": "067f50f8-d61b-7377-8000-8b35865c0c5d",

                            "config_id": "067d9ce9-a7fb-73e2-8000-723a9e5fe4c6",

                            "name": "Withholding tax code",

                            "data": null,

                            "integration_data": null

                        }

                    ]

                }

            ],

            "payment_terms": null,

            "external_id": null,

            "approved_at": 1744113590,

            "attributes": [

                {

                    "id": "067f50d7-d65f-7d79-8000-359c75a2191a",

                    "config_id": "067d9ce9-b34b-7334-8000-be9d9da13fd6",

                    "name": "Invoice Upload Source",

                    "data": 2,

                    "integration_data": null

                },

                {

                    "id": "067f50d7-d8da-7c2a-8000-629cef08782a",

                    "config_id": "067d9ce9-85fb-7723-8000-0ae5f957d3d7",

                    "name": "Currency",

                    "data": "GBP",

                    "integration_data": null

                },

                {

                    "id": "067f50d8-3ed2-7e7c-8000-ea6afd7a1307",

                    "config_id": "067d9ce9-900e-790e-8000-1e2554f3facd",

                    "name": "Vendor",

                    "data": "067bdfc4-0175-7d63-8000-3b42f209646c",

                    "integration_data": null

                },

                {

                    "id": "067f50d8-4393-7711-8000-e55c76069af4",

                    "config_id": "067d9ce9-8609-7dfc-8000-0fade80e750f",

                    "name": "Department",

                    "data": {

                        "id": "0673684b-c28e-78c3-8000-d27a49198bd2",

                        "type": "department",

                        "display_name": "607 Product",

                        "name": "607 Product"

                    },

                    "integration_data": null

                },

                {

                    "id": "067f50da-569e-7577-8000-92cfe6bbcfe9",

                    "config_id": "067d9ce9-b34e-776e-8000-cff1d1e3a2c3",

                    "name": "Invoice number",

                    "data": "TEST12345",

                    "integration_data": null

                },

                {

                    "id": "067f50da-7f22-7f3e-8000-71a8538ce561",

                    "config_id": "067d9ce9-b351-7930-8000-d5766b1047e9",

                    "name": "Invoice date",

                    "data": "2025-04-08 00:00:00",

                    "integration_data": null

                },

                {

                    "id": "067f50da-7f24-77ee-8000-d475a3971fc4",

                    "config_id": "067d9ce9-b357-7968-8000-f264790e6461",

                    "name": "Posting date",

                    "data": "2025-04-08 00:00:00",

                    "integration_data": null

                },

                {

                    "id": "067f50da-e14d-738c-8000-f18d2fe7b1b9",

                    "config_id": "067d9ce9-b354-799a-8000-17f886e2358b",

                    "name": "Due date",

                    "data": "2025-04-08 00:00:00",

                    "integration_data": null

                },

                {

                    "id": "067f50db-7540-7312-8000-f2cc070f2b0b",

                    "config_id": "067d9ce9-b40a-7242-8000-81d10e25eb86",

                    "name": "Pre-tax total",

                    "data": "50000",

                    "integration_data": null

                },

                {

                    "id": "067f50db-7541-7c04-8000-8eb44ab5410f",

                    "config_id": "067d9ce9-7f3a-7c98-8000-df3b05ec5689",

                    "name": "Total amount",

                    "data": "60000",

                    "integration_data": null

                },

                {

                    "id": "067f50db-f555-7c32-8000-99a50bb1a3ee",

                    "config_id": "067d9ce9-b4ad-796c-8000-0aea11da8f0e",

                    "name": "Standard tax amount",

                    "data": "10000",

                    "integration_data": null

                },

                {

                    "id": "067f50db-f557-749c-8000-7577ea801d62",

                    "config_id": "067d9ce9-b410-76c6-8000-58f36c59ea4e",

                    "name": "Tax amount",

                    "data": "10000",

                    "integration_data": null

                },

                {

                    "id": "067f50dc-2eb7-78a6-8000-724d67b8de72",

                    "config_id": "067d9ce9-9015-7a6e-8000-faada2dd2f4e",

                    "name": "Description",

                    "data": "TEST",

                    "integration_data": null

                },

                {

                    "id": "067f50dc-5216-7c18-8000-fa95065b31d1",

                    "config_id": "067d9ce9-861a-7781-8000-3794c6a91d1d",

                    "name": "Subsidiary",

                    "data": {

                        "id": "0673684d-ff3b-768d-8000-27ba51fb8a12",

                        "type": "subsidiary",

                        "display_name": "Trainline.com Ltd",

                        "name": "Trainline.com Ltd"

                    },

                    "integration_data": null

                },

                {

                    "id": "067f50fa-8e1b-716a-8000-c8d6aca8ddd5",

                    "config_id": "067d9ce9-9008-7a47-8000-0f463db5de94",

                    "name": "Requester",

                    "data": {

                        "id": "0673f688-e4d0-78e1-8000-5b8bef8b4a5c",

                        "type": "user",

                        "email": "david.allamby+sbx@thetrainline.com",

                        "employee_number": null,

                        "last_name": "Allamby",

                        "first_name": "David"

                    },

                    "integration_data": null

                }

            ],

            "purchase_orders": [],

            "payment_method": {

                "id": "067eef5b-e59e-7e7a-8000-fc19f911643f",

                "external_data": []

            },

            "payouts": [],

            "updated_at": 1744113591,

            "applied_vendor_credits": [],

            "status": "APPROVED"

}].