ankur-bohra's picture
Add basic structure
d2ac459
raw
history blame
2.73 kB
# generated by datamodel-codegen:
# filename: schema.json
# timestamp: 2023-07-28T11:36:16+00:00
from __future__ import annotations
from datetime import date
from typing import Dict, Optional, Union
import iso4217
from pydantic import BaseModel, Field, constr, validator, ValidationError
class TaxItem(BaseModel):
gst: float = Field(
...,
title="The total GST tax amount (IGST + CGST + SGST + etc) as a single number",
)
class TaxItem1(BaseModel):
vat: float = Field(..., title="The total VAT present in the invoice")
class TaxNumberItem(BaseModel):
gst_number: constr(min_length=15) = Field(
..., title="The alphanumeric GSTIN/GST number code"
)
class TaxNumberItem1(BaseModel):
vat_number: str = Field(..., title="The VAT/TIN number present in older invoices")
class TaxNumberItem2(BaseModel):
ui_number: str = Field(..., title="The tax UIN issued to foreign entities")
class SellerDetails(BaseModel):
name: Optional[str] = None
address: Optional[str] = None
contact: Optional[str] = None
tax_number: Union[TaxNumberItem, TaxNumberItem1, TaxNumberItem2] = Field(
..., title="Tax information"
)
pan_number: constr(min_length=10, max_length=10) = Field(
..., title="The 10-character alphanumeric PAN code"
)
class UIDDict(BaseModel):
invoice_number: str = Field(..., title="The invoice number")
other_uids: Dict[str, str] = Field(
...,
title="Key-value pairs of uniquely identifying numbers (UIDs) like order number, bill number, payment ID, etc but not the invoice number",
)
class InformationExtractedFromABillReceipt(BaseModel):
uids: UIDDict = Field(..., title="Invoice number and other UIDs")
total: float = Field(..., title="Total amount or price")
tax: Union[TaxItem, TaxItem1] = Field(..., title="The total tax amount")
name: str = Field(
...,
title="Name of the person/entity that the invoice item was charged or delivered to",
)
currency: str = Field(
default="INR",
title="The ISO 4217 code for the currency in which the prices in the invoice are (inferred from symbols, names, addresses, etc)",
)
issue_date: date = Field(
..., title="The date the invoice was issued"
)
seller_details: SellerDetails = Field(..., title="Information about the seller")
summary: str = Field(..., title="5-6 words short summary of purchased good(s)")
@validator("currency")
@classmethod
def check_currency(cls, v: str) -> str:
if not iso4217.Currency.__members__.get(v.lower()):
raise ValidationError(f"{v} is not a valid ISO 4217 currency code")
return v.upper()