feat: end-point for pdf of all deal's barcodes, client and marketplace info in bill of payment

This commit is contained in:
2024-09-28 19:38:06 +04:00
parent d9c43624c0
commit 489f65a087
8 changed files with 169 additions and 57 deletions

View File

@@ -1,10 +1,12 @@
from typing import Dict
from sqlalchemy import select, update, insert
from sqlalchemy.orm import selectinload, joinedload
from barcodes.attributes import AttributeWriterFactory
from barcodes.generator.default_generator import DefaultBarcodeGenerator
from models import BarcodeTemplate, BarcodeTemplateAttribute, barcode_template_attribute_link, Product, \
BarcodeTemplateAdditionalField, BarcodeTemplateSize
BarcodeTemplateAdditionalField, BarcodeTemplateSize, Deal, DealProduct
from schemas.barcode import *
from services.base import BaseService
@@ -91,13 +93,50 @@ class BarcodeService(BaseService):
default_generator = DefaultBarcodeGenerator()
filename = f'{product.id}_barcode.pdf'
pdf_buffer = default_generator.generate(
request.barcode,
product,
barcode_template,
request.quantity
[{
"barcode": request.barcode,
"product": product,
"template": barcode_template,
"quantity": request.quantity
}]
)
return filename, pdf_buffer
async def get_deal_barcodes_pdf(self, request: GetDealProductsBarcodesPdfRequest) -> GetProductBarcodeResponse:
stmt = (
select(Deal)
.options(
selectinload(Deal.products).joinedload(DealProduct.product).selectinload(Product.client),
selectinload(Deal.products).joinedload(DealProduct.product).joinedload(Product.barcodes)
)
.filter(Deal.id == request.deal_id)
)
query = await self.session.execute(stmt)
deal: Deal = query.scalar()
if not deal:
raise ValueError('Сделка не найдена')
barcodes_data: List[Dict[str, str | Product | BarcodeTemplate | int]] = []
for deal_product in deal.products:
product_request = GetProductBarcodeRequest(
product_id=deal_product.product_id,
barcode="",
barcode_template_id=deal_product.product.barcode_template_id,
)
barcode_template = await self._get_barcode_template(product_request, deal_product.product)
barcodes_data.append({
"barcode": deal_product.product.barcodes[0].barcode,
"product": deal_product.product,
"template": barcode_template,
"quantity": deal_product.quantity
})
default_generator = DefaultBarcodeGenerator()
filename = f'{deal.id}_deal_barcodes.pdf'
pdf_buffer = default_generator.generate(barcodes_data)
return filename, pdf_buffer
# endregion
# region Template

View File

@@ -4,7 +4,7 @@ from typing import List
from fastapi import HTTPException
from number_to_string import get_string_by_number
from sqlalchemy import select
from sqlalchemy.orm import selectinload
from sqlalchemy.orm import selectinload, joinedload
from starlette import status
from weasyprint import HTML, CSS
@@ -168,6 +168,8 @@ class BillingService(BaseService):
.options(
selectinload(Deal.products).selectinload(DealProduct.services),
selectinload(Deal.services).selectinload(DealServiceModel.service),
joinedload(Deal.shipping_warehouse),
joinedload(Deal.client),
)
)