diff --git a/app/services/letzshop/order_service.py b/app/services/letzshop/order_service.py index 46e75063..000b9944 100644 --- a/app/services/letzshop/order_service.py +++ b/app/services/letzshop/order_service.py @@ -619,6 +619,11 @@ class LetzshopOrderService: """ jobs = [] + # Fetch vendor info once for all jobs + vendor = self.get_vendor(vendor_id) + vendor_name = vendor.name if vendor else None + vendor_code = vendor.vendor_code if vendor else None + # Historical order imports from letzshop_historical_import_jobs if job_type in (None, "historical_import"): hist_query = self.db.query(LetzshopHistoricalImportJob).filter( @@ -646,6 +651,9 @@ class LetzshopOrderService: "records_succeeded": (job.orders_imported or 0) + (job.orders_updated or 0), "records_failed": job.orders_skipped or 0, + "vendor_id": vendor_id, + "vendor_name": vendor_name, + "vendor_code": vendor_code, "current_phase": job.current_phase, "error_message": job.error_message, } @@ -679,6 +687,9 @@ class LetzshopOrderService: "records_succeeded": (job.imported_count or 0) + (job.updated_count or 0), "records_failed": job.error_count or 0, + "vendor_id": vendor_id, + "vendor_name": vendor_name, + "vendor_code": vendor_code, } ) @@ -705,6 +716,9 @@ class LetzshopOrderService: "records_processed": log.records_processed or 0, "records_succeeded": log.records_succeeded or 0, "records_failed": log.records_failed or 0, + "vendor_id": vendor_id, + "vendor_name": vendor_name, + "vendor_code": vendor_code, "error_details": log.error_details, } ) @@ -734,6 +748,9 @@ class LetzshopOrderService: "records_processed": log.records_processed or 0, "records_succeeded": log.records_succeeded or 0, "records_failed": log.records_failed or 0, + "vendor_id": vendor_id, + "vendor_name": vendor_name, + "vendor_code": vendor_code, "error_details": log.error_details, # Include export file details } ) diff --git a/app/tasks/background_tasks.py b/app/tasks/background_tasks.py index cd9fa078..700e1340 100644 --- a/app/tasks/background_tasks.py +++ b/app/tasks/background_tasks.py @@ -5,6 +5,7 @@ import logging from datetime import UTC, datetime from app.core.database import SessionLocal +from app.services.admin_notification_service import admin_notification_service from app.utils.csv_processor import CSVProcessor from models.database.marketplace_import_job import MarketplaceImportJob from models.database.vendor import Vendor @@ -88,6 +89,16 @@ async def process_marketplace_import( job.status = "completed_with_errors" job.error_message = f"{result['errors']} rows had errors" + # Notify admin if error count is significant + if result.get("errors", 0) >= 5: + admin_notification_service.notify_import_failure( + db=db, + vendor_name=vendor.name, + job_id=job_id, + error_message=f"Import completed with {result['errors']} errors out of {result['total_processed']} rows", + vendor_id=vendor_id, + ) + db.commit() logger.info( f"Import job {job_id} completed: " @@ -102,6 +113,17 @@ async def process_marketplace_import( job.status = "failed" job.error_message = str(e) job.completed_at = datetime.now(UTC) + + # Create admin notification for import failure + vendor_name = vendor.name if vendor else f"Vendor {vendor_id}" + admin_notification_service.notify_import_failure( + db=db, + vendor_name=vendor_name, + job_id=job_id, + error_message=str(e)[:200], # Truncate long errors + vendor_id=vendor_id, + ) + db.commit() except Exception as commit_error: logger.error(f"Failed to update job status: {commit_error}") diff --git a/app/tasks/letzshop_tasks.py b/app/tasks/letzshop_tasks.py index b6bfc963..e3e23424 100644 --- a/app/tasks/letzshop_tasks.py +++ b/app/tasks/letzshop_tasks.py @@ -6,6 +6,7 @@ from datetime import UTC, datetime from typing import Callable from app.core.database import SessionLocal +from app.services.admin_notification_service import admin_notification_service from app.services.letzshop import LetzshopClientError from app.services.letzshop.credentials_service import LetzshopCredentialsService from app.services.letzshop.order_service import LetzshopOrderService @@ -207,6 +208,20 @@ def process_historical_import(job_id: int, vendor_id: int): job.status = "failed" job.error_message = f"Letzshop API error: {e}" job.completed_at = datetime.now(UTC) + + # Get vendor name for notification + order_service = _get_order_service(db) + vendor = order_service.get_vendor(vendor_id) + vendor_name = vendor.name if vendor else f"Vendor {vendor_id}" + + # Create admin notification for sync failure + admin_notification_service.notify_order_sync_failure( + db=db, + vendor_name=vendor_name, + error_message=f"Historical import failed: {str(e)[:150]}", + vendor_id=vendor_id, + ) + db.commit() creds_service = _get_credentials_service(db) @@ -222,6 +237,20 @@ def process_historical_import(job_id: int, vendor_id: int): job.status = "failed" job.error_message = str(e) job.completed_at = datetime.now(UTC) + + # Get vendor name for notification + order_service = _get_order_service(db) + vendor = order_service.get_vendor(vendor_id) + vendor_name = vendor.name if vendor else f"Vendor {vendor_id}" + + # Create admin notification for critical error + admin_notification_service.notify_critical_error( + db=db, + error_type="Historical Import", + error_message=f"Import job {job_id} failed for {vendor_name}: {str(e)[:150]}", + details={"job_id": job_id, "vendor_id": vendor_id, "vendor_name": vendor_name}, + ) + db.commit() except Exception as commit_error: logger.error(f"Job {job_id}: Failed to update job status: {commit_error}") diff --git a/app/templates/admin/partials/letzshop-jobs-table.html b/app/templates/admin/partials/letzshop-jobs-table.html index bcab54ed..034ef720 100644 --- a/app/templates/admin/partials/letzshop-jobs-table.html +++ b/app/templates/admin/partials/letzshop-jobs-table.html @@ -52,6 +52,7 @@ ID + Vendor Type Status Records @@ -63,7 +64,7 @@