CIB Standard Extraction Schema (header level taxation)

Prev Next

The Rossum extraction schema described is designed to satisfy common needs of the customers in the US. There is a separate schema for the Europe and APAC region. The difference between the two is mainly in handling of the taxation where Rossum uses line level taxation with Tax Codes to the Europe and APAC  whilst the header level taxation without Tax Codes in the US (this schema).

ℹ️  Key (color coding of the fields in the schema)

Captured fields - Fields that are extracted from the document using Rossum AI predictions and ORC reading.

Matching fields - Fields that are result of matching using master data maintained in the Rossum’s Master Data Hub. Majority of the datasets are replicated from Coupa directly.

Calculated/Manual fields - Fields that are calculated based on values of other fields or default values. Formula fields are fields that hold the business logic.

For details about the Coupa fields please refer to the API documentation:

Header Fields

Name

Properties

Description

Coupa mapping

General Information

Document Type

"id": "document_type",

"type": "enum",

"required": true

Trainable (AI predicted) classification enumerator to recognize two standard document types: Tax Invoice and Credit Note.

There is special logic related to the Credit Note document type that depends on the value of this field.

Business rules:

  1. If the Coupa Total (calculated) is < 0 and the document is not marked as 'Credit Note' there is a warning and automation is blocked.

  2. If Document Type == 'Credit Note' then adjust the sign of the value according to the configuration of the Credit notes amounts field configuration.

  3. If Document Type == 'Credit Note' draft the document in Coupa.

No direct mapping, but Coupa fields document-type and is-credit-note are set based on the value.

Invoice Number

"id": "document_id",

"type": "string",

"required": false

Invoice Number extracted from the document.

Business rules:

  1. If the value is longer than 40 characters (Coupa maximum) there is a warning on the field in the UI and automation of the document is blocked.

  2. If there is no value present in the field the warning and automation is blocked.

Invoice Number (manual)

"id": "document_id_manual",

"type": "string",

"required": true

The value from the extracted field Invoice Number is copied to this field and it can be manually modified by the user if needed.

Business rules:

  1. If the extracted invoice number is longer than 40 characters (Coupa maximal length) the value copied to this field is automatically cut from the right side to 40 characters.

  2. The length of the field cannot exceed 40 characters. If the user enters logner value there is an error and document in Rossum cannot be confirmed.

invoice-number

Invoice Date

"id": "date_issue",

"type": "date",

"required": true

Invoice Date extracted from the document.

Invoice Date (manual)

"id": "date_issue_manual",

"type": "string",

"required": true

The value from the extracted field Invoice Date is copied to this field and it can be manually modified by the user if needed.

Business rules:

  1. If the date is more than 356 days in the past there is a warning and automation is blocked.

  2. If the date is more than 180 days in the future there is a warning and automation is blocked.

invoice-date

Due Date

"id": "date_due",

"type": "date",

"required": false

Due Date extracted from the document.

Payment Terms

"id": "terms",

"type": "string",

"required": false

Invoice Number extracted from the document.

Payment Terms (calculated)

"id": "terms_normalized",

"type": "string",

”source”: “formula“,

”hidden”: true,

"required": false

Calculated value of the payment terms. Rossum tries to calculate the payment terms (in days) in the following order (the first calculation returning a value ends the evaluation):

  1. Due Date - Invoice Date

  2. Payment Terms - number that is result of removing all non numeric characters.

  3. Supplier Payment Days Match

Payment Terms Match

"id": "payment_terms_match",

"type": "enum",

"required": false

Match of the existing active payment term object replicated from Coupa. The matching is based on the Payment Terms (calculated) number of days. If there are multiple terms found user can select one manually. The field is by default not mandatory in Rossum, but can be easily made mandatory if required by the customer.

Business rules:

  1. If the payment terms matched/selected in this field differ from the payment terms defined for the supplier in Coupa, there is a warning and automation is blocked.

Dataset: payment_terms

payment-term

The payment-term is object in Coupa linked to the Invoice on the header level. The mapping is based on the id of the object.

Description

"id": "header_description",

"type": "string",

"required": false

Description that can be captured from the header level of the document. Relates to the Fallback Line Item logic and serves as a description for the cases when there are no actual line items extracted from the documents.

Description (export)

"id": "description_export",

"type": "string",

”hidden”: false,

”source”: “formula“,

"required": false

  1. Description of matched PO line (PO backed only)

    1. Rossum in general follows the PO on the PO backed documents.

  2. If not available description captured from the document (Description field).

The field is editable by the user.

Relates to the Fallback Line Item logic and serves as a description for the cases when there are no actual line items extracted from the documents.

description

The field in Coupa is on the item level and the value of this field is used only when there are no actual line items extracted from the document in Rossum and fallback line item is create using header level values.

Supplier Part Number

"id": "code",

"type": "string",

"required": false

Supplier Part Number that can be captured from the header level of the document. Relates to the Fallback Line Item logic and it is used for the PO line matching for the cases when there are no actual line items extracted from the documents.

Notes

"id": "notes_manual",

"type": "string",

"required": false

Manual entry field. Usually used by AP teams to leave notes on documents that cannot be immediately confirmed (postpone reasons, exceptions handling notes, …). There is by default no mapping to Coupa, but it is common requirement to map the value a custom field there.

Customer Section

Customer Name

"id": "recipient_name",

"type": "string",

"required": false

Customer (entity/subsidiary) name extracted from the document. It is not directly mapped to Coupa, but it is used in the matching logic to find the customer (Chart of Accounts) record replicated from Coupa (See Customer Match field below).

Customer Address

"id": "recipient_address",

"type": "string",

"required": false

Customer (entity/subsidiary) address extracted from the document. It is not directly mapped to Coupa, but it is used in the matching logic to find the customer (Chart of Accounts) record replicated from Coupa (See Customer Match field below).

Customer Tax Number

"id": "recipient_tax_id",

"type": "string",

"required": false

Customer (entity/subsidiary) tax id (VAT Number in Europe) extracted from the document. It is not directly mapped to Coupa, but it is used in the matching logic to find the customer (Chart of Accounts) record replicated from Coupa (See Customer Match field below).

Customer Tax Number (normalized)

"id": "recipient_tax_id_normalized",

"type": "string",

”hidden”: true,

"required": false

Normalized value of the Customer Tax Number. The normalization removes all non-alphanumeric characters from the value.

Customer Match

"id": "recipient_match",

"type": "enum",

"required": false

Match of the active Customer in the data replicated from the Coupa database. The replicated object from Coupa is Account Type. The customer is referred to as Chart of Accounts on the header level of the invoice in the Coupa UI. The high level description of the matching logic if following (the first query that returns one or more records ends the evaluation):

  1. Exact match on Primary Address Tax ID using Customer Tax Number (normalized).

    1. There is normalisation on performed on both sides the values are compared without non-alphanumeric characters.

    2. The exact match is configured in a way to match also if there is country code of the Tax ID missing on the document.

  2. Exact match on name using Customer Name.

  3. Fuzzy match on name using Customer Name.

  4. Exact match on Primary Address name using Customer Name.

  5. Fuzzy match on Primary Address name using Customer Name.

  6. Fuzzy match on combination of Primary address name and the actual address using Customer Name and Customer Address.

  7. Return all active customers for manual selection.

The field is mandatory and if there is no unique match found user is forced to manually select one either from prefiltered list (result of fuzzy matching) or from the full list of the customer.

Please note that the field is not directly mapped to Coupa. It is because Rossum logic prefers information from the PO on the PO backed documents. The logic is evaluated on the level of the Customer (export) field. See description below.

Business rules:

  1. If the Customer Match is not equal to the Customer on the matched PO (for PO backed documents) there is a warning and automation is blocked.

Dataset: account_types

Customer Ship-To Match

"id": "recipient_ship_to_match",

"type": "enum",

"required": false

Match of the header level Ship To address based on the extracted Customer Address. On PO backed invoices the Ship To address is prefilled based on the PO data. The high level description of the matching logic if following (the first query that returns one or more records ends the evaluation):

  1. Exact match on id based on the Ship To address linked to the header level of the PO. The IDis result of the PO matching and it is stored in the PO Header Ship-To Match field described below.

    1. For PO backed documents this just mean propagation of the address from the PO to the invoice.

  2. Fuzzy match using Customer Address.

Dataset: addresses

ship-to-address

The ship-to-address is object in Coupa linked to the Invoice on the header level. The mapping is based on the id of the object.

Customer Name Match

"id": "recipient_name_match",

"type": "enum",

”hidden”: true,

"required": false

The value is propagated from the Customer that is matched in the Customer Match field.

This is so called “additional mapping“ field and it has no matching logic of its own.

Dataset: account_types

Customer Primary Address Match

"id": "recipient_primary_address_match",

"type": "enum",

”hidden”: true,

"required": false

The value is propagated from the Customer that is matched in the Customer Match field. The value is used for filtering of the Tax Registrations described in the Customer Tax Reg. Match field below.

This is so called “additional mapping“ field and it has no matching logic of its own.

Dataset: account_types

Customer Tax Reg. Match

"id": "recipient_tax_registration_match",

"type": "enum",

”hidden”: false,

"required": false

Match of the object that is linked in the header level Buyer VAT ID in Coupa. Customers in Coupa can have multiple tax registrations even from different countries. The high level description of the matching logic if following (the first query that returns one or more records ends the evaluation):

  1. Exact match on number based on the Customer Tax Number (normalized).

    1. There is normalisation on performed on both sides the values are compared without non-alphanumeric characters.

    2. The exact match is configured in a way to match also if there is country code of the Tax ID missing on the document.

  2. Return all active tax registrations of the matched customer.

  3. Return all tax registrations that match the Customer Tax Number (normalized).

  4. Return all tax registrations active in Coupa.

The matching logic is only triggered if Customer Match is not empty as it depends on the Customer Primary Address Match which links the tax registrations and the account types in Coupa. Only active tax registrations of the matched customer are part of the logic described above.

Dataset: tax_registrations

buyer-tax-registration

The buyer-tax-registration is object in Coupa linked to the Invoice on the header level. The mapping is based on the number of the tax registration.

Customer Country Code Match

"id": "recipient_country_code_match",

"type": "enum",

”hidden”: true,

"required": false

The value is propagated from the Customer’s Tax Registration that is matched in the Customer Tax Reg. Match field. It represents country of the matched Tax Registration of the customer. The value is used for filtering of the tax codes described in the Tax Code Match field below.

This is so called “additional mapping“ field and it has no matching logic of its own.

Dataset: tax_registrations

Customer Entity Country Code Match

"id": "recipient_entity_country_code_match",

"type": "enum",

”hidden”: true,

"required": false

The value is propagated from the Customer that is matched in the Customer Match field.  It represents country of the matched customer.  The value is used for filtering of the tax codes described in the Tax Code Match field below.

This is so called “additional mapping“ field and it has no matching logic of its own.

Dataset: account_types

Customer ID (export)

"id": "recipient_export",

"type": "string",

”hidden”: true,

”source”: “formula“,

"required": true

The logic in Rossum prefers information from the POs on the PO backed documents. It is the case also for the Customer (Chart of Accounts). Logic implemented in this field ensures that the customer that is linked to the first item of the first PO matched on this document is used as invoice Chart of Accounts in Coupa. The order of the priority for the evaluation of this field is following:

  1. Account type ID from the first non empty matched PO line (PO Line Customer (Coupa)  field on the header or on the line items).

  2. Customer Match

account-type

The account-type is object in Coupa linked to the Invoice on the header level. The mapping is based on the id of the object.

Customer (export)

"id": "recipient_name_export",

"type": "string",

”hidden”: false,

”source”: “formula“,

"required": true

The field value is visible representation of the exported customer name and itself is not mapped to Coupa.

The logic in Rossum prefers information from the POs on the PO backed documents. It is the case also for the Customer (Chart of Accounts). Logic implemented in this field ensures that the customer that is linked to the first item of the first PO matched on this document is used as invoice Chart of Accounts in Coupa. The order of the priority for the evaluation of this field is following:

  1. Account type ID from the first non empty matched PO line (PO Line Customer Name (Coupa)  field on the header or on the line items).

  2. Customer Name Match

Supplier Section

Supplier Name

"id": "sender_name",

"type": "string",

"required": false

Supplier name extracted from the document. It is not directly mapped to Coupa, but it is used in the matching logic to find the customer record replicated from Coupa (See Customer Match field below).

Supplier Address

"id": "sender_address",

"type": "string",

"required": false

Supplier address extracted from the document. It is not directly mapped to Coupa, but it is used in the matching logic to find the supplier record replicated from Coupa (See Supplier Match field below).

Supplier Tax Number

"id": "sender_tax_id",

"type": "string",

"required": false

Supplier tax id (VAT Number in Europe) extracted from the document. It is not directly mapped to Coupa, but it is used in the matching logic to find the supplier record replicated from Coupa (See Supplier Match field below).

Supplier Tax Number (normalized)

"id": "sender_tax_id_normalized",

"type": "string",

”hidden”: true,

”source”: “formula“,

"required": false

Normalized value of the Supplier Tax Number. The normalization removes all non-alphanumeric characters from the value.

Link to formula field with code: Rossum

Supplier Match

"id": "sender_match",

"type": "enum",

"required": false

Match of the active supplier record in the data replicated from the Coupa database. The high level description of the matching logic if following (the first query that returns one or more records ends the evaluation):

  1. Exact match on supplier’s tax-id field based on the Supplier Tax Number (normalized).

    1. There is normalisation on performed on both sides the values are compared without non-alphanumeric characters.

    2. The exact match is configured in a way to match also if there is country code of the Tax ID missing on the document.

  2. Exact match on supplier’s primary address vat-number field based on the Supplier Tax Number (normalized).

    1. There is normalisation on performed on both sides the values are compared without non-alphanumeric characters.

    2. The exact match is configured in a way to match also if there is country code of the Tax ID missing on the document.

  3. Exact match on Display Name using Supplier Name.

  4. Fuzzy match on Display Name using Supplier Name.

  5. Fuzzy match on combination of address and Display Name using Supplier Name and Supplier Address.

The field is mandatory and if there is no unique match found user is forced to manually select one either from prefiltered list (result of fuzzy matching) or from the full list of the customer.

Please note that the field is not directly mapped to Coupa. It is because Rossum logic prefers information from the PO on the PO backed documents. The logic is evaluated on the level of the Customer (export) field. See description below.

Business rules:

  1. If the Supplier Match is not equal to the Supplier on the matched PO (for PO backed documents) there is a warning and automation is blocked.

Dataset: suppliers

Supplier Country Code Match

"id": "sender_country_code_match",

"type": "enum",

”hidden”: true,

"required": false

The value is propagated from the supplier record that is matched in the Supplier Match field. It represents country of the matched supplier.

This is so called “additional mapping“ field and it has no matching logic of its own.

Dataset: suppliers

Supplier Payment Days Match

"id": "sender_payment_days_match",

"type": "enum",

”hidden”: true,

"required": false

The value is propagated from the supplier record that is matched in the Supplier Match field. It represents number of days from the supplier’s default payment terms in Coupa. It is used in the Payment Terms (calculated) logic described above.

This is so called “additional mapping“ field and it has no matching logic of its own.

Business rules:

  1. If the Payment Terms Matched differ from the value in this field, there is a warning and automation is blocked.

Dataset: suppliers

Supplier Display Name Match

"id": "sender_display_name_match",

"type": "enum",

”hidden”: true,

"required": false

The value is propagated from the supplier record that is matched in the Supplier Match field. It represents number of days from the supplier’s default payment terms in Coupa. It is used in the Payment Terms (calculated) logic described above. The field is used in the

This is so called “additional mapping“ field and it has no matching logic of its own.

Dataset: suppliers

Supplier Number (export)

"id": "sender_export",

"type": "string",

”hidden”: true,

"required": false

The logic in Rossum prefers information from the POs on the PO backed documents. It is the case also for the supplier. Logic implemented in this field ensures that the supplier that is linked to the PO matched on this document is used as invoice Supplier in Coupa. The order of the priority for the evaluation of this field is following:

  1. Supplier Number from the first non empty matched PO line (PO Line Supplier (Coupa) field on the header or on the line items).

  2. Supplier Match

supplier

The supplier is object in Coupa linked to the Invoice on the header level. The mapping is based on the id of the object.

Supplier (export)

"id": "sender_name_export",

"type": "string",

”hidden”: false,

"required": true

The field value is visible representation of the exported supplier name and itself is not mapped to Coupa.

The logic in Rossum prefers information from the POs on the PO backed documents. It is the case also for the supplier. Logic implemented in this field ensures that the supplier that is linked to the PO matched on this document is used as invoice Supplier in Coupa. The order of the priority for the evaluation of this field is following:

  1. Supplier from the first non empty matched PO line (PO Line Supplier Name (Coupa) field on the header or on the line items).

  2. Supplier Name Match

Bank Details

IBAN

"id": "iban",

"type": "string",

"required": false

IBAN provided by the supplier on the document.

BIC/SWIFT

"id": "bic",

"type": "string",

"required": false

BIC/SWIFT provided by the supplier on the document.

Account Number

"id": "account_num",

"type": "string",

"required": false

Account Number provided by the supplier on the document.

Bank Code

"id": "bank_num",

"type": "string",

"required": false

Bank Code provided by the supplier on the document.

Credit Note

Original Invoice Number

"id": "original_document_id",

"type": "string",

"required": false

Value captured as it appears on the document, non-editable by users

Original Invoice Date

"id": "original_date_issue",

"type": "string",

"required": false

Value captured as it appears on the document, non-editable by users

Credit note amounts

"id": "credit_notes_amounts",

"type": "string",

”hidden”: true,

"required": false

”default_value”: “negative“

Hidden field for configuration of Rossum behavior on credit notes. The field is configured through the default value and following values are expected:

  • “negative”: Rossum will make the exported amounts negative regardless the signs on the credit note document to achieve negative Total Amount in Coupa.

  • “positive“: Rossum will make the exported amounts positive regardless the signs on the credit note document to achieve negative Total Amount in Coupa.

Taxes & Amounts

Amount Due

"id": "amount_total",

"type": "number",

"required": false

Value captured as it appears on the document, non-editable by users.

Business rules:

  1. Amount Due == Subtotal + Tax Amount (calculated) + Charges (calculated)

  2. Amount Due >= sum(Line Total Net) + Tax Amount (calculated) + Charges (calculated)

  3. Amount Due >= Subtotal

  4. Amount Due or Subtotal must have value

  5. abs(Amount Due) = abs(Coupa Total (calculated))

If any of the conditions above does not match there is a warning and automation is blocked.

gross-total, total-with-taxes

Subtotal

"id": "amount_total_base",

"type": "number",

"required": false

Value captured as it appears on the document, non-editable by users.

Business rules:

  1. Subtotal == Amount Due - Tax Amount (calculated) - Charges (calculated)

  2. Subtotal <= Amount Due

  3. Amount Due or Subtotal must have value

  4. Subtotal == sum(Line Total Net)

If any of the conditions above does not match there is a warning and automation is blocked.

Subtotal (calculated)

"id": "amount_total_base_calculated",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

  1. Subtotal

  2. Amount Due - Tax Amount (calculated) - Charges (calculated)

Tax Amount

"id": "amount_total_tax",

"type": "number",

"required": false

List of values captured as they appear on the document, non-editable by users.

Tax Amount (calculated)

"id": "amount_total_tax_calculated",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

  1. sum(Tax Amount)

The calculated value is rounded to the 2 decimal places.

Business rules:

  1. Tax Amount (calculated) == Amount Due - Subtotal - Charges (calculated)

  2. sum(Line Total Net) + Tax Amount (calculated) + Charges (calculated) == Amount Due

  3. if the Document Type = “Credit Note“ then adjust the sign of the value according to the configuration of the Credit notes amounts field configuration.

If any of the conditions above does not match there is a warning and automation is blocked.

Tax Rate (calculated)

"id": "tax_rate_calculated",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

  1. (Tax Amount (calculated) /  (Amount Due - Tax Amount (calculated))) * 100

The resulting value is rounded to 2 decimal places.

Shipping Charges

"id": "shipping_charge",

"type": "number",

"required": false

List of values captured as they appear on the document, non-editable by users.

Charges (calculated)

"id": "charges_calculated",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

  1. sum(Shipping Charges)

From the line items rounded to 2 decimal places.

Exported as part of the invoice-charges line to Coupa. Rossum treats all charges as shipping charges aggregates them and sends them to Coupa as one charge line. This allows automation of the workflow.

Currency

"id": "currency",

"type": "enum",

"required": true

Value is predicted based on the document content (classifier), selectable by users (the currency is not extracted from document using bounding box, but based on user selection = classifier)

The currency is verified against the currency on the matched PO line. There is a warning shown and automation is blocked if there is a discrepancy.

Business rules:

  1. Currency on all matched PO lines must match the document currency in this field. Otherwise there is a warning and automation is blocked.

exported to Coupa in the currency field

Coupa Total (calculated)

"id": "coupa_total_calculated",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

If line items are extracted:

  1. Item Price (Coupa) * Item Quantity (Coupa) + Charges (calculated) + Tax Amount (calculated)

If there are no line items extracted:

  1. Price (Coupa) * Quantity (Coupa) + Charges (calculated) + Tax Amount (calculated)

Because Coupa does its own calculation using the values provided by Rossum it could theoretically end up with different value that the total mentioned on the document. Rossum simulates the calculation in Coupa and checks the consistency with the document content to avoid incorrect data export to Coupa.

Business rules:

  1. There is a warning shown and automation is blocked when the calculated value differs from the Amount Due.

Purchase Order

PO Number

“id”: “order_id”

"type": "string",

”hidden”: false,

”source”: “captured“,

"required": false

Value captured as it appears on the document, non-editable by users.

order-header-num

PO Status

"id": "order_header_status_match",

"type": "enum",

”hidden”: false,

”source”: “data“,

"required": false

Status of the PO matched on the line.

Business rules:

  1. PO Status == 'issued'

If the formula above does not match there is an error and document cannot be confirmed.

Dataset: purchase_orders

PO Line Match

“id”: “order_item_match”

"type": "enum",

”hidden”: false,

"required": false

The field is not visible if there are line items extracted from the document. If there are not lines it serves as a PO line match for the fallback line that will be created in Coupa based on the header level values extracted in Rossum (see

Coupa Integration Baseline (CIB) | Line items extraction and export to Coupa ).

Lines of the PO extracted in field PO Number or selected in the Blanket PO Match field are taken into consideration.

The matching logic is following:

  1. Exact match on the Supplier Part Number against source-part-num Coupa field

  2. Fuzzy match on the Description

  3. All line items of the matched PO

Business rules:

  1. The field is required for PO backed documents when there are no line items in the document extracted.

Dataset: purchase_order_lines

order-line-num

PO Line Status

"id": "po_line_status_match",

"type": "enum",

”hidden”: false,

”source”: “data“,

"required": false

Status of the matched PO line.

Business rules:

  1. PO Status in ‘created', ‘received’, ‘partially_received’, 'soft_closed_for_receiving’

If the formula above does not match there is an error and document cannot be confirmed.

Dataset: purchase_order_lines

PO Line Currency (Coupa)

"id": "po_line_currency_match",

"type": "enum",

”hidden”: false,

”source”: “data“,

"required": false

Currency propagated from the PO line matched in the PO Line Match field.

Business rules:

  1. PO Line Currency (Coupa) == Currency

If the formula above does not match there is a warning message and automation is blocked.

Dataset: purchase_order_lines

Line Items

Line Items are extracted as a separate table. See description of the fields in the Line Items chapter below.

Coupa Technical Fields

Submit For Approval

"id": "sf_submit_for_approval",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

Read only field that will automatically evaluate based on values of other fields in the document:

  • if Enforce Draft = No AND

  • PO backed (open valid Coupa PO number is extracted from the document or selected in the Blanket PO Match field) AND

  • Fully tax coded (Tax Code selected on all lines) AND

  • Document Type is not Credit Note

  • then Yes = the document will be submitted in Coupa (the last API call of the export pipeline will be performed)

Enforce Draft

"id": "enforce_draft",

"type": "enum",

”hidden”: false,

”source”: “manual“,

"required": false

There are cases when the document is set for submission by the rules implemented in the Submit For Approval field, however the user has a reason not to submit directly from Rossum (manual adjustment or check in Coupa is needed before the submission). By setting value of this field to Yes user can enforce drafting of the document Coupa.

Yes or no, manual selection.

PO x Invoice CoA Mismatch Tag

"id": "coa_mismatch_tag",

"type": "enum",

”hidden”: false,

”source”: “formula“,

"required": false

If the CoA (customer’s entity) on the invoice does not match the CoA on any of the matched PO lines (Coupa stores this information on the line level of the PO) this tag is set and sent to Coupa. Rossum will follow the information on the PO so the invoice in Coupa will be created with the CoA defined on the PO.

PO x Invoice Supplier Mismatch Tag

"id": "supplier_mismatch_tag",

"type": "enum",

”hidden”: false,

”source”: “formula“,

"required": false

If the Supplier on the invoice does not match the Supplier on any of the matched POs (there can be different POs used on one document in Rossum on different line items) this tag is set and sent to Coupa. Rossum will follow the information on the PO so the invoice in Coupa will be created with the supplier defined on the PO.

PO Line Inactive Tag

"id": "inactive_po_line_tag",

"type": "enum",

”hidden”: false,

”source”: “formula“,

"required": false

The tag is set if any of the matched PO lines is in status that is considered closed or inactive by Rossum.

By default Rossum considers the PO line to be closed if it is not in ['partially_received', 'received', 'soft_closed_for_receiving','created'] statuses.

Coupa Invoices Statuses

"id": "coupa_invoices_statuses",

"type": "string",

”hidden”: false,

”source”: “data“,

"required": false

Technical field for indication of the statuses of duplicate invoices already existing in Coupa. See full description of Duplicate Documents in Coupa.

The value contains distinct list of statuses of documents with the same Invoice Number for the same supplier existing in Coupa.

Business rules:

  1. There is a warning and automation blocker on the field when the value is not empty.

Coupa API Base URL

"id": "coupa_api_base_url",

"type": "string",

”hidden”: true,

”source”: “formula“,

"required": false

Configuration field. The formula should be configured to return static value of base URL (with / at the end) of the Coupa of the customer.

Example: "https://rossum-czech-coupalink.coupacloud.com/"

OAuth Client ID

"id": "oauth_client_id",

"type": "true",

”hidden”: false,

”source”: “formula“,

"required": false

Configuration field. The formula must be configured to return static value of the Client ID of the oAuth client created in Customer’s Coupa for purposes of Rossum integration.

Example: "kf7968x7424a019ec6eb1178c38e1a0c"

Line Items

Description

"id": "item_description",

"type": "string",

”hidden”: false,

”source”: “captured“,

"required": false

Item description captured from the document.

Description (export)

"id": "item_description_export",

"type": "string",

”hidden”: false,

”source”: “formula“,

"required": false

  1. Description of matched PO line (PO backed only)

    1. Rossum in general follows the PO on the PO backed documents.

  2. If not available description captured from the document (Description field).

The field is editable by the user.

description

Quantity

“id”: “item_quantity”

"type": "number",

”hidden”: false,

”source”: “captured“,

"required": false

Value captured as it appears on the document.

Business rules:

  1. default(Quantity, 1) == Line Total Net / Unit Price Net

If the formula above does not match there is a warning and automation is blocked.

Quantity (calculated)

"id": "item_quantity_calculated",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

  1. The captured Quantity field value

  2. If not available calculated as:

    1. Item Total / Unit Price

Unit Price Net

"id": "item_amount_base",

"type": "number",

”hidden”: false,

”source”: “captured“,

"required": false

Value captured from the line item on the document.

Business rules:

  1. Unit Price Net == Line Total Net / default(Quantity, 1)

If the formula above does not match there is a warning and automation is blocked.

Unit Price Net (calculated)

"id": "item_amount_base_calculated",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

  1. The captured Unit Price field value

  2. If not available calculated as:

    1. Item Total / Quantity (calculated)

Line Total Net

"id": "item_total_base",

"type": "number",

”hidden”: false,

”source”: “captured“,

"required": false

Value captured from the line item on the document.

Business rules:

  1. Line Total Net == Unit Price Net * default(Quantity, 1)

If the formula above does not match there is a warning and automation is blocked.

Line Total Net (calculated)

"id": "item_total_base_calculated",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

  1. The captured Item Total field value

  2. If not available calculated as:

    1. Unit Price / Quantity (calculated)

PO Number

"id": "item_order_id",

"type": "string",

”hidden”: false,

”source”: “captured“,

"required": false

Value captured from the line item on the document.

PO Number (calculated)

"id": "item_order_id_calculated",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

The PO number for purposes of the PO line matching is evaluated on the Invoice line from multiple sources. In general the header level captured or selected PO number is used if there is no line item level PO Number or Blanket PO Match. This allows both header and line level specification of the PO number and also for multiple different PO numbers on different line items.

PO Line Match

"id": "item_order_item_match",

"type": "enum",

”hidden”: false,

”source”: “data“,

"required": false

Lines of the PO evaluated in the PO Number (calculated) field are taken into consideration.

The matching logic is following:

  1. Exact match on the Supplier Part Number against source-part-num Coupa field

  2. Fuzzy match on the Description

  3. All line items of the matched PO

Dataset: purchase_order_lines

PO Line Currency (Coupa)

"id": "item_po_line_currency_match",

"type": "enum",

”hidden”: false,

”source”: “data“,

"required": false

Currency propagated from the PO line matched in the PO Line Match field.

Business rules:

  1. PO Line Currency (Coupa) == Currency

If the formula above does not match there is a warning message and automation is blocked.

Dataset: purchase_order_lines

PO Status

"id": "item_order_header_status_match",

"type": "enum",

”hidden”: false,

”source”: “data“,

"required": false

Status of the PO matched on the line.

Business rules:

  1. PO Status == 'issues'

If the formula above does not match there is an error and document cannot be confirmed.

Dataset: purchase_orders

Item Quantity (Coupa)

"id": "item_quantity_export",

"type": "number",

”hidden”: false,

”source”: “formula“,

"required": false

  1. If PO Line Match.Line Type = InvoiceQuantityLine then Quantity (calculated)

  2. Else ““ (keep the quantity empty for the amount based invoice lines)

  3. the result is rounded to 6 decimal places

quantity

Item Price (Coupa)

"id": "item_price_export",

"type": "number",

”hidden”: false,

”source”: “formula“,

"required": false

  1. If PO Line Match.Line Type != OrderAmountLine then Unit Price Net (calculated)

  2. Else Line Total Net (calculated) (Unit Price and no quantity for quantity based lines and Line Total for amount based)

  3. if the Document Type = “Credit Note“ then adjust the sign of the value according to the configuration of the Credit notes amounts field configuration.

  4. the result is rounded to 6 decimal places

price