CIB Standard Extraction Schema (line level taxation)

Prev Next

The Rossum extraction schema described is designed to satisfy common needs of the customers in Europe and part of the APAC countries. There is a separate schema for the US market. 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 (this schema) whilst the header level taxation without Tax Codes in the US.

ℹ️  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:

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

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

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:

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.

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:

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.

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.

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:

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 (Search)

"id": "recipient_search",

”source”: “manual“,

"type": "string",

”hidden”: false,

"required": false

Manual field to search for the Customer in Coupa dataset based on the name. It is used in combination with the Memorisation mechanism to override the memorized value if it was selected incorrectly in previous document.

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. “Contains“ search on the Customer (Search) on name attribute.

  2. Exact match on the memorized value from the Memorisation mechanism if previously selected value for the same context was found.

  3. 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.

  4. Exact match on name using Customer Name.

  5. Fuzzy match on name using Customer Name.

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

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

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

  9. 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 (Search)

"id": "sender_search",

”source”: “manual“,

"type": "string",

”hidden”: false,

"required": false

Manual field to search for the Supplier in Coupa dataset based on the name. It is used in combination with the Memorisation mechanism to override the memorized value if it was selected incorrectly in previous document.

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. “Contains“ search on the Supplier (Search) on name attribute.

  2. Exact match on the memorized value from the Memorisation mechanism if previously selected value for the same context was found.

  3. 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.

  4. 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.

  5. Exact match on Display Name using Supplier Name.

  6. Fuzzy match on Display Name using Supplier Name.

  7. 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

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

Total Amount

"id": "amount_total",

"type": "number",

"required": false

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

Business rules:

  1. Total Amount == Total Without Tax + Tax Amount

  2. Total Amount >= Total Without Tax

  3. Total Amount or Total Without Tax must have value

  4. abs(Total Amount) = 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

Total Without Tax

"id": "amount_total_base",

"type": "number",

"required": false

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

Business rules:

  1. Total Without Tax == Total Amount - Tax Amount

  2. Total Without Tax <= Total Amount

  3. Total Without Tax or Total Amount  must have value

  4. Total Without Tax == sum(Line Total Net)

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

Total Without Tax (calculated)

"id": "amount_total_base_calculated",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

  1. If Total Without Tax is set then Total Without Tax

  2. else if both Total Amount and Tax Amount are set, calculate the difference.

  3. else Total Amount

The calculated value is rounded to the 6 decimal places.

Tax Amount

"id": "amount_total_tax",

"type": "number",

"required": false

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

Business rules:

  1. Tax Amount == Total Amount - Total Without Tax

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

Tax Amount (calculated)

"id": "amount_total_tax_calculated",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

  1. If Tax Amount is set then Tax Amount

  2. If both Tax Amount  and Total Without Tax  are set, calculate the difference.

  3. If Total Amount and Tax Rate (calculated) are set, calculate tax from Total Amount.

  4. If Total Without Tax and Tax Rate (calculated) are set, calculate tax from Total Without Tax

  5. If only Total Amount is set, set 0

The calculated value is rounded to the 6 decimal places.

Business rules:

  1. Tax Amount (calculated) == sum(Line Tax Amount (calculated))  + Charges Tax Total (calculated)

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

Tax Rate

"id": "tax_rate",

"type": "number",

"required": false

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

Tax Rate (calculated)

"id": "tax_rate_calculated",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

  1. if tax_rate is set use tax_rate

  2. if amount_total_base and amount_total_tax are both set, calculate tax_rate as (amount_total_tax / amount_total_base) * 100

  3. if amount_total and amount_total_base are both set, calculate tax_rate as ((amount_total - amount_total_base) / amount_total_base) * 100.

  4. if only amount_total is present, set tax_rate to 0

the tax_rate is rounded to 1 decimal place

Tax Code Match

"id": "tax_code_match",

"type": "enum",

”hidden”: false,

”source”: “data“,

"required": false

Tax code is matched based on the percentage and country of the matched Customer Tax Registration.  If there is no Customer Tax Registration matched all tax codes of given percentage and provided for the selection.

This value is made visible and used when there are no line items extracted from the document (see

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

Business rules:

  1. There is a warning that the document will not be submitted in Coupa when the field is empty.

Dataset: tax_codes

Charges

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

Charges Net Amount Total (calculated)

"id": "charges_net_amount_total_calculated",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

Sum of all charge_amount values (see charges table schema description below) from the line items rounded to 6 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.

Charges Tax Total (calculated)

"id": "charges_total_tax_calculated",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

Sum of all charge_tax values (see charges table schema description below) from the line items rounded to 6 decimal places.

Business rules:

  1. Charges Tax Total (calculated) ==  Tax Amount (calculated) - sum(Line Tax Amount (calculated))

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.

Charges Tax Rate Average (calculated)

"id": "charges_tax_rate_average_calculated",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

If the charge_tax_rate_calculated field is set, calculate the rounded sum of charge_tax_rate_calculated / number of these charges, rounded to 6 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

  • coupa total = total_amount + charges + taxes

  • the result is rounded to 2 decimal places

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 Total.

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 matched PO.

Business rules:

  • 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 Line 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

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 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

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"

Charges

Table for extraction of additional charges (Shipping, Handling and Miscellaneous in Coupa terminology) from the document. There can be multiple charges on the document, however Coupa accepts only one line per charge type. Also the charges types are usually not clear from the document context and it is not possible to automate categorisation of the charge types. Rossum therefore treats all charges as Shipping and aggregates all values extracted in the

table below for the coupa export (see fields Charges Net Amount Total (calculated) above). This behavior can be changed if the customer needs to capture charges of different types separately.

Tax Coding of the charges is not implemented in the baseline integration logic, but can be added as a custom development.

Charge Type

"id": "charge_type",

"type": "enum",

”hidden”: true,

”source”: “data“,

"required": false

Rossum defaults the InvoiceShippingCharge charge type. The selection of the type is not possible (the field is hidden) in the default configuration.  

Charge Amount

"id": "charge_amount",

"type": "number",

”hidden”: false,

”source”: “captured“,

"required": true

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

Charge Tax Amount

"id": "charge_tax",

"type": "number",

”hidden”: false,

”source”: “captured“,

"required": false

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

Charge Tax Amount (calculated)

"id": "charge_tax_calculated",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

  • If Charge Tax Amount is present then Charge Tax Amount

  • else Charge Amount * Charge Tax Rate (calculated)

Charge Tax Rate

"id": "charge_tax_rate",

"type": "number",

”hidden”: false,

”source”: “captured“,

"required": false

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

Charge Tax Rate (calculated)

"id": "charge_tax_rate_calculated",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

  1. If Charge Tax Rate is present then Charge Tax Rate

  2. else if Charge Tax is present then calculate (Charge Amount / (Charge Amount - Charge Tax)) *100

  3. Tax Rate (calculated) is present then Tax Rate (calculated) (defaulting from the document level tax rate)

  4. else 0

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)

Line Tax Rate

"id": "item_rate",

"type": "number",

”hidden”: false,

”source”: “captured“,

"required": false

Value captured from the line item on the document.

Line Tax Rate (calculated)

"id": "item_rate_calculated",

"type": "number",

”hidden”: true,

”source”: “formula“,

"required": false

  1. If Line Tax Rate is set then Line Tax Rate

  2. If Line Tax Rate is not set and both Line Total Net (calculated) and Line Tax Amount are set then Line Tax Amount / (Line Total Net (calculated) / 100)

  3. else if Tax Rate (calculated) then Tax Rate (calculated)

  4. the result is rounded to 1 decimal place

Line Tax Amount

"id": "item_tax",

"type": "number",

”hidden”: false,

”source”: “captured“,

"required": false

Value captured from the line item on the document.

Line Tax Amount (calculated)

"id": "item_tax_calculated",

"type": "number",

”hidden”: false,

”source”: “formula“,

"required": false

  1. If Line Tax Amount is set then Line Tax Amount

  2. Else if Line Total Net (calculated) and Line Tax Rate (calculated) are set then Line Total Net (calculated) * (Line Tax Rate (calculated) / 100)

  3. Else 0

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

  5. the result is rounded to 6 decimal places

Tax Code Match

"id": "item_tax_code_match",

"type": "enum",

”hidden”: false,

”source”: “data“,

"required": false

Tax code is matched based on the percentage and country of the matched Customer Tax Registration.  If there is no Customer Tax Registration matched all tax codes of given percentage and provided for the selection.

Business rules:

  1. If the value is empty there is a warning that the document will not be submitted to Coupa.

Dataset: tax_codes

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-number

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 Status

"id": "item_po_line_status_match",

"type": "enum",

”hidden”: false,

”source”: “data“,

"required": false

Status of the matched PO line.

Business rules:

  1. PO Line 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": "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 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