{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:gluendo:schema:finance:invoice:v1.1.0",
  "title": "Invoice",
  "description": "Canonical representation of an invoice entity. Produced by ERP or billing systems on invoice lifecycle events (submitted, approved, paid, cancelled).",
  "type": "object",
  "required": [
    "invoiceId"
  ],
  "properties": {
    "invoiceId": {
      "type": "string",
      "description": "Unique invoice identifier as assigned by the source system"
    },
    "invoiceNumber": {
      "type": "string",
      "description": "Human-readable invoice number (may differ from invoiceId)"
    },
    "issueDate": {
      "type": "string",
      "format": "date",
      "description": "Date the invoice was issued (ISO 8601)"
    },
    "dueDate": {
      "type": "string",
      "format": "date",
      "description": "Payment due date (ISO 8601)"
    },
    "status": {
      "oneOf": [
        {
          "const": "draft",
          "description": "Invoice created but not yet submitted"
        },
        {
          "const": "submitted",
          "description": "Submitted for approval"
        },
        {
          "const": "approved",
          "description": "Approved for payment"
        },
        {
          "const": "paid",
          "description": "Payment received"
        },
        {
          "const": "cancelled",
          "description": "Invoice cancelled"
        },
        {
          "const": "disputed",
          "description": "Invoice under dispute"
        }
      ],
      "description": "Current invoice status"
    },
    "supplierId": {
      "type": "string",
      "description": "Identifier of the supplier or vendor"
    },
    "supplierName": {
      "type": "string",
      "description": "Name of the supplier or vendor"
    },
    "customerId": {
      "type": "string",
      "description": "Identifier of the customer being invoiced"
    },
    "customerName": {
      "type": "string",
      "description": "Name of the customer being invoiced"
    },
    "totalAmount": {
      "title": "Monetary Amount",
      "description": "Total invoice amount including taxes",
      "type": "object",
      "required": [
        "amount",
        "currency"
      ],
      "properties": {
        "amount": {
          "type": "number",
          "description": "The monetary value. Use the currency's standard decimal precision (e.g., 2 decimals for EUR/USD)"
        },
        "currency": {
          "title": "Currency Code",
          "description": "ISO 4217 currency code",
          "type": "string",
          "enum": [
            "AED",
            "AFN",
            "ALL",
            "AMD",
            "ANG",
            "AOA",
            "ARS",
            "AUD",
            "AWG",
            "AZN",
            "BAM",
            "BBD",
            "BDT",
            "BGN",
            "BHD",
            "BIF",
            "BMD",
            "BND",
            "BOB",
            "BOV",
            "BRL",
            "BSD",
            "BTN",
            "BWP",
            "BYR",
            "BZD",
            "CAD",
            "CDF",
            "CHE",
            "CHF",
            "CHW",
            "CLF",
            "CLP",
            "CNY",
            "COP",
            "COU",
            "CRC",
            "CUC",
            "CUP",
            "CVE",
            "CZK",
            "DJF",
            "DKK",
            "DOP",
            "DZD",
            "EGP",
            "ERN",
            "ETB",
            "EUR",
            "FJD",
            "FKP",
            "GBP",
            "GEL",
            "GHS",
            "GIP",
            "GMD",
            "GNF",
            "GTQ",
            "GYD",
            "HKD",
            "HNL",
            "HRK",
            "HTG",
            "HUF",
            "IDR",
            "ILS",
            "INR",
            "IQD",
            "IRR",
            "ISK",
            "JMD",
            "JOD",
            "JPY",
            "KES",
            "KGS",
            "KHR",
            "KMF",
            "KPW",
            "KRW",
            "KWD",
            "KYD",
            "KZT",
            "LAK",
            "LBP",
            "LKR",
            "LRD",
            "LSL",
            "LYD",
            "MAD",
            "MDL",
            "MGA",
            "MKD",
            "MMK",
            "MNT",
            "MOP",
            "MRO",
            "MUR",
            "MVR",
            "MWK",
            "MXN",
            "MXV",
            "MYR",
            "MZN",
            "NAD",
            "NGN",
            "NIO",
            "NOK",
            "NPR",
            "NZD",
            "OMR",
            "PAB",
            "PEN",
            "PGK",
            "PHP",
            "PKR",
            "PLN",
            "PYG",
            "QAR",
            "RON",
            "RSD",
            "RUB",
            "RWF",
            "SAR",
            "SBD",
            "SCR",
            "SDG",
            "SEK",
            "SGD",
            "SHP",
            "SLL",
            "SOS",
            "SRD",
            "SSP",
            "STD",
            "SVC",
            "SYP",
            "SZL",
            "THB",
            "TJS",
            "TMT",
            "TND",
            "TOP",
            "TRY",
            "TTD",
            "TWD",
            "TZS",
            "UAH",
            "UGX",
            "USD",
            "USN",
            "UYI",
            "UYU",
            "UZS",
            "VEF",
            "VND",
            "VUV",
            "WST",
            "XAF",
            "XCD",
            "XDR",
            "XOF",
            "XPF",
            "XSU",
            "XUA",
            "YER",
            "ZAR",
            "ZMW",
            "ZWL"
          ],
          "examples": [
            "EUR",
            "USD"
          ]
        }
      }
    },
    "taxAmount": {
      "title": "Monetary Amount",
      "description": "Total tax amount",
      "type": "object",
      "required": [
        "amount",
        "currency"
      ],
      "properties": {
        "amount": {
          "type": "number",
          "description": "The monetary value. Use the currency's standard decimal precision (e.g., 2 decimals for EUR/USD)"
        },
        "currency": {
          "title": "Currency Code",
          "description": "ISO 4217 currency code",
          "type": "string",
          "enum": [
            "AED",
            "AFN",
            "ALL",
            "AMD",
            "ANG",
            "AOA",
            "ARS",
            "AUD",
            "AWG",
            "AZN",
            "BAM",
            "BBD",
            "BDT",
            "BGN",
            "BHD",
            "BIF",
            "BMD",
            "BND",
            "BOB",
            "BOV",
            "BRL",
            "BSD",
            "BTN",
            "BWP",
            "BYR",
            "BZD",
            "CAD",
            "CDF",
            "CHE",
            "CHF",
            "CHW",
            "CLF",
            "CLP",
            "CNY",
            "COP",
            "COU",
            "CRC",
            "CUC",
            "CUP",
            "CVE",
            "CZK",
            "DJF",
            "DKK",
            "DOP",
            "DZD",
            "EGP",
            "ERN",
            "ETB",
            "EUR",
            "FJD",
            "FKP",
            "GBP",
            "GEL",
            "GHS",
            "GIP",
            "GMD",
            "GNF",
            "GTQ",
            "GYD",
            "HKD",
            "HNL",
            "HRK",
            "HTG",
            "HUF",
            "IDR",
            "ILS",
            "INR",
            "IQD",
            "IRR",
            "ISK",
            "JMD",
            "JOD",
            "JPY",
            "KES",
            "KGS",
            "KHR",
            "KMF",
            "KPW",
            "KRW",
            "KWD",
            "KYD",
            "KZT",
            "LAK",
            "LBP",
            "LKR",
            "LRD",
            "LSL",
            "LYD",
            "MAD",
            "MDL",
            "MGA",
            "MKD",
            "MMK",
            "MNT",
            "MOP",
            "MRO",
            "MUR",
            "MVR",
            "MWK",
            "MXN",
            "MXV",
            "MYR",
            "MZN",
            "NAD",
            "NGN",
            "NIO",
            "NOK",
            "NPR",
            "NZD",
            "OMR",
            "PAB",
            "PEN",
            "PGK",
            "PHP",
            "PKR",
            "PLN",
            "PYG",
            "QAR",
            "RON",
            "RSD",
            "RUB",
            "RWF",
            "SAR",
            "SBD",
            "SCR",
            "SDG",
            "SEK",
            "SGD",
            "SHP",
            "SLL",
            "SOS",
            "SRD",
            "SSP",
            "STD",
            "SVC",
            "SYP",
            "SZL",
            "THB",
            "TJS",
            "TMT",
            "TND",
            "TOP",
            "TRY",
            "TTD",
            "TWD",
            "TZS",
            "UAH",
            "UGX",
            "USD",
            "USN",
            "UYI",
            "UYU",
            "UZS",
            "VEF",
            "VND",
            "VUV",
            "WST",
            "XAF",
            "XCD",
            "XDR",
            "XOF",
            "XPF",
            "XSU",
            "XUA",
            "YER",
            "ZAR",
            "ZMW",
            "ZWL"
          ],
          "examples": [
            "EUR",
            "USD"
          ]
        }
      }
    },
    "lineItems": {
      "type": "array",
      "description": "Individual line items on the invoice",
      "items": {
        "type": "object",
        "required": [
          "description",
          "quantity",
          "unitPrice"
        ],
        "properties": {
          "description": {
            "type": "string",
            "description": "Description of the goods or services"
          },
          "quantity": {
            "type": "number",
            "description": "Quantity of items",
            "exclusiveMinimum": 0
          },
          "unitPrice": {
            "title": "Monetary Amount",
            "description": "Price per unit",
            "type": "object",
            "required": [
              "amount",
              "currency"
            ],
            "properties": {
              "amount": {
                "type": "number",
                "description": "The monetary value. Use the currency's standard decimal precision (e.g., 2 decimals for EUR/USD)"
              },
              "currency": {
                "title": "Currency Code",
                "description": "ISO 4217 currency code",
                "type": "string",
                "enum": [
                  "AED",
                  "AFN",
                  "ALL",
                  "AMD",
                  "ANG",
                  "AOA",
                  "ARS",
                  "AUD",
                  "AWG",
                  "AZN",
                  "BAM",
                  "BBD",
                  "BDT",
                  "BGN",
                  "BHD",
                  "BIF",
                  "BMD",
                  "BND",
                  "BOB",
                  "BOV",
                  "BRL",
                  "BSD",
                  "BTN",
                  "BWP",
                  "BYR",
                  "BZD",
                  "CAD",
                  "CDF",
                  "CHE",
                  "CHF",
                  "CHW",
                  "CLF",
                  "CLP",
                  "CNY",
                  "COP",
                  "COU",
                  "CRC",
                  "CUC",
                  "CUP",
                  "CVE",
                  "CZK",
                  "DJF",
                  "DKK",
                  "DOP",
                  "DZD",
                  "EGP",
                  "ERN",
                  "ETB",
                  "EUR",
                  "FJD",
                  "FKP",
                  "GBP",
                  "GEL",
                  "GHS",
                  "GIP",
                  "GMD",
                  "GNF",
                  "GTQ",
                  "GYD",
                  "HKD",
                  "HNL",
                  "HRK",
                  "HTG",
                  "HUF",
                  "IDR",
                  "ILS",
                  "INR",
                  "IQD",
                  "IRR",
                  "ISK",
                  "JMD",
                  "JOD",
                  "JPY",
                  "KES",
                  "KGS",
                  "KHR",
                  "KMF",
                  "KPW",
                  "KRW",
                  "KWD",
                  "KYD",
                  "KZT",
                  "LAK",
                  "LBP",
                  "LKR",
                  "LRD",
                  "LSL",
                  "LYD",
                  "MAD",
                  "MDL",
                  "MGA",
                  "MKD",
                  "MMK",
                  "MNT",
                  "MOP",
                  "MRO",
                  "MUR",
                  "MVR",
                  "MWK",
                  "MXN",
                  "MXV",
                  "MYR",
                  "MZN",
                  "NAD",
                  "NGN",
                  "NIO",
                  "NOK",
                  "NPR",
                  "NZD",
                  "OMR",
                  "PAB",
                  "PEN",
                  "PGK",
                  "PHP",
                  "PKR",
                  "PLN",
                  "PYG",
                  "QAR",
                  "RON",
                  "RSD",
                  "RUB",
                  "RWF",
                  "SAR",
                  "SBD",
                  "SCR",
                  "SDG",
                  "SEK",
                  "SGD",
                  "SHP",
                  "SLL",
                  "SOS",
                  "SRD",
                  "SSP",
                  "STD",
                  "SVC",
                  "SYP",
                  "SZL",
                  "THB",
                  "TJS",
                  "TMT",
                  "TND",
                  "TOP",
                  "TRY",
                  "TTD",
                  "TWD",
                  "TZS",
                  "UAH",
                  "UGX",
                  "USD",
                  "USN",
                  "UYI",
                  "UYU",
                  "UZS",
                  "VEF",
                  "VND",
                  "VUV",
                  "WST",
                  "XAF",
                  "XCD",
                  "XDR",
                  "XOF",
                  "XPF",
                  "XSU",
                  "XUA",
                  "YER",
                  "ZAR",
                  "ZMW",
                  "ZWL"
                ],
                "examples": [
                  "EUR",
                  "USD"
                ]
              }
            }
          },
          "lineTotal": {
            "title": "Monetary Amount",
            "description": "Total for this line (quantity x unitPrice)",
            "type": "object",
            "required": [
              "amount",
              "currency"
            ],
            "properties": {
              "amount": {
                "type": "number",
                "description": "The monetary value. Use the currency's standard decimal precision (e.g., 2 decimals for EUR/USD)"
              },
              "currency": {
                "title": "Currency Code",
                "description": "ISO 4217 currency code",
                "type": "string",
                "enum": [
                  "AED",
                  "AFN",
                  "ALL",
                  "AMD",
                  "ANG",
                  "AOA",
                  "ARS",
                  "AUD",
                  "AWG",
                  "AZN",
                  "BAM",
                  "BBD",
                  "BDT",
                  "BGN",
                  "BHD",
                  "BIF",
                  "BMD",
                  "BND",
                  "BOB",
                  "BOV",
                  "BRL",
                  "BSD",
                  "BTN",
                  "BWP",
                  "BYR",
                  "BZD",
                  "CAD",
                  "CDF",
                  "CHE",
                  "CHF",
                  "CHW",
                  "CLF",
                  "CLP",
                  "CNY",
                  "COP",
                  "COU",
                  "CRC",
                  "CUC",
                  "CUP",
                  "CVE",
                  "CZK",
                  "DJF",
                  "DKK",
                  "DOP",
                  "DZD",
                  "EGP",
                  "ERN",
                  "ETB",
                  "EUR",
                  "FJD",
                  "FKP",
                  "GBP",
                  "GEL",
                  "GHS",
                  "GIP",
                  "GMD",
                  "GNF",
                  "GTQ",
                  "GYD",
                  "HKD",
                  "HNL",
                  "HRK",
                  "HTG",
                  "HUF",
                  "IDR",
                  "ILS",
                  "INR",
                  "IQD",
                  "IRR",
                  "ISK",
                  "JMD",
                  "JOD",
                  "JPY",
                  "KES",
                  "KGS",
                  "KHR",
                  "KMF",
                  "KPW",
                  "KRW",
                  "KWD",
                  "KYD",
                  "KZT",
                  "LAK",
                  "LBP",
                  "LKR",
                  "LRD",
                  "LSL",
                  "LYD",
                  "MAD",
                  "MDL",
                  "MGA",
                  "MKD",
                  "MMK",
                  "MNT",
                  "MOP",
                  "MRO",
                  "MUR",
                  "MVR",
                  "MWK",
                  "MXN",
                  "MXV",
                  "MYR",
                  "MZN",
                  "NAD",
                  "NGN",
                  "NIO",
                  "NOK",
                  "NPR",
                  "NZD",
                  "OMR",
                  "PAB",
                  "PEN",
                  "PGK",
                  "PHP",
                  "PKR",
                  "PLN",
                  "PYG",
                  "QAR",
                  "RON",
                  "RSD",
                  "RUB",
                  "RWF",
                  "SAR",
                  "SBD",
                  "SCR",
                  "SDG",
                  "SEK",
                  "SGD",
                  "SHP",
                  "SLL",
                  "SOS",
                  "SRD",
                  "SSP",
                  "STD",
                  "SVC",
                  "SYP",
                  "SZL",
                  "THB",
                  "TJS",
                  "TMT",
                  "TND",
                  "TOP",
                  "TRY",
                  "TTD",
                  "TWD",
                  "TZS",
                  "UAH",
                  "UGX",
                  "USD",
                  "USN",
                  "UYI",
                  "UYU",
                  "UZS",
                  "VEF",
                  "VND",
                  "VUV",
                  "WST",
                  "XAF",
                  "XCD",
                  "XDR",
                  "XOF",
                  "XPF",
                  "XSU",
                  "XUA",
                  "YER",
                  "ZAR",
                  "ZMW",
                  "ZWL"
                ],
                "examples": [
                  "EUR",
                  "USD"
                ]
              }
            }
          }
        }
      }
    },
    "billingAddress": {
      "title": "Address",
      "description": "Billing address",
      "type": "object",
      "required": [
        "country"
      ],
      "properties": {
        "streetAddress": {
          "type": "string",
          "description": "Street name, number, and any additional line (apt, suite, etc.)"
        },
        "city": {
          "type": "string",
          "description": "City or locality name"
        },
        "stateOrProvince": {
          "type": "string",
          "description": "State, province, region, or equivalent administrative division"
        },
        "postalCode": {
          "type": "string",
          "description": "Postal or ZIP code"
        },
        "country": {
          "title": "Country Code Alpha-2",
          "description": "ISO 3166-1 alpha-2 country code",
          "type": "string",
          "enum": [
            "AD",
            "AE",
            "AF",
            "AG",
            "AI",
            "AL",
            "AM",
            "AO",
            "AQ",
            "AR",
            "AS",
            "AT",
            "AU",
            "AW",
            "AX",
            "AZ",
            "BA",
            "BB",
            "BD",
            "BE",
            "BF",
            "BG",
            "BH",
            "BI",
            "BJ",
            "BL",
            "BM",
            "BN",
            "BO",
            "BQ",
            "BR",
            "BS",
            "BT",
            "BV",
            "BW",
            "BY",
            "BZ",
            "CA",
            "CC",
            "CD",
            "CF",
            "CG",
            "CH",
            "CI",
            "CK",
            "CL",
            "CM",
            "CN",
            "CO",
            "CR",
            "CU",
            "CV",
            "CW",
            "CX",
            "CY",
            "CZ",
            "DE",
            "DJ",
            "DK",
            "DM",
            "DO",
            "DZ",
            "EC",
            "EE",
            "EG",
            "EH",
            "ER",
            "ES",
            "ET",
            "FI",
            "FJ",
            "FK",
            "FM",
            "FO",
            "FR",
            "GA",
            "GB",
            "GD",
            "GE",
            "GF",
            "GG",
            "GH",
            "GI",
            "GL",
            "GM",
            "GN",
            "GP",
            "GQ",
            "GR",
            "GS",
            "GT",
            "GU",
            "GW",
            "GY",
            "HK",
            "HM",
            "HN",
            "HR",
            "HT",
            "HU",
            "ID",
            "IE",
            "IL",
            "IM",
            "IN",
            "IO",
            "IQ",
            "IR",
            "IS",
            "IT",
            "JE",
            "JM",
            "JO",
            "JP",
            "KE",
            "KG",
            "KH",
            "KI",
            "KM",
            "KN",
            "KP",
            "KR",
            "KW",
            "KY",
            "KZ",
            "LA",
            "LB",
            "LC",
            "LI",
            "LK",
            "LR",
            "LS",
            "LT",
            "LU",
            "LV",
            "LY",
            "MA",
            "MC",
            "MD",
            "ME",
            "MF",
            "MG",
            "MH",
            "MK",
            "ML",
            "MM",
            "MN",
            "MO",
            "MP",
            "MQ",
            "MR",
            "MS",
            "MT",
            "MU",
            "MV",
            "MW",
            "MX",
            "MY",
            "MZ",
            "NA",
            "NC",
            "NE",
            "NF",
            "NG",
            "NI",
            "NL",
            "NO",
            "NP",
            "NR",
            "NU",
            "NZ",
            "OM",
            "PA",
            "PE",
            "PF",
            "PG",
            "PH",
            "PK",
            "PL",
            "PM",
            "PN",
            "PR",
            "PS",
            "PT",
            "PW",
            "PY",
            "QA",
            "RE",
            "RO",
            "RS",
            "RU",
            "RW",
            "SA",
            "SB",
            "SC",
            "SD",
            "SE",
            "SG",
            "SH",
            "SI",
            "SJ",
            "SK",
            "SL",
            "SM",
            "SN",
            "SO",
            "SR",
            "SS",
            "ST",
            "SV",
            "SX",
            "SY",
            "SZ",
            "TC",
            "TD",
            "TF",
            "TG",
            "TH",
            "TJ",
            "TK",
            "TL",
            "TM",
            "TN",
            "TO",
            "TR",
            "TT",
            "TV",
            "TW",
            "TZ",
            "UA",
            "UG",
            "UM",
            "US",
            "UY",
            "UZ",
            "VA",
            "VC",
            "VE",
            "VG",
            "VI",
            "VN",
            "VU",
            "WF",
            "WS",
            "YE",
            "YT",
            "ZA",
            "ZM",
            "ZW"
          ],
          "examples": [
            "FR",
            "US"
          ]
        }
      }
    },
    "paymentTerms": {
      "type": "string",
      "description": "Payment terms (e.g., Net 30, Net 60)"
    },
    "purchaseOrderReference": {
      "type": [
        "string",
        "null"
      ],
      "description": "Reference to the associated purchase order, if applicable"
    }
  }
}
