kind of a mess lol but file caching and front end
This commit is contained in:
@ -1,15 +1,12 @@
|
||||
from fastapi import APIRouter, HTTPException, Depends, Query
|
||||
from app.services.external_api.tcgplayer.order_management_service import OrderManagementService
|
||||
from app.services.label_printer_service import LabelPrinterService
|
||||
from app.services.regular_printer_service import RegularPrinterService
|
||||
from app.services.address_label_service import AddressLabelService
|
||||
from typing import List, Optional, Literal
|
||||
from typing import List
|
||||
from datetime import datetime
|
||||
from pydantic import BaseModel, Field
|
||||
from enum import Enum
|
||||
from app.schemas.tcgplayer import TCGPlayerAPIOrderSummary, TCGPlayerAPIOrder
|
||||
from app.schemas.generate import GenerateRequest, GenerateAddressLabelsRequest, GeneratePackingSlipsRequest, GeneratePullSheetsRequest, GenerateResponse
|
||||
from app.services.service_manager import ServiceManager
|
||||
|
||||
from sqlalchemy.orm import Session
|
||||
from app.db.database import get_db
|
||||
|
||||
|
||||
class SearchRange(str, Enum):
|
||||
@ -73,142 +70,86 @@ async def get_order(order_id: str) -> TCGPlayerAPIOrder:
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"Failed to fetch order: {str(e)}")
|
||||
|
||||
@router.post("/generate-pull-sheets")
|
||||
@router.post("/generate-pull-sheets", response_model=GenerateResponse)
|
||||
async def generate_pull_sheets(
|
||||
order_ids: Optional[List[str]] = None,
|
||||
all_open_orders: bool = False
|
||||
) -> dict:
|
||||
request: GeneratePullSheetsRequest,
|
||||
db: Session = Depends(get_db)
|
||||
) -> GenerateResponse:
|
||||
"""
|
||||
Generate and print pull sheets for the specified orders.
|
||||
|
||||
Args:
|
||||
order_ids: List of TCGPlayer order numbers (optional if all_open_orders is True)
|
||||
all_open_orders: If True, generate pull sheets for all orders (ignores order_ids)
|
||||
request: Dictionary containing:
|
||||
- order_ids: List of TCGPlayer order numbers
|
||||
|
||||
Returns:
|
||||
Success status of the operation
|
||||
"""
|
||||
try:
|
||||
order_management = service_manager.get_service('order_management')
|
||||
if not all_open_orders and not order_ids:
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail="Either order_ids must be provided or all_open_orders must be True"
|
||||
)
|
||||
|
||||
if all_open_orders:
|
||||
order_ids = await order_management.get_order_ids(search_range="LastWeek", open_only=True)
|
||||
|
||||
pull_sheet = await order_management.get_pull_sheet(order_ids)
|
||||
pull_sheet_file = await order_management.save_file(
|
||||
pull_sheet,
|
||||
f"pull_sheet_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.csv"
|
||||
)
|
||||
pull_sheet_service = service_manager.get_service('pull_sheet')
|
||||
pull_sheet_pdf = await pull_sheet_service.generate_pull_sheet_pdf(pull_sheet_file)
|
||||
order_ids = request.order_ids
|
||||
|
||||
pull_sheet = await pull_sheet_service.get_or_create_rendered_pull_sheet(db, order_ids)
|
||||
|
||||
regular_printer = service_manager.get_service('regular_printer')
|
||||
success = await regular_printer.print_file(pull_sheet_pdf)
|
||||
return {"success": success}
|
||||
success = await regular_printer.print_file(pull_sheet.path)
|
||||
# TODO: change to accept file instead of path
|
||||
return {"success": success, "message": "Pull sheets generated and printed successfully"}
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"Failed to generate pull sheet: {str(e)}")
|
||||
|
||||
@router.post("/generate-packing-slips")
|
||||
@router.post("/generate-packing-slips", response_model=GenerateResponse)
|
||||
async def generate_packing_slips(
|
||||
order_ids: Optional[List[str]] = None,
|
||||
all_open_orders: bool = False
|
||||
) -> dict:
|
||||
request: GeneratePackingSlipsRequest,
|
||||
db: Session = Depends(get_db)
|
||||
) -> GenerateResponse:
|
||||
"""
|
||||
Generate and print packing slips for the specified orders.
|
||||
|
||||
Args:
|
||||
order_ids: List of TCGPlayer order numbers (optional if all_open_orders is True)
|
||||
all_open_orders: If True, generate packing slips for all orders (ignores order_ids)
|
||||
|
||||
Returns:
|
||||
Success status of the operation
|
||||
request: Dictionary containing:
|
||||
- order_ids: List of TCGPlayer order numbers
|
||||
"""
|
||||
try:
|
||||
if not all_open_orders and not order_ids:
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail="Either order_ids must be provided or all_open_orders must be True"
|
||||
)
|
||||
|
||||
# TODO: Add logic to fetch all orders when all_open_orders is True
|
||||
if all_open_orders:
|
||||
order_management = service_manager.get_service('order_management')
|
||||
order_ids = await order_management.get_order_ids(search_range="LastWeek", open_only=True)
|
||||
|
||||
packing_slip = await order_management.get_packing_slip(order_ids)
|
||||
packing_slip_file = await order_management.save_file(
|
||||
packing_slip,
|
||||
f"packing_slip_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.pdf"
|
||||
)
|
||||
label_printer = service_manager.get_service('label_printer')
|
||||
success = await label_printer.print_file(
|
||||
packing_slip_file,
|
||||
label_size="dk1241",
|
||||
label_type="packing_slip"
|
||||
)
|
||||
return {"success": success}
|
||||
order_management = service_manager.get_service('order_management')
|
||||
# get or create packing slips
|
||||
packing_slips = await order_management.get_or_create_packing_slip(db, request.order_ids)
|
||||
if packing_slips:
|
||||
# print packing slips
|
||||
label_printer = service_manager.get_service('label_printer')
|
||||
success = await label_printer.print_file(packing_slips.path, label_size="dk1241", label_type="packing_slip")
|
||||
return {"success": success, "message": "Packing slips generated and printed successfully"}
|
||||
return {"success": False, "message": "Packing slips not found"}
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"Failed to generate packing slip: {str(e)}")
|
||||
raise HTTPException(status_code=500, detail=f"Failed to generate packing slips: {str(e)}")
|
||||
|
||||
@router.post("/generate-address-labels")
|
||||
async def generate_address_labels(
|
||||
order_ids: Optional[List[str]] = None,
|
||||
all_open_orders: bool = False,
|
||||
label_type: LabelType = LabelType.DK1201
|
||||
) -> dict:
|
||||
request: GenerateAddressLabelsRequest,
|
||||
db: Session = Depends(get_db)
|
||||
) -> GenerateResponse:
|
||||
"""
|
||||
Generate and print address labels for the specified orders.
|
||||
|
||||
Args:
|
||||
order_ids: List of TCGPlayer order numbers (optional if all_open_orders is True)
|
||||
all_open_orders: If True, generate address labels for all orders (ignores order_ids)
|
||||
label_type: Type of label to generate (dk1201 or dk1241)
|
||||
request: Dictionary containing:
|
||||
- order_ids: List of TCGPlayer order numbers
|
||||
- label_type: Type of label to generate (dk1201 or dk1241)
|
||||
|
||||
Returns:
|
||||
Success status of the operation
|
||||
"""
|
||||
try:
|
||||
order_management = service_manager.get_service('order_management')
|
||||
if not all_open_orders and not order_ids:
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail="Either order_ids must be provided or all_open_orders must be True"
|
||||
)
|
||||
|
||||
if all_open_orders:
|
||||
order_ids = await order_management.get_order_ids(search_range="LastWeek", open_only=True)
|
||||
|
||||
shipping_csv = await order_management.get_shipping_csv(order_ids)
|
||||
shipping_csv_file = await order_management.save_file(
|
||||
shipping_csv,
|
||||
f"shipping_csv_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.csv"
|
||||
)
|
||||
|
||||
# Generate PDFs
|
||||
address_label = service_manager.get_service('address_label')
|
||||
pdf_files = await address_label.generate_labels_from_csv(
|
||||
shipping_csv_file,
|
||||
label_type=label_type
|
||||
)
|
||||
|
||||
# Print each PDF
|
||||
label_printer = service_manager.get_service('label_printer')
|
||||
for pdf_file in pdf_files:
|
||||
success = await label_printer.print_file(
|
||||
pdf_file,
|
||||
label_size=label_type,
|
||||
label_type="address_label"
|
||||
)
|
||||
if not success:
|
||||
raise HTTPException(
|
||||
status_code=500,
|
||||
detail=f"Failed to print address label for file {pdf_file}"
|
||||
)
|
||||
|
||||
return {"success": True, "message": "Address labels generated and printed successfully"}
|
||||
address_label_service = service_manager.get_service('address_label')
|
||||
address_labels = await address_label_service.get_or_create_address_labels(db, request.order_ids, request.label_type)
|
||||
if address_labels:
|
||||
# print address labels
|
||||
label_printer = service_manager.get_service('label_printer')
|
||||
for address_label in address_labels:
|
||||
success = await label_printer.print_file(address_label.path, label_size=request.label_type, label_type="address_label")
|
||||
if not success:
|
||||
return {"success": False, "message": "Address labels not found"}
|
||||
return {"success": True, "message": "Address labels generated and printed successfully"}
|
||||
return {"success": False, "message": "Address labels not found"}
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"Failed to generate address labels: {str(e)}")
|
||||
raise HTTPException(status_code=500, detail=f"Failed to generate address labels: {str(e)}")
|
||||
|
Reference in New Issue
Block a user