Source code for hmrc.api.vat
"""VAT API"""
from dataclasses import dataclass
from datetime import date, datetime
from decimal import Decimal
from enum import Enum
from typing import List
from .data import HmrcFieldMap, HmrcDataClass, hmrcdataclass
from .client import HmrcClient, HmrcEndpoint
__all__ = [
'VatObligationStatus',
'VatPaymentIndicator',
'VatVrnParams',
'VatVrnPeriodParams',
'VatObligationsParams',
'VatObligation',
'VatObligations',
'VatReturn',
'VatSubmission',
'VatConfirmation',
'VatReadOnlyClient',
'VatClient',
]
class VatFieldMap(HmrcFieldMap):
"""VAT field mapping customisation"""
def default_hmrc_name(self):
"""Construct default HMRC API field name from Python field name
The VAT API fields ending with "ExVAT" do not follow the usual
camelCase convention for HMRC API field names.
"""
return super().default_hmrc_name().replace('ExVat', 'ExVAT')
class VatDataClass(HmrcDataClass):
"""VAT data class"""
FieldMap = VatFieldMap
[docs]class VatObligationStatus(Enum):
"""Obligation status"""
OPEN = 'O'
FULFILLED = 'F'
[docs]class VatPaymentIndicator(Enum):
"""Payment method"""
DIRECT_DEBIT = 'DD'
DIRECT_CREDIT = 'BANK'
[docs]@hmrcdataclass
class VatVrnParams(VatDataClass):
"""Parameter list: VAT registration number only"""
vrn: str
[docs]@hmrcdataclass
class VatVrnPeriodParams(VatVrnParams):
"""Parameter list: VAT registration number and period key"""
period_key: str
[docs]@hmrcdataclass
class VatObligationsParams(VatDataClass):
"""Parameter list: VAT obligations search criteria"""
from_: date = None
to: date = None
status: VatObligationStatus = None
[docs]@hmrcdataclass
class VatObligation(VatDataClass):
"""VAT obligation"""
start: date
end: date
due: date
status: VatObligationStatus
period_key: str
received: date = None
[docs]@hmrcdataclass
class VatObligations(VatDataClass):
"""List of VAT obligations"""
obligations: List[VatObligation]
[docs]@hmrcdataclass
class VatReturn(VatDataClass):
"""VAT return"""
period_key: str
vat_due_sales: Decimal
vat_due_acquisitions: Decimal
total_vat_due: Decimal
vat_reclaimed_curr_period: Decimal
net_vat_due: Decimal
total_value_sales_ex_vat: int
total_value_purchases_ex_vat: int
total_value_goods_supplied_ex_vat: int
total_acquisitions_ex_vat: int
[docs]@hmrcdataclass
class VatSubmission(VatReturn):
"""VAT return submission"""
finalised: bool
[docs]@hmrcdataclass
class VatConfirmation(VatDataClass):
"""VAT return submission confirmation"""
processing_date: datetime
payment_indicator: VatPaymentIndicator = None
form_bundle_number: str = None
charge_ref_number: str = None
[docs]@dataclass
class VatReadOnlyClient(HmrcClient):
"""VAT API client with read-only access"""
vrn: str = None
scope = ['read:vat']
obligations = HmrcEndpoint(
'/organisations/vat/{vrn}/obligations',
path=VatVrnParams, query=VatObligationsParams, response=VatObligations,
)
retrieve = HmrcEndpoint(
'/organisations/vat/{vrn}/returns/{periodKey}',
path=VatVrnPeriodParams, response=VatReturn,
)
[docs]@dataclass
class VatClient(VatReadOnlyClient):
"""VAT API client"""
scope = ['read:vat', 'write:vat']
submit = HmrcEndpoint(
'/organisations/vat/{vrn}/returns',
path=VatVrnParams, request=VatSubmission, response=VatConfirmation,
)