Merge remote-tracking branch 'origin/cards'
This commit is contained in:
		@@ -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
									
								
							
							
						
						
									
										77
									
								
								routers/attribute.py
									
									
									
									
									
										Normal 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)
 | 
			
		||||
@@ -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
									
								
							
							
						
						
									
										522
									
								
								routers/card.py
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										63
									
								
								routers/card_tag.py
									
									
									
									
									
										Normal 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)
 | 
			
		||||
							
								
								
									
										486
									
								
								routers/deal.py
									
									
									
									
									
								
							
							
						
						
									
										486
									
								
								routers/deal.py
									
									
									
									
									
								
							@@ -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
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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(
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user