515 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			515 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import base64
 | 
						|
from io import BytesIO
 | 
						|
from typing import Annotated
 | 
						|
 | 
						|
from fastapi import APIRouter, Depends, Response
 | 
						|
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 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(
 | 
						|
    '/create',
 | 
						|
    dependencies=[Depends(authorized_user)]
 | 
						|
)
 | 
						|
async def create(
 | 
						|
        request: DealCreateRequest,
 | 
						|
        session: Annotated[AsyncSession, Depends(get_session)],
 | 
						|
        user: Annotated[User, Depends(get_current_user)]
 | 
						|
):
 | 
						|
    return await DealService(session).create(request, user)
 | 
						|
 | 
						|
 | 
						|
@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)]
 | 
						|
):
 | 
						|
    return await DealService(session).update_general_info(request)
 | 
						|
 | 
						|
 | 
						|
@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)
 | 
						|
 | 
						|
 | 
						|
# 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
 | 
						|
 | 
						|
# region Deal groups
 | 
						|
@deal_router.post(
 | 
						|
    '/add-to-group',
 | 
						|
    response_model=DealAddToGroupResponse,
 | 
						|
    operation_id='add_deal_to_group',
 | 
						|
    dependencies=[Depends(authorized_user)]
 | 
						|
)
 | 
						|
async def add_to_group(
 | 
						|
        request: DealAddToGroupRequest,
 | 
						|
        session: SessionDependency,
 | 
						|
        user: CurrentUserDependency
 | 
						|
):
 | 
						|
    return await DealService(session).add_to_group(user, request)
 | 
						|
 | 
						|
@deal_router.post(
 | 
						|
    '/create-group',
 | 
						|
    response_model=DealCreateGroupResponse,
 | 
						|
    operation_id='create_deal_group',
 | 
						|
    dependencies=[Depends(authorized_user)]
 | 
						|
)
 | 
						|
async def create_group(
 | 
						|
        request: DealCreateGroupRequest,
 | 
						|
        session: SessionDependency,
 | 
						|
        user: CurrentUserDependency
 | 
						|
):
 | 
						|
    return await DealService(session).create_group(user, request)
 | 
						|
 | 
						|
 | 
						|
@deal_router.post(
 | 
						|
    '/remove-from-group',
 | 
						|
    response_model=DealRemoveFromGroupResponse,
 | 
						|
    operation_id='remove_deal_from_group',
 | 
						|
    dependencies=[Depends(authorized_user)]
 | 
						|
)
 | 
						|
async def remove_from_group(
 | 
						|
        request: DealRemoveFromGroupRequest,
 | 
						|
        session: SessionDependency,
 | 
						|
):
 | 
						|
    return await DealService(session).remove_from_group( request)
 | 
						|
 | 
						|
# route to update group name
 | 
						|
@deal_router.post(
 | 
						|
    '/group/update',
 | 
						|
    response_model=DealGroupUpdateResponse,
 | 
						|
    operation_id='update_deal_group',
 | 
						|
    dependencies=[Depends(authorized_user)]
 | 
						|
)
 | 
						|
async def update_group(
 | 
						|
        request: DealGroupUpdateRequest,
 | 
						|
        session: SessionDependency,
 | 
						|
):
 | 
						|
    return await DealService(session).update_group(request)
 | 
						|
 | 
						|
# route to change group status
 | 
						|
@deal_router.post(
 | 
						|
    '/group/change-status',
 | 
						|
    response_model=DealGroupChangeStatusResponse,
 | 
						|
    operation_id='change_deal_group_status',
 | 
						|
    dependencies=[Depends(authorized_user)]
 | 
						|
)
 | 
						|
async def change_group_status(
 | 
						|
        request: DealGroupChangeStatusRequest,
 | 
						|
        session: SessionDependency,
 | 
						|
        user: CurrentUserDependency
 | 
						|
):
 | 
						|
    return await DealService(session).change_group_status(user,request)
 | 
						|
# endregion
 |