diff --git a/barker/barker/core/session.py b/barker/barker/core/session.py index 15315a2..13c58f5 100644 --- a/barker/barker/core/session.py +++ b/barker/barker/core/session.py @@ -4,31 +4,31 @@ from typing import Any def get_date(session: dict[str, Any]) -> str: if "date" not in session: - session["date"] = date.today().strftime("%d-%b-%Y") + session["date"] = date.today().isoformat() return session["date"] # type: ignore[no-any-return] def set_date(date_: str | date, session: dict[str, Any]) -> None: - session["date"] = date_ if isinstance(date_, str) else date_.strftime("%d-%b-%Y") + session["date"] = date_ if isinstance(date_, str) else date_.isoformat() def get_start_date(session: dict[str, Any]) -> str: if "start" not in session: - session["start"] = get_first_day(date.today()).strftime("%d-%b-%Y") + session["start"] = get_first_day(date.today()).isoformat() return session["start"] # type: ignore[no-any-return] def get_finish_date(session: dict[str, Any]) -> str: if "finish" not in session: - session["finish"] = get_last_day(date.today()).strftime("%d-%b-%Y") + session["finish"] = get_last_day(date.today()).isoformat() return session["finish"] # type: ignore[no-any-return] def set_period(start: str | date | None, finish: str | date | None, session: dict[str, Any]) -> None: if start is not None: - session["start"] = start if isinstance(start, str) else start.strftime("%d-%b-%Y") + session["start"] = start if isinstance(start, str) else start.isoformat() if finish is not None: - session["finish"] = finish if isinstance(finish, str) else finish.strftime("%d-%b-%Y") + session["finish"] = finish if isinstance(finish, str) else finish.isoformat() def get_first_day(dt: date, d_years: int = 0, d_months: int = 0) -> date: diff --git a/barker/barker/routers/__init__.py b/barker/barker/routers/__init__.py index 5f64f11..10a3613 100644 --- a/barker/barker/routers/__init__.py +++ b/barker/barker/routers/__init__.py @@ -12,11 +12,11 @@ from ..models.stock_keeping_unit import StockKeepingUnit def query_date(d: str | None = None) -> date: - return date.today() if d is None else datetime.strptime(d, "%d-%b-%Y").date() + return date.today() if d is None else date.fromisoformat(d) def optional_query_date(d: str | None = None) -> date | None: - return None if d is None else datetime.strptime(d, "%d-%b-%Y").date() + return None if d is None else date.fromisoformat(d) def effective_date(d: str | None = None) -> date: @@ -26,7 +26,7 @@ def effective_date(d: str | None = None) -> date: + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES - settings.NEW_DAY_OFFSET_MINUTES) ).date() if d is None - else datetime.strptime(d, "%d-%b-%Y").date() + else date.fromisoformat(d) ) diff --git a/barker/barker/routers/guest_book.py b/barker/barker/routers/guest_book.py index 71365ac..79f7f0e 100644 --- a/barker/barker/routers/guest_book.py +++ b/barker/barker/routers/guest_book.py @@ -44,9 +44,8 @@ def save( else: customer.name = data.name or customer.name customer.address = data.address or customer.address - td = timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES) - booking_date = None if data.booking_date is None else data.booking_date - td - arrival_date = None if data.arrival_date is None else data.arrival_date - td + booking_date = data.booking_date.astimezone(UTC).replace(tzinfo=None) if data.booking_date else None + arrival_date = data.arrival_date.astimezone(UTC).replace(tzinfo=None) if data.arrival_date else None item = GuestBook( pax=data.pax, customer=customer, @@ -72,11 +71,8 @@ def update_route( item.customer.phone = data.phone item.customer.address = data.address item.pax = data.pax - td = timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES) - booking_date = None if data.booking_date is None else data.booking_date - td - arrival_date = None if data.arrival_date is None else data.arrival_date - td - item.booking_date = booking_date - item.arrival_date = arrival_date + item.booking_date = data.booking_date.astimezone(UTC).replace(tzinfo=None) if data.booking_date else None + item.arrival_date = data.arrival_date.astimezone(UTC).replace(tzinfo=None) if data.arrival_date else None item.last_edit_date = datetime.now() item.notes = data.notes item.type_ = data.type_ @@ -105,11 +101,12 @@ def show_blank( def show_list( user: Annotated[UserToken, Security(get_user)], db: SessionDep, - q: str | None = None, + q: date | None = None, ) -> schemas.GuestBookList: - d = date.today() if q is None or q == "" else datetime.strptime(q, "%d-%b-%Y") - s = d + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES - settings.TIMEZONE_OFFSET_MINUTES) - f = d + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES - settings.TIMEZONE_OFFSET_MINUTES, days=1) + d = date.today() if q is None else q + dt = datetime.combine(d, datetime.min.time()) + s = dt + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES - settings.TIMEZONE_OFFSET_MINUTES) + f = dt + timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES - settings.TIMEZONE_OFFSET_MINUTES, days=1) list_ = ( select(GuestBook) .where( @@ -170,25 +167,22 @@ def show_id( def guest_book_info(item: GuestBook) -> schemas.GuestBook: - td = timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES) - booking_date = None if item.booking_date is None else item.booking_date + td - arrival_date = None if item.arrival_date is None else item.arrival_date + td return schemas.GuestBook( id_=item.id, name=item.customer.name, phone=item.customer.phone, pax=item.pax, address=item.customer.address, - booking_date=booking_date, - arrival_date=arrival_date, - last_edit_date=item.last_edit_date + td, + booking_date=item.booking_date, + arrival_date=item.arrival_date, + last_edit_date=item.last_edit_date, notes=item.notes, type_=GuestBookType(item.type_.name), ) def blank_guest_book_info(type_: GuestBookType) -> schemas.GuestBookIn: - now = datetime.now(UTC).replace(tzinfo=None) + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES) + now = datetime.now() booking_date = None if type_ != GuestBookType.booking else now arrival_date = None if type_ != GuestBookType.walk_in else now return schemas.GuestBookIn( diff --git a/barker/barker/routers/reports/__init__.py b/barker/barker/routers/reports/__init__.py index 9093c8c..1caa487 100644 --- a/barker/barker/routers/reports/__init__.py +++ b/barker/barker/routers/reports/__init__.py @@ -9,7 +9,7 @@ def report_start_date(s: str | None = None) -> date: return ( (datetime.now(UTC).replace(tzinfo=None) + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).date() if s is None - else datetime.strptime(s, "%d-%b-%Y").date() + else datetime.fromisoformat(s).date() ) @@ -17,7 +17,7 @@ def report_finish_date(f: str | None = None) -> date: return ( (datetime.now(UTC).replace(tzinfo=None) + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).date() if f is None - else datetime.strptime(f, "%d-%b-%Y").date() + else datetime.fromisoformat(f).date() ) diff --git a/barker/barker/routers/table.py b/barker/barker/routers/table.py index 99f9094..be6ba82 100644 --- a/barker/barker/routers/table.py +++ b/barker/barker/routers/table.py @@ -1,12 +1,10 @@ import uuid -from datetime import timedelta from typing import Annotated from fastapi import APIRouter, Security from sqlalchemy import select, update -from ..core.config import settings from ..core.security import get_current_active_user as get_user from ..db.session import SessionDep from ..models.food_table import FoodTable @@ -119,7 +117,7 @@ def show_running(user: Annotated[UserToken, Security(get_user)], db: SessionDep) ft.status = item.status.status ft.voucher_id = item.status.voucher_id ft.pax = item.status.voucher.pax - ft.date_ = item.status.voucher.date + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES) + ft.date_ = item.status.voucher.date ft.amount = int(round(item.status.voucher.amount, 0)) if item.status.guest is not None: ft.guest = item.status.guest.customer.name diff --git a/barker/barker/schemas/beer_consumption_report.py b/barker/barker/schemas/beer_consumption_report.py index 78eb0db..dc187bf 100644 --- a/barker/barker/schemas/beer_consumption_report.py +++ b/barker/barker/schemas/beer_consumption_report.py @@ -1,4 +1,4 @@ -from datetime import date, datetime +from datetime import date from decimal import Decimal from typing import Annotated @@ -6,9 +6,6 @@ from pydantic import ( BaseModel, ConfigDict, Field, - SerializationInfo, - field_serializer, - field_validator, model_serializer, ) @@ -19,17 +16,6 @@ from .sale_category import SaleCategoryLink class BeerConsumptionReportItem(BaseModel): date_: date - @field_validator("date_", mode="before") - @classmethod - def parse_date(cls, value: str | date) -> 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: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") - # dynamic fields (e.g., regular, nc, kot) dynamic_amounts: Annotated[dict[str, Daf], Field(default_factory=dict)] @@ -65,25 +51,3 @@ class BeerConsumptionReport(BaseModel): headers: list[str] data: list[BeerConsumptionReportItem] model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True) - - @field_validator("start_date", mode="before") - @classmethod - def parse_start_date(cls, value: str | date) -> date: - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("start_date") - def serialize_start_date(self, value: date, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") - - @field_validator("finish_date", mode="before") - @classmethod - def parse_finish_date(cls, value: str | date) -> date: - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("finish_date") - def serialize_finish_date(self, value: date, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") diff --git a/barker/barker/schemas/bill_settlement_report.py b/barker/barker/schemas/bill_settlement_report.py index 4536e77..c0c9d1a 100644 --- a/barker/barker/schemas/bill_settlement_report.py +++ b/barker/barker/schemas/bill_settlement_report.py @@ -1,6 +1,6 @@ from datetime import date, datetime -from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer, field_validator +from pydantic import BaseModel, ConfigDict from . import Daf, to_camel @@ -12,42 +12,9 @@ class BillSettlementItem(BaseModel): amount: Daf 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: str | datetime) -> datetime: - if isinstance(value, datetime): - return value - return datetime.strptime(value, "%d-%b-%Y %H:%M") - - @field_serializer("date_") - def serialize_date(self, value: datetime, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y %H:%M") - class BillSettlement(BaseModel): start_date: date finish_date: date amounts: list[BillSettlementItem] model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True) - - @field_validator("start_date", mode="before") - @classmethod - def parse_start_date(cls, value: str | date) -> date: - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("start_date") - def serialize_start_date(self, value: date, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") - - @field_validator("finish_date", mode="before") - @classmethod - def parse_finish_date(cls, value: str | date) -> date: - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("finish_date") - def serialize_finish_date(self, value: date, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") diff --git a/barker/barker/schemas/cashier_report.py b/barker/barker/schemas/cashier_report.py index 97e1345..924744f 100644 --- a/barker/barker/schemas/cashier_report.py +++ b/barker/barker/schemas/cashier_report.py @@ -1,6 +1,6 @@ from datetime import date, datetime -from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer, field_validator +from pydantic import BaseModel, ConfigDict from . import Daf, to_camel from .user import UserLink @@ -33,13 +33,6 @@ class InfoItem(BaseModel): amount: Daf 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: str | datetime) -> datetime: - if isinstance(value, datetime): - return value - return datetime.strptime(value, "%d-%b-%Y %H:%M") - class CashierReport(BaseModel): start_date: date @@ -50,25 +43,3 @@ class CashierReport(BaseModel): amounts: list[NameAmount] info: dict[str, list[InfoItem]] model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True) - - @field_validator("start_date", mode="before") - @classmethod - def parse_start_date(cls, value: str | date) -> date: - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("start_date") - def serialize_start_date(self, value: date, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") - - @field_validator("finish_date", mode="before") - @classmethod - def parse_finish_date(cls, value: str | date) -> date: - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("finish_date") - def serialize_finish_date(self, value: date, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") diff --git a/barker/barker/schemas/device.py b/barker/barker/schemas/device.py index ada3acc..96315b6 100644 --- a/barker/barker/schemas/device.py +++ b/barker/barker/schemas/device.py @@ -3,7 +3,7 @@ import uuid from datetime import datetime from typing import Annotated -from pydantic import BaseModel, ConfigDict, Field, SerializationInfo, field_serializer +from pydantic import BaseModel, ConfigDict, Field from . import to_camel from .section import SectionLink @@ -23,14 +23,6 @@ class Device(DeviceIn): last_date: datetime | None = None model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True) - @field_serializer("creation_date") - def serialize_creation_date(self, value: datetime, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y %H:%M") - - @field_serializer("last_date") - def serialize_last_date(self, value: datetime | None, _info: SerializationInfo) -> str | None: - return None if value is None else value.strftime("%d-%b-%Y %H:%M") - class DeviceLink(BaseModel): id_: uuid.UUID diff --git a/barker/barker/schemas/discount_report.py b/barker/barker/schemas/discount_report.py index d74eecf..1e580ca 100644 --- a/barker/barker/schemas/discount_report.py +++ b/barker/barker/schemas/discount_report.py @@ -1,6 +1,6 @@ -from datetime import date, datetime +from datetime import date -from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer, field_validator +from pydantic import BaseModel, ConfigDict from . import Daf, to_camel @@ -16,25 +16,3 @@ class DiscountReport(BaseModel): finish_date: date amounts: list[DiscountReportItem] model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True) - - @field_validator("start_date", mode="before") - @classmethod - def parse_start_date(cls, value: date | str) -> date: - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("start_date") - def serialize_start_date(self, value: date, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") - - @field_validator("finish_date", mode="before") - @classmethod - def parse_finish_date(cls, value: date | str) -> date: - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("finish_date") - def serialize_finish_date(self, value: date, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") diff --git a/barker/barker/schemas/guest_book.py b/barker/barker/schemas/guest_book.py index 32cf54b..37479f8 100644 --- a/barker/barker/schemas/guest_book.py +++ b/barker/barker/schemas/guest_book.py @@ -9,7 +9,6 @@ from pydantic import ( Field, SerializationInfo, field_serializer, - field_validator, model_validator, ) @@ -29,32 +28,6 @@ class GuestBookIn(BaseModel): model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True) - @field_validator("booking_date", mode="before") - @classmethod - def parse_booking_date(cls, value: str | datetime | None) -> 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("booking_date") - def serialize_booking_date(self, value: datetime | None, _info: SerializationInfo) -> str | None: - return None if value is None else value.strftime("%d-%b-%Y %H:%M") - - @field_validator("arrival_date", mode="before") - @classmethod - def parse_arrival_date(cls, value: str | datetime | None) -> 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("arrival_date") - def serialize_arrival_date(self, value: datetime | None, _info: SerializationInfo) -> str | None: - return None if value is None else value.strftime("%d-%b-%Y %H:%M") - @model_validator(mode="after") def nulls(self) -> GuestBookIn: if self.arrival_date is None and self.booking_date is None: @@ -68,17 +41,6 @@ class GuestBook(GuestBookIn): model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True) - @field_validator("last_edit_date", mode="before") - @classmethod - def parse_last_edit_date(cls, value: str | datetime) -> datetime: - 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, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y %H:%M") - class GuestBookListItem(BaseModel): id_: uuid.UUID @@ -98,39 +60,6 @@ class GuestBookListItem(BaseModel): model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True) - @field_validator("booking_date", mode="before") - @classmethod - def parse_booking_date(cls, value: str | datetime | None) -> 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("booking_date") - def serialize_booking_date(self, value: datetime | None, _info: SerializationInfo) -> str | None: - return None if value is None else value.strftime("%d-%b-%Y %H:%M") - - @field_validator("arrival_date", mode="before") - @classmethod - def parse_arrival_date(cls, value: str | datetime | None) -> 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("arrival_date") - def serialize_arrival_date(self, value: datetime | None, _info: SerializationInfo) -> 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: str | datetime) -> datetime: - 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, _info: SerializationInfo) -> str: return value.strftime("%d-%b-%Y %H:%M") @@ -140,14 +69,3 @@ class GuestBookList(BaseModel): date_: date list: list[GuestBookListItem] 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: str | date) -> 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: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") diff --git a/barker/barker/schemas/menu_engineering_report.py b/barker/barker/schemas/menu_engineering_report.py index 16de451..bcaf1e4 100644 --- a/barker/barker/schemas/menu_engineering_report.py +++ b/barker/barker/schemas/menu_engineering_report.py @@ -1,8 +1,8 @@ import uuid -from datetime import date, datetime +from datetime import date -from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer, field_validator +from pydantic import BaseModel, ConfigDict from . import Daf, to_camel @@ -27,25 +27,3 @@ class MeReport(BaseModel): finish_date: date amounts: list[MeItem] model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True) - - @field_validator("start_date", mode="before") - @classmethod - def parse_start_date(cls, value: str | date) -> date: - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("start_date") - def serialize_start_date(self, value: date, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") - - @field_validator("finish_date", mode="before") - @classmethod - def parse_finish_date(cls, value: str | date) -> date: - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("finish_date") - def serialize_finish_date(self, value: date, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") diff --git a/barker/barker/schemas/product.py b/barker/barker/schemas/product.py index 60dffec..b173c5a 100644 --- a/barker/barker/schemas/product.py +++ b/barker/barker/schemas/product.py @@ -1,9 +1,9 @@ import uuid -from datetime import date, datetime +from datetime import date from typing import Annotated -from pydantic import BaseModel, ConfigDict, Field, SerializationInfo, field_serializer, field_validator +from pydantic import BaseModel, ConfigDict, Field from . import to_camel from .sale_category import SaleCategoryLink @@ -27,32 +27,6 @@ class Product(ProductIn): valid_till: date | None = None model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True) - @field_validator("valid_from", mode="before") - @classmethod - def parse_valid_from(cls, value: str | date | None) -> date | None: - if value is None: - return None - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("valid_from") - def serialize_valid_from(self, value: date | None, _info: SerializationInfo) -> str | None: - return None if value is None else value.strftime("%d-%b-%Y") - - @field_validator("valid_till", mode="before") - @classmethod - def parse_valid_till(cls, value: str | date | None) -> date | None: - if value is None: - return None - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("valid_till") - def serialize_valid_till(self, value: date | None, _info: SerializationInfo) -> str | None: - return None if value is None else value.strftime("%d-%b-%Y") - class ProductBlank(BaseModel): name: str diff --git a/barker/barker/schemas/product_sale_report.py b/barker/barker/schemas/product_sale_report.py index 1b37888..977271c 100644 --- a/barker/barker/schemas/product_sale_report.py +++ b/barker/barker/schemas/product_sale_report.py @@ -1,6 +1,6 @@ import uuid -from datetime import date, datetime +from datetime import date from decimal import Decimal from typing import Annotated @@ -8,9 +8,6 @@ from pydantic import ( BaseModel, ConfigDict, Field, - SerializationInfo, - field_serializer, - field_validator, model_serializer, ) @@ -56,25 +53,3 @@ class ProductSaleReport(BaseModel): amounts: list[ProductSaleReportItem] user: UserLink model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True) - - @field_validator("start_date", mode="before") - @classmethod - def parse_start_date(cls, value: str | date) -> date: - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("start_date") - def serialize_start_date(self, value: date, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") - - @field_validator("finish_date", mode="before") - @classmethod - def parse_finish_date(cls, value: str | date) -> date: - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("finish_date") - def serialize_finish_date(self, value: date, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") diff --git a/barker/barker/schemas/product_updates_report.py b/barker/barker/schemas/product_updates_report.py index eb04bef..6cd260c 100644 --- a/barker/barker/schemas/product_updates_report.py +++ b/barker/barker/schemas/product_updates_report.py @@ -1,6 +1,6 @@ -from datetime import date, datetime +from datetime import date -from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer, field_validator +from pydantic import BaseModel, ConfigDict from . import to_camel @@ -11,25 +11,3 @@ class ProductUpdatesReport(BaseModel): report: list[str] model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True) - - @field_validator("start_date", mode="before") - @classmethod - def parse_start_date(cls, value: str | date) -> date: - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("start_date") - def serialize_start_date(self, value: date, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") - - @field_validator("finish_date", mode="before") - @classmethod - def parse_finish_date(cls, value: str | date) -> date: - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("finish_date") - def serialize_finish_date(self, value: date, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") diff --git a/barker/barker/schemas/running_table.py b/barker/barker/schemas/running_table.py index 63de265..febee09 100644 --- a/barker/barker/schemas/running_table.py +++ b/barker/barker/schemas/running_table.py @@ -2,7 +2,7 @@ import uuid from datetime import datetime -from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer, field_validator +from pydantic import BaseModel, ConfigDict from . import to_camel from .section import SectionLink @@ -26,18 +26,3 @@ class RunningTable(BaseModel): bold: bool | 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: str | datetime | None) -> 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("date_") - def serialize_date(self, value: datetime | None, _info: SerializationInfo) -> str | None: - if value is None: - return None - return value.strftime("%d-%b-%Y %H:%M") diff --git a/barker/barker/schemas/sale_report.py b/barker/barker/schemas/sale_report.py index d7ac6a0..b53f57d 100644 --- a/barker/barker/schemas/sale_report.py +++ b/barker/barker/schemas/sale_report.py @@ -1,8 +1,8 @@ import uuid -from datetime import date, datetime +from datetime import date -from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer, field_validator +from pydantic import BaseModel, ConfigDict from . import Daf, to_camel from .user import UserLink @@ -21,25 +21,3 @@ class SaleReport(BaseModel): amounts: list[SaleReportItem] user: UserLink model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True) - - @field_validator("start_date", mode="before") - @classmethod - def parse_start_date(cls, value: str | date) -> date: - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("start_date") - def serialize_start_date(self, value: date, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") - - @field_validator("finish_date", mode="before") - @classmethod - def parse_finish_date(cls, value: str | date) -> date: - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("finish_date") - def serialize_finish_date(self, value: date, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") diff --git a/barker/barker/schemas/stock_keeping_unit.py b/barker/barker/schemas/stock_keeping_unit.py index 5a1295a..6884ba5 100644 --- a/barker/barker/schemas/stock_keeping_unit.py +++ b/barker/barker/schemas/stock_keeping_unit.py @@ -1,10 +1,10 @@ import uuid -from datetime import date, datetime +from datetime import date from decimal import Decimal from typing import Annotated -from pydantic import BaseModel, ConfigDict, Field, SerializationInfo, field_serializer, field_validator +from pydantic import BaseModel, ConfigDict, Field from . import Daf, to_camel from .menu_category import MenuCategoryLink @@ -27,29 +27,3 @@ class StockKeepingUnit(BaseModel): valid_from: date | None = None valid_till: date | None = None model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True) - - @field_validator("valid_from", mode="before") - @classmethod - def parse_valid_from(cls, value: str | date | None) -> date | None: - if value is None: - return None - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("valid_from") - def serialize_valid_from(self, value: date | None, _info: SerializationInfo) -> str | None: - return None if value is None else value.strftime("%d-%b-%Y") - - @field_validator("valid_till", mode="before") - @classmethod - def parse_valid_till(cls, value: str | date | None) -> date | None: - if value is None: - return None - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("valid_till") - def serialize_valid_till(self, value: date | None, _info: SerializationInfo) -> str | None: - return None if value is None else value.strftime("%d-%b-%Y") diff --git a/barker/barker/schemas/tax_report.py b/barker/barker/schemas/tax_report.py index 1f0b9ca..7b7a751 100644 --- a/barker/barker/schemas/tax_report.py +++ b/barker/barker/schemas/tax_report.py @@ -1,6 +1,6 @@ -from datetime import date, datetime +from datetime import date -from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer, field_validator +from pydantic import BaseModel, ConfigDict from . import Daf, to_camel @@ -18,25 +18,3 @@ class TaxReport(BaseModel): finish_date: date amounts: list[TaxReportItem] model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True) - - @field_validator("start_date", mode="before") - @classmethod - def parse_start_date(cls, value: str | date) -> date: - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("start_date") - def serialize_start_date(self, value: date, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") - - @field_validator("finish_date", mode="before") - @classmethod - def parse_finish_date(cls, value: str | date) -> date: - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("finish_date") - def serialize_finish_date(self, value: date, _info: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") diff --git a/barker/barker/schemas/temporal_product.py b/barker/barker/schemas/temporal_product.py index 91eefe1..4d288ff 100644 --- a/barker/barker/schemas/temporal_product.py +++ b/barker/barker/schemas/temporal_product.py @@ -1,10 +1,10 @@ import uuid -from datetime import date, datetime +from datetime import date from decimal import Decimal from typing import Annotated -from pydantic import BaseModel, ConfigDict, Field, SerializationInfo, field_serializer, field_validator +from pydantic import BaseModel, ConfigDict, Field from . import Daf, to_camel from .menu_category import MenuCategoryLink @@ -23,32 +23,6 @@ class Product(BaseModel): valid_till: date | None = None model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True) - @field_validator("valid_from", mode="before") - @classmethod - def parse_valid_from(cls, value: str | date | None) -> date | None: - if value is None: - return None - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("valid_from") - def serialize_valid_from(self, value: date | None, _info: SerializationInfo) -> str | None: - return None if value is None else value.strftime("%d-%b-%Y") - - @field_validator("valid_till", mode="before") - @classmethod - def parse_valid_till(cls, value: str | date | None) -> date | None: - if value is None: - return None - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("valid_till") - def serialize_valid_till(self, value: date | None, _info: SerializationInfo) -> str | None: - return None if value is None else value.strftime("%d-%b-%Y") - class StockKeepingUnit(BaseModel): id_: uuid.UUID @@ -68,32 +42,6 @@ class StockKeepingUnit(BaseModel): valid_till: date | None = None model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True) - @field_validator("valid_from", mode="before") - @classmethod - def parse_valid_from(cls, value: str | date | None) -> date | None: - if value is None: - return None - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("valid_from") - def serialize_valid_from(self, value: date | None, _info: SerializationInfo) -> str | None: - return None if value is None else value.strftime("%d-%b-%Y") - - @field_validator("valid_till", mode="before") - @classmethod - def parse_valid_till(cls, value: str | date | None) -> date | None: - if value is None: - return None - if isinstance(value, date): - return value - return datetime.strptime(value, "%d-%b-%Y").date() - - @field_serializer("valid_till") - def serialize_valid_till(self, value: date | None, _info: SerializationInfo) -> str | None: - return None if value is None else value.strftime("%d-%b-%Y") - class TemporalProduct(BaseModel): products: list[Product] diff --git a/barker/barker/schemas/update_product_prices.py b/barker/barker/schemas/update_product_prices.py index f45c901..f0033db 100644 --- a/barker/barker/schemas/update_product_prices.py +++ b/barker/barker/schemas/update_product_prices.py @@ -1,8 +1,8 @@ import uuid -from datetime import date, datetime +from datetime import date -from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer, field_validator +from pydantic import BaseModel, ConfigDict from . import Daf, to_camel @@ -20,14 +20,3 @@ class UpdateProductPrices(BaseModel): menu_category_id: uuid.UUID | None = None items: list[UpdateProductPricesItem] model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True) - - @field_validator("date_", mode="before") - @classmethod - def parse_date(cls, value: str | date) -> 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: SerializationInfo) -> str: - return value.strftime("%d-%b-%Y") diff --git a/barker/barker/schemas/user.py b/barker/barker/schemas/user.py index 8ba3684..f27a9ef 100644 --- a/barker/barker/schemas/user.py +++ b/barker/barker/schemas/user.py @@ -2,7 +2,7 @@ import uuid from datetime import datetime -from pydantic import BaseModel, ConfigDict, SerializationInfo, field_serializer +from pydantic import BaseModel, ConfigDict from . import to_camel from .role import RoleItem @@ -41,7 +41,3 @@ class UserList(BaseModel): last_date: datetime | None = None model_config = ConfigDict(str_strip_whitespace=True, alias_generator=to_camel, populate_by_name=True) - - @field_serializer("last_date") - def serialize_last_date(self, value: datetime | None, _info: SerializationInfo) -> str | None: - return None if value is None else value.strftime("%d-%b-%Y %H:%M") diff --git a/barker/barker/schemas/voucher_out.py b/barker/barker/schemas/voucher_out.py index 556f061..cf86004 100644 --- a/barker/barker/schemas/voucher_out.py +++ b/barker/barker/schemas/voucher_out.py @@ -126,13 +126,10 @@ class VoucherBlank(BaseModel): class VoucherOut(BaseModel): id_: uuid.UUID date_: datetime - date_tip: datetime pax: int user: UserLink creation_date: datetime - creation_date_tip: datetime last_edit_date: datetime - last_edit_date_tip: datetime kot_id: int bill_id: str table: TableLink @@ -147,27 +144,3 @@ class VoucherOut(BaseModel): alias_generator=to_camel, populate_by_name=True, ) - - @field_serializer("date_") - def serialize_date(self, value: datetime, _info: SerializationInfo) -> str: - return (value + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).strftime("%H:%M") - - @field_serializer("date_tip") - def serialize_date_tip(self, value: datetime, _info: SerializationInfo) -> str: - return (value + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).strftime("%d-%b-%Y %H:%M:%S") - - @field_serializer("creation_date") - def serialize_creation_date(self, value: datetime, _info: SerializationInfo) -> str: - return (value + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).strftime("%H:%M") - - @field_serializer("creation_date_tip") - def serialize_creation_date_tip(self, value: datetime, _info: SerializationInfo) -> str: - return (value + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).strftime("%d-%b-%Y %H:%M:%S") - - @field_serializer("last_edit_date") - def serialize_last_edit_date(self, value: datetime, _info: SerializationInfo) -> str: - return (value + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).strftime("%H:%M") - - @field_serializer("last_edit_date_tip") - def serialize_last_edit_date_tip(self, value: datetime, _info: SerializationInfo) -> str: - return (value + timedelta(minutes=settings.TIMEZONE_OFFSET_MINUTES)).strftime("%d-%b-%Y %H:%M:%S") diff --git a/bookie/src/app/app.config.ts b/bookie/src/app/app.config.ts index e7e77b0..2c845ef 100644 --- a/bookie/src/app/app.config.ts +++ b/bookie/src/app/app.config.ts @@ -26,6 +26,7 @@ import { MatTableModule } from '@angular/material/table'; import { MatToolbarModule } from '@angular/material/toolbar'; import { BrowserModule } from '@angular/platform-browser'; import { provideRouter, withComponentInputBinding, withRouterConfig } from '@angular/router'; +import { Settings } from 'luxon'; import { dateFormat } from './app.environment'; import { routes } from './app.routes'; @@ -37,6 +38,8 @@ import { httpErrorInterceptor } from './core/http-error.interceptor'; import { jwtInterceptor } from './core/jwt.interceptor'; import { refreshInterceptor } from './core/refresh.interceptor'; +Settings.defaultLocale = 'en-US'; + export const appConfig: ApplicationConfig = { providers: [ importProvidersFrom( @@ -76,6 +79,7 @@ export const appConfig: ApplicationConfig = { withComponentInputBinding(), ), { provide: ErrorHandler, useClass: GlobalErrorHandler }, + { provide: MAT_DATE_LOCALE, useValue: 'en-US' }, { provide: DateAdapter, useClass: LuxonDateAdapter, deps: [MAT_DATE_LOCALE] }, { provide: MAT_DATE_FORMATS, useValue: dateFormat }, { provide: MAT_SNACK_BAR_DEFAULT_OPTIONS, useValue: { duration: 3000 } }, diff --git a/bookie/src/app/app.environment.ts b/bookie/src/app/app.environment.ts index 4a95feb..062b042 100644 --- a/bookie/src/app/app.environment.ts +++ b/bookie/src/app/app.environment.ts @@ -7,10 +7,12 @@ export const environment = { export const dateFormat = { parse: { dateInput: 'dd-MMM-yyyy', + dateTimeInput: 'dd-MMM-yyyy HH:mm', timeInput: 'hh:mm a', }, display: { dateInput: 'dd-MMM-yyyy', + dateTimeInput: 'dd-MMM-yyyy HH:mm', timeInput: 'hh:mm a', timeOptionLabel: 'hh:mm a', monthYearLabel: 'MMM yyyy', diff --git a/bookie/src/app/beer-sale-report/beer-sale-report.component.ts b/bookie/src/app/beer-sale-report/beer-sale-report.component.ts index d3027ba..4c95abb 100644 --- a/bookie/src/app/beer-sale-report/beer-sale-report.component.ts +++ b/bookie/src/app/beer-sale-report/beer-sale-report.component.ts @@ -81,8 +81,8 @@ export class BeerSaleReportComponent { computation: (info): BeerSaleReportFormData => { if (info) { return { - startDate: DateTime.fromFormat(info.startDate, 'dd-MMM-yyyy'), - finishDate: DateTime.fromFormat(info.finishDate, 'dd-MMM-yyyy'), + startDate: DateTime.fromISO(info.startDate), + finishDate: DateTime.fromISO(info.finishDate), saleCategory: info.saleCategory?.id ?? '', regular: info.regular, happy: info.happy, @@ -131,8 +131,8 @@ export class BeerSaleReportComponent { const formModel = this.formModel(); return new BeerSaleReport({ - startDate: formModel.startDate.toFormat('dd-MMM-yyyy'), - finishDate: formModel.finishDate.toFormat('dd-MMM-yyyy'), + startDate: formModel.startDate.toISODate() ?? '', + finishDate: formModel.finishDate.toISODate() ?? '', saleCategory: this.saleCategories().find((sc) => sc.id === formModel.saleCategory), regular: formModel.regular, happy: formModel.happy, diff --git a/bookie/src/app/bill-settlement-report/bill-settlement-report.component.ts b/bookie/src/app/bill-settlement-report/bill-settlement-report.component.ts index 481b24e..4916208 100644 --- a/bookie/src/app/bill-settlement-report/bill-settlement-report.component.ts +++ b/bookie/src/app/bill-settlement-report/bill-settlement-report.component.ts @@ -56,8 +56,8 @@ export class BillSettlementReportComponent { computation: (infoVal): BillSettlementReportFormData => { if (infoVal) { return { - startDate: DateTime.fromFormat(this.info().startDate, 'dd-MMM-yyyy'), - finishDate: DateTime.fromFormat(this.info().finishDate, 'dd-MMM-yyyy'), + startDate: DateTime.fromISO(this.info().startDate), + finishDate: DateTime.fromISO(this.info().finishDate), }; } return { @@ -86,8 +86,8 @@ export class BillSettlementReportComponent { const formModel = this.formModel(); return new BillSettlementReport({ - startDate: formModel.startDate.toFormat('dd-MMM-yyyy'), - finishDate: formModel.finishDate.toFormat('dd-MMM-yyyy'), + startDate: formModel.startDate.toISODate() ?? '', + finishDate: formModel.finishDate.toISODate() ?? '', }); } diff --git a/bookie/src/app/cashier-report/cashier-report.component.ts b/bookie/src/app/cashier-report/cashier-report.component.ts index b74a718..e85d96f 100644 --- a/bookie/src/app/cashier-report/cashier-report.component.ts +++ b/bookie/src/app/cashier-report/cashier-report.component.ts @@ -67,8 +67,8 @@ export class CashierReportComponent { if (infoVal) { return { cashier: this.info().cashier.id ?? '', - startDate: DateTime.fromFormat(this.info().startDate, 'dd-MMM-yyyy'), - finishDate: DateTime.fromFormat(this.info().finishDate, 'dd-MMM-yyyy'), + startDate: DateTime.fromISO(this.info().startDate), + finishDate: DateTime.fromISO(this.info().finishDate), }; } return { @@ -115,8 +115,8 @@ export class CashierReportComponent { return new CashierReport({ cashier: new User({ id: formModel.cashier ?? undefined }), cashiers: this.info().cashiers, - startDate: formModel.startDate.toFormat('dd-MMM-yyyy'), - finishDate: formModel.finishDate.toFormat('dd-MMM-yyyy'), + startDate: formModel.startDate.toISODate() ?? '', + finishDate: formModel.finishDate.toISODate() ?? '', }); } diff --git a/bookie/src/app/discount-report/discount-report.component.ts b/bookie/src/app/discount-report/discount-report.component.ts index eda0a9a..73d8c3d 100644 --- a/bookie/src/app/discount-report/discount-report.component.ts +++ b/bookie/src/app/discount-report/discount-report.component.ts @@ -56,8 +56,8 @@ export class DiscountReportComponent { computation: (infoVal): DiscountReportFormData => { if (infoVal) { return { - startDate: DateTime.fromFormat(this.info().startDate, 'dd-MMM-yyyy'), - finishDate: DateTime.fromFormat(this.info().finishDate, 'dd-MMM-yyyy'), + startDate: DateTime.fromISO(this.info().startDate), + finishDate: DateTime.fromISO(this.info().finishDate), }; } return { @@ -86,8 +86,8 @@ export class DiscountReportComponent { const formModel = this.formModel(); return new DiscountReport({ - startDate: formModel.startDate.toFormat('dd-MMM-yyyy'), - finishDate: formModel.finishDate.toFormat('dd-MMM-yyyy'), + startDate: formModel.startDate.toISODate() ?? '', + finishDate: formModel.finishDate.toISODate() ?? '', }); } diff --git a/bookie/src/app/guest-book/guest-book-detail/guest-book-detail.component.ts b/bookie/src/app/guest-book/guest-book-detail/guest-book-detail.component.ts index 2eb5318..03d3bfd 100644 --- a/bookie/src/app/guest-book/guest-book-detail/guest-book-detail.component.ts +++ b/bookie/src/app/guest-book/guest-book-detail/guest-book-detail.component.ts @@ -73,8 +73,8 @@ export class GuestBookDetailComponent { pax: itemVal.pax, address: itemVal.address ?? '', notes: itemVal.notes ?? '', - date: dt ? DateTime.fromJSDate(new Date(dt)) : DateTime.now(), - time: dt ? DateTime.fromJSDate(new Date(dt)) : DateTime.now(), + date: dt ? DateTime.fromISO(dt).minus({ minutes: new Date().getTimezoneOffset() }) : DateTime.now(), + time: dt ? DateTime.fromISO(dt).minus({ minutes: new Date().getTimezoneOffset() }) : DateTime.now(), }; } return { @@ -172,16 +172,25 @@ export class GuestBookDetailComponent { item.pax = formModel.pax ?? 0; item.address = formModel.address; item.notes = formModel.notes; - const timeStr = formModel.time ? formModel.time.toFormat('HH:mm') : '00:00'; + const time = formModel.time ?? DateTime.now(); + const dt = formModel.date.set({ hour: time.hour, minute: time.minute, second: 0, millisecond: 0 }); item.type = item.type || this.t() || 'walk_in'; if (item.type === 'booking') { - item.bookingDate = formModel.date.toFormat('dd-MMM-yyyy') + ' ' + timeStr; + item.bookingDate = dt.toISO() ?? ''; } else { - const existingDate = item.arrivalDate - ? (item.arrivalDate as string).substring(0, 12) - : formModel.date.toFormat('dd-MMM-yyyy '); - item.arrivalDate = existingDate + timeStr; + if (item.arrivalDate) { + // preserve existing arrival date but update time + const arrival = DateTime.fromISO(item.arrivalDate as string).set({ + hour: time.hour, + minute: time.minute, + second: 0, + millisecond: 0, + }); + item.arrivalDate = arrival.toISO() ?? ''; + } else { + item.arrivalDate = dt.toISO() ?? ''; + } } return item; diff --git a/bookie/src/app/guest-book/guest-book-list/guest-book-list.component.ts b/bookie/src/app/guest-book/guest-book-list/guest-book-list.component.ts index eae4bd3..cc2612c 100644 --- a/bookie/src/app/guest-book/guest-book-list/guest-book-list.component.ts +++ b/bookie/src/app/guest-book/guest-book-list/guest-book-list.component.ts @@ -45,7 +45,7 @@ export class GuestBookListComponent { date = input(DateTime.now(), { transform: (v: string | null | undefined): DateTime => { if (v) { - const parsed = DateTime.fromFormat(v, 'dd-MMM-yyyy'); + const parsed = DateTime.fromISO(v); if (parsed.isValid) return parsed; } return DateTime.now(); @@ -63,7 +63,7 @@ export class GuestBookListComponent { displayedColumns = ['sno', 'name', 'phone', 'pax', 'date', 'action']; - dateSignal = computed(() => this.formModel().date.toFormat('dd-MMM-yyyy')); + dateSignal = computed(() => this.formModel().date.toISODate() ?? ''); listResource = this.ser.list(this.dateSignal); dataSource = computed(() => this.listResource.value()?.list ?? []); diff --git a/bookie/src/app/menu-engineering-report/menu-engineering-report.component.ts b/bookie/src/app/menu-engineering-report/menu-engineering-report.component.ts index bc08ff1..296a0cf 100644 --- a/bookie/src/app/menu-engineering-report/menu-engineering-report.component.ts +++ b/bookie/src/app/menu-engineering-report/menu-engineering-report.component.ts @@ -64,8 +64,8 @@ export class MenuEngineeringReportComponent { computation: (infoVal): MenuEngineeringReportFormData => { if (infoVal) { return { - startDate: DateTime.fromFormat(this.info().startDate, 'dd-MMM-yyyy'), - finishDate: DateTime.fromFormat(this.info().finishDate, 'dd-MMM-yyyy'), + startDate: DateTime.fromISO(this.info().startDate), + finishDate: DateTime.fromISO(this.info().finishDate), filter: '', }; } @@ -143,8 +143,8 @@ export class MenuEngineeringReportComponent { const formModel = this.formModel(); return new MenuEngineeringReport({ - startDate: formModel.startDate.toFormat('dd-MMM-yyyy'), - finishDate: formModel.finishDate.toFormat('dd-MMM-yyyy'), + startDate: formModel.startDate.toISODate() ?? '', + finishDate: formModel.finishDate.toISODate() ?? '', }); } diff --git a/bookie/src/app/product-sale-report/product-sale-report.component.ts b/bookie/src/app/product-sale-report/product-sale-report.component.ts index 04b3f12..a106036 100644 --- a/bookie/src/app/product-sale-report/product-sale-report.component.ts +++ b/bookie/src/app/product-sale-report/product-sale-report.component.ts @@ -66,8 +66,8 @@ export class ProductSaleReportComponent { computation: (sectionsVal): ProductSaleReportFormData => { if (sectionsVal) { return { - startDate: DateTime.fromFormat(this.info().startDate, 'dd-MMM-yyyy'), - finishDate: DateTime.fromFormat(this.info().finishDate, 'dd-MMM-yyyy'), + startDate: DateTime.fromISO(this.info().startDate), + finishDate: DateTime.fromISO(this.info().finishDate), section: this.info().sectionId || null, }; } @@ -102,8 +102,8 @@ export class ProductSaleReportComponent { const formModel = this.formModel(); const data = new ProductSaleReport({ - startDate: formModel.startDate.toFormat('dd-MMM-yyyy'), - finishDate: formModel.finishDate.toFormat('dd-MMM-yyyy'), + startDate: formModel.startDate.toISODate() ?? '', + finishDate: formModel.finishDate.toISODate() ?? '', }); if (formModel.section) { data.sectionId = formModel.section; diff --git a/bookie/src/app/product-updates-report/product-updates-report.component.ts b/bookie/src/app/product-updates-report/product-updates-report.component.ts index ed30c81..4569438 100644 --- a/bookie/src/app/product-updates-report/product-updates-report.component.ts +++ b/bookie/src/app/product-updates-report/product-updates-report.component.ts @@ -52,8 +52,8 @@ export class ProductUpdatesReportComponent { computation: (infoVal): ProductUpdatesReportFormData => { if (infoVal) { return { - startDate: DateTime.fromFormat(this.info().startDate, 'dd-MMM-yyyy'), - finishDate: DateTime.fromFormat(this.info().finishDate, 'dd-MMM-yyyy'), + startDate: DateTime.fromISO(this.info().startDate), + finishDate: DateTime.fromISO(this.info().finishDate), }; } return { @@ -82,8 +82,8 @@ export class ProductUpdatesReportComponent { const formModel = this.formModel(); return new ProductUpdatesReport({ - startDate: formModel.startDate.toFormat('dd-MMM-yyyy'), - finishDate: formModel.finishDate.toFormat('dd-MMM-yyyy'), + startDate: formModel.startDate.toISODate() ?? '', + finishDate: formModel.finishDate.toISODate() ?? '', }); } diff --git a/bookie/src/app/sale-report/sale-report.component.ts b/bookie/src/app/sale-report/sale-report.component.ts index e3efc13..3d65644 100644 --- a/bookie/src/app/sale-report/sale-report.component.ts +++ b/bookie/src/app/sale-report/sale-report.component.ts @@ -67,8 +67,8 @@ export class SaleReportComponent { computation: (sectionsVal): SaleReportFormData => { if (sectionsVal) { return { - startDate: DateTime.fromFormat(this.info().startDate, 'dd-MMM-yyyy'), - finishDate: DateTime.fromFormat(this.info().finishDate, 'dd-MMM-yyyy'), + startDate: DateTime.fromISO(this.info().startDate), + finishDate: DateTime.fromISO(this.info().finishDate), section: this.info().sectionId || null, }; } @@ -102,8 +102,8 @@ export class SaleReportComponent { getInfo(): SaleReport { const formModel = this.formModel(); const data = new SaleReport({ - startDate: formModel.startDate.toFormat('dd-MMM-yyyy'), - finishDate: formModel.finishDate.toFormat('dd-MMM-yyyy'), + startDate: formModel.startDate.toISODate() ?? '', + finishDate: formModel.finishDate.toISODate() ?? '', }); if (formModel.section) { data.sectionId = formModel.section; diff --git a/bookie/src/app/sales/bills/bill.ts b/bookie/src/app/sales/bills/bill.ts index 641bf6c..c85f555 100644 --- a/bookie/src/app/sales/bills/bill.ts +++ b/bookie/src/app/sales/bills/bill.ts @@ -8,13 +8,10 @@ import { VoucherType } from './voucher-type'; export class Bill { id: string | undefined; date: string; - dateTip: string; pax: number; user: User; creationDate: string; - creationDateTip: string; lastEditDate: string; - lastEditDateTip: string; kotId: string; billId: string; table: Table; @@ -27,13 +24,10 @@ export class Bill { public constructor(init?: Partial) { this.id = undefined; this.date = ''; - this.dateTip = ''; this.pax = 0; this.user = new User(); this.creationDate = ''; - this.creationDateTip = ''; this.lastEditDate = ''; - this.lastEditDateTip = ''; this.billId = ''; this.kotId = ''; this.table = new Table(); diff --git a/bookie/src/app/sales/bills/bills.component.html b/bookie/src/app/sales/bills/bills.component.html index 6b464c4..1ae0561 100644 --- a/bookie/src/app/sales/bills/bills.component.html +++ b/bookie/src/app/sales/bills/bills.component.html @@ -20,10 +20,12 @@ {{ bs.bill().date }} / {{ bs.bill().creationDate }} / {{ - bs.bill().lastEditDate + >{{ bs.bill().date | localTime: 'time' }} / {{ + bs.bill().creationDate | localTime: 'time' + }} / {{ + bs.bill().lastEditDate | localTime: 'time' }} diff --git a/bookie/src/app/sales/bills/bills.component.ts b/bookie/src/app/sales/bills/bills.component.ts index 93178f9..fd01c84 100644 --- a/bookie/src/app/sales/bills/bills.component.ts +++ b/bookie/src/app/sales/bills/bills.component.ts @@ -16,6 +16,7 @@ import { Customer } from '../../core/customer'; import { Table } from '../../core/table'; import { ConfirmDialogComponent } from '../../shared/confirm-dialog/confirm-dialog.component'; import { ErrorStateComponent } from '../../shared/error-state/error-state.component'; +import { LocalTimePipe } from '../../shared/local-time.pipe'; import { MathService } from '../../shared/math.service'; import { SkeletonLoaderComponent } from '../../shared/skeleton-loader/skeleton-loader.component'; import { TableService } from '../../tables/table.service'; @@ -36,6 +37,7 @@ import { VoucherService } from './voucher.service'; templateUrl: './bills.component.html', styleUrls: ['./bills.component.sass'], imports: [ + LocalTimePipe, CommonModule, CurrencyPipe, MatButtonModule, diff --git a/bookie/src/app/sales/running-tables/running-tables.component.html b/bookie/src/app/sales/running-tables/running-tables.component.html index 2f3fa62..5580543 100644 --- a/bookie/src/app/sales/running-tables/running-tables.component.html +++ b/bookie/src/app/sales/running-tables/running-tables.component.html @@ -19,7 +19,7 @@ {{ table.guest }} {{ table.pax ?? '-' }} / {{ table.seats }} / {{ table.section?.name }} @if (table.date) { - {{ table.date }} + {{ table.date | localTime: 'time' }} } @if (table.amount) { {{ table.amount | currency: 'INR' }} diff --git a/bookie/src/app/sales/running-tables/running-tables.component.ts b/bookie/src/app/sales/running-tables/running-tables.component.ts index 4fb5063..ca3dd75 100644 --- a/bookie/src/app/sales/running-tables/running-tables.component.ts +++ b/bookie/src/app/sales/running-tables/running-tables.component.ts @@ -10,6 +10,7 @@ import { map } from 'rxjs/operators'; import { Table } from '../../core/table'; import { RegimeService } from '../../regimes/regime.service'; import { ErrorStateComponent } from '../../shared/error-state/error-state.component'; +import { LocalTimePipe } from '../../shared/local-time.pipe'; import { SkeletonLoaderComponent } from '../../shared/skeleton-loader/skeleton-loader.component'; import { TableService } from '../../tables/table.service'; import { BillNumberComponent } from '../bill-number/bill-number.component'; @@ -18,7 +19,7 @@ import { BillNumberComponent } from '../bill-number/bill-number.component'; selector: 'app-running-tables', templateUrl: './running-tables.component.html', styleUrls: ['./running-tables.component.sass'], - imports: [CurrencyPipe, MatRippleModule, MatCardModule, ErrorStateComponent, SkeletonLoaderComponent], + imports: [LocalTimePipe, CurrencyPipe, MatRippleModule, MatCardModule, ErrorStateComponent, SkeletonLoaderComponent], }) export class RunningTablesComponent { private tableService = inject(TableService); diff --git a/bookie/src/app/settings/settings.component.ts b/bookie/src/app/settings/settings.component.ts index 78d2e00..c79fe54 100644 --- a/bookie/src/app/settings/settings.component.ts +++ b/bookie/src/app/settings/settings.component.ts @@ -68,8 +68,8 @@ export class SettingsComponent { runMaintenance() { const formModel = this.formModel(); - const startDate = DateTime.fromJSDate(formModel.startDate).toFormat('dd-MMM-yyyy'); - const finishDate = DateTime.fromJSDate(formModel.finishDate).toFormat('dd-MMM-yyyy'); + const startDate = DateTime.fromJSDate(formModel.startDate).toISODate() ?? ''; + const finishDate = DateTime.fromJSDate(formModel.finishDate).toISODate() ?? ''; if (!this.beerFile || !this.saleFile) { this.snackBar.open('Please choose both files first!', 'Danger'); diff --git a/bookie/src/app/shared/local-time.pipe.ts b/bookie/src/app/shared/local-time.pipe.ts index 882c144..2f8cf2f 100644 --- a/bookie/src/app/shared/local-time.pipe.ts +++ b/bookie/src/app/shared/local-time.pipe.ts @@ -6,15 +6,21 @@ import { DateTime } from 'luxon'; standalone: true, }) export class LocalTimePipe implements PipeTransform { - transform(value: string): string { - if (value === undefined || value === null) { + transform(value: string | undefined | null, format: 'datetime' | 'time' | 'date' = 'datetime'): string { + if (!value) { return ''; } - if (value.length === 5) { - return DateTime.fromFormat(value, 'HH:mm').minus({ minutes: new Date().getTimezoneOffset() }).toFormat('HH:mm'); + const dt = + value.length === 5 + ? DateTime.fromFormat(value, 'HH:mm').minus({ minutes: new Date().getTimezoneOffset() }) + : DateTime.fromISO(value).minus({ minutes: new Date().getTimezoneOffset() }); + + if (format === 'time') { + return dt.toFormat('HH:mm'); } - return DateTime.fromFormat(value, 'dd-MMM-yyyy HH:mm') - .minus({ minutes: new Date().getTimezoneOffset() }) - .toFormat('dd-MMM-yyyy HH:mm'); + if (format === 'date') { + return dt.toFormat('dd-MMM-yyyy', { locale: 'en-US' }); + } + return dt.toFormat('dd-MMM-yyyy HH:mm', { locale: 'en-US' }); } } diff --git a/bookie/src/app/tax-report/tax-report.component.ts b/bookie/src/app/tax-report/tax-report.component.ts index e3461fe..4e32162 100644 --- a/bookie/src/app/tax-report/tax-report.component.ts +++ b/bookie/src/app/tax-report/tax-report.component.ts @@ -55,8 +55,8 @@ export class TaxReportComponent { computation: (infoVal): TaxReportFormData => { if (infoVal) { return { - startDate: DateTime.fromFormat(this.info().startDate, 'dd-MMM-yyyy'), - finishDate: DateTime.fromFormat(this.info().finishDate, 'dd-MMM-yyyy'), + startDate: DateTime.fromISO(this.info().startDate), + finishDate: DateTime.fromISO(this.info().finishDate), }; } return { @@ -85,8 +85,8 @@ export class TaxReportComponent { const formModel = this.formModel(); return new TaxReport({ - startDate: formModel.startDate.toFormat('dd-MMM-yyyy'), - finishDate: formModel.finishDate.toFormat('dd-MMM-yyyy'), + startDate: formModel.startDate.toISODate() ?? '', + finishDate: formModel.finishDate.toISODate() ?? '', }); } diff --git a/bookie/src/app/temporal-product/temporal-product-detail/temporal-product-detail.component.ts b/bookie/src/app/temporal-product/temporal-product-detail/temporal-product-detail.component.ts index 2bbc8c7..9b03cae 100644 --- a/bookie/src/app/temporal-product/temporal-product-detail/temporal-product-detail.component.ts +++ b/bookie/src/app/temporal-product/temporal-product-detail/temporal-product-detail.component.ts @@ -152,11 +152,11 @@ export class TemporalProductDetailComponent { skuForm = form(this.skuFormModel); private parseDateOrNull(d: string | null | undefined): DateTime | null { - return !d ? null : DateTime.fromFormat(d, 'dd-MMM-yyyy'); + return !d ? null : DateTime.fromISO(d); } private formatDateOrNull(d: DateTime | null | undefined): string | null { - return !d ? null : d.toFormat('dd-MMM-yyyy'); + return !d ? null : (d.toISODate() ?? ''); } constructor() { diff --git a/bookie/src/app/update-product-prices/update-product-prices.component.ts b/bookie/src/app/update-product-prices/update-product-prices.component.ts index 92db034..9c4f03f 100644 --- a/bookie/src/app/update-product-prices/update-product-prices.component.ts +++ b/bookie/src/app/update-product-prices/update-product-prices.component.ts @@ -64,7 +64,7 @@ export class UpdateProductPricesComponent { source: () => this.info(), computation: (info): UpdateProductPricesFormData => { return { - date: info.date ? DateTime.fromFormat(info.date, 'dd-MMM-yyyy') : DateTime.now(), + date: info.date ? DateTime.fromISO(info.date) : DateTime.now(), menuCategory: info.menuCategoryId !== undefined ? info.menuCategoryId : '', prices: info.items.map((x) => ({ newPrice: x.newPrice })), }; @@ -99,7 +99,7 @@ export class UpdateProductPricesComponent { }); return { - date: formModel.date.toFormat('dd-MMM-yyyy'), + date: formModel.date.toISODate() ?? '', menuCategoryId: formModel.menuCategory, items: [...info.items], };