invoices, order handling, db updates

This commit is contained in:
2026-02-14 23:09:21 +07:00
parent a3aaafd7ac
commit 50b1a8f80c
28 changed files with 508 additions and 44 deletions

View File

@@ -1,3 +1,4 @@
from .invoices import router as invoice_router
from .menu import router as menu_router
from .catalogue import router as catalogue_router
from .products import router as products_router
@@ -6,6 +7,7 @@ from .checkout import router as checkout_router
from .security import router as security_router
routers = [
invoice_router,
menu_router,
catalogue_router,
products_router,

View File

@@ -1,9 +1,13 @@
import logging
from typing import Optional
from aiogram import Router, F
from aiogram.types import CallbackQuery, Message
from aiogram.fsm.context import FSMContext
from sqlalchemy.ext.asyncio import AsyncSession
from config import NOTIFICATION_CHANNEL
from dto.checkout import CheckoutContext
from misc.kb.admins import customer_contacts
from misc.kb.client import (
order_confirmation,
order_specs_confirmation,
@@ -16,6 +20,7 @@ from repositories.orders import OrderRepository
from services.orders import OrderService
router = Router()
logger = logging.getLogger(__name__)
@router.callback_query(F.data == "checkout")
@@ -119,4 +124,55 @@ async def checkout_address(msg: Message, state: FSMContext):
f"<i>📍 Ваш адрес: {ctx.address}</i>\n\n"
"━━━━━━━━━━━━━━",
reply_markup=order_specs_confirmation(ctx.order_id),
) # TODO: State-driven Payment System.
)
await state.set_state(CheckoutStorage.confirmation)
await state.set_data({"ctx": ctx})
@router.callback_query(CheckoutStorage.confirmation)
@router.callback_query(F.data.startswith("payment:"))
async def payment_create(
cb: CallbackQuery,
state: FSMContext,
session: AsyncSession,
order_service: OrderService,
):
data = await state.get_data()
ctx: Optional[CheckoutContext] = data.get("ctx")
if not ctx:
await cb.message.edit_text(
"🍃 Что-то пошло не так, повторите попытку позже...",
reply_markup=return_menu,
)
logger.warning("ctx not found on confirmation screen")
return
await state.clear()
await cb.message.edit_text(
"<b>🟢 Ваш заказ успешно отправлен!</b>\n"
"<i>📦 Мы свяжемся с вами для уточнения деталей в ближайшее время.</i>\n\n"
"<b>‼️ Чтобы убедиться, что вы общаетесь с доверенным контактом ШВЕЙТЕХЦЕНТР, перешлите любое сообщение человека в этот чат.</b>",
reply_markup=return_menu,
)
cart = await order_service.build_full_cart_dto(session, cb.from_user.id)
try:
await cb.bot.send_message(
NOTIFICATION_CHANNEL,
"🟢 Новый заказ.\n\n"
"━━━━━━━━━━━━━━\n\n"
f"<i>👤 Имя: {ctx.name}</i>\n"
f"<i>📱 Номер телефона: {ctx.phone}</i>\n"
f"<i>📍 Адрес: {ctx.address}</i>\n\n"
"━━━━━━━━━━━━━━\n"
f"{get_order_item_list(cart)}",
reply_markup=customer_contacts(
cb.from_user.id, bool(cb.from_user.username), cb.from_user.username
),
)
except Exception as e:
logger.exception(e)
return

View File

@@ -0,0 +1,29 @@
import logging
from aiogram import Router
from aiogram.filters import CommandObject, CommandStart
from aiogram.types import (
Message,
)
from sqlalchemy.ext.asyncio import AsyncSession
from repositories.invoices import InvoiceRepository
router = Router()
logger = logging.getLogger(__name__)
@router.message(CommandStart(deep_link=True, deep_link_encoded=True))
async def activate_invoice(
msg: Message,
command: CommandObject,
session: AsyncSession,
invoice_repo: InvoiceRepository,
):
payload = command.args
invoice_id = int(payload.split(":")[1])
invoice = await invoice_repo.get_invoice_by_id(session, invoice_id)
await msg.answer(
f"<b>🟢 Получен счёт на {invoice.amount}₽</b>"
) # TODO: Process payment

View File

@@ -5,6 +5,7 @@ from aiogram.fsm.context import FSMContext
from sqlalchemy.ext.asyncio import AsyncSession
from misc.kb import main_menu_kb
from repositories.order_items import OrderItemRepository
from services.orders import OrderService
router = Router()
@@ -12,11 +13,16 @@ router = Router()
@router.message(Command("start"))
async def main_menu(
msg: Message, state: FSMContext, session: AsyncSession, order_service: OrderService
msg: Message,
state: FSMContext,
session: AsyncSession,
order_items_repo: OrderItemRepository,
):
await state.clear()
cart_items = await order_service.get_cart_items_count(session, msg.from_user.id)
cart_items = await order_items_repo.get_items_count_by_customer(
session, msg.from_user.id
)
await msg.answer(
"hii!", reply_markup=main_menu_kb(cart_items)
) # TODO: Write a welcome message
@@ -27,11 +33,13 @@ async def main_menu_cb(
cb: CallbackQuery,
state: FSMContext,
session: AsyncSession,
order_service: OrderService,
order_items_repo: OrderService,
):
await state.clear()
cart_items = await order_service.get_cart_items_count(session, cb.from_user.id)
cart_items = await order_items_repo.get_items_count_by_customer(
session, cb.from_user.id
)
await cb.message.edit_text(
"hii!", reply_markup=main_menu_kb(cart_items)
) # TODO: Write a welcome message