brewman/brewman/brewman/schemas/closing_stock.py

99 lines
3.2 KiB
Python

import uuid
from datetime import date, datetime
from decimal import Decimal
from pydantic import (
BaseModel,
ConfigDict,
FieldSerializationInfo,
field_serializer,
field_validator,
)
from . import to_camel
from .cost_centre import CostCentreLink
from .product import ProductLink
from .user_link import UserLink
class ClosingStockItem(BaseModel):
id_: uuid.UUID | None = None
product: ProductLink
group: str
quantity: Decimal
amount: Decimal
physical: Decimal
cost_centre: CostCentreLink | None = None
model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True)
@field_validator("quantity", mode="before")
@classmethod
def parse_quantity(cls, value: Decimal | float) -> Decimal:
if isinstance(value, float):
return Decimal(round(value, 2))
return round(value, 2)
@field_validator("amount", mode="before")
@classmethod
def parse_amount(cls, value: Decimal | float) -> Decimal:
if isinstance(value, float):
return Decimal(round(value, 2))
return round(value, 2)
@field_validator("physical", mode="before")
@classmethod
def parse_physical(cls, value: Decimal | float) -> Decimal:
if isinstance(value, float):
return Decimal(round(value, 2))
return round(value, 2)
class ClosingStock(BaseModel):
date_: date
cost_centre: CostCentreLink
items: list[ClosingStockItem]
creation_date: datetime | None = None
last_edit_date: datetime | None = None
user: UserLink | None = None
posted: bool
poster: UserLink | None = None
model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True)
@field_validator("date_", mode="before")
@classmethod
def parse_date(cls, value: date | str) -> date:
if isinstance(value, date):
return value
return datetime.strptime(value, "%d-%b-%Y").date()
@field_serializer("date_")
def serialize_date(self, value: date, info: FieldSerializationInfo) -> str:
return value.strftime("%d-%b-%Y")
@field_validator("creation_date", mode="before")
@classmethod
def parse_creation_date(cls, value: None | datetime | str) -> datetime | None:
if value is None:
return None
if isinstance(value, datetime):
return value
return datetime.strptime(value, "%d-%b-%Y %H:%M")
@field_serializer("creation_date")
def serialize_creation_date(self, value: datetime | None, info: FieldSerializationInfo) -> str | None:
return None if value is None else value.strftime("%d-%b-%Y %H:%M")
@field_validator("last_edit_date", mode="before")
@classmethod
def parse_last_edit_date(cls, value: None | datetime | str) -> datetime | None:
if value is None:
return None
if isinstance(value, datetime):
return value
return datetime.strptime(value, "%d-%b-%Y %H:%M")
@field_serializer("last_edit_date")
def serialize_last_edit_date(self, value: datetime | None, info: FieldSerializationInfo) -> str | None:
return None if value is None else value.strftime("%d-%b-%Y %H:%M")