Merge remote-tracking branch 'origin/cards'

This commit is contained in:
2025-03-11 22:38:50 +03:00
72 changed files with 4534 additions and 3286 deletions

View File

@@ -1,6 +1,7 @@
from .attribute import attribute_router
from .auth import auth_router
from .deal import deal_router
from .group import deal_group_router
from .card import card_router
from .group import card_group_router
from .client import client_router
from .service import service_router
from .product import product_router
@@ -24,3 +25,4 @@ from .residues import residues_router
from .project import project_router
from .board import board_router
from .status import status_router
from .card_tag import card_tag_router

77
routers/attribute.py Normal file
View File

@@ -0,0 +1,77 @@
from typing import Annotated
from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from backend.session import get_session
from schemas.attribute import *
from services.attribute import AttributeService
from services.auth import authorized_user
attribute_router = APIRouter(
prefix='/attribute',
tags=['attribute'],
)
@attribute_router.get(
'/',
response_model=GetAttributesResponse,
operation_id='get_all',
dependencies=[Depends(authorized_user)]
)
async def get_all(
session: Annotated[AsyncSession, Depends(get_session)]
):
return await AttributeService(session).get_all()
@attribute_router.get(
'/types',
response_model=GetAttributeTypesResponse,
operation_id='get_types',
dependencies=[Depends(authorized_user)]
)
async def get_types(
session: Annotated[AsyncSession, Depends(get_session)]
):
return await AttributeService(session).get_types()
@attribute_router.post(
'/',
response_model=CreateAttributeResponse,
operation_id='create',
dependencies=[Depends(authorized_user)]
)
async def create(
request: CreateAttributeRequest,
session: Annotated[AsyncSession, Depends(get_session)]
):
return await AttributeService(session).create(request)
@attribute_router.patch(
'/',
response_model=UpdateAttributeResponse,
operation_id='update',
dependencies=[Depends(authorized_user)]
)
async def update(
request: UpdateAttributeRequest,
session: Annotated[AsyncSession, Depends(get_session)]
):
return await AttributeService(session).update(request)
@attribute_router.delete(
'/{attribute_id}',
response_model=DeleteAttributeResponse,
operation_id='delete',
dependencies=[Depends(authorized_user)]
)
async def delete(
session: Annotated[AsyncSession, Depends(get_session)],
attribute_id: int,
):
return await AttributeService(session).delete(attribute_id)

View File

@@ -29,34 +29,34 @@ async def webhook(
@billing_router.post(
'/create-deal-bill',
operation_id='create_deal_bill',
response_model=CreateDealBillResponse
response_model=CreateCardBillResponse
)
async def create_deal_bill(
session: SessionDependency,
request: CreateDealBillRequest,
request: CreateCardBillRequest,
user: CurrentUserDependency
):
return await BillingService(session).create_deal_billing(user, request)
return await BillingService(session).create_card_billing(user, request)
@billing_router.post(
'/cancel-deal-bill',
operation_id='cancel_deal_bill',
response_model=CancelDealBillResponse
response_model=CancelCardBillResponse
)
async def cancel_deal_billing(
session: SessionDependency,
request: CancelDealBillRequest,
request: CancelCardBillRequest,
user: CurrentUserDependency
):
return await BillingService(session).cancel_deal_billing(user, request)
return await BillingService(session).cancel_card_billing(user, request)
@billing_router.get(
'/deal-bill-request/{deal_id}',
response_model=GetDealBillById,
response_model=GetCardBillById,
operation_id='get_deal_bill_by_id'
)
async def get_deal_bill_by_id(
deal_id: int,
session: SessionDependency
):
return await BillingService(session).get_deal_bill_by_id(deal_id)
return await BillingService(session).get_card_bill_by_id(deal_id)

522
routers/card.py Normal file
View File

@@ -0,0 +1,522 @@
import base64
from io import BytesIO
from typing import Annotated
from fastapi import APIRouter, Depends, Response, UploadFile
from sqlalchemy.ext.asyncio import AsyncSession
from backend.dependecies import SessionDependency, CurrentUserDependency
from backend.session import get_session
from generators.deal_pdf_generator.generator import DealTechSpecPdfGenerator
from models import User
from parsers import DealParser
from schemas.barcode import GetCardProductsBarcodesPdfRequest, GetCardProductsBarcodesPdfResponse
from schemas.card import *
from services.auth import get_current_user, authorized_user, guest_user
from services.barcode import BarcodeService
from services.billing import BillingService
from services.card import CardsService
card_router = APIRouter(
prefix='/card',
tags=['card'],
)
# region Card
@card_router.post(
'/delete',
response_model=CardDeleteResponse,
operation_id='deleteCard',
dependencies=[Depends(authorized_user)]
)
async def delete(
request: CardDeleteRequest,
session: Annotated[AsyncSession, Depends(get_session)]
):
return await CardsService(session).delete(request)
@card_router.post(
'/complete',
response_model=CardCompleteResponse,
operation_id='completeCard',
dependencies=[Depends(authorized_user)]
)
async def complete(
request: CardCompleteRequest,
session: SessionDependency,
user: CurrentUserDependency
):
return await CardsService(session).complete(user, request)
@card_router.post(
'/quickCreate',
response_model=CardQuickCreateResponse,
dependencies=[Depends(authorized_user)]
)
async def quick_create(
request: CardQuickCreateRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: Annotated[User, Depends(get_current_user)]
):
return await CardsService(session).quick_create(request, user)
@card_router.post(
'/changeStatus',
response_model=CardChangeStatusResponse,
dependencies=[Depends(authorized_user)]
)
async def change_status(
request: CardChangeStatusRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: Annotated[User, Depends(get_current_user)]
):
return await CardsService(session).change_status_manual(request, user)
@card_router.get(
'/summaries',
response_model=CardSummaryResponse,
operation_id='getCardSummaries',
dependencies=[Depends(authorized_user)]
)
async def get_summary(
session: Annotated[AsyncSession, Depends(get_session)],
full: Optional[bool]
):
return await CardsService(session).get_summary(full)
@card_router.post(
'/summaries/reorder',
response_model=CardSummaryResponse,
operation_id='reorderCardSummaries',
dependencies=[Depends(authorized_user)]
)
async def reorder(
session: Annotated[AsyncSession, Depends(get_session)],
request: CardSummaryReorderRequest,
user: Annotated[User, Depends(get_current_user)]
):
return await CardsService(session).reorder(request, user)
@card_router.get(
'/get-all',
response_model=CardGetAllResponse,
operation_id='getAllCards',
dependencies=[Depends(authorized_user)]
)
async def get_all(
session: Annotated[AsyncSession, Depends(get_session)]
):
return await CardsService(session).get_all()
# endpoint to get card by id
@card_router.get(
'/get/{card_id}',
response_model=CardSchema,
operation_id='getCardById',
dependencies=[Depends(guest_user)]
)
async def get_card_by_id(
card_id: int,
user: CurrentUserDependency,
session: Annotated[AsyncSession, Depends(get_session)]
):
return await CardsService(session).get_by_id(user, card_id)
@card_router.post(
'/update-general-info',
response_model=CardUpdateGeneralInfoResponse,
operation_id='update_card_general_info',
dependencies=[Depends(authorized_user)]
)
async def update_general_info(
request: CardUpdateGeneralInfoRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency,
):
return await CardsService(session).update_general_info(request, user)
@card_router.post(
'/update-products-and-services-general-info',
response_model=ProductsAndServicesGeneralInfoResponse,
operation_id='update_products_and_services_general_info',
dependencies=[Depends(authorized_user)]
)
async def update_products_and_services_general_info(
request: ProductsAndServicesGeneralInfoRequest,
session: Annotated[AsyncSession, Depends(get_session)],
):
return await CardsService(session).update_products_and_services_general_info(request)
@card_router.post(
'/update-card-manager',
response_model=UpdateCardManagerResponse,
operation_id='update_card_manager',
dependencies=[Depends(authorized_user)]
)
async def update_card_manager(
request: UpdateCardManagerRequest,
session: Annotated[AsyncSession, Depends(get_session)],
):
return await CardsService(session).update_card_manager(request)
@card_router.post(
'/update-card-client',
response_model=UpdateCardClientResponse,
operation_id='update_card_client',
dependencies=[Depends(authorized_user)]
)
async def update_card_client(
request: UpdateCardClientRequest,
session: Annotated[AsyncSession, Depends(get_session)],
):
return await CardsService(session).update_card_client(request)
@card_router.post(
'/add-kit',
response_model=CardAddKitResponse,
operation_id='add_kit_to_card'
)
async def add_kit_to_card(
session: SessionDependency,
request: CardAddKitRequest
):
return await CardsService(session).add_kit_to_card(request)
@card_router.post(
'/create-guest-url',
response_model=CardCreateGuestUrlResponse,
operation_id='create_deal_guest_url',
dependencies=[Depends(authorized_user)]
)
async def create_guest_url(
session: SessionDependency,
request: CardCreateGuestUrlRequest,
user: CurrentUserDependency
):
return CardsService(session).create_guest_url(user, request)
@card_router.get(
'/billing-document/{deal_id}',
operation_id='get_billing_document',
# dependencies=[Depends(authorized_user)],
)
async def get_billing_document(
deal_id: int,
session: Annotated[AsyncSession, Depends(get_session)],
):
pdf_file: BytesIO = await BillingService(session).create_billing_document_pdf(deal_id)
return Response(pdf_file.getvalue(), media_type='application/pdf')
@card_router.get(
'/tech-spec/{deal_id}',
operation_id='get_deal_tech_spec',
# dependencies=[Depends(authorized_user)],
)
async def get_deal_tech_spec(
deal_id: int,
session: Annotated[AsyncSession, Depends(get_session)],
):
pdf_file: BytesIO = await DealTechSpecPdfGenerator(session).create_deal_tech_spec_pdf(deal_id)
return Response(pdf_file.getvalue(), media_type='application/pdf')
@card_router.post(
'/prefill',
response_model=CardPrefillResponse,
operation_id='prefill_card',
dependencies=[Depends(authorized_user)]
)
async def post_prefill_card(
session: SessionDependency,
request: CardPrefillRequest,
user: CurrentUserDependency
):
return await CardsService(session).prefill_card_products_and_services(user, request)
@card_router.post(
'/recalculate-price',
response_model=CardRecalculatePriceResponse,
operation_id='recalculate_card_price',
)
async def recalculate_card_price(
session: SessionDependency,
request: CardRecalculatePriceRequest,
):
return await CardsService(session).recalculate_price(request)
@card_router.post(
'/employee',
response_model=ManageEmployeeResponse,
operation_id='manage_employee',
)
async def manage_employee(
session: SessionDependency,
request: ManageEmployeeRequest,
):
return await CardsService(session).manage_employee(request)
@card_router.get(
'/employee/available/{card_id}',
response_model=GetAvailableEmployeesToAssignResponse,
operation_id='get_available_employees_to_assign',
)
async def get_available_employees_to_assign(
session: Annotated[AsyncSession, Depends(get_session)],
card_id: int,
):
return await CardsService(session).get_available_employees_to_assign(card_id)
@card_router.post(
'/prefill/excel/parse',
response_model=ParseCardsExcelResponse,
operation_id='parse_deals_excel',
)
async def parse_deals_excel(
session: Annotated[AsyncSession, Depends(get_session)],
upload_file: UploadFile,
):
file_bytes = upload_file.file.read()
return await DealParser(session).parse(file_bytes)
@card_router.post(
'/prefill/excel/create',
response_model=CreateCardsFromExcelResponse,
operation_id='create_deals_excel',
)
async def create_deals_from_excel(
session: Annotated[AsyncSession, Depends(get_session)],
request: CreateCardsFromExcelRequest,
user: CurrentUserDependency,
):
return await CardsService(session).create_cards_from_excel(request, user)
# endregion
# region Card services
@card_router.post(
'/services/add/multiple',
response_model=CardAddServicesResponse,
operation_id='add_multiple_card_services',
dependencies=[Depends(guest_user)]
)
async def services_add(
request: CardAddServicesRequest,
session: Annotated[AsyncSession, Depends(get_session)],
):
return await CardsService(session).add_services(request)
@card_router.post(
'/services/add',
response_model=CardAddServiceResponse,
operation_id='add_card_service',
dependencies=[Depends(guest_user)]
)
async def services_add(
request: CardAddServiceRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await CardsService(session).add_service(user, request)
@card_router.post(
'/services/update-quantity',
response_model=CardUpdateServiceQuantityResponse,
operation_id='update_card_service_quantity',
dependencies=[Depends(guest_user)]
)
async def services_update_quantity(
request: CardUpdateServiceQuantityRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await CardsService(session).update_service_quantity(user, request)
@card_router.post(
'/services/update',
response_model=CardUpdateServiceResponse,
operation_id='update_card_service',
dependencies=[Depends(guest_user)]
)
async def services_update(
request: CardUpdateServiceRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await CardsService(session).update_service(user, request)
@card_router.post(
'/services/delete',
response_model=CardDeleteServiceResponse,
operation_id='delete_card_service',
dependencies=[Depends(guest_user)]
)
async def services_delete(
request: CardDeleteServiceRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await CardsService(session).delete_service(user, request)
@card_router.post(
'/services/delete/multiple',
response_model=CardDeleteServicesResponse,
operation_id='delete_multiple_card_services',
dependencies=[Depends(guest_user)]
)
async def services_delete(
request: CardDeleteServicesRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await CardsService(session).delete_services(user, request)
@card_router.post(
'/services/copy',
response_model=CardServicesCopyResponse,
operation_id='copy_product_services',
dependencies=[Depends(guest_user)]
)
async def services_copy(
session: SessionDependency,
request: CardServicesCopyRequest,
user: CurrentUserDependency
):
return await CardsService(session).copy_services(user, request)
# endregion
# region Card products
@card_router.post(
'/products/update-quantity',
response_model=CardUpdateProductQuantityResponse,
operation_id='update_card_product_quantity',
dependencies=[Depends(guest_user)]
)
async def products_update(
request: CardUpdateProductQuantityRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await CardsService(session).update_product_quantity(user, request)
@card_router.post(
'/products/add',
response_model=CardAddProductResponse,
operation_id='add_card_product',
dependencies=[Depends(guest_user)]
)
async def products_add(
request: CardAddProductRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await CardsService(session).add_product(user, request)
@card_router.post(
'/products/delete',
response_model=CardDeleteProductResponse,
operation_id='delete_card_product',
dependencies=[Depends(guest_user)]
)
async def products_delete(
request: CardDeleteProductRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await CardsService(session).delete_product(user, request)
@card_router.post(
'/products/delete/multiple',
response_model=CardDeleteProductsResponse,
operation_id='delete_multiple_card_products',
dependencies=[Depends(guest_user)]
)
async def products_delete(
request: CardDeleteProductsRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await CardsService(session).delete_products(user, request)
@card_router.post(
'/product/update',
response_model=CardUpdateProductResponse,
operation_id='update_card_product',
dependencies=[Depends(guest_user)]
)
async def products_update(
request: CardUpdateProductRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await CardsService(session).update_product(user, request)
@card_router.post(
'/product/add-kit',
response_model=CardProductAddKitResponse,
operation_id='add_kit_to_card_product',
dependencies=[Depends(guest_user)]
)
async def add_kit_to_card_product(
session: SessionDependency,
request: CardProductAddKitRequest,
user: CurrentUserDependency
):
return await CardsService(session).add_kit_to_card_product(user, request)
@card_router.post(
'/barcodes/get-pdf',
operation_id='get_card_products_barcodes_pdf',
response_model=GetCardProductsBarcodesPdfResponse
)
async def get_card_products_barcodes_pdf(
request: GetCardProductsBarcodesPdfRequest,
session: Annotated[AsyncSession, Depends(get_session)]
):
filename, pdf_buffer = await BarcodeService(session).get_card_barcodes_pdf(request)
pdf_buffer: BytesIO
base64_string = base64.b64encode(pdf_buffer.read()).decode('utf-8')
return GetCardProductsBarcodesPdfResponse(
base64_string=base64_string,
filename=filename,
mime_type='application/pdf'
)
# endregion

63
routers/card_tag.py Normal file
View File

@@ -0,0 +1,63 @@
from typing import Annotated
from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from backend.session import get_session
from schemas.card_tag import *
from services.auth import authorized_user
from services.card_tag import CardTagService
card_tag_router = APIRouter(
prefix='/card-tag',
tags=['card-tag'],
dependencies=[Depends(authorized_user)]
)
@card_tag_router.post(
'/',
operation_id='create_tag',
response_model=CreateTagResponse
)
async def create_tag(
request: CreateTagRequest,
session: Annotated[AsyncSession, Depends(get_session)]
):
return await CardTagService(session).create(request)
@card_tag_router.patch(
'/',
operation_id='update_tag',
response_model=UpdateTagResponse
)
async def update_tag(
request: UpdateTagRequest,
session: Annotated[AsyncSession, Depends(get_session)]
):
return await CardTagService(session).update(request)
@card_tag_router.delete(
'/{card_tag_id}',
response_model=DeleteTagResponse,
operation_id="delete_tag",
)
async def delete_tag(
session: Annotated[AsyncSession, Depends(get_session)],
card_tag_id: int,
):
return await CardTagService(session).delete(card_tag_id)
@card_tag_router.post(
'/switch',
response_model=SwitchTagResponse,
operation_id='switch_tag',
)
async def switch_tag(
session: Annotated[AsyncSession, Depends(get_session)],
request: SwitchTagRequest,
):
return await CardTagService(session).switch_tag(request)

View File

@@ -1,486 +0,0 @@
import base64
from io import BytesIO
from typing import Annotated
from fastapi import APIRouter, Depends, Response, UploadFile
from sqlalchemy.ext.asyncio import AsyncSession
from backend.dependecies import SessionDependency, CurrentUserDependency
from backend.session import get_session
from generators.deal_pdf_generator.generator import DealTechSpecPdfGenerator
from models import User
from parsers import DealParser
from schemas.barcode import GetDealProductsBarcodesPdfRequest, GetDealProductsBarcodesPdfResponse
from schemas.deal import *
from services.auth import get_current_user, authorized_user, guest_user
from services.barcode import BarcodeService
from services.billing import BillingService
from services.deal import DealService
deal_router = APIRouter(
prefix='/deal',
tags=['deal'],
)
# region Deal
@deal_router.post(
'/delete',
response_model=DealDeleteResponse,
operation_id='deleteDeal',
dependencies=[Depends(authorized_user)]
)
async def delete(
request: DealDeleteRequest,
session: Annotated[AsyncSession, Depends(get_session)]
):
return await DealService(session).delete(request)
@deal_router.post(
'/complete',
response_model=DealCompleteResponse,
operation_id='completeDeal',
dependencies=[Depends(authorized_user)]
)
async def complete(
request: DealCompleteRequest,
session: SessionDependency,
user: CurrentUserDependency
):
return await DealService(session).complete(user, request)
@deal_router.post(
'/quickCreate',
response_model=DealQuickCreateResponse,
dependencies=[Depends(authorized_user)]
)
async def quick_create(
request: DealQuickCreateRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: Annotated[User, Depends(get_current_user)]
):
return await DealService(session).quick_create(request, user)
@deal_router.post(
'/changeStatus',
response_model=DealChangeStatusResponse,
dependencies=[Depends(authorized_user)]
)
async def change_status(
request: DealChangeStatusRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: Annotated[User, Depends(get_current_user)]
):
return await DealService(session).change_status_manual(request, user)
@deal_router.get(
'/summaries',
response_model=DealSummaryResponse,
operation_id='getDealSummaries',
dependencies=[Depends(authorized_user)]
)
async def get_summary(
session: Annotated[AsyncSession, Depends(get_session)],
full: Optional[bool]
):
return await DealService(session).get_summary(full)
@deal_router.post(
'/summaries/reorder',
response_model=DealSummaryResponse,
operation_id='reorderDealSummaries',
dependencies=[Depends(authorized_user)]
)
async def reorder(
session: Annotated[AsyncSession, Depends(get_session)],
request: DealSummaryReorderRequest,
user: Annotated[User, Depends(get_current_user)]
):
return await DealService(session).reorder(request, user)
@deal_router.get(
'/get-all',
response_model=DealGetAllResponse,
operation_id='getAllDeals',
dependencies=[Depends(authorized_user)]
)
async def get_all(
session: Annotated[AsyncSession, Depends(get_session)]
):
return await DealService(session).get_all()
# endpoint to get deal by id
@deal_router.get(
'/get/{deal_id}',
response_model=DealSchema,
operation_id='getDealById',
dependencies=[Depends(guest_user)]
)
async def get_deal_by_id(
deal_id: int,
user: CurrentUserDependency,
session: Annotated[AsyncSession, Depends(get_session)]
):
return await DealService(session).get_by_id(user, deal_id)
@deal_router.post(
'/update-general-info',
response_model=DealUpdateGeneralInfoResponse,
operation_id='updateDealGeneralInfo',
dependencies=[Depends(authorized_user)]
)
async def update_general_info(
request: DealUpdateGeneralInfoRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency,
):
return await DealService(session).update_general_info(request, user)
@deal_router.post(
'/add-kit',
response_model=DealAddKitResponse,
operation_id='add_kit_to_deal'
)
async def add_kit_to_deal(
session: SessionDependency,
request: DealAddKitRequest
):
return await DealService(session).add_kit_to_deal(request)
@deal_router.post(
'/create-guest-url',
response_model=DealCreateGuestUrlResponse,
operation_id='create_deal_guest_url',
dependencies=[Depends(authorized_user)]
)
async def create_guest_url(
session: SessionDependency,
request: DealCreateGuestUrlRequest,
user: CurrentUserDependency
):
return DealService(session).create_guest_url(user, request)
@deal_router.get(
'/billing-document/{deal_id}',
operation_id='get_billing_document',
# dependencies=[Depends(authorized_user)],
)
async def get_billing_document(
deal_id: int,
session: Annotated[AsyncSession, Depends(get_session)],
):
pdf_file: BytesIO = await BillingService(session).create_billing_document_pdf(deal_id)
return Response(pdf_file.getvalue(), media_type='application/pdf')
@deal_router.get(
'/tech-spec/{deal_id}',
operation_id='get_deal_tech_spec',
# dependencies=[Depends(authorized_user)],
)
async def get_deal_tech_spec(
deal_id: int,
session: Annotated[AsyncSession, Depends(get_session)],
):
pdf_file: BytesIO = await DealTechSpecPdfGenerator(session).create_deal_tech_spec_pdf(deal_id)
return Response(pdf_file.getvalue(), media_type='application/pdf')
@deal_router.post(
'/prefill',
response_model=DealPrefillResponse,
operation_id='prefill_deal',
dependencies=[Depends(authorized_user)]
)
async def post_prefill_deal(
session: SessionDependency,
request: DealPrefillRequest,
user: CurrentUserDependency
):
return await DealService(session).prefill_deal(user, request)
@deal_router.post(
'/recalculate-price',
response_model=DealRecalculatePriceResponse,
operation_id='recalculate_deal_price',
)
async def recalculate_deal_price(
session: SessionDependency,
request: DealRecalculatePriceRequest,
):
return await DealService(session).recalculate_price(request)
@deal_router.post(
'/employee',
response_model=ManageEmployeeResponse,
operation_id='manage_employee',
)
async def manage_employee(
session: SessionDependency,
request: ManageEmployeeRequest,
):
return await DealService(session).manage_employee(request)
@deal_router.get(
'/employee/available/{deal_id}',
response_model=GetAvailableEmployeesToAssignResponse,
operation_id='get_available_employees_to_assign',
)
async def get_available_employees_to_assign(
session: Annotated[AsyncSession, Depends(get_session)],
deal_id: int,
):
return await DealService(session).get_available_employees_to_assign(deal_id)
@deal_router.post(
'/prefill/excel/parse',
response_model=ParseDealsExcelResponse,
operation_id='parse_deals_excel',
)
async def parse_deals_excel(
session: Annotated[AsyncSession, Depends(get_session)],
upload_file: UploadFile,
):
file_bytes = upload_file.file.read()
return await DealParser(session).parse(file_bytes)
@deal_router.post(
'/prefill/excel/create',
response_model=CreateDealsFromExcelResponse,
operation_id='create_deals_excel',
)
async def create_deals_from_excel(
session: Annotated[AsyncSession, Depends(get_session)],
request: CreateDealsFromExcelRequest,
user: CurrentUserDependency,
):
return await DealService(session).create_deals_from_excel(request, user)
# endregion
# region Deal services
@deal_router.post(
'/services/add/multiple',
response_model=DealAddServicesResponse,
operation_id='addMultipleDealServices',
dependencies=[Depends(guest_user)]
)
async def services_add(
request: DealAddServicesRequest,
session: Annotated[AsyncSession, Depends(get_session)],
):
return await DealService(session).add_services(request)
@deal_router.post(
'/services/add',
response_model=DealAddServiceResponse,
operation_id='addDealService',
dependencies=[Depends(guest_user)]
)
async def services_add(
request: DealAddServiceRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await DealService(session).add_service(user, request)
@deal_router.post(
'/services/update-quantity',
response_model=DealUpdateServiceQuantityResponse,
operation_id='updateDealServiceQuantity',
dependencies=[Depends(guest_user)]
)
async def services_update_quantity(
request: DealUpdateServiceQuantityRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await DealService(session).update_service_quantity(user, request)
@deal_router.post(
'/services/update',
response_model=DealUpdateServiceResponse,
operation_id='updateDealService',
dependencies=[Depends(guest_user)]
)
async def services_update(
request: DealUpdateServiceRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await DealService(session).update_service(user, request)
@deal_router.post(
'/services/delete',
response_model=DealDeleteServiceResponse,
operation_id='deleteDealService',
dependencies=[Depends(guest_user)]
)
async def services_delete(
request: DealDeleteServiceRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await DealService(session).delete_service(user, request)
@deal_router.post(
'/services/delete/multiple',
response_model=DealDeleteServicesResponse,
operation_id='deleteMultipleDealServices',
dependencies=[Depends(guest_user)]
)
async def services_delete(
request: DealDeleteServicesRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await DealService(session).delete_services(user, request)
@deal_router.post(
'/services/copy',
response_model=DealServicesCopyResponse,
operation_id='copy_product_services',
dependencies=[Depends(guest_user)]
)
async def services_copy(
session: SessionDependency,
request: DealServicesCopyRequest,
user: CurrentUserDependency
):
return await DealService(session).copy_services(user, request)
# endregion
# region Deal products
@deal_router.post(
'/products/update-quantity',
response_model=DealUpdateProductQuantityResponse,
operation_id='updateDealProductQuantity',
dependencies=[Depends(guest_user)]
)
async def products_update(
request: DealUpdateProductQuantityRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await DealService(session).update_product_quantity(user, request)
@deal_router.post(
'/products/add',
response_model=DealAddProductResponse,
operation_id='addDealProduct',
dependencies=[Depends(guest_user)]
)
async def products_add(
request: DealAddProductRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await DealService(session).add_product(user, request)
@deal_router.post(
'/products/delete',
response_model=DealDeleteProductResponse,
operation_id='deleteDealProduct',
dependencies=[Depends(guest_user)]
)
async def products_delete(
request: DealDeleteProductRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await DealService(session).delete_product(user, request)
@deal_router.post(
'/products/delete/multiple',
response_model=DealDeleteProductsResponse,
operation_id='deleteMultipleDealProducts',
dependencies=[Depends(guest_user)]
)
async def products_delete(
request: DealDeleteProductsRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await DealService(session).delete_products(user, request)
@deal_router.post(
'/product/update',
response_model=DealUpdateProductResponse,
operation_id='updateDealProduct',
dependencies=[Depends(guest_user)]
)
async def products_update(
request: DealUpdateProductRequest,
session: Annotated[AsyncSession, Depends(get_session)],
user: CurrentUserDependency
):
return await DealService(session).update_product(user, request)
@deal_router.post(
'/product/add-kit',
response_model=DealProductAddKitResponse,
operation_id='add_kit_to_deal_product',
dependencies=[Depends(guest_user)]
)
async def add_kit_to_deal_product(
session: SessionDependency,
request: DealProductAddKitRequest,
user: CurrentUserDependency
):
return await DealService(session).add_kit_to_deal_product(user, request)
@deal_router.post(
'/barcodes/get-pdf',
operation_id='get_deal_products_barcodes_pdf',
response_model=GetDealProductsBarcodesPdfResponse
)
async def get_deal_products_barcodes_pdf(
request: GetDealProductsBarcodesPdfRequest,
session: Annotated[AsyncSession, Depends(get_session)]
):
filename, pdf_buffer = await BarcodeService(session).get_deal_barcodes_pdf(request)
pdf_buffer: BytesIO
base64_string = base64.b64encode(pdf_buffer.read()).decode('utf-8')
return GetDealProductsBarcodesPdfResponse(
base64_string=base64_string,
filename=filename,
mime_type='application/pdf'
)
# endregion

View File

@@ -3,77 +3,77 @@ from fastapi import APIRouter, Depends
from backend.dependecies import SessionDependency, CurrentUserDependency
from schemas.group import *
from services.auth import authorized_user
from services.deal_group import DealGroupService
from services.card_group import CardGroupService
deal_group_router = APIRouter(
prefix='/deal-group',
tags=['deal-group'],
card_group_router = APIRouter(
prefix='/card-group',
tags=['card-group'],
)
@deal_group_router.patch(
@card_group_router.patch(
'/',
response_model=DealGroupUpdateResponse,
operation_id='update_deal_group',
response_model=CardGroupUpdateResponse,
operation_id='update_card_group',
dependencies=[Depends(authorized_user)]
)
async def update_group(
request: DealGroupUpdateRequest,
request: CardGroupUpdateRequest,
session: SessionDependency,
):
return await DealGroupService(session).update_group(request)
return await CardGroupService(session).update_group(request)
@deal_group_router.post(
@card_group_router.post(
'/',
response_model=DealCreateGroupResponse,
operation_id='create_deal_group',
response_model=CardCreateGroupResponse,
operation_id='create_card_group',
dependencies=[Depends(authorized_user)]
)
async def create_group(
request: DealCreateGroupRequest,
request: CreateCardGroupRequest,
session: SessionDependency,
user: CurrentUserDependency
):
return await DealGroupService(session).create_group(user, request)
return await CardGroupService(session).create_group(user, request)
@deal_group_router.patch(
@card_group_router.patch(
'/change-status',
response_model=DealGroupChangeStatusResponse,
response_model=CardGroupChangeStatusResponse,
operation_id='change_status',
dependencies=[Depends(authorized_user)]
)
async def change_status(
request: DealGroupChangeStatusRequest,
request: CardGroupChangeStatusRequest,
session: SessionDependency,
user: CurrentUserDependency
):
return await DealGroupService(session).change_group_status(user,request)
return await CardGroupService(session).change_group_status(user,request)
@deal_group_router.post(
'/deal',
response_model=DealAddToGroupResponse,
operation_id='add_deal',
@card_group_router.post(
'/card',
response_model=CardAddToGroupResponse,
operation_id='add_card',
dependencies=[Depends(authorized_user)]
)
async def add_deal(
request: DealAddToGroupRequest,
async def add_card(
request: CardAddToGroupRequest,
session: SessionDependency,
user: CurrentUserDependency
):
return await DealGroupService(session).add_deal(user, request)
return await CardGroupService(session).add_card(user, request)
@deal_group_router.delete(
'/deal',
response_model=DealRemoveFromGroupResponse,
operation_id='remove_deal',
@card_group_router.delete(
'/card',
response_model=CardRemoveFromGroupResponse,
operation_id='remove_card',
dependencies=[Depends(authorized_user)]
)
async def remove_deal(
request: DealRemoveFromGroupRequest,
async def remove_card(
request: CardRemoveFromGroupRequest,
session: SessionDependency,
):
return await DealGroupService(session).remove_deal(request)
return await CardGroupService(session).remove_card(request)

View File

@@ -11,7 +11,6 @@ from services.project import ProjectService
project_router = APIRouter(
prefix="/project",
tags=["project"],
dependencies=[Depends(guest_user)]
)
@@ -63,3 +62,38 @@ async def delete_project(
project_id: int,
):
return await ProjectService(session).delete_project(project_id)
@project_router.get(
"/modules",
response_model=GetAllModulesResponse,
operation_id="get_all_modules",
)
async def get_all_modules(
session: Annotated[AsyncSession, Depends(get_session)],
):
return await ProjectService(session).get_all_modules()
@project_router.post(
"/modules",
response_model=UpdateModulesResponse,
operation_id="update_project_modules",
)
async def update_project_modules(
session: Annotated[AsyncSession, Depends(get_session)],
request: UpdateModulesRequest,
):
return await ProjectService(session).update_project_modules(request)
@project_router.post(
"/attributes",
response_model=UpdateAttributesResponse,
operation_id="update_project_attributes",
)
async def update_project_attributes(
session: Annotated[AsyncSession, Depends(get_session)],
request: UpdateAttributesRequest,
):
return await ProjectService(session).update_project_attributes(request)

View File

@@ -15,16 +15,16 @@ shipping_router = APIRouter(
@shipping_router.post(
'/pallet/{deal_id}',
'/pallet/{card_id}',
response_model=CreatePalletResponse,
operation_id='create_pallet',
dependencies=[Depends(authorized_user)],
)
async def create_pallet(
session: SessionDependency,
deal_id: int,
card_id: int,
):
return await ShippingService(session).create_pallet(deal_id)
return await ShippingService(session).create_pallet(card_id)
@shipping_router.delete(
@@ -68,15 +68,15 @@ async def delete_shipping_product(
@shipping_router.post(
'/box',
response_model=UpdateBoxResponse,
operation_id='update_box',
response_model=CreateBoxResponse,
operation_id='create_box',
dependencies=[Depends(authorized_user)],
)
async def update_box(
async def create_box(
session: SessionDependency,
request: UpdateBoxRequest,
request: CreateBoxRequest,
):
return await ShippingService(session).update_box(request)
return await ShippingService(session).create_box(request)
@shipping_router.delete(