예제 #1
0
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
예제 #2
0
def test_landlord_sign_contract_not_in_new_status_fail(
    new_apartment_application: ApartmentApplication,
    session: Session,
    application: Application,
):
    signed_on = datetime.utcnow()
    with pytest.raises(ApplicationError):
        application.landlord_signed_contract(session,
                                             new_apartment_application,
                                             signed_on)
예제 #3
0
def test_landlord_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.landlord_has_signed
    application.landlord_signed_contract(session,
                                         process_apartment_application,
                                         signed_on)
    assert process_apartment_application.contract.landlord_has_signed
    assert process_apartment_application.contract.landlord_signed_on == signed_on
    assert process_apartment_application.contract.status == ContractStatus.NEW
예제 #4
0
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())
예제 #5
0
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