def test_all_other_applications_rejected_on_application_completed_ok( session: Session, application: Application, new_apartment_applications: List[ApartmentApplication], ): assert len(new_apartment_applications) == 5 assert all(app.status == ApartmentApplicationStatus.NEW for app in new_apartment_applications) app1, app2, app3, app4, app5 = new_apartment_applications application.reject_apartment_application(session, app1) application.consider_apartment_application(session, app2) application.consider_apartment_application(session, app3) application.process_apartment_application(session, app3) application.consider_apartment_application(session, app4) application.consider_apartment_application(session, app5) assert app1.status == ApartmentApplicationStatus.REJECTED assert all(app.status == ApartmentApplicationStatus.CONSIDERED for app in (app2, app4, app5)) assert app3.status == ApartmentApplicationStatus.PROCESSING application.tenant_signed_contract(session, app3, datetime.now()) application.landlord_signed_contract(session, app3, datetime.now()) assert app1.status == ApartmentApplicationStatus.REJECTED assert all(app.status == ApartmentApplicationStatus.CONSIDERED for app in (app2, app4, app5)) assert app3.status == ApartmentApplicationStatus.AWARDED application.provide_keys_to_tenant(session, app3) application.tenant_receive_keys(session, app3) assert all(app.status == ApartmentApplicationStatus.REJECTED for app in (app1, app2, app4, app5)) assert app3.status == ApartmentApplicationStatus.COMPLETED
def test_tenant_sign_contract_for_application_not_in_processing_status_fail( new_apartment_application: ApartmentApplication, session: Session, application: Application, ): signed_on = datetime.utcnow() with pytest.raises(ApplicationError): application.tenant_signed_contract(session, new_apartment_application, signed_on)
def test_tenant_sign_contract_for_move_in_process_ok( process_apartment_application: ApartmentApplication, application: Application, session: Session, ): signed_on = datetime.utcnow() assert process_apartment_application.status == ApartmentApplicationStatus.PROCESSING assert process_apartment_application.contract.status == ContractStatus.NEW assert not process_apartment_application.contract.tenant_has_signed application.tenant_signed_contract(session, process_apartment_application, signed_on) assert process_apartment_application.contract.tenant_has_signed assert process_apartment_application.contract.tenant_signed_on == signed_on assert process_apartment_application.contract.status == ContractStatus.NEW
def test_tenant_or_landlord_sign_already_declined_contract_fail( process_apartment_application: ApartmentApplication, session: Session, application: Application, ): assert process_apartment_application.contract.status == ContractStatus.NEW application.decline_contract( session, process_apartment_application, datetime.now(), process_apartment_application.tenant, ) assert process_apartment_application.contract.status == ContractStatus.DECLINED with pytest.raises(ApplicationError): application.tenant_signed_contract(session, process_apartment_application, datetime.now()) with pytest.raises(ApplicationError): application.landlord_signed_contract(session, process_apartment_application, datetime.now())
def signrequest_contract_callback( payload: SignrequestEventSchema, session: Session = Depends(deps.get_database_session), application: Application = Depends(deps.get_application) # payload: dict = Body(...) ): # event_uuid = payload.uuid # event_status = payload.status # event_timestamp = payload.timestamp # event_hash = payload.event_hash # event_document_id = document.uuid # document_status = document.status # TODO verify hash target_event_types = [ "declined", "cancelled", "expired", "signed", "signer_signed", "signer_viewed_email", "signer_viewed", ] event_type = payload.event_type document = payload.document document_signers = document.signrequest.signers external_id = document.external_id if event_type not in target_event_types: return apartment_application: ApartmentApplication = session.query( ApartmentApplication ).get(external_id) if not apartment_application: return if event_type == "expired": # TODO get expired on application.expire_contract(session, apartment_application, datetime.now()) elif event_type == "cancelled": # TODO get canceld on application.cancel_contract(session, apartment_application, datetime.now()) tenant: Tenant = apartment_application.tenant landlord: Landlord = apartment_application.apartment.landlord for signer in document_signers: if not signer.needs_to_sign: continue signed_on = signer.signed_on signer_declined_on = signer.declined_on signer_email = signer.email if tenant.email == signer_email: if signer.declined: application.decline_contract( session, apartment_application, signer_declined_on, tenant ) elif signer.signed: application.tenant_signed_contract( session, apartment_application, signed_on ) if landlord.email == signer_email: if signer.declined: application.decline_contract( session, apartment_application, signer_declined_on, landlord ) elif signer.signed: application.landlord_signed_contract( session, apartment_application, signed_on ) return