Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 19 additions & 13 deletions app/modules/amap/cruds_amap.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import logging
from collections.abc import Sequence
from datetime import date
from datetime import datetime

from sqlalchemy import delete, select, update
from sqlalchemy.ext.asyncio import AsyncSession
Expand Down Expand Up @@ -118,16 +118,6 @@ async def get_delivery_by_id(
return result.scalars().first()


async def is_there_a_delivery_on(db: AsyncSession, delivery_date: date) -> bool:
result = await db.execute(
select(models_amap.Delivery).where(
models_amap.Delivery.delivery_date == delivery_date,
models_amap.Delivery.status != DeliveryStatusType.archived,
),
)
return result.scalars().all() != []


async def create_delivery(
delivery: schemas_amap.DeliveryComplete,
db: AsyncSession,
Expand Down Expand Up @@ -248,9 +238,11 @@ async def get_products_of_order(
async def add_order_to_delivery(
db: AsyncSession,
order: schemas_amap.OrderComplete,
delivery: models_amap.Delivery,
):
db.add(
models_amap.Order(
delivery=delivery,
**order.model_dump(exclude={"products_ids", "products_quantity"}),
),
)
Expand Down Expand Up @@ -358,7 +350,7 @@ async def add_cash(db: AsyncSession, user_id: str, amount: float):
await db.execute(
update(models_amap.Cash)
.where(models_amap.Cash.user_id == user_id)
.values(user_id=balance.user_id, balance=balance.balance + amount),
.values(balance=balance.balance + amount),
)
await db.flush()

Expand All @@ -372,7 +364,21 @@ async def remove_cash(db: AsyncSession, user_id: str, amount: float):
await db.execute(
update(models_amap.Cash)
.where(models_amap.Cash.user_id == user_id)
.values(user_id=balance.user_id, balance=balance.balance - amount),
.values(balance=balance.balance - amount),
)
await db.flush()


async def update_last_ordering_date(db: AsyncSession, user_id: str, date: datetime):
result = await db.execute(
select(models_amap.Cash).where(models_amap.Cash.user_id == user_id),
)
balance = result.scalars().first()
if balance is not None:
await db.execute(
update(models_amap.Cash)
.where(models_amap.Cash.user_id == user_id)
.values(last_order_date=date),
)
await db.flush()

Expand Down
72 changes: 54 additions & 18 deletions app/modules/amap/endpoints_amap.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,14 +196,6 @@ async def create_delivery(
status=DeliveryStatusType.creation,
**delivery.model_dump(),
)
if await cruds_amap.is_there_a_delivery_on(
db=db,
delivery_date=db_delivery.delivery_date,
):
raise HTTPException(
status_code=400,
detail="There is already a delivery planned that day.",
)

return await cruds_amap.create_delivery(delivery=db_delivery, db=db)

Expand Down Expand Up @@ -359,7 +351,14 @@ async def get_orders_from_delivery(
schemas_amap.ProductQuantity(**product.__dict__)
for product in order_content
]
res.append(schemas_amap.OrderReturn(productsdetail=products, **order.__dict__))
res.append(
schemas_amap.OrderReturn(
productsdetail=products,
delivery_date=delivery.delivery_date,
delivery_name=delivery.name,
**order.__dict__,
),
)
return res


Expand All @@ -384,7 +383,12 @@ async def get_order_by_id(
raise HTTPException(status_code=404, detail="Delivery not found")

products = await cruds_amap.get_products_of_order(db=db, order_id=order_id)
return schemas_amap.OrderReturn(productsdetail=products, **order.__dict__)
return schemas_amap.OrderReturn(
productsdetail=products,
delivery_name=order.delivery.name,
delivery_date=order.delivery.delivery_date,
**order.__dict__,
)


@module.router.post(
Expand Down Expand Up @@ -443,7 +447,6 @@ async def add_order_to_delievery(
order_id=order_id,
amount=amount,
ordering_date=ordering_date,
delivery_date=delivery.delivery_date,
**order.model_dump(),
)
balance: models_amap.Cash | None = await cruds_amap.get_cash_by_id(
Expand All @@ -453,12 +456,10 @@ async def add_order_to_delievery(

# If the balance does not exist, we create a new one with a balance of 0
if not balance:
new_cash_db = schemas_amap.CashDB(
balance = models_amap.Cash(
balance=0,
user_id=order.user_id,
)
balance = models_amap.Cash(
**new_cash_db.model_dump(),
last_order_date=ordering_date,
)
await cruds_amap.create_cash_of_user(
cash=balance,
Expand All @@ -481,21 +482,36 @@ async def add_order_to_delievery(
await cruds_amap.add_order_to_delivery(
order=db_order,
db=db,
delivery=delivery,
)
await cruds_amap.remove_cash(
db=db,
user_id=order.user_id,
amount=amount,
)

await cruds_amap.update_last_ordering_date(
db=db,
user_id=order.user_id,
date=ordering_date,
)

orderret = await cruds_amap.get_order_by_id(order_id=db_order.order_id, db=db)
productsret = await cruds_amap.get_products_of_order(db=db, order_id=order_id)

hyperion_amap_logger.info(
f"Add_order_to_delivery: An order has been created for user {order.user_id} for an amount of {amount}€. ({request_id})",
)
return schemas_amap.OrderReturn(productsdetail=productsret, **orderret.__dict__)

if orderret is None:
raise HTTPException(status_code=404, detail="added order not found")

return schemas_amap.OrderReturn(
productsdetail=productsret,
delivery_name=orderret.delivery.name,
delivery_date=orderret.delivery.delivery_date,
**orderret.__dict__,
)
finally:
locker_set(redis_client=redis_client, key=redis_key, lock=False)

Expand Down Expand Up @@ -607,6 +623,12 @@ async def edit_order_from_delivery(
user_id=previous_order.user_id,
amount=previous_amount,
)
date = datetime.now(UTC)
await cruds_amap.update_last_ordering_date(
db=db,
user_id=previous_order.user_id,
date=date,
)
hyperion_amap_logger.info(
f"Edit_order: Order {order_id} has been edited for user {db_order.user_id}. Amount was {previous_amount}€, is now {amount}€. ({request_id})",
)
Expand Down Expand Up @@ -835,6 +857,7 @@ async def get_cash_by_id(
balance=0,
user_id=user_id,
user=schemas_users.CoreUserSimple(**user_db.__dict__),
last_order_date=datetime.now(UTC),
)

return cash
Expand Down Expand Up @@ -870,7 +893,11 @@ async def create_cash_of_user(
detail="This user already has a cash.",
)

cash_db = models_amap.Cash(user_id=user_id, balance=cash.balance)
cash_db = models_amap.Cash(
user_id=user_id,
balance=cash.balance,
last_order_date=datetime.now(UTC),
)

await cruds_amap.create_cash_of_user(
cash=cash_db,
Expand Down Expand Up @@ -967,7 +994,16 @@ async def get_orders_of_user(
db=db,
order_id=order.order_id,
)
res.append(schemas_amap.OrderReturn(productsdetail=products, **order.__dict__))
if order is None:
raise HTTPException(status_code=404, detail="at least one order not found")
res.append(
schemas_amap.OrderReturn(
productsdetail=products,
delivery_date=order.delivery.delivery_date,
delivery_name=order.delivery.name,
**order.__dict__,
),
)
return res


Expand Down
3 changes: 3 additions & 0 deletions app/modules/amap/factory_amap.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ async def create_delivery(cls, db: AsyncSession):
db=db,
delivery=schemas_amap.DeliveryComplete(
id=str(uuid.uuid4()),
name="Première livraison",
status=DeliveryStatusType.orderable,
delivery_date=(datetime.now(UTC) + timedelta(days=8)).date(),
products_ids=[product.id for product in products],
Expand All @@ -55,6 +56,7 @@ async def create_delivery(cls, db: AsyncSession):
db=db,
delivery=schemas_amap.DeliveryComplete(
id=str(uuid.uuid4()),
name="Deuxième livraison",
status=DeliveryStatusType.orderable,
delivery_date=(datetime.now(UTC) + timedelta(days=1)).date(),
products_ids=[product.id for product in products],
Expand All @@ -68,6 +70,7 @@ async def create_cash_of_user(cls, db: AsyncSession):
cash=models_amap.Cash(
user_id=CoreUsersFactory.demo_users_id[0],
balance=100,
last_order_date=datetime.now(UTC),
),
)

Expand Down
12 changes: 10 additions & 2 deletions app/modules/amap/models_amap.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,16 @@ class Delivery(Base):
__tablename__ = "amap_delivery"

id: Mapped[str] = mapped_column(primary_key=True, index=True)
name: Mapped[str] = mapped_column(index=True, unique=False)
delivery_date: Mapped[date] = mapped_column(
unique=False,
index=True,
)
status: Mapped[DeliveryStatusType] = mapped_column(String)
orders: Mapped[list["Order"]] = relationship("Order", init=False)
orders: Mapped[list["Order"]] = relationship(
init=False,
back_populates="delivery",
)
products: Mapped[list[Product]] = relationship(
"Product",
secondary="amap_delivery_content",
Expand All @@ -79,7 +83,10 @@ class Order(Base):
amount: Mapped[float]
collection_slot: Mapped[AmapSlotType]
ordering_date: Mapped[datetime]
delivery_date: Mapped[date]
delivery: Mapped["Delivery"] = relationship(
lazy="joined",
back_populates="orders",
)
user: Mapped[CoreUser] = relationship(
"CoreUser",
init=False,
Expand All @@ -100,6 +107,7 @@ class Cash(Base):
primary_key=True,
)
balance: Mapped[float]
last_order_date: Mapped[datetime]
user: Mapped[CoreUser] = relationship("CoreUser", init=False)


Expand Down
10 changes: 5 additions & 5 deletions app/modules/amap/schemas_amap.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ class ProductQuantity(BaseModel):
class DeliveryBase(BaseModel):
"""Base schema for AMAP deliveries"""

name: str
delivery_date: date
products_ids: list[str] = []

Expand All @@ -58,6 +59,7 @@ class DeliveryComplete(DeliveryBase):


class DeliveryUpdate(BaseModel):
name: str | None = None
delivery_date: date | None = None


Expand All @@ -77,13 +79,13 @@ class OrderComplete(OrderBase):
order_id: str
amount: float
ordering_date: datetime
delivery_date: date
model_config = ConfigDict(from_attributes=True)


class OrderReturn(BaseModel):
user: CoreUserSimple
delivery_id: str
delivery_name: str
productsdetail: Sequence[ProductQuantity]
collection_slot: AmapSlotType
order_id: str
Expand All @@ -101,6 +103,7 @@ class OrderEdit(BaseModel):


class DeliveryReturn(BaseModel):
name: str
delivery_date: date
products: list[ProductComplete] = []
id: str
Expand All @@ -121,10 +124,7 @@ class CashBase(BaseModel):

class CashComplete(CashBase):
user: CoreUserSimple


class CashDB(CashBase):
user_id: str
last_order_date: datetime


class CashEdit(BaseModel):
Expand Down
Loading