From 727d979145f6b903d94e4dd62807c87c0bae683d Mon Sep 17 00:00:00 2001 From: deepvasoya Date: Tue, 20 May 2025 14:54:53 +0530 Subject: [PATCH] fix: clinic approval flow api --- apis/endpoints/admin.py | 2 +- main.py | 8 +-- .../497238c0338d_file_verification_table.py | 33 +++++++++ .../ec157808ef2a_file_verification_table.py | 33 +++++++++ models/ClinicFileVerifications.py | 6 +- schemas/UpdateSchemas.py | 1 + services/clinicServices.py | 69 ++++++++++++++----- 7 files changed, 128 insertions(+), 24 deletions(-) create mode 100644 migrations/versions/497238c0338d_file_verification_table.py create mode 100644 migrations/versions/ec157808ef2a_file_verification_table.py diff --git a/apis/endpoints/admin.py b/apis/endpoints/admin.py index b44cd2a..56622a8 100644 --- a/apis/endpoints/admin.py +++ b/apis/endpoints/admin.py @@ -9,5 +9,5 @@ router = APIRouter() @router.put("/clinic/status") def update_clinic_status(req:Request, data: ClinicStatusUpdate): - response = ClinicServices().update_clinic_status(req.state.user, data.clinic_id, data.status) + response = ClinicServices().update_clinic_status(req.state.user, data.clinic_id, data.status, data.documentStatus, data.rejection_reason) return ApiResponse(data=response, message="Clinic status updated successfully") diff --git a/main.py b/main.py index a3dbfd6..a0c82cf 100644 --- a/main.py +++ b/main.py @@ -52,10 +52,10 @@ app = FastAPI( # CORS middleware app.add_middleware( CORSMiddleware, - allow_origins=["*"], # Allows all origins - allow_credentials=True, - allow_methods=["*"], # Allows all methods - allow_headers=["*"], # Allows all headers + allow_origins=["*"], + allow_methods=["*"], + allow_headers=["*"], + expose_headers=["*"], ) # Custom request type middleware diff --git a/migrations/versions/497238c0338d_file_verification_table.py b/migrations/versions/497238c0338d_file_verification_table.py new file mode 100644 index 0000000..7a56703 --- /dev/null +++ b/migrations/versions/497238c0338d_file_verification_table.py @@ -0,0 +1,33 @@ +"""file-verification-table + +Revision ID: 497238c0338d +Revises: ad47f4af583e +Create Date: 2025-05-19 16:34:54.211429 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '497238c0338d' +down_revision: Union[str, None] = 'ad47f4af583e' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + # op.add_column('clinic_file_verifications', sa.Column('rejection_reason', sa.String(length=255), nullable=True)) + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('clinic_file_verifications', 'rejection_reason') + # ### end Alembic commands ### diff --git a/migrations/versions/ec157808ef2a_file_verification_table.py b/migrations/versions/ec157808ef2a_file_verification_table.py new file mode 100644 index 0000000..8f7a8ef --- /dev/null +++ b/migrations/versions/ec157808ef2a_file_verification_table.py @@ -0,0 +1,33 @@ +"""file-verification-table + +Revision ID: ec157808ef2a +Revises: 497238c0338d +Create Date: 2025-05-19 17:16:52.137111 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'ec157808ef2a' +down_revision: Union[str, None] = '497238c0338d' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + # op.add_column('clinic_file_verifications', sa.Column('logo_is_verified', sa.Boolean(), nullable=True)) + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('clinic_file_verifications', 'logo_is_verified') + # ### end Alembic commands ### diff --git a/models/ClinicFileVerifications.py b/models/ClinicFileVerifications.py index 14503af..3495082 100644 --- a/models/ClinicFileVerifications.py +++ b/models/ClinicFileVerifications.py @@ -8,9 +8,9 @@ class ClinicFileVerifications(Base, CustomBase): id = Column(Integer, primary_key=True, index=True) clinic_id = Column(Integer, ForeignKey("clinics.id"), nullable=False) - logo_is_verified = Column(Boolean, default=False) - abn_doc_is_verified = Column(Boolean, default=False) - contract_doc_is_verified = Column(Boolean, default=False) + logo_is_verified = Column(Boolean, default=None, nullable=True) + abn_doc_is_verified = Column(Boolean, default=None, nullable=True) + contract_doc_is_verified = Column(Boolean, default=None, nullable=True) last_changed_by = Column(Integer, ForeignKey("users.id"), nullable=False) rejection_reason = Column(String(255), nullable=True) diff --git a/schemas/UpdateSchemas.py b/schemas/UpdateSchemas.py index c2998f9..9979269 100644 --- a/schemas/UpdateSchemas.py +++ b/schemas/UpdateSchemas.py @@ -32,6 +32,7 @@ class ClinicStatusUpdate(BaseModel): clinic_id: int status: ClinicStatus rejection_reason: Optional[str] = None + documentStatus: Optional[dict] = None class SignupPricingMasterUpdate(SignupPricingMasterBase): pass diff --git a/services/clinicServices.py b/services/clinicServices.py index e26e784..88d764c 100644 --- a/services/clinicServices.py +++ b/services/clinicServices.py @@ -3,7 +3,7 @@ from sqlalchemy.orm import Session, joinedload from models import Clinics from schemas.UpdateSchemas import ClinicStatusUpdate, ClinicUpdate from schemas.ResponseSchemas import Clinic -from typing import List, Literal, Union +from typing import List, Literal, Optional, Union from exceptions import ResourceNotFoundException from enums.enums import ClinicStatus, UserType from exceptions.unauthorized_exception import UnauthorizedException @@ -191,26 +191,63 @@ class ClinicServices: return counts - def update_clinic_status(self, user, clinic_id: int, status: ClinicStatus): + def update_clinic_status(self, user, clinic_id: int, status: ClinicStatus, documentStatus: Optional[dict] = None, rejection_reason: Optional[str] = None): + try: + if user["userType"] != UserType.SUPER_ADMIN: + raise UnauthorizedException("You are not authorized to update clinic status") - if user["userType"] != UserType.SUPER_ADMIN: - raise UnauthorizedException("You are not authorized to update clinic status") + clinic = self.db.query(Clinics).filter(Clinics.id == clinic_id).first() - clinic = self.db.query(Clinics).filter(Clinics.id == clinic_id).first() + if clinic is None: + raise ResourceNotFoundException("Clinic not found") - if clinic is None: - raise ResourceNotFoundException("Clinic not found") + clinic.status = status + self.db.add(clinic) + self.db.commit() + self.db.refresh(clinic) - clinic.status = status - self.db.add(clinic) - self.db.commit() - self.db.refresh(clinic) + if clinic.status == ClinicStatus.ACTIVE: + clinic_file_verification = self.db.query(ClinicFileVerifications).filter(ClinicFileVerifications.clinic_id == clinic_id).first() - clinic_response = Clinic(**clinic.__dict__.copy()) + clinic_file_verification.logo_is_verified = True + clinic_file_verification.abn_doc_is_verified = True + clinic_file_verification.contract_doc_is_verified = True - # if rejected then email to clinic creator - if clinic.status == ClinicStatus.REJECTED: - pass + self.db.add(clinic_file_verification) + self.db.commit() - return clinic_response + + if clinic.status == ClinicStatus.REJECTED or clinic.status == ClinicStatus.UNDER_REVIEW: + clinic_file_verification = self.db.query(ClinicFileVerifications).filter(ClinicFileVerifications.clinic_id == clinic_id).first() + + + if documentStatus and "LOGO" in documentStatus: + clinic_file_verification.logo_is_verified = documentStatus.get("LOGO") + clinic_file_verification.rejection_reason = rejection_reason + + if documentStatus and "ABN" in documentStatus: + clinic_file_verification.abn_doc_is_verified = documentStatus.get("ABN") + clinic_file_verification.rejection_reason = rejection_reason + + if documentStatus and "CONTRACT" in documentStatus: + clinic_file_verification.contract_doc_is_verified = documentStatus.get("CONTRACT") + clinic_file_verification.rejection_reason = rejection_reason + + + self.db.add(clinic_file_verification) + self.db.commit() + + + # if rejected or under review then email to clinic creator + if clinic.status == ClinicStatus.REJECTED or clinic.status == ClinicStatus.UNDER_REVIEW: + pass + + # handle inactive status + if clinic.status == ClinicStatus.INACTIVE: + pass + + return + except Exception as e: + print(e) + raise Exception(e) \ No newline at end of file