From abf0219587151f1c825518fd46f04c00e35f0c4d Mon Sep 17 00:00:00 2001 From: amee Date: Mon, 20 Apr 2026 11:10:03 +0530 Subject: [PATCH] fix: tenant subs plan expired logic --- app/middleware/auth_middleware.py | 4 +-- app/services/auth/tenant_service.py | 43 +++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/app/middleware/auth_middleware.py b/app/middleware/auth_middleware.py index 02deae3..c95e70c 100644 --- a/app/middleware/auth_middleware.py +++ b/app/middleware/auth_middleware.py @@ -60,7 +60,7 @@ def get_current_user( ) today = datetime.now(timezone.utc).date() - if tenant.end_date and tenant.end_date < today and tenant.status != "EXPIRED": + if tenant.end_date and tenant.end_date <= today and tenant.status != "EXPIRED": tenant.status = "EXPIRED" tenant.is_active = False db.commit() @@ -142,4 +142,4 @@ def require_access_hierarchical(access_code: str): ) return True - return check_permission \ No newline at end of file + return check_permission diff --git a/app/services/auth/tenant_service.py b/app/services/auth/tenant_service.py index 37533f6..9d4f07f 100644 --- a/app/services/auth/tenant_service.py +++ b/app/services/auth/tenant_service.py @@ -51,7 +51,7 @@ class TenantService: ) normalized_status = TenantService._normalize_status(status_value, is_active) - if end_date and end_date < TenantService._today(): + if end_date and end_date <= TenantService._today(): return TenantService.STATUS_EXPIRED, False if normalized_status in { TenantService.STATUS_INACTIVE, @@ -60,6 +60,24 @@ class TenantService: return normalized_status, False return normalized_status, True + @staticmethod + def _sync_tenant_lifecycle(tenant: Tenant) -> bool: + resolved_status, resolved_is_active = TenantService._resolve_lifecycle( + start_date=tenant.start_date, + end_date=tenant.end_date, + status_value=tenant.status, + is_active=tenant.is_active, + ) + + changed = ( + tenant.status != resolved_status + or tenant.is_active != resolved_is_active + ) + if changed: + tenant.status = resolved_status + tenant.is_active = resolved_is_active + return changed + @staticmethod def create_tenant(db: Session, tenant_data: TenantCreate) -> Tenant: existing = db.query(Tenant).filter(Tenant.tenant_name == tenant_data.tenant_name).first() @@ -217,7 +235,15 @@ class TenantService: @staticmethod def get_all_tenants(db: Session): - return db.query(Tenant).all() + tenants = db.query(Tenant).all() + changed = False + for tenant in tenants: + changed = TenantService._sync_tenant_lifecycle(tenant) or changed + if changed: + db.commit() + for tenant in tenants: + db.refresh(tenant) + return tenants @staticmethod def get_tenant_by_id(db: Session, tenant_id: uuid.UUID) -> Tenant: @@ -227,6 +253,9 @@ class TenantService: status_code=status.HTTP_404_NOT_FOUND, detail="Tenant not found" ) + if TenantService._sync_tenant_lifecycle(tenant): + db.commit() + db.refresh(tenant) return tenant @staticmethod @@ -518,6 +547,14 @@ class TenantService: offset = (page - 1) * page_size tenants = query.offset(offset).limit(page_size).all() + changed = False + for tenant in tenants: + changed = TenantService._sync_tenant_lifecycle(tenant) or changed + if changed: + db.commit() + for tenant in tenants: + db.refresh(tenant) + total_pages = (total + page_size - 1) // page_size if total > 0 else 0 return TenantPaginatedResponse( @@ -526,4 +563,4 @@ class TenantService: page=page, page_size=page_size, total_pages=total_pages, - ) \ No newline at end of file + )