Skip to content

Commit 6c65c13

Browse files
committed
Merge branch 'main' into 5564/waitlist-lottery-lottery-results-screen
2 parents 8a187f8 + 51d6c9c commit 6c65c13

32 files changed

Lines changed: 455 additions & 21 deletions

File tree

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- AlterTable
2+
ALTER TABLE "listings" ADD COLUMN "listing_file_number" TEXT;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
-- AlterEnum
2+
ALTER TYPE "neighborhood_amenities_enum" ADD VALUE 'shoppingVenues';
3+
ALTER TYPE "neighborhood_amenities_enum" ADD VALUE 'hospitals';
4+
ALTER TYPE "neighborhood_amenities_enum" ADD VALUE 'seniorCenters';
5+
ALTER TYPE "neighborhood_amenities_enum" ADD VALUE 'recreationalFacilities';
6+
ALTER TYPE "neighborhood_amenities_enum" ADD VALUE 'playgrounds';
7+
ALTER TYPE "neighborhood_amenities_enum" ADD VALUE 'busStops';
8+
9+
-- AlterTable
10+
ALTER TABLE "listing_neighborhood_amenities" ADD COLUMN "bus_stops" TEXT,
11+
ADD COLUMN "hospitals" TEXT,
12+
ADD COLUMN "playgrounds" TEXT,
13+
ADD COLUMN "recreational_facilities" TEXT,
14+
ADD COLUMN "senior_centers" TEXT,
15+
ADD COLUMN "shopping_venues" TEXT;

api/prisma/schema.prisma

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,7 @@ model Listings {
566566
amenities String?
567567
buildingTotalUnits Int? @map("building_total_units")
568568
developer String?
569+
listingFileNumber String? @map("listing_file_number")
569570
householdSizeMax Int? @map("household_size_max")
570571
householdSizeMin Int? @map("household_size_min")
571572
neighborhood String?
@@ -999,6 +1000,12 @@ model ListingNeighborhoodAmenities {
9991000
parksAndCommunityCenters String? @map("parks_and_community_centers")
10001001
schools String?
10011002
publicTransportation String? @map("public_transportation")
1003+
shoppingVenues String? @map("shopping_venues")
1004+
hospitals String?
1005+
seniorCenters String? @map("senior_centers")
1006+
recreationalFacilities String? @map("recreational_facilities")
1007+
playgrounds String?
1008+
busStops String? @map("bus_stops")
10021009
listings Listings?
10031010
10041011
@@map("listing_neighborhood_amenities")
@@ -1322,6 +1329,12 @@ enum NeighborhoodAmenitiesEnum {
13221329
parksAndCommunityCenters
13231330
pharmacies
13241331
healthCareResources
1332+
shoppingVenues
1333+
hospitals
1334+
seniorCenters
1335+
recreationalFacilities
1336+
playgrounds
1337+
busStops
13251338
13261339
@@map("neighborhood_amenities_enum")
13271340
}

api/prisma/seed-staging.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ export const stagingSeed = async (
160160
featureFlags: [
161161
FeatureFlagEnum.enableAccessibilityFeatures,
162162
FeatureFlagEnum.enableHousingDeveloperOwner,
163+
FeatureFlagEnum.enableListingFileNumber,
163164
FeatureFlagEnum.enableListingFiltering,
164165
FeatureFlagEnum.enableMarketingStatus,
165166
FeatureFlagEnum.enableMarketingStatusMonths,
@@ -169,6 +170,12 @@ export const stagingSeed = async (
169170
visibleNeighborhoodAmenities: [
170171
NeighborhoodAmenitiesEnum.groceryStores,
171172
NeighborhoodAmenitiesEnum.pharmacies,
173+
NeighborhoodAmenitiesEnum.shoppingVenues,
174+
NeighborhoodAmenitiesEnum.hospitals,
175+
NeighborhoodAmenitiesEnum.seniorCenters,
176+
NeighborhoodAmenitiesEnum.recreationalFacilities,
177+
NeighborhoodAmenitiesEnum.playgrounds,
178+
NeighborhoodAmenitiesEnum.busStops,
172179
],
173180

174181
requiredListingFields: [
@@ -177,6 +184,7 @@ export const stagingSeed = async (
177184
'leasingAgentEmail',
178185
'leasingAgentName',
179186
'leasingAgentPhone',
187+
'listingFileNumber',
180188
'listingImages',
181189
'listingsBuildingAddress',
182190
'name',

api/src/dtos/listings/listing-neighborhood-amenities.dto.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,40 @@ export class ListingNeighborhoodAmenities {
3939
@IsString({ groups: [ValidationsGroupsEnum.default] })
4040
@ApiPropertyOptional()
4141
healthCareResources?: string | null;
42+
43+
@Expose()
44+
@IsOptional({ groups: [ValidationsGroupsEnum.default] })
45+
@IsString({ groups: [ValidationsGroupsEnum.default] })
46+
@ApiPropertyOptional()
47+
shoppingVenues?: string | null;
48+
49+
@Expose()
50+
@IsOptional({ groups: [ValidationsGroupsEnum.default] })
51+
@IsString({ groups: [ValidationsGroupsEnum.default] })
52+
@ApiPropertyOptional()
53+
hospitals?: string | null;
54+
55+
@Expose()
56+
@IsOptional({ groups: [ValidationsGroupsEnum.default] })
57+
@IsString({ groups: [ValidationsGroupsEnum.default] })
58+
@ApiPropertyOptional()
59+
seniorCenters?: string | null;
60+
61+
@Expose()
62+
@IsOptional({ groups: [ValidationsGroupsEnum.default] })
63+
@IsString({ groups: [ValidationsGroupsEnum.default] })
64+
@ApiPropertyOptional()
65+
recreationalFacilities?: string | null;
66+
67+
@Expose()
68+
@IsOptional({ groups: [ValidationsGroupsEnum.default] })
69+
@IsString({ groups: [ValidationsGroupsEnum.default] })
70+
@ApiPropertyOptional()
71+
playgrounds?: string | null;
72+
73+
@Expose()
74+
@IsOptional({ groups: [ValidationsGroupsEnum.default] })
75+
@IsString({ groups: [ValidationsGroupsEnum.default] })
76+
@ApiPropertyOptional()
77+
busStops?: string | null;
4278
}

api/src/dtos/listings/listing.dto.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,14 @@ class Listing extends AbstractDTO {
134134
@ApiPropertyOptional()
135135
developer?: string;
136136

137+
@Expose()
138+
@ValidateListingPublish('listingFileNumber', {
139+
groups: [ValidationsGroupsEnum.default],
140+
})
141+
@IsString({ groups: [ValidationsGroupsEnum.default] })
142+
@ApiPropertyOptional()
143+
listingFileNumber?: string;
144+
137145
@Expose()
138146
@IsNumber({}, { groups: [ValidationsGroupsEnum.default] })
139147
@ApiPropertyOptional()

api/src/enums/feature-flags/feature-flags-enum.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export enum FeatureFlagEnum {
1818
enableIsVerified = 'enableIsVerified',
1919
enableLimitedHowDidYouHear = 'enableLimitedHowDidYouHear',
2020
enableListingFavoriting = 'enableListingFavoriting',
21+
enableListingFileNumber = 'enableListingFileNumber',
2122
enableListingFiltering = 'enableListingFiltering',
2223
enableListingOpportunity = 'enableListingOpportunity',
2324
enableListingPagination = 'enableListingPagination',
@@ -130,6 +131,11 @@ export const featureFlagMap: {
130131
description:
131132
'When true, a Favorite button is shown for public listings and users can view their favorited listings',
132133
},
134+
{
135+
name: FeatureFlagEnum.enableListingFileNumber,
136+
description:
137+
'When true, partners can enter and export a listing file number',
138+
},
133139
{
134140
name: FeatureFlagEnum.enableListingFiltering,
135141
description:

api/src/services/listing-csv-export.service.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,17 @@ export class ListingCsvExporterService implements CsvExporterServiceInterface {
459459
? 'Housing developer / owner'
460460
: 'Developer',
461461
},
462+
...(doAnyJurisdictionHaveFeatureFlagSet(
463+
user.jurisdictions,
464+
FeatureFlagEnum.enableListingFileNumber,
465+
)
466+
? [
467+
{
468+
path: 'listingFileNumber',
469+
label: 'Listing File Number',
470+
},
471+
]
472+
: []),
462473
{
463474
path: 'listingsBuildingAddress.street',
464475
label: 'Building Street Address',
@@ -843,6 +854,30 @@ export class ListingCsvExporterService implements CsvExporterServiceInterface {
843854
path: 'listingNeighborhoodAmenities.healthCareResources',
844855
label: 'Neighborhood Amenities - Health Care Resources',
845856
},
857+
[NeighborhoodAmenitiesEnum.shoppingVenues]: {
858+
path: 'listingNeighborhoodAmenities.shoppingVenues',
859+
label: 'Neighborhood Amenities - Shopping Venues',
860+
},
861+
[NeighborhoodAmenitiesEnum.hospitals]: {
862+
path: 'listingNeighborhoodAmenities.hospitals',
863+
label: 'Neighborhood Amenities - Hospitals',
864+
},
865+
[NeighborhoodAmenitiesEnum.seniorCenters]: {
866+
path: 'listingNeighborhoodAmenities.seniorCenters',
867+
label: 'Neighborhood Amenities - Senior Centers',
868+
},
869+
[NeighborhoodAmenitiesEnum.recreationalFacilities]: {
870+
path: 'listingNeighborhoodAmenities.recreationalFacilities',
871+
label: 'Neighborhood Amenities - Recreational Facilities',
872+
},
873+
[NeighborhoodAmenitiesEnum.playgrounds]: {
874+
path: 'listingNeighborhoodAmenities.playgrounds',
875+
label: 'Neighborhood Amenities - Playgrounds',
876+
},
877+
[NeighborhoodAmenitiesEnum.busStops]: {
878+
path: 'listingNeighborhoodAmenities.busStops',
879+
label: 'Neighborhood Amenities - Bus Stops',
880+
},
846881
};
847882

848883
Object.keys(amenityHeaderMap).forEach((key) => {

api/src/services/listing.service.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -547,9 +547,12 @@ export class ListingService implements OnModuleInit {
547547
};
548548
} else if (availability === FilterAvailabilityEnum.waitlistOpen) {
549549
const builtFilter = buildFilter({
550-
$comparison: Compare['='],
550+
$comparison: Compare.IN,
551551
$include_nulls: false,
552-
value: ReviewOrderTypeEnum.waitlist,
552+
value: [
553+
ReviewOrderTypeEnum.waitlist,
554+
ReviewOrderTypeEnum.waitlistLottery,
555+
],
553556
key: ListingFilterKeys.availabilities,
554557
caseSensitive: true,
555558
});
@@ -663,9 +666,12 @@ export class ListingService implements OnModuleInit {
663666
FilterAvailabilityEnum.waitlistOpen
664667
) {
665668
const builtFilter = buildFilter({
666-
$comparison: filter.$comparison,
669+
$comparison: Compare.IN,
667670
$include_nulls: false,
668-
value: ReviewOrderTypeEnum.waitlist,
671+
value: [
672+
ReviewOrderTypeEnum.waitlist,
673+
ReviewOrderTypeEnum.waitlistLottery,
674+
],
669675
key: ListingFilterKeys.availability,
670676
caseSensitive: true,
671677
});

api/test/unit/services/listing.service.spec.ts

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,12 @@ describe('Testing listing service', () => {
573573
parksAndCommunityCenters: 'parks',
574574
schools: 'schools',
575575
publicTransportation: 'public transportation',
576+
busStops: 'bus stops',
577+
hospitals: 'hospitals',
578+
playgrounds: 'playgrounds',
579+
recreationalFacilities: 'recreational facilities',
580+
seniorCenters: 'senior centers',
581+
shoppingVenues: 'shopping venues',
576582
},
577583
marketingType: undefined,
578584
};
@@ -1453,7 +1459,10 @@ describe('Testing listing service', () => {
14531459
OR: [
14541460
{
14551461
reviewOrderType: {
1456-
equals: ReviewOrderTypeEnum.waitlist,
1462+
in: [
1463+
ReviewOrderTypeEnum.waitlist,
1464+
ReviewOrderTypeEnum.waitlistLottery,
1465+
],
14571466
},
14581467
},
14591468
],
@@ -1650,7 +1659,10 @@ describe('Testing listing service', () => {
16501659
OR: [
16511660
{
16521661
reviewOrderType: {
1653-
equals: ReviewOrderTypeEnum.waitlist,
1662+
in: [
1663+
ReviewOrderTypeEnum.waitlist,
1664+
ReviewOrderTypeEnum.waitlistLottery,
1665+
],
16541666
},
16551667
},
16561668
],
@@ -3482,6 +3494,12 @@ describe('Testing listing service', () => {
34823494
parksAndCommunityCenters: 'parks',
34833495
schools: 'schools',
34843496
publicTransportation: 'public transportation',
3497+
busStops: 'bus stops',
3498+
hospitals: 'hospitals',
3499+
playgrounds: 'playgrounds',
3500+
recreationalFacilities: 'recreational facilities',
3501+
seniorCenters: 'senior centers',
3502+
shoppingVenues: 'shopping venues',
34853503
},
34863504
},
34873505
jurisdictions: {
@@ -3984,6 +4002,12 @@ describe('Testing listing service', () => {
39844002
parksAndCommunityCenters: 'parks',
39854003
schools: 'schools',
39864004
publicTransportation: 'public transportation',
4005+
busStops: 'bus stops',
4006+
hospitals: 'hospitals',
4007+
playgrounds: 'playgrounds',
4008+
recreationalFacilities: 'recreational facilities',
4009+
seniorCenters: 'senior centers',
4010+
shoppingVenues: 'shopping venues',
39874011
},
39884012
},
39894013
jurisdictions: {
@@ -4463,6 +4487,12 @@ describe('Testing listing service', () => {
44634487
parksAndCommunityCenters: 'parks',
44644488
schools: 'schools',
44654489
publicTransportation: 'public transportation',
4490+
busStops: 'bus stops',
4491+
hospitals: 'hospitals',
4492+
playgrounds: 'playgrounds',
4493+
recreationalFacilities: 'recreational facilities',
4494+
seniorCenters: 'senior centers',
4495+
shoppingVenues: 'shopping venues',
44664496
};
44674497

44684498
const calculatedUnitsAvailable = service.calculateUnitsAvailable(
@@ -4842,6 +4872,12 @@ describe('Testing listing service', () => {
48424872
pharmacies: null,
48434873
publicTransportation: null,
48444874
schools: null,
4875+
busStops: null,
4876+
hospitals: null,
4877+
playgrounds: null,
4878+
recreationalFacilities: null,
4879+
seniorCenters: null,
4880+
shoppingVenues: null,
48454881
},
48464882
update: {
48474883
groceryStores: null,
@@ -4850,6 +4886,12 @@ describe('Testing listing service', () => {
48504886
pharmacies: null,
48514887
publicTransportation: null,
48524888
schools: null,
4889+
busStops: null,
4890+
hospitals: null,
4891+
playgrounds: null,
4892+
recreationalFacilities: null,
4893+
seniorCenters: null,
4894+
shoppingVenues: null,
48534895
},
48544896
where: {
48554897
id: undefined,
@@ -4993,6 +5035,12 @@ describe('Testing listing service', () => {
49935035
pharmacies: null,
49945036
publicTransportation: null,
49955037
schools: null,
5038+
busStops: null,
5039+
hospitals: null,
5040+
playgrounds: null,
5041+
recreationalFacilities: null,
5042+
seniorCenters: null,
5043+
shoppingVenues: null,
49965044
},
49975045
update: {
49985046
groceryStores: null,
@@ -5001,6 +5049,12 @@ describe('Testing listing service', () => {
50015049
pharmacies: null,
50025050
publicTransportation: null,
50035051
schools: null,
5052+
busStops: null,
5053+
hospitals: null,
5054+
playgrounds: null,
5055+
recreationalFacilities: null,
5056+
seniorCenters: null,
5057+
shoppingVenues: null,
50045058
},
50055059
where: {
50065060
id: undefined,

0 commit comments

Comments
 (0)