Skip to content

Commit

Permalink
Merge pull request #491 from code4romania/develop
Browse files Browse the repository at this point in the history
Refactor: Update beneficiaries
  • Loading branch information
birloiflorian authored May 24, 2024
2 parents f4400f9 + 927714f commit 98f7a78
Show file tree
Hide file tree
Showing 22 changed files with 178 additions and 105 deletions.
76 changes: 76 additions & 0 deletions backend/src/migrations/1716549264192-Beneficiaries.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import { MigrationInterface, QueryRunner } from 'typeorm';

export class Beneficiaries1716549264192 implements MigrationInterface {
name = 'Beneficiaries1716549264192';

public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`CREATE TABLE "_beneficiary" ("id" SERIAL NOT NULL, "name" character varying NOT NULL, CONSTRAINT "PK_680ec92b80a3a9a5ff18f0630b4" PRIMARY KEY ("id"))`,
);
// Insert the values
await queryRunner.query(`
INSERT INTO "_beneficiary" (name) VALUES
('copii (0-14 ani)'),
('tineri (15-18 ani)'),
('adulți (18-25 ani)'),
('vârstnici (>65 ani)'),
('familie'),
('persoane aflate în risc de sărăcie'),
('persoane cu adicţii (alcool, droguri, jocuri de noroc etc.)'),
('persoane cu afecţiuni medicale'),
('persoane cu afecţiuni psihice'),
('persoane cu dizabilităţi'),
('persoane din comunităţi izolate'),
('persoane fără adăpost'),
('persoane private de libertate'),
('victime ale traficului de persoane'),
('victime ale violenţei domestice'),
('şomeri de lungă durată'),
('servicii sociale de suport pentru aparţinătorii beneficiarilor')
`);
await queryRunner.query(
`CREATE TABLE "civic_center_service_to_beneficiary" ("civic_center_service_id" integer NOT NULL, "beneficiary_id" integer NOT NULL, CONSTRAINT "PK_1ec14ffa726e31df630f5a47367" PRIMARY KEY ("civic_center_service_id", "beneficiary_id"))`,
);
await queryRunner.query(
`CREATE INDEX "IDX_6ce738baa15588686511310b7b" ON "civic_center_service_to_beneficiary" ("civic_center_service_id") `,
);
await queryRunner.query(
`CREATE INDEX "IDX_3d4def4c6507c1dfa407066477" ON "civic_center_service_to_beneficiary" ("beneficiary_id") `,
);
await queryRunner.query(
`ALTER TABLE "civic_center_service" DROP COLUMN "age_categories"`,
);
await queryRunner.query(
`DROP TYPE "public"."civic_center_service_age_categories_enum"`,
);
await queryRunner.query(
`ALTER TABLE "civic_center_service_to_beneficiary" ADD CONSTRAINT "FK_6ce738baa15588686511310b7b3" FOREIGN KEY ("civic_center_service_id") REFERENCES "civic_center_service"("id") ON DELETE CASCADE ON UPDATE CASCADE`,
);
await queryRunner.query(
`ALTER TABLE "civic_center_service_to_beneficiary" ADD CONSTRAINT "FK_3d4def4c6507c1dfa4070664777" FOREIGN KEY ("beneficiary_id") REFERENCES "_domain"("id") ON DELETE CASCADE ON UPDATE CASCADE`,
);
}

public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE "civic_center_service_to_beneficiary" DROP CONSTRAINT "FK_3d4def4c6507c1dfa4070664777"`,
);
await queryRunner.query(
`ALTER TABLE "civic_center_service_to_beneficiary" DROP CONSTRAINT "FK_6ce738baa15588686511310b7b3"`,
);
await queryRunner.query(
`CREATE TYPE "public"."civic_center_service_age_categories_enum" AS ENUM('COPII', 'TINERI', 'ADULTI', 'VARSTNICI', 'FAMILIE', 'RISC_DE_SARACIE', 'ADICTII', 'AFECTIUNI_MEDICALE', 'AFECTIUNI_PSIHICE', 'DIZABILITATI', 'COMUNITATI_IZOLATE', 'FARA_ADAPOST', 'PRIVATE_DE_LIBERTATE', 'TRAFICULUI_DE_PERSOANE', 'VIOLENTEI_DOMESTICE', 'SOMERI', 'APARTINATORII_BENEFICIARILOR')`,
);
await queryRunner.query(
`ALTER TABLE "civic_center_service" ADD "age_categories" "public"."civic_center_service_age_categories_enum" array NOT NULL`,
);
await queryRunner.query(
`DROP INDEX "public"."IDX_3d4def4c6507c1dfa407066477"`,
);
await queryRunner.query(
`DROP INDEX "public"."IDX_6ce738baa15588686511310b7b"`,
);
await queryRunner.query(`DROP TABLE "civic_center_service_to_beneficiary"`);
await queryRunner.query(`DROP TABLE "_beneficiary"`);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { OmitType } from '@nestjs/swagger';
import { IsArray, IsNumber, IsOptional } from 'class-validator';
import { BaseFilterDto } from 'src/common/base/base-filter.dto';
import { AgeCategory } from 'src/modules/practice-program/enums/age-category.enum';

export class CivicCenterServiceSearchFilterDto extends OmitType(BaseFilterDto, [
'orderBy',
Expand All @@ -21,5 +20,5 @@ export class CivicCenterServiceSearchFilterDto extends OmitType(BaseFilterDto, [

@IsArray()
@IsOptional()
ageCategories?: AgeCategory[]; //TODO: this needs to be renamed to beneficiaries
beneficiaries?: number[];
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import {
import { REGEX } from 'src/common/constants/patterns.constant';
import { IsPhoneValid } from 'src/common/decorators/is-phone-valid.decorator';
import { ToRoPhoneNumber } from 'src/common/decorators/to-ro-phone-number.decorator';
import { AgeCategory } from '../../practice-program/enums/age-category.enum';

export class CreateCivicCenterServiceDto {
@IsString()
Expand Down Expand Up @@ -48,7 +47,7 @@ export class CreateCivicCenterServiceDto {
domains: number[];

@IsArray()
ageCategories: AgeCategory[];
beneficiaries: number[];

@IsBoolean()
hasOnlineAccess: boolean;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity('_beneficiary')
export class Beneficiary {
@PrimaryGeneratedColumn('increment')
id: number;

@Column({
type: 'varchar',
name: 'name',
})
name: string;
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import {
ManyToOne,
OneToMany,
} from 'typeorm';
import { AgeCategory } from '../../practice-program/enums/age-category.enum';
import { Feedback } from './feedback.entity';
import { ServiceDomain } from './service-domain.entity';
import { Beneficiary } from './beneficiary.entity';

@Entity()
export class CivicCenterService extends BaseEntity {
Expand Down Expand Up @@ -70,13 +70,16 @@ export class CivicCenterService extends BaseEntity {
})
domains: ServiceDomain[];

@Column({
type: 'enum',
enum: AgeCategory,
array: true,
name: 'age_categories',
@ManyToMany(() => Domain, { cascade: true, onDelete: 'CASCADE' })
@JoinTable({
name: 'civic_center_service_to_beneficiary',
joinColumn: {
name: 'civic_center_service_id',
referencedColumnName: 'id',
},
inverseJoinColumn: { name: 'beneficiary_id', referencedColumnName: 'id' },
})
ageCategories: AgeCategory[];
beneficiaries: Beneficiary[];

@Column({ type: 'boolean', name: 'has_online_access', default: false })
hasOnlineAccess: boolean;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import { OngApplicationService } from 'src/modules/application/services/ong-appl
import { ApplicationStatus } from 'src/modules/application/enums/application-status.enum';
import { ApplicationPullingType } from 'src/modules/application/enums/application-pulling-type.enum';
import { OngApplicationStatus } from 'src/modules/application/enums/ong-application-status.enum';
import { Beneficiary } from '../entities/beneficiary.entity';

@Injectable()
export class CivicCenterServiceService {
Expand Down Expand Up @@ -55,7 +56,14 @@ export class CivicCenterServiceService {
},
});

// 3. Check if undetermined flag and end date have correct values
// 3. Get beneficiaries
const beneficiaries = await this.nomenclatureService.getBeneficiaries({
where: {
id: In(createCivicCenterServiceDto.beneficiaries),
},
});

// 4. Check if undetermined flag and end date have correct values
if (
createCivicCenterServiceDto.endDate &&
createCivicCenterServiceDto.isPeriodNotDetermined
Expand All @@ -71,6 +79,7 @@ export class CivicCenterServiceService {
...createCivicCenterServiceDto,
location: location,
domains,
beneficiaries,
});

return service;
Expand Down Expand Up @@ -169,6 +178,15 @@ export class CivicCenterServiceService {
});
}

let beneficiaries: Beneficiary[];
if (updateCivicCenterServiceDto.beneficiaries) {
beneficiaries = await this.nomenclatureService.getBeneficiaries({
where: {
id: In(updateCivicCenterServiceDto.beneficiaries),
},
});
}

// 4. Validate received data
await this.validateData(updateCivicCenterServiceDto);

Expand All @@ -178,6 +196,7 @@ export class CivicCenterServiceService {
...updateCivicCenterServiceDto,
location: location || civicService.location,
domains: domains || civicService.domains,
beneficiaries: beneficiaries || civicService.beneficiaries,
});

return service;
Expand Down Expand Up @@ -214,6 +233,7 @@ export class CivicCenterServiceService {
'location',
'domains',
'organization',
'beneficiaries',
'organization.organizationGeneral',
],
});
Expand All @@ -234,7 +254,7 @@ export class CivicCenterServiceService {
public async findAll(organizationId: number): Promise<CivicCenterService[]> {
return this.civicCenterServiceRepository.getMany({
where: { organizationId },
relations: ['location', 'domains'],
relations: ['location', 'domains', 'beneficiaries'],
order: {
createdOn: OrderDirection.DESC,
},
Expand Down Expand Up @@ -284,7 +304,7 @@ export class CivicCenterServiceService {
civicCenterServiceFilterDto: CivicCenterServiceSearchFilterDto,
): Promise<Pagination<CivicCenterServiceFlat>> {
try {
const { domains, ageCategories, ...restOfFilters } =
const { domains, beneficiaries, ...restOfFilters } =
civicCenterServiceFilterDto;

// 1. get only active services and map correctly ids for domains and age categories
Expand All @@ -295,7 +315,8 @@ export class CivicCenterServiceService {
status: OrganizationStatus.ACTIVE,
},
domains: domains?.length > 0 ? { id: In(domains) } : null,
ageCategories: ageCategories ? ArrayOverlap(ageCategories) : null,
beneficiaries:
beneficiaries?.length > 0 ? { id: In(beneficiaries) } : null,
};

// 2. return all paginated services
Expand Down Expand Up @@ -342,7 +363,7 @@ export class CivicCenterServiceService {

const practiceProgram = await this.civicCenterServiceRepository.get({
where,
relations: ['location', 'location.county', 'domains'],
relations: ['location', 'location.county', 'domains', 'beneficiaries'],
});

if (!practiceProgram) {
Expand Down
19 changes: 0 additions & 19 deletions backend/src/modules/practice-program/enums/age-category.enum.ts

This file was deleted.

5 changes: 5 additions & 0 deletions backend/src/shared/controllers/nomenclatures.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,9 @@ export class NomenclaturesController {
getServiceDomains() {
return this.nomenclaturesService.getServiceDomains({});
}

@Get('beneficiaries')
getBeneficiaries() {
return this.nomenclaturesService.getBeneficiaries({});
}
}
7 changes: 7 additions & 0 deletions backend/src/shared/services/nomenclatures.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { Coalition } from '../entities/coalition.entity';
import { Federation } from '../entities/federation.entity';
import { PracticeDomain } from 'src/modules/practice-program/entities/practice_domain.entity';
import { ServiceDomain } from 'src/modules/civic-center-service/entities/service-domain.entity';
import { Beneficiary } from 'src/modules/civic-center-service/entities/beneficiary.entity';

@Injectable()
export class NomenclaturesService {
Expand All @@ -39,6 +40,8 @@ export class NomenclaturesService {
private readonly practiceDomainRepository: Repository<PracticeDomain>,
@InjectRepository(ServiceDomain)
private readonly serviceDomainRepository: Repository<ServiceDomain>,
@InjectRepository(Beneficiary)
private readonly beneficiaryRepository: Repository<Beneficiary>,
) {}

public getCity(conditions: FindOneOptions<City>) {
Expand Down Expand Up @@ -155,4 +158,8 @@ export class NomenclaturesService {
public getServiceDomains(conditions: FindManyOptions<ServiceDomain>) {
return this.serviceDomainRepository.find(conditions);
}

public getBeneficiaries(conditions: FindManyOptions<Beneficiary>) {
return this.beneficiaryRepository.find(conditions);
}
}
2 changes: 2 additions & 0 deletions backend/src/shared/shared.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import { S3FileManagerService } from './services/s3-file-manager.service';
import { FileManagerService } from './services/file-manager.service';
import { PracticeDomain } from 'src/modules/practice-program/entities/practice_domain.entity';
import { ServiceDomain } from 'src/modules/civic-center-service/entities/service-domain.entity';
import { Beneficiary } from 'src/modules/civic-center-service/entities/beneficiary.entity';

@Global()
@Module({
Expand All @@ -33,6 +34,7 @@ import { ServiceDomain } from 'src/modules/civic-center-service/entities/service
Skill,
PracticeDomain,
ServiceDomain,
Beneficiary,
]),
HttpModule,
],
Expand Down
19 changes: 0 additions & 19 deletions frontend/src/assets/locales/en/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -1243,25 +1243,6 @@
"description": "TODO#17: Lorem ipsum",
"add_button": "Add Service"
},
"beneficiaries": {
"COPII": "copii (0-14 ani)",
"TINERI": "tineri (15-18 ani)",
"ADULTI": "adulți (18-25 ani)",
"VARSTNICI": "vârstnici (>65 ani)",
"FAMILIE": "familie",
"RISC_DE_SARACIE": "persoane aflate în risc de sărăcie",
"ADICTII": "persoane cu adicţii (alcool, droguri, jocuri de noroc etc.)",
"AFECTIUNI_MEDICALE": "persoane cu afecţiuni medicale",
"AFECTIUNI_PSIHICE": "persoane cu afecţiuni psihice",
"DIZABILITATI": "persoane cu dizabilităţi",
"COMUNITATI_IZOLATE": "persoane din comunităţi izolate",
"FARA_ADAPOST": "persoane fără adăpost",
"PRIVATE_DE_LIBERTATE": "persoane private de libertate",
"TRAFICULUI_DE_PERSOANE": "victime ale traficului de persoane",
"VIOLENTEI_DOMESTICE": "victime ale violenţei domestice",
"SOMERI": "şomeri de lungă durată",
"APARTINATORII_BENEFICIARILOR": "servicii sociale de suport pentru aparţinătorii beneficiarilor"
},
"list": {
"error": "Error loading the list of services"
},
Expand Down
19 changes: 0 additions & 19 deletions frontend/src/assets/locales/ro/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -1247,25 +1247,6 @@
"description": "Aici poți vizualiza și edita toate serviciile oferite de organizația ta.",
"add_button": "Adaugă Serviciu"
},
"beneficiaries": {
"COPII": "copii (0-14 ani)",
"TINERI": "tineri (15-18 ani)",
"ADULTI": "adulți (18-25 ani)",
"VARSTNICI": "vârstnici (>65 ani)",
"FAMILIE": "familie",
"RISC_DE_SARACIE": "persoane aflate în risc de sărăcie",
"ADICTII": "persoane cu adicţii (alcool, droguri, jocuri de noroc etc.)",
"AFECTIUNI_MEDICALE": "persoane cu afecţiuni medicale",
"AFECTIUNI_PSIHICE": "persoane cu afecţiuni psihice",
"DIZABILITATI": "persoane cu dizabilităţi",
"COMUNITATI_IZOLATE": "persoane din comunităţi izolate",
"FARA_ADAPOST": "persoane fără adăpost",
"PRIVATE_DE_LIBERTATE": "persoane private de libertate",
"TRAFICULUI_DE_PERSOANE": "victime ale traficului de persoane",
"VIOLENTEI_DOMESTICE": "victime ale violenţei domestice",
"SOMERI": "şomeri de lungă durată",
"APARTINATORII_BENEFICIARILOR": "servicii sociale de suport pentru aparţinătorii beneficiarilor"
},
"list": {
"error": "Eroare la încărcarea listei de servicii"
},
Expand Down
6 changes: 2 additions & 4 deletions frontend/src/common/helpers/pulling-apps-helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@ export const dataToCsv = (items: { id: number; name: string }[]): string => {
return items ? items.map((item) => item.name).join(', ') : '';
};

export const formatAgeCategories = (item: CivicCenterService) => {
return item?.ageCategories
.map((key) => i18n.t(`beneficiaries.${key}`, { ns: 'civic_center_service' }))
.join(', ');
export const formatBeneficiaries = (item: CivicCenterService) => {
return item?.beneficiaries.map((item) => item.name).join(', ');
};
Loading

0 comments on commit 98f7a78

Please sign in to comment.