From 8f34413741dfc7e474812a1706ac30feefac590c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pleba=C5=84ski?= Date: Mon, 21 Jun 2021 11:00:00 +0200 Subject: [PATCH 01/10] Issue 1362/total flagged bug (#1366) * Fix counting totalFlagged property in AFS module * Fix a race condition in AFS module * Update changelog * fix retry import * Throw 429 on application creation retry failure Co-authored-by: Sean Albert --- CHANGELOG.md | 1 + backend/core/package.json | 1 + .../application-flagged-sets.service.ts | 133 ++++++++++++------ .../src/applications/applications.service.ts | 61 +++++++- backend/core/test/afs/afs.e2e-spec.ts | 32 +++-- yarn.lock | 12 ++ 6 files changed, 175 insertions(+), 65 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02d6b1861d..83e22247c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ All notable changes to this project will be documented in this file. The format - Poor TypeORM performance in `/applications` endpoint ([#1131](https://github.com/bloom-housing/bloom/issues/1131)) (Michał Plebański) - POST `/users` endpoint response from StatusDTO to UserBasicDto (Michał Plebański) - Replaces `toPrecision` function on `units-transformations` to `toFixed` ([#1304](https://github.com/bloom-housing/bloom/pull/1304)) (Marcin Jędras) + - "totalFlagged" computation and a race condition on Application insertion ([#1366](https://github.com/bloom-housing/bloom/pull/1366)) - Added: diff --git a/backend/core/package.json b/backend/core/package.json index aac9603104..94600c0927 100644 --- a/backend/core/package.json +++ b/backend/core/package.json @@ -44,6 +44,7 @@ "@nestjs/throttler": "^1.1.2", "@nestjs/typeorm": "^7.1.0", "@types/cache-manager": "^3.4.0", + "async-retry": "^1.3.1", "axios": "^0.21.0", "cache-manager": "^3.4.0", "casbin": "^5.1.6", diff --git a/backend/core/src/application-flagged-sets/application-flagged-sets.service.ts b/backend/core/src/application-flagged-sets/application-flagged-sets.service.ts index 65ba002680..cf0dbed6b3 100644 --- a/backend/core/src/application-flagged-sets/application-flagged-sets.service.ts +++ b/backend/core/src/application-flagged-sets/application-flagged-sets.service.ts @@ -3,7 +3,14 @@ import { PaginatedApplicationFlaggedSetQueryParams } from "./application-flagged import { AuthzService } from "../auth/authz.service" import { ApplicationFlaggedSet } from "./entities/application-flagged-set.entity" import { InjectRepository } from "@nestjs/typeorm" -import { Brackets, DeepPartial, Repository, SelectQueryBuilder } from "typeorm" +import { + Brackets, + DeepPartial, + Repository, + SelectQueryBuilder, + getManager, + EntityManager, +} from "typeorm" import { paginate } from "nestjs-typeorm-paginate" import { Application } from "../applications/entities/application.entity" import { ApplicationFlaggedSetResolveDto } from "./dto/application-flagged-set.dto" @@ -35,7 +42,10 @@ export class ApplicationFlaggedSetsService { } ) const countTotalFlagged = await this.afsRepository.count({ - where: { status: FlaggedSetStatus.flagged }, + where: { + status: FlaggedSetStatus.flagged, + ...(queryParams.listingId && { listingId: queryParams.listingId }), + }, }) return { ...results, @@ -56,55 +66,82 @@ export class ApplicationFlaggedSetsService { } async resolve(dto: ApplicationFlaggedSetResolveDto) { - const afs = await this.afsRepository.findOne({ - where: { id: dto.afsId }, - relations: ["applications"], - }) - if (!afs) { - throw new NotFoundException() - } - // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion - afs.resolvingUser = this.request.user as User - afs.resolvedTime = new Date() - afs.status = FlaggedSetStatus.resolved - const appsToBeResolved = afs.applications.filter((afsApp) => - dto.applications.map((appIdDto) => appIdDto.id).includes(afsApp.id) - ) - const appsNotToBeResolved = afs.applications.filter( - (afsApp) => !dto.applications.map((appIdDto) => appIdDto.id).includes(afsApp.id) - ) + return await getManager().transaction("SERIALIZABLE", async (transactionalEntityManager) => { + const transAfsRepository = transactionalEntityManager.getRepository(ApplicationFlaggedSet) + const transApplicationsRepository = transactionalEntityManager.getRepository(Application) + const afs = await transAfsRepository.findOne({ + where: { id: dto.afsId }, + relations: ["applications"], + }) + if (!afs) { + throw new NotFoundException() + } + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + afs.resolvingUser = this.request.user as User + afs.resolvedTime = new Date() + afs.status = FlaggedSetStatus.resolved + const appsToBeResolved = afs.applications.filter((afsApp) => + dto.applications.map((appIdDto) => appIdDto.id).includes(afsApp.id) + ) - for (const appToBeResolved of appsToBeResolved) { - appToBeResolved.markedAsDuplicate = true - await this.applicationsRepository.save(appToBeResolved) - } + const appsNotToBeResolved = afs.applications.filter( + (afsApp) => !dto.applications.map((appIdDto) => appIdDto.id).includes(afsApp.id) + ) - for (const appNotToBeResolved of appsNotToBeResolved) { - appNotToBeResolved.markedAsDuplicate = false - await this.applicationsRepository.save(appNotToBeResolved) - } - appsToBeResolved.forEach((app) => (app.markedAsDuplicate = true)) - await this.afsRepository.save(afs) - return afs + for (const appToBeResolved of appsToBeResolved) { + appToBeResolved.markedAsDuplicate = true + } + + for (const appNotToBeResolved of appsNotToBeResolved) { + appNotToBeResolved.markedAsDuplicate = false + } + + await transApplicationsRepository.save([...appsToBeResolved, ...appsNotToBeResolved]) + + appsToBeResolved.forEach((app) => (app.markedAsDuplicate = true)) + await transAfsRepository.save(afs) + + return afs + }) } - async onApplicationSave(newApplication: Application) { + async onApplicationSave(newApplication: Application, transactionalEntityManager: EntityManager) { for (const rule of [Rule.email, Rule.nameAndDOB]) { - await this.updateApplicationFlaggedSetsForRule(newApplication, rule) + await this.updateApplicationFlaggedSetsForRule( + transactionalEntityManager, + newApplication, + rule + ) } } - async fetchDuplicatesMatchingRule(application: Application, rule: Rule) { + async fetchDuplicatesMatchingRule( + transactionalEntityManager: EntityManager, + application: Application, + rule: Rule + ) { switch (rule) { case Rule.nameAndDOB: - return await this.fetchDuplicatesMatchingNameAndDOBRule(application) + return await this.fetchDuplicatesMatchingNameAndDOBRule( + transactionalEntityManager, + application + ) case Rule.email: - return await this.fetchDuplicatesMatchingEmailRule(application) + return await this.fetchDuplicatesMatchingEmailRule(transactionalEntityManager, application) } } - async updateApplicationFlaggedSetsForRule(newApplication: Application, rule: Rule) { - const applicationsMatchingRule = await this.fetchDuplicatesMatchingRule(newApplication, rule) + async updateApplicationFlaggedSetsForRule( + transactionalEntityManager: EntityManager, + newApplication: Application, + rule: Rule + ) { + const applicationsMatchingRule = await this.fetchDuplicatesMatchingRule( + transactionalEntityManager, + newApplication, + rule + ) + const transAfsRepository = transactionalEntityManager.getRepository(ApplicationFlaggedSet) const visitedAfses = [] for (const matchedApplication of applicationsMatchingRule) { // NOTE: Optimize it because of N^2 complexity, @@ -112,7 +149,7 @@ export class ApplicationFlaggedSetsService { // TODO: Add filtering into the query, right now all AFSes are fetched for each // matched application which will become a performance problem soon const afsesMatchingRule = ( - await this.afsRepository.find({ + await transAfsRepository.find({ join: { alias: "afs", leftJoinAndSelect: { @@ -135,7 +172,7 @@ export class ApplicationFlaggedSetsService { applications: [newApplication, matchedApplication], listing: newApplication.listing, } - await this.afsRepository.save(newAfs) + await transAfsRepository.save(newAfs) } else if (afsesMatchingRule.length === 1) { for (const afs of afsesMatchingRule) { if (visitedAfses.includes(afs.id)) { @@ -143,7 +180,7 @@ export class ApplicationFlaggedSetsService { } visitedAfses.push(afs.id) afs.applications.push(newApplication) - await this.afsRepository.save(afs) + await transAfsRepository.save(afs) } } else { console.error( @@ -154,8 +191,12 @@ export class ApplicationFlaggedSetsService { } } - private async fetchDuplicatesMatchingEmailRule(newApplication: Application) { - return await this.applicationsRepository.find({ + private async fetchDuplicatesMatchingEmailRule( + transactionalEntityManager: EntityManager, + newApplication: Application + ) { + const transApplicationsRepository = transactionalEntityManager.getRepository(Application) + return await transApplicationsRepository.find({ where: (qb: SelectQueryBuilder) => { qb.where("Application.id != :id", { id: newApplication.id, @@ -171,7 +212,11 @@ export class ApplicationFlaggedSetsService { }) } - private async fetchDuplicatesMatchingNameAndDOBRule(newApplication: Application) { + private async fetchDuplicatesMatchingNameAndDOBRule( + transactionalEntityManager: EntityManager, + newApplication: Application + ) { + const transApplicationsRepository = transactionalEntityManager.getRepository(Application) const firstNames = [ newApplication.applicant.firstName, ...newApplication.householdMembers.map((householdMember) => householdMember.firstName), @@ -197,7 +242,7 @@ export class ApplicationFlaggedSetsService { ...newApplication.householdMembers.map((householdMember) => householdMember.birthYear), ] - return await this.applicationsRepository.find({ + return await transApplicationsRepository.find({ where: (qb: SelectQueryBuilder) => { qb.where("Application.id != :id", { id: newApplication.id, diff --git a/backend/core/src/applications/applications.service.ts b/backend/core/src/applications/applications.service.ts index 396d53bdd0..4d5966a0eb 100644 --- a/backend/core/src/applications/applications.service.ts +++ b/backend/core/src/applications/applications.service.ts @@ -1,8 +1,8 @@ -import { Inject, Injectable, Scope } from "@nestjs/common" +import { HttpException, HttpStatus, Inject, Injectable, Scope } from "@nestjs/common" import { Application } from "./entities/application.entity" import { ApplicationCreateDto, ApplicationUpdateDto } from "./dto/application.dto" import { InjectRepository } from "@nestjs/typeorm" -import { Repository } from "typeorm" +import { getManager, QueryFailedError, Repository } from "typeorm" import { paginate, Pagination } from "nestjs-typeorm-paginate" import { PaginatedApplicationListQueryParams } from "./applications.controller" import { ApplicationFlaggedSetsService } from "../application-flagged-sets/application-flagged-sets.service" @@ -12,6 +12,7 @@ import { Request as ExpressRequest } from "express" import { ListingsService } from "../listings/listings.service" import { EmailService } from "../shared/email/email.service" import { REQUEST } from "@nestjs/core" +import retry from "async-retry" @Injectable({ scope: Scope.REQUEST }) export class ApplicationsService { @@ -139,16 +140,62 @@ export class ApplicationsService { }) return qb } - private async _create(applicationCreateDto: ApplicationUpdateDto) { - const application = await this.repository.save({ - ...applicationCreateDto, - user: this.req.user, + + private async _createApplication(applicationCreateDto: ApplicationUpdateDto) { + return await getManager().transaction("SERIALIZABLE", async (transactionalEntityManager) => { + const applicationsRepository = transactionalEntityManager.getRepository(Application) + const application = await applicationsRepository.save({ + ...applicationCreateDto, + user: this.req.user, + }) + await this.applicationFlaggedSetsService.onApplicationSave( + application, + transactionalEntityManager + ) + return application }) + } + + private async _create(applicationCreateDto: ApplicationUpdateDto) { + let application: Application + + try { + await retry( + async (bail) => { + try { + application = await this._createApplication(applicationCreateDto) + } catch (e) { + console.error(e.message) + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + if (!(e instanceof QueryFailedError && e.code === "40001")) { + // 40001: could not serialize access due to read/write dependencies among transactions + bail(e) + } + throw e + } + }, + { retries: 6, minTimeout: 200 } + ) + } catch (e) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + if (e instanceof QueryFailedError && e.code === "40001") { + throw new HttpException( + { + statusCode: HttpStatus.TOO_MANY_REQUESTS, + error: "Too Many Requests", + message: "Please try again later.", + }, + 429 + ) + } + } + const listing = await this.listingsService.findOne(application.listing.id) if (application.applicant.emailAddress) { await this.emailService.confirmation(listing, application, applicationCreateDto.appUrl) } - await this.applicationFlaggedSetsService.onApplicationSave(application) return application } diff --git a/backend/core/test/afs/afs.e2e-spec.ts b/backend/core/test/afs/afs.e2e-spec.ts index 72663d2731..2e0baf7ed6 100644 --- a/backend/core/test/afs/afs.e2e-spec.ts +++ b/backend/core/test/afs/afs.e2e-spec.ts @@ -94,13 +94,15 @@ describe("ApplicationFlaggedSets", () => { const appContent = getTestAppBody(listing1Id) const apps = [] - for (const payload of [appContent, appContent]) { - const appRes = await supertest(app.getHttpServer()) - .post("/applications/submit") - .send(payload) - .expect(201) - apps.push(appRes) - } + await Promise.all( + [appContent, appContent].map(async (payload) => { + const appRes = await supertest(app.getHttpServer()) + .post("/applications/submit") + .send(payload) + .expect(201) + apps.push(appRes) + }) + ) let afses = await supertest(app.getHttpServer()) .get(`/applicationFlaggedSets?listingId=${listing1Id}`) @@ -137,13 +139,15 @@ describe("ApplicationFlaggedSets", () => { appContent2.applicant.emailAddress = "another@email.com" const apps = [] - for (const payload of [appContent1, appContent2]) { - const appRes = await supertest(app.getHttpServer()) - .post("/applications/submit") - .send(payload) - .expect(201) - apps.push(appRes) - } + await Promise.all( + [appContent1, appContent2].map(async (payload) => { + const appRes = await supertest(app.getHttpServer()) + .post("/applications/submit") + .send(payload) + .expect(201) + apps.push(appRes) + }) + ) let afses = await supertest(app.getHttpServer()) .get(`/applicationFlaggedSets?listingId=${listing1Id}`) diff --git a/yarn.lock b/yarn.lock index 547a189062..452b858211 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5994,6 +5994,13 @@ async-foreach@^0.1.3: resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= +async-retry@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55" + integrity sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA== + dependencies: + retry "0.12.0" + async@0.9.x: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" @@ -17196,6 +17203,11 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +retry@0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + retry@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" From 9ddf1a6c838064ee7bb6980693cd581792d4e758 Mon Sep 17 00:00:00 2001 From: Emily Jablonski <65367387+emilyjablonski@users.noreply.github.com> Date: Mon, 21 Jun 2021 09:03:29 -0600 Subject: [PATCH 02/10] fix merge conflicts in master (#1375) --- CHANGELOG.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83e22247c5..fdb6b81462 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,11 +51,8 @@ All notable changes to this project will be documented in this file. The format - Fix repetition of select text on preferences ([#1270](https://github.com/bloom-housing/bloom/pull/1270)) (Emily Jablonski) - Fix aplication submission and broken test ([#1270](https://github.com/bloom-housing/bloom/pull/1282)) (Dominik Barcikowski) - Fix broken application search in Partners ([#1301](https://github.com/bloom-housing/bloom/pull/1301)) (Dominik Barcikowski) - <<<<<<< HEAD - ======= - Fix multiple unit rows in summaries, sorting issues ([#1306](https://github.com/bloom-housing/bloom/pull/1306)) (Emily Jablonski) - Fix partners application submission ([#1340](https://github.com/bloom-housing/bloom/pull/1340)) (Dominik Barcikowski) - > > > > > > > upstream/master - Changed: From 97107df4c09e01c5008ef274a151e364f713f72e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20J=C4=99dras?= Date: Mon, 21 Jun 2021 17:30:30 +0200 Subject: [PATCH 03/10] Replace UserContext with AuthContext (#1311) * Replace UserContext with AuthContext * Remove api_requests * Fix imports * Fix userService params * Fix ConfirmationModal * Add missing appUrl * Fixes after rebase and remove useRouter for ui-components * Fix language passed to axios --- backend/core/client.ts | 2215 +++++++------- backend/core/types/src/backend-swagger.ts | 2603 +++++++++-------- docs/Authentication.md | 52 +- sites/partners/layouts/index.tsx | 4 +- sites/partners/lib/hooks.ts | 14 +- sites/partners/pages/_app.tsx | 15 +- .../partners/pages/application/[id]/index.tsx | 4 +- sites/partners/pages/forgot-password.tsx | 6 +- sites/partners/pages/index.tsx | 4 +- .../listings/[id]/applications/index.tsx | 4 +- .../listings/[id]/flags/[flagId]/index.tsx | 4 +- sites/partners/pages/reset-password.tsx | 4 +- sites/partners/pages/sign-in.tsx | 4 +- .../PaperApplicationForm.tsx | 4 +- .../src/listings/PaperListingForm/index.tsx | 4 +- sites/public/layouts/application.tsx | 4 +- sites/public/pages/_app.tsx | 13 +- .../pages/account/AppStatusItemWrapper.tsx | 4 +- sites/public/pages/account/application.tsx | 13 +- sites/public/pages/account/applications.tsx | 6 +- sites/public/pages/account/edit.tsx | 6 +- .../applications/review/confirmation.tsx | 4 +- .../pages/applications/review/terms.tsx | 6 +- .../pages/applications/start/autofill.tsx | 6 +- .../applications/start/choose-language.tsx | 4 +- sites/public/pages/create-account.tsx | 19 +- sites/public/pages/forgot-password.tsx | 7 +- sites/public/pages/reset-password.tsx | 4 +- sites/public/pages/sign-in.tsx | 4 +- sites/public/src/ConfirmationModal.tsx | 9 +- .../forms/applications/ApplicationTimeout.ts | 4 +- .../authentication/RequireLogin.test.tsx | 18 +- .../__tests__/authentication/Timeout.test.tsx | 10 +- .../src/authentication/AuthContext.ts | 308 ++ .../src/authentication/RequireLogin.tsx | 4 +- .../src/authentication/UserContext.tsx | 221 -- .../src/authentication/api_requests.ts | 125 - ui-components/src/authentication/client.ts | 42 - ui-components/src/authentication/index.ts | 4 +- ui-components/src/authentication/timeout.tsx | 4 +- .../authentication/useAuthenticatedClient.ts | 12 - .../authentication/useRequireLoggedInUser.ts | 4 +- .../src/config/NavigationContext.tsx | 2 + 43 files changed, 2856 insertions(+), 2952 deletions(-) create mode 100644 ui-components/src/authentication/AuthContext.ts delete mode 100644 ui-components/src/authentication/UserContext.tsx delete mode 100644 ui-components/src/authentication/api_requests.ts delete mode 100644 ui-components/src/authentication/client.ts delete mode 100644 ui-components/src/authentication/useAuthenticatedClient.ts diff --git a/backend/core/client.ts b/backend/core/client.ts index e6aa9c396c..ac8ca8e71a 100644 --- a/backend/core/client.ts +++ b/backend/core/client.ts @@ -1,80 +1,89 @@ /** Generate by swagger-axios-codegen */ // tslint:disable /* eslint-disable */ -import axiosStatic, { AxiosInstance } from 'axios'; +import axiosStatic, { AxiosInstance } from "axios" export interface IRequestOptions { - headers?: any; - baseURL?: string; - responseType?: string; + headers?: any + baseURL?: string + responseType?: string } export interface IRequestConfig { - method?: any; - headers?: any; - url?: any; - data?: any; - params?: any; + method?: any + headers?: any + url?: any + data?: any + params?: any } // Add options interface export interface ServiceOptions { - axios?: AxiosInstance; + axios?: AxiosInstance } // Add default options -export const serviceOptions: ServiceOptions = {}; +export const serviceOptions: ServiceOptions = {} // Instance selector -export function axios(configs: IRequestConfig, resolve: (p: any) => void, reject: (p: any) => void): Promise { +export function axios( + configs: IRequestConfig, + resolve: (p: any) => void, + reject: (p: any) => void +): Promise { if (serviceOptions.axios) { return serviceOptions.axios .request(configs) - .then(res => { - resolve(res.data); + .then((res) => { + resolve(res.data) + }) + .catch((err) => { + reject(err) }) - .catch(err => { - reject(err); - }); } else { - throw new Error('please inject yourself instance like axios '); + throw new Error("please inject yourself instance like axios ") } } -export function getConfigs(method: string, contentType: string, url: string, options: any): IRequestConfig { - const configs: IRequestConfig = { ...options, method, url }; +export function getConfigs( + method: string, + contentType: string, + url: string, + options: any +): IRequestConfig { + const configs: IRequestConfig = { ...options, method, url } configs.headers = { ...options.headers, - 'Content-Type': contentType - }; - return configs; + "Content-Type": contentType, + } + return configs } -const basePath = ''; +const basePath = "" export interface IList extends Array {} export interface List extends Array {} export interface IDictionary { - [key: string]: TValue; + [key: string]: TValue } export interface Dictionary extends IDictionary {} export interface IListResult { - items?: T[]; + items?: T[] } export class ListResult implements IListResult { - items?: T[]; + items?: T[] } export interface IPagedResult extends IListResult { - totalCount?: number; - items?: T[]; + totalCount?: number + items?: T[] } export class PagedResult implements IPagedResult { - totalCount?: number; - items?: T[]; + totalCount?: number + items?: T[] } // customer definition @@ -86,15 +95,15 @@ export class UserService { */ userControllerProfile(options: IRequestOptions = {}): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/user'; + let url = basePath + "/user" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Create user @@ -102,20 +111,20 @@ export class UserService { create( params: { /** requestBody */ - body?: UserCreate; + body?: UserCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/user'; + let url = basePath + "/user" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Forgot Password @@ -123,20 +132,20 @@ export class UserService { forgotPassword( params: { /** requestBody */ - body?: ForgotPassword; + body?: ForgotPassword } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/user/forgot-password'; + let url = basePath + "/user/forgot-password" - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update Password @@ -144,20 +153,20 @@ export class UserService { updatePassword( params: { /** requestBody */ - body?: UpdatePassword; + body?: UpdatePassword } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/user/update-password'; + let url = basePath + "/user/update-password" - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update user @@ -165,20 +174,20 @@ export class UserService { update( params: { /** requestBody */ - body?: UserUpdate; + body?: UserUpdate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/user/{id}'; + let url = basePath + "/user/{id}" - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -189,35 +198,35 @@ export class AuthService { login( params: { /** requestBody */ - body?: Login; + body?: Login } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/auth/login'; + let url = basePath + "/auth/login" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Token */ token(options: IRequestOptions = {}): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/auth/token'; + let url = basePath + "/auth/token" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -228,20 +237,20 @@ export class ListingsService { list( params: { /** */ - jsonpath?: string; + jsonpath?: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/listings'; + let url = basePath + "/listings" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); - configs.params = { jsonpath: params['jsonpath'] }; - let data = null; + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) + configs.params = { jsonpath: params["jsonpath"] } + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Create listing @@ -249,20 +258,20 @@ export class ListingsService { create( params: { /** requestBody */ - body?: ListingCreate; + body?: ListingCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/listings'; + let url = basePath + "/listings" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Get listing by id @@ -270,21 +279,21 @@ export class ListingsService { retrieve( params: { /** */ - listingId: string; + listingId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/listings/{listingId}'; - url = url.replace('{listingId}', params['listingId'] + ''); + let url = basePath + "/listings/{listingId}" + url = url.replace("{listingId}", params["listingId"] + "") - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update listing by id @@ -292,23 +301,23 @@ export class ListingsService { update( params: { /** */ - listingId: string; + listingId: string /** requestBody */ - body?: ListingUpdate; + body?: ListingUpdate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/listings/{listingId}'; - url = url.replace('{listingId}', params['listingId'] + ''); + let url = basePath + "/listings/{listingId}" + url = url.replace("{listingId}", params["listingId"] + "") - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Delete listing by id @@ -316,21 +325,21 @@ export class ListingsService { delete( params: { /** */ - listingId: string; + listingId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/listings/{listingId}'; - url = url.replace('{listingId}', params['listingId'] + ''); + let url = basePath + "/listings/{listingId}" + url = url.replace("{listingId}", params["listingId"] + "") - const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("delete", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -341,34 +350,34 @@ export class ApplicationsService { list( params: { /** */ - page?: number; + page?: number /** */ - limit?: number; + limit?: number /** */ - listingId?: string; + listingId?: string /** */ - search?: string; + search?: string /** */ - userId?: string; + userId?: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/applications'; + let url = basePath + "/applications" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) configs.params = { - page: params['page'], - limit: params['limit'], - listingId: params['listingId'], - search: params['search'], - userId: params['userId'] - }; - let data = null; - - configs.data = data; - axios(configs, resolve, reject); - }); + page: params["page"], + limit: params["limit"], + listingId: params["listingId"], + search: params["search"], + userId: params["userId"], + } + let data = null + + configs.data = data + axios(configs, resolve, reject) + }) } /** * Create application @@ -376,20 +385,20 @@ export class ApplicationsService { create( params: { /** requestBody */ - body?: ApplicationCreate; + body?: ApplicationCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/applications'; + let url = basePath + "/applications" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * List applications as csv @@ -397,28 +406,28 @@ export class ApplicationsService { listAsCsv( params: { /** */ - listingId?: string; + listingId?: string /** */ - includeHeaders?: boolean; + includeHeaders?: boolean /** */ - userId?: string; + userId?: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/applications/csv'; + let url = basePath + "/applications/csv" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) configs.params = { - listingId: params['listingId'], - includeHeaders: params['includeHeaders'], - userId: params['userId'] - }; - let data = null; - - configs.data = data; - axios(configs, resolve, reject); - }); + listingId: params["listingId"], + includeHeaders: params["includeHeaders"], + userId: params["userId"], + } + let data = null + + configs.data = data + axios(configs, resolve, reject) + }) } /** * Get application by id @@ -426,21 +435,21 @@ export class ApplicationsService { retrieve( params: { /** */ - applicationId: string; + applicationId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/applications/{applicationId}'; - url = url.replace('{applicationId}', params['applicationId'] + ''); + let url = basePath + "/applications/{applicationId}" + url = url.replace("{applicationId}", params["applicationId"] + "") - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update application by id @@ -448,23 +457,23 @@ export class ApplicationsService { update( params: { /** */ - applicationId: string; + applicationId: string /** requestBody */ - body?: ApplicationUpdate; + body?: ApplicationUpdate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/applications/{applicationId}'; - url = url.replace('{applicationId}', params['applicationId'] + ''); + let url = basePath + "/applications/{applicationId}" + url = url.replace("{applicationId}", params["applicationId"] + "") - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Delete application by id @@ -472,21 +481,21 @@ export class ApplicationsService { delete( params: { /** */ - applicationId: string; + applicationId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/applications/{applicationId}'; - url = url.replace('{applicationId}', params['applicationId'] + ''); + let url = basePath + "/applications/{applicationId}" + url = url.replace("{applicationId}", params["applicationId"] + "") - const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("delete", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Submit application @@ -494,20 +503,20 @@ export class ApplicationsService { submit( params: { /** requestBody */ - body?: ApplicationCreate; + body?: ApplicationCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/applications/submit'; + let url = basePath + "/applications/submit" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -517,15 +526,15 @@ export class PreferencesService { */ list(options: IRequestOptions = {}): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/preferences'; + let url = basePath + "/preferences" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Create preference @@ -533,20 +542,20 @@ export class PreferencesService { create( params: { /** requestBody */ - body?: PreferenceCreate; + body?: PreferenceCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/preferences'; + let url = basePath + "/preferences" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update preference @@ -554,20 +563,20 @@ export class PreferencesService { update( params: { /** requestBody */ - body?: PreferenceUpdate; + body?: PreferenceUpdate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/preferences/{preferenceId}'; + let url = basePath + "/preferences/{preferenceId}" - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Get preference by id @@ -575,21 +584,21 @@ export class PreferencesService { retrieve( params: { /** */ - preferenceId: string; + preferenceId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/preferences/{preferenceId}'; - url = url.replace('{preferenceId}', params['preferenceId'] + ''); + let url = basePath + "/preferences/{preferenceId}" + url = url.replace("{preferenceId}", params["preferenceId"] + "") - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Delete preference by id @@ -597,21 +606,21 @@ export class PreferencesService { delete( params: { /** */ - preferenceId: string; + preferenceId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/preferences/{preferenceId}'; - url = url.replace('{preferenceId}', params['preferenceId'] + ''); + let url = basePath + "/preferences/{preferenceId}" + url = url.replace("{preferenceId}", params["preferenceId"] + "") - const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("delete", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -621,15 +630,15 @@ export class UnitsService { */ list(options: IRequestOptions = {}): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/units'; + let url = basePath + "/units" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Create unit @@ -637,20 +646,20 @@ export class UnitsService { create( params: { /** requestBody */ - body?: UnitCreate; + body?: UnitCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/units'; + let url = basePath + "/units" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update unit @@ -658,20 +667,20 @@ export class UnitsService { update( params: { /** requestBody */ - body?: UnitUpdate; + body?: UnitUpdate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/units/{unitId}'; + let url = basePath + "/units/{unitId}" - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Get unit by id @@ -679,21 +688,21 @@ export class UnitsService { retrieve( params: { /** */ - unitId: string; + unitId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/units/{unitId}'; - url = url.replace('{unitId}', params['unitId'] + ''); + let url = basePath + "/units/{unitId}" + url = url.replace("{unitId}", params["unitId"] + "") - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Delete unit by id @@ -701,21 +710,21 @@ export class UnitsService { delete( params: { /** */ - unitId: string; + unitId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/units/{unitId}'; - url = url.replace('{unitId}', params['unitId'] + ''); + let url = basePath + "/units/{unitId}" + url = url.replace("{unitId}", params["unitId"] + "") - const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("delete", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -725,15 +734,15 @@ export class PropertiesService { */ list(options: IRequestOptions = {}): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/properties'; + let url = basePath + "/properties" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Create property @@ -741,20 +750,20 @@ export class PropertiesService { create( params: { /** requestBody */ - body?: PropertyCreate; + body?: PropertyCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/properties'; + let url = basePath + "/properties" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update property @@ -762,20 +771,20 @@ export class PropertiesService { update( params: { /** requestBody */ - body?: PropertyUpdate; + body?: PropertyUpdate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/properties/{propertyId}'; + let url = basePath + "/properties/{propertyId}" - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Get property by id @@ -783,21 +792,21 @@ export class PropertiesService { retrieve( params: { /** */ - propertyId: string; + propertyId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/properties/{propertyId}'; - url = url.replace('{propertyId}', params['propertyId'] + ''); + let url = basePath + "/properties/{propertyId}" + url = url.replace("{propertyId}", params["propertyId"] + "") - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Delete property by id @@ -805,21 +814,21 @@ export class PropertiesService { delete( params: { /** */ - propertyId: string; + propertyId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/properties/{propertyId}'; - url = url.replace('{propertyId}', params['propertyId'] + ''); + let url = basePath + "/properties/{propertyId}" + url = url.replace("{propertyId}", params["propertyId"] + "") - const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("delete", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -829,15 +838,15 @@ export class PropertyGroupsService { */ list(options: IRequestOptions = {}): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/propertyGroups'; + let url = basePath + "/propertyGroups" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Create propertyGroup @@ -845,20 +854,20 @@ export class PropertyGroupsService { create( params: { /** requestBody */ - body?: PropertyGroupCreate; + body?: PropertyGroupCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/propertyGroups'; + let url = basePath + "/propertyGroups" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update propertyGroup @@ -866,20 +875,20 @@ export class PropertyGroupsService { update( params: { /** requestBody */ - body?: PropertyGroupUpdate; + body?: PropertyGroupUpdate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/propertyGroups/{propertyGroupId}'; + let url = basePath + "/propertyGroups/{propertyGroupId}" - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Get propertyGroup by id @@ -887,21 +896,21 @@ export class PropertyGroupsService { retrieve( params: { /** */ - propertyGroupId: string; + propertyGroupId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/propertyGroups/{propertyGroupId}'; - url = url.replace('{propertyGroupId}', params['propertyGroupId'] + ''); + let url = basePath + "/propertyGroups/{propertyGroupId}" + url = url.replace("{propertyGroupId}", params["propertyGroupId"] + "") - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Delete propertyGroup by id @@ -909,21 +918,21 @@ export class PropertyGroupsService { delete( params: { /** */ - propertyGroupId: string; + propertyGroupId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/propertyGroups/{propertyGroupId}'; - url = url.replace('{propertyGroupId}', params['propertyGroupId'] + ''); + let url = basePath + "/propertyGroups/{propertyGroupId}" + url = url.replace("{propertyGroupId}", params["propertyGroupId"] + "") - const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("delete", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -933,15 +942,15 @@ export class AmiChartsService { */ list(options: IRequestOptions = {}): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/amiCharts'; + let url = basePath + "/amiCharts" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Create amiChart @@ -949,20 +958,20 @@ export class AmiChartsService { create( params: { /** requestBody */ - body?: AmiChartCreate; + body?: AmiChartCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/amiCharts'; + let url = basePath + "/amiCharts" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update amiChart @@ -970,20 +979,20 @@ export class AmiChartsService { update( params: { /** requestBody */ - body?: AmiChartUpdate; + body?: AmiChartUpdate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/amiCharts/{amiChartId}'; + let url = basePath + "/amiCharts/{amiChartId}" - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Get amiChart by id @@ -991,21 +1000,21 @@ export class AmiChartsService { retrieve( params: { /** */ - amiChartId: string; + amiChartId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/amiCharts/{amiChartId}'; - url = url.replace('{amiChartId}', params['amiChartId'] + ''); + let url = basePath + "/amiCharts/{amiChartId}" + url = url.replace("{amiChartId}", params["amiChartId"] + "") - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Delete amiChart by id @@ -1013,222 +1022,222 @@ export class AmiChartsService { delete( params: { /** */ - amiChartId: string; + amiChartId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/amiCharts/{amiChartId}'; - url = url.replace('{amiChartId}', params['amiChartId'] + ''); + let url = basePath + "/amiCharts/{amiChartId}" + url = url.replace("{amiChartId}", params["amiChartId"] + "") - const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("delete", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } export interface Id { /** */ - id: string; + id: string } export interface User { /** */ - roles: UserRole[]; + roles: UserRole[] /** */ - leasingAgentInListings?: Id[]; + leasingAgentInListings?: Id[] /** */ - id: string; + id: string /** */ - email: string; + email: string /** */ - firstName: string; + firstName: string /** */ - middleName?: string; + middleName?: string /** */ - lastName: string; + lastName: string /** */ - dob: Date; + dob: Date /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date } export interface UserCreate { /** */ - password: string; + password: string /** */ - email: string; + email: string /** */ - firstName: string; + firstName: string /** */ - middleName?: string; + middleName?: string /** */ - lastName: string; + lastName: string /** */ - dob: Date; + dob: Date } export interface UserWithAccessToken { /** */ - roles: UserRole[]; + roles: UserRole[] /** */ - leasingAgentInListings?: Id[]; + leasingAgentInListings?: Id[] /** */ - id: string; + id: string /** */ - email: string; + email: string /** */ - firstName: string; + firstName: string /** */ - middleName?: string; + middleName?: string /** */ - lastName: string; + lastName: string /** */ - dob: Date; + dob: Date /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - accessToken: string; + accessToken: string } export interface ForgotPassword { /** */ - email: string; + email: string /** */ - appUrl?: string; + appUrl?: string } export interface ForgotPasswordResponse { /** */ - message: string; + message: string } export interface UpdatePassword { /** */ - password: string; + password: string /** */ - passwordConfirmation: string; + passwordConfirmation: string /** */ - token: string; + token: string } export interface LoginResponse { /** */ - accessToken: string; + accessToken: string } export interface UserUpdate { /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - dob: Date; + dob: Date /** */ - firstName: string; + firstName: string /** */ - middleName?: string; + middleName?: string /** */ - lastName: string; + lastName: string } export interface Login { /** */ - email: string; + email: string /** */ - password: string; + password: string } export interface LoginResponse { /** */ - accessToken: string; + accessToken: string } export interface PreferenceLink { /** */ - title: string; + title: string /** */ - url: string; + url: string } export interface ApplicationMethod { /** */ - type: ApplicationMethodType; + type: ApplicationMethodType /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - label: string; + label: string } export interface FormMetadataExtraData { /** */ - type: InputType; + type: InputType /** */ - key: string; + key: string } export interface FormMetadataOptions { /** */ - key: string; + key: string /** */ - extraData: FormMetadataExtraData[]; + extraData: FormMetadataExtraData[] /** */ - description?: boolean; + description?: boolean /** */ exclusive?: boolean @@ -1236,13 +1245,13 @@ export interface FormMetadataOptions { export interface FormMetadata { /** */ - key: string; + key: string /** */ - options: FormMetadataOptions[]; + options: FormMetadataOptions[] /** */ - hideGenericDecline?: boolean; + hideGenericDecline?: boolean /** */ customSelectText?: string @@ -1253,31 +1262,31 @@ export interface FormMetadata { export interface Preference { /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - ordinal: number; + ordinal: number /** */ - title: string; + title: string /** */ - subtitle: string; + subtitle: string /** */ - description: string; + description: string /** */ - links: PreferenceLink[]; + links: PreferenceLink[] /** */ - formMetadata?: FormMetadata; + formMetadata?: FormMetadata /** */ page: number @@ -1285,508 +1294,508 @@ export interface Preference { export interface MinMaxCurrency { /** */ - min: string; + min: string /** */ - max: string; + max: string } export interface MinMax { /** */ - min: number; + min: number /** */ - max: number; + max: number } export interface UnitSummary { /** */ - unitType: string; + unitType: string /** */ - minIncomeRange: MinMaxCurrency; + minIncomeRange: MinMaxCurrency /** */ - occupancyRange: MinMax; + occupancyRange: MinMax /** */ - rentAsPercentIncomeRange: MinMax; + rentAsPercentIncomeRange: MinMax /** */ - rentRange: MinMaxCurrency; + rentRange: MinMaxCurrency /** */ - totalAvailable: number; + totalAvailable: number /** */ - areaRange: MinMax; + areaRange: MinMax /** */ - floorRange?: MinMax; + floorRange?: MinMax } export interface UnitSummaryByReservedType { /** */ - reservedType: string; + reservedType: string /** */ - byUnitTypeAndRent: UnitSummary[]; + byUnitTypeAndRent: UnitSummary[] } export interface UnitSummaryByAMI { /** */ - percent: string; + percent: string /** */ - byNonReservedUnitType: UnitSummary[]; + byNonReservedUnitType: UnitSummary[] /** */ - byReservedType: UnitSummaryByReservedType[]; + byReservedType: UnitSummaryByReservedType[] } export interface HMI { /** */ - columns: object; + columns: object /** */ - rows: object[]; + rows: object[] } export interface UnitsSummarized { /** */ - unitTypes: string[]; + unitTypes: string[] /** */ - reservedTypes: string[]; + reservedTypes: string[] /** */ - priorityTypes: string[]; + priorityTypes: string[] /** */ - amiPercentages: string[]; + amiPercentages: string[] /** */ - byUnitType: UnitSummary[]; + byUnitType: UnitSummary[] /** */ - byUnitTypeAndRent: UnitSummary[]; + byUnitTypeAndRent: UnitSummary[] /** */ - byNonReservedUnitType: UnitSummary[]; + byNonReservedUnitType: UnitSummary[] /** */ - byReservedType: UnitSummaryByReservedType[]; + byReservedType: UnitSummaryByReservedType[] /** */ - byAMI: UnitSummaryByAMI[]; + byAMI: UnitSummaryByAMI[] /** */ - hmi: HMI; + hmi: HMI } export interface AmiChartItem { /** */ - percentOfAmi: number; + percentOfAmi: number /** */ - householdSize: number; + householdSize: number /** */ - income: number; + income: number } export interface AmiChart { /** */ - items: AmiChartItem[]; + items: AmiChartItem[] /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - name: string; + name: string } export interface Unit { /** */ - amiChart: CombinedAmiChartTypes; + amiChart: CombinedAmiChartTypes /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - amiPercentage?: string; + amiPercentage?: string /** */ - annualIncomeMin?: string; + annualIncomeMin?: string /** */ - monthlyIncomeMin?: string; + monthlyIncomeMin?: string /** */ - floor?: number; + floor?: number /** */ - annualIncomeMax?: string; + annualIncomeMax?: string /** */ - maxOccupancy?: number; + maxOccupancy?: number /** */ - minOccupancy?: number; + minOccupancy?: number /** */ - monthlyRent?: string; + monthlyRent?: string /** */ - numBathrooms?: number; + numBathrooms?: number /** */ - numBedrooms?: number; + numBedrooms?: number /** */ - number?: string; + number?: string /** */ - priorityType?: string; + priorityType?: string /** */ - reservedType?: string; + reservedType?: string /** */ - sqFeet?: string; + sqFeet?: string /** */ - status?: string; + status?: string /** */ - unitType?: string; + unitType?: string /** */ - monthlyRentAsPercentOfIncome?: string; + monthlyRentAsPercentOfIncome?: string /** */ - bmrProgramChart?: boolean; + bmrProgramChart?: boolean } export interface Address { /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - placeName?: string; + placeName?: string /** */ - city?: string; + city?: string /** */ - county?: string; + county?: string /** */ - state?: string; + state?: string /** */ - street?: string; + street?: string /** */ - street2?: string; + street2?: string /** */ - zipCode?: string; + zipCode?: string /** */ - latitude?: number; + latitude?: number /** */ - longitude?: number; + longitude?: number } export interface Property { /** */ - unitsSummarized: UnitsSummarized; + unitsSummarized: UnitsSummarized /** */ - units: Unit[]; + units: Unit[] /** */ - buildingAddress: Address; + buildingAddress: Address /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - accessibility: string; + accessibility: string /** */ - amenities: string; + amenities: string /** */ - buildingTotalUnits: number; + buildingTotalUnits: number /** */ - developer: string; + developer: string /** */ - householdSizeMax: number; + householdSizeMax: number /** */ - householdSizeMin: number; + householdSizeMin: number /** */ - neighborhood: string; + neighborhood: string /** */ - petPolicy: string; + petPolicy: string /** */ - smokingPolicy: string; + smokingPolicy: string /** */ - unitsAvailable: number; + unitsAvailable: number /** */ - unitAmenities: string; + unitAmenities: string /** */ - yearBuilt: number; + yearBuilt: number } export interface UserBasic { /** */ - id: string; + id: string /** */ - resetToken: string; + resetToken: string /** */ - email: string; + email: string /** */ - firstName: string; + firstName: string /** */ - middleName?: string; + middleName?: string /** */ - lastName: string; + lastName: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date } export interface ApplicationMethod { /** */ - type: ApplicationMethodType; + type: ApplicationMethodType /** */ - label: string; + label: string /** */ - externalReference: string; + externalReference: string /** */ - acceptsPostmarkedApplications: boolean; + acceptsPostmarkedApplications: boolean } export interface Asset { /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - label: string; + label: string /** */ - fileId: string; + fileId: string } export interface ListingEvent { /** */ - type: ListingEventType; + type: ListingEventType /** */ - startTime: Date; + startTime: Date /** */ - endTime: Date; + endTime: Date /** */ - url?: string; + url?: string /** */ - note?: string; + note?: string } export interface WhatToExpect { /** */ - applicantsWillBeContacted: string; + applicantsWillBeContacted: string /** */ - allInfoWillBeVerified: string; + allInfoWillBeVerified: string /** */ - bePreparedIfChosen: string; + bePreparedIfChosen: string } export interface Listing { /** */ - status: ListingStatus; + status: ListingStatus /** */ - urlSlug: string; + urlSlug: string /** */ - displayWaitlistSize: boolean; + displayWaitlistSize: boolean /** */ - CSVFormattingType: CSVFormattingType; + CSVFormattingType: CSVFormattingType /** */ - preferences: Preference[]; + preferences: Preference[] /** */ - property: Property; + property: Property /** */ - applicationAddress: CombinedApplicationAddressTypes; + applicationAddress: CombinedApplicationAddressTypes /** */ - applicationPickUpAddress: CombinedApplicationPickUpAddressTypes; + applicationPickUpAddress: CombinedApplicationPickUpAddressTypes /** */ - leasingAgentAddress: CombinedLeasingAgentAddressTypes; + leasingAgentAddress: CombinedLeasingAgentAddressTypes /** */ - leasingAgents?: UserBasic[]; + leasingAgents?: UserBasic[] /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - applicationMethods: ApplicationMethod[]; + applicationMethods: ApplicationMethod[] /** */ - assets: Asset[]; + assets: Asset[] /** */ - events: ListingEvent[]; + events: ListingEvent[] /** */ - applicationDueDate: Date; + applicationDueDate: Date /** */ - applicationOpenDate: Date; + applicationOpenDate: Date /** */ - applicationFee: string; + applicationFee: string /** */ - applicationOrganization: string; + applicationOrganization: string /** */ - applicationPickUpAddressOfficeHours: string; + applicationPickUpAddressOfficeHours: string /** */ - buildingSelectionCriteria: string; + buildingSelectionCriteria: string /** */ - costsNotIncluded: string; + costsNotIncluded: string /** */ - creditHistory: string; + creditHistory: string /** */ - criminalBackground: string; + criminalBackground: string /** */ - depositMin: string; + depositMin: string /** */ - depositMax: string; + depositMax: string /** */ - disableUnitsAccordion: boolean; + disableUnitsAccordion: boolean /** */ - leasingAgentEmail: string; + leasingAgentEmail: string /** */ - leasingAgentName: string; + leasingAgentName: string /** */ - leasingAgentOfficeHours: string; + leasingAgentOfficeHours: string /** */ - leasingAgentPhone: string; + leasingAgentPhone: string /** */ - leasingAgentTitle: string; + leasingAgentTitle: string /** */ - name: string; + name: string /** */ - postmarkedApplicationsReceivedByDate: Date; + postmarkedApplicationsReceivedByDate: Date /** */ - programRules: string; + programRules: string /** */ - rentalAssistance: string; + rentalAssistance: string /** */ - rentalHistory: string; + rentalHistory: string /** */ - requiredDocuments: string; + requiredDocuments: string /** */ - waitlistCurrentSize: number; + waitlistCurrentSize: number /** */ - waitlistMaxSize: number; + waitlistMaxSize: number /** */ - whatToExpect: CombinedWhatToExpectTypes; + whatToExpect: CombinedWhatToExpectTypes /** */ - applicationConfig?: object; + applicationConfig?: object /** */ showWaitlist?: boolean @@ -1794,22 +1803,22 @@ export interface Listing { export interface PreferenceCreate { /** */ - ordinal: number; + ordinal: number /** */ - title: string; + title: string /** */ - subtitle: string; + subtitle: string /** */ - description: string; + description: string /** */ - links: PreferenceLink[]; + links: PreferenceLink[] /** */ - formMetadata?: FormMetadata; + formMetadata?: FormMetadata /** */ page: number @@ -1817,1543 +1826,1543 @@ export interface PreferenceCreate { export interface AddressCreate { /** */ - placeName?: string; + placeName?: string /** */ - city?: string; + city?: string /** */ - county?: string; + county?: string /** */ - state?: string; + state?: string /** */ - street?: string; + street?: string /** */ - street2?: string; + street2?: string /** */ - zipCode?: string; + zipCode?: string /** */ - latitude?: number; + latitude?: number /** */ - longitude?: number; + longitude?: number } export interface ListingCreate { /** */ - status: ListingStatus; + status: ListingStatus /** */ - displayWaitlistSize: boolean; + displayWaitlistSize: boolean /** */ - CSVFormattingType: CSVFormattingType; + CSVFormattingType: CSVFormattingType /** */ - preferences: PreferenceCreate[]; + preferences: PreferenceCreate[] /** */ - property: Id; + property: Id /** */ - applicationAddress: CombinedApplicationAddressTypes; + applicationAddress: CombinedApplicationAddressTypes /** */ - applicationPickUpAddress: CombinedApplicationPickUpAddressTypes; + applicationPickUpAddress: CombinedApplicationPickUpAddressTypes /** */ - leasingAgentAddress: CombinedLeasingAgentAddressTypes; + leasingAgentAddress: CombinedLeasingAgentAddressTypes /** */ - leasingAgents?: Id[]; + leasingAgents?: Id[] /** */ - applicationMethods: ApplicationMethod[]; + applicationMethods: ApplicationMethod[] /** */ - assets: Asset[]; + assets: Asset[] /** */ - events: ListingEvent[]; + events: ListingEvent[] /** */ - applicationDueDate: Date; + applicationDueDate: Date /** */ - applicationOpenDate: Date; + applicationOpenDate: Date /** */ - applicationFee: string; + applicationFee: string /** */ - applicationOrganization: string; + applicationOrganization: string /** */ - applicationPickUpAddressOfficeHours: string; + applicationPickUpAddressOfficeHours: string /** */ - buildingSelectionCriteria: string; + buildingSelectionCriteria: string /** */ - costsNotIncluded: string; + costsNotIncluded: string /** */ - creditHistory: string; + creditHistory: string /** */ - criminalBackground: string; + criminalBackground: string /** */ - depositMin: string; + depositMin: string /** */ - depositMax: string; + depositMax: string /** */ - disableUnitsAccordion: boolean; + disableUnitsAccordion: boolean /** */ - leasingAgentEmail: string; + leasingAgentEmail: string /** */ - leasingAgentName: string; + leasingAgentName: string /** */ - leasingAgentOfficeHours: string; + leasingAgentOfficeHours: string /** */ - leasingAgentPhone: string; + leasingAgentPhone: string /** */ - leasingAgentTitle: string; + leasingAgentTitle: string /** */ - name: string; + name: string /** */ - postmarkedApplicationsReceivedByDate: Date; + postmarkedApplicationsReceivedByDate: Date /** */ - programRules: string; + programRules: string /** */ - rentalAssistance: string; + rentalAssistance: string /** */ - rentalHistory: string; + rentalHistory: string /** */ - requiredDocuments: string; + requiredDocuments: string /** */ - waitlistCurrentSize: number; + waitlistCurrentSize: number /** */ - waitlistMaxSize: number; + waitlistMaxSize: number /** */ - whatToExpect: CombinedWhatToExpectTypes; + whatToExpect: CombinedWhatToExpectTypes /** */ - applicationConfig?: object; + applicationConfig?: object } export interface PreferenceUpdate { /** */ - ordinal: number; + ordinal: number /** */ - title: string; + title: string /** */ - subtitle: string; + subtitle: string /** */ - description: string; + description: string /** */ - links: PreferenceLink[]; + links: PreferenceLink[] /** */ - formMetadata?: FormMetadata; + formMetadata?: FormMetadata /** */ - id: string; + id: string /** */ - page: number; + page: number } export interface AddressUpdate { /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - placeName?: string; + placeName?: string /** */ - city?: string; + city?: string /** */ - county?: string; + county?: string /** */ - state?: string; + state?: string /** */ - street?: string; + street?: string /** */ - street2?: string; + street2?: string /** */ - zipCode?: string; + zipCode?: string /** */ - latitude?: number; + latitude?: number /** */ - longitude?: number; + longitude?: number } export interface ListingUpdate { /** */ - status: ListingStatus; + status: ListingStatus /** */ - displayWaitlistSize: boolean; + displayWaitlistSize: boolean /** */ - CSVFormattingType: CSVFormattingType; + CSVFormattingType: CSVFormattingType /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - preferences: PreferenceUpdate[]; + preferences: PreferenceUpdate[] /** */ - property: Id; + property: Id /** */ - applicationAddress: CombinedApplicationAddressTypes; + applicationAddress: CombinedApplicationAddressTypes /** */ - applicationPickUpAddress: CombinedApplicationPickUpAddressTypes; + applicationPickUpAddress: CombinedApplicationPickUpAddressTypes /** */ - leasingAgentAddress: CombinedLeasingAgentAddressTypes; + leasingAgentAddress: CombinedLeasingAgentAddressTypes /** */ - leasingAgents?: Id[]; + leasingAgents?: Id[] /** */ - applicationMethods: ApplicationMethod[]; + applicationMethods: ApplicationMethod[] /** */ - assets: Asset[]; + assets: Asset[] /** */ - events: ListingEvent[]; + events: ListingEvent[] /** */ - applicationDueDate: Date; + applicationDueDate: Date /** */ - applicationOpenDate: Date; + applicationOpenDate: Date /** */ - applicationFee: string; + applicationFee: string /** */ - applicationOrganization: string; + applicationOrganization: string /** */ - applicationPickUpAddressOfficeHours: string; + applicationPickUpAddressOfficeHours: string /** */ - buildingSelectionCriteria: string; + buildingSelectionCriteria: string /** */ - costsNotIncluded: string; + costsNotIncluded: string /** */ - creditHistory: string; + creditHistory: string /** */ - criminalBackground: string; + criminalBackground: string /** */ - depositMin: string; + depositMin: string /** */ - depositMax: string; + depositMax: string /** */ - disableUnitsAccordion: boolean; + disableUnitsAccordion: boolean /** */ - leasingAgentEmail: string; + leasingAgentEmail: string /** */ - leasingAgentName: string; + leasingAgentName: string /** */ - leasingAgentOfficeHours: string; + leasingAgentOfficeHours: string /** */ - leasingAgentPhone: string; + leasingAgentPhone: string /** */ - leasingAgentTitle: string; + leasingAgentTitle: string /** */ - name: string; + name: string /** */ - postmarkedApplicationsReceivedByDate: Date; + postmarkedApplicationsReceivedByDate: Date /** */ - programRules: string; + programRules: string /** */ - rentalAssistance: string; + rentalAssistance: string /** */ - rentalHistory: string; + rentalHistory: string /** */ - requiredDocuments: string; + requiredDocuments: string /** */ - waitlistCurrentSize: number; + waitlistCurrentSize: number /** */ - waitlistMaxSize: number; + waitlistMaxSize: number /** */ - whatToExpect: CombinedWhatToExpectTypes; + whatToExpect: CombinedWhatToExpectTypes /** */ - applicationConfig?: object; + applicationConfig?: object } export interface BooleanInput { /** */ - type: InputType; + type: InputType /** */ - key: string; + key: string /** */ - value: boolean; + value: boolean } export interface TextInput { /** */ - type: InputType; + type: InputType /** */ - key: string; + key: string /** */ - value: string; + value: string } export interface AddressInput { /** */ - type: InputType; + type: InputType /** */ - key: string; + key: string /** */ - value: AddressCreate; + value: AddressCreate } export interface Applicant { /** */ - address: Address; + address: Address /** */ - workAddress: Address; + workAddress: Address /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - firstName?: string; + firstName?: string /** */ - middleName?: string; + middleName?: string /** */ - lastName?: string; + lastName?: string /** */ - birthMonth?: string; + birthMonth?: string /** */ - birthDay?: string; + birthDay?: string /** */ - birthYear?: string; + birthYear?: string /** */ - emailAddress?: string; + emailAddress?: string /** */ - noEmail?: boolean; + noEmail?: boolean /** */ - phoneNumber?: string; + phoneNumber?: string /** */ - phoneNumberType?: string; + phoneNumberType?: string /** */ - noPhone?: boolean; + noPhone?: boolean /** */ - workInRegion?: string; + workInRegion?: string } export interface AlternateContact { /** */ - mailingAddress: Address; + mailingAddress: Address /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - type?: string; + type?: string /** */ - otherType?: string; + otherType?: string /** */ - firstName?: string; + firstName?: string /** */ - lastName?: string; + lastName?: string /** */ - agency?: string; + agency?: string /** */ - phoneNumber?: string; + phoneNumber?: string /** */ - emailAddress?: string; + emailAddress?: string } export interface Accessibility { /** */ - mobility?: boolean; + mobility?: boolean /** */ - vision?: boolean; + vision?: boolean /** */ - hearing?: boolean; + hearing?: boolean /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date } export interface Demographics { /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - ethnicity?: string; + ethnicity?: string /** */ - gender?: string; + gender?: string /** */ - sexualOrientation?: string; + sexualOrientation?: string /** */ - howDidYouHear: string[]; + howDidYouHear: string[] /** */ - race?: string; + race?: string } export interface HouseholdMember { /** */ - address: Address; + address: Address /** */ - workAddress: Address; + workAddress: Address /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - orderId?: number; + orderId?: number /** */ - firstName?: string; + firstName?: string /** */ - middleName?: string; + middleName?: string /** */ - lastName?: string; + lastName?: string /** */ - birthMonth?: string; + birthMonth?: string /** */ - birthDay?: string; + birthDay?: string /** */ - birthYear?: string; + birthYear?: string /** */ - emailAddress?: string; + emailAddress?: string /** */ - noEmail?: boolean; + noEmail?: boolean /** */ - phoneNumber?: string; + phoneNumber?: string /** */ - phoneNumberType?: string; + phoneNumberType?: string /** */ - noPhone?: boolean; + noPhone?: boolean /** */ - sameAddress?: string; + sameAddress?: string /** */ - relationship?: string; + relationship?: string /** */ - workInRegion?: string; + workInRegion?: string } export interface Application { /** */ - incomePeriod?: IncomePeriod; + incomePeriod?: IncomePeriod /** */ - status: ApplicationStatus; + status: ApplicationStatus /** */ - language?: Language; + language?: Language /** */ - submissionType: ApplicationSubmissionType; + submissionType: ApplicationSubmissionType /** */ - listing: Id; + listing: Id /** */ - applicant: Applicant; + applicant: Applicant /** */ - mailingAddress: Address; + mailingAddress: Address /** */ - alternateAddress: Address; + alternateAddress: Address /** */ - alternateContact: AlternateContact; + alternateContact: AlternateContact /** */ - accessibility: Accessibility; + accessibility: Accessibility /** */ - demographics: Demographics; + demographics: Demographics /** */ - householdMembers: HouseholdMember[]; + householdMembers: HouseholdMember[] /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - deletedAt?: Date; + deletedAt?: Date /** */ - appUrl?: string; + appUrl?: string /** */ - additionalPhone?: boolean; + additionalPhone?: boolean /** */ - additionalPhoneNumber?: string; + additionalPhoneNumber?: string /** */ - additionalPhoneNumberType?: string; + additionalPhoneNumberType?: string /** */ - contactPreferences: string[]; + contactPreferences: string[] /** */ - householdSize?: number; + householdSize?: number /** */ - housingStatus?: string; + housingStatus?: string /** */ - sendMailToMailingAddress?: boolean; + sendMailToMailingAddress?: boolean /** */ - incomeVouchers?: boolean; + incomeVouchers?: boolean /** */ - income?: string; + income?: string /** */ - preferredUnit: string[]; + preferredUnit: string[] /** */ - preferences: object; + preferences: object /** */ - acceptedTerms?: boolean; + acceptedTerms?: boolean /** */ - submissionDate?: Date; + submissionDate?: Date } export interface PaginationMeta { /** */ - currentPage: number; + currentPage: number /** */ - itemCount: number; + itemCount: number /** */ - itemsPerPage: number; + itemsPerPage: number /** */ - totalItems: number; + totalItems: number /** */ - totalPages: number; + totalPages: number } export interface PaginatedApplication { /** */ - items: Application[]; + items: Application[] /** */ - meta: PaginationMeta; + meta: PaginationMeta } export interface ApplicantCreate { /** */ - address: AddressCreate; + address: AddressCreate /** */ - workAddress: AddressCreate; + workAddress: AddressCreate /** */ - firstName?: string; + firstName?: string /** */ - middleName?: string; + middleName?: string /** */ - lastName?: string; + lastName?: string /** */ - birthMonth?: string; + birthMonth?: string /** */ - birthDay?: string; + birthDay?: string /** */ - birthYear?: string; + birthYear?: string /** */ - emailAddress?: string; + emailAddress?: string /** */ - noEmail?: boolean; + noEmail?: boolean /** */ - phoneNumber?: string; + phoneNumber?: string /** */ - phoneNumberType?: string; + phoneNumberType?: string /** */ - noPhone?: boolean; + noPhone?: boolean /** */ - workInRegion?: string; + workInRegion?: string } export interface AlternateContactCreate { /** */ - mailingAddress: AddressCreate; + mailingAddress: AddressCreate /** */ - type?: string; + type?: string /** */ - otherType?: string; + otherType?: string /** */ - firstName?: string; + firstName?: string /** */ - lastName?: string; + lastName?: string /** */ - agency?: string; + agency?: string /** */ - phoneNumber?: string; + phoneNumber?: string /** */ - emailAddress?: string; + emailAddress?: string } export interface AccessibilityCreate { /** */ - mobility?: boolean; + mobility?: boolean /** */ - vision?: boolean; + vision?: boolean /** */ - hearing?: boolean; + hearing?: boolean } export interface DemographicsCreate { /** */ - ethnicity?: string; + ethnicity?: string /** */ - gender?: string; + gender?: string /** */ - sexualOrientation?: string; + sexualOrientation?: string /** */ - howDidYouHear: string[]; + howDidYouHear: string[] /** */ - race?: string; + race?: string } export interface HouseholdMemberCreate { /** */ - address: AddressCreate; + address: AddressCreate /** */ - workAddress: AddressCreate; + workAddress: AddressCreate /** */ - orderId?: number; + orderId?: number /** */ - firstName?: string; + firstName?: string /** */ - middleName?: string; + middleName?: string /** */ - lastName?: string; + lastName?: string /** */ - birthMonth?: string; + birthMonth?: string /** */ - birthDay?: string; + birthDay?: string /** */ - birthYear?: string; + birthYear?: string /** */ - emailAddress?: string; + emailAddress?: string /** */ - noEmail?: boolean; + noEmail?: boolean /** */ - phoneNumber?: string; + phoneNumber?: string /** */ - phoneNumberType?: string; + phoneNumberType?: string /** */ - noPhone?: boolean; + noPhone?: boolean /** */ - sameAddress?: string; + sameAddress?: string /** */ - relationship?: string; + relationship?: string /** */ - workInRegion?: string; + workInRegion?: string } export interface ApplicationCreate { /** */ - incomePeriod?: IncomePeriod; + incomePeriod?: IncomePeriod /** */ - status: ApplicationStatus; + status: ApplicationStatus /** */ - language?: Language; + language?: Language /** */ - submissionType: ApplicationSubmissionType; + submissionType: ApplicationSubmissionType /** */ - listing: Id; + listing: Id /** */ - applicant: ApplicantCreate; + applicant: ApplicantCreate /** */ - mailingAddress: AddressCreate; + mailingAddress: AddressCreate /** */ - alternateAddress: AddressCreate; + alternateAddress: AddressCreate /** */ - alternateContact: AlternateContactCreate; + alternateContact: AlternateContactCreate /** */ - accessibility: AccessibilityCreate; + accessibility: AccessibilityCreate /** */ - demographics: DemographicsCreate; + demographics: DemographicsCreate /** */ - householdMembers: HouseholdMemberCreate[]; + householdMembers: HouseholdMemberCreate[] /** */ - appUrl?: string; + appUrl?: string /** */ - additionalPhone?: boolean; + additionalPhone?: boolean /** */ - additionalPhoneNumber?: string; + additionalPhoneNumber?: string /** */ - additionalPhoneNumberType?: string; + additionalPhoneNumberType?: string /** */ - contactPreferences: string[]; + contactPreferences: string[] /** */ - householdSize?: number; + householdSize?: number /** */ - housingStatus?: string; + housingStatus?: string /** */ - sendMailToMailingAddress?: boolean; + sendMailToMailingAddress?: boolean /** */ - incomeVouchers?: boolean; + incomeVouchers?: boolean /** */ - income?: string; + income?: string /** */ - preferredUnit: string[]; + preferredUnit: string[] /** */ - preferences: object; + preferences: object /** */ - acceptedTerms?: boolean; + acceptedTerms?: boolean /** */ - submissionDate?: Date; + submissionDate?: Date } export interface ApplicantUpdate { /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - address: AddressUpdate; + address: AddressUpdate /** */ - workAddress: AddressUpdate; + workAddress: AddressUpdate /** */ - firstName?: string; + firstName?: string /** */ - middleName?: string; + middleName?: string /** */ - lastName?: string; + lastName?: string /** */ - birthMonth?: string; + birthMonth?: string /** */ - birthDay?: string; + birthDay?: string /** */ - birthYear?: string; + birthYear?: string /** */ - emailAddress?: string; + emailAddress?: string /** */ - noEmail?: boolean; + noEmail?: boolean /** */ - phoneNumber?: string; + phoneNumber?: string /** */ - phoneNumberType?: string; + phoneNumberType?: string /** */ - noPhone?: boolean; + noPhone?: boolean /** */ - workInRegion?: string; + workInRegion?: string } export interface AlternateContactUpdate { /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - mailingAddress: AddressUpdate; + mailingAddress: AddressUpdate /** */ - type?: string; + type?: string /** */ - otherType?: string; + otherType?: string /** */ - firstName?: string; + firstName?: string /** */ - lastName?: string; + lastName?: string /** */ - agency?: string; + agency?: string /** */ - phoneNumber?: string; + phoneNumber?: string /** */ - emailAddress?: string; + emailAddress?: string } export interface AccessibilityUpdate { /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - mobility?: boolean; + mobility?: boolean /** */ - vision?: boolean; + vision?: boolean /** */ - hearing?: boolean; + hearing?: boolean } export interface DemographicsUpdate { /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - ethnicity?: string; + ethnicity?: string /** */ - gender?: string; + gender?: string /** */ - sexualOrientation?: string; + sexualOrientation?: string /** */ - howDidYouHear: string[]; + howDidYouHear: string[] /** */ - race?: string; + race?: string } export interface HouseholdMemberUpdate { /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - address: AddressUpdate; + address: AddressUpdate /** */ - workAddress: AddressUpdate; + workAddress: AddressUpdate /** */ - orderId?: number; + orderId?: number /** */ - firstName?: string; + firstName?: string /** */ - middleName?: string; + middleName?: string /** */ - lastName?: string; + lastName?: string /** */ - birthMonth?: string; + birthMonth?: string /** */ - birthDay?: string; + birthDay?: string /** */ - birthYear?: string; + birthYear?: string /** */ - emailAddress?: string; + emailAddress?: string /** */ - noEmail?: boolean; + noEmail?: boolean /** */ - phoneNumber?: string; + phoneNumber?: string /** */ - phoneNumberType?: string; + phoneNumberType?: string /** */ - noPhone?: boolean; + noPhone?: boolean /** */ - sameAddress?: string; + sameAddress?: string /** */ - relationship?: string; + relationship?: string /** */ - workInRegion?: string; + workInRegion?: string } export interface ApplicationUpdate { /** */ - incomePeriod?: IncomePeriod; + incomePeriod?: IncomePeriod /** */ - status: ApplicationStatus; + status: ApplicationStatus /** */ - language?: Language; + language?: Language /** */ - submissionType: ApplicationSubmissionType; + submissionType: ApplicationSubmissionType /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - deletedAt?: Date; + deletedAt?: Date /** */ - listing: Id; + listing: Id /** */ - applicant: ApplicantUpdate; + applicant: ApplicantUpdate /** */ - mailingAddress: AddressUpdate; + mailingAddress: AddressUpdate /** */ - alternateAddress: AddressUpdate; + alternateAddress: AddressUpdate /** */ - alternateContact: AlternateContactUpdate; + alternateContact: AlternateContactUpdate /** */ - accessibility: AccessibilityUpdate; + accessibility: AccessibilityUpdate /** */ - demographics: DemographicsUpdate; + demographics: DemographicsUpdate /** */ - householdMembers: HouseholdMemberUpdate[]; + householdMembers: HouseholdMemberUpdate[] /** */ - appUrl?: string; + appUrl?: string /** */ - additionalPhone?: boolean; + additionalPhone?: boolean /** */ - additionalPhoneNumber?: string; + additionalPhoneNumber?: string /** */ - additionalPhoneNumberType?: string; + additionalPhoneNumberType?: string /** */ - contactPreferences: string[]; + contactPreferences: string[] /** */ - householdSize?: number; + householdSize?: number /** */ - housingStatus?: string; + housingStatus?: string /** */ - sendMailToMailingAddress?: boolean; + sendMailToMailingAddress?: boolean /** */ - incomeVouchers?: boolean; + incomeVouchers?: boolean /** */ - income?: string; + income?: string /** */ - preferredUnit: string[]; + preferredUnit: string[] /** */ - preferences: object; + preferences: object /** */ - acceptedTerms?: boolean; + acceptedTerms?: boolean /** */ - submissionDate?: Date; + submissionDate?: Date } export interface UnitCreate { /** */ - amiChart: CombinedAmiChartTypes; + amiChart: CombinedAmiChartTypes /** */ - amiPercentage?: string; + amiPercentage?: string /** */ - annualIncomeMin?: string; + annualIncomeMin?: string /** */ - monthlyIncomeMin?: string; + monthlyIncomeMin?: string /** */ - floor?: number; + floor?: number /** */ - annualIncomeMax?: string; + annualIncomeMax?: string /** */ - maxOccupancy?: number; + maxOccupancy?: number /** */ - minOccupancy?: number; + minOccupancy?: number /** */ - monthlyRent?: string; + monthlyRent?: string /** */ - numBathrooms?: number; + numBathrooms?: number /** */ - numBedrooms?: number; + numBedrooms?: number /** */ - number?: string; + number?: string /** */ - priorityType?: string; + priorityType?: string /** */ - reservedType?: string; + reservedType?: string /** */ - sqFeet?: string; + sqFeet?: string /** */ - status?: string; + status?: string /** */ - unitType?: string; + unitType?: string /** */ - monthlyRentAsPercentOfIncome?: string; + monthlyRentAsPercentOfIncome?: string /** */ - bmrProgramChart?: boolean; + bmrProgramChart?: boolean } export interface UnitUpdate { /** */ - amiChart: CombinedAmiChartTypes; + amiChart: CombinedAmiChartTypes /** */ - amiPercentage?: string; + amiPercentage?: string /** */ - annualIncomeMin?: string; + annualIncomeMin?: string /** */ - monthlyIncomeMin?: string; + monthlyIncomeMin?: string /** */ - floor?: number; + floor?: number /** */ - annualIncomeMax?: string; + annualIncomeMax?: string /** */ - maxOccupancy?: number; + maxOccupancy?: number /** */ - minOccupancy?: number; + minOccupancy?: number /** */ - monthlyRent?: string; + monthlyRent?: string /** */ - numBathrooms?: number; + numBathrooms?: number /** */ - numBedrooms?: number; + numBedrooms?: number /** */ - number?: string; + number?: string /** */ - priorityType?: string; + priorityType?: string /** */ - reservedType?: string; + reservedType?: string /** */ - sqFeet?: string; + sqFeet?: string /** */ - status?: string; + status?: string /** */ - unitType?: string; + unitType?: string /** */ - monthlyRentAsPercentOfIncome?: string; + monthlyRentAsPercentOfIncome?: string /** */ - bmrProgramChart?: boolean; + bmrProgramChart?: boolean /** */ - id: string; + id: string } export interface PropertyCreate { /** */ - buildingAddress: AddressUpdate; + buildingAddress: AddressUpdate /** */ - units: UnitCreate[]; + units: UnitCreate[] /** */ - accessibility: string; + accessibility: string /** */ - amenities: string; + amenities: string /** */ - buildingTotalUnits: number; + buildingTotalUnits: number /** */ - developer: string; + developer: string /** */ - householdSizeMax: number; + householdSizeMax: number /** */ - householdSizeMin: number; + householdSizeMin: number /** */ - neighborhood: string; + neighborhood: string /** */ - petPolicy: string; + petPolicy: string /** */ - smokingPolicy: string; + smokingPolicy: string /** */ - unitsAvailable: number; + unitsAvailable: number /** */ - unitAmenities: string; + unitAmenities: string /** */ - yearBuilt: number; + yearBuilt: number } export interface PropertyUpdate { /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - buildingAddress: AddressUpdate; + buildingAddress: AddressUpdate /** */ - units: UnitUpdate[]; + units: UnitUpdate[] /** */ - accessibility: string; + accessibility: string /** */ - amenities: string; + amenities: string /** */ - buildingTotalUnits: number; + buildingTotalUnits: number /** */ - developer: string; + developer: string /** */ - householdSizeMax: number; + householdSizeMax: number /** */ - householdSizeMin: number; + householdSizeMin: number /** */ - neighborhood: string; + neighborhood: string /** */ - petPolicy: string; + petPolicy: string /** */ - smokingPolicy: string; + smokingPolicy: string /** */ - unitsAvailable: number; + unitsAvailable: number /** */ - unitAmenities: string; + unitAmenities: string /** */ - yearBuilt: number; + yearBuilt: number } export interface PropertyGroup { /** */ - properties: Id[]; + properties: Id[] /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - name: string; + name: string } export interface PropertyGroupCreate { /** */ - name: string; + name: string /** */ - properties: Id[]; + properties: Id[] } export interface PropertyGroupUpdate { /** */ - name: string; + name: string /** */ - properties: Id[]; + properties: Id[] /** */ - id: string; + id: string } export interface AmiChartCreate { /** */ - items: AmiChartItem[]; + items: AmiChartItem[] /** */ - name: string; + name: string } export interface AmiChartUpdate { /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - items: AmiChartItem[]; + items: AmiChartItem[] /** */ - name: string; + name: string } export enum UserRole { - 'user' = 'user', - 'admin' = 'admin' + "user" = "user", + "admin" = "admin", } export enum ListingStatus { - 'active' = 'active', - 'pending' = 'pending', - 'closed' = 'closed' + "active" = "active", + "pending" = "pending", + "closed" = "closed", } export enum CSVFormattingType { - 'basic' = 'basic', - 'withDisplaceeNameAndAddress' = 'withDisplaceeNameAndAddress' + "basic" = "basic", + "withDisplaceeNameAndAddress" = "withDisplaceeNameAndAddress", } -export type CombinedAmiChartTypes = (AmiChart & any) | null; +export type CombinedAmiChartTypes = (AmiChart & any) | null export enum ApplicationMethodType { - 'Internal' = 'Internal', - 'FileDownload' = 'FileDownload', - 'ExternalLink' = 'ExternalLink', - 'PaperPickup' = 'PaperPickup', - 'POBox' = 'POBox', - 'LeasingAgent' = 'LeasingAgent' + "Internal" = "Internal", + "FileDownload" = "FileDownload", + "ExternalLink" = "ExternalLink", + "PaperPickup" = "PaperPickup", + "POBox" = "POBox", + "LeasingAgent" = "LeasingAgent", } export enum InputType { - 'boolean' = 'boolean', - 'text' = 'text', - 'address' = 'address' + "boolean" = "boolean", + "text" = "text", + "address" = "address", } export enum ListingEventType { - 'openHouse' = 'openHouse', - 'publicLottery' = 'publicLottery' + "openHouse" = "openHouse", + "publicLottery" = "publicLottery", } -export type CombinedApplicationAddressTypes = (AddressUpdate & any) | null; -export type CombinedApplicationPickUpAddressTypes = (AddressUpdate & any) | null; -export type CombinedLeasingAgentAddressTypes = (AddressUpdate & any) | null; -export type CombinedWhatToExpectTypes = (WhatToExpect & any) | null; +export type CombinedApplicationAddressTypes = (AddressUpdate & any) | null +export type CombinedApplicationPickUpAddressTypes = (AddressUpdate & any) | null +export type CombinedLeasingAgentAddressTypes = (AddressUpdate & any) | null +export type CombinedWhatToExpectTypes = (WhatToExpect & any) | null export enum IncomePeriod { - 'perMonth' = 'perMonth', - 'perYear' = 'perYear' + "perMonth" = "perMonth", + "perYear" = "perYear", } export enum ApplicationStatus { - 'draft' = 'draft', - 'submitted' = 'submitted', - 'removed' = 'removed' + "draft" = "draft", + "submitted" = "submitted", + "removed" = "removed", } export enum Language { - 'en' = 'en', - 'es' = 'es' + "en" = "en", + "es" = "es", } export enum ApplicationSubmissionType { - 'paper' = 'paper', - 'electronical' = 'electronical' + "paper" = "paper", + "electronical" = "electronical", } diff --git a/backend/core/types/src/backend-swagger.ts b/backend/core/types/src/backend-swagger.ts index 7ab4166c17..51d3cf2a03 100644 --- a/backend/core/types/src/backend-swagger.ts +++ b/backend/core/types/src/backend-swagger.ts @@ -1,80 +1,89 @@ /** Generate by swagger-axios-codegen */ // tslint:disable /* eslint-disable */ -import axiosStatic, { AxiosInstance } from 'axios'; +import axiosStatic, { AxiosInstance } from "axios" export interface IRequestOptions { - headers?: any; - baseURL?: string; - responseType?: string; + headers?: any + baseURL?: string + responseType?: string } export interface IRequestConfig { - method?: any; - headers?: any; - url?: any; - data?: any; - params?: any; + method?: any + headers?: any + url?: any + data?: any + params?: any } // Add options interface export interface ServiceOptions { - axios?: AxiosInstance; + axios?: AxiosInstance } // Add default options -export const serviceOptions: ServiceOptions = {}; +export const serviceOptions: ServiceOptions = {} // Instance selector -export function axios(configs: IRequestConfig, resolve: (p: any) => void, reject: (p: any) => void): Promise { +export function axios( + configs: IRequestConfig, + resolve: (p: any) => void, + reject: (p: any) => void +): Promise { if (serviceOptions.axios) { return serviceOptions.axios .request(configs) - .then(res => { - resolve(res.data); + .then((res) => { + resolve(res.data) + }) + .catch((err) => { + reject(err) }) - .catch(err => { - reject(err); - }); } else { - throw new Error('please inject yourself instance like axios '); + throw new Error("please inject yourself instance like axios ") } } -export function getConfigs(method: string, contentType: string, url: string, options: any): IRequestConfig { - const configs: IRequestConfig = { ...options, method, url }; +export function getConfigs( + method: string, + contentType: string, + url: string, + options: any +): IRequestConfig { + const configs: IRequestConfig = { ...options, method, url } configs.headers = { ...options.headers, - 'Content-Type': contentType - }; - return configs; + "Content-Type": contentType, + } + return configs } -const basePath = ''; +const basePath = "" export interface IList extends Array {} export interface List extends Array {} export interface IDictionary { - [key: string]: TValue; + [key: string]: TValue } export interface Dictionary extends IDictionary {} export interface IListResult { - items?: T[]; + items?: T[] } export class ListResult implements IListResult { - items?: T[]; + items?: T[] } export interface IPagedResult extends IListResult { - totalCount?: number; - items?: T[]; + totalCount?: number + items?: T[] } export class PagedResult implements IPagedResult { - totalCount?: number; - items?: T[]; + totalCount?: number + items?: T[] } // customer definition @@ -86,36 +95,38 @@ export class UserService { */ userControllerProfile(options: IRequestOptions = {}): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/user'; + let url = basePath + "/user" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Create user */ create( params: { + /** */ + noWelcomeEmail?: boolean /** requestBody */ - body?: UserCreate; + body?: UserCreate } = {} as any, options: IRequestOptions = {} - ): Promise { + ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/user'; - - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + let url = basePath + "/user" - let data = params.body; + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) + configs.params = { noWelcomeEmail: params["noWelcomeEmail"] } + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Resend confirmation @@ -123,20 +134,20 @@ export class UserService { resendConfirmation( params: { /** requestBody */ - body?: Email; + body?: Email } = {} as any, options: IRequestOptions = {} - ): Promise { + ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/user/resend-confirmation'; + let url = basePath + "/user/resend-confirmation" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Confirm email @@ -144,20 +155,20 @@ export class UserService { confirm( params: { /** requestBody */ - body?: Confirm; + body?: Confirm } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/user/confirm'; + let url = basePath + "/user/confirm" - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Forgot Password @@ -165,20 +176,20 @@ export class UserService { forgotPassword( params: { /** requestBody */ - body?: ForgotPassword; + body?: ForgotPassword } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/user/forgot-password'; + let url = basePath + "/user/forgot-password" - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update Password @@ -186,20 +197,20 @@ export class UserService { updatePassword( params: { /** requestBody */ - body?: UpdatePassword; + body?: UpdatePassword } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/user/update-password'; + let url = basePath + "/user/update-password" - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update user @@ -207,20 +218,20 @@ export class UserService { update( params: { /** requestBody */ - body?: UserUpdate; + body?: UserUpdate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/user/{id}'; + let url = basePath + "/user/{id}" - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -231,35 +242,35 @@ export class AuthService { login( params: { /** requestBody */ - body?: Login; + body?: Login } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/auth/login'; + let url = basePath + "/auth/login" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Token */ token(options: IRequestOptions = {}): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/auth/token'; + let url = basePath + "/auth/token" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -270,20 +281,20 @@ export class ListingsService { list( params: { /** */ - jsonpath?: string; + jsonpath?: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/listings'; + let url = basePath + "/listings" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); - configs.params = { jsonpath: params['jsonpath'] }; - let data = null; + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) + configs.params = { jsonpath: params["jsonpath"] } + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Create listing @@ -291,20 +302,20 @@ export class ListingsService { create( params: { /** requestBody */ - body?: ListingCreate; + body?: ListingCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/listings'; + let url = basePath + "/listings" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Get listing by id @@ -312,21 +323,21 @@ export class ListingsService { retrieve( params: { /** */ - listingId: string; + listingId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/listings/{listingId}'; - url = url.replace('{listingId}', params['listingId'] + ''); + let url = basePath + "/listings/{listingId}" + url = url.replace("{listingId}", params["listingId"] + "") - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update listing by id @@ -334,23 +345,23 @@ export class ListingsService { update( params: { /** */ - listingId: string; + listingId: string /** requestBody */ - body?: ListingUpdate; + body?: ListingUpdate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/listings/{listingId}'; - url = url.replace('{listingId}', params['listingId'] + ''); + let url = basePath + "/listings/{listingId}" + url = url.replace("{listingId}", params["listingId"] + "") - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Delete listing by id @@ -358,21 +369,21 @@ export class ListingsService { delete( params: { /** */ - listingId: string; + listingId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/listings/{listingId}'; - url = url.replace('{listingId}', params['listingId'] + ''); + let url = basePath + "/listings/{listingId}" + url = url.replace("{listingId}", params["listingId"] + "") - const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("delete", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -383,43 +394,43 @@ export class ApplicationsService { list( params: { /** */ - page?: number; + page?: number /** */ - limit?: number; + limit?: number /** */ - listingId?: string; + listingId?: string /** */ - search?: string; + search?: string /** */ - userId?: string; + userId?: string /** */ - orderBy?: string; + orderBy?: string /** */ - order?: string; + order?: string /** */ - markedAsDuplicate?: boolean; + markedAsDuplicate?: boolean } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/applications'; + let url = basePath + "/applications" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) configs.params = { - page: params['page'], - limit: params['limit'], - listingId: params['listingId'], - search: params['search'], - userId: params['userId'], - orderBy: params['orderBy'], - order: params['order'], - markedAsDuplicate: params['markedAsDuplicate'] - }; - let data = null; - - configs.data = data; - axios(configs, resolve, reject); - }); + page: params["page"], + limit: params["limit"], + listingId: params["listingId"], + search: params["search"], + userId: params["userId"], + orderBy: params["orderBy"], + order: params["order"], + markedAsDuplicate: params["markedAsDuplicate"], + } + let data = null + + configs.data = data + axios(configs, resolve, reject) + }) } /** * Create application @@ -427,20 +438,20 @@ export class ApplicationsService { create( params: { /** requestBody */ - body?: ApplicationCreate; + body?: ApplicationCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/applications'; + let url = basePath + "/applications" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * List applications as csv @@ -448,49 +459,49 @@ export class ApplicationsService { listAsCsv( params: { /** */ - page?: number; + page?: number /** */ - limit?: number; + limit?: number /** */ - listingId?: string; + listingId?: string /** */ - search?: string; + search?: string /** */ - userId?: string; + userId?: string /** */ - orderBy?: string; + orderBy?: string /** */ - order?: string; + order?: string /** */ - markedAsDuplicate?: boolean; + markedAsDuplicate?: boolean /** */ - includeHeaders?: boolean; + includeHeaders?: boolean /** */ - includeDemographics?: boolean; + includeDemographics?: boolean } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/applications/csv'; + let url = basePath + "/applications/csv" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) configs.params = { - page: params['page'], - limit: params['limit'], - listingId: params['listingId'], - search: params['search'], - userId: params['userId'], - orderBy: params['orderBy'], - order: params['order'], - markedAsDuplicate: params['markedAsDuplicate'], - includeHeaders: params['includeHeaders'], - includeDemographics: params['includeDemographics'] - }; - let data = null; - - configs.data = data; - axios(configs, resolve, reject); - }); + page: params["page"], + limit: params["limit"], + listingId: params["listingId"], + search: params["search"], + userId: params["userId"], + orderBy: params["orderBy"], + order: params["order"], + markedAsDuplicate: params["markedAsDuplicate"], + includeHeaders: params["includeHeaders"], + includeDemographics: params["includeDemographics"], + } + let data = null + + configs.data = data + axios(configs, resolve, reject) + }) } /** * Get application by id @@ -498,21 +509,21 @@ export class ApplicationsService { retrieve( params: { /** */ - applicationId: string; + applicationId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/applications/{applicationId}'; - url = url.replace('{applicationId}', params['applicationId'] + ''); + let url = basePath + "/applications/{applicationId}" + url = url.replace("{applicationId}", params["applicationId"] + "") - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update application by id @@ -520,23 +531,23 @@ export class ApplicationsService { update( params: { /** */ - applicationId: string; + applicationId: string /** requestBody */ - body?: ApplicationUpdate; + body?: ApplicationUpdate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/applications/{applicationId}'; - url = url.replace('{applicationId}', params['applicationId'] + ''); + let url = basePath + "/applications/{applicationId}" + url = url.replace("{applicationId}", params["applicationId"] + "") - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Delete application by id @@ -544,21 +555,21 @@ export class ApplicationsService { delete( params: { /** */ - applicationId: string; + applicationId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/applications/{applicationId}'; - url = url.replace('{applicationId}', params['applicationId'] + ''); + let url = basePath + "/applications/{applicationId}" + url = url.replace("{applicationId}", params["applicationId"] + "") - const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("delete", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Submit application @@ -566,20 +577,20 @@ export class ApplicationsService { submit( params: { /** requestBody */ - body?: ApplicationCreate; + body?: ApplicationCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/applications/submit'; + let url = basePath + "/applications/submit" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -589,15 +600,15 @@ export class PreferencesService { */ list(options: IRequestOptions = {}): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/preferences'; + let url = basePath + "/preferences" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Create preference @@ -605,20 +616,20 @@ export class PreferencesService { create( params: { /** requestBody */ - body?: PreferenceCreate; + body?: PreferenceCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/preferences'; + let url = basePath + "/preferences" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update preference @@ -626,20 +637,20 @@ export class PreferencesService { update( params: { /** requestBody */ - body?: PreferenceUpdate; + body?: PreferenceUpdate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/preferences/{preferenceId}'; + let url = basePath + "/preferences/{preferenceId}" - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Get preference by id @@ -647,21 +658,21 @@ export class PreferencesService { retrieve( params: { /** */ - preferenceId: string; + preferenceId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/preferences/{preferenceId}'; - url = url.replace('{preferenceId}', params['preferenceId'] + ''); + let url = basePath + "/preferences/{preferenceId}" + url = url.replace("{preferenceId}", params["preferenceId"] + "") - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Delete preference by id @@ -669,21 +680,21 @@ export class PreferencesService { delete( params: { /** */ - preferenceId: string; + preferenceId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/preferences/{preferenceId}'; - url = url.replace('{preferenceId}', params['preferenceId'] + ''); + let url = basePath + "/preferences/{preferenceId}" + url = url.replace("{preferenceId}", params["preferenceId"] + "") - const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("delete", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -693,15 +704,15 @@ export class UnitsService { */ list(options: IRequestOptions = {}): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/units'; + let url = basePath + "/units" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Create unit @@ -709,20 +720,20 @@ export class UnitsService { create( params: { /** requestBody */ - body?: UnitCreate; + body?: UnitCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/units'; + let url = basePath + "/units" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update unit @@ -730,20 +741,20 @@ export class UnitsService { update( params: { /** requestBody */ - body?: UnitUpdate; + body?: UnitUpdate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/units/{unitId}'; + let url = basePath + "/units/{unitId}" - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Get unit by id @@ -751,21 +762,21 @@ export class UnitsService { retrieve( params: { /** */ - unitId: string; + unitId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/units/{unitId}'; - url = url.replace('{unitId}', params['unitId'] + ''); + let url = basePath + "/units/{unitId}" + url = url.replace("{unitId}", params["unitId"] + "") - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Delete unit by id @@ -773,21 +784,21 @@ export class UnitsService { delete( params: { /** */ - unitId: string; + unitId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/units/{unitId}'; - url = url.replace('{unitId}', params['unitId'] + ''); + let url = basePath + "/units/{unitId}" + url = url.replace("{unitId}", params["unitId"] + "") - const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("delete", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -797,15 +808,15 @@ export class PropertiesService { */ list(options: IRequestOptions = {}): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/properties'; + let url = basePath + "/properties" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Create property @@ -813,20 +824,20 @@ export class PropertiesService { create( params: { /** requestBody */ - body?: PropertyCreate; + body?: PropertyCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/properties'; + let url = basePath + "/properties" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update property @@ -834,20 +845,20 @@ export class PropertiesService { update( params: { /** requestBody */ - body?: PropertyUpdate; + body?: PropertyUpdate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/properties/{propertyId}'; + let url = basePath + "/properties/{propertyId}" - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Get property by id @@ -855,21 +866,21 @@ export class PropertiesService { retrieve( params: { /** */ - propertyId: string; + propertyId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/properties/{propertyId}'; - url = url.replace('{propertyId}', params['propertyId'] + ''); + let url = basePath + "/properties/{propertyId}" + url = url.replace("{propertyId}", params["propertyId"] + "") - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Delete property by id @@ -877,21 +888,21 @@ export class PropertiesService { delete( params: { /** */ - propertyId: string; + propertyId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/properties/{propertyId}'; - url = url.replace('{propertyId}', params['propertyId'] + ''); + let url = basePath + "/properties/{propertyId}" + url = url.replace("{propertyId}", params["propertyId"] + "") - const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("delete", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -901,15 +912,15 @@ export class PropertyGroupsService { */ list(options: IRequestOptions = {}): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/propertyGroups'; + let url = basePath + "/propertyGroups" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Create propertyGroup @@ -917,20 +928,20 @@ export class PropertyGroupsService { create( params: { /** requestBody */ - body?: PropertyGroupCreate; + body?: PropertyGroupCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/propertyGroups'; + let url = basePath + "/propertyGroups" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update propertyGroup @@ -938,20 +949,20 @@ export class PropertyGroupsService { update( params: { /** requestBody */ - body?: PropertyGroupUpdate; + body?: PropertyGroupUpdate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/propertyGroups/{propertyGroupId}'; + let url = basePath + "/propertyGroups/{propertyGroupId}" - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Get propertyGroup by id @@ -959,21 +970,21 @@ export class PropertyGroupsService { retrieve( params: { /** */ - propertyGroupId: string; + propertyGroupId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/propertyGroups/{propertyGroupId}'; - url = url.replace('{propertyGroupId}', params['propertyGroupId'] + ''); + let url = basePath + "/propertyGroups/{propertyGroupId}" + url = url.replace("{propertyGroupId}", params["propertyGroupId"] + "") - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Delete propertyGroup by id @@ -981,21 +992,21 @@ export class PropertyGroupsService { delete( params: { /** */ - propertyGroupId: string; + propertyGroupId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/propertyGroups/{propertyGroupId}'; - url = url.replace('{propertyGroupId}', params['propertyGroupId'] + ''); + let url = basePath + "/propertyGroups/{propertyGroupId}" + url = url.replace("{propertyGroupId}", params["propertyGroupId"] + "") - const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("delete", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -1005,15 +1016,15 @@ export class AmiChartsService { */ list(options: IRequestOptions = {}): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/amiCharts'; + let url = basePath + "/amiCharts" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Create amiChart @@ -1021,20 +1032,20 @@ export class AmiChartsService { create( params: { /** requestBody */ - body?: AmiChartCreate; + body?: AmiChartCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/amiCharts'; + let url = basePath + "/amiCharts" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update amiChart @@ -1042,20 +1053,20 @@ export class AmiChartsService { update( params: { /** requestBody */ - body?: AmiChartUpdate; + body?: AmiChartUpdate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/amiCharts/{amiChartId}'; + let url = basePath + "/amiCharts/{amiChartId}" - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Get amiChart by id @@ -1063,21 +1074,21 @@ export class AmiChartsService { retrieve( params: { /** */ - amiChartId: string; + amiChartId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/amiCharts/{amiChartId}'; - url = url.replace('{amiChartId}', params['amiChartId'] + ''); + let url = basePath + "/amiCharts/{amiChartId}" + url = url.replace("{amiChartId}", params["amiChartId"] + "") - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Delete amiChart by id @@ -1085,21 +1096,21 @@ export class AmiChartsService { delete( params: { /** */ - amiChartId: string; + amiChartId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/amiCharts/{amiChartId}'; - url = url.replace('{amiChartId}', params['amiChartId'] + ''); + let url = basePath + "/amiCharts/{amiChartId}" + url = url.replace("{amiChartId}", params["amiChartId"] + "") - const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("delete", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -1109,15 +1120,15 @@ export class TranslationsService { */ list(options: IRequestOptions = {}): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/translations'; + let url = basePath + "/translations" - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Create translation @@ -1125,20 +1136,20 @@ export class TranslationsService { create( params: { /** requestBody */ - body?: TranslationCreate; + body?: TranslationCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/translations'; + let url = basePath + "/translations" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Update translation @@ -1146,20 +1157,20 @@ export class TranslationsService { update( params: { /** requestBody */ - body?: TranslationUpdate; + body?: TranslationUpdate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/translations/{translationId}'; + let url = basePath + "/translations/{translationId}" - const configs: IRequestConfig = getConfigs('put', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("put", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Get translation by id @@ -1167,21 +1178,21 @@ export class TranslationsService { retrieve( params: { /** */ - translationId: string; + translationId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/translations/{translationId}'; - url = url.replace('{translationId}', params['translationId'] + ''); + let url = basePath + "/translations/{translationId}" + url = url.replace("{translationId}", params["translationId"] + "") - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Delete translation by id @@ -1189,21 +1200,21 @@ export class TranslationsService { delete( params: { /** */ - translationId: string; + translationId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/translations/{translationId}'; - url = url.replace('{translationId}', params['translationId'] + ''); + let url = basePath + "/translations/{translationId}" + url = url.replace("{translationId}", params["translationId"] + "") - const configs: IRequestConfig = getConfigs('delete', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("delete", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -1214,24 +1225,28 @@ export class ApplicationFlaggedSetsService { list( params: { /** */ - page?: number; + page?: number /** */ - limit?: number; + limit?: number /** */ - listingId: string; + listingId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/applicationFlaggedSets'; - - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); - configs.params = { page: params['page'], limit: params['limit'], listingId: params['listingId'] }; - let data = null; + let url = basePath + "/applicationFlaggedSets" - configs.data = data; - axios(configs, resolve, reject); - }); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) + configs.params = { + page: params["page"], + limit: params["limit"], + listingId: params["listingId"], + } + let data = null + + configs.data = data + axios(configs, resolve, reject) + }) } /** * Retrieve application flagged set by id @@ -1239,21 +1254,21 @@ export class ApplicationFlaggedSetsService { retrieve( params: { /** */ - afsId: string; + afsId: string } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/applicationFlaggedSets/{afsId}'; - url = url.replace('{afsId}', params['afsId'] + ''); + let url = basePath + "/applicationFlaggedSets/{afsId}" + url = url.replace("{afsId}", params["afsId"] + "") - const configs: IRequestConfig = getConfigs('get', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("get", "application/json", url, options) - let data = null; + let data = null - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Resolve application flagged set @@ -1261,20 +1276,20 @@ export class ApplicationFlaggedSetsService { resolve( params: { /** requestBody */ - body?: ApplicationFlaggedSetResolve; + body?: ApplicationFlaggedSetResolve } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/applicationFlaggedSets/resolve'; + let url = basePath + "/applicationFlaggedSets/resolve" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } @@ -1285,20 +1300,20 @@ export class AssetsService { create( params: { /** requestBody */ - body?: AssetCreate; + body?: AssetCreate } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/assets'; + let url = basePath + "/assets" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } /** * Create presigned upload metadata @@ -1306,2557 +1321,2557 @@ export class AssetsService { createPresignedUploadMetadata( params: { /** requestBody */ - body?: CreatePresignedUploadMetadata; + body?: CreatePresignedUploadMetadata } = {} as any, options: IRequestOptions = {} ): Promise { return new Promise((resolve, reject) => { - let url = basePath + '/assets/presigned-upload-metadata'; + let url = basePath + "/assets/presigned-upload-metadata" - const configs: IRequestConfig = getConfigs('post', 'application/json', url, options); + const configs: IRequestConfig = getConfigs("post", "application/json", url, options) - let data = params.body; + let data = params.body - configs.data = data; - axios(configs, resolve, reject); - }); + configs.data = data + axios(configs, resolve, reject) + }) } } export interface Id { /** */ - id: string; + id: string } export interface User { /** */ - roles: UserRole[]; + roles: UserRole[] /** */ - language?: Language; + language?: Language /** */ - leasingAgentInListings?: Id[]; + leasingAgentInListings?: Id[] /** */ - id: string; + id: string /** */ - confirmedAt?: Date; + confirmedAt?: Date /** */ - email: string; + email: string /** */ - firstName: string; + firstName: string /** */ - middleName?: string; + middleName?: string /** */ - lastName: string; + lastName: string /** */ - dob: Date; + dob: Date /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date } export interface UserCreate { /** */ - language?: Language; + language?: Language /** */ - password: string; + password: string /** */ - passwordConfirmation: string; + passwordConfirmation: string /** */ - emailConfirmation: string; + emailConfirmation: string /** */ - appUrl?: string; + appUrl?: string /** */ - email: string; + email: string /** */ - firstName: string; + firstName: string /** */ - middleName?: string; + middleName?: string /** */ - lastName: string; + lastName: string /** */ - dob: Date; + dob: Date } -export interface Status { +export interface UserBasic { /** */ - status: string; -} + language?: Language -export interface Email { /** */ - email: string; + id: string /** */ - appUrl?: string; -} + confirmedAt?: Date -export interface UserBasic { /** */ - language?: Language; + email: string /** */ - id: string; + firstName: string /** */ - confirmedAt?: Date; + middleName?: string /** */ - email: string; + lastName: string /** */ - firstName: string; + createdAt: Date /** */ - middleName?: string; + updatedAt: Date +} +export interface Email { /** */ - lastName: string; + email: string /** */ - createdAt: Date; + appUrl?: string +} +export interface Status { /** */ - updatedAt: Date; + status: string } export interface Confirm { /** */ - token: string; + token: string } export interface LoginResponse { /** */ - accessToken: string; + accessToken: string } export interface ForgotPassword { /** */ - email: string; + email: string /** */ - appUrl?: string; + appUrl?: string } export interface ForgotPasswordResponse { /** */ - message: string; + message: string } export interface UpdatePassword { /** */ - password: string; + password: string /** */ - passwordConfirmation: string; + passwordConfirmation: string /** */ - token: string; + token: string } export interface UserUpdate { /** */ - language?: Language; + language?: Language /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - password?: string; + password?: string /** */ - currentPassword?: string; + currentPassword?: string /** */ - confirmedAt?: Date; + confirmedAt?: Date /** */ - email: string; + email: string /** */ - firstName: string; + firstName: string /** */ - middleName?: string; + middleName?: string /** */ - lastName: string; + lastName: string /** */ - dob: Date; + dob: Date } export interface Login { /** */ - email: string; + email: string /** */ - password: string; + password: string } export interface PreferenceLink { /** */ - title: string; + title: string /** */ - url: string; + url: string } export interface FormMetadataExtraData { /** */ - type: InputType; + type: InputType /** */ - key: string; + key: string } export interface FormMetadataOptions { /** */ - key: string; + key: string /** */ - extraData?: FormMetadataExtraData[]; + extraData?: FormMetadataExtraData[] /** */ - description: boolean; + description: boolean /** */ - exclusive: boolean; + exclusive: boolean } export interface FormMetadata { /** */ - key: string; + key: string /** */ - options: FormMetadataOptions[]; + options: FormMetadataOptions[] /** */ - hideGenericDecline: boolean; + hideGenericDecline: boolean /** */ - customSelectText: string; + customSelectText: string /** */ - hideFromListing: boolean; + hideFromListing: boolean } export interface Preference { /** */ - links: PreferenceLink[]; + links: PreferenceLink[] /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - ordinal: number; + ordinal: number /** */ - title: string; + title: string /** */ - subtitle: string; + subtitle: string /** */ - description: string; + description: string /** */ - formMetadata?: FormMetadata; + formMetadata?: FormMetadata /** */ - page: number; + page: number } export interface MinMaxCurrency { /** */ - min: string; + min: string /** */ - max: string; + max: string } export interface MinMax { /** */ - min: number; + min: number /** */ - max: number; + max: number } export interface UnitSummary { /** */ - unitType: string; + unitType: string /** */ - minIncomeRange: MinMaxCurrency; + minIncomeRange: MinMaxCurrency /** */ - occupancyRange: MinMax; + occupancyRange: MinMax /** */ - rentAsPercentIncomeRange: MinMax; + rentAsPercentIncomeRange: MinMax /** */ - rentRange: MinMaxCurrency; + rentRange: MinMaxCurrency /** */ - totalAvailable: number; + totalAvailable: number /** */ - areaRange: MinMax; + areaRange: MinMax /** */ - floorRange?: MinMax; + floorRange?: MinMax } export interface UnitSummaryByReservedType { /** */ - reservedType: string; + reservedType: string /** */ - byUnitTypeAndRent: UnitSummary[]; + byUnitTypeAndRent: UnitSummary[] } export interface UnitSummaryByAMI { /** */ - percent: string; + percent: string /** */ - byNonReservedUnitType: UnitSummary[]; + byNonReservedUnitType: UnitSummary[] /** */ - byReservedType: UnitSummaryByReservedType[]; + byReservedType: UnitSummaryByReservedType[] } export interface HMI { /** */ - columns: object; + columns: object /** */ - rows: object[]; + rows: object[] } export interface UnitsSummarized { /** */ - unitTypes: string[]; + unitTypes: string[] /** */ - reservedTypes: string[]; + reservedTypes: string[] /** */ - priorityTypes: string[]; + priorityTypes: string[] /** */ - amiPercentages: string[]; + amiPercentages: string[] /** */ - byUnitTypeAndRent: UnitSummary[]; + byUnitTypeAndRent: UnitSummary[] /** */ - byUnitType: UnitSummary[]; + byUnitType: UnitSummary[] /** */ - byNonReservedUnitType: UnitSummary[]; + byNonReservedUnitType: UnitSummary[] /** */ - byReservedType: UnitSummaryByReservedType[]; + byReservedType: UnitSummaryByReservedType[] /** */ - byAMI: UnitSummaryByAMI[]; + byAMI: UnitSummaryByAMI[] /** */ - hmi: HMI; + hmi: HMI } export interface AmiChartItem { /** */ - percentOfAmi: number; + percentOfAmi: number /** */ - householdSize: number; + householdSize: number /** */ - income: number; + income: number } export interface AmiChart { /** */ - items: AmiChartItem[]; + items: AmiChartItem[] /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - name: string; + name: string } export interface Unit { /** */ - amiChart: CombinedAmiChartTypes; + amiChart: CombinedAmiChartTypes /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - amiPercentage?: string; + amiPercentage?: string /** */ - annualIncomeMin?: string; + annualIncomeMin?: string /** */ - monthlyIncomeMin?: string; + monthlyIncomeMin?: string /** */ - floor?: number; + floor?: number /** */ - annualIncomeMax?: string; + annualIncomeMax?: string /** */ - maxOccupancy?: number; + maxOccupancy?: number /** */ - minOccupancy?: number; + minOccupancy?: number /** */ - monthlyRent?: string; + monthlyRent?: string /** */ - numBathrooms?: number; + numBathrooms?: number /** */ - numBedrooms?: number; + numBedrooms?: number /** */ - number?: string; + number?: string /** */ - priorityType?: string; + priorityType?: string /** */ - reservedType?: string; + reservedType?: string /** */ - sqFeet?: string; + sqFeet?: string /** */ - status?: string; + status?: string /** */ - unitType?: string; + unitType?: string /** */ - monthlyRentAsPercentOfIncome?: string; + monthlyRentAsPercentOfIncome?: string /** */ - bmrProgramChart?: boolean; + bmrProgramChart?: boolean } export interface Address { /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - placeName?: string; + placeName?: string /** */ - city?: string; + city?: string /** */ - county?: string; + county?: string /** */ - state?: string; + state?: string /** */ - street?: string; + street?: string /** */ - street2?: string; + street2?: string /** */ - zipCode?: string; + zipCode?: string /** */ - latitude?: number; + latitude?: number /** */ - longitude?: number; + longitude?: number } export interface Property { /** */ - unitsSummarized: UnitsSummarized; + unitsSummarized: UnitsSummarized /** */ - units: Unit[]; + units: Unit[] /** */ - buildingAddress: Address; + buildingAddress: Address /** */ - id: string; + id: string /** */ - createdAt?: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - accessibility: string; + accessibility: string /** */ - amenities: string; + amenities: string /** */ - buildingTotalUnits: number; + buildingTotalUnits: number /** */ - developer: string; + developer: string /** */ - householdSizeMax: number; + householdSizeMax: number /** */ - householdSizeMin: number; + householdSizeMin: number /** */ - neighborhood: string; + neighborhood: string /** */ - petPolicy: string; + petPolicy: string /** */ - smokingPolicy: string; + smokingPolicy: string /** */ - unitsAvailable: number; + unitsAvailable: number /** */ - unitAmenities: string; + unitAmenities: string /** */ - servicesOffered?: string; + servicesOffered?: string /** */ - yearBuilt: number; + yearBuilt: number } export interface ApplicationMethod { /** */ - type: ApplicationMethodType; + type: ApplicationMethodType /** */ - label: string; + label: string /** */ - externalReference: string; + externalReference: string /** */ - acceptsPostmarkedApplications: boolean; + acceptsPostmarkedApplications: boolean } export interface Asset { /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - fileId: string; + fileId: string /** */ - label: string; + label: string } export interface ListingEvent { /** */ - type: ListingEventType; + type: ListingEventType /** */ - startTime?: Date; + startTime?: Date /** */ - endTime?: Date; + endTime?: Date /** */ - url?: string; + url?: string /** */ - note?: string; + note?: string /** */ - label?: string; + label?: string } export interface WhatToExpect { /** */ - applicantsWillBeContacted: string; + applicantsWillBeContacted: string /** */ - allInfoWillBeVerified: string; + allInfoWillBeVerified: string /** */ - bePreparedIfChosen: string; + bePreparedIfChosen: string } export interface Listing { /** */ - status: ListingStatus; + status: ListingStatus /** */ - urlSlug: string; + urlSlug: string /** */ - displayWaitlistSize: boolean; + displayWaitlistSize: boolean /** */ - CSVFormattingType: CSVFormattingType; + CSVFormattingType: CSVFormattingType /** */ - countyCode: CountyCode; + countyCode: CountyCode /** */ - showWaitlist: boolean; + showWaitlist: boolean /** */ - preferences: Preference[]; + preferences: Preference[] /** */ - property: Property; + property: Property /** */ - applicationAddress: CombinedApplicationAddressTypes; + applicationAddress: CombinedApplicationAddressTypes /** */ - applicationPickUpAddress: CombinedApplicationPickUpAddressTypes; + applicationPickUpAddress: CombinedApplicationPickUpAddressTypes /** */ - leasingAgentAddress: CombinedLeasingAgentAddressTypes; + leasingAgentAddress: CombinedLeasingAgentAddressTypes /** */ - leasingAgents?: UserBasic[]; + leasingAgents?: UserBasic[] /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - applicationMethods: ApplicationMethod[]; + applicationMethods: ApplicationMethod[] /** */ - assets: Asset[]; + assets: Asset[] /** */ - events: ListingEvent[]; + events: ListingEvent[] /** */ - applicationDueDate: Date; + applicationDueDate: Date /** */ - applicationOpenDate: Date; + applicationOpenDate: Date /** */ - applicationFee: string; + applicationFee: string /** */ - applicationOrganization: string; + applicationOrganization: string /** */ - applicationPickUpAddressOfficeHours: string; + applicationPickUpAddressOfficeHours: string /** */ - buildingSelectionCriteria: string; + buildingSelectionCriteria: string /** */ - costsNotIncluded: string; + costsNotIncluded: string /** */ - creditHistory: string; + creditHistory: string /** */ - criminalBackground: string; + criminalBackground: string /** */ - depositMin: string; + depositMin: string /** */ - depositMax: string; + depositMax: string /** */ - disableUnitsAccordion: boolean; + disableUnitsAccordion: boolean /** */ - leasingAgentEmail: string; + leasingAgentEmail: string /** */ - leasingAgentName: string; + leasingAgentName: string /** */ - leasingAgentOfficeHours: string; + leasingAgentOfficeHours: string /** */ - leasingAgentPhone: string; + leasingAgentPhone: string /** */ - leasingAgentTitle: string; + leasingAgentTitle: string /** */ - name: string; + name: string /** */ - postmarkedApplicationsReceivedByDate: Date; + postmarkedApplicationsReceivedByDate: Date /** */ - programRules: string; + programRules: string /** */ - rentalAssistance: string; + rentalAssistance: string /** */ - rentalHistory: string; + rentalHistory: string /** */ - requiredDocuments: string; + requiredDocuments: string /** */ specialNotes?: string /** */ - waitlistCurrentSize: number; + waitlistCurrentSize: number /** */ - waitlistMaxSize: number; + waitlistMaxSize: number /** */ - whatToExpect: CombinedWhatToExpectTypes; + whatToExpect: CombinedWhatToExpectTypes /** */ - applicationConfig?: object; + applicationConfig?: object } export interface PreferenceCreate { /** */ - links: PreferenceLink[]; + links: PreferenceLink[] /** */ - ordinal: number; + ordinal: number /** */ - title: string; + title: string /** */ - subtitle: string; + subtitle: string /** */ - description: string; + description: string /** */ - formMetadata?: FormMetadata; + formMetadata?: FormMetadata /** */ - page: number; + page: number } export interface AddressCreate { /** */ - placeName?: string; + placeName?: string /** */ - city?: string; + city?: string /** */ - county?: string; + county?: string /** */ - state?: string; + state?: string /** */ - street?: string; + street?: string /** */ - street2?: string; + street2?: string /** */ - zipCode?: string; + zipCode?: string /** */ - latitude?: number; + latitude?: number /** */ - longitude?: number; + longitude?: number } export interface ListingCreate { /** */ - status: ListingStatus; + status: ListingStatus /** */ - displayWaitlistSize: boolean; + displayWaitlistSize: boolean /** */ - CSVFormattingType: CSVFormattingType; + CSVFormattingType: CSVFormattingType /** */ - countyCode: CountyCode; + countyCode: CountyCode /** */ - preferences?: PreferenceCreate[]; + preferences: PreferenceCreate[] /** */ - property: Id; + property: Id /** */ - applicationAddress: CombinedApplicationAddressTypes; + applicationAddress: CombinedApplicationAddressTypes /** */ - applicationPickUpAddress: CombinedApplicationPickUpAddressTypes; + applicationPickUpAddress: CombinedApplicationPickUpAddressTypes /** */ - leasingAgentAddress: CombinedLeasingAgentAddressTypes; + leasingAgentAddress: CombinedLeasingAgentAddressTypes /** */ - leasingAgents?: Id[]; + leasingAgents?: Id[] /** */ - applicationMethods: ApplicationMethod[]; + applicationMethods: ApplicationMethod[] /** */ - assets: Asset[]; + assets: Asset[] /** */ - events: ListingEvent[]; + events: ListingEvent[] /** */ - applicationDueDate: Date; + applicationDueDate: Date /** */ - applicationOpenDate: Date; + applicationOpenDate: Date /** */ - applicationFee: string; + applicationFee: string /** */ - applicationOrganization: string; + applicationOrganization: string /** */ - applicationPickUpAddressOfficeHours: string; + applicationPickUpAddressOfficeHours: string /** */ - buildingSelectionCriteria: string; + buildingSelectionCriteria: string /** */ - costsNotIncluded: string; + costsNotIncluded: string /** */ - creditHistory: string; + creditHistory: string /** */ - criminalBackground: string; + criminalBackground: string /** */ - depositMin: string; + depositMin: string /** */ - depositMax: string; + depositMax: string /** */ - disableUnitsAccordion: boolean; + disableUnitsAccordion: boolean /** */ - leasingAgentEmail: string; + leasingAgentEmail: string /** */ - leasingAgentName: string; + leasingAgentName: string /** */ - leasingAgentOfficeHours: string; + leasingAgentOfficeHours: string /** */ - leasingAgentPhone: string; + leasingAgentPhone: string /** */ - leasingAgentTitle: string; + leasingAgentTitle: string /** */ - name: string; + name: string /** */ - postmarkedApplicationsReceivedByDate: Date; + postmarkedApplicationsReceivedByDate: Date /** */ - programRules: string; + programRules: string /** */ - rentalAssistance: string; + rentalAssistance: string /** */ - rentalHistory: string; + rentalHistory: string /** */ - requiredDocuments: string; + requiredDocuments: string /** */ - specialNotes?: string; + specialNotes?: string /** */ - waitlistCurrentSize: number; + waitlistCurrentSize: number /** */ - waitlistMaxSize: number; + waitlistMaxSize: number /** */ - whatToExpect: CombinedWhatToExpectTypes; + whatToExpect: CombinedWhatToExpectTypes /** */ - applicationConfig?: object; + applicationConfig?: object } export interface PreferenceUpdate { /** */ - links: PreferenceLink[]; + links: PreferenceLink[] /** */ - ordinal: number; + ordinal: number /** */ - title: string; + title: string /** */ - subtitle: string; + subtitle: string /** */ - description: string; + description: string /** */ - formMetadata?: FormMetadata; + formMetadata?: FormMetadata /** */ - page: number; + page: number /** */ - id: string; + id: string } export interface AddressUpdate { /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - placeName?: string; + placeName?: string /** */ - city?: string; + city?: string /** */ - county?: string; + county?: string /** */ - state?: string; + state?: string /** */ - street?: string; + street?: string /** */ - street2?: string; + street2?: string /** */ - zipCode?: string; + zipCode?: string /** */ - latitude?: number; + latitude?: number /** */ - longitude?: number; + longitude?: number } export interface ListingUpdate { /** */ - status: ListingStatus; + status: ListingStatus /** */ - displayWaitlistSize: boolean; + displayWaitlistSize: boolean /** */ - CSVFormattingType: CSVFormattingType; + CSVFormattingType: CSVFormattingType /** */ - countyCode: CountyCode; + countyCode: CountyCode /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - preferences?: PreferenceUpdate[]; + preferences: PreferenceUpdate[] /** */ - property: Id; + property: Id /** */ - applicationAddress: CombinedApplicationAddressTypes; + applicationAddress: CombinedApplicationAddressTypes /** */ - applicationPickUpAddress: CombinedApplicationPickUpAddressTypes; + applicationPickUpAddress: CombinedApplicationPickUpAddressTypes /** */ - leasingAgentAddress: CombinedLeasingAgentAddressTypes; + leasingAgentAddress: CombinedLeasingAgentAddressTypes /** */ - leasingAgents?: Id[]; + leasingAgents?: Id[] /** */ - applicationMethods: ApplicationMethod[]; + applicationMethods: ApplicationMethod[] /** */ - assets: Asset[]; + assets: Asset[] /** */ - events: ListingEvent[]; + events: ListingEvent[] /** */ - applicationDueDate: Date; + applicationDueDate: Date /** */ - applicationOpenDate: Date; + applicationOpenDate: Date /** */ - applicationFee: string; + applicationFee: string /** */ - applicationOrganization: string; + applicationOrganization: string /** */ - applicationPickUpAddressOfficeHours: string; + applicationPickUpAddressOfficeHours: string /** */ - buildingSelectionCriteria: string; + buildingSelectionCriteria: string /** */ - costsNotIncluded: string; + costsNotIncluded: string /** */ - creditHistory: string; + creditHistory: string /** */ - criminalBackground: string; + criminalBackground: string /** */ - depositMin: string; + depositMin: string /** */ - depositMax: string; + depositMax: string /** */ - disableUnitsAccordion: boolean; + disableUnitsAccordion: boolean /** */ - leasingAgentEmail: string; + leasingAgentEmail: string /** */ - leasingAgentName: string; + leasingAgentName: string /** */ - leasingAgentOfficeHours: string; + leasingAgentOfficeHours: string /** */ - leasingAgentPhone: string; + leasingAgentPhone: string /** */ - leasingAgentTitle: string; + leasingAgentTitle: string /** */ - name: string; + name: string /** */ - postmarkedApplicationsReceivedByDate: Date; + postmarkedApplicationsReceivedByDate: Date /** */ - programRules: string; + programRules: string /** */ - rentalAssistance: string; + rentalAssistance: string /** */ - rentalHistory: string; + rentalHistory: string /** */ - requiredDocuments: string; + requiredDocuments: string /** */ - specialNotes?: string; + specialNotes?: string /** */ - waitlistCurrentSize: number; + waitlistCurrentSize: number /** */ - waitlistMaxSize: number; + waitlistMaxSize: number /** */ - whatToExpect: CombinedWhatToExpectTypes; + whatToExpect: CombinedWhatToExpectTypes /** */ - applicationConfig?: object; + applicationConfig?: object } export interface BooleanInput { /** */ - type: InputType; + type: InputType /** */ - key: string; + key: string /** */ - value: boolean; + value: boolean } export interface TextInput { /** */ - type: InputType; + type: InputType /** */ - key: string; + key: string /** */ - value: string; + value: string } export interface AddressInput { /** */ - type: InputType; + type: InputType /** */ - key: string; + key: string /** */ - value: AddressCreate; + value: AddressCreate } export interface Applicant { /** */ - address: Address; + address: Address /** */ - workAddress: Address; + workAddress: Address /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - firstName?: string; + firstName?: string /** */ - middleName?: string; + middleName?: string /** */ - lastName?: string; + lastName?: string /** */ - birthMonth?: string; + birthMonth?: string /** */ - birthDay?: string; + birthDay?: string /** */ - birthYear?: string; + birthYear?: string /** */ - emailAddress?: string; + emailAddress?: string /** */ - noEmail?: boolean; + noEmail?: boolean /** */ - phoneNumber?: string; + phoneNumber?: string /** */ - phoneNumberType?: string; + phoneNumberType?: string /** */ - noPhone?: boolean; + noPhone?: boolean /** */ - workInRegion?: string; + workInRegion?: string } export interface AlternateContact { /** */ - mailingAddress: Address; + mailingAddress: Address /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - type?: string; + type?: string /** */ - otherType?: string; + otherType?: string /** */ - firstName?: string; + firstName?: string /** */ - lastName?: string; + lastName?: string /** */ - agency?: string; + agency?: string /** */ - phoneNumber?: string; + phoneNumber?: string /** */ - emailAddress?: string; + emailAddress?: string } export interface Accessibility { /** */ - mobility?: boolean; + mobility?: boolean /** */ - vision?: boolean; + vision?: boolean /** */ - hearing?: boolean; + hearing?: boolean /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date } export interface Demographics { /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - ethnicity?: string; + ethnicity?: string /** */ - gender?: string; + gender?: string /** */ - sexualOrientation?: string; + sexualOrientation?: string /** */ - howDidYouHear: string[]; + howDidYouHear: string[] /** */ - race?: string; + race?: string } export interface HouseholdMember { /** */ - address: Address; + address: Address /** */ - workAddress: Address; + workAddress: Address /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - orderId?: number; + orderId?: number /** */ - firstName?: string; + firstName?: string /** */ - middleName?: string; + middleName?: string /** */ - lastName?: string; + lastName?: string /** */ - birthMonth?: string; + birthMonth?: string /** */ - birthDay?: string; + birthDay?: string /** */ - birthYear?: string; + birthYear?: string /** */ - emailAddress?: string; + emailAddress?: string /** */ - noEmail?: boolean; + noEmail?: boolean /** */ - phoneNumber?: string; + phoneNumber?: string /** */ - phoneNumberType?: string; + phoneNumberType?: string /** */ - noPhone?: boolean; + noPhone?: boolean /** */ - sameAddress?: string; + sameAddress?: string /** */ - relationship?: string; + relationship?: string /** */ - workInRegion?: string; + workInRegion?: string } export interface ApplicationPreferenceOption { /** */ - key: string; + key: string /** */ - checked: boolean; + checked: boolean /** */ - extraData?: AllExtraDataTypes[]; + extraData?: AllExtraDataTypes[] } export interface ApplicationPreference { /** */ - key: string; + key: string /** */ - claimed: boolean; + claimed: boolean /** */ - options: ApplicationPreferenceOption[]; + options: ApplicationPreferenceOption[] } export interface Application { /** */ - incomePeriod?: IncomePeriod; + incomePeriod?: IncomePeriod /** */ - status: ApplicationStatus; + status: ApplicationStatus /** */ - language?: Language; + language?: Language /** */ - submissionType: ApplicationSubmissionType; + submissionType: ApplicationSubmissionType /** */ - applicant: Applicant; + applicant: Applicant /** */ - listing: Id; + listing: Id /** */ - user?: Id; + user?: Id /** */ - mailingAddress: Address; + mailingAddress: Address /** */ - alternateAddress: Address; + alternateAddress: Address /** */ - alternateContact: AlternateContact; + alternateContact: AlternateContact /** */ - accessibility: Accessibility; + accessibility: Accessibility /** */ - demographics: Demographics; + demographics: Demographics /** */ - householdMembers: HouseholdMember[]; + householdMembers: HouseholdMember[] /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - deletedAt?: Date; + deletedAt?: Date /** */ - appUrl?: string; + appUrl?: string /** */ - additionalPhone?: boolean; + additionalPhone?: boolean /** */ - additionalPhoneNumber?: string; + additionalPhoneNumber?: string /** */ - additionalPhoneNumberType?: string; + additionalPhoneNumberType?: string /** */ - contactPreferences: string[]; + contactPreferences: string[] /** */ - householdSize?: number; + householdSize?: number /** */ - housingStatus?: string; + housingStatus?: string /** */ - sendMailToMailingAddress?: boolean; + sendMailToMailingAddress?: boolean /** */ - incomeVouchers?: boolean; + incomeVouchers?: boolean /** */ - income?: string; + income?: string /** */ - preferredUnit: string[]; + preferredUnit: string[] /** */ - preferences: ApplicationPreference[]; + preferences: ApplicationPreference[] /** */ - acceptedTerms?: boolean; + acceptedTerms?: boolean /** */ - submissionDate?: Date; + submissionDate?: Date /** */ - markedAsDuplicate: boolean; + markedAsDuplicate: boolean } export interface PaginationMeta { /** */ - currentPage: number; + currentPage: number /** */ - itemCount: number; + itemCount: number /** */ - itemsPerPage: number; + itemsPerPage: number /** */ - totalItems: number; + totalItems: number /** */ - totalPages: number; + totalPages: number } export interface PaginatedApplication { /** */ - items: Application[]; + items: Application[] /** */ - meta: PaginationMeta; + meta: PaginationMeta } export interface ApplicantCreate { /** */ - address: AddressCreate; + address: AddressCreate /** */ - workAddress: AddressCreate; + workAddress: AddressCreate /** */ - firstName?: string; + firstName?: string /** */ - middleName?: string; + middleName?: string /** */ - lastName?: string; + lastName?: string /** */ - birthMonth?: string; + birthMonth?: string /** */ - birthDay?: string; + birthDay?: string /** */ - birthYear?: string; + birthYear?: string /** */ - emailAddress?: string; + emailAddress?: string /** */ - noEmail?: boolean; + noEmail?: boolean /** */ - phoneNumber?: string; + phoneNumber?: string /** */ - phoneNumberType?: string; + phoneNumberType?: string /** */ - noPhone?: boolean; + noPhone?: boolean /** */ - workInRegion?: string; + workInRegion?: string } export interface AlternateContactCreate { /** */ - mailingAddress: AddressCreate; + mailingAddress: AddressCreate /** */ - type?: string; + type?: string /** */ - otherType?: string; + otherType?: string /** */ - firstName?: string; + firstName?: string /** */ - lastName?: string; + lastName?: string /** */ - agency?: string; + agency?: string /** */ - phoneNumber?: string; + phoneNumber?: string /** */ - emailAddress?: string; + emailAddress?: string } export interface AccessibilityCreate { /** */ - mobility?: boolean; + mobility?: boolean /** */ - vision?: boolean; + vision?: boolean /** */ - hearing?: boolean; + hearing?: boolean } export interface DemographicsCreate { /** */ - ethnicity?: string; + ethnicity?: string /** */ - gender?: string; + gender?: string /** */ - sexualOrientation?: string; + sexualOrientation?: string /** */ - howDidYouHear: string[]; + howDidYouHear: string[] /** */ - race?: string; + race?: string } export interface HouseholdMemberCreate { /** */ - address: AddressCreate; + address: AddressCreate /** */ - workAddress: AddressCreate; + workAddress: AddressCreate /** */ - orderId?: number; + orderId?: number /** */ - firstName?: string; + firstName?: string /** */ - middleName?: string; + middleName?: string /** */ - lastName?: string; + lastName?: string /** */ - birthMonth?: string; + birthMonth?: string /** */ - birthDay?: string; + birthDay?: string /** */ - birthYear?: string; + birthYear?: string /** */ - emailAddress?: string; + emailAddress?: string /** */ - noEmail?: boolean; + noEmail?: boolean /** */ - phoneNumber?: string; + phoneNumber?: string /** */ - phoneNumberType?: string; + phoneNumberType?: string /** */ - noPhone?: boolean; + noPhone?: boolean /** */ - sameAddress?: string; + sameAddress?: string /** */ - relationship?: string; + relationship?: string /** */ - workInRegion?: string; + workInRegion?: string } export interface ApplicationCreate { /** */ - incomePeriod?: IncomePeriod; + incomePeriod?: IncomePeriod /** */ - status: ApplicationStatus; + status: ApplicationStatus /** */ - language?: Language; + language?: Language /** */ - submissionType: ApplicationSubmissionType; + submissionType: ApplicationSubmissionType /** */ - listing: Id; + listing: Id /** */ - applicant: ApplicantCreate; + applicant: ApplicantCreate /** */ - mailingAddress: AddressCreate; + mailingAddress: AddressCreate /** */ - alternateAddress: AddressCreate; + alternateAddress: AddressCreate /** */ - alternateContact: AlternateContactCreate; + alternateContact: AlternateContactCreate /** */ - accessibility: AccessibilityCreate; + accessibility: AccessibilityCreate /** */ - demographics: DemographicsCreate; + demographics: DemographicsCreate /** */ - householdMembers: HouseholdMemberCreate[]; + householdMembers: HouseholdMemberCreate[] /** */ - appUrl?: string; + appUrl?: string /** */ - additionalPhone?: boolean; + additionalPhone?: boolean /** */ - additionalPhoneNumber?: string; + additionalPhoneNumber?: string /** */ - additionalPhoneNumberType?: string; + additionalPhoneNumberType?: string /** */ - contactPreferences: string[]; + contactPreferences: string[] /** */ - householdSize?: number; + householdSize?: number /** */ - housingStatus?: string; + housingStatus?: string /** */ - sendMailToMailingAddress?: boolean; + sendMailToMailingAddress?: boolean /** */ - incomeVouchers?: boolean; + incomeVouchers?: boolean /** */ - income?: string; + income?: string /** */ - preferredUnit: string[]; + preferredUnit: string[] /** */ - preferences: ApplicationPreference[]; + preferences: ApplicationPreference[] /** */ - acceptedTerms?: boolean; + acceptedTerms?: boolean /** */ - submissionDate?: Date; + submissionDate?: Date } export interface ApplicantUpdate { /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - address: AddressUpdate; + address: AddressUpdate /** */ - workAddress: AddressUpdate; + workAddress: AddressUpdate /** */ - firstName?: string; + firstName?: string /** */ - middleName?: string; + middleName?: string /** */ - lastName?: string; + lastName?: string /** */ - birthMonth?: string; + birthMonth?: string /** */ - birthDay?: string; + birthDay?: string /** */ - birthYear?: string; + birthYear?: string /** */ - emailAddress?: string; + emailAddress?: string /** */ - noEmail?: boolean; + noEmail?: boolean /** */ - phoneNumber?: string; + phoneNumber?: string /** */ - phoneNumberType?: string; + phoneNumberType?: string /** */ - noPhone?: boolean; + noPhone?: boolean /** */ - workInRegion?: string; + workInRegion?: string } export interface AlternateContactUpdate { /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - mailingAddress: AddressUpdate; + mailingAddress: AddressUpdate /** */ - type?: string; + type?: string /** */ - otherType?: string; + otherType?: string /** */ - firstName?: string; + firstName?: string /** */ - lastName?: string; + lastName?: string /** */ - agency?: string; + agency?: string /** */ - phoneNumber?: string; + phoneNumber?: string /** */ - emailAddress?: string; + emailAddress?: string } export interface AccessibilityUpdate { /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - mobility?: boolean; + mobility?: boolean /** */ - vision?: boolean; + vision?: boolean /** */ - hearing?: boolean; + hearing?: boolean } export interface DemographicsUpdate { /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - ethnicity?: string; + ethnicity?: string /** */ - gender?: string; + gender?: string /** */ - sexualOrientation?: string; + sexualOrientation?: string /** */ - howDidYouHear: string[]; + howDidYouHear: string[] /** */ - race?: string; + race?: string } export interface HouseholdMemberUpdate { /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - address: AddressUpdate; + address: AddressUpdate /** */ - workAddress: AddressUpdate; + workAddress: AddressUpdate /** */ - orderId?: number; + orderId?: number /** */ - firstName?: string; + firstName?: string /** */ - middleName?: string; + middleName?: string /** */ - lastName?: string; + lastName?: string /** */ - birthMonth?: string; + birthMonth?: string /** */ - birthDay?: string; + birthDay?: string /** */ - birthYear?: string; + birthYear?: string /** */ - emailAddress?: string; + emailAddress?: string /** */ - noEmail?: boolean; + noEmail?: boolean /** */ - phoneNumber?: string; + phoneNumber?: string /** */ - phoneNumberType?: string; + phoneNumberType?: string /** */ - noPhone?: boolean; + noPhone?: boolean /** */ - sameAddress?: string; + sameAddress?: string /** */ - relationship?: string; + relationship?: string /** */ - workInRegion?: string; + workInRegion?: string } export interface ApplicationUpdate { /** */ - incomePeriod?: IncomePeriod; + incomePeriod?: IncomePeriod /** */ - status: ApplicationStatus; + status: ApplicationStatus /** */ - language?: Language; + language?: Language /** */ - submissionType: ApplicationSubmissionType; + submissionType: ApplicationSubmissionType /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - deletedAt?: Date; + deletedAt?: Date /** */ - listing: Id; + listing: Id /** */ - applicant: ApplicantUpdate; + applicant: ApplicantUpdate /** */ - mailingAddress: AddressUpdate; + mailingAddress: AddressUpdate /** */ - alternateAddress: AddressUpdate; + alternateAddress: AddressUpdate /** */ - alternateContact: AlternateContactUpdate; + alternateContact: AlternateContactUpdate /** */ - accessibility: AccessibilityUpdate; + accessibility: AccessibilityUpdate /** */ - demographics: DemographicsUpdate; + demographics: DemographicsUpdate /** */ - householdMembers: HouseholdMemberUpdate[]; + householdMembers: HouseholdMemberUpdate[] /** */ - appUrl?: string; + appUrl?: string /** */ - additionalPhone?: boolean; + additionalPhone?: boolean /** */ - additionalPhoneNumber?: string; + additionalPhoneNumber?: string /** */ - additionalPhoneNumberType?: string; + additionalPhoneNumberType?: string /** */ - contactPreferences: string[]; + contactPreferences: string[] /** */ - householdSize?: number; + householdSize?: number /** */ - housingStatus?: string; + housingStatus?: string /** */ - sendMailToMailingAddress?: boolean; + sendMailToMailingAddress?: boolean /** */ - incomeVouchers?: boolean; + incomeVouchers?: boolean /** */ - income?: string; + income?: string /** */ - preferredUnit: string[]; + preferredUnit: string[] /** */ - preferences: ApplicationPreference[]; + preferences: ApplicationPreference[] /** */ - acceptedTerms?: boolean; + acceptedTerms?: boolean /** */ - submissionDate?: Date; + submissionDate?: Date } export interface UnitCreate { /** */ - amiChart: CombinedAmiChartTypes; + amiChart: CombinedAmiChartTypes /** */ - amiPercentage?: string; + amiPercentage?: string /** */ - annualIncomeMin?: string; + annualIncomeMin?: string /** */ - monthlyIncomeMin?: string; + monthlyIncomeMin?: string /** */ - floor?: number; + floor?: number /** */ - annualIncomeMax?: string; + annualIncomeMax?: string /** */ - maxOccupancy?: number; + maxOccupancy?: number /** */ - minOccupancy?: number; + minOccupancy?: number /** */ - monthlyRent?: string; + monthlyRent?: string /** */ - numBathrooms?: number; + numBathrooms?: number /** */ - numBedrooms?: number; + numBedrooms?: number /** */ - number?: string; + number?: string /** */ - priorityType?: string; + priorityType?: string /** */ - reservedType?: string; + reservedType?: string /** */ - sqFeet?: string; + sqFeet?: string /** */ - status?: string; + status?: string /** */ - unitType?: string; + unitType?: string /** */ - monthlyRentAsPercentOfIncome?: string; + monthlyRentAsPercentOfIncome?: string /** */ - bmrProgramChart?: boolean; + bmrProgramChart?: boolean } export interface UnitUpdate { /** */ - amiChart: CombinedAmiChartTypes; + amiChart: CombinedAmiChartTypes /** */ - amiPercentage?: string; + amiPercentage?: string /** */ - annualIncomeMin?: string; + annualIncomeMin?: string /** */ - monthlyIncomeMin?: string; + monthlyIncomeMin?: string /** */ - floor?: number; + floor?: number /** */ - annualIncomeMax?: string; + annualIncomeMax?: string /** */ - maxOccupancy?: number; + maxOccupancy?: number /** */ - minOccupancy?: number; + minOccupancy?: number /** */ - monthlyRent?: string; + monthlyRent?: string /** */ - numBathrooms?: number; + numBathrooms?: number /** */ - numBedrooms?: number; + numBedrooms?: number /** */ - number?: string; + number?: string /** */ - priorityType?: string; + priorityType?: string /** */ - reservedType?: string; + reservedType?: string /** */ - sqFeet?: string; + sqFeet?: string /** */ - status?: string; + status?: string /** */ - unitType?: string; + unitType?: string /** */ - monthlyRentAsPercentOfIncome?: string; + monthlyRentAsPercentOfIncome?: string /** */ - bmrProgramChart?: boolean; + bmrProgramChart?: boolean /** */ - id: string; + id: string } export interface PropertyCreate { /** */ - buildingAddress: AddressUpdate; + buildingAddress: AddressUpdate /** */ - units: UnitCreate[]; + units: UnitCreate[] /** */ - accessibility: string; + accessibility: string /** */ - amenities: string; + amenities: string /** */ - buildingTotalUnits: number; + buildingTotalUnits: number /** */ - developer: string; + developer: string /** */ - householdSizeMax: number; + householdSizeMax: number /** */ - householdSizeMin: number; + householdSizeMin: number /** */ - neighborhood: string; + neighborhood: string /** */ - petPolicy: string; + petPolicy: string /** */ - smokingPolicy: string; + smokingPolicy: string /** */ - unitsAvailable: number; + unitsAvailable: number /** */ - unitAmenities: string; + unitAmenities: string /** */ - servicesOffered?: string; + servicesOffered?: string /** */ - yearBuilt: number; + yearBuilt: number } export interface PropertyUpdate { /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - buildingAddress: AddressUpdate; + buildingAddress: AddressUpdate /** */ - units: UnitUpdate[]; + units: UnitUpdate[] /** */ - accessibility: string; + accessibility: string /** */ - amenities: string; + amenities: string /** */ - buildingTotalUnits: number; + buildingTotalUnits: number /** */ - developer: string; + developer: string /** */ - householdSizeMax: number; + householdSizeMax: number /** */ - householdSizeMin: number; + householdSizeMin: number /** */ - neighborhood: string; + neighborhood: string /** */ - petPolicy: string; + petPolicy: string /** */ - smokingPolicy: string; + smokingPolicy: string /** */ - unitsAvailable: number; + unitsAvailable: number /** */ - unitAmenities: string; + unitAmenities: string /** */ - servicesOffered?: string; + servicesOffered?: string /** */ - yearBuilt: number; + yearBuilt: number } export interface PropertyGroup { /** */ - properties: Id[]; + properties: Id[] /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - name: string; + name: string } export interface PropertyGroupCreate { /** */ - name: string; + name: string /** */ - properties: Id[]; + properties: Id[] } export interface PropertyGroupUpdate { /** */ - name: string; + name: string /** */ - properties: Id[]; + properties: Id[] /** */ - id: string; + id: string } export interface AmiChartCreate { /** */ - items: AmiChartItem[]; + items: AmiChartItem[] /** */ - name: string; + name: string } export interface AmiChartUpdate { /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - items: AmiChartItem[]; + items: AmiChartItem[] /** */ - name: string; + name: string } export interface Translation { /** */ - countyCode: CountyCode; + countyCode: CountyCode /** */ - language: Language; + language: Language /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - translations: object; + translations: object } export interface TranslationCreate { /** */ - countyCode: CountyCode; + countyCode: CountyCode /** */ - language: Language; + language: Language /** */ - translations: object; + translations: object } export interface TranslationUpdate { /** */ - countyCode: CountyCode; + countyCode: CountyCode /** */ - language: Language; + language: Language /** */ - id?: string; + id?: string /** */ - createdAt?: Date; + createdAt?: Date /** */ - updatedAt?: Date; + updatedAt?: Date /** */ - translations: object; + translations: object } export interface ApplicationFlaggedSet { /** */ - resolvingUser: Id; + resolvingUser: Id /** */ - applications: Application[]; + applications: Application[] /** */ - listing: Id; + listing: Id /** */ - id: string; + id: string /** */ - createdAt: Date; + createdAt: Date /** */ - updatedAt: Date; + updatedAt: Date /** */ - rule: string; + rule: string /** */ - resolvedTime?: Date; + resolvedTime?: Date /** */ - status: EnumApplicationFlaggedSetStatus; + status: EnumApplicationFlaggedSetStatus /** */ - listingId: string; + listingId: string } export interface ApplicationFlaggedSetPaginationMeta { /** */ - currentPage: number; + currentPage: number /** */ - itemCount: number; + itemCount: number /** */ - itemsPerPage: number; + itemsPerPage: number /** */ - totalItems: number; + totalItems: number /** */ - totalPages: number; + totalPages: number /** */ - totalFlagged: number; + totalFlagged: number } export interface PaginatedApplicationFlaggedSet { /** */ - items: ApplicationFlaggedSet[]; + items: ApplicationFlaggedSet[] /** */ - meta: ApplicationFlaggedSetPaginationMeta; + meta: ApplicationFlaggedSetPaginationMeta } export interface ApplicationFlaggedSetResolve { /** */ - afsId: string; + afsId: string /** */ - applications: Id[]; + applications: Id[] } export interface AssetCreate { /** */ - fileId: string; + fileId: string /** */ - label: string; + label: string } export interface CreatePresignedUploadMetadata { /** */ - parametersToSign: object; + parametersToSign: object } export interface CreatePresignedUploadMetadataResponse { /** */ - signature: string; + signature: string } export enum UserRole { - 'user' = 'user', - 'admin' = 'admin' + "user" = "user", + "admin" = "admin", } export enum Language { - 'en' = 'en', - 'es' = 'es', - 'vi' = 'vi', - 'zh' = 'zh' + "en" = "en", + "es" = "es", + "vi" = "vi", + "zh" = "zh", } export enum ListingStatus { - 'active' = 'active', - 'pending' = 'pending', - 'closed' = 'closed' + "active" = "active", + "pending" = "pending", + "closed" = "closed", } export enum CSVFormattingType { - 'basic' = 'basic', - 'withDisplaceeNameAndAddress' = 'withDisplaceeNameAndAddress', - 'ohaFormat' = 'ohaFormat' + "basic" = "basic", + "withDisplaceeNameAndAddress" = "withDisplaceeNameAndAddress", + "ohaFormat" = "ohaFormat", } export enum CountyCode { - 'Alameda' = 'Alameda', - 'San Mateo' = 'San Mateo', - 'San Jose' = 'San Jose' + "Alameda" = "Alameda", + "San Mateo" = "San Mateo", + "San Jose" = "San Jose", } export enum InputType { - 'boolean' = 'boolean', - 'text' = 'text', - 'address' = 'address', - 'hhMemberSelect' = 'hhMemberSelect' + "boolean" = "boolean", + "text" = "text", + "address" = "address", + "hhMemberSelect" = "hhMemberSelect", } -export type CombinedAmiChartTypes = (AmiChart & any) | null; +export type CombinedAmiChartTypes = (AmiChart & any) | null export enum ApplicationMethodType { - 'Internal' = 'Internal', - 'FileDownload' = 'FileDownload', - 'ExternalLink' = 'ExternalLink', - 'PaperPickup' = 'PaperPickup', - 'POBox' = 'POBox', - 'LeasingAgent' = 'LeasingAgent' + "Internal" = "Internal", + "FileDownload" = "FileDownload", + "ExternalLink" = "ExternalLink", + "PaperPickup" = "PaperPickup", + "POBox" = "POBox", + "LeasingAgent" = "LeasingAgent", } export enum ListingEventType { - 'openHouse' = 'openHouse', - 'publicLottery' = 'publicLottery', - 'lotteryResults' = 'lotteryResults' -} -export type CombinedApplicationAddressTypes = (AddressUpdate & any) | null; -export type CombinedApplicationPickUpAddressTypes = (AddressUpdate & any) | null; -export type CombinedLeasingAgentAddressTypes = (AddressUpdate & any) | null; -export type CombinedWhatToExpectTypes = (WhatToExpect & any) | null; + "openHouse" = "openHouse", + "publicLottery" = "publicLottery", + "lotteryResults" = "lotteryResults", +} +export type CombinedApplicationAddressTypes = (AddressUpdate & any) | null +export type CombinedApplicationPickUpAddressTypes = (AddressUpdate & any) | null +export type CombinedLeasingAgentAddressTypes = (AddressUpdate & any) | null +export type CombinedWhatToExpectTypes = (WhatToExpect & any) | null export enum IncomePeriod { - 'perMonth' = 'perMonth', - 'perYear' = 'perYear' + "perMonth" = "perMonth", + "perYear" = "perYear", } export enum ApplicationStatus { - 'draft' = 'draft', - 'submitted' = 'submitted', - 'removed' = 'removed' + "draft" = "draft", + "submitted" = "submitted", + "removed" = "removed", } export enum ApplicationSubmissionType { - 'paper' = 'paper', - 'electronical' = 'electronical' + "paper" = "paper", + "electronical" = "electronical", } -export type AllExtraDataTypes = BooleanInput | TextInput | AddressInput; +export type AllExtraDataTypes = BooleanInput | TextInput | AddressInput export enum EnumApplicationFlaggedSetStatus { - 'flagged' = 'flagged', - 'resolved' = 'resolved' + "flagged" = "flagged", + "resolved" = "resolved", } diff --git a/docs/Authentication.md b/docs/Authentication.md index 13d06ed374..8d2827b3fa 100644 --- a/docs/Authentication.md +++ b/docs/Authentication.md @@ -9,14 +9,12 @@ routes. ```typescript // Module definition -@Module({ +import { // All modules implementing authentication guards must import `PassportModule` - imports: [PassportModule, ...others], // providers, exports, controllers, etc. -}) - -// Controller definition -import { DefaultAuthGuard } from "src/auth/default.guard" + // Controller definition + DefaultAuthGuard, +} from "src/auth/default.guard" @Controller() export class MyController { @@ -33,7 +31,6 @@ Using the `DefaultAuthGuard` in this way requires the client to provide a valid valid expiry time (currently 10 minutes). Tokens may also be revoked by adding an entry to `revoked_tokens` table, or using the auth route `revoke_token`. - ## Obtain a token To obtain a token, a user must first login. Currently, an email/password strategy is the only way to do this. A @@ -52,15 +49,14 @@ resulting user will be returned along with a valid `accessToken`. The app must be configured with an app secret to sign JWT tokens. In development, the app uses a hard-coded value, but the app will throw an error in production mode if `APP_SECRET` is not provided as an environment variable. - # Front End Authentication/User Management -A few tools are provided to help handle authentication/users in the front end. These are collected under -`shared/ui-components/authentication`. +A few tools are provided to help handle authentication/users in the front end. These are collected under +`shared/ui-components/authentication`. -## UserContext +## AuthContext -`UserContext` is a React Context that keeps track of the current user state and provides user-related utility +`AuthContext` is a React Context that keeps track of the current user state and provides user and auth related utility functions. It provides: @@ -78,16 +74,16 @@ type ContextProps = { } ``` -The context is provided to a React App using `UserProvider`, which in turn requires a `ConfigProvider` to function +The context is provided to a React App using `AuthProvider`, which in turn requires a `ConfigProvider` to function properly: ```tsx import { UserProvider, ConfigProvider } from "@bloom-housing/ui-components" - + {/* ...rest of app tree */} - + ``` @@ -103,13 +99,13 @@ This is a convenience hook that allows a component to access a protected route o has been pre-configured to send an auth token to the API. It will return `undefined` if the user is not logged in. ```tsx -const authClient = useAuthenticatedClient(); +const authClient = useAuthenticatedClient() if (authClient) { - authClient.get('/protected-route') + authClient.get("/protected-route") } ``` -This hook relies on access to the `UserContext` and the `ConfigContext`, so it will not work if the component isn't +This hook relies on access to the `AuthContext` and the `ConfigContext`, so it will not work if the component isn't in a tree that has both of these providers. ## RequireLogin @@ -134,7 +130,7 @@ both lists of strings, and may contain RegEx strings. This is a hook that can be applied to protect a single component by requiring a login without modifying the full app tree. It returns the logged in `User` if found, and `undefined` before the initial state has loaded. If no login is -found, it redirects to `signInPath`. This hook requires `UserProvider` to be defined on the app tree to work. +found, it redirects to `signInPath`. This hook requires `UserProvider` to be defined on the app tree to work. ```typescript const user = useRequireLoggedInUser("/sign-in") @@ -149,21 +145,21 @@ if (!user) { For API authorization, we use a combination of Role Based Access Control (RBAC) and ABAC (Attribute Based Access Control) implemented using the [casbin library](https://casbin.org/). We define authorizations in the context of -performing a given _action_ on _resource type_ as a _role_. Actions are strings defined in +performing a given _action_ on _resource type_ as a _role_. Actions are strings defined in [authz.service.ts](../backend/core/src/auth/authz.service.ts) as an enum `authzActions`. For high-level Role-Based Access Control (RBAC), a Nest.js guard, `AuthzGuard` is provided. It can be defined on either -a controller or individual request handler (method) scope, although the former is probably a more common use case. It -should be used in conjunction with the `@ResourceType` decorator to specify what type of entity (e.g. `"application"`) -this controller/handler will be requesting access to. It then checks access to all the requests based on the current -loaded `req.user` (so it must run after a passport-based `AuthGuard` that loads the user onto the request object), the +a controller or individual request handler (method) scope, although the former is probably a more common use case. It +should be used in conjunction with the `@ResourceType` decorator to specify what type of entity (e.g. `"application"`) +this controller/handler will be requesting access to. It then checks access to all the requests based on the current +loaded `req.user` (so it must run after a passport-based `AuthGuard` that loads the user onto the request object), the `ResourceType`, and the requested action. The action is either automatically inferred from the request (e.g. a `PUT` corresponds to `"update"`, `GET` corresponds to `"read"`, etc.), or can be specified on a per-handler basis using the `@ResourceType("edit")` decorator. The other method for enforcing authorization allows for per-object/attribute based access control (ABAC). In this mode, -we are checking specific attributes about the resource access is requested on, so it must be checked in the body of the -handler rather than as a guard (since the resource must be loaded from the DB). This is accomplished using the +we are checking specific attributes about the resource access is requested on, so it must be checked in the body of the +handler rather than as a guard (since the resource must be loaded from the DB). This is accomplished using the `AuthzService.can` or `AuthzService.canOrThrow` methods. The rules themselves are defined in [authz_policy.csv](../backend/core/src/auth/authz_policy.csv). Each line in this @@ -174,17 +170,19 @@ p, role, resourceType, evalRule, action ``` An example: + ``` p, admin, application, true, .* ``` In this case, this specifies a policy applying to the `admin` role accessing `application` objects. `evalRule` is a -bit of arbitrary code that is evaluated by Casbin. See +bit of arbitrary code that is evaluated by Casbin. See [the docs](https://casbin.org/docs/en/abac#scaling-the-model-for-complex-and-large-number-of-abac-rules) for more info on how this works. In this example, `true` simply will always evaluate to `true`. Finally, the action is a regex -enabled matcher for the action verb requested - in this case a wildcard means that an admin can perform all actions. A more complicated example: + ``` p, user, application, !r.obj || (r.sub == r.obj.user_id), (read)|(update)|(delete) ``` diff --git a/sites/partners/layouts/index.tsx b/sites/partners/layouts/index.tsx index 788149498d..a3ed3e97c2 100644 --- a/sites/partners/layouts/index.tsx +++ b/sites/partners/layouts/index.tsx @@ -8,11 +8,11 @@ import { FooterSection, ExygyFooter, t, - UserContext, + AuthContext, } from "@bloom-housing/ui-components" const Layout = (props) => { - const { profile, signOut } = useContext(UserContext) + const { profile, signOut } = useContext(AuthContext) return (
diff --git a/sites/partners/lib/hooks.ts b/sites/partners/lib/hooks.ts index 84f4ce4cb4..d52e742f99 100644 --- a/sites/partners/lib/hooks.ts +++ b/sites/partners/lib/hooks.ts @@ -1,7 +1,7 @@ import { useContext } from "react" import useSWR, { mutate } from "swr" -import { ApiClientContext } from "@bloom-housing/ui-components" +import { AuthContext } from "@bloom-housing/ui-components" type UseSingleApplicationDataProps = { listingId: string @@ -10,7 +10,7 @@ type UseSingleApplicationDataProps = { } export function useSingleListingData(listingId: string) { - const { listingsService } = useContext(ApiClientContext) + const { listingsService } = useContext(AuthContext) const fetcher = () => listingsService.retrieve({ listingId }) const { data, error } = useSWR(`${process.env.backendApiBase}/listings/${listingId}`, fetcher) @@ -23,7 +23,7 @@ export function useSingleListingData(listingId: string) { } export function useListingsData() { - const { listingsService } = useContext(ApiClientContext) + const { listingsService } = useContext(AuthContext) const fetcher = () => listingsService.list() const { data, error } = useSWR(`${process.env.backendApiBase}/listings`, fetcher) @@ -41,7 +41,7 @@ export function useApplicationsData( listingId: string, search: string ) { - const { applicationsService } = useContext(ApiClientContext) + const { applicationsService } = useContext(AuthContext) const searchParams = new URLSearchParams() searchParams.append("listingId", listingId) @@ -75,7 +75,7 @@ export function useApplicationsData( } export function useSingleApplicationData(applicationId: string) { - const { applicationsService } = useContext(ApiClientContext) + const { applicationsService } = useContext(AuthContext) const backendSingleApplicationsEndpointUrl = `${process.env.backendApiBase}/applications/${applicationId}` const fetcher = () => applicationsService.retrieve({ applicationId }) @@ -93,7 +93,7 @@ export function useFlaggedApplicationsList({ page, limit, }: UseSingleApplicationDataProps) { - const { applicationFlaggedSetsService } = useContext(ApiClientContext) + const { applicationFlaggedSetsService } = useContext(AuthContext) const searchParams = new URLSearchParams() searchParams.append("listingId", listingId) @@ -118,7 +118,7 @@ export function useFlaggedApplicationsList({ } export function useSingleFlaggedApplication(afsId: string) { - const { applicationFlaggedSetsService } = useContext(ApiClientContext) + const { applicationFlaggedSetsService } = useContext(AuthContext) const endpoint = `${process.env.backendApiBase}/applicationFlaggedSets/${afsId}` const fetcher = () => diff --git a/sites/partners/pages/_app.tsx b/sites/partners/pages/_app.tsx index 643a93eebe..3e5e17c630 100644 --- a/sites/partners/pages/_app.tsx +++ b/sites/partners/pages/_app.tsx @@ -5,9 +5,8 @@ import "@bloom-housing/ui-components/src/global/index.scss" import { addTranslation, ConfigProvider, - UserProvider, + AuthProvider, RequireLogin, - ApiClientProvider, NavigationContext, GenericRouter, } from "@bloom-housing/ui-components" @@ -44,19 +43,17 @@ function BloomApp({ Component, router, pageProps }: AppProps) { }} > - + - -
- {typeof window === "undefined" ? null : } -
-
+
+ {typeof window === "undefined" ? null : } +
-
+
) diff --git a/sites/partners/pages/application/[id]/index.tsx b/sites/partners/pages/application/[id]/index.tsx index 96e9d6bd82..437c32e257 100644 --- a/sites/partners/pages/application/[id]/index.tsx +++ b/sites/partners/pages/application/[id]/index.tsx @@ -7,7 +7,7 @@ import { t, Tag, Button, - ApiClientContext, + AuthContext, AlertBox, SiteAlert, } from "@bloom-housing/ui-components" @@ -36,7 +36,7 @@ export default function ApplicationsList() { const applicationId = router.query.id as string const { application } = useSingleApplicationData(applicationId) - const { applicationsService } = useContext(ApiClientContext) + const { applicationsService } = useContext(AuthContext) const [errorAlert, setErrorAlert] = useState(false) const [membersDrawer, setMembersDrawer] = useState(null) diff --git a/sites/partners/pages/forgot-password.tsx b/sites/partners/pages/forgot-password.tsx index 9950c76027..7f1d7c48b4 100644 --- a/sites/partners/pages/forgot-password.tsx +++ b/sites/partners/pages/forgot-password.tsx @@ -8,7 +8,7 @@ import { Form, FormCard, Icon, - UserContext, + AuthContext, t, AlertBox, SiteAlert, @@ -19,7 +19,7 @@ import FormsLayout from "../layouts/forms" const ForgotPassword = () => { const router = useRouter() - const { forgotPassword } = useContext(UserContext) + const { forgotPassword } = useContext(AuthContext) /* Form Handler */ // This is causing a linting issue with unbound-method, see open issue as of 10/21/2020: // https://github.com/react-hook-form/react-hook-form/issues/2887 @@ -31,7 +31,7 @@ const ForgotPassword = () => { const { email } = data try { - await forgotPassword(email, "en") + await forgotPassword(email) setSiteAlertMessage(t(`authentication.forgotPassword.success`), "success") await router.push("/") window.scrollTo(0, 0) diff --git a/sites/partners/pages/index.tsx b/sites/partners/pages/index.tsx index 4bd175b077..90035bd40d 100644 --- a/sites/partners/pages/index.tsx +++ b/sites/partners/pages/index.tsx @@ -1,6 +1,6 @@ import React, { useMemo, useContext } from "react" import Head from "next/head" -import { PageHeader, t, lRoute, UserContext } from "@bloom-housing/ui-components" +import { PageHeader, t, lRoute, AuthContext } from "@bloom-housing/ui-components" import moment from "moment" import { UserRole, Listing } from "@bloom-housing/backend-core/types" import { AgGridReact } from "ag-grid-react" @@ -11,7 +11,7 @@ import Layout from "../layouts" import { MetaTags } from "../src/MetaTags" export default function ListingsList() { - const { profile } = useContext(UserContext) + const { profile } = useContext(AuthContext) const leasingAgentInListings = profile.leasingAgentInListings?.map((item) => item.id) class formatLinkCell { link: HTMLAnchorElement diff --git a/sites/partners/pages/listings/[id]/applications/index.tsx b/sites/partners/pages/listings/[id]/applications/index.tsx index df4fc2831f..54f4742673 100644 --- a/sites/partners/pages/listings/[id]/applications/index.tsx +++ b/sites/partners/pages/listings/[id]/applications/index.tsx @@ -9,7 +9,7 @@ import { debounce, lRoute, LocalizedLink, - ApiClientContext, + AuthContext, SiteAlert, setSiteAlertMessage, AgPagination, @@ -30,7 +30,7 @@ import { GridOptions, ColumnApi, ColumnState } from "ag-grid-community" const ApplicationsList = () => { const COLUMN_STATE_KEY = "column-state" - const { applicationsService } = useContext(ApiClientContext) + const { applicationsService } = useContext(AuthContext) const router = useRouter() // eslint-disable-next-line @typescript-eslint/unbound-method const { register, watch } = useForm() diff --git a/sites/partners/pages/listings/[id]/flags/[flagId]/index.tsx b/sites/partners/pages/listings/[id]/flags/[flagId]/index.tsx index 24bdfeb91d..122b084cb5 100644 --- a/sites/partners/pages/listings/[id]/flags/[flagId]/index.tsx +++ b/sites/partners/pages/listings/[id]/flags/[flagId]/index.tsx @@ -12,7 +12,7 @@ import { AlertBox, AppearanceStyleType, useMutate, - ApiClientContext, + AuthContext, StatusBar, } from "@bloom-housing/ui-components" import { useSingleFlaggedApplication } from "../../../../../lib/hooks" @@ -23,7 +23,7 @@ import { } from "@bloom-housing/backend-core/types" const Flag = () => { - const { applicationFlaggedSetsService } = useContext(ApiClientContext) + const { applicationFlaggedSetsService } = useContext(AuthContext) const router = useRouter() const flagsetId = router.query.flagId as string diff --git a/sites/partners/pages/reset-password.tsx b/sites/partners/pages/reset-password.tsx index c3a67475dd..d10f12f5b8 100644 --- a/sites/partners/pages/reset-password.tsx +++ b/sites/partners/pages/reset-password.tsx @@ -8,7 +8,7 @@ import { Form, FormCard, Icon, - UserContext, + AuthContext, t, AlertBox, SiteAlert, @@ -19,7 +19,7 @@ import FormsLayout from "../layouts/forms" const ResetPassword = () => { const router = useRouter() const { token } = router.query - const { resetPassword } = useContext(UserContext) + const { resetPassword } = useContext(AuthContext) /* Form Handler */ // This is causing a linting issue with unbound-method, see open issue as of 10/21/2020: // https://github.com/react-hook-form/react-hook-form/issues/2887 diff --git a/sites/partners/pages/sign-in.tsx b/sites/partners/pages/sign-in.tsx index d719e2eca5..f4ff9d4bdf 100644 --- a/sites/partners/pages/sign-in.tsx +++ b/sites/partners/pages/sign-in.tsx @@ -10,14 +10,14 @@ import { Form, FormCard, Icon, - UserContext, + AuthContext, t, } from "@bloom-housing/ui-components" import { emailRegex } from "../lib/helpers" import FormsLayout from "../layouts/forms" export default () => { - const { login } = useContext(UserContext) + const { login } = useContext(AuthContext) /* Form Handler */ // eslint-disable-next-line @typescript-eslint/unbound-method const { register, handleSubmit, errors, setError, clearErrors } = useForm() diff --git a/sites/partners/src/applications/PaperApplicationForm/PaperApplicationForm.tsx b/sites/partners/src/applications/PaperApplicationForm/PaperApplicationForm.tsx index 28c1a0e882..a57f890115 100644 --- a/sites/partners/src/applications/PaperApplicationForm/PaperApplicationForm.tsx +++ b/sites/partners/src/applications/PaperApplicationForm/PaperApplicationForm.tsx @@ -1,7 +1,7 @@ import React, { useState, useContext, useEffect } from "react" import { useRouter } from "next/router" import { - ApiClientContext, + AuthContext, t, Form, AlertBox, @@ -51,7 +51,7 @@ const ApplicationForm = ({ listingId, editMode, application }: ApplicationFormPr const router = useRouter() - const { applicationsService } = useContext(ApiClientContext) + const { applicationsService } = useContext(AuthContext) const [alert, setAlert] = useState(null) const [loading, setLoading] = useState(false) diff --git a/sites/partners/src/listings/PaperListingForm/index.tsx b/sites/partners/src/listings/PaperListingForm/index.tsx index 233e970053..c570f12cd1 100644 --- a/sites/partners/src/listings/PaperListingForm/index.tsx +++ b/sites/partners/src/listings/PaperListingForm/index.tsx @@ -1,7 +1,7 @@ import React, { useState, useContext } from "react" import { useRouter } from "next/router" import { - ApiClientContext, + AuthContext, t, Form, AlertBox, @@ -92,7 +92,7 @@ const ListingForm = ({ listing, editMode }: ListingFormProps) => { const router = useRouter() - const { listingsService } = useContext(ApiClientContext) + const { listingsService } = useContext(AuthContext) const [alert, setAlert] = useState(null) const [loading, setLoading] = useState(false) diff --git a/sites/public/layouts/application.tsx b/sites/public/layouts/application.tsx index 60850fe69d..cfa50432ba 100644 --- a/sites/public/layouts/application.tsx +++ b/sites/public/layouts/application.tsx @@ -10,12 +10,12 @@ import { ExygyFooter, UserNav, t, - UserContext, + AuthContext, setSiteAlertMessage, } from "@bloom-housing/ui-components" const Layout = (props) => { - const { profile, signOut } = useContext(UserContext) + const { profile, signOut } = useContext(AuthContext) const router = useRouter() const languages = diff --git a/sites/public/pages/_app.tsx b/sites/public/pages/_app.tsx index 6bda74eac6..09cd0e49a8 100644 --- a/sites/public/pages/_app.tsx +++ b/sites/public/pages/_app.tsx @@ -5,9 +5,8 @@ import { addTranslation, GenericRouter, NavigationContext, - UserProvider, + AuthProvider, ConfigProvider, - ApiClientProvider, LoggedInUserIdleTimeout, blankApplication, } from "@bloom-housing/ui-components" @@ -82,12 +81,10 @@ function BloomApp({ Component, router, pageProps }: AppProps) { }} > - - - conductor.reset()} /> - - - + + conductor.reset()} /> + + diff --git a/sites/public/pages/account/AppStatusItemWrapper.tsx b/sites/public/pages/account/AppStatusItemWrapper.tsx index 8d78063415..256c8616f3 100644 --- a/sites/public/pages/account/AppStatusItemWrapper.tsx +++ b/sites/public/pages/account/AppStatusItemWrapper.tsx @@ -1,13 +1,13 @@ import React, { useContext, useEffect, useState } from "react" import { Application, Listing } from "@bloom-housing/backend-core/types" -import { AppStatusItem, ApiClientContext } from "@bloom-housing/ui-components" +import { AppStatusItem, AuthContext } from "@bloom-housing/ui-components" interface AppStatusItemWrapperProps { application: Application } const AppStatusItemWrapper = (props: AppStatusItemWrapperProps) => { - const { listingsService } = useContext(ApiClientContext) + const { listingsService } = useContext(AuthContext) const [listing, setListing] = useState() useEffect(() => { diff --git a/sites/public/pages/account/application.tsx b/sites/public/pages/account/application.tsx index 29add3b14b..630231626c 100644 --- a/sites/public/pages/account/application.tsx +++ b/sites/public/pages/account/application.tsx @@ -1,12 +1,5 @@ import React, { useEffect, useState, useContext } from "react" -import { - ApiClientContext, - RequireLogin, - t, - UserContext, - FormCard, - dateToString, -} from "@bloom-housing/ui-components" +import { AuthContext, RequireLogin, t, FormCard, dateToString } from "@bloom-housing/ui-components" import Link from "next/link" import FormSummaryDetails from "../../src/forms/applications/FormSummaryDetails" import FormsLayout from "../../layouts/forms" @@ -16,8 +9,8 @@ import { useRouter } from "next/router" export default () => { const router = useRouter() const applicationId = router.query.id as string - const { applicationsService, listingsService } = useContext(ApiClientContext) - const { profile } = useContext(UserContext) + const { applicationsService, listingsService } = useContext(AuthContext) + const { profile } = useContext(AuthContext) const [application, setApplication] = useState() const [listing, setListing] = useState() const [unauthorized, setUnauthorized] = useState(false) diff --git a/sites/public/pages/account/applications.tsx b/sites/public/pages/account/applications.tsx index 8f92ee7051..1097d2758d 100644 --- a/sites/public/pages/account/applications.tsx +++ b/sites/public/pages/account/applications.tsx @@ -1,14 +1,13 @@ import React, { useEffect, useState, Fragment, useContext } from "react" import Head from "next/head" import { - ApiClientContext, + AuthContext, DashBlock, DashBlocks, HeaderBadge, LinkButton, RequireLogin, t, - UserContext, LoadingOverlay, } from "@bloom-housing/ui-components" import Layout from "../../layouts/application" @@ -17,8 +16,7 @@ import { AppStatusItemWrapper } from "./AppStatusItemWrapper" import { MetaTags } from "../../src/MetaTags" export default () => { - const { applicationsService } = useContext(ApiClientContext) - const { profile } = useContext(UserContext) + const { applicationsService, profile } = useContext(AuthContext) const [applications, setApplications] = useState() const [error, setError] = useState(null) const [loading, setLoading] = useState(true) diff --git a/sites/public/pages/account/edit.tsx b/sites/public/pages/account/edit.tsx index 880f230127..c01927ae05 100644 --- a/sites/public/pages/account/edit.tsx +++ b/sites/public/pages/account/edit.tsx @@ -6,13 +6,12 @@ import { Field, FormCard, Icon, - UserContext, + AuthContext, Form, emailRegex, t, AlertBox, SiteAlert, - ApiClientContext, RequireLogin, AlertTypes, passwordRegex, @@ -31,8 +30,7 @@ const Edit = () => { /* Form Handler */ // eslint-disable-next-line @typescript-eslint/unbound-method const { register, handleSubmit, errors, watch } = useForm() - const { profile } = useContext(UserContext) - const { userService } = useContext(ApiClientContext) + const { profile, userService } = useContext(AuthContext) const [passwordAlert, setPasswordAlert] = useState() const [nameAlert, setNameAlert] = useState() const [dobAlert, setDobAlert] = useState() diff --git a/sites/public/pages/applications/review/confirmation.tsx b/sites/public/pages/applications/review/confirmation.tsx index d400b96cfa..8509590f87 100644 --- a/sites/public/pages/applications/review/confirmation.tsx +++ b/sites/public/pages/applications/review/confirmation.tsx @@ -9,7 +9,7 @@ import { Button, FormCard, imageUrlFromListing, - UserContext, + AuthContext, t, } from "@bloom-housing/ui-components" import FormsLayout from "../../../layouts/forms" @@ -18,7 +18,7 @@ import React, { useContext } from "react" const ApplicationConfirmation = () => { const { application, listing } = useContext(AppSubmissionContext) - const { initialStateLoaded, profile } = useContext(UserContext) + const { initialStateLoaded, profile } = useContext(AuthContext) const router = useRouter() const imageUrl = imageUrlFromListing(listing) diff --git a/sites/public/pages/applications/review/terms.tsx b/sites/public/pages/applications/review/terms.tsx index 985510dd68..a137059279 100644 --- a/sites/public/pages/applications/review/terms.tsx +++ b/sites/public/pages/applications/review/terms.tsx @@ -9,8 +9,7 @@ import { FormCard, ProgressNav, t, - UserContext, - ApiClientContext, + AuthContext, FieldGroup, Form, AlertBox, @@ -24,8 +23,7 @@ import { useFormConductor } from "../../../lib/hooks" const ApplicationTerms = () => { const router = useRouter() const { conductor, application, listing } = useFormConductor("terms") - const { applicationsService } = useContext(ApiClientContext) - const { profile } = useContext(UserContext) + const { applicationsService, profile } = useContext(AuthContext) const [apiError, setApiError] = useState(false) const [submitting, setSubmitting] = useState(false) diff --git a/sites/public/pages/applications/start/autofill.tsx b/sites/public/pages/applications/start/autofill.tsx index 6f327194f0..efdd170be5 100644 --- a/sites/public/pages/applications/start/autofill.tsx +++ b/sites/public/pages/applications/start/autofill.tsx @@ -2,14 +2,13 @@ import useSWR from "swr" import { useContext, useState } from "react" import { Application } from "@bloom-housing/backend-core/types" import { - ApiClientContext, + AuthContext, blankApplication, AppearanceStyleType, Button, Form, FormCard, ProgressNav, - UserContext, t, } from "@bloom-housing/ui-components" import { useForm } from "react-hook-form" @@ -21,8 +20,7 @@ import AutofillCleaner from "../../../lib/appAutofill" export default () => { const context = useFormConductor("autofill") const { conductor, application, listing } = context - const { initialStateLoaded, profile } = useContext(UserContext) - const { applicationsService } = useContext(ApiClientContext) + const { initialStateLoaded, profile, applicationsService } = useContext(AuthContext) const [submitted, setSubmitted] = useState(false) const [previousApplication, setPreviousApplication] = useState(null) diff --git a/sites/public/pages/applications/start/choose-language.tsx b/sites/public/pages/applications/start/choose-language.tsx index fccdc2e087..45debee4af 100644 --- a/sites/public/pages/applications/start/choose-language.tsx +++ b/sites/public/pages/applications/start/choose-language.tsx @@ -12,7 +12,7 @@ import { LinkButton, FormCard, ProgressNav, - UserContext, + AuthContext, t, } from "@bloom-housing/ui-components" import FormsLayout from "../../../layouts/forms" @@ -33,7 +33,7 @@ const ApplicationChooseLanguage = () => { const router = useRouter() const [listing, setListing] = useState(null) const context = useContext(AppSubmissionContext) - const { initialStateLoaded, profile } = useContext(UserContext) + const { initialStateLoaded, profile } = useContext(AuthContext) const { conductor, application } = context const listingId = router.query.listingId as string diff --git a/sites/public/pages/create-account.tsx b/sites/public/pages/create-account.tsx index 1708aae801..9887f39b14 100644 --- a/sites/public/pages/create-account.tsx +++ b/sites/public/pages/create-account.tsx @@ -7,7 +7,7 @@ import { FormCard, Icon, LinkButton, - UserContext, + AuthContext, Form, emailRegex, t, @@ -22,7 +22,7 @@ import moment from "moment" import { useRouter } from "next/router" export default () => { - const { createUser, resendConfirmation } = useContext(UserContext) + const { createUser, resendConfirmation } = useContext(AuthContext) const [confirmationResent, setConfirmationResent] = useState(false) /* Form Handler */ // eslint-disable-next-line @typescript-eslint/unbound-method @@ -39,14 +39,11 @@ export default () => { const onSubmit = async (data) => { try { const { dob, ...rest } = data - await createUser( - { - ...rest, - dob: moment(`${dob.birthYear}-${dob.birthMonth}-${dob.birthDay}`), - language, - }, - language - ) + await createUser({ + ...rest, + dob: moment(`${dob.birthYear}-${dob.birthMonth}-${dob.birthDay}`), + language, + }) setOpenModal(true) } catch (err) { @@ -247,7 +244,7 @@ export default () => { styleType={AppearanceStyleType.secondary} onClick={() => { setConfirmationResent(true) - void resendConfirmation(email.current.toString(), language) + void resendConfirmation(email.current.toString()) }} > {t("authentication.createAccount.resendTheEmail")} diff --git a/sites/public/pages/forgot-password.tsx b/sites/public/pages/forgot-password.tsx index b6fc5c6747..075ecc6191 100644 --- a/sites/public/pages/forgot-password.tsx +++ b/sites/public/pages/forgot-password.tsx @@ -8,7 +8,7 @@ import { Form, FormCard, Icon, - UserContext, + AuthContext, t, AlertBox, SiteAlert, @@ -19,8 +19,7 @@ import FormsLayout from "../layouts/forms" const ForgotPassword = () => { const router = useRouter() - const { forgotPassword } = useContext(UserContext) - const language = router.locale + const { forgotPassword } = useContext(AuthContext) /* Form Handler */ // This is causing a linting issue with unbound-method, see open issue as of 10/21/2020: @@ -33,7 +32,7 @@ const ForgotPassword = () => { const { email } = data try { - await forgotPassword(email, language) + await forgotPassword(email) setSiteAlertMessage(t(`authentication.forgotPassword.success`), "success") await router.push("/") } catch (err) { diff --git a/sites/public/pages/reset-password.tsx b/sites/public/pages/reset-password.tsx index cd74459ff1..8ee63be838 100644 --- a/sites/public/pages/reset-password.tsx +++ b/sites/public/pages/reset-password.tsx @@ -8,7 +8,7 @@ import { Form, FormCard, Icon, - UserContext, + AuthContext, t, AlertBox, SiteAlert, @@ -19,7 +19,7 @@ import FormsLayout from "../layouts/forms" const ResetPassword = () => { const router = useRouter() const { token } = router.query - const { resetPassword } = useContext(UserContext) + const { resetPassword } = useContext(AuthContext) /* Form Handler */ // This is causing a linting issue with unbound-method, see open issue as of 10/21/2020: // https://github.com/react-hook-form/react-hook-form/issues/2887 diff --git a/sites/public/pages/sign-in.tsx b/sites/public/pages/sign-in.tsx index b4a92e5169..0f96ce8ebb 100644 --- a/sites/public/pages/sign-in.tsx +++ b/sites/public/pages/sign-in.tsx @@ -9,7 +9,7 @@ import { FormCard, Icon, LinkButton, - UserContext, + AuthContext, t, AlertBox, SiteAlert, @@ -19,7 +19,7 @@ import FormsLayout from "../layouts/forms" import { useRedirectToPrevPage } from "../lib/hooks" const SignIn = () => { - const { login } = useContext(UserContext) + const { login } = useContext(AuthContext) /* Form Handler */ // This is causing a linting issue with unbound-method, see open issue as of 10/21/2020: // https://github.com/react-hook-form/react-hook-form/issues/2887 diff --git a/sites/public/src/ConfirmationModal.tsx b/sites/public/src/ConfirmationModal.tsx index 186869be0c..11abf92636 100644 --- a/sites/public/src/ConfirmationModal.tsx +++ b/sites/public/src/ConfirmationModal.tsx @@ -2,7 +2,7 @@ import { AppearanceStyleType, Button, Modal, - UserContext, + AuthContext, t, Form, Field, @@ -19,11 +19,10 @@ export interface ConfirmationModalProps { const ConfirmationModal = (props: ConfirmationModalProps) => { const { setSiteAlertMessage } = props - const { resendConfirmation, profile, confirmAccount } = useContext(UserContext) + const { resendConfirmation, profile, confirmAccount } = useContext(AuthContext) const [openModal, setOpenModal] = useState(false) const [modalMessage, setModalMessage] = useState(null) const router = useRouter() - const language = router.locale /* Form Handler */ // This is causing a linting issue with unbound-method, see open issue as of 10/21/2020: @@ -35,7 +34,7 @@ const ConfirmationModal = (props: ConfirmationModalProps) => { const onSubmit = async ({ email }) => { try { - await resendConfirmation(email, language) + await resendConfirmation(email) setSiteAlertMessage(t(`authentication.createAccount.emailSent`), "success") setOpenModal(false) @@ -48,7 +47,7 @@ const ConfirmationModal = (props: ConfirmationModalProps) => { useEffect(() => { if (router?.query?.token && !profile) { - confirmAccount(router.query.token.toString(), language) + confirmAccount(router.query.token.toString()) .then(() => { void router.push({ pathname: "/account/dashboard", diff --git a/sites/public/src/forms/applications/ApplicationTimeout.ts b/sites/public/src/forms/applications/ApplicationTimeout.ts index 6d6e9e5c11..e8e53a3e1b 100644 --- a/sites/public/src/forms/applications/ApplicationTimeout.ts +++ b/sites/public/src/forms/applications/ApplicationTimeout.ts @@ -1,9 +1,9 @@ import { createElement, useContext } from "react" -import { IdleTimeout, UserContext, lRoute, t } from "@bloom-housing/ui-components" +import { IdleTimeout, AuthContext, lRoute, t } from "@bloom-housing/ui-components" import { AppSubmissionContext } from "../../../lib/AppSubmissionContext" const ApplicationTimeout = () => { - const { profile } = useContext(UserContext) + const { profile } = useContext(AuthContext) const { conductor } = useContext(AppSubmissionContext) const onTimeout = () => { diff --git a/ui-components/__tests__/authentication/RequireLogin.test.tsx b/ui-components/__tests__/authentication/RequireLogin.test.tsx index 74f3406b70..beb2388a69 100644 --- a/ui-components/__tests__/authentication/RequireLogin.test.tsx +++ b/ui-components/__tests__/authentication/RequireLogin.test.tsx @@ -1,7 +1,7 @@ import React from "react" import { render } from "@testing-library/react" import { RequireLogin } from "../../src/authentication/RequireLogin" -import { UserContext } from "../../src/authentication/UserContext" +import { AuthContext } from "../../src/authentication/AuthContext" import { User } from "@bloom-housing/backend-core/types" import { GenericRouter, NavigationContext } from "../../src/config/NavigationContext" @@ -44,11 +44,11 @@ const itShouldRender = () => LinkComponent: (props) => {props.children}, }} > - +
- + ) expect(getByLabelText("child")).toBeTruthy() @@ -63,11 +63,11 @@ const itShouldNotRenderChildren = () => LinkComponent: (props) => {props.children}, }} > - +
- + ) expect(queryByLabelText("child")).toBeFalsy() @@ -82,11 +82,11 @@ const itShouldRedirect = () => LinkComponent: (props) => {props.children}, }} > - +
- + ) expect(mockRouter.pathname).toEqual("/sign-in") @@ -101,11 +101,11 @@ const itShouldNotRedirect = () => LinkComponent: (props) => {props.children}, }} > - +
- + ) expect(mockRouter.pathname).not.toEqual("/sign-in") diff --git a/ui-components/__tests__/authentication/Timeout.test.tsx b/ui-components/__tests__/authentication/Timeout.test.tsx index 61fa7651c5..bf18f12b59 100644 --- a/ui-components/__tests__/authentication/Timeout.test.tsx +++ b/ui-components/__tests__/authentication/Timeout.test.tsx @@ -1,7 +1,7 @@ import React from "react" import { render, cleanup } from "@testing-library/react" import { LoggedInUserIdleTimeout } from "../../src/authentication/timeout" -import { UserContext } from "../../src/authentication/UserContext" +import { AuthContext } from "../../src/authentication/AuthContext" afterEach(cleanup) @@ -11,7 +11,7 @@ describe("", () => { const anchorMocked = document.createElement("div") const createElementSpy = jest.spyOn(document, "createElement").mockReturnValueOnce(anchorMocked) render( - ", () => { }} > - + ) expect(createElementSpy).toHaveBeenCalledTimes(2) createElementSpy.mockRestore() @@ -38,13 +38,13 @@ describe("", () => { const anchorMocked = document.createElement("div") const createElementSpy = jest.spyOn(document, "createElement").mockReturnValueOnce(anchorMocked) render( - {}, }} > - + ) expect(createElementSpy).toHaveBeenCalledTimes(1) createElementSpy.mockRestore() diff --git a/ui-components/src/authentication/AuthContext.ts b/ui-components/src/authentication/AuthContext.ts new file mode 100644 index 0000000000..49f4193e2b --- /dev/null +++ b/ui-components/src/authentication/AuthContext.ts @@ -0,0 +1,308 @@ +import { + ApplicationsService, + ApplicationFlaggedSetsService, + AuthService, + ListingsService, + User, + UserBasic, + UserCreate, + UserService, + serviceOptions, + Status, +} from "@bloom-housing/backend-core/types" +import { + createContext, + createElement, + FunctionComponent, + useContext, + useEffect, + useMemo, + useReducer, +} from "react" +import axiosStatic from "axios" +import { ConfigContext } from "../config/ConfigContext" +import { createAction, createReducer } from "typesafe-actions" +import { clearToken, getToken, getTokenTtl, setToken } from "./token" +import { NavigationContext } from "../config/NavigationContext" + +type ContextProps = { + applicationsService: ApplicationsService + applicationFlaggedSetsService: ApplicationFlaggedSetsService + listingsService: ListingsService + userService: UserService + authService: AuthService + login: (email: string, password: string) => Promise + resetPassword: ( + token: string, + password: string, + passwordConfirmation: string + ) => Promise + signOut: () => void + confirmAccount: (token: string) => Promise + forgotPassword: (email: string) => Promise + createUser: (user: UserCreate) => Promise + resendConfirmation: (email: string) => Promise + accessToken?: string + initialStateLoaded: boolean + loading: boolean + profile?: User +} + +// Internal Provider State +type AuthState = { + accessToken?: string + initialStateLoaded: boolean + language?: string + loading: boolean + profile?: User + refreshTimer?: number + storageType: string +} + +type DispatchType = (...arg: [unknown]) => void + +// State Mutation Actions +const saveToken = createAction("SAVE_TOKEN")<{ + apiUrl: string + accessToken: string + dispatch: DispatchType +}>() +const saveProfile = createAction("SAVE_PROFILE")() +const startLoading = createAction("START_LOADING")() +const stopLoading = createAction("STOP_LOADING")() +const signOut = createAction("SIGN_OUT")() + +const scheduleTokenRefresh = (accessToken: string, onRefresh: (accessToken: string) => void) => { + const ttl = getTokenTtl(accessToken) + + if (ttl < 0) { + // If ttl is negative, then our token is already expired, we'll have to re-login to get a new token. + //dispatch(signOut()) + return null + } else { + // Queue up a refresh for ~1 minute before the token expires + return (setTimeout(() => { + const run = async () => { + const reposne = await new AuthService().token() + if (reposne) { + onRefresh(reposne.accessToken) + } + } + void run() + }, Math.max(ttl - 60000, 0)) as unknown) as number + } +} +const reducer = createReducer( + { + loading: false, + initialStateLoaded: false, + storageType: "session", + language: "en", + } as AuthState, + { + SAVE_TOKEN: (state, { payload }) => { + const { refreshTimer: oldRefresh, ...rest } = state + const { accessToken, apiUrl, dispatch } = payload + + // If an existing refresh timer has been defined, remove it as the access token has changed + if (oldRefresh) { + clearTimeout(oldRefresh) + } + + // Save off the token in local storage for persistence across reloads. + setToken(state.storageType, accessToken) + + const refreshTimer = scheduleTokenRefresh(accessToken, (newAccessToken) => + dispatch(saveToken({ apiUrl, accessToken: newAccessToken, dispatch })) + ) + serviceOptions.axios = axiosStatic.create({ + baseURL: apiUrl, + headers: { + language: state.language, + countyCode: process.env.countyCode, + ...(accessToken && { Authorization: `Bearer ${accessToken}` }), + }, + }) + + return { + ...rest, + ...(refreshTimer && { refreshTimer }), + accessToken: accessToken, + } + }, + SAVE_PROFILE: (state, { payload: user }) => ({ ...state, profile: user }), + START_LOADING: (state) => ({ ...state, loading: true }), + END_LOADING: (state) => ({ ...state, loading: false }), + SIGN_OUT: ({ storageType }) => { + clearToken(storageType) + // Clear out all existing state other than the storage type + return { loading: false, storageType, initialStateLoaded: true } + }, + } +) + +export const AuthContext = createContext>({}) +export const AuthProvider: FunctionComponent = ({ children }) => { + const { apiUrl, storageType } = useContext(ConfigContext) + const { router } = useContext(NavigationContext) + const [state, dispatch] = useReducer(reducer, { + loading: false, + initialStateLoaded: false, + storageType, + language: router.locale, + }) + + const userService = useMemo(() => new UserService(), []) + const authService = new AuthService() + + useEffect(() => { + serviceOptions.axios = axiosStatic.create({ + baseURL: apiUrl, + headers: { + language: router.locale, + countyCode: process.env.countyCode, + appUrl: window.location.origin, + ...(state.accessToken && { Authorization: `Bearer ${state.accessToken}` }), + }, + }) + }, [router, apiUrl, state.accessToken, router.locale]) + + // On initial load/reload, check localStorage to see if we have a token available + useEffect(() => { + const accessToken = getToken(storageType) + if (accessToken) { + const ttl = getTokenTtl(accessToken) + + if (ttl > 0) { + dispatch(saveToken({ accessToken, apiUrl, dispatch })) + } else { + dispatch(signOut()) + } + } else { + dispatch(signOut()) + } + }, [apiUrl, storageType]) + + // Load our profile as soon as we have an access token available + useEffect(() => { + if (!state.profile && state.accessToken && !state.loading) { + const loadProfile = async () => { + dispatch(startLoading()) + try { + const profile = await userService?.userControllerProfile() + if (profile) { + dispatch(saveProfile(profile)) + } + } finally { + dispatch(stopLoading()) + } + } + void loadProfile() + } + }, [state.profile, state.accessToken, apiUrl, userService, state.loading]) + + const contextValues: ContextProps = { + applicationsService: new ApplicationsService(), + applicationFlaggedSetsService: new ApplicationFlaggedSetsService(), + listingsService: new ListingsService(), + userService: new UserService(), + authService: new AuthService(), + loading: state.loading, + accessToken: state.accessToken, + initialStateLoaded: state.initialStateLoaded, + profile: state.profile, + login: async (email, password) => { + dispatch(signOut()) + dispatch(startLoading()) + try { + const response = await authService?.login({ body: { email, password } }) + if (response) { + dispatch(saveToken({ accessToken: response.accessToken, apiUrl, dispatch })) + const profile = await userService?.userControllerProfile() + if (profile) { + dispatch(saveProfile(profile)) + return profile + } + } + return undefined + } finally { + dispatch(stopLoading()) + } + }, + signOut: () => dispatch(signOut()), + resetPassword: async (token, password, passwordConfirmation) => { + dispatch(startLoading()) + try { + const response = await userService?.updatePassword({ + body: { + token, + password, + passwordConfirmation, + }, + }) + if (response) { + dispatch(saveToken({ accessToken: response.accessToken, apiUrl, dispatch })) + const profile = await userService?.userControllerProfile() + if (profile) { + dispatch(saveProfile(profile)) + return profile + } + } + return undefined + } finally { + dispatch(stopLoading()) + } + }, + confirmAccount: async (token) => { + dispatch(startLoading()) + try { + const response = await userService?.confirm({ body: { token } }) + if (response) { + dispatch(saveToken({ accessToken: response.accessToken, apiUrl, dispatch })) + const profile = await userService?.userControllerProfile() + if (profile) { + dispatch(saveProfile(profile)) + return profile + } + } + return undefined + } finally { + dispatch(stopLoading()) + } + }, + createUser: async (user: UserCreate) => { + dispatch(startLoading()) + try { + const response = await userService?.create({ + body: { ...user, appUrl: window.location.origin }, + }) + return response + } finally { + dispatch(stopLoading()) + } + }, + resendConfirmation: async (email: string) => { + dispatch(startLoading()) + try { + const response = await userService?.resendConfirmation({ + body: { email, appUrl: window.location.origin }, + }) + return response + } finally { + dispatch(stopLoading()) + } + }, + forgotPassword: async (email) => { + dispatch(startLoading()) + try { + const response = await userService?.forgotPassword({ + body: { email, appUrl: window.location.origin }, + }) + return response?.message + } finally { + dispatch(stopLoading()) + } + }, + } + return createElement(AuthContext.Provider, { value: contextValues }, children) +} diff --git a/ui-components/src/authentication/RequireLogin.tsx b/ui-components/src/authentication/RequireLogin.tsx index f635787c71..b1cf150b32 100644 --- a/ui-components/src/authentication/RequireLogin.tsx +++ b/ui-components/src/authentication/RequireLogin.tsx @@ -1,7 +1,7 @@ import React, { FunctionComponent, useContext, useEffect } from "react" import { setSiteAlertMessage } from "../notifications/SiteAlert" import { NavigationContext } from "../config/NavigationContext" -import { UserContext } from "./UserContext" +import { AuthContext } from "./AuthContext" // See https://github.com/Microsoft/TypeScript/issues/14094 type Without = { [P in Exclude]?: never } @@ -27,7 +27,7 @@ const RequireLogin: FunctionComponent = ({ ...rest }) => { const { router } = useContext(NavigationContext) - const { profile, initialStateLoaded } = useContext(UserContext) + const { profile, initialStateLoaded } = useContext(AuthContext) // Parse just the pathname portion of the signInPath (in case we want to pass URL params) const [signInPathname] = signInPath.split("?") diff --git a/ui-components/src/authentication/UserContext.tsx b/ui-components/src/authentication/UserContext.tsx deleted file mode 100644 index b6fd7a8b96..0000000000 --- a/ui-components/src/authentication/UserContext.tsx +++ /dev/null @@ -1,221 +0,0 @@ -import { - createContext, - createElement, - useReducer, - FunctionComponent, - useEffect, - useContext, -} from "react" -import { createAction, createReducer } from "typesafe-actions" -import { clearToken, getToken, getTokenTtl, setToken } from "./token" -import { - confirmAccount, - createAxiosInstance, - forgotPassword, - getProfile, - login, - register, - resendConfirmation, - scheduleTokenRefresh, - resetPassword, -} from "./api_requests" -import { ConfigContext } from "../config/ConfigContext" -import { User, UserCreate } from "@bloom-housing/backend-core/types" -// External interface this context provides -type ContextProps = { - confirmAccount: (token: string, language: string) => Promise - forgotPassword: (email: string, language: string) => Promise - login: (email: string, password: string) => Promise - createUser: (user: UserCreate, language: string) => Promise - resendConfirmation: (email: string, language: string) => Promise - signOut: () => void - // True when an API request is processing - resetPassword: (token: string, password: string, passwordConfirmation: string) => Promise - loading: boolean - profile?: User - accessToken?: string - initialStateLoaded: boolean -} - -// Internal Provider State -type UserState = { - loading: boolean - initialStateLoaded: boolean - storageType: string - accessToken?: string - profile?: User - refreshTimer?: number -} - -type DispatchType = (...arg: [unknown]) => void - -// State Mutation Actions -const saveToken = createAction("SAVE_TOKEN")<{ - apiUrl: string - accessToken: string - dispatch: DispatchType -}>() -const startLoading = createAction("START_LOADING")() -const stopLoading = createAction("STOP_LOADING")() -const saveProfile = createAction("SAVE_PROFILE")() -const signOut = createAction("SIGN_OUT")() - -const reducer = createReducer( - { loading: false, initialStateLoaded: false, storageType: "session" } as UserState, - { - SAVE_TOKEN: (state, { payload }) => { - const { refreshTimer: oldRefresh, ...rest } = state - const { accessToken, apiUrl, dispatch } = payload - - // If an existing refresh timer has been defined, remove it as the access token has changed - if (oldRefresh) { - clearTimeout(oldRefresh) - } - - // Save off the token in local storage for persistence across reloads. - setToken(state.storageType, accessToken) - - const refreshTimer = scheduleTokenRefresh(apiUrl, accessToken, (newAccessToken) => - dispatch(saveToken({ apiUrl, accessToken: newAccessToken, dispatch })) - ) - - return { - ...rest, - ...(refreshTimer && { refreshTimer }), - accessToken: accessToken, - } - }, - START_LOADING: (state) => ({ ...state, loading: true }), - END_LOADING: (state) => ({ ...state, loading: false }), - SAVE_PROFILE: (state, { payload: user }) => ({ ...state, profile: user }), - SIGN_OUT: ({ storageType }) => { - clearToken(storageType) - // Clear out all existing state other than the storage type - return { loading: false, storageType, initialStateLoaded: true } - }, - } -) - -export const UserContext = createContext>({}) - -export const UserProvider: FunctionComponent = ({ children }) => { - const { apiUrl, storageType } = useContext(ConfigContext) - const [state, dispatch] = useReducer(reducer, { - loading: false, - initialStateLoaded: false, - storageType, - }) - - // Load our profile as soon as we have an access token available - useEffect(() => { - if (!state.profile && state.accessToken) { - const client = createAxiosInstance(apiUrl, state.accessToken) - const loadProfile = async () => { - dispatch(startLoading()) - try { - const profile = await getProfile(client) - dispatch(saveProfile(profile)) - } catch (err) { - dispatch(signOut()) - } finally { - dispatch(stopLoading()) - } - } - void loadProfile() - } - }, [state.profile, state.accessToken, apiUrl]) - - // On initial load/reload, check localStorage to see if we have a token available - useEffect(() => { - const accessToken = getToken(storageType) - if (accessToken) { - const ttl = getTokenTtl(accessToken) - - if (ttl > 0) { - dispatch(saveToken({ accessToken, apiUrl, dispatch })) - } else { - dispatch(signOut()) - } - } else { - dispatch(signOut()) - } - }, [apiUrl, storageType]) - - const contextValues: ContextProps = { - loading: state.loading, - profile: state.profile, - accessToken: state.accessToken, - initialStateLoaded: state.initialStateLoaded, - login: async (email, password) => { - dispatch(signOut()) - dispatch(startLoading()) - try { - const accessToken = await login(apiUrl, email, password) - dispatch(saveToken({ accessToken, apiUrl, dispatch })) - const client = createAxiosInstance(apiUrl, accessToken) - const profile = await getProfile(client) - dispatch(saveProfile(profile)) - return profile - } finally { - dispatch(stopLoading()) - } - }, - createUser: async (user: UserCreate, language: string) => { - dispatch(startLoading()) - try { - const { status: status } = await register(apiUrl, user, language) - return status - } finally { - dispatch(stopLoading()) - } - }, - resendConfirmation: async (email: string, language: string) => { - dispatch(startLoading()) - try { - const { status: status } = await resendConfirmation(apiUrl, email, language) - return status - } finally { - dispatch(stopLoading()) - } - }, - signOut: () => dispatch(signOut()), - forgotPassword: async (email, language) => { - dispatch(startLoading()) - try { - const message = await forgotPassword(apiUrl, email, language) - return message - } finally { - dispatch(stopLoading()) - } - }, - resetPassword: async (token, password, passwordConfirmation) => { - dispatch(startLoading()) - try { - const accessToken = await resetPassword(apiUrl, token, password, passwordConfirmation) - dispatch(saveToken({ accessToken, apiUrl, dispatch })) - const client = createAxiosInstance(apiUrl, accessToken) - const profile = await getProfile(client) - dispatch(saveProfile(profile)) - return profile - } finally { - dispatch(stopLoading()) - } - }, - confirmAccount: async (token, language) => { - dispatch(startLoading()) - try { - const accessToken = await confirmAccount(apiUrl, token, language) - dispatch(saveToken({ accessToken, apiUrl, dispatch })) - const client = createAxiosInstance(apiUrl, accessToken) - const profile = await getProfile(client) - dispatch(saveProfile(profile)) - return profile - } finally { - dispatch(stopLoading()) - } - }, - } - return createElement(UserContext.Provider, { value: contextValues }, children) -} - -export default UserContext diff --git a/ui-components/src/authentication/api_requests.ts b/ui-components/src/authentication/api_requests.ts deleted file mode 100644 index 1d2bfe34a0..0000000000 --- a/ui-components/src/authentication/api_requests.ts +++ /dev/null @@ -1,125 +0,0 @@ -import axios, { AxiosInstance } from "axios" -import { getTokenTtl } from "./token" -import { UserCreate, User, Status } from "@bloom-housing/backend-core/types" - -const axiosWithHeaders = (language: string) => - axios.create({ - headers: { - language: language, - "county-code": process.env.countyCode, - }, - }) - -export const renewToken = async (client: AxiosInstance) => { - const res = await client.post<{ accessToken: string }>("auth/token") - const { accessToken } = res.data - return accessToken -} - -export const login = async (apiBase: string, email: string, password: string) => { - const res = await axios.post<{ accessToken: string }>(`${apiBase}/auth/login`, { - email: email, - password, - }) - const { accessToken } = res.data - return accessToken -} - -export const register = async (apiBase: string, data: UserCreate, language: string) => { - const res = await axiosWithHeaders(language).post<{ accessToken: string } & Status>( - `${apiBase}/user`, - { - appUrl: window.location.origin, - ...data, - } - ) - return { ...res.data } -} - -export const resendConfirmation = async (apiBase: string, email: string, language: string) => { - const res = await axiosWithHeaders(language).post<{ accessToken: string } & Status>( - `${apiBase}/user/resend-confirmation`, - { - appUrl: window.location.origin, - email: email, - } - ) - return { ...res.data } -} - -export const getProfile = async (client: AxiosInstance) => { - const res = await client.get("/user") - return res.data -} - -export const createAxiosInstance = (apiUrl: string, accessToken: string) => - axios.create({ - baseURL: apiUrl, - headers: { - Authorization: `Bearer ${accessToken}`, - }, - }) - -export const scheduleTokenRefresh = ( - apiUrl: string, - accessToken: string, - onRefresh: (accessToken: string) => void -) => { - const ttl = getTokenTtl(accessToken) - - if (ttl < 0) { - // If ttl is negative, then our token is already expired, we'll have to re-login to get a new token. - //dispatch(signOut()) - return null - } else { - // Queue up a refresh for ~1 minute before the token expires - return (setTimeout(() => { - const run = async () => { - const client = createAxiosInstance(apiUrl, accessToken) - const newToken = await renewToken(client) - if (newToken) { - onRefresh(newToken) - } - } - void run() - }, Math.max(ttl - 60000, 0)) as unknown) as number - } -} - -export const forgotPassword = async (apiUrl: string, email: string, language: string) => { - const res = await axiosWithHeaders(language).put<{ message: string }>( - `${apiUrl}/user/forgot-password`, - { - appUrl: window.location.origin, - email: email, - } - ) - const { message } = res.data - return message -} - -export const resetPassword = async ( - apiUrl: string, - token: string, - password: string, - passwordConfirmation: string -) => { - const res = await axios.put<{ accessToken: string }>(`${apiUrl}/user/update-password`, { - password: password, - passwordConfirmation: passwordConfirmation, - token: token, - }) - const { accessToken } = res.data - return accessToken -} - -export const confirmAccount = async (apiUrl: string, token: string, language: string) => { - const res = await axiosWithHeaders(language).put<{ accessToken: string }>( - `${apiUrl}/user/confirm`, - { - token: token, - } - ) - const { accessToken } = res.data - return accessToken -} diff --git a/ui-components/src/authentication/client.ts b/ui-components/src/authentication/client.ts deleted file mode 100644 index ce96dc6d87..0000000000 --- a/ui-components/src/authentication/client.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - ApplicationsService, - ListingsService, - UserService, - serviceOptions, - ApplicationFlaggedSetsService, -} from "@bloom-housing/backend-core/types" -import { useAuthenticatedClient } from "./useAuthenticatedClient" -import { createContext, createElement, FunctionComponent, useContext } from "react" -import axiosStatic from "axios" -import { ConfigContext } from "../config/ConfigContext" - -type ContextProps = { - applicationsService: ApplicationsService - listingsService: ListingsService - userService: UserService - applicationFlaggedSetsService: ApplicationFlaggedSetsService -} - -export const ApiClientContext = createContext>({}) -export const ApiClientProvider: FunctionComponent = ({ children }) => { - const { apiUrl } = useContext(ConfigContext) - const authClient = useAuthenticatedClient() - serviceOptions.axios = - authClient || - axiosStatic.create({ - baseURL: apiUrl, - }) - - return createElement( - ApiClientContext.Provider, - { - value: { - applicationsService: new ApplicationsService(), - listingsService: new ListingsService(), - userService: new UserService(), - applicationFlaggedSetsService: new ApplicationFlaggedSetsService(), - }, - }, - children - ) -} diff --git a/ui-components/src/authentication/index.ts b/ui-components/src/authentication/index.ts index af89c65850..549d2f7c8b 100644 --- a/ui-components/src/authentication/index.ts +++ b/ui-components/src/authentication/index.ts @@ -1,7 +1,5 @@ -export { UserContext, UserProvider } from "./UserContext" -export { useAuthenticatedClient } from "./useAuthenticatedClient" +export { AuthContext, AuthProvider } from "./AuthContext" export { RequireLogin } from "./RequireLogin" export { useRequireLoggedInUser } from "./useRequireLoggedInUser" -export { ApiClientContext, ApiClientProvider } from "./client" export { ACCESS_TOKEN_LOCAL_STORAGE_KEY } from "./token" export { IdleTimeout, LoggedInUserIdleTimeout } from "./timeout" diff --git a/ui-components/src/authentication/timeout.tsx b/ui-components/src/authentication/timeout.tsx index 5a2d365479..e9cbc06140 100644 --- a/ui-components/src/authentication/timeout.tsx +++ b/ui-components/src/authentication/timeout.tsx @@ -1,5 +1,5 @@ import React, { createElement, FunctionComponent, useContext, useEffect, useState } from "react" -import { UserContext } from "./UserContext" +import { AuthContext } from "./AuthContext" import { ConfigContext, NavigationContext } from "../config" import { Button } from "../actions/Button" import { Modal } from "../overlays/Modal" @@ -105,7 +105,7 @@ export const IdleTimeout: FunctionComponent = ({ } export const LoggedInUserIdleTimeout = ({ onTimeout }: { onTimeout?: () => unknown }) => { - const { profile, signOut } = useContext(UserContext) + const { profile, signOut } = useContext(AuthContext) const timeoutFxn = async () => { onTimeout && (await onTimeout()) diff --git a/ui-components/src/authentication/useAuthenticatedClient.ts b/ui-components/src/authentication/useAuthenticatedClient.ts deleted file mode 100644 index 6581448806..0000000000 --- a/ui-components/src/authentication/useAuthenticatedClient.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { useContext } from "react" -import { UserContext } from "./UserContext" -import { ConfigContext } from "../config/ConfigContext" -import { createAxiosInstance } from "./api_requests" - -function useAuthenticatedClient() { - const { accessToken } = useContext(UserContext) - const { apiUrl } = useContext(ConfigContext) - return accessToken ? createAxiosInstance(apiUrl, accessToken) : undefined -} - -export { useAuthenticatedClient as default, useAuthenticatedClient } diff --git a/ui-components/src/authentication/useRequireLoggedInUser.ts b/ui-components/src/authentication/useRequireLoggedInUser.ts index 220773ef23..4b8bd112a5 100644 --- a/ui-components/src/authentication/useRequireLoggedInUser.ts +++ b/ui-components/src/authentication/useRequireLoggedInUser.ts @@ -1,5 +1,5 @@ import { useContext } from "react" -import { UserContext } from "./UserContext" +import { AuthContext } from "./AuthContext" import { NavigationContext } from "../config/NavigationContext" /** @@ -7,7 +7,7 @@ import { NavigationContext } from "../config/NavigationContext" * logged in. */ function useRequireLoggedInUser(redirectPath: string) { - const { profile, initialStateLoaded } = useContext(UserContext) + const { profile, initialStateLoaded } = useContext(AuthContext) const { router } = useContext(NavigationContext) if (initialStateLoaded && !profile) { diff --git a/ui-components/src/config/NavigationContext.tsx b/ui-components/src/config/NavigationContext.tsx index 14def9f16b..aa94f925a7 100644 --- a/ui-components/src/config/NavigationContext.tsx +++ b/ui-components/src/config/NavigationContext.tsx @@ -18,6 +18,7 @@ export interface GenericRouter { push: (url: Url, as?: Url, options?: GenericRouterOptions) => void pathname: string asPath: string + locale?: string } export interface NavigationContextProps { @@ -46,5 +47,6 @@ export const NavigationContext = createContext({ }, pathname: "", asPath: "", + locale: "", }, }) From 7a5f484b26341db8900dc6f6cc2cd16230fa5d0a Mon Sep 17 00:00:00 2001 From: Austin Valeske Date: Tue, 22 Jun 2021 02:11:53 -0700 Subject: [PATCH 04/10] Adds debug instructions to backend/core readme (#15) (#1390) * Adds start command for backend in debug mode (#15) * Adds start command for backend in debug mode * add notes to readme on debugging the backend * remove package.json changes since there was already a debug command, and update readme (#16) --- backend/core/README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/backend/core/README.md b/backend/core/README.md index 570a3507b0..abe37917d4 100644 --- a/backend/core/README.md +++ b/backend/core/README.md @@ -69,6 +69,24 @@ To have launch Redis as background service and restart at login: Test if Redis is working: `redis-cli ping` +### Debugging + +You can connect a debugger to the backend by starting the backend server with `yarn debug`. + +To connect to it from VS Code, add a configuration to launch.json that looks like +```shell script +{ + "name": "Attach to Backend", + "port": 9229, + "request": "attach", + "skipFiles": [ + "/**" + ], + "type": "node", + "restart": true +}, +``` + ### Running Tests End-to-end tests: From bf6f903e13bd0b10fce7ca206462d3c6b782a068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pleba=C5=84ski?= Date: Tue, 22 Jun 2021 11:12:10 +0200 Subject: [PATCH 05/10] Add backend/proxy Dockerfile, README.md and nginx config file (#1380) * Add backend/proxy Dockerfile, README.md and nginx config file * Update changelog --- CHANGELOG.md | 4 +++ backend/proxy/Dockerfile | 4 +++ backend/proxy/README.md | 54 ++++++++++++++++++++++++++++++++++++++ backend/proxy/default.conf | 14 ++++++++++ 4 files changed, 76 insertions(+) create mode 100644 backend/proxy/Dockerfile create mode 100644 backend/proxy/README.md create mode 100644 backend/proxy/default.conf diff --git a/CHANGELOG.md b/CHANGELOG.md index fdb6b81462..e7f0bdad26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ All notable changes to this project will be documented in this file. The format ### General +- Added: + + - Added backend/proxy ([#1380](https://github.com/bloom-housing/bloom/pull/1380)) + ### Backend - Fixed: diff --git a/backend/proxy/Dockerfile b/backend/proxy/Dockerfile new file mode 100644 index 0000000000..2efe0e2724 --- /dev/null +++ b/backend/proxy/Dockerfile @@ -0,0 +1,4 @@ +FROM nginx +COPY ./default.conf /etc/nginx/conf.d/default.conf +CMD /bin/bash -c "envsubst '\$PORT \$BACKEND_V1_HOSTNAME \$BACKEND_V2_HOSTNAME' < /etc/nginx/conf.d/default.conf > /etc/nginx/conf.d/default.conf" && nginx -g 'daemon off;' + diff --git a/backend/proxy/README.md b/backend/proxy/README.md new file mode 100644 index 0000000000..07530327c3 --- /dev/null +++ b/backend/proxy/README.md @@ -0,0 +1,54 @@ +### Rationale + +We want to serve different versions of the API under different paths e.g. `/v2`, `/v3` but not necessarily reflect that convention in the code. +To achieve that an NGINX proxy has been created and set up as an entrypoint to the entire API. It provides path level routing e.g. `/v2` will be routed to a different heroku APP then `/`. + +### Setup + + +Based on [this tutorial](https://dashboard.heroku.com/apps/bloom-reference-backend-proxy/deploy/heroku-container). All values are for `bloom-reference-backend-proxy` and each environment requires it's own proxy. + +#### Install the Heroku CLI +Download and install the Heroku CLI. + +If you haven't already, log in to your Heroku account and follow the prompts to create a new SSH public key. + +``` +$ heroku login +``` +#### Log in to Container Registry +You must have Docker set up locally to continue. You should see output when you run this command. + +``` +$ docker ps +``` + +Now you can sign into Container Registry. + +``` +$ heroku container:login +``` + +Push your Docker-based app +Build the Dockerfile in the current directory and push the Docker image. + +``` +# workdir: backend/proxy +$ heroku container:push --app bloom-reference-backend-proxy web +``` + +Deploy the changes +Release the newly pushed images to deploy your app. + +``` +$ heroku container:release --app bloom-reference-backend-proxy web +``` + +#### Configuration + +Heroku Proxy app requires two environment variables to work: + +``` +heroku config:set --app bloom-reference-backend-proxy BACKEND_V1_HOSTNAME=example.v1.hostname.com +heroku config:set --app bloom-reference-backend-proxy BACKEND_V2_HOSTNAME=example.v2.hostname.com +``` diff --git a/backend/proxy/default.conf b/backend/proxy/default.conf new file mode 100644 index 0000000000..996387cda7 --- /dev/null +++ b/backend/proxy/default.conf @@ -0,0 +1,14 @@ +server { + listen $PORT; + + location /v2 { + rewrite ^/v2(/.*) $1 break; + proxy_pass https://$BACKEND_V2_HOSTNAME; + proxy_ssl_server_name on; + } + + location / { + proxy_pass https://$BACKEND_V1_HOSTNAME; + proxy_ssl_server_name on; + } +} From 3fe1ffe9701e526512e8c199f9b3634f49596cb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pleba=C5=84ski?= Date: Tue, 22 Jun 2021 11:12:44 +0200 Subject: [PATCH 06/10] Add /jurisdictions endpoint (#1391) * Add /jurisdictions endpoint * Update changelog * Update migration to create jurisdiction relation automatically for existing listings --- CHANGELOG.md | 1 + backend/core/src/app.module.ts | 26 ++++--- backend/core/src/auth/authz_policy.csv | 12 +++ .../src/jurisdictions/dto/jurisdiction.dto.ts | 36 +++++++++ .../entities/jurisdiction.entity.ts | 18 +++++ .../jurisdictions/jurisdictions.controller.ts | 67 +++++++++++++++++ .../src/jurisdictions/jurisdictions.module.ts | 13 ++++ .../jurisdictions/jurisdictions.service.ts | 9 +++ backend/core/src/listings/dto/listing.dto.ts | 34 +++++++-- .../src/listings/entities/listing.entity.ts | 9 +++ backend/core/src/listings/listings.service.ts | 1 + .../1624272587523-add-jurisdictions-table.ts | 34 +++++++++ .../jurisdictions/jurisdictions.e2e-spec.ts | 74 +++++++++++++++++++ 13 files changed, 317 insertions(+), 17 deletions(-) create mode 100644 backend/core/src/jurisdictions/dto/jurisdiction.dto.ts create mode 100644 backend/core/src/jurisdictions/entities/jurisdiction.entity.ts create mode 100644 backend/core/src/jurisdictions/jurisdictions.controller.ts create mode 100644 backend/core/src/jurisdictions/jurisdictions.module.ts create mode 100644 backend/core/src/jurisdictions/jurisdictions.service.ts create mode 100644 backend/core/src/migration/1624272587523-add-jurisdictions-table.ts create mode 100644 backend/core/test/jurisdictions/jurisdictions.e2e-spec.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index e7f0bdad26..bf75198285 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ All notable changes to this project will be documented in this file. The format - `/assets` endpoints (create and createPresignedUploadMetadata) - "noEmailConfirmation" query param to `POST /users` endpoint - POST `/users` endpoint response from StatusDTO to UserBasicDto (Michał Plebański) + - `/jurisdictions` endpoint and DB schema ([#1391](https://github.com/bloom-housing/bloom/pull/1391)) - Changed: diff --git a/backend/core/src/app.module.ts b/backend/core/src/app.module.ts index a503902276..cb0298b15f 100644 --- a/backend/core/src/app.module.ts +++ b/backend/core/src/app.module.ts @@ -24,6 +24,7 @@ import { ConfigModule, ConfigService } from "@nestjs/config" import { TranslationsModule } from "./translations/translations.module" import { Reflector } from "@nestjs/core" import { AssetsModule } from "./assets/assets.module" +import { JurisdictionsModule } from "./jurisdictions/jurisdictions.module" export function applicationSetup(app: INestApplication) { app.enableCors() @@ -63,6 +64,18 @@ export class AppModule { return { module: AppModule, imports: [ + AmiChartsModule, + ApplicationFlaggedSetsModule, + ApplicationsModule, + AssetsModule, + AuthModule, + JurisdictionsModule, + ListingsModule, + PreferencesModule, + PropertiesModule, + PropertyGroupsModule, + SharedModule, + TranslationsModule, TypeOrmModule.forRoot({ ...dbOptions, autoLoadEntities: true, @@ -76,19 +89,8 @@ export class AppModule { storage: new ThrottlerStorageRedisService(redis), }), }), - UserModule, - AuthModule, - ListingsModule, - ApplicationsModule, - PreferencesModule, UnitsModule, - PropertiesModule, - PropertyGroupsModule, - AmiChartsModule, - SharedModule, - TranslationsModule, - ApplicationFlaggedSetsModule, - AssetsModule, + UserModule, ], } } diff --git a/backend/core/src/auth/authz_policy.csv b/backend/core/src/auth/authz_policy.csv index c56689efa6..94183c7f80 100644 --- a/backend/core/src/auth/authz_policy.csv +++ b/backend/core/src/auth/authz_policy.csv @@ -6,16 +6,28 @@ p, user, user, !r.obj || (r.sub == r.obj.id), (read|update) p, anonymous, user, true, create p, admin, asset, true, .* + p, admin, preference, true, .* + p, admin, applicationMethod, true, .* + p, admin, unit, true, .* + p, admin, listingEvent, true, .* + p, admin, property, true, .* + p, admin, propertyGroup, true, .* + p, admin, amiChart, true, .* + p, admin, applicationFlaggedSet, true, .* + p, admin, translation, true, .* +p, admin, jurisdiction, true, .* +p, anonymous, jurisdiction, true, read + p, admin, listing, true, .* p, anonymous, listing, true, read diff --git a/backend/core/src/jurisdictions/dto/jurisdiction.dto.ts b/backend/core/src/jurisdictions/dto/jurisdiction.dto.ts new file mode 100644 index 0000000000..30042600dd --- /dev/null +++ b/backend/core/src/jurisdictions/dto/jurisdiction.dto.ts @@ -0,0 +1,36 @@ +import { OmitType } from "@nestjs/swagger" +import { Expose, Type } from "class-transformer" +import { IsDate, IsOptional, IsUUID } from "class-validator" +import { ValidationsGroupsEnum } from "../../shared/types/validations-groups-enum" +import { Jurisdiction } from "../entities/jurisdiction.entity" + +export class JurisdictionDto extends OmitType(Jurisdiction, [] as const) {} + +export class JurisdictionCreateDto extends OmitType(JurisdictionDto, [ + "id", + "createdAt", + "updatedAt", +] as const) {} + +export class JurisdictionUpdateDto extends OmitType(JurisdictionDto, [ + "id", + "createdAt", + "updatedAt", +] as const) { + @Expose() + @IsOptional({ groups: [ValidationsGroupsEnum.default] }) + @IsUUID(4, { groups: [ValidationsGroupsEnum.default] }) + id?: string + + @Expose() + @IsOptional({ groups: [ValidationsGroupsEnum.default] }) + @IsDate({ groups: [ValidationsGroupsEnum.default] }) + @Type(() => Date) + createdAt?: Date + + @Expose() + @IsOptional({ groups: [ValidationsGroupsEnum.default] }) + @IsDate({ groups: [ValidationsGroupsEnum.default] }) + @Type(() => Date) + updatedAt?: Date +} diff --git a/backend/core/src/jurisdictions/entities/jurisdiction.entity.ts b/backend/core/src/jurisdictions/entities/jurisdiction.entity.ts new file mode 100644 index 0000000000..c38f286faa --- /dev/null +++ b/backend/core/src/jurisdictions/entities/jurisdiction.entity.ts @@ -0,0 +1,18 @@ +import { Column, Entity, OneToMany } from "typeorm" +import { AbstractEntity } from "../../shared/entities/abstract.entity" +import { Expose } from "class-transformer" +import { IsString, MaxLength } from "class-validator" +import { ValidationsGroupsEnum } from "../../shared/types/validations-groups-enum" +import { Listing } from "../../listings/entities/listing.entity" + +@Entity({ name: "jurisdictions" }) +export class Jurisdiction extends AbstractEntity { + @Column({ type: "text" }) + @Expose() + @IsString({ groups: [ValidationsGroupsEnum.default] }) + @MaxLength(256, { groups: [ValidationsGroupsEnum.default] }) + name: string + + @OneToMany(() => Listing, (listing) => listing.jurisdiction) + listings: Listing[] +} diff --git a/backend/core/src/jurisdictions/jurisdictions.controller.ts b/backend/core/src/jurisdictions/jurisdictions.controller.ts new file mode 100644 index 0000000000..9babdb2f7f --- /dev/null +++ b/backend/core/src/jurisdictions/jurisdictions.controller.ts @@ -0,0 +1,67 @@ +import { + Body, + Controller, + Delete, + Get, + Param, + Post, + Put, + UseGuards, + UsePipes, + ValidationPipe, +} from "@nestjs/common" +import { ApiBearerAuth, ApiOperation, ApiTags } from "@nestjs/swagger" +import { DefaultAuthGuard } from "../auth/guards/default.guard" +import { AuthzGuard } from "../auth/guards/authz.guard" +import { ResourceType } from "../auth/decorators/resource-type.decorator" +import { mapTo } from "../shared/mapTo" +import { defaultValidationPipeOptions } from "../shared/default-validation-pipe-options" +import { JurisdictionsService } from "./jurisdictions.service" +import { + JurisdictionCreateDto, + JurisdictionDto, + JurisdictionUpdateDto, +} from "./dto/jurisdiction.dto" + +@Controller("jurisdictions") +@ApiTags("jurisdictions") +@ApiBearerAuth() +@ResourceType("jurisdiction") +@UseGuards(DefaultAuthGuard, AuthzGuard) +@UsePipes(new ValidationPipe(defaultValidationPipeOptions)) +export class JurisdictionsController { + constructor(private readonly jurisdictionsService: JurisdictionsService) {} + + @Get() + @ApiOperation({ summary: "List jurisdictions", operationId: "list" }) + async list(): Promise { + return mapTo(JurisdictionDto, await this.jurisdictionsService.list()) + } + + @Post() + @ApiOperation({ summary: "Create jurisdiction", operationId: "create" }) + async create(@Body() jurisdiction: JurisdictionCreateDto): Promise { + return mapTo(JurisdictionDto, await this.jurisdictionsService.create(jurisdiction)) + } + + @Put(`:jurisdictionId`) + @ApiOperation({ summary: "Update jurisdiction", operationId: "update" }) + async update(@Body() jurisdiction: JurisdictionUpdateDto): Promise { + return mapTo(JurisdictionDto, await this.jurisdictionsService.update(jurisdiction)) + } + + @Get(`:jurisdictionId`) + @ApiOperation({ summary: "Get jurisdiction by id", operationId: "retrieve" }) + async retrieve(@Param("jurisdictionId") jurisdictionId: string): Promise { + return mapTo( + JurisdictionDto, + await this.jurisdictionsService.findOne({ where: { id: jurisdictionId } }) + ) + } + + @Delete(`:jurisdictionId`) + @ApiOperation({ summary: "Delete jurisdiction by id", operationId: "delete" }) + async delete(@Param("jurisdictionId") jurisdictionId: string): Promise { + return await this.jurisdictionsService.delete(jurisdictionId) + } +} diff --git a/backend/core/src/jurisdictions/jurisdictions.module.ts b/backend/core/src/jurisdictions/jurisdictions.module.ts new file mode 100644 index 0000000000..32ea37a7e0 --- /dev/null +++ b/backend/core/src/jurisdictions/jurisdictions.module.ts @@ -0,0 +1,13 @@ +import { Module } from "@nestjs/common" +import { TypeOrmModule } from "@nestjs/typeorm" +import { AuthModule } from "../auth/auth.module" +import { Jurisdiction } from "./entities/jurisdiction.entity" +import { JurisdictionsController } from "./jurisdictions.controller" +import { JurisdictionsService } from "./jurisdictions.service" + +@Module({ + imports: [TypeOrmModule.forFeature([Jurisdiction]), AuthModule], + controllers: [JurisdictionsController], + providers: [JurisdictionsService], +}) +export class JurisdictionsModule {} diff --git a/backend/core/src/jurisdictions/jurisdictions.service.ts b/backend/core/src/jurisdictions/jurisdictions.service.ts new file mode 100644 index 0000000000..f24e5c278c --- /dev/null +++ b/backend/core/src/jurisdictions/jurisdictions.service.ts @@ -0,0 +1,9 @@ +import { AbstractServiceFactory } from "../shared/services/abstract-service" +import { Jurisdiction } from "./entities/jurisdiction.entity" +import { JurisdictionCreateDto, JurisdictionUpdateDto } from "./dto/jurisdiction.dto" + +export class JurisdictionsService extends AbstractServiceFactory< + Jurisdiction, + JurisdictionCreateDto, + JurisdictionUpdateDto +>(Jurisdiction) {} diff --git a/backend/core/src/listings/dto/listing.dto.ts b/backend/core/src/listings/dto/listing.dto.ts index 7a19287e72..facd0e6beb 100644 --- a/backend/core/src/listings/dto/listing.dto.ts +++ b/backend/core/src/listings/dto/listing.dto.ts @@ -14,16 +14,17 @@ import { AddressCreateDto, AddressDto, AddressUpdateDto } from "../../shared/dto import { ValidationsGroupsEnum } from "../../shared/types/validations-groups-enum" import { UserBasicDto } from "../../user/dto/user.dto" import { ListingStatus } from "../types/listing-status-enum" +import { JurisdictionDto } from "../../jurisdictions/dto/jurisdiction.dto" export class ListingDto extends OmitType(Listing, [ - "preferences", - "property", + "applications", "applicationAddress", + "applicationFlaggedSets", "applicationPickUpAddress", - "leasingAgentAddress", "leasingAgents", - "applications", - "applicationFlaggedSets", + "leasingAgentAddress", + "preferences", + "property", ] as const) { @Expose() @IsDefined({ groups: [ValidationsGroupsEnum.default] }) @@ -62,6 +63,13 @@ export class ListingDto extends OmitType(Listing, [ @Type(() => UserBasicDto) leasingAgents?: UserBasicDto[] | null + @Expose() + @IsOptional({ groups: [ValidationsGroupsEnum.default] }) + @IsDefined({ groups: [ValidationsGroupsEnum.default] }) + @ValidateNested({ groups: [ValidationsGroupsEnum.default], each: true }) + @Type(() => JurisdictionDto) + jurisdiction?: JurisdictionDto + @Expose() @Transform((_value, listing) => { if (moment(listing.applicationDueDate).isBefore()) { @@ -85,6 +93,7 @@ export class ListingCreateDto extends OmitType(ListingDto, [ "leasingAgents", "urlSlug", "showWaitlist", + "jurisdiction", ] as const) { @Expose() @IsDefined({ groups: [ValidationsGroupsEnum.default] }) @@ -122,6 +131,13 @@ export class ListingCreateDto extends OmitType(ListingDto, [ @ValidateNested({ groups: [ValidationsGroupsEnum.default], each: true }) @Type(() => IdDto) leasingAgents?: IdDto[] | null + + @Expose() + @IsOptional({ groups: [ValidationsGroupsEnum.default] }) + @IsDefined({ groups: [ValidationsGroupsEnum.default] }) + @ValidateNested({ groups: [ValidationsGroupsEnum.default], each: true }) + @Type(() => IdDto) + jurisdiction?: IdDto } export class ListingUpdateDto extends OmitType(ListingDto, [ @@ -136,6 +152,7 @@ export class ListingUpdateDto extends OmitType(ListingDto, [ "urlSlug", "leasingAgents", "showWaitlist", + "jurisdiction", ] as const) { @Expose() @IsOptional({ groups: [ValidationsGroupsEnum.default] }) @@ -190,4 +207,11 @@ export class ListingUpdateDto extends OmitType(ListingDto, [ @ValidateNested({ groups: [ValidationsGroupsEnum.default], each: true }) @Type(() => IdDto) leasingAgents?: IdDto[] | null + + @Expose() + @IsOptional({ groups: [ValidationsGroupsEnum.default] }) + @IsDefined({ groups: [ValidationsGroupsEnum.default] }) + @ValidateNested({ groups: [ValidationsGroupsEnum.default], each: true }) + @Type(() => IdDto) + jurisdiction?: IdDto } diff --git a/backend/core/src/listings/entities/listing.entity.ts b/backend/core/src/listings/entities/listing.entity.ts index 4ec03c5935..e239e4d182 100644 --- a/backend/core/src/listings/entities/listing.entity.ts +++ b/backend/core/src/listings/entities/listing.entity.ts @@ -3,6 +3,7 @@ import { Column, CreateDateColumn, Entity, + JoinColumn, JoinTable, ManyToMany, ManyToOne, @@ -38,6 +39,7 @@ import { ApplicationMethodDto } from "../dto/application-method.dto" import { AssetDto } from "../dto/asset.dto" import { CSVFormattingType } from "../../csv/types/csv-formatting-type-enum" import { CountyCode } from "../../shared/types/county-code" +import { Jurisdiction } from "../../jurisdictions/entities/jurisdiction.entity" @Entity({ name: "listings" }) class Listing extends BaseEntity { @@ -189,6 +191,13 @@ class Listing extends BaseEntity { @IsBoolean({ groups: [ValidationsGroupsEnum.default] }) disableUnitsAccordion: boolean | null + @ManyToOne(() => Jurisdiction, { eager: true, nullable: true }) + @JoinColumn() + @Expose() + @ValidateNested({ groups: [ValidationsGroupsEnum.default] }) + @Type(() => Jurisdiction) + jurisdiction?: Jurisdiction + @Column({ type: "jsonb", nullable: true }) @Expose() @IsOptional({ groups: [ValidationsGroupsEnum.default] }) diff --git a/backend/core/src/listings/listings.service.ts b/backend/core/src/listings/listings.service.ts index 9d59ebec05..7d99c40211 100644 --- a/backend/core/src/listings/listings.service.ts +++ b/backend/core/src/listings/listings.service.ts @@ -18,6 +18,7 @@ export class ListingsService { .leftJoinAndSelect("property.buildingAddress", "buildingAddress") .leftJoinAndSelect("property.units", "units") .leftJoinAndSelect("units.amiChart", "amiChart") + .leftJoinAndSelect("listings.jurisdiction", "jurisdiction") } public async list(jsonpath?: string): Promise { diff --git a/backend/core/src/migration/1624272587523-add-jurisdictions-table.ts b/backend/core/src/migration/1624272587523-add-jurisdictions-table.ts new file mode 100644 index 0000000000..22cb149be2 --- /dev/null +++ b/backend/core/src/migration/1624272587523-add-jurisdictions-table.ts @@ -0,0 +1,34 @@ +import {MigrationInterface, QueryRunner} from "typeorm"; +import { CountyCode } from "../shared/types/county-code" + +export class addJurisdictionsTable1624272587523 implements MigrationInterface { + name = 'addJurisdictionsTable1624272587523' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`CREATE TABLE "jurisdictions" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "created_at" TIMESTAMP NOT NULL DEFAULT now(), "updated_at" TIMESTAMP NOT NULL DEFAULT now(), "name" text NOT NULL, CONSTRAINT "PK_7cc0bed21c9e2b32866c1109ec5" PRIMARY KEY ("id"))`); + await queryRunner.query(`ALTER TABLE "listings" ADD "jurisdiction_id" uuid`); + await queryRunner.query(`ALTER TABLE "preferences" ALTER COLUMN "page" DROP NOT NULL`); + await queryRunner.query(`COMMENT ON COLUMN "preferences"."page" IS NULL`); + await queryRunner.query(`ALTER TABLE "preferences" ALTER COLUMN "page" DROP DEFAULT`); + await queryRunner.query(`CREATE UNIQUE INDEX "IDX_8317da96d5a775889e2631cc25" ON "translations" ("county_code", "language") `); + await queryRunner.query(`ALTER TABLE "listings" ADD CONSTRAINT "FK_ba0026e02ecfe91791aed1a4818" FOREIGN KEY ("jurisdiction_id") REFERENCES "jurisdictions"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); + for(const jurisdictionName of [CountyCode.alameda, CountyCode.san_jose, CountyCode.san_mateo]) { + const jurisdiction = await queryRunner.query(`INSERT INTO "jurisdictions" (name) VALUES ($1)`, [jurisdictionName]); + const listingsMatchingJurisdiction = await queryRunner.query(`SELECT id from listings where county_code = ($1)`, [jurisdictionName]) + for (const listing of listingsMatchingJurisdiction) { + await queryRunner.query(`UPDATE listings SET jurisdiction_id = ($1) WHERE id = ($2)`, [jurisdiction.id, listing.id]) + } + } + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "listings" DROP CONSTRAINT "FK_ba0026e02ecfe91791aed1a4818"`); + await queryRunner.query(`DROP INDEX "IDX_8317da96d5a775889e2631cc25"`); + await queryRunner.query(`ALTER TABLE "preferences" ALTER COLUMN "page" SET DEFAULT '1'`); + await queryRunner.query(`COMMENT ON COLUMN "preferences"."page" IS NULL`); + await queryRunner.query(`ALTER TABLE "preferences" ALTER COLUMN "page" SET NOT NULL`); + await queryRunner.query(`ALTER TABLE "listings" DROP COLUMN "jurisdiction_id"`); + await queryRunner.query(`DROP TABLE "jurisdictions"`); + } + +} diff --git a/backend/core/test/jurisdictions/jurisdictions.e2e-spec.ts b/backend/core/test/jurisdictions/jurisdictions.e2e-spec.ts new file mode 100644 index 0000000000..5abd95ddbb --- /dev/null +++ b/backend/core/test/jurisdictions/jurisdictions.e2e-spec.ts @@ -0,0 +1,74 @@ +import { Test } from "@nestjs/testing" +import { INestApplication } from "@nestjs/common" +import { TypeOrmModule } from "@nestjs/typeorm" +// Use require because of the CommonJS/AMD style export. +// See https://www.typescriptlang.org/docs/handbook/modules.html#export--and-import--require +import dbOptions = require("../../ormconfig.test") +import supertest from "supertest" +import { applicationSetup } from "../../src/app.module" +import { AuthModule } from "../../src/auth/auth.module" +import { EmailService } from "../../src/shared/email/email.service" +import { getUserAccessToken } from "../utils/get-user-access-token" +import { setAuthorization } from "../utils/set-authorization-helper" +import { JurisdictionsModule } from "../../src/jurisdictions/jurisdictions.module" + +// Cypress brings in Chai types for the global expect, but we want to use jest +// expect here so we need to re-declare it. +// see: https://github.com/cypress-io/cypress/issues/1319#issuecomment-593500345 +declare const expect: jest.Expect +jest.setTimeout(30000) + +describe("Jurisdictions", () => { + let app: INestApplication + let adminAccesstoken: string + beforeAll(async () => { + /* eslint-disable @typescript-eslint/no-empty-function */ + const testEmailService = { confirmation: async () => {} } + /* eslint-enable @typescript-eslint/no-empty-function */ + const moduleRef = await Test.createTestingModule({ + imports: [TypeOrmModule.forRoot(dbOptions), AuthModule, JurisdictionsModule], + }) + .overrideProvider(EmailService) + .useValue(testEmailService) + .compile() + app = moduleRef.createNestApplication() + app = applicationSetup(app) + await app.init() + adminAccesstoken = await getUserAccessToken(app, "admin@example.com", "abcdef") + }) + + it(`should return jurisdictions`, async () => { + const res = await supertest(app.getHttpServer()) + .get(`/jurisdictions`) + .set(...setAuthorization(adminAccesstoken)) + .expect(200) + expect(Array.isArray(res.body)).toBe(true) + }) + + it(`should create and return a new jurisdiction`, async () => { + const res = await supertest(app.getHttpServer()) + .post(`/jurisdictions`) + .set(...setAuthorization(adminAccesstoken)) + .send({ name: "test" }) + .expect(201) + expect(res.body).toHaveProperty("id") + expect(res.body).toHaveProperty("createdAt") + expect(res.body).toHaveProperty("updatedAt") + expect(res.body).toHaveProperty("name") + expect(res.body.name).toBe("test") + + const getById = await supertest(app.getHttpServer()) + .get(`/jurisdictions/${res.body.id}`) + .set(...setAuthorization(adminAccesstoken)) + .expect(200) + expect(getById.body.name).toBe("test") + }) + + afterEach(() => { + jest.clearAllMocks() + }) + + afterAll(async () => { + await app.close() + }) +}) From 169872b497edfbe57691adfe38ba6c5251573f26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pleba=C5=84ski?= Date: Wed, 23 Jun 2021 12:24:37 +0200 Subject: [PATCH 07/10] Revert "Merge latest master (#1370)" (#1394) * Revert "Merge latest master (#1370)" This reverts commit 845f2e6faeff244d4c64ec79a2c72d6db27834d8. * Retain overrideTranslations related change from housingbayarea fork --- CONTRIBUTING.md | 10 +- README.md | 20 - backend/core/listing_data/archer_studios.json | 1087 -- backend/core/listing_data/atlas.json | 752 -- backend/core/listing_data/aurora.json | 1453 --- .../bridgepointe_rental_condominiums.json | 187 - .../brunswick_street_apartments.json | 1633 --- backend/core/listing_data/city_center.json | 792 -- backend/core/listing_data/coliseum.json | 1664 ---- backend/core/listing_data/corsairflats.json | 784 -- .../listing_data/eastlake-never-launched.json | 166 - .../core/listing_data/fosters_landing.json | 241 - .../core/listing_data/gish_apartments.json | 532 - .../core/listing_data/gish_apartments_2.json | 243 - backend/core/listing_data/jones.json | 502 - backend/core/listing_data/logan.json | 512 - backend/core/listing_data/mercy.json | 764 -- backend/core/listing_data/met_north.json | 2172 ---- backend/core/listing_data/monarch.json | 700 -- backend/core/listing_data/montara.json | 545 - backend/core/listing_data/new-skyline.json | 953 -- backend/core/listing_data/nova.json | 1779 ---- .../core/listing_data/one_hundred_grand.json | 180 - .../core/listing_data/pensione_esperanza.json | 1832 ---- backend/core/listing_data/reilly_station.json | 1475 --- backend/core/listing_data/skylyne.json | 1188 --- backend/core/listing_data/so-hay.json | 737 -- backend/core/listing_data/the_triton.json | 227 - backend/core/package.json | 4 +- backend/core/scripts/listings-importer.ts | 5 +- .../core/scripts/listings-update-schema.ts | 1 - backend/core/src/main.ts | 3 +- .../seeds/ami-charts/AlamedaCountyHCD2020.ts | 43 - backend/core/src/seeds/ami-charts/index.ts | 1 - backend/core/tools/listing_converter.rb | 134 - cypress.json | 2 +- .../src/actions/Button.stories.tsx | 109 - .../__snapshots__/Button.stories.storyshot | 242 - .../ApplicationSection.stories.storyshot | 3674 ------- .../__snapshots__/Apply.stories.storyshot | 8738 ----------------- .../locale_overrides/general.json | 8 - sites/public/.env.template | 4 +- sites/public/CHANGELOG.md | 35 + sites/public/components/RenderIf.tsx | 17 - sites/public/cypress/fixtures/example.json | 5 - .../public/cypress/integration/navigation.ts | 7 + .../application/financial/income.spec.ts | 89 +- .../application/household/add-members.spec.ts | 51 +- .../application/household/live-alone.spec.ts | 23 +- sites/public/layouts/application.tsx | 71 +- .../page_content/AdditionalResources.mdx | 294 - .../AdditionalResourcesSidebar.mdx | 49 - .../page_content/locale_overrides/es.json | 73 - .../locale_overrides/general.json | 119 +- .../page_content/locale_overrides/vi.json | 73 - .../page_content/locale_overrides/zh.json | 73 - sites/public/page_content/privacy_policy.mdx | 176 +- sites/public/pages/additional-resources.tsx | 47 - .../pages/applications/financial/income.tsx | 65 +- .../applications/household/add-members.tsx | 22 +- .../applications/household/live-alone.tsx | 10 +- .../applications/start/choose-language.tsx | 8 +- sites/public/pages/housing-counselors.tsx | 25 +- sites/public/pages/index.tsx | 1 - .../public/images/alameda-logo-white.svg | 1 - sites/public/public/images/atlas.jpg | Bin 116631 -> 0 bytes sites/public/public/images/aurora.jpg | Bin 81292 -> 0 bytes sites/public/public/images/city-center.jpg | Bin 461075 -> 0 bytes sites/public/public/images/coliseum.jpg | Bin 1352985 -> 0 bytes sites/public/public/images/cosairflats.jpg | Bin 696674 -> 0 bytes sites/public/public/images/eastlake.jpg | Bin 61578 -> 0 bytes sites/public/public/images/eho-logo-white.svg | 1 - .../public/images/hero-background copy.jpg | Bin 119534 -> 0 bytes .../public/public/images/hero-background.jpg | Bin 127871 -> 0 bytes sites/public/public/images/jones.jpg | Bin 239486 -> 0 bytes sites/public/public/images/logan.jpg | Bin 87260 -> 0 bytes sites/public/public/images/mercy.jpg | Bin 366865 -> 0 bytes sites/public/public/images/monarch.jpg | Bin 126157 -> 0 bytes sites/public/public/images/new-skyline.jpg | Bin 303222 -> 0 bytes sites/public/public/images/nova.jpg | Bin 2453343 -> 0 bytes sites/public/public/images/reillystation.jpg | Bin 156746 -> 0 bytes sites/public/public/images/skylyne.jpg | Bin 303222 -> 0 bytes sites/public/public/images/so-hay.jpeg | Bin 105291 -> 0 bytes .../__snapshots__/Drawer.stories.storyshot | 2436 ----- sites/public/src/translations.ts | 11 +- sites/public/styles/overrides.scss | 63 - .../__tests__/fixtures/100_grand.json | 162 - .../__tests__/fixtures/MetNorth.json | 2156 ---- ui-components/__tests__/fixtures/archer.json | 600 +- .../__tests__/fixtures/bounty_drive.json | 231 - .../__tests__/fixtures/bridgepointe.json | 179 - .../__tests__/fixtures/brunswick.json | 4983 ---------- .../__tests__/fixtures/east_gish.json | 528 - ui-components/__tests__/fixtures/montara.json | 538 - .../__tests__/fixtures/pensione.json | 1820 ---- .../page_components/Waitlist.test.tsx | 1 - .../listing/UnitTables.stories.tsx | 4 +- .../src/sections/MarkdownSection.scss | 5 - yarn.lock | 8 +- 99 files changed, 518 insertions(+), 50640 deletions(-) delete mode 100644 backend/core/listing_data/archer_studios.json delete mode 100644 backend/core/listing_data/atlas.json delete mode 100644 backend/core/listing_data/aurora.json delete mode 100644 backend/core/listing_data/bridgepointe_rental_condominiums.json delete mode 100644 backend/core/listing_data/brunswick_street_apartments.json delete mode 100644 backend/core/listing_data/city_center.json delete mode 100644 backend/core/listing_data/coliseum.json delete mode 100644 backend/core/listing_data/corsairflats.json delete mode 100644 backend/core/listing_data/eastlake-never-launched.json delete mode 100644 backend/core/listing_data/fosters_landing.json delete mode 100644 backend/core/listing_data/gish_apartments.json delete mode 100644 backend/core/listing_data/gish_apartments_2.json delete mode 100644 backend/core/listing_data/jones.json delete mode 100644 backend/core/listing_data/logan.json delete mode 100644 backend/core/listing_data/mercy.json delete mode 100644 backend/core/listing_data/met_north.json delete mode 100644 backend/core/listing_data/monarch.json delete mode 100644 backend/core/listing_data/montara.json delete mode 100644 backend/core/listing_data/new-skyline.json delete mode 100644 backend/core/listing_data/nova.json delete mode 100644 backend/core/listing_data/one_hundred_grand.json delete mode 100644 backend/core/listing_data/pensione_esperanza.json delete mode 100644 backend/core/listing_data/reilly_station.json delete mode 100644 backend/core/listing_data/skylyne.json delete mode 100644 backend/core/listing_data/so-hay.json delete mode 100644 backend/core/listing_data/the_triton.json delete mode 100644 backend/core/src/seeds/ami-charts/AlamedaCountyHCD2020.ts delete mode 100644 backend/core/tools/listing_converter.rb delete mode 100644 shared/ui-components/src/actions/Button.stories.tsx delete mode 100644 shared/ui-components/src/actions/__snapshots__/Button.stories.storyshot delete mode 100644 shared/ui-components/src/page_components/listing/listing_sidebar/__snapshots__/ApplicationSection.stories.storyshot delete mode 100644 shared/ui-components/src/page_components/listing/listing_sidebar/__snapshots__/Apply.stories.storyshot create mode 100644 sites/public/CHANGELOG.md delete mode 100644 sites/public/components/RenderIf.tsx delete mode 100644 sites/public/cypress/fixtures/example.json delete mode 100644 sites/public/page_content/AdditionalResources.mdx delete mode 100644 sites/public/page_content/AdditionalResourcesSidebar.mdx delete mode 100644 sites/public/page_content/locale_overrides/es.json delete mode 100644 sites/public/page_content/locale_overrides/vi.json delete mode 100644 sites/public/page_content/locale_overrides/zh.json delete mode 100644 sites/public/pages/additional-resources.tsx delete mode 100644 sites/public/public/images/alameda-logo-white.svg delete mode 100644 sites/public/public/images/atlas.jpg delete mode 100644 sites/public/public/images/aurora.jpg delete mode 100644 sites/public/public/images/city-center.jpg delete mode 100644 sites/public/public/images/coliseum.jpg delete mode 100644 sites/public/public/images/cosairflats.jpg delete mode 100644 sites/public/public/images/eastlake.jpg delete mode 100644 sites/public/public/images/eho-logo-white.svg delete mode 100644 sites/public/public/images/hero-background copy.jpg delete mode 100644 sites/public/public/images/hero-background.jpg delete mode 100644 sites/public/public/images/jones.jpg delete mode 100644 sites/public/public/images/logan.jpg delete mode 100644 sites/public/public/images/mercy.jpg delete mode 100644 sites/public/public/images/monarch.jpg delete mode 100644 sites/public/public/images/new-skyline.jpg delete mode 100644 sites/public/public/images/nova.jpg delete mode 100644 sites/public/public/images/reillystation.jpg delete mode 100644 sites/public/public/images/skylyne.jpg delete mode 100644 sites/public/public/images/so-hay.jpeg delete mode 100644 sites/public/src/overlays/__snapshots__/Drawer.stories.storyshot delete mode 100644 sites/public/styles/overrides.scss delete mode 100644 ui-components/__tests__/fixtures/100_grand.json delete mode 100644 ui-components/__tests__/fixtures/MetNorth.json delete mode 100644 ui-components/__tests__/fixtures/bounty_drive.json delete mode 100644 ui-components/__tests__/fixtures/bridgepointe.json delete mode 100644 ui-components/__tests__/fixtures/brunswick.json delete mode 100644 ui-components/__tests__/fixtures/east_gish.json delete mode 100644 ui-components/__tests__/fixtures/montara.json delete mode 100644 ui-components/__tests__/fixtures/pensione.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d13069a8c6..a63d245903 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,15 +1,12 @@ -# Contributing to HousingBayArea and Bloom +# Contributing to Bloom -Contributions to this Bay Area local site, as well as the core Bloom applications and services are welcomed. To help us meet the project's goals around quality and maintainability, we ask that all contributors read, understand, and agree to these guidelines. - -It's important to know that this project is a local fork of the [core Bloom framework](https://github.com/bloom-housing/bloom). -If you're planning to contribute, make sure to think through if it's a Bay Area-specific set of code, in which case it should be submitted here, or if it's a general improvement to the framework that would benefit all users and should be submitted to the core upstream project. +Contributions to the core Bloom applications and services are welcomed. To help us meet the project's goals around quality and maintainability, we ask that all contributors read, understand, and agree to these guidelines. ## Reporting an Issue We use GitHub issues to track both bugs and feature ideas, and encourage all developers working with Bloom to file issues for consideration. -This site tracks implementation-specific issues about the Bay Area sites for Alameda County, San Mateo County, and the City of San Jose only. +Please note that implementation-specific issues with individual Bloom sites should be tracked in the repositories for those sites. Our issue tracker is for issues with the core software and reference implementations only. ## Pull Requests @@ -30,3 +27,4 @@ Bloom uses the Circle CI system to automatically run tests on any pull requests. We use the ESlint linting system and the automatic code formatter Prettier (which the linter also enforces). **All** pull requests must pass linting to be accepted, so they don't create fix work for future contributors. If you're not using an IDE that integrates with these tools, please run eslint + prettier from the cli on all added or changed code before you submit a pull request. As much as we'll try to keep current, the linting rules can become out of date, and in this case you should file an issue with the adjustments you're looking for. We'll be looking for a resulting PR with a minimum of two commits - one to adjust the rules or tooling, and another that updates the codebase to match. If the latter changes are complex, please discuss in advance and break up the work into reasonably reviewable commits. + diff --git a/README.md b/README.md index 76000e541e..95e0dfc7cc 100644 --- a/README.md +++ b/README.md @@ -88,23 +88,3 @@ We are using [lerna](https://lerna.js.org/) as a package versioning tool. It hel ## Contributing Contributions to the core Bloom applications and services are welcomed. To help us meet the project's goals around quality and maintainability, we ask that all contributors read, understand, and agree to these guidelines. - -## Pulling changes from core repository - -Add a new remote origin: - -``` -git remote add upstream https://github.com/bloom-housing/bloom.git -``` - -Fetch newest indices from it: - -``` -git fetch upstream -``` - -Merge remote into your local branch: - -``` -git merge upstream/master -`` diff --git a/backend/core/listing_data/archer_studios.json b/backend/core/listing_data/archer_studios.json deleted file mode 100644 index f0b5dfcbf7..0000000000 --- a/backend/core/listing_data/archer_studios.json +++ /dev/null @@ -1,1087 +0,0 @@ -{ - "id": "6b163850-0cf8-0139-7cff-2683e7458fb7", - "events":[], - "imageUrl": "/images/archer-studios.jpg", - "accessibility": "There is a total of 5 ADA units in the complex, all others are adaptable. Exterior Wheelchair ramp (front entry)", - "amenities": "Community Room, Laundry Room, Assigned Parking, Bike Storage, Roof Top Garden, Part-time Resident Service Coordinator", - "applicationAddress": { - "city": "San Jose", - "county": "San Jose", - "zipCode": "95112", - "state": "CA", - "street": "98 Archer Street", - "latitude": 37.365687, - "longitude": -121.910608 - }, - "applicationDueDate": "2019-11-01T09:00:00.000-07:00", - "applicationMethods": [ - { - "type": "POBox", - "acceptsPostmarkedApplications": true - }, - { - "type": "LeasingAgent" - }, - { - "type": "PaperPickup" - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "externalReference": "http://bit.ly/2Vkbdh2", - "label": "English" - } - ], - "applicationOrganization": "98 Archer Street", - "applicationPhone": "(408) 217-8562", - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/archer-studios.jpg" - } - ], - "buildingAddress": { - "city": "San Jose", - "county": "San Jose", - "state": "CA", - "street": "98 Archer Street", - "zipCode": "95112", - "latitude": 37.365687, - "longitude": -121.910608 - }, - "buildingSelectionCriteria": "http://bit.ly/2IxRp4H", - "costsNotIncluded": "Resident responsible for PG&E, internet and phone. Owner pays for water, trash, and sewage. Residents encouraged to obtain renter's insurance but this is not a requirement. Rent is due by the 5th of each month. Late fee $35 and returned check fee is $35 additional.", - "creditHistory": "Applications will be rated on a score system for housing. An applicant's score may be impacted by negative tenant peformance information provided to the credit reporting agency. All applicants are expected have a passing acore of 70 points out of 100 to be considered for housing. Applicants with no credit history will receive a maximum of 80 points to fairly outweigh positive and/or negative trades as would an applicant with established credit history. Refer to Tenant Selection Criteria or Qualification Criteria for details related to the qualification process. ", - "depositMin": "719", - "depositMax": "1140", - "developer": "Charities Housing ", - "programRules": "Applicants must adhere to minimum & maximum income limits. Tenant Selection Criteria applies.", - "externalId": null, - "waitlistMaxSize": 300, - "name": "Archer Studios", - "neighborhood": "Rosemary Gardens Park", - "waitlistCurrentSize": 0, - "petPolicy": "No pets allowed. Accommodation animals may be granted to persons with disabilities via a reasonable accommodation request.", - "prioritiesDescriptor": null, - "requiredDocuments": "Completed application and government issued IDs", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": null, - "reservedDescriptor": null, - "smokingPolicy": "Non-smoking building", - "yearBuilt": 2012, - "createdAt": "2019-07-08T15:37:19.565Z", - "updatedAt": "2019-10-18T16:21:37.024Z", - "groupId": 1, - "hideUnitFeatures": false, - "disableUnitsAccordion": true, - "unitAmenities": "Dishwasher", - "applicationFee": "30.0", - "criminalBackground": "A criminal background investigation will be obtained on each applicant. As criminal background checks are done county by county and will be ran for all counties in which the applicant lived, Applicants will be disqualified for tenancy if they have been convicted of a felony or misdemeanor. Refer to Tenant Selection Criteria or Qualification Criteria for details related to the qualification process. ", - "leasingAgentAddress": { - "city": "San Jose", - "state": "CA", - "street": "98 Archer Street", - "zipCode": "95112", - "latitude": 37.365687, - "longitude": -121.910608 - }, - "leasingAgentEmail": "mbaca@charitieshousing.org", - "leasingAgentName": "Marisela Baca", - "leasingAgentOfficeHours": "Mon, Tues & Fri, 9:00AM - 4:00PM", - "leasingAgentPhone": "(408) 217-8562", - "leasingAgentTitle": "", - "rentalAssistance": "Custom rental assistance", - "rentalHistory": "Two years of rental history will be verified with all applicable landlords. Household family members and/or personal friends are not acceptable landlord references. Two professional character references may be used in lieu of rental history for applicants with no prior rental history. An unlawful detainer report will be processed thourhg the U.D. Registry, Inc. Applicants will be disqualified if they have any evictions filing within the last 7 years. Refer to Tenant Selection Criteria or Qualification Criteria for details related to the qualification process.", - "preferences": [ - - ], - "buildingTotalUnits": 35, - "units": [ - { - "id": "6b1638e0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 3, - "annualIncomeMax": "30750.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:56:06.612Z", - "updatedAt": "2019-08-14T16:06:59.267Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b163930-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 3, - "annualIncomeMax": "30750.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:56:06.606Z", - "updatedAt": "2019-08-14T16:06:59.260Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b163950-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 3, - "annualIncomeMax": "30750.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:56:06.593Z", - "updatedAt": "2019-08-14T16:06:59.254Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b163970-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 3, - "annualIncomeMax": "30750.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:56:06.587Z", - "updatedAt": "2019-08-14T16:06:59.247Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1639a0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 3, - "annualIncomeMax": "30750.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:56:06.580Z", - "updatedAt": "2019-08-14T16:06:59.241Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1639c0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 3, - "annualIncomeMax": "30750.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:56:06.575Z", - "updatedAt": "2019-08-14T16:06:59.235Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1639d0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 3, - "annualIncomeMax": "30750.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:56:06.570Z", - "updatedAt": "2019-08-14T16:06:59.229Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1656b0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 3, - "annualIncomeMax": "30750.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:56:06.563Z", - "updatedAt": "2019-08-14T16:06:59.222Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1656f0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 2, - "annualIncomeMax": "30750.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:55:22.984Z", - "updatedAt": "2019-08-14T16:06:59.216Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165710-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 2, - "annualIncomeMax": "30750.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:55:22.978Z", - "updatedAt": "2019-08-14T16:06:59.210Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165730-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 2, - "annualIncomeMax": "30750.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:55:22.972Z", - "updatedAt": "2019-08-14T16:06:59.204Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165750-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 2, - "annualIncomeMax": "30750.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:55:22.967Z", - "updatedAt": "2019-08-14T16:06:59.198Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165780-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 2, - "annualIncomeMax": "30750.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:55:22.961Z", - "updatedAt": "2019-08-14T16:06:59.192Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1657a0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 2, - "annualIncomeMax": "30750.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:55:22.956Z", - "updatedAt": "2019-08-14T16:06:59.186Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1657c0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 2, - "annualIncomeMax": "30750.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:55:22.950Z", - "updatedAt": "2019-08-14T16:06:59.179Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1657e0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 2, - "annualIncomeMax": "30750.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-07-09T14:24:14.122Z", - "updatedAt": "2019-08-14T16:06:59.173Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1657f0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 3, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:53:09.976Z", - "updatedAt": "2019-08-14T16:06:59.167Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165810-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 3, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:53:09.976Z", - "updatedAt": "2019-08-14T16:06:59.161Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165830-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 3, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:53:09.970Z", - "updatedAt": "2019-08-14T16:06:59.155Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165850-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 3, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:53:09.965Z", - "updatedAt": "2019-08-14T16:06:59.148Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165870-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 3, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:53:09.960Z", - "updatedAt": "2019-08-14T16:06:59.142Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165890-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 3, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:53:09.955Z", - "updatedAt": "2019-08-14T16:06:59.136Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1658b0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 3, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:53:09.950Z", - "updatedAt": "2019-08-14T16:06:59.130Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1658c0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 3, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:53:09.944Z", - "updatedAt": "2019-08-14T16:06:59.124Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1658e0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 3, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:53:09.938Z", - "updatedAt": "2019-08-14T16:06:59.118Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165900-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 3, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:53:09.933Z", - "updatedAt": "2019-08-14T16:06:59.111Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165920-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 3, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:53:09.927Z", - "updatedAt": "2019-08-14T16:06:59.105Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165940-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 3, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:53:09.921Z", - "updatedAt": "2019-08-14T16:06:59.099Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165960-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 2, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:52:08.819Z", - "updatedAt": "2019-08-14T16:06:59.093Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165980-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 2, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:52:08.813Z", - "updatedAt": "2019-08-14T16:06:59.086Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1659a0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 2, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:52:08.807Z", - "updatedAt": "2019-08-14T16:06:59.080Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1659c0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 2, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:52:08.802Z", - "updatedAt": "2019-08-14T16:06:59.074Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1659f0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 2, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:52:08.796Z", - "updatedAt": "2019-08-14T16:06:59.067Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165a00-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 2, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:52:08.790Z", - "updatedAt": "2019-08-14T16:06:59.060Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165a20-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 2, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:52:08.783Z", - "updatedAt": "2019-08-14T16:06:59.053Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165a40-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 2, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:52:08.777Z", - "updatedAt": "2019-08-14T16:06:59.046Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165a60-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 2, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:52:08.771Z", - "updatedAt": "2019-08-14T16:06:59.039Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165a80-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 2, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:52:08.766Z", - "updatedAt": "2019-08-14T16:06:59.031Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165aa0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 2, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:52:08.758Z", - "updatedAt": "2019-08-14T16:06:59.023Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165ac0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 3, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-08-14T15:53:09.982Z", - "updatedAt": "2019-08-14T16:06:59.015Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b165ae0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "26496.0", - "monthlyIncomeMin": "2208.0", - "floor": 2, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1104.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "285", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-07-09T14:20:05.783Z", - "updatedAt": "2019-08-14T16:05:43.913Z", - "listingId": 5, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - } - ] -} diff --git a/backend/core/listing_data/atlas.json b/backend/core/listing_data/atlas.json deleted file mode 100644 index e96f056a23..0000000000 --- a/backend/core/listing_data/atlas.json +++ /dev/null @@ -1,752 +0,0 @@ -{ - "id": "gyi1Wa3K902-MDXBf0Q62g", - "events":[], - "accessibility": "All common areas ADA accessible and homes ADA adaptable. All reasonable accommodations/modifications will be reviewed upon request.", - "amenities": "Fitness center, pool, spa, firepits, BBQ’s, a sky kitchen & lounge, pet spa and relief area, co-working spaces, wi-fi lounges, bike room, onsite storage, chef’s kitchen, rooftop terrace, yoga studio, game room, 24-hour concierge", - "applicationAddress": { - "city": "Oakland", - "street": "P.O. Box 28712", - "zipCode": "94604", - "state": "CA", - "latitude": null, - "longitude": null - }, - "applicationDueDate": "2020-10-06T17:00:00.000-07:00", - "applicationOrganization": "Atlas BMR", - "applicationPhone": "(510) 381-8407", - "buildingAddress": { - "city": "Oakland ", - "county": "Alameda", - "street": "385 14th St", - "zipCode": "94607", - "state": "CA", - "latitude": 37.803695, - "longitude": -122.269815 - }, - "buildingSelectionCriteria": null, - "costsNotIncluded": "Residents responsible for utilities: electric and cable/internet. Residents required to maintain a personal liability policy as outlined in the lease agreement. Rent is due by the 5th of each month and rent is considered late on the 6th of each month. Late fee is $100. Resident to pay $25 for each returned check or rejected electronic payment. Pet Deposit is $500 per pet. $60 monthly pet rent per pet.", - "creditHistory": "We obtain a credit report on each applicant. Our credit reporting agency evaluates credit (which may include rent payment history) as an indicator of future rent payment performance. An unsatisfactory or insufficient finding will result in the requirement of an additional deposit, guarantor, or denial. Applicants are responsible for ensuring their credit history is accurate.", - "depositMax": "1,995", - "depositMin": "600", - "developer": "Carmel Partners", - "programRules": null, - "externalId": null, - "waitlistMaxSize": 500, - "name": "Atlas", - "neighborhood": "Downtown Oakland", - "waitlistCurrentSize": null, - "petPolicy": "Pets allowed except the following; pit bull, malamute, akita, rottweiler, doberman, staffordshire terrier, presa canario, chowchow, american bull dog, karelian bear dog, st bernard, german shepherd, husky, great dane, any hybrid or mixed breed of the aforementioned breeds. 2 pets per household limit. $500 pet deposit per pet. $60 pet rent per pet.", - "prioritiesDescriptor": null, - "requiredDocuments": "Income: If you work and receive paystubs: ▪ Copies of 3 months’ worth of consecutive paystubs, beginning with the most recent paystub; ▪ If hired recently, provide Employment Offer Letter; If you receive severance pay, Social Security, unemployment benefits, retirement income, disability, public assistance, or the like, submit: ▪ Most recent benefits letter(s) stating your monthly award; If you are Self-Employed, you must: ▪ Complete an Self-Employed Declaration form; ▪ Submit Year-to-Date Profit and Loss statement; ▪ Submit the past year’s federal income tax returns; If you are Unemployed and have ZERO income, you must: ▪ Complete an Unemployment Declaration; ▪ Submit the previous year’s federal income tax returns; Assets: ▪ 6-consecutive and most recent official bank statements for Checking accounts and include ALL pages; ▪ 1 most recent statement for all other assets (IE: Savings, 401K, Money Market, etc.) and include ALL pages; ▪ A written explanation and supporting documentation for any deposit over $100 other than that of your documented employment; Building Documents: ▪ Application; ▪ Release & Consent Form; ▪ Resident Qualification Acknowledgment", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": 62, - "reservedDescriptor": "Senior", - "smokingPolicy": "Non-Smoking Building", - "yearBuilt": 2020, - "createdAt": "2020-02-14T15:11:26.446-07:00", - "updatedAt": "2020-02-15T11:47:47.150-07:00", - "groupId": 1, - "hideUnitFeatures": false, - "disableUnitsAccordion": true, - "unitAmenities": "Refrigerator, stove, oven, dishwasher, microwave, washer and dryer, air conditioning", - "applicationFee": "52.46", - "criminalBackground": "No criminal background checks under Oakland Fair Chance Ordinance", - "leasingAgentEmail": "AtlasHousing@Greystar.com", - "leasingAgentName": "Paula Tran", - "leasingAgentAddress": { - "city": "Oakland", - "street": "401 14th Street", - "zipCode": "Oakland", - "state": "94612", - "latitude": null, - "longitude": null - }, - "leasingAgentOfficeHours": "Due to COVID-19, our offices are closed. Please call or email or leasing agent for any questions during Mon-Fri 9AM-5PM", - "leasingAgentPhone": "(510) 381-8407", - "leasingAgentTitle": "Management Coordinator", - "rentalHistory": "Applicant must be able to provide sufficient residential information for at least the past two years to enable the Property Manager to adequately evaluate rental history and/or place of residence. If two years of prior residential information proves insufficient for obtaining adequate references, additional residential history may be requested. Negative rental history will be grounds for denial, including: Any evictions with an outstanding judgement, 4 or more evictions filings, 4 or more late payments being reported on the rental history report ", - "preferences": [ - { - "ordinal": 1, - "title": "Clients of Regional Center of the East Bay", - "subtitle": "Up to 8 units available", - "description": "Households in which at least one adult applicant is receiving or eligible for services from the Regional Center of the East Bay (“RCEB”).", - "links": [] - } - ], - "buildingTotalUnits": 633, - "units": [ - { - "id": "ikRy3lVB4EecZgYpUAycKw", - "amiPercentage": "50", - "annualIncomeMin": "28644", - "monthlyIncomeMin": "2387", - "floor": 5, - "annualIncomeMax": "52200", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1085", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "455", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy2lVB4EecZgYpUAycKw", - "amiPercentage": "50", - "annualIncomeMin": "30600", - "monthlyIncomeMin": "2550", - "floor": 3, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1159", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "535", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy1lVB4EecZgYpUAycKw", - "amiPercentage": "50", - "annualIncomeMin": "30600", - "monthlyIncomeMin": "2550", - "floor": 9, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1159", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "735", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy1lVB4EecZgYpUAycK1", - "amiPercentage": "50", - "annualIncomeMin": "30600", - "monthlyIncomeMin": "2550", - "floor": 9, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1159", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "735", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy1lVB4EecZgYpUAycK2", - "amiPercentage": "50", - "annualIncomeMin": "30600", - "monthlyIncomeMin": "2550", - "floor": 9, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1159", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "735", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy1lVB4EecZgYpUAycK3", - "amiPercentage": "50", - "annualIncomeMin": "30600", - "monthlyIncomeMin": "2550", - "floor": 9, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1159", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "735", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy1lVB4EecZgYpUAycK4", - "amiPercentage": "50", - "annualIncomeMin": "30600", - "monthlyIncomeMin": "2550", - "floor": 9, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1159", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "735", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy1lVB4EecZgYpUAycK5", - "amiPercentage": "50", - "annualIncomeMin": "30600", - "monthlyIncomeMin": "2550", - "floor": 9, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1159", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "735", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy1lVB4EecZgYpUAycK6", - "amiPercentage": "50", - "annualIncomeMin": "30600", - "monthlyIncomeMin": "2550", - "floor": 9, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1159", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "735", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy1lVB4EecZgYpUAycK7", - "amiPercentage": "50", - "annualIncomeMin": "30600", - "monthlyIncomeMin": "2550", - "floor": 9, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1159", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "735", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy1lVB4EecZgYpUAycK8", - "amiPercentage": "50", - "annualIncomeMin": "30600", - "monthlyIncomeMin": "2550", - "floor": 9, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1159", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "735", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy1lVB4EecZgYpUAycK9", - "amiPercentage": "50", - "annualIncomeMin": "30600", - "monthlyIncomeMin": "2550", - "floor": 9, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1159", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "735", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy1lVB4EecZgYpUAyc19", - "amiPercentage": "50", - "annualIncomeMin": "30600", - "monthlyIncomeMin": "2550", - "floor": 9, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1159", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "735", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy1lVB4EecZgYpUAyc29", - "amiPercentage": "50", - "annualIncomeMin": "30600", - "monthlyIncomeMin": "2550", - "floor": 9, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1159", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "735", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy1lVB4EecZgYpUAyc39", - "amiPercentage": "50", - "annualIncomeMin": "30600", - "monthlyIncomeMin": "2550", - "floor": 9, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1159", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "735", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy1lVB4EecZgYpUAyc49", - "amiPercentage": "50", - "annualIncomeMin": "30600", - "monthlyIncomeMin": "2550", - "floor": 9, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1159", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "735", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy1lVB4EecZgYpUAyc59", - "amiPercentage": "50", - "annualIncomeMin": "30600", - "monthlyIncomeMin": "2550", - "floor": 9, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1159", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "735", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy1lVB4EecZgYpUAyc69", - "amiPercentage": "50", - "annualIncomeMin": "30600", - "monthlyIncomeMin": "2550", - "floor": 9, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1159", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "735", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy1lVB4EecZgYpUAyc79", - "amiPercentage": "50", - "annualIncomeMin": "30600", - "monthlyIncomeMin": "2550", - "floor": 9, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1159", - "numBathrooms": 1, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "735", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy0lVB4EecZgYpUAycKw", - "amiPercentage": "50", - "annualIncomeMin": "35880", - "monthlyIncomeMin": "2990", - "floor": 7, - "annualIncomeMax": "70500", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1359", - "numBathrooms": 2, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "1205", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy9lVB4EecZgYpUAycKw", - "amiPercentage": "50", - "annualIncomeMin": "35880", - "monthlyIncomeMin": "2990", - "floor": 3, - "annualIncomeMax": "70500", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1359", - "numBathrooms": 2, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "900", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy9lVB4E1cZgYpUAycKw", - "amiPercentage": "50", - "annualIncomeMin": "35880", - "monthlyIncomeMin": "2990", - "floor": 3, - "annualIncomeMax": "70500", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1359", - "numBathrooms": 2, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "900", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy9lVB4E2cZgYpUAycKw", - "amiPercentage": "50", - "annualIncomeMin": "35880", - "monthlyIncomeMin": "2990", - "floor": 3, - "annualIncomeMax": "70500", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1359", - "numBathrooms": 2, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "900", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy9lVB4E3cZgYpUAycKw", - "amiPercentage": "50", - "annualIncomeMin": "35880", - "monthlyIncomeMin": "2990", - "floor": 3, - "annualIncomeMax": "70500", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1359", - "numBathrooms": 2, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "900", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy9lVB4E4cZgYpUAycKw", - "amiPercentage": "50", - "annualIncomeMin": "35880", - "monthlyIncomeMin": "2990", - "floor": 3, - "annualIncomeMax": "70500", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1359", - "numBathrooms": 2, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "900", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy9lVB4E5cZgYpUAycKw", - "amiPercentage": "50", - "annualIncomeMin": "35880", - "monthlyIncomeMin": "2990", - "floor": 3, - "annualIncomeMax": "70500", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1359", - "numBathrooms": 2, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "900", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ikRy9lVB4E6cZgYpUAycKw", - "amiPercentage": "50", - "annualIncomeMin": "35880", - "monthlyIncomeMin": "2990", - "floor": 3, - "annualIncomeMax": "70500", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1359", - "numBathrooms": 2, - "numBedrooms": null, - "number": "551", - "priorityType": null, - "reservedType": null, - "sqFeet": "900", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - } - ], - "unitsAvailable": 27, - "applicationMethods": [ - { - "type": "POBox", - "acceptsPostmarkedApplications": false - }, - { - "type": "PaperPickup", - "acceptsPostmarkedApplications": false - }, - { - "type": "ExternalLink", - "acceptsPostmarkedApplications": false, - "externalReference": "https://www.atlasoakland.com/bmr" - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/atlas.jpg" - } - ] -} diff --git a/backend/core/listing_data/aurora.json b/backend/core/listing_data/aurora.json deleted file mode 100644 index c7122a1380..0000000000 --- a/backend/core/listing_data/aurora.json +++ /dev/null @@ -1,1453 +0,0 @@ -{ - "id": "HOLNx_F7fUCeax5GCoIr9g", - "events": [], - "postmarkedApplicationsReceivedByDate": null, - "applicationAddress": { - "city": "Oakland", - "state": "CA", - "street": "657 W. MacArthur Blvd.", - "zipCode": "94609", - "latitude": 37.8270134, - "longitude": -122.2717646 - }, - "applicationDueDate": null, - "applicationOrganization": "Solari Enterprises, Inc.", - "applicationPhone": null, - "buildingSelectionCriteria": null, - "costsNotIncluded": "For those without an income, rent is $50/month.", - "creditHistory": "", - "CSVFormattingType": "withDisplaceeNameAndAddress", - "depositMax": "500", - "depositMin": "500", - "programRules": "This property follows the California Tax Credit Allocation Committee's Low Income Housing Tax Credit Program (LIHTC). Compliance Monitoring Manual: https://www.treasurer.ca.gov/ctcac/compliance/manual/manual.pdf", - "externalId": null, - "waitlistMaxSize": null, - "name": "Aurora", - "waitlistCurrentSize": null, - "prioritiesDescriptor": null, - "requiredDocuments": "Income documents for program compliance", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": null, - "reservedDescriptor": "Previously unhoused", - "status": "active", - "createdAt": "2021-05-04T15:11:26.446-08:00", - "updatedAt": "2021-05-04T11:47:47.150-08:00", - "groupId": 1, - "hideUnitFeatures": false, - "disableUnitsAccordion": true, - "applicationFee": "0", - "criminalBackground": "Adhere to Oakland Housing Authority's criminal background requirements", - "leasingAgentEmail": "aurora@solari-ent.com", - "leasingAgentName": "", - "leasingAgentAddress": { - "city": "Oakland", - "state": "CA", - "street": "657 W. MacArthur Blvd.", - "zipCode": "94609", - "latitude": 37.8270134, - "longitude": -122.2717646 - }, - "leasingAgentOfficeHours": "By appointment only", - "leasingAgentPhone": "(510) 977-9780", - "leasingAgentTitle": "Management Agent", - "rentalAssistance": "The property is subsidized by the Section 8 Project-Based Voucher Program. As a result, Housing Choice Vouchers, Section 8 and other valid rental assistance programs are not accepted by this property.", - "rentalHistory": "", - "preferences": [], - "property": { - "createdAt": "2021-05-04T17:00:00.000-08:00", - "updatedAt": "2021-05-04T17:00:00.000-08:00", - "householdSizeMin": 1, - "householdSizeMax": 3, - "smokingPolicy": "No smoking", - "unitsAvailable": 44, - "unitsSummarized": null, - "unitAmenities": "Adaptability features, refrigerator, microwave and two burner stove top, furnished with bed, mattress/tables", - "developer": "Affirmed Housing", - "yearBuilt": 2021, - "accessibility": "", - "amenities": "Community Room with Kitchen, onsite Supportive Services, all units are ADA adaptable.", - "buildingTotalUnits": 44, - "buildingAddress": { - "county": "Alameda", - "city": "Oakland", - "state": "CA", - "street": "657 W. MacArthur Blvd.", - "zipCode": "94609", - "latitude": 37.8270134, - "longitude": -122.2717646 - }, - "neighborhood": null, - "petPolicy": "No pets allowed", - "units": [ - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 2, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "307", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "307", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 2, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "600", - "monthlyIncomeMin": "50", - "floor": 5, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "mobility", - "reservedType": "specialNeeds", - "sqFeet": "462", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - } - ] - }, - "applicationMethods": [], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/aurora.jpg" - } - ], - "amiChart": { - "name": "AlamedaCountyTCAC2021", - "items": [ - { - "percentOfAmi": 80, - "householdSize": 1, - "income": 76720 - }, - { - "percentOfAmi": 80, - "householdSize": 2, - "income": 87680 - }, - { - "percentOfAmi": 80, - "householdSize": 3, - "income": 98640 - }, - { - "percentOfAmi": 80, - "householdSize": 4, - "income": 109600 - }, - { - "percentOfAmi": 80, - "householdSize": 5, - "income": 11840 - }, - { - "percentOfAmi": 80, - "householdSize": 6, - "income": 127200 - }, - { - "percentOfAmi": 80, - "householdSize": 7, - "income": 135920 - }, - { - "percentOfAmi": 80, - "householdSize": 8, - "income": 144720 - }, - { - "percentOfAmi": 60, - "householdSize": 1, - "income": 57540 - }, - { - "percentOfAmi": 60, - "householdSize": 2, - "income": 65760 - }, - { - "percentOfAmi": 60, - "householdSize": 3, - "income": 73980 - }, - { - "percentOfAmi": 60, - "householdSize": 4, - "income": 82200 - }, - { - "percentOfAmi": 60, - "householdSize": 5, - "income": 88800 - }, - { - "percentOfAmi": 60, - "householdSize": 6, - "income": 95400 - }, - { - "percentOfAmi": 60, - "householdSize": 7, - "income": 101940 - }, - { - "percentOfAmi": 60, - "householdSize": 8, - "income": 108540 - }, - { - "percentOfAmi": 50, - "householdSize": 1, - "income": 47950 - }, - { - "percentOfAmi": 50, - "householdSize": 2, - "income": 54800 - }, - { - "percentOfAmi": 50, - "householdSize": 3, - "income": 61650 - }, - { - "percentOfAmi": 50, - "householdSize": 4, - "income": 68500 - }, - { - "percentOfAmi": 50, - "householdSize": 5, - "income": 74000 - }, - { - "percentOfAmi": 50, - "householdSize": 6, - "income": 79500 - }, - { - "percentOfAmi": 50, - "householdSize": 7, - "income": 84950 - }, - { - "percentOfAmi": 50, - "householdSize": 8, - "income": 90450 - }, - { - "percentOfAmi": 45, - "householdSize": 1, - "income": 43155 - }, - { - "percentOfAmi": 45, - "householdSize": 2, - "income": 49320 - }, - { - "percentOfAmi": 45, - "householdSize": 3, - "income": 55485 - }, - { - "percentOfAmi": 45, - "householdSize": 4, - "income": 61650 - }, - { - "percentOfAmi": 45, - "householdSize": 5, - "income": 66600 - }, - { - "percentOfAmi": 45, - "householdSize": 6, - "income": 71550 - }, - { - "percentOfAmi": 45, - "householdSize": 7, - "income": 76455 - }, - { - "percentOfAmi": 45, - "householdSize": 8, - "income": 81405 - }, - { - "percentOfAmi": 40, - "householdSize": 1, - "income": 38360 - }, - { - "percentOfAmi": 40, - "householdSize": 2, - "income": 43840 - }, - { - "percentOfAmi": 40, - "householdSize": 3, - "income": 49320 - }, - { - "percentOfAmi": 40, - "householdSize": 4, - "income": 54800 - }, - { - "percentOfAmi": 40, - "householdSize": 5, - "income": 59200 - }, - { - "percentOfAmi": 40, - "householdSize": 6, - "income": 63600 - }, - { - "percentOfAmi": 40, - "householdSize": 7, - "income": 67960 - }, - { - "percentOfAmi": 40, - "householdSize": 8, - "income": 72360 - }, - { - "percentOfAmi": 30, - "householdSize": 1, - "income": 28770 - }, - { - "percentOfAmi": 30, - "householdSize": 2, - "income": 32880 - }, - { - "percentOfAmi": 30, - "householdSize": 3, - "income": 36990 - }, - { - "percentOfAmi": 30, - "householdSize": 4, - "income": 41100 - }, - { - "percentOfAmi": 30, - "householdSize": 5, - "income": 44400 - }, - { - "percentOfAmi": 30, - "householdSize": 6, - "income": 47700 - }, - { - "percentOfAmi": 30, - "householdSize": 7, - "income": 50970 - }, - { - "percentOfAmi": 30, - "householdSize": 8, - "income": 54270 - }, - { - "percentOfAmi": 20, - "householdSize": 1, - "income": 19180 - }, - { - "percentOfAmi": 20, - "householdSize": 2, - "income": 21920 - }, - { - "percentOfAmi": 20, - "householdSize": 3, - "income": 24660 - }, - { - "percentOfAmi": 20, - "householdSize": 4, - "income": 27400 - }, - { - "percentOfAmi": 20, - "householdSize": 5, - "income": 29600 - }, - { - "percentOfAmi": 20, - "householdSize": 6, - "income": 31800 - }, - { - "percentOfAmi": 20, - "householdSize": 7, - "income": 33980 - }, - { - "percentOfAmi": 20, - "householdSize": 8, - "income": 36180 - } - ] - } -} diff --git a/backend/core/listing_data/bridgepointe_rental_condominiums.json b/backend/core/listing_data/bridgepointe_rental_condominiums.json deleted file mode 100644 index 6c3be4efd7..0000000000 --- a/backend/core/listing_data/bridgepointe_rental_condominiums.json +++ /dev/null @@ -1,187 +0,0 @@ -{ - "id": "6b169720-0cf8-0139-7cff-2683e7458fb7", - "events":[], - "accessibility": "Accessiblity features in common areas like lobby, wheelchair ramps, accessible bathrooms and elevators.", - "amenities": "Gym, theater room, clubhouse, pool, playground, business center, spa", - "applicationDueDate": null, - "applicationOpenDate": "2020-06-09T00:00:00.000Z", - "applicationOrganization": "Bridgepointe", - "applicationAddress": { - "city": "San Mateo", - "zipCode": "94404", - "state": "CA", - "street": "1927 Bridgepointe Circle", - "latitude": 37.562992, - "longitude": -122.284063 - }, - "applicationPhone": "650-358-8511", - "buildingAddress": { - "city": "San Mateo", - "county": "San Mateo", - "state": "CA", - "street": "1927 Bridgepointe Circle", - "zipCode": "94404", - "latitude": 37.562992, - "longitude": -122.284063 - }, - "buildingSelectionCriteria": null, - "costsNotIncluded": "Residents are responsible for water, sewage, trash and PGE. Pet Deposit 500.00 and 60.00 pet rent. Rental insurance is required. Rent is due 1st and late as of 6th. Late fee is 75.00. Resident to pay $35.00 for rejected check or electronic payment.", - "creditHistory": "No collections, no bankruptcy, income is 2.5 the monthly rent. A credit report will be completed on all applicants to verify credit ratings. Income plus verified credit history will be entered into a credit scoring model to determine rental eligibility and security deposit levels. All decisions for residency are based on a system which considers credit history, rent history, income qualifications, and employment history. An approved decision based on the system does not automatically constittute an approval of residency. Applicant(s) and occupant(s) aged 18 years or older MUST also pass the criminal background check based on the criteria contained herein to be approved for residency. Credit recommendations other than an accept decision, will require a rental verification. Applications for residency will automatically be denied for the following reasons: a. An outstanding debt to a previous landlord or an outstanding NSF check must be paid in full b. An unsatisfied breach of a prior lease or a prior eviction of any applicant or occupant c. More than four (4) late pays and two (2) NSF's in the last twenty-four (24) months", - "depositMax": "500.0", - "depositMin": "500.0", - "developer": "Thompson Dorfman, LLC", - "imageUrl": "/images/bridgepointe.jpg", - "programRules": "This is a Below Market Rate unit. All BMR tenants are expected to provide documentation of eligiblity upon initial lease up and annually after that.", - "externalId": null, - "waitlistMaxSize": null, - "name": "Bridgepointe Rental Condominiums", - "neighborhood": "San Mateo", - "waitlistCurrentSize": null, - "petPolicy": "Pets allowed- dog breed restrictions, no size restrictions. Cats ok. $500 pet deposit and $60 rent.", - "prioritiesDescriptor": null, - "requiredDocuments": "Due at interview- 3 months of paystubs, bank statments, recent tax return, SSI statement, child support and alimony, any other income. Retirement accounts are exempt from income calculations.", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": null, - "reservedDescriptor": "Family", - "smokingPolicy": "Non-Smoking", - "yearBuilt": 2001, - "createdAt": "2019-06-03T10:30:41.039Z", - "updatedAt": "2020-05-12T22:15:15.443Z", - "hideUnitFeatures": false, - "unitAmenities": "Washer and dryer, heater,electric stoves", - "applicationFee": "0.0", - "criminalBackground": "Qualified applicants with criminal history will be considered for housing in compliance with Article 49 of the San Francisco Police Code: Fair Chance Ordinance.", - "leasingAgentAddress": { - "city": "San Mateo", - "state": "CA", - "street": "1927 Bridgepointe Circle", - "zipCode": "94404", - "latitude": 37.562992, - "longitude": -122.284063 - }, - "leasingAgentEmail": "barajas@allresco.com", - "leasingAgentName": "Vanessa Barajas", - "leasingAgentOfficeHours": "Monday-Saturday, 9:00am to 6:00pm, Sunday 10:00am-5:00pm", - "leasingAgentPhone": "650-358-8511", - "leasingAgentTitle": "Assistant Business Manager", - "rentalHistory": "Our credit reporting agency also reviews eviction and court databases to search for both eviction filings and judgements within the past 24 months. No Fault or Dismissed evictions will not be held against the household. If a household does not meet the rental or credit criteria, they will then have the option of either paying an additional deposit equal to 1 times the monthly rent, or providing a qualified guarantor. If the applicant does not provide either of these options, it could result in the denial of their application. Mitigating Circumstances will be considered on a case by case basis.", - "buildingTotalUnits": 396, - "postmarkedApplicationsReceivedByDate": null, - "totalUnits": 3, - "unitsAvailable": 3, - "units": [ - { - "id": "6b169760-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "120.0", - "annualIncomeMin": "85800.0", - "monthlyIncomeMin": "7150.0", - "floor": 1, - "annualIncomeMax": "114900-147750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "2989.00", - "numBathrooms": null, - "numBedrooms": 2, - "number": "L-119", - "priorityType": null, - "reservedType": null, - "sqFeet": "690", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2019-06-03T10:42:43.134Z", - "updatedAt": "2019-07-10T09:44:01.384Z", - "listingId": 3, - "amiChartId": 7, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1697a0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "120.0", - "annualIncomeMin": "85800.0", - "monthlyIncomeMin": "7150.0", - "floor": 2, - "annualIncomeMax": "114,900-147,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "2989.00", - "numBathrooms": null, - "numBedrooms": 1, - "number": "N-201", - "priorityType": null, - "reservedType": null, - "sqFeet": "848", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2019-06-03T10:42:43.134Z", - "updatedAt": "2019-07-10T09:44:01.384Z", - "listingId": 3, - "amiChartId": 7, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1697b0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "120.0", - "annualIncomeMin": "85800.0", - "monthlyIncomeMin": "7150.0", - "floor": 2, - "annualIncomeMax": "114,900-147,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "2989.00", - "numBathrooms": null, - "numBedrooms": 1, - "number": "I-235", - "priorityType": null, - "reservedType": null, - "sqFeet": "750", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2019-06-03T10:42:43.134Z", - "updatedAt": "2019-07-10T09:44:01.384Z", - "listingId": 3, - "amiChartId": 7, - "monthlyRentAsPercentOfIncome": null - } - ], - "preferences": [ - { - "ordinal": 1, - "title": "Live or Work in San Mateo", - "subtitle": null, - "description": "Applicants who currently live or work in San Mateo.", - "links": null - }, - { - "ordinal": 2, - "title": "General Pool", - "subtitle": null, - "description": "All other applicants.", - "links": null - } - ], - "whatToExpect": { - "applicantsWillBeContacted": "Applicants will be contacted by the City of San Mateo on a first come first serve basis until vacancies are filled.", - "allInfoWillBeVerified": "All of the information that you have provided will be verified and your eligibility confirmed. Your application will be removed if you have made any fraudulent statements, or if any household member appears on more than one application for this listing. If we cannot verify a housing preference that you have claimed, you will not receive the preference but will not be otherwise penalized.", - "bePreparedIfChosen": "Should your application be chosen, be prepared to fill out a more detailed application and provide required supporting documents within 5 business days of being contacted." - }, - "applicationMethods": [ - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "externalReference": "https://drive.google.com/file/d/1rw1MR6FOZKfHSFhGFy4TfiysWnIlF3OL/view?usp=sharing", - "label": "English" - }, - { - "type": "PaperPickup", - "acceptsPostmarkedApplications": false - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/bridgepointe.jpg" - } - ] -} diff --git a/backend/core/listing_data/brunswick_street_apartments.json b/backend/core/listing_data/brunswick_street_apartments.json deleted file mode 100644 index 47599d2264..0000000000 --- a/backend/core/listing_data/brunswick_street_apartments.json +++ /dev/null @@ -1,1633 +0,0 @@ -{ - "id": "6b16a130-0cf8-0139-7cff-2683e7458fb7", - "events":[], - "accessibility": "Accessibility features in common areas like lobby – wheelchair ramps, wheelchair accessible bathrooms and elevators.", - "amenities": "Underground parking, Fitness center, Large community room, On-site laundry rooms, Outdoor picnic/seating area, Stunning views of the SF Bay, On-site Van service, 2 elevators", - "applicationDueDate": "2021-01-30T17:00:00.000Z", - "applicationOrganization": "Brunswick Street Apartments", - "applicationAddress": { - "city": "Daly City", - "zipCode": "94914", - "state": "CA", - "street": "4619 Brunswick St. Ste 200" - }, - "applicationPhone": "(650) 731-4139", - "buildingAddress": { - "city": "Daly City", - "county": "San Mateo", - "state": "CA", - "street": "4619 Brunswick St", - "zipCode": "94014", - "latitude": 37.704575, - "longitude": -122.461062 - }, - "buildingSelectionCriteria": "", - "costsNotIncluded": "No Rent Due Until March 2021 if you sign by Jan 30th.", - "creditHistory": "Credit and Criminal checks; three months of pay stubs and bank statements are required; if self-employed, we will need the current two years of tax returns; ", - "depositMax": null, - "depositMin": "99.0", - "developer": "Aperto Property Management, Inc.", - "imageUrl": "/images/brunswick.jpg", - "programRules": "All Residents will need to be recertified on an annual basis.", - "externalId": null, - "waitlistMaxSize": null, - "name": "Brunswick Street Apartments", - "neighborhood": "Daly City", - "waitlistCurrentSize": 0, - "petPolicy": "Pets are welcome", - "prioritiesDescriptor": "", - "requiredDocuments": "Three months of your most recent pay stubs; Six months of your most recent bank statements for all accounts; Most recent Quarterly Statement (ending Sept or Dec 30th) such as: 401(k), Stocks, Bonds, IRA etc; Current Social Security Benefit Letter (can be obtained online or by calling your social security office); If you receive money from family or friends monthly, please let us know; Copy of Driver’s License OR Birth Certificate; Copy of your Social Security Card; If Self-Employed please bring your 2019 Tax Documents; $30 application fee for each adult in the form of a money order or cashier’s check addressed to: BRUNSWICK STREET APARTMENTS; Contact information for all documents; All documentation is if applicable", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": 55, - "reservedDescriptor": [ - { - "name": "Senior" - } - ], - "smokingPolicy": "No Smoking Community", - "yearBuilt": 2020, - "createdAt": "2020-12-10T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "groupId": 2, - "hideUnitFeatures": false, - "unitAmenities": "Garbage disposal, refridgerator, stove, air conditioning/ heating, blinds, and large windows.", - "applicationFee": "30.0", - "criminalBackground": "", - "leasingAgentAddress": { - "city": "Daly City", - "state": "CA", - "street": "4619 Brunswick St", - "zipCode": "94014" - }, - "leasingAgentEmail": "brunswickasstmgr@apertopm.com", - "leasingAgentName": "Tina Taylor", - "leasingAgentOfficeHours": null, - "leasingAgentPhone": "(650) 731-4139", - "leasingAgentTitle": "Leasing Agent", - "rentalHistory": "", - "buildingTotalUnits": 204, - "postmarkedApplicationsReceivedByDate": null, - "totalUnits": 204, - "unitsAvailable": 204, - "units": [ - { - "id": "6b16a200-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 6, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16a220-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 5, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16a250-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 4, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16eaa0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 6, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16eab0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 5, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ead0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 4, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16eaf0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 3, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16eb20-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 2, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16eb40-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 1, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16eb50-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 6, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16eb70-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 5, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16eb90-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 4, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ebc0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 3, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ebe0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 2, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ebf0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 1, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ec10-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 6, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ec30-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 5, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ec40-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 4, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ec60-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 3, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ec80-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 2, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ec90-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 1, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ecb0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 6, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ecd0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 5, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ece0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 4, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ed00-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 3, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ed10-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 2, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ed30-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 1, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ed50-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 6, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ed70-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 5, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ed80-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 4, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16eda0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 3, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16edc0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 2, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ede0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 1, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16edf0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 6, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ee10-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 5, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ef00-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 4, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ef20-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 3, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ef30-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 2, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ef50-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 1, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ef70-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 6, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16ef80-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 5, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16efa0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 4, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16efc0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 3, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16efd0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 2, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16eff0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 1, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f010-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 6, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f020-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 5, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f040-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 4, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f060-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 3, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f070-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 2, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f090-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 1, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f0b0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 6, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f0d0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 5, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f0e0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 4, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f2f0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 5, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f310-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 4, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f320-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 3, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f340-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 2, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f360-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 1, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f370-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 6, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f390-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 5, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f3b0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 4, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f3f0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 3, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b16f400-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "26100.0", - "monthlyIncomeMin": "2200.0", - "floor": 2, - "annualIncomeMax": "83520.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1450.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "55+", - "sqFeet": "422", - "status": "available", - "unitType": "studio", - "createdAt": "2019-12-08T16:00:00.000Z", - "updatedAt": "2019-12-08T16:00:00.000Z", - "listingId": 8, - "amiChartId": 8, - "monthlyRentAsPercentOfIncome": null - } - ], - "preferences": [ - - ], - "applicationMethods": [ - { - "type": "ExternalLink", - "acceptsPostmarkedApplications": false, - "externalReference": "https://brunswick.apartmentapplication.info/", - "label": "English" - }, - { - "type": "PaperPickup", - "acceptsPostmarkedApplications": false - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/brunswick.jpg" - } - ] -} diff --git a/backend/core/listing_data/city_center.json b/backend/core/listing_data/city_center.json deleted file mode 100644 index b8d0597d2b..0000000000 --- a/backend/core/listing_data/city_center.json +++ /dev/null @@ -1,792 +0,0 @@ -{ - "id": "HOLNx_F7fUCeax5GCoIr9g", - "events": [], - "postmarkedApplicationsReceivedByDate": "2021-05-28T17:00:00.000-07:00", - "applicationAddress": { - "city": "Fremont", - "street": "39155 Liberty Street Suite H850", - "zipCode": "94536", - "state": "CA", - "latitude": null, - "longitude": null - }, - "applicationDueDate": "2021-05-28T17:00:00.000-07:00", - "applicationOrganization": "John Stewart Company", - "applicationPhone": "510-894-2890", - "buildingSelectionCriteria": "https://drive.google.com/file/d/1_U1tHEDMLF9D8AsNnJoGopA82UStsKZy/view", - "costsNotIncluded": null, - "countyCode": "Alameda", - "creditHistory": "To be used to determine income eligibility only", - "CSVFormattingType": "basic", - "depositMax": "800", - "depositMin": "800", - "programRules": null, - "externalId": null, - "waitlistMaxSize": 150, - "name": "City Center Apartments", - "waitlistCurrentSize": 0, - "displayWaitlistSize": false, - "prioritiesDescriptor": "All units are fully adaptable. Fully built out ADA units will be assigned on a first come first need basis with the exception of a few ADA units set aside for VASH veterans", - "requiredDocuments": "INCOME: Tax return, paystubs, SS Awared letter or Assistance Award letter, pension statement. ASSETS: 6 months’ bank statements (checking), 1 month bank statement (savings), copy of EBT cart and balance. HOUSING PREFERENCE: Applicants who either live and or work within the County of Alameda: paystubs / tax return or another form of independent verification to verify employment; and or a lease or a copy of a utility bill to verify residency.", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": null, - "reservedDescriptor": null, - "status": "active", - "createdAt": "2020-11-06T15:11:26.446-08:00", - "updatedAt": "2020-11-06T11:47:47.150-08:00", - "groupId": 1, - "hideUnitFeatures": false, - "disableUnitsAccordion": true, - "applicationFee": "0.00", - "criminalBackground": "Serious felony offenses and/or continued and ongoing criminal activity will be grounds for rejection", - "leasingAgentEmail": "citycenterapts@jsco.net", - "leasingAgentName": "Lynn Newton", - "leasingAgentAddress": { - "city": "Fremont", - "street": "39155 Liberty Street Suite H850", - "zipCode": "94536", - "state": "CA", - "latitude": 37.550675, - "longitude": -121.983552 - }, - "leasingAgentOfficeHours": "Mon-Fri 9AM-5PM. Should translation services be needed please contact our leasing office at 510-894-2890.", - "leasingAgentPhone": "510-894-2890", - "leasingAgentTitle": "Property Manager", - "rentalHistory": "Must provide 2 years' residency", - "specialNotes": "If you need help reading the AMI table, here is an example: a 2-person household cannot earn more than $65,760 a year to qualify for the 60% AMI", - "preferences": [ - { - "ordinal": 1, - "title": "Live/Work in Alameda County", - "subtitle": "", - "description": "At least one household member lives or works in Alameda County", - "links": [], - "formMetadata": { - "key": "liveWork", - "options": [ - { - "key": "live", - "extraData": [] - }, - { - "key": "work", - "extraData": [] - } - ] - } - } - ], - "property": { - "createdAt": "2021-02-02T17:00:00.000-08:00", - "updatedAt": "2021-02-02T17:00:00.000-08:00", - "servicesOffered": "Include but are not limited to resident services, wellness specialist, harm reduction specialist, clinician", - "householdSizeMin": 1, - "householdSizeMax": 5, - "smokingPolicy": "No Smoking", - "unitsAvailable": 14, - "unitsSummarized": null, - "unitAmenities": "Includes but are not limited to refrigerator, stove, microwave, AC/Heat, private open space in the form of a patio or balcony.", - "developer": "Allied Housing, Inc.", - "yearBuilt": 2021, - "accessibility": "There are 3 fully built out ADA units, 3 Hearing and Visually impared units, and 6 wheelchair accessable units. Fully built out ADA units will be assigned on a first come first need basis. All units are universally adaptable.", - "amenities": "Includes but are not limited to on-site property management, resident services, community room, outdoor recreation area, dog run, resident storages, on-site parking, laundry room, elevator", - "buildingTotalUnits": 60, - "buildingAddress": { - "county": "Alameda", - "city": "Fremont", - "street": "38631 Fremont Blvd", - "zipCode": "94538", - "state": "CA", - "latitude": 37.549257, - "longitude": -121.992633 - }, - "neighborhood": "Glenmoor", - "petPolicy": "Limit one per household, all pets must be approved in advance by Management before pet moves on-site.", - "units": [ - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "40", - "annualIncomeMin": "21936", - "monthlyIncomeMin": "1918", - "floor": 1, - "annualIncomeMax": "73980", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "959", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "357", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "40", - "annualIncomeMin": "21936", - "monthlyIncomeMin": "1918", - "floor": 4, - "annualIncomeMax": "73980", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "959", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "357", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "27408", - "monthlyIncomeMin": "2396", - "floor": 1, - "annualIncomeMax": "73980", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1198", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "357", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "27408", - "monthlyIncomeMin": "2396", - "floor": 4, - "annualIncomeMax": "73980", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1198", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "357", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "27408", - "monthlyIncomeMin": "2396", - "floor": 1, - "annualIncomeMax": "73980", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1198", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "357", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "27408", - "monthlyIncomeMin": "2396", - "floor": 1, - "annualIncomeMax": "73980", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1198", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "357", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "60", - "annualIncomeMin": "32904", - "monthlyIncomeMin": "2876", - "floor": 1, - "annualIncomeMax": "73980", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1438", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "357", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "60", - "annualIncomeMin": "32904", - "monthlyIncomeMin": "2876", - "floor": 4, - "annualIncomeMax": "73980", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1438", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "357", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "60", - "annualIncomeMin": "32904", - "monthlyIncomeMin": "2876", - "floor": 1, - "annualIncomeMax": "73980", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1438", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "357", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "60", - "annualIncomeMin": "32904", - "monthlyIncomeMin": "2876", - "floor": 1, - "annualIncomeMax": "73980", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1438", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "357", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "60", - "annualIncomeMin": "32904", - "monthlyIncomeMin": "2876", - "floor": 1, - "annualIncomeMax": "73980", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1438", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "357", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "60", - "annualIncomeMin": "35232", - "monthlyIncomeMin": "2936", - "floor": 1, - "annualIncomeMax": "70500", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1541", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "625", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "60", - "annualIncomeMin": "35232", - "monthlyIncomeMin": "2936", - "floor": 4, - "annualIncomeMax": "70500", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1541", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "625", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "60", - "annualIncomeMin": "35232", - "monthlyIncomeMin": "2936", - "floor": 1, - "annualIncomeMax": "70500", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1541", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "625", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - } - ] - }, - "applicationMethods": [ - { - "type": "PaperPickup", - "acceptsPostmarkedApplications": true - }, - { - "type": "LeasingAgent", - "acceptsPostmarkedApplications": true - }, - { - "type": "Internal", - "acceptsPostmarkedApplications": true - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "English", - "externalReference": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/Alameda_County_Final_English.pdf" - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "Spanish", - "externalReference": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/Alameda_County_Final_Spanish.pdf" - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "Vietnamese", - "externalReference": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/Alameda_County_Final_Vietnamese.pdf" - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "Chinese", - "externalReference": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/Alameda_County_Final_Chinese.pdf" - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/city-center.jpg" - } - ], - "amiChart": { - "name": "AlamedaCountyTCAC2021", - "items": [ - { - "percentOfAmi": 80, - "householdSize": 1, - "income": 76720 - }, - { - "percentOfAmi": 80, - "householdSize": 2, - "income": 87680 - }, - { - "percentOfAmi": 80, - "householdSize": 3, - "income": 98640 - }, - { - "percentOfAmi": 80, - "householdSize": 4, - "income": 109600 - }, - { - "percentOfAmi": 80, - "householdSize": 5, - "income": 11840 - }, - { - "percentOfAmi": 80, - "householdSize": 6, - "income": 127200 - }, - { - "percentOfAmi": 80, - "householdSize": 7, - "income": 135920 - }, - { - "percentOfAmi": 80, - "householdSize": 8, - "income": 144720 - }, - { - "percentOfAmi": 60, - "householdSize": 1, - "income": 57540 - }, - { - "percentOfAmi": 60, - "householdSize": 2, - "income": 65760 - }, - { - "percentOfAmi": 60, - "householdSize": 3, - "income": 73980 - }, - { - "percentOfAmi": 60, - "householdSize": 4, - "income": 82200 - }, - { - "percentOfAmi": 60, - "householdSize": 5, - "income": 88800 - }, - { - "percentOfAmi": 60, - "householdSize": 6, - "income": 95400 - }, - { - "percentOfAmi": 60, - "householdSize": 7, - "income": 101940 - }, - { - "percentOfAmi": 60, - "householdSize": 8, - "income": 108540 - }, - { - "percentOfAmi": 50, - "householdSize": 1, - "income": 47950 - }, - { - "percentOfAmi": 50, - "householdSize": 2, - "income": 54800 - }, - { - "percentOfAmi": 50, - "householdSize": 3, - "income": 61650 - }, - { - "percentOfAmi": 50, - "householdSize": 4, - "income": 68500 - }, - { - "percentOfAmi": 50, - "householdSize": 5, - "income": 74000 - }, - { - "percentOfAmi": 50, - "householdSize": 6, - "income": 79500 - }, - { - "percentOfAmi": 50, - "householdSize": 7, - "income": 84950 - }, - { - "percentOfAmi": 50, - "householdSize": 8, - "income": 90450 - }, - { - "percentOfAmi": 45, - "householdSize": 1, - "income": 43155 - }, - { - "percentOfAmi": 45, - "householdSize": 2, - "income": 49320 - }, - { - "percentOfAmi": 45, - "householdSize": 3, - "income": 55485 - }, - { - "percentOfAmi": 45, - "householdSize": 4, - "income": 61650 - }, - { - "percentOfAmi": 45, - "householdSize": 5, - "income": 66600 - }, - { - "percentOfAmi": 45, - "householdSize": 6, - "income": 71550 - }, - { - "percentOfAmi": 45, - "householdSize": 7, - "income": 76455 - }, - { - "percentOfAmi": 45, - "householdSize": 8, - "income": 81405 - }, - { - "percentOfAmi": 40, - "householdSize": 1, - "income": 38360 - }, - { - "percentOfAmi": 40, - "householdSize": 2, - "income": 43840 - }, - { - "percentOfAmi": 40, - "householdSize": 3, - "income": 49320 - }, - { - "percentOfAmi": 40, - "householdSize": 4, - "income": 54800 - }, - { - "percentOfAmi": 40, - "householdSize": 5, - "income": 59200 - }, - { - "percentOfAmi": 40, - "householdSize": 6, - "income": 63600 - }, - { - "percentOfAmi": 40, - "householdSize": 7, - "income": 67960 - }, - { - "percentOfAmi": 40, - "householdSize": 8, - "income": 72360 - }, - { - "percentOfAmi": 30, - "householdSize": 1, - "income": 28770 - }, - { - "percentOfAmi": 30, - "householdSize": 2, - "income": 32880 - }, - { - "percentOfAmi": 30, - "householdSize": 3, - "income": 36990 - }, - { - "percentOfAmi": 30, - "householdSize": 4, - "income": 41100 - }, - { - "percentOfAmi": 30, - "householdSize": 5, - "income": 44400 - }, - { - "percentOfAmi": 30, - "householdSize": 6, - "income": 47700 - }, - { - "percentOfAmi": 30, - "householdSize": 7, - "income": 50970 - }, - { - "percentOfAmi": 30, - "householdSize": 8, - "income": 54270 - }, - { - "percentOfAmi": 20, - "householdSize": 1, - "income": 19180 - }, - { - "percentOfAmi": 20, - "householdSize": 2, - "income": 21920 - }, - { - "percentOfAmi": 20, - "householdSize": 3, - "income": 24660 - }, - { - "percentOfAmi": 20, - "householdSize": 4, - "income": 27400 - }, - { - "percentOfAmi": 20, - "householdSize": 5, - "income": 29600 - }, - { - "percentOfAmi": 20, - "householdSize": 6, - "income": 31800 - }, - { - "percentOfAmi": 20, - "householdSize": 7, - "income": 33980 - }, - { - "percentOfAmi": 20, - "householdSize": 8, - "income": 36180 - } - ] - } -} diff --git a/backend/core/listing_data/coliseum.json b/backend/core/listing_data/coliseum.json deleted file mode 100644 index 7514be32ce..0000000000 --- a/backend/core/listing_data/coliseum.json +++ /dev/null @@ -1,1664 +0,0 @@ -{ - "id": "HOLNx_F7fUCeax5GCoIr9g", - "events": [], - "applicationAddress": { - "county": "Alameda", - "city": "Oakland", - "street": "1701 Martin Luther King Way", - "zipCode": "94621", - "state": "CA", - "latitude": 37.7549632, - "longitude": -122.1968792 - }, - "countyCode": "Alameda", - "applicationDueDate": "2021-06-15T12:00:00.000-07:00", - "applicationOrganization": "John Stewart Company", - "applicationPhone": "(510) 625-1632", - "buildingSelectionCriteria": null, - "costsNotIncluded": "Electricity, phone, TV, internet, and cable not included. For the PBV units, deposit is one month of the tenant-paid portion of rent (30% of income).", - "creditHistory": "Management staff will request credit histories on each adult member of each applicant household. It is the applicant’s responsibility that at least one household member can demonstrate utilities can be put in their name. For this to be demonstrated, at least one household member must have a credit report that shows no utility accounts in default. Applicants who cannot have utilities put in their name will be considered ineligible. Any currently open bankruptcy proceeding of any of the household members will be considered a disqualifying condition. Applicants will not be considered to have a poor credit history when they were delinquent in rent because they were withholding rent due to substandard housing conditions in a manner consistent with local ordinance; or had a poor rent paying history clearly related to an excessive rent relative to their income, and responsible efforts were made to resolve the non-payment problem. If there is a finding of any kind which would negatively impact an application, the applicant will be notified in writing. The applicant then shall have 14 calendar days in which such a finding may be appealed to staff for consideration.", - "CSVFormattingType": "ohaFormat", - "depositMax": "1,781", - "depositMin": "1,284", - "programRules": "", - "externalId": null, - "waitlistMaxSize": 3000, - "name": "Coliseum Place", - "waitlistCurrentSize": 0, - "prioritiesDescriptor": "3 apartments are set-aside households eligible for the HOPWA program (Housing Opportunities for Persons with AIDS), which are households where a person has been medically diagnosed with HIV/AIDS. 15 apartments are for those with mobility impairments and one of these units also has features for the hearing/visually impaired. Two additional apartments have features for the hearing/visually impaired.", - "requiredDocuments": "Application Document Checklist: https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/Tax+Credit+Application+Interview+Checklist.pdf", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": "18", - "reservedDescriptor": null, - "status": "active", - "createdAt": "2021-05-12T15:11:26.446-08:00", - "updatedAt": "2021-05-12T11:47:47.150-08:00", - "groupId": 1, - "hideUnitFeatures": false, - "disableUnitsAccordion": true, - "applicationFee": "12", - "criminalBackground": "In the application of the City of Oakland’s Fair Chance Access to Housing Ordinance, criminal background checks will not be performed on applications for the 21 apartments not supported by the Project-Based Section 8 Vouchers (PBVs). For the 37 PBV units, the Oakland Housing Authority will perform background checks as mandated under federal and state laws.", - "leasingAgentEmail": "coliseum@jsco.net", - "leasingAgentName": "", - "leasingAgentAddress": { - "county": "Alameda", - "city": "Oakland", - "street": "1701 Martin Luther King Way", - "zipCode": "94621", - "state": "CA", - "latitude": 37.7549632, - "longitude": -122.1968792 - }, - "leasingAgentOfficeHours": "Tuesdays & Thursdays, 9:00am to 5:00pm | Persons with disabilities who are unable to access the on-line application may request a Reasonable Accommodation by calling (510) 649-5739 for assistance. A TDD line is available at (415) 345-4470.", - "leasingAgentPhone": "(510) 625-1632", - "leasingAgentTitle": "Property Manager", - "rentalHistory": "Two years' landlord history or homeless verification", - "specialNotes": "Priority Units: 3 apartments are set-aside for households eligible for the HOPWA program (Housing Opportunities for Persons with AIDS), which are households where a person has been medically diagnosed with HIV/AIDS. These 3 apartments also have Project-Based Section rental subsidies (tenant pays 30% of household income). 15 apartments are for those with mobility impairments and one of these units also has features for the hearing/visually impaired. Two additional apartments have features for the hearing/visually impaired. All units require eligibility requirements beyond income qualification: The waiting list will be ordered by incorporating the Alameda County preference for eligible households in which at least one member lives or works in the County. Three (3) apartments are restricted to households eligible under the HOPWA (Housing Opportunities for Persons with AIDS), which are households where a person has been medically diagnosed with HIV/AIDS. These apartments also receive PBV’s from OHA. For the twenty-five (25) apartments that have Project-Based Section 8 Vouchers from OHA, applicants will be called for an interview in the order according to the site-based waiting list compiled from the initial application and lotter process specifically for the PBV units. The waiting list order for these apartments will also incorporate the local preferences required by OHA. These preferences are: * A Residency preference (Applicants who live or work in the City of Oakland at the time of the application interview and/or applicants that lived or worked in the City of Oakland at the time of submitting their initial application and can verify their previous residency/employment at the applicant interview, qualify for this preference). * A Family preference (Applicant families with two or more persons, or a single person applicant that is 62 years of age or older, or a single person applicant with a disability, qualify for this preference). * A Veteran and active members of the military preference. Per OHA policy, a Veteran is a person who served in the active military, naval, or air service and who was discharged or released from such service under conditions other than dishonorable. * A Homeless preference. Applicant families who meet the McKinney-Vento Act definition of homeless qualify for this preference (see definition below). Each PBV applicant will receive one point for each preference for which it is eligible and the site-based PBV waiting list will be prioritized by the number of points applicants have from these preferences. Applicants for the PBV units must comply with OHA’s policy regarding Social Security Numbers. The applicant and all members of the applicant’s household must disclose the complete and accurate social security number (SSN) assigned to each household member, and they must provide the documentation necessary to verify each SSN. As an EveryOne Home partner, each applicant’s individual circumstances will be evaluated, alternative forms of verification and additional information submitted by the applicant will considered, and reasonable accommodations will be provided when requested and if verified and necessary. Persons with disabilities are encouraged to apply.", - "preferences": [ - { - "page": 1, - "ordinal": 1, - "title": "Alameda County Resident/Workforce Preference", - "subtitle": "", - "description": "Preference for eligible households in which at least one member lives or works in Alameda County.", - "links": [], - "formMetadata": { - "key": "liveWork", - "options": [ - { - "key": "live", - "extraData": [] - }, - { - "key": "work", - "extraData": [] - } - ], - "links": [ - { - "title": "Measure A1 Implementation Policies", - "url": "https://www.acgov.org/cda/documents/broadway/D-MeasureA-1-Implementation-Policies.pdf" - } - ] - } - }, - { - "page": 2, - "ordinal": 2, - "title": "Oakland Housing Authority Project-Based Voucher", - "subtitle": "", - "description": "You are currently applying to be in a general applicant waiting list at Coliseum Place. Of the total apartments available in this application process, several have Project-Based Vouchers for rental subsidy assistance from the Oakland Housing Authority. With that subsidy, tenant households pay 30% of their income as rent. These tenants are required to verify their income annually with the property manager as well as the Oakland Housing Authority. If you are interested in these apartments, the following preferences also apply.", - "links": [], - "formMetadata": { - "key": "PBV", - "customSelectText": "Please select any of the following that apply to you", - "hideGenericDecline": true, - "hideFromListing": true, - "options": [ - { - "key": "residency", - "extraData": [] - }, - { - "key": "family", - "extraData": [] - }, - { - "key": "veteran", - "extraData": [] - }, - { - "key": "homeless", - "extraData": [] - }, - { - "key": "noneApplyButConsider", - "exclusive": true, - "description": false, - "extraData": [] - }, - { - "key": "doNotConsider", - "exclusive": true, - "description": false, - "extraData": [] - } - ] - } - }, - { - "page": 3, - "ordinal": 3, - "title": "Housing Opportunities for Persons with AIDS", - "subtitle": "", - "description": "There are apartments set-aside for households eligible for the HOPWA program (Housing Opportunities for Persons with AIDS), which are households where a person has been medically diagnosed with HIV/AIDS. These apartments also have Project-Based Section rental subsidies (tenant pays 30% of household income).", - "links": [], - "formMetadata": { - "key": "HOPWA", - "customSelectText": "Please indicate if you are interested in applying for one of these HOPWA apartments", - "hideGenericDecline": true, - "hideFromListing": true, - "options": [ - { - "key": "hopwa", - "extraData": [] - }, - { - "key": "doNotConsider", - "exclusive": true, - "description": false, - "extraData": [] - } - ] - } - } - ], - "property": { - "createdAt": "2021-05-12T17:00:00.000-08:00", - "updatedAt": "2021-05-12T17:00:00.000-08:00", - "servicesOffered": "Residential supportive services are provided to all residents on a volunteer basis.", - "householdSizeMin": 1, - "householdSizeMax": 7, - "smokingPolicy": "No smoking", - "unitsAvailable": 46, - "postmarkedApplicationsReceivedByDate": "2021-06-15T11:00:00.000-07:00", - "unitsSummarized": null, - "unitAmenities": null, - "developer": "Resources for Community Development", - "yearBuilt": 2021, - "accessibility": "Fifteen (15) units are designed for residents with mobility impairments per HUD/U.F.A.S. guidelines with one (1) of these units further designed for residents with auditory or visual impairments. There are two (2) additional units with features for those with auditory or visual impairments. All the other units are adaptable. Accessible features in the property include: * 36” wide entries and doorways * Kitchens built to the accessibility standards of the California Building Code, including appliance controls and switch outlets within reach, and work surfaces and storage at accessible heights * Bathrooms built to the accessibility standards of the California Building Code, including grab bars, flexible shower spray hose, switch outlets within reach, and in-tub seats. * Closet rods and shelves at mobility height. * Window blinds/shades able to be used without grasping or twisting * Units for the Hearing & Visually Impaired will have a horn & strobe for fire alarm and a flashing light doorbell. The 44 non-ADA units are built to Adaptable standards.", - "amenities": "Community room, bike parking, courtyard off the community room, 2nd floor courtyard.", - "buildingTotalUnits": 58, - "buildingAddress": { - "county": "Alameda", - "city": "Oakland", - "street": "3300 Hawley Street", - "zipCode": "94621", - "state": "CA", - "latitude": 37.7549632, - "longitude": -122.1968792 - }, - "neighborhood": "Coliseum", - "petPolicy": "Permitted", - "units": [ - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "30", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 1, - "annualIncomeMax": "36990", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": "Mobility and Mobility with Hearing & Visual", - "reservedType": null, - "sqFeet": "486", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "30", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 1, - "annualIncomeMax": "36990", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": "Mobility and Mobility with Hearing & Visual", - "reservedType": null, - "sqFeet": "491", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "30", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 1, - "annualIncomeMax": "36990", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": "Mobility and Mobility with Hearing & Visual", - "reservedType": null, - "sqFeet": "491", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "38520", - "monthlyIncomeMin": "3210", - "floor": 1, - "annualIncomeMax": "61650", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1284", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": "Mobility and Hearing & Visual", - "reservedType": null, - "sqFeet": "491", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "30", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 1, - "annualIncomeMax": "44400", - "maxOccupancy": 4, - "minOccupancy": 2, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and Hearing & Visual", - "reservedType": null, - "sqFeet": "748", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "30", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 1, - "annualIncomeMax": "44400", - "maxOccupancy": 4, - "minOccupancy": 2, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and Hearing & Visual", - "reservedType": null, - "sqFeet": "785", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "30", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 1, - "annualIncomeMax": "44400", - "maxOccupancy": 4, - "minOccupancy": 2, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and Hearing & Visual", - "reservedType": null, - "sqFeet": "785", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "30", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 1, - "annualIncomeMax": "44400", - "maxOccupancy": 4, - "minOccupancy": 2, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and Hearing & Visual", - "reservedType": null, - "sqFeet": "785", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "30", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 1, - "annualIncomeMax": "44400", - "maxOccupancy": 4, - "minOccupancy": 2, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and Hearing & Visual", - "reservedType": null, - "sqFeet": "785", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "30", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 1, - "annualIncomeMax": "44400", - "maxOccupancy": 4, - "minOccupancy": 2, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and Hearing & Visual", - "reservedType": null, - "sqFeet": "785", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "30", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 1, - "annualIncomeMax": "44400", - "maxOccupancy": 4, - "minOccupancy": 2, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and Hearing & Visual", - "reservedType": null, - "sqFeet": "785", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "30", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 1, - "annualIncomeMax": "44400", - "maxOccupancy": 4, - "minOccupancy": 2, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and Hearing & Visual", - "reservedType": null, - "sqFeet": "785", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "30", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 1, - "annualIncomeMax": "44400", - "maxOccupancy": 4, - "minOccupancy": 2, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and Hearing & Visual", - "reservedType": null, - "sqFeet": "785", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "30", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 1, - "annualIncomeMax": "44400", - "maxOccupancy": 4, - "minOccupancy": 2, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and Hearing & Visual", - "reservedType": null, - "sqFeet": "785", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "45", - "annualIncomeMin": "41616", - "monthlyIncomeMin": "3468", - "floor": 1, - "annualIncomeMax": "66600", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1387", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "748", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "45", - "annualIncomeMin": "41616", - "monthlyIncomeMin": "3468", - "floor": 1, - "annualIncomeMax": "66600", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1387", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "748", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "46236", - "monthlyIncomeMin": "3853", - "floor": 1, - "annualIncomeMax": "74000", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1541", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "748", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "46236", - "monthlyIncomeMin": "3853", - "floor": 1, - "annualIncomeMax": "74000", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1541", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "748", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "46236", - "monthlyIncomeMin": "3853", - "floor": 1, - "annualIncomeMax": "74000", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1541", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "748", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "46236", - "monthlyIncomeMin": "3853", - "floor": 1, - "annualIncomeMax": "74000", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1541", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "748", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "46236", - "monthlyIncomeMin": "3853", - "floor": 1, - "annualIncomeMax": "74000", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1541", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "748", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "46236", - "monthlyIncomeMin": "3853", - "floor": 1, - "annualIncomeMax": "74000", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1541", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "748", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "46236", - "monthlyIncomeMin": "3853", - "floor": 1, - "annualIncomeMax": "74000", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1541", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "748", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "46236", - "monthlyIncomeMin": "3853", - "floor": 1, - "annualIncomeMax": "74000", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1541", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "748", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "46236", - "monthlyIncomeMin": "3853", - "floor": 1, - "annualIncomeMax": "74000", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1541", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "748", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "46236", - "monthlyIncomeMin": "3853", - "floor": 1, - "annualIncomeMax": "74000", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1541", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "748", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "46236", - "monthlyIncomeMin": "3853", - "floor": 1, - "annualIncomeMax": "74000", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1541", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "748", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 2, - "annualIncomeMax": "31800", - "maxOccupancy": 6, - "minOccupancy": 4, - "monthlyRent": null, - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1029", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "31800", - "maxOccupancy": 6, - "minOccupancy": 4, - "monthlyRent": null, - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1080", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 2, - "annualIncomeMax": "31800", - "maxOccupancy": 6, - "minOccupancy": 4, - "monthlyRent": null, - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1029", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "45", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 2, - "annualIncomeMax": "71550", - "maxOccupancy": 6, - "minOccupancy": 4, - "monthlyRent": null, - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1029", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "45", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 2, - "annualIncomeMax": "71550", - "maxOccupancy": 6, - "minOccupancy": 4, - "monthlyRent": null, - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1029", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "45", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 2, - "annualIncomeMax": "71550", - "maxOccupancy": 6, - "minOccupancy": 4, - "monthlyRent": null, - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1029", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 2, - "annualIncomeMax": "79500", - "maxOccupancy": 6, - "minOccupancy": 4, - "monthlyRent": null, - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1029", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 2, - "annualIncomeMax": "79500", - "maxOccupancy": 6, - "minOccupancy": 4, - "monthlyRent": null, - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1029", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 2, - "annualIncomeMax": "79500", - "maxOccupancy": 6, - "minOccupancy": 4, - "monthlyRent": null, - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1029", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 2, - "annualIncomeMax": "79500", - "maxOccupancy": 6, - "minOccupancy": 4, - "monthlyRent": null, - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1029", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 2, - "annualIncomeMax": "79500", - "maxOccupancy": 6, - "minOccupancy": 4, - "monthlyRent": null, - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1029", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 2, - "annualIncomeMax": "79500", - "maxOccupancy": 6, - "minOccupancy": 4, - "monthlyRent": null, - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1029", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "53436", - "monthlyIncomeMin": "4453", - "floor": 2, - "annualIncomeMax": "84950", - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1781", - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1029", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "53436", - "monthlyIncomeMin": "4453", - "floor": 2, - "annualIncomeMax": "84950", - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1781", - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1029", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "53436", - "monthlyIncomeMin": "4453", - "floor": 2, - "annualIncomeMax": "84950", - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1781", - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1029", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "53436", - "monthlyIncomeMin": "4453", - "floor": 2, - "annualIncomeMax": "84950", - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1781", - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1029", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "53436", - "monthlyIncomeMin": "4453", - "floor": 2, - "annualIncomeMax": "84950", - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1781", - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1029", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "53436", - "monthlyIncomeMin": "4453", - "floor": 2, - "annualIncomeMax": "84950", - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1781", - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1029", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "53436", - "monthlyIncomeMin": "4453", - "floor": 2, - "annualIncomeMax": "84950", - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1781", - "numBathrooms": 2, - "numBedrooms": 3, - "number": null, - "priorityType": "Mobility", - "reservedType": null, - "sqFeet": "1029", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - } - ] - }, - "applicationMethods": [ - { - "type": "LeasingAgent", - "acceptsPostmarkedApplications": false - }, - { - "type": "Internal", - "acceptsPostmarkedApplications": false - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "English", - "externalReference": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/Alameda+County+Coliseum+Place+App+ENG.pdf" - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "Spanish", - "externalReference": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/Alameda+County+Coliseum+Place+App+Spanish.pdf" - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "Vietnamese", - "externalReference": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/Alameda+County+Coliseum+Place+App+Viet.pdf" - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "Chinese", - "externalReference": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/Alameda+County+Coliseum+Place+App+Chinese.pdf" - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/coliseum.jpg" - } - ], - "amiChart": { - "name": "AlamedaCountyTCAC2021", - "items": [ - { - "percentOfAmi": 80, - "householdSize": 1, - "income": 76720 - }, - { - "percentOfAmi": 80, - "householdSize": 2, - "income": 87680 - }, - { - "percentOfAmi": 80, - "householdSize": 3, - "income": 98640 - }, - { - "percentOfAmi": 80, - "householdSize": 4, - "income": 109600 - }, - { - "percentOfAmi": 80, - "householdSize": 5, - "income": 11840 - }, - { - "percentOfAmi": 80, - "householdSize": 6, - "income": 127200 - }, - { - "percentOfAmi": 80, - "householdSize": 7, - "income": 135920 - }, - { - "percentOfAmi": 80, - "householdSize": 8, - "income": 144720 - }, - { - "percentOfAmi": 60, - "householdSize": 1, - "income": 57540 - }, - { - "percentOfAmi": 60, - "householdSize": 2, - "income": 65760 - }, - { - "percentOfAmi": 60, - "householdSize": 3, - "income": 73980 - }, - { - "percentOfAmi": 60, - "householdSize": 4, - "income": 82200 - }, - { - "percentOfAmi": 60, - "householdSize": 5, - "income": 88800 - }, - { - "percentOfAmi": 60, - "householdSize": 6, - "income": 95400 - }, - { - "percentOfAmi": 60, - "householdSize": 7, - "income": 101940 - }, - { - "percentOfAmi": 60, - "householdSize": 8, - "income": 108540 - }, - { - "percentOfAmi": 50, - "householdSize": 1, - "income": 47950 - }, - { - "percentOfAmi": 50, - "householdSize": 2, - "income": 54800 - }, - { - "percentOfAmi": 50, - "householdSize": 3, - "income": 61650 - }, - { - "percentOfAmi": 50, - "householdSize": 4, - "income": 68500 - }, - { - "percentOfAmi": 50, - "householdSize": 5, - "income": 74000 - }, - { - "percentOfAmi": 50, - "householdSize": 6, - "income": 79500 - }, - { - "percentOfAmi": 50, - "householdSize": 7, - "income": 84950 - }, - { - "percentOfAmi": 50, - "householdSize": 8, - "income": 90450 - }, - { - "percentOfAmi": 45, - "householdSize": 1, - "income": 43155 - }, - { - "percentOfAmi": 45, - "householdSize": 2, - "income": 49320 - }, - { - "percentOfAmi": 45, - "householdSize": 3, - "income": 55485 - }, - { - "percentOfAmi": 45, - "householdSize": 4, - "income": 61650 - }, - { - "percentOfAmi": 45, - "householdSize": 5, - "income": 66600 - }, - { - "percentOfAmi": 45, - "householdSize": 6, - "income": 71550 - }, - { - "percentOfAmi": 45, - "householdSize": 7, - "income": 76455 - }, - { - "percentOfAmi": 45, - "householdSize": 8, - "income": 81405 - }, - { - "percentOfAmi": 40, - "householdSize": 1, - "income": 38360 - }, - { - "percentOfAmi": 40, - "householdSize": 2, - "income": 43840 - }, - { - "percentOfAmi": 40, - "householdSize": 3, - "income": 49320 - }, - { - "percentOfAmi": 40, - "householdSize": 4, - "income": 54800 - }, - { - "percentOfAmi": 40, - "householdSize": 5, - "income": 59200 - }, - { - "percentOfAmi": 40, - "householdSize": 6, - "income": 63600 - }, - { - "percentOfAmi": 40, - "householdSize": 7, - "income": 67960 - }, - { - "percentOfAmi": 40, - "householdSize": 8, - "income": 72360 - }, - { - "percentOfAmi": 30, - "householdSize": 1, - "income": 28770 - }, - { - "percentOfAmi": 30, - "householdSize": 2, - "income": 32880 - }, - { - "percentOfAmi": 30, - "householdSize": 3, - "income": 36990 - }, - { - "percentOfAmi": 30, - "householdSize": 4, - "income": 41100 - }, - { - "percentOfAmi": 30, - "householdSize": 5, - "income": 44400 - }, - { - "percentOfAmi": 30, - "householdSize": 6, - "income": 47700 - }, - { - "percentOfAmi": 30, - "householdSize": 7, - "income": 50970 - }, - { - "percentOfAmi": 30, - "householdSize": 8, - "income": 54270 - }, - { - "percentOfAmi": 20, - "householdSize": 1, - "income": 19180 - }, - { - "percentOfAmi": 20, - "householdSize": 2, - "income": 21920 - }, - { - "percentOfAmi": 20, - "householdSize": 3, - "income": 24660 - }, - { - "percentOfAmi": 20, - "householdSize": 4, - "income": 27400 - }, - { - "percentOfAmi": 20, - "householdSize": 5, - "income": 29600 - }, - { - "percentOfAmi": 20, - "householdSize": 6, - "income": 31800 - }, - { - "percentOfAmi": 20, - "householdSize": 7, - "income": 33980 - }, - { - "percentOfAmi": 20, - "householdSize": 8, - "income": 36180 - } - ] - } -} diff --git a/backend/core/listing_data/corsairflats.json b/backend/core/listing_data/corsairflats.json deleted file mode 100644 index b09af9c40a..0000000000 --- a/backend/core/listing_data/corsairflats.json +++ /dev/null @@ -1,784 +0,0 @@ -{ - "id": "sz0UrxnBdAxHMdfgcgha8", - "events":[], - "accessibility": "All units are fully adaptable for people with disabilities. All common areas are fully acccessible, and the building has elevator service to all floors.", - "amenities": "Community Room, Courtyard", - "applicationAddress": { - "city": "", - "street": "", - "zipCode": "", - "state": "", - "latitude": null, - "longitude": null - }, - "applicationDueDate": "2020-04-24T16:00:00.000-07:00", - "applicationOrganization": "", - "applicationPhone": "", - "buildingAddress": { - "city": "Alameda", - "county": "Alameda", - "street": "171 W Atlantic Avenue", - "zipCode": "94501", - "state": "CA", - "latitude": 37.77985, - "longitude": -122.29315 - }, - "leasingAgentAddress": { - "street": "", - "city": "", - "state": "", - "zipCode": "", - "county": "Alameda", - "longitude": 0, - "latitude": 0 - }, - "buildingSelectionCriteria": null, - "costsNotIncluded": "", - "creditHistory": "Applicants for the waitlist lottery will be screened based on the following criteria: (A) Past performance in meeting financial obligations, especially rent paying.", - "depositMax": "", - "depositMin": "500", - "developer": "Eden Housing", - "programRules": "Rent shown is based on 2019 guidelines from the California Tax Credit Allocation Committee. These figures may change during lease up in Spring when the new 2020 rates go into effect. One two-bedroom unit at 30% AMI will have a preference for people who live or work in Alameda County.", - "externalId": null, - "waitlistMaxSize": 500, - "name": "Corsair Flats", - "neighborhood": "Alameda Point", - "waitlistCurrentSize": null, - "petPolicy": "Pets will be allowed in accordance with Eden Housing Management, Inc.’s Pet Policy. Below are the basic guidelines included in this policy; however, this is not the policy in its entirety. A pet deposit of $150 is required.Only the following types and number of pets will be allowed: (A) Dog - Maximum Number: One, Maximum Size: 25lbs; (B) Cat - Maximum Number: One (Domestic only), Maximum size: N/A, Minimum age: 6 months; (C) Birds - Maximum number: Two; (D) Fish - Maximum Aquarium Size: 20 gallons; (E) Small Mammals - including Gerbils, Hamsters, Rats, Guinea Pigs with a maximum of two) Notes: No rabbits are permitted. Only one breed of pet is allowed. For example, you may have one dog OR two birds, but not one dog plus two birds.", - "prioritiesDescriptor": null, - "requiredDocuments": "Listed on FAQ & interview letter if selected from the lottery for interview.", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": 62, - "reservedDescriptor": "Senior", - "smokingPolicy": "Corsair Flats has been designated as a non-smoking property. No smoking will be allowed anywhere in the resident apartments, common areas, or anywhere on the exterior of the property.", - "yearBuilt": 2020, - "createdAt": "2020-02-14T15:11:26.446-07:00", - "updatedAt": "2020-02-15T11:47:47.150-07:00", - "groupId": 1, - "hideUnitFeatures": false, - "disableUnitsAccordion": true, - "unitAmenities": "Full size kitchen with stove, oven, refrigerator, garbage disposal. Ceiling fan and blinds", - "applicationFee": "35.0", - "criminalBackground": "Applicants for the waitlist lottery will be screened based on the following criteria: Involvement in criminal activity on the part of any applicant household member which would adversely affect the health, safety or welfare of other residents.", - "leasingAgentName": "Eden Housing Lease-Up Team", - "leasingAgentOfficeHours": "Please call for online support in applying — Telephone assistance is available Monday through Saturday, 10 AM to 4 PM from 4/6/2020 to 4/24/2020", - "leasingAgentPhone": "510-499-2491", - "leasingAgentTitle": "", - "rentalHistory": "Applicants for the waitlist lottery will be screened based on the following criteria: A record of disturbance of neighbors, destruction of property, or living or housekeeping habits at prior residences which may adversely affect the health, safety or welfare of other residents, or cause damage to the apartment or development; A record of eviction from housing or termination from a residential program; An applicant's ability and willingness to comply with the terms of the Lease.", - "preferences": [], - "buildingTotalUnits": 29, - "units": [ - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 3, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr2", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 2, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr3", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 2, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr4", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 2, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr5", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 4, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr6", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 3, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr7", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 2, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr8", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 2, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr9", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 2, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr10", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 4, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr11", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 3, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr12", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 2, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr13", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 2, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr14", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 2, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr15", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 4, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr16", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 3, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNx17", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 2, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr18", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 2, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr19", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 1, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr20", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 4, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr21", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 2, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr22", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 2, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr23", - "amiPercentage": "60", - "annualIncomeMin": "33480", - "monthlyIncomeMin": "2790", - "floor": 4, - "annualIncomeMax": "66960", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1395", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "WLf6h7MeCnpB7EIE6EH_1", - "amiPercentage": "30", - "annualIncomeMin": "20088", - "monthlyIncomeMin": "1674", - "floor": 4, - "annualIncomeMax": "80340", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "837", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "770", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "0jYaOyFTpOI8PA9UvXJO1", - "amiPercentage": "60", - "annualIncomeMin": "40176", - "monthlyIncomeMin": "3348", - "floor": 2, - "annualIncomeMax": "80340", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1674", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "770", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updateAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "0jYaOyFTpOI8PA9UvXJO2", - "amiPercentage": "60", - "annualIncomeMin": "40176", - "monthlyIncomeMin": "3348", - "floor": 2, - "annualIncomeMax": "80340", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1674", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "770", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updateAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "0jYaOyFTpOI8PA9UvXJO3", - "amiPercentage": "60", - "annualIncomeMin": "40176", - "monthlyIncomeMin": "3348", - "floor": 2, - "annualIncomeMax": "80340", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1674", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "770", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updateAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "0jYaOyFTpOI8PA9UvXJO4", - "amiPercentage": "60", - "annualIncomeMin": "40176", - "monthlyIncomeMin": "3348", - "floor": 3, - "annualIncomeMax": "80340", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1674", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "770", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updateAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "0jYaOyFTpOI8PA9UvXJO5", - "amiPercentage": "60", - "annualIncomeMin": "40176", - "monthlyIncomeMin": "3348", - "floor": 4, - "annualIncomeMax": "80340", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1674", - "numBathrooms": 1, - "numBedrooms": 2, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "770", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updateAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - } - ], - "unitsAvailable": 29, - "applicationMethods": [ - { - "type": "ExternalLink", - "acceptsPostmarkedApplications": false, - "fileId": "https://www.on-site.com/apply/property/320531" - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/cosairflats.jpg" - } - ] -} diff --git a/backend/core/listing_data/eastlake-never-launched.json b/backend/core/listing_data/eastlake-never-launched.json deleted file mode 100644 index a7189287fd..0000000000 --- a/backend/core/listing_data/eastlake-never-launched.json +++ /dev/null @@ -1,166 +0,0 @@ -{ - "id": "sz0UrxnBaSdgeSdfgcgha8", - "events":[], - "accessibility": "This site is not wheelchair accessible, however, all Reasonable Accommodations will be considered.", - "amenities": "On-site laundry", - "applicationAddress": { - "city": "", - "street": "", - "zipCode": "", - "state": "", - "latitude": null, - "longitude": null - }, - "applicationDueDate": null, - "applicationOpenDate": "2020-06-09T00:00:00.000Z", - "applicationOrganization": "", - "applicationPhone": "", - "buildingAddress": { - "city": "Oakland", - "county": "Alameda Listings Never Launched", - "street": "2505 10th Avenue", - "zipCode": "94606", - "state": "CA", - "latitude": 37.799484, - "longitude": -122.239349 - }, - "buildingSelectionCriteria": "https://ebaldc.org/how-to-apply/residential-selection-criteria", - "costsNotIncluded": "Application fee waived for Section 8 Voucher holders. Unit Holding Fee (upon meeting tenancy requirements & before criminal background check): $250 Residents responsible for PG&E and Internet. Owner pays for water, trash and sewage. Residents are encouraged to obtain renter's insurance at their own cost but it is not a requirement.", - "creditHistory": "Credit Reports are used to verify that the applicant is free of debt on items pertaining to the habitablity of a unit, i.e. eletricity/gas bills, water bills, etc.", - "depositMax": "1811.00", - "depositMin": "1811.00", - "developer": "EBALDC", - "programRules": "Rent shown is based on 2019 guidelines from the California Tax Credit Allocation Committee. These figures may change during lease up in Spring when the new 2020 rates go into effect.", - "externalId": null, - "waitlistMaxSize": null, - "name": "Eastlake Apartments", - "neighborhood": "Eastlake", - "waitlistCurrentSize": null, - "petPolicy": "No pets allowed. All requests for Reasonable Accommodations will be considered.", - "prioritiesDescriptor": null, - "requiredDocuments": "Listed on the interview letter if selected.", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": null, - "reservedDescriptor": null, - "smokingPolicy": "No Smoking Building", - "yearBuilt": 2020, - "createdAt": "2020-05-14T15:11:26.446-07:00", - "updatedAt": "2020-05-14T11:47:47.150-07:00", - "groupId": 1, - "hideUnitFeatures": false, - "disableUnitsAccordion": true, - "unitAmenities": "Units include a full size kitchen with refrigerator, oven range and stove", - "applicationFee": "26.00", - "criminalBackground": "Applicants will be denied for the following: 1) History of manufacturing methamphetamines on federal property and 2) Lifetime sex offender registration", - "leasingAgentEmail": "iterriquez@ebaldc.org", - "leasingAgentName": "Israel Terriquez", - "leasingAgentAddress": { - "city": "Oakland", - "street": "1825 San Pablo Ave., Suite 200", - "zipCode": "94612", - "state": "CA", - "latitude": 37.808381, - "longitude": -122.27284 - }, - "leasingAgentOfficeHours": "Monday - Friday, 9:00 am - 5:00 pm", - "leasingAgentPhone": "510-287-5353 x350", - "leasingAgentTitle": "", - "rentalHistory": "Both the current and previous landlords for the past three (3) years will be contacted by mail or fax for information concerning the history of complying with lease requirements, payment records, damage or destruction of property, interference with the rights of others, or failure to maintain the unit in a healthy, safe and sanitary. Additionally, EBALDC will verify past tenant history of the applicant household within its own portfolio. Absence of prior rental history will not automatically disqualify an otherwise eligible applicant. EBALDC, however, may request alternative means of verifying prior residence or lack of residence, as well as request provision of personal references. Applicants may be denied due to 1) A negative unlawful detainer report indicating failure to meet financial obligations in past tenant history, or a recent eviction within the past 5 years, and 2) A negative landlord recommendation, encompassing failure to comply with the lease; poor payment history; failure to maintain the unit in a healthy, safe, and sanitary condition; crimes of violence to persons; destruction or theft of property; sales of narcotics; eviction for cause or other criminal acts which would adversely affect the health, safety, or welfare of other tenants.", - "preferences": [], - "buildingTotalUnits": 35, - "units": [ - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "51743.0", - "monthlyIncomeMin": "4312.0", - "floor": null, - "annualIncomeMax": "$69,440 - $89,280", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1811.0", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr2", - "amiPercentage": "80", - "annualIncomeMin": "51743.0", - "monthlyIncomeMin": "4312.0", - "floor": null, - "annualIncomeMax": "$69,440 - $89,280", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1811.0", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr3", - "amiPercentage": "80", - "annualIncomeMin": "51743.0", - "monthlyIncomeMin": "4312.0", - "floor": null, - "annualIncomeMax": "$69,440 - $89,280", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1811.0", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "sz0UrxnBdAxHMdfgcgha8", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - } - ], - "unitsAvailable": 3, - "whatToExpect": { - "applicantsWillBeContacted": "Applicants will be contacted on a first come first serve basis until vacancies are filled.", - "allInfoWillBeVerified": "All of the information that you have provided will be verified and your eligibility confirmed. Your application will be removed if you have made any fraudulent statements, or if any household member appears on more than one application for this listing. If we cannot verify a housing preference that you have claimed, you will not receive the preference but will not be otherwise penalized.", - "bePreparedIfChosen": "Should your application be chosen, be prepared to fill out a more detailed application and provide required supporting documents within 5 days of being contacted." - }, - "applicationMethods": [ - { - "type": "ExternalLink", - "acceptsPostmarkedApplications": false, - "externalReference": "https://www.ebaldchaf.com" - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/eastlake.jpg" - } - ] -} diff --git a/backend/core/listing_data/fosters_landing.json b/backend/core/listing_data/fosters_landing.json deleted file mode 100644 index 0b48abf8d8..0000000000 --- a/backend/core/listing_data/fosters_landing.json +++ /dev/null @@ -1,241 +0,0 @@ -{ - "id": "6b168bf0-0cf8-0139-7cff-2683e7458fb7", - "events":[], - "accessibility": "", - "amenities": "Fitness center, three pools and spas, basketball courts, tennis courts and playground", - "applicationDueDate": "2019-12-31T17:00:00.000Z", - "applicationOrganization": "700 Bounty Drive", - "applicationAddress": { - "city": "Foster City", - "zipCode": "94404", - "state": "CA", - "street": "700 Bounty Drive", - "latitude": 37.5559677, - "longitude": -122.26385910564855 - }, - "applicationPhone": "(650) 574-0630", - "buildingAddress": { - "city": "Foster City", - "county": "San Mateo", - "state": "CA", - "street": "700 Bounty Drive", - "zipCode": "94404", - "latitude": 37.5559677, - "longitude": -122.26385910564855 - }, - "buildingSelectionCriteria": "", - "costsNotIncluded": "Residents are responsible for PGE, Water/Sewer/Trash. Residents are given an allowance to offset the Water/Sewer/Trash. Late Fee is $85 and NSF is $25. ", - "creditHistory": "Background/Credit will be processed by a 3rd party", - "depositMax": "800.0", - "depositMin": "400.0", - "developer": "Essex", - "imageUrl": "/images/fosters.jpg", - "programRules": "The Below Market Rate (BMR) rent program will expire at the end of Dec 31, 2022. Applicants must adhere to minimum & maximum income limits. Tenant Selection Criteria applies.", - "externalId": null, - "waitlistMaxSize": null, - "name": "Foster's Landing", - "neighborhood": "Foster City", - "waitlistCurrentSize": null, - "petPolicy": "Dogs and indoor cats are welcomed. Up to two pets per home, upon approval. Breed/cross breeds are not allowed for the following: pit bull, staffordshire terrier, doberman, rottweiler, chow, german shepherd, husky, mastiff, great dane, malamute, akita and wolf hybrids. Monthly pet rent is $50 for cats and $75 for dogs. Additional deposit of $500 for up to two pets.", - "prioritiesDescriptor": null, - "requiredDocuments": "Copies of Federal and State income tax returns. Copies of W2 and 1099 forms. Copies of 4 most recent paystubs. Copies of 4 most recent bank statements, including checking, savings, CDs, etc. Letter verification of current Social Secuity Income or SSI income. Verification of ITA distribution. Proof of government ID. ", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": null, - "reservedDescriptor": null, - "smokingPolicy": "Non-Smoking Property", - "yearBuilt": null, - "createdAt": "2019-10-19T17:00:00.000Z", - "updatedAt": "2019-10-19T17:00:00.000Z", - "groupId": 2, - "hideUnitFeatures": false, - "unitAmenities": "Washer/Dryer and dishwasher", - "applicationFee": "48.0", - "criminalBackground": "Background/Credit will be processed by a 3rd party", - "leasingAgentAddress": { - "city": "Foster City", - "state": "CA", - "street": "700 Bounty Drive", - "zipCode": "94404", - "latitude": 37.5559677, - "longitude": -122.26385910564855 - }, - "leasingAgentEmail": "flanding@essex.com", - "leasingAgentName": "Foster's Landing", - "leasingAgentOfficeHours": "Monday, Tuesday, Thursday & Friday 9am - 6pm\nWednesday 10 am - 6pm Sunday 11am - 4pm", - "leasingAgentPhone": "(650) 574-0630", - "leasingAgentTitle": "Leasing Agent", - "rentalHistory": "No eviction or landlord judgement.", - "buildingTotalUnits": 6, - "postmarkedApplicationsReceivedByDate": null, - "totalUnits": 6, - "unitsAvailable": 6, - "units": [ - { - "id": "6b168c60-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "120.0", - "annualIncomeMin": "86175.0", - "monthlyIncomeMin": "7181.25", - "floor": 1, - "annualIncomeMax": "114900.0", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 1, - "number": "1106", - "priorityType": null, - "reservedType": null, - "sqFeet": "725", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2019-10-28T17:00:00.000Z", - "updatedAt": "2019-10-28T17:00:00.000Z", - "listingId": 7, - "amiChartId": 1, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "6b168ca0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "120.0", - "annualIncomeMin": "86175.0", - "monthlyIncomeMin": "7181.25", - "floor": 1, - "annualIncomeMax": "114900.0", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 1, - "number": "3006", - "priorityType": null, - "reservedType": null, - "sqFeet": "725", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2019-10-28T17:00:00.000Z", - "updatedAt": "2019-10-28T17:00:00.000Z", - "listingId": 7, - "amiChartId": 1, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "6b168cc0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "120.0", - "annualIncomeMin": "86175.0", - "monthlyIncomeMin": "7181.25", - "floor": 2, - "annualIncomeMax": "114900.0", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 1, - "number": "3610", - "priorityType": null, - "reservedType": null, - "sqFeet": "725", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2019-10-28T17:00:00.000Z", - "updatedAt": "2019-10-28T17:00:00.000Z", - "listingId": 7, - "amiChartId": 1, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "6b168ce0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "120.0", - "annualIncomeMin": "86175.0", - "monthlyIncomeMin": "7181.25", - "floor": 1, - "annualIncomeMax": "114900.0", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 1, - "number": "3007", - "priorityType": null, - "reservedType": null, - "sqFeet": "635", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2019-10-28T17:00:00.000Z", - "updatedAt": "2019-10-28T17:00:00.000Z", - "listingId": 7, - "amiChartId": 1, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "6b168d00-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "120.0", - "annualIncomeMin": "86175.0", - "monthlyIncomeMin": "7181.25", - "floor": 2, - "annualIncomeMax": "114900.0", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 1, - "number": "2609", - "priorityType": null, - "reservedType": null, - "sqFeet": "635", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2019-10-28T17:00:00.000Z", - "updatedAt": "2019-10-28T17:00:00.000Z", - "listingId": 7, - "amiChartId": 1, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "6b168d20-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "120.0", - "annualIncomeMin": "86175.0", - "monthlyIncomeMin": "7181.25", - "floor": 3, - "annualIncomeMax": "114900.0", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": 1, - "number": "3215", - "priorityType": null, - "reservedType": null, - "sqFeet": "635", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2019-10-28T17:00:00.000Z", - "updatedAt": "2019-10-28T17:00:00.000Z", - "listingId": 7, - "amiChartId": 1, - "monthlyRentAsPercentOfIncome": "30" - } - ], - "preferences": [ - - ], - "applicationMethods": [ - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "externalReference": "http://bit.ly/2BPv52T", - "label": "English" - }, - { - "type": "PaperPickup", - "acceptsPostmarkedApplications": false - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/fosters.jpg" - } - ] -} diff --git a/backend/core/listing_data/gish_apartments.json b/backend/core/listing_data/gish_apartments.json deleted file mode 100644 index 975a5a615d..0000000000 --- a/backend/core/listing_data/gish_apartments.json +++ /dev/null @@ -1,532 +0,0 @@ -{ - "id": "6b171a00-0cf8-0139-7cff-2683e7458fb7", - "events":[], - "accessibility": "Accessibility features in common areas like lobby – wheelchair ramps, wheelchair accessible bathrooms and elevators.", - "amenities": "Community Room, Laundry", - "applicationDueDate": "2020-03-13T15:00:00.000-07:00", - "applicationOrganization": "35 East Gish Road", - "applicationAddress": { - "city": "San Jose", - "county": "San Jose", - "zipCode": "95112", - "state": "CA", - "street": "35 East Gish Road", - "latitude": 37.3361905, - "longitude": -121.8905833 - }, - "applicationPhone": "(408) 436-8972", - "buildingAddress": { - "city": "San Jose", - "county": "San Jose", - "state": "CA", - "street": "35 East Gish Road", - "zipCode": "95112", - "latitude": 37.362111375995774, - "longitude": -121.90912053139034 - }, - "buildingSelectionCriteria": "http://bit.ly/sj-bsc-gish", - "costsNotIncluded": "Residents responsible for PG&E and Internet. Residents encouraged to obtain renter’s insurance but this is not a requirement. Rent is due by the 5th of each month. Late fee is $20.00. Owner pays for water, trash, and sewage. Resident to pay $25 for each returned check or rejected electronic payment.", - "creditHistory": "A credit reference and background check will be required for all household members age 18 or older. A poor credit history may be grounds to deem an applicant ineligible for housing. Applicants will have the option to explain mitigating circumstances and/or include supplemental information with their application to explain any issues such as foreclosure, bankruptcy and negative credit. Any of the following circumstances may be defined as Poor Credit History or grounds for denial: \n• Total unmet credit problems in excess of $3,000. \n• A bankruptcy (within the last three years).\n• A total of seven (7) unmet credit problems of any value.\n• An Unlawful Detainer and/or judgment against an applicant obtained by the current or any previous landlord.\n• An unmet obligation owed to previous landlord.\n• The applicant must have made timely payments of last year’s rental payments.", - "depositMax": "1500.0", - "depositMin": "800.0", - "developer": "First Community Housing | Managed by The John Stewart Company (DRE#654505)", - "imageUrl": "/images/gish.jpg", - "programRules": "Applications for the open waitlist will be accepted on a rolling basis and will be added in the order that it is received.", - "externalId": null, - "waitlistMaxSize": 150, - "name": "Gish Apartments", - "neighborhood": "San Jose", - "waitlistCurrentSize": 89, - "petPolicy": "No Pets Allowed", - "prioritiesDescriptor": null, - "requiredDocuments": "3 Months Paystubs or Award Letter for Social Security, 6 Months Bank Statements, 401K/ Retirement Statement dated with in 120 days.", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": null, - "reservedDescriptor": [ - { - "name": "Special needs / multi-family" - } - ], - "smokingPolicy": "No Smoking Building", - "yearBuilt": 2009, - "createdAt": "2019-06-19T15:11:26.446Z", - "updatedAt": "2019-02-19T10:47:47.150Z", - "groupId": 1, - "hideUnitFeatures": false, - "disableUnitsAccordion": true, - "unitAmenities": "Dishwasher", - "applicationFee": "38.0", - "criminalBackground": "A check will be made of criminal conviction records for the past seven years for all adult Applicants of the household. Reports will be obtained from local and/or state records and may also include local Police records. If the Applicant has resided in a state other than California and has a past felony conviction, a report will be required from that state or federal organization. Generally, public records of this sort are only available for the past seven (7) years. However, if information becomes known during the screening process regarding criminal activity that happened before the past seven year period which could impact the Applicant household’s eligibility to live at the property, the Management Agent reserves the right to consider this information as well. . Serious felony offenses and/or continued and ongoing criminal activity will be grounds for rejection if such offenses involve physical violence to persons or property, domestic violence, sexual abuse, the manufacture or sale narcotics, possession of an illegal weapon, breaking and entering, burglary or drug related criminal offenses. The nature, severity and recency of such offenses and/or ongoing criminal activity will be considered when reviewing the Applicant and only those potentially impacting the health, safety, security or right to peaceful enjoyment of the property of and by other residents, visitors or employees will be considered. Additionally, applicants may be rejected due to: • A history of violence or abuse (physical or verbal), in which the applicant was determined to be the antagonist.\n• A household in which any member is currently engaged in illegal use of drugs or for which the owner has reasonable cause to believe that a member’s illegal use or pattern of use of a drug may interfere with the health, safety, security, or right to peaceful enjoyment of the property of and by other residents, visitors or employees.\n• Any household member, if there is reasonable cause to believe that a member’s behavior, from abuse or pattern of abuse of alcohol, may interfere with the health, safety, security or right to peaceful enjoyment of the property of and by other residents, visitors or employees.", - "leasingAgentAddress": { - "city": "San Jose", - "county": "San Jose", - "state": "CA", - "street": "35 East Gish Road", - "zipCode": "95112", - "latitude": 37.362111375995774, - "longitude": -121.90912053139034 - }, - "leasingAgentEmail": "gish@jsco.net", - "leasingAgentName": "Jonaye Wilbert", - "leasingAgentOfficeHours": "Monday-Friday, 9:00 am - 3:00 pm", - "leasingAgentPhone": "(408) 436-8972", - "leasingAgentTitle": null, - "rentalHistory": "The applicants’ landlord references must verify a history of responsible occupancy, behavior, and conduct. Current landlord references will be requested along with a third party unlawful detainer search. All previous landlords during the past three years will also be contacted. Landlord references will help to determine whether or not the applicant has a good rent paying history, whether or not there have been any disturbing behavior patterns including repeated lease violations, destruction of property, etc. Any documented behavior which would constitute a material violation of the standard lease to be used at this location may be considered grounds for ineligibility.", - "buildingTotalUnits": 22, - "postmarkedApplicationsReceivedByDate": null, - "totalUnits": 18, - "unitsAvailable": 0, - "units": [ - { - "id": "6b171a50-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "25628.0", - "monthlyIncomeMin": "2135.0", - "floor": 4, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "854.0", - "numBathrooms": null, - "numBedrooms": null, - "number": "406", - "priorityType": null, - "reservedType": null, - "sqFeet": "355", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-06-25T10:27:38.397Z", - "updatedAt": "2019-06-25T10:28:02.659Z", - "listingId": 4, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b171a80-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "36060.0", - "monthlyIncomeMin": "3005.0", - "floor": 4, - "annualIncomeMax": "52695.0", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1202.0", - "numBathrooms": null, - "numBedrooms": 2, - "number": "407", - "priorityType": null, - "reservedType": null, - "sqFeet": "795", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2020-01-28T16:00:00.000Z", - "updatedAt": "2020-01-28T16:00:00.000Z", - "listingId": 4, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b171aa0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "25628.0", - "monthlyIncomeMin": "2135.0", - "floor": 4, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "854.0", - "numBathrooms": null, - "numBedrooms": null, - "number": "403", - "priorityType": null, - "reservedType": null, - "sqFeet": "355", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-06-25T10:27:23.985Z", - "updatedAt": "2019-06-25T10:27:23.985Z", - "listingId": 4, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b171ac0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "39960.0", - "monthlyIncomeMin": "3330.0", - "floor": 4, - "annualIncomeMax": "59265.0", - "maxOccupancy": 7, - "minOccupancy": 3, - "monthlyRent": "1332.0", - "numBathrooms": null, - "numBedrooms": 3, - "number": "400", - "priorityType": null, - "reservedType": null, - "sqFeet": "1029", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2020-01-28T16:00:00.000Z", - "updatedAt": "2020-01-28T16:00:00.000Z", - "listingId": 4, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b171ad0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "39960.0", - "monthlyIncomeMin": "3330.0", - "floor": 3, - "annualIncomeMax": "59265.0", - "maxOccupancy": 7, - "minOccupancy": 3, - "monthlyRent": "1332.0", - "numBathrooms": null, - "numBedrooms": 3, - "number": "311", - "priorityType": null, - "reservedType": null, - "sqFeet": "1029", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2020-01-28T16:00:00.000Z", - "updatedAt": "2020-01-28T16:00:00.000Z", - "listingId": 4, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b171bf0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "39960.0", - "monthlyIncomeMin": "3330.0", - "floor": 3, - "annualIncomeMax": "59265.0", - "maxOccupancy": 7, - "minOccupancy": 3, - "monthlyRent": "1332.0", - "numBathrooms": null, - "numBedrooms": 3, - "number": "301", - "priorityType": null, - "reservedType": null, - "sqFeet": "1029", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2020-01-28T16:00:00.000Z", - "updatedAt": "2020-01-28T16:00:00.000Z", - "listingId": 4, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b171c10-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "39960.0", - "monthlyIncomeMin": "3330.0", - "floor": 2, - "annualIncomeMax": "59265.0", - "maxOccupancy": 7, - "minOccupancy": 3, - "monthlyRent": "1332.0", - "numBathrooms": null, - "numBedrooms": 3, - "number": "210", - "priorityType": null, - "reservedType": null, - "sqFeet": "1029", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2020-01-28T16:00:00.000Z", - "updatedAt": "2020-01-28T16:00:00.000Z", - "listingId": 4, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b171c30-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "39960.0", - "monthlyIncomeMin": "3330.0", - "floor": 2, - "annualIncomeMax": "59265.0", - "maxOccupancy": 7, - "minOccupancy": 3, - "monthlyRent": "1332.0", - "numBathrooms": null, - "numBedrooms": 3, - "number": "200", - "priorityType": null, - "reservedType": null, - "sqFeet": "1029", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2020-01-28T16:00:00.000Z", - "updatedAt": "2020-01-28T16:00:00.000Z", - "listingId": 4, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b171c50-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "36060.0", - "monthlyIncomeMin": "3005.0", - "floor": 4, - "annualIncomeMax": "52695.0", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1202.0", - "numBathrooms": null, - "numBedrooms": 2, - "number": "409", - "priorityType": null, - "reservedType": null, - "sqFeet": "795", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2020-01-28T16:00:00.000Z", - "updatedAt": "2020-01-28T16:00:00.000Z", - "listingId": 4, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b171c60-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "36060.0", - "monthlyIncomeMin": "3005.0", - "floor": 4, - "annualIncomeMax": "52695.0", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1202.0", - "numBathrooms": null, - "numBedrooms": 2, - "number": "408", - "priorityType": null, - "reservedType": null, - "sqFeet": "795", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2020-01-28T16:00:00.000Z", - "updatedAt": "2020-01-28T16:00:00.000Z", - "listingId": 4, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b171c80-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "36060.0", - "monthlyIncomeMin": "3005.0", - "floor": 3, - "annualIncomeMax": "52695.0", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1202.0", - "numBathrooms": null, - "numBedrooms": 2, - "number": "309", - "priorityType": null, - "reservedType": null, - "sqFeet": "795", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2020-01-28T16:00:00.000Z", - "updatedAt": "2020-01-28T16:00:00.000Z", - "listingId": 4, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b171c90-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "36060.0", - "monthlyIncomeMin": "3005.0", - "floor": 3, - "annualIncomeMax": "52695.0", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1202.0", - "numBathrooms": null, - "numBedrooms": 2, - "number": "308", - "priorityType": null, - "reservedType": null, - "sqFeet": "795", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2020-01-28T16:00:00.000Z", - "updatedAt": "2020-01-28T16:00:00.000Z", - "listingId": 4, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b171cb0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "36060.0", - "monthlyIncomeMin": "3005.0", - "floor": 3, - "annualIncomeMax": "52695.0", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1202.0", - "numBathrooms": null, - "numBedrooms": 2, - "number": "302", - "priorityType": null, - "reservedType": null, - "sqFeet": "795", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2020-01-28T16:00:00.000Z", - "updatedAt": "2020-01-28T16:00:00.000Z", - "listingId": 4, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b171cd0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "36060.0", - "monthlyIncomeMin": "3005.0", - "floor": 2, - "annualIncomeMax": "52695.0", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1202.0", - "numBathrooms": null, - "numBedrooms": 2, - "number": "208", - "priorityType": null, - "reservedType": null, - "sqFeet": "795", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2020-01-28T16:00:00.000Z", - "updatedAt": "2020-01-28T16:00:00.000Z", - "listingId": 4, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b171cf0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "36060.0", - "monthlyIncomeMin": "3005.0", - "floor": 2, - "annualIncomeMax": "52695.0", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1202.0", - "numBathrooms": null, - "numBedrooms": 2, - "number": "207", - "priorityType": null, - "reservedType": null, - "sqFeet": "795", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2020-01-28T16:00:00.000Z", - "updatedAt": "2020-01-28T16:00:00.000Z", - "listingId": 4, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b171d00-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "25628.0", - "monthlyIncomeMin": "2135.0", - "floor": 3, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "854.0", - "numBathrooms": null, - "numBedrooms": null, - "number": "303", - "priorityType": null, - "reservedType": null, - "sqFeet": "355", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-06-25T10:27:12.228Z", - "updatedAt": "2019-06-25T10:27:12.228Z", - "listingId": 4, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b171d20-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "25628.0", - "monthlyIncomeMin": "2135.0", - "floor": 2, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "854.0", - "numBathrooms": null, - "numBedrooms": null, - "number": "206", - "priorityType": null, - "reservedType": null, - "sqFeet": "355", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-06-25T10:26:59.698Z", - "updatedAt": "2019-06-25T10:26:59.698Z", - "listingId": 4, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b171d40-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "25628.0", - "monthlyIncomeMin": "2135.0", - "floor": 2, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "854.0", - "numBathrooms": null, - "numBedrooms": null, - "number": "205", - "priorityType": null, - "reservedType": null, - "sqFeet": "355", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-06-20T14:20:34.291Z", - "updatedAt": "2019-06-25T10:26:21.072Z", - "listingId": 4, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - } - ], - "preferences": [ - - ], - "applicationMethods": [ - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "externalReference": "http://bit.ly/sj-app-gish", - "label": "English" - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/gish.jpg" - } - ] -} diff --git a/backend/core/listing_data/gish_apartments_2.json b/backend/core/listing_data/gish_apartments_2.json deleted file mode 100644 index c3928079ff..0000000000 --- a/backend/core/listing_data/gish_apartments_2.json +++ /dev/null @@ -1,243 +0,0 @@ -{ - "id": "6b172ba0-0cf8-0139-7cff-2683e7458fb7", - "events":[], - "accessibility": "Accessibility features in common areas like lobby – wheelchair ramps, wheelchair accessible bathrooms and elevators.", - "amenities": "Community Room, Laundry", - "applicationAddress": { - "city": "San Jose", - "street": "35 East Gish Road", - "zipCode": "95112", - "state": "CA", - "latitude": 37.36219, - "longitude": -121.909447 - }, - "applicationDueDate": "2019-12-09T12:58:21.000-07:00", - "applicationOrganization": "35 East Gish Road", - "applicationPhone": "(408) 436-8972", - "buildingAddress": { - "city": "San Jose", - "street": "35 East Gish Road", - "zipCode": "95112", - "state": "CA", - "latitude": 37.36219, - "longitude": -121.909447 - }, - "buildingSelectionCriteria": null, - "costsNotIncluded": "Residents responsible for PG&E and Internet. Residents encourage to obtain renter’s insurance but this is not a requirement. Rent is due by the 5rd of each month. Late fee is $20.00. Owner pays for water, trash, and sewage. Resident to pay $25 for each returned check or rejected electronic payment.", - "creditHistory": "A credit reference and background check will be required for all household members age 18 or older. A poor credit history may be grounds to deem an applicant ineligible for housing. Applicants will have the option to explain mitigating circumstances and/or include supplemental information with their application to explain any issues such as foreclosure, bankruptcy and negative credit.\n\nAny of the following circumstances may be defined as Poor Credit History or grounds for denial: \n\n* Total unmet credit problems in excess of $3,000. \n* A bankruptcy (within the last three years).\n* A total of seven (7) unmet credit problems of any value.\n* An Unlawful Detainer and/or judgment against an applicant obtained by the current or any previous landlord.\n* An unmet obligation owed to previous landlord.\n* The applicant must have made timely payments of last year’s rental payments.", - "depositMax": "1500.0", - "depositMin": "800.0", - "developer": "First Community Housing", - "imageUrl": "/images/gish.jpg", - "programRules": null, - "externalId": null, - "waitlistMaxSize": 150, - "name": "Gish Apartments 2", - "neighborhood": "San Jose", - "waitlistCurrentSize": 89, - "petPolicy": "No Pets Allowed", - "prioritiesDescriptor": null, - "requiredDocuments": "3 Months Paystubs or Award Letter for Social Security, 6 Months Bank Statements, 401K/ Retirement Statement dated with in 120 days.", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": null, - "reservedDescriptor": "Special needs / multi-family", - "smokingPolicy": "No Smoking Building", - "yearBuilt": 2009, - "createdAt": "2019-06-19T15:11:26.446-07:00", - "updatedAt": "2019-06-24T11:47:47.150-07:00", - "groupId": 1, - "hideUnitFeatures": false, - "unitAmenities": "Dishwasher", - "applicationFee": "38.0", - "criminalBackground": "A check will be made of criminal conviction records for the past seven years for all adult Applicants of the household. Reports will be obtained from local and/or state records and may also include local Police records. If the Applicant has resided in a state other than California and has a past felony conviction, a report will be required from that state or federal organization. Generally, public records of this sort are only available for the past seven (7) years. However, if information becomes known during the screening process regarding criminal activity that happened before the past seven year period which could impact the Applicant household’s eligibility to live at the property, the Management Agent reserves the right to consider this information as well.\n\nSerious felony offenses and/or continued and ongoing criminal activity will be grounds for rejection if such offenses involve physical violence to persons or property, domestic violence, sexual abuse, the manufacture or sale narcotics, possession of an illegal weapon, breaking and entering, burglary or drug related criminal offenses. The nature, severity and recency of such offenses and/or ongoing criminal activity will be considered when reviewing the Applicant and only those potentially impacting the health, safety, security or right to peaceful enjoyment of the property of and by other residents, visitors or employees will be considered.\n\nAdditionally, applicants may be rejected due to:\n\n* A history of violence or abuse (physical or verbal), in which the applicant was determined to be the antagonist.\n* A household in which any member is currently engaged in illegal use of drugs or for which the owner has reasonable cause to believe that a member’s illegal use or pattern of use of a drug may interfere with the health, safety, security, or right to peaceful enjoyment of the property of and by other residents, visitors or employees.\n* Any member, if there is reasonable cause to believe that a member’s behavior, from abuse or pattern of abuse of alcohol, may interfere with the health, safety, security or right to peaceful enjoyment of the property of and by other residents, visitors or employees.", - "leasingAgentAddress": { - "city": "San Jose", - "street": "35 East Gish Road", - "zipCode": "95112", - "state": "CA", - "latitude": 37.36219, - "longitude": -121.909447 - }, - "leasingAgentEmail": "gish@jsco.net", - "leasingAgentName": "Jonaye Wilbert", - "leasingAgentOfficeHours": "Monday-Friday, 9:00 am - 3:00 pm", - "leasingAgentPhone": "(408) 436-8972", - "leasingAgentTitle": "", - "rentalHistory": "The applicants’ landlord references must verify a history of responsible occupancy, behavior, and conduct. Current landlord references will be requested along with a third party unlawful detainer search. All previous landlords during the past three years will also be contacted. Landlord references will help to determine whether or not the applicant has a good rent paying history, whether or not there have been any disturbing behavior patterns including repeated lease violations, destruction of property, etc. Any documented behavior which would constitute a material violation of the standard lease to be used at this location may be considered grounds for ineligibility.", - "preferences": [ - { - "ordinal": 1, - "title": "Certificate of Preference (COP)", - "subtitle": "Up to 56 units available", - "description": "For households in which at least one member holds a Certificate of Preference from the former San Francisco Redevelopment Agency. COP holders were displaced by Agency action generally during the 1960s and 1970s.", - "links": [ - { - "title": "Read More", - "url": "https://domain.com" - } - ] - }, - { - "ordinal": 2, - "title": "Displaced Tenant Housing Preference (DTHP)", - "subtitle": "Up to 3 units available", - "description": "For households in which at least one member holds a Displaced Tenant Housing Preference Certificate. DTHP Certificate holders are tenants who were evicted through either an Ellis Act Eviction or an Owner Move In Eviction, or have been displaced by a fire. Once all units reserved for this preference are filled, remaining DTHP holders will receive Live/Work preference, regardless of their current residence or work location.", - "links": [ - { - "title": "Read More", - "url": "https://domain.com" - }, - { - "title": "View Document Checklist", - "url": "https://domain.com/d" - } - ] - }, - { - "ordinal": 3, - "title": "Classroom teachers who are employees of the San Mateo Foster City School District and San Mateo County Community College District" - } - ], - "buildingTotalUnits": 5, - "disableUnitsAccordion": true, - "units": [ - { - "id": "6b172bf0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "25628.0", - "monthlyIncomeMin": "2135.0", - "floor": 2, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "854.0", - "numBathrooms": null, - "numBedrooms": null, - "number": "205", - "priorityType": null, - "reservedType": null, - "sqFeet": "355", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-06-20T21:20:34.291Z", - "updatedAt": "2019-06-25T17:26:21.072Z", - "listingId": "sz0UrxnBdAxHMdfgcgha7", - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b172c10-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "25628.0", - "monthlyIncomeMin": "2135.0", - "floor": 2, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "854.0", - "numBathrooms": null, - "numBedrooms": null, - "number": "206", - "priorityType": null, - "reservedType": "senior", - "sqFeet": "355", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-06-25T17:26:59.698Z", - "updatedAt": "2019-06-25T17:26:59.698Z", - "listingId": "sz0UrxnBdAxHMdfgcgha7", - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b172c30-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "25628.0", - "monthlyIncomeMin": "2135.0", - "floor": 3, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "854.0", - "numBathrooms": null, - "numBedrooms": null, - "number": "303", - "priorityType": null, - "reservedType": null, - "sqFeet": "355", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-06-25T17:27:12.228Z", - "updatedAt": "2019-06-25T17:27:12.228Z", - "listingId": "sz0UrxnBdAxHMdfgcgha7", - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b172c50-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "25628.0", - "monthlyIncomeMin": "2135.0", - "floor": 4, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "854.0", - "numBathrooms": null, - "numBedrooms": null, - "number": "403", - "priorityType": null, - "reservedType": "veteran", - "sqFeet": "355", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-06-25T17:27:23.985Z", - "updatedAt": "2019-06-25T17:27:23.985Z", - "listingId": "sz0UrxnBdAxHMdfgcgha7", - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b172c70-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "25628.0", - "monthlyIncomeMin": "2135.0", - "floor": 4, - "annualIncomeMax": "46125.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "854.0", - "numBathrooms": null, - "numBedrooms": null, - "number": "406", - "priorityType": null, - "reservedType": null, - "sqFeet": "355", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-06-25T17:27:38.397Z", - "updateAt": "2019-06-25T17:28:02.659Z", - "listingId": "sz0UrxnBdAxHMdfgcgha7", - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - } - ], - "totalUnits": 5, - "unitsAvailable": 0, - "applicationMethods": [ - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "externalReference": "https://drive.google.com/file/d/0B4CsVae6UWpLRDJBUzlFbHBFa0t0WTJ6em5EdEwtU0VoMWs4/view?usp=sharing", - "label": "English" - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/gish.jpg" - } - ] -} diff --git a/backend/core/listing_data/jones.json b/backend/core/listing_data/jones.json deleted file mode 100644 index cb8531121f..0000000000 --- a/backend/core/listing_data/jones.json +++ /dev/null @@ -1,502 +0,0 @@ -{ - "id": "HOLNx_F7fUCeax5GCoIr5g", - "events":[], - "postmarkedApplicationsReceivedByDate": "2020-10-08T16:00:00.000-07:00", - "accessibility": "All common areas ADA accessible and homes ADA adaptable.", - "amenities": "Fitness Center, Indoor/Outdoor Lounge, Social Lounge, Package Lockers, Indoor Bicyle Parking, On-site Composting, Green Roof Spaces", - "applicationAddress": { - "city": "Berkeley", - "street": "1080 Jones St.", - "zipCode": "94710", - "state": "CA", - "latitude": 37.87628, - "longitude": -122.294873 - }, - "applicationDueDate": "2020-10-13T17:00:00.000-07:00", - "applicationOrganization": "Jones Berkeley BMR", - "applicationPhone": "415-238-5026", - "buildingAddress": { - "county": "Alameda", - "city": "Berkeley", - "street": "1080 Jones St.", - "zipCode": "94710", - "state": "CA", - "latitude": 37.87628, - "longitude": -122.294873 - }, - "buildingSelectionCriteria": null, - "costsNotIncluded": "Residents responsible for utilities: electric and cable/internet. Residents required to maintain a personal liability policy as outlined in the lease agreement. Rent is due by the 3rd of each month and rent is considered late on the 4th of each month. Late fee is 5%. Resident to pay $35 for each returned check or rejected electronic payment. Pet Deposit is $500 per pet. $50 monthly pet rent per pet.", - "creditHistory": "We obtain a credit report on each applicant. Our credit reporting agency evaluates credit (which may include rent payment history) as an indicator of future rent payment performance. An unsatisfactory or insufficient finding will result in the requirement of an additional deposit, guarantor, or denial. Applicants are responsible for ensuring their credit history is accurate.", - "depositMax": "1,250", - "depositMin": "500", - "developer": "Shorenstein", - "programRules": "[Inclusionary Housing/BMR Rental Program Guidelines and Operational Manual](https://www.cityofberkeley.info/uploadedFiles/Housing/Level_3_-_General/BMR%20Guidelines_Approved_08-25-19.pdf)", - "externalId": null, - "waitlistMaxSize": 9999, - "name": "Jones Berkeley", - "neighborhood": "North-West Berkeley", - "waitlistCurrentSize": 0, - "petPolicy": "Pets allowed except the following; pit bull, malamute, akita, rottweiler, doberman, staffordshire terrier, presa canario, chowchow, american bull dog, karelian bear dog, st bernard, german shepherd, husky, great dane, any hybrid or mixed breed of the aforementioned breeds. 2 pets per household limit. $500 pet deposit per pet. $50 pet rent per pet.", - "prioritiesDescriptor": null, - "requiredDocuments": "Income: If you work and receive paystubs: ▪ Copies of 3 most current and consecutive paystubs, beginning with the most recent paystub; ▪ If hired recently, provide Employment Offer Letter; If you receive severance pay, Social Security, unemployment benefits, retirement income, disability, public assistance, or the like, submit: ▪ Most recent benefits letter(s) stating your monthly award; If you are Self-Employed, you must: ▪ Complete an Self-Employed Declaration form; ▪ Submit Year-to-Date Profit and Loss statement; ▪ 3 months proof of income; If you are Unemployed and have ZERO income, you must: ▪ Complete an Unemployment Declaration; ▪ Submit the previous year’s federal income tax returns; Assets: ▪ 2-consecutive and most recent official bank statements for all bank accounts and include ALL pages; ▪ A written explanation and supporting documentation for any deposit over $100 other than that of your documented employment; Tax Returns ▪ Submit most recent tax returns including all pages and forms W2s, 1099s, Schedules; Building Documents: ▪ Application; ▪ Release & Consent Form; ▪ Resident Qualification Acknowledgment; ▪ Student Status Affidavit; ", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": null, - "reservedDescriptor": "Senior", - "smokingPolicy": "Non-Smoking Building", - "yearBuilt": 2020, - "createdAt": "2020-02-14T15:11:26.446-07:00", - "updatedAt": "2020-02-15T11:47:47.150-07:00", - "groupId": 1, - "hideUnitFeatures": false, - "disableUnitsAccordion": true, - "unitAmenities": "Refrigerator, washer/dryer, gas range, dishwasher, central AC/Heat, quartz countertops, wood flooring, carpeted bedroom", - "applicationFee": "52.46", - "criminalBackground": "No criminal background checks under Berkeley Fair Chance Ordinance", - "leasingAgentEmail": "jonesberkeleybmr@greystar.com", - "leasingAgentName": "Michael Uson", - "leasingAgentAddress": { - "city": "Berkeley", - "street": "1080 Jones St.", - "zipCode": "94710", - "state": "CA", - "latitude": 37.87628, - "longitude": -122.294873 - }, - "leasingAgentOfficeHours": "Due to COVID-19, our offices are closed. Please call or email or leasing agent for any questions during Mon-Fri 9AM-5PM", - "leasingAgentPhone": "415-793-9976", - "leasingAgentTitle": "Management Coordinator", - "rentalHistory": "Applicant must be able to provide sufficient residential information for at least the past two years to enable the Property Manager to adequately evaluate rental history and/or place of residence. If two years of prior residential information proves insufficient for obtaining adequate references, additional residential history may be requested. Negative rental history will be grounds for denial, including: Any evictions with an outstanding judgement, 4 or more evictions filings, 4 or more late payments being reported on the rental history report", - "preferences": [], - "buildingTotalUnits": 170, - "units": [ - { - "id": "WmVp9wBP7kSMil8mTBw3_Q", - "amiPercentage": "50", - "annualIncomeMin": "27432", - "monthlyIncomeMin": "2166", - "floor": 2, - "annualIncomeMax": "52200", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1083", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "488", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChartId": 10, - "bmrProgramChart": true, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "WmVp9wBP7kSMil8mTBw2_Q", - "amiPercentage": "50", - "annualIncomeMin": "27432", - "monthlyIncomeMin": "2166", - "floor": 5, - "annualIncomeMax": "52200", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1083", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "610", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChartId": 10, - "bmrProgramChart": true, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "WmVp9wBP7kSMil8mTBw0_Q", - "amiPercentage": "50", - "annualIncomeMin": "27432", - "monthlyIncomeMin": "2166", - "floor": 5, - "annualIncomeMax": "52200", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1083", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "610", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChartId": 10, - "bmrProgramChart": true, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "WmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "27432", - "monthlyIncomeMin": "2166", - "floor": 2, - "annualIncomeMax": "52200", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1083", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "488", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChartId": 10, - "bmrProgramChart": true, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "baee2Aw7ik2QrScpb8sDLQ", - "amiPercentage": "50", - "annualIncomeMin": "31320", - "monthlyIncomeMin": "2436", - "floor": 2, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "757", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChartId": 10, - "bmrProgramChart": true, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "baee0Aw7ik2QrScpb8sDLQ", - "amiPercentage": "50", - "annualIncomeMin": "31320", - "monthlyIncomeMin": "2436", - "floor": 2, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "757", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChartId": 10, - "bmrProgramChart": true, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "baee1Aw7ik2QrScpb8sDLQ", - "amiPercentage": "50", - "annualIncomeMin": "31320", - "monthlyIncomeMin": "2436", - "floor": 5, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "768", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChartId": 10, - "bmrProgramChart": true, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "baee6Aw7ik2QrScpb8sDLQ", - "amiPercentage": "50", - "annualIncomeMin": "31320", - "monthlyIncomeMin": "2436", - "floor": 5, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "768", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChartId": 10, - "bmrProgramChart": true, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "baee5Aw7ik2QrScpb8sDLQ", - "amiPercentage": "50", - "annualIncomeMin": "31320", - "monthlyIncomeMin": "2436", - "floor": 5, - "annualIncomeMax": "58750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "768", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChartId": 10, - "bmrProgramChart": true, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "PPxWLbsCOkSSQQlPCoJj5w", - "amiPercentage": "50", - "annualIncomeMin": "35256", - "monthlyIncomeMin": "2704", - "floor": 3, - "annualIncomeMax": "70500", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1352", - "numBathrooms": null, - "numBedrooms": 2, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "901", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChartId": 10, - "bmrProgramChart": true, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "PPxWLbsCOkSSQQlPCoJj4w", - "amiPercentage": "50", - "annualIncomeMin": "35256", - "monthlyIncomeMin": "2704", - "floor": 5, - "annualIncomeMax": "70500", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1352", - "numBathrooms": null, - "numBedrooms": 2, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1111", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChartId": 10, - "bmrProgramChart": true, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "PPxWLbsCOkSSQQlPCoJj3w", - "amiPercentage": "50", - "annualIncomeMin": "35256", - "monthlyIncomeMin": "2704", - "floor": 3, - "annualIncomeMax": "70500", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1352", - "numBathrooms": null, - "numBedrooms": 2, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "901", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChartId": 10, - "bmrProgramChart": true, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "PPxWLbsCOkSSQQlPCoJj2w", - "amiPercentage": "50", - "annualIncomeMin": "35256", - "monthlyIncomeMin": "2704", - "floor": 3, - "annualIncomeMax": "70500", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1352", - "numBathrooms": null, - "numBedrooms": 2, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "901", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChartId": 10, - "bmrProgramChart": true, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "PPxWLbsCOkSSQQlPCoJj1w", - "amiPercentage": "50", - "annualIncomeMin": "35256", - "monthlyIncomeMin": "2704", - "floor": 5, - "annualIncomeMax": "70500", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1352", - "numBathrooms": null, - "numBedrooms": 2, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1111", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChartId": 10, - "bmrProgramChart": true, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "PPxWLbsCOkSSQQlPCoJj0w", - "amiPercentage": "50", - "annualIncomeMin": "35256", - "monthlyIncomeMin": "2704", - "floor": 5, - "annualIncomeMax": "70500", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1352", - "numBathrooms": null, - "numBedrooms": 2, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1111", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChartId": 10, - "bmrProgramChart": true, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "rVfljjqbGk6v7N_nKsA0lg", - "amiPercentage": "50", - "annualIncomeMin": "39144", - "monthlyIncomeMin": "2988", - "floor": 1, - "annualIncomeMax": "80950", - "maxOccupancy": 7, - "minOccupancy": 3, - "monthlyRent": "1494", - "numBathrooms": null, - "numBedrooms": 2, - "number": "101", - "priorityType": null, - "reservedType": null, - "sqFeet": "1485", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChartId": 10, - "bmrProgramChart": true, - "monthlyRentAsPercentOfIncome": null - } - ], - "unitsAvailable": 16, - "applicationMethods": [ - { - "type": "LeasingAgent", - "acceptsPostmarkedApplications": true - }, - { - "type": "POBox", - "acceptsPostmarkedApplications": false - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "English", - "externalReference": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/Alameda.Common.Application.Main.pdf" - }, - { - "type": "Internal", - "acceptsPostmarkedApplications": false - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/jones.jpg" - } - ] -} diff --git a/backend/core/listing_data/logan.json b/backend/core/listing_data/logan.json deleted file mode 100644 index 1c96ca8733..0000000000 --- a/backend/core/listing_data/logan.json +++ /dev/null @@ -1,512 +0,0 @@ -{ - "id": "ab67b61190aa4a4db7547b0161854ff8", - "events":[], - "accessibility": "Reasonable accommodation requests will be accepted and reviewed.", - "amenities": "Courtyard, Gym, Coworking space, Rooftop farm", - "applicationAddress": { - "city": "Oakland", - "county": "Alameda", - "street": "5110 Telegraph Ave.", - "zipCode": "94609", - "state": "CA", - "latitude": null, - "longitude": null - }, - "applicationDueDate": "2020-11-15T17:00:00.000-07:00", - "applicationOrganization": "The Logan", - "applicationPhone": "510-405-5110", - "buildingAddress": { - "city": "Oakland", - "county": "Alameda", - "street": "5110 Telegraph ", - "zipCode": "94609", - "state": "CA", - "latitude": 37.837764, - "longitude": -122.262082 - }, - "buildingSelectionCriteria": "", - "costsNotIncluded": "Water/Sewer/Trash, Parking (optional), Internet (optional), Cable (optional), Pets (optional)", - "creditHistory": "Credit Check", - "depositMax": "900.00", - "depositMin": "500.00", - "depositMaxExtraText": "(+additional 1 month's rent as deposit depending on credit)", - "developer": "Westbrook", - "programRules": "If selected, all documents must be received within 5 days in order to remain eligible for the apartment.", - "externalId": null, - "waitlistMaxSize": 300, - "name": "The Logan", - "neighborhood": "Temescal", - "waitlistCurrentSize": 0, - "petPolicy": "2 pet maximum: dogs and cats accepted, some breed restrictions apply.", - "prioritiesDescriptor": "Monarch Homes has some units that are accessible for residents with mobility, hearing, and vision impairments. Some units include an audible and visual fire alarm and door chime, grab bars, adjustable shelving, easy to reach outlets, switches, counters, and appliances; and 36\" door width throughout unit. The building has an elevator with a generous waiting area on each residential floor, and laundry room with front loading washers and dryers. There is limited on-site parking. We will provide reasonable accommodations when requested, verified, and necessary. ", - "requiredDocuments": "Pay Stubs (3 months); Verification of Employment; Checking Account Balance (past 6 months); Tenant Income Certification Questionnaire; Certification of Zero Income (if necessary); Child/Spousal Support Affadivit; Tenant Income Certification; Affadavit of Self-Employment (if applicable)", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": null, - "reservedDescriptor": "All household members must be age 62 or older at the time of application. Reasonable accommodations can be requested for live-in aides of any age.", - "smokingPolicy": "No Smoking", - "yearBuilt": 2020, - "createdAt": "2020-09-22T15:11:26.446-07:00", - "updatedAt": "2020-09-22T11:47:47.150-07:00", - "groupId": 1, - "hideUnitFeatures": false, - "disableUnitsAccordion": true, - "unitAmenities": "Stainless Steel Appliances, In-unit Washer/Dryer", - "applicationFee": "45.00", - "criminalBackground": "", - "leasingAgentEmail": "BMR@livethelogan.com", - "leasingAgentName": "Skye Santos", - "leasingAgentAddress": { - "city": "", - "street": "", - "zipCode": "", - "state": "", - "latitude": null, - "longitude": null - }, - "leasingAgentOfficeHours": "By appointment due to COVID-19", - "leasingAgentPhone": "510-701-6221", - "leasingAgentTitle": "BMR Specialist", - "rentalAssistance": "Housing Choice Vouchers, Section 8 and other valid rental assistance programs will be considered for this property. In the case of a valid rental subsidy, the required minimum income will be based on the portion of the rent that the tenant pays after use of the subsidy.", - "rentalHistory": "Last 2 residences of at least 6 months.", - "preferences": [], - "buildingTotalUnits": 17, - "acceptsPostmarkedApplications": true, - "postmarkedApplicationsReceivedByDate": "2022-11-15T17:00:00.000-07:00", - "applicationMethods": [ - { - "type": "POBox", - "acceptsPostmarkedApplications": false - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "English", - "externalReference": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/Alameda.Common.Application.Main.pdf" - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/logan.jpg" - } - ], - "units": [ - { - "id": "ABaowAxySJW3utZBPNxr0", - "amiPercentage": "50", - "annualIncomeMin": "27408.0", - "monthlyIncomeMin": "2284.0", - "floor": 2, - "annualIncomeMax": "$27,408", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1142.0", - "numBathrooms": 1, - "numBedrooms": null, - "number": "220", - "priorityType": null, - "reservedType": null, - "sqFeet": "480", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ABaowAxySJW3utZBPNxr1", - "amiPercentage": "50", - "annualIncomeMin": "27408.0", - "monthlyIncomeMin": "2284.0", - "floor": 4, - "annualIncomeMax": "$27,408", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1142.0", - "numBathrooms": 1, - "numBedrooms": null, - "number": "408", - "priorityType": null, - "reservedType": null, - "sqFeet": "540", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ABaowAxySJW3utZBPNxr2", - "amiPercentage": "50", - "annualIncomeMin": "29352.0", - "monthlyIncomeMin": "2446.0", - "floor": 2, - "annualIncomeMax": "$29,352", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1223.0", - "numBathrooms": 1, - "numBedrooms": null, - "number": "238", - "priorityType": null, - "reservedType": null, - "sqFeet": "630", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ABaowAxySJW3utZBPNxr3", - "amiPercentage": "50", - "annualIncomeMin": "29352.0", - "monthlyIncomeMin": "2446.0", - "floor": 6, - "annualIncomeMax": "$29,352", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1223.0", - "numBathrooms": 1, - "numBedrooms": null, - "number": "330", - "priorityType": null, - "reservedType": null, - "sqFeet": "930", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ABaowAxySJW3utZBPNxr4", - "amiPercentage": "50", - "annualIncomeMin": "29352.0", - "monthlyIncomeMin": "2446.0", - "floor": 6, - "annualIncomeMax": "$29,352", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1223.0", - "numBathrooms": 1, - "numBedrooms": null, - "number": "338", - "priorityType": null, - "reservedType": null, - "sqFeet": "930", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ABaowAxySJW3utZBPNxr5", - "amiPercentage": "50", - "annualIncomeMin": "29352.0", - "monthlyIncomeMin": "2446.0", - "floor": 6, - "annualIncomeMax": "$29,352", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1223.0", - "numBathrooms": 1, - "numBedrooms": null, - "number": "439", - "priorityType": null, - "reservedType": null, - "sqFeet": "930", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ABaowAxySJW3utZBPNxr6", - "amiPercentage": "50", - "annualIncomeMin": "29352.0", - "monthlyIncomeMin": "2446.0", - "floor": 6, - "annualIncomeMax": "$29,352", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1223.0", - "numBathrooms": 1, - "numBedrooms": null, - "number": "515", - "priorityType": null, - "reservedType": null, - "sqFeet": "930", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ABaowAxySJW3utZBPNxr7", - "amiPercentage": "50", - "annualIncomeMin": "29352.0", - "monthlyIncomeMin": "2446.0", - "floor": 6, - "annualIncomeMax": "$29,352", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1223.0", - "numBathrooms": 1, - "numBedrooms": null, - "number": "539", - "priorityType": null, - "reservedType": null, - "sqFeet": "930", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ABaowAxySJW3utZBPNxr8", - "amiPercentage": "50", - "annualIncomeMin": "29352.0", - "monthlyIncomeMin": "2446.0", - "floor": 6, - "annualIncomeMax": "$29,352", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1223.0", - "numBathrooms": 1, - "numBedrooms": null, - "number": "639", - "priorityType": null, - "reservedType": null, - "sqFeet": "930", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - - { - "id": "ABaowAxySJW3utZBPNxs1", - "amiPercentage": "50", - "annualIncomeMin": "35232.0", - "monthlyIncomeMin": "2936.0", - "floor": 2, - "annualIncomeMax": "$29,352", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1468.0", - "numBathrooms": 2, - "numBedrooms": null, - "number": "228", - "priorityType": null, - "reservedType": null, - "sqFeet": "1200", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ABaowAxySJW3utZBPNxs2", - "amiPercentage": "50", - "annualIncomeMin": "35232.0", - "monthlyIncomeMin": "2936.0", - "floor": 6, - "annualIncomeMax": "$29,352", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1468.0", - "numBathrooms": 2, - "numBedrooms": null, - "number": "305", - "priorityType": null, - "reservedType": null, - "sqFeet": "1390", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ABaowAxySJW3utZBPNxs3", - "amiPercentage": "50", - "annualIncomeMin": "35232.0", - "monthlyIncomeMin": "2936.0", - "floor": 3, - "annualIncomeMax": "$29,352", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1468.0", - "numBathrooms": 2, - "numBedrooms": null, - "number": "329", - "priorityType": null, - "reservedType": null, - "sqFeet": "1200", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ABaowAxySJW3utZBPNxs4", - "amiPercentage": "50", - "annualIncomeMin": "35232.0", - "monthlyIncomeMin": "2936.0", - "floor": 4, - "annualIncomeMax": "$29,352", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1468.0", - "numBathrooms": 2, - "numBedrooms": null, - "number": "428", - "priorityType": null, - "reservedType": null, - "sqFeet": "1200", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ABaowAxySJW3utZBPNxs5", - "amiPercentage": "50", - "annualIncomeMin": "35232.0", - "monthlyIncomeMin": "2936.0", - "floor": 5, - "annualIncomeMax": "$29,352", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1468.0", - "numBathrooms": 2, - "numBedrooms": null, - "number": "529", - "priorityType": null, - "reservedType": null, - "sqFeet": "1200", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ABaowAxySJW3utZBPNxs6", - "amiPercentage": "50", - "annualIncomeMin": "35232.0", - "monthlyIncomeMin": "2936.0", - "floor": 2, - "annualIncomeMax": "$29,352", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1468.0", - "numBathrooms": 2, - "numBedrooms": null, - "number": "606", - "priorityType": null, - "reservedType": null, - "sqFeet": "1200", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ABaowAxySJW3utZBPNxs7", - "amiPercentage": "50", - "annualIncomeMin": "35232.0", - "monthlyIncomeMin": "2936.0", - "floor": 2, - "annualIncomeMax": "$29,352", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1468.0", - "numBathrooms": 2, - "numBedrooms": null, - "number": "628", - "priorityType": null, - "reservedType": null, - "sqFeet": "1200", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "ABaowAxySJW3utZBPNxs9", - "amiPercentage": "50", - "annualIncomeMin": "40704.0", - "monthlyIncomeMin": "3392.0", - "floor": 2, - "annualIncomeMax": "$40,704", - "maxOccupancy": 7, - "minOccupancy": 3, - "monthlyRent": "1696.0", - "numBathrooms": 3, - "numBedrooms": null, - "number": "201", - "priorityType": null, - "reservedType": null, - "sqFeet": "1200", - "status": "available", - "unitType": "threeBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 10, - "monthlyRentAsPercentOfIncome": null - } - ], - "unitsAvailable": 17, - "whatToExpect": { - "applicantsWillBeContacted": "Applicants will be contacted by the property agent in rank order until vacancies are filled.", - "allInfoWillBeVerified": "All of the information that you have provided will be verified and your eligibility confirmed. Your application will be removed from the waitlist if you have made any fraudulent statements. If we cannot verify a housing preference that you have claimed, you will not receive the preference but will not be otherwise penalized.", - "bePreparedIfChosen": "Should your application be chosen, be prepared to fill out a more detailed application and provide required supporting documents." - } -} diff --git a/backend/core/listing_data/mercy.json b/backend/core/listing_data/mercy.json deleted file mode 100644 index a8cb78b554..0000000000 --- a/backend/core/listing_data/mercy.json +++ /dev/null @@ -1,764 +0,0 @@ -{ - "id": "HOLNx_F7fUCeax5GCoIr9g", - "events": [], - "postmarkedApplicationsReceivedByDate": "2021-07-06T17:00:00.000-07:00", - "applicationAddress": { - "city": "San Leandro (Ashland)", - "street": "1475 167th Avenue", - "zipCode": "94578", - "state": "CA", - "latitude": null, - "longitude": null - }, - "applicationDueDate": "2021-07-06T17:00:00.000-07:00", - "applicationOrganization": "Mercy Housing", - "applicationPhone": "510-962-8120", - "buildingSelectionCriteria": "https://drive.google.com/file/d/19X_AN0lN_jMeD0kSHr_im_8XXVpUiiPt/view?usp=sharing", - "countyCode": "Alameda", - "costsNotIncluded": "PG&E, phone, cable, internet", - "creditHistory": "Management staff will request credit histories on each adult member of each applicant household. It is the applicant’s responsibility that at least one household member can demonstrate utilities can be put in their name. For this to be demonstrated, at least one household member must have a credit report that shows no utility accounts in default. Applicants who cannot have utilities put in their name will be considered ineligible. Any currently open bankruptcy proceeding of any of the household members will be considered a disqualifying condition. Applicants will not be considered to have a poor credit history when they were delinquent in rent because they were withholding rent due to substandard housing conditions in a manner consistent with local ordinance; or had a poor rent paying history clearly related to an excessive rent relative to their income, and responsible efforts were made to resolve the non-payment problem. If there is a finding of any kind which would negatively impact an application, the applicant will be notified in writing. The applicant then shall have 14 calendar days in which such a finding may be appealed to staff for consideration.", - "CSVFormattingType": "basic", - "depositMax": "1,468", - "depositMin": "1,223", - "programRules": "Tax Credit student rules", - "externalId": null, - "waitlistMaxSize": 100, - "name": "1475 167th Avenue", - "waitlistCurrentSize": 27, - "prioritiesDescriptor": null, - "requiredDocuments": "Current government issued photo ID, social security cards, birth certificates for minors, proof of income (tax return, paystubs, SS Award letter or Assistance Award letter, pension statement) and proof of assets (bank statements). Housing Preference: Applicants who either live and/or work within the County of Alameda: paystubs / tax returns or another form of independent verification to verify employment; and or a lease or a copy of a utility bill to verify residency.", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": null, - "reservedDescriptor": null, - "status": "active", - "createdAt": "2020-11-06T15:11:26.446-08:00", - "updatedAt": "2020-11-06T11:47:47.150-08:00", - "groupId": 1, - "hideUnitFeatures": false, - "disableUnitsAccordion": true, - "applicationFee": "30.00", - "criminalBackground": "Staff will hire a contractor to run a credit check and criminal background check on all applicants and it will check court evidence of evictions (and, unlawful detainers), or judgments against the applicant and evidence of criminal convictions. The purpose of these checks is to obtain information on the applicant’s past history of meeting financial obligations records for and future ability to make timely rent payments. 1. Each record will be assessed individually, in which only the 'directly-related' convictions and unresolved arrests in the record are considered. In considering whether a conviction/unresolved arrest is directly-related, the housing provider shall look at whether the conduct has a direct and specific negative bearing on the safety of persons or property, given the nature of the housing, whether the housing offers the opportunity for the same/similar offense to occur, whether circumstances leading to the conduct will recur in the housing, and whether supportive services that might reduce the likelihood of a recurrence are available on-site. 2. If denied as a result of the report the applicant will be provided with a copy of the background report and told which conviction or unresolved arrest is the basis for the potential denial. The applicant will have 14 days to respond orally or in writing to show that there shouldn’t be a denial. The applicant can respond by: \n * Pointing out any inaccuracies in the report. * Providing evidence of rehabilitation. Evidence of rehabilitation include but not limited to satisfying parole/probation (however inability to pay fines, fess and restitution due to indigence shall not be considered noncompliance with terms and conditions of parole and/or probation), receiving education/training, participating in alcohol/drug treatment programs, letters of recommendation, age at the time of conviction. * Explaining any mitigating factors about the circumstances of the conviction. Mitigating factors include physical or emotional abuse, coercion, untreated abuse/mental illness that led to the conviction. \n The decision will be made at the discretion of the Regional Vice President and/or Compliance Supervisor.", - "leasingAgentEmail": "laura.weller@mercyhousing.org", - "leasingAgentName": "Laura Weller", - "leasingAgentAddress": { - "city": "San Leandro (Ashland)", - "street": "1475 167th Avenue", - "zipCode": "94578", - "state": "CA", - "latitude": 37.693612, - "longitude": -122.109824 - }, - "leasingAgentOfficeHours": "9am-4:30pm; Please call the property management office at 510-962-8120 to schedule an appointment during office hours. Persons with disabilities have the right to request reasonable accommodations. The 504 Coordinator for Mercy Housing can be contacted by phone at 303-830-3300; TTY number 1-800-877.8973 or 711, by fax at 877.245.7121 or email at 504adacoordinator@mercyhousing.org.", - "leasingAgentPhone": "510-962-8120", - "leasingAgentTitle": "Property Manager", - "rentalHistory": "Will request phone references from the applicant's current landlord and former landlords for the past two (2) years. If the landlord provides a good reference, staff will move forward with the application process. If the landlord provides a negative reference that documents lease violation or evictions, staff will request a written reference from the Landlord. If the landlord provides a negative reference indicating that the applicant was chronically late with rent payments, was evicted at any time during the past two (2) years for non-payment of rent, had documented lease violations or had other landlord/tenant legal action initiated for actions within their control, any one of these circumstances shall be grounds for an ineligibility determination. Applicants who have failed to pay amounts due or failed to reach a satisfactory agreement to pay those amounts will also be considered ineligible. If there is no landlord history; it will be considered a neutral reference and the application will continue on through the eligibility process. Alternative references may be requested if there is no landlord history. Alternatives references may include written references of social workers, employers and/or others involved with the applicant in a professional capacity. References from person(s) with whom they have had a professional relationship to demonstrate their ability to meet the financial conditions of the lease. (Letters of reference from family members will not be accepted.) Applicants who have resided in homes they owned during the prior three years or more can provide proof of timely mortgage, insurance or property tax payments in order to demonstrate their ability to meet the financial requirements of the lease. If there is a finding of any kind which would negatively impact an application, the applicant will be notified in writing. The applicant then shall have 14 calendar days in which such a finding may be appealed to staff for consideration.", - "specialNotes": "Building built in 1950; renovated in 2021. Section 811 units through referrals only; for more information on Section 811 eligibility, please visit: https://www.calhfa.ca.gov/multifamily/section811/index.htm", - "preferences": [ - { - "page": 1, - "ordinal": 1, - "title": "Live/Work in Alameda County", - "subtitle": "", - "description": "At least one household member lives or works in Alameda County", - "links": [], - "formMetadata": { - "key": "liveWork", - "options": [ - { - "key": "live", - "extraData": [] - }, - { - "key": "work", - "extraData": [] - } - ] - } - } - ], - "property": { - "createdAt": "2021-02-02T17:00:00.000-08:00", - "updatedAt": "2021-02-02T17:00:00.000-08:00", - "servicesOffered": "Onsite resident services coordinator", - "householdSizeMin": 1, - "householdSizeMax": 5, - "smokingPolicy": "Non-smoking community", - "unitsAvailable": 15, - "unitsSummarized": null, - "unitAmenities": "Quartz kitchen counters, refrigerator, electric stove with smart burners, dishwasher, mini-split AC/Heat, vinyl flooring", - "developer": "Mercy Housing California", - "yearBuilt": 1950, - "accessibility": "Accesible path of travel throughout property, pool lift, 16 mobility units, 4 Hearing Visual Impairment units", - "amenities": "Clubhouse including meeting room, tot lot, laundry room, pool, (outdoor) BBQ area, gated parking", - "buildingTotalUnits": 79, - "buildingAddress": { - "county": "Alameda", - "city": "San Leandro (Ashland)", - "street": "1475 167th Avenue", - "zipCode": "94578", - "state": "CA", - "latitude": 37.693612, - "longitude": -122.109824 - }, - "neighborhood": "Ashland", - "petPolicy": "No pets; assistance animals with approval", - "units": [ - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "35232", - "monthlyIncomeMin": "2442", - "floor": 1, - "annualIncomeMax": "61650", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1221", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "605", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "35232", - "monthlyIncomeMin": "2442", - "floor": 1, - "annualIncomeMax": "61650", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1221", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "605", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "35232", - "monthlyIncomeMin": "2442", - "floor": 2, - "annualIncomeMax": "61650", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1221", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "605", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "35232", - "monthlyIncomeMin": "2442", - "floor": 1, - "annualIncomeMax": "61650", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1221", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "605", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "35232", - "monthlyIncomeMin": "2442", - "floor": 1, - "annualIncomeMax": "61650", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1221", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "605", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "35232", - "monthlyIncomeMin": "2442", - "floor": 1, - "annualIncomeMax": "61650", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1221", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "605", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "50", - "annualIncomeMin": "35232", - "monthlyIncomeMin": "2442", - "floor": 1, - "annualIncomeMax": "61650", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1221", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "605", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "60", - "annualIncomeMin": "35232", - "monthlyIncomeMin": "2956", - "floor": 1, - "annualIncomeMax": "73980", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1478", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "605", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "60", - "annualIncomeMin": "35232", - "monthlyIncomeMin": "2956", - "floor": 2, - "annualIncomeMax": "73980", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1478", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "605", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "60", - "annualIncomeMin": "35232", - "monthlyIncomeMin": "2956", - "floor": 1, - "annualIncomeMax": "73980", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1478", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "605", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "60", - "annualIncomeMin": "35232", - "monthlyIncomeMin": "2956", - "floor": 1, - "annualIncomeMax": "73980", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1478", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "605", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "60", - "annualIncomeMin": "35232", - "monthlyIncomeMin": "2956", - "floor": 1, - "annualIncomeMax": "73980", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1478", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "605", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "60", - "annualIncomeMin": "35232", - "monthlyIncomeMin": "2956", - "floor": 1, - "annualIncomeMax": "73980", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1478", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": "Mobility and hearing", - "reservedType": null, - "sqFeet": "605", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - } - ] - }, - "applicationMethods": [ - { - "type": "LeasingAgent", - "acceptsPostmarkedApplications": true - }, - { - "type": "PaperPickup", - "acceptsPostmarkedApplications": true - }, - { - "type": "Internal", - "acceptsPostmarkedApplications": true - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "English", - "externalReference": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/Alameda_County_Final_English.pdf" - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "Spanish", - "externalReference": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/Alameda_County_Final_Spanish.pdf" - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "Vietnamese", - "externalReference": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/Alameda_County_Final_Vietnamese.pdf" - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "Chinese", - "externalReference": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/Alameda_County_Final_Chinese.pdf" - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/mercy.jpg" - } - ], - "amiChart": { - "name": "AlamedaCountyTCAC2021", - "items": [ - { - "percentOfAmi": 80, - "householdSize": 1, - "income": 76720 - }, - { - "percentOfAmi": 80, - "householdSize": 2, - "income": 87680 - }, - { - "percentOfAmi": 80, - "householdSize": 3, - "income": 98640 - }, - { - "percentOfAmi": 80, - "householdSize": 4, - "income": 109600 - }, - { - "percentOfAmi": 80, - "householdSize": 5, - "income": 11840 - }, - { - "percentOfAmi": 80, - "householdSize": 6, - "income": 127200 - }, - { - "percentOfAmi": 80, - "householdSize": 7, - "income": 135920 - }, - { - "percentOfAmi": 80, - "householdSize": 8, - "income": 144720 - }, - { - "percentOfAmi": 60, - "householdSize": 1, - "income": 57540 - }, - { - "percentOfAmi": 60, - "householdSize": 2, - "income": 65760 - }, - { - "percentOfAmi": 60, - "householdSize": 3, - "income": 73980 - }, - { - "percentOfAmi": 60, - "householdSize": 4, - "income": 82200 - }, - { - "percentOfAmi": 60, - "householdSize": 5, - "income": 88800 - }, - { - "percentOfAmi": 60, - "householdSize": 6, - "income": 95400 - }, - { - "percentOfAmi": 60, - "householdSize": 7, - "income": 101940 - }, - { - "percentOfAmi": 60, - "householdSize": 8, - "income": 108540 - }, - { - "percentOfAmi": 50, - "householdSize": 1, - "income": 47950 - }, - { - "percentOfAmi": 50, - "householdSize": 2, - "income": 54800 - }, - { - "percentOfAmi": 50, - "householdSize": 3, - "income": 61650 - }, - { - "percentOfAmi": 50, - "householdSize": 4, - "income": 68500 - }, - { - "percentOfAmi": 50, - "householdSize": 5, - "income": 74000 - }, - { - "percentOfAmi": 50, - "householdSize": 6, - "income": 79500 - }, - { - "percentOfAmi": 50, - "householdSize": 7, - "income": 84950 - }, - { - "percentOfAmi": 50, - "householdSize": 8, - "income": 90450 - }, - { - "percentOfAmi": 45, - "householdSize": 1, - "income": 43155 - }, - { - "percentOfAmi": 45, - "householdSize": 2, - "income": 49320 - }, - { - "percentOfAmi": 45, - "householdSize": 3, - "income": 55485 - }, - { - "percentOfAmi": 45, - "householdSize": 4, - "income": 61650 - }, - { - "percentOfAmi": 45, - "householdSize": 5, - "income": 66600 - }, - { - "percentOfAmi": 45, - "householdSize": 6, - "income": 71550 - }, - { - "percentOfAmi": 45, - "householdSize": 7, - "income": 76455 - }, - { - "percentOfAmi": 45, - "householdSize": 8, - "income": 81405 - }, - { - "percentOfAmi": 40, - "householdSize": 1, - "income": 38360 - }, - { - "percentOfAmi": 40, - "householdSize": 2, - "income": 43840 - }, - { - "percentOfAmi": 40, - "householdSize": 3, - "income": 49320 - }, - { - "percentOfAmi": 40, - "householdSize": 4, - "income": 54800 - }, - { - "percentOfAmi": 40, - "householdSize": 5, - "income": 59200 - }, - { - "percentOfAmi": 40, - "householdSize": 6, - "income": 63600 - }, - { - "percentOfAmi": 40, - "householdSize": 7, - "income": 67960 - }, - { - "percentOfAmi": 40, - "householdSize": 8, - "income": 72360 - }, - { - "percentOfAmi": 30, - "householdSize": 1, - "income": 28770 - }, - { - "percentOfAmi": 30, - "householdSize": 2, - "income": 32880 - }, - { - "percentOfAmi": 30, - "householdSize": 3, - "income": 36990 - }, - { - "percentOfAmi": 30, - "householdSize": 4, - "income": 41100 - }, - { - "percentOfAmi": 30, - "householdSize": 5, - "income": 44400 - }, - { - "percentOfAmi": 30, - "householdSize": 6, - "income": 47700 - }, - { - "percentOfAmi": 30, - "householdSize": 7, - "income": 50970 - }, - { - "percentOfAmi": 30, - "householdSize": 8, - "income": 54270 - }, - { - "percentOfAmi": 20, - "householdSize": 1, - "income": 19180 - }, - { - "percentOfAmi": 20, - "householdSize": 2, - "income": 21920 - }, - { - "percentOfAmi": 20, - "householdSize": 3, - "income": 24660 - }, - { - "percentOfAmi": 20, - "householdSize": 4, - "income": 27400 - }, - { - "percentOfAmi": 20, - "householdSize": 5, - "income": 29600 - }, - { - "percentOfAmi": 20, - "householdSize": 6, - "income": 31800 - }, - { - "percentOfAmi": 20, - "householdSize": 7, - "income": 33980 - }, - { - "percentOfAmi": 20, - "householdSize": 8, - "income": 36180 - } - ] - } -} diff --git a/backend/core/listing_data/met_north.json b/backend/core/listing_data/met_north.json deleted file mode 100644 index 2bc2928224..0000000000 --- a/backend/core/listing_data/met_north.json +++ /dev/null @@ -1,2172 +0,0 @@ -{ - "id": "6b15b0f0-0cf8-0139-7cff-2683e7458fb7", - "events":[], - "accessibility": "Accessibility features in common areas like lobby – wheelchair ramps, wheelchair accessible bathrooms and elevators.", - "amenities": "Community Room, laundry room, playground, bbq outside area, resident services", - "applicationDueDate": "2019-11-14T15:00:00.000-07:00", - "applicationOrganization": "2122 Monterey Road", - "applicationAddress": { - "city": "San Jose", - "county": "San Jose", - "zipCode": "95112", - "state": "CA", - "street": "2122 Monterey Road", - "latitude": 37.305342986666666, - "longitude": -121.86262929333333 - }, - "applicationPhone": "(408) 982-3840", - "buildingAddress": { - "city": "San Jose", - "county": "San Jose", - "state": "CA", - "street": "2122 Monterey Road", - "zipCode": "95112", - "latitude": 37.305342986666666, - "longitude": -121.86262929333333 - }, - "buildingSelectionCriteria": "http://bit.ly/31Y93Wi", - "costsNotIncluded": "Resident responsible for PG&E, internet and phone. Owner pays for water, trash, and sewage. Residents encouraged to obtain renter's insurance but this is not a requirement. Rent is due by the 5th of each month. Late fee $35 and returned check fee is $35 additional. ", - "creditHistory": "Applications will be rated on a score system for housing. An applicant's score may be impacted by negative tenant peformance information provided to the credit reporting agency. All applicants are expected have a passing acore of 70 points out of 100 to be considered for housing. Applicants with no credit history will receive a maximum of 80 points to fairly outweigh positive and/or negative trades as would an applicant with established credit history. Refer to Tenant Selection Criteria or Qualification Criteria for details related to the qualification process. ", - "depositMax": "1551.0", - "depositMin": "719.0", - "developer": "Charities Housing", - "imageUrl": "/images/met-north.png", - "programRules": "Applicants must adhere to minimum & maximum income limits. Tenant Selection Criteria applies.", - "externalId": null, - "waitlistMaxSize": 300, - "name": "Met North", - "neighborhood": null, - "waitlistCurrentSize": 0, - "petPolicy": "No pets allowed. Accomodation animals may be granted to persons with disabilities via a reasonable accomodation request. ", - "prioritiesDescriptor": null, - "requiredDocuments": "Completed application and government issued IDs, income and asset information", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": null, - "reservedDescriptor": null, - "smokingPolicy": "Non-Smoking Property", - "yearBuilt": 2016, - "createdAt": "2019-10-19T17:00:00.000Z", - "updatedAt": "2019-10-24T17:00:00.000Z", - "groupId": 1, - "hideUnitFeatures": false, - "disableUnitsAccordion": true, - "unitAmenities": "Dishwasher, microwave, balcony/patio, central heating & A/C", - "applicationFee": "30.0", - "criminalBackground": "A criminal background investigation will be obtained on each applicant. As criminal background checks are done county by county and will be ran for all counties in which the applicant lived, Applicants will be denied for tenancy if they have been convicted of a felony or misdemeanor. Refer to Tenant Selection Criteria or Qualification Criteria for details related to the qualification process.", - "leasingAgentAddress": { - "city": "San Jose", - "county": "San Jose", - "state": "CA", - "street": "2122 Monterey Road", - "zipCode": "95112", - "latitude": 37.305342986666666, - "longitude": -121.86262929333333 - }, - "leasingAgentEmail": "rusher@charitieshousing.org", - "leasingAgentName": "Raynesha Usher", - "leasingAgentOfficeHours": "Application will be available for download here and pickup at the office on Nov 12 from 9:00AM - 4:00PM. Completed applications are due on Nov 14 and can be submitted at the office from Nov 13 to Nov 14, between 9:00AM - 3:00PM.", - "leasingAgentPhone": "(408) 982-3840", - "leasingAgentTitle": null, - "rentalHistory": "Two years of rental history will be verified with all applicable landlords. Household family members and/or personal friends are not acceptable landlord references. Two professional character references may be used in lieu of rental history for applicants with no prior rental history. An unlawful detainer report will be processed thourhg the U.D. Registry, Inc. Applicants will be disqualified if they have any evictions filing within the last 7 years. Refer to Tenant Selection Criteria or Qualification Criteria for details related to the qualification process.", - "buildingTotalUnits": 70, - "postmarkedApplicationsReceivedByDate": "2019-11-18T00:00:00+00:00", - "totalUnits": 86, - "unitsAvailable": 0, - "units": [ - { - "id": "6b15b140-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "392", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15b1a0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "18240.0", - "monthlyIncomeMin": "1520.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "760.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15b1c0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "33600.0", - "monthlyIncomeMin": "2800.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1400.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "830", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15b1e0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "37224.0", - "monthlyIncomeMin": "3102.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1551.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15b200-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "37224.0", - "monthlyIncomeMin": "3102.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1551.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15b210-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "37224.0", - "monthlyIncomeMin": "3102.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1551.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15b230-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "37224.0", - "monthlyIncomeMin": "3102.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1551.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15b250-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "37224.0", - "monthlyIncomeMin": "3102.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1551.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15b270-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "37224.0", - "monthlyIncomeMin": "3102.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1551.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15b280-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "37224.0", - "monthlyIncomeMin": "3102.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1551.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15b2a0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "37224.0", - "monthlyIncomeMin": "3102.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1551.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15b2c0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "37224.0", - "monthlyIncomeMin": "3102.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1551.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15b2e0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "37224.0", - "monthlyIncomeMin": "3102.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1551.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15b320-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "37224.0", - "monthlyIncomeMin": "3102.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1551.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15b340-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "37224.0", - "monthlyIncomeMin": "3102.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1551.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15b380-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "37224.0", - "monthlyIncomeMin": "3102.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1551.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15b3b0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "24072.0", - "monthlyIncomeMin": "2006.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1003.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1061", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15bf00-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "24072.0", - "monthlyIncomeMin": "2006.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1003.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1061", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15bf30-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "24072.0", - "monthlyIncomeMin": "2006.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1003.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15bf70-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "24072.0", - "monthlyIncomeMin": "2006.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1003.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15bf80-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "24072.0", - "monthlyIncomeMin": "2006.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1003.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15bfa0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "24072.0", - "monthlyIncomeMin": "2006.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1003.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15bfc0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "24072.0", - "monthlyIncomeMin": "2006.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1003.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15bfe0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "24072.0", - "monthlyIncomeMin": "2006.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1003.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15bff0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "24072.0", - "monthlyIncomeMin": "2006.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1003.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c010-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "24072.0", - "monthlyIncomeMin": "2006.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1003.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c030-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "24072.0", - "monthlyIncomeMin": "2006.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1003.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c050-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "24072.0", - "monthlyIncomeMin": "2006.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 7, - "minOccupancy": 4, - "monthlyRent": "1003.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1055", - "status": "occupied", - "unitType": "threeBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c060-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "33600.0", - "monthlyIncomeMin": "2800.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1400.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "830", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c080-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "33600.0", - "monthlyIncomeMin": "2800.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1400.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "830", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c0a0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "33600.0", - "monthlyIncomeMin": "2800.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1400.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "830", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c0c0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "33600.0", - "monthlyIncomeMin": "2800.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1400.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "830", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c0e0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "33600.0", - "monthlyIncomeMin": "2800.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1400.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "830", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c0f0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "33600.0", - "monthlyIncomeMin": "2800.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1400.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "830", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c110-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "33600.0", - "monthlyIncomeMin": "2800.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "1400.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "830", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c130-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "21744.0", - "monthlyIncomeMin": "1812.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "906.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "830", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c140-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "21744.0", - "monthlyIncomeMin": "1812.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "906.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "830", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c160-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "21744.0", - "monthlyIncomeMin": "1812.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "906.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "830", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c180-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "21744.0", - "monthlyIncomeMin": "1812.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "906.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "830", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c1a0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "21744.0", - "monthlyIncomeMin": "1812.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "906.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "830", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c1b0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "21744.0", - "monthlyIncomeMin": "1812.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "906.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "830", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c1d0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "21744.0", - "monthlyIncomeMin": "1812.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "906.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "830", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c1f0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "21744.0", - "monthlyIncomeMin": "1812.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "906.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "830", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c210-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "28128.0", - "monthlyIncomeMin": "2344.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1172.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c220-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "28128.0", - "monthlyIncomeMin": "2344.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1172.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c240-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "28128.0", - "monthlyIncomeMin": "2344.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1172.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c260-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "28128.0", - "monthlyIncomeMin": "2344.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1172.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c290-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "28128.0", - "monthlyIncomeMin": "2344.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1172.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c2b0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "28128.0", - "monthlyIncomeMin": "2344.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1172.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c2c0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "28128.0", - "monthlyIncomeMin": "2344.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1172.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c390-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "28128.0", - "monthlyIncomeMin": "2344.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1172.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c3b0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "28128.0", - "monthlyIncomeMin": "2344.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1172.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c3d0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "28128.0", - "monthlyIncomeMin": "2344.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1172.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c3f0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "28128.0", - "monthlyIncomeMin": "2344.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1172.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c400-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "28128.0", - "monthlyIncomeMin": "2344.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1172.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c420-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "28128.0", - "monthlyIncomeMin": "2344.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1172.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c440-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "28128.0", - "monthlyIncomeMin": "2344.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1172.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c460-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "28128.0", - "monthlyIncomeMin": "2344.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1172.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c470-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "45.0", - "annualIncomeMin": "28128.0", - "monthlyIncomeMin": "2344.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1172.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c480-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "18240.0", - "monthlyIncomeMin": "1520.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "760.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15c4a0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "18240.0", - "monthlyIncomeMin": "1520.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "760.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cd40-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "18240.0", - "monthlyIncomeMin": "1520.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "760.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cd60-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "18240.0", - "monthlyIncomeMin": "1520.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "760.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cd70-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "18240.0", - "monthlyIncomeMin": "1520.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "760.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cd90-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "18240.0", - "monthlyIncomeMin": "1520.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "760.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cdb0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "18240.0", - "monthlyIncomeMin": "1520.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "760.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cdd0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "18240.0", - "monthlyIncomeMin": "1520.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "760.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cdf0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "18240.0", - "monthlyIncomeMin": "1520.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "760.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15ce00-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "18240.0", - "monthlyIncomeMin": "1520.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "760.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15ce20-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "18240.0", - "monthlyIncomeMin": "1520.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "760.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15ce40-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "18240.0", - "monthlyIncomeMin": "1520.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "760.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15ce60-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "18240.0", - "monthlyIncomeMin": "1520.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "760.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15ce70-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "18240.0", - "monthlyIncomeMin": "1520.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "760.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15ce90-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "18240.0", - "monthlyIncomeMin": "1520.0", - "floor": 1, - "annualIncomeMax": null, - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "760.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "570", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cea0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "392", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cec0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "392", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cee0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "392", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cef0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 4, - "annualIncomeMax": null, - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "392", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cf10-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "392", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cf40-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "392", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cf60-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "392", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cf80-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 3, - "annualIncomeMax": null, - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "392", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cfa0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "392", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cfc0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "392", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cfd0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "392", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b15cff0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "30.0", - "annualIncomeMin": "17256.0", - "monthlyIncomeMin": "1438.0", - "floor": 2, - "annualIncomeMax": null, - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "719.0", - "numBathrooms": null, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "392", - "status": "occupied", - "unitType": "studio", - "createdAt": "2019-10-21T17:00:00.000Z", - "updatedAt": "2019-10-21T17:00:00.000Z", - "listingId": 6, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - } - ], - "preferences": [ - - ], - "applicationMethods": [ - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "externalReference": "http://bit.ly/2MTa79o", - "label": "English" - }, - { - "type": "LeasingAgent", - "acceptsPostmarkedApplications": true - }, - { - "type": "POBox", - "acceptsPostmarkedApplications": false - }, - { - "type": "PaperPickup", - "acceptsPostmarkedApplications": false - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/met-north.png" - } - ] -} diff --git a/backend/core/listing_data/monarch.json b/backend/core/listing_data/monarch.json deleted file mode 100644 index bc3525da74..0000000000 --- a/backend/core/listing_data/monarch.json +++ /dev/null @@ -1,700 +0,0 @@ -{ - "id": "ab67b61190aa4a4db7547b0161854ff8", - "events":[], - "accessibility": "Monarch Homes has some units that are accessible for residents with mobility, hearing, and vision impairments. Some units include an audible and visual fire alarm and door chime, grab bars, adjustable shelving, easy to reach outlets, switches, counters, and appliances; and 36\" door width throughout unit. The building has an elevator with a generous waiting area on each residential floor, and laundry room with front loading washers and dryers. There is limited on-site parking. We will provide reasonable accommodations when requested, verified, and necessary.", - "amenities": "On-site proeprty management, on-site laundry, community room, exercise room, community garden, close to AC Transit bus lines", - "applicationAddress": { - "city": "", - "street": "", - "zipCode": "", - "state": "", - "latitude": null, - "longitude": null - }, - "applicationDueDate": "2020-10-01T17:00:00.000-07:00", - "applicationOpenDate": "2020-06-09T00:00:00.000-07:00", - "applicationOrganization": "Satellite Affordable Housing Associates", - "applicationPhone": "510-629-9097", - "buildingAddress": { - "city": "Oakland", - "county": "Alameda", - "street": "3268 San Pablo Avenue", - "zipCode": "94608", - "state": "CA", - "latitude": 37.824174, - "longitude": -122.277135 - }, - "buildingSelectionCriteria": "https://www.sahahomes.org/apply", - "costsNotIncluded": "Deposit is equal to one month of rent", - "creditHistory": "Not applicable", - "depositMax": "1470.00", - "depositMin": "0.00", - "developer": "Satellite Affordable Housing Associates", - "programRules": "", - "externalId": null, - "waitlistMaxSize": 240, - "name": "Monarch Homes", - "neighborhood": "", - "waitlistCurrentSize": 0, - "petPolicy": "Certain pets are allowed. Residents must apply, the animal must be approved, and there is a $200 pet deposit. For more detailed information, request a copy of SAHA’s pet policy.", - "prioritiesDescriptor": "Monarch Homes has some units that are accessible for residents with mobility, hearing, and vision impairments. Some units include an audible and visual fire alarm and door chime, grab bars, adjustable shelving, easy to reach outlets, switches, counters, and appliances; and 36\" door width throughout unit. The building has an elevator with a generous waiting area on each residential floor, and laundry room with front loading washers and dryers. There is limited on-site parking. We will provide reasonable accommodations when requested, verified, and necessary. ", - "requiredDocuments": "", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": 62, - "reservedDescriptor": "All household members must be age 62 or older at the time of application. Reasonable accommodations can be requested for live-in aides of any age.", - "smokingPolicy": "Smoking is not allowed. For more detailed information, request to see a copy of SAHA’s Agreement Regarding No Smoking Policy", - "yearBuilt": 2020, - "createdAt": "2020-05-14T15:11:26.446-07:00", - "updatedAt": "2020-05-14T11:47:47.150-07:00", - "groupId": 1, - "hideUnitFeatures": false, - "disableUnitsAccordion": true, - "unitAmenities": "", - "applicationFee": "0.00", - "criminalBackground": "Not applicable due to the Oakland Fair Chance Ordinance", - "leasingAgentEmail": "monarch@sahahomes.org", - "leasingAgentName": "Satellite Affordable Housing Associates", - "leasingAgentAddress": { - "city": "Oakland", - "street": "3250 San Pablo Ave", - "zipCode": "94608", - "state": "CA", - "latitude": 37.824174, - "longitude": -122.277135 - }, - "leasingAgentOfficeHours": "Due to COVID-19, our offices are closed. Please call or email leasing agent for any questions Monday - Friday 9AM-5PM.", - "leasingAgentPhone": "510-629-9097", - "leasingAgentTitle": "Property Management", - "rentalAssistance": "All units have Project Based Section 8 Voucher assistance. Rent will be based on 30% of monthly household income, resulting in a monthly rent between $0 - $1,470.", - "rentalHistory": "Applicants with an eviction or unlawful detainer judgment date within the last five (5) years will be denied. Stipulations, dismissals, and cases without a final disposition are not a reason for denial. Management will verify residency with current and prior landlords for the past two (2) years. Management is specifically looking at payment history, incidents of damage and/or housekeeping issues, lease violations and eviction proceedings. If a negative landlord reference is received, the application will be denied. Lack of residential history does not necessarily disqualify you.", - "preferences": [ - { - "ordinal": 1, - "title": "Displaced Household", - "subtitle": "", - "description": "Displaced household means a household in which a least one adult member has been displaced from a housing unit in Oakland as a result of any of the following:City code enforcement activities, if the displacement has occurred within one year prior to the date of application.A City-sponsored or City-assisted development project, if the displacement has occurred within one year prior to the date of application.A no fault eviction from a rental unit in Oakland, if the eviction was completed eight (8) years or less prior to the date of application. For purposes of this paragraph, a no fault eviction means an eviction that is evidenced by an eviction notice from the property owner that does not state cause and that gives the tenant thirty (30) days or longer notice to vacate the unit; a no fault eviction shall include, but not be limited to an eviction as a result of an owner move-in under Municipal Code Subsection 8.22.360.A.8. or 8.22.360.A.9., owner repairs under Municipal Code Subsection 8.22.360.A.10., or owner removal of the unit from the rental market under Municipal Code Subsection 8.22.360.A.11. or Municipal Code Chapter 8.22, Article III, but shall not be limited only to evictions from units that are covered by any of the above laws.", - "links": [] - }, - { - "ordinal": 2, - "title": "Neighborhood Residents", - "subtitle": "", - "description": "Neighborhood resident means a household with at least one adult member whose principal place of residence on the date of application is either within the Council District where the project is located or within a one mile radius of said project.", - "links": [] - }, - { - "ordinal": 3, - "title": "Oakland residents or Oakland workers", - "subtitle": "", - "description": "Oakland resident means a household with at least one adult member whose principal place of residence on the date of application is within the City of Oakland. 'Oakland worker' means a household with at least one adult member who is employed by an employer located within the City of Oakland, owns a business located within the City of Oakland, or participates in an education or job training program located within the City of Oakland.", - "links": [] - }, - { - "ordinal": 4, - "title": "Alameda County residents or Alameda County workers", - "subtitle": "", - "description": "Alameda County resident means a household with at least one adult member whose principal place of residence on the date of application is within Alameda County. An 'Alameda County worker' means a household with at least one adult member who is employed by an employer located within Alameda County or owns a business located within Alameda County.", - "links": [] - } - ], - "buildingTotalUnits": 50, - "applicationMethods": [ - { - "type": "ExternalLink", - "acceptsPostmarkedApplications": false, - "externalReference": "https://www.rentcafe.com/onlineleasing/monarch-homes/guestlogin.aspx" - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/monarch.jpg" - } - ], - "units": [ - { - "id": "MFaowAxySJW3utZBPNxr2", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 2, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "0.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "449", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr3", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr4", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr5", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr6", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr7", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr8", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr9", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr0", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "M0aowAxySJW3utZBPNxr3", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "M1aowAxySJW3utZBPNxr23", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "M2aowAxySJW3utZBPNxr3", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "M3aowAxySJW3utZBPNxr3", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "M4aowAxySJW3utZBPNxr3", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "M5aowAxySJW3utZBPNxr3", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "M6aowAxySJW3utZBPNxr3", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "M7aowAxySJW3utZBPNxr3", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "M8aowAxySJW3utZBPNxr3", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "M9aowAxySJW3utZBPNxr3", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "M0aowAxySJW3utZBPNxr3", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MF1owAxySJW3utZBPNxr3", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MF2owAxySJW3utZBPNxr3", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MF3owAxySJW3utZBPNxr3", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MF4owAxySJW3utZBPNxr3", - "amiPercentage": "50", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 5, - "annualIncomeMax": "$58,750", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1470.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": "senior", - "sqFeet": "580", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "ab67b61190aa4a4db7547b0161854ff8", - "amiChartId": 11, - "monthlyRentAsPercentOfIncome": null - } - ], - "unitsAvailable": 24, - "whatToExpect": { - "applicantsWillBeContacted": "Applicants will be contacted by the property agent in rank order until vacancies are filled.", - "allInfoWillBeVerified": "All of the information that you have provided will be verified and your eligibility confirmed. Your application will be removed from the waitlist if you have made any fraudulent statements. If we cannot verify a housing preference that you have claimed, you will not receive the preference but will not be otherwise penalized.", - "bePreparedIfChosen": "Should your application be chosen, be prepared to fill out a more detailed application and provide required supporting documents." - } -} diff --git a/backend/core/listing_data/montara.json b/backend/core/listing_data/montara.json deleted file mode 100644 index 17d852bbf2..0000000000 --- a/backend/core/listing_data/montara.json +++ /dev/null @@ -1,545 +0,0 @@ -{ - "name": "Montara", - "events":[], - "id": "6b173560-0cf8-0139-7cff-2683e7458fb7", - "imageUrl": "/images/montara.jpg", - "applicationDueDate": "2020-07-17T17:00:00.000-07:00", - "applicationPickUpAddressOfficeHours": "8am to 5pm Monday - Friday", - "applicationPickUpAddress": { - "placeName": "San Mateo City Hall", - "street": "330 W 20th Ave", - "city": "San Mateo", - "state": "CA", - "zipCode": "94403", - "county": "San Mateo", - "longitude": 37.5473044, - "latitude": -122.3173693 - }, - "applicationAddress": { - "street": "PO Box 7060", - "city": "San Mateo ", - "state": "CA", - "zipCode": "94403", - "county": "San Mateo", - "longitude": null, - "latitude": null - }, - "applicationPhone": "415-748-3984", - "leasingAgentName": "Leopoldo Batlle", - "leasingAgentTitle": "Director of Property Management", - "leasingAgentEmail": "montara.leasing@bridgehousing.com", - "depositMaxExtraText": "Lesser of tenant portion or flat rate (if applicant has housing choice Section 8 Voucher).", - "leasingAgentPhone": "415-748-3984", - "leasingAgentAddress": { - "street": "", - "city": "", - "state": "", - "zipCode": "", - "county": "San Mateo", - "longitude": null, - "latitude": null - }, - "whatToExpect": { - "applicantsWillBeContacted": "Applicants will be contacted by the agent in lottery rank order until vacancies are filled.", - "allInfoWillBeVerified": "All of the information that you have provided will be verified and your eligibility confirmed. Your application will be removed from the lottery if you have made any fraudulent statements, or if any household members appears on more than one application from this listing. If we cannot verify a housing lottery preference that you have claimed, you will not receive the preference but will not be otherwise penalized.", - "bePreparedIfChosen": "" - }, - "leasingAgentOfficeHours": "Closed to public due to COVID-19 Shelter in Place. Please see PDF Application for further instructions on submitting application.", - "applicationFee": "25.00", - "depositMin": "800.00", - "depositMax": "1000.00", - "costsNotIncluded": "Tenants pay electricity (heating, cooking, lighting), telephone, internet and cable. Rent is due by the 1st of each month. Late fee is $20 if rent is not received by the 5th of the month.", - "unitsAvailable": 17, - "waitlistMaxSize": 400, - "waitlistCurrentSize": 0, - "buildingTotalUnits": 68, - "buildingAddress": { - "street": "2775 S. Delaware Street", - "city": "San Mateo", - "state": "CA", - "zipCode": "94403", - "county": "San Mateo", - "longitude": -122.301167, - "latitude": 37.543543 - }, - "developer": "BRIDGE Housing Corporation", - "neighborhood": "San Mateo - Bay Meadows", - "yearBuilt": 2020, - "reservedCommunityMaximumAge": 0, - "reservedCommunityMinimumAge": 0, - "amenities": "Community room with kitchen, community garden, an outdoor courtyard, picnic area, elevator, bike parking, garage parking, on-site laundry, children's play area and on-site professional management.", - "unitAmenities": "Electric kitchen, dishwasher, heating ", - "accessibility": "Lobby and community room are wheelchair accessible. Building has common area accessible bathrooms and elevators and an accessible multipurpose room.\n\n Specific units are built out for handicapped and hearing accessibility.\n\nADA built out units have the following modifications:\n\nBathroom\n- Accessible bathtub with seat and controls with clearance for wheelchair\n- Bathtub surround with grab bars\n- Accessible bathroom sink and faucet\n- Accessible medicine cabinet\n- Grab bars at toilet\n- Lowered towel bars\n\nKitchen\n- Accessible range with space for wheelchair\n- Accessible switch for circulating hood (stove)\n- Kitchen electrical outlets and controls in proper reach range\n- Kitchen cabinets with 34\" high counter top and 30\" work surface\n\nLiving room/Bedroom\n- Closet rod and shelf at ADA height (48\")\n- Entry door and door hardware for ADA units includes lockset with levers, closer and peepholes\n\nHearing Units have the following modifications:\n- Fire alarm has Strobes\n- Doorbell with visual notification", - "smokingPolicy": "Non-Smoking", - "petPolicy": "Montara does not allow pets of any kind. Service and Companion Animals are not considered pets. Please refer to our reasonable accommodation policy. ", - "requiredDocuments": "See Application Checklist within the Building Selection Criteria for required income and asset documents due at the time of interview.", - "programRules": "In addition to qualifying under the rules for income and household size, applicants must qualify under the rules of the building as outlined within the Building Selection Criteria.", - "creditHistory": "(Student loans and medical expenses are excluded)\n\n- Total unmet credit problems (including governmental tax liens), within the last three (3) years must not be in excess of $2,500.\n- May not have a bankruptcy discharged (within the last three years).\n- May not have had a total of seven (7) unmet credit problems of any value within the last three (3) years.", - "rentalHistory": "- May not have a judgment against an applicant obtained by the current or previous landlord (no‐fault evictions will not count against applicant) within the last three (3) years.\n- May not have an unmet obligation owed to a previous landlord within the last three (3) years.\n- Applicant must have made timely payments of the last year's rental payments.", - "criminalBackground": "(Based on individual analysis and review of circumstances) \n\n- If any adult household member is subject to any state’s sex offender lifetime registration requirement.\n- Conviction for violent criminal activity that would threaten the health, safety, or right to peaceful enjoyment by other residents or employees and contractors who work with the project.\n- Conviction for drug related criminal activity that would threaten the health, safety, or right to peaceful enjoyment by other residents or employees and contractors who work with the project.\n- Other criminal conviction that would threaten the health, safety, or right to peaceful enjoyment by other residents or employees and contractors who work with the project.\n- Pending Charges (Which Have Not Been Dismissed).\n\nThe nature and severity of conduct underlying charging history will be considered, if the pending charge is for conduct that is: (a) a drug-related crime; (b) a person crime; (c) a sex offense; (d) a crime involving financial fraud, including identity theft and forgery; or (e) any other crime if the conduct for which the applicant was convicted or charged is of a nature that would adversely affect: (i) property of the landlord or a tenant; or (ii) The health, safety or right to peaceful enjoyment of the premises of residents, the landlord or the landlord’s agent.", - "buildingSelectionCriteria": "https://bridgehousing.com/wp-content/uploads/2020/06/Montara-Cvr-Ltr.pdf", - "units": [ - { - "number": "5", - "unitType": "oneBdrm", - "status": "available", - "monthlyRent": "1911", - "monthlyIncomeMin": "3822", - "annualIncomeMax": "93960", - "minOccupancy": 1, - "maxOccupancy": 3, - "reservedType": null, - "priorityType": "Mobility and hearing ", - "sqFeet": "479", - "floor": 1, - "createdAt": "2020-06-18T12:47:26.824542", - "updatedAt": "2020-06-18T12:47:26.824544", - "monthlyRentAsPercentOfIncome": null, - "numBathrooms": null, - "numBedrooms": null, - "id": "6b1735a0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "45864", - "listingId": 10, - "amiChartId": 8 - }, - { - "number": "5", - "unitType": "oneBdrm", - "status": "available", - "monthlyRent": "1911", - "monthlyIncomeMin": "3822", - "annualIncomeMax": "93960", - "minOccupancy": 1, - "maxOccupancy": 3, - "reservedType": null, - "priorityType": "Mobility and hearing ", - "sqFeet": "592", - "floor": 1, - "createdAt": "2020-06-18T12:47:26.824542", - "updatedAt": "2020-06-18T12:47:26.824544", - "monthlyRentAsPercentOfIncome": null, - "numBathrooms": null, - "numBedrooms": null, - "id": "6b1735d0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "45864", - "listingId": 10, - "amiChartId": 8 - }, - { - "number": "5", - "unitType": "oneBdrm", - "status": "available", - "monthlyRent": "1911", - "monthlyIncomeMin": "3822", - "annualIncomeMax": "93960", - "minOccupancy": 1, - "maxOccupancy": 3, - "reservedType": null, - "priorityType": "Mobility and hearing ", - "sqFeet": "479", - "floor": 1, - "createdAt": "2020-06-18T12:47:26.824542", - "updatedAt": "2020-06-18T12:47:26.824544", - "monthlyRentAsPercentOfIncome": null, - "numBathrooms": null, - "numBedrooms": null, - "id": "6b1735f0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "45864", - "listingId": 10, - "amiChartId": 8 - }, - { - "number": "5", - "unitType": "oneBdrm", - "status": "available", - "monthlyRent": "1911", - "monthlyIncomeMin": "3822", - "annualIncomeMax": "93960", - "minOccupancy": 1, - "maxOccupancy": 3, - "reservedType": null, - "priorityType": "Mobility and hearing ", - "sqFeet": "479", - "floor": 1, - "createdAt": "2020-06-18T12:47:26.824542", - "updatedAt": "2020-06-18T12:47:26.824544", - "monthlyRentAsPercentOfIncome": null, - "numBathrooms": null, - "numBedrooms": null, - "id": "6b1736a0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "45864", - "listingId": 10, - "amiChartId": 8 - }, - { - "number": "5", - "unitType": "oneBdrm", - "status": "available", - "monthlyRent": "1911", - "monthlyIncomeMin": "3822", - "annualIncomeMax": "93960", - "minOccupancy": 1, - "maxOccupancy": 3, - "reservedType": null, - "priorityType": "Mobility and hearing ", - "sqFeet": "479", - "floor": 1, - "createdAt": "2020-06-18T12:47:26.824542", - "updatedAt": "2020-06-18T12:47:26.824544", - "monthlyRentAsPercentOfIncome": null, - "numBathrooms": null, - "numBedrooms": null, - "id": "6b173710-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "45864", - "listingId": 10, - "amiChartId": 8 - }, - { - "number": "6", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "2286", - "monthlyIncomeMin": "4572", - "annualIncomeMax": "112800", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "N/A", - "sqFeet": "844", - "floor": 1, - "createdAt": "2020-06-18T12:47:26.824547", - "updatedAt": "2020-06-18T12:47:26.824549", - "monthlyRentAsPercentOfIncome": null, - "numBathrooms": null, - "numBedrooms": null, - "id": "6b173740-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "listingId": 10, - "amichartId": 8, - "annualIncomeMin": "54864", - "totalAvailable": 6 - }, - { - "number": "6", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "2286", - "monthlyIncomeMin": "4572", - "annualIncomeMax": "112800", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "N/A", - "sqFeet": "979", - "floor": 1, - "createdAt": "2020-06-18T12:47:26.824547", - "updatedAt": "2020-06-18T12:47:26.824549", - "monthlyRentAsPercentOfIncome": null, - "numBathrooms": null, - "numBedrooms": null, - "id": "6b173770-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "listingId": 10, - "amichartId": 8, - "annualIncomeMin": "54864", - "totalAvailable": 6 - }, - { - "number": "6", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "2286", - "monthlyIncomeMin": "4572", - "annualIncomeMax": "112800", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "N/A", - "sqFeet": "844", - "floor": 1, - "createdAt": "2020-06-18T12:47:26.824547", - "updatedAt": "2020-06-18T12:47:26.824549", - "monthlyRentAsPercentOfIncome": null, - "numBathrooms": null, - "numBedrooms": null, - "id": "6b1737a0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "listingId": 10, - "amichartId": 8, - "annualIncomeMin": "54864", - "totalAvailable": 6 - }, - { - "number": "6", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "2286", - "monthlyIncomeMin": "4572", - "annualIncomeMax": "112800", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "N/A", - "sqFeet": "844", - "floor": 1, - "createdAt": "2020-06-18T12:47:26.824547", - "updatedAt": "2020-06-18T12:47:26.824549", - "monthlyRentAsPercentOfIncome": null, - "numBathrooms": null, - "numBedrooms": null, - "id": "6b1737d0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "listingId": 10, - "amichartId": 8, - "annualIncomeMin": "54864", - "totalAvailable": 6 - }, - { - "number": "6", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "2286", - "monthlyIncomeMin": "4572", - "annualIncomeMax": "112800", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "N/A", - "sqFeet": "844", - "floor": 1, - "createdAt": "2020-06-18T12:47:26.824547", - "updatedAt": "2020-06-18T12:47:26.824549", - "monthlyRentAsPercentOfIncome": null, - "numBathrooms": null, - "numBedrooms": null, - "id": "6b173800-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "listingId": 10, - "amichartId": 8, - "annualIncomeMin": "54864", - "totalAvailable": 6 - }, - { - "number": "6", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "2286", - "monthlyIncomeMin": "4572", - "annualIncomeMax": "112800", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "N/A", - "sqFeet": "844", - "floor": 1, - "createdAt": "2020-06-18T12:47:26.824547", - "updatedAt": "2020-06-18T12:47:26.824549", - "monthlyRentAsPercentOfIncome": null, - "numBathrooms": null, - "numBedrooms": null, - "id": "6b173830-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "listingId": 10, - "amichartId": 8, - "annualIncomeMin": "54864", - "totalAvailable": 6 - }, - { - "number": "6", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "2631", - "monthlyIncomeMin": "5262", - "annualIncomeMax": "129480", - "minOccupancy": 3, - "maxOccupancy": 7, - "reservedType": null, - "priorityType": "Mobility and hearing ", - "sqFeet": "1078", - "floor": 1, - "createdAt": "2020-06-18T12:47:26.824551", - "updatedAt": "2020-06-18T12:47:26.824553", - "monthlyRentAsPercentOfIncome": null, - "numBathrooms": null, - "numBedrooms": null, - "id": "6b173860-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "63144", - "listingId": 10, - "amichartId": 8 - }, - { - "number": "6", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "2631", - "monthlyIncomeMin": "5262", - "annualIncomeMax": "129480", - "minOccupancy": 3, - "maxOccupancy": 7, - "reservedType": null, - "priorityType": "Mobility and hearing ", - "sqFeet": "1186", - "floor": 1, - "createdAt": "2020-06-18T12:47:26.824551", - "updatedAt": "2020-06-18T12:47:26.824553", - "monthlyRentAsPercentOfIncome": null, - "numBathrooms": null, - "numBedrooms": null, - "id": "6b173890-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "63144", - "listingId": 10, - "amichartId": 8 - }, - { - "number": "6", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "2631", - "monthlyIncomeMin": "5262", - "annualIncomeMax": "129480", - "minOccupancy": 3, - "maxOccupancy": 7, - "reservedType": null, - "priorityType": "Mobility and hearing ", - "sqFeet": "1078", - "floor": 1, - "createdAt": "2020-06-18T12:47:26.824551", - "updatedAt": "2020-06-18T12:47:26.824553", - "monthlyRentAsPercentOfIncome": null, - "numBathrooms": null, - "numBedrooms": null, - "id": "6b1738c0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "63144", - "listingId": 10, - "amichartId": 8 - }, - { - "number": "6", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "2631", - "monthlyIncomeMin": "5262", - "annualIncomeMax": "129480", - "minOccupancy": 3, - "maxOccupancy": 7, - "reservedType": null, - "priorityType": "Mobility and hearing ", - "sqFeet": "1078", - "floor": 1, - "createdAt": "2020-06-18T12:47:26.824551", - "updatedAt": "2020-06-18T12:47:26.824553", - "monthlyRentAsPercentOfIncome": null, - "numBathrooms": null, - "numBedrooms": null, - "id": "6b1738e0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "63144", - "listingId": 10, - "amichartId": 8 - }, - { - "number": "6", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "2631", - "monthlyIncomeMin": "5262", - "annualIncomeMax": "129480", - "minOccupancy": 3, - "maxOccupancy": 7, - "reservedType": null, - "priorityType": "Mobility and hearing ", - "sqFeet": "1078", - "floor": 1, - "createdAt": "2020-06-18T12:47:26.824551", - "updatedAt": "2020-06-18T12:47:26.824553", - "monthlyRentAsPercentOfIncome": null, - "numBathrooms": null, - "numBedrooms": null, - "id": "6b173910-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "63144", - "listingId": 10, - "amichartId": 8 - }, - { - "number": "6", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "2631", - "monthlyIncomeMin": "5262", - "annualIncomeMax": "129480", - "minOccupancy": 3, - "maxOccupancy": 7, - "reservedType": null, - "priorityType": "Mobility and hearing ", - "sqFeet": "1078", - "floor": 1, - "createdAt": "2020-06-18T12:47:26.824551", - "updatedAt": "2020-06-18T12:47:26.824553", - "monthlyRentAsPercentOfIncome": null, - "numBathrooms": null, - "numBedrooms": null, - "id": "6b173940-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "60.0", - "annualIncomeMin": "63144", - "listingId": 10, - "amichartId": 8 - } - ], - "preferences": [ - { - "title": "Live or Work Preference", - "subtitle": "As required by the City of San Mateo, Montara offers a preference for households with at least one member who currently lives and/or works within the City of San Mateo for the affordable non-subsidized units. A San Mateo worker includes persons who are employed or notified that they are hired to work in the City of San Mateo for at least 20 hours per week (or “half-time”). At initial lease-up, if an applicant has been furloughed or laid off as a result of a response to COVID-19, the applicant may still be able to qualify for preference if they can provide proof that they were employed in the City of San Mateo in March 2020. ", - "ordinal": 1 - } - ], - "createdAt": "2020-06-18T12:47:26.824522", - "updatedAt": "2020-06-18T12:47:26.824539", - "disableUnitsAccordion": true, - "postmarkedApplicationsReceivedByDate": null, - "reservedDescriptor": null, - "groupId": null, - "applicationOrganization": "", - "hideUnitFeatures": false, - "totalUnits": 3, - "externalId": null, - "prioritiesDescriptor": null, - "applicationMethods": [ - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "externalReference": "https://www.bridgehousing.com/Montara-DAHLIA-Pre-App-Pkt-ENG/", - "label": "English" - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "externalReference": "https://www.bridgehousing.com/Montara-DAHLIA-Pre-App-Pkt-SPA/", - "label": "Spanish" - }, - { - "type": "POBox", - "acceptsPostmarkedApplications": false - }, - { - "type": "PaperPickup", - "acceptsPostmarkedApplications": false - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/montara.jpg" - } - ] -} diff --git a/backend/core/listing_data/new-skyline.json b/backend/core/listing_data/new-skyline.json deleted file mode 100644 index 3de186ad4f..0000000000 --- a/backend/core/listing_data/new-skyline.json +++ /dev/null @@ -1,953 +0,0 @@ -{ - "id": "HOLNx_F7fUCeax5GCoIr9g", - "events": [], - "postmarkedApplicationsReceivedByDate": null, - "applicationAddress": { - "city": "Oakland", - "street": "3933 Telegraph Ave", - "zipCode": "94609", - "state": "CA", - "latitude": null, - "longitude": null - }, - "applicationDueDate": null, - "applicationOrganization": "Greystar", - "applicationPhone": "510-747-5817", - "buildingSelectionCriteria": null, - "countyCode": "Alameda", - "costsNotIncluded": "Resident responsible for utilities: electric, gas, cable/internet, and personal liability policy as outlined in the lease agreement. Pet Deposit $500, Monthly Pet Rent $50. Replacement Key Fobs/Remotes $50. Rent is due by the 3rd of each month. Late fee is $200.00. Resident to pay $35 for each returned check or rejected electronic payment.", - "creditHistory": "We obtain a credit report on each applicant. Our credit reporting agency evaluates credit (which may include rent payment history) as an indicator of future rent payment performance. An unsatisfactory or insufficient finding will result in the requirement of an additional deposit, guarantor, or denial. Applicants are responsible for ensuring their credit history is accurate.", - "CSVFormattingType": "basic", - "depositMax": "500", - "depositMin": "3,018", - "programRules": null, - "externalId": null, - "waitlistMaxSize": 650, - "name": "The Skylyne at Temescal", - "waitlistCurrentSize": 122, - "prioritiesDescriptor": null, - "requiredDocuments": "Income: If you work and receive paystubs: - Copies of 3 months’ worth of consecutive paystubs, beginning with the most recent paystub. - If hired recently, provide Employment Offer Letter. If you receive severance pay, Social Security, unemployment benefits, retirement income, disability, public assistance, or the like, submit: - Most recent benefits letter(s) stating your monthly award If you are Self-Employed, you must: - Complete an Self-Employed Declaration form - Submit Year-to-Date Profit and Loss statement - Submit the past year’s federal income tax returns If you are Unemployed and have ZERO income, you must: - Complete an Unemployment Declaration - Submit the previous year’s federal income tax returns Assets: - 6-consecutive and most recent official bank statements for Checking accounts and include ALL pages. - 1 most recent statement for all other assets (IE: Savings, 401K, Money Market, etc.) and include ALL pages. - A written explanation and supporting documentation for any deposit over $100 other than that of your documented employment Building Documents: - Application - Release & Consent Form - Resident Qualification Acknowledgment", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": null, - "reservedDescriptor": null, - "status": "active", - "createdAt": "2020-11-06T15:11:26.446-08:00", - "updatedAt": "2020-11-06T11:47:47.150-08:00", - "groupId": 1, - "hideUnitFeatures": false, - "disableUnitsAccordion": true, - "applicationFee": "50.94", - "criminalBackground": "No criminal background checks under Oaklands Fair Chance ordinance", - "leasingAgentEmail": "TheSkylyneBMR@greystar.com", - "leasingAgentName": "Roman Guzman", - "leasingAgentAddress": { - "city": "Oakland", - "street": "3883 Turquoise Way", - "zipCode": "94609", - "state": "CA", - "latitude": 37.828343, - "longitude": -122.265967 - }, - "leasingAgentOfficeHours": "Mon-Fri 9AM-5PM", - "leasingAgentPhone": "510-747-5817", - "leasingAgentTitle": "Management Coordinator - Affordable Housing", - "rentalHistory": "Applicant must be able to provide sufficient residential information for at least the past two years to enable the Property Manager to adequately evaluate rental history and/or place of residence. If two years of prior residential information proves insufficient for obtaining adequate references, additional residential history may be requested. Negative rental history will be grounds for denial, including: Any evictions with an outstanding judgement, 4 or more evictions filings, 4 or more late payments being reported on the rental history report ", - "specialNotes": null, - "preferences": [ - { - "page": 1, - "ordinal": 1, - "title": "Displaced Preference", - "subtitle": "", - "description": "1. Displaced Preference - Households who have been displaced as a result of the City of Oakland’s public project or the City’s code enforcement activities.", - "links": [], - "formMetadata": { - "key": "displacedTenant", - "options": [ - { - "key": "general", - "extraData": [ - { - "type": "hhMemberSelect", - "key": "name" - }, - { - "type": "address", - "key": "address" - } - ] - }, - { - "key": "missionCorridor", - "extraData": [ - { - "type": "hhMemberSelect", - "key": "name" - }, - { - "type": "address", - "key": "address" - } - ] - } - ] - } - }, - { - "page": 2, - "ordinal": 2, - "title": "Live or Work Preference", - "subtitle": "", - "description": "1. Oakland Resident - Households who are current residents of the City of Oakland. 2. Oakland Worker - Households with at least one member who is currently employed in the city of Oakland, have been notified that they are hired to work in the city of Oakland, or are active participants in an educational or job training program located in the city of Oakland. ", - "links": [], - "formMetadata": { - "key": "liveWork", - "options": [ - { - "key": "live", - "extraData": [] - }, - { - "key": "work", - "extraData": [] - } - ] - } - } - ], - "property": { - "createdAt": "2021-02-02T17:00:00.000-08:00", - "updatedAt": "2021-02-02T17:00:00.000-08:00", - "servicesOffered": null, - "householdSizeMin": 1, - "householdSizeMax": 5, - "smokingPolicy": "Non-Smoking", - "unitsAvailable": 20, - "unitsSummarized": null, - "unitAmenities": "Refrigerator, washer/dryer, stove/range, microwave, dishwasher, google nest thermostat for AC/Heat", - "developer": "MPI MacArthur Tower, LLC", - "yearBuilt": 2020, - "accessibility": "All common areas ADA accessible and homes ADA adaptable. Features include outlet extenders, pullout breadboards, kickplates and cabinets, grab bar installation, and other reasonable accommodations upon request.", - "amenities": "Fitness club, rooftop pool, spa, firepits, BBQ’s, a sky kitchen & lounge, a woof deck, paw spa, co-working spaces, wi-fi lounges, bike room and DIY space", - "buildingTotalUnits": 402, - "buildingAddress": { - "county": "Alameda", - "city": "Oakland", - "street": "3883 Turquoise Way", - "zipCode": "94609", - "state": "CA", - "latitude": 37.828343, - "longitude": -122.265967 - }, - "neighborhood": "Oakland", - "petPolicy": "Pets allowed except the following; pit bull, malamute, akita, rottweiler, doberman, staffordshire terrier, presa canario, chowchow, american bull dog, karelian bear dog, st bernard, german shepherd, husky, great dane, any hybrid or mixed breed of the aforementioned breeds. 2 pets per household limit. $500 pet deposit per pet. $50 pet rent per pet.", - "units": [ - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "41400", - "monthlyIncomeMin": "3450", - "floor": 5, - "annualIncomeMax": "83550", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1725", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "468", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "41400", - "monthlyIncomeMin": "3450", - "floor": 9, - "annualIncomeMax": "83550", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1725", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "578", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "41400", - "monthlyIncomeMin": "3450", - "floor": 9, - "annualIncomeMax": "83550", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1725", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "578", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "41400", - "monthlyIncomeMin": "3450", - "floor": 9, - "annualIncomeMax": "83550", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1725", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "578", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "41400", - "monthlyIncomeMin": "3450", - "floor": 9, - "annualIncomeMax": "83550", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1725", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "578", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "41400", - "monthlyIncomeMin": "3450", - "floor": 9, - "annualIncomeMax": "83550", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1725", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "578", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "41400", - "monthlyIncomeMin": "3450", - "floor": 9, - "annualIncomeMax": "83550", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1725", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "578", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "41400", - "monthlyIncomeMin": "3450", - "floor": 9, - "annualIncomeMax": "83550", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1725", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "578", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 5, - "annualIncomeMax": "94000", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "544", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 9, - "annualIncomeMax": "94000", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "583", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 9, - "annualIncomeMax": "94000", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "583", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 9, - "annualIncomeMax": "94000", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "583", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 9, - "annualIncomeMax": "94000", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "583", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 9, - "annualIncomeMax": "94000", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "583", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 9, - "annualIncomeMax": "94000", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "583", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 9, - "annualIncomeMax": "94000", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "583", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 9, - "annualIncomeMax": "94000", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "583", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 9, - "annualIncomeMax": "94000", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "583", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 9, - "annualIncomeMax": "94000", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "583", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 9, - "annualIncomeMax": "94000", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "583", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - } - ] - }, - "applicationMethods": [ - { - "type": "Internal", - "acceptsPostmarkedApplications": true - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "English", - "externalReference": "https://theskylyne.com/p/bmr" - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/new-skyline.jpg" - } - ], - "amiChart": { - "name": "AlamedaCountyTCAC2021", - "items": [ - { - "percentOfAmi": 80, - "householdSize": 1, - "income": 76720 - }, - { - "percentOfAmi": 80, - "householdSize": 2, - "income": 87680 - }, - { - "percentOfAmi": 80, - "householdSize": 3, - "income": 98640 - }, - { - "percentOfAmi": 80, - "householdSize": 4, - "income": 109600 - }, - { - "percentOfAmi": 80, - "householdSize": 5, - "income": 11840 - }, - { - "percentOfAmi": 80, - "householdSize": 6, - "income": 127200 - }, - { - "percentOfAmi": 80, - "householdSize": 7, - "income": 135920 - }, - { - "percentOfAmi": 80, - "householdSize": 8, - "income": 144720 - }, - { - "percentOfAmi": 60, - "householdSize": 1, - "income": 57540 - }, - { - "percentOfAmi": 60, - "householdSize": 2, - "income": 65760 - }, - { - "percentOfAmi": 60, - "householdSize": 3, - "income": 73980 - }, - { - "percentOfAmi": 60, - "householdSize": 4, - "income": 82200 - }, - { - "percentOfAmi": 60, - "householdSize": 5, - "income": 88800 - }, - { - "percentOfAmi": 60, - "householdSize": 6, - "income": 95400 - }, - { - "percentOfAmi": 60, - "householdSize": 7, - "income": 101940 - }, - { - "percentOfAmi": 60, - "householdSize": 8, - "income": 108540 - }, - { - "percentOfAmi": 50, - "householdSize": 1, - "income": 47950 - }, - { - "percentOfAmi": 50, - "householdSize": 2, - "income": 54800 - }, - { - "percentOfAmi": 50, - "householdSize": 3, - "income": 61650 - }, - { - "percentOfAmi": 50, - "householdSize": 4, - "income": 68500 - }, - { - "percentOfAmi": 50, - "householdSize": 5, - "income": 74000 - }, - { - "percentOfAmi": 50, - "householdSize": 6, - "income": 79500 - }, - { - "percentOfAmi": 50, - "householdSize": 7, - "income": 84950 - }, - { - "percentOfAmi": 50, - "householdSize": 8, - "income": 90450 - }, - { - "percentOfAmi": 45, - "householdSize": 1, - "income": 43155 - }, - { - "percentOfAmi": 45, - "householdSize": 2, - "income": 49320 - }, - { - "percentOfAmi": 45, - "householdSize": 3, - "income": 55485 - }, - { - "percentOfAmi": 45, - "householdSize": 4, - "income": 61650 - }, - { - "percentOfAmi": 45, - "householdSize": 5, - "income": 66600 - }, - { - "percentOfAmi": 45, - "householdSize": 6, - "income": 71550 - }, - { - "percentOfAmi": 45, - "householdSize": 7, - "income": 76455 - }, - { - "percentOfAmi": 45, - "householdSize": 8, - "income": 81405 - }, - { - "percentOfAmi": 40, - "householdSize": 1, - "income": 38360 - }, - { - "percentOfAmi": 40, - "householdSize": 2, - "income": 43840 - }, - { - "percentOfAmi": 40, - "householdSize": 3, - "income": 49320 - }, - { - "percentOfAmi": 40, - "householdSize": 4, - "income": 54800 - }, - { - "percentOfAmi": 40, - "householdSize": 5, - "income": 59200 - }, - { - "percentOfAmi": 40, - "householdSize": 6, - "income": 63600 - }, - { - "percentOfAmi": 40, - "householdSize": 7, - "income": 67960 - }, - { - "percentOfAmi": 40, - "householdSize": 8, - "income": 72360 - }, - { - "percentOfAmi": 30, - "householdSize": 1, - "income": 28770 - }, - { - "percentOfAmi": 30, - "householdSize": 2, - "income": 32880 - }, - { - "percentOfAmi": 30, - "householdSize": 3, - "income": 36990 - }, - { - "percentOfAmi": 30, - "householdSize": 4, - "income": 41100 - }, - { - "percentOfAmi": 30, - "householdSize": 5, - "income": 44400 - }, - { - "percentOfAmi": 30, - "householdSize": 6, - "income": 47700 - }, - { - "percentOfAmi": 30, - "householdSize": 7, - "income": 50970 - }, - { - "percentOfAmi": 30, - "householdSize": 8, - "income": 54270 - }, - { - "percentOfAmi": 20, - "householdSize": 1, - "income": 19180 - }, - { - "percentOfAmi": 20, - "householdSize": 2, - "income": 21920 - }, - { - "percentOfAmi": 20, - "householdSize": 3, - "income": 24660 - }, - { - "percentOfAmi": 20, - "householdSize": 4, - "income": 27400 - }, - { - "percentOfAmi": 20, - "householdSize": 5, - "income": 29600 - }, - { - "percentOfAmi": 20, - "householdSize": 6, - "income": 31800 - }, - { - "percentOfAmi": 20, - "householdSize": 7, - "income": 33980 - }, - { - "percentOfAmi": 20, - "householdSize": 8, - "income": 36180 - } - ] - } -} diff --git a/backend/core/listing_data/nova.json b/backend/core/listing_data/nova.json deleted file mode 100644 index 905777eab0..0000000000 --- a/backend/core/listing_data/nova.json +++ /dev/null @@ -1,1779 +0,0 @@ -{ - "id": "HOLNx_F7fUCeax5GCoIr9g", - "events": [], - "postmarkedApplicationsReceivedByDate": null, - "applicationAddress": { - "city": "Oakland", - "state": "CA", - "street": "1900 Embarcadero", - "street2": "Suite #206", - "zipCode": "94606", - "latitude": 37.7831084, - "longitude": -122.2448444 - }, - "applicationDueDate": null, - "applicationOrganization": "Alameda County Health Care Services Agency", - "applicationPhone": "(714) 282-2520", - "buildingSelectionCriteria": null, - "costsNotIncluded": "For those without an income, rent is $50/month.", - "creditHistory": "", - "CSVFormattingType": "basic", - "depositMax": "500", - "depositMin": "500", - "programRules": "This property follows the California Tax Credit Allocation Committee's Low Income Housing Tax Credit Program (LIHTC). Compliance Monitoring Manual: https://www.treasurer.ca.gov/ctcac/compliance/manual/manual.pdf", - "externalId": null, - "waitlistMaxSize": null, - "name": "Nova", - "waitlistCurrentSize": null, - "prioritiesDescriptor": null, - "requiredDocuments": "Proof of income/assets", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": null, - "reservedDescriptor": null, - "status": "active", - "createdAt": "2021-04-27T15:11:26.446-08:00", - "updatedAt": "2021-04-27T11:47:47.150-08:00", - "groupId": 1, - "hideUnitFeatures": false, - "disableUnitsAccordion": true, - "applicationFee": "0", - "criminalBackground": "Completed by Oakland Housing Authority", - "leasingAgentEmail": "nova@solari-ent.com", - "leasingAgentName": "", - "leasingAgentAddress": { - "city": "Oakland", - "state": "CA", - "street": "445 30th St.", - "zipCode": "94609", - "latitude": 37.8189943, - "longitude": -122.2679097 - }, - "leasingAgentOfficeHours": "Monday - Friday, 8:00AM - 5:00PM", - "leasingAgentPhone": "(510) 977-9780", - "leasingAgentTitle": "Community Manager", - "rentalAssistance": "The property is subsidized by the Section 8 Project-Based Voucher Program. As a result, Housing Choice Vouchers, Section 8 and other valid rental assistance programs are not accepted by this property.", - "rentalHistory": "", - "preferences": [], - "property": { - "createdAt": "2021-04-27T17:00:00.000-08:00", - "updatedAt": "2021-04-27T17:00:00.000-08:00", - "householdSizeMin": 1, - "householdSizeMax": 3, - "smokingPolicy": "No smoking", - "unitsAvailable": 56, - "unitsSummarized": null, - "unitAmenities": "Furnished with bed, mattress, refrigerator and microwave", - "developer": "Affirmed Housing", - "yearBuilt": 2021, - "accessibility": "All units with adaptability features, with some mobility and hearing/vision units. Priorities units including 6 ADA Mobility units and 3 ADA Hearing/Vision units.", - "amenities": "Community room with kitchen, Supportive Services", - "buildingTotalUnits": 56, - "buildingAddress": { - "county": "Alameda", - "city": "Oakland", - "state": "CA", - "street": "445 30th Street", - "zipCode": "94609", - "latitude": 37.8189943, - "longitude": -122.2679097 - }, - "neighborhood": null, - "petPolicy": "No pets allowed", - "units": [ - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 2, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "303", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "21920", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "326", - "status": "available", - "unitType": "studio", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 2, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "436", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - }, - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "20", - "annualIncomeMin": "0", - "monthlyIncomeMin": "0", - "floor": 6, - "annualIncomeMax": "24660", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": null, - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": "specialNeeds", - "sqFeet": "459", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2021-04-27T21:20:34.291Z", - "updatedAt": "2021-04-27T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyTCAC2021", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": "30" - } - ] - }, - "applicationMethods": [], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/nova.jpg" - } - ], - "amiChart": { - "name": "AlamedaCountyTCAC2021", - "items": [ - { - "percentOfAmi": 80, - "householdSize": 1, - "income": 76720 - }, - { - "percentOfAmi": 80, - "householdSize": 2, - "income": 87680 - }, - { - "percentOfAmi": 80, - "householdSize": 3, - "income": 98640 - }, - { - "percentOfAmi": 80, - "householdSize": 4, - "income": 109600 - }, - { - "percentOfAmi": 80, - "householdSize": 5, - "income": 11840 - }, - { - "percentOfAmi": 80, - "householdSize": 6, - "income": 127200 - }, - { - "percentOfAmi": 80, - "householdSize": 7, - "income": 135920 - }, - { - "percentOfAmi": 80, - "householdSize": 8, - "income": 144720 - }, - { - "percentOfAmi": 60, - "householdSize": 1, - "income": 57540 - }, - { - "percentOfAmi": 60, - "householdSize": 2, - "income": 65760 - }, - { - "percentOfAmi": 60, - "householdSize": 3, - "income": 73980 - }, - { - "percentOfAmi": 60, - "householdSize": 4, - "income": 82200 - }, - { - "percentOfAmi": 60, - "householdSize": 5, - "income": 88800 - }, - { - "percentOfAmi": 60, - "householdSize": 6, - "income": 95400 - }, - { - "percentOfAmi": 60, - "householdSize": 7, - "income": 101940 - }, - { - "percentOfAmi": 60, - "householdSize": 8, - "income": 108540 - }, - { - "percentOfAmi": 50, - "householdSize": 1, - "income": 47950 - }, - { - "percentOfAmi": 50, - "householdSize": 2, - "income": 54800 - }, - { - "percentOfAmi": 50, - "householdSize": 3, - "income": 61650 - }, - { - "percentOfAmi": 50, - "householdSize": 4, - "income": 68500 - }, - { - "percentOfAmi": 50, - "householdSize": 5, - "income": 74000 - }, - { - "percentOfAmi": 50, - "householdSize": 6, - "income": 79500 - }, - { - "percentOfAmi": 50, - "householdSize": 7, - "income": 84950 - }, - { - "percentOfAmi": 50, - "householdSize": 8, - "income": 90450 - }, - { - "percentOfAmi": 45, - "householdSize": 1, - "income": 43155 - }, - { - "percentOfAmi": 45, - "householdSize": 2, - "income": 49320 - }, - { - "percentOfAmi": 45, - "householdSize": 3, - "income": 55485 - }, - { - "percentOfAmi": 45, - "householdSize": 4, - "income": 61650 - }, - { - "percentOfAmi": 45, - "householdSize": 5, - "income": 66600 - }, - { - "percentOfAmi": 45, - "householdSize": 6, - "income": 71550 - }, - { - "percentOfAmi": 45, - "householdSize": 7, - "income": 76455 - }, - { - "percentOfAmi": 45, - "householdSize": 8, - "income": 81405 - }, - { - "percentOfAmi": 40, - "householdSize": 1, - "income": 38360 - }, - { - "percentOfAmi": 40, - "householdSize": 2, - "income": 43840 - }, - { - "percentOfAmi": 40, - "householdSize": 3, - "income": 49320 - }, - { - "percentOfAmi": 40, - "householdSize": 4, - "income": 54800 - }, - { - "percentOfAmi": 40, - "householdSize": 5, - "income": 59200 - }, - { - "percentOfAmi": 40, - "householdSize": 6, - "income": 63600 - }, - { - "percentOfAmi": 40, - "householdSize": 7, - "income": 67960 - }, - { - "percentOfAmi": 40, - "householdSize": 8, - "income": 72360 - }, - { - "percentOfAmi": 30, - "householdSize": 1, - "income": 28770 - }, - { - "percentOfAmi": 30, - "householdSize": 2, - "income": 32880 - }, - { - "percentOfAmi": 30, - "householdSize": 3, - "income": 36990 - }, - { - "percentOfAmi": 30, - "householdSize": 4, - "income": 41100 - }, - { - "percentOfAmi": 30, - "householdSize": 5, - "income": 44400 - }, - { - "percentOfAmi": 30, - "householdSize": 6, - "income": 47700 - }, - { - "percentOfAmi": 30, - "householdSize": 7, - "income": 50970 - }, - { - "percentOfAmi": 30, - "householdSize": 8, - "income": 54270 - }, - { - "percentOfAmi": 20, - "householdSize": 1, - "income": 19180 - }, - { - "percentOfAmi": 20, - "householdSize": 2, - "income": 21920 - }, - { - "percentOfAmi": 20, - "householdSize": 3, - "income": 24660 - }, - { - "percentOfAmi": 20, - "householdSize": 4, - "income": 27400 - }, - { - "percentOfAmi": 20, - "householdSize": 5, - "income": 29600 - }, - { - "percentOfAmi": 20, - "householdSize": 6, - "income": 31800 - }, - { - "percentOfAmi": 20, - "householdSize": 7, - "income": 33980 - }, - { - "percentOfAmi": 20, - "householdSize": 8, - "income": 36180 - } - ] - } -} diff --git a/backend/core/listing_data/one_hundred_grand.json b/backend/core/listing_data/one_hundred_grand.json deleted file mode 100644 index cfaf98868b..0000000000 --- a/backend/core/listing_data/one_hundred_grand.json +++ /dev/null @@ -1,180 +0,0 @@ -{ - "id": "6b157e60-0cf8-0139-7cff-2683e7458fb7", - "events":[], - "accessibility": "Accessibility features in common areas like lobby – wheelchair ramps, wheelchair accessible bathrooms and elevators.", - "amenities": "Gym, Clubhouse, Business Lounge, View Lounge, Pool, Spafitness center, clubhouse, business center, heated pool & spa, outdoor BBQ’s, courtyard w/ fireplace", - "applicationDueDate": "2020-08-10T17:00:00.000-07:00", - "applicationOrganization": "One Hundred Grand", - "applicationAddress": { - "city": "Foster City", - "county": "San Mateo", - "zipCode": "94404", - "state": "CA", - "street": "100 Grand Lane", - "latitude": 37.562493, - "longitude": -122.268743 - }, - "applicationPhone": "(650) 350-1099", - "buildingAddress": { - "city": "Foster City", - "county": "San Mateo", - "zipCode": "94404", - "state": "CA", - "street": "100 Grand Lane", - "latitude": 37.562493, - "longitude": -122.268743 - }, - "buildingSelectionCriteria": null, - "costsNotIncluded": "Residents responsible for utilities: electric, gas, cable/internet, water, sewer, trash, admin fee. Residents required to maintain a renter's insurance policy as outlined in the lease agreement. Rent is due by the 3rd of each month and rent is considered late on the 4th of each month. Late fee is $150.00. Resident to pay $35 for each returned check or rejected electronic payment. Pet Deposit is $500 per pet. $50 monthly pet rent per pet.", - "creditHistory": "No collections, no bankruptcy, income is twice monthly rent. A credit report will be completed on all applicants to verify credit ratings. Income plus verified credit history will be entered into a credit scoring model to determine rental eligibility and security deposit levels. All decisions for residency are based on a system which considers credit history, rent history, income qualifications, and employment history. An approved decision based on the system does not automatically constittute an approval of residency. Applicant(s) and occupant(s) aged 18 years or older MUST also pass the criminal background check based on the criteria contained herein to be approved for residency. Credit recommendations other than an accept decision, will require a rental verification. Applications for residency will automatically be denied for the following reasons: a. An outstanding debt to a previous landlord or an outstanding NSF check must be paid in full b. An unsatisfied breach of a prior lease or a prior eviction of any applicant or occupant c. More than four (4) late pays and two (2) NSF's in the last twenty-four (24) months", - "depositMax": "2946", - "depositMin": "600", - "developer": "CV Triton, LLC", - "imageUrl": "/images/100_grand.jpg", - "programRules": null, - "externalId": null, - "waitlistMaxSize": 1000, - "name": "One Hundred Grand", - "neighborhood": "Foster City", - "waitlistCurrentSize": 452, - "petPolicy": "The following breeds are restricted from this community: Chows, Doberman Pinschers, Pit Bull/Staffordshire Terriers, Rottweilers, Presa Canarios, Akitas, Alaskan Malamutes, and Wolf-hybrids. Prohibited pets include, but are not limited to, monkeys, snakes, ferrets, iguanas, potbelly pigs and rabbits. There is a maximum of two pets per apartment home. The maximum weight limit for pets is 50 lbs.", - "prioritiesDescriptor": null, - "requiredDocuments": "Due at Interview: Income: If you work and receive paystubs: ▪ Copies of 3 months’ worth of consecutive paystubs, beginning with the most recent paystub.\n\n▪ If hired recently, provide Employment Offer Letter. If you receive severance pay, Social Security, unemployment benefits, retirement income, disability, public assistance, or the like, submit: ▪ Most recent benefits letter(s) stating your monthly award If you are Self-Employed, you must: ▪ Complete an Self-Employed Declaration form ▪ Submit Year-to-Date Profit and Loss statement ▪ Submit the past year’s federal income tax returns If you are Unemployed and have ZERO income, you must: ▪ Complete an Unemployment Declaration ▪ Submit the previous year’s federal income tax returns Assets: ▪ 6-consecutive and most recent official bank statements for Checking accounts and include ALL pages. ▪ 1 most recent statement for all other assets (IE: Savings, 401K, Money Market, etc.) and include ALL pages. ▪ A written explanation and supporting documentation for any deposit over $100 other than that of your documented employment. Building Documents: ▪ BMR Questionnaire ▪ Release & Consent Form ▪ Resident Qualification Acknowledgment ", - "reservedCommunityMaximumAge": 0, - "reservedCommunityMinimumAge": 0, - "reservedDescriptor": null, - "smokingPolicy": "Non-Smoking", - "yearBuilt": 1999, - "createdAt": "2019-06-03T10:30:41.039Z", - "updatedAt": "2020-06-9T22:15:15.443Z", - "hideUnitFeatures": false, - "unitAmenities": "Refrigerator, washer/dryer, gas stoves, microwave, dishwasher, central AC/Heat, quartz countertops, wood flooring, patio/balcony", - "applicationFee": "50.94", - "criminalBackground": "We obtain a criminal background check on each applicant who will reside in the apartment home. It is possible your application will be denied due to criminal convictions.", - "leasingAgentAddress": { - "city": "Foster City", - "county": "San Mateo", - "zipCode": "94404", - "state": "CA", - "street": "100 Grand Lane", - "latitude": 37.562493, - "longitude": -122.268743 - }, - "leasingAgentEmail": "100grandbmr@greystar.com", - "leasingAgentName": "Tori Ames", - "leasingAgentOfficeHours": "Due to COVID-19, our offices are closed. In-person visits and application drop off will not be accepted.", - "leasingAgentPhone": "(650) 350-1099", - "leasingAgentTitle": "Assistant Community Manager", - "rentalHistory": "Our credit reporting agency also reviews eviction and court databases to search for both eviction filings and judgements within the past 24 months and may include rent payment history as an indicator of future rent payment performance. Applicants are responsible for ensuring their rental history is accurate. No Fault or Dismissed evictions will not be held against the household. If a household does not meet the rental or credit criteria it could result in the denial of their application. Mitigating Circumstances will be considered on a case-by-case basis.", - "buildingTotalUnits": 1, - "postmarkedApplicationsReceivedByDate": null, - "totalUnits": 166, - "unitsAvailable": 1, - "units": [ - { - "id": "6b159210-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "80.0", - "annualIncomeMin": "70704.0", - "monthlyIncomeMin": "5892.0", - "floor": 3, - "annualIncomeMax": "97,600-150,600", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2946.0", - "numBathrooms": null, - "numBedrooms": 1, - "number": "308", - "priorityType": null, - "reservedType": null, - "sqFeet": "1138", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2019-06-03T10:42:43.134Z", - "updatedAt": "2019-07-10T09:44:01.384Z", - "listingId": 3, - "amiChartId": 7, - "monthlyRentAsPercentOfIncome": null - } - ], - "preferences": [ - { - "ordinal": 1, - "title": "Preference 1a", - "subtitle": null, - "description": "Persons who are living in a Below Market Rate deed restricted unit in Foster City for a minimum of twelve (12) months that is subject to termination of affordability restrictions within three (3) years.", - "links": [ - - ] - }, - { - "ordinal": 2, - "title": "Preference 1b", - "subtitle": null, - "description": "Persons who live and work in Foster City.", - "links": [ - - ] - }, - { - "ordinal": 3, - "title": "Preference 2", - "subtitle": null, - "description": "Persons who live in Foster City.", - "links": [ - - ] - }, - { - "ordinal": 4, - "title": "Preference 3", - "subtitle": null, - "description": "Employees of the City of Foster City.", - "links": [ - - ] - }, - { - "ordinal": 5, - "title": "Preference 4", - "subtitle": null, - "description": "Classroom teachers who are employees of the San Mateo-Foster City School District, the San Mateo Union High School District and the San Mateo County Community College District.", - "links": [ - - ] - }, - { - "ordinal": 6, - "title": "Preference 5", - "subtitle": null, - "description": "Persons who work in Foster City.", - "links": [ - - ] - }, - { - "ordinal": 7, - "title": "Preference 6", - "subtitle": null, - "description": "All others who are income qualified.", - "links": [ - - ] - } - ], - "applicationMethods": [ - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "externalReference": "https://100grandapts.com/bmr.php", - "label": "English" - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/100_grand.jpg" - } - ] -} diff --git a/backend/core/listing_data/pensione_esperanza.json b/backend/core/listing_data/pensione_esperanza.json deleted file mode 100644 index 25f9bdb489..0000000000 --- a/backend/core/listing_data/pensione_esperanza.json +++ /dev/null @@ -1,1832 +0,0 @@ -{ - "id": "6b1746e0-0cf8-0139-7cff-2683e7458fb7", - "events":[], - "accessibility": "Accessibility features in common areas like lobby – wheelchair ramps, wheelchair accessible bathrooms and elevators.", - "amenities": "Community Room, common area with books and TV, laundry room, resident services", - "applicationDueDate": "2020-12-31T16:00:00.000-07:00", - "applicationOrganization": "Pensione Esperanza", - "applicationAddress": { - "city": "San Jose", - "county": "San Jose", - "zipCode": "95126", - "state": "CA", - "street": "598 Columbia Avenue", - "latitude": 37.324015, - "longitude": -121.899633 - }, - "applicationPhone": "(408) 920-0247", - "buildingAddress": { - "city": "San Jose", - "county": "San Jose", - "state": "CA", - "street": "598 Columbia Avenue", - "zipCode": "95126", - "latitude": 37.324015, - "longitude": -121.899633 - }, - "buildingSelectionCriteria": null, - "costsNotIncluded": "Resident responsible for PG&E, internet and phone. Owner pays for water, trash, and sewage. Residents encouraged to obtain renter's insurance but this is not a requirement. Late rent fee is $35 and returned check fee is $35 additional. ", - "creditHistory": "Applications will be rated on a score system for housing. An applicant's score may be impacted by negative tenant peformance information provided to the credit reporting agency. All applicants are expected have a passing acore of 70 points out of 100 to be considered for housing. Applicants with no credit history will receive a maximum of 80 points to fairly outweigh positive and/or negative trades as would an applicant with established credit history. Refer to Tenant Selection Criteria or Qualification Criteria for details related to the qualification process. ", - "depositMax": "700", - "depositMin": "700", - "developer": "Charities Housing", - "imageUrl": "/images/esperanza.jpg", - "programRules": "Applicants must qualify under the LIHTC guidelines. Applicants must adhere to minimum and maximum Income limits. Tenant Selection Criteria applies. Applications for the open waitlist will be accepted on a rolling basis and will be reviewed in the order that it is received.", - "externalId": null, - "waitlistMaxSize": 0, - "name": "Pensione Esperanza", - "neighborhood": "Delmas Park", - "waitlistCurrentSize": null, - "petPolicy": "No pets allowed. Accomodation animals may be granted to persons with disabilities via a reasonable accomodation request. ", - "prioritiesDescriptor": null, - "requiredDocuments": "Completed application and government issued IDs, income and asset information.", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": null, - "reservedDescriptor": null, - "smokingPolicy": "No Smoking in building, Smoking Area in Parking Lot", - "yearBuilt": 1999, - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "groupId": 1, - "hideUnitFeatures": false, - "disableUnitsAccordion": true, - "unitAmenities": "Microwave, Refrigerator, wall heating & A/C", - "applicationFee": "30", - "criminalBackground": "A criminal background investigation will be obtained on each applicant. As criminal background checks are done county by county and will be ran for all counties in which the applicant lived, Applicants will be denied for tenancy if they have been convicted of a felony or misdemeanor. Refer to Tenant Selection Criteria or Qualification Criteria for details related to the qualification process.", - "leasingAgentAddress": { - "city": "San Jose", - "county": "San Jose", - "state": "CA", - "street": "598 Columbia Avenue", - "zipCode": "95126", - "latitude": 37.324015, - "longitude": -121.899633 - }, - "leasingAgentEmail": "pensione@charitieshousing.org", - "leasingAgentName": "Serene Flores", - "leasingAgentOfficeHours": "Monday to Friday, 9:00 am to 4:00 pm", - "leasingAgentPhone": "(408) 920-0247", - "leasingAgentTitle": "Management", - "rentalHistory": "Two years of rental history will be verified with all applicable landlords. Household family members and/or personal friends are not acceptable landlord references. Two professional character references may be used in lieu of rental history for applicants with no prior rental history. An unlawful detainer report will be processed thourhg the U.D. Registry, Inc. Applicants will be disqualified if they have any evictions filing within the last 7 years. Refer to Tenant Selection Criteria or Qualification Criteria for details related to the qualification process.", - "buildingTotalUnits": 72, - "postmarkedApplicationsReceivedByDate": null, - "totalUnits": 72, - "unitsAvailable": 0, - "units": [ - { - "id": "6b174720-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 3, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174760-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 2, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174780-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 1, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1747a0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 3, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1747b0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 2, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1747d0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 1, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1747f0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 3, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174810-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 2, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174870-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 1, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174890-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 3, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1748b0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 2, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1748c0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 1, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1748e0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 3, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174900-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 2, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174920-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 1, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174930-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 3, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174950-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 2, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174960-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 1, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174980-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 3, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1749a0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 2, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1749c0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 1, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1749d0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 3, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1749f0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 2, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174a10-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 1, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174a30-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 3, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174a40-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 2, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174a60-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 1, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174a80-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 3, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174aa0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 2, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174ac0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 1, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174ad0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 3, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174af0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 2, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174b10-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 1, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174b30-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 3, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174b40-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 2, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174b70-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "40.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1814.0", - "floor": 1, - "annualIncomeMax": "41000.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "907.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174ba0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 3, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174bd0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 2, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174c00-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 1, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174c30-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 3, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174c60-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 2, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174c70-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 1, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174c90-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 3, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174cb0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 2, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174cd0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 1, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174cf0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 3, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174d00-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 2, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174d20-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 1, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174d40-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 3, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174d60-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 2, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174d70-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 1, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174d90-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 3, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174db0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 2, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174dc0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 1, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174de0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 3, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174e00-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 2, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174eb0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 1, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174ed0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 3, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174ef0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 2, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174f00-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 1, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174f20-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 3, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174f40-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 2, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174f60-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 1, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174f70-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 3, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174f90-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 2, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174fa0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 1, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174fc0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 3, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174fe0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 2, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b174ff0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 1, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b175010-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 3, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b175030-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 2, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b175040-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "35.0", - "annualIncomeMin": "18960.0", - "monthlyIncomeMin": "1580.0", - "floor": 1, - "annualIncomeMax": "35875.0", - "maxOccupancy": 1, - "minOccupancy": 1, - "monthlyRent": "790.0", - "numBathrooms": 1, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "227", - "status": "occupied", - "unitType": "SRO", - "createdAt": "2020-01-14T16:00:00.000Z", - "updatedAt": "2020-01-14T16:00:00.000Z", - "listingId": 9, - "amiChartId": 4, - "monthlyRentAsPercentOfIncome": null - } - ], - "preferences": [ - - ], - "applicationMethods": [ - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "externalReference": "http://bit.ly/2Nm7X27", - "label": "English" - }, - { - "type": "POBox", - "acceptsPostmarkedApplications": false - }, - { - "type": "PaperPickup", - "acceptsPostmarkedApplications": false - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/esperanza.jpg" - } - ] -} diff --git a/backend/core/listing_data/reilly_station.json b/backend/core/listing_data/reilly_station.json deleted file mode 100644 index 29de08c451..0000000000 --- a/backend/core/listing_data/reilly_station.json +++ /dev/null @@ -1,1475 +0,0 @@ -{ - "name": "Reilly Station", - "events":[], - "acceptingApplicationsByPostmark": false, - "applicationDueDate": "2020-08-21T16:00:00.000-0700", - "applicationPostmarkDueDate": false, - "applicationOrganization": "Eden Housing", - "applicationAddress": { - "street": "", - "city": "", - "state": "", - "zipCode": "", - "county": "Alameda", - "longitude": 0, - "latitude": 0 - }, - "applicationPhone": "510-499-2491", - "leasingAgentName": "", - "leasingAgentTitle": "", - "leasingAgentEmail": "reillystation@edenhousing.org", - "leasingAgentPhone": "510-499-2491", - "leasingAgentAddress": { - "street": "", - "city": "", - "state": "", - "zipCode": "", - "county": "Alameda", - "longitude": 0, - "latitude": 0 - }, - "leasingAgentOfficeHours": "Message line returns calls during application intake, 8/3/20 to 8/21/20, Monday thru Saturday from 10am to 4pm.  Saturday hours are only during application intake (August 8th and August 15th), then it returns to Monday –Friday.", - "applicationFee": "35", - "depositMin": "500", - "depositMax": "500", - "costsNotIncluded": "Application fee is only charged if selected to be interviewed. Electric, cable & internet not included. Rent is due on the first considered late on the 6th of each month, however fees & payments arrangements are made sue to COVID. $25 late fee, waived during COVID, $10 NSF plus bank fees, Pet Deposit is $150.", - "unitsAvailable": 60, - "waitlistMaxSize": 500, - "waitlistCurrentSize": 0, - "buildingTotalUnits": 61, - "buildingName": "Eden Housing", - "buildingAddress": { - "street": "45108 Tom Blalock Street", - "city": "Fremont", - "state": "CA", - "zipCode": "94539", - "longitude": -121.9380935, - "latitude": 37.5040525, - "county": "Alameda" - }, - "developer": "Eden Housing", - "neighborhood": "Warm Springs/ Metro Crossing", - "yearBuilt": 2020, - "reservedCommunityDescription": "LIHTC program", - "reservedCommunityMaximumAge": 0, - "reservedCommunityMinimumAge": 0, - "priorityDescription": "A preference is provide to household that currently live or work in the City of Fremont.", - "amenities": "Community room, lounge areas, Computer Lab, Courtyard with BBQ and Community Gardens, Fitness room, Bicycle Storage & extra Tenant storage, on-site laundry room, parcel lockers, Stacker parking, EV car charging & Car Share.", - "unitAmenities": "Blinds on all windows, full size refrigerator, garbage disposal, separate cook top & oven.", - "accessibility": "All common areas are wheelchair accessible. 50% of the units are built out for persons with mobility disabilities with all units that can easily be adapted.", - "smokingPolicy": "No smoking building.", - "petPolicy": "No pets will be allowed without prior approval from the management. All pets, except fish, must be brought into the office for inspection and appropriate documentation and evidence of shots, neutering, good health, etc. must be provided where appropriate. Only the following types and number of pets will be allowed: Dogs -- Maximum Number: One, Maximum Size: 25lbs, Minimum Age: 1 Year, Spayed or Neutered & Distemper & Rabies Shots. Cats -- Maximum Number: One (Domestic only), Maximum size: N/A, Minimum age: 6 months, spayed or neutered & Distemper & rabies shots. Birds --Maximum number: Two. Fish -- Maximum Aquarium Size: 20 gallons. Small Mammals -- (Gerbils, Hamsters, Guinea Pigs) & Maximum number: Two. NOTE: NO RABBITS 0R MICE PERMITTED & CERTAIN BREEDS of DOGS.", - "requiredDocuments": "Due Post Lottery as applicable to household: \n\n - Picture ID/Driver’s License for all household members 18 and older. \n\n - Social Security cards for all household members. \n\n - Complete copy of most current filed Income Tax Returns or proof of non-filing and W-2s. \n\n - Payroll stubs from the past three current consecutive months. \n\n - Current annual (SS) Social Security award letter, current (SSDI) Social Security Disability Insurance and/or current (SSI) Supplement Security Income award letter from Social Security Administration. \n\n - Most current pension, annuity or other retirement account statement(s). \n\n - Checking Account statements for the last six consecutive months. \n\n - Current month bank statement for Savings Accounts. \n\n - Current Statement from all 401-K/IRA and/or other asset account(s) including debit cards and whole life insurance policies. \n\n - Contact address information for Income, Assets and Housing references. \n\n - Copy of Birth certificates for anyone 17 or younger \n\n - Copy of your Veteran status, DD-214 \n\n - Applicable documentation for verification of household size that may include custody agreement or marital separation to determine eligibility for unit size occupancy standards.", - "programRules": "- All low income Housing tax credit program requirements including a maximum income limit that can not be exceeded. \n\n - Applicants not chosen for Reilly Station will have their application put into the Canyon Flats lottery. ", - "creditHistory": "All rental accounts must be in good standing with no balance owed and/or evictions within the past five years. \n\n - All utility accounts must be paid in full. \n\n - No bankruptcies filed within the last twelve months. \n\n - No unpaid judgements, collections, and liens exceeding $5,000 excluding student loans and medical bills.", - "rentalHistory": "A rental housing history & credit report will be ran & Housing references sent out for 5 years of housing history.", - "criminalBackground": "A criminal background check will be ran going back 5 years. \n\n - Applicants with unsatisfactory criminal backgrounds may be declined depending upon the nature and severity of the offense and the time that has passed since the conviction occurred. A household with a member who is subject to lifetime registration under a State Sex Offender Registration Program or has been convicted of drug-related criminal activity for manufacture or production of methamphetamine on the premises of federally assisted housing will not be admitted under any circumstance. An application also may be denied if the information available regarding a conviction is insufficient to allow proper classification. Criminal history and/or activity within the past five (5) years that may result in the rejection of an application may include, for example: \n\n - Sexual assault, \n\n - Domestic violence \n\n - Discharging a firearm \n\n - Gang participation; \n\n - Burglary and/ or vandalism \n\n - Assault \n\n - Disorderly conduct \n\n - Stalking; etc. \n\n - Current engagement in use of a drug or if the owner has reasonable cause to believe that a household member’s illegal use of a drug or pattern of illegal use may interfere with the health, safety, or right to peaceful enjoyment of the premises by other residents will not be approved for residency; \n\n - Abuse or pattern of abuse of alcohol that interferes with the health, safety, or peaceful enjoyment of the premises by other residents will not be approved for residency; \n\n - Involvement in drug related criminal activity or violent criminal activity or other criminal and ongoing criminal activity that is current or an indication of repeated criminal behavior will not be approved for residency; \n\n - An applicant's misrepresentation of any information related to eligibility, allowance, household composition or rent will not be approved for residency.", - "buildingSelectionCriteria": "Optional link to offsite building selection criteria if the information provided on the listing are not sufficient.", - "whatToExpect": { - "applicantsWillBeContacted": "Applicants will be contacted by the property agent in lottery rank order until vacancies are filled.", - "allInfoWillBeVerified": "", - "bePreparedIfChosen": "" - }, - "units": [ - { - "number": "", - "unitType": "oneBdrm", - "status": "available", - "monthlyRent": "734.0", - "monthlyIncomeMin": "1468.0", - "annualIncomeMax": "17616.0", - "minOccupancy": 1, - "maxOccupancy": 3, - "reservedType": null, - "priorityType": "", - "sqFeet": "608", - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582579", - "updatedAt": "2020-07-27T12:10:08.582581", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 1, - "amiPercentage": "30.0" - }, - { - "number": "", - "unitType": "oneBdrm", - "status": "available", - "monthlyRent": "734.0", - "monthlyIncomeMin": "1468.0", - "annualIncomeMax": "17616.0", - "minOccupancy": 1, - "maxOccupancy": 3, - "reservedType": null, - "priorityType": "", - "sqFeet": "608", - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582579", - "updatedAt": "2020-07-27T12:10:08.582581", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 2, - "amiPercentage": "30.0" - }, - { - "number": "", - "unitType": "oneBdrm", - "status": "available", - "monthlyRent": "1223.0", - "monthlyIncomeMin": "2446.0", - "annualIncomeMax": "29352.0", - "minOccupancy": 1, - "maxOccupancy": 3, - "reservedType": null, - "priorityType": "", - "sqFeet": "608", - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582579", - "updatedAt": "2020-07-27T12:10:08.582581", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 3, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "oneBdrm", - "status": "available", - "monthlyRent": "1223.0", - "monthlyIncomeMin": "2446.0", - "annualIncomeMax": "29352.0", - "minOccupancy": 1, - "maxOccupancy": 3, - "reservedType": null, - "priorityType": "", - "sqFeet": "608", - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582579", - "updatedAt": "2020-07-27T12:10:08.582581", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 4, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "oneBdrm", - "status": "available", - "monthlyRent": "1223.0", - "monthlyIncomeMin": "2446.0", - "annualIncomeMax": "29352.0", - "minOccupancy": 1, - "maxOccupancy": 3, - "reservedType": null, - "priorityType": "", - "sqFeet": "608", - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582579", - "updatedAt": "2020-07-27T12:10:08.582581", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 5, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "oneBdrm", - "status": "available", - "monthlyRent": "1223.0", - "monthlyIncomeMin": "2446.0", - "annualIncomeMax": "29352.0", - "minOccupancy": 1, - "maxOccupancy": 3, - "reservedType": null, - "priorityType": "", - "sqFeet": "608", - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582579", - "updatedAt": "2020-07-27T12:10:08.582581", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 6, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "oneBdrm", - "status": "available", - "monthlyRent": "1223.0", - "monthlyIncomeMin": "2446.0", - "annualIncomeMax": "29352.0", - "minOccupancy": 1, - "maxOccupancy": 3, - "reservedType": null, - "priorityType": "", - "sqFeet": "608", - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582579", - "updatedAt": "2020-07-27T12:10:08.582581", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 7, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "oneBdrm", - "status": "available", - "monthlyRent": "1223.0", - "monthlyIncomeMin": "2446.0", - "annualIncomeMax": "29352.0", - "minOccupancy": 1, - "maxOccupancy": 3, - "reservedType": null, - "priorityType": "", - "sqFeet": "608", - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582579", - "updatedAt": "2020-07-27T12:10:08.582581", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 8, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "oneBdrm", - "status": "available", - "monthlyRent": "1468.0", - "monthlyIncomeMin": "2936.0", - "annualIncomeMax": "35232.0", - "minOccupancy": 1, - "maxOccupancy": 3, - "reservedType": null, - "priorityType": "", - "sqFeet": "608", - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582579", - "updatedAt": "2020-07-27T12:10:08.582581", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 9, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "oneBdrm", - "status": "available", - "monthlyRent": "1468.0", - "monthlyIncomeMin": "2936.0", - "annualIncomeMax": "35232.0", - "minOccupancy": 1, - "maxOccupancy": 3, - "reservedType": null, - "priorityType": "", - "sqFeet": "608", - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582579", - "updatedAt": "2020-07-27T12:10:08.582581", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 10, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "oneBdrm", - "status": "available", - "monthlyRent": "1468.0", - "monthlyIncomeMin": "2936.0", - "annualIncomeMax": "35232.0", - "minOccupancy": 1, - "maxOccupancy": 3, - "reservedType": null, - "priorityType": "", - "sqFeet": "608", - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582579", - "updatedAt": "2020-07-27T12:10:08.582581", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 11, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "oneBdrm", - "status": "available", - "monthlyRent": "1468.0", - "monthlyIncomeMin": "2936.0", - "annualIncomeMax": "35232.0", - "minOccupancy": 1, - "maxOccupancy": 3, - "reservedType": null, - "priorityType": "", - "sqFeet": "608", - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582579", - "updatedAt": "2020-07-27T12:10:08.582581", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 12, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "881", - "monthlyIncomeMin": "1762", - "annualIncomeMax": "21144", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 13, - "amiPercentage": "30.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "881", - "monthlyIncomeMin": "1762", - "annualIncomeMax": "21144", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 14, - "amiPercentage": "30.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "881", - "monthlyIncomeMin": "1762", - "annualIncomeMax": "21144", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 15, - "amiPercentage": "30.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "881", - "monthlyIncomeMin": "1762", - "annualIncomeMax": "21144", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 16, - "amiPercentage": "30.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "881", - "monthlyIncomeMin": "1762", - "annualIncomeMax": "21144", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 17, - "amiPercentage": "30.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "881", - "monthlyIncomeMin": "1762", - "annualIncomeMax": "21144", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 18, - "amiPercentage": "30.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "881", - "monthlyIncomeMin": "1762", - "annualIncomeMax": "21144", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 19, - "amiPercentage": "30.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "881", - "monthlyIncomeMin": "1762", - "annualIncomeMax": "21144", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 20, - "amiPercentage": "30.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1468", - "monthlyIncomeMin": "2936", - "annualIncomeMax": "35232", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 21, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1468", - "monthlyIncomeMin": "2936", - "annualIncomeMax": "35232", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 22, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1468", - "monthlyIncomeMin": "2936", - "annualIncomeMax": "35232", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 23, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1468", - "monthlyIncomeMin": "2936", - "annualIncomeMax": "35232", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 24, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1468", - "monthlyIncomeMin": "2936", - "annualIncomeMax": "35232", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 25, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1468", - "monthlyIncomeMin": "2936", - "annualIncomeMax": "35232", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 26, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1468", - "monthlyIncomeMin": "2936", - "annualIncomeMax": "35232", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 27, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1468", - "monthlyIncomeMin": "2936", - "annualIncomeMax": "35232", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 28, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1468", - "monthlyIncomeMin": "2936", - "annualIncomeMax": "35232", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 29, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1468", - "monthlyIncomeMin": "2936", - "annualIncomeMax": "35232", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 30, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1468", - "monthlyIncomeMin": "2936", - "annualIncomeMax": "35232", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 31, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1468", - "monthlyIncomeMin": "2936", - "annualIncomeMax": "35232", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 32, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1762", - "monthlyIncomeMin": "3524", - "annualIncomeMax": "42288", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 33, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1762", - "monthlyIncomeMin": "3524", - "annualIncomeMax": "42288", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 34, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1762", - "monthlyIncomeMin": "3524", - "annualIncomeMax": "42288", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 35, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1762", - "monthlyIncomeMin": "3524", - "annualIncomeMax": "42288", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 36, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1762", - "monthlyIncomeMin": "3524", - "annualIncomeMax": "42288", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 37, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1762", - "monthlyIncomeMin": "3524", - "annualIncomeMax": "42288", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 38, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1762", - "monthlyIncomeMin": "3524", - "annualIncomeMax": "42288", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 39, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1762", - "monthlyIncomeMin": "3524", - "annualIncomeMax": "42288", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 40, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1762", - "monthlyIncomeMin": "3524", - "annualIncomeMax": "42288", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 41, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1762", - "monthlyIncomeMin": "3524", - "annualIncomeMax": "42288", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 42, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1762", - "monthlyIncomeMin": "3524", - "annualIncomeMax": "42288", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 43, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "twoBdrm", - "status": "available", - "monthlyRent": "1762", - "monthlyIncomeMin": "3524", - "annualIncomeMax": "42288", - "minOccupancy": 2, - "maxOccupancy": 5, - "reservedType": null, - "priorityType": "", - "sqFeet": "845", - "numBathrooms": 1, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582585", - "updatedAt": "2020-07-27T12:10:08.582588", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 44, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "1018", - "monthlyIncomeMin": "2036", - "annualIncomeMax": "24432", - "minOccupancy": 3, - "minOccupancy": 7, - "reservedType": null, - "priorityType": "", - "sqFeet": "1103", - "numBathrooms": 2, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582590", - "updatedAt": "2020-07-27T12:10:08.582593", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 45, - "amiPercentage": "30.0" - }, - { - "number": "", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "1018", - "monthlyIncomeMin": "2036", - "annualIncomeMax": "24432", - "minOccupancy": 3, - "minOccupancy": 7, - "reservedType": null, - "priorityType": "", - "sqFeet": "1103", - "numBathrooms": 2, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582590", - "updatedAt": "2020-07-27T12:10:08.582593", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 46, - "amiPercentage": "30.0" - }, - { - "number": "", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "1696", - "monthlyIncomeMin": "3392", - "annualIncomeMax": "40704", - "minOccupancy": 3, - "minOccupancy": 7, - "reservedType": null, - "priorityType": "", - "sqFeet": "1103", - "numBathrooms": 2, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582590", - "updatedAt": "2020-07-27T12:10:08.582593", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 47, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "1696", - "monthlyIncomeMin": "3392", - "annualIncomeMax": "40704", - "minOccupancy": 3, - "minOccupancy": 7, - "reservedType": null, - "priorityType": "", - "sqFeet": "1103", - "numBathrooms": 2, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582590", - "updatedAt": "2020-07-27T12:10:08.582593", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 48, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "1696", - "monthlyIncomeMin": "3392", - "annualIncomeMax": "40704", - "minOccupancy": 3, - "minOccupancy": 7, - "reservedType": null, - "priorityType": "", - "sqFeet": "1103", - "numBathrooms": 2, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582590", - "updatedAt": "2020-07-27T12:10:08.582593", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 49, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "1696", - "monthlyIncomeMin": "3392", - "annualIncomeMax": "40704", - "minOccupancy": 3, - "minOccupancy": 7, - "reservedType": null, - "priorityType": "", - "sqFeet": "1103", - "numBathrooms": 2, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582590", - "updatedAt": "2020-07-27T12:10:08.582593", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 50, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "1696", - "monthlyIncomeMin": "3392", - "annualIncomeMax": "40704", - "minOccupancy": 3, - "minOccupancy": 7, - "reservedType": null, - "priorityType": "", - "sqFeet": "1103", - "numBathrooms": 2, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582590", - "updatedAt": "2020-07-27T12:10:08.582593", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 51, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "1696", - "monthlyIncomeMin": "3392", - "annualIncomeMax": "40704", - "minOccupancy": 3, - "minOccupancy": 7, - "reservedType": null, - "priorityType": "", - "sqFeet": "1103", - "numBathrooms": 2, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582590", - "updatedAt": "2020-07-27T12:10:08.582593", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 52, - "amiPercentage": "50.0" - }, - { - "number": "", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "2036", - "monthlyIncomeMin": "4072", - "annualIncomeMax": "48864", - "minOccupancy": 3, - "minOccupancy": 7, - "reservedType": null, - "priorityType": "", - "sqFeet": "1103", - "numBathrooms": 2, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582590", - "updatedAt": "2020-07-27T12:10:08.582593", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 53, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "2036", - "monthlyIncomeMin": "4072", - "annualIncomeMax": "48864", - "minOccupancy": 3, - "minOccupancy": 7, - "reservedType": null, - "priorityType": "", - "sqFeet": "1103", - "numBathrooms": 2, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582590", - "updatedAt": "2020-07-27T12:10:08.582593", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 54, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "2036", - "monthlyIncomeMin": "4072", - "annualIncomeMax": "48864", - "minOccupancy": 3, - "minOccupancy": 7, - "reservedType": null, - "priorityType": "", - "sqFeet": "1103", - "numBathrooms": 2, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582590", - "updatedAt": "2020-07-27T12:10:08.582593", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 55, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "2036", - "monthlyIncomeMin": "4072", - "annualIncomeMax": "48864", - "minOccupancy": 3, - "minOccupancy": 7, - "reservedType": null, - "priorityType": "", - "sqFeet": "1103", - "numBathrooms": 2, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582590", - "updatedAt": "2020-07-27T12:10:08.582593", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 56, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "2036", - "monthlyIncomeMin": "4072", - "annualIncomeMax": "48864", - "minOccupancy": 3, - "minOccupancy": 7, - "reservedType": null, - "priorityType": "", - "sqFeet": "1103", - "numBathrooms": 2, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582590", - "updatedAt": "2020-07-27T12:10:08.582593", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 57, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "2036", - "monthlyIncomeMin": "4072", - "annualIncomeMax": "48864", - "minOccupancy": 3, - "minOccupancy": 7, - "reservedType": null, - "priorityType": "", - "sqFeet": "1103", - "numBathrooms": 2, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582590", - "updatedAt": "2020-07-27T12:10:08.582593", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 58, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "2036", - "monthlyIncomeMin": "4072", - "annualIncomeMax": "48864", - "minOccupancy": 3, - "minOccupancy": 7, - "reservedType": null, - "priorityType": "", - "sqFeet": "1103", - "numBathrooms": 2, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582590", - "updatedAt": "2020-07-27T12:10:08.582593", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 59, - "amiPercentage": "60.0" - }, - { - "number": "", - "unitType": "threeBdrm", - "status": "available", - "monthlyRent": "2036", - "monthlyIncomeMin": "4072", - "annualIncomeMax": "48864", - "minOccupancy": 3, - "minOccupancy": 7, - "reservedType": null, - "priorityType": "", - "sqFeet": "1103", - "numBathrooms": 2, - "rentAsPercentageOfIncome": false, - "showSummaryOfUnitTypeOnly": true, - "createdAt": "2020-07-27T12:10:08.582590", - "updatedAt": "2020-07-27T12:10:08.582593", - "monthlyRentAsPercentOfIncome": null, - "numBedrooms": null, - "amiChartId": 9, - "id": 60, - "amiPercentage": "60.0" - } - ], - "preferences": [ - { - "title": "Live/work in the City of Fremont", - "subtitle": "Households that currently live or work in the City of Fremont are given priority.", - "ordinal": 1 - } - ], - "id": "WdFQ0GNo9T-ND1dOCaLyT", - "createdAt": "2020-07-27T12:10:08.582558", - "updatedAt": "2020-07-27T12:10:08.582576", - "disableUnitsAccordion": true, - "reservedDescriptor": null, - "groupId": null, - "hideUnitFeatures": false, - "externalId": null, - "prioritiesDescriptor": null, - "totalUnits": 60, - "applicationMethods": [ - { - "type": "ExternalLink", - "acceptsPostmarkedApplications": false, - "externalReference": "https://www.on-site.com/apply/property/341392" - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/reillystation.jpg" - } - ] -} diff --git a/backend/core/listing_data/skylyne.json b/backend/core/listing_data/skylyne.json deleted file mode 100644 index b8aacdf0fd..0000000000 --- a/backend/core/listing_data/skylyne.json +++ /dev/null @@ -1,1188 +0,0 @@ -{ - "id": "q3h9p31e", - "events":[], - "accessibility": "All common areas ADA accessible and homes ADA adaptable. Features include outlet extenders, pullout breadboards, kickplates and cabinets, grab bar installation, and other reasonable accommodations upon request.", - "amenities": "Fitness club, rooftop pool, spa, firepits, BBQ’s, a sky kitchen & lounge, a woof deck, paw spa, co-working spaces, wi-fi lounges, bike room and DIY space", - "applicationAddress": { - "street": "PO Box 3826", - "city": "Oakland", - "state": "CA", - "zipCode": "94609", - "latitude": null, - "longitude": null - }, - "applicationDueDate": "2020-12-01T17:00:00.000-08:00", - "applicationOrganization": "", - "applicationPhone": "510-747-5817", - "buildingAddress": { - "city": "Oakland", - "county": "Alameda", - "street": "3883 Turquoise Way", - "zipCode": "94609", - "state": "CA", - "latitude": 37.827798, - "longitude": -122.265981 - }, - "buildingSelectionCriteria": null, - "costsNotIncluded": "Resident responsible for utilities: electric, cable/internet, and personal liability policy as outlined in the lease agreement. Replacement Key Fobs/Remotes $50. One-time pet deposit $500, and monthly pet rent $50 per pet. Rent is due by the 3rd of each month, and considered late on the 4th of the month. Resident to pay $35 for each returned check or rejected electronic payment.", - "creditHistory": "We obtain a credit report on each applicant. Our credit reporting agency evaluates credit (which may include rent payment history) as an indicator of future rent payment performance. An unsatisfactory or insufficient finding will result in the requirement of an additional deposit, guarantor, or denial. Applicants are responsible for ensuring their credit history is accurate.", - "depositMax": "3018", - "depositMin": "500", - "developer": "BXP MacArthur LLC, DBA The Skylyne at Temescal", - "programRules": null, - "externalId": null, - "waitlistMaxSize": 500, - "name": "The Skylyne at Temescal", - "neighborhood": "Oakland", - "waitlistCurrentSize": 284, - "petPolicy": "One-time $500 pet deposit", - "prioritiesDescriptor": null, - "requiredDocuments": "Due at interview: Income: If you work and receive paystubs: ▪ Copies of 3 months’ worth of consecutive paystubs, beginning with the most recent paystub. ▪ If hired recently, provide Employment Offer Letter. If you receive severance pay, Social Security, unemployment benefits, retirement income, disability, public assistance, or the like, submit: ▪ Most recent benefits letter(s) stating your monthly award. If you are Self-Employed, you must: ▪ Complete an Self-Employed Declaration form ▪ Submit Year-to-Date Profit and Loss statement ▪ Submit the past year’s federal income tax returns. If you are Unemployed and have ZERO income, you must: ▪ Complete an Unemployment Declaration ▪ Submit the previous year’s federal income tax returns. Assets: ▪ 6-consecutive and most recent official bank statements for checking accounts and include ALL pages. ▪ 1 most recent statement for all other assets (IE: Savings, 401K, Money Market, etc.) and include ALL pages. ▪ A written explanation and supporting documentation for any deposit over $100 other than that of your documented employment. Building Documents: ▪ Application ▪ Release & Consent Form ▪ Resident Qualification Acknowledgment", - "reservedCommunityMaximumAge": 0, - "reservedCommunityMinimumAge": 0, - "reservedDescriptor": null, - "smokingPolicy": "Non-Smoking", - "yearBuilt": 2020, - "createdAt": "2020-05-12T15:00:00-07:00", - "updatedAt": "2020-06-15T11:00:00-07:00", - "groupId": 1, - "hideUnitFeatures": false, - "disableUnitsAccordion": true, - "unitAmenities": "Refrigerator, washer/dryer, stove/range, microwave, dishwasher, google nest thermostat for AC/Heat", - "applicationFee": "50.94", - "criminalBackground": "Criminal screening prohibited under City of Oakland Fair Chance Ordinance", - "leasingAgentEmail": "TheSkylyneBMR@greystar.com", - "leasingAgentName": "Joshua Schodorf", - "leasingAgentAddress": { - "city": "Oakland", - "street": "3883 Turquoise Way", - "zipCode": "94609", - "state": "CA", - "latitude": null, - "longitude": null - }, - "leasingAgentOfficeHours": "Due to COVID-19, our offices are closed. Please call or email leasing agent for any questions.", - "leasingAgentPhone": "510-747-5817", - "leasingAgentTitle": "Compliance Support", - "rentalHistory": "Applicant must be able to provide sufficient residential information for at least the past two years to enable the Property Manager to adequately evaluate rental history and/or place of residence. If two years of prior residential information proves insufficient for obtaining adequate references, additional residential history may be requested. Negative rental history will be grounds for denial, including: Any evictions with an outstanding judgement, 4 or more evictions filings, 4 or more late payments being reported on the rental history report", - "preferences": [ - { - "ordinal": 1, - "title": "Displaced Preference", - "description": "Households who have been displaced as a result of the City of Oakland’s public projects or the City’s code enforcement activities." - }, - { - "ordinal": 2, - "title": "Live or Work Preference", - "description": "1. Oakland Resident - Households who are current residents of the City of Oakland. 2. Oakland Worker - Households with at least one member who is currently employed in the city of Oakland, have been notified that they are hired to work in the city of Oakland, or are active participants in an educational or job training program located in the city of Oakland." - } - ], - "buildingTotalUnits": 402, - "units": [ - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "41400", - "monthlyIncomeMin": "3450", - "floor": 5, - "annualIncomeMax": "78850", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1725", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "469", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "41400", - "monthlyIncomeMin": "3450", - "floor": 5, - "annualIncomeMax": "78850", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1725", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "469", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "41400", - "monthlyIncomeMin": "3450", - "floor": 5, - "annualIncomeMax": "78850", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1725", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "469", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "41400", - "monthlyIncomeMin": "3450", - "floor": 5, - "annualIncomeMax": "78850", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1725", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "469", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "41400", - "monthlyIncomeMin": "3450", - "floor": 5, - "annualIncomeMax": "78850", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1725", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "469", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "41400", - "monthlyIncomeMin": "3450", - "floor": 5, - "annualIncomeMax": "78850", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1725", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "469", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "41400", - "monthlyIncomeMin": "3450", - "floor": 5, - "annualIncomeMax": "78850", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1725", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "469", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "41400", - "monthlyIncomeMin": "3450", - "floor": 9, - "annualIncomeMax": "78850", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1725", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "578", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 5, - "annualIncomeMax": "88700", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "546", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 5, - "annualIncomeMax": "88700", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "546", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 5, - "annualIncomeMax": "88700", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "546", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 5, - "annualIncomeMax": "88700", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "546", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 5, - "annualIncomeMax": "88700", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "546", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 5, - "annualIncomeMax": "88700", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "546", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 5, - "annualIncomeMax": "88700", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "546", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 5, - "annualIncomeMax": "88700", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "546", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 5, - "annualIncomeMax": "88700", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "546", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 5, - "annualIncomeMax": "88700", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "546", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 5, - "annualIncomeMax": "88700", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "546", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 5, - "annualIncomeMax": "88700", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "546", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 5, - "annualIncomeMax": "88700", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "546", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 5, - "annualIncomeMax": "88700", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "546", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 5, - "annualIncomeMax": "88700", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "546", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 5, - "annualIncomeMax": "88700", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "546", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "47304", - "monthlyIncomeMin": "3942", - "floor": 9, - "annualIncomeMax": "88700", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1971", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "697", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 5, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "885", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "MFaowAxySJW3utZBPNxr1", - "amiPercentage": "80", - "annualIncomeMin": "53232", - "monthlyIncomeMin": "4436", - "floor": 9, - "annualIncomeMax": "106450", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "2218", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "935", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "q3h9p31e", - "amiChartId": 5, - "monthlyRentAsPercentOfIncome": null - } - ], - "unitsAvailable": 45, - "applicationMethods": [ - { - "type": "POBox", - "acceptsPostmarkedApplications": false - }, - { - "type": "PaperPickup", - "acceptsPostmarkedApplications": false - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "English", - "externalReference": "https://theskylyne.com/assets/files/Application.pdf" - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/skylyne.jpg" - } - ] -} diff --git a/backend/core/listing_data/so-hay.json b/backend/core/listing_data/so-hay.json deleted file mode 100644 index a270eb8f97..0000000000 --- a/backend/core/listing_data/so-hay.json +++ /dev/null @@ -1,737 +0,0 @@ -{ - "id": "HOLNx_F7fUCeax5GCoIr9g", - "events": [ - { - "type": "openHouse", - "startTime": null, - "endTime": null, - "url": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/SoHayQRcodes.pdf", - "label": "Virtual Tours" - }, - { - "type": "publicLottery", - "startTime": "2021-04-14T10:30:00.000-08:00", - "endTime": "2021-04-14T11:00:00.000-08:00" - } - ], - "postmarkedApplicationsReceivedByDate": "2021-03-31T16:00:00.000-08:00", - "applicationAddress": { - "city": "Hayward", - "street": "ATTN: Leasing Office - BMR
29213 Mission Blvd.", - "zipCode": "94544", - "state": "CA", - "latitude": null, - "longitude": null - }, - "applicationDueDate": "2021-03-31T16:00:00.000-08:00", - "applicationOrganization": "The Mix at SoHay", - "applicationPhone": null, - "buildingSelectionCriteria": null, - "costsNotIncluded": "All utilties included in rent", - "creditHistory": "We obtain a credit report on each applicant. Our credit reporting agency evaluates credit (which may include rent payment history) as an indicator of future rent payment performance. An unsatisfactory or insufficient finding will result in the requirement of an additional deposit, guarantor, or denial. Applicants are responsible for ensuring their credit history is accurate.", - "CSVFormattingType": "withDisplaceeNameAndAddress", - "depositMax": "3,526", - "depositMin": "500", - "programRules": null, - "externalId": null, - "waitlistMaxSize": 9999, - "name": "The Mix at SoHay", - "waitlistCurrentSize": 0, - "prioritiesDescriptor": null, - "requiredDocuments": "After the lottery, the following documentation is due for each household member who is 18 years old or older. Required documentation including, but not limited to: \n\n**Income:** \n\nIf you work and receive paystubs:\n\n- Copies of 3 most current and consecutive paystubs, beginning with the most recent paystub.\n\n- If hired recently, provide Employment Offer Letter.\n If you receive severance pay, Social Security, unemployment benefits, retirement income, disability, public assistance, or the like, submit:\n- Most recent benefits letter(s) stating your monthly award\n\nIf you are Self-Employed, you must:\n\n- Complete an Self-Employed Declaration form\n- Submit Year-to-Date Profit and Loss statement\n- 3 months proof of income \n\nIf you are Unemployed and have ZERO income, you must:\n\n- Complete an Unemployment Declaration\n- Submit the previous year’s federal income tax returns\n\n**Assets:**\n\n- 2-consecutive and most recent official bank statements for all bank accounts and include ALL pages.\n- A written explanation and supporting documentation for any deposit over $100 other than that of your documented employment \n\n**Tax Returns:**\n\n- Submit most recent tax returns including all pages and forms W2s, 1099s, Schedules. \n\n**Building Documents:**\n\n- Application \n- Release & Consent Form \n- Resident Qualification Acknowledgment \n- Student Status Affidavit \n", - "reservedCommunityMaximumAge": null, - "reservedCommunityMinimumAge": null, - "reservedDescriptor": "Senior", - "status": "active", - "createdAt": "2020-11-06T15:11:26.446-08:00", - "updatedAt": "2020-11-06T11:47:47.150-08:00", - "groupId": 1, - "hideUnitFeatures": false, - "disableUnitsAccordion": true, - "applicationFee": "52.46", - "criminalBackground": "We obtain a criminal background check on each applicant who will reside in the apartment home. It is possible your application will be denied due to criminal convictions.", - "leasingAgentEmail": "SoHayBMR@Greystar.com", - "leasingAgentName": "Rose Garcia", - "leasingAgentAddress": { - "city": "Hayward", - "street": "The Mix at SoHay Leasing Office
29213 Mission Blvd.", - "zipCode": "94544", - "state": "CA", - "latitude": 37.632273, - "longitude": -122.049316 - }, - "leasingAgentOfficeHours": "Due to Covid-19, our offices are closed. In-person drop application are not accepted. Please call or email the leasing agent for any questions during Mon-Fri 9AM-5PM.", - "leasingAgentPhone": "510-980-5587", - "leasingAgentTitle": "Community Manager", - "rentalHistory": "Applicant must be able to provide sufficient residential information for at least the past two years to enable the Property Manager to adequately evaluate rental history and/or place of residence. If two years of prior residential information proves insufficient for obtaining adequate references, additional residential history may be requested. Negative rental history will be grounds for denial, including: Any evictions with an outstanding judgement, 4 or more evictions filings, 4 or more late payments being reported on the rental history report", - "preferences": [ - { - "ordinal": 1, - "title": "Displacee Tenant or Mission Boulevard Corridor (SR 238) Displacee Tenant Housing Preference", - "subtitle": "", - "description": "At least one member of my household was displaced from a residential property due to redevelopment activity by the Hayward Housing Authority, the Redevelopment Agency or the City of Hayward.\nOR\n At least one member of my household is an SR 238 Program Participant as required under the terms of the SR 238 Settlement Implementation Project. Program Participants are tenants of previously sold Caltrans properties along the SR 238 Mission Boulevard Corridor and are given occupancy preference when new below-market housing is constructed in the Corridor.", - "links": [], - "formMetadata": { - "key": "displacedTenant", - "options": [ - { - "key": "general", - "extraData": [ - { - "key": "name", - "type": "text" - }, - { - "key": "address", - "type": "address" - } - ] - }, - { - "key": "missionCorridor", - "extraData": [ - { - "key": "name", - "type": "text" - }, - { - "key": "address", - "type": "address" - } - ] - } - ] - } - }, - { - "ordinal": 2, - "title": "Live or Work in City of Hayward", - "subtitle": "", - "description": "For households in which at least one member lives or works in City of Hayward", - "links": [], - "formMetadata": { - "key": "liveWork", - "options": [ - { - "key": "live", - "extraData": [] - }, - { - "key": "work", - "extraData": [] - } - ] - } - } - ], - "property": { - "createdAt": "2021-02-02T17:00:00.000-08:00", - "updatedAt": "2021-02-02T17:00:00.000-08:00", - "householdSizeMin": 1, - "householdSizeMax": 5, - "smokingPolicy": "Non-Smoking Building", - "unitsAvailable": 20, - "unitsSummarized": null, - "unitAmenities": "Stainless steel appliances, washer and dryer, wall HVAC, quartz countertop, and plank flooring", - "developer": "SoHay Apartments, LLC", - "yearBuilt": 2021, - "accessibility": "All common areas ADA accessible and homes ADA adaptable.", - "amenities": "Onsite parking, a co-working lounge, package locker, and a bike storage.", - "buildingTotalUnits": 72, - "buildingAddress": { - "county": "Alameda", - "city": "Hayward", - "street": "29213 Mission Blvd.", - "zipCode": "94544", - "state": "CA", - "latitude": 37.632273, - "longitude": -122.049316 - }, - "neighborhood": "South Hayward", - "petPolicy": "Pets allowed except the following; pit bull, malamute, akita, rottweiler, doberman, staffordshire terrier, presa canario, chowchow, american bull dog, karelian bear dog, st bernard, german shepherd, husky, great dane, any hybrid or mixed breed of the aforementioned breeds. 2 pets per household limit, 65lbs. max weight. $50 monthly pet rent per pet, $500 pet deposit per pet.", - "units": [ - { - "id": "AmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "60", - "annualIncomeMin": "32904", - "monthlyIncomeMin": "2502", - "floor": 12, - "annualIncomeMax": "52200", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1251", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "501", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw2_Q", - "amiPercentage": "60", - "annualIncomeMin": "32904", - "monthlyIncomeMin": "2502", - "floor": 22, - "annualIncomeMax": "52200", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1251", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "575", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw3_Q", - "amiPercentage": "60", - "annualIncomeMin": "32904", - "monthlyIncomeMin": "2502", - "floor": 22, - "annualIncomeMax": "52200", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1251", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "575", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw4_Q", - "amiPercentage": "60", - "annualIncomeMin": "32904", - "monthlyIncomeMin": "2502", - "floor": 22, - "annualIncomeMax": "52200", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1251", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "575", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw5_Q", - "amiPercentage": "60", - "annualIncomeMin": "32904", - "monthlyIncomeMin": "2502", - "floor": 22, - "annualIncomeMax": "52200", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1251", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "575", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw6_Q", - "amiPercentage": "60", - "annualIncomeMin": "32904", - "monthlyIncomeMin": "2502", - "floor": 22, - "annualIncomeMax": "52200", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1251", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "575", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw7_Q", - "amiPercentage": "60", - "annualIncomeMin": "32904", - "monthlyIncomeMin": "2502", - "floor": 22, - "annualIncomeMax": "52200", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1251", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "575", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "AmVp9wBP7kSMil8mTBw8_Q", - "amiPercentage": "60", - "annualIncomeMin": "32904", - "monthlyIncomeMin": "2502", - "floor": 22, - "annualIncomeMax": "52200", - "maxOccupancy": 3, - "minOccupancy": 1, - "monthlyRent": "1251", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "575", - "status": "available", - "unitType": "studio", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "BmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "60", - "annualIncomeMin": "32904", - "monthlyIncomeMin": "2860", - "floor": 13, - "annualIncomeMax": "37584", - "maxOccupancy": 4, - "minOccupancy": 1, - "monthlyRent": "1430", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "748", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "BmVp9wBP7kSMil8mTBw2_Q", - "amiPercentage": "60", - "annualIncomeMin": "32904", - "monthlyIncomeMin": "2860", - "floor": 23, - "annualIncomeMax": "37584", - "maxOccupancy": 4, - "minOccupancy": 1, - "monthlyRent": "1430", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "748", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "BmVp9wBP7kSMil8mTBw3_Q", - "amiPercentage": "60", - "annualIncomeMin": "32904", - "monthlyIncomeMin": "2860", - "floor": 23, - "annualIncomeMax": "37584", - "maxOccupancy": 4, - "minOccupancy": 1, - "monthlyRent": "1430", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "748", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "BmVp9wBP7kSMil8mTBw4_Q", - "amiPercentage": "60", - "annualIncomeMin": "32904", - "monthlyIncomeMin": "2860", - "floor": 23, - "annualIncomeMax": "37584", - "maxOccupancy": 4, - "minOccupancy": 1, - "monthlyRent": "1430", - "numBathrooms": 1, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "748", - "status": "available", - "unitType": "oneBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "CmVp9wBP7kSMil8mTBw1_Q", - "amiPercentage": "60", - "annualIncomeMin": "42312", - "monthlyIncomeMin": "3218", - "floor": 12, - "annualIncomeMax": "37584", - "maxOccupancy": 6, - "minOccupancy": 2, - "monthlyRent": "1609", - "numBathrooms": 2, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "965", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "CmVp9wBP7kSMil8mTBw2_Q", - "amiPercentage": "60", - "annualIncomeMin": "42312", - "monthlyIncomeMin": "3218", - "floor": 24, - "annualIncomeMax": "37584", - "maxOccupancy": 6, - "minOccupancy": 2, - "monthlyRent": "1609", - "numBathrooms": 2, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1040", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "CmVp9wBP7kSMil8mTBw3_Q", - "amiPercentage": "60", - "annualIncomeMin": "42312", - "monthlyIncomeMin": "3218", - "floor": 24, - "annualIncomeMax": "37584", - "maxOccupancy": 6, - "minOccupancy": 2, - "monthlyRent": "1609", - "numBathrooms": 2, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1040", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "CmVp9wBP7kSMil8mTBw4_Q", - "amiPercentage": "60", - "annualIncomeMin": "42312", - "monthlyIncomeMin": "3218", - "floor": 24, - "annualIncomeMax": "37584", - "maxOccupancy": 6, - "minOccupancy": 2, - "monthlyRent": "1609", - "numBathrooms": 2, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1040", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "CmVp9wBP7kSMil8mTBw5_Q", - "amiPercentage": "60", - "annualIncomeMin": "42312", - "monthlyIncomeMin": "3218", - "floor": 24, - "annualIncomeMax": "37584", - "maxOccupancy": 6, - "minOccupancy": 2, - "monthlyRent": "1609", - "numBathrooms": 2, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1040", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "CmVp9wBP7kSMil8mTBw6_Q", - "amiPercentage": "60", - "annualIncomeMin": "42312", - "monthlyIncomeMin": "3218", - "floor": 24, - "annualIncomeMax": "37584", - "maxOccupancy": 6, - "minOccupancy": 2, - "monthlyRent": "1609", - "numBathrooms": 2, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1040", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "CmVp9wBP7kSMil8mTBw7_Q", - "amiPercentage": "60", - "annualIncomeMin": "42312", - "monthlyIncomeMin": "3218", - "floor": 24, - "annualIncomeMax": "37584", - "maxOccupancy": 6, - "minOccupancy": 2, - "monthlyRent": "1609", - "numBathrooms": 2, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1040", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "CmVp9wBP7kSMil8mTBw8_Q", - "amiPercentage": "60", - "annualIncomeMin": "42312", - "monthlyIncomeMin": "3218", - "floor": 24, - "annualIncomeMax": "37584", - "maxOccupancy": 6, - "minOccupancy": 2, - "monthlyRent": "1609", - "numBathrooms": 2, - "numBedrooms": null, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1040", - "status": "available", - "unitType": "twoBdrm", - "createdAt": "2020-02-18T21:20:34.291Z", - "updatedAt": "2020-02-18T21:20:34.291Z", - "listingId": "HOLNx_F7fUCeax5GCoIr5g", - "amiChart": "AlamedaCountyHCD2020", - "bmrProgramChart": false, - "monthlyRentAsPercentOfIncome": null - } - ] - }, - "applicationMethods": [ - { - "type": "POBox", - "acceptsPostmarkedApplications": true - }, - { - "type": "Internal", - "acceptsPostmarkedApplications": true - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "English", - "externalReference": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/SoHay_English_Final.pdf" - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "Spanish", - "externalReference": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/SoHay_Spanish_Final.pdf" - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "Vietnamese", - "externalReference": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/SoHay_Vietnamese_Final.pdf" - }, - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "label": "Chinese", - "externalReference": "https://org-housingbayarea-public-assets.s3-us-west-1.amazonaws.com/SoHay_Chinese_Final.pdf" - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/so-hay.jpeg" - } - ], - "amiChart": { - "name": "AlamedaCountyHCD2020", - "items": [ - { - "percentOfAmi": 60, - "householdSize": 1, - "income": 73100 - }, - { - "percentOfAmi": 60, - "householdSize": 2, - "income": 83550 - }, - { - "percentOfAmi": 60, - "householdSize": 3, - "income": 94000 - }, - { - "percentOfAmi": 60, - "householdSize": 4, - "income": 104400 - }, - { - "percentOfAmi": 60, - "householdSize": 5, - "income": 112800 - }, - { - "percentOfAmi": 60, - "householdSize": 6, - "income": 121150 - }, - { - "percentOfAmi": 60, - "householdSize": 7, - "income": 129500 - } - ] - } -} diff --git a/backend/core/listing_data/the_triton.json b/backend/core/listing_data/the_triton.json deleted file mode 100644 index 621d558689..0000000000 --- a/backend/core/listing_data/the_triton.json +++ /dev/null @@ -1,227 +0,0 @@ -{ - "id": "6b1761f0-0cf8-0139-7cff-2683e7458fb7", - "events":[], - "accessibility": "Accessibility features in common areas like lobby – wheelchair ramps, wheelchair accessible bathrooms and elevators.", - "amenities": "Gym, Clubhouse, Business Lounge, View Lounge, Pool, Spa", - "applicationDueDate": "2020-05-28T00:00:00.000Z", - "applicationOrganization": "Triton", - "applicationAddress": { - "city": "Foster City", - "zipCode": "94404", - "state": "CA", - "street": "55 Triton Park Lane", - "latitude": 37.5658152, - "longitude": -122.2704286 - }, - "applicationPhone": "(650) 437-2039", - "buildingAddress": { - "city": "Foster City", - "county": "San Mateo", - "state": "CA", - "street": "55 Triton Park Lane", - "zipCode": "94404", - "latitude": 37.5658152, - "longitude": -122.2704286 - }, - "buildingSelectionCriteria": "https://regional-dahlia-staging.s3-us-west-1.amazonaws.com/listings/triton/The_Triton_BMR_rental_information.pdf", - "costsNotIncluded": "Residents responsible for PG&E, Internet, Utilities - water, sewer, trash, admin fee. Pet Deposit is $500 with a $60 monthly pet rent. Residents required to maintain a renter's insurance policy as outlined in the lease agreement. Rent is due by the 3rd of each month. Late fee is $50.00. Resident to pay $25 for each returned check or rejected electronic payment. For additional returned checks, resident will pay a charge of $50.00.", - "creditHistory": "No collections, no bankruptcy, income is twice monthly rent A credit report will be completed on all applicants to verify credit ratings.\n\nIncome plus verified credit history will be entered into a credit scoring model to determine rental eligibility and security deposit levels. All decisions for residency are based on a system which considers credit history, rent history, income qualifications, and employment history. An approved decision based on the system does not automatically constittute an approval of residency. Applicant(s) and occupant(s) aged 18 years or older MUST also pass the criminal background check based on the criteria contained herein to be approved for residency. \n\nCredit recommendations other than an accept decision, will require a rental verification. Applications for residency will automatically be denied for the following reasons:\n\n- a. An outstanding debt to a previous landlord or an outstanding NSF check must be paid in full\n- b. An unsatisfied breach of a prior lease or a prior eviction of any applicant or occupant\n- c. More than four (4) late pays and two (2) NSF's in the last twenty-four (24) months ", - "depositMax": "800.0", - "depositMin": "500.0", - "developer": "Thompson Dorfman, LLC", - "imageUrl": "/images/thetriton.png", - "programRules": null, - "externalId": null, - "waitlistMaxSize": 600, - "name": "The Triton", - "neighborhood": "Foster City", - "waitlistCurrentSize": 400, - "petPolicy": "Pets allowed except the following; pit bull, malamute, akita, rottweiler, doberman, staffordshire terrier, presa canario, chowchow, american bull dog, karelian bear dog, st bernard, german shepherd, husky, great dane, any hybrid or mixed breed of the aforementioned breeds. 50 pound weight limit. 2 pets per household limit. $500 pet deposit per pet. $60 pet rent per pet.", - "prioritiesDescriptor": null, - "requiredDocuments": "Due at interview - Paystubs, 3 months’ bank statements, recent tax returns or non-tax affidavit, recent retirement statement, application to lease, application qualifying criteria, social security card, state or nation ID. For self-employed, copy of IRS Tax Return including schedule C and current or most recent clients. Unemployment if applicable. Child support/Alimony; current notice from DA office, a court order or a letter from the provider with copies of last two checks. Any other income etc", - "reservedCommunityMaximumAge": 0, - "reservedCommunityMinimumAge": 0, - "reservedDescriptor": null, - "smokingPolicy": "Non-Smoking", - "yearBuilt": 2018, - "createdAt": "2019-06-03T10:30:41.039Z", - "updatedAt": "2020-05-12T22:15:15.443Z", - "hideUnitFeatures": false, - "unitAmenities": "Washer and dryer, AC and Heater, Gas Stove", - "applicationFee": "38.0", - "criminalBackground": "", - "leasingAgentAddress": { - "city": "Foster City", - "state": "CA", - "street": "55 Triton Park Lane", - "zipCode": "94404", - "latitude": 37.5658152, - "longitude": -122.2704286 - }, - "leasingAgentEmail": "thetriton@legacypartners.com", - "leasingAgentName": "Francis Santos", - "leasingAgentOfficeHours": "Monday - Friday, 9:00 am - 5:00 pm", - "leasingAgentPhone": "650-437-2039", - "leasingAgentTitle": "Business Manager", - "rentalHistory": "No evictions.", - "buildingTotalUnits": 48, - "postmarkedApplicationsReceivedByDate": null, - "totalUnits": 5, - "unitsAvailable": 0, - "units": [ - { - "id": "6b176230-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "120.0", - "annualIncomeMin": "84696.0", - "monthlyIncomeMin": "7058.0", - "floor": 1, - "annualIncomeMax": "177300.0", - "maxOccupancy": 5, - "minOccupancy": 2, - "monthlyRent": "3340.0", - "numBathrooms": null, - "numBedrooms": 2, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "1100", - "status": "occupied", - "unitType": "twoBdrm", - "createdAt": "2019-06-03T10:42:43.134Z", - "updatedAt": "2019-07-10T09:44:01.384Z", - "listingId": 3, - "amiChartId": 7, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b176250-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "80.0", - "annualIncomeMin": "58152.0", - "monthlyIncomeMin": "4858.0", - "floor": 1, - "annualIncomeMax": "103350.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "2624.0", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "750", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-06-03T10:42:43.134Z", - "updatedAt": "2019-07-10T09:44:01.384Z", - "listingId": 3, - "amiChartId": 7, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b176270-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "80.0", - "annualIncomeMin": "58152.0", - "monthlyIncomeMin": "4858.0", - "floor": 1, - "annualIncomeMax": "103350.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "2624.0", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "750", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-06-03T10:42:43.134Z", - "updatedAt": "2019-07-10T09:44:01.384Z", - "listingId": 3, - "amiChartId": 7, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b176280-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "80.0", - "annualIncomeMin": "58152.0", - "monthlyIncomeMin": "4858.0", - "floor": 1, - "annualIncomeMax": "103350.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "2624.0", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "750", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-06-03T10:42:43.134Z", - "updatedAt": "2019-07-10T09:44:01.384Z", - "listingId": 3, - "amiChartId": 7, - "monthlyRentAsPercentOfIncome": null - }, - { - "id": "6b1762a0-0cf8-0139-7cff-2683e7458fb7", - "amiPercentage": "50.0", - "annualIncomeMin": "38952.0", - "monthlyIncomeMin": "3246.0", - "floor": 1, - "annualIncomeMax": "103350.0", - "maxOccupancy": 2, - "minOccupancy": 1, - "monthlyRent": "1575.0", - "numBathrooms": null, - "numBedrooms": 1, - "number": null, - "priorityType": null, - "reservedType": null, - "sqFeet": "750", - "status": "occupied", - "unitType": "oneBdrm", - "createdAt": "2019-06-03T10:42:43.134Z", - "updatedAt": "2019-07-10T09:43:16.766Z", - "listingId": 3, - "amiChartId": 7, - "monthlyRentAsPercentOfIncome": null - } - ], - "preferences": [ - { - "ordinal": 1, - "title": "Live or Work Tiered Preference", - "subtitle": "Up to 5 units available", - "description": "Live in a Below Market Rate deed restricted unit in Foster City for a minimum of twelve (12) months that is subject to termination of affordability restrictions within three (3) years, Live and Work in Foster City, Live in Foster City, Employees of the City of Foster City, Classtudioom teachers who are employees of the San Mateo Foster City School District, Union High School District, and San Mateo County Community College District, Work in Foster City, All other qualified applicants.", - "links": [ - { - "title": "Read More", - "url": "https://www.fostercity.org/commdev/page/preference-categories" - } - ] - } - ], - "applicationMethods": [ - { - "type": "FileDownload", - "acceptsPostmarkedApplications": false, - "externalReference": "https://bit.ly/2wH6dLF", - "label": "English" - }, - { - "type": "PaperPickup", - "acceptsPostmarkedApplications": false - } - ], - "assets": [ - { - "referenceType": "Listing", - "referenceId": "", - "label": "building", - "fileId": "/images/thetriton.png" - } - ] -} diff --git a/backend/core/package.json b/backend/core/package.json index 94600c0927..c13557a6db 100644 --- a/backend/core/package.json +++ b/backend/core/package.json @@ -9,7 +9,7 @@ "scripts": { "clean": "rimraf dist", "build": "rimraf dist && nest build", - "start": "node --optimize_for_size --gc_interval=100 --max_old_space_size=1900 dist/src/main", + "start": "node dist/src/main", "dev": "NODE_ENV=development nest start --watch --preserveWatchOutput", "debug": "nest start --debug --watch", "db:drop": "psql -c 'DROP DATABASE IF EXISTS bloom;'", @@ -56,7 +56,7 @@ "handlebars": "^4.7.6", "ioredis": "^4.24.4", "joi": "^17.3.0", - "jsonpath": "^1.1.0", + "jsonpath": "^1.0.2", "jwt-simple": "^0.5.6", "moment": "^2.29.1", "nanoid": "^3.1.12", diff --git a/backend/core/scripts/listings-importer.ts b/backend/core/scripts/listings-importer.ts index 3ea65c9966..e69a8954a7 100644 --- a/backend/core/scripts/listings-importer.ts +++ b/backend/core/scripts/listings-importer.ts @@ -124,9 +124,6 @@ function reformatListing(listing, relationsKeys: string[]) { if (!("status" in listing)) { listing.status = ListingStatus.active } - if (!("countyCode" in listing)) { - listing.countyCode = "Alameda" - } try { delete listing["id"] } catch (e) { @@ -172,7 +169,7 @@ async function main() { const newListing = await uploadListing(listing) - console.log("Success, New Listing: ", newListing) + console.log(newListing) } void main() diff --git a/backend/core/scripts/listings-update-schema.ts b/backend/core/scripts/listings-update-schema.ts index 53af97c6de..8974bd37e2 100644 --- a/backend/core/scripts/listings-update-schema.ts +++ b/backend/core/scripts/listings-update-schema.ts @@ -10,7 +10,6 @@ if (process.argv.length < 3) { const [listingFilePath] = process.argv.slice(2) -// eslint-disable-next-line @typescript-eslint/no-explicit-any function convertApplicationMethods(listing: any) { const applicationMethods: Array = [] if (listing.acceptsPostmarkedApplications) { diff --git a/backend/core/src/main.ts b/backend/core/src/main.ts index 1e4bd209b4..44607b2360 100644 --- a/backend/core/src/main.ts +++ b/backend/core/src/main.ts @@ -34,8 +34,7 @@ async function bootstrap() { const document = SwaggerModule.createDocument(app, options) SwaggerModule.setup("docs", app, document) const configService: ConfigService = app.get(ConfigService) - const server = await app.listen(configService.get("PORT")) - server.setTimeout(60 * 1000) + await app.listen(configService.get("PORT")) } void bootstrap() diff --git a/backend/core/src/seeds/ami-charts/AlamedaCountyHCD2020.ts b/backend/core/src/seeds/ami-charts/AlamedaCountyHCD2020.ts deleted file mode 100644 index ae3323eb67..0000000000 --- a/backend/core/src/seeds/ami-charts/AlamedaCountyHCD2020.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { AmiChartCreateDto } from "../../ami-charts/dto/ami-chart.dto" -import { BaseEntity } from "typeorm" - -export const AlamedaCountyHCD2020: Omit = { - name: "AlamedaCountyHCD2020", - items: [ - { - percentOfAmi: 60, - householdSize: 1, - income: 73100, - }, - { - percentOfAmi: 60, - householdSize: 2, - income: 83550, - }, - { - percentOfAmi: 60, - householdSize: 3, - income: 94000, - }, - { - percentOfAmi: 60, - householdSize: 4, - income: 104400, - }, - { - percentOfAmi: 60, - householdSize: 5, - income: 112800, - }, - { - percentOfAmi: 60, - householdSize: 6, - income: 121150, - }, - { - percentOfAmi: 60, - householdSize: 7, - income: 129500, - }, - ], -} diff --git a/backend/core/src/seeds/ami-charts/index.ts b/backend/core/src/seeds/ami-charts/index.ts index 27d14ff960..c59748c4b2 100644 --- a/backend/core/src/seeds/ami-charts/index.ts +++ b/backend/core/src/seeds/ami-charts/index.ts @@ -9,4 +9,3 @@ export * from "./SanMateoHERASpecial2019" export * from "./SanMateoHOME2019" export * from "./SanMateoHUD2019" export * from "./SanMateoHUD2020" -export * from "./AlamedaCountyHCD2020" diff --git a/backend/core/tools/listing_converter.rb b/backend/core/tools/listing_converter.rb deleted file mode 100644 index 445fb9a35b..0000000000 --- a/backend/core/tools/listing_converter.rb +++ /dev/null @@ -1,134 +0,0 @@ -require 'active_support/core_ext/hash' -require 'active_support/core_ext/integer/inflections' -require 'json' -require 'byebug' -require 'geocoder' - -class ListingConverter - KEY_PAIRS = { - application_city: %w[applicationAddress city], - application_street: %w[applicationAddress street], - application_postal_code: %w[applicationAddress zipCode], - application_state: %w[applicationAddress state], - application_street_address: %w[applicationAddress street], - building_city: %w[buildingAddress city], - building_street: %w[buildingAddress street], - building_postal_code: %w[buildingAddress zipCode], - building_zip_code: %w[buildingAddress zipCode], - building_state: %w[buildingAddress state], - building_street_address: %w[buildingAddress street], - leasing_agent_city: %w[leasingAgentAddress city], - leasing_agent_street: %w[leasingAgentAddress street], - leasing_agent_zip: %w[leasingAgentAddress zipCode], - leasing_agent_state: %w[leasingAgentAddress state], - leasing_agent_street_address: %w[leasingAgentAddress street], - accepts_postmark: %w[acceptsPostmarkedApplications], - postmark_due_date: %w[postmarkedApplicationsReceivedByDate], - application_download_url: %w[attachments fileUrl] - }.with_indifferent_access.freeze - - def initialize(file_name) - file = File.read(file_name) - @json = JSON.parse(file) - end - - def call - listings = [] - - @json.each do |listing| - new_listing = {} - listing.each do |key, value| - if KEY_PAIRS[key] - index = 0 - KEY_PAIRS[key].inject(new_listing) do |memo, k| - if index == KEY_PAIRS[key].size - 1 - memo[k] = convert(value) - elsif memo[k].nil? - memo[k] = {} - end - index += 1 - memo[k] - end - else - new_listing[key.camelize(:lower)] = convert(value) - end - end - if new_listing['attachments'].present? - attachment = new_listing['attachments'] - attachment['label'] = 'English' - attachment['type'] = 1 - new_listing['attachments'] = [attachment] - end - geocode(new_listing) - new_listing.delete 'unitSummaries' - listings << new_listing - end - listings - end - - # Loading listings from dahlia-listings app - def load_listings(group_id) - Time::DATE_FORMATS[:default] = '%Y-%m-%dT%H:%M:%S.%LZ' - @group = Group.find(group_id) - @listings_scope = @group.listings_for_self_and_descendants - listings = @listings_scope - json_listings = [] - - listings.each do |listing| - json_listing = listing.as_json - # unit_summaries = ListingService.create_unit_summaries(listing) - # json_listing[:unit_summaries] = unit_summaries - json_listing[:total_units] = listing.units.count - json_listing[:units_available] = listing.units.available.count - json_listing[:units] = listing.units - json_listing[:preferences] = listing.preferences - if json_listing['reserved_descriptor'].present? - json_listing['reserved_descriptor'] = [{ name: json_listing['reserved_descriptor'] }] - end - json_listings << json_listing - end - puts JSON.pretty_generate json_listings.as_json - end - - private - - def geocode(listing) - %w[applicationAddress buildingAddress leasingAgentAddress].each do |address| - query = listing[address].slice('street', 'city', 'zipCode').values.join(', ') - position = Geocoder.search(query).first - if position - listing[address]['latitude'] = position.latitude - listing[address]['longitude'] = position.longitude - end - end - end - - def preferences(listing) - old_preferences = listing['preferences'] - new_preferences = [] - old_preferences.sort_by{|p| p['order'] }.each_with_index do |preference, i| - new_preferences << { - ordinal: (i + 1).ordinalize, - title: preference['name'], - subtitle: "Up to #{preference['availableUnitsCount']} units available", - description: preference['description'], - links: [] - } - end - listing['preferences'] = new_preferences - end - - def convert(value) - if value.is_a? Hash - camelized = {} - value.each do |k, v| - camelized[k.camelize(:lower)] = convert(v) - end - camelized - elsif value.is_a? Array - value.map { |v| convert(v) } - else - value - end - end -end diff --git a/cypress.json b/cypress.json index 0967ef424b..9e26dfeeb6 100644 --- a/cypress.json +++ b/cypress.json @@ -1 +1 @@ -{} +{} \ No newline at end of file diff --git a/shared/ui-components/src/actions/Button.stories.tsx b/shared/ui-components/src/actions/Button.stories.tsx deleted file mode 100644 index d2c2872e91..0000000000 --- a/shared/ui-components/src/actions/Button.stories.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import * as React from "react" - -import { Button } from "../actions/Button" -import { AppearanceBorderType, AppearanceSizeType, AppearanceStyleType } from "../global/AppearanceTypes" - -export default { - title: "Actions/Button", -} - -const handleClick = (e: React.MouseEvent) => { - window.alert(`You clicked me! Event: ${e.type}`) -} - -export const standard = () => - -export const small = () => ( - -) - -export const big = () => ( - -) - -export const primary = () => ( - -) - -export const secondary = () => ( - -) - -export const success = () => ( - -) - -export const alert = () => ( - -) - -export const warning = () => ( - -) - -export const SmallAndPrimary = () => ( - -) - -export const NormalCase = () => ( - -) - -export const NormalCaseAndSuccess = () => ( - -) - -export const borderless = () => ( - -) - -export const successOutline = () => ( - -) - -export const alertOutlined = () => ( - -) - -export const warningOutline = () => ( - -) - -export const unstyled = () => ( - -) - -// TODO: replace with tailwind markup, if it matters -export const inaccessible = () => ( - -) diff --git a/shared/ui-components/src/actions/__snapshots__/Button.stories.storyshot b/shared/ui-components/src/actions/__snapshots__/Button.stories.storyshot deleted file mode 100644 index 8f9c440eea..0000000000 --- a/shared/ui-components/src/actions/__snapshots__/Button.stories.storyshot +++ /dev/null @@ -1,242 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Storyshots Actions/Button Alert 1`] = ` - - -`; - -exports[`Storyshots Actions/Button Alert Outlined 1`] = ` - - -`; - -exports[`Storyshots Actions/Button Big 1`] = ` - - -`; - -exports[`Storyshots Actions/Button Borderless 1`] = ` - - -`; - -exports[`Storyshots Actions/Button Inaccessible 1`] = ` - -`; - -exports[`Storyshots Actions/Button Normal Case 1`] = ` - - -`; - -exports[`Storyshots Actions/Button Normal Case And Success 1`] = ` - - -`; - -exports[`Storyshots Actions/Button Primary 1`] = ` - - -`; - -exports[`Storyshots Actions/Button Secondary 1`] = ` - - -`; - -exports[`Storyshots Actions/Button Small 1`] = ` - - -`; - -exports[`Storyshots Actions/Button Small And Primary 1`] = ` - - -`; - -exports[`Storyshots Actions/Button Standard 1`] = ` - - -`; - -exports[`Storyshots Actions/Button Success 1`] = ` - - -`; - -exports[`Storyshots Actions/Button Success Outline 1`] = ` - - -`; - -exports[`Storyshots Actions/Button Unstyled 1`] = ` - - -`; - -exports[`Storyshots Actions/Button Warning 1`] = ` - - -`; - -exports[`Storyshots Actions/Button Warning Outline 1`] = ` - - -`; diff --git a/shared/ui-components/src/page_components/listing/listing_sidebar/__snapshots__/ApplicationSection.stories.storyshot b/shared/ui-components/src/page_components/listing/listing_sidebar/__snapshots__/ApplicationSection.stories.storyshot deleted file mode 100644 index 33807e4a9f..0000000000 --- a/shared/ui-components/src/page_components/listing/listing_sidebar/__snapshots__/ApplicationSection.stories.storyshot +++ /dev/null @@ -1,3674 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Storyshots Listing Sidebar/Application Section Due Soon 1`] = ` - -
-
- -

- Waitlist is open -

-
-

- Submit an application for an open slot on the waitlist. -

-
    - -
  • - - 0 - - - Current Waitlist Size - -
  • -
    - -
  • - - 300 - - - Open Waitlist Slots - -
  • -
    - -
  • - - 300 - - - Final Waitlist Size - -
  • -
    -
-
-
-
- -
-

- How to Apply -

- -

- Pick up an application -

-
- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-

- Office Hours -

-
- ", - "lt": "<", - "nbsp": " ", - "quot": "“", - }, - "overrides": Object {}, - "slugify": [Function], - } - } - > - - Mon, Tues & Fri, 9:00AM - 4:00PM - - -
-
-
-
- -
- - 2 - - Submit a Paper Application -
-
- -

- Send Application by US Mail -

-
-

- 98 Archer Street -

- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-
-

- Applications must be received by the deadline. If sending by U.S. Mail, the application must be postmarked by Apr 11, 2030 and received by mail no later than Apr 01, 2030. Applications received after Apr 01, 2030 via mail will not be accepted even if they are postmarked by Apr 11, 2030. Charities Housing is not responsible for lost or delayed mail. -

- -
- - or - -
-
- -

- Drop Off Application -

-
- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-

- Office Hours -

-
- ", - "lt": "<", - "nbsp": " ", - "quot": "“", - }, - "overrides": Object {}, - "slugify": [Function], - } - } - > - - Mon, Tues & Fri, 9:00AM - 4:00PM - - -
-
-
-
-
-
-`; diff --git a/shared/ui-components/src/page_components/listing/listing_sidebar/__snapshots__/Apply.stories.storyshot b/shared/ui-components/src/page_components/listing/listing_sidebar/__snapshots__/Apply.stories.storyshot deleted file mode 100644 index e73d82ef59..0000000000 --- a/shared/ui-components/src/page_components/listing/listing_sidebar/__snapshots__/Apply.stories.storyshot +++ /dev/null @@ -1,8738 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Storyshots Listing Sidebar/Apply Accepts Postmarked Applications 1`] = ` - -
-

- How to Apply -

- -

- Pick up an application -

-
- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-

- Office Hours -

-
- ", - "lt": "<", - "nbsp": " ", - "quot": "“", - }, - "overrides": Object {}, - "slugify": [Function], - } - } - > - - Mon, Tues & Fri, 9:00AM - 4:00PM - - -
-
-
-
- -
- - 2 - - Submit a Paper Application -
-
- -

- Send Application by US Mail -

-
-

- 98 Archer Street -

- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-
-

- Applications must be received by the deadline. If sending by U.S. Mail, the application must be postmarked by Nov 30, 2021 and received by mail no later than Dec 05, 2021. Applications received after Dec 05, 2021 via mail will not be accepted even if they are postmarked by Nov 30, 2021. Charities Housing is not responsible for lost or delayed mail. -

- -
- - or - -
-
- -

- Drop Off Application -

-
- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-

- Office Hours -

-
- ", - "lt": "<", - "nbsp": " ", - "quot": "“", - }, - "overrides": Object {}, - "slugify": [Function], - } - } - > - - Mon, Tues & Fri, 9:00AM - 4:00PM - - -
-
-
-
-`; - -exports[`Storyshots Listing Sidebar/Apply Hard Application Deadline 1`] = ` - -
-

- How to Apply -

- -

- Pick up an application -

-
- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-

- Office Hours -

-
- ", - "lt": "<", - "nbsp": " ", - "quot": "“", - }, - "overrides": Object {}, - "slugify": [Function], - } - } - > - - Mon, Tues & Fri, 9:00AM - 4:00PM - - -
-
-
-
- -
- - 2 - - Submit a Paper Application -
-
- -

- Send Application by US Mail -

-
-

- 98 Archer Street -

- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-
-

- Applications must be received by the deadline and postmarks will not be considered. -

- -
- - or - -
-
- -

- Drop Off Application -

-
- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-

- Office Hours -

-
- ", - "lt": "<", - "nbsp": " ", - "quot": "“", - }, - "overrides": Object {}, - "slugify": [Function], - } - } - > - - Mon, Tues & Fri, 9:00AM - 4:00PM - - -
-
-
-
-`; - -exports[`Storyshots Listing Sidebar/Apply Link Directly To External Application 1`] = ` - -
-

- How to Apply -

- - - Apply Online - - - -
- - or - -
-
- -

- Pick up an application -

-
- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-

- Office Hours -

-
- ", - "lt": "<", - "nbsp": " ", - "quot": "“", - }, - "overrides": Object {}, - "slugify": [Function], - } - } - > - - Mon, Tues & Fri, 9:00AM - 4:00PM - - -
-
-
-
- -
- - 2 - - Submit a Paper Application -
-
- -

- Send Application by US Mail -

-
-

- 98 Archer Street -

- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-
-

- Applications must be received by the deadline. If sending by U.S. Mail, the application must be postmarked by Nov 30, 2021 and received by mail no later than Dec 05, 2021. Applications received after Dec 05, 2021 via mail will not be accepted even if they are postmarked by Nov 30, 2021. Charities Housing is not responsible for lost or delayed mail. -

- -
- - or - -
-
- -

- Drop Off Application -

-
- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-

- Office Hours -

-
- ", - "lt": "<", - "nbsp": " ", - "quot": "“", - }, - "overrides": Object {}, - "slugify": [Function], - } - } - > - - Mon, Tues & Fri, 9:00AM - 4:00PM - - -
-
-
-
-`; - -exports[`Storyshots Listing Sidebar/Apply Link Directly To Internal Application 1`] = ` - -
-

- How to Apply -

- - - - - Apply Online - - - - - -
- - or - -
-
- -

- Pick up an application -

-
- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-

- Office Hours -

-
- ", - "lt": "<", - "nbsp": " ", - "quot": "“", - }, - "overrides": Object {}, - "slugify": [Function], - } - } - > - - Mon, Tues & Fri, 9:00AM - 4:00PM - - -
-
-
-
- -
- - 2 - - Submit a Paper Application -
-
- -

- Send Application by US Mail -

-
-

- 98 Archer Street -

- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-
-

- Applications must be received by the deadline. If sending by U.S. Mail, the application must be postmarked by Nov 30, 2021 and received by mail no later than Dec 05, 2021. Applications received after Dec 05, 2021 via mail will not be accepted even if they are postmarked by Nov 30, 2021. Charities Housing is not responsible for lost or delayed mail. -

- -
- - or - -
-
- -

- Drop Off Application -

-
- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-

- Office Hours -

-
- ", - "lt": "<", - "nbsp": " ", - "quot": "“", - }, - "overrides": Object {}, - "slugify": [Function], - } - } - > - - Mon, Tues & Fri, 9:00AM - 4:00PM - - -
-
-
-
-`; - -exports[`Storyshots Listing Sidebar/Apply Link To Internal Application And Downloads 1`] = ` - -
-

- How to Apply -

- - - - - Apply Online - - - - - -
- - or - -
-
- -
- - 1 - - Get a Paper Application -
-
- - - -
- - or - -
-
- -

- Pick up an application -

-
- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-

- Office Hours -

-
- ", - "lt": "<", - "nbsp": " ", - "quot": "“", - }, - "overrides": Object {}, - "slugify": [Function], - } - } - > - - Mon, Tues & Fri, 9:00AM - 4:00PM - - -
-
-
-
- -
- - 2 - - Submit a Paper Application -
-
- -

- Send Application by US Mail -

-
-

- 98 Archer Street -

- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-
-

- Applications must be received by the deadline. If sending by U.S. Mail, the application must be postmarked by Nov 30, 2021 and received by mail no later than Dec 05, 2021. Applications received after Dec 05, 2021 via mail will not be accepted even if they are postmarked by Nov 30, 2021. Charities Housing is not responsible for lost or delayed mail. -

- -
- - or - -
-
- -

- Drop Off Application -

-
- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-

- Office Hours -

-
- ", - "lt": "<", - "nbsp": " ", - "quot": "“", - }, - "overrides": Object {}, - "slugify": [Function], - } - } - > - - Mon, Tues & Fri, 9:00AM - 4:00PM - - -
-
-
-
-`; - -exports[`Storyshots Listing Sidebar/Apply Shows Multiple Download UR Ls 1`] = ` - -
-

- How to Apply -

- -
- - 1 - - Get a Paper Application -
-
- - - -
- - or - -
-
- -

- Pick up an application -

-
- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-

- Office Hours -

-
- ", - "lt": "<", - "nbsp": " ", - "quot": "“", - }, - "overrides": Object {}, - "slugify": [Function], - } - } - > - - Mon, Tues & Fri, 9:00AM - 4:00PM - - -
-
-
-
- -
- - 2 - - Submit a Paper Application -
-
- -

- Send Application by US Mail -

-
-

- 98 Archer Street -

- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-
-

- Applications must be received by the deadline. If sending by U.S. Mail, the application must be postmarked by Nov 30, 2021 and received by mail no later than Dec 05, 2021. Applications received after Dec 05, 2021 via mail will not be accepted even if they are postmarked by Nov 30, 2021. Charities Housing is not responsible for lost or delayed mail. -

- -
- - or - -
-
- -

- Drop Off Application -

-
- -

- - 98 Archer Street -
- San Jose - , - CA - - 95112 -
-
- - - - - - - - - - Get Directions - -

-

- Office Hours -

-
- ", - "lt": "<", - "nbsp": " ", - "quot": "“", - }, - "overrides": Object {}, - "slugify": [Function], - } - } - > - - Mon, Tues & Fri, 9:00AM - 4:00PM - - -
-
-
-
-`; diff --git a/sites/partners/page_content/locale_overrides/general.json b/sites/partners/page_content/locale_overrides/general.json index 76684b4750..472959c793 100644 --- a/sites/partners/page_content/locale_overrides/general.json +++ b/sites/partners/page_content/locale_overrides/general.json @@ -5,14 +5,6 @@ "application": { "details": { "countyName": "Alameda County" - }, - "preferences": { - "PBV": { - "title": "Oakland Housing Authority", - "doNotConsider": { - "label": "I don't want to be considered for Oakland Housing Authority project-based voucher units" - } - } } } } diff --git a/sites/public/.env.template b/sites/public/.env.template index 5840d86fc7..8e3aa90f2f 100644 --- a/sites/public/.env.template +++ b/sites/public/.env.template @@ -1,7 +1,7 @@ ## == IMPORTANT REMINDER: ANY EDITS HERE MUST BE UPDATED IN ALL ENVIRONMENTS (incl. CI) == ## BACKEND_API_BASE=http://localhost:3100 -LISTINGS_QUERY=/listings/?jsonpath=%24%5B%3F(%40.buildingAddress.county%3D%3D%22Alameda%22)%5D -HOUSING_COUNSELOR_SERVICE_URL=https://www.acgov.org/cda/hcd/index.htm +LISTINGS_QUERY=/listings +HOUSING_COUNSELOR_SERVICE_URL=https://housing.sfgov.org/assets/housing_counselors-7b0f260dac22dfa20871edd36135b62f1a25a9dad78faf2cf8e8e2514b80cf61.json NEXTJS_PORT=3000 MAPBOX_TOKEN=pk.eyJ1IjoibWplZHJhcyIsImEiOiJjazI2OHA5YzQycTBpM29xdDVwbXNyMDlwIn0.XS5ilGzTh_yVl3XY-8UKeA LANGUAGES=en,es,zh,vi diff --git a/sites/public/CHANGELOG.md b/sites/public/CHANGELOG.md new file mode 100644 index 0000000000..629642ba47 --- /dev/null +++ b/sites/public/CHANGELOG.md @@ -0,0 +1,35 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.2.5](https://github.com/bloom-housing/bloom/compare/v0.2.3...v0.2.5) (2020-06-30) + +**Note:** Version bump only for package @bloom-housing/public-reference + + + + + +## [0.2.2](https://github.com/bloom-housing/bloom/compare/v0.2.1...v0.2.2) (2020-06-05) + +**Note:** Version bump only for package @bloom-housing/public-reference + + + + + +## [0.2.1](https://github.com/bloom-housing/bloom/compare/v0.2.0...v0.2.1) (2020-06-05) + +**Note:** Version bump only for package @bloom-housing/public-reference + + + + + +## [0.0.9](https://github.com/bloom-housing/bloom/compare/v0.0.2...v0.0.9) (2020-04-21) + + +### Reverts + +* Revert "Getting layout component ready for Google Analytics" ([7ca55ec](https://github.com/bloom-housing/bloom/commit/7ca55ec94c1f377a8e40645f9cc61780b7c1cefa)) diff --git a/sites/public/components/RenderIf.tsx b/sites/public/components/RenderIf.tsx deleted file mode 100644 index 697a6524a8..0000000000 --- a/sites/public/components/RenderIf.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { useRouter } from "next/router" - -const RenderIf = (props: { language: string; children: JSX.Element }) => { - const router = useRouter() - - if (props.language == "all") { - return props.children - } else if (props.language == router.query.language) { - return props.children - } else if (!router.query.language && props.language == "default") { - return props.children - } else { - return null - } -} - -export default RenderIf diff --git a/sites/public/cypress/fixtures/example.json b/sites/public/cypress/fixtures/example.json deleted file mode 100644 index da18d9352a..0000000000 --- a/sites/public/cypress/fixtures/example.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "Using fixtures to represent data", - "email": "hello@cypress.io", - "body": "Fixtures are a great way to mock data for responses to routes" -} \ No newline at end of file diff --git a/sites/public/cypress/integration/navigation.ts b/sites/public/cypress/integration/navigation.ts index f60fd2ebe8..369dec63de 100644 --- a/sites/public/cypress/integration/navigation.ts +++ b/sites/public/cypress/integration/navigation.ts @@ -30,6 +30,13 @@ describe("Navigating around the site", () => { it("Can navigate to all page types after initial site load", () => { cy.visit("/") + // Click on the Disclaimer page link in the footer + cy.get("footer a").contains("Disclaimer").click() + + // Should be on the disclaimer page + cy.location("pathname").should("equal", "/disclaimer") + cy.contains("Endorsement Disclaimers") + // Click on the listings page link in the header nav cy.get(".navbar").contains("Listings").click() diff --git a/sites/public/cypress/integration/pages/application/financial/income.spec.ts b/sites/public/cypress/integration/pages/application/financial/income.spec.ts index 9475d02dfd..ad0180c1d2 100644 --- a/sites/public/cypress/integration/pages/application/financial/income.spec.ts +++ b/sites/public/cypress/integration/pages/application/financial/income.spec.ts @@ -44,74 +44,73 @@ describe("applications/financial/income", function () { cy.isNextRouteValid("income") }) - // TODO: toggle this verification off at the jurisdiction level with a feature flag - // it("Should show error when annual income is lower than allowed", function () { - // cy.loadConfig() - // cy.visit(route) + it("Should show error when annual income is lower than allowed", function () { + cy.loadConfig() + cy.visit(route) - // const income = getListingIncome() + const income = getListingIncome() - // const annualMin = income?.annualMax ? income?.annualMin - 1 : null + const annualMin = income?.annualMax ? income?.annualMin - 1 : null - // cy.getByID("income").type(`${annualMin}`) - // cy.getByID("incomePeriodYearly").check() + cy.getByID("income").type(`${annualMin}`) + cy.getByID("incomePeriodYearly").check() - // cy.goNext() + cy.goNext() - // cy.checkErrorAlert("be.visible") - // cy.get(".alert").should("be.visible").and("contain.text", this.data["incomeTooLowErrorText"]) - // }) + cy.checkErrorAlert("be.visible") + cy.get(".alert").should("be.visible").and("contain.text", this.data["incomeTooLowErrorText"]) + }) - // it("Should show error when annual income is more than allowed", function () { - // cy.loadConfig() - // cy.visit(route) + it("Should show error when annual income is more than allowed", function () { + cy.loadConfig() + cy.visit(route) - // const income = getListingIncome() + const income = getListingIncome() - // const annualMax = income?.annualMax ? income?.annualMax + 1 : null + const annualMax = income?.annualMax ? income?.annualMax + 1 : null - // cy.getByID("income").type(`${annualMax}`) - // cy.getByID("incomePeriodYearly").check() + cy.getByID("income").type(`${annualMax}`) + cy.getByID("incomePeriodYearly").check() - // cy.goNext() + cy.goNext() - // cy.checkErrorAlert("be.visible") - // cy.get(".alert").should("be.visible").and("contain.text", this.data["incomeTooHighErrorText"]) - // }) + cy.checkErrorAlert("be.visible") + cy.get(".alert").should("be.visible").and("contain.text", this.data["incomeTooHighErrorText"]) + }) - // it("Should show error when monthly income is less than allowed", function () { - // cy.loadConfig() - // cy.visit(route) + it("Should show error when monthly income is less than allowed", function () { + cy.loadConfig() + cy.visit(route) - // const income = getListingIncome() + const income = getListingIncome() - // const monthlyMin = income?.monthlyMin ? income?.monthlyMin - 1 : null + const monthlyMin = income?.monthlyMin ? income?.monthlyMin - 1 : null - // cy.getByID("income").type(`${monthlyMin}`) - // cy.getByID("incomePeriodMonthly").check() + cy.getByID("income").type(`${monthlyMin}`) + cy.getByID("incomePeriodMonthly").check() - // cy.goNext() + cy.goNext() - // cy.checkErrorAlert("be.visible") - // cy.get(".alert").should("be.visible").and("contain.text", this.data["incomeTooLowErrorText"]) - // }) + cy.checkErrorAlert("be.visible") + cy.get(".alert").should("be.visible").and("contain.text", this.data["incomeTooLowErrorText"]) + }) - // it("Should show error when monthly income is more than allowed", function () { - // cy.loadConfig() - // cy.visit(route) + it("Should show error when monthly income is more than allowed", function () { + cy.loadConfig() + cy.visit(route) - // const income = getListingIncome() + const income = getListingIncome() - // const monthlyMax = income?.monthlyMax ? income?.monthlyMax + 1 : null + const monthlyMax = income?.monthlyMax ? income?.monthlyMax + 1 : null - // cy.getByID("income").type(`${monthlyMax}`) - // cy.getByID("incomePeriodMonthly").check() + cy.getByID("income").type(`${monthlyMax}`) + cy.getByID("incomePeriodMonthly").check() - // cy.goNext() + cy.goNext() - // cy.checkErrorAlert("be.visible") - // cy.get(".alert").should("be.visible").and("contain.text", this.data["incomeTooHighErrorText"]) - // }) + cy.checkErrorAlert("be.visible") + cy.get(".alert").should("be.visible").and("contain.text", this.data["incomeTooHighErrorText"]) + }) it("Should save form values and redirect to the next step", function () { cy.loadConfig() diff --git a/sites/public/cypress/integration/pages/application/household/add-members.spec.ts b/sites/public/cypress/integration/pages/application/household/add-members.spec.ts index b12f0d48f7..128cc74938 100644 --- a/sites/public/cypress/integration/pages/application/household/add-members.spec.ts +++ b/sites/public/cypress/integration/pages/application/household/add-members.spec.ts @@ -40,37 +40,36 @@ describe("applications/household/add-members", function () { cy.location("pathname").should("include", "applications/household/member") }) - // TODO: toggle this verification off at the jurisdiction level with a feature flag - // it("Should show an error when min. household size is > 1 and defined less", function () { - // cy.loadConfig({ - // property: { - // householdSizeMax: 2, - // householdSizeMin: 2, - // }, - // }) - // cy.visit(route) + it("Should show an error when min. household size is > 1 and defined less", function () { + cy.loadConfig({ + property: { + householdSizeMax: 2, + householdSizeMin: 2, + }, + }) + cy.visit(route) - // cy.getByID("btn-add-done").click() + cy.getByID("btn-add-done").click() - // cy.get(".alert-notice").should("be.visible").and("contain", "small") - // }) + cy.get(".alert-notice").should("be.visible").and("contain", "small") + }) - // it("Should show an error if max. household size is 1 and defined more", function () { - // cy.loadConfig( - // { - // property: { - // householdSizeMax: 1, - // householdSizeMin: 0, - // }, - // }, - // "applicationConfigFilled.json" - // ) - // cy.visit(route) + it("Should show an error if max. household size is 1 and defined more", function () { + cy.loadConfig( + { + property: { + householdSizeMax: 1, + householdSizeMin: 0, + }, + }, + "applicationConfigFilled.json" + ) + cy.visit(route) - // cy.getByID("btn-add-done").click() + cy.getByID("btn-add-done").click() - // cy.get(".alert-notice").should("be.visible").and("contain", "too big") - // }) + cy.get(".alert-notice").should("be.visible").and("contain", "too big") + }) it("Should move to next route Add member click", function () { cy.loadConfig({ diff --git a/sites/public/cypress/integration/pages/application/household/live-alone.spec.ts b/sites/public/cypress/integration/pages/application/household/live-alone.spec.ts index 4776c6f47c..7d1830e027 100644 --- a/sites/public/cypress/integration/pages/application/household/live-alone.spec.ts +++ b/sites/public/cypress/integration/pages/application/household/live-alone.spec.ts @@ -27,20 +27,19 @@ describe("applications/household/live-alone", function () { }) }) - // TODO: toggle this verification off at the jurisdiction level with a feature flag - // it("Should show an error when min. household size is > 1", function () { - // cy.loadConfig({ - // property: { - // householdSizeMax: 2, - // householdSizeMin: 1, - // }, - // }) - // cy.visit(route) + it("Should show an error when min. household size is > 1", function () { + cy.loadConfig({ + property: { + householdSizeMax: 2, + householdSizeMin: 1, + }, + }) + cy.visit(route) - // cy.getByID("btn-live-alone").click() + cy.getByID("btn-live-alone").click() - // cy.get(".alert-notice").should("be.visible").and("contain", "small") - // }) + cy.get(".alert-notice").should("be.visible").and("contain", "small") + }) // TODO: should be implemented, but first frontend have to be fixed // it("Should show an error when max. household size is 1", function () { diff --git a/sites/public/layouts/application.tsx b/sites/public/layouts/application.tsx index cfa50432ba..8973578809 100644 --- a/sites/public/layouts/application.tsx +++ b/sites/public/layouts/application.tsx @@ -33,19 +33,7 @@ const Layout = (props) => { - {t("nav.getFeedback")} - - {t("nav.yourFeedback")} - - {t("nav.bonusFeedback")} - - } + notice="This is a preview of our new website. We're just getting started. We'd love to get your feedback." title={t("nav.siteTitle")} language={{ list: languages, @@ -57,7 +45,7 @@ const Layout = (props) => { {/* Only show Get Assistance if housing counselor data is available */} {process.env.housingCounselorServiceUrl && ( - + {t("nav.getAssistance")} )} @@ -84,54 +72,13 @@ const Layout = (props) => {
- - Alameda County - - -

- {t("footer.header")} -
- - {t("footer.headerLink")} - -

-

{t("footer.forListingQuestions")}

-

{t("footer.forGeneralInquiries")}

-

- {t("footer.forAdditionalOpportunities")} -
- - {t("footer.SFHousingPortal")} - - | - - San Mateo County Housing Portal - - | - - City of San José Housing Portal - -

-
- - Equal Housing Opportunity Logo - - - - {t("footer.giveFeedback")} - - {t("footer.contact")} - - {t("footer.disclaimer")} - - {t("footer.privacyPolicy")} + + + {t("pageTitle.privacy")} + + + {t("pageTitle.disclaimer")} + diff --git a/sites/public/page_content/AdditionalResources.mdx b/sites/public/page_content/AdditionalResources.mdx deleted file mode 100644 index 3a1934a51b..0000000000 --- a/sites/public/page_content/AdditionalResources.mdx +++ /dev/null @@ -1,294 +0,0 @@ -import { InfoCardGrid, InfoCard } from "@bloom-housing/ui-components" -import RenderIf from "../components/RenderIf.tsx" - - - - - - - If you are in need of immediate emergency shelter and housing assistance, please contact Eden Information & Referral at 510-537-2552 or the Bay Area Helpline at 1-800-273-6222, or visit https://achousingchoices.org/. - - Alameda County - - - - - - BACS Housing Resource Center, contact number: 510-613-0330. - - Albany, Berkeley, Emeryville, and Oakland - - - - - - Provides rental assistance, housing assistance, tenant/landlord counseling, home-seeking, home-sharing, and mortgage and home purchase counseling. - - - - -
- - - - - Information on the Alameda County Housing & Community Development (HCD) Department’s policies and programs. - - - - - - Provides down payment assistance loans to eligible, middle-income, first-time homebuyers. - - - - - - Provides free legal services and emergency financial assistance to tenants and homeowners. - - - - - Provides affordable, low-interest deferred payment loans to assist residents with making home improvements that are necessary to stay, grow, and thrive in their homes. - - - -
- - - - - - - - - - - - - - - - - - -
- - - - - - - Si necesita asistencia inmediata de emergencia para obtener un refugio o vivienda, sírvase poner en contacto con Eden Information & Referral llamando al 510-537-2552 o con la Bay Area Helpline llamando al 1-800-273-6222 o visitando https://achousingchoices.org/. - - Condado de Alameda - - - - - - Número de contacto del Centro de Recursos de Vivienda de BACS: 510-613-0330. - - Albany, Berkeley, Emeryville y Oakland - - - - - - Proporciona ayuda en el alquiler, asistencia de vivienda, asesoría a inquilinos y caseros, búsqueda de vivienda, vivienda compartida y asesoría sobre hipotecas y compra de viviendas. - - - - -
- - - - - Información sobre las políticas y programas del Departamento de Desarrollo Comunitario y de Vivienda (HCD) del Condado de Alameda. - - - - - - Proporciona préstamos de asistencia para pagos iniciales a compradores de casas de ingresos medianos que compren su primera casa y reúnan los requisitos. - - - - - - Proporciona servicios legales gratuitos y asistencia financiera de emergencia a inquilinos y propietarios de viviendas. - - - - - Proporciona préstamos accesibles de intereses bajos y pagos diferidos para ayudar a los residentes a realizar mejoras en sus hogares que sean necesarias para permanecer, crecer y progresar en sus hogares. - - - -
- - - - - - - - - - - - - - - - - - -
- - - - - - - 如果您需要立即入住緊急收容所和尋求住房協助,請致電 510-537-2552 與 Eden Information & Referral(伊甸資訊和轉介中心)聯絡,或致電 1-800-273-6222 與 Bay Area Helpline(灣區求助熱線)聯絡;或可瀏覽 https://achousingchoices.org/ 。 - - 阿拉米達縣 - - - - - - BACS 住房資源中心,聯絡電話:510-613-0330。 - - Albany、Berkeley、Emeryville 及 Oakland - - - - - - 提供租屋援助、住房援助、租客/房東諮詢、房屋尋找、房屋共享以及抵押和購買房屋諮詢服務。 - - - - -
- - - - - 有關阿拉米達縣房屋及社區發展部 (HCD) 政策和計劃的資訊。 - - - - - - 為符合資格、首次置業的中等收入人士提供首期貸款援助。 - - - - - - 為租戶和業主提供免費法律服務和緊急財務援助。 - - - - - 提供人們負擔得起,並可延期還款的低息貸款,幫助居民為家居進行必要的修繕,讓他們繼續留在家中生活、成長和發展。 - - - -
- - - - - - - - - - - - - - - - - - -
- - - - - - - Nếu quý vị cần nơi trú ẩn khẩn cấp và hỗ trợ về nhà ở ngay lập tức, vui lòng liên lạc ban Thông tin & Giới thiệu Eden theo số 510-537-2552 hoặc Đường dây Trợ giúp Bay Area theo số 1-800-273-6222, hoặc truy cập https://achousingchoices.org/. - - Quận Alameda - - - - - - Trung tâm Nguồn Thông Tin Trợ giúp Gia cư BACS, số điện thoại liên lạc: 510-613-0330. - - Albany, Berkeley, Emeryville, và Oakland - - - - - - Cung cấp hỗ trợ tiền thuê nhà, hỗ trợ nhà ở, cố vấn cho người thuê nhà/chủ nhà, tìm kiếm nhà, chia sẻ nhà, và cố vấn về tiền mua nhà trả góp và mua nhà. - - - - -
- - - - - Thông tin về các chính sách và chương trình của Sở Gia cư và Phát triển Cộng đồng (HCD) Quận Alameda. - - - - - - Cung cấp hỗ trợ cho vay tiền trả trước để mua nhà cho những người lần đầu tiên mua nhà hội đủ điều kiện, có thu nhập trung bình. - - - - - - Cung cấp dịch vụ pháp lý miễn phí và hỗ trợ tài chính khẩn cấp cho người thuê nhà và chủ nhà. - - - - - Cung cấp các khoản vay trả chậm lãi suất thấp để hỗ trợ các cư dân nâng cấp nhà cần thiết để ở, phát triển, và thịnh vượng trong nhà mình. - - - -
- - - - - - - - - - - - - - - - - - -
\ No newline at end of file diff --git a/sites/public/page_content/AdditionalResourcesSidebar.mdx b/sites/public/page_content/AdditionalResourcesSidebar.mdx deleted file mode 100644 index e4232766f4..0000000000 --- a/sites/public/page_content/AdditionalResourcesSidebar.mdx +++ /dev/null @@ -1,49 +0,0 @@ -import RenderIf from "../components/RenderIf.tsx" - - - - #### Contact - - For listing and application questions, please contact the Property Agent displayed on the listing. - - **Alameda County's Housing & Development Department (HCD)** - - **[achousingportal@acgov.org](mailto:achousingportal@acgov.org)** - - - - - - #### Contact - - Si tiene alguna pregunta sobre los listados y la solicitud, sírvase poner en contacto con el Agente de la Propiedad que aparece indicado en el listado. - - **Departamento de Desarrollo Comunitario y de Vivienda (HCD) del Condado de Alameda** - - **[achousingportal@acgov.org](mailto:achousingportal@acgov.org)** - - - - - - #### Contact - - 若有上市名單和申請方面的疑問,請聯絡上市名單上顯示的物業經紀人。 - - **阿拉米達縣房屋及社區發展部 (HCD)** - - **[achousingportal@acgov.org](mailto:achousingportal@acgov.org)** - - - - - - #### Contact - - Đối với các thắc mắc về danh sách nhà và đơn ghi danh, vui lòng liên lạc với Nhân viên Đại diện Bất động sản có trên danh sách. - - **Sở Gia cư và Phát triển Cộng đồng (HCD) Quận Alameda** - - **[achousingportal@acgov.org](mailto:achousingportal@acgov.org)** - - \ No newline at end of file diff --git a/sites/public/page_content/locale_overrides/es.json b/sites/public/page_content/locale_overrides/es.json deleted file mode 100644 index a6d1b87605..0000000000 --- a/sites/public/page_content/locale_overrides/es.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "application": { - "contact": { - "doYouWorkIn": "¿Trabaja usted en %{county}?", - "doYouWorkInDescription": "" - }, - "household": { - "member": { - "workInRegion": "¿Trabaja él o ella en %{county}?", - "workInRegionNote": "" - } - }, - "preferences": { - "dontWant": "No quiero solicitar ninguna de estas preferencias", - "liveWork": { - "live": { - "label": "Preferencia de vivir en %{county}", - "description": "Al menos un miembro de mi hogar vive en %{county}" - }, - "work": { - "label": "Preferencia de trabajar en %{county}", - "description": "Al menos un miembro de mi hogar trabaja o le han ofrecido trabajo en %{county}" - } - }, - "displacedTenant": { - "general": { - "label": "Preferencia de vivienda para inquilinos desplazados", - "description": "Al menos un miembro de mi hogar fue desplazado de una propiedad residencial debido a la actividad de reurbanización por parte de la Autoridad de Vivienda de Hayward, la Agencia de Reurbanización o la Ciudad de Hayward." - }, - "missionCorridor": { - "label": "Preferencia de vivienda para inquilinos desplazados de Mission Boulevard Corridor (SR 238)", - "description": "Al menos un miembro de mi hogar es Participante del Programa de SR 238 de acuerdo con lo requerido por los términos del Proyecto de Implementación del Acuerdo de SR 238. Los participantes del programa son inquilinos de propiedades de Caltrans vendidas anteriormente a lo largo del corredor de SR 238 Mission Boulevard y se les dará preferencia de ocupación cuando se construyan nuevas viviendas por debajo del valor del mercado en el corredor." - } - } - } - }, - "footer": { - "copyRight": "Condado de Alameda © 2020 • Todos los derechos reservados", - "disclaimer": "Exención de responsabilidades", - "getAssistance": "Obtener asistencia", - "giveFeedback": "Proporcione sus comentarios", - "header": "El Portal de Vivienda del Condado de Alameda es un proyecto del", - "headerUrl": "https://www.acgov.org/cda/hcd/", - "headerLink": "Condado de Alameda - Departamento de Desarrollo Comunitario y de Vivienda (HCD)", - "forAdditionalOpportunities": "Para ver oportunidades adicionales en el Área de la Bahía, sírvase visitar:", - "forGeneralInquiries": "Para obtener información general sobre el programa, o acceder a servicios de traducción del contenido de este sitio web por teléfono, puede llamar al HCD del Condado de Alameda al 510-670-5404.", - "forListingQuestions": "Si tiene alguna pregunta relacionada con los listados y la solicitud, sírvase poner en contacto con el Agente de la Propiedad que aparece indicado en cada listado.", - "privacyPolicy": "Política de privacidad", - "SFHousingPortal": "Portal de Vivienda de San Francisco", - "SFHousingUrl": "https://housing.sfgov.org" - }, - "nav": { - "siteTitle": "Portal de Vivienda del Condado de Alameda", - "getFeedback": "¡Nos encantaría recibir ", - "yourFeedback": "sus comentarios!", - "bonusFeedback": "" - }, - "pageTitle": { - "additionalResources": "Oportunidades adicionales de vivienda" - }, - "pageDescription": { - "additionalResources": "Le invitamos a consultar otros recursos de vivienda de precio accesible." - }, - "region": { - "name": "Condado de Alameda" - }, - "listings": { - "depositOrMonthsRent": "", - "publicLottery": { - "header": "LOTERÍA" - } - } -} \ No newline at end of file diff --git a/sites/public/page_content/locale_overrides/general.json b/sites/public/page_content/locale_overrides/general.json index 9613d24232..ead9ff2e11 100644 --- a/sites/public/page_content/locale_overrides/general.json +++ b/sites/public/page_content/locale_overrides/general.json @@ -1,120 +1,5 @@ { - "application": { - "contact": { - "doYouWorkIn": "Do you work in %{county} County?", - "doYouWorkInDescription": "" - }, - "household": { - "member": { - "workInRegion": "Do they work in the %{county} County?", - "workInRegionNote": "" - } - }, - "referralApplication": { - "instructions": "The permanent supportive housing units are referred directly through Alameda County's Coordinated Entry System. Households experiencing homelessness can call 211 in order to get connected to an Access Point to learn more about the coordinated entry system and access housing-related resources and information.", - "furtherInformation": "For further information" - }, - "preferences": { - "liveWork": { - "title": "Live or Work in %{county} County", - "live": { - "label": "Live in %{county} County Preference", - "description": "At least one member of my household lives in the %{county} County" - }, - "work": { - "label": "Work in %{county} County Preference", - "description": "At least one member of my household works or has been offered work in the %{county} County" - } - }, - "PBV": { - "title": "Oakland Housing Authority", - "residency": { - "label": "Residency", - "description": "You have lived and/or worked in the City of Oakland when you submitted your initial application and/or at the time of your application interview for a Project-Based Voucher at Coliseum Place and can verify your previous residency/employment at the applicant interview." - }, - "family": { - "label": "Family", - "description": "You are a family with two or more persons, or a single person applicant that is 62 years of age or older, or a single person applicant with a disability." - }, - "veteran": { - "label": "Veteran", - "description": "You are a Veteran or active member of the military." - }, - "homeless": { - "label": "Homeless", - "description": "You are an individual or family who meets the McKinney-Vento Act definition of homelessness. Family is identified as: individuals who lack a fixed, regular, and adequate nighttime residence and: (i) children and youths who are sharing the housing of other persons due to loss of housing, economic hardship, or a similar reason; are living in motels, hotels, trailer parks, or camping grounds due to the lack of alternative adequate accommodations; are living in emergency or transitional shelters; or are abandoned in hospitals; (ii) children and youths who have a primary nighttime residence that is a public or private place not designed for or ordinarily used as a regular sleeping accommodation for human beings; (iii) children and youths who are living in cars, parks, public spaces, abandoned buildings, substandard housing, bus or train stations, or similar settings; and (iv) migratory children who qualify as homeless for the purposes of this subtitle because the children are living in circumstances described in clauses (i) through (iii).", - "link": "https://uscode.house.gov/view.xhtml?path=/prelim@title42/chapter119/subchapter6/partB&edition=prelim" - }, - "noneApplyButConsider": { - "label": "None of these preferences apply to me, but I would like to be considered" - }, - "doNotConsider": { - "label": "I don't want to be considered for Oakland Housing Authority project-based voucher units" - } - }, - "HOPWA": { - "title": "Housing Opportunities for Persons with AIDS", - "hopwa": { - "label": "Housing Opportunities for Persons with AIDS", - "description": "If you have questions about HOPWA eligibility or need support in submitting this application, please contact AHIP (AIDS Housing Information Project) at (510) 537-2600 or (510) 695-5222." - }, - "doNotConsider": { - "label": "I don't want to be considered" - } - }, - "displacedTenant": { - "title": "Displaced Tenant Housing Preference", - "whichHouseholdMember": "Which household member is claiming this preference?", - "whatAddress": "What address was the household member displaced from?", - "general": { - "label": "Displacee Tenant Housing Preference", - "description": "At least one member of my household was displaced from a residential property due to redevelopment activity by the Hayward Housing Authority, the Redevelopment Agency or the City of Hayward." - } - } - } - }, - "footer": { - "copyRight": "Alameda County © 2020 • All Rights Reserved", - "disclaimer": "Disclaimer", - "getAssistance": "Get Assistance", - "giveFeedback": "Give Feedback", - "header": "Alameda County Housing Portal is a project of the", - "headerUrl": "https://www.acgov.org/cda/hcd/", - "headerLink": "Alameda County - Housing and Community Development (HCD) Department", - "forAdditionalOpportunities": "For additional Bay Area opportunities, please visit:", - "forGeneralInquiries": "For general program inquiries, or to access translation services for content on this website by phone, you may call Alameda County HCD at 510-670-5404.", - "forListingQuestions": "For listing and application questions, please contact the Property Agent displayed on each listing.", - "privacyPolicy": "Privacy Policy", - "SFHousingPortal": "San Francisco Housing Portal", - "SFHousingUrl": "https://housing.sfgov.org" - }, - "nav": { - "siteTitle": "Alameda County Housing Portal", - "getFeedback": "We'd love to get ", - "yourFeedback": "your feedback!", - "bonusFeedback": "" - }, - "pageTitle": { - "additionalResources": "Additional Housing Opportunities and Resources" - }, - "pageDescription": { - "additionalResources": "We encourage you to browse other affordable housing resources." - }, - "region": { - "name": "Alameda County" - }, - "listings": { - "depositOrMonthsRent": "", - "publicLottery": { - "header": "Lottery" - } - }, - "timeout": { - "afterMessage": "We care about your security. We ended your session due to inactivity. Please start a new application to continue." - }, - "referralApplication": { - "instructions": "The permanent supportive housing units are referred directly through Alameda County Coordinated Entry System. Households experiencing homelessness can call 211 in order to get connected to an Access Point to learn more about the coordinated entry system and access housing-related resources and information.", - "furtherInformation": "For further information", - "phoneNumber": "211" + "welcome": { + "seeRentalListings": "Browse Rentals" } } diff --git a/sites/public/page_content/locale_overrides/vi.json b/sites/public/page_content/locale_overrides/vi.json deleted file mode 100644 index 27aacc6fb0..0000000000 --- a/sites/public/page_content/locale_overrides/vi.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "application": { - "contact": { - "doYouWorkIn": "Quý vị có làm việc tại %{county} không?", - "doYouWorkInDescription": "" - }, - "household": { - "member": { - "workInRegion": "Họ có làm việc tại %{county} không?", - "workInRegionNote": "" - } - }, - "preferences": { - "dontWant": "Tôi không muốn chọn bất kỳ ưu tiên nào trong số này", - "liveWork": { - "live": { - "label": "Sống tại %{county} Ưu tiên", - "description": "Ít nhất một thành viên trong hộ gia đình tôi sống tại Thành phố %{county}" - }, - "work": { - "label": "Làm việc tại %{county} Ưu tiên", - "description": "Ít nhất một thành viên trong hộ gia đình tôi đã làm việc hoặc được đề nghị làm việc tại Thành phố %{county}" - } - }, - "displacedTenant": { - "general": { - "label": "Lựa chọn Ưu tiên Nhà ở dành cho Người Thuê Nhà phải Chuyển chỗ", - "description": "Ít nhất một thành viên trong hộ gia đình tôi phải chuyển chỗ ở khỏi một bất động sản gia cư do hoạt động xây dựng lại bởi Cơ quan Quản lý Nhà Ở Hayward (Hayward Housing Authority), Cơ quan Tái Phát triển hay Thành phố Hayward." - }, - "missionCorridor": { - "label": "Mission Boulevard Corridor (SR 238) Lựa chọn Ưu tiên Nhà ở dành cho Người Thuê Nhà phải Chuyển chỗ", - "description": "Ít nhất một thành viên trong gia đình tôi là Người Tham gia Chương trình SR 238 theo yêu cầu của các điều khoản của Dự án Triển khai Tái Định cư SR 238. Những Người Tham gia Chương trình là người thuê nhà của các bất động sản Caltrans trước đây đã bán dọc theo Hành lang SR 238 Mission Boulevard và đang được ưu tiên cho cư ngụ khi có nhà ở mới thấp hơn giá thị trường được xây dựng trong Hành lang." - } - } - } - }, - "footer": { - "copyRight": "Alameda County © 2020 • Giữ Mọi Bản quyền", - "disclaimer": "Tuyên bố miễn trách nhiệm", - "getAssistance": "Nhận Hỗ trợ", - "giveFeedback": "Đưa ra Phản hồi", - "header": "Cổng thông tin về Gia cư của Quận Alameda là một dự án của", - "headerUrl": "https://www.acgov.org/cda/hcd/", - "headerLink": "Quận Alameda - Sở Gia cư và Phát triển Cộng đồng (HCD)", - "forAdditionalOpportunities": "Để có thêm các cơ hội tại Bay Area, vui lòng truy cập:", - "forGeneralInquiries": "Đối với các thắc mắc chung về chương trình, hoặc để tiếp cận các dịch vụ thông dịch cho nội dung trên trang web này qua điện thoại, quý vị có thể gọi cho HCD của Quận Alameda theo số 510-670-5404.", - "forListingQuestions": "Đối với các thắc mắc về danh sách nhà và đơn ghi danh, vui lòng liên hệ với Nhân viên Đại diện Bất động sản có trên mỗi danh sách nhà.", - "privacyPolicy": "Chính sách Quyền Riêng tư", - "SFHousingPortal": "Cổng thông tin về Gia cư của San Francisco", - "SFHousingUrl": "https://housing.sfgov.org" - }, - "nav": { - "siteTitle": "Cổng thông tin về Gia cư của Quận Alameda", - "getFeedback": "Chúng tôi rất mong nhận được ", - "yourFeedback": "ý kiến phản hồi của quý vị", - "bonusFeedback": "" - }, - "pageTitle": { - "additionalResources": "Các Cơ hội Nhà ở Bổ sung" - }, - "pageDescription": { - "additionalResources": "Chúng tôi khuyến khích quý vị xem các nguồn thông tin trợ giúp về nhà ở giá phải chăng khác." - }, - "region": { - "name": "Quận Alameda" - }, - "listings": { - "depositOrMonthsRent": "", - "publicLottery": { - "header": "XỔ SỐ" - } - } -} \ No newline at end of file diff --git a/sites/public/page_content/locale_overrides/zh.json b/sites/public/page_content/locale_overrides/zh.json deleted file mode 100644 index 2ee2dd905e..0000000000 --- a/sites/public/page_content/locale_overrides/zh.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "application": { - "contact": { - "doYouWorkIn": "您是否在 %{county} 工作?", - "doYouWorkInDescription": "" - }, - "household": { - "member": { - "workInRegion": "他們是否在 %{county} 工作?", - "workInRegionNote": "" - } - }, - "preferences": { - "dontWant": "我不想使用這些優先權", - "liveWork": { - "live": { - "label": "住在 %{county} 的優先權", - "description": "我家至少有一人住在 %{county}" - }, - "work": { - "label": "在 %{county} 工作優先權", - "description": "我家至少有一人在 %{county}工作或獲得工作機會" - } - }, - "displacedTenant": { - "general": { - "label": "無居所租客房屋優先權", - "description": "由於 %{county} 房屋管理局、重建管理局或 %{county} 市政府進行重建活動,我家至少有一人被迫搬出住宅物業。" - }, - "missionCorridor": { - "label": "Mission Boulevard Corridor (SR 238) 無居所租客房屋優先權", - "description": "根據 SR 238 和解實施項目條款規定,我家至少有一人是 SR 238 計劃參與者。計劃參與者是 SR 238 Mission Boulevard 走廊沿線先前已出售的 Caltrans 物業租戶;此走廊興建低於市價的全新住房時,計劃參與者有入住優先權。" - } - } - } - }, - "footer": { - "copyRight": "阿拉米達縣 © 2020 • 版權所有", - "disclaimer": "免責聲明", - "getAssistance": "尋求協助", - "giveFeedback": "提供回饋意見", - "header": "阿拉米達縣房屋網站", - "headerUrl": "https://www.acgov.org/cda/hcd/", - "headerLink": "是阿拉米達縣房屋及社區發展部 (HCD) 推出的項目", - "forAdditionalOpportunities": "查詢灣區其他住房機會,請瀏覽:", - "forGeneralInquiries": "一般計劃查詢,或者想透過電話使用翻譯服務以了解本網站的內容,您可以致電 510-670-5404 聯絡阿拉米達縣房屋及社區發展部 (HCD)。", - "forListingQuestions": "若有上市名單和申請方面的疑問,請聯絡每個上市名單上顯示的物業經紀人。", - "privacyPolicy": "隱私權政策", - "SFHousingPortal": "三藩市房屋網站", - "SFHousingUrl": "https://housing.sfgov.org" - }, - "nav": { - "siteTitle": "阿拉米達縣房屋網站", - "getFeedback": "我們希望獲得 ", - "yourFeedback": "您的回饋意見", - "bonusFeedback": "!為感謝您花時間提供回饋意見,您可獲得一張禮品卡。" - }, - "pageTitle": { - "additionalResources": "其他住房機會" - }, - "pageDescription": { - "additionalResources": "我們建議您瀏覽其他可負擔房屋資源。" - }, - "region": { - "name": "阿拉米達縣" - }, - "listings": { - "depositOrMonthsRent": "", - "publicLottery": { - "header": "抽籤" - } - } -} \ No newline at end of file diff --git a/sites/public/page_content/privacy_policy.mdx b/sites/public/page_content/privacy_policy.mdx index 9386e48755..8e48ac1ef0 100644 --- a/sites/public/page_content/privacy_policy.mdx +++ b/sites/public/page_content/privacy_policy.mdx @@ -1,175 +1,23 @@ -Alameda County Housing Portal is a platform to connect renters and property managers to subsidized affordable housing opportunities. At Alameda County Housing Portal your privacy is important to us, so we strive to be transparent about how we collect, use and share information about you. This policy is intended to help you understand: +Thank you for visiting the County of San Mateo website and reviewing our privacy policy. The information contained on this website is collected and maintained for the benefit of the public. While the County of San Mateo makes best efforts to maintain accurate information the County of San Mateo does not endorse the authenticity of information that originates from third parties. +--- +### Your Personal Information -1. [WHAT INFORMATION WE COLLECT](#information-collect) -2. [HOW WE USE INFORMATION](#information-use) -3. [HOW WE SHARE INFORMATION](#share-information) -4. [HOW WE STORE INFORMATION](#store-information) -5. [HOW TO ACCESS AND CONTROL YOUR INFORMATION](#access-information) -6. [ADDITIONAL IMPORTANT PRIVACY MATTERS](#additional) -7. [HOW TO CONTACT US](#contact) +The County of San Mateo will not collect personal information about you when you visit our website unless you choose to provide that information to us. We do not give, share, sell, or transfer any personal information. -
+Some of our online services require you to register for an account. We ask you for some personal information in order to create an account (typically your name, email address and a password for your account) and we will use that information to provide the service. -Please take a moment to read this privacy policy carefully so that you can understand your rights and our responsibilities regarding your information. This policy also explains your choices about how we use information about you. By using the Service, you consent to the collection and use of information in accordance with this Privacy Policy. +Information that you voluntarily provide to us through our optional online feedback form is used to help enhance our website. It may be used internally by the County of San Mateo employees and contractors for that purpose alone. When you visit a County of San Mateo website, you should be aware that data linking your computer to a particular website (a "cookie") may be created. Temporary cookies may be used when necessary to complete a transaction, to process data submitted to us online, to facilitate an ongoing Internet interaction, or to understand trends in the use of County of San Mateo websites. Cookies do not compromise your privacy or security. Using web browser settings, you can refuse the cookies or delete the cookie file from your computer by using any of the widely available methods. -This Privacy Policy (this “Privacy Policy”) governs your use of the Alameda County Housing Portal website (the “Services” or “Site”) which is owned and operated by the County of Alameda (the “Jurisdiction”). The Jurisdiction is sometimes referred to herein as “we,” “us,” or “our” and the applicant, developer, property manager, City, or other user (collectively the “User”) (as defined below) is sometimes referred to as “you,” “your,” or “customer. Unless otherwise defined in this Privacy Policy, terms used in this Privacy Policy have the same meanings as in our Terms of Service. +### Traffic Analysis and Security -

1. WHAT INFORMATION WE COLLECT

+We do analyze user traffic patterns on our website automatically through your browser. This information includes the IP address of your computer or network, current date, current time, your browser, and operating system, the page(s) you visited on our website, and the referring page (page that you came from). We use the aggregated information from all of our visitors to measure and improve site performance, analyze user traffic, and to improve the content of our site. At times, we may track the keywords entered into our search engines from all users to find out which topics are popular although we don't keep track of specific words that any one user enters. -##### Definitions +We only use this information to measure server performance, to improve the content on our website, and to guarantee a high level of security for all users. Unauthorized attempts to upload or modify information in any way are forbidden. Users who are visiting the County of San Mateo website are also expressly consenting to this monitoring of network traffic. -We require certain information to provide our Services to you. For example, you may be required to have an account in order to interact with certain aspects of the Services. When you choose to share the information below with us, we collect and use it to operate our Services. "Personal Data" means data that allows someone to identify or contact you, including, for example, your name, address, telephone number, e-mail address, travel preferences, specific expenses, as well as any other non-public information about you that is associated with or linked to any of the foregoing data. "Anonymous Data" means data that is not associated with or linked to your Personal Data; Anonymous Data does not permit the identification of individual persons. As used in this document, the general term “information” includes all data provided by you or collected via the Services, including both Personal Data and Anonymous Data. We collect Personal Data and Anonymous Data, as described below. +Information that you voluntarily provide to us through our optional online feedback form is used to help enhance our website. It may be used internally by the County of San Mateo employees and contractors for that purpose alone. When you visit a County of San Mateo website, you should be aware that data linking your computer to a particular website (a "cookie") may be created. Temporary cookies may be used when necessary to complete a transaction, to process data submitted to us online, to facilitate an ongoing Internet interaction, or to understand trends in the use of County of San Mateo websites. Cookies do not compromise your privacy or security. Using web browser settings, you can refuse the cookies or delete the cookie file from your computer by using any of the widely available methods. -##### Information You Provide. +--- -When you use the Services, you will provide information that could be Personal Data, such (a) your name, email address, mobile telephone number, password for the Site, date of birth, tax identification number, schedule, picture, and other registration information; (b) information you provide us when you contact us for help; (c) any information required to ensure a User is eligible to participate in a specific program or aspect of Services; and (d) any other information you enter into the Services. - -##### Information We Collect Automatically - -We automatically receive and record information from your use of the Services, including but not limited to: Site usage, your IP address, browser type, Internet service provider, referring/exit pages, operating system, date/time stamp, clickstream data, and cookie information. Generally, the Services automatically collect usage information, such as the number and frequency of users of the Services. - -##### Cookies. - -Cookies are small pieces of information that a website sends to your computer while you are viewing the website. We may use both session cookies (which expire once you close your browser) and persistent cookies (which stay on your computer/mobile phone until you delete them) to provide the Services, and to provide you with a more personal and interactive experience on our Site. We use cookies to enable our servers to recognize your web browser and tell us how and when you use the Services. Most browsers have an option for turning off the cookie feature, which will prevent your browser from accepting new cookies, as well as (depending on the sophistication of your browser software) allowing you to decide on acceptance of each new cookie in a variety of ways. You will not be able to take advantage of the most attractive features of the Services if you disable your cookies. - -##### Pixel Tags. - -Pixel Tags (also referred to as clear Gifs, Web beacons, or Web bugs). Pixel Tags are tiny graphic images with a unique identifier, similar in function to Cookies, that are used to track online movements of Web users. In contrast to Cookies, which are stored on a user’s computer hard drive, Pixel Tags are embedded invisibly in Web pages. Pixel Tags also allow us to send e-mail messages in a format users can read, and they tell us whether e-mails have been opened to ensure that we are sending only messages that are of interest to our users. The use of a pixel allows us to record, for example, that a user has interacted with a message, visited a particular web page or clicked on a particular advertisement. We do not provide Personal Data to any advertising networks for use outside of the Services. - -##### Analytics. - -We use third party analytics services, including but not limited to Google Analytics ("Analytics Services"), to help analyze how users use our Site and Services. We use the information we get from Analytics Services only to improve our Site and Services. The information generated by the Cookies or other technologies about your use of our Site and Services (the "Analytics Information") is transmitted to the Analytics Services. The Analytics Services use Analytics Information to compile reports on user activity. The Analytics Services may also transfer the Analytics Information to third parties where required to do so by law, or where such third parties process Analytics Information on their behalf. Each Analytics Service’s ability to use and share Analytics Information is restricted by such Analytics Service’s Terms of Use and Privacy Policy. By using our Site and Services, you consent to the processing of data about you by Analytics Services in the manner and for the purposes set out above. For a full list of Analytics Services, please contact us at ACHousingPortal@acgov.org. - -##### Third Party Data. - -We may receive and/or share Personal and/or Anonymous Data about you to companies that help us provide our Services by way of a co-branded or private-labeled website or companies that offer their products and/or services on our Services (e.g., housing developers and property managers). These third party companies may receive Personal Data and Anonymous Data. They will only use such data in compliance with our security and privacy standards set forth in this Privacy Policy. - -

2. HOW WE USE THE INFORMATION

- -We strive to ensure that we protect your privacy rights as we process your information. We take your privacy rights seriously. Below are the specific purposes for which we use the information we collect about you. - -##### To provide the Services and personalize your experience. - -We use information about you to provide the Services to you, including to process applications for services and related transactions with you, authenticate you when you log in, provide customer support, and operate and maintain the Services. - -##### For research and development. - -We are always looking for ways to make our Services smarter, faster, more secure, integrated and useful to you. In addition, we intend to use the Aggregate Information (as described below) to positively influence housing policy. To that end, we use collective learnings about how people use our Services and feedback provided directly to us to troubleshoot and to identify trends, usage, activity patterns and areas for integration and improvement of the Services. - -##### To communicate with you about the Services. - -We use your contact information to send transactional communications via email or chat and within the Services, including questions and requests, providing customer support, and sending you technical notices, product updates, security alerts, administrative and other messages. - -##### To market, promote, and drive engagement with the Services. - -We use your contact information and information about how you use the Services to send promotional communications that may be of specific interest to you, including by email. These communications are aimed at driving engagement and maximizing what you get out of the Services, including information about new features, survey requests, events and other information we think may be of interest to you. We also communicate with you about new product offers and new services. - -##### Conducting surveys and collecting feedback about our Services. - -We do this to pursue our legitimate interests to understand if the Services are helpful to you and to evaluate the effectiveness of any updates we provide. - -##### Customer support. - -We use your information to resolve technical issues you encounter, to respond to your requests for assistance, to analyze crash information, and to repair and improve the Services. We also use your information to provide requested assistance (either originated from you, or a person acting legitimately on your behalf) and to offer proactive support when necessary. - -##### For safety and security. - -We use information about you and your Service use to verify accounts and activity, to monitor suspicious or fraudulent activity and to identify violations of Service policies. - -##### To protect the public interests and legal rights. - -Where required by law, where we believe it is in the public interest, or where it is necessary to protect our legal rights, interests and the interests of others, we use information about you in connection with legal claims, compliance, regulatory, and audit functions. - -##### With your consent. - -We use information about you where you have given us consent to do so for a specific purpose not listed above. For example, we may publish testimonials or featured customer stories to promote the Services, with your permission. - -##### Additional purposes. - -We may process your information for any other purpose disclosed to you in connection with our Services from time to time. If we intend to process your personal data for a purpose other than that set out above, we will provide you with information prior to such processing and will obtain your consent where necessary. - -##### Determining eligibility. - -We use your information to determine your eligibility for the Service. - -##### Providing access to services. - -We use your information to provide you with access to the services you have applied to such as access to housing. - -

3. HOW WE SHARE INFORMATION

- -We may share your information with our third-party service providers, including property managers and developers and staff from Alameda County cities and our Agents, to comply with legal obligations, to protect and defend our rights and property, ensure the functionality of the Site, or with your permission. Below are the specific ways we share information we collect about you. - -##### User Profile Information. - -User profile information including your name, email, phone number and other information you enter may be displayed to other users to facilitate user interaction within the Services (for example, to enable property managers to contact you about housing opportunities). - -##### Information Shared with Our Agents. - -We employ and contract with people and other entities that perform certain tasks on our behalf and who are under our control (our “Agents”), including companies to build and maintain the Site. We may need to share Personal Data with our Agents in order to provide products or services to you. Unless we tell you differently, our Agents do not have any right to use Personal Data or other information we share with them beyond what is necessary to assist us. You hereby consent to our sharing of Personal Data with our Agents. - -##### IP Address Information. - -While we collect and store IP address information, that information is not made public. We do at times, however, share this information with our partners, service providers and other persons with whom we conduct business, and as otherwise specified in this Privacy Policy. - -##### Aggregate Information. - -We share Aggregate Information with our agents, partners, and service providers. We share this type of statistical data so that our partners can understand how and how often people use our Services and their services or websites, which facilitates improving both their services and how our Services interface with them. In addition, these third parties may share with us non-private, aggregated or otherwise non-Personal Data about you that they have independently developed or acquired. - -##### Information Disclosed for Our Protection, the Protection of Others and Legal Requirements. - -We also reserve the right to access, read, preserve, and disclose any information as it reasonably believes is necessary to (i) satisfy any applicable law, regulation, legal process or governmental request, (ii) enforce our Terms of Service, including investigation of potential violations hereof, (iii) detect, prevent, or otherwise address fraud, security or technical issues, (iv) respond to user support requests, or (v) protect our rights, property or safety, our users and the public. This includes exchanging information with other companies and organizations for fraud protection and spam/malware prevention. - -##### Information We Share with Your Consent: - -We will share your Personal Data with any relevant party you have granted us permission to share with. - -

4. HOW WE STORE AND SECURE INFORMATION

- -Keeping your information secure is a top priority for us. To that end we comply with industry-standard best practices to secure your information. We use data hosting service providers in the United States to host the information we collect, and we use technical measures to secure your data. While we implement safeguards designed to protect your information, no security system is impenetrable and due to the inherent nature of the internet, we cannot guarantee that data, during transmission through the internet or while stored on our systems or otherwise in our care, is absolutely safe from intrusion by others. How long we keep information we collect about you depends on the type of information, as described in further detail below. After such time, we will either delete or anonymize your information or, if this is not possible (for example, because the information has been stored in backup archives), then we will securely store your information and isolate it from any further use until deletion is possible. - -##### Account Information. - -We retain your Personal Data only as long as necessary to accomplish the purpose for which it was collected or to comply with our legal and contractual obligations, plus 1 year, and then securely dispose of that information. We also retain some of your information as necessary to comply with our legal obligations, to resolve disputes, to enforce our agreements, to support operations and to continue to develop and improve our Services. Where we retain information for Service improvement and development, we take steps to eliminate information that directly identifies you, and we only use the information to uncover collective insights about the use of our Services, not to specifically analyze personal characteristics about you. - -##### Information You Share on the Services - -If your account is deactivated or disabled, some of your Personal Data and Anonymous Data and the content you have provided will remain. - -##### Marketing information - -If you have elected to receive marketing emails from us, we retain information about your marketing preferences unless you specifically ask us to delete such information. We retain information derived from cookies and other tracking technologies for a reasonable period of time from the date such information was created. - -##### Property Managers and Developers. - -If you are a property manager or developer using the Services and gain access to another user’s Personal Data, you agree to store and secure that Personal Data in compliance with the standards set forth in this Privacy Policy. - -

5. HOW TO ACCESS AND CONTROL YOUR INFORMATION

- -You can stop all further collection of information by discontinuing use of the Service. - -

6. ADDITIONAL IMPORTANT PRIVACY MATTERS

- -##### Minimum Age. - -The Services are not directed to individuals under 18. We do not knowingly collect Personal Data from children under 18. If we become aware that a child under 18 has provided us with Personal Data, we will take steps to delete such information. If you become aware that a child has provided us with Personal Data, please contact our support services. - -##### Security: - -We are concerned about safeguarding the confidentiality of your Personal Data. We provide physical, electronic, and procedural safeguards to protect information we process and maintain and use a combination of firewall barriers, encryption techniques and authentication procedures. For example, we limit access to your Personal Data to authorized employees and contractors who need to know that information in order to operate, develop or improve our Services. Please be aware that, although we endeavor to provide reasonable security for information we process and maintain, no security system can prevent all potential security breaches. - -##### Links to Other Sites. - -Our Service may contain links to other sites that are not operated by us. If you click on a third-party link, you will be directed to that third party's site. We strongly advise you to review the privacy policy of every site you visit. We have no control over, and assume no responsibility for the content, privacy policies or practices of any third-party sites or services. - -##### Changes to this Privacy Policy. - -We will notify you when we change this Privacy Policy. We may change this Privacy Policy from time to time. If we make significant changes in the way we treat your Personal Data, or to the Privacy Policy, we will provide notice to you on the Services or by some other means, such as email. Please review the changes carefully. If you agree to the changes, simply continue to use our Services. Your continued use of our Services after the revised Privacy Policy has become effective indicates that you have read, understood, and agreed to the current version of this Policy. If you object to any of the changes to our terms and you no longer wish to use our Services, you may close your account(s). Unless stated otherwise, our current Privacy Policy applies to all information that we have about you and your account. Using our Services after a notice of changes has been communicated to you or published on our Services shall constitute consent to the changed terms or practices. - -

7. CONTACT US

- -##### Contacting us: - -If you have any questions, please don’t hesitate to contact us at: ACHousingPortal@acgov.org. +_Updated July 28, 2014_ diff --git a/sites/public/pages/additional-resources.tsx b/sites/public/pages/additional-resources.tsx deleted file mode 100644 index 3c1cdccdf2..0000000000 --- a/sites/public/pages/additional-resources.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import Head from "next/head" -import Layout from "../layouts/application" -import { t, PageHeader, MarkdownSection } from "@bloom-housing/ui-components" -import PageContent from "../page_content/AdditionalResources.mdx" -import SidebarContent from "../page_content/AdditionalResourcesSidebar.mdx" -import { MDXProvider } from "@mdx-js/react" - -const AdditionalResources = () => { - const pageTitle = t("pageTitle.additionalResources") - const subTitle = t("pageDescription.additionalResources") - - const components = { - h4: (props) =>

, - wrapper: (props) => <>{props.children}, - } - - return ( - - - - {pageTitle} - {t("nav.siteTitle")} - - - - {pageTitle}} subtitle={subTitle} inverse={true}> - -
-
-
- - - -
- -
-
-
- ) -} - -export default AdditionalResources diff --git a/sites/public/pages/applications/financial/income.tsx b/sites/public/pages/applications/financial/income.tsx index fe28630d17..67746501be 100644 --- a/sites/public/pages/applications/financial/income.tsx +++ b/sites/public/pages/applications/financial/income.tsx @@ -3,6 +3,7 @@ Total pre-tax household income from all sources */ import React, { useState } from "react" +import { Listing } from "@bloom-housing/backend-core/types" import { AppearanceStyleType, AlertBox, @@ -21,33 +22,32 @@ import FormBackLink from "../../../src/forms/applications/FormBackLink" import { useFormConductor } from "../../../lib/hooks" type IncomeError = "low" | "high" | null -// type IncomePeriod = "perMonth" | "perYear" - -// TODO: toggle this verification off at the jurisdiction level with a feature flag -// function verifyIncome(listing: Listing, income: number, period: IncomePeriod): IncomeError { -// // Look through all the units on this listing to see what the absolute max/min income requirements are. -// const [annualMin, annualMax, monthlyMin] = listing.property.units.reduce( -// ([aMin, aMax, mMin], unit) => [ -// Math.min(aMin, parseFloat(unit.annualIncomeMin)), -// Math.max(aMax, parseFloat(unit.annualIncomeMax)), -// Math.min(mMin, parseFloat(unit.monthlyIncomeMin)), -// ], -// [Infinity, 0, Infinity] -// ) - -// // For now, transform the annual max into a monthly max (DB records for Units don't have this value) -// const monthlyMax = annualMax / 12.0 - -// const compareMin = period === "perMonth" ? monthlyMin : annualMin -// const compareMax = period === "perMonth" ? monthlyMax : annualMax - -// if (income < compareMin) { -// return "low" -// } else if (income > compareMax) { -// return "high" -// } -// return null -// } +type IncomePeriod = "perMonth" | "perYear" + +function verifyIncome(listing: Listing, income: number, period: IncomePeriod): IncomeError { + // Look through all the units on this listing to see what the absolute max/min income requirements are. + const [annualMin, annualMax, monthlyMin] = listing.property.units.reduce( + ([aMin, aMax, mMin], unit) => [ + Math.min(aMin, parseFloat(unit.annualIncomeMin)), + Math.max(aMax, parseFloat(unit.annualIncomeMax)), + Math.min(mMin, parseFloat(unit.monthlyIncomeMin)), + ], + [Infinity, 0, Infinity] + ) + + // For now, transform the annual max into a monthly max (DB records for Units don't have this value) + const monthlyMax = annualMax / 12.0 + + const compareMin = period === "perMonth" ? monthlyMin : annualMin + const compareMax = period === "perMonth" ? monthlyMax : annualMax + + if (income < compareMin) { + return "low" + } else if (income > compareMax) { + return "high" + } + return null +} const ApplicationIncome = () => { const { conductor, application, listing } = useFormConductor("income") @@ -66,15 +66,10 @@ const ApplicationIncome = () => { const onSubmit = (data) => { const { income, incomePeriod } = data - - // TODO: toggle this verification off at the jurisdiction level with a feature flag // Skip validation of total income if the applicant has income vouchers. - // const validationError = application.incomeVouchers - // ? null - // : verifyIncome(listing, income, incomePeriod) - - const validationError = null - + const validationError = application.incomeVouchers + ? null + : verifyIncome(listing, income, incomePeriod) setIncomeError(validationError) if (!validationError) { diff --git a/sites/public/pages/applications/household/add-members.tsx b/sites/public/pages/applications/household/add-members.tsx index a97aa60d6b..2131ff9ab4 100644 --- a/sites/public/pages/applications/household/add-members.tsx +++ b/sites/public/pages/applications/household/add-members.tsx @@ -24,8 +24,6 @@ const ApplicationAddMembers = () => { const router = useRouter() const currentPageSection = 2 const householdSize = application.householdMembers.length + 1 - // TODO: toggle this verification off at the jurisdiction level with a feature flag - const shouldValidateHouseholdSize = false /* Form Handler */ // eslint-disable-next-line @typescript-eslint/unbound-method @@ -80,17 +78,15 @@ const ApplicationAddMembers = () => {
- {shouldValidateHouseholdSize && ( - - )} +
{ const { conductor, application, listing } = useFormConductor("liveAlone") - // TODO: toggle this verification off at the jurisdiction level with a feature flag - // const [validateHousehold, setValidateHousehold] = useState(true) - const validateHousehold = false + const [validateHousehold, setValidateHousehold] = useState(true) const currentPageSection = 2 /* Form Handler */ @@ -76,7 +74,7 @@ const ApplicationLiveAlone = () => { onClick={() => { application.householdSize = 1 application.householdMembers = [] - // setValidateHousehold(true) + setValidateHousehold(true) }} > {t("application.household.liveAlone.willLiveAlone")} @@ -89,7 +87,7 @@ const ApplicationLiveAlone = () => { className="w-full md:w-3/4" onClick={() => { if (application.householdSize === 1) application.householdSize = 0 - // setValidateHousehold(false) + setValidateHousehold(false) }} > {t("application.household.liveAlone.liveWithOtherPeople")} diff --git a/sites/public/pages/applications/start/choose-language.tsx b/sites/public/pages/applications/start/choose-language.tsx index 45debee4af..85ec9253ba 100644 --- a/sites/public/pages/applications/start/choose-language.tsx +++ b/sites/public/pages/applications/start/choose-language.tsx @@ -20,9 +20,9 @@ import { AppSubmissionContext, retrieveApplicationConfig } from "../../../lib/Ap import React, { useContext, useEffect, useState } from "react" import { Language } from "@bloom-housing/backend-core/types" -const loadListing = async (listingId: string, stateFunction, conductor, context) => { - const response = await axios.get(process.env.backendApiBase + "/listings/" + listingId) - conductor.listing = response.data +const loadListing = async (listingId, stateFunction, conductor, context) => { + const response = await axios.get(process.env.listingServiceUrl) + conductor.listing = response.data.find((listing) => listing.id == listingId) || response.data[0] // FIXME: temporary fallback const applicationConfig = retrieveApplicationConfig() // TODO: load from backend conductor.config = applicationConfig stateFunction(conductor.listing) @@ -36,7 +36,7 @@ const ApplicationChooseLanguage = () => { const { initialStateLoaded, profile } = useContext(AuthContext) const { conductor, application } = context - const listingId = router.query.listingId as string + const listingId = router.query.listingId useEffect(() => { if (router.isReady && !listingId) { diff --git a/sites/public/pages/housing-counselors.tsx b/sites/public/pages/housing-counselors.tsx index cedd69e881..cc76cd416f 100644 --- a/sites/public/pages/housing-counselors.tsx +++ b/sites/public/pages/housing-counselors.tsx @@ -35,19 +35,18 @@ export default class extends Component { subtitle={t("housingCounselors.subtitle")} />
- {this.props.counselors && - this.props.counselors.map((c) => { - return ( -
- -
- ) - })} - {this.props.counselors != undefined && this.props.counselors.length === 0 && ( + {this.props.counselors.map((c) => { + return ( +
+ +
+ ) + })} + {this.props.counselors.length == 0 && (

{t("t.noneFound")}

diff --git a/sites/public/pages/index.tsx b/sites/public/pages/index.tsx index 99e36ba20f..1b58b83143 100644 --- a/sites/public/pages/index.tsx +++ b/sites/public/pages/index.tsx @@ -59,7 +59,6 @@ export default function Home(props: IndexProps) { buttonTitle={t("welcome.seeRentalListings")} buttonLink="/listings" listings={props.listings} - centered />
diff --git a/sites/public/public/images/alameda-logo-white.svg b/sites/public/public/images/alameda-logo-white.svg deleted file mode 100644 index 46992122b7..0000000000 --- a/sites/public/public/images/alameda-logo-white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/sites/public/public/images/atlas.jpg b/sites/public/public/images/atlas.jpg deleted file mode 100644 index 096fed14a181bc2d432f196143b5ffeb41ae066d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116631 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

4U1zQK5Ninq ztvvRWmpU*Z5m;XjI|laG0NrE3%Mte2vjrSm;M5+DKYu|(6BPsn_r)*1o3!`*jvoQ~ zd_{Vbk2P-F*GxrQ1qg-BwRXr`$aBsp>bq~TyACf@WxSxjfI~CODEkZ(ZTjD1y{8!F zjVGP>p1d`2`(_5lnAn}xDhn2`@BdT3N6go<>EXE!7O;FBOs;-A*Xyt95}*)$&3r=@ z=r?nKkJL}Syczl+v32+KF7_t(puHBYsU*Xl12bUzq9> z6b;;Cy=46L`(VK^m@02|DK`XXlNt-UEbU zX)VP=-7{-0P9bvZkBYMg!8lO$-P_J2GCPE#^09+O@jo(vhOHEZ$E{?3L|_6X5nw0( z1~7Zgm##)tPk4>Kue0@%-a`;yZ3%1YF}h~nt#JVgxaT!K+dBv2luEkfiZe*?i}dl| z$5#WpajK)Fs`LBb`YX}_cim&~qiEmD(VF}-xmyOOs46}Yyy_|*DW zo834JtoG(FNDe|?_#xjqFWXH|@h>QL+p)@}skOweA>_WZ*sRydsrOI5cBXKt3%6T+ z{3|7v3J!FtsOj`3N~y@St4slxB?%8-Mi@<2SF5#^zijszPU=c{k>M@TiW;yWj?@S# z1`)3OUO$q%u=auI4!m#G=7?+}nt*Mwy*s3{v@oH`d$S_9O+}Fj?kZ0ia+Hy52JDz^ zaxH=XLZhzA)8}X+M!f*mB-!45z+l@_HkADwU@68M$C^E)WqE6-n|RoA{l@`W`i2$g zdr+}$==Pk1l5PeZ1tIe7oWnJ5rtf6;wyphO+2;8BE}g0??9ZCWUr_3kD@g#ZW!vAT zs;SS#US1SRu>1OD9?u^*__Gw1v(G9@Fsgm}3rc2WF`hC?c?Z!@ww1ap(+)N$DjzGf zg(;c(+DRw>#LIO03%bT+pQ;~x|J_GsnEIeo(-m`?fav&GD#~SMIV9yTh_p@T3LbMC z$rSb6V@->TivAnj-b?@2V4UN@{1F{ohC~FEY-0XKc5Y@@=y&BkGDHub-AadjQ^(y_ zC<`zPo2ol~8A%Rv{hZDApRo&Ia1Z7tv%{6sAeuQ%L0c|HM*{`HvSi2T^0QX4-nZ1* zc?`s~s)wi4#^+k&`lt`#N`uSDGS$6v=?u@h$b2tv^olyJo?(xOW(}=JQ0v@VbDlM&v z4y=u+o)0T95?ufcq3kRt7Pf8}1_=+WrlFjg2eYp0Rp|1%;3SRm&-#i9we_0<%%|<+ z#e&dT1K;^t02#-8SQ!C!K$O4MiJh4eJ+X|a*>e+yursrzHF@ctE6eK{Q+0XvTKhg1 zR{H=0iH#G#5YoD!ppliF*QRzm!i*i4RQQfULE$7>!$F}TVe)P(Mhp*Z*NvLteVSdT z4$GYk!vF!7vXN%FMD$YVxd;xXEq&fCGeikj;5cR1DtL8VXMg$aS@DIDrL7UvV4bL- z)o_=#0JdEzzpz!Izhc?w^NXFHxj0N!HtX;|eiV1Mg~E?6IQDHxn zxmP$u=#6M@R!UaJw2JSzR~W>OY#pgTx|grE#ry@mUR#>J@9I@imrH+N8~}k|Ym6Ch^zzuRAQvI*_+;5K1ys`Ca8& zjw)~%0i0RDL2ey03Q%uU<|HE~iJf>bIW&=E&>E9LiD^t2r$2=}|p{eLiDyR9xp1J~=e*IJINfsB4ltl4RaEVGlVp z9(-A(2d~dQhr#ehob#DU;tOp(;idi&l`UkR{OCF#TDMb>zYZ~$Tq0?4&{1^ zfr>A{e5>_ei`oi>!7d*5vwKmYCI(A8k&1k2g&Yz3@bj!xq{PN℘O^~Oq3a7O#SBV|LnUpY#yPipip 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

ejEQIk_6_Ltf3og8#ma7EW5 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 KajNUwYya6%!>g?bA|2_{LZ||vBdAm<(py6B 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