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 @@
Loading jobs...
No jobs found
Import products or sync orders to see job history
@@ -83,6 +84,9 @@