156 lines
6.0 KiB
Python
156 lines
6.0 KiB
Python
from fastapi import APIRouter, HTTPException, Depends, Query
|
|
from typing import List
|
|
from datetime import datetime
|
|
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):
|
|
LAST_WEEK = "LastWeek"
|
|
LAST_MONTH = "LastMonth"
|
|
LAST_THREE_MONTHS = "LastThreeMonths"
|
|
LAST_FOUR_MONTHS = "LastFourMonths"
|
|
LAST_TWO_YEARS = "LastTwoYears"
|
|
|
|
class LabelType(str, Enum):
|
|
DK1201 = "dk1201"
|
|
DK1241 = "dk1241"
|
|
|
|
# Initialize service manager
|
|
service_manager = ServiceManager()
|
|
|
|
# Initialize router
|
|
router = APIRouter(prefix="/orders")
|
|
|
|
@router.get("/", response_model=List[TCGPlayerAPIOrderSummary])
|
|
async def get_orders(
|
|
search_range: SearchRange = SearchRange.LAST_THREE_MONTHS,
|
|
open_only: bool = False
|
|
) -> List[TCGPlayerAPIOrderSummary]:
|
|
"""
|
|
Retrieve orders from TCGPlayer based on search criteria.
|
|
|
|
Args:
|
|
search_range: Time range to search for orders
|
|
open_only: Whether to only return open orders
|
|
|
|
Returns:
|
|
List of orders matching the search criteria
|
|
"""
|
|
try:
|
|
order_management = service_manager.get_service('order_management')
|
|
orders = await order_management.get_orders(search_range, open_only)
|
|
return orders
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=f"Failed to fetch orders: {str(e)}")
|
|
|
|
@router.get("/{order_id}", response_model=TCGPlayerAPIOrder)
|
|
async def get_order(order_id: str) -> TCGPlayerAPIOrder:
|
|
"""
|
|
Retrieve a specific order by ID.
|
|
|
|
Args:
|
|
order_id: The TCGPlayer order number
|
|
|
|
Returns:
|
|
The requested order details
|
|
"""
|
|
try:
|
|
order_management = service_manager.get_service('order_management')
|
|
order = await order_management.get_order(order_id)
|
|
if not order:
|
|
raise HTTPException(status_code=404, detail=f"Order {order_id} not found")
|
|
return order
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=f"Failed to fetch order: {str(e)}")
|
|
|
|
@router.post("/generate-pull-sheets", response_model=GenerateResponse)
|
|
async def generate_pull_sheets(
|
|
request: GeneratePullSheetsRequest,
|
|
db: Session = Depends(get_db)
|
|
) -> GenerateResponse:
|
|
"""
|
|
Generate and print pull sheets for the specified orders.
|
|
|
|
Args:
|
|
request: Dictionary containing:
|
|
- order_ids: List of TCGPlayer order numbers
|
|
|
|
Returns:
|
|
Success status of the operation
|
|
"""
|
|
try:
|
|
pull_sheet_service = service_manager.get_service('pull_sheet')
|
|
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.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", response_model=GenerateResponse)
|
|
async def generate_packing_slips(
|
|
request: GeneratePackingSlipsRequest,
|
|
db: Session = Depends(get_db)
|
|
) -> GenerateResponse:
|
|
"""
|
|
Generate and print packing slips for the specified orders.
|
|
|
|
Args:
|
|
request: Dictionary containing:
|
|
- order_ids: List of TCGPlayer order numbers
|
|
"""
|
|
try:
|
|
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 slips: {str(e)}")
|
|
|
|
@router.post("/generate-address-labels")
|
|
async def generate_address_labels(
|
|
request: GenerateAddressLabelsRequest,
|
|
db: Session = Depends(get_db)
|
|
) -> GenerateResponse:
|
|
"""
|
|
Generate and print address labels for the specified orders.
|
|
|
|
Args:
|
|
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:
|
|
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)}")
|