From 33800292aa9a7638ab8f9888d9cd8359df0af21e Mon Sep 17 00:00:00 2001 From: Danil Suhomlinov Date: Mon, 8 Jun 2026 17:42:45 +0300 Subject: [PATCH] chore: add Coolify deployment scaffolding (Dockerfiles, prod compose, git hygiene) - apps/api/Dockerfile: build NestJS, run prisma migrate deploy on start - apps/web/Dockerfile + nginx.conf: build Vite, serve static, proxy /api -> api - docker-compose.coolify.yml: full prod stack (postgres, redis, minio, keycloak, api, web) - .dockerignore / .gitignore / .gitattributes Co-Authored-By: Claude Opus 4.8 --- .dockerignore | 9 + .env.example | 26 + .gitattributes | 8 + .gitignore | 44 + CLAUDE.md | 502 ++ NU-10-MS-2026_2.docx | Bin 0 -> 126645 bytes apps/api/Dockerfile | 28 + apps/api/i18n/en/translation.json | 15 + apps/api/i18n/ro/translation.json | 15 + apps/api/i18n/ru/translation.json | 15 + apps/api/nest-cli.json | 8 + apps/api/package.json | 57 + .../migrations/20260429071206_/migration.sql | 578 ++ .../migration.sql | 35 + .../migration.sql | 47 + .../migration.sql | 52 + .../migration.sql | 27 + .../migration.sql | 6 + .../api/prisma/migrations/migration_lock.toml | 3 + apps/api/prisma/schema.prisma | 829 ++ apps/api/prisma/seed.ts | 738 ++ apps/api/scripts/generate-docx-stubs.ts | 226 + apps/api/scripts/seed-test-data.ts | 662 ++ apps/api/scripts/test-db.ts | 296 + apps/api/scripts/verify-functionality.ts | 446 ++ apps/api/src/app.module.ts | 58 + apps/api/src/common/audit/audit.decorator.ts | 12 + .../api/src/common/audit/audit.interceptor.ts | 43 + apps/api/src/common/audit/audit.module.ts | 10 + apps/api/src/common/audit/audit.service.ts | 38 + .../src/common/decorators/roles.decorator.ts | 13 + apps/api/src/common/guards/roles.guard.ts | 19 + apps/api/src/common/prisma/prisma.module.ts | 9 + apps/api/src/common/prisma/prisma.service.ts | 16 + apps/api/src/main.ts | 37 + apps/api/src/modules/admin/admin.module.ts | 9 + .../anexa-templates.controller.ts | 54 + .../anexa-templates.service.ts | 116 + .../dto/update-template.dto.ts | 10 + apps/api/src/modules/auth/auth.controller.ts | 50 + apps/api/src/modules/auth/auth.module.ts | 16 + .../api/src/modules/auth/keycloak.strategy.ts | 93 + .../contracts/contracts-global.controller.ts | 39 + .../contracts/contracts-global.module.ts | 9 + .../contracts/contracts-global.service.ts | 105 + .../modules/dashboard/dashboard.controller.ts | 14 + .../src/modules/dashboard/dashboard.module.ts | 9 + .../modules/dashboard/dashboard.service.ts | 136 + .../departments/departments.controller.ts | 44 + .../modules/departments/departments.module.ts | 9 + .../departments/departments.service.ts | 81 + .../employees/dto/create-employee.dto.ts | 108 + .../employees/dto/query-employee.dto.ts | 30 + .../modules/employees/employees.controller.ts | 63 + .../src/modules/employees/employees.module.ts | 46 + .../modules/employees/employees.service.ts | 184 + .../sub-resources/benefit.controller.ts | 26 + .../sub-resources/benefit.service.ts | 74 + .../sub-resources/contracts.controller.ts | 83 + .../sub-resources/contracts.service.ts | 124 + .../sub-resources/create-contract.dto.ts | 78 + .../create-disciplinary-sanction.dto.ts | 11 + .../sub-resources/create-education.dto.ts | 15 + .../sub-resources/create-family-member.dto.ts | 22 + .../create-identity-document.dto.ts | 23 + .../sub-resources/create-qualification.dto.ts | 10 + .../sub-resources/create-training.dto.ts | 14 + .../disciplinary-sanctions.controller.ts | 26 + .../disciplinary-sanctions.service.ts | 52 + .../sub-resources/educations.controller.ts | 26 + .../sub-resources/educations.service.ts | 26 + .../family-members.controller.ts | 26 + .../sub-resources/family-members.service.ts | 26 + .../identity-documents.controller.ts | 40 + .../identity-documents.service.ts | 36 + .../qualifications.controller.ts | 26 + .../sub-resources/qualifications.service.ts | 26 + .../sub-resources.service-factory.ts | 73 + .../sub-resources/trainings.controller.ts | 26 + .../sub-resources/trainings.service.ts | 26 + .../sub-resources/upsert-benefit.dto.ts | 16 + .../evaluation/dto/approve-form.dto.ts | 11 + .../evaluation/dto/create-campaign.dto.ts | 14 + .../modules/evaluation/dto/update-form.dto.ts | 34 + .../evaluation/evaluation.controller.ts | 102 + .../modules/evaluation/evaluation.module.ts | 16 + .../modules/evaluation/evaluation.service.ts | 278 + .../evaluation-notifications.processor.ts | 63 + .../modules/inventory/dto/adjust-stock.dto.ts | 6 + .../inventory/dto/create-inventory.dto.ts | 13 + .../modules/inventory/dto/list-query.dto.ts | 11 + .../inventory/dto/update-inventory.dto.ts | 14 + .../modules/inventory/inventory.controller.ts | 73 + .../src/modules/inventory/inventory.module.ts | 9 + .../modules/inventory/inventory.service.ts | 131 + .../src/modules/medical/dto/checkup.dto.ts | 60 + .../medical/dto/medical-profile.dto.ts | 41 + .../src/modules/medical/dto/risk-card.dto.ts | 78 + .../src/modules/medical/medical.controller.ts | 155 + .../api/src/modules/medical/medical.module.ts | 23 + .../modules/medical/services/bulk.service.ts | 182 + .../medical/services/checkup.service.ts | 218 + .../services/document-generator.service.ts | 627 ++ .../medical/services/docx-template.service.ts | 41 + .../services/medical-profile.service.ts | 93 + .../medical/services/risk-cards.service.ts | 96 + .../medical/services/storage.service.ts | 45 + .../medical/services/tiptap-to-docx.ts | 141 + .../notifications/notifications.controller.ts | 26 + .../notifications/notifications.module.ts | 49 + .../notifications/notifications.service.ts | 135 + .../workers/daily-expiry.processor.ts | 24 + .../modules/reference/reference.controller.ts | 32 + .../src/modules/reference/reference.module.ts | 7 + apps/api/templates/docx/README.md | 162 + apps/api/templates/docx/anexa-3.docx | Bin 0 -> 36125 bytes apps/api/templates/docx/anexa-4.docx | Bin 0 -> 45706 bytes apps/api/templates/docx/anexa-4a.docx | Bin 0 -> 32786 bytes apps/api/templates/docx/anexa-4b.docx | Bin 0 -> 30861 bytes apps/api/templates/docx/anexa-6.docx | Bin 0 -> 34499 bytes apps/api/tsconfig.json | 21 + apps/web/Dockerfile | 19 + apps/web/index.html | 12 + apps/web/nginx.conf | 22 + apps/web/package.json | 46 + apps/web/public/logo-medpark.png | Bin 0 -> 463008 bytes apps/web/src/App.tsx | 237 + apps/web/src/api/client.ts | 17 + apps/web/src/api/types.ts | 544 ++ apps/web/src/i18n/en.json | 39 + apps/web/src/i18n/i18n.ts | 14 + apps/web/src/i18n/ro.json | 44 + apps/web/src/i18n/ru.json | 39 + apps/web/src/main.tsx | 97 + apps/web/src/pages/auth/LoginPage.tsx | 154 + .../web/src/pages/contracts/ContractsPage.tsx | 278 + .../web/src/pages/dashboard/DashboardPage.tsx | 412 + .../src/pages/departments/DepartmentsPage.tsx | 521 ++ .../pages/employees/EmployeeDetailPage.tsx | 365 + .../web/src/pages/employees/EmployeesPage.tsx | 378 + .../employees/components/EmployeeDrawer.tsx | 367 + .../employees/components/EmployeeHeader.tsx | 175 + .../pages/employees/drawers/BenefitDrawer.tsx | 246 + .../employees/drawers/ContractDrawer.tsx | 426 ++ .../drawers/DisciplinarySanctionDrawer.tsx | 81 + .../employees/drawers/EducationDrawer.tsx | 118 + .../employees/drawers/FamilyMemberDrawer.tsx | 108 + .../drawers/IdentityDocumentDrawer.tsx | 104 + .../employees/drawers/QualificationDrawer.tsx | 92 + .../employees/drawers/TrainingDrawer.tsx | 113 + .../web/src/pages/employees/employeeSchema.ts | 35 + .../src/pages/employees/tabs/BeneficiiTab.tsx | 87 + .../pages/employees/tabs/CalificariTab.tsx | 96 + .../src/pages/employees/tabs/ContracteTab.tsx | 195 + .../src/pages/employees/tabs/DocumenteTab.tsx | 96 + .../src/pages/employees/tabs/FamilieTab.tsx | 86 + .../src/pages/employees/tabs/MedicalTab.tsx | 659 ++ .../src/pages/employees/tabs/PersonalTab.tsx | 76 + .../src/pages/employees/tabs/SanctiuniTab.tsx | 98 + .../src/pages/employees/tabs/StudiiTab.tsx | 99 + .../src/pages/employees/tabs/TrainingTab.tsx | 88 + .../pages/evaluation/CampaignDetailPage.tsx | 199 + .../pages/evaluation/EvaluationFormPage.tsx | 342 + .../src/pages/evaluation/EvaluationPage.tsx | 211 + .../evaluation/components/CategoryBadge.tsx | 27 + .../evaluation/components/ScoreInput.tsx | 48 + .../evaluation/components/StatusBadge.tsx | 25 + .../src/pages/inventory/InventoryDrawer.tsx | 263 + .../web/src/pages/inventory/InventoryPage.tsx | 241 + .../src/pages/inventory/StockAdjustModal.tsx | 158 + .../src/pages/medical/MedicalControlPage.tsx | 428 ++ .../src/pages/medical/MedicalInboxPage.tsx | 259 + apps/web/src/pages/medical/RiskCardsPage.tsx | 644 ++ apps/web/src/styles/global.css | 267 + apps/web/tsconfig.json | 20 + apps/web/vite.config.ts | 13 + docker-compose.coolify.yml | 97 + docker-compose.yml | 62 + .../plans/2026-05-08-contracts-seed-anexa.md | 2194 ++++++ .../superpowers/plans/2026-05-12-inventory.md | 493 ++ ...5-08-contracts-seed-anexa-editor-design.md | 249 + .../specs/2026-05-12-inventory-design.md | 152 + docs/testing/control-medical-scenarios.md | 464 ++ package.json | 14 + pnpm-lock.yaml | 6760 +++++++++++++++++ pnpm-workspace.yaml | 10 + 186 files changed, 30437 insertions(+) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 CLAUDE.md create mode 100644 NU-10-MS-2026_2.docx create mode 100644 apps/api/Dockerfile create mode 100644 apps/api/i18n/en/translation.json create mode 100644 apps/api/i18n/ro/translation.json create mode 100644 apps/api/i18n/ru/translation.json create mode 100644 apps/api/nest-cli.json create mode 100644 apps/api/package.json create mode 100644 apps/api/prisma/migrations/20260429071206_/migration.sql create mode 100644 apps/api/prisma/migrations/20260508120000_add_anexa_templates/migration.sql create mode 100644 apps/api/prisma/migrations/20260512000000_add_inventory/migration.sql create mode 100644 apps/api/prisma/migrations/20260525120000_add_anexa4_risk_card_fields/migration.sql create mode 100644 apps/api/prisma/migrations/20260526120000_add_overexposure_tipfisa_anexa4a/migration.sql create mode 100644 apps/api/prisma/migrations/20260527153000_docx_template_fill_fields/migration.sql create mode 100644 apps/api/prisma/migrations/migration_lock.toml create mode 100644 apps/api/prisma/schema.prisma create mode 100644 apps/api/prisma/seed.ts create mode 100644 apps/api/scripts/generate-docx-stubs.ts create mode 100644 apps/api/scripts/seed-test-data.ts create mode 100644 apps/api/scripts/test-db.ts create mode 100644 apps/api/scripts/verify-functionality.ts create mode 100644 apps/api/src/app.module.ts create mode 100644 apps/api/src/common/audit/audit.decorator.ts create mode 100644 apps/api/src/common/audit/audit.interceptor.ts create mode 100644 apps/api/src/common/audit/audit.module.ts create mode 100644 apps/api/src/common/audit/audit.service.ts create mode 100644 apps/api/src/common/decorators/roles.decorator.ts create mode 100644 apps/api/src/common/guards/roles.guard.ts create mode 100644 apps/api/src/common/prisma/prisma.module.ts create mode 100644 apps/api/src/common/prisma/prisma.service.ts create mode 100644 apps/api/src/main.ts create mode 100644 apps/api/src/modules/admin/admin.module.ts create mode 100644 apps/api/src/modules/admin/anexa-templates/anexa-templates.controller.ts create mode 100644 apps/api/src/modules/admin/anexa-templates/anexa-templates.service.ts create mode 100644 apps/api/src/modules/admin/anexa-templates/dto/update-template.dto.ts create mode 100644 apps/api/src/modules/auth/auth.controller.ts create mode 100644 apps/api/src/modules/auth/auth.module.ts create mode 100644 apps/api/src/modules/auth/keycloak.strategy.ts create mode 100644 apps/api/src/modules/contracts/contracts-global.controller.ts create mode 100644 apps/api/src/modules/contracts/contracts-global.module.ts create mode 100644 apps/api/src/modules/contracts/contracts-global.service.ts create mode 100644 apps/api/src/modules/dashboard/dashboard.controller.ts create mode 100644 apps/api/src/modules/dashboard/dashboard.module.ts create mode 100644 apps/api/src/modules/dashboard/dashboard.service.ts create mode 100644 apps/api/src/modules/departments/departments.controller.ts create mode 100644 apps/api/src/modules/departments/departments.module.ts create mode 100644 apps/api/src/modules/departments/departments.service.ts create mode 100644 apps/api/src/modules/employees/dto/create-employee.dto.ts create mode 100644 apps/api/src/modules/employees/dto/query-employee.dto.ts create mode 100644 apps/api/src/modules/employees/employees.controller.ts create mode 100644 apps/api/src/modules/employees/employees.module.ts create mode 100644 apps/api/src/modules/employees/employees.service.ts create mode 100644 apps/api/src/modules/employees/sub-resources/benefit.controller.ts create mode 100644 apps/api/src/modules/employees/sub-resources/benefit.service.ts create mode 100644 apps/api/src/modules/employees/sub-resources/contracts.controller.ts create mode 100644 apps/api/src/modules/employees/sub-resources/contracts.service.ts create mode 100644 apps/api/src/modules/employees/sub-resources/create-contract.dto.ts create mode 100644 apps/api/src/modules/employees/sub-resources/create-disciplinary-sanction.dto.ts create mode 100644 apps/api/src/modules/employees/sub-resources/create-education.dto.ts create mode 100644 apps/api/src/modules/employees/sub-resources/create-family-member.dto.ts create mode 100644 apps/api/src/modules/employees/sub-resources/create-identity-document.dto.ts create mode 100644 apps/api/src/modules/employees/sub-resources/create-qualification.dto.ts create mode 100644 apps/api/src/modules/employees/sub-resources/create-training.dto.ts create mode 100644 apps/api/src/modules/employees/sub-resources/disciplinary-sanctions.controller.ts create mode 100644 apps/api/src/modules/employees/sub-resources/disciplinary-sanctions.service.ts create mode 100644 apps/api/src/modules/employees/sub-resources/educations.controller.ts create mode 100644 apps/api/src/modules/employees/sub-resources/educations.service.ts create mode 100644 apps/api/src/modules/employees/sub-resources/family-members.controller.ts create mode 100644 apps/api/src/modules/employees/sub-resources/family-members.service.ts create mode 100644 apps/api/src/modules/employees/sub-resources/identity-documents.controller.ts create mode 100644 apps/api/src/modules/employees/sub-resources/identity-documents.service.ts create mode 100644 apps/api/src/modules/employees/sub-resources/qualifications.controller.ts create mode 100644 apps/api/src/modules/employees/sub-resources/qualifications.service.ts create mode 100644 apps/api/src/modules/employees/sub-resources/sub-resources.service-factory.ts create mode 100644 apps/api/src/modules/employees/sub-resources/trainings.controller.ts create mode 100644 apps/api/src/modules/employees/sub-resources/trainings.service.ts create mode 100644 apps/api/src/modules/employees/sub-resources/upsert-benefit.dto.ts create mode 100644 apps/api/src/modules/evaluation/dto/approve-form.dto.ts create mode 100644 apps/api/src/modules/evaluation/dto/create-campaign.dto.ts create mode 100644 apps/api/src/modules/evaluation/dto/update-form.dto.ts create mode 100644 apps/api/src/modules/evaluation/evaluation.controller.ts create mode 100644 apps/api/src/modules/evaluation/evaluation.module.ts create mode 100644 apps/api/src/modules/evaluation/evaluation.service.ts create mode 100644 apps/api/src/modules/evaluation/workers/evaluation-notifications.processor.ts create mode 100644 apps/api/src/modules/inventory/dto/adjust-stock.dto.ts create mode 100644 apps/api/src/modules/inventory/dto/create-inventory.dto.ts create mode 100644 apps/api/src/modules/inventory/dto/list-query.dto.ts create mode 100644 apps/api/src/modules/inventory/dto/update-inventory.dto.ts create mode 100644 apps/api/src/modules/inventory/inventory.controller.ts create mode 100644 apps/api/src/modules/inventory/inventory.module.ts create mode 100644 apps/api/src/modules/inventory/inventory.service.ts create mode 100644 apps/api/src/modules/medical/dto/checkup.dto.ts create mode 100644 apps/api/src/modules/medical/dto/medical-profile.dto.ts create mode 100644 apps/api/src/modules/medical/dto/risk-card.dto.ts create mode 100644 apps/api/src/modules/medical/medical.controller.ts create mode 100644 apps/api/src/modules/medical/medical.module.ts create mode 100644 apps/api/src/modules/medical/services/bulk.service.ts create mode 100644 apps/api/src/modules/medical/services/checkup.service.ts create mode 100644 apps/api/src/modules/medical/services/document-generator.service.ts create mode 100644 apps/api/src/modules/medical/services/docx-template.service.ts create mode 100644 apps/api/src/modules/medical/services/medical-profile.service.ts create mode 100644 apps/api/src/modules/medical/services/risk-cards.service.ts create mode 100644 apps/api/src/modules/medical/services/storage.service.ts create mode 100644 apps/api/src/modules/medical/services/tiptap-to-docx.ts create mode 100644 apps/api/src/modules/notifications/notifications.controller.ts create mode 100644 apps/api/src/modules/notifications/notifications.module.ts create mode 100644 apps/api/src/modules/notifications/notifications.service.ts create mode 100644 apps/api/src/modules/notifications/workers/daily-expiry.processor.ts create mode 100644 apps/api/src/modules/reference/reference.controller.ts create mode 100644 apps/api/src/modules/reference/reference.module.ts create mode 100644 apps/api/templates/docx/README.md create mode 100644 apps/api/templates/docx/anexa-3.docx create mode 100644 apps/api/templates/docx/anexa-4.docx create mode 100644 apps/api/templates/docx/anexa-4a.docx create mode 100644 apps/api/templates/docx/anexa-4b.docx create mode 100644 apps/api/templates/docx/anexa-6.docx create mode 100644 apps/api/tsconfig.json create mode 100644 apps/web/Dockerfile create mode 100644 apps/web/index.html create mode 100644 apps/web/nginx.conf create mode 100644 apps/web/package.json create mode 100644 apps/web/public/logo-medpark.png create mode 100644 apps/web/src/App.tsx create mode 100644 apps/web/src/api/client.ts create mode 100644 apps/web/src/api/types.ts create mode 100644 apps/web/src/i18n/en.json create mode 100644 apps/web/src/i18n/i18n.ts create mode 100644 apps/web/src/i18n/ro.json create mode 100644 apps/web/src/i18n/ru.json create mode 100644 apps/web/src/main.tsx create mode 100644 apps/web/src/pages/auth/LoginPage.tsx create mode 100644 apps/web/src/pages/contracts/ContractsPage.tsx create mode 100644 apps/web/src/pages/dashboard/DashboardPage.tsx create mode 100644 apps/web/src/pages/departments/DepartmentsPage.tsx create mode 100644 apps/web/src/pages/employees/EmployeeDetailPage.tsx create mode 100644 apps/web/src/pages/employees/EmployeesPage.tsx create mode 100644 apps/web/src/pages/employees/components/EmployeeDrawer.tsx create mode 100644 apps/web/src/pages/employees/components/EmployeeHeader.tsx create mode 100644 apps/web/src/pages/employees/drawers/BenefitDrawer.tsx create mode 100644 apps/web/src/pages/employees/drawers/ContractDrawer.tsx create mode 100644 apps/web/src/pages/employees/drawers/DisciplinarySanctionDrawer.tsx create mode 100644 apps/web/src/pages/employees/drawers/EducationDrawer.tsx create mode 100644 apps/web/src/pages/employees/drawers/FamilyMemberDrawer.tsx create mode 100644 apps/web/src/pages/employees/drawers/IdentityDocumentDrawer.tsx create mode 100644 apps/web/src/pages/employees/drawers/QualificationDrawer.tsx create mode 100644 apps/web/src/pages/employees/drawers/TrainingDrawer.tsx create mode 100644 apps/web/src/pages/employees/employeeSchema.ts create mode 100644 apps/web/src/pages/employees/tabs/BeneficiiTab.tsx create mode 100644 apps/web/src/pages/employees/tabs/CalificariTab.tsx create mode 100644 apps/web/src/pages/employees/tabs/ContracteTab.tsx create mode 100644 apps/web/src/pages/employees/tabs/DocumenteTab.tsx create mode 100644 apps/web/src/pages/employees/tabs/FamilieTab.tsx create mode 100644 apps/web/src/pages/employees/tabs/MedicalTab.tsx create mode 100644 apps/web/src/pages/employees/tabs/PersonalTab.tsx create mode 100644 apps/web/src/pages/employees/tabs/SanctiuniTab.tsx create mode 100644 apps/web/src/pages/employees/tabs/StudiiTab.tsx create mode 100644 apps/web/src/pages/employees/tabs/TrainingTab.tsx create mode 100644 apps/web/src/pages/evaluation/CampaignDetailPage.tsx create mode 100644 apps/web/src/pages/evaluation/EvaluationFormPage.tsx create mode 100644 apps/web/src/pages/evaluation/EvaluationPage.tsx create mode 100644 apps/web/src/pages/evaluation/components/CategoryBadge.tsx create mode 100644 apps/web/src/pages/evaluation/components/ScoreInput.tsx create mode 100644 apps/web/src/pages/evaluation/components/StatusBadge.tsx create mode 100644 apps/web/src/pages/inventory/InventoryDrawer.tsx create mode 100644 apps/web/src/pages/inventory/InventoryPage.tsx create mode 100644 apps/web/src/pages/inventory/StockAdjustModal.tsx create mode 100644 apps/web/src/pages/medical/MedicalControlPage.tsx create mode 100644 apps/web/src/pages/medical/MedicalInboxPage.tsx create mode 100644 apps/web/src/pages/medical/RiskCardsPage.tsx create mode 100644 apps/web/src/styles/global.css create mode 100644 apps/web/tsconfig.json create mode 100644 apps/web/vite.config.ts create mode 100644 docker-compose.coolify.yml create mode 100644 docker-compose.yml create mode 100644 docs/superpowers/plans/2026-05-08-contracts-seed-anexa.md create mode 100644 docs/superpowers/plans/2026-05-12-inventory.md create mode 100644 docs/superpowers/specs/2026-05-08-contracts-seed-anexa-editor-design.md create mode 100644 docs/superpowers/specs/2026-05-12-inventory-design.md create mode 100644 docs/testing/control-medical-scenarios.md create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..faa93f2 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +**/node_modules +**/dist +**/.vite +**/.turbo +.git +.gitignore +*.log +**/.env +**/.env.* diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..79af08c --- /dev/null +++ b/.env.example @@ -0,0 +1,26 @@ +# PostgreSQL +DATABASE_URL="postgresql://hrm:hrm_password@localhost:5432/hrm_medpark?schema=public" + +# Keycloak +KEYCLOAK_URL="http://localhost:8080" +KEYCLOAK_REALM="medpark" +KEYCLOAK_CLIENT_ID="hrm-api" +KEYCLOAK_CLIENT_SECRET="change-me" + +# Redis (BullMQ) +REDIS_HOST="localhost" +REDIS_PORT=6379 + +# MinIO (S3) +MINIO_ENDPOINT="localhost" +MINIO_PORT=9000 +MINIO_ACCESS_KEY="minioadmin" +MINIO_SECRET_KEY="minioadmin" +MINIO_BUCKET="hrm-docs" + +# n8n webhook base URL +N8N_WEBHOOK_BASE="http://localhost:5678/webhook" + +# App +PORT=3001 +NODE_ENV="development" diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..bb8a8ab --- /dev/null +++ b/.gitattributes @@ -0,0 +1,8 @@ +# Normalize line endings. Keep LF for files consumed inside Linux containers. +* text=auto + +Dockerfile text eol=lf +*.sh text eol=lf +*.conf text eol=lf +*.yml text eol=lf +*.yaml text eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dbd31c3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# Dependencies +node_modules/ +.pnpm-store/ + +# Build output +dist/ +build/ +apps/web/dist/ +apps/api/dist/ +*.tsbuildinfo + +# Vite / caches +.vite/ +**/.vite/ +.turbo/ + +# Secrets — never commit. Keep only *.example +.env +.env.* +!.env.example +apps/api/.env +apps/api/.env.* +!apps/api/.env.example +apps/web/.env +apps/web/.env.* +!apps/web/.env.example + +# Runtime data / uploads +storage/ +apps/api/storage/ +*.sqlite +*.db + +# Logs +*.log +npm-debug.log* +pnpm-debug.log* + +# OS / editor +.DS_Store +Thumbs.db +.idea/ +.vscode/* +!.vscode/extensions.json diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..29e010f --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,502 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +# HRM Medpark — Полное описание системы + +> HR-management система для **Medpark International Hospital** (Кишинёв, Молдова), заменяющая Excel/MS Forms процессы для отдела кадров и контроля качества медицинского персонала. +> +> UI — только на румынском (`ro`). Backend сообщения / валидации — также на румынском. + +--- + +## 1. Архитектура + +### Monorepo (pnpm workspace) + +``` +hrm-medpark/ +├── apps/ +│ ├── api/ ← NestJS + Prisma + PostgreSQL +│ └── web/ ← React + Vite + Mantine +├── docker-compose.yml ← Postgres, Redis, Keycloak, MinIO +└── package.json ← root scripts (api:dev, web:dev, db:migrate) +``` + +### Stack + +| Слой | Технологии | +|------------|------------------------------------------------------------------------------------| +| Backend | NestJS 10 (Fastify), Prisma 5, PostgreSQL 16, BullMQ (Redis), nestjs-i18n, Passport-JWT (Keycloak JWKS) | +| Frontend | React 18, Vite, Mantine v7, React Router v6, TanStack Query v5, react-hook-form + Zod, dayjs | +| Auth | Keycloak (внешний IdP), JWT валидация через JWKS | +| Storage | MinIO (S3-совместимый) для DOCX-документов | +| Notif | n8n webhooks (cron-based reminders) | +| Документы | `docx` (npm) — рендер из TipTap-JSON шаблонов (`AnexaTemplate`), редактируются в `/admin/anexa-templates` | + +### Глобальный API префикс + +Все REST-эндпоинты под `/api/v1/...` (через `app.setGlobalPrefix('api/v1')`). +Vite proxy на dev: `/api → http://localhost:3001`. + +--- + +## 2. Аутентификация + +- Токены выдаёт Keycloak. +- `KeycloakStrategy` (passport-jwt) валидирует через JWKS. +- Роли извлекаются из `realm_access.roles` и `resource_access[clientId].roles`. +- Если в токене нет ни одной из 7 HRM-ролей — `UnauthorizedException`. + +### Роли + +| Role | Назначение | +|-------------------|------------------------------------------------------------| +| `hr_admin` | Полный CRUD по сотрудникам, документам, кампаниям, риск-картам | +| `hr_specialist` | CREATE/UPDATE по основным сущностям, без удаления | +| `manager` | Редактирование форм оценки своих подчинённых | +| `nursing_director`| Утверждение финальной категории при оценке | +| `quality_auditor` | Заполняет блоки A-D в формах оценки | +| `medic_familie` | Выдаёт вердикт по контролю медиц. (apt / inapt / etc.) | +| `employee` | Read-only доступ к собственным данным | + +`@Roles(...)` декоратор + `RolesGuard` на каждом контроллере. + +--- + +## 3. База данных (Prisma, 20 моделей) + +Ключевые сущности: + +``` +Employee (1) ──┬── (N) IdentityDocument + ├── (N) FamilyMember + ├── (N) Education + ├── (N) Qualification + ├── (N) Training + ├── (N) DisciplinarySanction + ├── (N) EmploymentContract + ├── (1) Benefit ← upsert (one-to-one) + ├── (1) EmployeeMedicalProfile ← upsert + ├── (N) MedicalCheckup + └── (N) PerformanceEvaluation + +Department (self-referencing tree, parentId) — adjacency list +WorkplaceRiskCard (1) ── (N) EmployeeMedicalProfile ← FK +PerformanceCampaign (1) ── (N) PerformanceEvaluation +``` + +### Reference (read-only) таблицы: +- `DisabilityGrade`, `TaxExemption`, `WorkSchedule` + +### Поля типа `@db.Date` — используются для дат без времени (рождение, экспирация). +### `@db.Decimal` — для денежных и физических величин (зарплата, дозы радиации). + +### Audit log +- `AuditService.logRead(...)` и `logChange({ action: 'CREATE'|'UPDATE'|'DELETE' })`. +- `AuditModule` помечен `@Global()` — доступен везде без явного импорта. +- `PrismaModule` тоже `@Global()`. + +--- + +## 4. Backend — модули + +``` +apps/api/src/modules/ +├── auth/ ← KeycloakStrategy + AuthGuard +├── employees/ ← основной CRUD + 7 sub-resources +│ ├── employees.{controller,service,module}.ts +│ ├── dto/{create,query}-employee.dto.ts +│ └── sub-resources/ +│ ├── identity-documents/ +│ ├── family-members/ +│ ├── educations/ +│ ├── qualifications/ +│ ├── trainings/ +│ ├── disciplinary-sanctions/ +│ ├── benefit/ +│ ├── contracts/ +│ └── sub-resources.service-factory.ts ← общая фабрика subCreate/subUpdate/subRemove +├── departments/ ← дерево отделов +├── reference/ ← read-only справочники, без аудита +├── evaluation/ ← Phase 4 — оценка персонала +│ ├── evaluation.{controller,service,module}.ts +│ ├── dto/{create-campaign,update-form,approve-form}.dto.ts +│ └── workers/evaluation-notifications.processor.ts ← BullMQ +├── medical/ ← Phase 5 — медицинский контроль +│ ├── medical.{controller,module}.ts +│ ├── dto/{risk-card,medical-profile,checkup}.dto.ts +│ └── services/ +│ ├── risk-cards.service.ts +│ ├── medical-profile.service.ts +│ ├── checkup.service.ts +│ ├── bulk.service.ts +│ ├── document-generator.service.ts ← рендер из TipTap-JSON через tiptap-to-docx +│ ├── tiptap-to-docx.ts ← конвертер TipTap doc → docx, поддержка repeatRows + variableChip +│ └── storage.service.ts ← MinIO client +├── admin/ +│ └── anexa-templates/ ← CRUD на AnexaTemplate (only hr_admin), drafts + версии +├── inventory/ ← Vestimentație / Echipament — InventoryItem CRUD + adjust-stock +├── contracts/ ← глобальный список CIM (отдельная страница) +├── notifications/ ← BullMQ daily-expiry cron (08:00 EE/Bucharest) → n8n webhook +│ └── workers/daily-expiry.processor.ts +└── dashboard/ ← агрегированная статистика +``` + +### Sub-resource pattern (employees) + +Все вложенные ресурсы (документы, семья, образование...) идут под: +``` +GET /employees/:employeeId/ +POST /employees/:employeeId/ +PATCH /employees/:employeeId//:id +DELETE /employees/:employeeId//:id +``` + +Сервисы используют общую фабрику `subCreate/subUpdate/subRemove` с проверкой принадлежности к employeeId. Все write-операции пишут в audit log. + +Роли по умолчанию: +- `GET` — все HR роли +- `POST/PATCH` — `hr_admin`, `hr_specialist` +- `DELETE` — только `hr_admin` + +### Особенности + +- **DisciplinarySanctions**: `dataExpirarii = dataAplicarii + 6 месяцев` вычисляется на сервере, не принимается от клиента. +- **Benefit**: используется `prisma.benefit.upsert()` — у сотрудника всегда максимум одна запись. +- **EmployeeMedicalProfile**: `dozaTotalaMsv` — computed поле (`externa + interna`) в response. + +--- + +## 5. Frontend — pages & роутинг + +``` +apps/web/src/ +├── App.tsx ← AppShell + NAV_ITEMS + Routes +├── main.tsx ← Mantine theme (medpark teal #008286, Montserrat) +├── api/ +│ ├── client.ts ← axios baseURL '/api/v1' + bearer token +│ └── types.ts ← все TS-интерфейсы синхронизированные с Prisma +├── pages/ +│ ├── auth/LoginPage.tsx +│ ├── dashboard/DashboardPage.tsx +│ ├── employees/ +│ │ ├── EmployeesPage.tsx ← список + поиск + фильтр +│ │ ├── EmployeeDetailPage.tsx ← header + 10 табов +│ │ ├── employeeSchema.ts ← Zod + IDNP checksum +│ │ ├── components/ +│ │ │ ├── EmployeeHeader.tsx +│ │ │ └── EmployeeDrawer.tsx ← создание / редактирование +│ │ ├── tabs/ +│ │ │ ├── PersonalTab.tsx +│ │ │ ├── DocumenteTab.tsx ← подсветка expirare < 30 дней (amber/red) +│ │ │ ├── FamilieTab.tsx +│ │ │ ├── StudiiTab.tsx +│ │ │ ├── CalificariTab.tsx +│ │ │ ├── TrainingTab.tsx +│ │ │ ├── SanctiuniTab.tsx ← активные (не stinsa) = красная строка +│ │ │ ├── BeneficiiTab.tsx +│ │ │ ├── ContracteTab.tsx +│ │ │ └── MedicalTab.tsx +│ │ └── drawers/ +│ │ └── *Drawer.tsx ← по одному на каждый sub-resource +│ ├── departments/DepartmentsPage.tsx ← дерево с раскрытием +│ ├── evaluation/ +│ │ ├── EvaluationPage.tsx ← список кампаний +│ │ ├── CampaignDetailPage.tsx ← список форм / категорий +│ │ ├── EvaluationFormPage.tsx ← заполнение блоков A-D +│ │ └── components/{ScoreInput,StatusBadge,CategoryBadge}.tsx +│ └── medical/ +│ ├── RiskCardsPage.tsx ← карты риска NU-10-MS-2026 +│ ├── MedicalControlPage.tsx ← bulk-select сотрудников + Generează documente +│ └── MedicalInboxPage.tsx ← inbox для medic_familie +└── styles/global.css ← CSS-переменные бренда +``` + +### Маршрутизация (фрагмент App.tsx) + +``` +/ → DashboardPage +/employees → EmployeesPage +/employees/:id → EmployeeDetailPage +/departments → DepartmentsPage +/evaluation → EvaluationPage +/evaluation/:id → CampaignDetailPage +/evaluation/form/:id → EvaluationFormPage +/risk-cards → RiskCardsPage +/medical → MedicalControlPage +/medic-inbox → MedicalInboxPage +``` + +> Маршруты `/admin/templates` и `/admin/templates/:type` удалены. Бэкенд-API `admin/anexa-templates` (CRUD + версии) сохранён. + +### State management + +- **TanStack Query** — fetch + кэш. Reference data: `staleTime: 300_000` (5 мин). +- Все табы сотрудника шарят один `useQuery(['employee', id])` — нет per-tab fetch'ей. +- Sub-resource записи делают `invalidateQueries(['employee', id])` → весь профиль рефетчится. +- Ключ кэша для медицины: `['medical-profile', employeeId]`, `['medical-checkups', employeeId]`, `['risk-cards']`. + +--- + +## 6. Бизнес-логика — критичные алгоритмы + +### IDNP (Moldovan ID number) — 13 цифр + +Реализовано **дважды**: на бэке (custom validator в DTO) и на фронте (Zod) для live-фидбека. + +```ts +function validateIdnp(idnp: string): boolean { + const weights = [7, 3, 1, 7, 3, 1, 7, 3, 1, 7, 3, 1]; + const sum = weights.reduce((acc, w, i) => acc + w * +idnp[i], 0); + return sum % 10 === +idnp[12]; +} +``` + +### Performance Evaluation — расчёт категории + +``` +function calculateCategory(form): + total = blockA + blockB + blockC + blockD + (testJci * 0.1) + if total >= 90 && expert_score >= threshold → 'superioara' + else if total >= 75 → 'cat_I' + else if total >= 50 → 'cat_II' + else → 'fara_categorie' +``` + +### Eligibility для оценки + +Сотрудник попадает в кампанию если стаж в компании на cutoff > 6 месяцев (по `dataAngajarii` контракта). + +### Anexa-документы (NU-10-MS-2026) + +Генерируются в `document-generator.service.ts` через `docx` библиотеку: + +| Документ | Когда генерируется | +|--------------------------|--------------------------------------------------------| +| Anexa 3 (Fișa solicitare) | при инициации контроля (bulk) | +| Anexa 4 (Fișa evaluare) | при инициации контроля (bulk) | +| Anexa 4B (Suplim. radiații) | если `expusRadiatiiIonizante = true` | +| Anexa 6 (Verdict) | после `medic_familie` ставит вердикт (`/checkups/:id/complete`) | + +DOCX сохраняются в MinIO (`s3://hrm-docs/`), URL пишется в `MedicalCheckup.documenteGenerate` (JSON массив `{name, url, type}`). + +### Скачивание / удаление документов + +- **Скачивание**: фронт извлекает key из `s3://bucket/key`, вызывает `GET /medical/documents/presign?key=...`, открывает presigned URL в новой вкладке. +- **Удаление одного**: `DELETE /medical/checkups/:id/documents?name=...` — удаляет из MinIO И из массива. +- **Удаление всех**: `DELETE /medical/checkups/:id/documents/all` — параллельно убирает все файлы из MinIO + чистит массив. + +### Контроль медицинский — типы + +``` +la_angajare ← перед трудоустройством +periodic ← плановый по карте риска +la_reluarea_activitatii ← после длительного отсутствия +la_incetarea_expunerii ← при увольнении из вредной среды +suplimentar ← по запросу +``` + +При `complete` для типов `la_angajare/periodic/la_reluarea_activitatii` обновляется `EmployeeMedicalProfile.dataUltimControlMedical` через `updateMany`. + +### Notifications (BullMQ) + +`evaluation-notifications.processor.ts` — `@Process('campaign-reminder')`. Постит в n8n webhook с массивом сотрудников. Cron-планирование на 14 дней до ожидаемого срока. + +--- + +## 7. Brand & UX + +### Цвета (Medpark) +- **Teal** `#008286` — primary, акценты, ссылки +- **Charcoal** `#58595b` — основной текст +- **Amber** `#fbb034` — предупреждения (умеренно) +- **Red** `#b11116` — деструктив, истёкшие даты, активные санкции + +### Шрифт +- **Montserrat**, weights 300/500/600/700 (импортируется в `index.html`) + +### Mantine theme + +```ts +const medparkTeal = ['#e6f4f4', ..., '#008286', ..., '#003d3f']; // 10 shades +createTheme({ + fontFamily: "'Montserrat', Arial, sans-serif", + primaryColor: 'medpark', + colors: { medpark: medparkTeal }, +}); +``` + +### Конвенции + +- Заголовки страниц: `` + teal underline (40×3 px, `borderRadius: 2`) +- Таблицы: `borderBottom: '2px solid teal'` на `<thead>`, `borderBottom: '1px solid #e9ecef'` на строках +- Кнопки primary: `background: teal`, `fontWeight: 500`, `height: 40` +- Drawers: `size="xl"`, секции с teal-left-border divider +- Badges по статусам: `medpark` (success), `red` (danger), `gray` (neutral), `orange` (warning) +- DateInput: `valueFormat="DD.MM.YYYY"`, на бэк отправляем `YYYY-MM-DD` (через `dayjs`) + +### Подсветка дат + +```ts +const days = dayjs(dataExpirarii).diff(dayjs(), 'day'); +if (days < 0) return 'red'; // истёкло +if (days < 30) return 'amber'; // истекает скоро +``` + +--- + +## 8. Интернационализация + +- Только румынский (`ro`). +- Backend: nestjs-i18n с файлом `apps/api/i18n/ro/translation.json`. +- Frontend: ключи захардкожены в компонентах (без i18next), либо в `apps/web/src/i18n/ro.json`. + +> Языковой переключатель в UI **отсутствует** — было удалено по требованию. + +--- + +## 9. Workflow разработки + +### Запуск + +```bash +# 1. Инфраструктура +docker compose up -d # postgres, redis, keycloak, minio + +# 2. Миграции (первый раз) +pnpm db:migrate + +# 3. Dev mode +pnpm dev # одновременно api (3001) + web (5173) +# или раздельно: +pnpm api:dev +pnpm web:dev +``` + +### Доступ + +- Frontend: http://localhost:5173 +- API: http://localhost:3001/api/v1 +- Prisma Studio: `pnpm db:studio` +- Keycloak admin: http://localhost:8080 +- MinIO console: http://localhost:9001 (minioadmin/minioadmin) + +### При изменении схемы + +```bash +# отредактировать apps/api/prisma/schema.prisma +pnpm --filter api prisma:migrate dev --name <migration_name> +# Prisma Client регенерится автоматически +``` + +### Линт / типчек + +```bash +pnpm --filter api typecheck +pnpm --filter web typecheck +``` + +--- + +## 10. Соглашения по коду + +### TypeScript +- `apps/web/src/api/types.ts` — единственный источник истины для интерфейсов на фронте; обновляется вручную при изменении Prisma-схемы. +- DTO бэкенда → используют `class-validator` декораторы. + +### Auth в контроллерах +```ts +@Controller('...') +@UseGuards(AuthGuard('jwt'), RolesGuard) +export class ... { + @Get(...) + @Roles('hr_admin', 'hr_specialist') + ...(@Request() req: AuthReq) { + return this.svc.method(..., req.user.id, req.user.role); + } +} +``` + +### Audit +Каждый write-метод в сервисе ОБЯЗАН вызвать `this.audit.logChange({ userId, userRole, action, entity, entityId })`. +Read-методы — `logRead({ userId, userRole, entity, entityId })` для чувствительных данных. + +### React Query mutations +```ts +const mutation = useMutation({ + mutationFn: (data) => apiClient.post(...), + onSuccess: () => { + void qc.invalidateQueries({ queryKey: ['...'] }); + notifications.show({ color: 'medpark', title: '...', message: '...' }); + }, + onError: (err) => { + const msg = (err as any)?.response?.data?.message ?? 'Eroare'; + notifications.show({ color: 'red', title: 'Eroare', message: msg }); + }, +}); +``` + +--- + +## 11. Roadmap & статус + +| Phase | Статус | Что входит | +|------------------------------|--------------|--------------------------------------------------------------| +| Phase 1: Employee master data | ✅ Done | CRUD + 8 sub-resources + drawer + детальная страница | +| Phase 2: Contracts | ⚠️ Частично | Schema + sub-resource controller, но нет специальной страницы | +| Phase 3: Departments | ✅ Done | Tree CRUD | +| Phase 4: Performance Evaluation | ✅ Done | Кампании, формы, утверждение, BullMQ напоминания | +| Phase 5: Medical Control | ✅ Done | Risk Cards, профили, checkups, bulk + DOCX, MinIO, inbox | +| Phase 5b: Anexa template editor | ✅ Done | TipTap v3 редактор шаблонов в `/admin/anexa-templates` (бэкенд + API), repeatRows, verdict.checkbox; **UI редактора удалён из фронтенда** | +| Phase 5c: Inventory | ✅ Done | InventoryItem CRUD, atomic stock $transaction в Benefit upsert | +| Phase 5d: Notifications | ✅ Done | BullMQ daily-expiry cron → n8n webhook (документы, calificări, contracte, medical, sancțiuni) | +| Phase 6: Polish | 🔲 Pending | Дашборды per-role, performance тесты, GDPR DPIA | + +### Pending hardening (TODO) + +- ✅ `POST /auth/dev-login` защищён `NODE_ENV === 'production'` guard (`ALLOW_DEV_LOGIN=true` для тестового продакшена) +- ✅ BullMQ daily cron → n8n webhook (docs/categories/contracts/medical expiry) — `notifications` модуль +- 🔲 Excel HR import (`POST /employees/import` через `exceljs`) — НЕ требование, отложено +- 🔲 Seed data для DisabilityGrade / TaxExemption (department seed готов) +- 🔲 Dev-mode Keycloak bypass (сейчас все API возвращают 401 без валидного JWT) + +--- + +## 12. Где искать что + +| Задача | Файл / директория | +|-------------------------------------|------------------------------------------------------------------| +| Поменять схему БД | `apps/api/prisma/schema.prisma` | +| Добавить эндпоинт | `apps/api/src/modules/<module>/*.controller.ts` | +| Изменить роли доступа | `@Roles(...)` в контроллере | +| Изменить тему / цвета | `apps/web/src/main.tsx` + `apps/web/src/styles/global.css` | +| Поменять навигацию | `apps/web/src/App.tsx` → `NAV_ITEMS` | +| Добавить TypeScript-тип | `apps/web/src/api/types.ts` | +| Добавить sub-resource сотрудника | `apps/api/src/modules/employees/sub-resources/<name>/` | +| Изменить DOCX-документ | `apps/api/src/modules/medical/services/document-generator.service.ts` (рендер) + `tiptap-to-docx.ts` (конвертер) + `/admin/anexa-templates` UI (контент) | +| Поправить cron-нотификации | `apps/api/src/modules/notifications/notifications.service.ts` (правила expiry) + `notifications.module.ts` (cron-расписание) | +| Управление складом | `apps/api/src/modules/inventory/` + `apps/web/src/pages/inventory/` | +| Аудит-логи | таблица `AuditLog`, доступ через `AuditService` | +| Reference-справочники | `apps/api/src/modules/reference/reference.controller.ts` | + +--- + +## 13. Полезные команды + +```bash +# Открыть Prisma Studio (визуальный БД-инспектор) +pnpm db:studio + +# Создать миграцию после изменения schema.prisma +pnpm --filter api exec prisma migrate dev --name <name> + +# Перегенерировать Prisma Client +pnpm --filter api exec prisma generate + +# Type check всего монорепо +pnpm -r typecheck + +# Сбросить БД (только в dev!) +pnpm --filter api exec prisma migrate reset +``` diff --git a/NU-10-MS-2026_2.docx b/NU-10-MS-2026_2.docx new file mode 100644 index 0000000000000000000000000000000000000000..8f382ea5a9adc172570cdce62e649aafcfcb0b53 GIT binary patch literal 126645 zcmc$F1yo&Ik~Z$HA-D#2cXxO9i(7D);O;>~aCe8`F2M<|0m8-IA^bP*b@z17^!)vL zrhCm@>z;M)J!jYcPVL%N`>WbVSq>5k3+&ei!sClR(|1h;F;p<HUtdhne|ln$4z2(P zS0i;VCxD9qqo=(czYyp^;tp_jv37J2AY)-<CL;kjm^qqTJ6H;kX{bvwaFda^xSBYa zo7g!z00hXq04`)gf(ZP-i68+rc5o3OvvPHH;$>oTF|z{Lo47DKIsqI&S1cTz?M+-k zKb<X^oJ`DYO)LRStjx@uOlH5sU~v5fgG`WL9AIJMX6H&mBH;;w_d5~~dkZp>KjHn= zmjIcy{VxHY48N{0{ryHx4wiqn(Xapin<h3+fWP17w+sJGBhbVBr+!SFob0U4Ok6=) zWcqdWziH?UuygtUv~+hc|4+(e_><xoK`noi?qX%_<U;rV>B7|7;h*cl(Za&o3}EhP z=4KDF4Ms;hfRd>Vz|8g6Gbn*9!`a##KtiHy;_RwuVh<VzCeW?Q&W=tlOlEE_u8#J< z%;<mB<L_b^oIo-G&aT#gzdYVQ=-ts7@Xz=CXMLK1TL05sf=2nD@9{tB7x2r*%>m|r zv~v$fXLBYCM@LtHGuQvR^IyV1dNu>NxPT_Oy&dE4g8yt!e^=pu1%UJa8UWk>9RMqU ziTS@}2!0p*M~8sr|5^jA|9Sv_R0F@?$Nql};NLI=e^dj%PgjnAy$1fMA8-XlcmUIH z$N#+=eiQSL4gYuL{2LznpVRuk!SMg6)_({3Z*YEpTmufS>L#Xk|AT=0pTghYi9ml6 z{f`X+6gM3}anR*oZ~lLl{Esns08G^YuCAcy`EP*nSHk}>5(hVXQ-CuF$iH44e-ZtU zQMmlul<{ZD{}{usY4mS0jK7HfV<-U5|Ay%F&v}V|!y4_6dI=X-FS~!o?EGEsKOTX< zaG3usBl#~*>MxS*O{^XM420=74lJnrH=LUau6=w50u1ce7ZJp{jeb!+reE~U<$uVv zN%&R&n*03^Irrc2M>4^`6-pvwE<oliW6nZG@;lf5$AtcOw=VuC*7!TG|C>IT{`L-# zWD{pgfU5x6Z+zk}3jLkQ{(U&Ce;m%=<QM)Hhdsd6#N5Qy1eA988_M?|h(KWeL}>p^ zDVhEo1+o2cM1TAEe@{VwhY9{2On>H_AU6KjcJSvRWB*qo`Y%lU@8J0>(hq{f^w*eN z{xTQfe#<|7XNboWz5@fBK|=>a2hD~5GV;fra`8L79~pV814za5nB3i@LMWFn$uD;W zM`C;-9z-oPPorI?TZG3OCsvY5XUWM}rDBt>GP6gQJ7IB4A=gYMPAjE6EFpOgiD$ZZ zlji&D8OHPJb=1?_xca<Rqiq=&{q^<rpP627CYw|6fe&zes8fw{H}XMok(MJm{QOTl z!<M)^Y=fwQY>+taTm21F(?U-*LO;`1EATkQ@Ogto5uBbY^cH<Rn~@;y$``LDC>w(U ztjXv41#@82sG5B|1*NEt*G(N4<}?%lQq|!Kz^7f?#hy0spE~;4od$2+^TZq`>nwu< zv%RBpkUKt$-F-+o{Q#zr82VwV(9SI#E0{PZG{*%S_kALUxKUdaTvR|3R|o56tf3c% zOQ2ufzDV?RAYnk{ng&PtM@a|9WKoAG+V^I9mSu2bzV<(Y^!glDqXZinL*C6yG!C#r zSEnVU*h21B!s!td<4*|?v{%edn-q1r`YVn>U~@NXvaL{XTSemKq-F$Y0|e=VvS`n$ zia#oQ>h>Hyt!yzvaB39mdf~-c!5D!*YJ!VlZd|0Y#Ek<Jxf=Fz@r-!-8wuFQQ`BP9 z<-vc_r!%z4&R}-k0>6-e$!#$;P+rnhTNDoZHPgh~T^;WA^%AA)7E+M8g~BPCK+~b` z1LHB^#bnBJmHqe%)`zjC1m}#>UcC0}J`b~9uF9b})cE42i??81a#JuQ`C7?8mJoG@ z5?lt+p)z~~KWJ8Wez>)X1G&&ptE^)sNk8w=4=&CDxfL(>okCf=hsd==IdvX86^7!0 zuas?Ns7s#=eJj#tfvH~4w^44<G5(@4M<T@DT<6EbQYame*L5V`o)rU)eU(dy0%eS^ zB`Nt+PH8_p(+JFM#Y9FHu%pA*SA@~pH~S^5z!6|Yql14&lI&)YqRvUoyk8XK8VTkv zJo=C@S+bW&qW+Y36olWZEsE-_(Sue5vDwAD*#)!N<^PIJI*6bUpKXGwv!u553E%$} znuh3dg1KE>c#dE;2&WdIsWKNg>M6e}=Su8+`NODfCW|z8V}qOm-wf4bcbLsLrQ<Bj zl^M*D_PV5}!^0orI?nI8Wx7(k8U~ZV<X`T&ykh&p-~<ElD8xj=WBd-<qT%%yZ)Exm z<FvxyNk{jadlhCG)#@sHWYr&KHGQBO;K|3zu1ch8Ho5}5E)MsO(uliXP~%{9q;@JK zFL%-$jXM2)UOrks<UduRKiytbq)id~QSke>8F+q*<ttD<ELI$(P~<`emWl^&zN$89 zCF#Pd(fy2k;BMkP668J_^zbLsa@1*fSMu3FRR;}*yYnRp8Epjet=Bt0b9dO;cSOnH z$k+MB@$0+zuJX2ZA8k!d8%JT6guHuSMZ++TNs{dP^j5f0J^iAB!B%0hdL&t4JK_n5 zC$^%4<?hwnLN-1M7cbDA<AsaRw(+zFH>kVUF#qJ?cwU+Nc77(%1qe%#hBlvCny|GC zZBB0McJJ+FB7(HUsYnSHqO_z5D$^9an~ou39ATm%S8dGWj0Ea^DUX$s+}InXxU1io zVlZbt*f$_59g1oXDJ98gt&`Y5O#c?2nD?%RLMeS_bC;ex3{s<^MMdBEXQQcxVpfPp zFXo3Hg+nO?AHlO7_JidMB_e73Ljr9<`Em?QBP-6~r-|ahY*=q|7U1a9v@DX`!db!v zJCddY48x1~(0yus>9@x@u8ks7Z;_c1-}e56TTN4;_H&(RG?hm$ZhALT<XCTWJq$Wu zxDwZuz0FsTnI38B1J!=2eAn^j6G|r>yIVPY6fJw7(#82^xv|eZxaJV7=|~KKs0ewS zk>gCN>8@jcE747D>kkfAQr|)rNdk!=G{doj^3xdUMENI})0u-4%0pQUtwULkiM8mQ zb_q4%UTd*^pAJdqIht~T8sbgVec&$_z|uEoa}~pm72{1UZ;{0Vu7;t4M_ZrMw-V}{ z_hFzSX=9w#NiQU;J6x%(lcp>3iG6N_ZA;&CktuAW`{!_n4`Y>V(7caAI0!|z>{k1Z zg`I{Q>EbK@9)*`uQDvry`8zx4WJcwE4ma#D*8Vx1r>8Owst3*tiu1t8cc3N)-N$b~ z0*9!%a%Y^^zWE~8e5q}4&q;H|;b%1o{6wJSY!HJ>NYXrh?`V{@(*e}3W|(}P5sSSv zaGg#az8fusTJ@Nanh1Exx;uO2LO|f%R8S$rux{8{##8dN@JSTxY7@V0<T=44BwwiV z3mYRZOsdxKnHh(#u8w;fo9KO}VwNNK{H9bz$Yfso)BYFbNPy|rhU#1av8XQN#eT;6 zODX{+=+1==AcZ$}_Ekxo;nh9kOoe#O`h1sS?qaWaGO&sCdL<2bLori<3>m4v+M`rs z0+!8Bnb^~$GbFb~8&m;ReJAl0_Nk}pE}*)LVU0JT_2yoYi>@&-*qOCddV0xiQf{7F zr9eCugJZ+-WKN^WpOhm|{B>uOcSp3-3%OH*)=)JV%u_~?qz?Pw4YQl4Yr1#-B{gCp zfjP%|o`(W0p2$E&<P$sgEX&|`L$D8y7lQ=6OR9En=<{NkaBy-s>F6W9DGyUiwemNf zs{C{@lb@T!=4Xtxt&0MZCh9ZXejX9FM1BI}A+;;sug*l{_?h{-w_?=YT;jMzmlt+7 z&bcnRtB1fO2kxQW1ITT`I#+>OGZ<N)I`EALZxedH<+4l+o>GK%-oG#qb%1Z<Lui|d z4cJ0glkxZ-EkK45NE&`%5(sIWdd)vCRJ}!jA5qZN<e^J>^PZxBnNy%7dB<Ck7@gbJ z3^sHOl^7@(yiJ@Lf@UgL$N>B}mdmpsH&0La4TFPtw>G6z$Ma;47j2&J?HlA?nZ*5w z)%e0U<I+(`SGSQQN2_yVcIiJ%i2+BdIFFu!uC2pusX|)j#I!gvynLr|dFYQ<Cwgw9 z_e`|Db|nkP&x$Jk%VdOhPU2+F{q{o5W>U!lsfkfYWe0tdI2>{2DR_1ej{#4IAdkP& z{Zge;79|K#Dntw&UfTEwo5NlX=q+H()QyWc@*XB(RkuK8oDA=~bIk8Ve;8BFcw#ih zqa}|Cq)hqY2Hp8|`z={m7vkUvtdOUuJk~a;+}p76W&~$Uz&sAnV%7yfh^VrGIAqfO z@Ce&`lYEhsdTd7J+`i3yNxiJVA2yjrwf-@Gs5#|?_;AF~Dqm+D=K<0HJgPEU5`)N_ z$|-o-mi1tJl+^v;*<nzDw%^q}UD0Qy#08m9@te$4;>(#P@4;D9bPf80?7L2Gh|`VM z{5k^QlobMQPD1%DPG{YqBv0YkOpoC5_)MU*XXTicF~!WiK;loo)jo+2+fT8n6mPor zAwC+n*2{JJ8_78NQ&4vuJ>5XU4Wh`%eRS}JUz6B+>g{=XVw#O*f<>u9B8W>x@*8e= z-F*E5+=Cit7yY2k2I-fP7}gR^i`P=H2Xr-n5xtIKx2N3Bt>dv;kkoY>eKI>YbmgW` zo{H$d69XF^JTUz-R>?0P+&dqxI0@WAvm?Lbw?kUBVqG^xB&-alZ`<D%Fz*1?N_syG zY=1#oNHy$ou=%_Z+G#|!^Ypo(jbpx4ZeDvc=F|*zH7{*ZfQYulr?nyw8B%>xQF>Ru zcrcB9N?nT5?jwF{<CF({7Ny;3@$JD)bOaku*bs-nX5f$10fy$aQvKbHieu_LCQQT1 z_e?S!xoL7=)l7EM4DzUqE%w_4JY+q!yB|o`9U%QuBJH^fB_Lsa5VuGgdIz;wIoP`c z-OF+ac-hB24&JAU!ScAaGOY}=xh5>L?0)D`Gh$kZ@ZI~+1G1KkKHWFqasyM*ZM)_{ z;?Ecto46-z?PzA?YEC0Rb;(ZW(3qKQa8}ugArm^UoWK(2NGOt(wRyWKu|6u_``a2} zZvW^Q1p=q$d7%g^r7t66@(U=T#5>Nm3B0FSwq;A5P(<mt)jH_deLR13W-E}9PO%)Q z%68@=YdLc77Nv(AADm#jT4eZSG?cDkO`?DEhQ)#JbH*j69@EB<K^=zacUuyhCN*`h z!}SD%wyZ0+!8B0V^hV|n?G^VHvpgG2MA;$b%lb~z!>RHyC==fIP2951Kt;GEd8~E7 z0KBsevswonq<eYJAh8eT3UL8#?Sto~aegmUimLE#2&b9`EovI+3|49!+4n6YQR9~o zi{2!G5l?X=3)o1sMRm_`+7oMC7^%6j<|_Kj?AwKz&0461wI{_Qt|Z#wiO}Z(1db+7 zI>88r#rY_OtoC|adTOe+mn0nwizgVbVn>_3cro8TfoMw#44QTD8Yx;|VQ@otUxRJG z-FwiQm_Wa;WQ_8<8H%;ZFldS!Np*B$hA_LR-Y4{8YIITkgoe)h*9tY>afiw#=os&d zS8Ua^JL}ydBlrEF+16LnROj=OU3yC9Z)5vJnKS*+50rpPe#FkI3OoKxmyEbTXGS&8 zoF`YIGuD#@wL^^j+Xtg-OuZc}k2f+%gh!+pgD(vkzCi+R%>a_Stp3hc5xPLKIl|_1 zw93W7LFIl1uXHE^;TrTHED1?=(ga3czBt;1pNY`362v3-=@57XouRH%JkIJtSoUu7 zA;RrIrZ)s?B>jgF2kRd*sqv9x!UA=<@~8CV*0~epl;g+~>c_!H(44*VpQ>@<tQzZj zzbx%D%OEkzlOfuD0LzqPg#+;6a=gQuG0Bv_r$*V_8<Hr2cscyoWzm=&u=Ybv$bUpP z)<9yc2$xk+8s>uxI2YyCDa6^~8^>^DH@vW%xf2;4`fJkYBh+Z`gf~W}z9RRG{WH67 z3bIy8a39Y0&<e^(!&p?6Rzf#)ao&lwPut>12RUZ5q1vr>>K>eMSTATETnYJaEF85k zy*+-EfPHqRY3BA#3p9fG37X;;s8SzR`En*2wuVEVD8I$=q{+7PjG6x2)>fq3wRsx# z`h=fYldXv+)l(92ayBJgyN4{2NuWC>5=XE*^6Rh$3bRn!=G`9L%t;5u6uK$>L277D z9^sH?9K-D67l8z*5j6p<U(4Kwi22Fxe?}9akD!a-AC~0Y@i9|RyY8qb=U%f}*UM6f zY_mNA`h&yXwP0U2Q`oGPF>FjB(NICeT|z#5k10U52~XcN(5plj{b==r^eP)2+gsY& zij7N^*HCyLRlyVvouk~(@>D8>=B~H<^$g~23X_m$+_mZZxq<gAr31(v-F!pIwP<_i zJW<?5uTL~;^|%99XcyQReqz?IK$Cb&LB>)#kUK04-u=R1iSRug$R^y3e@QRr=r}fn zpup7F2P2hJ5+=ft!_NKgi^;habIJupTV@8W853QD4}rsUgfD=9)DO3IjaeJyd`6f^ z19-ahMuJ=s;TNV4K<nBM7jbMn$v(lOP8@Ao(R#WWy;RSwn_ca_Ej71}0k-PpB``%# z7_y6qMW`S8-|f)T9VrpX1=K5lI^@WKptJm5*QKa2CeEHA9Y_OS43&;yteKo?!H&ix ztYTIL4mqnuE5HCcK-2pb-3j+#j9r?3R#R{%&8rNlCs1xilx}VlpUp?mEWI&JPS#^u zFfL|3@pWPmbHz-0#5aVr&^mqAZg{?N$(ewAt4;8RhWHGHo6<gX4P1%<Iwi+AG4P}Q z_E6~U9zsi|z=FQqnyhRjG_NZKwTSw1RLHg44OF7PPQd6z`v%v(;|N+1U{H0W3T(-0 z!A^_5*!*q(mLuaE7rq%xA~A3Zn2&F?+Y>08E2%iTj^QzMbEq2U72oI{eit4e$I>;V z7PqvEWUw9jSi_SDfILEFJmeadn!$z_qeM!r)}DdMoyFE`p=*X59iq^7z@|TX2lsLH z6z~~ijjDjqMzTNtK8dttaeTQaLj*AcV_nwO2dPVrsXQbU|9w!{Y-l6+L{T2LMzbhs zf0uZe)LCB6-mt8!vi8jU$<}_a;MikOag0D}f-+i{TzHAAr@Pt{yFn9ty+G1wWN0ev z9TDB#;NVy==Fr&7$M#c8&4^A!whhb^R}q(rXCZ@u6`WNi!nz+924tF%+F#22^x3Wf z@6r$BEI-K)-4W>{97k{{qUisS7M-(Q5x;}3bprFe-Ly8{TqC}YE(<?Fl<3a2-DSc$ z$$nl8WP#&nFA+vg;{Cj}(3X89*I1{LocTVCoITGh5_lmY7CmT=6#SKg3SyJ;Iqkd~ z<PJW2kcxW<+x7Vkze4b(g})1bUA?RCY}4-h(xKAl2m3Xgt&2!aOI1-`maVT+&5(i0 zU<NchOjRN!Kv4Nd$xtJc>CSasl$}OQE$Se+PKBCrmRbaPP3+b`A|63!dTq(gO^aN1 zF>FMmqyZ}HKu*L-r*9ABM5@O+1LU^#+9GNse0`n?10}G>FCHHjdvvnvkM6rJ4ZiC} z+EP}hw%+>NejZ9SYpL>EQ8eky>Zw&dozt`>(wahwZ<1P#vvkp#=9pb2usGRs?p~O_ zL19P*w(E3_2O33IQ?_?8t-OP2FBVd>jaKqWGqYdJ<QFf*BAj4BAt30v_rJZqMc{4t z+WA$7;<<1PCGnZBHZU>-2ebyhlOv1RUNRoR^?~CRM_{~#K+WBvU!bthuQ<@F36g3; z_;MXKxe<MF<vB80%netoV9qnrV||J2-W(EWb=cpKIFypC8S?4vS5?Noz)$6g)tO6| zqZ;oTGn$pdT9Gm~sXn}wfa>WE>3M{o_(18Ca1qq?6$OK_+Ij{>=XAy)SnNx~;rclB z_moffMoFgOwo&Pu-6wt}v-mQpW`2}Hb+htS6H%z9J1kA6NBPzAh<fL#YyP8e+1P}F z`H$F|>YEWt!iL_hHIVoPk07gI8^5NPb|<h{Oa6$YRUPErx{+2urS2I=$)x)OS%8Pk zashzERN_AD*@gX@I75Pf8COjm_KM<<pDWO?-JVF<I+dy@KU1=cpo(=L*2LJnTS>YL zV^S;fTHI2R-CP*wNTnwMQ3)=ePxlRq1#D#vMCS!dqWtp}Q$;M?-ouy3nz!GAqOL%T zCKyaHpWSxZgJziCB{Mu&pdmTLOgw!8qc{Ga11{IVUjnYsdr-g~JmCTbWRztPxgDu( z7xr!`vgjTPetN6kMA`O&vH;VeYT8G^;z>?riXP0B9}L^3tRBKhGs+<@w{=NFOck>E z^DuoHIe7YeMo9z}m?+(D2C)NKmI`nglxb41AiySEn(y4Y+Vz<0`i%)9sfL1iMt+te zs9O}g&}SVfsUZ>=*%yaa<%J*@#+ks0IKUZIxGgTB&LWh51(J?AX9_0TzRTDK7uYhf zA@fK|d~>&9$9VsO+ty}W0-=8|Ty*cFxM=|iMsR$tXrL8VK;;gx8&aFW_>p}69e!Tk zu+dew{?pOo?UH&IhK*;p-MGDYSJ74#mQy&iJ`A}WII%<zM){@a=Q$)A$G7EUezkls z8g0#bRtz`J2MPR<>SrE8?-CCMaG9A_uvS?&-^I5=C1FU9HATXLleclIc%HB!<;1v$ z7X}K-r`jk{k*)V)1j{7&y@e2zNHCbf2|c0ogU^41)V62LNBzo9j^BERlDe_WQI_-8 z+kv7%>LmzOQm1e{Qd0uEQri0JaRt73Vy7{`|AHbpVK2AQd#Tr>%CT=P0-h^~Yml|y z)la&#aI0ps%W8U);$okX>1wkmtxd8p31)%F`uttzSB!U-9baF2Kxu-J@<JWP$RvRC zfu>5m{|D-}6Tw?#*0kDQ4Y7CO)X>{s22y5AXvlFXim{BIq~X7PtD%-#3yX<KVlD(v zk%h!P94H%dqGuzYU-n9oDD}(0%d-e_>MM|ZOyTvdmo~LJNIl_P1RU3hPh*I9potLw zNZm_Nfy~m`*EyH$3NWU4J5i-J>!^$|;KH5d2spp!j8g!qp7mav09?+F>1Ahq>&tb# zoGa7Ji{Fgk1h9{_qqnfk0QvOG-L<gCt#Ero=%MdsZco1&&^L&6sHLk7>h8mZ8_EO5 zgN@D0y0Hu*9ovKKF&*3{<!$OxOV-LTw4dDANOeGb^z6~4LlNe^;S(Ha8RZHQO}=$1 zdfD8J>Vq6i*?7^{H)oNU0gPy60MGWWlv?L=lo6*#e;>WEb)~tm1>b`P9xU{D=U=ql zet~6El=r@m4!OcCl5ov;Jk4$=;W^Rm+7i$maM;FaGn~y@u1EHw2#P#@k=G!1{_d0Q zj<^}pnCWI7(j#}Au<S~gM-OB##wXVK6jEZ=U9m9Vh&~T^AIjsC;#<7(wGr{K#7Y^e zZ#9ORc6Z!kxgg@rjPV|7O(31v5`wGoMt<uYC0#@j)d^|sF2ZRC2AX7P=ki#vk5b{Y z(;8|nY!}H@O0boAAJ+SOf4H%ylNuCZMX=t)p*L>E&(jDqW!uj&)5)KlzcX$bW1mNo zlG|<J?Qzr%_rKP`5wSD#11orBbjndtGW86Xo5S45DsF%wW(vAjWn%BZT#s4_iMF2N zT9rayF`Q*vnq6(>T5ew!1UvER@Z`SaQjS#;1LBm>03X*)&eL0mQ4=C9lzTTIxIN?i z@_9z==AXzLofKCO_^ir`XAf36A<`5#y;-IQ4|-)b>_>`Rny~k6)DRyO*=?HXw?2(9 zTh#G(1ggIRS-##GQ1K<wFD8xO>WgqXSxk!-L*>pwuL*7zA!@e=g0#F-Ai;@yAMFJL zbz^I|Jjm1J-85Y2K?8s02r$0sjQjG-%4#3G5L>^tN+8@*LwpQ|<B2H6X)T{gi%Wlh z+|tcU<=Riu=*g_BQhMQ_{Vni_^ZMA)2=Z9w*$DUNncVXx!cQ)$_JLOn0qN%e2#6np z=cad@!`Vhwjz$|it_e-GXkC!bAM=u6M!-Kvb1O}<j_8ElHYz0-#Ar(55zw*kQSbN% zEAx!C?nC?_1gzb`y{jvjq&Q96KEb$?TMOuJQWD^bAqRi$cO9+fas2K{64WvP!0?m< zA3x8TMAXjrjQozTqeD{=V1BJMey{)Sj8d>fNbM+r(Ox1+35xjdMBhRs8ex*LYZUq< z!Bqp_+?R!<5qECRH>y2EA5hRMqdR*bskx(5)v|y#j|;Y2G)SJ)_`E($oV0&oyzwGb z(MS(4e0rk7DX-hh(q@l}bbX4*7Mi#wJ&NC?U*J>n)=M#0<iTmg^uvr)>Di*-0t4WK zZZI>U<!(uKK$#Ij3VnUGuY~n$bH+$<Fv<2TIvuPhRc2u(@FDegpJW{=G~#Yjp9f^w zeq*^OGxJf%AKU9SE8}Gxy3KEcbQ(o+M6z@rfZsqt*Yn)AP#d;`sO$h7+H={&BlIqD zrvT6Qy%YRr+O+9ajFEY7Xu%z3X-Y0B52ue~r`SV6?~K%%N-BXom(N=QU9nlE(Djzb zKRB92S4Y>3zHDvb#s{%QYmD`NPHIT$QK$RtV<m}-yPK9$=gfWGTwQNsGYQ~r9c`<; zb3x1yFGJ&Gnw#V;VkEWM^tC!Dl~Y`dDt$vbO369h<{T+eY}?JVw))-{THCn2ABX6} zmbe0qX2{lmL|mFa9|gF=Xwo<-Z0Xk#h=cqoQ(yTYq__>y0apt+@`QYvLMo_P38tPc z5cSo>l|E~pf6kCZcVUyR!hg@y<hW?a`tnUU^`OQEXM~a1%W6W5iD~FX*;2<W2oLZQ zKy_a1yt*Ary5z~vJwB72+MDy;SjXU#r`7@i#`g|etM?+@0eMhxzP&h^c?8Hy3QCae z0#+oV5oNc8yaya2O?L{;3d(@4@g-qA{3V5xo%%_J(2LO<HdZ+4u!~P&foJ1R1z~vy zQminjE=UIs*BiPuG3Q9WB5ZA#p&>hD=LUW6;fJ9YyZWE|`>(Q>)5XAUw>DtSD^at> zSJv!vKW+VRu=lAG6s5Cc4$*O~^;TMD<dsel)O&x=D3T8qxjrvwVBcf?MEt7Ru&7D? zs>thESk*ZP(~d;M19F+cIX#fY5>{{t(D<hjgPfsN(O_ImkSZe7XJG}9<V>o?q5(In zMyqim;M1#hE4R!|A3PW@g;5YX&U$!fDE;CY2~pf5F2Q!8lruyq8zIawMI-}N!9QZ~ zqS5?psc|?zsd!o4%x=b&av{B>f~yssLsUYwNo%s_u=_S$A84@Xknw?d{z_!i%9LwH zV(Mr2V?e0~T7DehSlXdLMo)r?uFZ!)_ZROxj^Kv)*iXhof0%=$C?J<iAUZ-C0{6J2 z?_R<<pgsO6fifnE`+*(GH;TJ0=O#1!>o##11|+IVwqi9*Ne56xQfE`En-;O`;U^*j zwQT$h50A$4?qga1<yW*K83le0Pr*Y7ZsN7q5HE;f%R7MY?S()x`bHu;Ta#r+VuFVO zxOjL6tHrZF7&5%m9U2L^gGc_Lp8Q2`q>~amdmDW-;fVGHh-}lJ4r(s##+BsvuQv;H zoa{|&lW|=u;sIqht3g~Mntbp32#8Efk{2XVm$}!jrq$uJ*(BPCGSM~q@MCX+p0hHP z8?=_8@YfEHV3K!^8Q0N=51~ZE!HJS4p$~HMSy>daZmB7C#-^?9<=*ZIYvx^6>H%k) z-+Dxdq|-C)2ua1zl+~s&*?U>&a-jIU<5VYWtRqxQAZzS(?Qr{Am{^aYnPZq;sSsQU zxDFI=={q;b*Nb%c#p4v`Eb?JN3Bi?d3Nzwl)vjw+jr5`9EE$pZcFl0#@z&QOo0{t+ zS|atSR92*^cHM)Cc4*_n;cn|IvUWmJAK}acTJ4@e!EH4m4w2CcJ(~pf_~>49*XAK& z#mQseHO?9$9q?-cv>w}IsA>46!6QmZD)o*2?vMd1G-t>4K|BU)P#Ig4oW~VD($$N_ zUL-ES?MRSc4<^Xx+Yve<to@deDK76WRbnGDg!3VT_r+23w>b^Br7x5)UvFyR{XXma zVXX73S&X0x*4Lp4cxMxJ%EoWZkxN3=*@jpRc94(FbB)+vv6U57#}C6a`0hqNWT$tQ z%(&pteSkpr6G!3CWKW|#W*3Yw%rG&%#)6(G&7Q=9U7G)BI%fod%g9gAo=GHR)79ps zNWYJfF~xtm#22p*qZJKQ{fe&~#K9>%xg6j9v|e8Ojsy%rBt|cEdE~k_e!sUU@`Na7 zDiZj{Rz@bXy?1v%#e1lI@Y_jWEQ&Ve8Y*K!j-j@=<=FKtM^3Nj4R_Vj`dY&Q(?gW= zu;&90hD5wUK}&@A<zO!nna6?Hk4t++_+uN_Cu{vEoU|FP#@&pP#t1`EIVLeC%AC^t zGfCJ&-9i-gC>yc?wp&qOIzL)(+ytC^ge;+_sNkBk9-SVkoN&jq!iQNHd_O^dbB(Wu zUw-Bhtd`U1SJ1RN3kZ3l)KyJGzKwK*ImX}mkxG2MR4__j$?M8>VL4L26xot)sF&0C zRrvEuv@O<pL|lWTHp<J9u{RO6BFH+*B~x?0FI%eGqr$3Gks%0fyg>1DQ6-zkbKOJQ z^LfonPDy_D7H{R0I{s09ejgIqly+$ESY={9wX9a>W?Ib1q1!p%$U=9Aq`iQZF2oib zC*OCJMYqtNF)1!pm`9gBpJw<lM~Hm(m`n`q_0YIV{t<oR!(OVlb*aO-@u<G8)(UWz zd8F)QCt6Q*9=b`Vhh-a@1GsCVG0}-{>~W{?18&97=T}X6)GuE;z0pVBP!uKcYuj6+ ziy7Rvaqfzt0WO0`Z!7Fw#jDmW?2~Q5`yJ4$pZ$E<rd0(K43Slwyd=EY>_WkP(Z1b) zSIh^eE5L_8qB<nR7mtYc?$fzjiHKfjm+BJ8-92eb$vhDK#KZXTL*2+Ma~VBZd48Ye z;AX*mW&C8#S>=26Y2wX9=W|-pBUKF*+CBTDu9^IRP~=G}C*DD_$ol{}Z^(sp$(Pd< z!;Mp0*et&)PM{T6miCv!mqd&;fgul-?m6$N6uML1_R>ZVn&ovUk2$^t#!<(Wh}mu2 zhsdmx`4xgxr0+rJ^HEY`hc@Y7wUa=UJAuoK#DhSf>5@FCY`V&h-pRDfeGo!w>u2C1 zd2qn5B==)c-_yv&3{n?&Ylu>+9MB%#+@=%a^ZPf2Nm&Ja+;V_Bgq_dHHDxPm#Skvy z*B78_`#OFi!bnbC)?%Sh!>6w=O^7J|7jL*5wDSm_X?Wz|<=rmZ!Y!_yMEqs&>V_@e z>_siN^1qFFsvt|^ir$}o9NN~ge8WS=oA7-=b4Gubwhp@k(js9;?d>rE3+lb(S4xA> zMG1$}5AloJ*JkZxfFXtkM2C2{)S7d?#0uZRYZADGWT7S%8BCv+BC6Byf_`$*qM1=O zn1Xs%es8x@6oRq#Fdeqa$+tO@HD#&Y$(YU5Pr*L(#6Vp(LI@A*KsJLuX|#6BX@nl= z+QeY5ks1fABg)MWT%<Ew9bj?m1JNjCqNqG1mMv!%7yZKDVSCT}Z@!4CElGfp@|{l} zxww593VkRy8z+ywu01lr^>Goe<dB-412?`+?^H60HNTtt^ut^D?&`MdMzE>whlC<9 z_xL043PVOu)_1<f5KcpF&y}#V({l-~+52y+eVYOTOJ47?T3rcKX=1lVauJg3z9On+ z0YZro`0es@9UNg^tf?3Hv?$rk9WhdogMfe!<jwh)plwZw!IZaM2}5El2mNfXOr#<! zmQgpe7X@gac6;PdibuhnzEXaQMNR5I>M`RI<udGhGgz7eziCTl<wzG}pMW{UDc!&1 zs<DY+Znn4}`Uo?0?wo>r$QCp1|3$@*3wIvHNL)2{=G~V9V18iR%~l(}#Sr{=<%FI7 zz)<MfSMA1(n9@Xaj!3U$bPkzRbMaWvPgc;m6jADU#M>FkJ=S~+E?aZ)i8A(*Ij886 zh_`qu<m5IK{t4(DH|{X?khlt;0l&3cSF+5kh$*!W<Y3L0<Q7On=Kv{YsSk7!Y?dE+ zF)^leySemQY9Jz$UHAL2-9p}Ku`}{}V}>}W=->waF1vSv^W_xUYyM>`bVanEkeafm z<8p)-VpG?q)_i&7zI>Otth)XbJjWR)Wu3V=(HKit9RJSt2OCP#+Zde^#ksqL;mGHv z3#-(71LCqsWW7EAc<JSWDL%d9cg7~D*z5}jQGTh&myAY?^(x9Sot*S@_h4o%JIgeE zIEEz2<0xtJJL6)oIl5Nh5M(iA)&xPMj4X17dAJVA_~CZdU2+_vb5FM#U=BTeT+crd zQPFiFtt%LMM0yIrKh=u*l%ok!Q#Ip>B|s1yGXw_9J4^rM$|DY;4xhAmq*q{Awmv98 z__S~<_sx(-<48rNq=>L$ZkFAzzG89Zw1nL)Vd$XKR4gQscjYj%m|Odl04+vt1hBuu z$8p2qj>ds+6bS3}R$=n`m~^3#^+m>G;2Q%96sh3(7P~mVKpC~&UE4ha!nYBYDyIdR z*%L>jm+2!ba<^&ZMo_LP2%2Y3uWH)R1UBY2GVXjBi6`n6w7P><_xI%Tdxjkh9mDbk zk2(`&JFi8CL=`Fgnk#yR=recLO;&nOq8^CBy9?t5mYhYU!Uw>~RIUsB-piDSoq*m3 zF+oYDj((5ma@$7xE%fB@a=eY4)-8J%r_9%teVE(H3Czr<zNAHKIs<SDm?Wz)Q|*8} z``}>=j!E5oFWlWxh_YYTYkDGcChIAl%;OUTix!MEPg<qm%Hem!abC)Y`2|U*_RbW@ zOjO@sML5{sFiO(UfcJ}k4Z#5lS-Q!q;P^PwlU>naj@idh<h2;?5rRc8X2FQtFX{ue z6D85X&zVST{qv99mx5zZuL14}PKlTi^F^fkxynZCc5kpy8d<Aj))<bK7!}Aw2RsHs zoNh9B3>P&kNfxP<vF6qnxg#dw=WWZ9+4BT$T5~I@8;{Bb1<y#<cTMCkwxGN9m@Q39 z_=34qD#ypbNB0o0L%e~o=duSCdoskk1Ar#c$AITmQ7^8O#Gk5l3<!qgF?w7uRf1X{ z-4BxA8^-5+Xz`!jKR(^?xZeBXZR4PIt&FARimCWMp<#Q?0pe|X0ZG_Ie<<6R2h4>g zj9!>ces%&@F~eb!c6f-Tz}CGmk+2<xBQtYqy+!D|)y1>!p0jQ!{X%w<L<P7a0x;<n zTP9@R&#<`cbtlK=(feVVO|vF0c#}^huxl^{k<C2-PATN;?<CKCJ2F;1PIEeLu$QFe zF!C*Jmdj#SW7G8nJqjZYq#l?-MCq24mXH|tCuhG>CkH*Y`CyA;I3J>_55<Vy$wJm= zU=J&EZt?;X+6@rwdN_7%0t00+FBnib4qtzk`T^$|AzR<;LCSCS*(3XQ_Z7Z}Y^?$W zABR`NI&7K3kD|%dZ6js$e7{oT+D`6O49reIy7eU@<zRjcag|#{`@mFnH9$Fyfq8+| zuABwCq6Bsz;F;o1e%{IGJ6Elnz9l!pacma|zZ)19k&ADB@xX+i3)oX~(BtqeMLRj) zf_MlTUa9I!#Vq!Zf&eCLU)&kNQ?dcGcH3oiBzD|@;1A2r@6newv{DIOsP|R$S#JYP zNli(xap$CoO^HXwcS$e(?Sx3Zk`7^Gp&(R3(CQ7MzY9?kRV5waD5vjp4A)*Kb$^OH zVU|2_vI*#M{5h}m)JveGjh0qSvK7)3E$NVaWzV7GC7SwGyhL=ETit-&EDgbcc7{GB zDFaqDut?m66d@}%SIIH76!6j)dX44RRmyWYmB@OT{v;(Mz?@hO8QKnk#rjqY0cHRJ zFIkeFoSbb?v6RUsfKNC%DU?ALhKJgEvr2sZU6GWDUqrpdAloIk)+K#L{bIV4+2QSe z6e?WOh|V_}f3R|DaYs(&Q-}H&T6HIiMx|>Dt__iIb)LT3`DhayAF&3xS)CR|EQXyL zgHsmabLC8i>e0R&h=YAHnoZM@SuWc;LGAEl4UKQ2^@kC{OdYzuq9UXMYu=?GM466< z1WGt%RPhEyc~@hwn=pC1zh*02WaL2uBYI-W#fD2!5&^CZ>JYP0aJR9VfMg~XUnC3k zOQO<iCUkNG1hKaTa)$Lfo=-e_clCXfGw5E-hF?<n%p-9D(2a_DVn-iMkCBe!k62X7 zB{*WB>kNEJ6jO>UeW?|(4AUa4uv52fVM?MqYS>js5$@C)HY6rpf~-uma}N012<G#h zK23>6^|@_<HU*=ZzZl4z$?@uUStF_}_y@HOa*<&Up7b=$DyD3oO*jUSTYajC#|XLP zxrQ*mSjJZg>*+bn|8P~aixzTjb+4LUC$Db1bn+FEuuy>L+hZOk1-aHo0#m0hm*)7` z%;XHdP5J#3ASRKBq#=JE)Clz_r152^&vcS1SSgJp#{D~u2KmO6leP9Ho~KR>0Ibl} zY?Gcorz~&a{VXqhzw=_h3y}Qyyy_k+^hzJ7Lr^@IQ=Lq1*o7u!@@A6o4K>1c_A?G; zFQj7&4Z@dg!b?b;8OUd2A_=|0*2){}fv@bk?nL&(DcTw8g%a^sg8Jog-={R(t-LQ4 z*uM<TeHF)JxOh;Ic;D^xP82QFX;M)ftNuZaF+!Awm=?QeZgLXbHR<Hp1uS2ALm{+` z8Ic5`KiN8vvHsIk3pv8@PRP0)sr>gFD0cZAa642Tr@0HfVbY=vrQCs>0o?=BZDn?C znwal#rbcl|?_(-O;Zrw%wv&%VYLHaJ-*Q%nB3M>$<6RmY=hArH`||Ne;ov=mjp8nT zt;1O6^cHY%lg;mIJU9KpTI1}lfiPZ<2;qtu?k=HtxFp7ai7_5Bz%S~kD5goip<?Q@ z7-rF4eaps&b8ztEhz^jSm^3|JK9^&%6!t)$0d2mv>A;R0`*Mf+a--0NJMMb)ej~i1 z=}|o@d35N$y{4=`Rr_6XT|1@b?V%$1%-5d*@eyuYx>&Q*7GKwjc!;#v&EqQCu<M@? zaA_yslQxUq`m~Zb4N|#>k8`Q{kq>x}a(VR>QHy^eY8UY(vQ&AypBK3hx{^G{gx{lY zTu~7mvR)wv1r&f|^?=KKH}b62wcEu*8gN2w(=HgyRwE&XKkA&OY2qWG5)%^c%eHIb zE0(F2)ie@Qi>TlMZ8mehtNVFM+)iNf={yh4M}G(^-<0LYBCCHH=O@ot%TT<QJIv)k zSs)*~X>xij|9B_?ohNA7gv~c0<L)x9QDa@|?QULmr1!Q_pnh_>v_1ww!9}B#ci!vv z^6AxEJy-N8lD}gR{pU^mS0M*MY{kAGh(&oQbvDSpcBIYV`~eD7q8f#8bo+Ck8wQP{ zulxCUx7HivO#CG>MZzC8%QqMX5%KZsXpy-gvuepFGF4CC5V<9s+8F&LEcpCbcnACQ zT1w~anVVyK_$|xNnMh21VNAYsK+hrRFsd@z>?kwQfUgfWm6orn4x)o9SaIhLZc}$? zx9{Z-`-i*{ptRT?jP|s#+|12PU`w7=yDpVzb@4})tW<w?^6=DWMSHFwn7vJ{@V6z; zutN!20Lhh*Rf41BZ$vzVv-R-_${~p4hc@%+D_gT{PKzj`-*{fG^E)ntjC-sg)maP0 z2^RRpa3BU<U{5luVAdG2<8T;p<p?LS4afNvzfXJF{V*;(sn6j1#A{EwR4SzTLtcy2 z2H*Uo0cbz>PEYN<0%xQ5{zmQrYdB|z4KdkgtQtpC`j3_j&Op}=jG|ARqKhApenvj7 zb~L@=z|2xv?mvK*5Ro=0{qPZUr=<j9f}5gTvqu!$oJ7;C_O(YZ$b@a%PJ>RFAaEL* zp?p4RaF)#As1+&7W!F^%s%9&nS(LsT#dN~^ApvIZ81>*#bYF9j5uPeG3Ecg`&6>)) z)y5zS_xQ(RZpPB|7@->w%h7T<R2B<%(j%{6dZ<6Ax_rl_NVaADc$eQJBN*NT+F2F8 zSsQ$@k_562%Vq?*2U?9R^FtTLJ(_$P?NV{rM^yD@1zHXT%ut36Cky;lj~Vtza5${o zO1I-Ed_@NHk8t-%iQIg2gz{DQ?{KE)S1KP#bPZ)sp9^cTtLd@As#E<uVfw&IT8vnY zjv2BtwFOweKptSm*Kq|Kva@|yS194p3ynJXpm`h5p#O4tZkM3bn;D~D>T?&kSRl~? z+BN?D1Bxdxk6>mmE^OL)nKOJRLy&xx))pH|u)4F0E39SNv7yPc%O!_~Py1NNHPPk} zV%#6C7E8~BCBGNnT+vXNi|rWa4Z8JGLZ$LbgMH~JaZ^~lWJH}`tG_WZTyAG!*VK@= z!4cO`pf9?Eut=3xYZAFsyo|tmQJ7RUxm}n9jw;dl@3G5!;_{0St?!`mjo#6NwvcOb zz`pJVH8xEK?e&Kw-LHlgyL3#s7B5`7W3$=Y(L)iLQ@IUsC?3w^$UO~xQU9vi(;j1T zT2(ksXIA_oipWE!Nsjq;^N0R=)->a!Ya=9F6!d8Kt15ScAr}^fl%h-*N7eOwGh)@X zOiom<Q-8hn%kkw~v)Od}3dVgYMJpPVTs;II0D(=cUTd$oun8s}YtUiANNHm7U7iGE z51%oN?FB+z?Jya_(_S*y*$OU;gwgj%ZrCzl#-M?2xBNne?w+skF>OBnGhtneb`{d$ zvGXTL_Dp1g_S~6d`98ub^|zEFSdUeB?etvwDx5c*#`^XgF*^ZoGguKz5Sd&_*Q<A@ zTrH=n`6NK~*MN2Z0^-tj;1CQR60cp?gp1r2Je2_~?brN9F&gMB=ThbYtO}Tlljc<7 zYGMJus^|Ug=PA3#G4jlQJkni61VU|7vhs_IedPgC86rbKP9tc?{BBUV<&M0i(9$F_ znVsb;Rb#i`4bUNVsj_jYW7$IEbDUU_-Lv?dAD)}8hsdCtpGz8yK$f_w(*ETNa3lx) zDYA1!eO6s@Uv@C}6j7nJ0~@7-ZY|kCieVs%pn^4(Q5)8PEH|}Zb^0^V_G0sX6~95v zPprEnS#8a*Ggb#_Bh{@*;;R*9vd3p2g*pX22VJH9sClavz9yDmb-u(##K8(~FjwEx z!0Jxy{l+&OFY*q|as@s5$JS1XPIUhsEmTK}ffL$+Z<GVrbFR`6bfncGtsEZ17~f?< z=MJ6T<iGw96<g~HX*JD6fqzdqkc!sw<5XKz|JQky7O1&Fcx!n`Ym>0P1NGDA*UMLF zdb+~c1Z_=Iok)P~sR!l9RM7dd_l>0KvfBH_AC9~0C{7Hny$;paXn@aF=n)%8DK$Uw z4xn-8$i@?c33x^l#U`kw{<LlG@LSg0Tb}99)OEIVdg1m})btHOOFz@fJ7?t%v#PH1 z^sew$T0i?%JXFa%u$cvdfmp8rB53opcj-;lO(s@o9u;!ov*c#E0~~#qXFT^7l>NB< zyGV(HltVe!+^=H8cJJA)5Dv3!Dd((PyL4F*w?IYuGFKbCqE#lyrfekt++}{Rflm#2 znxje=_sHd1)QZZwDa6GQ%L>aZtoJh>%Z1<APiwP(Ml|5x!dlH8Kj$rua_T3Y6mcs! zpv&VCGGxGXgu6(m%!JUPA?%YhO3!RyXA1CN8BVfuh!(lT1SdJhX#Uy^+j_Y?w@L^6 z%6i9YsnRBcP4FRfGYDFqdHXwL)q2t+3zdo__Ax0CEw&+$?Mh*bHMAHqetSuIZqX1j zUNvSt+_E3o$;~tl+M1KU_Jle`1<8@@V}-R>ZZtGOIkweze|~OfUQ3V_%?y|Cb1X;I z?CYG`c*dR4fx3P_sLdudv%mcxJ78Odf9-(H=6<@`aiclFDYWHrcpNe(A65up9XofK z)@n)Ssq=`BaU?=-qGgB8f1HYD>$PiZ&RW*3?;Dbqy-++K9yRDUTJdRxW5^`tq?W(b z+DQ@Zyv{PgEwgw!@s!|!Z;^Jis1f}+dq3Ziu~w)tTWP_`d1%UKuo*P^>m?_2V`CGg zAP)y=50YH3i9TS`(KgRDy1Vc;75MN*p7kP*0v_+9@A~$_P6w(>Z!m!{v;3j@(q@4v z<yeiyv#R}0$f74qbj-6qneAMpJ_C1%41Zvqw*V?(Ack;Fs(aMIi#Kk+hE}!^FZ~7m z;(5KblKArO9hG}+>{mx4pOFhltPs<u_P6P@+KG9o85Gps*>~HLZxaQxDfDShdWfz$ zCbcBR+<KnI#Lry1SY?Kyd0<Q^mt}rxyQbrL64}w;OQo|p!>wHAARa~F0wU0b^WU^u zp&s#i>23;FBrHQ0r54*OXEgG(9ue`y&rcXGfnoEah3roDZpXUq^at@CkO=yQ(L+TM zLVl9akcs!-RM9ZPe}|y#&1=v6V~{U6&yX3i1@#OGx`)rD_^3A0DLzWFgO(i)zx^8u zntNciPDelT`Wxe>;jz@qevTZP14+8-aG-zI?!o!0)}Xjc&GBxt^oZ74+!a)KCtxC{ zc+M|Pi?1I!8G+coCH*ksVR`)Q^++YC-03)4d09;Eo=bP<^9uKC>w~(94{e=0Y0&Ng z8rG!M$<lyW<@(XR$EK}?VKwbb1r5n*l)B^I@LF2g?trFSzjKK8iR#PDZ!`95tH#k) zyZO6E<9+p!F2?t{N-G5Lm7M$voQbN<Ef?yyb|ExW)qF``BC1|;3638sjGBeCB%F*! zSLrJG8Vs+nV6{IYN1rN5@~vVTx#;?={Hg{)0eH+^-D2T4oFUvVydx9gQ|~}|78L~3 zHx9qbK~|u0kSe${5Cei{JEi}xt3eMxFjjiH2N+#P6jrcAgcUm_nEcn9z1z!Cd|H;W z61)0C1nu>e^0O?*kRE!aa5|;qi9qkV%@*8UN1%hBQO`tqN%cR&hz0-fVHKM5(<@lh zyiR<`242hoMQBOf#P`doPu20xDKw{*t*y3G&WGPnoK4g|OsZkMHIOA&Bru+<RkM4P z+v*Dq7t_KYj?Z*-$nohhAiK(tBJ$Z!9N)4*H;CeaqGcX|8R2=l@aWdV9@1<@W3JOk zkCjJ#@+8vFTsqx;$c9T`Nlz&(!>{yLEVD$?*I#E`0|sjJy=<`_9)wD`7Rx(YC-n8R zp~2k8XdXM9E?=klO0=1YJ`lhc4p-0Ui8Jzr^yQGX9H{*&3ZegA6#DAKA2B{X8=f=E z>J87)i8Pqvo1fH$PnZyusH@CV9{FZ!3Gt%px(v9!v4SUXG49ekvey^&Z1>_*!Ky!n znj>aMcOB?DTWC_}7?`EyKW!FI6+b<W;vYsIO_Q-l&F&J)i&u~9YnO-DIjYz(c)fCo zwQ#9%%k=2$OU^slB_ebQbw3Woc0Zzj;q4S5CL7!Nx-@JZa;auHlp`Gv&hmXkmeDev z;oXnw&-Lz6mY?BW1PH`CBD=0HPTy^{v9JN#2Y!``+`RZBb7EUBBStLZmL@c|FW}X} z4a+Y&o2XI+ER_ZqVl&3(fj6piBbB>s#yV=oKflTgutthIR;L>nx8o41j0eg19i$4a ztH3{xS~@HHu2`du%bL~IJVL&xa;<IkCQ)*<sWKs_W-kkNwNk1ZC>OvIU>Z*U3|!N= zI)hnS_nV8B+j!51Afa@MX+Jn%ZhVR19AP#2?LI2LOSpV`UtO20^33!bKvN|T=-$wN zt*fsC!HRBR;4M*0+1v*v7;$(NICc-AZM9uXbk>V}IfJD`eeXMn!XQnZ>BFv`g9e1z zKW1Y2?zz*KP0dO{{CUpN``*&Zl=alx^Y%&mWv8Nr8KUZN&sg5DfFsg@nk|2qr77`I z4G?uWijuBf;QukQqoo+GbB)Lib&`7}P?$Kys6z+67nCQCAY!ar1k0C}orej($pVl> z6(c_$B9u^+2<BI)ZmRGokAO3v<>KFyEr?CLxw%pK+?Yb6kHNy<OXV}!_hX9ru$3P4 zUS+S`{##ufy)PmuD4SiKK{?R+-a&QDFY?V=vBI*m_lAW=0Yh(7<QCf~loE0l!+YZ& zt&FY8d+E0iZJgg?H)sM&sze2Pjt?wGGg*l6Y*czbHwS(yj$hXPc=IYIwi<e@9(G73 zj@#R|D`RuGk<eTldmQ#K;y{+TE@<Aukg9LR1)Kw`oWjz@-Qo)#GM-Jk&da@b$VY}z z5s=hn6l)|U6q8O^<Q-YfBhba$BdK&YLN7R?L+LVvummUeBI+u-xg{rGl_M^zlwDOY zZLp8MY2~r<rZLFZ;fr!T5RT1bouDp6Q)PtRv;G_)!E)qdb#i<^LSBtmtC1*FUrpmf zDyTH3&E))LRgaGKaH9b*q_u$fg5?&7{><Y$!m`4)yCk`7#0d8z&_fFz$t$qtO?wY| zdn-Z*8r32i9=*1vYh)Z*(kvs~2@o;Jx2Ih?-C5${q6dZuPh4CK*8tzpMv@<F)XPm` zZUr(V4lH9isf?DAa?T{axF$?quck^iHe9d$eVIj=-U^`GxRry)xV7nOz3=}q_Kwk& zeOte7k_swz#kOr$>}18M*mf#rMHSn&ZQES2ZQD5c@AuvBIs2a5+Pz=Knr*iEZLKxi z=)FI`XKXKI`&3p%HHG8tR@hIvT8;~BtSI{a0mVcm!m<ZMQW!ECW^13^{rYrRdt(ge z9k9sS?jsFGyl(JK`7oP*y4+3kYm5^2|M*6&!?%#!!-<!AxdmTh?@fk<gLxmm;4U81 z;P$y0@X%D{;rT9}a$Z>_Wpsu1i)iObRrd-TJ&4pwHX65xeZHvpe444ttHR4ca?LH* zACL3>+U)VpD%PS%*ICYdqNmOf%zRNxA2)j_hobMBa#iHPbk*l;*|Z1(clgWklV6aC z15WlY$)_ow=dAP5UZU*j9mQeDW;@nE-f}6H+y-5RBeb9~2S|R_lcq?26IY$(3}p)* zr-FUL2XJ?w*`W#w=m0prvKFog^0Z(L2-hEP!HnKJVDT#&k6!!yFy_ThCEeESTg)UJ zFdTu^RQS|$!<HaZaPtny6agNfc-OCO7B93Lng>Smllp3P6E?{aMv9F!X_#(sqoumQ zYxLPSh;by)MB6I;v%{bDlVz&c4v?BRI})Igp&SL3p^ONF#P!|QWLa?bgBoxXtB?55 zdDRRr3Pg>BH2*8aqULWkyi1FdKh3^Mp*NoygfAb53nRpn1%XyzTBP$=Vf%P<fQdpX zpB@JBP&~I@9_ky1FK;?QNUVRn-3G)q2E7+XfYU$IpH5%jNghWgT{P6^sZd0rfo+Sr z9i&ge6fo0=^Rk`5A9i34(<2tF8O_Dre%5=H9a?mSSvz`eMpX|Uduez9&RTellp-X- zkU|&?_ZUB{?CS6Jg^A!N+*3q=C}zlH*VR}K7NL|&k>UUmz=a&O6bN3H9HI*__3gn0 z>Z`P$3u3IlrEI2LdR9i$LYuMX6wa_p<{hOQPfiqW2|RZA2=|*Z{S--A-B*b5qg*?v z^^pzSQ#~dl3S($})Q+T#)Z3Z@;zi7CXLtCYD^iaTiOADg-9$`q7Zb0uuICni*M!G+ zC9MDH>zO95CQ|YTN_!ZKbyE~0pgsT!$y&b^g8-5DI9~%ROsF2u`*XnP75#Ri^LzjA z{jr^<t{OqJOqe@StfgCcQgEUb#Ac2OG~@4cvUq?$wz^#6$hn+K+@p5P${!yzPS1KR z$~UMi0bTFwg|8hBksI8_<lg|}k`(jct}Oh!6(J}ogL%ZgB71fve<?#F)@^n9CL@ML zfwm=NL%Hsd7}IT^$O1cNAs`bq?0U8&>?;hB#Z^QGF+O9VienGPK`YM8a}U2)a3Mw% zc+O5qDi~v|=HVJhwDB+sJ14&GVMW%n4tOZ1ao5g9#-=A!nQd@b>p8K~S;yYgG_=39 zIV@F<oQtP4+?RHEW)@`(IFi(mtYew5<mBkY_tuFRh+A}Oj@xU*D=Ok?KjhuTl*Pxs zBTtZ}=vZ>r`9wUwxfT9Ip6A9lTke7WjCB7Yy3JbMTsWGR+t%14-i~J=ivQc5WWDc} z-$HD*FZUZ-{L+AinZr>rCEXb0rq53VaT9z%I`Z(f<P`Fktl(#6zD6&nuWK#QZ(x)8 z-<^iT<7<(SnjOg?QkdH2%T^+oEK@!CK{KZFdpNtRU&&OEne^K6%|GM9XMZg1Y7l>s zSWeL<EPuRtXBEU#aZ7BB{h(l(=1u(INj>N=rE#m#-EWQ#RFANj>t&hu+9f{@`aDde zA$Mb#GVjDsabC>NWs}TObK*Wf!jNXk2F(~xqT(uc?*I*0aZyWNd*k>l1iKI8Bd(6R z0=cUW7x{xNan?j1$sAq=L1is5M()0hW@3@K{>d*<dzy}`#NnSsu%asUH73;prXBY~ z^?NlwXH*0#`>H9$L5<JRojQr!_y-sZQ$Gq#VNQ)Dz{dhCZYM*kVn`r3!<-CAEi&Vq z(YuC4AEYzsTnoBx6LcQ@o&1|7$hT|AnId!w5UU-2R)=rq1Uo^7s)RmImFSMtp{jAQ zaEs{Z9L1@=JRAnF;%s(DB_|+Rnfu{{xZH>D8)cDgj(YIA7h?e9@fo>2PPvH>r}o}7 z5}xZO@OmiYms164R_<w1sM;i6FAki0(u$Mv#MpaIb+I+~FIK>9^^SnE$C<mo+B_l; z<&YG4uCK;br&KJNQ^JQ1skK(I<PEJqwZbSs%cfA6EhVwI2VCZoYh|aV7Q;Sc<S@m^ z%k6$$t14lMgt%nDGE0zU{+4O{Q)a(n58KAU7%=^aKvchdK_pT#<VHZxwp*(m7m`{c z6?`DqA0i0<&B#xnZv!4{D>-L=V7ymOLXZb)J=e7*T3F5Z>zA~(=~v-(;+DQYlrmoV zkuVtNePf%*Cd2dR;4st@7RL2d2+{KsJrIFd7)8Pn%|VoJtt^8F$D+7FC5RpkgGgG^ z8ePgon<v!&ne+F~YO<6Qbc&vs%Wzn`fs>jp*nAQ~&jW0Kobi){_LhASIKn0Ki@&zE zSZjq<x<2>1YGMmq9iLQssJq~p1)Mx=&FPkLhn-o2PnOUHkUzTAr5(d)m<|2+^e`o| zQ^UJ|6r-y9pEF8ZiXCjLzwu5{cj@3qSLaTYQfC8Y2nbj7$6a!jmwQ-C(5Q<pBNMiO z_*V$Tw!jcwbj0U)05U=;PN?LWTye9Y{sw{2;x|Vy1=mJqbh6@j%Qre1f@%y9d{dcG z?O)9M{Ru(8&~|uQ2%x9vLvxE=xHp$aB8uJSM9@-OzLxbtC0Kh=FIeFgki>lce5GWN z0*I=41!>3><IQPx5Rgrp!Qm}W(M7n3NAx^_Jul<j+l2yKI9INPth?9rD!3PHh9NlX z@z+s>dGYotIM$6;IPo~pLz=u!{_QWIuuv{|rs|HOJr_4>kVomXJeL?{LVHs?dXln{ z<H8kBu?cI6Ssc(VucgG;>xzDqig5R?){l&t6Sm{KgLMGC%SJ-Ev@^Q5FpwWD4B++R z9m5YakNYw8#~e`apWJ1uOJ^YI>Rf^pw6EA?%%GuwEuBMI(KvVZXJ(Clg^$2dh7aaj z1DDe;OgR_DqBipi(7o^Hs6i(lw#A|;czeuqxk&J9wz^S!uXM`&e`ch_ckz&Xb&GA! zXAXju>_hTSW?6qL?w0~pz4EuB^+V#ziXHe!KfFTI4<Ix%1TjIxOEa5GT?EAe;Tfwc zJg~B96!Ir)H3L$P_?n*P&9TgR!5(Z3p7Me|J-v@3<XFru3!p7^gS*$zdy~u(+OUs| z%aa*wswxTO4B6&MV!|CEYZ`GCYZ@=mhm&Caxb4KHhyUlUQqu2DV&46jq|D%CyuN|# zhCtd%S;#RN&05((kDF{vV{Cy`i4Zy&Oma%n4^8*W84^A-`^MjiWtT5be9+>59CIfv zOqYdk?#iWDcN`N0Rw$nP9C@RJTSF=#z@8N<VSpoN#R7m*mU_fny?g!E;Of)JUL8?s zqo3B<&yKPxVKvKSH9OVA{?1(u&oZ^%$Nq9v%TObGYyP8YofqCUO)=Q;XQ}h=rnZu~ zulCB}LXC*ZOG;^dG7os`kE=&(w{~PDqEQ(EdDmWr_`r{Rjh~SUMEc1S=v%BPCh&g3 z&*#CoH6FbIa6kg1+In%^GS2{_EK?R1{kuTZ*U4|a+bdyoIH4#hqjec6%29bG!IY9n zoGz@W<Ov{)i6*_QgBq!pQU0z#$FW*gru^ITUMd8usSH)cFg2(<8|f;}A9Qp~`H@3N z;OGg}VQJ`Un2m!eB=Zg-Boukua>q9j?+cmyX82%S@fVN>L{f4%Z_UThi()H!NNu9Q zUWQ2&TBncZpE&)UN+(FB@=96FIgxRTwFq|Bv!I<<c1I}hM}-(~Tm_lew)Vf<?DD>; zLMOGBcmTg@Y3JlJcWH7OHMVBvBwNQ&J+-`5`CWs-{AkzN^1GZO%Zm%0pdEtM)rYa+ zeK4Xff*9RN75P<_m@=J<N9Er_g!50iC4M><Ysm$B_AM-J-A;7ex!S{pV|@0b%tP*H znyTVSFR8Z6W{XX@wip2;(!=^~FXh&RtP7JWji5-Upv)|AVv}(G0LCz+`9sizYl!OU zUj6rVghlo=2_o>;9<EnuE6$B(1uvSsKN%tJ0KR2VRLi-Eg$5`fvghur3)B3Q*6`{- zQ&<>&+eK0r*xV68f$y)mp^P_FIVIl@2KQ}t7EFTjRA`vQbzz#maaxd_-~<v5)e8}< zvu40%dIT(9CM{c%%aX8V+fE`MAM4a0_etQ*C#jc~PPX^ynl<L-QYC6NU~%l0mHmQu z*fTH{qtGsmRK0~gup8m%NBNlfOVtMs3(jh56lEzSo=hE0kELJvM%)`cxy}0{$OM10 zhEc@-iyUDXn56nil|=18i*8S6_Q%&W^e5&@K`d^F8P2-B`LG~bFBhvwa`_=IHu0n? z$%S`(J695&lqV$ClJ{pqsvyE3tZ@6c<7D=g!$=zFN=CLVm?&i9%;di6?|o+YeZ+7; zULcbgR2!bY*})6~AeG3}E?m&bC1#a(b(%x;4)UV}!3S*bhVihOr;(leJ;yT5XjlYo z9>db&8@1}sAC@O45~m!oe+}}>c6<LcVOU18`pXK}DnNS8^&7}~S=JN+fs6^<KP=g6 z-W;U=3LFeLC2v#fk%VXv!llOK9T66OkWiW1Xa-z=I^`6HvIE#24$GT9k`s9!qWJdn zO4q1SrTPbjU)(iLDtlj+d+%iQJK#d}QWUH=xUSh8@<B{v#4JT7;!v7)Fj|JaN9rJ| z?p!)&#=N8HHP@|B@GVhhk5pbjXfVLXp77iy`V7<y)MY?20&dTYUb3+8h#45}Bx$@} z9feXOY`4V6rM@@TcSrQMxeq$jPKj-<xc|qN!r$FpKo$1ni;-M3unXd1;_REDaWmgs z-;&bVRkS9Rmi(MqqIP+d+Ta|eifEhx*BX&N@9$&L<Wr-IV7qlhuY}MaP;20<Epb0W zWl4(9Q}PtApbC5B)@Aq*$9_XwuI^PYVNb-c^?!sMM0(j^3Si%Z%~|=U-?~QKh$f`6 zIo{)V1VuCzyIa^;SzaLq4xA(s#m@e?3-@^Jq$g8y2&;cRG8@TF-00(i4`VX73`xC# zoBU}80q&~}tQ_#*n#C+{??^SojrTNcckd%&7)Th)+|c=Hn%I)W6*ekcx`pI_ANkN^ zkE-LD-Jm(s$jrV}3o}!Jbo#T6m*EP;fJp;f&3wgzK*Hr3+cjQK=8MUz$0dpEz%D(b zWuC7OEH3M&nZT^8GsfLv%Z-zRrWh^(78Qjt>J<UEB0SGz&3wX31z$j;;#uT)sruDl z_i9mB;L;WSn&Esm$X{4P|N4K0at5-Yzw)qu|H;ErUDWZlyv(OFS6WTEu0N0hYzFhS z;#adK0w{?SjA?Rgt;Ahc)>A06OOVlc?k1*teGMY)HZz^xVvJx`Swp<2GUNT#@()#7 zxqwxi`W#d~g3+C@-}<Lbi=K5eFX)44zYDW$v!#U)`Ang229l@7)eJxC#s~#*`);{T z8IRzg!OViT2#M3!od7e|69{AyH~jE#snaCjwk*$f6g~u@tD&fCd`RVn;V53kb4lZf z&YG(EAao!u!cboNro8kiKl@q?ggs7vGAlj^W4Nai&10kzvON>kLtEui&;8utDdE;` zd?H7P<Y({Frn?2=;9n?*3@LoH_1X@JK#vm={}x_7W>>v5`OJ7AgmE~q|IB&2ddIMu zXy$PO7+i4kIcW=0IE|BWXABY|><7I5c-y%$)UYp|);{>mxeyT`YrUIzMg#Rstn%|; z^XeSIJ8e(Hno_L@flrS{7;8BN$_OYnV2hH(dcLIjsmu>-3B#(b3tw!p%?9UxSg<Yq zBJFKSR1Ohh=VAt8oQUmbdlP=YCcpB<LJ~ZK8W#BxB`+EePzee0A)PO=cHW5O8OomN z*9KMPBwQj*`}Bg+VRYVwz^b0asjid{+Bu`okDLb<+o5KMf}V<STU<Aaa<#$22a}`< zH1+u2f2el9C_t7kw&_k6BKefF=y~OzoK1cB{_YT1#;N9?c7R<)P>+Ib(*-@PR~&*- zH{C4#=b6VLW<71l@>|IAC<m|w@q%v)U;jw0?w2KXh~P!+YMVVP^M<eIinZm!;}F$3 z#2(4?ykOgt?m2EuaBwL?`o0+FT6l!hF}h&^l-ucWGXb@7KT04wuZPcf)&k=lst4~^ z9E>rX&_)6D#LowpRkHjZxu7|xxI?^p3Q(-xO%HTrinpRL>YX4RyGx!io6^6Opl&RU zeiRX%$NAgz>Folc&t=>KFKhn#3cPvMhOOGg7E4<QU-@F{V>C%8T(B_d8TdVDZfcyy zM9=pJ7x9qx&YXhr>|S=%wo(trncclA25k6J>qto3X^dPmEhGuFwlRHcHb9Wlx=amB zFP3KPkZ>F2HVE%8VweffuVwxt2=vkb4;RyY=^lvkI{o~IuiqR;v?O@$#Sk!omqs26 z$O5fY7X-K~;LKp<cp$2a04{C7ewgiEc8QhfwYDf;Xo0GNv`KYnAqp;E9X-!-Y<}MF zf8^YV(V)=${dgG|TV$xx{c(@}JdX*J8=(aoCmI5Bu*{zyryWQ+M(M`f;AF4ZNF}y- z5XP{ODyD6lTKG8S@DgeGyut5eZw>bSXv1a;b}?HVP0P#x<Jt)-clsR;IrElNS%he9 zkEtpbiEp(|%Ghy^1m+_1T7eFR_cjO1{jc2aZ)ASE^DXMgLiORyo28$CrE~q)rY<fm z?I_CRh(&oyg!K%#RY|pK9cqH?S}-~oe-Np;9BPwd1w(n$Bo^nt6TEfgxuh^^P2#)0 zDq$fW*?RK^S%{T3UoelI;((sTfIy91;ev@M6d+c|;gBM5AKIjD6QIng`TL)AeKfb5 zU{r6xuF;SSq1O)6gUNIlSVK*kCrOBx-m|-Twg<|goaObERr1Jvnz~`=C!#AK%!)uZ z2s<v<*8i=!so762**iEwm{eTu=zTievn+j3mPJMF8fvn)FoFI5=h_nvVNs<hX<Ve2 zCwHGzktK+@VZd=qipWXz;kpb<Wm-@Zp{R#Mz7AQx&1DldpPiZW{vT4}`tDz(1Qx<x zJ=;H|gcJ1lUb&l}W3QYM4MRNwzyiGM2(D_+<Y*M1_UVU+$K}rSnAg9?4w_)5en%+1 z4VbAv!K@AWWgb_0%`3mvm8ZFYW)RYb&yO<bGH?a_BF0JakeaF+>PUdOq6V9HyT0?4 zNG_mTj2H%qj(a51HUYo%#Y#86Cshq}5(<?@e+b=s0YcfBFM{~rz{)|PJ87?yz|tuK ztJ`xskBK-aAMMYZe+^n4@hPxaGgl7n#Mgh9*X?w3pQ!S4w|37Z(3Xb-y(i6sG8Z>8 z`idvGYc)Lmwc@CMIv;AL8dHw7VSf7KVsnI6)o(6T6`n)gs6%EKjGf$&!4n>yYQE~Y zLGDL7ZJB@h3VuY7TRrSiFFa*&0y=i2q*R)EMD+<J^-4D*8xGSUI#C~F<NN7N9(Jpz zoOhw78irz>YcPT#YhEh~iSCpm2_I46o<}Kp`YTW2Dqar*Y1+Cda$RtcI5M;mM`Et5 zAX$XK$UUsHlAys{%hqUD>CH|mPTTXd!H(ZC>dBqPMdFTQlWK-TQDBtsAw=YlN}a(3 zx>?ZF<BBXHxFtB=YG^M`&yXYCjo1^DWLbMmVRPM9KK@4h#k0!t?O3Mn!&~pQ*uz`x zVG>{0*>l?IGt_@y2JS|jJsVFkcz7@0s+~U{%cJRe9_?J67ay>OH)!?W*$Y*&7i!(5 zZ@D+DsYyXDCefaMeIJ=~L|muKnnbJmJSr~Hc9p-ibCJH{hj@te(FCsPuc?RSF%|`2 z*_828>ZMgl(}ig`cGH=4waw@=1hOTy$$nEmJtnCKxy?4aN=x?C_@fDodSl0e8{Kp2 zDfTXJnR^UKek;=t7+H4c0R)dt7?R^Ia?yWB<l4D$3jwgPUBr{?egNJg70_(d&c8b@ ztTpyI_1E=l#4kM0wB&^BwD<a&0YXeADT$7VH(R2`g*!N0%*&ElVLe6>fuS@{P!Jn2 zCenS9=zHM!nSuPuS~mh<n?COk4KDCtdfTFAR3Y7HdQ_)@DN8|_A-;i~zS+*W(`U>( z$OO1cUz;v{`r^9Mki-&6?GewyG<OYV?^k$)PA|G%@aLZRT++vy)?}IqKk_?ZW&}th zq*d<O9*QqjJ;HgxuhBJ!Es&N9+Ic6@%}3qlInj7<O0DPk$hemZ_ff>luQyiRw6JUu z?Ed<sZFa$O<XERcxMG*<vFx`Y|9Vu~I`iz#8gQ$j;?BYTA{FKpD!@Sk<s!_OTb{2% zilKml38Qaj#1TT|9@QR_!tZbIAarJ_KSU;nk*LCFd1y9$^l^NX!Fg*Y1dl!l^g{Vs zuSnc^mazja4!Ovh$F7_2j(pD*E$W6mf>haJ$7NSqzzn@<2J$Wrp4<hKhy=lQ4B1*- zd_3=;j$eD<+R4_qc1#b@$?DL=FXnS7B_e28swhPqjlXXFCXI4tjrXfzpRA8bX`-VU zP0NsvKTGjke#XYWT`(z8(|A4Eh^qLL2RHsLbXnsLkXcqT$yI-kZO50c+!V9s@#V&7 zc{IA{AlchEMI>)Iz6-bi*k7ad;K`cou)1>;;KDR2rcd#dpSMsqlhcTvU208)FWan& zcd}L!sPzFs`=zAbysAY)RT5s~+q?3BW4;?<gtWpK$0v$|r=o1DzV$OfE5w+iY&k8t z%9{^~x13LwsG$;SH~g}?GM=!nupxW$&6UCwNtNrQ-YSy&y!eOUL2;XlJ30;~bF0F_ z0R{7~MDAXrAnuf$3*SaTWDks$Kbex^>q%HArRZydL9H++zc#NVH#t1HJ8zWDZz41* zA8uZN$UYe3Fsr&QbTzu{tJU^eq)iD+QxSvPKj=egF(|9Dk}neJT%>ry8bqNoDsIHC zkh|t^M$#g$#a#6^iERVKDa7S2N!q;43yl^T2yOE>BsPXCb)Da9Pi?abW@JVxbx$Jp zBBtA8w7bq;Y{L{^@uD{fwRy?6*pHdJ{Kjp&0jcA*gts`uZ;(SIt&RIKy$2kaQE_Ji z#=1oB5i!wf#2S7U>F%|E@+g<w#lR!w@lB79iC{q&9eC_K>v9^-8|JO#6GNR_dkx7G zx1=eG+4}wNr^21-V>iZ9@HQ)x-gy+AuC4&_5I2&l$oMN!vr}q^(?FDbT+?lqAp=vx zxNwyrt2DJJ+L_=P{5xzO)(GM@*N*<-fKiX9BqU@6e%`j<7^Zg_DNr`hpnKCDV394P z9oXBAySnSGh*OC_w{-5^J6i(SuNZ1z@f_l&&Hp8N)_H5SzIRf=d$6hD2y;gs-TM+V z*VT(ySF05M2Lup35=sPNaZ(9p`W0Md7Wn?};A$NS!Ez<UCV*CSl6M9U%;{SmG(zaG z*kHZ@W{kHnOj5wMeDw&pp8l;VCS6&>QtC$1BwIbLGot#BPA_S93E1X4uwAVey#2_I zdoG;-X&Yq1;Ns0A(U)ga{KgPse+XXbOjn+)SH>rR($I-nK1z&96?qYW$uiJ;g?jEA zEMoImMJz>rrP$Zxb_wSyvNYUa1BhObS0k4sn3lCH#w;1Q<%uw{Wqy}EP>R!%&->ug zTKYnlvq$1gz*RS7)#K{)J7~fsGdEjfE*n=*Nf(Fxoy;zWKXj9AbB(tM{pSHo6z}yU zNm9=|aVr`PT5)#He+Fo=7;p<y2`KNwPep)U9NdHngesyj<f7<&hFVd!1@c~Yd5P(K zc@+FyiiJ&8*R+y91Y7Jl9>1^*iO~}rD&K!Xv$!tbWB5dE>NfL9S?>G~k?IWXZbuP` zZKj3+PDo0hG4ZTTbiGeLtqRJbI3?V#jtiPTGSc|3Lzy=K6&v)ts<Jf1V@u;0#rn0{ zm*v_!8I2COK)n>Cf0y#uH5JU2Er8Sf`idn{`dZx^s~(#7jH<g@f_(g)i67fFKmKDp zFnZp{qDo~PS)5@1_XTAY-Sz3PSeS6<MyM5S>wF5@oW0YJfQg1^NfC@A_TmI<Y=qzP zu0e8g7bx8ExA4vvxU8v$3?)Dk@Q@ozbx+bEU}E&VB*fw#m*E<A+^|noz8H#1U0u6_ z1GImDPlD6V0`bA>=(QOj9pu1Fvp@QxFp`X>-{w+kC}s==UmT3clIn&MQJa_qto4+5 zUu9C0gZ-5c_M{0ey}>feru%|T=UzV{Db79S`Q4XINh*1X>74$X#9)ExU@ME`E7~*r zHWTCNcbU^rS4SAtY;uK~iVR)jP5eKj^D_0X(K+h>jLxx<74?=#AdouHOc?vG!=2*) z!8Y^|bKSo(w=%qS!N3@PekH~j$c~#Lo>Bszn`5@DUJ4<DH8yQODnKBkFJh-wv<~)$ zwsyYu<2TO%cO%^UVYU36?mcV=nHfv*Br5`4(tT~D6(EL8$9D{9rAkTx{H1P9!oxq@ zGL?ga1%<6Wl^kj!6?}p&#@Rf6<uHXWacH=Dk5Vl3!Gk6(BbH@~wj~l(ciUHr1<JH3 ztd(=<vh^+<*$Tnmzlo8S0qa&>j$K?f?sj5b)*@p&NFQzgckH(Z$`qyn6>-YyUaNsT zZp6%?62;ZpVCJV{L(Z(w-Db;=L**RR$lfwHgT0+}nlAa+N)a_%!{kC8Y!VL6JedA+ zGUFq(O@N`4O(w-Y`2ebHdx$J1kW)35nWT_JwRE^xAv&i7E{76mr5g=OUG5Sx&jz+6 z<L6;%u|77i;vt5lIo;8S+@JZ=pM8zbjPjoIvJbszoqQRqzx7~UVSwl$?@)fz^K&r? zVpk@f=XxPLugZcBzw68He14m>7`ROBNJA_`En1nLkjtsfS&ITA%%V0a1^9a~szEgh zR{^pD*fcs3P}7&S{HXItpjDVctVkFEGp_A+kApY~Vj3M;TfDS%bNhIC(d$o}t`e9* zKwvXfKBy0_+`q*saI{N7sxpXEp=KD$gTN|8Q$O{02xm(yFbI_p)+BV4e|9rza?#|% zjW2mPK2bC_*G66SKNzOnaI1p$1LQd}fU7F0#@t*NKuMIkXgYkwayx%L(t$Q2x6>Cl zp!jnbU<a+Zp>hmtSlj3c1fSX&Gkf-C9GOMhZy`w|Z%+O1mQix1-2f4;kGLtm!6YsJ zbk1z-3(^qew?bCb1XP8?t}jz*&6Y%{LxW`NZB3i&m#Y-s@+gAxw;C=uSGb)k>rr-Q zpNtN}#NXMQ!J5Q8$~x44a)asyMWUG1vt~ciggmo$_NOE5>k-#6g@>G-(2zksQNY4v z`>Ua_2#&_i2)7NeG!{62YzSZ;IKtk#28N~gI*`(ee=S-832-3^q^hy%lAPu7k^5p| zEj8&{Eb1k!Ehbk-b7O4&;)TB|v3R4+win?RkO%r^8?F(a#+(#)Q8MOK&7?*$NIq6? zo2oXwY4zN_JtvGbr`fDj01YUY8(m%xcYR|`w)h>?Mf_xA`^#F5SdmvrgXp0#br#j= zxo(Y!6UV&2a#Cm%D5}OR15bo^n*-FMf|OhN-4es+mYH8<AMBVp#al@Wq;IM-c*W!N zBQF6skq#W&xRE!R3o3b8k9VXumJgh`$*JsT1exrys#3i2XhTlk%v1%&P5U#bILjv+ zA_Tw>y6qcU<EmEE81p>WoAF^9m!?iXZmwFRJsYofce31!rN(bBzQ;bL#woJ;_xc%W za_0&26fK&Y?`suN_uJZLu)o^bG|^I+=0uKA<5caDFaIo><CK@%5-x6t*`fjuf2nD< z8Q&JbzYMJxdRSUEF~C~w64v*AbJn<APYjy~AN=-+Tw(j%swqiJ%X?#;z@cc%y_(ik z%+dQuv%Xp+oN8y@TL7Izu9bQfdDf(0(9jnBN{372)~GMjd~0o)H=jQJ;knu;$=#-u zY}+OR0+20ffQ1aj$y4N`Fvw5ftd(KDLQtHVNpgv{=|(P^#URs*E&O{(s2Sh9BBS_< zU;(2W>7nmrY`yC%H<Pt|lI?GC`;LK7d72A;W!e~bls!3~UE9eKSX-0lzvG%jYzvqM zvE~s_!xR`{7$)uObf~YtyQi}><2&(U%a&{=*7McVR*`{Xh5&uyv1qbfx!K=+jOzS6 z9m^F-NIP*D7TJ$9)fMRQzB|~zSITU@2fQ084@0V-KDzY=;yif<!bLWCXVLV(M%&aj znw|H#AA7R2H;t!ro^ek^6pJZ~X^c^xB8Y3?v}R%u@=ZHyO-iHwq({7=k9v7VUTbY6 zt}?p%t&4-lk0EiII$O$(;mL<-+)E3!OUm&$0->u!hAy9p<z|d~oSJE$|M<G=9-xF` z{l;+y0x>Nc+5Lgp{Zc^cdK01Y*HeIHktvqwhK!GuE^v5OPTZ_Rs`pRBNF|b6h3;W* zN=NMrsqo&V>0e&qUm0ew?(A;*lMfSM0mF+q{qqSGq`+K}UL{(F`kexkrY;i~OPBx# zbL>X2?J(2so3451!JA5m%P_8$)tk5`lmha%;S!aN@BBLE2^@b6FTS{XUPw!p)L%}? z(;b2EwH|TnX=fWokK}Dl4{naX)^XlT+<@ZFVQXj2yev>%_-b`xzyBGGUy#j@E!2>N z@!#2>&_;*x@8w3l7mSD!h?D-Je=++)h(rl0rWr82aI;P(8D1#m??I_<7S$5%JRO$c z@+``h2C=asZ4XF2ew3O-sx{Y=xHwnZ2lCI8iKhJ|&IL&@+D1V<pI3<$zjnOoN@@%d zpBaAJ`i!jVk;-pd?a019$8LH5ddU~8!LG8U81a$)wjNICB9pu)zkb=je{EW<(&_Y8 zu1A*g+N9CSRPiq)>mimi8-lB|Dc|dCZGCn~)WR*)PdVm+dX22#rZiv2t;#>mVaNN4 zb*YKsEXTC9fqBQ8Z8A3%FlO>s6T(rn9&g^oD6nt{$|G&XqJsTgjFlKcU!MAzNQ(a# zRZAuOVnTXF&**hH_DgfuHnxf=z@d^XXWm|XV)%?+aUUP?y4Pw1L(Xm3#*A{Hs|@e1 z*;x=xOoNs+F!Kh1+Yf^}L|e^7K@!ejef`7x&bVA7#Jw9sz;FY&@~u*3L^fi=;&hMK zthaD~WEJC{0yUzJ0s9NyC}UW;&}Cg81}7uXjo}ws4K&KejV&wyv7mr4^w9k6dF4th zV&As`f@sfu5x5LD?@zzC_MjFY*}9}gOxfixqq!%^K@2m#brLC}&n<2e;YV3V61a*7 zGiq81&JI6OnI7bzMSVF84TJan*98y<1Pb1uqeopDTY6bd?3;}%Cp#qWRkZ-_U-aaA zXoxFVh4E>B1V6SP4@Y+4#VOUZ#y<5xH~?mz>ogc>E0xa1@|K9yeGbrraW#q<R*DZS zgq*O|cldjyjZBWy%=auBxh23T1kRtZ6jCqBM2*DjTDov&qxLi4--GZZ^dWenUE?UZ z#_%NTByTK+)u5ah$r%pwGWMu$28k3>ZO9`wf^3SzzlIEb<(R+6BzIoeB;`=XBn`ME zX(53QvFelG5*_!Pqo*8VpVUW*C_<tHB(=itSHN6=;TM2uj|sp;8JAfmQ6%A<qaPxG z`;uhxcCpZ@?D;d*{xZfN+9KQpqx&R2)NIMBHMcvSb-^##6);YoB`gu2K!{5yjhoxz zT!9*7(OCg0n)3@BqGXCem($e}^ufZ5q=&FTcl$B)LELMjIip8?KN8`@v5Eojfx_^M z#rN`0ss<YM6UcH?HMM%Ime6XMQOU!_F``x_7$gVeWU>TFVz#yzB#U5O+Yd5A`(u># zGeYN4r8CLo9!bq(lG`6uq4kl5uUri<hM>5q&;?1NWpKGqc7@I*J!q(89j=)+JOI=b z>~PVY(c~_t_|&1&$`B78@=<u@F#C{CxOimJQcdKJ^=~(9=a4QJYop6J8kwmOHLq~P zhx(XdEiJH}78Z?~4Y*EKZaey+ks7dyfQpX=p<x`91f@LtqleP!|An&~ISCDsFD^lU zUo*m}O2SN0a6|k=A?~dYHf_4t3ID-*+fA2~h1(jyFU4V8{r_G(I!5y0fbY#|-t8<} zmlc(rRJ(+AXw2m(N?((<x)qK`6L=b#_Z|Uv?~YX5?=tb3h|Sn(DHO(eP7+TLl@oaN zy$ca2gpGOrMvEUf&0Z7%{R1FSg(+@wA_lUz!F3#rr5>lJgGMY_tU7PM{6<IqrlH@g zhzT5k|Lr$=;q;#Kbi7^rcJcr48xbn_3H(QSCUulk(Q9SozBF{ZHPi2mICUuE9p05s zD!aaQ=P1RuySa1Xye$S*j&cE&1dwN-&1Ermf5o2COW%(8KTvk&XWWszf1&KOJVyUF z%I+E+pHqOyS73aHV&RSzO7$#4@=qm*PSTL=pp43tS%a~od8`C%>u6wc-$^?B6EhZw z{=EG1sA}AtNx&Ptq<RE;j407&unEFZ^_D$^FN>d(g!cxg@k5Du3}6FoIzJNKv1JH5 zaU|=!Lsz(%SX3QURqF#h-2GP#^%6tTtt(blt!a9^cntr71i&{P<nJVXpZ_<?zWx7& zvLguEUO}y#+_<9f;n?pZ$4ubXq?PsVq81`_DDQe$%2InwW`;)K)Ww%foE9X;V2zk| z*A{larC_-mp@eK`G5r^2K%yygB3<=%94WOW&mZT%GfVG}smcnQsP;{}Ls^Bxwc5yI zO}pePn^x!LX)j&en$3<FopTIv4qv(RWvuxhmi^z>ql)BYxPPoi$P@o%J(56wNtZee zy4Nai9jB(Ad#~15|0t~mpCW9Hnnm|xT7voZL|8iYjd~YWFDJ0?r45Q>SX{{{XY2NJ zYNLsk!^SA2@|6MUB*H@s<$6zeUIn?fbW~NOLrA5O;zdkc97RUa+#e)7nACEfsUd4( z+<-UJ1LGa^BcxQ+OWbE<0t)00>38C510kWdJaDiOk%N&qimBIhpfv0b@&uo0NU%fb zkc-UcfXLc%Gt<ytxa*<Ay|m0*R93vP9<+}r<QH)lTOy_Hv7#5uE-{l{d<mBDJ)jxZ z3#yU9Z9ayR#xj$1l4o_$cmMHkzY&uF^H@2Q41fTyZuu*Xk;;Qe)FnBPJpBTnjm)1O ziSCInzolth2Rc?=^}hmK;m<h(9yi;TDD=$iN3N0`);xsG+YtDI@rdO6-SHvR6t*3Z z_?;2JG+w>i@Nh=qln;X?={Lri24Do!`)|COc@l$0Bh(xL_|)Vtv&bC<&*Kzh?-R<z zAU4_keU5a=tM#~8<Pr#@EqFP>@IwJS74GoZ9dQsb0nY+wZvR7h4JIhN+Tj$#)K`>o zpDdVJ6s>6fYadVl>F@<i!r~MB(3e5srKiPnQou~afJZ#;CLS$r!BrROF-N###IEJw z)p|si#dmnkJ>qU+2xW?O(@mjl_ht)X-u5<*H=3qDyC#kbYOgwisfru78$MTKiR@Ao z$y(x<x6=nDn23Sq#ji6B6zq4lGD$`sIx}b)UUjy@&GNP#G-$jMO7dTyrk*}X{CnHd zoqE2ebk%K0^Sijg|INEoc+L;>v7y`0qx!pAlx3JI(O&LBGVD+$k(_ODqFK$b>LAR+ z9uG%-j+%#L5Db-pfzh}mGRyMByh`m4u+?_wcF6KT`>0Tz3CclB?|9F8C%UJ|tGWL0 z;ojw~rWgwif~aulAAZ$HjDd@oTT^&()G%~IZ_vz!@etnjy<0P#zKNn)pkod;n;U{t zU?TG)GU+2OGl|S5uHon>o8(zOk_mhCfR;hJjmblPxJ;_hoSn}PUiCJdPowqn-!Jc~ zMfln5u@#x{ylPxkyO&wkOBTNeFl7g009LHZF3T3i7RAP@zfw}ob`$&EuY2sL&X*UJ zAKR?!@occI=Ox9@8)~l0LN!qJ9IjyUG8vX9AxZ?Grue2>$Xe~Qa#je<YflQ}ky%&K z+B^29V3LLS!V%mGr$Zs-4Ps@Ml?E6U50c5DQ+P<&n`z9>*Y27_EFtGuufuJ|?jnv{ z)`r}ZRyDmVq{UWeyu@4<c-}Luy~VDNv3d=Kj1&9gWdS4ARAP@{QfwhT$Hzc|ykNgr zL)&(No_NfSj11Df=MYD+lFGi~3yrNn#?D|XR3#JVFm;*T54o%M=?-DfI(Y-%3}kga z4KQ0jE0e;E;UW@}+6I&M7VNoS-+048QjQ~`Z3ggAVXJa0%lp1^3hu^<#<F-BCzgr( z+xm24%Z1wQ@3nLdbBSR<;TWocs0D5b<d0z?>6kz!S~e_`CXF0zTn&};6Fb}xXe{a$ zWu(-^oedkqZ^hi1lo}-yssrduZ&jMAI~k}te#Sg$yT${YqeagaESo8Jk(qUhAXV19 z3lIk&0eB~xu`MuTb~zFG@?C~f2fv2J(o?X0;a$H@-|B~hUxkOSw2M8dQpA1WO0yif zxV{A^im(Js$;`xI>%|$V0i0vkt%Yc`M*biU(?$CC=6@vrEQvNSGJMK4N`2#qWJ*HR zwa7N8j+in)NM%DID~6w4gHWgEqLt{)c87aJ$b~~J{L5^DuZyD(B74esdm#(Zvboxz z_1n#Ly|Q1n4<Mp0KoY|=pzrv210rfbJ1jbanHiV|DU)R7;IQW5qXZ`!b7D?{*|0#N z_c8Flzn;1b07a6WHW+j|nxE|MAMT$yY;`=F+qbq*gL65{9Nd;d9Wbw5mqHyOe<MwM zV(oxqu_8LxD?thqLam~RxiJ>mQz(0+C76|m<mL7{`In%-hk)=juv1jjAz{DmL4}B2 zPYYrd))tZXJzbOW(b$H>I5%5-1?nZks_<+f`3fiP*Ctpp#a56ke_GKJ)^(dDh0cTk z{BeiTbxa4tVDJ>q0bgF&^E|A#MhC>rqznD(212D%^m{D{Rh!6*En1B>wa8ngw=X{p z5rst^%^`cQ3v9j*Fc>2eo&J38wgIQ{_I$BBQ<Tz}XLG147L;85IU?9(&%y6=haWSS zN(^nO!(NkvHFNca^Yp>2++-ae;eP&V2LNG}%=G&v8G>zDq%?QnvR_u_!S;<t<8RLj z!_98+oED2Sdg6R0iGhN6WCo=~2jc8^d8<Px1N|`k@vr2(D<yEqk!r(LU?6M<4c=IH z#$RH;RK7mp&wTVQL%FL3DvJ4+qb2jAAacBoVHIe3*>errqOT*Cd5i$YtzJR;=zc=0 z2&lgQ(gsLTRTfhfG&iO+=AP}K@y>tlED3`32Y%nv#3k6LMy?|83^Ov8Sf(TIOZ=h- zJ|Rc-?g!_WhopApmg!aoX=;awcU82EWb<}qs%cg1WhI4rPO{fM7Ee6%xVrt_h@TK> z%YI5wvG%?xdnF*T4Jv*hqNTT=aycFuman2t&GqXLrmJE+2%W$wpNPEAs3Y5kpu*BU zy6&DWVM7SaL4qbOC@44-{`eK`8DDHY!)rv<4IwO!AjTsEP_ahGV(<-y0^{5JqF`E{ ztsl!*^vD!yeCh_Mt?%>-N-GAmcAHr+m>>?t`(7Wakx|)mZyTWkBCgseLG?)vdNg^g zLh)^bRtRkQpfB}FaIIc;D+D%PcCDwb#XcB!9nOIeLh6&2m07$8m5U}auDU73yZQ!i zbV%4t$TX~ficnG+2Ta$P6Q%>O_)N)I^#><Zpk?C)=_jSka$TbnN(0E@3hh*dP$ASt zzgE+?0_q%Se|FD=X%YJ#dNpWSv~=?hl+=E4+|*G6?bZHRX46-iXlqX;R8JERsYJX% z{q~9IH>_G5%+<*$d$R5yfdDE+7}{0-4c48e1nQ~?3n!0YTEUdcB_@Fk4>HYom7uh~ zVRYlBv|D!ie4VAtk^GPq#Ns^|-CslrP!{VQyy#dW+f8qFkur+Vfx&y<nIE8ZlYhon zGtt8Ep|BnsIpt9LH%gw+(HC}z$52xegEA13!73m+A~zLKioc<(L-1<gr2cXCdTTLL zv49gjtUO~rp#S1}gF~`Ty;qYfjS5X^hfI=c0wk&0Vnr%gQNEKI{ESw7aV_nRU2qzh zNj*?`xuKch!nA}a@N{#)8wnWkZK|w}W1stqr)TgpcgXS?@<gJOdsGX_&<W$KkHIvm z=>;v(JFNK{4e4HgZ*jZKy@YP{GRaPJV~8T-IXfEWlDi2~zTDRWy#hGm;_(>~d{+QB zOtAfmcUH;Q0E?E6l&pA{&~R#R^g8xm(QptK!aBb02dbPXSt(<>WEtfB`zf?lSg+6s za_DMhbO=jBW3~!Hnl!QRL{Cfn43b$%M!Gt&BA#Amxkn2I4?QD%R;}M~fDnK9?KCBp z{<>W)Af)9EX=WwmQ*85Dfd|O?wBHYD`m~>OZ475|-^AvRdgL40&it_+{VBNX$iHMU zx#}8SP|5X|qL6pblWYo=rLAz(`Z96(PnwdoJ+hbQ{Q}49(+PiPYgCmD-1XPxm&ua8 zG6&2Qt;%L`r_2qD#F}_Wi7x$GmJP;^3rBxF_eX_Kgm*ozr)?fc`LVi)XR~?L+vy-Z zN<q6VTvneWI2)?qPpFRG9#w>p*4-Z1L|GkzuG%)E*9~};=K#FW+F70C#bF4MaN_#m zuLE=TBye+@`lT9rDB`v5T3dp5Dg{;)Y_^m&Q%w(lP*q0mU%(C_Fq%xKVJsp*Z?*mr z2>veraSW_z<0QTu=d}xi`pdA+qL;R)E;Ha;`(CH{cntiF)NJbSXRFgkb|sI8vGPR3 zUzSAJEzmJQ=<a0>udIQOV1s8n*e_K3eQLQcFJD}A^TaVkX6ib_&CY^*%#S5&SAWLF zE;zKktPktPA5mFctg=(CQb)fx`zRInz5Unw9dM>$i>EhiOBdf{<606vr6l;ujl`OB zfia9ZaM3j-lZV{el<Pn~S`<~CHGcbF`>A`T?%MR#CiRB~Uuhc!B=W47izCf0ks7Ec z<O6>s0KIpb=X=2+Efez}2;NZ5_KYbnOkSnnS_2ul_QvD3Yx#wVUqzd?zfb%Eq1H|- zGMOmYV{f@XGCM&pzh6j@X9iWCLS}}B95Um}?;Lk?U1xdsq-r?T%2*x)eTvFLHh1jX zd&UW0*&N4RGD(TxRCd5@3{URwzHi=D`N1|k;oVM5a2P!edmeB9xa9T3NvB(?_?{&Q z4XzDlM8NmjN1&R)2L&1}gs9Rt{%CZEwtzY1m888Txm7|OBw&>*j<x{I%b)jX^#d*Z zQN`H%9DA;X^r-H7;Wl~Bc2MLMr01VMQi}6H|Gd3RWA6UCk}_bgoIlmp(nRWW4L-vu z$<y~ZOwzuP0xP?^6?|vA78Q0p&oQkbwYPJO3{0NA{3l4wm@T_Y?j#i%Xu=R<3?$ev zaMyQ3Au|N<BB!BybXU&Ws<S^YIuF|}aJ8`fEgB=||83H>Rboj0cOpDut8X2#+c8fc z<^BVQLZ_etSlf7}bcpHTC_+%l9pyb;fLFdP_rie{nQKUFhgg-};Fz~dUWxVQYtnPi z(uzLIk-KS6aH?%%d)q*d#U=fSwXSh_=h3*0)lvi{;Q#{{TlWVahk+?34eXY}y^#pj z#mP~OgL=TiS+uy&U(J8*c@<A%w(I%2!&gzt#NyfTj<MUtlh|l?Tb%R|PC6hG9r9}A z9lEgd>VlShSU#Oa$`nt`bP9|i;F`}UE%`^Crt~IPhzCzkozNo!fG(?li<>0cy%u}} zY?)#&fKSQz-N~xCr&3ML@Rz0U5HcalI?K<B=EH9LsrZo+V%rCtuEvx5#PWv}XN%~@ zMW>X>y;;B;IZ-Ob9$a4;`0`(hB8La18x^-j;Zd72?<5HN!KzI{f`3j{)}1^mfXKp? zbZmdj#q1Us{ORkx#dT+t9tV$01hFehnF_ZMZ5ln2IM)Z3wR(k+w+r?YCuK4O(FzTO zfrH;mDIST81dc5lB#L6#gH|rODZn`93KCL1{PYOiyZPv3*mOHdw~gC5OX@@2Q+p>3 zF9SSyoNhGxI)b4qCmIC*)()Ta8YN?#o+uhL`>$m{Z&B>V*DI|V8Ma#_iK1=pnMy^x zklJu)&IRu>*}8g51Ao$vIw@7-<$5DQjl4~*Q*E`JmE9wO?Zwqd1}>%lxu~9Pbi1A{ z)S&pO3-asJ?{KuJf=Mhc2083Hl$*M!>UpdA@Zrpo8rSO7dQj6HXCL|08hg6mis4JG zJP4;2ny8-V2g=%~c1Dc-4z)JxX|CV>c^X10J*v)hBp~j8Zz8pJrVBX(rO}!|4l_Gk zfKzhnHG--=btWV2Qdr21lOOcGau<;1;_QT|E9v`nwp1%_Bj3oD>QyhtvF;lCA-eS; zjsG1~2!f@fw5yY}%yL;i=s5=XB9LcKv2}ogC<P5YW(4_|&JdW4g4eF2Be5gD`GJOL zeZ1C<h;UA{)C-nGcUc-?T(l~Orif%x#%0N>XDCH~#0hoE8G8gAmNvQ@L{b7`&pC+% zKj1zso}s@SQ35JspwPzU%%+ZpLZog3`SR#uEq$Xbj0T!!7duAfSrf7nb8co~itpuO z>)N;mHbnUG*m4(@QYtH>b>umMa8mim#Os=r+|&f?nr`huC-8Gn<)adBYOG|*<F237 z2fu9GTd1+w@G+*tpOFa?$Ku7fv(KU;^qMrTIM?PkC6#UcoOXT1WS~cLEhPPD0=$v0 z5p6~8B4WLagTTyuEOI<#MW$S#W;oG8TB&?h1jTe1KJ8QmF`L_qh7hFJd`Nzb!t;an z2%H!U6$|y9TTC448+v3%d7|i1eEkM4l&*}}unv_|gyR!wg!&x|f^F?4rl}~=R^I?* zT<ksg<K&03WM%r;n)UQ1dlqW)-@Gebp9$gTRVAT>tDkE+z66p-;x^=U7dyE%1Q?EU z867iWn#ab)HzW$~5z21qtM)-NmS&W~d4PgNBkALU2dOIe1f8@nSHglM-qbTC_XrBn z1Ra1WqV%yS`F!F`n0J|6!J<MYoJWCL)!mMY`!SXjLr3!rY}PuSvb%ZFplVlJg3iiu z|55Y|jiTUu#XYtFQiYnE&!0cgaD%Ctqb?<+1HCsaI)#vwizJgH1N|*kXLisus@615 zC849Se{_4)+LcBnqzLEYJ)7$Vd`KHeK9yzmHiU?Da5rZJ>a#+2V@+lWk$rPA%I-^L z>+HLWr2&w5=Gf1k5rJ48kI#9RL5)7H^9(MwdXayJ!)>^~KYYe5W;~)~jqzWgJdyV@ ze|R+8W#6qA+<heN&()YMyg9B;xhpz2e7<ddmi~74@tWyjqpCp{!D@xah_}7mn&$G1 zz@cX0rCUB6`QTsmbF)T%Z+KNmVs*BSSR7JBZA;~m)8hdR=THA|^ME|pIMFy+q?5hH zaIrN6oZ$gUMIa-;T1oqsvE0U1(`Ht&2O9`~885$jNpswy4v^HSDsmfNM`L>8NbBwS zNo|Jhr4W@x4F)KjkY%9QhX2z{!fF!>{khw9EpjBEc<lJqO)^yufD23A<L#DlSKb^C zwozWC{nd|*1M<cN{zIjFItUG6&)6MVI3{l03L8stayG?Hm(flM;_u2~DFdUwICW<1 z9nADjOl$yj<W+A;Qx%MFvEk<pO)w?Nc=0#Jf#w-W-!=qsdKP^#zDwf7E&uP!-WW0c zJ9a-%Os3gcbE3eIoMQjZ_LmL}(aEUq!BdT6|3axPiAdWk$~D*Vnib}k%slY^c-mKc z+Ft~bA}5R^qyd*uT=sC-BQ}q`y3OP`cT?JSRhme)GO|^?V-*QTTf-TId$Adlp_Pp4 z-rX!QTB1b|u4{3)qJ}4vKDdxQ#Hy#{dYUB5G<-KA9<Hw1BCa=kX!HD(`gy-(GR$NK zP#CzMh99l4*6jXH9e+bZaGy2>s{Tm?NP7SxY9p?753r3_#kPqqVN20!Z1(f}kg6Jt z`&@*KFFhFuy9rpPVT^!;9tLWNj$McP)Cj$tJ0FNrw>ljAV-qJe$bOd=G--B80LSwz zEvHxOd;+VllhTv%8^$C$o!QGkl#00p-LEoyU<FJhQtv!w3<aJO7+G`1gg~hH_LBrA zW|{8Szqu1DpjE1o%Dd`f!Be!W#0<8MYNDH$M}=eBa6t#5NCQcYseT3eR60-0L04)f zws+N$c>Q3-Th$=Gy&VFj@(B2Y<cOywV;TXfk62kIyHLkV<G40??8e`h^nMezsB*{{ zqF!()XCqnjLrB_1*iYO5O{9bAe^K_1!I5@t+vp^j*tTt36Wg{uv2EL#WMbR4ZDV5F z#_qY_`+4iBUEjB>_K)=HA6;F^)meQV>(B}A+83Y{Kt6|*(<B&vwhkwwW#@)jSj!f1 zQ+Z82WY_mLW|uYqu-6*w8)ULZTjn#;#|MAQj*y12oRSk?>6PB~zK$Z~N`aHo8$7q< z$H?ZEGS8nO`eg!C8Y;4?e^MTKhhAOi`}x67iv8zDBrkcP@1=tI-f)?5UMu*QGQ-b3 zpu}d=#6V>vm-M`CPA3K2Gg8BW$LB{=Iqr3LHF`O2`tJ89cQ}W0d}G>c?8;u-^<8=P z_h($~+lH{!$hjzm((~^GHn;)W<?4?t>5L*NnWCGN*}R`2FyJQS^5W%LyoshTV9uc+ zC<`6<K{YILX)nFO;M)fptK9yJ)cLwuKs26IlNdDPQv)<Y#Mo5Ride<hDnF<<UEgOk zLz-6IBeJP~nNH_mUKP%Dz)x!595hekgWEhkg@6L@o>8v}TXOrFnfn*60_Nv=od1@= zshPaR*!V?=S{Y_7&myy?#auw@`Yl$sqvLv2wN2%8gZ^d5X(yO&-@XXR+eYd-zyIKb z!ox<J4!z5TObHL1Zd12&>Mbs=tZ$>z7eTQMtyUpSR5F`5cBvg4#P=bUd(vijxhp7r zB`=<ehALEBFPLN)1JH+muF%xAnK(NIdNfZ|-B^|MguZIL{k@O%=z}(`=xNo|{--ks z=7~aKR<7y!7*F{K@vbGRaI|=nOkjwH%(AW&>F>q;$)I}ZX-FNJGxMcY+mU0+cQmtR z=v18<i58OZbH6|8HF}Gu>b8}m^(65$9L&{QrcMG^b;I;|HX+2j^Ad@(WYM}6r1`i7 zqVMN+Cr;7Q6cr(Q6$$LCYVOG$Z#-qxY1an|G7Nn5`KJVgHc5)N##Dt){<~Q1M7y)5 zMROb~q?1&bi&;w{#iyFlSbH@mT=_J=;d~%hSu_qcb*FZY)r;I&PaxwYC%7iW0Y4HG zV~2M^6*rK8uw)VVX3Xv~%NGq^4mQrbFC(lgn@!R*LVDu0W6z-k{c&BLQB&1IR;7K~ zskn7||2Z@yMMTvoH5=*YFFnN{jG}A886{Szp!@wQDDq-sT?1bi$+HWn6V=hXP*Flc zlxm9Gu$$29zcUjiS5J7&nq%wNb(5u+WYxrI9J?&{uU&`K4R}k11YWpBR9TW`j0=nf zgAUb?e{}>hyK~10Q3l{(C|^=bJ9&?~&{g?&`W<B*Z6vtAMUB8EkQFLOkb|-=H4T`) zL^Cq()URO&+l3dfO!pT?U>L1hK~N4*p&K3G3)lzI#v3(=?XT$I5t<66Q^(|(sxq3l zlav(6s`CbkZz#$(;@Dd$3T&*s*i^L?mJgq{b(oyTH4kClE~V*ht_k|#07cOernEo| z7-3G#EY1_Q7H7s}p!YLD1xPb(Bm9A;I5BI)`o!RcN%CfxTO>DjUxYA<vL{Nv@`KH? ze<Y#A$SNEcT%ZtHDjII?KRAl@Y<R4Eo>@rq?`0IC_7XRhuiAf?DP$>wH61vk<j>Hh zHO;%-Mw=2YIau6@rjZ<~DUp!CKsH1v?DKcZJ3`r6D}g<@E}K>(49D^KK`m^QgEwRF zG~NA0KD|04i}en54goFg`2%8D1W9<fiA24o5}{Y<cT?M3o)BF3d@`t)pNX(%i1;B3 zje8u0?2wW@=&ozgfOAw;J26%MLcWMV=U>P}IIx~IO2QmpSrt9ZI+S^LXAoBqcsN17 z5;vlpB4J?h-M!2&JfZS&{;GBMA|M7UeR<?SBAgDUZ$BAs%`jDXG@NN~H67MuWdAa{ zxFd<;CF)DF7U4($%=*rl5skE!1KuSJ__&)d-q4%UpzZn>UyB&huyhcmdAuHJ&1{K@ zQ2}+Rv8$wcM=&Rto3VsK3=n=j)VRg*4aL65DEu_2ox*K@qP}w$vH;3dMTV2I;q#x~ z`6%#KR)x5A7r*hsI2)>3k9wXChWx{oq;!g~k7YO{etf6+@S_ACVS!lLynEzP&>h}* zPP87;Cz8x97$>FsIEE@C&a#X^Um}G^$vVFVr=KVsn;P8+vBG}5Ndsf!Gl0Srhx(H+ z4+M0H9OANl^rNAj+CT{AM>@@H4vHgrlpp+Fm+B}Ni0G~~5i#-Lh3ln^YCd}`QzX}( z4rScDoXxBU4Q#pkq|S6Wo@nVfp?f6(7S*~Fx&idvMA&vXF)F8S_?J#7W(%~CXratN zksy{?^`gHOo*?FkKv$8S2rqlMA#Jmm6>}5<ztQ2qJ3CzSfYI8ES~JCr1zrg20nzL6 z%I9ZX7X{TP#&5kvp9%^~DcGYr%(u-Dw^|5g3@hXjs_0qQ2e{6_a0-P9XD33)5;n?! zF@plBh3L!*DJLkx;^-lF7V%`qx(P|Pzskc+Ja1eH%biZlF~p}iQu-}78F4}zH#rTZ z$Q!Ca42FkhC~Ziu;)rIG&~Zm!WG&eJJyVG?L7vGTgebwKV#_MPpng3afjRU?qhvC( z|7J|5D8n%$Bz8|;33^uS_qN+`^n7HM8ST3)QW_}DpxkXR5UcMW{FMrqg6AsMR$eLM zm6Cin2BQX9xjUhN@q^iGkS=f5w}*E!6%FjYJ4?K-APP0`(~(8pwrF7T(}ch~u23sH z%CJ7ZZ8Mc;wvKy#F0-_B3apec;LL5|FcbGrzZy~vy2KPs6E8o7h1*WXJ-toFT}0De zvcPK~iQ39x%Jp$dTAi8%$QnIFRle&8sf2(SxrpN*gusyID8~)?yujsgXbF*qX8u7T zEiU%!Kp{_vrkWm;@pen2)sv=kEv-q7d?0Kk2Z3Qu_2GCv|IKZU)&<L0?%Xv~2g*GA zO=-G9bcte@gx`NANtH83it|NpOD%9-7MzSmZqrCl%9Hzxs;8u9MUDsN^9#Lbw4nYR z4l`+w*P;DU$-CD%NK8|3kRaf4zJy>cglvdiZub?v^<%_J$#^(dji-!7GGTyLtdLAX zp_QdpHIh7~J?sR+%q!n{?`ZN7!X8Yo$g757HE9^<)i*=)?=OV4quuuX96??&2}3#> z-%IB}8H9$iH66)?Kr-FXKBYEz-$y9@Ew#XfV}w3<m+~$^Mnpvk=ZbC+GQD>(hmvBu z7CW{M?U;$<-~m$6Wdy4WA;WpfdRoZzQ;d4+BpCIO=ir_WGXhDp??9Vq!k>#ezIN0c zV!sjV^6}t;H)y=7jFd=7k5{bYloMG4z0f0uNtx9>&1!_gns8Mu#cW+L?-YYaRQp#! zlsiegLkyZ0v~K+G`-rv01kOAxk)>tYd7?SBq!ZL#T8aVo2-&y>8LijrPEgcGl+2#} zH@^pVhcO+B)3AjG4pSBST?h2rwa$=oxCkXu-~=P$?*gd)#RdlF4F+AcHd)ocZ(qRK zDXmhqt(SRWUye@MR~U`qaCyblVoesod~G|oB~{=rc^CpBgrp&!FZtHPG)5d~LyY4y zqUlRPMk#De%DS~eYAVj=ET?IOww$KX9+(BHm_c-Tn{h@dW#v#GX4OVZD>G!Cxb;yI zre<0(8un)JV~mlqWu(J2@0IqQF&f0EPb=fOoj7ABX@#Z`d6xFWG+r+3M`?v6W2GBG zW+_~wB{{A0%u={nvH*G0^zTW!#s=_vEQkzOWMLm23=K0u9(f;cv@ojfzduLP+GsCF zD=3zCVw!HO7!D2dGV78vcQuBD?hK06rB6p#MU<iK4dhqhp%BX+E+FCaB_wCTUaemD z*Y9Y8VOOD=_K)WN5n$71X9A{oLHo_VbUNwk2aS)-i>|vkaf7uo0!!PIs3wpmy(gs~ z+Ounah)hP#63YIY!DvXEYG6IIUrH-2*YVZMG7p7h_x1$^Z0&hW_=!YF9vs}(@YmA7 z09v*rAU_PQgJKFbD{4Jl)e$8d_ue6KarhYqU-EkcA1u4QU)6DQNXK#GdIrWZoad)M zMHV(rIG0%7jC&OXrohloE~VkOdw4t)L{bWWa1mi3cKC>}fTe67y*4-XIB+rH@X~Yp zf<kcv_-jIOp%|BFqA-eDTOA&=jTz_`jCi^%ro8hZI--#%Q`c=lM1`J7B@JzBa;mxj zJx`m~EEm$AwCzJ<o1MgO|EL-yK(}fZ@rycy*?oluFGGPWy>$)WUCm!!@{^9?R-7Sd zsxB67=;l7eiy?pxo^sEC480f>dQxvie=Bx*X#|N-GGdc2Ul0wnG6l1vo-5KJWEThJ z9G}#$N6hW;nxV*q$1dbmm*fXYqsvmU$tv=rc$-w1zgB@Th(z6uCpC(s+s^Rv?X{UJ za(I1W82kY0!z8*y!^QFFjwo+1Dr_Y&DAMnran#1w;pS_&!i9e*DBKetJt-oXX_302 z_C&Xb4FAH8wP^`#>!v#Bw8XvBizRJw>Us~s!3NQ>EZsKvqx21s_~m*POTq}?V8PQJ zsFtz0i?a>U^#Pj?ZS)(ceg~q>If;v-8iQi%ihxbtt%5|h1UYH#{Kg;9v#KOeuBG`$ zJ)WQ#1u}vuDz|~k%|<XG$^A%i<bftw`zK{rT|epmc9<L!%n~TSihVoUJ5<+hreesc zTnXiiorUiwMiAb!Qtd@uu%PqKb8bwM)H-~}%zhOORRmkQR4Cn8PJW=RUZswJ*p>I^ zaeMBCBTQ#5QuMpW04I@s|8Y^E{?Uz=`4Ihz=gEqHtmpTx@R|AiC%c^=C+$)vAN1p; zM)CbGuN#l`SxGpP{9jMqr^%05PIfy|=j;k0HvOR6^Xu$EZLsZ-kW7b({ju(Q)Catg z>uM7yyY1J+=3wWRmmK~V-x*%*UXLy?8_Y`0O7+|nyIaB|lVJgKb4WBZyf<|^$o0C& zl1oYq9v>%e5YVg`%y9sn33)_kw1|FW;jZa_4e(yvcG~H;@m=T=GD2jmwLkP|mQO7R z$1vvgmgB$k5Xmb4B)Tsaa1;X!4gWNj;GdEnCNlem21)@h^=)?!2DJHx2w-s8o+hj@ zzvi+Q-}#|igwBY<`LgmTJR>aPrT+O2Tp!T`ji4|t6e;#RCv4ExVRvdD@?eoCzd+yZ z03ibDfa9?MlxC=XLeirXO6*+Apm5`eM}ughx0?vQ$_Jki#^eww1Wh-QV{I;okEpjn zhh)EL?xP?$W`jemecKWWB{UE(lla^F1y+E>`}GeQYo-^)WX{{mUaB5|y9J^6<p-0s zjS_dA@f0NSV-9EMi1%%yetNfN`m8I*asLIV6h7!GD%{8sMnNahsIRu}bjDT7w0)Y< z@Fq<&0}5rA-=t$By1Voz;$XDim*y_#f*gv%R4O%~Jo!ffa}~ySg#aa)n23zs@3Jj` z`3^j_p}-;ldrd3FnEYw0CkXnomk8<LYSHIW?7&PUXYm$7f;a^9XRroHLLK;KD`CoA z;YfDah6Aq|ocCdp8Z*8MVUMCjMwBZ~DAtyJ%OU{%a_TbjT@B|KWVzmRCdJaNB1h<! z$@I(A-5e_1eFRomKQJ%1L&dqN_ut-Coca`6V%eT2^5MX90=z(NV;^H~6K|5WNVSNO z6;_l!ZiTkGwf*WStv0`~Kc`}hrOmmT>V*%FVnK}GfS?4W<$800!|=7$9&WUTS>I$P zu1&h9bhM7v;Dil5(z#o2c4%9Y4u2THT@K*l@Mr)pr10B#w=6b*#jlfU&0@KZUPhKD z(Kc3%w=tm<EwttC`LipSh%gQj6E}x=ik3c%3gZp3!iR<^nzcUcn0hA%9|h4-n=JPd zQE$b~Dy7j+*`U+4=Oo%mOeO)f*Xnmup($=@CYwndpxBw}cAI#Yv~lJADG^-=;4`$= z70!%i<vo?a9ReI#ll3tRhCa>_SdCThFerb0!z?%Iq^G9;fg6uIl8Yh$2SfFQO4in8 z%#FU>qub*+?PxRF;Vo(mE|EA_QZPa+qPvBR-NGUbg@h_ds(3*NpG-v*Wm3J9j}XZt zPO(8uk1aG!9kG2bx!gQHG!QKGh!PXt8fQ8_WG<5wt+1dZM5o=UfSFlVdK&E}&FO4J zhI%@5?&aEPBdrV%76>#Qio-g5su`YE>q0Y+M87{Fo(jRlB>5ealX?<rhlg;68wgEv zC24(2)NewN%`sxn3G&Z&+K-LFKGAJ`-5=Q5aHG5zPSTh5%Qds3R-Te`Fe~@WQlzlV z|D5;^%uIg%d*bUOd4;Tm!pe>My@0U>gw3;eE}_W4Bc(PG{z#MfyKHf)R7SvGf*bgy zsqr_T*6acVnM^sC>n6Q5j|C%HTSbC{tO8J;P;ui%u{8JnGuGllRHIH9k><Da2@OGP zdrsT1U8$Z_e#JNe5M<^b3%>`D->AlpyW8wcaR-wAvP6;aS}6KocUNDl0x0&p4f_$D z2w+kR{X*?*BWdQBy#W%qcr}xSc)p1Xsi7HqQ~W{A>33|GW-24=ZF?~Wo=jg95qxy< zuV(4pko5*NM}?W(Pam#Vx;kAxH-|z~a51l&1n86Be<x*%RUu^Z`kPKwxA{NZ-j4fb zr-G|PR!sdccIJ^Ju46=kk9RDLpwnj<sO*2AV_BUyCtIpIXL)|gRo~NVRdSRoz&xz8 z*;Sd5=-|;Q?LmlA95$yTrR;k-_buI^4i2O2zO-Okt@cDJ;F{KAcCrXMsx{_f*;Kmi zKk0+k2`eCdMvPSfo*P`J#yiompllI`@Rwj|d=*xS<nY9&38c9tkaz?KOPHoB01781 zg%o-ltTwoDoy%%N>wc1_xyt2G7|wH}C?ob}`8gzHUof_}5!1|r;!LABPR#lEX;@#{ z&ux$LMiZ}ZE1@ui>ns)J?E|;noO;yXQfo8qQQcYJ&*{W#!(Jsbouv>WHeQlv22ZvH z?&L6bL#dcdct<&>$S2a~RaSh-dZxruavss2Z9$~%^Vvc^?L`e0fy5;{3{!dCTik9l zEUKpa(hPIKD^ci?T^XH+Vx(idldzR6iW1S&Se>rm+I%2M3^meCBuj~u9UDqvyfW00 z@^I}v6oknldgqC<_5z0+is{v!^$S%Rn32cj4T8eU24Q{D9h==rT$FRaP5+x4GLl}c zQ9{RTQEK^yaF7rx26FkC<in72Au8J8?MsI1V7QFd0gR{NJVWiO6a|r3OgI<SPTT^= zl5Qq{H_z8Ce`+euQ2_;K1N~N4>-+di20VS+F*@JgSOob<4yWXA3|NCvFk`AD=u$1! z>OaE`b1~=#3wS5UBHKzCnx1jEZVg2gqv^D?J21g1#vv@z`LL~XArVC13bmv8e3NJh z-1S4gO`3$;=6U)}WBFr3`b(X5nWIvUaJi2FVepGkyOqO;F`h?uF(pOQEsc1KrRonA zyW24TNYYR(z#MqKjT7nFF(+~0xp6$gL)J=6iv0%E<-lu99vUXRLC%A{^=bL?c_;_( zmMqMF>!=2~I!nd7@t`2uo;f89-DDbx$^mp>)K*Uhyz}On5W(ALiwEr@WSYGuYvN`m zi0;_1klAH%D4z51?zhojZAkusAen=~joMbC|Jn=}!)Y4NMPYYWG9+AjaJy_|0hA&| zknGn^LD3KNluNN_&ah#`Rv(zuk&kf2V7*gDNj)(|<G-8tP5T>4^)&fSHEaD)hD!{G z!vb7t1!$d3#dB+iha0DqK3hb0a)**e2`gF0n79#OUR69jhgJhmE|;N;?)x4UN!9W- zTv~5BjZEG7u9`UArCW7XMbFP~l~5?mh9HP)4L%*uDaP6pgUtp<*U_g=cpYfUvtn=P z(<{wxI`dep%H7p$qCjb6=>iEJzshCxs%6d_<u0s*JT8=~y-yqEfb*li1sDRJ0uOLY zYk6GE?+M-LzL8|H<t+0(tdZX|$o=VWmNn0|geQx8@oW8imn7^2bA?PFy$q--m1mNP zl9xdOu;6g*Y-Gbu;&}CbV3IsJ(eob&!k<CKV^dLyGQ-@<A<;*V!0!;|3-v7{BN?4p zKpM-9v$7Owd3)TsFR0<9)39Od>Mby&ioJ5EJWkM$Xu-XAFy0FjGfze?z17cl;Rj0u z_dj|qNeW}PWNc)K!~F(X#B|ntwu4E&ewy<?vuNkRaB<xLWkU)k&3b0@zuK6;g_`v~ zM<+Q7Go|EZzy)Lqc`nA)&HP^>A|jHjx6PY|oMg;l_Sc(UW8ZbP99PRV>0<_kQ1ecJ zsSq#6DO>v=EZX+|KmW*90;y{}>Ytjfj7_`F0Zz_!lJxU@o-Y2JpxdD45)Lcs+UG44 zW>x62yv9UTTv2&ZnbX3>&`g#zRz})8z%3L)u9-Q3=1k}W@AXk?aCIMaL=ryE?gG8m zLddTyB0tf?pJC2N;b|$#HaO5m#byM;h&6*EQVQ};61@O=P?G7)$NSBA_4Rl)P?Gcy zFgZJ@xQ^uiz^+P1>EIQjcZhVL|AUl<p0z-4V;EY)i0CP1Nh918_K%j9caM)ue0K3` zj}QhGMtvBX$FJn}GbQCv@nFAlxu?GwBy=G~LHSj8;1ky5HF6Q(&4Xq3K)Fu9NZMCN ztjRB4Fmq}YAg2it^P?O5@U26lH7hbggj|D5RTh)^wyXH|XdMMi%=Ycs5rRh3A%LyG zj(~nX5+maGPg9){`Cc>>cGS-AcB@WF5rS&oF+BWkgGt@U2~(7!>7(+SQ}Pm9)*5vj z!=9nkDtQzne;yqy)(>k$a*sj=2Afz=E_?s1qiP4C5$uvLQ&NpxPu2tmy6`#$wjk}8 zq-_oyO^5(B%MsPtZ0}-u#F@S46`VZ)bWj(W3A6;7B#9*l#jDh!Er3NVL6y|6FksLj z*scmG0JWs&Vqoe0Hzk&r(#Bt(0gfwvJ$=3~2$g*1J-cibzdAZqq1c?RpN+%dIosls zNpXVbK3>k48_2LNdPLU|-k?rTe%`PHy1eB@*yVFu1tSJ-w$uQgvsZa_8h34zgte4j zoXMYQCzJzUH(p;>&e>Cx80>I8%#A}1XtUPZ7(=l89#UCxS>IHXYp{fh-@9M<T-QcN z>UUm5nswh6ny^_8loeX<-vY#-&XMDTAZh`0v_QJ3m}jvY#SL$o=4>`Zck$Apu(N4Q zubfX@iAWfhPM9?%)i-?pu7af0v?yhxMPnE61T;NvJhH0^hQv<^-%j9e4uiN3b}?7G zl#Z7%d!LA55^DPW0SCK-4belw|FNJB6j>B!RsX5UwCx6aq)Csv@WTJX8UT^jzx`he z>I#dq4qhEl)gM)3lb;o@VS2FYdW^U?>b!SuvTJr2-AK(0tKB!%C^c!()`_wT`RJun zxadb@;(lVkn9?eVmgoL}9>SMGn$X~MKxY{-PLnK7CnB%EF+|U-x%gcBVe_YfjECN6 z=gl736x@79qlkE%di1V*8&v1tF7|v<Z5zBadgnjy2_(_@sz@qetqRrKpcex285EQ; zT6gw9mp^+3AaI%oe;&E76F5mWb?daHX4v)X-HVJ$Z^B|%kwYJGe;$ywKvdN6e3MgS z#osBQF<KrXc=V(!NurcHbhy`>I$kgDlj}uI)oE#Swx7|H-MikelV3mBe0z!Cy+Y`* zxjP33l5K2!feNhn%JM9DRon}d4?qUCoX@i=oRG9wbZkV?LQRaG9v?ftkCgdYgHonf zmGX*MVTdjEmqlXmFQBALIvNw|3oIy!BGz2W-=<XAQ^X8vEAE_#Ph*A$(&Sx!WieBY zVaD@MoUUj^-&G9t=XWY8KNtOTlF6k^5tqwQFFBKvE2prOy~vmtX_)LBxxi3fqvi(S zleBD+8tAHw24R=sqqq!`%JCR~YP|(-ln%V^o=mSBb+xA0&ZQ=-IvMJF$NF>=p{`#D zMQv*CaH(&geLnv6esn4Mb&)T+;43es7H!+?pC_*Ed(15__wdv3T=+kgca4#MN_oAC z`7kEaRR|s#MJLtHz$m_`i|DgE*|})&DIQEL;O573ZI1kjAA59A2g_+-Sd@<Qj@)lk zKx+)>nY~G-z<wcHa+vVfU_(%-2zT-^io+PFsy8gB=x3%(X(`ZsrlIwU5V`T#QA)$S z?<>YYb|dI3UWl}fmGDv`YoDWP^q}eLR|BF<QX$G0bB{s@iV1gaNaP<mf9IkB3^ol` z)DG*!qGLg<nc;<K<4c~(zD6mGo2<^ZCd)Ve^FF}TaMN@ZJ7NucRF$4li5GuGU3iTY ziJ~mELyD$SlF}ztAyi*Mq*S4yEWV>6fF*Ub$Q2hsEtBD3T0@21Q+J`)%UML(Bmv>H z&kPM1cf_!BKQ(iH67R~Xq<knmj&zIeVN~al-#Yib;=ZSh#UJ$imn|^*P$Q)JMZj^R zlQpo8>@u0WF>5i0z<$^UIyuFWLwoS82#)PjxAJAO$6>1>{C&WLzhVgIiVpxs-xOp> z915?ru6G#AHsj<1_eaSC)xlDCOrcuDE&8X%6jR>t)p@f7ZmC}Gyv^~#G@%s)o-`=C zW8ey%HH+0HIBTUgR;&+^+_6D6jdbwp!d9yn(Rpb{MTly{+PDhW&a|4ImxZDYs6w$B z_XdZ^45*X{jZtWWc=}@xtOo=KL^n$<pG$sreNC*4XASYu&%sF6-pJkxvES!@zY>>8 zn1PB%v6yUmF)cI~Kh4T|a*-d>U0&PX{a&>jV^<AV^}Sk|=UQeR`x)&bBb-O~A}L&x zM$EQ0vrg)8on8g$7x=24&$`wAcz^+_rPvf>ZmG`LsGN+1%$`AhL6mRmVnHH>Ab6T< z(4K)uB%*WpIn(P~Q=LG%$wRnvi7S(egeUjs(bm^iEA~6!#MFGyDV`>l`()VX9yQ+) z;sBwW?})9;<UfE=UQ1F`WHddKx)qjw{cS}GWQ^OdGhUQ%Cu6>N?3$p3W>I8btN#W` zxU;c#N5;h>5Ug3_TWZxF&=rE#Pnt(GDMqWkB%ZR7Js%Kf8xWPgt6uBecL6Y^d{{sV z#ws~Mgf1mPB>w5F-Gy!qy3A};qdK9(j*RV~UBn(nusmjtG&r<Ee1ru{P47e5Bquo` zPhYl0vcwM)`<i&0I$l#`pQ=#C3J5u(2o=hjS?WS@IhVGB@5QgpWv5Z@*J@<DnZqH0 z+8&HUgW0E`dbSl;#dzkTRk`vvjCM`>$$CfV`syI}PP>|I3-J5H!Nx#o3Z33;p$_`@ zVlhCdGR*03s1lFA%jxEMqy;j*{{Ld3E!T_m^@tR>f1SfBspG-f*yTO-h=KGr1o4@| z!;@g%2gj#Ciz}~AELR&{L~YFr?9oDp*JQfN!m|ir9GITe%fgEep}N!Vg*|lasMV`6 zogic;kiZDn`tEEOUsRhB>B;7J9g;$_`;foG+Q1kacoJmvy4(}|S8LaaOb3hy>grYA z!TLqdyK$ZwY8zM&+KvhYn&dZ%MDTXJivL-2dd>;qhvH#gUQf!zJM4PcTY5qRKIIj& z9My;NR4{@)^AQr2)%VlhrQL27G&AUJvoN2W9ql}orPKRj!jK%2srG-&sA>h=P)&L( zSTM)Dw-EFqhg>sk&x966y4{n<ew!w-dcv6)LQ8>pLo&K?cwjf;V5PGOxkfPeIxha? z!DfDG7Fo1Ah~9)ANezZqz#Wu&02A<EQbbq^<e&J`r@}yGiZ`ES-Kpt=PB&EtTQSr! z8Pt?E4d8z#vrw2W3oqU=!UuSx<2De;8jC%*-kyfVGn^*!^BQd)dOR`h4CJm{AK4Io z#rYL>oa}22?q!mT+!gFbdi8hl)Hynj)imTv!3qT5#>Y1vb}TYZ<t>h@(V<Z+TB~tB z=NNxBvHP8}yJK*jMS*~Zz($?;PZ=!{mT;t&AZ1vj08xu|sec9m37;@CF;>`49WND8 z^jARuxn6sXW_JHUEcuu;<D=xuy-&kKLT_e%aH47NO|+si%o;5gy0tptCU16=CJ&Ma zS`Q)*3fco$O6Pm*UHR|xvRrvgr+(ZxMv200-u*QzxEaJ89LL07628fhNrhu((zMT! zuO~)dfhuR|zt8=Xxbo|D_7YAjVrCc=M*+Kr%s4~lDkX=JbO6pF|2I9E%Iskwz;nzw z)G%^)6kB^1i|;lihX8LbJHv{_+?fYGFvZ#C7T8FNYn)~NYvb(_qybG;$!$+^+VZi& z6s`Q%cZJ8_rc%ETNiybHJY?&SSUhF#3>?#iHNMO_WD;n69P4g6v*x{OVi3Spo}p}d zZ5ll!Z9k-w>En|-e^gJuYAld@6id`&hKti0P}6|5SlZ=G9bq7KCRa2kgo9?#l{v5V zXJjFsV8&-5BK|@=`BS55SUJ{WpdttguSr;pt_q8nMT*J8<LeaYLN<BQ+L1MW*2=?Z zFz@Kjo2nKyj*U4abZ`qdF{lzTSrQ#>Wr%_n$M<2A!LV&?5&~{yBA&&GZA$i5nOcvc zAeTCZyzFSti%yRA(}S++XczE6g>E+Dp+FbI%$=F_Yqe79r+)ibms$?cV{prUnmKs8 z3Oz_-Dc1bJj;T6<(Y70jx4Mc;QE%tWoe(T=vsnq&cbn;W)`-^F%t9-a7GAluL&(rU z_rBeegl6<0Y8{8AGgQRg6l$GYAw%<rfD_tKQL5ZzDl5>IhRkzXaM$&qOU6Mc_8xQc zM%L3Ex;LH0`XOG^doS-;%ue|^BT*%m{L~VUiQ_?m+fdZ?6KE>uitRm;>dieLjH_hJ zs-A?T;ypQU&A@)qT%eRHgN^qYBJvfca3e8VSj6<03mOH}K0$$;=S3Kh8@%AA7HDt# z&)vovsq@|prOVz$<-NiNsn>&p?8n7Iuk9dSYhl*MmLOJvryXx|#5t9Kd$~0t-Gxe| zl+w(#rNeUd)y`n%vVoN~VBJQ`!AjiR<Wq#^A72u|JJQKc+#nVGFAc8>^2z40p$>4f zbmGNEwbm7C*GPFdoUxRJV;Z_4CsoL?Wp+!nQTYgO8+{%qyYX5W!+4@CQ$kfZ&FjE0 z3}<U|-}2P@WImQXLJ5lEW<8y6#wD%Z>)K8mSx#tW0JWMeqzzReWY80Eo}NamWo0j_ zf)T1XecZ!ysV|q~Ual<@t^t{6&8(`bo@Y%7s~%>*Y&qYWny_?xnYN&)x%pZuk;)|w zUm+@p3iXB1w9Qur4xsXRdMnO@s>FEj2ick<tS>7#WQo)ZTYT6k6@6M9#)GmTqMf<N zXse-nVo`cu9mc&|4+4|4@Ctc6hAn-8?+;Qit5-qKRh%x&pIVuc;Qc4PJ6E`dA9JAT zpnZgYqG(?}Ne@3tbF-!(UyKMTk=kk9u2t4*4;EK7Rmj6)Skn+Zh=jDp)D%U+Kvz$4 z6%@%iWlEVIFw27fq+32qIqmRw{}C0aY>Tgz69tpk;dmHa)@i@!j$GHLr6=7|g=AaN zf-O{9Fo1oi!&KI><M~TvQ&eHTYfMY;ptAb*QNFyRG`4gsBSqmr=B&I!WsfSj8Sh@( zWLo7>+XPp;P&=tmxlUtDVp{Q$#$;NN&n`vLSDL0UzE=^8S4tzg5M{Gq>u3?3Y-_Kd z{iHVR+wAEBq$Wp8>#57)_Kerg_U7$F4UL|4Z&BoH#v|PNKRbB|3LJVW>^?Zq6)uk+ zX9FG1rqIrA`rtuZ_uq%cG`SRF>+{p!*NjdpiyQX9>yY~QJRf(DFl+S-^$YZ1_ZU=c zA<x`3evHOwSK)Av>EB1>(g+uB5E>XMX!NJO64T&Tkf{1=3CXJg(P$0XVNx>9kSBYu zgo#%JkDFpKWL{ibTvFkdnA_h`DCvIb(!rlB6e%<S@hB?bOJ?|%G+mz55YOva^aUz! z&vAec(ihJE0Yt%VJ_H5nubs8OcEs|s7Z8T@6LCeQh<hX%SJ8K9ux*PNV*T^iLA`hK z_)Fz=g38-8IfS`9D$1d-ZWl#uaa;?c^n#;?EkFEL;r%p<Ow<4<!Dk?do2u;+M+)|3 zMJnQ+M4$||(|gy;`js{JT%{bR$TOktB9$(k5WkbGfUt$ngH}>#_)q?F4-3e$uID_8 zHa=(<oQ>z3?#>2Ke3>~DW)Tvj%1$i2o+hgkZIFi3M6#rw0h+UlB`Yx|(^k{DM(Spm z68%pPv^+Bq58|n={NL}T`4rodDtwZ-0o=+5XPObXd2X@*1vyw5KA@m?`Cw&9{vFk1 z5K#L~NKws5PVx!CP9PwV*cesW-v9LsOt2X6F7|8T&7Mi>v-*IltHqNUH{<)tjh#tA zlvm8JMIF}jU~q0V9V`Vf87LNe7%eN)l}4aq_0=MtQ-vftwI-pvOtychSm(8<Q-15A zkgl(NdC|Qj<~_UWjSL*xHHNGaDmiLwSq(@Gnw*aVcD(dOKa`)k`J`x`v7Dl_KP0<f zj$-lD1j@*uob2hvkXvE<{h|V`c+-2JkjT#nnUHLl^v-_VmZLN=eB=L}P_jeceS<R( zOCY+vL3r0=WS5KUW*}u$Vmfe7z&CG3D7tGITsXk7N_K1fG^(l|oPlG~mY}#RyMNO= z-AJ|QYDH3@0;RklDUO|U>=o4D&(c^3VF9wYO;!LK<)0C^B#+TTUa*TaXDRjlvUmm_ zZ~W98S1a=^xZde?5z)!nW@Z5-O~ajKpz;HBZ4lG@b$G7wt0N%?bh5`WMc<%bUvDYe zN5@J}4SoV)BqqpON!5A7FLsh!|Gfr1hm%QRk!S?BPu0M9v8lEZtB7D&^r>fxiJniI z2Qj4V=8PpGOHFBCeG1t2%ST2_SBaXXHRw8zddyzZr0}}r{e!d!$$yXco7Y(5akze8 zKE;A+Q<~-}KWmOAj9~0|YV#+e-HW{Pi%(;w1$R%So6GWPn@dg3Bi~qi?CqsZQZtis z9dLuQ3DXqRjB4FpQ?i8Vbu*JfolUvWC57$#ABlq=RIcSH9p~$wWE!gG?(NV%vFj#) zdO{~WFQuHcM7A)^y7O~ExerZ;UIn!IzH|uqkE_|+AJ&-fJb~+TpBGNk;Za#ec=rp> z5eYxpkE}OPJcg8stL&-<m8$Xw+%1H?gMU3t<JTG|kq@ye2x=kn{va))8ankd0c}iP zq_XUfhlosD*lkK!Bw1{Mt}>7Lj;L}srFI*pJJlY3(J85ziw=W?YeCt8d9v=20kRFy zv_HS5sF$$lo1e%7z*&b#v;d_`Z;}O}Cr@2Ho?m`OMj7SE4HEdVs&3XJWe{%GT#qmY z`;I^D5TFX30t79Pjo5?dP-TLW&nc6hQGTc>q5N1p+qaBF7?Z+2Crv)E<_FSlivjO= z9EF&b4;K?v^w%rP3WkmNUB^hJ0HH0lf&dt~(|pf`DV0cgLeS1@^>JUcR2@+v;Obr| z!_h*UlqtRlP3_K3i{N|^xt2@Z<qq2^QrCvT0d#E`;ALJ{6D>BxL3=gwhO9_(rY>Wh z9!wBGez#$>agMgE676c?;(oINeNAkJG)JcYeDZW2Tpgk?KEqZYU~a{=6TH|c29v|J zI{a-2qky%mm7k-xt1mQJm~9qy>}_niT5Rp&oA=-E0%!5jfU_Gsq7hIvX&#=qNXh|c z(0vgN7a<Gck57SB@A+B~<52tA^mN9OpSQn{tv)}3yM3xD`cO`DL!R(?>Qz~Gys;<N zq*{VtmoCnJHD+me!Vp~jUC$6kBAKjSTg;X`OfM9etsX3wT<i?47?g4J`zr{JGjVi5 zTHT-fO0mKqJN}_aTIvYd7@(@+%E%M}LVBpTIR*<-=ID*L$;RAMIW6_bnDvsB91#O& z=lud|+|!&AJ+CvwesCc<+*OjU$7x})uE(n*6c^{2a?IP?RM6w5GBa=cQfXj?*|LYr z#ZF*{+47qHGG2k1U@Xbxh1Be?Y6>I`h{H4QZ)gz4Cius#)m6K`)7}po%f#Q@r@b3{ zy&Lms_Dr(dP={G@N=uJ*-MM$jO?j)a`A?S}4JGLA<Cxb|qdtM^4Tw$v-TFBG5+>7u zfQ!cqzjUXM3+%3dSAh$w&Wcyj%%SS>)$6E5MA`YejpZM1IBos+WzCC@T7O?=Q=Yk< zp0$43T3L16^m?534s<`u=<Otpk2@d9-}!u(_G9z!I!_q4O#gWu!4RrTX>;jjQf9kG zwY6gL-ts+p6XHvMRBaml@4M<P+=&3*bpSn{zXI3}w`?YQdRNR1_doYqmf!c&>&)iU ziqneSE4O5ArX5XJJw&QsZIMs=<IB(OV?oJ(oOr%l!#F{&FmHXQQ;|_x`uTHY)T-KF z3}M**1|$<#P685S2_8Da9YA&~E%GFb*L&kGis4gMK*41}eOSnQX$Jv)V5+3E;zk}D zUm!e*N(90GDcP`gLW*4>-vJmke16n#r?VBr{X=%gSQCzB>C`meKky~L<d*5EWh`D` zrp-4NLSw2i|H8TWgNC&wy9J<{IkIf@HrnYg|DZqFw6rwyDGWCMj=-bNiB$r(W&{n| zF4Vv(q1qLoo}l~HXFqo1SYv%0_)T;W8^sF{5n)$e6`vnrLsl(JQdUulX<D`^z9%Gu z9@<fVnW;-*4`|3-?keTNPq$$`vi90OIBhw+oTXK3ZuE)$+1ggc$aC%hYvU<4XGk%_ zo$&a$x*6Z_{LMpb4zRicinNHdz-2~t(A&8nZ*3xFalgAS58@NzkUd85doKm(zMr%` z6DuwS@X58!7}p*(w*lW~ZJoYU!ufYlbgS?vnXzV_0C~(PbEoAGq-(4t4<Du9odC`U zK=xDd+nLyFGwVk~irDo<=*CNHJ&?<ehcm-kz{Zq~_>fN<;I839IKh0o9-FPy1Xu1y zS+17|Bha@~Yb(dj$)2ih%PJ9L)}%hu>3DZq@U!&KJ4||g9{7CPhvkU`S8R8S0&%XH zFQ-A-6-8FOcZ<w=xMp2Li7Z!z%cGtTy7ez0$DO90)vKFUP3R#W2FHy49e-Cqr7S%K z%!5E+C&Pk{f%uPh-z!$?2LDTiTdmCR?#+O|ETH4;U6q{X3r9h6(T%LO!&Hqg5nI(T z{e-D=#GY^ErlhFB=}Kr>P|DoM+|FDz{o3~fU@_k3Ml*#E>p#uL+CvmRS{9CQIQ?J& zB`f1?UIOg*4bACFz<w8LZQNy)ZSHibSdIyAKn-4qd5HN1j64X~Ku{x|Hswc6T;Ff| zHdJjR&s!_A*2|*TJ@EZNfpw?tASKZ~L&^b{39~9|=k)KFleYKR0N^QCze+V@ZLIew z{tx`Ox#6z+T6(~Ci{y`m-2Z3&yGd_~m)W0o<p3XS{Qac&dF21=ljPZL9?33kbX^nO zvAELb3!=&Ca#RIMd!60-9(-+BcZ}wzU_U6|79%Hj|6D-#K4#n~dUMpo3|4BXn&}~; zG%wx=QpOGUenhZ6D`@dx<qzdRR#fjqi{bT|_6s*l&^qp;m*F!hmfxy(a@x8}4Sa}a z!uz_$tZ~isb+(I=YVDGe4!~ql`(?obyZMXooBubH<wdZ=>w88QGs4Xbzp)FnE%gMm za@e>RkE{O%XbqdsKO?Z41_RmZ2$9;(=Avu35#pI5g}9cpWen5R(*#jT2@TZp;%Lh< z63otdb9}s}I8m5we$^(Lcl0vD`@PG{W_RewBfSQDDIf3Z%pv4+?Vn|~e|olms^Z`* zQtc)Dc)=~We@zdsN$`U`F8rq8cF3Hfyq}TGN69T3=yQXS(Jhu_oY6Oc`8DSMRIWqU zDnOX(CDxX2`yu#=J0q6XN96G7o8k5OHw$hL1nq{>{7=WU8(ZH-oxwJ$%vO|do$k`> zyHB|sJPm`CedlUzo_QVFk@GvRHwZHgh7k$!v|&LsS$YWK@<5`(f&vddN48POA*hx4 z>?+e#U;dY@8gus`@xM7&a)|5GxprpoJGO)%1~&<YV%U@*69?%ptd=;;Bzx+AV&O#p zU$O9bW^pK9Wmx8|#95^hBc7+fOqhRh1O`!UIG#d@SZspol}=OqeD?@EzMjPV`tlSF zoHMC>ONOV^Ejm19v`q_$M=Vd@S&I>(1@(K{XS64i5dSk6*F6@11OoxP!0a+apFQT^ zw*6ldcu=im{ud7HQU;}cy)ULXzVQhfJ6744DYbJav$L`BQ&FL((tIbZV&M1Xo0ds# z?zYfs5`B6Mr*FN^zzj?sr~}tBujtK_?jq|iV+0=peP^~dP_Z@<l%B~fIUfPrTppp? zlERr{W~7txBF;gZNQu=wjy?fN=i8)rf{Hl@7jic%DO0fT+cR_lw8D0)P}OVdE^V|g z>Z+bgmOY}$+B5NROE&{9y1Vgk>dVIO#C=c+*(Ad5qIh%vM%H;-iB!lhs6GBh*8jGw zfq$}k2J=OPVDRSnxd?iS^7}+{uAx6hHHlXN9ahAlZprFtxirka8>h--uF|_@yUWH^ zaDC2&w&VL9N$%gCAja=+a@>&VStkgz(FTrjZWjHUYL_2lP$%X+*)rych=EV^bOWu- z1P8O(P49&_4^a!7yZ_%dq@zL2)N^g=e^c!)4h%N_xA>6AjN<CBW6m7|p$8~w{0d9p zh!fqM`A%6#A}%H{u_WNtV6At}+yVH$ccZ-7HS%s@voB5|2S~$!y0iVy@7W92m**s$ zUD+IF_sT9SrBT772t!YC*1L%re>7jGBsR7n@wnTDagb_c4Rd}Yx&hp7w*KeHM4P`c z`{#3az}h#pVJ$0x@I-%{npAR;JtMo~a9plFI}zEsV0Sm3-ltR?|6){?HDL;~YQr$Q zEk){<l3hXWyV!2@`#Er1`uiiv%jHOj{?vVVkCL~0@94i+!(MVRB*Om$l&`;%j4;Q! ziUQ#!0$7E8r9WLOgooe+4<JHWW5czLVP1@W!Wy{R63fc)v4+^#315dMNC8imI*OG5 z+<rJu*sigNH)MJG7(3>2b1+IV5XBfWgi#?xN^~NI5g7!76*GIJeX2u7O7FN81`h;@ ze>U^sR(Cf6MdVQ-$llEz(=Z_EnhW%0alkq0&)zolJ+TCK9SqfAI^KCM2EplU3sL!^ zB(s?{&tq_@*J(n7jMCCN9ob_l1$Iv%)o!7D7N*C)#MKX}`Lx%v`N49*nG$N16$uvd zKYC&rf{oQ2harEG`^|>V^V?46@JjJYeHe0G3^+uOUUK&_3kR9sWO==$*CZk*r!QU4 zhFK64@%LoCkQt;JYCWvPB`)iN$mNmQzyB~}Yvr(w1yB&=Q}g-ZSyVBl!Y;RGVI|Qh zf$t<rfPS{JAUyyo8Xb@~G$BXRjq*r}B_pt>tp1(0Dt4ZDeT1N%6rKl5N%BuS+n)cu z1n6z+xK#ru7<vA#W6-Y!wWum;7;~7skcybRCm)tQgIQNs#YRaD2}cSZK0S`d3d5fO zI7pc)3BU0u+s<*GJ8<w-3c+;#*Cndh$u@HET^P3u)6gC14?*nkmpZcXwaM63%1aD> z8(xclq}6e+HV$pVWLkEu6h$%BcY}L?6M$yuC|1vBoQ-!8?kl~PjD?rSX98XSr7Ccb zTqL*qeNAM<bA(+;w}xGq(h5YuC-YRYAva)BRzhpYH7*n<UndtpmQc_07eagpy_}`- zP97Jo#RaU0-LCipJfpDWOtm>sakt<)%RJ?lNn{bV4yv0o6ei|T_xU>Q1v7+g{u~|_ z1Fc>kpSbX-J4=j<V-?qQ5qy%um%C>rSNGr7iV#oJ?R4+TQpmxNn7u{^IhR_hU~@+N zV>jRt=xY+O**#XgZy9vL9vyMZaL#O&<ZQe-WUZyVQQpF<;2e;lXJ)jvs^*zO7g+8{ z=;h+{bbVf~?r@~n`A2TICvI&PU`(|5*_;E;UiF7z^Eb8++R#a22a+<s*@2)0F&p0j z41B9)=fVKK8U47asZl+o=@&Mu?$+h@;g>RJ5!0aFEb`fwO|en%$sut@K^5x6Cq1@C zl*A^QjduK9W;8Iu4+4St+Dy_usZr7^*JLsGOPbthL8){B$TXm~Tz!tjt~L(e8_idM zKBrVS3)`R`i0R`MD~SDB8dyVFarQUQbe_c!0yY$dZ^^1f;2pxV^dgb1=ywk*70>6b zoG(4pxnbK!iiTbQNK;YPJ?-h)Bz=&nMN%DR9d7ZWU*R#-$tA`2MxUSB@z<4GD6>Q5 zy~^{Fly$QTp?kf+`Wr!J9}gU9|CirzTB^;>^Pw$}9Fu=(&-?2oKNQ}69FW-)-e)j- zw+wX=0)u6{XPsF0x2hcTt-e*((m}}B##JZ6-q&)iC!dRQ2VAZcJ5d~$$Pr`fseC>o z>;@2e9xLJ93PWot>(L@tg98aM#K~v5@291WoX)%vXxW+y9PU&SpuBIp!>LJNh_+n3 z%%yz`W3n8`iF19FW*E8U*IbTU<um@NvJFbR-o|g{VBM7){ZECS7(Z!87Cb}(Arq4` z^0_&rmM)X`-cfvIRCPzf_coIqv0Ldh2|gnEI_xU!{@b@9NV)#P_n8dC&^u<!!$O=2 z{f_?Bi!jMRL_gNpZUo}!F9ClO`7)ZoVv?3Y6YjO$37x<KY56@Bcom&2!V)6Qn^2;b zd2QQ_o%aNONTP%O*dp1xiY4EGf;%<OM{(8BVraPPTsz`b+F4+=d&{>Bx<02%S-rv{ z@lLjtYq8%S*2cYV-9mEb+=ZKxnUimTctY!TLsRp&v|>hp7ntz4Ur1K&Zm%hS>Yo<f zgF#&T>#2Dxh*LX&^8pv96;ynJ``JELny$=@OHb8tR!93O-5s0o@nyqZ?i`=2mYy&- zOzca9P^faw7u{o|cgre67BD<gj+{%9JROk|v>2K7E*ux90lYFUv9^-oeq_+Xw?lV& z;9;PZe5y|Y+Gm$W($1YcoEhzp3<kn24WdjftSiaNMG1|bS&QX#=~HMgF(-^LVd)=U z80}$rS&s-!dJ)_Qlm|qmh1?$~58lU`VFd!fJfpnA3Q0bTXyuYf-sxdAsi1dvsD-He za=3+(OE}xi3KHVQLk^=%D&E9ursY$z=rPusJG{HDPGjOZlsWY_yHPa1yQ`K+7i>oK zTov=XFKg1fZI;foKif2Lub<CMJExDT+uK9)KHJv+N7DanYhzMn!f|;BXVZ07m@rso zXc#-E!;Nv{$wYXk(?Pz`S5gnGksRaZ*)IJ=f-eh-Juew0?u?GYGXxbxd|E-%$ZW9s zDYF5WP4z=(ke`QTE$!SlUjWw7I{y2SjeMg1lb^WT=S>q>O22X2DZ5riM&+dpX$fgO z*MPqU`bVnc^cR=6l4%d=SWTAkBS}5^uTbJ&um`4P(ei0Ayh3_D#P812y1ZVR3V$jn zX)47*>nkCK#R>ZCEkNkz;uR33DCQ7*3eVhLR7bOZ@<7xn{OOifuR~Odu(zU$yXCf_ z2R&)l0&l{8N!*c_r?Yadd>OSATA()PlG2~%^SzgMwO$yr88JZ%lz}3WQUly<Y$3k> z7DN%Kq^g-DCR&btcWCl;IZL6i?$(X_<n(k)x-U6iq}m|IO(^TZKlUL~(<4`_PAI4L zILI%w>UAXnC!q|&OBVcOD?65oWVfQK9g*E(1$%QGE?D{bx7A7G2d$+~X9GO}Wq3^X zY{ZnUMzWbhpdj6gY#Z3CA76wO^%YH_jOM=`PAEcyUmxx@F6^J9Z5n4z?P*Qm=7d+3 zSz@>9qZiMfuV6)K7$zjha{U-GC{WmU=m{X6C~^=}M`?Lo`mmJ`Tz5>B%=pbDCei!_ zr<nBssE(`_uDV4AX<}VN!m`e2@ykdkb`vlW#;czyq5Ix0(sk1>i7hrFNelv1Qvdj0 zef;{U5$ag+IM=cSbJ;{rvLX?h2a-o+fFWGwK1`4oAXj@_)n)$vL`4rvEov@kk>6hy z$N|iPN!h2zQ^eZJif6if#&Zu^wjU;%Q+;Oqz<x3g@wtX|N;zq}{okM_fl2*;f|^0@ z<o`c|nk2>F17Qi$WP3!wngh_gB))c=IIGRM^)L(g#nq!HX?JF68BMAaz#8-rw8gGw zG<RtN)s+)}lT<&X*uU6II$e9X6Ed=OeNf`9&9(aD<E#nQ1cTCPZK`08%Ql;AtyxZC z!TwNg@`}Sc(#IA1c|?kL?Drro#-D`BMWea=o2P)kWAMK3mgF!yVL?O=ujcF?yXpvh z+TV9l*Fa=$RXp!M{Wub+oBxB&do{lO2b+(+8;Aab&13&!bI$+9<_5%D95-Nk)^Y!0 z^Su9H^D+Q7=l%zq`-oC4>IqmKS@>tPnEsIZ&YvhTe1biD)e`$a*E}83NVl4scFEjU zzX>2g7xXKDP56-D4CAgblMd9AOS+?>mc<IsDFuwxgyDC$7YSTHUBs^UZ24M`km;b{ z8M!j1dQkEOF?z_K$e+_fT+PTwS3d?g^Tq1=V~i(8L;h(n#a};Pnsb%i1yq=>%<`JX z`Z*(k9Q;45y;G2G;g+tMwr$(CZQHhO+jg$BZRbjJrES}GuFk!8ovN;Lc13qb^v!=U zZ~hta&iTyo4ZI_!?_eCs1KK1H0q@y{C@&6%ef8<sO2HcTmH}uVq~kneSANrRx7|F- zt<wJKUj|b&XPI^|@}`(=y`@!-WO-Chk93@R@(^{w=)jGHlhs#09#dPn@IB=xxbd0B zdY_+QZx&HBD4$MZ^t7*s5=1WhXLCw?X|$ns55}1L%%lC{B>mWGY}h-hMBp4k#}L7+ z@fA9U1TUkj!f{(Yu^6n~2*T_fL>MCDq=El14qE&V<Dk)U59B$97^h}(%P>pv5Y?DU z1hyY1)p#Pt4n~Ovsz;B=+th|tlwfdc58koER_JkLZ5kiodl5x<J5voEq)E@8-m1*x z+AJcy1@fYy0w?p{mq;BEJ6oMEsW*ANBgxVECuLLjXDtYTuazOw+^U2&3Q8Uy^ehOC z3@K+Ay_8jfUKh*4SNGXhFq1YEPLZVgyQ3R~S{K2IL(-c_-Dt^x0*etkto)b`i$1Z3 z+=TC_#R$%0jYZqC+`>Gnuy|4L=!p#ohQ}Ta{l}lcJ_%={06Z#m(zZxM8GKDc({jEo z6G|`sX&JsV{dBS}08Kzz3SVj#o*=Oq(Cn1oKV?(?Z(n^n&1TFk2@jp2n6Q|kBBf3) zCEP7B%~*Yvb(E*N1Kiy*+ulSe=ueZH!^$@1PfNpOW+5Z-%BEwGk$w67IV|>X6j{Fi zs#`AG^ML+X>)b>D5hjVD-Hcz>LMHQ@-5qJjjqD>N?)CHmM_f}Qg%-=GaC%;_-i`&} z7D~oX(1?Ymj#Sq&C-X9*cc>kEa+LnAEwbfOI%Q&z*v$j0QEr6*erL{NO=Ix&L0_0W z)wwUg9_A3G;4}gb;1BOBd`DSN7zpf^q2Ev4-%NESG%>VH$Zm&y0zz#Zxk&462TSXW z;`Sb%FsF2?{H)`{tI0j(rr4lsV~erkfk|ho5O8yAZs}3}g{Z=*;NGlCTI=yd7Is^M z?DKu<`wni7#oh6p=!5*@alD-j?GH_&^<@*MSUrh*s@xr8-k<D}KXLBxA?-SwOdHAj zVY2Z0iP8FFcUfz$MwvVNJ-D%JJoC>25tFE`l2247>qtw3R)ENf(}(xm!}&1#P7jy= z*Zvgv+1Fe4B>aiGPWwdJt&Ch*ff(qFwE;Z><7KR=tt(4KRwunvbHrH3&omAK;~<Vv z6Y(jNaIkVPfVvx4ZMdC+9g8@5X`*+#*^B|rA_#%3J(%-@qN^dEB3L34L~4Nr_byLP zMJQT8iu``vO3|2*>=9t~h!!LD*}_fhVRjt0Rx#frY%`)BspYxGBPE)et^asT4k+0# zX9bqNUlf+fs@DyyRL(ZGJu26zba9~2hyNT@DBf5aoYeGj&X6b{=U$=>RY_&o^)WR+ zdPMn1WWeznF#5Ep_0Ko-yLdbLaJT>K^mgP=M;|@OBK4%J<<!2@?eVaG{<#zl48gD< zq;0y>OVRKo?wKtxy$K@rl`WvSC<z!7x5PW)A-u($B(9CY_j44<#j@jLmQ$qi2SqOs zUCjqjcEevKIs0W2rZiN9)Z;clCdpVtSR!W?`AMhsT2C66_M4q=!HW43-{1aH;5g8o zSw{&Ik>Z%JljA+&Y7fIJtmK4%n0}%>lIy#ULwY1Kh_Tcdd<^d8&|&ok%rT+=A9GZm z9vMYRzO``eT88)JkaZ<25Bb;%9THiB>92lCK@jb!XBi4W7bk^>;X_}illBoBDUh(5 z>DfQ0jzW?4fvsJ3UnAXLHIZ6lzZUp#b_aEUrLl$7z>G7-^HUC_yT(sthfE&n1OU)O z3^z<xNRka2VP#K~@5PZw5~U1P)`A`V+7$=hOQhnILO_!wv4>o*b{XSq1&Ba&wG_o6 z7qZC80kR`i^63EhNjcK&B&Za4v`uyd`1^7gD+ohRyksN=+fBH+fe?=Cfq}H4%#f5L z4I>QW)qxG548c*%^7yyI0gDqrhSH?_;%;`B`Fuqe;N$?GmvH?q4+U6<NWj%+-ElX- zS*QYuilZG74`??g-F8DiC;(kU2E_5MfRN)X$dfsQ)=3eG_4`5nHlF23MaddMkjXTR z5Z($d0<qiM!;1f6UQzZf4*mU1d~IytvPr@=l3d{V6kI8K!(+jZj66n<!w<pZv;cT| z8qmNbWFO&z-ntRFW`!Mn4;**x!)4BbbFh~AOPr+lLT4#jir_$ft#s*J`Ph;2##(;I z-8syTy9~0nf0KX09dJ%gNzM&kdI$u6Q;j*GO*{N-#-R4PO4OZ+D@Aa)CWd)OBg(1h zR_-*E$6|tB?I@Mv=R`@wEaeQrO8O0C1bY@@ot>C_!nTmqS=Tz=E;qbsEi`2|T?B&e z%VZFyi4UkU*&-V;6W&f3tmZq3d}fC?3-q>2nAjQ~YR7y!(~xj)ed?&@g#N{$OO3u0 z2M|WDlazKNMuAza9&R!&m6g#r&sp*vcyQ+l`%@)<u;;?36}ov4|J7iw0>d@7ns^0{ zH%_cUL~?dpq^};}iumnwQptcZGgAv0%&hNs<aCV)dPpcK7xKEfDgx+fW6UFmGKRPy z@U%(hXXXDEOVvrN&VK?zi_l!LmR8Zt$S;gCRSL>umP2C61#B+4Q|Jd>tY*0mOE_PU zDbh2AV#{nKPZmVb3wT#1RM|nc4gVa|DXYNTc$85fS}Qpnx9SISJ)SH7o4zd0)c;$; z7lCmpQKE$Do<ym3Ax@A9D#9yG!X-@tF`3j0ctJZP%lTF(6O)ClJ)FYSDIH*>AJpWU zvw)X4gJW<tQU`j?WC2InAIzw=L6a7)QGblA?^M1vzC`nMUmIg3-dH)oq#yL2R=_dy zIz&w*3Uhmf4eDZ>XLvJIiuS{n>P9#(xgazLMl)KE+Y^<fUX=AP$A<L{5?3YEq*x-f zo+7HcE=^0>)i!#w1!?a7`8@l9J>8%4x0mB|jemvenvz4e{&zO<{jmsThFpGNAfNx; z_tA;}-}{{%UBuP<LnDtndy>MB;i@+E`3v+JdU`DQUC)Sqhb@y}kyv1_2HeAg!7)j& zppOvVJkLL8p|1rZ-$fy9qqzjgilb(`#QX%+@P6dy(Z%EUvq=o%A}Sij0RnpNRShDZ z*f)Z+lA0M+O2rIZ$n`l!rRg*>V+9Y2lh#Yt@aIGj(i!J!?PtPa#gM^gE-&<NkCOwt z-o^UIFw)4NkHh!m5YWDSSd>t+%<<fGupJbPRvC(de<ah4A2CZZxC3|!19${{?z%8R zExaw9L2$V<U_%!#vMj1Chl$TdXN5gB_OG~!E000zE3{wxQ73xf-ez>?2>svVMOciG zkehN$hEQ>usLft7f=L?@V)kt^QcyqUrAk9>Or)SU1H(;8g6e3N!TjD*NeJSErXAR= z70rk0g|_mA?Z>@9=5Z1^f@bwY8AFz(9%MH2LmTr<(sw;P+Uwv(aoXvvbk2^n{urBV zWOL!|2~#dJje;9-0(SY_#yb)(K>4}|*U!V(5S-Tp$3Sdbq7^nBHLgc9eSQv^7RF^Q zW$a3i6HcreFQJiL@EB>6YYHm*@Gy{bh@-{-WX$BECtLJT9Lg|p_*&8^m@|UB2@sE? zJ%JU(QBXPx1fXRZ<Ixn<(`c{d2u3R7(`}Lsky-Wbp|+91s0mts2|@B*GBkqi)m&ub zL2W$969P$D0Lr-^g~>gyn+@aZtSaS*zfl7E6v}x9X=P8iY44=yz&m0Zh~&i|Otq6O z%7Ms%rW~vb6xK~6twoHD=R9%#402g}QsK=HapZ1@iu2Po6jG{xy-U2D#Cy;ydL9t& z;pjs|pXwku|E<$RM;u0qAaP->o|<;gokEL4%9hR@nDZ#RxNLP`$&y+2HB}XsM9oMH zXVh~1n7HnXiEgv!)5+EEC7e$4>Da=igl^rqaDHJBdxAgMS~_~cAOi;*d3#t%$JawZ zUzh)TC)WA;cvH9I`y%D_wUr$`DSf8n^|Up-^z+2uKA+z&Y4`4n_hj3!r;v9|*pOzS z=*q}WWG7gNTI66q#C<)+la51<S}BwzjSyNT@sd@hmLMOk%b)!H!-BHV?Z^y*)_MT` ziZ_mJ6Q(4#ZGfa5k~c)?RMFi}B1Xr3Lxou<j)my1moyF+fhe|es`&=+98_+$t6~Ni zbHGMqfzKHyuGtW&&z=kx`FG09&Zf{ZhY(32Jq{O@5FP5b5z)l)q<=M@-=z*w7zLUN zm83&VS8}PcV!#v#O<Z8K(ZB&SPgD>wS^LR=tz#j&8seu;7QZ4{g0`88iVa~m-e|q3 zqt&XJxn-CsO30tGL@t&j3m=nYkpspe=_Y=JV<2Z_qPzNddQ^}y>Y{wc1kxtsNGB%Z z^O?z-Cp6PnO2^Ef6$K2_I-{Ws3_JRfTB`*Qn8G4^R7oaMxgnfobIK`(z-c5@&59|+ zzl@OzLB#J(yU|P+Ns4Dt2(GLl2PBmEecx)Ljp1#_nq)=$QRUV|Q4+0t)}_JcNa1?U z2qrRy0_OT1m0=mvowQL%u^6RX5q5{1*ZOG$1P&IC9i$c>rx1=o2`G2kiWx1;0D6oe zY37W;EF_zZE%CexY?B-$SKdDz`zv+n`M-eIs*zN30+M(g5StOWO6Ss8t{{5J!eEu) zT_7(p$32^(?13Gd0iY=&iUf;TG73lm(LEweK@I~vLE|UJ92^}$rRtd9oYe~<iE<&+ zM?_FM0+dk@M76Uhgt*6O5tnSiJxS=Kb17Qpk)J%k+sO9fxyJBBF*CR%RD9^1h@hg9 zvs!*8D-m9O*en(EdozJ@&E5>wmLjSC;)xY_{HZeo^G(O-lHt)e0*{6@5gN`g%kEwt znH$Ym9zlh&lI$`PbtJ6O#@lnlQJWwtx4g5^qNbCgl_IWga54EwdnI~E6j%I)sx1w| zz9zd}hiJS;&ZtYMmN(eWrGSxD5APZqod!9UL<zGiuLwEnw6aM|QbS7P|Lybl`bwY9 zbCAV~<M(9j%U2gVdb%&vjkxn^((Nc3+}8S{*G)G^4_myi=p%-FFG@-wxNs6b$-$ek zZoXS(qnbi&UE`;dPu<VG*)~btqdwS>{uo#vNC6Wa8r0e<9VxA`oA^~ZtHE2aIUawE zIL%8}fZT9X+ahF}<cww?Qxa2_j*FT-9}EWPb+wV`KkUV)o6U$Q#^6`wtn!ekqC_iW zT4z$IA!K>Q8gCYsx9|$M$mYh3N1vCvIUG77aKc9-4%2#}KH-^@>Q|{sKl~D(=B~3W zq>;EJyjd785oruGIX7n-{#vxa?_L*~9eesQdRl7WI_sa;wK}Sax^_dl{+I+&hDN6b z?{@-bzCevvp&GN9L2piCOxO-k6*NYlnS(aQk_m}&Cq$E%(fZ4gvYQL3d#?n3g1sJr zOJ(A!2_dXf+s7KLELpIhOf@xI=?56A&{I&t)|##p1*n08)=9zY+?bXFQ5*mwE^$)5 z2w2=(zv!5XyAweKA{MOf02pZEjbW9=q+lv4OSO>AxK)xVcnhuZ3sx6iq7TL)`c%Vw zY1dI&;=W;f0ib_-eM8%OqviSf<ZZ;VXfx^z^J0(|FPv{9lHZHBm9U4vvh1;H)o&e3 z^X#iRD4wS72vFr{9BPZq*me`-wmonN-73p53iVS?aN?(%29<gMeVT6K)i)sCuupl8 zR65!}p+FrDjDM_L8YDQKoaYIyCz~6^ZfUc2ga+RPi8Oi|is{{Mz=zgV4}5e+bG<WD zab-mKt+c5u%DRYWk%Y}Ia@<f!HBvSyKvI!RDNfY#)S}wf$+~}s)i}UFG5NlC#<(@N z(v>yUGjShZy&%+n*LXUn!4cM3RdrcO^Y;=7^zn7Wjpkqvv>PB$JApYW{1*MHJ8*4@ zH-s<kqp>sU;??E_+1#DS1&HY+WOIa@-;8t@=J_W@Yx#y7PwK=p;bva8^(ar)9B5ju zI9}C1+!t^#C*u5njh30o=VQJkHX;+Of!;GSx*B4tan5k_B?2{W#QAQ;uvT62L_s>O zDO--PS6|9FwE*U7M7IMNube1`$*>-*=;g}PP?>bj3d8l9u?doWOKv#Dsi<(R&Pbt} z&U5Cd7}3#FM_BM9xAC?5&Kxv=D^tHC_xo7cP79c;5&x_`F>5ab12O{g_5vB`lf=_k z!h2?;gdfQIb1g8xZ#|kV7~j#%VfP7(AKYIkM^hS%4(T889lu_5oriZuIjHi-9dWvS z;Nnl3S^@Axxw;4b8edkwJ@w12?-?GLHZ)U<UZ8#s!~d}Wr9sNi`DgmnP2^wGr~j`O zpv2bau&j1g#ooDX_10j8DRsA$o=#X{+^qn!<zxtW?hLRHQJjlJ??h&2T<*N8L+zp_ zI@HhU8hqCSNsU|wyZ1XE3Nj1C;rcJ$^T`nVH0I*-B-o5|*85<{lVbVMWn$kDJ8vk} zGHuG_7ni|o9IQIKp^MTLGE@8HpsLXI+{uwHK;L)cKF2c`^ai7PHOG;lTyzDH3bV<D zp$@`4I1|c3fHyi2i!y>P!yPjWzSV)bTCG(af(g4AfyKzq#E+kkh$u{qQ$1VL40W&M zuh#a;v)(;ZmW%Q$<4Y}?-S<@+1Oz3#9;420MfkBPiq$}yCsR>l<HWGZ99<|RSN?f= zU^r?x(j}o%4p$&hRd{DTBvXC~iM9q7-NDE;Tt}h3VlB78^t3+bgR>G&zljXUy5Mnu z_%3KYn<J8CN65o~&VqXbyo4gEh;E}cI_TnJddA#YW5cAJitIkR3mq{6L~|14jPW`< zH7HRw{A*^dredt5)1V~UvdUO9A>~<(U&A1WjW*OipwiL)?nzEW>3v&DqiJc<0?KR2 z-Mnd)o~Er3S+wqSVN2JxTyo@>(8YaMV`bX&Bv;c`j$>5vM0bs%G5F)TzS6}IZJyGS zJIslIM-`85EG8%@lzzklcUbpbTAW}~vN||ry4qI>8RAM?SU;5Oj2b!C<d5o3GgGCM zsx3ae%%`lYNZ|0hB=PdJG2fqEFK8B?Cq=bh9tH$GP4h^^!B!(g=1R!n*X=+MODuRD zbUUzJoKO{h8MGYD<cAWB4qA-H!?8A2#W<ABiQ7rZ%irHURcDUa;_LpRW0Zhg8{e1l zG{>N3$FOXkiGV?Wh`dWp*QYc!@0FCyOY3}hJ`C(0)Jx&tH0dSB8@bYKQ;U&EyWk=> z@RKan8Z=aW&MTBA3*K}$V7~7AMD3>_5e29(OnP2av&-L*6WCNCj5VC{CZP`f+1wh^ z|I{ZyeU~;-|E^-hoM_x4E?t?D-hSh=uF;ixEGc3JXk<hm0$w`mChEd9^(vKm3r-=7 zv9NzRn1xrLSalIu#dW4~lbvi2g-9UfF-WBd%HHbScu0EjdDau?PUk8aj!mG}Asi!6 z$l4XkB3QrJVrG|a?%kN@{qffC>nYZ)L~XwS--Cj{MGjKrf+@BobfWLTc%F@Y@u$uC zgQsgwOR_o%ReTv+8yZ1>0BdTIr&iK)>V?_`2n{=YE?GNO8-5&HJC(H!l}?QY`ohIt zT<S}?31pr=aQ)+W61vq~VjQ|f@Jlg-#1-pVJFeY#T8;Ubah3zY3>eL0Wv_Wvx&^(R z2gK6@!cJCFy{7!V>91Kuks`aTP&1_AaO!}24+qLiYg^$lF}=n<r?sXbdv)$`=jUze zmSDhZ`-PAH)T|b|HQH4=xk1)6RW+XrQUeN?FOb47E^#8(Kon+HNF8<uN-puDzFy@@ z89vlE6^+22sKeui$r}8!s^2W2thYKlzW`;C07Hwe{!ZktCSB&cTDD#EO>qV#YSgFR zg4pMmmIrGI+x<pzxV$K0-0&t(z7%w4Xv#^uhJGhOf!;dQhP+<dp?oda4QKnBmgw5r zHJ@G)G~)O`biv4S-?B>wf^QW3N`D?-&F7*!JT-`S^eMYS&W<*qTmzbC*)DuQ169&J z;p0_OajldFD)Om+6D{?wW5MQ)q43Jj?Lr^8{+#x0X0$-g7&90yq0S)3GpIm^*^W!g ziSSZe#bFB_2F3i+M?vXMfaIZ#N^ewa28~L0M2$+v2j-9IkwE4Vh9Lnm;2QQH{-OYZ zUfH~~-jiIWcIO+ha#_0?o~K)+hppUO4hue3Z7Rm4pz$q7c9~0r^~Cu?a2w@;;}&OI zdeuk35YVO*E64V@Q<%{N4vE~-Mn`c^L~W+KYMrwJzz$S^=t}Ds5;)I4zolbU0*PjT zr1Q3@0dmX3WBA$Ea!o@L(~oFDhR_U14A==l0dV~rvgU;I?xSykR)Uidl=6}!yo!6? zj{Q>R>?`034*_YMU<N+W$r;(-I(c<o!YZuy?hkUPp3>iRGSOa>h#KjxqcQdRlDbc) zJtl}7dZArprpX))!|ItcqKyZDLNMXJST@*|i)>YnDuY_UA&LR1$5&xT<0!TjLCsGW zo`d<=o_%6{C`;~^sIg=&a`~uYSw$qt50(|TuI~g&6x~RLKOyFrnQ&0>2)+7I2=fN; zgaSY%mk4GAf$y63=bC6N9!VIeQS&ZT%LffG%MEQ%J{erwTF~i#-t<YXDb)%!B0njU zo+G8RjY^!8+{9Ph$O8qeui7(=?FIiJH{Vlx`-$8;v~tZe8@ju=6Idpnh|lxYwD_K1 zf+ka4g5G?2<B1uK2h{kTqi`=jByJhd1~)fB6kA*Dpuu-c)U;2eknn2bo@Lf^x8^1_ zkE@bd<~^_1W|OGeU#kbkv1p^1+TA|nYB<$-Sa{O~DulBLtSerdGx*YMf8i@}a(H~O zw;=@mmdF3FW22BLZ<16<5a1Gu1Ci`%n=d8U%PHQPYl)36rZ`%0;@@Y|Xrj<?`b(gx z*x<efxJ(j4sA4EPfB`nJf^3b1>Ed)MDQ>YqZkhLU9|ip6mhLXLFF`io1!0I{&st@a zo4;m8^hnfjRAi!e>)^!$Zp01z9}H;7A$aQYo%S1%2<!;f8!1c(aS7YPihZT#OB0U% z`S)9PV@6|gz2AUW7SB59Sa&L+_?EA|GXjFZ0|LF@baaL$C1`6|r2Y!X?pZEVhjDEO zamtZbYv&R(AzO2_*~PNg9RJeOHq015jal4c5%WIPp40ZGQj@Mabc-8egCzxmoT4ef zQ$9W+DwHd@+?_>LCBzX3Epk7e>qGwRH8>7<T20)G>@x11g2Xn8Ut+ziqjiH1E(2N} z`BWg``gwkbx;6~kn^93F>5K4hvP;M_Mbh(`ME2**kL07vY*51{*q?`_%4y1l86@hN zGNc_7#l+1&dU?~?I;GA?uH))%(7J;k`jHS)n1WP~<<yCmYnvJ&6yda+0>dPBaIazS z^ZRS>;1+pQ<LnXa^7MYox#l%{tHk1wwb_cmAAY}#i=J-$>;obK{{$IYnp;ZsoGsE0 zkzs6I(I`VhWEzT>X)I4Vi2z9U>)2&pL!0^fH6vz(7{M7))Oblj<K2DOSlC(pZg_n4 zd0F(kc2Qo*o|2Qqe=C!?N#3WQ^hLK96-U2*RXI(z7xCdnZ|vn^k0kMs2%^wQJtk~} z+Q(J#J^4ZYclX{m&x_u*rqhlLZ|b*?iF9w`!@c>}#r2{+_I6y%FEAwseaL0wZyuMm zb&DpYvAv}!mjvBs<m9+HZ(mcVg2jeDcY3?pKTRYFAJ@ZICbvY&X?w1XXxH<=BNuxr z{IaD&yt!E5ewgCNX9RC+R-~cls{Cs1%+f@M)<y1XN}Y0GeSeXeZ}g4uwld+fB4^RF z`PmAsq~YUfnk~;l)6|C#FP%QVR!GxU=d7u88{QJn&XwRRYNxvG{jDl*&T|)=VO!l| zhZPfgzP2+^YpjYS6VI|ehsoGg9*+9wVYG0qb-sC|75BiH@Y&Vd^<E1y9^6}QZaeOA z>D)n>9{B2af;c8f+7N!<dy;j*3*O#LwZVqjPt~9ch0T@iN_W=trumy~e=^?gr{;P8 zU4!<!y#_ZeRZ6`Np2;>}17NQC3`cSPI#J@S^tNFJOXse`+VOlbMFvd$ZeIJ{WN6d- zwR(3^Zv#|fE{Wifc;x!NPJexDts|WCZ8VC9*XAdl+qVb!+o^T*5!W5s8#~)oNh~}9 z57A_C&IMdUESb%erPNhLRBX^NTPUlUrr2(z!GSP#9c8|`GlA}R3Rg8|Ty3q~;u=Rz z5k-pJ(Wd-Pj57IgX;HTIKYqQ6{=n&jBxUzevny)On`a+ZfP2kV+^}qXoDV44x8F&T zTjHv5*L-XKDTcs#p}TE2318)pO1>DRxwmELvI8sfzX;sBgaHW@#}T85@0&Pn1Xp+= zhq0_)vVzH&=@H<fOV&BlccAw%ul@G@Iyh5=5}#7OPwQlfX?M<{>S0tjT?Z3X#P~>9 z2E(Wv`{LB^KMiC^0Te@wVglMw&QH<3FM%K)UmIK~YJzA!*XO`<ZVf$@Q!DoMz|GM^ zm}?(Yn0Nn;6<<nz-en)Vb(_&3tsDPXzuN)ODwy@A;t3%*Y<#F_>lf6^84~W>C;0?> zTC^SPd)%J`h!a0%>I`}Q7`%(#kJGeq436+Y<mIK3h9{yE!I04LJlY<I(EM?<DS1=@ zd5{gsA0vWtQ8-m7$aWTcHC3+$>DHd5b=@UoU)kDY51B|OL``~RzJVL?1wnC3+%gUb z76{OimCZYRFERx8FeFu`j+@uC6yr&wWLFl~qasoYRJZCJb;`}%HB0(pqz;t+h7joD zGQH9t9MQ>ugsT>zNh1(u9?>UO)g+y`E;HatP-J4iR-T70!7^I=p*g$QfGum^`fICQ z&S@_=OLO5=TedNZ@TqD5HJ<@n{5wq?;U0CRDiHOxn;cQ>^^R()+UsTe_^bbU>g9o^ zb*hxTs}%4&>5uNJw5}7)_9t0&4(Ocjlk4rXdg&i%fwNhT_NzF<abLRV6g*P|Z#zvV zd+!Pz1btDAPg!ffQL@3rw%;3vcFGfDu}lL4wjlll`;#7je|7m&K#;;evxlf&o`>mL zQPHV5TzENBT&F7Uw_ozXj)XEt>mJ{!dlAbr*H4hUq1lk~^v53-c^S5nvlscAakoia zr-&Em&9jOY=>VOZY50oz7&#--kZK2LC|x-Uhz6>xbjZh-5j?@pXb5k7^c!Eyy;2Ed z`7`+S<rg?#;sfi0R?M-3lgPCn*WTZ&oE~J@sMRCrc@@7Rcy|nn9*~NklOEFq%{uYu zHC%BD#eunzg(n2V7}E|wu)sqM0=RyO?SjsgZA<>?Mk>gFG!@@mO(b%Geqj0tV-w_P zVu7V!VCeN!?t)uxC{t(U7nAh$8)@z9-IkNySUDm1<)qe1rAr((sU|Q~uG<7$M5SKq zL!R~#mHMLN6!@n)__@XY?=f1T<+CM(OHJy`6Pv!9UHw3RmS`Z9S00|=2EB6aR-E*% z%4RB}8}RBlWRP|~4{bx^wuY@oxmXD(`&6`V1fmEB&v}S;(v8Q}VU`@X<&L>;M9xo# zwhTMpD9e!Z{4baFpN%3-oTHt;o}ky<3v2kNXJ)vN7U7U>g&?f*I<(~y2a_GpxU|>% zz;qEu6V3$TpRqo_W70t7^7d^QuD~Yb2ws@@xB@r1L7m)Lm^Rl8ns9p(E5DwwLl~a@ zGMRm@k{U|K%)9Ka1t%)eHoK(oL~<W8!+0VFwJLTlN$GHR=VP+nf07w(A2=zxd52z1 zt51>>BP*!Ge|?d_%JU`Oh@DD^ZoGXryB$>t)U<&g(#Y}yR_#Ja7A6;Wl=zGL(4N@Y zG>3Z8poV&hR@tx8Nq0H=II4k@E-_aXXhO(|NZZx@?YSkIZ0E?-LB+#WmwvZL)T>S= z;bensF}kjU+v=IV`R<-^0s8qtd2`#y8S;J`uq{*ka;)&7Nw(JZ=1F_^kpca~fE`u9 zFE*dpPQL;t%}?Sk{a1eUj@Ej_#X~sNUAM9uJJ0z@_uNy~-daGB*KbFws!Qw>Hv}+5 zk%xU(Zj6J$0GFXDG9h1yuKxaH2y3V%h5;GRd0A-<H`a>ztXv1Ra9m|781+R|k*Q{! zqI|6-O)Ztdvg;YF+#F-$K@03*wS^b)qL^Xwkd8j5nS;tVEfu7Kyj=?{zU9KAph_){ zg<>e2mviHbNB}?^TQoov8=`0|t@JAJR5_o8x=#5f%#FAvdET>H)-)?Hzrd5Phf+2> z#+lBdX1@9N_XRU78iRASJ5G9?G9kc5-X2N>DOP}H{AxB-gAIN@6k{cVwF|<NleDdB z1n#iELWjnNcI(kqf&Y<FtIew-xOcG5Z%U5(A#Ig6C&G=+=D&;Gy6I&$6)N37wMfdg za(eU6!Q*t4(*Q#bi(3(!ms>vGR(~}Y5Gi~EkytyNH8_kwmQ;*25=@N4$4OBdWBoiZ z-dkvMS|D0ZL`@Ey)*h5ohYYxI?&^B&)59f3cZ#Z7{8C)*WSPk+Syx}VnK;0G;nQ%v z)<!<}UfqeoS@?15gx=s1&_?bPeJ5Fn3PFPfSfDCQ0IO^9sV^%X`Khn+4t@GW;anS> zp9`Jz#8%hpl46USbstQH$9}#D^O3AC*)nBi>jWm^Zi~gVWiP|vg9x)4JwD@HzdW%T zHL28{gtXZ$O-*a6f!8M#34FhVb?nC87I(7Z?9z+j5(q8@#2G<=LSo)W?qw`W1^N&e zIB27(11>W8-ySh)|GqD*$g*gKtC$#_Q`pMdo#7XP|KZjdg3uU}5RM7(W(Dc&CeUR7 zGr%Gpqpz8Q&zS4P2^ea&GH`wjNy85Bx9~?epY$4&kGTEH%42w#jB9+vJvyeg5tQn> zcFa*j<kwM!&!O0hK&nMbgjF0cZOIUUToI{s7ou?h-I1qpD4PZ{C%#e3Ju8WG-vMZE zvgFGcHxTk+$lVXlM8KD!bqkQXTDf8`7L!bK4}<>sDxE%`|6y*(=0i)Tl3DpxSewEg zw;#-~5fFE^rd3u5gc=G(4{Phfz9r$yW9%@8ejcH}wIc}!Bg;`YDJ5&Iaa^7)((vQ? zw4D=c9qeID$m5HJ8i*qi!V`lnO$$y?12}-ijtoSzTf-dV#Vu`^X`j5lTHPx7o&ODy zk!i3I>XdW=0-hi~=vToe)Q}SumpV;Ned=s{wqNH@k|w7unqDJo?Pkh+lJqf-eXg1J zDEAjEmob3WI^=*|f|x6sRBWH{7Rom_tb6&I*sOfYN1E8cPX_l`UxpdIhhLm6IamO4 z^&CJM+7Llks3H_$1fUFUK%z$*{@QKaAcr<Fu_^Bgd<D3|_`6C8m{5jp_L%roJq~N^ zUV?2%BrRM~CVG+0E<Ze5fsj;biB&2@oIB4p<+l9m4+dNuHUV-B2@8c;xpDP*=<qNK z<JVGnWxg+rl?Q?uz9E1>dH0n_6z{ui_U^~D{mI&Uu1}L6tR%SM1NO+VK8JR~Zm4rB z#q&N8Ku`m6Os>HtxZ!1ZTiqm<<od7rOga0k9fioL$6JcXsYMSkU1R2!UX+ox17#Ct zUs;#ZvdV_Vi~EF~eEg)YlD}mKuV5QKtnH*0&guD6%0X-^LS()Xx<Ah&=)BjnAh4Ba zu`M$KS?Jzvz`QpG@b1Iv5I@zvI$(;|*Tqfkh{)ON>6;9vsIjdDB!XO&gOYhbvK3@7 zBh6~n^8`YH1QLvs5C$;DVMs!6NN^4Um6#v~d5EOMf|VONV5mc-&POfRNM&|Q4Jh8b z0}Su#Dsx#~u1;sIXJQFtpLY+#0t*3&)dGCLPX$)wYI+3y97iyh_<f0UKZ{FT;Ut2M zOI${-&RN88CAF4hzjM4)u7<c0(vn?Js)x9ftXS>CTj3_c3fgkBG@;yGgq2Ws0|m+N zCgRS8iA&MlSln%BK5yZ}sI~sQeeO#m+*{ZC>9PI&LZ08L^@JC+jCYzn53JajL9TKh z33rSFA&y+{xU>Qr*=RQ|4zb8V<Fo1(B>8ix4Tv}A<a`-0%r1q2U9}zt#6z_2t5=4? z1u(de02XSQz*d+;9`Z0K@Ewd8hZNv065^?f4n0ogIN^-6&BIH@-<rB3WgopDQ=9cA z%86g&6pL(cLIF60I3eLpW{}>18p@F17By5+2SP^?LzRItig&o1$~AH|W)ikbn*rUu zG>W+4@?CXsqqNv#uU%5Lqkwk)_u;@=#EK6?$(P*rdGcPJLTQ|VUB~E+;Cf*FO<w>8 z#t2(fGVSWU2*tyBV+Y7GG4W*p7I}AC;N)OPy)d>rW^|KTJlBc@9Kh)GrLwcb<+!Zc zXM?tt7e`XJ6+*Tw3(|)W6ChR25XI3MQsl5=&dZ1+hT4iKQA7Djd#j+4<17<wofv(V zVrb<j>N2nzOeOo+3-POrz&A_?VgSH11XTk0h(ku?>(7x`MpB#nkHrQ#rL4a5=x0f% zh_71;Gk9{gqO0?5<dkTAiVdKX(z!_L6G2pVV{4hX60}ImE4e&YA?xqd!oa3UJi-v6 zH(w%~$sXz{NmXO{x(U7DhLY=~6#<=YE}rx!r)JU4u!CJwEJa;jI3*lZAETSPX^B8M z84Jgg9<FH!ixBNbqFW4X13CI$M@j7kU8fSJ5ilZBBK3i(yPx*Ct2dfN>P*~1O{bF9 z)@(z&F3foCTQMqDLmLC`3X5X-+*PP@q9fiUtUXayFKlnFd!{Fg4*j7JQ%;9+!f??` zYk1s&>repC*{^gw5s-t*2E8r&I$Im0elaZ6IWAwNRxs>h`Od9nbKEj{EVi*nIMPoc zjz}rU->qPC_Z~LLwK-T@8DCFKmZ5f+Pm&L@v34WLjiKQAN?TQ(C7oUDs~2HzO}7P5 zdzy5qhS9f|Q4lj$f|$-B=AD0tVqkcfL2b`xAk=$|jhHV8+-C_X2VTO#Dhgt$Bf`*2 zHtuz3+7I)s&|?la5ihoBb>oND`3B>418Yp{)%Ki0CQFC_@T!5s(F1ifk8|Eh(}dPk z6>dCGE+di0NFRoS&!}zc-G8m4ad>-pEk>#V&$_Ewkvr&xk!@JLH`Ohb_7RoHqIXrS z?gxiwK?;>#K+V_M)XlbjT@PkPOX69ZL`5Dpyf&4|+(Sg<Hu=_fta@?*3{4OA+d4Ne zXFMSS+igrPw_=EUCg5TiBJEbkLnIp{KHWXq3|q__{EC$lcQZDi!maQV@$gmFMXzuv z-Uc*5|HxaO3$J`4h5#g~_5%qP#lHW7Xob+=4>E!U+}Q!ZX)07VYWZu`RV%5gGV_Zl zXah@Dw!F2tiOWctcDkqauu<&1l%AG}eCmQ3;@N?>HmS3M{A)`t%ah1g15sAJ^Y0n} zU)l%-@@+$bBf@RN2b!&uYyBCo%vaaKSu=O(^<qN!GHO~vc=#s&SHdRk7eDT3+t^^g zg$|ylM(?l$;%&X+=DwICz!WD$OGK<zH=p^U(SgexzUz49O!um^Axt7C<k&)%Q><~K z52YHwL5K*lhdN3|D<{OoYE?p=2)WsQN$DQAtp>-*Z|nF_tTX^l72$|rqFycVBteP* z#AkbkJGz0$fl?^F?AQ(u17_SCjNP@+<kJ{u4IA08Lr_9@Tof9eF$ijS8WWgbm$4~? zg97C(oqsRnkFq}mqR>L#W?lBeS@_$EtnSSa9d}R}!twj9`p=ONU|!`1&<%%35q=rc z`#<<MBo)DhZEzvd&$ufL*7t8>T|`Cfs;jDqgz$cTgn9}7I3F!yiuZutZ7VE01EnID z=Lj5K<;a+I={sA_UCfml8@^F9QR@JO@nLF*6c{^zJR^n0?Y#yGKwyC8Qg*9@r?w_+ zKtSIE)L8XT3m5+_KRCs6`WV1+=_0r#Q1cHmV=smWnIf}b6Kv|b@J3khm!DltTio|( zP0IL&jMWv)6aUe$pdtRPg*<443~RmBmaw3q%YLrb4qFDx6)D!1iTHVT@(Rks`kIV% zFDJx~?^NzA{IJF1`08}@PWL1N!;M^PON7$leuW5vh(E&P-S7J>oqaR!WP6fV`m=os z=Y1mbV=T?5Ns-RqZ}z)Q>159~=n(diubQR*U)d~*b@Z*uJ2S2^x{pZ7D?%{qpLCXC zr69Zdv1U-#_fIa11Y8<dkDOqsOC`Q8T=Fjbo%GmJiMS<(_`xONHP>!8G)|Mj^2&Z} zMU0lY{K=IG;5#qF^DolF>9o(ROi1tQXG7+Qd6u^AntZ%Bre@83zC!0Y@Ui4;eaF>< ziekg4$77b1x{aSx<?K1(QdZ{66?|TCVBa5U;?RCJ83RWY6Z_xnWTMoud_tSCBxZV~ z4u9#o@j$NWJ8?v$bX<Tl>#WKhdTxaoPj0Ms_MDHnb*>>yj(rV&gF2>2+7bF4J;=D> z2kq{x(Xsn<k=Fi2@mWhbY5HV-IF6r~uKnEnn9;ipcIT%EPOePB_u1x|1k12I;xEp) z;7>nS+!`F8prmuxV=a5>qQ`!eIFrwI;P{DfHsVv-WWr6Ww4cNFaO)5-(_`|(vj6;T zr5IwhZPB~L7&<t<IbG)G*_HeAyxPlEkz}V9-WS@e-4RStEDT$R5VELPkD(#4Vmo0W z16?sMgw;k_EIBE3ZZ$|>o=|EFWvQhrk*+_1wh&hy3!Y?mWKrgZV#!pVcuSvo-ox3o zzU=G#ixdN^()nw<uOhIg#IZ4DV?qmI03TK#y&Epmej3JQOGygmd>ayTvgBIFX%D1{ zVLx$E-o;)aJhHk+a{X$k&kgM^csH(d?Orbftn*(rs<o}5P-Lp$0V3xR(ggSbgeA$Z z?bq2E3-+3`nP3HWtk-vM6Mq)GY)~m|nSyLJv?61n?(N<<vjeV+PyA-bBEcFd#DI20 zhSO{&)QEXPgFeAk=#)wyhfp{;&Y#sll&D)73*9o-+1yjuu}q{K5`mr8%p>futq3Kp zaH<!U<u$-9uBSPB6jSFaF+(`9Rt#0h0&PuJb0j5hw78OUodAYLDDE}}Dfw_t7!kY_ znbAGNNk)nCJ|!q17Rg|_HGhu~)2a7>@6It&yKej-e(P)D0VgN}1PYF|qGaGhvL{$4 zOASVB6WzUU#pm4twfCwZz+|x#gYRX419MQ3TbMm5Z~|633mt*<P?B4$bYE$)P?2*` z0s{ZRO+`+*t9cZ@*J^PJA~sshwV)!e*Oznnl(;>wWccmx>YGa)_si^3=OcZ78_>3e zAhYW~($B8zZ$ZPq=E>f~{`~eP+?iQA)U$gm-9&|?g4A9>5?!}i=SoO4AzG)<Dva!k za$_C8$n2Z~6qVlDq*(6@%9;v#vp<ga+#SgxdGr6qSC9q<K>+{&fB*n;@6wsh0}g5g z1OU(l0{}q$x$183WI}IhXJTjXV(LuiVQbTpvLScK028KPGVvv&1yZFdDyW4(eVwrC z8<1dDiWrN_d6weoy}5v*5i$|;OeTl*@o>{Ve)JSwm7H5(fC!aXqnwB_tD&`uwtth? zwIrVyQl78E8bmp?4dUqQx^@gE)n_3z007~6;YwJE;Y(*ao9akaox2nQ$nID(C%I`; z&DJPNb)=b9^7RMV3K__}OR-*AFoxrW9<~Q?dy{|@)l*XY42757Z`h@-(6_NA*4wO% zp9}`AkZ??V=$xP&dK_G^D3i!Sa+~lF&Gi6gh_8r5xd|*pL6bk-ktUYC3bOH|G9tHX zxBztR&62mBbg3~jQ2H=kIH3ysNFTY$MNph;h|nl9<b{)*R8BJk8Q+z~9*({16>s;F zxX)hRdfI+qWQN5X>k97|eD$@Se=sYXC!H+rU3Ry19DEt-g9hac`|8=JAGE}I#c@>o z5u`iqS#7AtgAu7M-peoCpt~p)5v0%Yv``Jxp1hlI@bjs<q?#NuTfFZ19LB`00U=JA zQ^VV=OAKBS8Oy_6Cc81q$1jek51BHt2(+wkSI^IK&M*8V{;77EZytE{y8kY4yY%aq z|Bt}uzyJV9|4U#qdpj2uLn9m0e<++fuPDF4fB=45XY`g!2HR|-s63RBkU)k<@dcp% zGOzXOlX#W%wBalZ<ZW=aDomr@>i?ccADz8(xJVslv8L|DHQpj*?_vE_JAZNV5pAzE z4B`hJ$E)@pp}0eXZmZcOuQ+atFU^#?UACB_i8h4?xgUc4*r@4DAkhfZ6+_UClLbAv zDA0&~VZ&u6`fKK?FQkq_XJvU;o()_muk%AwfSl-~y-n6<WxdXVHry6@)gVTRv16OK z{yR8R&o^i+t1t0_CDABM1ebKB%#)q?1w7*mU%>~!WFkEG1OS^{o?bG=;Qi}KRojbT zO=B-ku?BzfTmsu|D-euFJZB<P-63^4`cs@Q`OfM!>Ql*lQgm54Z;ac)4fztnbw^QD zT=&;V6AFINa6VoG?p`hE+qR?cK+|SjaD%o2^{rw}PpUquIP|Z)36y5~SDFtS$OFnE zFC!p+AvB@q-Rh#5q_+M659VXx%Ke?S>wsc(2BF->$IN4Y%MpgiN%sFP7i!jfgAphI z0N{^S2>&J5&)ew4_z$tJ)OYMR*bw}#{Ru7Vl1Vw;jHz9t*mTzcG_gr^UoaGqOc4tt z(uzNc{e9z$Db{Rpil?3#3>XM-$GhU)yARx#t5&kZz^G|Z_iPYLi%4J?s68ZCoe;mD z-gvS?1Lq@BBb>s}_t2_tpU$dW)hsasXqDHrP@?OXwM-nVqp;W|VzHDYYCTHCLG6w7 zREzuWvL>1E$SsXX2|WW-gJP!<v<Xq&9H!zebPT|vQPW}P8B!+O1@CK75%ZyoCFLmQ zwEN`ryfAtpw8tCah|Y1D$TFSFy*;7dQhamAx%HZ1&DO6mq-FZSr&VN!5Ju_>`;D#y z)#5=LtSnZ`2y%Jo!EZ>k2CV^nqCQHPt;!!h9fw#vg~VV)?C(&}pI;t-u|(7x9_Vvr z<qpc0@q;sb;|b8@rRTgPwHXNz&j@!JxbvoU%<~5>k$OVFehFn>l8Tp~fI2G^1G2YM zHb#>kARVC)1*L!|wDjpj&nBeS$5UJCvwKN9)=#TN03FDZFEB)04QwEx7|~ZVlPUme z2T+k7=L1wH*J(GwTCv{PKvL%tY>}OB+cU^jOKs8)_u$_G)a@w5k_uzxIhF<jUmj{s z5gzYi`P)VgIS45Tvc+AK2%=ybiB28;cGv&QDMcAMpNDR^U)<K?0x6y)7nfw`!3%?G z2{Np%qp3SuNBs$yY+8f9cj%EOM;590#}QT>9t5h@P{7kMT-sWAF0Ji7DA!Qx3ac=s zj$g2>NFoE$JM4?Ee?-f6in&!fh}uZvOZfL!$DzPE5Ut}WE1zoWz&nd<{BhGAN>Ug1 zML3)p{NtpuK=R?MDVH>!@RyP8?TCt;f&k2!2a`W%umltYXw1pz0v(=?YWu7|hpJW4 z(zVMKGd_{NGzp(jlY3DTx;hgC1kQyc2E(Gj-e3;X3!N-?^8Ud&uf|d_M|!>^sUeoB zH2afIC5P{w5rB6%3zXKI43tZ?p-#Av`T!&X$WK)E)h;0Hy}6}S=L*cuF`M1ya{vVi zsH`J&RuOR5gw;UmM@*`}f{{95In*-&;6cn&%;fR*F0bdM#F&vS#dZu^aH&=X8qC=Q z63L(8S_KaEeAN)5^3HoKYY-wzQ9yL5XW?4mVx!s<m1*{wqhRGMxwb8GX=ZfO3oT-Q zA6r2AaQ$}4{md)V$QdTZz><BPKy^!7>mpwS9Q{33T3<)W8V$h!lz}{nTFfa+R8*0x zTX$8_>E3tmnsSZ&EV#H!_y@QXDZPAFVuvV<{nflXlWz)h+<z$MOL_G~Pia5bB{1c| z37VCnqX@)65+T29Q+O~rjDBeaP4cwqF^E%cSua6vtY;T%foM^WXCcm5ix4-kOM37X zyZk9?bpX5j6zo}R#QVk1-R4t{TwwR*6>A}w1eU6B)<0Qkr7TU-oxHPQbTynuVh*nV zsZjTiof-aP^ntZI92=}Jbo_^yz4tdKOF0gz`*TtPP=Hz{sph1FTu?kVTn9UH8}_OH zc+Gj~B`l_}Rx8l?ew&@@2B+!wjR1h|%$Pzghb=2#NBnNso-EoE>{Ez&tGv?+IWw*H z<p~6JetKtx*xlHHC<10j_<#`0y?9#Y0#~4YGpS)>N8g$aAJ;D^-!Uf#EBSsDB1$+w zYr4jRw>gU>ANb2Fu+^4v54JqcqxEAdY4V~5_lZSMlkYHr+WH4iKB**d^{J8Z0#WUQ za9ihER-YS}<0=VYaq(I{raoRx#3kQpGqvJZ5*R82-G|XqrnQvM>G4vL7|&^TK*QS; z0K2uDXY}uxfxnPw*AM2V-s8EoqyZlBX#3#5(eNI>6XWA`^{Hs(e*^w^9wYm4hnxQJ z_#fZS|Bc5?|AxmMZbtvXW8EJfKWqH&JeK_zk0Jk)$M^pekB|O;<*_dd9YgSN)FhZC z#)Ro6f#*gP#4PAM33<vXtpT|>UKss=T4Qx^gjaZs<T1{<-nI~*slNGr9J+0AW-Ipy zlJadJvnn!U$X%61y@q$flCfYl7S=PR1o_NlKX>HvEfzrDzTa64);W(q4x{X^1VrFD zZJy!KFWw$<SR$L%*Yr5E6NiPf8Ne8S5QNDS(vzOU8jRVohgrH++j!I3M|lHRNjxFp z-wI^j<A~>;{W>cWeXw>>mqz35BAlTS1V?}-v<xdmEGDFv2TJQJE!#>s)lH~{eI5(r zEHFl0x2+(dtI!uRkScv>`BIUb6aW{8Rm(QPT2tKG15)G?ZIPW1*fGdeNbb^(H{d*d z7wjs=;|U|?IhMNs+@5OA5uEJ<J6c4HIS48Vu|?dH2%=#ciq3C0TPyx?N>YW7>7p4N zXSVddA;hxe^vQM}tpDV3`v1w}1s5DJ&f2}xK!JWX7z%njM@w6Z^?Nn_dS;mlUE!4b zC-YMm6i8;nnfe{_RgJ0|&k;9C2T_;`|I;@9bQ}rY{GY*!k&{X#jl9yc$u}FG(8KHL z_k!Rx;2uw)(>Wg|Uaw3ZFfU`-+Yyu>B18NTnLkUA08}JtI_d4M85&$2mF^K=E_L0Y zg<I$2Pk7%7Ql$Ls#a8*@a0v_$P#Kgy5Dcrr3q#qT7HM9OJIg1$YAdB2>Dl%ahS<iE zY%e<HoL&#cfF5Bi&>9~yV6J(FTH##kJrD>WBGOtPo%{mcYrBe-&M;`4(<$v<N7s-5 z3O=Eue@kTA|0J^9e-at(|AEL)if5~pUZ~7dubc&o$4QMnk*iZf+rH=#+lSbLO2=CZ zYw(BO89y5~Qw=oOw)Rx=wRO&ZiGm~b$p0siBmNtaGk=IY|3l=5r~f;V{Y7EyZ)ZH1 zeY2R8c1HglkqLf?+_5S6J2{MQsSQoi;vYno`VS(%&;J*Z{r^WI_wBg9LM;U2{2L;V z&BFD!{0EUo?pnCPv%`9WM}70!X#e88E5}7?drL|H3RL|`sx~Dd#|;Mz-^`Az%Le)G zt+boiMz9F?qRyxDyHIP%RX%nG2Rii<3v(K_thyW51!0G=Z!EtlBj;(dP3mIHv|Kad z7uNu+S(Igs633$t8XLn!K`Tt;Z~T+94EZUdjf9p7oilY@bWkxHP6J-{j3Psrw2x4K zOq4AbC-!hCZeY*eS1UWx^k&1tIMFhtnkFY^e3Me~Fy<5b?~(kudG<#=5iBlF$JZpl zyOF5!gEd<-aX*=%Jiv9zUDmXb@~tLWHWK3@#~x^4_u!vM=KstK{fkVqc``HcoW!jw z4RD7?I|To&;W7Im?&p2^u4L)?j{Dz{3??gpZv5{<WafW^<o^nh|DTW??~Z@tF&h6r zhRFXDlIj1ygvg=)D@6V$lE?oCB-8W4=!evpXo4d?0b-{A0bT6r4)>YpoIb*(Uk78h zRgWPpMF2LhBr}pYP@gksd?u(GP10axxs*<j`=uW2j#RV93cyGDInT+uDEiG|l*Lm( z1XlRsAqDYa{VstevRZ#jZ#y-8T)L14jPVzOAZ><v+Iw7^F+cI7K(~GaZxZJ$ukSpH zr#Q^7K=wI`c<~{rqc$-Bc@t%AILR^62?|qi9JpM|AWqa`Olozsq`A(zr-VbpoLVIC zt~A*aW5{ja780xheK`}UJb<(>1*u69V0m1<MiZ<h%e^-wRW88}(e(r!gM69fx^$lp z&O>0)zI-H!Fm{Gxp$|~)2gzgqf#gdBm;Z~sw+xG;Yrj2lcX!ti+}&M*1cv}Y0>RxS zxO;F75Hz^EyOZD!fh1UPhf_`R===WX%*-|4=6r$bUELRSb=7aLz3zK;#g64I{fXqv ze<PVukycukyOkg~oWp-pzP#+y)*SYO-%#~zgq?$cJnhVPbUW{8%Xtqn<)6rq!x6fA zI;7$CtzU5Wk<{Mqq7``E<J<6s2dc~q?$5z<&01P!Rb^u6p^N_@z4<yp4XcW49wu&k z+*E=!TWI0IksVd2ysZC;lrKeaGQH4`X6SgtDM=vM!`S<0zY{=YlwTTI0YL^j1Ei5j ze`#d3w>4jETmg;D2GYn~rbklL%uJ?eX!En~AdS2gpp@#EOybJaSNO&AXNjymQ`e@d zKcJBdJ($%0PGo4lS(aS!Jb=hD5Ny=tzIq>WR}O7T8k&PKe-Sw<(2rh7Z0}!0*6wW^ z0(1L|$bV?$;(eDwXvoY||8CN<<~m5o+Y2qRXZIwhG%Vc|iIeCqjI}pKPF9L-VJhrC zN_2H~`BpE``4#tjT*JO8wzG1Wt_o(~ceaPfat%zv2b;|ht3tQ;y+5>YGMu`#LfA{w zs0jt5^y9746HT3=VoO@QKA+7hxdnS}ApKp)h*ScZq+7s{!9ENj>P)luC(NS)$4ntK z<+b<dyl{~BAvX0YJ+2HdbHijnJii=R5)`;iGJoUG{0;f@Pm&mi+8$j*w3f^=%-gT* zaQ~r^#Q}}{4baH_gdYHntkv(i3uxp`kVbwYG8Hn-Um6*EW!`vSoFv~oWc?5zvQiDI z$JW*2K>(w;Z_vQKr0vn2V`GlP%jHFJF$6Fj(<Bo{N?!Q(KAz93bnP}6SGOg6?*++? z>3}{agS*+Wx20-3mnc+|EBN@s*oB|^X<gAXSXzfZJctQyq_)vEwLEEL=Rj<`WIpvg zx9wx#4(-dL#^eOoj3c8qnVsB=@s)!_>sDN(#4mz`wt1oI-WU?ZVTJf{;w~KDnRCec zKwbDi?k~O+NT0~Cx3+v=kT5k5YkDKVCM=$#G2bUZN<9=%W45t9nSXHH)6P3b(C*52 zsh<BXk8+L_e?6-#^oP(Jb_P{13>fUn@@pft)VFdzdnPj!{ervcek@n^V1@gxx1_%{ z@*bd(2QxqYrI8~+8hJ$vq>&;23FOts)K-v2egF)_e`#cn{{rNuqy)NOo&^ZVm;a%W ze|r{yM*a=tlZfQ>q(3~11dwOpF8SnHe5c?;fh<5TMf-}x+|8)5F;auO*E-7vX7KT( zjt<u-uWoQl>pikfTv}~@qTaF23%S+))^gdfEzV?h0mbQFIk6KA257`g%6hS9`x}d- zQ;nTSG?q-d`9^ff_7U6Gv=kz^G70|59~%5JM?pZ&G;v2oM+Shr4E?zS0P-jRWMt+R zoWFof{#xM)$j4-*A@N#u97J-l<5?O3+#n!B2+`aP^VR`CW&wcwfdc0BPd9}pAnQoX zH~t3l!UVWN2Q1o1A@=U4?M%F>!I?>>g#$m+Xh0*MOOmLGcTCcF_M!i<7+U6#>4di# zxpM$CGIUU6&Nlc<MwWqJ8d+{}E()ZPPeB@a;W=W!yi#j<C)q_epC-inN~jdo*IWpl z9@ow6BRNW^tI3ta@Y9SR4(}jldeeIEUkdbsqlVsKf6-#gKjwWyz|;9`f)IrlcJ9hj znktysAEny;j355PAUXpf(_`D|&4h}aWa2|D942iWN&aPJ!S{XlY1E2=T#8RQSK$nn zdsoguYev;pXA~L4#Dz8PTp`5}+?D4dIqQTliOCI()k0X-?uE<?ydOW0lgnM-P%Z-! zIj_=_rwr4oY;IP-n4h|lBKY$f@`!;9N<PyhM#$=>u|7lDM0EVMN|LCx>wBMX$`>rc z!Vr!=Y$H1p2_YiFy11>Z-k6E8qI_fVyYy#{@L~A_LqjUFZvyrRl5bGo$XS;!9(?k~ zF<!L{>xFInu~M}8^*x}F)6@Kk#Tm~8>E83Y)L0y;`DnF4Hv}i*VmvRWDpF~8Dk)^^ zTc~+MIZv3cGC4%cmP3h*$#>R-q2xzJroOp2KuxfCe^>}pO32gsZnbrXa84R7bW_kN z3jt5q7EO0kQ}x6-K&2o<QXnPLkGos^S%7BQ<M#VqtbnFsQ_I!ZVH-ysmdRB5qPwnY zU4E8I+ZgKnX<JrXNXqA8@Qg-tVx^aI1GAsg@i@0|166h9hcB?IW_pFZl0#RqKnhuK za={g(kP(qG|5V6(?<A!$?&B1U^k?4Upc_J=(Izp_0k?nZSLN^MT4X;*^DD4CZEF#q zgB1<9B}1K;)5}$*yoY9O?GnaRxM(z_dPHZxcwv<7$r<Ka0<GFr%2=DT9gX2fDeBkq z6{VctVqVqzAU04p=@r|+;3DEQVi4|fT`gQ4?nK>Iijs`<+Tke61A<N)P5n_n-OW3} z_s6SMYsBe|Gx(F2#O?iOWRd}4bmwdN(_^Wo)B2La7eJ3QEdC;SW4bwR&D?%~kBisA zMOTthW9QaJS_Ah3wB8HoXSN6U<kVoF97d{=Vl$jDV2Iw@Vi|D3-+8OF4U@#uCz>+k zF#GJisry2IS_cV#<|-A9&}UJ2{9PXk7RmO+yiw_eyN#{vq0Nxq2#P1M5%qGu(wAo> z?yYcal&+Inp;A604mG-kKM}2EwM@osvrH4*Y0k(eSc?Q9XF~G@pvsyCYZkm5K&HjL z)O=mBn~#G)YAPLpZmB?~;zuF6nccW+xOX~6xTix@vWJ<Rh_oRz)-j|PjE%EDEel-@ zBnjyF9PZ;F55I>OJq%dcNQS@Y$$^>X%;u~s{<z(s#Krh}8L=H6E+7Vy$FyVV@ux4w z19R+8Wg&(o_Cu?K>zGR|^7hNZ?zSo6pCiWHNjf7nw*N%35#22g$VP_xPuqg?zaaVl zXypGtYvh3${6xwDPAfq)x~pLDuYHV6pHL-rSAQV71k=|!hN`wdAaN5*cGK;XT<k#+ z?$vQl%qzi{hmxP8-k<EoLlz^}_U1NR>8T^^&2R{&P4uhL9hT3c5|5I68~e*gZmSY< zGv=eEBMWg7NbSfFrGd_e7(d;zNJcGxruR)agT8LzZ9~gNDr#y4HAeP&HONO!W`mQl zD8Yn5;+(wBdAYN$7{iynIrBrX5#%Eq+S7{yu7#RlGJ}#qD_-X+d6d6~Py!^eb;@M! z%zHZsD)3^AIT5C*$wOD}FS`0Y=qP79jBAZbVj|e2xtA|Hue77)F*@SnD=Z`BzCPbv zH34hIAyLI|^}45J7A(aZRiq|74SwmeG~@qnTtW0JYSPN$yLaB6&&l8W#JFSP8KKLW z!?)n*c)#SU|G3&)gfC2+xTvFAUl^K6bFtAPaYnO-mj&Dza?&Sft><~V@i(abo3c0R zWO{&UAq`8=_M)(|+~UbbE&@!8M8HNiF3vQtJ!oo1?Zj|NJY@fEBiBFK$iGYr33hKC zmOo7kmCa0tCmUIiu4xM@M;2|}qbY#!1wr@AH65yr4+XfRan%?8XJUuYuI!9r2Yu`Z zG9R(0SsVE|B0Ju_stC1iB@eeTj4^F>J#-zQIdp<R@(HP65geR0q(Hdmrg!#!TkNDc z6(!g&v@II#0(Z!^*tgGdo5LMlxgs>rcIN7~ymodmEgVAlOuFxrAXPqCj=GubEL(hn zf~5mp`;^xT)z3?H_e?=bW4cidkvDg<ik5&xrbW%4)F=E)BC~=dvJyxlKWl1v2C|Vs z5;^k^i5#^oY6(bW#gS2;%+5DY5_#hv5?SZJNaWAIBy#C*iOeU+)*+Fj^G}I<@+6Uk z+@B<J0p%R|FNxf4{#zpdEWft?Ln2fCmdM^<yT2rI&m%m^AxI*RW_~IFY-GGmSYbR8 zKq4RgcZrOx)prDv$dLcZW3K<g<AVA>%6k7h&*Fbq*8874i~k#CJt4U#i44I2O_)gz zlE~|6xBn{Z)&IS$_woO=jXd!G$VMKT04KT!c^2~j^eps1o<+PsAmCXjT*L#Og+Iu% zApFy_Ko=c`9Mmx^|1X{e&6X_SS!`ItBmDL(7)9P=I4VDR77HNHqW;OVz;xc_=8^lq zD(fNm0)p~?D(e~GJeBp%(4#qsI~1BXzOcN^N5?X7Fm)#GDE|qokW}|7aBEAOFG~^A zT=D-q8+qRxVrV7vTpYFr*5edv^1GKnYP$jnWLp)Dn=t|a<iIm?f$VXzSO^N)H$!)B z(?J2H2)H+>g>u%Fi^S#LJL2oWd!qezZu9bFQxyiB9@*_zVK1NU(uVE8D*Q$1rJ+W` zrk;O)L7+t<<H~2p;?1+Z2=IO4X*%<-?DUgW!S=)m`tY<OXlT#u&$l3u58Pel+h#eJ z*F|hsPofy8pcIbL<z7HXW`7A~JSL>SZtgF7sYH3G4%2D5LH@pLWX|_wIw8Dk`DHb$ zEu3isA0ysqD)r!9SFNs~@-LBm#A*ux63Ns?mtv(caswJ)N>eQQC*TXXk`oUUdu?bg z4qHS(L{0;UJmF)w)<czUTm&Uv^BtuaVr^6Il7p}En>SaGw_>rjgdcimhE_S*m<0yD z;=#U$^@}fUkVzGJPT7^HA7D_8NG9JmN(4#WFuZmP@a<0@n#qW}6EfS+?iRX?$2iJI z%+E;HEfO6frUjGt2V41yLXgGbRoq@DBbE&i+5R_?=TdNTFE&$MsAdqp!!7F*^skA0 z((J`qU6<spoMT&Uxok1sa^-`8=;+Z*A)&HRMh|*OPiz*dd)dtYo5<lVaOJoMuU*)G z5t(<M<BU<@kg)CGdUx{4w2=SHv=~}OLK)&_H{b>&vbxXsD!QS08@4ijhx5qdIQ?k^ ztk}23ziebzkd16x4A{t-@hwV!*vKn?*vRvP#EBpqxpp*T4&JMP5k6uRd)(}F>R95N zcv66xC&EW8S$jAw$2i6QnJIy5^!X*^O3Q>(D<Q(DC<p7B_XS&1ajwHJJxqK;Me6@q z+57sdvUmJc*^`$p7yDh=oBUnbTh~9Gd8+Kq4t<pQUD>+@I|M3wfQ=mTh$--7Bc}m2 zGWanGYcHw~v%t4|%52h>_Ln+YKCu6k$b-}l#`!>F%nE?zf4LUiAS4$6jZb?lXp+9v zC!TxxAK)aRs6@zCC&7g}d6bNeJfAPgDqVZfxH4hLEhR5bjh3|ysNJ62bZDqBW+WT3 z#g`dl!1s_Rn<dB1CEtF54)Zdkd4mu+IQYuV0cd;5m$XBlCCKJVdXtaT^)b=o6~fq^ zj{IS#IQlFRN6?2@y-657C2o5RSN=Ue#3Pk&NvUb>Z0l#X1X@NcT7EOn*9(_a#+E%z zHDwx}4{{fq%v16Uk+R0d4W~MZl+lP=%PtZUBvo}YP94Y}`f2K<Owy~;VtIgV$y@Al zMHd)V5|N)9D1O$7vw#{}uwZX=EbB6bVXDf$l+-yNf25%~_7AHKEq)yqbd;8dIhLOq z6vLOs9FlH@3Tfp7v42>*A;43#uaHnUMKX5V`?lf?yv%6O(Q-euW2j+6%U6eeg1W{n zfb#{ZD-4mR+B|x+KzFg^K^@tFv1v;-?HuETQH8|kd``8iP3wtzst@|>Gy_n4Hff)A z`&A&+-dmv}81+0Dd>O8M)~U>(xN57%yeTa8PBB?D1TNF6(R2ZJXS!T-QE);t`=6gE zn;%(pE%1pN1HEj(Jo~Gc&CJ%;=^xE(TP$e72Gl3sdr)0(vC(6}sy0!=R$y78XS90R zlMXnR8rFuo6pd7{b?mpQwo+{$j(gkN?=90zN;Br*phsru<*{U*b6O!>>|SpDpq2MR zQx1m_#kMLGXlZLYJV9UugZYX{;Wxq0fT$5-=s4b1_8#5Gy4LAi6@q10u(7&Dv0F&_ zHm*ey3j3b&vm^SIHos3lt-4bmEzGee&4R{5MdTYcq#7G$%R_A>Co7t#jHLI^q<am! zbYQOowGN=q$*<|m*;u<7hxmg9a;&2KSxmN-IP<}~<`&0IGvxBd_{8c5!spY14|HSo zv*rR|Y5CaL?ZWOHkl4nG?s!<`ah>v|_bHQP+_Kr9v5NI%T;=ES@+|NFu=I<F0c+u{ z;O!u)clr4J)cnQI`Zwpew}@rMLyi`kfot3Pj%C6XDakro&0SJEF9=0wUlEps>SQU; z#Xsm&_RunXKdG$Q-gu9#1mzSd^u5}!)XJ{5=jT3*qh|b9`{}Q%2(t8;tIQmUTfKrY zucnlyj3pF$q?0WI2BuJqUtSighM{rP_CTJVs5svce*n7KD*Xb2I<Eh9)n0yD#_<BK zSar<5UA5+>MkasuM=hx?^PqW;8#K07>{SUSv!o!=lf6^!qrs}&H<qjaT7{skO6AVv zbze_qV5SwkS#SI9Sqrr@sdK4rp<uR9#j_ubl`jKpQb|!M0NK99Yjm3WcsXXlaxPea zK7#%gY2uDk<6*bw#Yp~W0c^bjwS3&zovLMAVD7M-9yw=`3{BH!5Q#}Eg1bsAQiwd$ zsU2Ql-21?7d<_IHK2fW8iEEwekCIyu>{`zo%VL9bGeWTAUF+b$^vM)e#ll`ex|~%7 zZLoJFJ+~n9A161C=Lt#Ev?R~20lwU>yQaBYVTo8gjQ*-K^;y`r9ydmU=Shr%o5f@} z*yk-+y;}`m*CQn4-Ol|c?1f#Wu${Anqwu6B21DO{d!Dt`eUbHv7Mr4M?Mhv`#=h}* z+Z3!P1nl)g{dR`zs|b>)R^)?>6=$s-xel;WSqD-A56M(3pgF1m+EJeZXpS0=Kjq!R zC;&A_dB$>1=pn9wnxo_`4CXu(s~Qw=K+RG8m}`g!-S#L5z>UH&sg+^=XpV}jcw2*9 z!f9&-Kl0QZ)xKhgr~STC8-ZVV9sCuk%2RWc-BWXv>=3!x5yE51A1Z1GXpVw^tv&Sh z(bZrrM%CfN+1O}IhSRbvu3i4I8y06zsZWs%HC_Am@DDy8{dL=vQF+1B0Z+9_!WX%m z1&x7uun^F?Yk2}KJxz7F=3|!L<4P<AF32jw$-+4^DpaF^f;~2*wx*wEckmafyRcdF zA3iNTymTOQez!Ak%jts^)O}-DD@+nagHGk@SWnEC!Z^9~#xHu{*qp~5;dEAK{e3YZ za{yd$&;176FmC|QrbTTBw}pR~<U98JFBYnVB`(sI*%qW1suah>d~JkZ1zHlbq#Zm1 zk<^vXfjWFagl@wA?Iu#0Tzsb7Qyo6ODcytN1(DCyWPrCQfqR`7<s<JfP=|m2M;+cx zFQ;Abz^r(tIe2gH`xjP&re|Uzn7GQW!^U^{5?0YM`P(BHd3wB2m1^I?D<lz%kzO_5 zMeH)>;f<=3Gn@u1bIH&6cV%e%w;stgs|PsW+T;SAQAnr5?A@cu%4jYOwT;SrwI!cG zol%L(Z`EWMW+lFvb<cX@hP*0Z5Lek*v0s4PSy8N{4;Ev=BD6(&X2;0X`6VW<L$o}G z&EiEXalYxAVRc{oNPZ5liL6JaQw>g~ZTRj-dd?DNXlexucVi3)Z0kC3RWL{6CO^4T zrkL?|52+3{uN5Kw3{5REc*gB74@W;eZQnYr&S{RGgxCZh09{iW;6a21(5l0yoO-xJ z#Gc^k0bu$+NeF5<TFZUD$aITNI_`Lc*g!8JSTHog@SQp{WSL8c)Ww!hHQtV0q3ezK z&&yAHP9Z%H2-L-@<K^-hFgEA71d8;TV^F}?3_OxIF`-(ME@YVZGxl?Bk85nA=}j#6 zTA9_0+Umct-!+_>^nM$-0vmSE#Tz7*_F;egm3ch)Bt_MIXMAD8Iub8dXzEo{`1(=d z+mE%^WCUV5R;+hZWpDWlM_uuuCY>6f3c_b}wgPU!=D{lBb1d&*1*+~dT70t1wYOZN zE0H|f(@U^Wby~qFC@+<@LSYW#sCQ~n)*GmnA39?d*~0U>s4zT|Esnk<`4>yXABfHB zQRN*Q+Mb{_aPFxj1M3$7VhO3H+9tWpW5fByG(ObPU5sr6{_IOwm9uXp3*3u!=9XR! z*28tdYo<}x6qB7g?@D8!>`-weIE7m<fuhj5C$tmXDY!<8m7LG6i5f+}z*h!TJhb$Y z+rs-xU)RVr;;l@6DNRd_`oL``M(rS7EF7U5#C?_B>?_fR@AB}@H_ZQ>jj6R!W<LH~ zU;QHWQ|DAc;)=}@3sR6l-=sGMzj<(1k**<w&Y6u?1FW(sHO{jz2<oMgET6N-X7Hed zWeGMJpIzlhC(p-`w0spjjz)jer9|psS-LuYoc-OHfw4D9fpmKGNIdG52?+ZShxKEn z7?>r_<hE_kwXpLhcu}iWH3C0<!65G>x1rWT2?<CFZ}6jDE6`p%67YXX9y_VIL4ZCV zTJt#5$spYYnS&iCbUgT}vtiLT^icA1#o{+N3YQy;Zjr9HPS>IHqruJbUMw6;YS86V z#BwAevl>nF3=S`Y1^f`-U&s?CPt$2B#_r_N5LnI&`0wvD;|t`NTWI@P?k9`KaR!{m zglRXwrXYS@u4TN@wzJ)faDcNB5xrB<Gj_2H?(zt6cig-oK>pb$_xqmt#G$pBv*r!b zEYEfUr+wGj_KKZXV|i+_oLh63#?FK^EZr+)X9>y|=5J+P8MQ98t{-*@FGl1A@ZZ<E zQzEsw-KGo5yOCb0szPLQ0WIaRRHDUFuCS7o_K$6cCKAL(WnapPxOhSX*AhC*C)SMv zC%EkNFH)OYkKSKSoUZ&UEwCg^`q}rt&%VD~FSONw+1F>h!_M7c&e#(LC4syT9Zua! z417fBqlqp_X)Lv5{O<akt^5gV4;$88J9No@(&zhP-Ibfg)9aDy535A-l04}*$7Cmh zqik82T<JHyYgy2q?S&k#c|T-q6nAtFKRR5w$0atMbtV;?kXIKQyk(4Md8r-7kPm}B zM5Wm}84#&S&WsShVb^6!f|AEm9Um*uBiAKG8#)$uLfH7D<H^H-PR0gWlWQu)PTFz6 zL9NMhbW;qS(Jnf8Lg$u4@h}wMh}dYt9E;rRa89Ui`4ZH!zF>n|ljWXTlVv4H`*o)b ztE@zKCZJg>iq;CqNIIBd3o#hizd*M4-Y?^;e|CQmcumwsMhWww#w`pn-LpRHWoV_( z7B}(O;zobM95@mwWaz?eyd#r4qX)-{P%Wa%no%mlJwh4Hkhl3aWYg+6qTE&7QN=K* z<@IOsOlFbtiK?M+s)wSp0*;Jc;u_sT<@w$#->~~uDN-pBBDwKjcrn)^4)D?ieyWs7 z6v4LwFG)-ZfT)yeFCXJ7nr*G3e(vh;lwK6#5@2Ma-fc#|f9D75<}JaQgk<5>oeG0e znLtY&lG0{*S4xA?11}1_z>}5$r9u^IN}c?;=6%m2HxxGApeF1vZBMJ;9oN65@)@b( zHkaZ(sLEFgRQaMijMx~?Ka(CE_HD^>1UlvaZT1}i&Axq>-d(?EU);aXz80S}{yzIE zfM#E_|CoKfL9;LNWDD-^*%#$>TxY%DU$bwUxv%RqR6qp8o14;^e6E)V(X&D`Li<4y zoBU25+{5lJ)PgacsVLqtxd<gBJBdwB$4bWW-r3m!>ax}B@C2F|A63{K)sDV~^}NXT zs8q|3(;RU<$<9OC;(H0I@{y6LZiWv)|5%!_N#grN*w~)+isZDQlmd#w9^Sc7p#Ozj zui2H1Tss}>@cS7!{`Vw5rD|h`*9#&#+*aAbyYz6X*#HBhjpLVraa*6S%c<3Hgd-<Y zFu__OK&jvj4{g*Sb}C;WUb<KUGBDr@xZWpPD+JomShcy@e=}|7z%pGWP8NK<dH|LF znhr|5>X;xGVr~;cZzb%G)4@Al)^qcKjPVvG0r^6o3VMuOetIu|>Ajz~ngF|Ev5Ge% zosry#ZUS17c`0%%L<->u@5?k-XQziR>^GU4OBV~9t=$l^=H#{)z7cDl#(Aez?XQ!B zUD&MvbAua!PLF{xRyC_)y;<gP9&w%s>YG36WJ<w?^LeQh28#bHmN|YWhCvM(-7e0_ z;tJhk34Xq^Ag8GQ72E!pbse1ESMjS6W`_7w%Q;2oRmc1!;(6|!b162~G&vM(_oze8 z?&i0HHxleNtX$*`^%x=R9y@$y>^1NnyL=I#F1bTB%6%c3{e~fYj%h5@%L}mtB)^@o z1K1>iOsM1(@pma<*&}cdJ|$*y>8KRu)QdPhq+=!Zj>BHbqF{=y^2#MVpE!lw;QWw( zvcWg^`*vb3O*HN8h9z;@?81%Y?6wrk9q05RlChnD1qGQ;l4!qH+5_{E?><09TA<3~ zAyA;mZAiU%WlfhNN43CZGA7AJfa*dUW3O97;%vm0)$18BNSDl|DJwvNq^qm8`|euL zU(aaw^nolqOONwbY6-_W%C<qVY4&GJ8EZByffj?^c^uebS4Pp!8`sy8;iz5}ekevl zod^kvLr0lba=j^qUf;nXUpu-#);>NQMIW~qd)W<qdpkA^lswC+OYH)>yJ>yj34Xt0 z7ydTuO`ogu2>s6qn1!(m&+os(`gdE#KbJ~wjlfa~;@47XVIa|J#2C9eU*<&b>c(2O zeY6ruGG$*kXV^w|MSA7Oti{AF>PVW0BPdAnV<2zvl4ZnQbl&R6qqi?Q(M{HLC^irz zDSSX+c<dRvmDItWhSdEy9W+?zQ&1<<qx==SJdWTCRkGf(YK+6Hkk;q2(LK<~l04Cy zgFsUT(UarMB|U7r@#FD>{X6{UNqV!utH!$thC-yE{Fq{C@N*?9!1x!B46i=hQpxLv z=C}@~<d5fGe9<19+uu_dcVGRSV$otu#|ll#qlS$xj%O<w&{qPP+JV*E`q3xbpJ#y) zb{C*ECs=#`eK-CWfYxjPttkLnH@HOsw06n*3<{F`rZvzdCk%~Nvl8z}?@kHBQBAmr z?fI>0^!)>T8P|~bAGCHs+$k4>u(8W5)MW3c9;TCkqQ4}w%xc1ECucAs<(_UoJPUtq z8#j&)-JeeNv{V{^!0J}g%9qO_ss~e-8x;lDVp!ucBm8W>x`?5{BigL^*|?#Lr}~*u z3)Y2CCuFNo0fBrlhtQS+B<%c9O}O~zD&xZxTG&Qlj=vSrfvi8BYVS$-$m3D_1D_my z==3Fs)&sAagDImD+KPx*QN$(RiXJ0tYRnz)5&8C;XnZfuCL-z|@<|l29JYgg3X-%- zyFd6L0zr~+?wj!6K@#S6u|I<(tJ6B4M%inB1xXw`?t?%<lCjD)3ol0bpz|S<R#!Kc zFtVn-nw7~eD?cAkX!H19&#fW(l(jPGS82`14xxquLIg*myt`=9UU<aB3X6tz+M9a5 z4r!l*OID^9-*5%C#macSQ#u0fA7q=qi_SA6xMo}wToS@-%A}9cKy#gZO|7L))e)Ox zPiaI@z|LLA@FJttliM$oGOAVTaL_lJEpku!s~iuwzn@GP0|{=C?TZ%uA9aW8Hy$3> zam@PI<T+uMMf_h`eKg3qdJ0ufB!g6PGo<EAk^Edg1iXY{*1hYCh*m+`sZOkO7pL1R zu;?-ze=fS(K)q7Z)$Hx6EcVPh%>4l0=!ZNVTnl!Z0Ryql7o|Q0b{|o?y5f8*V+tpB zqusU$apszWT)NZ4rhWKR8`^m!adN!ys5v<7Mx5mJA3oa^aeFlid}y|)77N@dR+UE- zj27V9@voRyDxmh$H&QL+KK+>R$M{&=$_@W6ynYdk-mj@DL%hJ9yD&LhAa9MK-8!3b zoZ)$FAkK-|W5bm<2Nz$*tmbHVp-u1#uw0S?53&T7OZ^epe_Jl0|5`3_fR;-Pz;fvj zY5`uG7FaHwJJV)aNQXrIUM|t=jl|E(v$;*70LvvptU4iJxdhLVChZmRebx-(8O7XV zte7TkeN5Sl+AS1gOb1H_d${s9<;L~w={ak9zm`kBZv*c^%cUkiskGd?E?~I?IVn*0 zv|Q?MAIKFM?Y%UG@?BHsFBpSG9|Y0*;160`yUMG4<gw-u@<9U88u_N*cU0|(*2PK4 zhdXd1xd5$oj&piIw1xxGnppd-(jMM#TIT}{Rs_)+<rl55L9}j8jzpn(Vb5O!4x)8` zNZufwCYPo~Mr42Hr{dF2FD6kSW^!$gB{@-^=ACC9QQzONWTt0%r9YcC0f}6O-FPDd ze(9$4^0tP*j-qd%T~jQCh19TM=;Jo35*PLBQTFyTKk%xiR^LV6N7sR?6;>bnfp3<7 zr}Z0v)_Zq|AX*pa{0FT?A2R3u2U`E`*!Vxv`u|94Kw7VuyMFVeXL<^m%wEz>9NODh z)9D=R7*t~Z3Yqkw{t+@+8qn1#eeWLpJ7ls~FPs1hnc!dOMv+S9Rtgav#7O7KLJjF> zTLZB_$g@M}oGp6+0;Q~;)*2i)iy!?XWd0j=zC8X8<7Clp%!_N899`=lI#VBha1<k} zx8&7L)S`Nl$6cXhu0}az>B~+~+I>{M{lnTyM<N8gtve!+w<SB-7|#+FpPKH$40u~N zp93-}qFQy@6CR07@#b=efo=^b@Hh-j0Vd_OESH+k7Au|S=VvD=zhEu@1Z!0at{!Os z)?q5;0IZA8{J1{^0kGD;>pM*X!8-Q+e}Q!a2-eZ=U;l#jGXT~aAXrQN1?xQ!tY@BJ z-MEhqf;HA(u*O~gp#*|;g2E!EE$kn#rZ-0cU`@MH4#0X7fOXUlOHp_=oz=8J5lLNZ zKdjDWt?}IH*3!Jwima(4thM?HoLy`j88Jlnnn&Hc)iqW=(me*VYh&)73;KP>JiqR` zX$bnS*9hei+tF=)W1@acS71@v1g|tZ-coIleS>yv6L0Xh3aZ7{gUq~X#(q(o*P|md zXTE%Ib_Z8(D!Nboz0DjZNwga|T!)mfV~dp|4c05_7p!L<WA&0lK(OZ6!ucDlxd2$Z zme({oR$6=$;_N;Q==Dj@5T#U9aj|9Q7y>iTn)fjrnvtbk+fpVo+uUXI@5nAmo!$w6 zyQ#15`zc*ha*)BcW{M^<vx1TMOvy3|l?1{NvQ@#q{FwA-?}g*xjr#}Fs3qQRwr|%q zC8`4E#}J{B0wPA_1hvvhDKmV2Yw>oskm6iJbkQ&gGT*E}wrLU~e8iBgN7i<Xi|h|r z88Tj;EtA$yiKIPVC1V>d7*ofHf$f={{p@ZiluV{Mf88n^`hiw+tbM8;2n8-#tCe%! zF<Fl8zJr-X(DSD9^JJkdxn9WBira)-W5^LtL9OgIQ9JRZO~+u}p*Qg8^qbdP6+Y;A zY%#tNm1ZPux&rlu;i9D25#Q~7hq!0-j%<0xvgvw>XEjPJi<fo9#dr640j^FPZF zzxz3?)s}eB9+rJKj=cqq`Kgo@#6yzBQa5y98dnFRtwyR~v{k8jneT3NWs@@Pkj3BK z&YJYUl5dG|sVjYRfJ&N-jJ%`utb2h&!8M+xvuvH(sK(;za>e~j2q{sjOd^q809jKj zh%`p%d3AFl_&nQtMhRAA%TJOx10_ZF0iTt`5r(iU&Xl^+Q#7&Z?ONBXBc)~2v}9#o z85S7ks`c*31QF|<8h}!PPZ1Qi#2O%_-Tr4g2ScaQg#c1^@UI983Vy;U@8^})Ag}S} z@$JZ`R3O9OQh}-*DP@9#cg18o$jG-?`CD^e*A+fMFT-^1HX88d1@ld0ODQD0G3gaK z!<n!*a#TE$4S*xW@tK+}v$o;8=JcB~24nTqcVMEj?emj*72+~<==t0+-xs`8{sfJ{ zLp0TjO1fwc+EJGhoE8XakKq3;q)qe`(oVLtux;>=w67f8d8$Js03q#OSx`3z&Qk&f z=;nAzpm6_6p#19QKtEr{#iQ1s1`;T%sEvMe15csA!lzK6n+_-x*d+{v0{5Rnfqy1Y z9y8|}@)G0eyt$DvX*18Jv8^olRu!8E(l=D%q?EnJ-hXkv;~U6kP5t6Q5Pi8;xOF)M z{zn3(5|lvk)YBmh*J%BcypQ!OfpUz^2XxmVJta_*X5X5Y|4yJ}-~LXZ1dCT3*8vF> z>4f8lL!WpNhdJr{ynqF;`wOJWW1baa#jNf-Gsd6OpB0rwpz;C&ywz->d*ixc4qh}H z+Np1d{npmAi<UxvXzMJwS9&94WR-<>a(HiZei$jFigO>Y_a$FL|ITPL8sV9;bD!yC z@pxR?fbl;i0;&JA5|O)dU{f;J9JEFF?JK-NGpG`wsqFg9@UB+MDmbQKJAxojl{czU z6CcbrC<LIj!CjyH1Rac{_E7&adE)tWts#rqN3x@(c$+VVtE+;Ev2q56t58xY!59eL zOhG%EzdAXLo;o=IBLu0}hU#Lqh3AaTfFPXhGHZl{^~lA4j1|j2cit&V`JJUbbon9m z20_z9qAcv@0XgHX6vzlM!Db|vXZu#r^4`zc5oCm@-K#5iCnmYlkSkAV5RyT&a3?ty z)vn)MZK@fbdG;lLs_AnNf{vdQd$s?F)1fABv9QD!p?y6+F>esmX7f_HRYRBTYpY(D zd))FA?j$eVBn)W|yS(`R59tW1eW*5*a(DAz*%V?Yg15|BZwEp?#g@-BLXKatW{iZ- zs{zVdPzxc9o9FHQ!c}H;?u@`Xp+bWTCaBFL1ZeZ9jxzDi@w~uGkJa@I6Sq@zB(5P` zfV$t&iC6-RkOzIr!!?=xks)5EX(H^)3yA~>znxTTxFo?$C}ue#gkB^s1Dc<=<;~>Q ztD#b{IJ!u_PBn|s^rx?3z?}{l#hW&3zg+z!hv4fRdH#d{k$l2Re78LJjZXc147!HM zjH`ImX52u;ZzE*8;W>MYGaPAx-5q5Q*Mb|akU!>M(z*{Mt?T($7qSKV&&?ozbejke z9vtrD)4okFeNKE7*$Qau!B*xcZEg6|&2hFY-73A7vwekYSEnaL`;AZx$E3#g4@$`8 z9$u9dS64H@2<gf3$1z&%eD<divg?Hp2L0O64KPA}x{h3}u&p+mp7oiT0*UpxYW3DG zqvIDHT|PhVFteTZ+CM87Jwp7`2*FS;pLqwsI`ltb{nY7kp!s)L4@Aq#upkr5A({qT z;;(y<@>eqs5SYlm-){Z6*AjmhZx@)G@0yLkexbAIU0bRzSla5{P*T*;sfs>s_F#v0 zO=5;W0iQl`*Ksr+P<%umr4>#0#%-sf>SQgmRiDO`NwCuNnRd9<PO?q}6_UEfCPJ~O zB-;=+^BLKe`e1~=36GvbYKT2YWEmCJM5SuwB>ro}{5zQP8*T#JlrEDl(;yD7VRtQZ zcY_EpP=uR0@f)Y1bO<9-_H~_!EF`)U0P9}f&#gL$*YVDoL$FW2b@|_XYfB(6XeEj> z0bNxD_|}Fzi_Ea3R65<IuwG%eP3$GWS8BNT8lCw^;)RZHQZrdqEO@Arci#jV)NvA~ z^AkN1iQM6dj9$u*2W{7Vn;P^nPu_3uVUxb0txTi3%+1wI9MW(ITx3pJ!hq-LQcuzw z$4{m!Kts=84k&Zq(YgvQ3-s2Lzis|v8Qx}EErNw-D?o7j%A9s}HwUf0n@t76v=XZ5 zDV{=b{gG=VN9VLZsd5<<Pa#=^-W)6m9D6x`4UYQrCh_fa{OPMmc4Q($*a<llR!{CL zPeo8X1)<uW1Bj={ppD2eJ+_?Q?9oxv%B_vv4ay$ze@Ccy;^7NTn@E39i<A3J>*mgE zmegdAofw)Kp0vo1lWD4Y-LsJI{68J3WUXv1FDlpW)U}(uNm1nwq5C?*Jo%jt!>ser zs3E$cTEp@b=^$}E98dM}GovpPZ)~%O<9-8yLAaQaHyeo(%78u8&<c^YF!3nPw>iML zmO8#Nza!eww0x)e(WVuNf(MVZA69uBzZZSr*on{PSJ`;#scfwKN7)#kuk98vt{DO2 zI!nyhw8+0Cgw+&9-;2k>s(K;<k%d9lg-P_QPB)9(j*Yp&2Ojs+kFd9X94Bv^Xu<i$ zfy!~}Q{`BUy4*uAzkTJ<tYoG+=oF|Nd$v262Kv#K=lo0@xY7=rC(4!^N~V@-av(4& zoQ7Nt#{qhwovv{wbmdr6O2ssQ@6@oG{Rkbv$_^d2_TIS^=JaAk48HgbdguL{z*J`7 zJ2h0z?F*dD)pfDiM?nehkMY%?-c3dYe!65rX_M0o&Kqr^thq1d?o%eOWS1sXK%|O9 zgxg>_;nup84L`td60ePb-D1>vMFZH@o`7xLQs-x?CcwQ?qH?eOi`FX2-$Ari=1W2> z5;?j#+su1&#@{#hsix<N*1E3_9#J|%#Czn2Dx7g@?y9nlZm}+!)U`LH#@;2Kcp>k~ zI1E^Jo|1|9dif<WB5#!*amH6-o&nj`54xiDVv7jnb>m(u;cphvO&RkoMGx26eGqo* z$S%&#UU85n>2xz5F5YqZph{2rll(;f$iIYC6sqtj?x3GFk5a=s>D7R@6w99;DQ>so zgjs{X0CWGtBO1i(LktWTO>9p~-VmJh5BsYmzY52h-PI)tIXFC6q4-zzK;bz3ZE$VV zv%V)>bAWIyP6%l0%U{|$h7=+PvQ^IiP|j`?bLo52-WkZZ9)KHJ=UNYb))#=o>^C?F z3B<caTTH_iJ{e!VhaV7Tu}X;iFtpC{@4_)`UYFAy-oFdS!3kZBb)3#5DG^wp!f_0Y z%Gq|AHuoZ@#qYwgffcB5ETa2VIF7*u3de(>!tuT*bS;V_CxZePb%$#;J-Tt$$$MC= z(6NpCnTOjB-Jv6m6W_Y{a=1@csl(rOa1a|B8NE)VmlDQ>PYLa2k}-aq{j0^t>7#P# zGgdIL3|P3o+PG|-tzVluSlGOI>Xy!2veA=u`Dh@CmJ`9HTtK`V>OUg&f>7|AXcxPk zt1y_P3dWKE9F=;t_gC(3gvK`>J5xKdGzon@uXM|D#75!DeRq8eN)p*p?=Hi88lrt4 zV;)^RPBwS*B1X1OYe)^!jtY~RqsLJu)=0A39*@6fKc3wlos8fnYr?*<MO7M~i1zWi zK9Wvmemo|9csNCUldZHyq;K`G5HUuZq5tsndTS$wSy)fs`)=cWZ=?rRx)3&bEt`b& zRfa)UN6XE_&%3kp>lW965a|lxY=c&BYg%^w$GL%s)1JJMk+I#o!}a~$fRSWwQrDZW zg_*trd`ov<TTUZp0!qgoU$y#rd)OUUWDEH;T%X0jY7W>&zlg4Q@IGBoYrRi7B{lGA z=DFS2p=@ut6<cb!`#FN!e7$u+jB9Y}=<7ZroJs1#C&<^*{18^b9IeE)wsE(A(sMj; zYp|s&Y<-$cY9qY8yU2We`h94mMcVLgCaX(WpU7+V&i?V8!Rh(h!^y{)1cP?>d(5#j z>=!1t=&nasX%%F?I|tmnf;>Vkk6mk2V+wkhi$a}D!s}bNg@PH6KK2jax9$sxg%4&P z>@F%?v+MNdk+YpoV|P0izs|Iek_r=fEthr9^pHOMeAvI+Tpt_SA+#o0h=}^ZTyJ*o z(DIe2wW+n4ho|*s_eCLd@8kW(K@2lD;oQYq#+_I7b<5TmsVg(F!NZx)?dAk*`rImU zhMtYj^j^B}tuTu1<L36al`r>uzI-<grAr;xhdW=#qAzb}S~S<Z_;`7ny$1#!o$c=j zd_7yPPtOm0y&g7Bwz@W4B3d7$2j19n+dkOYT|9U=a=O&i+4#)w>^@vgD<0nDy;}30 z?HeQQ5EgD}UT#0SvN}ClC28Zoa&oBi-s<|gaoi8{;N<1ubiJ7!Bh+z~d^!_QbFk)h zb+GWY$Jf!x&i#C8WGevn@#N>pyX1<F>+~f9z@Z*_d^~hG9zH&K?6|^Bezd>!uj3~5 zye7ST{BhWq5GB;W{3^rulKD~1=P0k{=;3bQK;AZb&BkXSAmZrZYDxF24b>8nCa&hC z@cqskZ;#8vi@MSP?grZhfgc55QdYFa9&aZe`8#c1KeKkp6E}{?uS$i;A4HKeIb!=T zNFujwMJ9<NL!qliCK;_v5t4`|siaJi3`XxDg|Wbk%PQf+m|}TbQ7U5A48Fi{dLMwg zGcyn)jq7N0ofNWVo$<+U45RV7tYg``Dq`!Bw47sRkulGkF?FS=iX+I=a0C@x_s}?O zr^)Z&z4v^{DhV-3Hc5s+SH4wNYNGuEVnp+;DhC}hOdTcP3f^aixsi`z&*!=7DpP5j z6F0?Su<P&=T`+L_w;kB<fKVm|F2!xAd)=(krr7p+n<SPte;8t1UR~@V$^jLVgi^wB zD1{}hJ-x#-GM@)2jD{7N)};Vhmo!*If(g0p^nF3bF`MdyB<N3qJkR!N68m$SQKIT# zrEx9U#b24!QKn+?Zo{jX9LUf})T{Zo8e2%S(L033E(N(zVN$fvi+R}9f}R64cp%0f z4<C2GEt-KCC9@L@E1gZ^@Y9|IKdQmzr#CWh<mhYf`W*8HQ>IAzG{36hDiK9<J(fJa zMP5a7tBj!5mAAVb^bVu3HpB-RG%=S$@2<M5cof6;5vat>L3<El+u4CV5-w&sZ!k(> zw>i?s1ROF3E%tV6qd3n;49>?_317Cu$Is+A5hQxhWfCR~rF7<J$?a0u+K9x?DV)FL z!(He@`fi}|qQEiEJ42)!+z=Szg@XMar4Aa(i-|2B`cdq}<lunc8}>z}0K9oF%3`G# z9`QD9oSvaTaJwm=crdU(SA<W#?lfhRClBk+cw_z~l04cO7oTJK6Y)U)Ah~F~zYCEr zSHFL)$pH_|61*Zhm3<!i0L9*(onPd+b6ExCbjrCirG%NczHgki0k@dR?A$qS>YqcJ zx(3NPlqU6@JdsEyk+BC%9$Vz7z6T=pp{pV!@{8^Y&Bjqdt%er6Rein4qb7U@0yL7* z&}<f>{4ug|@@AoBx0#=%Voms-ljufr!jm<TM+qctxQ*Vre-PiwJc=Ihxp8v4yIAid zMIC1{xVzrJ`gwOS6*=Vd)%GZRx#BK>F<tOVQ}D{lq~ZblB(*Y+UaUL7Lj;ooH?ho? zMJzqSD&k$_eF<%C(;$=axWvmB=D@KO8<K;d1V+eTo3R#wcCix3AZdVhso9YwEz6ig z$4u^ER;F|pney(@R$qsbePlt=N>2&t@F7c&7{%&;pkNQO4;)l5+Gl1{!;=nu8miz5 zno?LdH63eP88o>aHmN2U@EEL-<xiB2qx`s}%b&<7m&LXXE%LOX?D4`_G!?6<@{6=< zT;^$PD&k_ULU;y7ex3q<;!rc2nuu83CuOr>RH&=7<E^Q_488WR-}PP)G(pxlq_>C6 zbl)dUwI_|*)Hb@Gx7<?H@bg5VqU-J(huJvy(jW~}jRwf`SHZ_w(~(6pJ%5c!!5^b7 zR-8E>IJk;~p=%o#&}EfenmM087=*dp96?kQ;-vnTmW$jW+>)9LF?pWut?mp7^wd0p z$r~3;qCtm#3bq9VD)H6ITFBJp$LDhGf;h2^9+Ae;-jgUM5lq-54)U{48!7i1wU7%R z1c^T;DDcM)SxC=7Rns;=q>5)0TfbqiTNxt>z!KIK!9^=t*l}(zO<la;M%9@ax(253 zY~Vgl(M(w;DzEj>3u|L)iq4V0;PfZ5$n)147wbC}1)j-T4ye*s4>(nt1HT>mTStM% z3{_743b9ks1*+SzWT-+1TF)ezP`1}C`&1_!_=)rkn}|maawN=}Kqs#aaPlTCA)}>! zb-9-`Yg&N=hUN^m&y$v*e{PTU=V9OvrL;D+Y%3~AC%I5y65v8;Ki*Fmaf!?T?@hcP zbI>Eg3VDYP1~|D>d`#g@RwS8HYB=j4Qx#U7=<@J%-aYq+Tp;Nigfl7o2wXK^oFFfR zHD-Xn2W&~0ajt-A7y>`yv=zC*1~qgQlXKpU)(5Y{n?O}F#+u5|;$X#Mk7CfWkVV9D zKYvaZp`c9!4qQ>r9ZcE^a}ap3yn`dqSg{N7A~v|6M3OfAMg=CrUNiees+;iF5TZ<z zRB`djv~&y-<*yi+01wI8U@b0jQv+&&(^GWuUh>ru*#X47-Shy@rOfhh_l4iR_?tb# zS(-?Cg2B)L7ggZ>jzS0><j`<%q0~tGyC^463?O}<n?iYe;+9QhvXTHA;g5d1#|)rt zoE><ggbNIHW-j{YeJEVM1jS{->r|2YhFtcz^hn+!b>P$YQW<T<KM<ioydoN`3hXl; zVTYNn$;lkRv9@FpL|k;YQlU;IL%gazO~K+Nl#!nuH)eZpFJ?hKJ8TS-Hej{q9Vj40 zvNSI)Mvo1>!)nYjW0vDLDlw{Ipe$ilh~yp<M8QTle~{NQXp<&#Sk)=9BY^N63^SDh zhiZ07&ZK@Vwz}iKZX&@xPJCGF)rCaMMr<`Yg`<qNZyayFRp20zDwl`}3jH24TS#IQ zTB`W)O+@P=x#_HP8T0K}z>A&l=cXE;H5ctpRc_S{T=FKSIkH05M;+0Z8J5Nd^->C% zs0r}1;w)&jjEomB4LvQbh|F~155O2C$Dya!3WyDZ24{_v#4KU8=pDMA+k8f;6f=>+ zmJZcZUaY8tC_BPczgv4OoJf#e3e#(N@zEV;lvwia@NTB>c&hJWN0>6Suk;et@)%dw z0gd?}n&9x5OgIo$djw&YL=wy8b@e-eh+6g(w1s|%X=wz+?!ZB&TBYjG<kc>4m=vC* zc#`{!4tCLKv%1^n$R^Y8K%<55HL&$Aa0vh!tEV*J5bgS0e0=t{$haBzw1JthWrM8Y zfxt0V*EfoH&>A>A+n~eaKxn7GN!9>P;TXFF7B|N?I3~qIR)d<qbO0S&HEr|8rAO3; za+XGp1{^OAK8|<r6L11<bBO^j1dc0g6L4GumO;l=)P`#VeW8_D*K!zzEsj;9p1lPg zg=#ZO%H(wQ9G}f2k92V7HrqLNPU~KTX0gN=2ImZNL2rA<ACj1254PHU;)O2RrOCYr z7cQ^IprE#J>`;FRnWqCotf@Jf<EMKY&{bs3<^394`;uW6i%b$A){%%n(4a&Ta{eH2 zz95@T(c{Fu!^wP&t_>ecVT_(Co~phmX9Arzc=6044)p&VgHNl&Nt!H(><k!!r*@5= zbwgAelIL+Ni<mi3#5%u$-Xoj&Ug`JTMCJt*a2;-n+So;j?9kYeSuXd1{`?-1N$gi7 zB$F@^F2hH5sOm!s{!tiCEfE~XZB877K?U+y<eXQi@k${`CS4WmVmnA&u~nf8BObvJ zY&db}b19N0055Rj0A5I%P-?vc9)f-Vq(TSISWR7t9jlJ-#=f_f*|d}}=^@kKPMflY zT<jd~b~fFDU)N}wsSO+&v}W<R+;#}YS_<>gU!=*=?o))=GBQJ@$Q2Tf)fwkiVkW3K zkXAOTgj%tiF`FMO(@D7Cv+I;(5(W(lz1Z$QbZt%~pV6#y%tPa)8QrN`Y*Go$z>p*N zX5eo2S)R8}%*<T7y(pfy7H)J1U8xj*46PeNxd;BmkcS6~8u3TCxP{z~j=}v&VKEbz zZ%520Z~4#oQ8V?1f@9xO@GOQ!B9n(`zRta>stg4-7tkDtCHjM7t>BtaD2&BrxB{24 z<DktcjGG9<_I3AzzuMe$nl&x?-N$^j0RY+roPgSgTz=SEhrpSc)Pf9F{UxcT&qm~8 z*z0jU!QIoz&CA2?Bv5+GIKwm%blv)1pU9(scCqp|bIzfO98yTJ9;!`9!&=~#iL1*? z!{YV$^}ESX>K*VHZDA3PzS`ww0tM_SIQ*iDVt5AY$W<+9M_1sYt_maghqSTNt?Btj zNDW==IjekM)0TH9Nl{0cm-d1`j^Ny0HH8#BKF!ud3)yAu5$-o)_aHU>lK+{_3Z}tc zVxx+26a4D!vlH?5@Up&=&zP&rA6k3LT3^0!bBq&r)UHK|`+}K;#;ZH1`s_TA8<!Vm zz);UNE}`!XxX*(CxkDHktO3J@sYLhE;fgCsw3BDDF-vq;BQ1fN6WIt60}d?*lhyNS zed8^G?Q;$OB0zVTm8SyO9=Hv3Z~KDsR@EeCK}C(fh>@uTJii+O@pItdc*=V-MVx&$ zuIQ=R>a03Q`~h>+*%aei>3!dnsEwz`j*%C9ev!ttyi%UTBK4%kwfBL@CdJ29Xuw3b z)SC(gkEkpHlVIhCWP(yN#*Pz9o!CQ)H(1tXrHue>!eyw+j04PT`FeC@j^lp49=h*F z*TGZMJwq>xrYJ*l4@PZxkgR(bO~zjXSVjWjBN&7aaS)bs0etjKg79HvzPgEyACk)| z0pd7IEdVOKML6IE)_%YXW`PM$oRA!N0dVp3Ou{VR&G8|P@tad@v2b84a8oln;OV$V z0Z;CH7%(!2l-OaZ1%QUP2&S?A#}=9H9t+12_$~8C>yp)7$<@vFa|5s1qpLxpf%7_3 zEUtc{fd>Ni0YLPP+5@7`kqDSofgy@NhfX{kiNvM-_IhoFQuI%CV+x&Xo@c*%d!r<? z)OM4<ON+l)Gv>d?-72w&H&os+NY(N{k+3fns!$EQ(IK0_r-6#({mq|~%SvWoy27X# zI+tJFYQKzuN#S3V3Vx$eq=g;aM?bKlk+={NeI4M!g-H<t&(5vRpDr7RDHo1{lMWx3 z#~zzhmN}L`*e9w}4SGi5Iys{@Kd`4J3=p=%W?{}&&5#0R#(Rd`z>f;ny?K~@-!fxD zGB#i<bd;|ixQwF#_yaqcPdxVK**IbsG?Zv!(Ff~Af}7sF2FKr_d-<G<Jte`l(r@$y zSt{G02o9?@IDogI*v}Eb=Pg#x0|1S%TaI54$DE8^E$;vmI8WxZWnwGApiRt9Vqr0H z;-C>1PGKSj5zKVm=qPH0M7trd;uieBhXqow?XtF+C`;@(Xw$|8!AAr0?Apx*-J7`6 zVplWn{S}_q*3~`IzHtj1c>rd9vI3a7`o_%0?-hxbN-P9AQ&32|I?+=VXsm0!O(={b ztpEWlxGkt57&pergn#l=6V-&mV~b^_>c=~Uof*l&Z&4m(m{aK%{#e?AvG8%3A!iaL zux#2g3FML*s3s?ywxUH1*n`j4IXG~6kq=Tuti6fxaQjU}W_fXnW#b~Ck8O-{0YI3I zwj{f}1lE^WWIcQUIzsm;Yw%klh{Rxqz<b0v$sLgB+UP2k6+<%w<a%Z`UOE!19B`uw zr6!zCNaG3<>+2Ki3v3+gX{xX4KX_4<qtCgRD5&`@E7xtMVKwE{*7kLCl2?y~#nr7+ zv;^W)&PH2`nUEsde`)~MFu}~gv(R{9AOU#kVN%e>s5-BNTaxhoFVfySDvD-%7alT5 z&N(AN@(?5{AW;y>IWr(x1Vn;J&T#;NAtMNqbIy5yA*kdeD1syv2?_|_8qfLNd(M0R zxZhge+6%g-y1Tk+SJmG8d8)%4ocI{A_e;=sFzOr_(!t*tm#mE2q+|%<W4ss?$WsA% z<Q$E*FMxYl5xI+vNgtY^Q2JCF-C@{J@Jp*4`FES3&?3ebKcld1cJDjLSdy&nQ)JQ7 zQ7{r|1P&3^d{#Ec4y8#^(K3QyHDH^j#Nhx_(8NHDWWyU)z(5G{eqA?W(_9OwT1nIJ zHM-0^1VQqmXz(Ln`>N<IoI@>u2+6tLGZKzRAbrPES_KYuxK&6fVU5`6giv*KI|;n` z9)fI1TFYvN#6fQ>T>(?dL<dX++}8(9)Z<W}bd*+NjRcI#KHcrvTSL;1_Wc}C1VbF+ z;59Q6=JF<78Rt;0Mb4gW?KX%yr7uI}<}J5EmiG0~7_>1IAYZu_y1LMhhwh*2F(>U? znh}it334qCI4G^hyetzWP+zQJ`w`Cw;D>`M7am3<fm0Xd&#eoof?=Bel-+%*rXUBe z4-vp7dkEu98II*di6|bb7QA+rdl*-2&Dx9j^*XV7F;_>=eom~sDTj#QdauYJh6xJe zGLlc9QUNrDPwks%J@&se1)u`r4@&WO2lYr_D{YanwGy7{04Cre%aHEkjn`4HeYPU6 zVkjHZlV1Dmhd?vl)u($f>x}5hWW1}!8aKH=s@Gwuh&aS|_%pXNw)kD4Fh%F=fZt3u zouHEdhk~|AY{||Yssk)0E{Jzg3QPEKdR}0Hup9uyFRbcC?h~g=fANyJEwNq&k4^aO zBioo0(f-JVr(t-gj^G_<Wge2oP(7<i{ZN_P^>zY=^i_R~n=V`UQs6yVxL`E5qFt>o zhxv*2;6Zdr9<l_9^SaTPAMWqO(FnI+O0Rmv%V8g$cFoY(KL%j~DGUyf!e78-%srt+ z5NqSEYAkKQBK|m56Ki9Nr##U<TMluHnJXC?)~aN;^T4Xik6F5!T9lhriALJQ#L_1X zC~3_cG3mrOA7Ue#5+k$Nl~|sefRD=}`xoM}$QeW*xW1ybRg|_Pi95HY=>TI9A+rCm zK1RUA(bku?ohs!$YZg*~_Y4Gu{aU`EXzN2MS{Q@+jQO$8`DO$50~nK-8izeisdgeF zQaXe>D^gkk=4eYohA_?Iv>-$c90c<?&}>8C#yOFQBbkep!<$>{<kQ>m`$kQGZt@-6 zhJ)ZZN9~LjG0Axuj{-lH9gmT~$og-ASV^t{=-Zve6rvV<$@iSVf$1vf3aS?T&GCG~ z*%muka5T!77f`N6O})s7ch?-0_tj#wcn^i4MLrRKGiqt>zsJsNU$R(9)*?i$uG&7p z7>wwaI0LaKgBogm39v7YY?Pz8xu3|lUPMOP$CHayuZ=v7sbU_babCxOVwuV&3BK#n z9X~ODg0lH!vRu4D{KV~9qz}mto3MfUT=wakyi8*Aicn#yWP}b|c#4UFk=#}W5e{tL z&WK+L1Cf|zc%cJg;PjgEY6Zvo(1dR8=Bh^mY=bBM_b})KACQFNoMkgX2oEHd{;*6~ zrGY4}b_}Dg51q1dtsUFih;gH6?UBC$->rG9_YmgYX=|TG?wZCI4~!Erm~N)`Krk?$ z0thDw7*HKLYr*{9_GXOMh!CSYD*{Q!xng;k7~M5m!PC$_g45WeA)gZaC2`Pa6m7=q zLrepUS&+&nj@fKzd#(iAVV8#k)6XsFs1BdQLUjEyC);z!X@D#`zuT6Q6`Gtp@G3D% zYkhv!Y;fjeKKA_QJED0nRx$Bu99PEp0Ea+&!$nEU?%po}QaNUeD9T;yRz+tXeOoPG zFSd0#0r8grT%F6AINehAl~y!jcUIG9Z+Mt>&ba&*%=gsLt>8njE9tG`MR#*?Ihiz0 z`f`eqc%onUt}@Sz8=|)yrsA4RGd{mNe^1r4=^ld0-&=}3u8Mh_=4w|gW`&9no#0Xb zF^9H-?*g*+$xH!TbbUhd`Bpp*+AxBrR8-DNL)vJ~iUgj9H}viwTU6O=FvAaGeFsxJ zfM#z#1)9}BvmttDHe?oP_U2QdS#;KdxnAbm`+EnHr}@gN9D#9bDM;0-2NXc(8UTiH z!$CBr3=9Vauo>tKD`7abIET47;|ER-`?R#YCE_pQn!qgZG}0pntpWbOnzpgBZ^l~k zTEtWjBce&sfO})M+uC9**+Fx{VK{&pP$8j*iW$hJ2=bVPtZp!b3Ow{wph<LlqQvpO zzHp8bA;Lt<c8_omt`$SX(5pKQQ$o|+M$@n#xd@TV*@|drdBd<kpYB5kz0V;~M>?X3 zlJQvPJGgHwIAX@DZ5%iHw0<p6a5~(lX$lac<ZNUv`DQMk5vy*Bd*l$Ri&*?qWnWU& zi7X0Xy0+2b9!(8I3YyBNjj5Z4uBOd#BAD<(q%$n!;bTuAyi<`zY>j9S7~SzV?p19@ z&k@Xq)U1xhD~5eD@7AX=2{<tFH0r*Pg!1?+(|-C=AzxZ)JIUq<OsKieYIn85He{#q zT#C?&o6+Nri?y0_B6wA3&g8s%9-%!nEpk<>`9H7;{fSv2^IQq?rUK~xxd`OE>c26I z&5t@XMA;!iLlwa5=_@FEs7R2;xNyhdYC8z)9@g(JZx`7jp9z0mgs$!3PsJ$8FvXR9 zUYsF$J>Ws%NR#W!P0hggh~2(v8DS8Yi&cUI+kB|dy%DEov2v<*&nREONd8Potoi$s ziwtg#5Lejo&Mtr37(+ye+F7*>Wp-?R3~>59w<ARJE__T9024|Ec&x=es$_8n_@r3V z^RNh<D`jrkUy9qofI;<#!$(h2cfk}zwks3C&0_&2Y3lM^fD1~oBmr0aiqKIu;^5*3 zuzN6<C;|sI7S42yRB&YCI<><v?W-~l0V>3YU4^2GumjCQ1r)ImISj%<=uo8PvqqR) z7T|@nvOcSsC~u2?t2g<J`E8V==%cYY8|F*bWR!6^8z6j8I=D2Muqi+MvxoBh;aG{k zjI(26S_XA>-dMyM-99_BDVl<1qUYWhYRH2Q0(y^x5{UyL94|q>J{4I2)Cw=qcQit? zh8biLcz-QKX9VgSF>v$G*g}(B?6VGXe$Yr)RCkUr%>fSJ)0-9mGYkN11$hA2%mG`5 z=Ffh(s5QSNU_zRxm%`-jG3W`$I$Tjo4In%t98+b23UKWQCpxe%0ko?QfG$lc0J_aI zsnl4De?E9z#;@JYHaA`T^JmG6so+W2O7N-a^}@}#XT}Zl1jByY5vh!oc^Z*xTloIs zu8;KEB`u?{gAcU;D@qA-QjtvqA9iX@*{IFac#Rys7uE~L0*CB$)#NotCZ<=XlY?G7 z4VRDk-G%qIo2|5?=0ZL9B0B%{2FpDYc7L+59UPzl2@jTS!o#8$*L`TFv}MPh{Pgq< zc+ssRs{YQNF8C^hW|lktZ1KDWjCE<Tw-d<@Q_nX{HuHwtD`-$-->Ys%jxmz`H0F1a z7N50a)!<l4JLI-4t#{^WP&qQ%XHsScD?d;^sFO9_p>hk78pb+y&4EX;6mm)7_&1BL zIYaRy)I=GCh5Uz{rgAW)QpDlbktCyMF9oz9de-e&W<lF!Ad4gJ6HfeW1aJs4y0UKw z5)%iz{GIV6_`HU+Z~zcSGnysVYG{aT8G54Qg5Gn3DDRYJi9Y>BZ*?KfjN;@=WgSLb zmuVx8+a;pfu2s=SjkRC+I-O{cgq^-87UJ$>%F|yt9%+^J`kthVDrK^Dhc3U>kIUuc z`rxWIt#X$f1>Vf?g->OQ7jaVkg}$?B=fkPL(4FaM)B2pKjMFN48r}nLn}IN2HuI_n zS|&5vFu-85GfywaYQ?yfVbd$UMdy&Qw-N%As_aYY$jAp0DkNDF?C3)dc+$6JtCcfM z)S{JO9fP+)-r@tTlo}<VH~eZ`U@RyRR7>_P;S1WZcslz1FCFo24?@9G8(c7+n!Vl_ zY;hS2BOceqxRJ+LxH4NtaW{0w!Qn_>$J=)l9FYp-rjjXNP0&y;6i0xKkfvb=mnsF3 ziw|2f?UzA*A*M-*Bm#g9OiVc>aSb){hEz)ZfW{bLvl>DWk=XwM^$;)ORbV(`0az-q z`Np}em_UINEW9{m?#{utYmS|UDKZ3t+lk9t|I=Kyx+>R-qhJ7XkCB&)KkJaJE(T?r ze{G^n!^tIJL%t-g7?+>|Bk>O4q=K8y&@`DSOPZ3E1&G1voj3r}{Fw^eR_B?0=ulT^ ztN@kzUL;3DLaJ6W5sb3b6+l#-Q9}>`VleyT;lQ{7;S6x9Y*ACA8!j}S7*@UX2yIWE zq8MTFoLKa-g1!q<wo1ZiPF~m0M9%TXmSgC!{fn>@0h=Qex5?#q>`)LCtun-fZi?bf z*(Z|N{h;$d=!hfw0So(BANFw&b6fP2NT<L(41@*?l!yQ{-o}>*O<4=TY=zNq7okd` z0-K^wF?lQo_aBm8eE*!}j9B2?3ey2&P)5s<T;oK(yPR+9sj!>CP4%`J5>F+2dr{4) zX3AVDY161#^kRg)%auw}mY^!g>oTV&C7@j<(2ipw-tsNV+lWBE7-u6Xa10|1!QQdY zef+t#<AAnb{$Z7S&>J-APg8t4-)1u+2E5J;U2~M0EWoph`&Zzn+&T{)J?=Ygz!ydD zde4CE78P6fqh$>MYf;##e`d5?$Yn0!_N9m`G`bXhe<iV<wF{_q)Cn+kjvc_%iOB;~ zhhSlYj%ty%o!34^ot)-we=f#Qg8I5~r3S^X{fbp=SZCmwLa@~Rv2DQ{<bXy?%aFt& zwT7x*hH*gkr5<(Mg`1)<<N<e!bsz3226q6&U`m4W2pd8>k)8{%J>f7APNul^F~=)5 zkkgvtjsZNwwiJ@{CjbN&3}cJUaP>1#y_!S-eiuf7b?uZ)l7i_lHOweS?V3Y4p(u4O zI(WV7CkThR>w>D7E#=Z|+h7V(9k!s1>kkKACFYO(1Z*;<<9%jee^I}PX;S@Be86rS ziI{&<Vn-Y+H-Hh0`H|aI6&juhtG4yypohD~!$^MoidJgKWv@I116T&hPXibaROmWr zN?i16YJCif1}RS;hjbenvJ&9P;ZBinM<4|x;q|T2892mXOx(-Y(ox0@01F&o{Az>o zs~>gZ4;;l8E<9c~F$^&h0x*E>Tg=1I19(<h91C#|3(7cwx-b{}O#r*R0ek1cjVedm zi8u=m;NL;~1o&Q!5?^k>P$;AQTk>Bhh#-?5BG7{Y0Ir;b@ft}GKNf);E8g0_Erw9D zhn5Paj%Bsr7mB{8!8-`nGG}6gI<*1AA?glyj^Aek`=Rbn9x2n*#U^yiHwiciaM(Xi z#&AvRmdBmJj04}s99vwm?^DSDzhhAAELcvV=v3GGItw||7#){>Lt#-03QzqJJ5{QK zcI?;QKL~vP;Q<c7x!YoZfuNnT2<%3N{;SJ)CTIyi1<;q`F3yY=teg?v4gGNUm(%~; zhOoJ`NY@+DFn#woxX-WIPOtOrBWK2+kY|715p9&-DRnl&^Bfpa3QbUU!fP9rnM&~l zvjePrhr<GG$aBe-w6oa#4zYQFY3;!WTV-GUh?5Fu@byQpJ|_P1zZ2=l--$FaBPy|A zwj8JCl2HD%F6WDa9MnXeJNmx8Z#gjE@uj}i8aOh_^Ju#rV@mlNAm#EBa3t-L3>E?5 za;%%F-$<6(GdSUW(?BsebzfHYhp4DC`O-7Fl9ry0rGYGwWP!ssz_Zc(`0*NiNf9X- zh?J`HHTugcg__7#62OCCDxiRSNVcbPCRKksEf|Le<fq-{caV_9XaM|ldVUU<E0<B{ z&8FJV4Qk%Z$M@PYF0(cpH<w2Wt(L4Lslg|E75-wEbAVkA@gD?>zA>)JeDGQD*SF3G zW8M3mF)jYiJU-4aa_@jhU!_bA9u$A8uM#cCN|<!Fl57znyjz8yJWAyYASZO<cIxmg zW0=Io-B6B7w>QqK6J?3ki8IfunGd+RkyKQNitknKmO((Q%9X|uh)0i@Pl8Q^4y16n zszDL;jv|4tUDO&>?xxLa7y!*B!QxjnQA~v3-i^oCQ=t)ma^NUmqU`JKeznH%Lg#?O zw4ELt&a91&oX8##ZtgY!s|jiVo(bEBz!4iV3NY?A0L=+%fL%am8Ru^76%Iafbm=;U zkI~)f{Q48SA-_IF%PCjN%eL?O5u2?daDxHgZL}F?LI1JH(Lfh#K(ERBNqH4@BIg4r zOrOES@s0$=DG||}(8k((-&Ln{{O)jEu2^3#CdM~1eB8!%Sf1?BE3M0!Ebr^Heg@Zv zNW0gI=*PHKNBZ1%9@PR7NA6rPvsff@%2P-=7+%cjct*4IkXL$bGK)Tn$2mVY_)f>K z-7kB4Up^8{kH%?pUANd`Qc57+oEz9@V{Ro?<ShUer4c9E*NT#3B|$p-o@^}v+;YIJ zzbJ1Z0(pmq+vSW#dT5@{94K(gRcVWk2+Vl@zf5C=s#vW`Tiu3l2;N}W1Z_c(qU$55 z?QN#&J9h3~O#y&#H|qw*y7~?<)<)lip=y=MWQgLq%lNMKw|kQP?1-g>WoeG3sRM4$ zrhsROnjok@RpvgsJHw#^w#rjk!y<dJsF=87Y(#!#J~9GXc#7JKbrWh3<8`pK0Y{MV z#u82{X8^dKzSDBnqQVXJ6<b2AVdEi83-giN3_C;wgnO}C2f_1-sx-5dz#dVdbsi6_ zBtU;|O}b#s4}GO17O#g!4`E(6=<ZWaJ96;PC_CDJlGNtlguBNQdA}dxfTFA%O_Y7* zttlVE1UQbX5p*)jBODDeU~NL#@qQHA&UV)L4N#)3uEMV0+<llw7-xgc&nDneTJCjj zQUT)I`-VBtNF-QM$Q=N2x3(={#mnlzih@3%#=F+}+@{#TM}3cv-(}_`FW0Ij+`bTS z|KxvT+Gw%hiHE&^*hwHT8b$T>Xp0KWi8k-ew<f@xw9Eqthc-CmjZag2!_uDdhwsME zXnX2yIkAhH%Jzd>kPHBZ<Ca>1Z}faq_Iy{(r0z*dzB(zWM6tRSFDv<=S0+r%C_xIa zGu2-+#Fonq79R`<n7$)<t@LS<e8d2Rp*!dq#{04?VGyM>O9JkN2wR%6l1;w>&l}Y` z1;9^lD-~QKN-sKNkN(~BIQU~C6}I=7`tpEN7dcF<i_vnj(AloCAxF$CF5;(t3sV6m zOe(ak1guZSS%_e*15aX=DNvfJB@5Sp7l(IQIDshrM?fqJD~jN7UiA4+T<>||)eQ=- z^)ru*c9ENE+WR$6;@D*QXv#qBeYDl|l_Pq76$3=~=sTnOwdxn9oRwf+U<F4}Q?uDS zyQ}X3@9}ZAv|ypi)M862T&$%UdnU`B|I!uJ@)EEUE8~DDbpH&2FSU5}<)ypx<ADxo zc}WfyZ(SB8V*$yJB~wfnhg87pv?E`Fu~`xVC@9kC)gOaWTDR|yA$qTgs|sU*k`buF zcqu1yVg=Z@p&8=6=?9M_i)%_>Znool*gMp^3Ew-mrQszFjXL`s)glu|E$PUO5_+;M zY81z$1GTCXF^X~Hk<{1~_Oj8idIn#M@H!tI0L%L}Y3W}%E(wN>XA<h^!5c|SRX>du z<KxoEf{yA!x~M^Shg-5fi!a07$dmg8p3Ek}-o?91X%+P%F&Z5;WK#vdYGyqx0d6|( zKveS*eG6N=6xoiFSSocN@?*IEIQ{qb7w7&_e2d$swFMheTA_nf`A)a_6iTV~qu==# z1kbRLUKAM+>DPhPAJ+TBB9ZvcV;4o>#;}p9AG4&d?Xtqcn_yQux1#t8PpUj3_3kQ; z5<GBuE`)6AliK`xgN(DJ)8H=LfnrHLaWVpNv!np2jKQ%@4WNB&$ZbafBe2C(M%A-j z#A?B)snE;s@JW@Z*kMUZ1O`uoeB6f=G;HWsbR<wDH=W{Y_=;Z1ufY-EAj}F?7vSIr zw+BUWKwarM!M!6x2M`eUf;%?Owj4PcLt=9zN89n<e|S!%{c&5cAV~0~{PN3BMO+V7 z_%ysD#lA+!Kj1y`6fgsKEub`O(CZs3c5Glts|MIWRldei^t#BytiZo3AJH-GJg%c) zu_fW(8D$|2Jhwk(50Vr%`x@Io5;2+%-=@or1dJ#(ICL<Z7x>Uh+nil40JpQD9jev( z9wfMKw%h^z+fVe>2{@*GO4Qq8bid>hs{49~rJg5|H{lhaNX*tA<9%GU{_Xqrykzu~ z*YrH;R=^A->6c#?N*c@Z=XzwK1JXRgw;_!qn&_kV5Qi*#L!Jn;;_?`X&P51gn$z;g zmL8B($TX$pQPKOH#rrl;g7M=Zpdq$|gIq-}5ydo>`5eh9N`2^>X~x@(5G~Sv_ioBX z3AWFZvPKmTVuL9!h~hJNcYiKxZ62VBB6Zuq6mwIwqx~BfkiQQu&70#Q#l}kwT1L5$ z%ZjGvselmeP-|q0BV5Aq5gdfWvhhS@h&&Y#oK0~6C;A8u)`A+<gW+)5_*~1h#U<j< zt5+Qx4J*m_pRLa~;;lRLe`}h1)-f)dDAwG1F>W68rdw>b$D^uS%xK-z<*`=thvOHe zi}xN+&b3}Fn`<7@Ha9=ZE-&>sZO_VPUYl<A|6VO|FI&2p_4(t;bi10KX2<)b*NLtz zunN-A*#y4%n>7giHxmY8Wfqy`j@soN9&VGl_phoYynh%*x=-fXJ?&nukTA?lsy0ol z{8lXCddo1aPQtY!_(Qhn9P5M0481ub_sI;DK~PnVqt=LFu&Hrlsl}iAxydoZ$+5ZV z_6mcV4%xYBeq*sWI%`W7lZARui#_Mw*Yr4Ap0-u~S*&<4SBu>fux|LlwDFCO<=37U zt8*XBn|aOuIJnYKSL}~25Zy8+9$z3DZ@UO|r7_(5(B`63+Tj*7_iFF<8=b~CCKBa3 zV&yB2{=H}G6%Us7Y8hQ54Vy>6p1rR$F1Vj7_T^`ZE0Q3F;T8NAVsA|TIP8~MoidK@ zl^X}u)CWXXxG=eHZ|zkXG?wc88IbTEH`GixCG>wfHj=G4N4jg$Sa$J}YyO~o>RG+Z zLqnEoQ~iqT8E~+kA>UjT-$JkFX;)6gjk0X%rHZSv4(YjGucyHk!Jo3F4IhphG;&)9 z%K&xN=30oAbujW6lggS0Kc364FxRSC(l5WCTN!P6MYw<(TL^ZU%vL)6f}FejWw18v zJ(;icv=}K7I6hZkRuOHvR;yQmD`8muYL@7h0jqntRX)(eeZSIc`^ukX6{hKX*W!jh zhxNqxtmTU|=dcXditguq-^=ePchNWW7S~@ZWjXJk<8Ke%;#ojde3k0)EjH+Rddg?{ zL6!f~YfWFu@Ij@^%Z1M;y*;?B=k11zl^=|2TcfNqJFXKduYYtrMj9}0Kdr7HIhN7O zsTlmd{L%GsO^(r;(7yKZ#U#>TZM&4k9cnn*?mskV{WR|`Medu6Da|X*g}j|p9Np9W zQMDHyr@n^4_YMEFmwR`Y2h8jX5$QiITCj8}-Me@D=|XpT$J;AT>kdcL*F8A1^1I0g z&4$JS&$qe_-&Z_terg@CHtAY1bz;yuQ6bj-RYJn>QNRnZ^KrnM49k<Ug~^7!hYwGQ zYrpCQZ;czAzFDZBG6>pxU1Ky?&cbp&HD|dG|7Jn@e)eTe#~f=ryV2ENxkrX!Z-+%> z@9*>NFCTv$T;2U0{NE44t;Xecq=D~%LvQ@Y$KJgie0;!j72fCvE1Hc~JiueiSJd~W z_b>E#2;V#jku?3*qQ1;A{sM9{(S3j`noiF*xAp`3O|v9M>~-RK;fyK71p6bY**T$S z8{OjkxBcFYw^<k;yB&5<s&N`uD-!<15TxVIR5$Z`@p?|3a9P~fq^M<JLhsh@&*ELb z=ZL4ap7|26A3{Sq6LB+}@9;92GBr&Ve`d;k$?dA15Hw1}{bWBv9%@JIv}$IS`D*tM zL*m%e8x29O<mT0>YaY-$_U*DI7aLEKx;AVG_&t*dOAIM^9~AhVX%^o5N}AhgZbvly zHSNiB8KW0R-!QcvVoE)ox^K3pox$Z4+(l&h+1eOaBmKrUz3`*HxQ6{o%j<+Uc%7@5 zh88*glJv=qx@>Z>F2@k_U8Tt-7{AG&9`9&1mEc}Y;aviGgCYqTri@p**ShJEYB_Sj z1xd2KE`m}mc(<zF_>DfE@l$$9<oY}5I!ZRbjjcN4=BwMeTRf4s<ME`8sx}A%k~`wv z8M<e#$!^>#kKAh?Ae5;~V+n>lLm5=5XX7$1Ah<BFT2fBs7_}RWkJ_FU>-XF28P6T# zUfb>&zvN%VkT0a!zWUgCQnvhXgX=1C(f4~qnW}th%B^%FJ?@7O_9Ex&oE|Y9t2*K9 zC2h~k&$~^+)$@aC8U_P|*HIDXY^f4*Q6$2@t@^`Si&Cb)FU@{n*tr><@M)i!V%-43 zU2@$Y{o~1FTa1C*t9^frTl~~%?k@*wM4ZgcJ}3K-=RRv}v16+gE#y=%;7j7;`kd28 zLyzd|AQ3B0e5#~%iN<pRx%7=JzHBIb&{k9GPL@l5I2-w)Q>=wxUU#H}on3*7(i)-J zY3zvL{n}S@Q9aCI(VMs@Jht}czG?$4of%r(jix(%iM?qun>Bp#TMm9TEV_y1!ESsk zxi5PCe16o7UUyQ~!`{-MzJKF5xQ)MaSC(&k={UgeSpKD{E_nsc&w*tf=N18D%6x3E z=CiboFXz?Uq+!4GYD$@JC$2Vq{uuvez-y@kyvWIUAnD)^_kn%#B!%RDeSC!F$)dx6 z5LV0f2+z&QC`J)^+~={kP>mP0`G0U+9;KQS61E;*ZPwJ*;dBrV6Sqjq9WmoHpDgv6 znz|lQ)l~77J$oMQR;U#DJ5nsE*R3y7I`#>E#SjbQA1I9Np3WsjO(bnJ=Z^t-76j$n zP0WM^?fM0W;OeV+YBP<|vZWu?U*Htye9XNkFa54a|9b}G^}zf+6(Eq>5dsM5|GeVb z+sEI{;qUxC%$rR8q@Mc0Ix+)qEg*G>cI@4Jjp0Ic$7FzGK!=OtG#iG2SGLA>Dr#!) zPIa}GaACZ50G=h6`Qh>&z00~fb}t5Y$oF3mj*vekhrTznLe$y<rB;K9`u==n?U570 z>mABDwCfHCx_z<s-Gi)ld*7-4;`hbZ>4H1Y#o8I&o^9T`k-2XOau)mof0BY1;Rx5Z zbXsQ~`PSVHY7RP;3J&^Nw<6!&(feVF_2a1LW#_4W*K%-H)$Qa>k3aj{$5-}k=jZ3U zIp-Hge5-<v@t^H}?stnZ;XW&yaPzBa&`uqed(oPI_wGpL+UD=e2VJYyPr8@y2;{fy zRCa&2ICSWa&6nKw?^^p>_Pb5a>YJ!Vl~5+Ve<Y#2(00zLZ{ER+)&i8Xa<t~*Lsnwa zKLHk2!W-{}HY|j`O9h`^?aT#GPGtnHeN%%jS|11*1~=vR#;1MvZ(k|x^?0$G`$GQ8 z_t$jvsY@$!S66^Zm2d60SD#o{4@o0d&h3tz@1|cFveE`(eCRfHr`_ct-MyPtFtq9W z)3FmD!8+C2nKSr7=+)KR%kZ4vEq_ijJ<l(uo(M&+dl2GfZtfkQ+jL!QPqRK&S!c>V z6u!C;T77<eG`WeoeDC({SjKPsPsa6*19`Re`q$<LQ{m}%sh;hL4~zXSBxS7je<fd; z6bziN3nvu_8NJomdatonopKqbdv>S&=S=cwWWyhE?H4A~!AZr*omY6Z-=dz4h6i6? zk51ZkF9}C2JbS;pyD|Ff$<Z1|+(#e7{6C(6ZTuMgJjOV9edO)wuYx;FOcy@G=NHn= zEtCnQNe!#2-+ED>%6$9}?pj8czr0S#uhaSy5XiaXd2#$vCi_!p?(ATHuuMGD+FIs) z|CmAXBqG)3uu>OnY1DqI(B`=HKw58vaB!@`HHH1Trq-6QD0T0Uhx}cc4~M&7o3<0e zXy@{EJ+qg^ZrsreRPDd%GR^C!a7d36zL2k52R{9U<872LN=n*GJ9X3^wDI1qHNh2Y zMjbkvH*mc%>Ph)xJ>ns0_{q9?ir$mR<mpD{4?1dI_paJ{&#Uh@k>7X8Lrz%p=X zXD+O+cUtgn%jvtdWc(YWbZf5yzTRKS6P_%0t1@-F=%2^+9=zH4V=Mp5Pm6u;@K#wA zD@_5bZ+J3kbfGD~0IzPq+G((f+p|+zVZ{Bl;dVE=^j{9=!@;a-@jIi9E>aEfzL!*+ zv+>`tRZ4I-5MjdJK}kn=VG9r4QDWEis8i{YyYTiN^WY$_68~1=r1Ol0tS;XVHJSSl zespb-klO#a(G#<ggXvFhT{BJ1HL^vWOHdGg`}n-a>(h~btknG!4ssm=y%J7-#SEXA zo5<AoW^Bc+!b|<%6Lx`9k2SW}*0-{ovAi|K`*O^G@A`LFKGb3!yLEjzCuHUR38O&V z80wB%{e~}@(RoA;o>Rsk2;1_A#8&+HQ~3q^kK1Zt0_~k#iYcpysch<#L1~<S^gKUo zrM%kc8Dm#j3QD_|(QsLM#t_M-USq<JuSeM>ja^Q#zPwKt#&*78DXeVyeLLkfx1aa_ z-o-Rr9kwyauA&Hbyb|#9M(WXYNyET7OkuOwk4Y3=!fr>iN%ZI3OUd4-eyMsys7w2g z{jCe?=yTcpyw!El=kgJ*Gd28Q=T5S#Klr{)#>LvTANl5=N31;NLZ406C0)Xc-j|N^ zn8fryul(<`OVBk>C0##Nn*HYy%;FU2v+>uN^!}bb4(cuN?|T2|*?(0shW9Oieeb`H zh+$%U7t}K0*Virow8Y66>(2|5rK|2yf@><CBW|lnX<t3{8*<YrY`R{Lk6QOnr?Gkx z*F0jwJ>$(#8S$sKIg_=KuE~`xH~$<RZgl=?SQBdf)XjE%ee<|YCtzui()aT2>eWU1 z*Sv?V(yXO9EZ28r+^`@15um;;B|qWQNP8jDVA@vjmDPABS*>S>>24dz&TmBUa#V1D zUd4&Vn@nTdhWOh&%tExg_d=7NoqsOdInikT?%&#De@DEzV9L$^eDvofsr5U&Q<5E4 z9)=)-WX`4F>%#!b;hb<u-~F;<o%cMaNgY{by7s|mo56UWf1h1^HL3j;&B$64D6X4( zz@=SK{jBq}cnC)_no0Bb?_rnDXB*#2YQNKN@~_eoLCt#-GbcVo=P=^*mL%(GnT*I~ z)egOTbeNtW^!DyC=Fg@6)ejeozkh$2Kz@twwfucl_v^)~1vYBHQ2fH9`}{EJk@M_j zpsL%Z@m|We$D<Y!;lOR>&53zdwT9X^6Q>S4cCM5;`99nzJB@FqG>P(MWMl4~ys+*r z`AHiX&1x?HyLxT;!*caiX7nlaPCAXG*5<VV2XmBxv63|P&DjlzYM_}qv(?VgnV%1B z@KT}>-d$!Z?vItcty>YEv<_Z&eww$X`F`W%-;kDbC`@3YiZ4|g`$2DF`KHjsEf|-V zW+fjIr$QCaOXJSmv$p)rv;GTB+%RkArk#XTMgpfn+#4!gzE^tUoqDTxlpm!{Wj<+Z zuXpnL#hR=V{p}srm>r_$?wm%jQ1JInPmw^qfP;XK-OG06)nU!vams6M3QPV%D?e&I z?{w9lpRVOhe*Cq*J{XuS+{;?LwE2hC;`>3?y2uq@AocN;N<#CVjB%_EZ6tw$ITa>` zd+4()x#!<WzLN-c4OVV3llYBF$nNwrR-WGPr~Yh$OWUC%sxy0f7>OyEUp4qmp!&C1 zMFvKenZhd?!*Jq0Q;6tnpd%~0DyzrCLO}!fQ#bOE789B0Gc+?af=$D<C4xeT7Oj;+ z!RYdD_s&}{6D~h}Y@IMrrCs;>6@OJ-|68~%HjyIjB@NMnlGR2Atbg*2_Xlh1ClDgX z$bJYl5$_#u!*RY$l7g0(69XYc7oS@a1XSkrZ1QUtxeBZvxJ{YO<2>?;q#+XebDb%Z zcJ!k69d=aR=(<a&lJGXMI0T5zAeFik+Z$ypmKn%Qh~DF`7Ox4!Z4mt-xCts)d0M&r zw?1i4wRVXd9QXvnEYm}Iv2<~lMR4@!rD_DQg3!NT26*pO+(-}2peJ%D#Bk89(Kc~X z&$YI?ditVgakH|abA(2D-JbX|z$m)K{2hN!=wXvajs;&rK+iq1>HxV{>u+CYm}*vH z_hAAVh~i5L87_eckbIlF+byj7{pw<^jArf`<of4VW?3(n7sqzZWDbw5s%VP$CgbPy zX1o32YDsaog^k8A81<>7>Mb5v)QsyCZQkB`M<0@h7@g|){krj`IWJXIS9vgrDrXr& z{`Yo;q2TiF4<E%l3P9YlFk_!<Nh3!$a{6=5<*W{|&D0=absiI&ih0ZXx5!16oTFmc z;LG=wljw-ZGnI$geKa5(<EbtJmfo2{efWLqmxYCD)b0g+__9nGi4Y)*63+|C3(1+C zhUimg@Vh6lXVlLVmz+y`Ud6)I#ht>2_W84!=*2lWG>8&)xG)lVH7o0VCM`P@I2AY# zi^Et9o38G0o_k`8V*;^T_#UbnqS{mlCnrcOycuy{{G+74_1htJE(USMkEhfRl86|{ z;apLwys06o>96NZI<|!@!R6s+x{ArSmamK8&!sRKFo4v%{z6~DY$oQO5~ova5k;ck z<gBr{C`BypgA~6Yl{C(9Rb{T&BJwz{LUIRZiHw?dO<E^xr;;Fpnc}#XU?(otq!3V* z5Y+>QJ2Ut*F*M>ILHm}6-Y9dv5Cb(yP=2LI$z^5zb_-cZPOf3+6v08@q-<)I_}caB zI~-60XIAQyH?Iy^!E0+d(Hbfw?~Eb^ZG453=*J~a0ZHUl=2ZOuThcE>C+x?T4sbH! z>W?Qah|loiSCeipnbMD;qBfUgd1_GWk<IN9xv|Y)x$P&UMjA8|C$}0;c7EWolHfJ+ zydJILS+9&QUFx95Z5*)SeNW759%x{>q+jYSaQfTqdAmwO<!M|{=Vy%St+bq7@0{YY zA>A-VpCm=35QY0v?ZB||o$l8Xn5kGm?7{5f;(5a*{RLWuu~)aU+8tc%S{4<<B|+?6 z$%S#~G?m~-<TG*OmFWS`0tuFyQOaFnKRi{ekD|`F3UZ}Wt#~nIUt36#@0VpTw&2r| zq5f{i0X8f^@;SEYz3o^I)^rp6ZwOv8xL!|iYCJgpa7&|4F58=v1*?7PB^{Rsm5MjF zDAFrpzr0UQgh3=3W3gE6GrvgkldQ7eEu<)Px!eCN7vX8g;uCC?;Q!+g?{3#Zq`xv( zxiie-CP9{(x5tou;YuR=kpR64c^X|CqIhu<s~F=r3yNjKqQA4kh|+(tg17DLo(DNb z?hN$FwfM`6kOFx~eyk-eN-AT@KOz@t6t~Q>OaU(`<@0{YWy3PrPM#bJ9qLO?&FU5% znqb1&4t*QquZ6%6NiIJ=B;MxhJ;XY0YS9ky-}1J#VOi;7$-)Ct7UI9k&a<s(>@l3B zHprOKE-di&4g+c=>&M*>CgR6a86rt(2QQL7I@?H!Fk~fah(Q`fpZ0XyO8WVGT~1)e zMCC4qAs4r|*q~@p;Sl@C1$Dx$$wFdx#1M@}-s~_6N7Cu9?pz|)X?|)@MZZlqUByEb zvq41|ViNeoAaHbP?9j|kxfm_i2~6dGmiNhkoW5%tHxKzXc6H>(hm(={4GCZ)t41Kc zaQ^$W3>8h8#=&_7!oF|BzZwYPo6|)Js?f*KbQPtV@8Xl=<8EiO)<dQs77G{OL-#}W zn>J)xDHe*><d!Fk*PhdQrV!^%^nVu+XOLo%%K!aJp&2(RdYPGtv>(DmS`Yr1rcs+K z)mJ3ma>;3*q&NIrq*<yP%ZWxQ;anp}ys3Rh;*aFyaG{kF@>2Pcs#v2~qiNPuZ|3`s zbUMR7vD1ZoVy6lD6#5Av{k*gJgKg4|x0jrpMrGEgw`L3Do^oJvGbM8nFg^4h8MH6d z((f>Z#&K{{jQ5-|T^`wpd&=oMLXx6gh?z*&AxU`0##w*ck_6h)f7Ex><k=OH_R0TW zmAYO3&q|H6vERLKcQ!91>`lc)3hE~2fV<&`uG<FjhM!1q<T*Lv2GNFJH7P4-=R?9# zMo>9criX%~?`OutE(h$=NhWWhKFYqp`4BrGrQIOg5LbpV-tQFR#XSkpA$d(($kc_Q zL$X~fa@P(c7elA!bQ5bFW868^i&C4H7BXHQ>Ge_`<xt2p8aZ5OF&v5US-ed6^%?J` z?B8K9_ACsgs~}BBtTUBP4;e2y!AuXo4H@tMO}(uq5F!Q{Z@%+fL0UmtP{+dz=ku53 z_6vEoC%12tXuoNW@1?p>)NX$)vK)cWuF{c(BG$~I5>4W}6&)v0?xi3tu@io}-9GGa zY<iJ4=&+QgAZ05u^FZIR?^TZDe9euWoXR;q(XgT%t<S5W>Q9J>+E=`}MGT;rdx=(R zj%7UX_o=NC{T!WLh1Ir?0~QEFUcMg0tHZ2&hf#I*R_Lk`YV&kWMG~`9Z=fbAN2%#O zKe;G{`NtDV0di?*;8Av=iI2vHNg|D`8`fHjK;rh36j)9g&BJ>IrgX$|6D9N^k3t_A zs>J_%T=RAynY&RsxJmt?p<+)3ZmGO3aL6LyUx|=zRVr2-ZruDUQj99JEQ#Pym@qyG zlfbiiz;5F0C2CG-QXC6MW&$^Od=t3AI&R<wt8}?As+x74ekS&raH6;!$Km@e)J+h# z4!0Pi3IW9mkqBuX5B&ZMcQE?>k@!Xu&2IT#A48zc1?BL4(Ocl3;tk5-8`2P0h^ycQ zSsw$CY+`-3P>E>Ds&<I$jsEPM<fVW<2H>H3lqtFLg@K0(kpP3(CXs`{raH2M|1lWE z)969$IQR1KR!Et!t$2t87{qnBbw<>Jce;92<9FR8kMDhTg6CI|RMq4Cv(4bZ|8BFl zbU%ZYeJMqi|73_nHeKxVSZ;MW>sMoN3|EfSp*{u`ias+!L*sP?deu*A8mRT(TMkK> zRsBv7*HRS3hS;Y12g~zg-Y+NuwPVp|O<A{ssM6&{u3}%+s40SHs<`9)sHkivwOBDt zuz)n$-r%a+23lrCYxy__!xgyoa|+<rdz8~SvF3qW50!}H3TdXPsObvzpnpI$@+5Vw zO-GK{hFBHLM9di%t-DC4CqyLcZox5ETV=Hri1Q2R9ZQ1z(&r>?gl(1XnHX!BKpMcM zIzD^9tA_Y!vafYGJ~Z2<0eby$59pN`=ygUA=+!5lgTSXU@*U6PLUWx|<tKCx5Y0L* zN|<Y5ZxvdBY5zj=#faT3H*C<4!OyLO`b~*>XivgJ<FGQm0xWP1mlX$vR<xjlGY=d? zp9$73!rOP#+UKb(;>mL}ok<Ei7M@+HMCxT<OvJ&&PmQTR>2@u=eplA9zrK^F)V1>a z0rLwBNEse9^@JzW<<Y|qqs{fhH{xu<gZoq&LZi2>#~%)yMC)hTkNi9t7onme5T6wl z$2Lecl^%^u?W}~+#0^Mb_&8+9(|O`-J1sDoFuP0^6<=fIH2D0o(YMhzTbymne_-ir zov2WbmL{EBzMWrC?{yj%AN~qN7M#VOyfmmk^^Z3h@cTN-=@E2>Fj^|qBI76H|71M9 z`?eVd&90Xf4KaJV#?5A|nvGql+^yj=tIB4QLBfhnh^<N3pFK-iwT~4+LPi55Lp9>% zW7L7n!U_A6VqUvmzMQ%0wWlF<H!iwf3)NF{v&%Bu?^5DVxH(|jV%XC61|-Eh+&PK1 z+O@+N*lT(aQkNi3U=$mW_T^1tNSy%l9dwa25fZQ21ZeRIfoO6LjJGOGi3jG~ERM;$ zQ+M&oo|fibLF?>IhT%c_OXd#(L729PYArSaHUZFpC-qv78WGbk{$vwI%st70*wQ;w zR8gFAztv^Lur-x=jy{YTe}a`FpYuea4lUvoRnKcTiTZyOb2&a9u#;fJ>$m%IOw)n7 zTH^ZAc1jTD&;nHi$0b<Hmt_tSV+q6VlGn7DLhv*EB{BM;@3>5E?mc)_EQ#3<dVtM@ z&BP3UKBj?S0&f5l$h(-j-!~$tBcJ5f{cQh*C{{3eeSzxgc4m2CUtnIKVB*M62^u-^ zYtB2M2n7cC+K%>N2V?*`&8=Yaf0VC)Rz6x8gacl@`23LnDY|A!k=*vCE|cnk{OVE( zCVr&>S}};pG?5P?wHE(XyqUl!=Z$*8eh7Z$CrONf|ETu>sJDWNf{7VfhIwRNSU-CW z*R*CG|ILHAxu_RV160EorHDlu%LM%WSDNJZ)~~$Y2qfH6(+IJ_Z5BwOK(0cib8c$| z|9TWC_5FxF;fxb;F~1W~6}$d%^jzR-?DdPKv>V@b=hh}}nK*WEFjvuq$Z;U;)7z}F zuGQ&3cxX0mm_0fzxjD!neQP2R*JQs+dUinQ4M82UY7>iw9y>mT`+j*AcB9;#tfy;f z5||5m1I>%X`!CZ30RTc|#;}oh+~iP8cpR(wibAM^tCQY%?)fCi2=uCaBA+U6_{G4B zx7g~LLF2OzIu9&mH!Qi<KaVI<U8HWeuFU5SRq|)QOZRV9?C!9mI9w%+!#u}4Po)D` z|8d0gQ(gzIdf|fc9;Q0s$OHZlyDwzs2YQ_BxS%50Y){SrDjDnn=Br*fu0*I#`0Vdh z6RRITnS4;TKa}_?=IYfSfuZ*N<;Q1W1m)OTOV%*g2~%8Vb9;Qz=9+xmS}na~Y%Kno z@7N_g=;<)m@)9i-&Kb_xO;L1U!*;o+GOliCjqx(5-NyRHQf7`flJr}1oiH%iL<!vL zxk139)d>TOb`Z}|PIwS6Z`~MPucda7T7Ca-5KOrMyTrBmkV!o578SJA=G)f;-a}fD zY#HrMke>a)!`!=}w#Mnc{`MU1<zAddQ=>5NjRV31O}k&duDyz9bMfi$p`H<gv(KSH zd@yS(mXV&f|F5=pH%)jZvfdO8tW3?6zH#Od{vVCLfhmme`<KoS{;l)=9<<I6fX**5 zFaM?Ul%P`%pz~USmqF)$8(oX@)X>V1qqm}~MhaQcRYlbLv8|4-w4%+E_D%ZZ7Y6CO zQI-P_UZDf(uZ16-Lv&hr8|m>K`t>lpIYfDQ@VP(nO)mT9WKfElR?tb%KV*cA=|#Hk zs9e1#{7#0JRB4R7RHvEr`{9@~Y?0!;GfLsNYHz_A4XuoGaSg4EqHv#Bm?YpDTF{9j zVIfc4xh%2i(6N@p80u;E3k>20O+=yMzr+Q~GQ&1gcy@xxfDI%9rmav$#Xv<==`{08 zDLf>E4qyFVtDRw1q>xHNN6dJU5?uw8YgWQ@LRh#GHR4tsx6JcrgH*XEJfl<%JeILa z0e03$3A=FyF^)3Lb_y=z8pOjYG>)?46P3MF)3h?HQ{N0mVl7}u;kC?_Zxu%ShNxc+ zyW5_UmF?$+v2x0y?_af%VaaA~DG9C`WR&---M$S!ux5VDv2#~%@9E^$JK7_ccB|-* z8H(ihb2PsX%Nq8CK^$Nq@3t-VZktkT<E0P*aRWGU)puyry|(k0szO@@nTO@EdvoCD z?7p^-sYAZ+pOSyRwY%r;Ejg0!vK`uQdO*tyyB0raZB#+*6?!bplhoBnR=H+Wp3oe` zt&L79b~?7h=MI!9S6@ywOb&If`E+eVYGce76Z|@Ng}Lupk&|L=<7_wkp-16h)<Th; z6<(IH;I`m5v09qrcUwpsD=^}-GC9U*P?aU2-IM2ZffY60X+`b2RP{NOF#pe|voGwe z8ef)^9Q(Q-LXKSqyByo^Pm2nl-ti#WmY7JaD&;W~tyRu&=iWXn{Unj-@9beK29mv5 z$^OnPxF|xD>(Tea`4`cmwVK0SLL#+hsEMyx)hz$G`2O^0jegj^+d++xI`^^u<Vj)P zP2l}f$K3SE4z`;W5qlz!LF+|oB~j?sGac)F`?PIi)wqgu33x?)d>^*tXt(YmWA#2O zbDKuee%<3D{v0H2`?~tNXh=VJ96qBv4lqFNV;olucO7hh-xC!Ebjmh0pi}($Qr-Hy z6gO^CCPP0YeYQU+cSM$;ryW)Wn06@FaOj-vdQCO6jg@=Wf`IX^^!DrZ(aC<G2l(8H zGXM5VB+z^p(0r+=@T8#INY~m4?J-CWhWLm23$mbjPLb`?@~j2CZNqr~tKUHi?>qgS zy<j4>F<hc3O*o8jn|hbk)%#+&1-5-yZ_C89l=pi0y~0y>-BOtf*K<9Lp*h?q=BEky zV&;1fmY5t}{pEIVy?TjEnN)7d``%a@D=<mu#@&$TNqUSSFj)k#!La%FWkZPHKqMg{ zhJ-fZQ4j&p;1JMYTpQ3}j5@K=pHVk!TRWy&Wp`;;Qd?0Xu^&Y`xJy6+$%GSvRym~V zvnCG2h%v-{PAq`Lru?>pH^@3Fse~AD+>@m2^BtJZ#;p?<uA>J@c@$oqcr<1RIQ3tn z4dQD7sk<xC(n%S@O#DJ>mQ<m}>|o@iSzuD^_k245NXw5|4xe?soC1N{GychZ9|!sM zI={d}LMbszxV9z>fvVxu8@lpN;0t9Gs7-x_f1USGxoWH4>?_!$)TS9=%>1QjL%(XT zrzw}v+P!>Z{nu^}etLKF*HTZMl!uSU=5!5<D^v~L!HhFJjVP|@`RdG2)TbJ1*<AFh z0-CVO8*9HEb%Sc@jE^$11taoNavUkuGBMTiZStYI3#`{INAH8kucPRPCF9(^qmu0y zhg&l20`K2yVWwK)ZK>QFd|q(0av`F9M*Z=W)MJ0}K$mJol9zJ01!MS8@;E8gN+R`2 zQs^mOocpJ;OAZS+WAF%}`${e?x;(0tNV`BeF6tE_blULLwr9n)^bXNSsqvnd&3+7V z?&j&Sb}Jzt8`VDJ#T|~sxi9oxU=5>d1b3zQTNUy_wfaOmbIp2r4(b&r#bmpj*{?E< z$I`LfN2jlapB~oey5&@BQLW%o70BPZtK)Xt$Sn|eo|U&HvEXaGMWq$G4T*Gj(3dxh zbB{J~D<&6-bJwGNrxo;N$Tl^ou&siSFAjXO{J-n*;s4ZQA_lFJ|6Py6)HrwXAm#c8 zds5HLS-Eu&)DA9E=AMuYw=9h-*SjkmEfxR38uqmx_O-FO3bk7SorP@PPy&ruiP<b( zRIRUmy?9m;=iWtHZDJn3s%yfW%PX(c9BW$D63=_B-I!bI8R0g4mNWZ#_+$R-(w~H# z9Hexp8{rt0bRqQXajoYyHSdVbq%YoREzHen8NIV(l=&)}Js8&U)!Ri^Z=pGo`UV)9 z4u^kj5k`hJLEVh{Lx~By+xOoqG%91q9tm`CkqII~X2!Ok7n;#95W^-Q2H_3#FwIdC zlK1?N;JRTRrgd71t#$Vm+Z5Uk82--d%^Ok#w7#z8To&hFBbM=LAEXd%zEa2BOeMh2 zJBT3|a434K&_<*n$(yIx<}*9hG+Q+1TUoj=#b#mPZu`>iWteBE=aSf8;$=W$o6Ew9 zzB1MGvw4^cr-is8Gy-6&2u*G_p9W$<{7k^zY(gPRg+92O?{sC~>qQ#{GUZswhI{HZ zM;gW%-Wb3caG3tvJc5OYG|!@kjrRv$ejBVz^n8mwMkW-;MJ9x9-ug6~1!!Kx1OyiT zjy^(D?NCdT+00$QBjAu|KxK}`h|h=*pB6t;ez4X2l9}5=Uwa^O`^zl?<DT<o$pIBg zu6u2~sS0f{OeG%1ns853Cvh?%tQ6w=kI00Wo5cj5I#v3XCQ?L9ggM+8i2PTr7SOeN zMz8=wYP4aJ2}MTme|TcWxcQ18mED3$gUtepp-7goMeIYUnaX>{DJehzRa0!U0p$W% z4qElP+PCyIiTm7ClWv$Nx)0j^yAK!)$%VR}YZA|Qh@(EYAHV4+wQ#kr=}gX!4|~>} z#nb#zwb1rA_Z&HcxS(Af)b&xHox|MgR~Yew0*g;^=NyMApr*Z5$DFFuIN_YCcdrta ztfp)fEPe0d4uPeEev&>QXmrXf_3~h&L)H;Hq0sYLf=f!@6T>B;id*|B%M+M9ym55d z76!>;7<^7DH{69BZE##4L8>5CIwrenbsIO+-U`@#oyIbQ0I9S6r9h}aXf_iz5lh2V zh!g2lG(+Z96)7<@^v2E8lux}YqzH+TuS4}T+v_;$Hz}kTBgEE40rIiV7gvEvf$3E9 z&&hnXr%b+M0l5FeH;7wQo|+9C$k4A%tO!Vi69zjA4}O0!gV|-t!=@0jY`T|0Wc)a> z3-VOb5carN+WH>rDSt2`#34#r#P|^Q`6&oEx#Yzzt0HnWF>E)NKxq~AcE23Lj+PNp zR<Ku@5dTP85r5g))xGRWl@PxuR(DCLRxibG?H(M9>=o~x_~&inb5;d)EViN95D1yw zArV9gqO_NJO&)>D^%Q3nQ;f-!4*0(+iot`gxZqH2nR)uRo|bdsbN?S|Ig3yuzkJG8 z6?O8jIvNrEyN>kUVPxVvbIZBL)5W6VqPKD$J1-MF{D0K2{IS0jtM>V2#;3P*A!H$B z{86N2m}IYTBD5+L@bjY;NsVzNG!Ip1F9n3+di4WMLsC>5-^WXMc)kA=cIVJY`(1&B zN4ETKHp1$psOH9jOy8H>eh3Q@?@*w@G=^MZHNU5l{(Bs42#`9!sN{-N4-q)+SJYSU zA3nppCwO_w$qp9y)Qd3Hjb%(wEkSSQCWeK0_F4n6k2!&wNBWTHv8zNMAssPf5JeBM zf!I*J!eKyS+VSQHvEc%VBGxZdNC<MzxHgp^Qou5;CWf6V5P?o7mXlB<0<>F<A{;yB ztx{CZ?HPA@CZ5YUsTIDuieNT2+yva1x7S1vQHbb`w;yNm9lnstOAdKLM7K%_V{9kC z9|{#?fPGC03FJIO3dhFPlh*$#dGhu@OV%l6Awheu_th0YS^rV+$=9hRx9x`$VOamF z@6jOM5M*cuQ<O<NCY09D$$hl~&kjBIbIS?r{#SKh9T(Nswmo!9BPrcADBWGs-7$o8 zOE=OfC4z*cfJjIvU4xQJr?d(P0ullWe0$`aqi}rQ_j#Y+_s4Vg{TrQOxbAiBd);&I zwXd~i@pkpKIA#o;cpTBqx#p0Ystk0)bU9#66P*Q7aZF+?oPtvl5CjAv$cJ+AD@BA{ zuW7LL2_|+MMe44yKJt7p984TcY(N#!kH+=ZL)(5-TLdSJLDp*YwleU)95Mu$gM-v2 zEq%aBEsf0PSDLEKymK&z&>cJs;+n~Y1Ng}TTGf0s*DNJ^-{1HO1AHS&4akZ&LWqIn zBGa)8CFT~mi4#VHhEouZ$>*Fm>&qVv5nJAVfD#2)0JJ2AAdV>>Ct1sn6uHa2GlfG7 z>P`Z>ErO@3p(zgeA`0JGqL#4d!?SWjI8zrfblf|7i?}^0c=jd5V~ljQ0tGYzG<=|Q zAF+xG(N<TBr$`ysRXK85?BNAoQlue2Gxxq(CiQ^CIGU~7Y9n&v8{(v~4hd1nAks3V zWmu*t&Mq8=Y$8_Q)9C;ZfMqKy+0X5wr`2hUwnnNchxUnseFL6HBwYTw93tBBH z2VJ;LJ8B@6Ep&L_&{nnKl7!_$CS(v60#<_vaFxoH>Z&m$5~L88Hxqn<GP;&sQSDW) z$TaA#KRrLCSe|h5sn6Zo7iFkb!?M?;hz6rW#nTdtHog7{R~<Skc!KHZS#&>&zi!`r zqXsMJo#-nE$28E9gS$jlr67EgV`wS(E-Dqq4=X2loxm(U0hgqWYKdX|;gv5cyLtj* z4ZR}X8x8qTEeYfLx1$&(o$KCxf#k8{ZNegTU)OY7M2j#;gqBjQg7uo-#WR-%->;sB z%i1!w3?4)`b4O61Ub`jPB2b5ucX#w{rqQ)f2p?R2h9Dvo`G@H!Rx=XBY=uHt3#XjU z=7ol(s-xZLn0VEby=Nrx3S%J8!*6Kry(B{#6}ZLYbxW?Y<S++PK3U>XYQZ>O69=(x zXyW1_V&a_;VybV6#UwC<gE~<$BSK}L@Rbn3L!B}qDg6>^n+)Ovnvr=^7pBO3m?~K< zqUI1zFx$W2x3KnjN?HJqAd5*s*pV7dL#BFKGO_gdhcbMN=j+Y?FKx0gAKC<2$e$<R zTYPJuLg%Vq!0BP=yWc(~t+4Eap^(H9H%R0=Fjz7q95Yq9wRcM{q?%_#vvHyt-(EkW zx^DJe1`P%=*(VC(*?Ae{xC)R3UlIYl1?^atCI*}ZUwn1%dn&LeK3z<yl$pbY)e-wi zcTB;7>m}nTR-Icj=b0r_X+x@`le_nblBu+bv)K1DvKW{A`3DctIddYsVr(W#JSr?0 zCu%S)U{RGJ0s~P6!=g%T2-gFPYR^Sfdz?rufT)^nGROl_ZJ)X@JFa@o@anJ*37+0P zyzd5RZSzoI^U*mGubWyXvYJpPSE&!3gCpA0cRyi`<|a>P);aVZi}hQ-dYO|0RRYTS zVJ=Y4zxj1RJ}+F?v1_Es7Ue(*->}bJVn()z+bF*I)X-U$h_pr%4QoD^&;`3(yCPk5 zsx*v2Lj?!@b|ki>InHCSKRUPU;uo&aPo539E+L&;P8)63l`YTSi7#6FMs`tBcG__I zZe-~Yq6I4GX}^>GQRi<<2E%_#EhQt;d#(k-kq31=^m$$_^}POF@%ww|=`6Az<4sug ztF#toY{QCthm)c30>BazDikUdk=GpsG$<&qC8*t8++>D5o<>WkA>M^ktoms0xlXUA z_p!v+Q14Z5Yi;XUhogD62)d#<ASOK~02DMc47~b`p9-3QtS<Ms&0$`ehX<5qW>`*_ zU|h);iyyMS11ATP+i%CsMVB*b#|?KWY{qSZ@Jr&3A@O(SR8Ax1n2F@(+7;(u!!83E zwcezQQS5yV$O%&~JVA2uE|$W%D#k<fYIcE5j)Q1&jrpar&rvE|3R#JUuK}-~SdZAZ z;{vhchv&~nNkG)%UxrIyx<~u|G=Q)RHztpx9T(68Id%x@=-vn?-<M7~%KSQ3M~6br zW%zKg9hYqK+9E1i0%FJmC1HiVSx0*n{t-fDo=g#&a9ZQ)C{N&(3{Q#)LIM!4cHDMc z5f@9Pa9YvDC`o>ec^(Ze^2ewf@Z{!iCO6?#)eB~oM7F!lJ3r&J+j(H{LjbKYgcgWY zJ1!o%>$_ey5BeWk<C6SEqzDsWkpf;_iPU{G!i2nXuUp0~SI$7Sx#D9AFwQ+Yj1H!? zW_?b=4_TRkBd6}T&xFp<r8e^2b2bw{!9zwf-WuBg@XMA@0lZQlESwCc1ypMnL>Fmn z@`pMd_qk5Gb#QU-pKWG4E|C_CeSgl=G`3;nu3?W84wJbU0htTL*tdjuS>`(X{8Q$l zv8^+KmWb*1^d`9SV<0$*+HAB|B+Yod4mWsF%BC5X=)~l8Sed|ge~*&+Ku~!;ZEq>o zyUq+<rG!?})*Y?YyQEJSCoc|DZKnD5219x0x;T{tVCufSO7e12qLMKj(;MctcTV(U zJ;J$d!td4~J?D`hL$)gG%1`GcbWw98uho9D#(p$5{azPgy;j)Y1KV-pB$1HqIlj|4 zdGji`aj>=qf8Ok7&gu^3j{J^%Y@~C;A>p2U|4OMfNFX0x9tEVq9J~p+<wrkgfMpPt zz1ikOlFx1Ua0AB*kc%>kc&%+=auI}gEXNRGoEy-q7;p@@7@=KH7js~ejRX@Q*)SBq zBpY?+!LD|d4wWC;iSB?(6Ok)VmsTXYrg6Jg5jbrIc?vnBtnlS?3467q^Y<m0OF<Ik za)BJ!eYwaPcCk0dJH`N!s9nnuJPs3ylwcxJNGVJtij!njD)P=C1lMIHOmZs~y$l}& zo}NKOm5O|b%~;IJps-u57<0QxnrGG-8ye<iC>do0#Tv5_vmnhh?l3+ZEc7pJ-?eVN z@nZx=L#to%zS{<u)-!2RC~eKmz$uL*YYw`l<#cIn1k90V*rk){4>HwuYQ;qA!)Z3H zdn<QoWg1Rl0#7+V08b;~is6e5gn_GhC2_GQ`?6g`=?%i-li*TC^D@;Jn$z%_#$Gou zjQjitO~OLIbBc{)p1UuD%^QS=oT?F(V6u>z9S~ZxGG3r5Ahg9WC9Yiyro_oUCM?zv z9zf5SQGR7lT0An>X$?FL;-V}b5yk`)g2$JEg$e;saGgD_?k%N*QZNrlNgG`=tXb7_ zk?S0m{gSh_WyhH<$VkVgfn^QfIf2m>WUr0Nod7%zWKCG9v7u0K>5N&K{<9JH48@kj zECk@xY0F8%butup!K`L>d=!<o8H(;0S>|?pr%?Y4#XWGlR=d_k-gJ#UlQ9|u^O&`d zX_Ff-mcCruw~UY5Z81Mdd9G_8H%@fuQ^1o&(PpH19UVcL2Z}g2Mj#OI4r=PuNN{7D zw9AWc{b|bC>d5q_f^Jk+&J)sQ&$&7wE3ke}X7!{G4Mpwb>Ic7M*W@#o8T<T0Lp*&K zG(R4DPK7xXcOGYsr@&umM3RM>RTlxU*vd#M7?~DK1*V$qMJC1}PBPQ*{Qj9LH~pB; zcG@2=eg*s>{k>`vgLP}fpg)Dz_7DjcThyfW_JWb)2f37KVb$$E$MhWZ8)NoaA!z!x zH=o`tS3>4R1k4g}?_i_xDuTR<x{7)>8f6M+DoG3SVHNMz<jZN7Wm$FZI}Fy>Xt~@e zsvftJVL1S9M|a1q)%ht@5uCD$N<y&?W~|MmbTTo^2Ut=<uwVwv?vs*bPE=E0cR+P` z?YRsGG(?w{@!l}DX`Y8G_D(NTOh)v>e))kB&5no@NA4<WldJ&mpt@-f-mK%z78ACA z?H7;CE#j`jYXmZQvYKq~V4yJtdh27AUXp=D*mQa5G8f*hDr({jo>`2H)++p&i7y>_ zp|`988c3#+(ipl}p7&XrNx_U)DWoSt7I24h*<DX%Lk2ba3cu^a=!b9Q2ihadxT_v3 zW>F}w4jx8MVJjZxiDuU!dncIpwD*C#iOs+;gE=#MB#4Y3+!5R{r9#wh)^1j)@yx&N z^{ksHAeUy|bgy!-Mn*;`2<dQ{+O*7vjq>Z1LCB-}_Q4&*)|gK*rQ+a_5dZ@gh}mHF zu!A!Sg850mm+b7Wi($WwGA2x#KCcfH%x!z8dSVl&*-m-m>;d-CQ=K^HYrBEpW&;Bw zgEo1HDGMp-I94o6j9)vn%vMm=#ZI${iml}iKyn48cfGKBk7KO`+5@*1z`>`%r*t*` zDNU~sj`gj<i=s`WMhK`gR-9B)p9aFmt>Rw>Q-lEKm;sL^<jcLuPYfr_i*aL5Sx8Lu z-tgIprYV;nK{D+<%5b`99C>O92#$s%L7EhL6nu=sIRiWa8UeF9S(TyaH@@)>AV)0@ z%MJApLMrP;K?${QZN!rg4|Gt{Yu{Llr~HvTaO&`Y0qaOf^Y^2pM&R-t5Y$apT1})C zfDs@QFapG-S5LysC%~hRU{c5rW}0n_1_1!YNtENEm1pi1*svuchu?PevtJp@*#>~5 zZ66N@Gx<33QkXgtg^%v0o^sRlTd$Xjr?%9S;1vCl3gW3S19~rl34tcxBZO&IJaux? z@sms{FuIOPW>O$m$3yC+QlwUgL?zRqN7bBWq2kcv6nO-=7$3x?XFs<jkQq3kntckl z?RpPr&zASw&Y9hF*t(EuAya+c+p0+Un{|W1OcmTDIuErO5b_ZLt2IaGmKI>3QN)g_ z!IJjbDy+D!j`v=kN->|#Ra$|7E{rK$I+|KBnTe|J(3u9taO9xl?)WX62e8=&sT^Ro zK^m<9PJP6Ix5ej?>xX*<#~HKMn!;=Eyt3fb4gUCuOQQj13uIH2o1}EAD2^3b)QB_c zzthllTiqXvL7oDOL89<v5%O1Sr-!9~tOD83$3B|Uw+FG3{*ki;sDRl3tuVPLN{7Iy znUOK=kS-tOi|3Q05y+>~CBR3ATB_wGF>w*d;~^1Dohc(S;V`KQ?zKHTq0v^%=Z`BM z(4aD;0wHzUh=-8#3O%$D#uE07rT`&%PLPU+M35k`cHvlnkl+CW(gP3OBeIC;t<i@& zgnhG6Q*`5&N8((s3NUa(y*;>S5ED6MFc+fx9@hw!kp~OO?Bey0cfT*gEFle~<jC$I zbT<$}D0j>w2qvLKR5sV_VO2Cw%Eo-N<h=SME{J6}73omT<IcEk{EdohJTFr@EP_=- z0E3mZT+%dW?Is6RGB|B!3GGdy{SH0X16CSY$Qu&nq@(m(ndA>C?f|QJcpm}lmJI7M z?9A7B>pVg#gDYoBZniuIwd?xsjw^!@E0ei{=dcKa%LbpKNux{m6~dO}ao{sYhRF+1 zX`n}IwXVD<u1RN*rJ2n~!{f9E=6|A6f%zXAnfr(|<GxPeMdd+~R2ozoTVd(*W5-k) z$~dL|phqU~R5;pXQDq8#`!?ZE`pP{XBH&;E)*r$AmMXm;uG&bPEgXk+A;mzGUJ0M} ze%>%*v~DL%l(;ROOxz7f(cN|;)14#ZV$|Yn;!h8!m7L{4R66)LtdyV<eDSBe)H*4L zYs2X3X}aq-QK*OjO9%8M3ARK8h)=K{I<-!#eRZ*72EbdQ01dD59>AL_9pD`W@Qxby zt@*(_ST9&_>-od^B#`)11}Ys<kjerGQioQZSu2;Q6IIr%_&@+u4KqMS#ey7@<Mg9+ zYoJztF`nVk?gW-Ep^*a1m*|y%<xADT{J#Vnp#MCbNMUC)KE;Rc2F@UNa6bYO1mS_J z{sM=CQ*I3GW-H=bE2;HfJ6LaXX*OOR=6hfKX)po=>4J3Ii~l?6W!Fy6pW#??l|0<p z>S2PN+ZUWq%yaj0`Ibhdh%C2gElwI5s6I9E$BmSxwqW&VlZ)vA_m|Lue(1)>Ps8fW z>w*DQzIxKTVxryUV%tUJ*G@+x4?b|sy>qL|T{&9E<{R<M`gla}b~G_i@98r8%5z_T z&&@%>*pvh7%6xV3z?Yf_x}QE8qmKn1S^2zlp0iTE-6Yb|9P_oIo^Mvh+uf$M;za-! zzB75;)b6?O(TWuD)}5WL$mIYhH-UZ6EFtgK<KdR#slqRtJXVRh8qLLz5=obMOnU4Y z$W>N0yfUG?=WXxGT&Z0rnLK0pn`EbpRbuR47`tP=3H7G=j0tVv$jN@Z*^e7@%iCH= zs^_}!HPanKEc`R>(_TO1@}lD`@e%fzZ7%*Ms9uQS5runf-V)Am9xXvG62DNVbO<eC zkC0^c`l||A#5<49cKADmrtj4p1)NOd7Ne7!JG9U$HGV+di)>*W_&WMVptE)iS2nES zn|t4(R$RvPa&6BJ<b89rz>MRdSC~*GPcC2T^Egu#bn-^4!-Dk!E2BtrlF9qEN<KWF zli5c#yIz|o-|R}A?7Z;~e3xyI82H8=P2ZTQNx+H6!K4JU#n?iAXaA?h;AcC6V-|6p zSrw)I9;POW@#~G1w5&aAt?Z5uCRy<t>pumDbItJPOHb*#7uC@if4v(AYJ9WSs+SXB zuzC1#7$aB%nivsbduC8c+4FVq$&0LRY~u9-PK8&Y5a_|KPyOu!_BYa@BOY!ZC-)@8 zb>1Yt3SvtKR@@7|`SPVSqjy!(r$dRh?IE2QlaA>f*893LY6kw<@icWzN|P?rf=ub^ zLB1y2T5O>s<f9MMIYQBMbgNSqEBE$_M#qHi(xiv8gnsv-G;C?H96id@<D=MD_WC%I z*{kmA#UrH;ZT|MHB|vx9d*^I-oqCR=o`=Q4rbHN?byBNf0R;tGd;FA5o3)YPps9<r zXkxRgaAUn_C$ERz`N=G9g_73zgKJJn$222@_nwYwvQ}<0bS%}ZCoGL}+U4sP7|}54 zV3ITxpwy47j%(j<CM{@CD4h?CN%6+7{9tvvUiih!gyltEp@hZ4iY<#5My*)61nbX| z_K%WrtMtTAVP7CjRmVRg)_*LYOmnaXo{sF<q_Jjp^&>}Hwf?|}w*sM{&JiDb_sNo* zPP7Yh<J`4D|G`NB^t(q7&h9bc-iMU(+tRnkOU-2b_q+BZ%V}2QL#;9)JT>~~!be&i zyeuB8b}a>#1!0R@c}lnr3FOX*!3M`BDAABu(E`ZOj(N+QYD8<T-TmNnlC-&+S5U*l zz|&2lPibl|J9idtoqwDO*9yAh6_H<wwDelc;?6Rm+Y@eCek5XUNJrj%I?POhy=cpA z({k>3)kt-Vl(<M`I|>IfF^*P4Y4v87=ShdUb&pmK)2gdIzw#$H`7uB@SGx2oay7(? zpUo>Ai{jNgz5i^NS*JN*#G%rF+uBg>UZeQ#JD#(rb9(HX2V9Q1xyyr|t@^@SbdwOS zrD)yzQyOgNJukg(S7(s7h}mj8(5E{WR=Lm<xqg~{e^Q0hU)w29`!%Rd;Z$6YtgIw= zkoJ3f_Vq7Ok^Omz4}4o~HoE1DQnd<$DJS~hpU@|)rWH-!z1f&`Vsg{-OXF>H_xr=< z`rVw?Uz-m6!5V33z~G(!MPh^$OCw8`1J|x9<0oRF>02dU&(w7sK8!+=vxkf}qjwnY zeD<li#rdIQeE^zc=j8T5f=Xx)l8^<w`S=~f9npuchnh2bif>)_ldS7~m^c&(EioD3 z87++!37=jYGhQdw9iW4~@|s#33s|SpRk{v)Wjnbx_9|I@h=i!*Y(3E#r39;x)Vh!c z-!%d{cCe$d+#yIp7yIT-){9LcnzAjr<Z}m~fTOQj0bBtmFLqK3s=gK%EKo)*)A^ee zt8^U6-rXbSAPizoT2Mc+-6eKL35qgB7OSA_8Xuh3=wX~RE{?+<JuMFJdL<~@95`B~ zAG9}0`M&1szR&CCXB?`!$!-4W--*%>Qtdrm9|Uw&dNn*Y-Bm1X95ej_x8mDk4F8yq zMB5Q+&g?Z-=yp37hjjeuJFi!X$YMDax8x^{2a!=l#=VX=iJkAME^G|pry;-cimtnd z?_?_7b2@bRZL>0RVZ^KPR8-h#W1qM8!G5ubx$#C-`7`OE<M*$N?wB6-adEojQVg8N zz7`rY*)aX=cx1oOcgO62HGJ3L<KdkopNi*o`21~36Fq2it&gTAc4wakHJ=hWw?Su} z9Wx|-I$M1MA3?KHcUF@<8+dIgzgJDAPf+^q-G#upd23jlHNX4VkCImP!M*DJB2g09 zbMniOLQch6g<Qt<<)^ZGlm$c*?2ra5wb)uQxGZ<`F`6ebYOzy-u(|0pgTj5klI4hd z&XdEHk;-kW+u5mNyv5&c^YwiFLeAO99ORd@7%QarEjB`PhVPDBr78Qknk%-r!9$Za zCi^it6B7!zhm_Z{)?Rh(9?-+lHXJ1f2Q2MVHCREvGR%!T8j=bO2Jxq7vwSl=dEqb_ z)N8n7PuWhb7Gummn{$?RUN4aCCHUg>T|kQ<IJ)G(b9=kP+y6^gR?0Ob&vgOK$u?nC zpY$jDOWj(`2PXRmZ9%6CLEk>Moi<dS?;e=8oh@`s27Nm@Z$0~Vc7C?veE#LY^!$)B z=v$@fdBDy=(5Bd_sp<J(upGBgomBWP$I8k|0rx`XR@J=Rf|s}ddC=#8vva1e{vwHA z43>^R205Oeog-Y{oWOUMtUVdnl%N545d670ftM9T^Oqe)wBr@7b%HTvD)D?&HT9^p z?k4H&!?(jp+Rw<xQ%vK+si<}*yw9C?j?@J<MVArLMEO>R9LBx7X}iAYN#Vr^&Lkgn zvgo`v{{*~WJgD6B4M~$lh6hP<X7$=cD#W5fg%!DkP_8gpL@)HVOdsS{KY2K#7W-(` zw3IQWqf5?W<ogW&9ZGWjp-z2uhuy6O({rTD=dga<k>Uq%&jKFgf1ZP>o0Wq*r-iel zqm`4#kBt^MU_a3wkhlg<jTydFp7fdGZ8#TlMm7rAH`uxu{yy_Pyn==YMI5GQ&2NUb z*~_o<D1=jNG9tuyGutmOE(SJjs^k^YR%T$Ngkhr%%$qP<P+pHNjUh#j4V&^4v1h+s zh-Jl+=A9~MOLoX*_?GYiBk~A}MMC2#>0-s1)amuhq}>XPPJ-b;paqP-k+yWUxC>(q z+uh{{>AHzQjW93{%8stNTLaulspd@Vic)0^c2egTF3C>1(wPRn7$Un{hS;B6ADHiv znVom}ew*j*V71X?eOP6KR|B#v{$h}h=BGmGq{9Z*d2Ph4DA}1{Hs$#|@Sd!mS8VCV z5Ta8AH(L4At<U^?`bZUE{P7SEUGySDbK}z6^U<3!sqHIZBNvgJj-flqO~U5B59HY7 z6Dhu1)w9G1hWVvY7$i-&Bk~<i@dqZM8;2_EnX1l_6S<rpbFCknRro!#=<q_}QDVk& zt_o^2i_3gsDa*{9T3b5B2j*8{*WxPC((~Gu-_brCM3rG<!u|60vqaM?F>&Cn>cRl( zK1HinWNvnkV+f1jEzdA^M<uWtQX|l%uleHa^PEXYFP&pRjKoRP13L(=C-oGWg1e9k z&DXCFxWd`WpCDlXZzTnG;9XBDUb%xBj}#DKMb?|LtKnirrl2{@`JyJi@Zs9^#aZGM z>wME-XA7mw=s>vEcrIIp6QnNQFV89W2Cw|B<NqPuteh;JoINh~_4w~fw_iz<UH*(% zI|G#6xc<tv|C*1;|H}F1KalgSe;{Y>e;{X`e;{Yxe;{YR|8C9{f3J1_yb5h&Wp4RT ztI!vm|5+9Kg7ZJCLSJzHXI1D6&i||meZl#kRiQ69{})zhY#|Cs72xJ45*`G?0V*_b z$D`)v?BdR8?&1Qwo@6I0+joI6BhD3fT3jc(n4k(I>xw8v?A#QaYXXWEAEtVAq?$~{ z{KEDvB0F}VBdlV{CIi+bD)b`!obf}wQknM=Yr%D6k&iaZp*E6uiAIw~Bv=9hVT{j1 z9kZ(!)k0O_#lJnOjq+41z0U42S0XVXVH@{}KjJOL6I)VdGpFuqgm{lfR*3{EsErZ6 zmMB!m)GB`8Ics@ohCZ5>KgVhg)qblF#f`b^Upg{l_G&H3N_B#TnI9QDX3+PbUZ2gR z?~b6ttKB$~77nw=)7QF(6@;&o6iiajqCLyQ94v4{o5J(1_2@6!L;B=86DGcb$0-(8 z+OhBTnK~gWB}b^2C!%^??fU12dy4t+ZMOAuOQzyhB8`4?6nWg)?*-Y!BWD#iu-h8a z9?B(l3O1nC+rJDGbU1I>z^Ssb+0c5*ZuksaP43hydAOgFr4@Af#`72_shACjy&MpG z++SmF;p}Dw3x53lUZ+klj(8CL7m;fG^m-k<YZd%;8bum)%huBfdUX{2o@n0#vO(1H z<i6yCS$u{s`EAlRJA9@y(BG3tpb^ib+SU`E7_pDar5?4%nU!&=J*M@peRA80*_ph# zsV5Wz&mT{uN7IS57NbKWPGlj(S~T`vbg%LXHwKr7p##aexnVmJwfj?Qa0h%>Hn=Vf zH#;p9Tk+c`ElwQrFnBBm??-n8T5I4Q9eQD$3`C9HBxj$K;p`0&^%e+roVDI6lw0{O za2Duyx~8jKw9WyA8!uW+6*7D5TBlLgUGSnQJFI1s!$eh4_*(xSJR`9*9@!}H<*R|o z)nltV>AMm!K8nS*yS07p1~`hZ8$Y>g1`%!?jl_SCbWJD1&UWQ3u@t;%f_PVKcWdvH z*yYfs1o$9I0-@yr_G`tz6xzG)9?p)i;MOHKIdxGHM3^FR)geSI^2f8!szVqxBNdf} zJZOm-(=qkL=VY}PT2?3e-xev;6L}0B9}RJi^u{_!aK<^-_AOFT;h;kAjz77JOqq_s z9nmgW%rap|fAa-Ck;<3-p*0oaNmLAB@o7w_N1yQG*cVWH9TxlhbnP7J+|TSL^d|3i z$&?=JpuY#xTi!dK5M)>X8WJXFGSaj_!#eoY^U(F>Ct*%i)g6i_MfPQwt?BCO>A2B2 z*{_gDlR7Y==Kf)?GjIe8pfou{3sh@|g9Px<Lepk&sDQeU$#!z1ZMc2mYv#wa(vk$p z^whme!bL~+axrhV&xh&0TjviB7j6NX<8kc>D_rs18lijpHuf{g7@hbg<WyvHaRvEx ziA`=7u8Jl7PwDzzZ%!y_NNGsV{iKJdp(tvOFJG9+9__vQxP3X~^499loq=#q1F1~- z=UC6f#>&x(^T)qGZfm#n44r4d1ZS-3f$fi2!^@Od2x=phQzjJsc%$9*DHv<s)t!D7 zs>b5FC*G4$8@a2tyt0?QJ?9VcjdZq>U|DX~PK`Dc_QGJ!GQ1}Z4`CA>!!oaWFy7pW zmo6;F{Hl_^pEU;lO;#TIg8?3IQDoCQ`VW&L1$|0UQ)W;Z3HocS^O?x1>n7r=CtPUS z<0QA6x?N;GeAb125Ux{iq}*0&W>qwB8%D?Lqr^``Bzx>JdZ+CaZyTcUau0v>CC1~D zgHQNADbJ*;ld8D9L=NCkXIRSR5K7$IW30?8L`5)=GeuGQ;NS2G;hza+z7r<CHxDih zVc3$=DIa%x|CL(yIwRU@_jX7A!I&wzdCmTTMXu{Q)Px(gPOs~RN4*}~@-z<jW}Z5> zAn@h*05D>_pv_$3UDq}vm54l7l<fVyPg&D+r1w}(L(?~3qB!{7(e=Z4F*;;-vd-j& z{<?Hh&J$#L(7+2_Rcp{ak{g`N%R50)A#h*yle+mRcpgue%mgx6#B0bN%AV#oRbmig zcDJT`_nq{UN|Dww%aYf&Xq&q9+eb;+L}`U~U^#t-^#cEr)#qwCF`4P>r1$I|i#Kg> zBME0NJ9zE)A-^a0defOP7(O}%Z_p)Te%)HXw=f<04rCXO9{&D;;P~ugk-XIJQHC$8 zO1t!EWrrjACX2r|B&mN7^v@K#(VO^`v>nb3+~09T_jZV%rX#hGiYt5SkXn#wi82+~ zoQu9VC-9>St4Q2y>>#0n(LJ;}@{Dj@FEb?tN9=s}8{N9>Wqev%V`7J?Ta}M=clfSB zCKbR&hBq_Rcl3D7bgJg=f(NJPlnc?^y5CNz%J?%7&PQo&R`VLYMqxvb*EIybeD(IF znX$J7dEIoQj{l@5=cAMJe806SUHSC;(%0l0i>Av>>6Q{@PBt9YFwP^W^W?o84bahK zra2bTN#u$j`>?k?sPSfVk@CFtai`P#8cnfs$Y7EK%Dq_M2hrKsC+}xoMk4#Sfm3&4 z9(SKhO`jwr9LzD8o)=tyxHceTy_wZqkl<-cAr-VrV?MYvy)NJ%;?;Jnf!REI192CL z6N=p5X?xxt$L1p$O=3;;a^tl4_TIiy+WAnxaG!-YN1}zu3%0~3L5TMcnxq&%>`)RO zd_W;zK{-;`lPoG0rO~KLYy+-0aKN<%rY3_x@Lo+uoXa}OQrI96>;Wr_mk&cJXD1Ip z?KIW$aj|kYh84-H4j51y`&R&$um>QQ{&IK#E-#ecA9CAIAnK2nm)R3Z#J_?-!#KD< zu5~aZP@jP#7!L&Ua(1)i{8end3LnZv2(1Br-x&GgQV9cIz_-!hF5tf^eplfyZXcZn z0l&Wi)F+_1AIAm!Eyf>kYvA0q%pndxF1%OqgqbJR5G0^U01O)?!Hx@j5Y}J#zqGrn zX#7B-NGkvhYx*)88~+me$35CrG_tbzb&KD&olkrT{o`)wDti9>VKc1lGoUJ8Zu{1a zOXwf>EmzUzOy7uL=Z*L`<~_8R&_C`VuA&L`pxdyv5&nkOVZMa^F_yoIeogOYQ3wS2 z9pK?I^L36(=pUo%tLU4-R0*{J+5$)zp!pxiMUORse?kAHKwQOtt(YV72U^w!J|>r2 z&%OBv{$fo3<Fa-YO|O4#wD`B&75Fcqf7|1;Vw7V+zipdB@DlpBJq~8?AP)X5x=-v9 z`nNqUah5&#d$hOACG>B5+`7}b9L8MtZ&72oeF^>B9>-IAHW~t;qyB~-Rl9`#ZI62t ztCh2Gfk2N?P_OiOsLmf~r@M|2D>q=f{>!E9qC#EW-XE4S7a21b`3L^j&Hk@;`PIF} zf5LNO|Ahaw)A&{J)w#c)V4;COz*lAhuX^}Zp@+@9{q%7Dr-y$r4|mnm)#<RGo@xjG z;Bw*V*LwZin*XmkIlZ~$>DSWzzj}hrnf&BL`}UHjt1~E9PwrPrmmN+1&e2cN?B913 zJNz3)Kb5S1-;vnJZyf!Um;QZ6d%tt^Q}g-v9hHp!hS5(U=HGW@IQAPyKh=@{$q`IO z{@MN5<9~DXS4sarW)k$Wt6!@7|Iv}p#3fD_j{cKOVxRntqyHq6mVW2xKgp!DsoyaA zPclhi`ZtdLlT14Oouhx9Nmu2rpP5uW1NS%a>uMfe6>NT@+2?*i|0&;Gg<lmVe!`>P s{R;m}qPXhd>Miz92jAxZi09QCZnfJ;zz7Hg;s6XD69md$hF#PCAM_8w0ssI2 literal 0 HcmV?d00001 diff --git a/apps/api/Dockerfile b/apps/api/Dockerfile new file mode 100644 index 0000000..daf01c3 --- /dev/null +++ b/apps/api/Dockerfile @@ -0,0 +1,28 @@ +# syntax=docker/dockerfile:1 +# Build context = monorepo root (hrm-medpark/) + +FROM node:20-bookworm-slim AS base +ENV PNPM_HOME="/pnpm" PATH="/pnpm:$PATH" +RUN corepack enable && apt-get update -y && apt-get install -y openssl && rm -rf /var/lib/apt/lists/* +WORKDIR /repo + +# ---- install + build ---- +FROM base AS build +COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./ +COPY apps/api/package.json apps/api/package.json +COPY apps/web/package.json apps/web/package.json +RUN pnpm install --frozen-lockfile +COPY apps/api apps/api +RUN pnpm --filter api exec prisma generate && pnpm --filter api build + +# ---- runtime ---- +FROM base AS runtime +ENV NODE_ENV=production +WORKDIR /repo +# pnpm keeps the package store at the repo-root node_modules/.pnpm; copy both trees so symlinks resolve +COPY --from=build /repo/node_modules ./node_modules +COPY --from=build /repo/apps/api ./apps/api +WORKDIR /repo/apps/api +EXPOSE 3001 +# apply pending migrations, then start; falls back to start if migrate has nothing to do +CMD ["sh", "-c", "pnpm exec prisma migrate deploy && node dist/main"] diff --git a/apps/api/i18n/en/translation.json b/apps/api/i18n/en/translation.json new file mode 100644 index 0000000..be45451 --- /dev/null +++ b/apps/api/i18n/en/translation.json @@ -0,0 +1,15 @@ +{ + "errors": { + "not_found": "Resource with id={id} not found", + "conflict_idnp": "IDNP {idnp} already exists in the system", + "idnp_invalid": "Invalid IDNP (13 digits, wrong check digit)", + "recomandare_sot": "Cannot select the employee's spouse as an internal recommendation", + "unauthorized": "Unauthorized", + "forbidden": "Insufficient permissions" + }, + "validation": { + "required": "Required field", + "email": "Invalid email address", + "phone": "Invalid phone number" + } +} diff --git a/apps/api/i18n/ro/translation.json b/apps/api/i18n/ro/translation.json new file mode 100644 index 0000000..4e79392 --- /dev/null +++ b/apps/api/i18n/ro/translation.json @@ -0,0 +1,15 @@ +{ + "errors": { + "not_found": "Resursa cu id={id} nu a fost găsită", + "conflict_idnp": "IDNP {idnp} există deja în sistem", + "idnp_invalid": "IDNP invalid (13 cifre, cifra de control incorectă)", + "recomandare_sot": "Nu se poate selecta soțul/soția angajatului ca recomandare internă", + "unauthorized": "Acces neautorizat", + "forbidden": "Nu aveți permisiuni suficiente" + }, + "validation": { + "required": "Câmp obligatoriu", + "email": "Adresă email invalidă", + "phone": "Număr de telefon invalid" + } +} diff --git a/apps/api/i18n/ru/translation.json b/apps/api/i18n/ru/translation.json new file mode 100644 index 0000000..9f4b9db --- /dev/null +++ b/apps/api/i18n/ru/translation.json @@ -0,0 +1,15 @@ +{ + "errors": { + "not_found": "Ресурс с id={id} не найден", + "conflict_idnp": "IDNP {idnp} уже существует в системе", + "idnp_invalid": "Некорректный IDNP (13 цифр, неверная контрольная цифра)", + "recomandare_sot": "Нельзя выбрать супруга сотрудника в качестве внутренней рекомендации", + "unauthorized": "Не авторизован", + "forbidden": "Недостаточно прав" + }, + "validation": { + "required": "Обязательное поле", + "email": "Некорректный email", + "phone": "Некорректный номер телефона" + } +} diff --git a/apps/api/nest-cli.json b/apps/api/nest-cli.json new file mode 100644 index 0000000..f9aa683 --- /dev/null +++ b/apps/api/nest-cli.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "src", + "compilerOptions": { + "deleteOutDir": true + } +} diff --git a/apps/api/package.json b/apps/api/package.json new file mode 100644 index 0000000..b757b8c --- /dev/null +++ b/apps/api/package.json @@ -0,0 +1,57 @@ +{ + "name": "api", + "version": "0.1.0", + "prisma": { + "seed": "ts-node prisma/seed.ts" + }, + "scripts": { + "build": "nest build", + "dev": "nest start --watch", + "start": "node dist/main", + "prisma:migrate": "prisma migrate dev", + "prisma:generate": "prisma generate", + "prisma:studio": "prisma studio", + "prisma:seed": "ts-node prisma/seed.ts", + "docx:stubs": "ts-node scripts/generate-docx-stubs.ts", + "testdb:run": "ts-node scripts/test-db.ts run", + "testdb:verify": "ts-node scripts/verify-functionality.ts", + "testdb:drop": "ts-node scripts/test-db.ts drop" + }, + "dependencies": { + "@nestjs/axios": "^3.0.2", + "@nestjs/bull": "^10.1.1", + "@nestjs/common": "^10.3.0", + "@nestjs/config": "^3.2.0", + "@nestjs/core": "^10.3.0", + "@nestjs/jwt": "^10.2.0", + "@nestjs/passport": "^10.0.3", + "@nestjs/platform-fastify": "^10.3.0", + "@nestjs/throttler": "^5.1.1", + "@prisma/client": "^5.11.0", + "argon2": "^0.40.1", + "axios": "^1.6.8", + "bull": "^4.12.2", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.1", + "docx": "^9.6.1", + "docxtemplater": "^3.47.0", + "exceljs": "^4.4.0", + "jwks-rsa": "^3.2.2", + "minio": "^8.0.0", + "nestjs-i18n": "^10.4.5", + "passport": "^0.7.0", + "passport-jwt": "^4.0.1", + "pizzip": "^3.1.4", + "reflect-metadata": "^0.2.1", + "rxjs": "^7.8.1" + }, + "devDependencies": { + "@nestjs/cli": "^10.3.2", + "@nestjs/schematics": "^10.1.1", + "@types/node": "^20.11.0", + "@types/passport-jwt": "^4.0.1", + "prisma": "^5.11.0", + "ts-node": "^10.9.2", + "typescript": "^5.4.2" + } +} diff --git a/apps/api/prisma/migrations/20260429071206_/migration.sql b/apps/api/prisma/migrations/20260429071206_/migration.sql new file mode 100644 index 0000000..5254c0f --- /dev/null +++ b/apps/api/prisma/migrations/20260429071206_/migration.sql @@ -0,0 +1,578 @@ +-- CreateEnum +CREATE TYPE "Sex" AS ENUM ('F', 'M'); + +-- CreateEnum +CREATE TYPE "MaritalStatus" AS ENUM ('casatorit', 'necasatorit', 'divortat', 'vaduv'); + +-- CreateEnum +CREATE TYPE "EmployeeStatus" AS ENUM ('activ', 'concediat', 'suspendat'); + +-- CreateEnum +CREATE TYPE "DocumentType" AS ENUM ('buletin_de_identitate', 'pasaport'); + +-- CreateEnum +CREATE TYPE "FamilyMemberType" AS ENUM ('contact_principal', 'sot', 'sotie', 'mama', 'tata', 'copil'); + +-- CreateEnum +CREATE TYPE "StudyType" AS ENUM ('superioare', 'medii_de_specialitate', 'secundare_tehnice', 'medii'); + +-- CreateEnum +CREATE TYPE "StudyLevel" AS ENUM ('de_baza', 'postuniversitar'); + +-- CreateEnum +CREATE TYPE "PostUniversityType" AS ENUM ('masterat', 'rezidentiat', 'secundariat', 'altele'); + +-- CreateEnum +CREATE TYPE "DiplomaStatus" AS ENUM ('confirmata', 'neconfirmata'); + +-- CreateEnum +CREATE TYPE "QualificationCategory" AS ENUM ('fara', 'cat_II', 'cat_I', 'superioara'); + +-- CreateEnum +CREATE TYPE "ScientificTitle" AS ENUM ('doctor', 'doctor_habilitat'); + +-- CreateEnum +CREATE TYPE "TrainingType" AS ENUM ('orientare', 'intern', 'extern_RM', 'extern_international'); + +-- CreateEnum +CREATE TYPE "DisciplinarySanctionType" AS ENUM ('avertisment', 'mustrare', 'mustrare_aspra'); + +-- CreateEnum +CREATE TYPE "ContractPeriod" AS ENUM ('determinata', 'nedeterminata', 'replasare_temporara'); + +-- CreateEnum +CREATE TYPE "ContractCategory" AS ENUM ('principal', 'secundar'); + +-- CreateEnum +CREATE TYPE "ContractType" AS ENUM ('de_baza', 'cumul'); + +-- CreateEnum +CREATE TYPE "SalaryType" AS ENUM ('fix', 'pe_ore', 'in_acord'); + +-- CreateEnum +CREATE TYPE "CampaignStatus" AS ENUM ('draft', 'scheduled', 'in_progress', 'closed'); + +-- CreateEnum +CREATE TYPE "EvaluationScore" AS ENUM ('slab', 'mediu', 'bine'); + +-- CreateEnum +CREATE TYPE "ProposedCategory" AS ENUM ('fara', 'cat_II', 'cat_I', 'superioara'); + +-- CreateEnum +CREATE TYPE "MedicalCheckupType" AS ENUM ('la_angajare', 'periodic', 'la_reluarea_activitatii', 'la_incetarea_expunerii', 'suplimentar'); + +-- CreateEnum +CREATE TYPE "MedicalVerdict" AS ENUM ('apt', 'apt_perioada_adaptare', 'apt_conditionat', 'inapt_temporar', 'inapt'); + +-- CreateTable +CREATE TABLE "disability_grades" ( + "id" TEXT NOT NULL, + "code" TEXT NOT NULL, + "name" TEXT NOT NULL, + + CONSTRAINT "disability_grades_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "tax_exemptions" ( + "id" TEXT NOT NULL, + "code" TEXT NOT NULL, + "description" TEXT NOT NULL, + + CONSTRAINT "tax_exemptions_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "work_schedules" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "daysWork" INTEGER NOT NULL, + "daysRest" INTEGER NOT NULL, + "hoursPerDay" INTEGER NOT NULL, + + CONSTRAINT "work_schedules_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "departments" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "code" TEXT, + "parentId" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "departments_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "employees" ( + "id" TEXT NOT NULL, + "idnp" VARCHAR(13) NOT NULL, + "nume" TEXT NOT NULL, + "prenume" TEXT NOT NULL, + "patronimic" TEXT, + "numeAnterior" TEXT, + "dataNasterii" DATE NOT NULL, + "domiciliu" TEXT NOT NULL, + "adresaReala" TEXT, + "telefonPersonal" TEXT NOT NULL, + "telefonServiciu" TEXT, + "emailPersonal" TEXT, + "emailCorporativ" TEXT, + "sex" "Sex" NOT NULL, + "codCpas" TEXT, + "stareCivila" "MaritalStatus", + "titluStiintific" "ScientificTitle", + "titluUniversitar" TEXT, + "status" "EmployeeStatus" NOT NULL DEFAULT 'activ', + "gradDizabilitateId" TEXT, + "recomandareInternaId" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "employees_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "identity_documents" ( + "id" TEXT NOT NULL, + "employeeId" TEXT NOT NULL, + "tipAct" "DocumentType" NOT NULL, + "seria" TEXT, + "nr" TEXT NOT NULL, + "dataEmiterii" DATE NOT NULL, + "autoritateEmitenta" TEXT NOT NULL, + "dataExpirarii" DATE NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "identity_documents_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "family_members" ( + "id" TEXT NOT NULL, + "employeeId" TEXT NOT NULL, + "tip" "FamilyMemberType" NOT NULL, + "numePrenume" TEXT NOT NULL, + "dataNasterii" DATE, + "idnp" VARCHAR(13), + "telefon" TEXT, + "tipScutireId" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "family_members_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "educations" ( + "id" TEXT NOT NULL, + "employeeId" TEXT NOT NULL, + "tipStudii" "StudyType" NOT NULL, + "institutia" TEXT NOT NULL, + "specialitatea" TEXT NOT NULL, + "dataAbsolvirii" DATE, + "nrSeriaDiploma" TEXT, + "dataEmiterii" DATE, + "nrInregistrare" TEXT, + "confirmare" "DiplomaStatus", + "nivel" "StudyLevel", + "tipPostuniversitar" "PostUniversityType", + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "educations_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "qualifications" ( + "id" TEXT NOT NULL, + "employeeId" TEXT NOT NULL, + "categorie" "QualificationCategory" NOT NULL, + "dataObtinerii" DATE, + "dataUltimeiConfirmari" DATE, + "dataExpirarii" DATE, + "specialitate" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "qualifications_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "trainings" ( + "id" TEXT NOT NULL, + "employeeId" TEXT NOT NULL, + "denumire" TEXT NOT NULL, + "inceput" DATE NOT NULL, + "sfirsit" DATE, + "tip" "TrainingType" NOT NULL, + "tara" TEXT, + "nrOre" INTEGER, + "organizatia" TEXT, + "certificat" BOOLEAN NOT NULL DEFAULT false, + "cost" DECIMAL(10,2), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "trainings_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "disciplinary_sanctions" ( + "id" TEXT NOT NULL, + "employeeId" TEXT NOT NULL, + "tip" "DisciplinarySanctionType" NOT NULL, + "dataAplicarii" DATE NOT NULL, + "dataExpirarii" DATE NOT NULL, + "isStinsa" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "disciplinary_sanctions_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "benefits" ( + "id" TEXT NOT NULL, + "employeeId" TEXT NOT NULL, + "uniformaId" TEXT, + "halatId" TEXT, + "ciupiciId" TEXT, + "vestaId" TEXT, + "ticheteMasa" BOOLEAN NOT NULL DEFAULT false, + "valoareTichet" DECIMAL(10,2), + "alimentatiePersonal" BOOLEAN NOT NULL DEFAULT false, + "abonamentTel" DECIMAL(10,2), + "aparatTelefonId" TEXT, + "cardCompanie" TEXT, + "automobilServiciu" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "benefits_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "employment_contracts" ( + "id" TEXT NOT NULL, + "nrCim" TEXT NOT NULL, + "employeeId" TEXT NOT NULL, + "categorie" "ContractCategory" NOT NULL, + "dataSemnarii" DATE NOT NULL, + "dataAngajarii" DATE NOT NULL, + "dataDemisiei" DATE, + "perioada" "ContractPeriod" NOT NULL, + "dataTerminarii" DATE, + "functiaClasificator" TEXT, + "codFunctie" TEXT, + "functiaOrganigrama" TEXT, + "tipCim" "ContractType" NOT NULL, + "departmentId" TEXT NOT NULL, + "regimMunca" TEXT, + "tipSalarizare" "SalaryType", + "salarizareDetails" JSONB, + "clausaAditionala" JSONB, + "workScheduleId" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "employment_contracts_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "cim_service_categories" ( + "id" TEXT NOT NULL, + "contractId" TEXT NOT NULL, + "categorieId" TEXT NOT NULL, + "tipRemunerare" TEXT NOT NULL, + "sumaNeta" DECIMAL(10,2), + "procent" DECIMAL(5,2), + + CONSTRAINT "cim_service_categories_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "evaluation_campaigns" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "departmentId" TEXT NOT NULL, + "month" DATE NOT NULL, + "status" "CampaignStatus" NOT NULL DEFAULT 'draft', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "evaluation_campaigns_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "evaluation_forms" ( + "id" TEXT NOT NULL, + "campaignId" TEXT NOT NULL, + "employeeId" TEXT NOT NULL, + "abilitatiClinice" "EvaluationScore", + "judecataClinica" "EvaluationScore", + "manopere" "EvaluationScore", + "gestionareaSarcinilor" "EvaluationScore", + "constiintaProfesionala" "EvaluationScore", + "atitudineaPacienti" "EvaluationScore", + "atitudineaColegi" "EvaluationScore", + "atitudineaPersonalNonMed" "EvaluationScore", + "utilizareSmartphone" "EvaluationScore", + "respectareaProgramului" "EvaluationScore", + "respectareaDressCode" "EvaluationScore", + "testJci" JSONB, + "completareaDocMed" BOOLEAN, + "perfectioneazaCunostinte" BOOLEAN, + "membruComitetCalitate" BOOLEAN, + "functieDeMonitor" BOOLEAN, + "inlocuiesteSuperiorul" BOOLEAN, + "categorieCalculata" "ProposedCategory", + "categorieAprobata" "ProposedCategory", + "observatii" TEXT, + "completedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "evaluation_forms_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "workplace_risk_cards" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "riskFactors" JSONB NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "workplace_risk_cards_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "employee_medical_profiles" ( + "id" TEXT NOT NULL, + "employeeId" TEXT NOT NULL, + "ocupatieCorm" TEXT, + "workplaceRiskCardId" TEXT, + "dataUltimControlMedical" DATE, + "expusRadiatiiIonizante" BOOLEAN NOT NULL DEFAULT false, + "dataIntrarii" DATE, + "expunereAnterioaraPerioda" TEXT, + "expunereAnterioaraAni" INTEGER, + "dozaCumulataExternaMsv" DECIMAL(10,4), + "dozaCumulataInternaMsv" DECIMAL(10,4), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "employee_medical_profiles_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "medical_checkups" ( + "id" TEXT NOT NULL, + "employeeId" TEXT NOT NULL, + "tip" "MedicalCheckupType" NOT NULL, + "dataPlanificata" DATE NOT NULL, + "dataEfectuata" DATE, + "verdict" "MedicalVerdict", + "recomandari" TEXT, + "documenteGenerate" JSONB, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "medical_checkups_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "audit_logs" ( + "id" BIGSERIAL NOT NULL, + "ts" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "userId" TEXT NOT NULL, + "userRole" VARCHAR(50) NOT NULL, + "ip" VARCHAR(45), + "action" VARCHAR(20) NOT NULL, + "entity" VARCHAR(50) NOT NULL, + "entityId" VARCHAR(50) NOT NULL, + "field" VARCHAR(100), + "oldValue" TEXT, + "newValue" TEXT, + "reason" TEXT, + + CONSTRAINT "audit_logs_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "disability_grades_code_key" ON "disability_grades"("code"); + +-- CreateIndex +CREATE UNIQUE INDEX "tax_exemptions_code_key" ON "tax_exemptions"("code"); + +-- CreateIndex +CREATE UNIQUE INDEX "work_schedules_name_key" ON "work_schedules"("name"); + +-- CreateIndex +CREATE UNIQUE INDEX "departments_code_key" ON "departments"("code"); + +-- CreateIndex +CREATE INDEX "departments_parentId_idx" ON "departments"("parentId"); + +-- CreateIndex +CREATE UNIQUE INDEX "employees_idnp_key" ON "employees"("idnp"); + +-- CreateIndex +CREATE INDEX "employees_idnp_idx" ON "employees"("idnp"); + +-- CreateIndex +CREATE INDEX "employees_nume_prenume_idx" ON "employees"("nume", "prenume"); + +-- CreateIndex +CREATE INDEX "employees_status_idx" ON "employees"("status"); + +-- CreateIndex +CREATE INDEX "employees_dataNasterii_idx" ON "employees"("dataNasterii"); + +-- CreateIndex +CREATE INDEX "identity_documents_employeeId_idx" ON "identity_documents"("employeeId"); + +-- CreateIndex +CREATE INDEX "identity_documents_dataExpirarii_idx" ON "identity_documents"("dataExpirarii"); + +-- CreateIndex +CREATE INDEX "family_members_employeeId_idx" ON "family_members"("employeeId"); + +-- CreateIndex +CREATE INDEX "educations_employeeId_idx" ON "educations"("employeeId"); + +-- CreateIndex +CREATE INDEX "qualifications_employeeId_idx" ON "qualifications"("employeeId"); + +-- CreateIndex +CREATE INDEX "qualifications_dataExpirarii_idx" ON "qualifications"("dataExpirarii"); + +-- CreateIndex +CREATE INDEX "trainings_employeeId_idx" ON "trainings"("employeeId"); + +-- CreateIndex +CREATE INDEX "disciplinary_sanctions_employeeId_idx" ON "disciplinary_sanctions"("employeeId"); + +-- CreateIndex +CREATE INDEX "disciplinary_sanctions_dataExpirarii_idx" ON "disciplinary_sanctions"("dataExpirarii"); + +-- CreateIndex +CREATE UNIQUE INDEX "benefits_employeeId_key" ON "benefits"("employeeId"); + +-- CreateIndex +CREATE UNIQUE INDEX "employment_contracts_nrCim_key" ON "employment_contracts"("nrCim"); + +-- CreateIndex +CREATE INDEX "employment_contracts_employeeId_idx" ON "employment_contracts"("employeeId"); + +-- CreateIndex +CREATE INDEX "employment_contracts_departmentId_idx" ON "employment_contracts"("departmentId"); + +-- CreateIndex +CREATE INDEX "employment_contracts_dataDemisiei_idx" ON "employment_contracts"("dataDemisiei"); + +-- CreateIndex +CREATE INDEX "cim_service_categories_contractId_idx" ON "cim_service_categories"("contractId"); + +-- CreateIndex +CREATE INDEX "evaluation_campaigns_departmentId_idx" ON "evaluation_campaigns"("departmentId"); + +-- CreateIndex +CREATE INDEX "evaluation_campaigns_month_idx" ON "evaluation_campaigns"("month"); + +-- CreateIndex +CREATE INDEX "evaluation_forms_campaignId_idx" ON "evaluation_forms"("campaignId"); + +-- CreateIndex +CREATE INDEX "evaluation_forms_employeeId_idx" ON "evaluation_forms"("employeeId"); + +-- CreateIndex +CREATE UNIQUE INDEX "evaluation_forms_campaignId_employeeId_key" ON "evaluation_forms"("campaignId", "employeeId"); + +-- CreateIndex +CREATE UNIQUE INDEX "workplace_risk_cards_name_key" ON "workplace_risk_cards"("name"); + +-- CreateIndex +CREATE UNIQUE INDEX "employee_medical_profiles_employeeId_key" ON "employee_medical_profiles"("employeeId"); + +-- CreateIndex +CREATE INDEX "medical_checkups_employeeId_idx" ON "medical_checkups"("employeeId"); + +-- CreateIndex +CREATE INDEX "medical_checkups_dataPlanificata_idx" ON "medical_checkups"("dataPlanificata"); + +-- CreateIndex +CREATE INDEX "audit_logs_userId_idx" ON "audit_logs"("userId"); + +-- CreateIndex +CREATE INDEX "audit_logs_entity_entityId_idx" ON "audit_logs"("entity", "entityId"); + +-- CreateIndex +CREATE INDEX "audit_logs_ts_idx" ON "audit_logs"("ts"); + +-- AddForeignKey +ALTER TABLE "departments" ADD CONSTRAINT "departments_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "departments"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "employees" ADD CONSTRAINT "employees_gradDizabilitateId_fkey" FOREIGN KEY ("gradDizabilitateId") REFERENCES "disability_grades"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "employees" ADD CONSTRAINT "employees_recomandareInternaId_fkey" FOREIGN KEY ("recomandareInternaId") REFERENCES "employees"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "identity_documents" ADD CONSTRAINT "identity_documents_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "family_members" ADD CONSTRAINT "family_members_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "family_members" ADD CONSTRAINT "family_members_tipScutireId_fkey" FOREIGN KEY ("tipScutireId") REFERENCES "tax_exemptions"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "educations" ADD CONSTRAINT "educations_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "qualifications" ADD CONSTRAINT "qualifications_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "trainings" ADD CONSTRAINT "trainings_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "disciplinary_sanctions" ADD CONSTRAINT "disciplinary_sanctions_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "benefits" ADD CONSTRAINT "benefits_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "employment_contracts" ADD CONSTRAINT "employment_contracts_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "employment_contracts" ADD CONSTRAINT "employment_contracts_departmentId_fkey" FOREIGN KEY ("departmentId") REFERENCES "departments"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "employment_contracts" ADD CONSTRAINT "employment_contracts_workScheduleId_fkey" FOREIGN KEY ("workScheduleId") REFERENCES "work_schedules"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "cim_service_categories" ADD CONSTRAINT "cim_service_categories_contractId_fkey" FOREIGN KEY ("contractId") REFERENCES "employment_contracts"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "evaluation_campaigns" ADD CONSTRAINT "evaluation_campaigns_departmentId_fkey" FOREIGN KEY ("departmentId") REFERENCES "departments"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "evaluation_forms" ADD CONSTRAINT "evaluation_forms_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "evaluation_campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "evaluation_forms" ADD CONSTRAINT "evaluation_forms_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "employee_medical_profiles" ADD CONSTRAINT "employee_medical_profiles_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "employee_medical_profiles" ADD CONSTRAINT "employee_medical_profiles_workplaceRiskCardId_fkey" FOREIGN KEY ("workplaceRiskCardId") REFERENCES "workplace_risk_cards"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "medical_checkups" ADD CONSTRAINT "medical_checkups_employeeId_fkey" FOREIGN KEY ("employeeId") REFERENCES "employees"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/apps/api/prisma/migrations/20260508120000_add_anexa_templates/migration.sql b/apps/api/prisma/migrations/20260508120000_add_anexa_templates/migration.sql new file mode 100644 index 0000000..393e85e --- /dev/null +++ b/apps/api/prisma/migrations/20260508120000_add_anexa_templates/migration.sql @@ -0,0 +1,35 @@ +-- CreateEnum +CREATE TYPE "AnexaType" AS ENUM ('ANEXA_3', 'ANEXA_4', 'ANEXA_4B', 'ANEXA_6'); + +-- CreateTable +CREATE TABLE "anexa_templates" ( + "id" TEXT NOT NULL, + "type" "AnexaType" NOT NULL, + "name" TEXT NOT NULL, + "contentJson" JSONB NOT NULL, + "updatedById" TEXT NOT NULL, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "anexa_templates_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "anexa_template_versions" ( + "id" TEXT NOT NULL, + "templateId" TEXT NOT NULL, + "contentJson" JSONB NOT NULL, + "savedById" TEXT NOT NULL, + "savedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "label" TEXT, + + CONSTRAINT "anexa_template_versions_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "anexa_templates_type_key" ON "anexa_templates"("type"); + +-- CreateIndex +CREATE INDEX "anexa_template_versions_templateId_idx" ON "anexa_template_versions"("templateId"); + +-- AddForeignKey +ALTER TABLE "anexa_template_versions" ADD CONSTRAINT "anexa_template_versions_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "anexa_templates"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/apps/api/prisma/migrations/20260512000000_add_inventory/migration.sql b/apps/api/prisma/migrations/20260512000000_add_inventory/migration.sql new file mode 100644 index 0000000..4a439f5 --- /dev/null +++ b/apps/api/prisma/migrations/20260512000000_add_inventory/migration.sql @@ -0,0 +1,47 @@ +-- CreateEnum +CREATE TYPE "InventoryItemType" AS ENUM ('uniforma', 'halat', 'ciupici', 'vesta', 'aparat_telefon', 'alte'); + +-- CreateTable +CREATE TABLE "inventory_items" ( + "id" TEXT NOT NULL, + "sku" TEXT NOT NULL, + "name" TEXT NOT NULL, + "type" "InventoryItemType" NOT NULL, + "size" TEXT, + "color" TEXT, + "pricePerUnit" DECIMAL(10,2), + "stockQty" INTEGER NOT NULL DEFAULT 0, + "active" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "inventory_items_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "inventory_items_sku_key" ON "inventory_items"("sku"); + +-- CreateIndex +CREATE INDEX "inventory_items_type_active_idx" ON "inventory_items"("type", "active"); + +-- Reset existing free-text IDs in benefits (no FK referenced anything real before) +UPDATE "benefits" SET "uniformaId" = NULL WHERE "uniformaId" IS NOT NULL; +UPDATE "benefits" SET "halatId" = NULL WHERE "halatId" IS NOT NULL; +UPDATE "benefits" SET "ciupiciId" = NULL WHERE "ciupiciId" IS NOT NULL; +UPDATE "benefits" SET "vestaId" = NULL WHERE "vestaId" IS NOT NULL; +UPDATE "benefits" SET "aparatTelefonId" = NULL WHERE "aparatTelefonId" IS NOT NULL; + +-- AddForeignKey +ALTER TABLE "benefits" ADD CONSTRAINT "benefits_uniformaId_fkey" FOREIGN KEY ("uniformaId") REFERENCES "inventory_items"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "benefits" ADD CONSTRAINT "benefits_halatId_fkey" FOREIGN KEY ("halatId") REFERENCES "inventory_items"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "benefits" ADD CONSTRAINT "benefits_ciupiciId_fkey" FOREIGN KEY ("ciupiciId") REFERENCES "inventory_items"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "benefits" ADD CONSTRAINT "benefits_vestaId_fkey" FOREIGN KEY ("vestaId") REFERENCES "inventory_items"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "benefits" ADD CONSTRAINT "benefits_aparatTelefonId_fkey" FOREIGN KEY ("aparatTelefonId") REFERENCES "inventory_items"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/apps/api/prisma/migrations/20260525120000_add_anexa4_risk_card_fields/migration.sql b/apps/api/prisma/migrations/20260525120000_add_anexa4_risk_card_fields/migration.sql new file mode 100644 index 0000000..d9b98c8 --- /dev/null +++ b/apps/api/prisma/migrations/20260525120000_add_anexa4_risk_card_fields/migration.sql @@ -0,0 +1,52 @@ +-- CreateEnum +CREATE TYPE "RiskExposureType" AS ENUM ('AGENT_CHIMIC', 'PULBERI', 'AGENT_BIOLOGIC', 'ZGOMOT', 'VIBRATII', 'CAMP_ELECTROMAGNETIC', 'RADIATII_OPTICE'); + +-- AlterTable +ALTER TABLE "workplace_risk_cards" ADD COLUMN "adresaFiliala" TEXT, +ADD COLUMN "anexeIgienicoSanitare" JSONB, +ADD COLUMN "caemDiviziune" TEXT, +ADD COLUMN "caemPrimeleDouaCifre" TEXT, +ADD COLUMN "clasaConditiilorDeMunca" TEXT, +ADD COLUMN "cormSubgrupaMajora" TEXT, +ADD COLUMN "directiaSectiaSectorul" TEXT, +ADD COLUMN "echipamentLucru" TEXT, +ADD COLUMN "evaluareDetalii" JSONB, +ADD COLUMN "filiala" TEXT, +ADD COLUMN "mijloaceProtectieColectiva" TEXT, +ADD COLUMN "mijloaceProtectieIndividuala" TEXT, +ADD COLUMN "numarLucratoriPosibili" INTEGER, +ADD COLUMN "numarulLoculuiDeMunca" TEXT, +ADD COLUMN "observatii" TEXT, +ADD COLUMN "radiatiiAparatura" TEXT, +ADD COLUMN "radiatiiGrupa" TEXT, +ADD COLUMN "radiatiiIonizante" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "radiatiiMasuriProtectie" TEXT, +ADD COLUMN "radiatiiSurse" TEXT, +ADD COLUMN "radiatiiTipExpunere" TEXT, +ALTER COLUMN "riskFactors" DROP NOT NULL; + +-- CreateTable +CREATE TABLE "workplace_risk_exposures" ( + "id" TEXT NOT NULL, + "cardId" TEXT NOT NULL, + "tip" "RiskExposureType" NOT NULL, + "denumire" TEXT NOT NULL, + "cas" TEXT, + "einecs" TEXT, + "clasificare" TEXT, + "zonaAfectata" TEXT, + "timpExpunere" TEXT, + "vep" TEXT, + "vlep" TEXT, + "caracteristici" TEXT, + "procesVerbal" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "workplace_risk_exposures_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE INDEX "workplace_risk_exposures_cardId_idx" ON "workplace_risk_exposures"("cardId"); + +-- AddForeignKey +ALTER TABLE "workplace_risk_exposures" ADD CONSTRAINT "workplace_risk_exposures_cardId_fkey" FOREIGN KEY ("cardId") REFERENCES "workplace_risk_cards"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/apps/api/prisma/migrations/20260526120000_add_overexposure_tipfisa_anexa4a/migration.sql b/apps/api/prisma/migrations/20260526120000_add_overexposure_tipfisa_anexa4a/migration.sql new file mode 100644 index 0000000..9059067 --- /dev/null +++ b/apps/api/prisma/migrations/20260526120000_add_overexposure_tipfisa_anexa4a/migration.sql @@ -0,0 +1,27 @@ +-- AlterEnum +ALTER TYPE "AnexaType" ADD VALUE 'ANEXA_4A'; + +-- CreateEnum +CREATE TYPE "OverexposureKind" AS ENUM ('EXCEPTIONALA', 'ACCIDENTALA'); + +-- AlterTable +ALTER TABLE "workplace_risk_cards" ADD COLUMN "tipFisa" TEXT NOT NULL DEFAULT 'STANDARD'; + +-- CreateTable +CREATE TABLE "radiation_overexposures" ( + "id" TEXT NOT NULL, + "medicalProfileId" TEXT NOT NULL, + "fel" "OverexposureKind" NOT NULL, + "tipExpunere" TEXT, + "data" DATE, + "dozaMsv" DECIMAL(10,4), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "radiation_overexposures_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE INDEX "radiation_overexposures_medicalProfileId_idx" ON "radiation_overexposures"("medicalProfileId"); + +-- AddForeignKey +ALTER TABLE "radiation_overexposures" ADD CONSTRAINT "radiation_overexposures_medicalProfileId_fkey" FOREIGN KEY ("medicalProfileId") REFERENCES "employee_medical_profiles"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/apps/api/prisma/migrations/20260527153000_docx_template_fill_fields/migration.sql b/apps/api/prisma/migrations/20260527153000_docx_template_fill_fields/migration.sql new file mode 100644 index 0000000..3d1f577 --- /dev/null +++ b/apps/api/prisma/migrations/20260527153000_docx_template_fill_fields/migration.sql @@ -0,0 +1,6 @@ +ALTER TABLE "workplace_risk_cards" +ADD COLUMN "telefonFiliala" TEXT; + +ALTER TABLE "medical_checkups" +ADD COLUMN "valabilPanaLa" DATE, +ADD COLUMN "semnatDe" TEXT; diff --git a/apps/api/prisma/migrations/migration_lock.toml b/apps/api/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..fbffa92 --- /dev/null +++ b/apps/api/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/apps/api/prisma/schema.prisma b/apps/api/prisma/schema.prisma new file mode 100644 index 0000000..3d703e6 --- /dev/null +++ b/apps/api/prisma/schema.prisma @@ -0,0 +1,829 @@ +// HRM Medpark — Prisma Schema +// Phase 1: Employee Master Data + Department + AuditLog +// Phase 2 stubs: EmploymentContract +// Phase 4 stubs: EvaluationCampaign, EvaluationForm +// Phase 5 stubs: WorkplaceRiskCard, EmployeeMedicalProfile, MedicalCheckup + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +// ═══════════════════════════════════════════════════════════════ +// ENUMS +// ═══════════════════════════════════════════════════════════════ + +enum Sex { + F + M +} + +enum MaritalStatus { + casatorit + necasatorit + divortat + vaduv +} + +enum EmployeeStatus { + activ + concediat + suspendat +} + +enum DocumentType { + buletin_de_identitate + pasaport +} + +enum FamilyMemberType { + contact_principal + sot + sotie + mama + tata + copil +} + +enum StudyType { + superioare + medii_de_specialitate + secundare_tehnice + medii +} + +enum StudyLevel { + de_baza + postuniversitar +} + +enum PostUniversityType { + masterat + rezidentiat + secundariat + altele +} + +enum DiplomaStatus { + confirmata + neconfirmata +} + +enum QualificationCategory { + fara + cat_II + cat_I + superioara +} + +enum ScientificTitle { + doctor + doctor_habilitat +} + +enum TrainingType { + orientare + intern + extern_RM + extern_international +} + +enum DisciplinarySanctionType { + avertisment + mustrare + mustrare_aspra +} + +// Phase 2 +enum ContractPeriod { + determinata + nedeterminata + replasare_temporara +} + +enum ContractCategory { + principal + secundar +} + +enum ContractType { + de_baza + cumul +} + +enum SalaryType { + fix + pe_ore + in_acord +} + +// Phase 4 +enum CampaignStatus { + draft + scheduled + in_progress + closed +} + +enum EvaluationScore { + slab + mediu + bine +} + +enum ProposedCategory { + fara + cat_II + cat_I + superioara +} + +// Phase 5 +enum MedicalCheckupType { + la_angajare + periodic + la_reluarea_activitatii + la_incetarea_expunerii + suplimentar +} + +enum MedicalVerdict { + apt + apt_perioada_adaptare + apt_conditionat + inapt_temporar + inapt +} + +enum AnexaType { + ANEXA_3 + ANEXA_4 + ANEXA_4A + ANEXA_4B + ANEXA_6 +} + +// Tipuri de factori cu tabel de expunere în Anexa 4 (NU-10-MS-2026) +enum RiskExposureType { + AGENT_CHIMIC + PULBERI + AGENT_BIOLOGIC + ZGOMOT + VIBRATII + CAMP_ELECTROMAGNETIC + RADIATII_OPTICE +} + +// Tipul supraexpunerii la radiații ionizante (Anexa 4B) +enum OverexposureKind { + EXCEPTIONALA + ACCIDENTALA +} + +// ═══════════════════════════════════════════════════════════════ +// СПРАВОЧНИКИ +// ═══════════════════════════════════════════════════════════════ + +model DisabilityGrade { + id String @id @default(uuid()) + code String @unique + name String + employees Employee[] + + @@map("disability_grades") +} + +model TaxExemption { + id String @id @default(uuid()) + code String @unique + description String + familyMembers FamilyMember[] + + @@map("tax_exemptions") +} + +model WorkSchedule { + id String @id @default(uuid()) + name String @unique // "5/2 8h", "7/7 12h" + daysWork Int + daysRest Int + hoursPerDay Int + contracts EmploymentContract[] + + @@map("work_schedules") +} + +// ═══════════════════════════════════════════════════════════════ +// DEPARTMENT — иерархия (adjacency list) +// ═══════════════════════════════════════════════════════════════ + +model Department { + id String @id @default(uuid()) + name String + code String? @unique + parentId String? + parent Department? @relation("DeptTree", fields: [parentId], references: [id]) + children Department[] @relation("DeptTree") + + contracts EmploymentContract[] + campaigns EvaluationCampaign[] + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([parentId]) + @@map("departments") +} + +// ═══════════════════════════════════════════════════════════════ +// EMPLOYEE — ядро системы +// ═══════════════════════════════════════════════════════════════ + +model Employee { + id String @id @default(uuid()) + // IDNP — 13 цифр, алгоритм контрольной суммы валидируется на app-уровне + idnp String @unique @db.VarChar(13) + + // A. Личная информация + nume String + prenume String + patronimic String? + numeAnterior String? + dataNasterii DateTime @db.Date + domiciliu String + adresaReala String? + telefonPersonal String + telefonServiciu String? + emailPersonal String? + emailCorporativ String? + sex Sex + codCpas String? + stareCivila MaritalStatus? + + // Научное/университетское звание (уровень Employee, не Qualification) + titluStiintific ScientificTitle? + titluUniversitar String? + + status EmployeeStatus @default(activ) + + gradDizabilitateId String? + gradDizabilitate DisabilityGrade? @relation(fields: [gradDizabilitateId], references: [id]) + + // Кто рекомендовал (самоссылка) + // Бизнес-правило: нельзя выбрать супруга текущего сотрудника — проверка на service-уровне + recomandareInternaId String? + recomandareInterna Employee? @relation("Recomandari", fields: [recomandareInternaId], references: [id]) + recomandat Employee[] @relation("Recomandari") + + // Связанные сущности + identityDocuments IdentityDocument[] + familyMembers FamilyMember[] + educations Education[] + qualifications Qualification[] + trainings Training[] + disciplinarySanctions DisciplinarySanction[] + contracts EmploymentContract[] + benefit Benefit? + evaluationForms EvaluationForm[] + medicalProfile EmployeeMedicalProfile? + medicalCheckups MedicalCheckup[] + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([idnp]) + @@index([nume, prenume]) + @@index([status]) + @@index([dataNasterii]) + @@map("employees") +} + +// ═══════════════════════════════════════════════════════════════ +// B. IDENTITY DOCUMENT +// ═══════════════════════════════════════════════════════════════ + +model IdentityDocument { + id String @id @default(uuid()) + employeeId String + employee Employee @relation(fields: [employeeId], references: [id], onDelete: Cascade) + tipAct DocumentType + seria String? + nr String + dataEmiterii DateTime @db.Date + autoritateEmitenta String + dataExpirarii DateTime @db.Date + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Cron-задача за 30 дней до dataExpirarii → HR Inbox + @@index([employeeId]) + @@index([dataExpirarii]) + @@map("identity_documents") +} + +// ═══════════════════════════════════════════════════════════════ +// C. FAMILY MEMBERS +// ═══════════════════════════════════════════════════════════════ + +model FamilyMember { + id String @id @default(uuid()) + employeeId String + employee Employee @relation(fields: [employeeId], references: [id], onDelete: Cascade) + tip FamilyMemberType + numePrenume String + dataNasterii DateTime? @db.Date + idnp String? @db.VarChar(13) + telefon String? // обязателен для contact_principal — проверка на service-уровне + + // Скидки FISC (только для copil) + tipScutireId String? + tipScutire TaxExemption? @relation(fields: [tipScutireId], references: [id]) + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([employeeId]) + @@map("family_members") +} + +// ═══════════════════════════════════════════════════════════════ +// D. EDUCATION +// ═══════════════════════════════════════════════════════════════ + +model Education { + id String @id @default(uuid()) + employeeId String + employee Employee @relation(fields: [employeeId], references: [id], onDelete: Cascade) + tipStudii StudyType + institutia String + specialitatea String + dataAbsolvirii DateTime? @db.Date + nrSeriaDiploma String? + dataEmiterii DateTime? @db.Date + nrInregistrare String? + confirmare DiplomaStatus? + nivel StudyLevel? + tipPostuniversitar PostUniversityType? + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([employeeId]) + @@map("educations") +} + +// ═══════════════════════════════════════════════════════════════ +// E. QUALIFICATIONS +// ═══════════════════════════════════════════════════════════════ + +model Qualification { + id String @id @default(uuid()) + employeeId String + employee Employee @relation(fields: [employeeId], references: [id], onDelete: Cascade) + categorie QualificationCategory + dataObtinerii DateTime? @db.Date + dataUltimeiConfirmari DateTime? @db.Date + dataExpirarii DateTime? @db.Date + specialitate String? + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Cron-задача за 90/30/7 дней до dataExpirarii → HR + manager + @@index([employeeId]) + @@index([dataExpirarii]) + @@map("qualifications") +} + +// ═══════════════════════════════════════════════════════════════ +// F. TRAINING +// ═══════════════════════════════════════════════════════════════ + +model Training { + id String @id @default(uuid()) + employeeId String + employee Employee @relation(fields: [employeeId], references: [id], onDelete: Cascade) + denumire String + inceput DateTime @db.Date + sfirsit DateTime? @db.Date + tip TrainingType + tara String? + nrOre Int? + organizatia String? + certificat Boolean @default(false) + cost Decimal? @db.Decimal(10, 2) + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([employeeId]) + @@map("trainings") +} + +// ═══════════════════════════════════════════════════════════════ +// G. DISCIPLINARY SANCTIONS +// ═══════════════════════════════════════════════════════════════ + +model DisciplinarySanction { + id String @id @default(uuid()) + employeeId String + employee Employee @relation(fields: [employeeId], references: [id], onDelete: Cascade) + tip DisciplinarySanctionType + dataAplicarii DateTime @db.Date + // auto-calc: dataAplicarii + 6 months — вычисляется на service-уровне при создании + dataExpirarii DateTime @db.Date + // set true cron-ом после dataExpirarii; до этого — активна при расчёте performance + isStinsa Boolean @default(false) + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([employeeId]) + @@index([dataExpirarii]) + @@map("disciplinary_sanctions") +} + +// ═══════════════════════════════════════════════════════════════ +// H. BENEFITS +// ═══════════════════════════════════════════════════════════════ + +model Benefit { + id String @id @default(uuid()) + employeeId String @unique + employee Employee @relation(fields: [employeeId], references: [id], onDelete: Cascade) + + uniformaId String? + uniforma InventoryItem? @relation("BenefitUniforma", fields: [uniformaId], references: [id]) + halatId String? + halat InventoryItem? @relation("BenefitHalat", fields: [halatId], references: [id]) + ciupiciId String? + ciupici InventoryItem? @relation("BenefitCiupici", fields: [ciupiciId], references: [id]) + vestaId String? + vesta InventoryItem? @relation("BenefitVesta", fields: [vestaId], references: [id]) + + ticheteMasa Boolean @default(false) + valoareTichet Decimal? @db.Decimal(10, 2) + alimentatiePersonal Boolean @default(false) + abonamentTel Decimal? @db.Decimal(10, 2) + aparatTelefonId String? + aparatTelefon InventoryItem? @relation("BenefitAparatTel", fields: [aparatTelefonId], references: [id]) + cardCompanie String? + automobilServiciu String? + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@map("benefits") +} + +enum InventoryItemType { + uniforma + halat + ciupici + vesta + aparat_telefon + alte +} + +model InventoryItem { + id String @id @default(uuid()) + sku String @unique + name String + type InventoryItemType + size String? + color String? + pricePerUnit Decimal? @db.Decimal(10, 2) + stockQty Int @default(0) + active Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + uniformaBenefits Benefit[] @relation("BenefitUniforma") + halatBenefits Benefit[] @relation("BenefitHalat") + ciupiciBenefits Benefit[] @relation("BenefitCiupici") + vestaBenefits Benefit[] @relation("BenefitVesta") + aparatTelBenefits Benefit[] @relation("BenefitAparatTel") + + @@index([type, active]) + @@map("inventory_items") +} + +// ═══════════════════════════════════════════════════════════════ +// PHASE 2 STUB: EMPLOYMENT CONTRACT +// ═══════════════════════════════════════════════════════════════ + +model EmploymentContract { + id String @id @default(uuid()) + nrCim String @unique + employeeId String + employee Employee @relation(fields: [employeeId], references: [id]) + categorie ContractCategory + dataSemnarii DateTime @db.Date + dataAngajarii DateTime @db.Date + dataDemisiei DateTime? @db.Date + perioada ContractPeriod + dataTerminarii DateTime? @db.Date + functiaClasificator String? // CORM код + codFunctie String? + functiaOrganigrama String? + tipCim ContractType + departmentId String + department Department @relation(fields: [departmentId], references: [id]) + regimMunca String? + tipSalarizare SalaryType? + // Условные поля salariu_fix / pe_ore / in_acord хранятся как JSONB + salarizareDetails Json? + clausaAditionala Json? + workScheduleId String? + workSchedule WorkSchedule? @relation(fields: [workScheduleId], references: [id]) + + categoriiServicii CimServiceCategory[] + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Бизнес-правило: zile_concediu = MAX среди всех CIM сотрудника — проверка на service-уровне + @@index([employeeId]) + @@index([departmentId]) + @@index([dataDemisiei]) + @@map("employment_contracts") +} + +model CimServiceCategory { + id String @id @default(uuid()) + contractId String + contract EmploymentContract @relation(fields: [contractId], references: [id], onDelete: Cascade) + categorieId String + tipRemunerare String // 'tarif' | 'procent' + sumaNeta Decimal? @db.Decimal(10, 2) + procent Decimal? @db.Decimal(5, 2) + + @@index([contractId]) + @@map("cim_service_categories") +} + +// ═══════════════════════════════════════════════════════════════ +// PHASE 4 STUB: PERFORMANCE EVALUATION +// ═══════════════════════════════════════════════════════════════ + +model EvaluationCampaign { + id String @id @default(uuid()) + name String + departmentId String + department Department @relation(fields: [departmentId], references: [id]) + month DateTime @db.Date // первый день месяца кампании + status CampaignStatus @default(draft) + forms EvaluationForm[] + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([departmentId]) + @@index([month]) + @@map("evaluation_campaigns") +} + +model EvaluationForm { + id String @id @default(uuid()) + campaignId String + campaign EvaluationCampaign @relation(fields: [campaignId], references: [id], onDelete: Cascade) + employeeId String + employee Employee @relation(fields: [employeeId], references: [id]) + + // A. Competente clinice (slab/mediu/bine) + abilitatiClinice EvaluationScore? + judecataClinica EvaluationScore? + manopere EvaluationScore? + gestionareaSarcinilor EvaluationScore? + + // B. Comunicare si empatie + constiintaProfesionala EvaluationScore? + atitudineaPacienti EvaluationScore? + atitudineaColegi EvaluationScore? + atitudineaPersonalNonMed EvaluationScore? + + // C. Disciplina + utilizareSmartphone EvaluationScore? + respectareaProgramului EvaluationScore? + respectareaDressCode EvaluationScore? + + // D. Documentatie si complianta + testJci Json? // { score, max_score, percent, completed_at, source, external_id } + completareaDocMed Boolean? + perfectioneazaCunostinte Boolean? + + // E. Candidat EXPERT (Da/Nu) + membruComitetCalitate Boolean? + functieDeMonitor Boolean? + inlocuiesteSuperiorul Boolean? + + // F. Verdict final + categorieCalculata ProposedCategory? + categorieAprobata ProposedCategory? // override de nursing_director + observatii String? + + completedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@unique([campaignId, employeeId]) + @@index([campaignId]) + @@index([employeeId]) + @@map("evaluation_forms") +} + +// ═══════════════════════════════════════════════════════════════ +// PHASE 5 STUB: MEDICAL CONTROL +// ═══════════════════════════════════════════════════════════════ + +model WorkplaceRiskCard { + id String @id @default(uuid()) + name String @unique // "Medic profil chirurgical cu gărzi de noapte" + riskFactors Json? // legacy: { chimici, fizici, biologici, ergonomici, psihosociali } + profiles EmployeeMedicalProfile[] + + // ── Anexa 4 — antet (Fișa de evaluare a riscurilor profesionale) ── + filiala String? + adresaFiliala String? + telefonFiliala String? + caemPrimeleDouaCifre String? + cormSubgrupaMajora String? + directiaSectiaSectorul String? + numarulLoculuiDeMunca String? + caemDiviziune String? + clasaConditiilorDeMunca String? + numarLucratoriPosibili Int? + // STANDARD (Anexa 4) | DISTANTA_DIGITAL (Anexa 4A — muncă la distanță/platforme digitale) + tipFisa String @default("STANDARD") + + // ── Anexa 4 — bloc descriptiv (checkbox-uri / descrieri) ── + evaluareDetalii Json? + + // ── Anexa 4 — radiații ionizante (per loc de muncă) ── + radiatiiIonizante Boolean @default(false) + radiatiiGrupa String? // A | B + radiatiiAparatura String? + radiatiiSurse String? // inchise | deschise + radiatiiTipExpunere String? // X externă | gamma externă | internă | externă și internă + radiatiiMasuriProtectie String? + + // ── Anexa 4 — subsol ── + mijloaceProtectieColectiva String? + mijloaceProtectieIndividuala String? + echipamentLucru String? + observatii String? + anexeIgienicoSanitare Json? // { vestiar, chiuveta, wc, dus, salaMese, recreere } + + exposures WorkplaceRiskExposure[] + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@map("workplace_risk_cards") +} + +// Rând din tabelele factoriale ale Anexei 4 +model WorkplaceRiskExposure { + id String @id @default(uuid()) + cardId String + card WorkplaceRiskCard @relation(fields: [cardId], references: [id], onDelete: Cascade) + tip RiskExposureType + denumire String + cas String? // doar chimic / pulberi + einecs String? // doar chimic / pulberi + clasificare String? // doar agent biologic + zonaAfectata String? // vibrații / câmp EM / radiații optice + timpExpunere String? + vep String? // valoarea de expunere profesională + vlep String? // valoarea-limită de expunere profesională obligatorie + caracteristici String? + procesVerbal String? + + createdAt DateTime @default(now()) + + @@index([cardId]) + @@map("workplace_risk_exposures") +} + +model EmployeeMedicalProfile { + id String @id @default(uuid()) + employeeId String @unique + employee Employee @relation(fields: [employeeId], references: [id], onDelete: Cascade) + ocupatieCorm String? + workplaceRiskCardId String? + workplaceRiskCard WorkplaceRiskCard? @relation(fields: [workplaceRiskCardId], references: [id]) + dataUltimControlMedical DateTime? @db.Date + + // Câmpuri radiații ionizante + expusRadiatiiIonizante Boolean @default(false) + dataIntrarii DateTime? @db.Date + expunereAnterioaraPerioda String? // se completează o singură dată la angajare + expunereAnterioaraAni Int? + dozaCumulataExternaMsv Decimal? @db.Decimal(10, 4) + dozaCumulataInternaMsv Decimal? @db.Decimal(10, 4) + // dozaTotalaMsv = externa + interna — câmp calculat, nu stocat + + // Supraexpuneri excepționale/accidentale (Anexa 4B) + overexposures RadiationOverexposure[] + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@map("employee_medical_profiles") +} + +// Supraexpunere la radiații ionizante — rând din Anexa 4B (per lucrător) +model RadiationOverexposure { + id String @id @default(uuid()) + medicalProfileId String + medicalProfile EmployeeMedicalProfile @relation(fields: [medicalProfileId], references: [id], onDelete: Cascade) + fel OverexposureKind // EXCEPTIONALA | ACCIDENTALA + tipExpunere String? // X externă | gamma externă | internă | externă și internă + data DateTime? @db.Date + dozaMsv Decimal? @db.Decimal(10, 4) + createdAt DateTime @default(now()) + + @@index([medicalProfileId]) + @@map("radiation_overexposures") +} + +model MedicalCheckup { + id String @id @default(uuid()) + employeeId String + employee Employee @relation(fields: [employeeId], references: [id]) + tip MedicalCheckupType + dataPlanificata DateTime @db.Date + dataEfectuata DateTime? @db.Date + verdict MedicalVerdict? + recomandari String? + valabilPanaLa DateTime? @db.Date + semnatDe String? + // Ссылки на S3-документы: [{ name, url, type }] + documenteGenerate Json? + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([employeeId]) + @@index([dataPlanificata]) + @@map("medical_checkups") +} + +// ═══════════════════════════════════════════════════════════════ +// AUDIT LOG — append-only, 5 ani retentie +// ═══════════════════════════════════════════════════════════════ + +model AuditLog { + id BigInt @id @default(autoincrement()) + ts DateTime @default(now()) + userId String + userRole String @db.VarChar(50) + ip String? @db.VarChar(45) // IPv4 или IPv6 + action String @db.VarChar(20) // READ | CREATE | UPDATE | DELETE | EXPORT + entity String @db.VarChar(50) + entityId String @db.VarChar(50) + field String? @db.VarChar(100) + // PII-значения шифруются на app-уровне (pgcrypto / KMS) перед записью + oldValue String? + newValue String? + reason String? // обязателен для READ медицинских данных (GDPR) + + @@index([userId]) + @@index([entity, entityId]) + @@index([ts]) + @@map("audit_logs") +} + +// ═══════════════════════════════════════════════════════════════ +// ANEXA TEMPLATE EDITOR +// ═══════════════════════════════════════════════════════════════ + +model AnexaTemplate { + id String @id @default(uuid()) + type AnexaType @unique + name String + contentJson Json + updatedById String + updatedAt DateTime @updatedAt + versions AnexaTemplateVersion[] + + @@map("anexa_templates") +} + +model AnexaTemplateVersion { + id String @id @default(uuid()) + templateId String + template AnexaTemplate @relation(fields: [templateId], references: [id], onDelete: Cascade) + contentJson Json + savedById String + savedAt DateTime @default(now()) + label String? + + @@index([templateId]) + @@map("anexa_template_versions") +} diff --git a/apps/api/prisma/seed.ts b/apps/api/prisma/seed.ts new file mode 100644 index 0000000..5ab0054 --- /dev/null +++ b/apps/api/prisma/seed.ts @@ -0,0 +1,738 @@ +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +async function main() { + console.log('🌱 Seeding reference data...'); + + // ── Disability Grades (grade de dizabilitate MD) ───────────────── + await prisma.disabilityGrade.createMany({ + data: [ + { code: 'GRAD_I', name: 'Grad I (sever)' }, + { code: 'GRAD_II', name: 'Grad II (accentuat)' }, + { code: 'GRAD_III', name: 'Grad III (mediu)' }, + ], + skipDuplicates: true, + }); + console.log(' ✓ DisabilityGrade (3)'); + + // ── Tax Exemptions (scutiri Codul Fiscal RM) ───────────────────── + await prisma.taxExemption.createMany({ + data: [ + { code: 'PE', description: 'Scutire personală (art. 33 CF)' }, + { code: 'PI', description: 'Scutire personală majorată (art. 33 alin. 2 CF)' }, + { code: 'SO', description: 'Scutire pentru soț/soție (art. 34 CF)' }, + { code: 'MP1', description: 'Scutire pentru 1 copil minor (art. 35 CF)' }, + { code: 'MP2', description: 'Scutire pentru 2 copii minori (art. 35 CF)' }, + { code: 'MP3', description: 'Scutire pentru 3+ copii minori (art. 35 CF)' }, + { code: 'INVALID', description: 'Scutire persoană cu dizabilitate (art. 33 alin. 2 lit. a CF)' }, + ], + skipDuplicates: true, + }); + console.log(' ✓ TaxExemption (7)'); + + // ── Work Schedules ─────────────────────────────────────────────── + await prisma.workSchedule.createMany({ + data: [ + { name: '5/2 — 8h/zi', daysWork: 5, daysRest: 2, hoursPerDay: 8 }, + { name: '5/2 — 7h/zi', daysWork: 5, daysRest: 2, hoursPerDay: 7 }, + { name: 'Gărzi 24h (1/3)', daysWork: 1, daysRest: 3, hoursPerDay: 24 }, + { name: 'Gărzi 12h zi (1/1)', daysWork: 1, daysRest: 1, hoursPerDay: 12 }, + { name: 'Gărzi 12h noapte (1/1)',daysWork: 1, daysRest: 1, hoursPerDay: 12 }, + { name: '7/7 — 12h/zi', daysWork: 7, daysRest: 7, hoursPerDay: 12 }, + { name: 'Rotație 2/2 — 12h', daysWork: 2, daysRest: 2, hoursPerDay: 12 }, + ], + skipDuplicates: true, + }); + console.log(' ✓ WorkSchedule (7)'); + + // ── Departments — Medpark International Hospital ───────────────── + // Level 0: hospital root + const root = await prisma.department.upsert({ + where: { code: 'MEDPARK' }, + update: {}, + create: { name: 'Medpark International Hospital', code: 'MEDPARK' }, + }); + + // Helper to upsert a department + const dept = async (name: string, code: string, parentId?: string) => + prisma.department.upsert({ + where: { code }, + update: {}, + create: { name, code, parentId: parentId ?? null }, + }); + + // Administration + const admin = await dept('Administrare', 'ADMIN', root.id); + await dept('Resurse Umane', 'HR', admin.id); + await dept('Financiar-Contabil', 'FIN', admin.id); + await dept('Juridic', 'JUR', admin.id); + await dept('IT', 'IT', admin.id); + await dept('Achiziții', 'ACHIZ', admin.id); + + // Medical divisions + const med = await dept('Bloc Medical', 'MED', root.id); + + const terapie = await dept('Terapie și Medicină Internă', 'TERAP', med.id); + await dept('Cardiologie', 'CARDIO', terapie.id); + await dept('Gastroenterologie', 'GASTRO', terapie.id); + await dept('Endocrinologie', 'ENDO', terapie.id); + await dept('Neurologie', 'NEURO', terapie.id); + await dept('Pneumologie', 'PNEUMO', terapie.id); + await dept('Reumatologie', 'REUMA', terapie.id); + + const chir = await dept('Chirurgie', 'CHIR', med.id); + await dept('Chirurgie Generală', 'CHIR_GEN', chir.id); + await dept('Chirurgie Vasculară', 'CHIR_VAS', chir.id); + await dept('Ortopedie și Traumatologie','ORTOPED', chir.id); + await dept('Urologie', 'UROL', chir.id); + await dept('ORL', 'ORL', chir.id); + await dept('Oftalmologie', 'OFTALMO', chir.id); + + const ped = await dept('Pediatrie', 'PED', med.id); + await dept('Pediatrie Generală', 'PED_GEN', ped.id); + await dept('Neonatologie', 'NEONAT', ped.id); + + const obst = await dept('Obstetrică-Ginecologie', 'OBG', med.id); + await dept('Obstetrică', 'OBSTET', obst.id); + await dept('Ginecologie', 'GINECO', obst.id); + + await dept('Oncologie', 'ONCOL', med.id); + await dept('Hemodializă', 'HEMODIAL', med.id); + await dept('Psihiatrie', 'PSIHIAT', med.id); + await dept('Dermatologie', 'DERMA', med.id); + await dept('Medicină Sportivă și Reabilitare', 'REAB', med.id); + + // Diagnostics + const diag = await dept('Diagnostic', 'DIAG', root.id); + await dept('Laborator Clinic', 'LAB', diag.id); + await dept('Imagistică Medicală (CT/RMN/Rx)', 'IMAG', diag.id); + await dept('Endoscopie', 'ENDOSC', diag.id); + await dept('Ecografie', 'ECO', diag.id); + await dept('Cardiologie Funcțională (ECG/Holter)', 'ECG', diag.id); + + // Support + const suport = await dept('Servicii Suport', 'SUPORT', root.id); + await dept('Urgențe (UPU)', 'UPU', suport.id); + await dept('Anestezie și Terapie Intensivă (ATI)', 'ATI', suport.id); + await dept('Bloc Operator', 'BLOC_OP', suport.id); + await dept('Sterilizare', 'STERIL', suport.id); + await dept('Farmacie', 'FARMACIE', suport.id); + await dept('Nutriție și Dietetică', 'NUTRIT', suport.id); + await dept('Serviciu Social', 'SOC', suport.id); + await dept('Curățenie și Dezinfecție', 'CURATENIE',suport.id); + await dept('Securitate', 'SECUR', suport.id); + await dept('Tehnică Medicală', 'TEH_MED', suport.id); + + // Ambulatory + const ambul = await dept('Centru Ambulator', 'AMBUL', root.id); + await dept('Medicină de Familie', 'MED_FAM', ambul.id); + await dept('Consultații Specializate', 'CONSULT', ambul.id); + await dept('Fizioterapie', 'FIZIOTER', ambul.id); + + const deptCount = await prisma.department.count(); + console.log(` ✓ Department (${deptCount})`); + + // ── Anexa Templates — minimal seed ───────────────────────── + const heading = (text: string, level = 2) => ({ + type: 'heading', + attrs: { level, textAlign: 'center' }, + content: [{ type: 'text', text }], + }); + const para = (content: object[], textAlign: string = 'left') => ({ + type: 'paragraph', + attrs: { textAlign }, + content, + }); + const txt = (text: string, marks?: { type: string }[]) => + marks ? { type: 'text', text, marks } : { type: 'text', text }; + const chip = (key: string, label: string) => ({ + type: 'variableChip', + attrs: { key, label }, + }); + const cell = (content: object[]) => ({ type: 'tableCell', content }); + const row = (cells: object[]) => ({ type: 'tableRow', content: cells }); + const headerRow = (labels: string[]) => + row(labels.map((l) => cell([para([txt(l, [{ type: 'bold' }])], 'center')]))); + + // ── Anexa 3: Fișa de solicitare ───────────────────────────────── + const anexa3 = { + type: 'doc', + content: [ + heading('FIȘA DE SOLICITARE A EXAMENULUI MEDICAL'), + para([txt('Unitatea economică: '), chip('company.name', 'Denumirea unității')]), + para([txt('IDNO: '), chip('company.idno', 'IDNO'), txt(' Adresa: '), chip('company.address', 'Adresa')]), + para([txt('Tipul examenului: '), chip('tipExamen', 'Tipul examenului')]), + para([txt('Departament: '), chip('department.name', 'Departament'), txt(' Carta de risc: '), chip('riskCard.name', 'Carta de risc')]), + para([txt('Data: '), chip('document.date', 'Data documentului'), txt(' Nr.: '), chip('document.number', 'Număr')]), + para([txt('Lista angajaților:', [{ type: 'bold' }])]), + { + type: 'table', + attrs: { repeatRows: true }, + content: [ + headerRow(['Nr.', 'Nume Prenume', 'IDNP', 'Anul nașterii', 'Ocupația', 'Tipul examenului']), + row([ + cell([para([chip('row.index', 'Nr.')])]), + cell([para([chip('row.employeeName', 'Nume Prenume')])]), + cell([para([chip('row.idnp', 'IDNP')])]), + cell([para([chip('row.birthYear', 'Anul nașterii')])]), + cell([para([chip('row.occupation', 'Ocupația')])]), + cell([para([chip('row.tipExamen', 'Tipul examenului')])]), + ]), + ], + }, + ], + }; + + // ── Anexa 4: Fișa de evaluare a riscurilor profesionale (NU-10-MS-2026) ── + const cb = (key: string, label: string) => [chip(`a4.cb.${key}`, '☐'), txt(' ' + label)]; + const factorTable = (rowsKey: string, cols: string[], rowChips: string[]) => ({ + type: 'table', + attrs: { repeatRows: true, rowsKey }, + content: [ + headerRow(cols), + row(rowChips.map((k) => cell([para([chip(k, '—')])]))), + ], + }); + + const anexa4 = { + type: 'doc', + content: [ + // ── Antet ── + para([txt('Unitatea economică/instituția: '), chip('a4.unitatea', 'Denumirea unității')]), + para([txt('Adresa, telefon, fax, e-mail: '), chip('a4.adresa', 'Adresa')]), + para([txt('Filiala: '), chip('a4.filiala', '—'), txt(' Adresa filialei: '), chip('a4.adresaFiliala', '—'), txt(' CAEM (primele 2 cifre): '), chip('a4.caem2', '—')]), + heading('FIȘA de evaluare a riscurilor profesionale', 2), + para([txt('Ocupația (subgrupa majoră CORM): '), chip('a4.cormSubgrupa', '—')]), + para([txt('Direcția/secția/sectorul: '), chip('a4.directiaSectia', '—')]), + para([txt('Numărul locului de muncă: '), chip('a4.numarLoc', '—'), txt(' CAEM (nivel diviziune): '), chip('a4.caemDiviziune', '—')]), + para([txt('Numărul de lucrători care pot activa la acest loc de muncă: '), chip('a4.numarLucratori', '—'), txt(' Clasa condițiilor de muncă: '), chip('a4.clasa', '—')]), + + // ── Descrierea activității ── + heading('Descrierea activității', 3), + para([txt('Lucrul în echipă: '), ...cb('echipa', 'da'), txt(' Nr. ore/zi: '), chip('a4.val.oreZi', '—'), txt(' Nr. schimburi: '), chip('a4.val.schimburi', '—')]), + para([...cb('schimbNoapte', 'schimb de noapte'), txt(' '), ...cb('pauzeOrganizate', 'pauze organizate')]), + para([txt('Riscuri: '), ...cb('riscInfectare', 'infectare'), txt(' '), ...cb('riscElectrocutare', 'electrocutare'), txt(' '), ...cb('riscTensiuneInalta', 'tensiune înaltă'), txt(' '), ...cb('riscInecare', 'înecare'), txt(' '), ...cb('riscAsfixiere', 'asfixiere')]), + para([...cb('riscStrivire', 'strivire'), txt(' '), ...cb('riscTaiere', 'tăiere'), txt(' '), ...cb('riscIntepare', 'înțepare'), txt(' '), ...cb('riscLovire', 'lovire'), txt(' '), ...cb('riscMuscatura', 'mușcătură'), txt(' '), ...cb('riscMicrotraumatisme', 'microtraumatisme repetate')]), + para([txt('Conduce mașina instituției: '), ...cb('conduceMasina', 'da'), txt(' categorie: '), chip('a4.val.conduceMasinaCategorie', '—'), txt(' '), ...cb('conduceUtilajeIntrauzinal', 'conduce utilaje numai intrauzinal')]), + + // ── Spațiul de lucru ── + heading('Descrierea spațiului de lucru', 3), + para([txt('Dimensiunile încăperii: L '), chip('a4.val.spatiuL', '—'), txt(' l '), chip('a4.val.spatiul', '—'), txt(' H '), chip('a4.val.spatiuH', '—'), txt(' m')]), + para([txt('Suprafața de lucru: '), ...cb('suprafataVerticala', 'verticală'), txt(' '), ...cb('suprafataOrizontala', 'orizontală'), txt(' '), ...cb('suprafataOblica', 'oblică')]), + para([txt('Muncă: '), ...cb('muncaIzolare', 'în condiții de izolare'), txt(' '), ...cb('muncaInaltime', 'la înălțime'), txt(' '), ...cb('muncaInMiscare', 'în mișcare')]), + + // ── Efort fizic ── + heading('Efort fizic', 3), + para([txt('Poziție preponderent: '), ...cb('pozitieOrtostatica', 'ortostatică'), txt(' '), ...cb('pozitieAsezat', 'așezat'), txt(' '), ...cb('pozitieAplecata', 'aplecată'), txt(' '), ...cb('pozitieMixta', 'mixtă'), txt(' '), ...cb('pozitieFortata', 'forțată/nefiziologică')]), + para([txt('Suprasolicitări musculo-articulare (coloană): '), ...cb('coloanaCervicala', 'cervicală'), txt(' '), ...cb('coloanaToracala', 'toracală'), txt(' '), ...cb('coloanaLombara', 'lombară')]), + para([txt('Manipulare manuală a maselor: '), ...cb('manipulareRidicare', 'ridicare'), txt(' '), ...cb('manipulareCoborare', 'coborâre'), txt(' '), ...cb('manipulareImpingere', 'împingere'), txt(' '), ...cb('manipulareTragere', 'tragere'), txt(' '), ...cb('manipularePurtare', 'purtare'), txt(' '), ...cb('manipulareDeplasare', 'deplasare')]), + para([txt('Greutate maximă manipulată manual: '), chip('a4.val.greutateMaxima', '—')]), + para([txt('Suprasolicitări: '), ...cb('suprasolicitariVizuale', 'vizuale'), txt(' '), ...cb('suprasolicitariAuditive', 'auditive'), txt(' '), ...cb('suprasolicitariNeuropsihice', 'neuropsihosenzoriale')]), + + // ── Factori de risc cu tabel ── + heading('AGENȚI CHIMICI', 3), + para([...cb('chimici_da', 'da'), txt(' '), ...cb('chimici_nu', 'nu'), txt(' (se atașează Fișa cu date de securitate, în limba română)')]), + factorTable('chimici', + ['Agentul chimic', 'CAS', 'EINECS', 'Timp expunere', 'VEP', 'VLEP obligatorie', 'Caracteristici'], + ['row.denumire', 'row.cas', 'row.einecs', 'row.timp', 'row.vep', 'row.vlep', 'row.caracteristici']), + + heading('PULBERI', 3), + para([...cb('pulberi_da', 'da'), txt(' '), ...cb('pulberi_nu', 'nu')]), + factorTable('pulberi', + ['Pulberi', 'CAS', 'EINECS', 'Timp expunere', 'VEP', 'VLEP obligatorie', 'Caracteristici'], + ['row.denumire', 'row.cas', 'row.einecs', 'row.timp', 'row.vep', 'row.vlep', 'row.caracteristici']), + + heading('AGENȚI BIOLOGICI', 3), + para([...cb('biologici_da', 'da'), txt(' '), ...cb('biologici_nu', 'nu')]), + factorTable('biologici', + ['Agent biologic', 'Clasificare', 'Note'], + ['row.denumire', 'row.clasificare', 'row.caracteristici']), + + heading('ZGOMOT PROFESIONAL', 3), + para([...cb('zgomot_da', 'da'), txt(' '), ...cb('zgomot_nu', 'nu')]), + factorTable('zgomot', + ['Tipul', 'Timp expunere', 'VEP', 'VLEP obligatorie', 'Caracteristici'], + ['row.denumire', 'row.timp', 'row.vep', 'row.vlep', 'row.caracteristici']), + + heading('VIBRAȚII MECANICE', 3), + para([...cb('vibratii_da', 'da'), txt(' '), ...cb('vibratii_nu', 'nu')]), + factorTable('vibratii', + ['Tipul', 'Zona afectată', 'Timp expunere', 'VEP', 'VLEP obligatorie', 'Caracteristici'], + ['row.denumire', 'row.zona', 'row.timp', 'row.vep', 'row.vlep', 'row.caracteristici']), + + // ── Microclimat (descriptiv) ── + heading('MICROCLIMAT', 3), + para([...cb('microclimatInterior', 'lucrări interior'), txt(' '), ...cb('microclimatExterior', 'lucru exterior/sub cerul liber')]), + para([txt('Radiații calorice (perioada rece): '), ...cb('radiatiiCaloriceRece', 'da'), txt(' Radiații calorice (perioada caldă): '), ...cb('radiatiiCaloriceCalda', 'da')]), + + // ── Radiații ionizante ── + heading('RADIAȚII IONIZANTE', 3), + para([...cb('radiatii_da', 'da'), txt(' '), ...cb('radiatii_nu', 'nu'), txt(' Grupa: '), chip('a4.rad.grupa', '—')]), + para([txt('Aparatură folosită: '), chip('a4.rad.aparatura', '—'), txt(' Surse: '), chip('a4.rad.surse', '—')]), + para([txt('Tip de expunere: '), chip('a4.rad.tipExpunere', '—'), txt(' Măsuri de protecție: '), chip('a4.rad.masuriProtectie', '—')]), + + // ── Câmp electromagnetic ── + heading('CÂMP ELECTROMAGNETIC', 3), + para([...cb('campEM_da', 'da'), txt(' '), ...cb('campEM_nu', 'nu')]), + factorTable('campEM', + ['Tipul', 'Zona afectată', 'Timp expunere', 'VEP', 'VLEP obligatorie', 'Caracteristici'], + ['row.denumire', 'row.zona', 'row.timp', 'row.vep', 'row.vlep', 'row.caracteristici']), + + // ── Iluminat ── + heading('ILUMINAT', 3), + para([...cb('iluminatSuficient', 'suficient'), txt(' '), ...cb('iluminatInsuficient', 'insuficient'), txt(' '), ...cb('iluminatNatural', 'natural'), txt(' '), ...cb('iluminatArtificial', 'artificial'), txt(' '), ...cb('iluminatMixt', 'mixt')]), + + // ── Radiații optice artificiale ── + heading('RADIAȚII OPTICE ARTIFICIALE', 3), + para([...cb('optice_da', 'da'), txt(' '), ...cb('optice_nu', 'nu')]), + factorTable('optice', + ['Tipul', 'Zona afectată', 'Timp expunere', 'VEP', 'VLEP obligatorie', 'Caracteristici'], + ['row.denumire', 'row.zona', 'row.timp', 'row.vep', 'row.vlep', 'row.caracteristici']), + + // ── Subsol ── + heading('Protecție și dotări', 3), + para([txt('Mijloace de protecție colectivă: '), chip('a4.protectieColectiva', '—')]), + para([txt('Mijloace de protecție individuală: '), chip('a4.protectieIndividuala', '—')]), + para([txt('Echipament de lucru: '), chip('a4.echipament', '—')]), + para([txt('Anexe igienico-sanitare: '), ...cb('anexe.vestiar', 'vestiar'), txt(' '), ...cb('anexe.chiuveta', 'chiuvetă'), txt(' '), ...cb('anexe.wc', 'WC'), txt(' '), ...cb('anexe.dus', 'duș'), txt(' '), ...cb('anexe.salaMese', 'sală de mese'), txt(' '), ...cb('anexe.recreere', 'spațiu de recreere')]), + para([txt('Observații: '), chip('a4.observatii', '—')]), + para([txt('Data completării: '), chip('document.date', 'Data')]), + para([txt('Angajatorul (nume, prenume, semnătura): ____________________')]), + para([txt('Instrucțiuni de completare: răspuns afirmativ [☑]; răspuns negativ [☐].', [{ type: 'italic' }])]), + ], + }; + + // ── Anexa 4B: Supliment radiații ionizante ─────────────────────── + const anexa4b = { + type: 'doc', + content: [ + heading('SUPLIMENT — EXPUNERE LA RADIAȚII IONIZANTE'), + para([txt('Unitatea economică: '), chip('company.name', 'Denumirea unității')]), + para([txt('Data: '), chip('document.date', 'Data documentului')]), + para([txt('Personal expus radiațiilor ionizante:', [{ type: 'bold' }])]), + { + type: 'table', + attrs: { repeatRows: true }, + content: [ + headerRow(['Nr.', 'Nume Prenume', 'IDNP', 'Data intrării', 'Perioada anterioară', 'Ani', 'Doza ext. (mSv)', 'Doza int. (mSv)', 'Total (mSv)']), + row([ + cell([para([chip('row.index', 'Nr.')])]), + cell([para([chip('row.employeeName', 'Nume Prenume')])]), + cell([para([chip('row.idnp', 'IDNP')])]), + cell([para([chip('row.entryDate', 'Data intrării')])]), + cell([para([chip('row.priorPeriod', 'Perioada anterioară')])]), + cell([para([chip('row.priorYears', 'Ani')])]), + cell([para([chip('row.externalMsv', 'Doza ext.')])]), + cell([para([chip('row.internalMsv', 'Doza int.')])]), + cell([para([chip('row.totalMsv', 'Total')])]), + ]), + ], + }, + ], + }; + + // ── Anexa 6: Verdict medic de familie (per-employee) ───────────── + const anexa6 = { + type: 'doc', + content: [ + heading('FIȘĂ DE APTITUDINE — VERDICTUL MEDICULUI DE FAMILIE'), + para([txt('Angajat: '), chip('employee.fullName', 'Nume Prenume')]), + para([txt('IDNP: '), chip('employee.idnp', 'IDNP'), txt(' Data nașterii: '), chip('employee.birthDate', 'Data nașterii')]), + para([txt('Ocupația: '), chip('employee.occupation', 'Ocupația'), txt(' Departament: '), chip('employee.department', 'Departament')]), + para([txt('Tipul examenului: '), chip('tipExamen', 'Tipul examenului')]), + para([txt('Data examinării: '), chip('document.date', 'Data')]), + para([txt('Verdict:', [{ type: 'bold' }])]), + para([chip('verdict.checkbox.apt', '☐'), txt(' Apt')]), + para([chip('verdict.checkbox.apt_perioada_adaptare', '☐'), txt(' Apt în perioada de adaptare')]), + para([chip('verdict.checkbox.apt_conditionat', '☐'), txt(' Apt condiționat')]), + para([chip('verdict.checkbox.inapt_temporar', '☐'), txt(' Inapt temporar')]), + para([chip('verdict.checkbox.inapt', '☐'), txt(' Inapt')]), + para([txt('Recomandări: '), chip('verdict.recomandari', 'Recomandări')]), + para([txt(' ')]), + para([txt('Semnătura medicului de familie: ____________________')]), + ], + }; + + const SYS = '00000000-0000-0000-0000-000000000000'; + const templates: Array<{ type: 'ANEXA_3' | 'ANEXA_4' | 'ANEXA_4B' | 'ANEXA_6'; name: string; doc: object }> = [ + { type: 'ANEXA_3', name: 'Fișa de solicitare a examenului medical', doc: anexa3 }, + { type: 'ANEXA_4', name: 'Fișa de evaluare a locului de muncă', doc: anexa4 }, + { type: 'ANEXA_4B', name: 'Supliment radiații ionizante', doc: anexa4b }, + { type: 'ANEXA_6', name: 'Verdict medic de familie', doc: anexa6 }, + ]; + + for (const t of templates) { + await prisma.anexaTemplate.upsert({ + where: { type: t.type }, + update: { name: t.name, contentJson: t.doc as never }, + create: { type: t.type, name: t.name, contentJson: t.doc as never, updatedById: SYS }, + }); + } + console.log(' ✓ AnexaTemplate (4)'); + + // ── Inventory items (depozit Vestimentație + Echipament) ───────── + const inventory = [ + { sku: 'UN-CHIR-S-AL', name: 'Uniformă chirurgie S albastru', type: 'uniforma' as const, size: 'S', color: 'albastru', stockQty: 50 }, + { sku: 'UN-CHIR-M-AL', name: 'Uniformă chirurgie M albastru', type: 'uniforma' as const, size: 'M', color: 'albastru', stockQty: 50 }, + { sku: 'UN-CHIR-L-AL', name: 'Uniformă chirurgie L albastru', type: 'uniforma' as const, size: 'L', color: 'albastru', stockQty: 50 }, + { sku: 'UN-ATI-M-VE', name: 'Uniformă ATI M verde', type: 'uniforma' as const, size: 'M', color: 'verde', stockQty: 30 }, + { sku: 'HA-MED-M-AL', name: 'Halat medical M alb', type: 'halat' as const, size: 'M', color: 'alb', stockQty: 50 }, + { sku: 'HA-MED-L-AL', name: 'Halat medical L alb', type: 'halat' as const, size: 'L', color: 'alb', stockQty: 50 }, + { sku: 'HA-LAB-M-AL', name: 'Halat laborator M alb', type: 'halat' as const, size: 'M', color: 'alb', stockQty: 30 }, + { sku: 'HA-LAB-L-AL', name: 'Halat laborator L alb', type: 'halat' as const, size: 'L', color: 'alb', stockQty: 30 }, + { sku: 'CI-38-AL', name: 'Ciupici 38-40 albi', type: 'ciupici' as const, size: '38-40', color: 'alb', stockQty: 80 }, + { sku: 'CI-41-AL', name: 'Ciupici 41-43 albi', type: 'ciupici' as const, size: '41-43', color: 'alb', stockQty: 80 }, + { sku: 'CI-44-AL', name: 'Ciupici 44-46 albi', type: 'ciupici' as const, size: '44-46', color: 'alb', stockQty: 80 }, + { sku: 'VE-S-TE', name: 'Vestă S teal', type: 'vesta' as const, size: 'S', color: 'teal', stockQty: 20 }, + { sku: 'VE-M-TE', name: 'Vestă M teal', type: 'vesta' as const, size: 'M', color: 'teal', stockQty: 20 }, + { sku: 'AT-SAMS-A15', name: 'Samsung Galaxy A15', type: 'aparat_telefon' as const, stockQty: 15 }, + { sku: 'AT-IPHONE-SE', name: 'iPhone SE 2022', type: 'aparat_telefon' as const, stockQty: 10 }, + ]; + for (const item of inventory) { + await prisma.inventoryItem.upsert({ + where: { sku: item.sku }, + update: {}, + create: item, + }); + } + console.log(` ✓ InventoryItem (${inventory.length})`); + + // ── Demo data pentru prezentare ────────────────────────────── + console.log('\n🎭 Seeding demo data...'); + + // Risk cards + const chirExposures = [ + { tip: 'AGENT_CHIMIC' as const, denumire: 'Glutaraldehidă (dezinfectant)', cas: '111-30-8', einecs: '203-856-5', timpExpunere: '2 h/zi', vep: '0,03 ppm', vlep: '0,1 ppm', caracteristici: 'iritant respirator' }, + { tip: 'AGENT_BIOLOGIC' as const, denumire: 'Virusuri hematogene (HBV, HCV, HIV)', clasificare: 'grupa 3', caracteristici: 'risc de infectare prin înțepare/tăiere' }, + ]; + const chirHeader = { + filiala: 'Sediul central', + caemPrimeleDouaCifre: '86', + cormSubgrupaMajora: 'Personal medical — secție chirurgie', + directiaSectiaSectorul: 'Bloc Medical / Chirurgie Generală', + numarulLoculuiDeMunca: 'CH-01', + caemDiviziune: '86.10', + clasaConditiilorDeMunca: '3.2', + numarLucratoriPosibili: 12, + evaluareDetalii: { + echipa: true, oreZi: '8', schimburi: '2', schimbNoapte: true, pauzeOrganizate: true, + riscInfectare: true, riscTaiere: true, riscIntepare: true, + pozitieOrtostatica: true, manipulareRidicare: true, suprasolicitariVizuale: true, + }, + anexeIgienicoSanitare: { vestiar: true, chiuveta: true, wc: true, dus: true, salaMese: true }, + mijloaceProtectieIndividuala: 'Mănuși, mască, halat steril', + echipamentLucru: 'Uniformă chirurgicală', + }; + const rcChir = await prisma.workplaceRiskCard.upsert({ + where: { name: 'Secție chirurgie generală' }, + update: { ...chirHeader, exposures: { deleteMany: {}, create: chirExposures } }, + create: { name: 'Secție chirurgie generală', ...chirHeader, exposures: { create: chirExposures } }, + }); + + const imagExposures = [ + { tip: 'CAMP_ELECTROMAGNETIC' as const, denumire: 'Câmp electromagnetic RMN', zonaAfectata: 'corp întreg', timpExpunere: '4 h/zi', vep: '—', vlep: 'conform NU-10', caracteristici: 'câmp magnetic static intens' }, + ]; + const imagHeader = { + filiala: 'Sediul central', + caemPrimeleDouaCifre: '86', + cormSubgrupaMajora: 'Personal imagistică medicală', + directiaSectiaSectorul: 'Diagnostic / Imagistică Medicală', + numarulLoculuiDeMunca: 'IMG-01', + caemDiviziune: '86.90', + clasaConditiilorDeMunca: '3.3', + numarLucratoriPosibili: 8, + radiatiiIonizante: true, + radiatiiGrupa: 'A', + radiatiiSurse: 'închise', + radiatiiTipExpunere: 'X externă', + radiatiiAparatura: 'CT, aparat Rx', + radiatiiMasuriProtectie: 'șorț cu plumb, ecran de protecție, dozimetru individual', + evaluareDetalii: { + echipa: true, oreZi: '7', schimburi: '2', + riscElectrocutare: true, pozitieAsezat: true, suprasolicitariVizuale: true, + }, + anexeIgienicoSanitare: { vestiar: true, chiuveta: true, wc: true }, + mijloaceProtectieIndividuala: 'Șorț cu plumb, ochelari, dozimetru', + }; + const rcImag = await prisma.workplaceRiskCard.upsert({ + where: { name: 'Radiologie și imagistică' }, + update: { ...imagHeader, exposures: { deleteMany: {}, create: imagExposures } }, + create: { name: 'Radiologie și imagistică', ...imagHeader, exposures: { create: imagExposures } }, + }); + console.log(' ✓ WorkplaceRiskCard demo (2) — cu antet Anexa 4 + factori'); + + // Lookup departments & inventory items + const chirGenDept = await prisma.department.findUnique({ where: { code: 'CHIR_GEN' } }); + const imagDept = await prisma.department.findUnique({ where: { code: 'IMAG' } }); + const uniformaS = await prisma.inventoryItem.findUnique({ where: { sku: 'UN-CHIR-S-AL' } }); + const halatM = await prisma.inventoryItem.findUnique({ where: { sku: 'HA-MED-M-AL' } }); + + // 4 demo employees (IDNPs pre-validated cu algoritmul de sumă de control MD) + const emp1 = await prisma.employee.upsert({ + where: { idnp: '1985061500016' }, + update: {}, + create: { + idnp: '1985061500016', nume: 'Popescu', prenume: 'Alexandru', + sex: 'M', dataNasterii: new Date('1985-06-15'), + domiciliu: 'mun. Chișinău, str. Ștefan cel Mare 1', + telefonPersonal: '+37369100001', status: 'activ', + }, + }); + const emp2 = await prisma.employee.upsert({ + where: { idnp: '1990032200017' }, + update: {}, + create: { + idnp: '1990032200017', nume: 'Ionescu', prenume: 'Maria', + sex: 'F', dataNasterii: new Date('1990-03-22'), + domiciliu: 'mun. Chișinău, str. Mihai Viteazul 5', + telefonPersonal: '+37369100002', status: 'activ', + }, + }); + const emp3 = await prisma.employee.upsert({ + where: { idnp: '1978110800016' }, + update: {}, + create: { + idnp: '1978110800016', nume: 'Rusu', prenume: 'Viorel', + sex: 'M', dataNasterii: new Date('1978-11-08'), + domiciliu: 'mun. Chișinău, str. Alba Iulia 12', + telefonPersonal: '+37369100003', status: 'activ', + }, + }); + const emp4 = await prisma.employee.upsert({ + where: { idnp: '2001091400010' }, + update: {}, + create: { + idnp: '2001091400010', nume: 'Cojocaru', prenume: 'Elena', + sex: 'F', dataNasterii: new Date('2001-09-14'), + domiciliu: 'mun. Chișinău, str. Trandafirilor 3', + telefonPersonal: '+37369100004', status: 'activ', + }, + }); + console.log(' ✓ Employee demo (4)'); + + // Employment contracts + if (chirGenDept) { + await prisma.employmentContract.upsert({ + where: { nrCim: 'CIM-DEMO-001' }, + update: {}, + create: { + nrCim: 'CIM-DEMO-001', employeeId: emp1.id, + categorie: 'principal', tipCim: 'de_baza', perioada: 'nedeterminata', + dataSemnarii: new Date('2020-01-10'), dataAngajarii: new Date('2020-01-15'), + departmentId: chirGenDept.id, functiaOrganigrama: 'Chirurg', + salarizareDetails: { tip: 'fix', salariu: 18000, zileConcediu: 28 }, + }, + }); + await prisma.employmentContract.upsert({ + where: { nrCim: 'CIM-DEMO-002' }, + update: {}, + create: { + nrCim: 'CIM-DEMO-002', employeeId: emp2.id, + categorie: 'principal', tipCim: 'de_baza', perioada: 'nedeterminata', + dataSemnarii: new Date('2021-03-01'), dataAngajarii: new Date('2021-03-05'), + departmentId: chirGenDept.id, functiaOrganigrama: 'Asistentă medicală', + salarizareDetails: { tip: 'fix', salariu: 10000, zileConcediu: 28 }, + }, + }); + } + if (imagDept) { + await prisma.employmentContract.upsert({ + where: { nrCim: 'CIM-DEMO-003' }, + update: {}, + create: { + nrCim: 'CIM-DEMO-003', employeeId: emp3.id, + categorie: 'principal', tipCim: 'de_baza', perioada: 'nedeterminata', + dataSemnarii: new Date('2018-06-01'), dataAngajarii: new Date('2018-06-10'), + departmentId: imagDept.id, functiaOrganigrama: 'Radiolog', + salarizareDetails: { tip: 'fix', salariu: 20000, zileConcediu: 35 }, + }, + }); + await prisma.employmentContract.upsert({ + where: { nrCim: 'CIM-DEMO-004' }, + update: {}, + create: { + nrCim: 'CIM-DEMO-004', employeeId: emp4.id, + categorie: 'principal', tipCim: 'de_baza', perioada: 'nedeterminata', + dataSemnarii: new Date('2023-09-01'), dataAngajarii: new Date('2023-09-15'), + departmentId: imagDept.id, functiaOrganigrama: 'Asistentă radiologie', + salarizareDetails: { tip: 'fix', salariu: 9500, zileConcediu: 28 }, + }, + }); + } + console.log(' ✓ EmploymentContract demo (4)'); + + // Medical profiles: + // emp1 — chirurgie, niciodată examinat + // emp2 — chirurgie, examinat acum 15 luni (expirat) + // emp3 — radiologie, examinat acum 11 luni + radiații (expiră curând) + // emp4 — radiologie, niciodată examinat + radiații + await prisma.employeeMedicalProfile.upsert({ + where: { employeeId: emp1.id }, update: {}, + create: { employeeId: emp1.id, workplaceRiskCardId: rcChir.id, expusRadiatiiIonizante: false }, + }); + await prisma.employeeMedicalProfile.upsert({ + where: { employeeId: emp2.id }, update: {}, + create: { + employeeId: emp2.id, workplaceRiskCardId: rcChir.id, + dataUltimControlMedical: new Date('2025-02-14'), + expusRadiatiiIonizante: false, + }, + }); + const emp3Radiatii = { + workplaceRiskCardId: rcImag.id, + dataUltimControlMedical: new Date('2025-06-14'), + expusRadiatiiIonizante: true, + dataIntrarii: new Date('2019-02-01'), + expunereAnterioaraPerioda: '2015–2018', + expunereAnterioaraAni: 3, + dozaCumulataExternaMsv: 4.2500, + dozaCumulataInternaMsv: 0.8000, + }; + const emp3Supra = [ + { fel: 'EXCEPTIONALA' as const, tipExpunere: 'X externă', data: new Date('2023-05-12'), dozaMsv: 2.5000 }, + { fel: 'ACCIDENTALA' as const, tipExpunere: 'gamma externă', data: new Date('2024-09-03'), dozaMsv: 1.2000 }, + ]; + await prisma.employeeMedicalProfile.upsert({ + where: { employeeId: emp3.id }, + update: { ...emp3Radiatii, overexposures: { deleteMany: {}, create: emp3Supra } }, + create: { employeeId: emp3.id, ...emp3Radiatii, overexposures: { create: emp3Supra } }, + }); + await prisma.employeeMedicalProfile.upsert({ + where: { employeeId: emp4.id }, update: {}, + create: { employeeId: emp4.id, workplaceRiskCardId: rcImag.id, expusRadiatiiIonizante: true }, + }); + console.log(' ✓ EmployeeMedicalProfile demo (4)'); + + // Pending checkups for inbox (verdict = null) + // emp1 — la_angajare, acum 5 zile (depășit → roșu) + // emp2 — periodic, peste 3 zile + // emp3 — la_reluarea_activitatii, mâine + const day = (offsetDays: number) => { + const d = new Date('2026-05-14'); + d.setDate(d.getDate() + offsetDays); + return d; + }; + for (const [empId, tip, offset] of [ + [emp1.id, 'la_angajare', -5], + [emp2.id, 'periodic', 3], + [emp3.id, 'la_reluarea_activitatii', 1], + ] as [string, string, number][]) { + const exists = await prisma.medicalCheckup.findFirst({ where: { employeeId: empId, verdict: null } }); + if (!exists) { + await prisma.medicalCheckup.create({ + data: { employeeId: empId, tip: tip as never, dataPlanificata: day(offset) }, + }); + } + } + console.log(' ✓ MedicalCheckup demo — pending inbox (3)'); + + // ── Evaluation campaigns demo (modulul de evaluare nursing) ────── + // Campania A — Chirurgie Generală, IN_PROGRESS: + // emp2 (Ionescu Maria) — formular complet, scoruri bune + 1 criteriu EXPERT + // → categorie calculată "superioara", ÎNCĂ NEAPROBATĂ + // (nursing_director o poate aproba — demo aprobare) + // emp1 (Popescu Alexandru) — formular parțial (în lucru) → "fara" + if (chirGenDept) { + const campMonth = new Date('2026-05-01'); + let camp = await prisma.evaluationCampaign.findFirst({ + where: { departmentId: chirGenDept.id, month: campMonth }, + }); + if (!camp) { + camp = await prisma.evaluationCampaign.create({ + data: { + name: 'Evaluare anuală nursing — Chirurgie Generală 2026', + departmentId: chirGenDept.id, + month: campMonth, + status: 'in_progress', + }, + }); + } + + await prisma.evaluationForm.upsert({ + where: { campaignId_employeeId: { campaignId: camp.id, employeeId: emp2.id } }, + update: {}, + create: { + campaignId: camp.id, employeeId: emp2.id, + abilitatiClinice: 'bine', judecataClinica: 'bine', manopere: 'bine', gestionareaSarcinilor: 'mediu', + constiintaProfesionala: 'bine', atitudineaPacienti: 'bine', atitudineaColegi: 'bine', atitudineaPersonalNonMed: 'mediu', + utilizareSmartphone: 'bine', respectareaProgramului: 'bine', respectareaDressCode: 'bine', + testJci: { score: 18, max_score: 20, percent: 90, completed_at: '2026-05-10', source: 'academy_ocean', external_id: 'AO-DEMO-001' }, + completareaDocMed: true, perfectioneazaCunostinte: true, + membruComitetCalitate: true, functieDeMonitor: false, inlocuiesteSuperiorul: false, + categorieCalculata: 'superioara', + }, + }); + + await prisma.evaluationForm.upsert({ + where: { campaignId_employeeId: { campaignId: camp.id, employeeId: emp1.id } }, + update: {}, + create: { + campaignId: camp.id, employeeId: emp1.id, + abilitatiClinice: 'bine', judecataClinica: 'mediu', manopere: 'mediu', + categorieCalculata: 'fara', + }, + }); + console.log(' ✓ EvaluationCampaign demo — Chirurgie (in_progress, 2 formulare)'); + } + + // Campania B — Imagistică, CLOSED (istoric read-only): + // emp3 (Rusu Viorel) — formular finalizat și aprobat → "cat_I" + if (imagDept) { + const campMonth = new Date('2025-11-01'); + let camp = await prisma.evaluationCampaign.findFirst({ + where: { departmentId: imagDept.id, month: campMonth }, + }); + if (!camp) { + camp = await prisma.evaluationCampaign.create({ + data: { + name: 'Evaluare anuală nursing — Imagistică 2025', + departmentId: imagDept.id, + month: campMonth, + status: 'closed', + }, + }); + } + await prisma.evaluationForm.upsert({ + where: { campaignId_employeeId: { campaignId: camp.id, employeeId: emp3.id } }, + update: {}, + create: { + campaignId: camp.id, employeeId: emp3.id, + abilitatiClinice: 'bine', judecataClinica: 'bine', manopere: 'bine', gestionareaSarcinilor: 'bine', + constiintaProfesionala: 'bine', atitudineaPacienti: 'mediu', atitudineaColegi: 'bine', atitudineaPersonalNonMed: 'bine', + utilizareSmartphone: 'bine', respectareaProgramului: 'bine', respectareaDressCode: 'mediu', + completareaDocMed: true, perfectioneazaCunostinte: true, + membruComitetCalitate: false, functieDeMonitor: false, inlocuiesteSuperiorul: false, + categorieCalculata: 'cat_I', + categorieAprobata: 'cat_I', + observatii: 'Performanță constantă, recomandat pentru categoria I.', + completedAt: new Date('2025-11-20'), + }, + }); + console.log(' ✓ EvaluationCampaign demo — Imagistică (closed, 1 formular aprobat)'); + } + + // Benefit cu vestimentație pentru emp1 + if (uniformaS && halatM) { + await prisma.benefit.upsert({ + where: { employeeId: emp1.id }, + update: {}, + create: { + employeeId: emp1.id, + uniformaId: uniformaS.id, + halatId: halatM.id, + ticheteMasa: true, + valoareTichet: 65, + alimentatiePersonal: false, + abonamentTel: 150, + }, + }); + console.log(' ✓ Benefit demo (1) — Popescu Alexandru: uniformă + halat'); + } + + console.log('\n✅ Seed complete.'); +} + +main() + .catch((e) => { console.error(e); process.exit(1); }) + .finally(() => prisma.$disconnect()); diff --git a/apps/api/scripts/generate-docx-stubs.ts b/apps/api/scripts/generate-docx-stubs.ts new file mode 100644 index 0000000..0b40520 --- /dev/null +++ b/apps/api/scripts/generate-docx-stubs.ts @@ -0,0 +1,226 @@ +/** + * Generează BOLĂVANKE (stub) .docx pentru Anexele 3/4/4A/4B/6 cu TOATE placeholder-ele + * docxtemplater din `templates/docx/README.md`. Formatarea o ajustați apoi în Word. + * + * Rulare: pnpm --filter api exec ts-node scripts/generate-docx-stubs.ts + */ +import { writeFileSync, mkdirSync } from 'node:fs'; +import { join } from 'node:path'; +import { + Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell, + HeadingLevel, WidthType, BorderStyle, +} from 'docx'; + +const OUT = join(__dirname, '..', 'templates', 'docx'); +mkdirSync(OUT, { recursive: true }); + +// ── helpers ── +const T = (text: string, bold = false) => new TextRun({ text, bold }); +const ph = (name: string) => new TextRun({ text: `{${name}}`, bold: true, color: '0B6E70' }); +const P = (...children: TextRun[]) => new Paragraph({ children }); +const H = (text: string, level: (typeof HeadingLevel)[keyof typeof HeadingLevel] = HeadingLevel.HEADING_2) => + new Paragraph({ heading: level, children: [T(text, true)] }); +const empty = () => new Paragraph({ children: [] }); +// "Label {ph}" +const line = (label: string, name: string) => P(T(label + ' '), ph(name)); +// checkbox: "{cbX} Label" +const cb = (name: string, label: string) => [ph(name), T(' ' + label + ' ')]; +const cbLine = (...pairs: [string, string][]) => + P(...pairs.flatMap(([n, l]) => cb(n, l))); + +const BORDER = { + top: { style: BorderStyle.SINGLE, size: 1, color: '999999' }, + bottom: { style: BorderStyle.SINGLE, size: 1, color: '999999' }, + left: { style: BorderStyle.SINGLE, size: 1, color: '999999' }, + right: { style: BorderStyle.SINGLE, size: 1, color: '999999' }, +}; +const cell = (children: Paragraph[]) => new TableCell({ children, borders: BORDER }); +const headerRow = (labels: string[]) => + new TableRow({ children: labels.map((l) => cell([P(T(l, true))])) }); + +/** + * Tabel repetabil: rândul-șablon repetă pentru fiecare element din `loop`. + * `{#loop}` în prima celulă, `{/loop}` în ultima. + */ +function loopTable(loop: string, headers: string[], rowFields: string[]): Table { + const tplCells = rowFields.map((f, i) => { + const runs: TextRun[] = []; + if (i === 0) runs.push(new TextRun({ text: `{#${loop}}`, bold: true, color: 'B11116' })); + runs.push(ph(f)); + if (i === rowFields.length - 1) runs.push(new TextRun({ text: `{/${loop}}`, bold: true, color: 'B11116' })); + return cell([P(...runs)]); + }); + return new Table({ + width: { size: 100, type: WidthType.PERCENTAGE }, + rows: [headerRow(headers), new TableRow({ children: tplCells })], + }); +} + +function save(name: string, children: (Paragraph | Table)[]) { + const doc = new Document({ sections: [{ children }] }); + return Packer.toBuffer(doc).then((buf) => { + writeFileSync(join(OUT, name), buf); + console.log(' ✓', name, `(${buf.length} bytes)`); + }); +} + +// ════════════════════════ ANEXA 3 ════════════════════════ +const anexa3: (Paragraph | Table)[] = [ + H('FIȘA de solicitare a examenului medical'), + line('Unitatea economică/instituția:', 'unitatea'), + P(T('IDNO: '), ph('idno'), T(' Adresa: '), ph('adresa')), + P(T('Telefon: '), ph('telefon'), T(' Fax: '), ph('fax'), T(' E-mail: '), ph('email')), + P(T('Filiala: '), ph('filiala'), T(' Adresa filialei: '), ph('adresaFiliala'), T(' Telefon: '), ph('telefonFiliala')), + empty(), + loopTable('angajati', + ['Nr.', 'Numele și prenumele', 'Anul nașterii', 'IDNP', 'Tipul examenului', 'Ocupația (CORM)', 'CAEM', 'Nr. loc muncă', 'Factorul de risc'], + ['nr', 'numePrenume', 'anNastere', 'idnp', 'tipExamen', 'ocupatieCorm', 'caem', 'numarLoc', 'factorRisc']), + empty(), + line('Data completării:', 'dataCompletarii'), + P(T('Solicitant: '), ph('solicitant'), T(' Funcția: '), ph('functia')), + P(T('Semnătura: ____________________')), +]; + +// ════════════════════════ ANEXA 4 ════════════════════════ +const anexa4Header: (Paragraph | Table)[] = [ + line('Unitatea economică/instituția:', 'unitatea'), + P(T('Adresa: '), ph('adresa')), + P(T('Filiala: '), ph('filiala'), T(' Adresa filialei: '), ph('adresaFiliala'), T(' CAEM (2 cifre): '), ph('caem2')), + H('FIȘA de evaluare a riscurilor profesionale'), + line('Ocupația (subgrupa majoră CORM):', 'cormSubgrupa'), + line('Direcția/secția/sectorul:', 'directiaSectia'), + P(T('Numărul locului de muncă: '), ph('numarLoc'), T(' CAEM (diviziune): '), ph('caemDiviziune')), + P(T('Nr. lucrători care pot activa: '), ph('numarLucratori'), T(' Clasa condițiilor de muncă: '), ph('clasa')), +]; +const anexa4Descriptiv: (Paragraph | Table)[] = [ + H('Descrierea activității', HeadingLevel.HEADING_3), + P(T('Lucru în echipă '), ph('cbEchipa'), T(' Nr. ore/zi: '), ph('oreZi'), T(' Nr. schimburi: '), ph('schimburi')), + cbLine(['cbSchimbNoapte', 'schimb de noapte'], ['cbPauze', 'pauze organizate']), + P(T('Riscuri:')), + cbLine(['cbInfectare', 'infectare'], ['cbElectrocutare', 'electrocutare'], ['cbTensiuneInalta', 'tensiune înaltă'], ['cbInecare', 'înecare'], ['cbAsfixiere', 'asfixiere']), + cbLine(['cbStrivire', 'strivire'], ['cbTaiere', 'tăiere'], ['cbIntepare', 'înțepare'], ['cbLovire', 'lovire'], ['cbMuscatura', 'mușcătură'], ['cbMicrotraumatisme', 'microtraumatisme']), + P(T('Conduce mașina '), ph('cbConduceMasina'), T(' categorie: '), ph('categorieConducere'), T(' '), ph('cbUtilajeIntrauzinal'), T(' utilaje intrauzinal')), + H('Descrierea spațiului de lucru', HeadingLevel.HEADING_3), + P(T('Dimensiuni: L '), ph('spatiuL'), T(' l '), ph('spatiul'), T(' H '), ph('spatiuH'), T(' m')), + cbLine(['cbSuprafVerticala', 'suprafață verticală'], ['cbSuprafOrizontala', 'orizontală'], ['cbSuprafOblica', 'oblică']), + cbLine(['cbMuncaIzolare', 'în izolare'], ['cbMuncaInaltime', 'la înălțime'], ['cbMuncaMiscare', 'în mișcare']), + H('Efort fizic', HeadingLevel.HEADING_3), + P(T('Poziție: ')), + cbLine(['cbPozitieOrtostatica', 'ortostatică'], ['cbPozitieAsezat', 'așezat'], ['cbPozitieAplecata', 'aplecată'], ['cbPozitieMixta', 'mixtă'], ['cbPozitieFortata', 'forțată']), + P(T('Suprasolicitări coloană: ')), + cbLine(['cbColoanaCervicala', 'cervicală'], ['cbColoanaToracala', 'toracală'], ['cbColoanaLombara', 'lombară']), + P(T('Manipulare manuală: ')), + cbLine(['cbManipRidicare', 'ridicare'], ['cbManipCoborare', 'coborâre'], ['cbManipImpingere', 'împingere'], ['cbManipTragere', 'tragere'], ['cbManipPurtare', 'purtare'], ['cbManipDeplasare', 'deplasare']), + P(T('Greutate maximă manipulată: '), ph('greutateMaxima')), + cbLine(['cbVizuale', 'suprasolicitări vizuale'], ['cbAuditive', 'auditive'], ['cbNeuropsihice', 'neuropsihice']), +]; +const factorTables: (Paragraph | Table)[] = [ + H('AGENȚI CHIMICI', HeadingLevel.HEADING_3), + loopTable('chimici', ['Agentul chimic', 'CAS', 'EINECS', 'Timp', 'VEP', 'VLEP', 'Caracteristici'], + ['denumire', 'cas', 'einecs', 'timp', 'vep', 'vlep', 'caracteristici']), + H('PULBERI', HeadingLevel.HEADING_3), + loopTable('pulberi', ['Pulberi', 'CAS', 'EINECS', 'Timp', 'VEP', 'VLEP', 'Caracteristici'], + ['denumire', 'cas', 'einecs', 'timp', 'vep', 'vlep', 'caracteristici']), + H('AGENȚI BIOLOGICI', HeadingLevel.HEADING_3), + loopTable('biologici', ['Agent biologic', 'Clasificare', 'Note'], ['denumire', 'clasificare', 'note']), + H('ZGOMOT PROFESIONAL', HeadingLevel.HEADING_3), + loopTable('zgomot', ['Tipul', 'Timp', 'VEP', 'VLEP', 'Caracteristici'], ['denumire', 'timp', 'vep', 'vlep', 'caracteristici']), + H('VIBRAȚII MECANICE', HeadingLevel.HEADING_3), + loopTable('vibratii', ['Tipul', 'Zona', 'Timp', 'VEP', 'VLEP', 'Caracteristici'], ['denumire', 'zona', 'timp', 'vep', 'vlep', 'caracteristici']), + H('CÂMP ELECTROMAGNETIC', HeadingLevel.HEADING_3), + loopTable('campEM', ['Tipul', 'Zona', 'Timp', 'VEP', 'VLEP', 'Caracteristici'], ['denumire', 'zona', 'timp', 'vep', 'vlep', 'caracteristici']), + H('RADIAȚII OPTICE ARTIFICIALE', HeadingLevel.HEADING_3), + loopTable('optice', ['Tipul', 'Zona', 'Timp', 'VEP', 'VLEP', 'Caracteristici'], ['denumire', 'zona', 'timp', 'vep', 'vlep', 'caracteristici']), +]; +const anexa4Footer: (Paragraph | Table)[] = [ + H('MICROCLIMAT / RADIAȚII / ILUMINAT', HeadingLevel.HEADING_3), + cbLine(['cbMicroclimatInterior', 'interior'], ['cbMicroclimatExterior', 'exterior'], ['cbCaloriceRece', 'rad. calorice (rece)'], ['cbCaloriceCalda', 'rad. calorice (caldă)']), + P(T('Radiații ionizante '), ph('cbRadiatii'), T(' Grupa: '), ph('radGrupa'), T(' Surse: '), ph('radSurse')), + P(T('Tip expunere: '), ph('radTipExpunere'), T(' Aparatură: '), ph('radAparatura'), T(' Măsuri: '), ph('radMasuri')), + cbLine(['cbIluminatSuficient', 'iluminat suficient'], ['cbIluminatInsuficient', 'insuficient'], ['cbIluminatNatural', 'natural'], ['cbIluminatArtificial', 'artificial'], ['cbIluminatMixt', 'mixt']), + H('Protecție și dotări', HeadingLevel.HEADING_3), + line('Mijloace de protecție colectivă:', 'protectieColectiva'), + line('Mijloace de protecție individuală:', 'protectieIndividuala'), + line('Echipament de lucru:', 'echipament'), + P(T('Anexe igienico-sanitare: ')), + cbLine(['cbVestiar', 'vestiar'], ['cbChiuveta', 'chiuvetă'], ['cbWc', 'WC'], ['cbDus', 'duș'], ['cbSalaMese', 'sală de mese'], ['cbRecreere', 'recreere']), + line('Observații:', 'observatii'), + line('Data completării:', 'dataCompletarii'), + P(T('Angajatorul (nume, prenume, semnătura): ____________________')), + P(new TextRun({ text: 'Instrucțiuni: răspuns afirmativ [☑]; răspuns negativ [☐].', italics: true })), +]; + +// ════════════════════════ ANEXA 4A ════════════════════════ +const anexa4a: (Paragraph | Table)[] = [ + line('Unitatea economică/instituția:', 'unitatea'), + P(T('Adresa: '), ph('adresa'), T(' Filiala: '), ph('filiala'), T(' CAEM (2 cifre): '), ph('caem2')), + H('FIȘA de evaluare — muncă la distanță / platforme digitale'), + line('Ocupația (subgrupa majoră CORM):', 'cormSubgrupa'), + line('Direcția/secția/sectorul:', 'directiaSectia'), + P(T('Numărul locului de muncă: '), ph('numarLoc'), T(' CAEM (diviziune): '), ph('caemDiviziune'), T(' Clasa: '), ph('clasa')), + H('Descrierea activității', HeadingLevel.HEADING_3), + P(T('Lucru în echipă '), ph('cbEchipa'), T(' Nr. ore/zi: '), ph('oreZi'), T(' Nr. schimburi: '), ph('schimburi')), + cbLine(['cbSchimbNoapte', 'schimb de noapte'], ['cbPauze', 'pauze organizate'], ['cbLucruMonitor', 'lucru la monitor'], ['cbPlatformeDigitale', 'platforme digitale']), + P(T('Conduce mașina '), ph('cbConduceMasina'), T(' categorie: '), ph('categorieConducere')), + line('Operațiuni executate:', 'operatiuni'), + P(T('Deplasări pe teren '), ph('cbDeplasari'), T(' '), ph('deplasariDescriere')), + H('Efort fizic', HeadingLevel.HEADING_3), + P(T('Manipulare manuală: ')), + cbLine(['cbManipRidicare', 'ridicare'], ['cbManipCoborare', 'coborâre'], ['cbManipImpingere', 'împingere'], ['cbManipTragere', 'tragere'], ['cbManipPurtare', 'purtare'], ['cbManipDeplasare', 'deplasare']), + P(T('Greutate maximă: '), ph('greutateMaxima')), + cbLine(['cbVizuale', 'vizuale'], ['cbAuditive', 'auditive'], ['cbNeuropsihice', 'neuropsihice']), + line('Alte riscuri:', 'alteRiscuri'), + line('Data completării:', 'dataCompletarii'), + P(T('Angajatorul (nume, prenume, semnătura): ____________________')), +]; + +// ════════════════════════ ANEXA 4B ════════════════════════ +const anexa4b: (Paragraph | Table)[] = [ + line('Unitatea economică/instituția:', 'unitatea'), + P(T('Adresa: '), ph('adresa'), T(' Telefon: '), ph('telefon'), T(' Fax: '), ph('fax'), T(' E-mail: '), ph('email')), + P(T('Filiala: '), ph('filiala'), T(' Adresa filialei: '), ph('adresaFiliala'), T(' CAEM (2 cifre): '), ph('caem2')), + H('SUPLIMENT la Fișa de evaluare a riscurilor profesionale'), + line('Ocupația (subgrupa majoră CORM):', 'cormSubgrupa'), + line('Direcția/secția/sectorul:', 'directiaSectia'), + P(T('Numărul locului de muncă: '), ph('numarLoc'), T(' CAEM (diviziune): '), ph('caemDiviziune')), + P(T('Numele, prenumele lucrătorului: '), ph('numePrenume'), T(' IDNP: '), ph('idnp')), + P(T('RADIAȚII IONIZANTE: '), ph('cbRadiatii')), + line('Data intrării în mediul cu expunere:', 'dataIntrarii'), + P(T('Expunere anterioară — perioada: '), ph('expAnterioaraPerioada'), T(' ani: '), ph('expAnterioaraAni')), + P(T('Doză externă (mSv): '), ph('dozaExterna'), T(' Doză internă (mSv): '), ph('dozaInterna'), T(' Doză totală (mSv): '), ph('dozaTotala')), + H('Supraexpuneri excepționale', HeadingLevel.HEADING_3), + loopTable('supraexpExceptionale', ['Tip de expunere', 'Data', 'Doză (mSv)'], ['tipExpunere', 'data', 'doza']), + H('Supraexpuneri accidentale', HeadingLevel.HEADING_3), + loopTable('supraexpAccidentale', ['Tip de expunere', 'Data', 'Doză (mSv)'], ['tipExpunere', 'data', 'doza']), + line('Data completării:', 'dataCompletarii'), + P(T('Angajatorul (nume, prenume, semnătura): ____________________')), +]; + +// ════════════════════════ ANEXA 6 ════════════════════════ +const anexa6: (Paragraph | Table)[] = [ + H('FIȘĂ DE APTITUDINE ÎN MUNCĂ'), + line('Unitatea:', 'unitatea'), + P(T('Angajat: '), ph('numePrenume'), T(' IDNP: '), ph('idnp'), T(' Anul nașterii: '), ph('anNastere')), + P(T('Ocupația: '), ph('ocupatieCorm'), T(' Departament: '), ph('departament')), + P(T('Tipul examenului: '), ph('tipExamen'), T(' Data: '), ph('dataCompletarii')), + H('Verdict', HeadingLevel.HEADING_3), + P(ph('cbApt'), T(' Apt')), + P(ph('cbAptAdaptare'), T(' Apt în perioada de adaptare')), + P(ph('cbAptConditionat'), T(' Apt condiționat')), + P(ph('cbInaptTemporar'), T(' Inapt temporar')), + P(ph('cbInapt'), T(' Inapt')), + line('Recomandări:', 'recomandari'), + line('Valabil până la:', 'valabilPanaLa'), + P(T('Semnătura medicului: '), ph('semnatDe')), +]; + +async function main() { + console.log('📄 Generez bolăvanke .docx în', OUT); + await save('anexa-3.docx', anexa3); + await save('anexa-4.docx', [...anexa4Header, ...anexa4Descriptiv, ...factorTables, ...anexa4Footer]); + await save('anexa-4a.docx', anexa4a); + await save('anexa-4b.docx', anexa4b); + await save('anexa-6.docx', anexa6); + console.log('✅ Gata. Editați formatarea în Word — placeholder-ele rămân ca {nume}.'); +} +main().catch((e) => { console.error(e); process.exit(1); }); diff --git a/apps/api/scripts/seed-test-data.ts b/apps/api/scripts/seed-test-data.ts new file mode 100644 index 0000000..d6e5500 --- /dev/null +++ b/apps/api/scripts/seed-test-data.ts @@ -0,0 +1,662 @@ +import { + AnexaType, + CampaignStatus, + ContractCategory, + ContractPeriod, + ContractType, + DisciplinarySanctionType, + DiplomaStatus, + DocumentType, + EmployeeStatus, + EvaluationScore, + FamilyMemberType, + InventoryItemType, + MedicalCheckupType, + MedicalVerdict, + OverexposureKind, + PrismaClient, + ProposedCategory, + QualificationCategory, + RiskExposureType, + SalaryType, + ScientificTitle, + Sex, + StudyLevel, + PostUniversityType, + StudyType, + TrainingType, +} from '@prisma/client'; + +const prisma = new PrismaClient(); + +function dbNameFromUrl(url: string): string { + return decodeURIComponent(new URL(url).pathname.replace(/^\//, '')); +} + +function requireTemporaryDatabase() { + const url = process.env.DATABASE_URL; + if (!url) throw new Error('DATABASE_URL is required for test seed'); + const dbName = dbNameFromUrl(url); + if (!dbName.startsWith('hrm_medpark_test_') && process.env.ALLOW_NON_TEST_DB !== 'true') { + throw new Error(`Refusing to seed non-test database "${dbName}". Expected hrm_medpark_test_*.`); + } + return dbName; +} + +const d = (value: string) => new Date(`${value}T00:00:00.000Z`); + +async function resetData() { + await prisma.auditLog.deleteMany(); + await prisma.anexaTemplateVersion.deleteMany(); + await prisma.anexaTemplate.deleteMany(); + await prisma.radiationOverexposure.deleteMany(); + await prisma.medicalCheckup.deleteMany(); + await prisma.employeeMedicalProfile.deleteMany(); + await prisma.workplaceRiskExposure.deleteMany(); + await prisma.workplaceRiskCard.deleteMany(); + await prisma.evaluationForm.deleteMany(); + await prisma.evaluationCampaign.deleteMany(); + await prisma.cimServiceCategory.deleteMany(); + await prisma.employmentContract.deleteMany(); + await prisma.benefit.deleteMany(); + await prisma.disciplinarySanction.deleteMany(); + await prisma.training.deleteMany(); + await prisma.qualification.deleteMany(); + await prisma.education.deleteMany(); + await prisma.familyMember.deleteMany(); + await prisma.identityDocument.deleteMany(); + await prisma.employee.deleteMany(); + await prisma.inventoryItem.deleteMany(); + await prisma.department.deleteMany(); + await prisma.workSchedule.deleteMany(); + await prisma.taxExemption.deleteMany(); + await prisma.disabilityGrade.deleteMany(); +} + +async function main() { + const dbName = requireTemporaryDatabase(); + console.log(`Seeding Medpark test data into ${dbName}...`); + await resetData(); + + const disability = await prisma.disabilityGrade.create({ + data: { code: 'TEST-GR-I', name: 'Grad dizabilitate I - test' }, + }); + const childTax = await prisma.taxExemption.create({ + data: { code: 'TEST-SCUTIRE-COPIL', description: 'Scutire copil - test' }, + }); + const schedule = await prisma.workSchedule.create({ + data: { name: 'Test 5/2 8h', daysWork: 5, daysRest: 2, hoursPerDay: 8 }, + }); + const shiftSchedule = await prisma.workSchedule.create({ + data: { name: 'Test 12/24', daysWork: 1, daysRest: 1, hoursPerDay: 12 }, + }); + + const root = await prisma.department.create({ data: { name: 'Medpark Test', code: 'TEST_ROOT' } }); + const surgeryDept = await prisma.department.create({ + data: { name: 'Chirurgie Test', code: 'TEST_CHIR', parentId: root.id }, + }); + const radiologyDept = await prisma.department.create({ + data: { name: 'Radiologie Test', code: 'TEST_RAD', parentId: root.id }, + }); + const remoteDept = await prisma.department.create({ + data: { name: 'Administrativ Digital Test', code: 'TEST_REMOTE', parentId: root.id }, + }); + const labDept = await prisma.department.create({ + data: { name: 'Laborator Test', code: 'TEST_LAB', parentId: root.id }, + }); + + const uniform = await prisma.inventoryItem.create({ + data: { sku: 'TEST-UNIFORM-M', name: 'Uniformă test M', type: InventoryItemType.uniforma, size: 'M', color: 'teal', stockQty: 20 }, + }); + const coat = await prisma.inventoryItem.create({ + data: { sku: 'TEST-HALAT-L', name: 'Halat test L', type: InventoryItemType.halat, size: 'L', color: 'alb', stockQty: 20 }, + }); + const shoes = await prisma.inventoryItem.create({ + data: { sku: 'TEST-CIUPICI-40', name: 'Ciupici test 40', type: InventoryItemType.ciupici, size: '40', color: 'alb', stockQty: 20 }, + }); + const phone = await prisma.inventoryItem.create({ + data: { sku: 'TEST-PHONE-A15', name: 'Telefon test Samsung A15', type: InventoryItemType.aparat_telefon, stockQty: 5 }, + }); + + const commonEval = { + echipa: true, + oreZi: '8', + schimburi: '2', + schimbNoapte: true, + pauzeOrganizate: true, + riscInfectare: true, + riscElectrocutare: true, + riscTensiuneInalta: false, + riscInecare: false, + riscAsfixiere: false, + riscStrivire: true, + riscTaiere: true, + riscIntepare: true, + riscLovire: true, + riscMuscatura: false, + riscMicrotraumatisme: true, + conduceMasina: true, + conduceMasinaCategorie: 'B', + conduceUtilajeIntrauzinal: false, + spatiuL: '4', + spatiul: '5', + spatiuH: '3', + suprafataVerticala: false, + suprafataOrizontala: true, + suprafataOblica: false, + muncaIzolare: false, + muncaInaltime: true, + muncaInMiscare: true, + pozitieOrtostatica: true, + pozitieAsezat: false, + pozitieAplecata: true, + pozitieMixta: true, + pozitieFortata: false, + coloanaCervicala: true, + coloanaToracala: true, + coloanaLombara: true, + manipulareRidicare: true, + manipulareCoborare: true, + manipulareImpingere: true, + manipulareTragere: false, + manipularePurtare: true, + manipulareDeplasare: true, + greutateMaxima: '15 kg', + suprasolicitariVizuale: true, + suprasolicitariAuditive: true, + suprasolicitariNeuropsihice: true, + microclimatInterior: true, + microclimatExterior: false, + radiatiiCaloriceRece: false, + radiatiiCaloriceCalda: false, + iluminatSuficient: true, + iluminatInsuficient: false, + iluminatNatural: true, + iluminatArtificial: true, + iluminatMixt: true, + }; + + const surgeryCard = await prisma.workplaceRiskCard.create({ + data: { + name: 'Test - Medic profil chirurgical cu gărzi de noapte', + riskFactors: { source: 'Control medical (5).docx', categories: ['chimici', 'biologici', 'fizici', 'ergonomici'] }, + filiala: 'Sediul central', + adresaFiliala: 'str. Nicolae Testemițanu 29, Chișinău', + telefonFiliala: '+373 22 000 101', + caemPrimeleDouaCifre: '86', + cormSubgrupaMajora: 'Personal medical profil chirurgical', + directiaSectiaSectorul: 'Bloc operator / Chirurgie', + numarulLoculuiDeMunca: 'TEST-CHIR-01', + caemDiviziune: '86.10', + clasaConditiilorDeMunca: '3.2', + numarLucratoriPosibili: 12, + tipFisa: 'STANDARD', + evaluareDetalii: commonEval, + radiatiiIonizante: false, + mijloaceProtectieColectiva: 'Ventilație locală, containere pentru obiecte ascuțite', + mijloaceProtectieIndividuala: 'Mănuși, mască, halat steril, vizieră', + echipamentLucru: 'Uniformă chirurgicală', + anexeIgienicoSanitare: { vestiar: true, chiuveta: true, wc: true, dus: true, salaMese: true, recreere: true }, + observatii: 'Set complet pentru testarea Anexa 4.', + exposures: { + create: [ + { tip: RiskExposureType.AGENT_CHIMIC, denumire: 'Glutaraldehidă', cas: '111-30-8', einecs: '203-856-5', timpExpunere: '2 h/zi', vep: '0,03 ppm', vlep: '0,1 ppm', caracteristici: 'iritant respirator' }, + { tip: RiskExposureType.PULBERI, denumire: 'Pulberi textile sterile', cas: '—', einecs: '—', timpExpunere: '1 h/zi', vep: '2 mg/m3', vlep: '5 mg/m3', caracteristici: 'pulberi inhalabile' }, + { tip: RiskExposureType.AGENT_BIOLOGIC, denumire: 'HBV/HCV/HIV', clasificare: 'grupa 3', caracteristici: 'risc prin înțepare/tăiere' }, + { tip: RiskExposureType.ZGOMOT, denumire: 'Echipamente bloc operator', timpExpunere: '4 h/zi', vep: '80 dB', vlep: '87 dB', caracteristici: 'zgomot intermitent' }, + { tip: RiskExposureType.VIBRATII, denumire: 'Instrumentar oscilant', zonaAfectata: 'mână-braț', timpExpunere: '30 min/zi', vep: '2,5 m/s2', vlep: '5 m/s2', caracteristici: 'vibrații locale' }, + { tip: RiskExposureType.CAMP_ELECTROMAGNETIC, denumire: 'Electrocauter', zonaAfectata: 'corp întreg', timpExpunere: '1 h/zi', vep: 'conform NU-10', vlep: 'conform NU-10', caracteristici: 'câmp EM local' }, + { tip: RiskExposureType.RADIATII_OPTICE, denumire: 'Lămpi chirurgicale', zonaAfectata: 'ochi', timpExpunere: '6 h/zi', vep: 'conform NU-10', vlep: 'conform NU-10', caracteristici: 'lumină intensă' }, + ], + }, + }, + }); + + const radiologyCard = await prisma.workplaceRiskCard.create({ + data: { + name: 'Test - Radiologie cu radiații ionizante', + riskFactors: { source: 'Control medical (5).docx', categories: ['radiații ionizante', 'câmp electromagnetic'] }, + filiala: 'Sediul central', + adresaFiliala: 'str. Nicolae Testemițanu 29, Chișinău', + telefonFiliala: '+373 22 000 102', + caemPrimeleDouaCifre: '86', + cormSubgrupaMajora: 'Personal imagistică medicală', + directiaSectiaSectorul: 'Diagnostic / Radiologie', + numarulLoculuiDeMunca: 'TEST-RAD-01', + caemDiviziune: '86.90', + clasaConditiilorDeMunca: '3.3', + numarLucratoriPosibili: 8, + tipFisa: 'STANDARD', + evaluareDetalii: { ...commonEval, riscInfectare: false, pozitieAsezat: true, pozitieOrtostatica: false }, + radiatiiIonizante: true, + radiatiiGrupa: 'A', + radiatiiAparatura: 'CT, Rx digital', + radiatiiSurse: 'închise', + radiatiiTipExpunere: 'X externă', + radiatiiMasuriProtectie: 'Ecran de protecție, șorț plumb, dozimetru individual', + mijloaceProtectieColectiva: 'Ecrane plumbate și semnalizare zonă controlată', + mijloaceProtectieIndividuala: 'Șorț plumb, ochelari, dozimetru', + echipamentLucru: 'Uniformă radiologie', + anexeIgienicoSanitare: { vestiar: true, chiuveta: true, wc: true, dus: true, salaMese: true, recreere: false }, + exposures: { + create: [ + { tip: RiskExposureType.CAMP_ELECTROMAGNETIC, denumire: 'Câmp electromagnetic RMN', zonaAfectata: 'corp întreg', timpExpunere: '4 h/zi', vep: 'conform NU-10', vlep: 'conform NU-10', caracteristici: 'câmp magnetic static intens' }, + { tip: RiskExposureType.ZGOMOT, denumire: 'Aparatură imagistică', timpExpunere: '3 h/zi', vep: '75 dB', vlep: '87 dB', caracteristici: 'zgomot tehnic' }, + ], + }, + }, + }); + + const remoteCard = await prisma.workplaceRiskCard.create({ + data: { + name: 'Test - Activități administrative la distanță', + riskFactors: { source: 'Control medical (5).docx', categories: ['vizual', 'neuropsihic', 'platforme digitale'] }, + filiala: 'Sediul central', + adresaFiliala: 'str. Nicolae Testemițanu 29, Chișinău', + telefonFiliala: '+373 22 000 103', + caemPrimeleDouaCifre: '86', + cormSubgrupaMajora: 'Personal administrativ', + directiaSectiaSectorul: 'Administrativ / Digital', + numarulLoculuiDeMunca: 'TEST-REMOTE-01', + caemDiviziune: '86.90', + clasaConditiilorDeMunca: '2', + numarLucratoriPosibili: 4, + tipFisa: 'DISTANTA_DIGITAL', + evaluareDetalii: { + echipa: false, + oreZi: '8', + schimburi: '1', + schimbNoapte: false, + pauzeOrganizate: true, + lucruMonitor: true, + platformeDigitale: true, + conduceMasina: false, + operatiuni: 'Operare HIS, e-mail, raportare digitală', + deplasari: true, + deplasariDescriere: 'Deplasări ocazionale la sediu', + manipulareRidicare: false, + manipulareCoborare: false, + manipulareImpingere: false, + manipulareTragere: false, + manipularePurtare: false, + manipulareDeplasare: false, + greutateMaxima: 'sub 3 kg', + suprasolicitariVizuale: true, + suprasolicitariAuditive: false, + suprasolicitariNeuropsihice: true, + alteRiscuri: 'Lucru prelungit la monitor', + }, + radiatiiIonizante: false, + mijloaceProtectieIndividuala: 'Scaun ergonomic, monitor extern', + echipamentLucru: 'Laptop corporativ', + anexeIgienicoSanitare: { vestiar: false, chiuveta: true, wc: true, dus: false, salaMese: false, recreere: true }, + observatii: 'Set pentru testarea Anexa 4A.', + }, + }); + + const employees = await Promise.all([ + prisma.employee.create({ + data: { + idnp: '1985061500016', + nume: 'Popescu', + prenume: 'Alexandru', + patronimic: 'Ion', + dataNasterii: d('1985-06-15'), + domiciliu: 'mun. Chișinău, str. Ștefan cel Mare 1', + adresaReala: 'mun. Chișinău, str. Test 1', + telefonPersonal: '+37369100001', + telefonServiciu: '+37322100001', + emailPersonal: 'alexandru.popescu.test@example.com', + emailCorporativ: 'alexandru.popescu@medpark.test', + sex: Sex.M, + codCpas: 'CPAS-001', + stareCivila: 'casatorit', + titluStiintific: ScientificTitle.doctor, + status: EmployeeStatus.activ, + }, + }), + prisma.employee.create({ + data: { + idnp: '1990032200017', + nume: 'Ionescu', + prenume: 'Maria', + patronimic: 'Vasile', + dataNasterii: d('1990-03-22'), + domiciliu: 'mun. Chișinău, str. Mihai Viteazul 5', + telefonPersonal: '+37369100002', + telefonServiciu: '+37322100002', + emailCorporativ: 'maria.ionescu@medpark.test', + sex: Sex.F, + status: EmployeeStatus.activ, + gradDizabilitateId: disability.id, + }, + }), + prisma.employee.create({ + data: { + idnp: '1978110800016', + nume: 'Rusu', + prenume: 'Viorel', + dataNasterii: d('1978-11-08'), + domiciliu: 'mun. Chișinău, str. Alba Iulia 12', + telefonPersonal: '+37369100003', + emailCorporativ: 'viorel.rusu@medpark.test', + sex: Sex.M, + status: EmployeeStatus.activ, + }, + }), + prisma.employee.create({ + data: { + idnp: '2001091400010', + nume: 'Cojocaru', + prenume: 'Elena', + dataNasterii: d('2001-09-14'), + domiciliu: 'mun. Chișinău, str. Trandafirilor 3', + telefonPersonal: '+37369100004', + emailCorporativ: 'elena.cojocaru@medpark.test', + sex: Sex.F, + status: EmployeeStatus.activ, + }, + }), + prisma.employee.create({ + data: { + idnp: '1995120100019', + nume: 'Munteanu', + prenume: 'Ana', + dataNasterii: d('1995-12-01'), + domiciliu: 'mun. Chișinău, bd. Dacia 20', + telefonPersonal: '+37369100005', + emailCorporativ: 'ana.munteanu@medpark.test', + sex: Sex.F, + status: EmployeeStatus.activ, + }, + }), + prisma.employee.create({ + data: { + idnp: '1989020300012', + nume: 'Lungu', + prenume: 'Sergiu', + dataNasterii: d('1989-02-03'), + domiciliu: 'mun. Chișinău, str. Laboratorului 7', + telefonPersonal: '+37369100006', + emailCorporativ: 'sergiu.lungu@medpark.test', + sex: Sex.M, + status: EmployeeStatus.activ, + }, + }), + ]); + + const [surgeon, nurse, radiologist, radiologyNurse, remoteAdmin, labDoctor] = employees; + + await prisma.identityDocument.createMany({ + data: employees.map((employee, index) => ({ + employeeId: employee.id, + tipAct: DocumentType.buletin_de_identitate, + seria: `T${index + 1}`, + nr: `TESTDOC${index + 1}`, + dataEmiterii: d('2021-01-10'), + autoritateEmitenta: 'ASP Test', + dataExpirarii: d(`2031-01-${10 + index}`), + })), + }); + + await prisma.familyMember.createMany({ + data: [ + { employeeId: surgeon.id, tip: FamilyMemberType.contact_principal, numePrenume: 'Popescu Elena', telefon: '+37368111111' }, + { employeeId: surgeon.id, tip: FamilyMemberType.copil, numePrenume: 'Popescu Andrei', dataNasterii: d('2015-05-20'), idnp: '2015052000015', tipScutireId: childTax.id }, + { employeeId: nurse.id, tip: FamilyMemberType.mama, numePrenume: 'Ionescu Tatiana', telefon: '+37368222222' }, + ], + }); + + await prisma.education.createMany({ + data: [ + { employeeId: surgeon.id, tipStudii: StudyType.superioare, institutia: 'USMF Nicolae Testemițanu', specialitatea: 'Chirurgie', dataAbsolvirii: d('2008-06-30'), nrSeriaDiploma: 'DIP-TEST-001', dataEmiterii: d('2008-07-10'), nrInregistrare: 'REG-001', confirmare: DiplomaStatus.confirmata, nivel: StudyLevel.postuniversitar, tipPostuniversitar: PostUniversityType.rezidentiat }, + { employeeId: nurse.id, tipStudii: StudyType.medii_de_specialitate, institutia: 'Colegiul Național de Medicină', specialitatea: 'Nursing', dataAbsolvirii: d('2012-06-30'), nrSeriaDiploma: 'DIP-TEST-002', confirmare: DiplomaStatus.confirmata, nivel: StudyLevel.de_baza }, + { employeeId: radiologist.id, tipStudii: StudyType.superioare, institutia: 'USMF Nicolae Testemițanu', specialitatea: 'Radiologie', dataAbsolvirii: d('2002-06-30'), nrSeriaDiploma: 'DIP-TEST-003', confirmare: DiplomaStatus.confirmata, nivel: StudyLevel.postuniversitar, tipPostuniversitar: PostUniversityType.rezidentiat }, + { employeeId: radiologyNurse.id, tipStudii: StudyType.medii_de_specialitate, institutia: 'Colegiul Național de Medicină', specialitatea: 'Radiologie', dataAbsolvirii: d('2022-06-30'), nrSeriaDiploma: 'DIP-TEST-004', confirmare: DiplomaStatus.confirmata, nivel: StudyLevel.de_baza }, + { employeeId: remoteAdmin.id, tipStudii: StudyType.superioare, institutia: 'ASEM', specialitatea: 'Management', dataAbsolvirii: d('2017-06-30'), nrSeriaDiploma: 'DIP-TEST-005', confirmare: DiplomaStatus.confirmata, nivel: StudyLevel.de_baza }, + { employeeId: labDoctor.id, tipStudii: StudyType.superioare, institutia: 'USMF Nicolae Testemițanu', specialitatea: 'Medicină de laborator', dataAbsolvirii: d('2013-06-30'), nrSeriaDiploma: 'DIP-TEST-006', confirmare: DiplomaStatus.confirmata, nivel: StudyLevel.postuniversitar, tipPostuniversitar: PostUniversityType.rezidentiat }, + ], + }); + + await prisma.qualification.createMany({ + data: [ + { employeeId: surgeon.id, categorie: QualificationCategory.superioara, dataObtinerii: d('2020-02-01'), dataUltimeiConfirmari: d('2024-02-01'), dataExpirarii: d('2029-02-01'), specialitate: 'Chirurgie' }, + { employeeId: nurse.id, categorie: QualificationCategory.cat_I, dataObtinerii: d('2021-03-01'), dataUltimeiConfirmari: d('2024-03-01'), dataExpirarii: d('2029-03-01'), specialitate: 'Nursing' }, + { employeeId: radiologist.id, categorie: QualificationCategory.superioara, dataObtinerii: d('2019-04-01'), dataUltimeiConfirmari: d('2024-04-01'), dataExpirarii: d('2029-04-01'), specialitate: 'Radiologie' }, + { employeeId: radiologyNurse.id, categorie: QualificationCategory.cat_II, dataObtinerii: d('2024-05-01'), dataUltimeiConfirmari: d('2024-05-01'), dataExpirarii: d('2029-05-01'), specialitate: 'Radiologie' }, + ], + }); + + await prisma.training.createMany({ + data: employees.map((employee, index) => ({ + employeeId: employee.id, + denumire: `Instruire Control medical test ${index + 1}`, + inceput: d('2026-01-10'), + sfirsit: d('2026-01-12'), + tip: index % 2 === 0 ? TrainingType.intern : TrainingType.extern_RM, + tara: 'Republica Moldova', + nrOre: 16, + organizatia: 'Medpark Academy Test', + certificat: true, + cost: '1000.00', + })), + }); + + await prisma.disciplinarySanction.createMany({ + data: [ + { employeeId: nurse.id, tip: DisciplinarySanctionType.avertisment, dataAplicarii: d('2026-02-01'), dataExpirarii: d('2026-08-01') }, + { employeeId: remoteAdmin.id, tip: DisciplinarySanctionType.mustrare, dataAplicarii: d('2025-09-01'), dataExpirarii: d('2026-03-01'), isStinsa: true }, + ], + }); + + const contractRows = [ + { employee: surgeon, dept: surgeryDept, nr: 'TEST-CIM-001', role: 'Chirurg', corm: '221201', card: surgeryCard, schedule: shiftSchedule }, + { employee: nurse, dept: surgeryDept, nr: 'TEST-CIM-002', role: 'Asistentă medicală chirurgie', corm: '222101', card: surgeryCard, schedule: shiftSchedule }, + { employee: radiologist, dept: radiologyDept, nr: 'TEST-CIM-003', role: 'Medic radiolog', corm: '221203', card: radiologyCard, schedule }, + { employee: radiologyNurse, dept: radiologyDept, nr: 'TEST-CIM-004', role: 'Asistentă radiologie', corm: '222102', card: radiologyCard, schedule }, + { employee: remoteAdmin, dept: remoteDept, nr: 'TEST-CIM-005', role: 'Specialist documente digitale', corm: '242101', card: remoteCard, schedule }, + { employee: labDoctor, dept: labDept, nr: 'TEST-CIM-006', role: 'Medic laborator', corm: '221207', card: surgeryCard, schedule }, + ]; + + for (const row of contractRows) { + const contract = await prisma.employmentContract.create({ + data: { + nrCim: row.nr, + employeeId: row.employee.id, + categorie: ContractCategory.principal, + dataSemnarii: d('2024-01-05'), + dataAngajarii: d('2024-01-15'), + perioada: ContractPeriod.nedeterminata, + functiaClasificator: row.corm, + codFunctie: row.corm, + functiaOrganigrama: row.role, + tipCim: ContractType.de_baza, + departmentId: row.dept.id, + regimMunca: 'normă întreagă', + tipSalarizare: SalaryType.fix, + salarizareDetails: { tip: 'fix', salariu: 15000 + contractRows.indexOf(row) * 500, zileConcediu: 28 }, + clausaAditionala: { test: true, source: 'Rubrici necesare (6).xlsx / CIM' }, + workScheduleId: row.schedule.id, + categoriiServicii: { + create: [ + { categorieId: `TEST-SERV-${contractRows.indexOf(row) + 1}`, tipRemunerare: 'tarif', sumaNeta: '250.00' }, + ], + }, + }, + }); + await prisma.auditLog.create({ + data: { userId: 'seed-test', userRole: 'hr_admin', action: 'CREATE', entity: 'EmploymentContract', entityId: contract.id }, + }); + } + + await prisma.benefit.createMany({ + data: [ + { + employeeId: nurse.id, + uniformaId: uniform.id, + halatId: coat.id, + ciupiciId: shoes.id, + ticheteMasa: true, + valoareTichet: '70.00', + alimentatiePersonal: true, + abonamentTel: '150.00', + aparatTelefonId: phone.id, + cardCompanie: 'TEST-CARD-001', + }, + { + employeeId: radiologyNurse.id, + uniformaId: uniform.id, + halatId: coat.id, + ticheteMasa: true, + valoareTichet: '70.00', + }, + ], + }); + + const profileByEmployeeId = new Map<string, string>(); + for (const row of contractRows) { + const radiology = row.card.id === radiologyCard.id; + const profile = await prisma.employeeMedicalProfile.create({ + data: { + employeeId: row.employee.id, + ocupatieCorm: `${row.role} (${row.corm})`, + workplaceRiskCardId: row.card.id, + dataUltimControlMedical: row.employee.id === surgeon.id ? null : d(row.employee.id === nurse.id ? '2025-02-01' : '2025-06-01'), + expusRadiatiiIonizante: radiology, + dataIntrarii: radiology ? d('2020-01-15') : null, + expunereAnterioaraPerioda: radiology ? '2017-2019' : null, + expunereAnterioaraAni: radiology ? 3 : null, + dozaCumulataExternaMsv: radiology ? '4.2500' : null, + dozaCumulataInternaMsv: radiology ? '0.8000' : null, + overexposures: radiology && row.employee.id === radiologist.id + ? { + create: [ + { fel: OverexposureKind.EXCEPTIONALA, tipExpunere: 'X externă', data: d('2023-05-12'), dozaMsv: '2.5000' }, + { fel: OverexposureKind.ACCIDENTALA, tipExpunere: 'gamma externă', data: d('2024-09-03'), dozaMsv: '1.2000' }, + ], + } + : undefined, + }, + }); + profileByEmployeeId.set(row.employee.id, profile.id); + } + + await prisma.medicalCheckup.createMany({ + data: [ + { employeeId: surgeon.id, tip: MedicalCheckupType.la_angajare, dataPlanificata: d('2026-05-20') }, + { employeeId: nurse.id, tip: MedicalCheckupType.periodic, dataPlanificata: d('2026-05-28') }, + { employeeId: radiologist.id, tip: MedicalCheckupType.la_reluarea_activitatii, dataPlanificata: d('2026-05-29') }, + { employeeId: surgeon.id, tip: MedicalCheckupType.periodic, dataPlanificata: d('2025-05-20'), dataEfectuata: d('2025-05-20'), verdict: MedicalVerdict.apt, recomandari: 'Control anual', valabilPanaLa: d('2026-05-20'), semnatDe: 'Dr. Test Apt', documenteGenerate: [{ name: 'Anexa_6_Final_Apt', url: 's3://test/anexa6_apt.docx', type: 'ANEXA_6' }] }, + { employeeId: nurse.id, tip: MedicalCheckupType.periodic, dataPlanificata: d('2025-04-20'), dataEfectuata: d('2025-04-20'), verdict: MedicalVerdict.apt_perioada_adaptare, recomandari: 'Adaptare 30 zile', valabilPanaLa: d('2026-04-20'), semnatDe: 'Dr. Test Adaptare', documenteGenerate: [{ name: 'Anexa_6_Final_Adaptare', url: 's3://test/anexa6_adaptare.docx', type: 'ANEXA_6' }] }, + { employeeId: radiologist.id, tip: MedicalCheckupType.periodic, dataPlanificata: d('2025-03-20'), dataEfectuata: d('2025-03-20'), verdict: MedicalVerdict.apt_conditionat, recomandari: 'Dozimetru obligatoriu', valabilPanaLa: d('2026-03-20'), semnatDe: 'Dr. Test Conditionat', documenteGenerate: [{ name: 'Anexa_6_Final_Conditionat', url: 's3://test/anexa6_conditionat.docx', type: 'ANEXA_6' }] }, + { employeeId: radiologyNurse.id, tip: MedicalCheckupType.suplimentar, dataPlanificata: d('2025-02-20'), dataEfectuata: d('2025-02-20'), verdict: MedicalVerdict.inapt_temporar, recomandari: 'Reevaluare peste 30 zile', valabilPanaLa: d('2025-03-20'), semnatDe: 'Dr. Test Temporar', documenteGenerate: [{ name: 'Anexa_6_Final_Temporar', url: 's3://test/anexa6_temporar.docx', type: 'ANEXA_6' }] }, + { employeeId: remoteAdmin.id, tip: MedicalCheckupType.periodic, dataPlanificata: d('2025-01-20'), dataEfectuata: d('2025-01-20'), verdict: MedicalVerdict.inapt, recomandari: 'Inapt pentru postul curent', valabilPanaLa: d('2025-02-20'), semnatDe: 'Dr. Test Inapt', documenteGenerate: [{ name: 'Anexa_6_Final_Inapt', url: 's3://test/anexa6_inapt.docx', type: 'ANEXA_6' }] }, + ], + }); + + const campaign = await prisma.evaluationCampaign.create({ + data: { + name: 'Test evaluare anuală nursing - Chirurgie 2026', + departmentId: surgeryDept.id, + month: d('2026-05-01'), + status: CampaignStatus.in_progress, + }, + }); + await prisma.evaluationForm.createMany({ + data: [ + { + campaignId: campaign.id, + employeeId: nurse.id, + abilitatiClinice: EvaluationScore.bine, + judecataClinica: EvaluationScore.bine, + manopere: EvaluationScore.bine, + gestionareaSarcinilor: EvaluationScore.mediu, + constiintaProfesionala: EvaluationScore.bine, + atitudineaPacienti: EvaluationScore.bine, + atitudineaColegi: EvaluationScore.bine, + atitudineaPersonalNonMed: EvaluationScore.mediu, + utilizareSmartphone: EvaluationScore.bine, + respectareaProgramului: EvaluationScore.bine, + respectareaDressCode: EvaluationScore.bine, + testJci: { score: 18, max_score: 20, percent: 90, source: 'academy_ocean_test' }, + completareaDocMed: true, + perfectioneazaCunostinte: true, + membruComitetCalitate: true, + functieDeMonitor: false, + inlocuiesteSuperiorul: false, + categorieCalculata: ProposedCategory.superioara, + }, + { + campaignId: campaign.id, + employeeId: surgeon.id, + abilitatiClinice: EvaluationScore.mediu, + judecataClinica: EvaluationScore.mediu, + manopere: EvaluationScore.bine, + categorieCalculata: ProposedCategory.fara, + }, + ], + }); + + const closedCampaign = await prisma.evaluationCampaign.create({ + data: { + name: 'Test evaluare nursing - Radiologie 2025', + departmentId: radiologyDept.id, + month: d('2025-11-01'), + status: CampaignStatus.closed, + }, + }); + await prisma.evaluationForm.create({ + data: { + campaignId: closedCampaign.id, + employeeId: radiologyNurse.id, + abilitatiClinice: EvaluationScore.bine, + judecataClinica: EvaluationScore.bine, + manopere: EvaluationScore.bine, + gestionareaSarcinilor: EvaluationScore.bine, + constiintaProfesionala: EvaluationScore.bine, + atitudineaPacienti: EvaluationScore.mediu, + atitudineaColegi: EvaluationScore.bine, + atitudineaPersonalNonMed: EvaluationScore.bine, + utilizareSmartphone: EvaluationScore.bine, + respectareaProgramului: EvaluationScore.bine, + respectareaDressCode: EvaluationScore.mediu, + completareaDocMed: true, + perfectioneazaCunostinte: true, + membruComitetCalitate: false, + functieDeMonitor: false, + inlocuiesteSuperiorul: false, + categorieCalculata: ProposedCategory.cat_I, + categorieAprobata: ProposedCategory.cat_I, + observatii: 'Formular închis pentru test read-only.', + completedAt: d('2025-11-20'), + }, + }); + + for (const type of [AnexaType.ANEXA_3, AnexaType.ANEXA_4, AnexaType.ANEXA_4A, AnexaType.ANEXA_4B, AnexaType.ANEXA_6]) { + await prisma.anexaTemplate.create({ + data: { + type, + name: `Test ${type}`, + contentJson: { source: 'templates/docx', note: 'DOCX template is stored on disk' }, + updatedById: 'seed-test', + }, + }); + } + + console.log('Seed summary:'); + console.log(` employees=${await prisma.employee.count()}`); + console.log(` workplaceRiskCards=${await prisma.workplaceRiskCard.count()}`); + console.log(` riskExposures=${await prisma.workplaceRiskExposure.count()}`); + console.log(` medicalCheckups=${await prisma.medicalCheckup.count()}`); + console.log(` evaluationForms=${await prisma.evaluationForm.count()}`); + console.log(` profiles=${profileByEmployeeId.size}`); +} + +main() + .catch((error: unknown) => { + console.error(error); + process.exitCode = 1; + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/apps/api/scripts/test-db.ts b/apps/api/scripts/test-db.ts new file mode 100644 index 0000000..e3b882f --- /dev/null +++ b/apps/api/scripts/test-db.ts @@ -0,0 +1,296 @@ +import { existsSync, readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +import { spawn, ChildProcess } from 'node:child_process'; +import { createServer } from 'node:net'; +import { PrismaClient } from '@prisma/client'; + +type CommandEnv = NodeJS.ProcessEnv; + +function loadEnvFile(filePath: string) { + if (!existsSync(filePath)) return; + const content = readFileSync(filePath, 'utf8'); + for (const line of content.split(/\r?\n/)) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith('#')) continue; + const match = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/); + if (!match) continue; + const [, key, rawValue] = match; + if (process.env[key] !== undefined) continue; + process.env[key] = rawValue.trim().replace(/^['"]|['"]$/g, ''); + } +} + +function loadLocalEnv() { + loadEnvFile(resolve(process.cwd(), '.env')); + loadEnvFile(resolve(process.cwd(), '..', '..', '.env')); +} + +function timestamp() { + const now = new Date(); + const pad = (value: number) => String(value).padStart(2, '0'); + return [ + now.getFullYear(), + pad(now.getMonth() + 1), + pad(now.getDate()), + '_', + pad(now.getHours()), + pad(now.getMinutes()), + pad(now.getSeconds()), + ].join(''); +} + +function databaseNameFromUrl(url: string) { + return decodeURIComponent(new URL(url).pathname.replace(/^\//, '')); +} + +function databaseUrl(baseUrl: string, dbName: string) { + const url = new URL(baseUrl); + url.pathname = `/${dbName}`; + return url.toString(); +} + +function adminUrl(baseUrl: string) { + const url = new URL(baseUrl); + url.pathname = '/postgres'; + return url.toString(); +} + +function assertTestDatabaseName(dbName: string) { + if (!/^hrm_medpark_test_[A-Za-z0-9_]+$/.test(dbName)) { + throw new Error(`Refusing unsafe database name "${dbName}". Expected hrm_medpark_test_*.`); + } +} + +function quotedIdentifier(dbName: string) { + assertTestDatabaseName(dbName); + return `"${dbName.replace(/"/g, '""')}"`; +} + +function pnpmCommand() { + return process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm'; +} + +function cleanEnv(env: CommandEnv) { + const cleaned: Record<string, string> = {}; + for (const [key, value] of Object.entries(env)) { + if (value === undefined || key.startsWith('=')) continue; + cleaned[key] = value; + } + return cleaned; +} + +async function createDatabase(baseUrl: string, dbName: string) { + assertTestDatabaseName(dbName); + const admin = new PrismaClient({ datasources: { db: { url: adminUrl(baseUrl) } } }); + try { + await admin.$executeRawUnsafe(`CREATE DATABASE ${quotedIdentifier(dbName)}`); + } finally { + await admin.$disconnect(); + } +} + +async function dropDatabase(baseUrl: string, dbName: string) { + assertTestDatabaseName(dbName); + const admin = new PrismaClient({ datasources: { db: { url: adminUrl(baseUrl) } } }); + try { + await admin.$executeRawUnsafe( + 'SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = $1 AND pid <> pg_backend_pid()', + dbName, + ); + await admin.$executeRawUnsafe(`DROP DATABASE IF EXISTS ${quotedIdentifier(dbName)}`); + } finally { + await admin.$disconnect(); + } +} + +async function runCommand(label: string, args: string[], env: CommandEnv) { + console.log(`\n> ${label}`); + await new Promise<void>((resolvePromise, reject) => { + const child = spawn(pnpmCommand(), args, { + cwd: process.cwd(), + env: cleanEnv(env), + stdio: 'inherit', + shell: process.platform === 'win32', + }); + child.on('error', reject); + child.on('exit', (code) => { + if (code === 0) resolvePromise(); + else reject(new Error(`${label} failed with exit code ${code ?? 'unknown'}`)); + }); + }); +} + +async function findFreePort() { + return new Promise<number>((resolvePromise, reject) => { + const server = createServer(); + server.on('error', reject); + server.listen(0, '127.0.0.1', () => { + const address = server.address(); + if (!address || typeof address === 'string') { + server.close(); + reject(new Error('Unable to allocate a free API port')); + return; + } + const port = address.port; + server.close(() => resolvePromise(port)); + }); + }); +} + +async function waitForApi(baseUrl: string, child: ChildProcess) { + const startedAt = Date.now(); + while (Date.now() - startedAt < 60_000) { + if (child.exitCode !== null) { + throw new Error(`Temporary API exited before becoming ready (exit code ${child.exitCode})`); + } + try { + const response = await fetch(`${baseUrl}/auth/dev-login`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username: 'readiness', role: 'hr_admin' }), + }); + if (response.status === 200 || response.status === 201) return; + } catch { + // API is still booting. + } + await new Promise((resolvePromise) => setTimeout(resolvePromise, 1000)); + } + throw new Error(`Temporary API did not become ready at ${baseUrl}`); +} + +async function startTemporaryApi(dbUrl: string, dbName: string) { + const port = Number(process.env.TEST_API_PORT ?? (await findFreePort())); + const baseUrl = `http://127.0.0.1:${port}/api/v1`; + const bucket = `hrm-docs-test-${dbName.replace(/_/g, '-')}`.slice(0, 63); + const env: CommandEnv = { + ...process.env, + DATABASE_URL: dbUrl, + PORT: String(port), + NODE_ENV: 'test', + ALLOW_DEV_LOGIN: 'true', + MINIO_BUCKET: bucket, + }; + + console.log(`\n> Starting temporary API on ${baseUrl}`); + const child = spawn(pnpmCommand(), ['exec', 'nest', 'start'], { + cwd: process.cwd(), + env: cleanEnv(env), + stdio: ['ignore', 'pipe', 'pipe'], + shell: process.platform === 'win32', + }); + child.stdout?.on('data', (chunk: Buffer) => process.stdout.write(`[api] ${chunk.toString()}`)); + child.stderr?.on('data', (chunk: Buffer) => process.stderr.write(`[api] ${chunk.toString()}`)); + await waitForApi(baseUrl, child); + return { child, baseUrl }; +} + +async function stopTemporaryApi(child: ChildProcess | null) { + if (!child || child.exitCode !== null) return; + const waitForExit = async () => { + if (child.exitCode !== null) return; + await new Promise<void>((resolvePromise) => { + const timeout = setTimeout(() => resolvePromise(), 10_000); + const done = () => { + clearTimeout(timeout); + resolvePromise(); + }; + child.once('exit', done); + child.once('close', done); + }); + }; + if (process.platform === 'win32' && child.pid) { + await new Promise<void>((resolvePromise) => { + const killer = spawn('taskkill', ['/pid', String(child.pid), '/T', '/F'], { stdio: 'ignore' }); + killer.on('exit', () => resolvePromise()); + killer.on('error', () => resolvePromise()); + }); + await waitForExit(); + child.stdout?.destroy(); + child.stderr?.destroy(); + child.unref(); + return; + } + child.kill('SIGTERM'); + await waitForExit(); + child.stdout?.destroy(); + child.stderr?.destroy(); + child.unref(); +} + +async function run() { + loadLocalEnv(); + const baseUrl = process.env.DATABASE_URL; + if (!baseUrl) throw new Error('DATABASE_URL is required. Put it in apps/api/.env or export it before running testdb:run.'); + + const dbName = `hrm_medpark_test_${timestamp()}`; + const dbUrl = databaseUrl(baseUrl, dbName); + const commandEnv: CommandEnv = { ...process.env, DATABASE_URL: dbUrl }; + let api: Awaited<ReturnType<typeof startTemporaryApi>> | null = null; + + console.log(`Creating temporary database ${dbName}...`); + await createDatabase(baseUrl, dbName); + + try { + await runCommand('prisma migrate deploy', ['exec', 'prisma', 'migrate', 'deploy'], commandEnv); + await runCommand('seed test data', ['exec', 'ts-node', 'scripts/seed-test-data.ts'], commandEnv); + + api = await startTemporaryApi(dbUrl, dbName); + await runCommand('verify functionality', ['exec', 'ts-node', 'scripts/verify-functionality.ts'], { + ...commandEnv, + API_BASE_URL: api.baseUrl, + }); + + console.log('\nTemporary database is ready for manual checks.'); + console.log(`DATABASE_URL=${dbUrl}`); + console.log('\nRun API manually from the repo root with:'); + console.log(` $env:DATABASE_URL='${dbUrl}'; pnpm.cmd --filter api dev`); + console.log('\nDrop it later with:'); + console.log(` $env:TEST_DATABASE_URL='${dbUrl}'; pnpm.cmd --filter api testdb:drop`); + } catch (error) { + console.error('\nTest database run failed. The database was left in place for inspection:'); + console.error(`DATABASE_URL=${dbUrl}`); + throw error; + } finally { + await stopTemporaryApi(api?.child ?? null); + } +} + +function targetDatabaseFromArgs(baseUrl: string) { + const arg = process.argv.slice(3).find((value) => value !== '--') ?? process.env.TEST_DATABASE_URL ?? process.env.TEST_DATABASE_NAME; + if (!arg) { + throw new Error('Provide a test DB name or URL: pnpm.cmd --filter api testdb:drop -- hrm_medpark_test_YYYYMMDD_HHMMSS'); + } + if (/^postgres(?:ql)?:\/\//.test(arg)) { + return { dbName: databaseNameFromUrl(arg), baseUrl: arg }; + } + return { dbName: arg, baseUrl }; +} + +async function drop() { + loadLocalEnv(); + const baseUrl = process.env.DATABASE_URL; + if (!baseUrl) throw new Error('DATABASE_URL is required for admin connection'); + const target = targetDatabaseFromArgs(baseUrl); + assertTestDatabaseName(target.dbName); + console.log(`Dropping temporary database ${target.dbName}...`); + await dropDatabase(target.baseUrl, target.dbName); + console.log(`Dropped ${target.dbName}.`); +} + +async function main() { + const command = process.argv[2] ?? 'run'; + if (command === 'run') { + await run(); + return; + } + if (command === 'drop') { + await drop(); + return; + } + throw new Error(`Unknown command "${command}". Use "run" or "drop".`); +} + +main().catch((error: unknown) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/apps/api/scripts/verify-functionality.ts b/apps/api/scripts/verify-functionality.ts new file mode 100644 index 0000000..29186e5 --- /dev/null +++ b/apps/api/scripts/verify-functionality.ts @@ -0,0 +1,446 @@ +import { existsSync, readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; +import ExcelJS = require('exceljs'); +import PizZip from 'pizzip'; +import { + AnexaType, + MedicalCheckupType, + MedicalVerdict, + PrismaClient, + RiskExposureType, +} from '@prisma/client'; +import { DocxTemplateService } from '../src/modules/medical/services/docx-template.service'; + +type HttpResult = { status: number; body: unknown; text: string }; + +const prisma = new PrismaClient(); +const warnings: string[] = []; + +function ok(message: string) { + console.log(`OK ${message}`); +} + +function warn(message: string) { + warnings.push(message); + console.warn(`WARN ${message}`); +} + +function assert(condition: unknown, message: string): asserts condition { + if (!condition) throw new Error(message); +} + +function dbNameFromUrl(url: string): string { + return decodeURIComponent(new URL(url).pathname.replace(/^\//, '')); +} + +function requireTemporaryDatabase() { + const url = process.env.DATABASE_URL; + if (!url) throw new Error('DATABASE_URL is required for verification'); + const dbName = dbNameFromUrl(url); + if (!dbName.startsWith('hrm_medpark_test_') && process.env.ALLOW_NON_TEST_DB !== 'true') { + throw new Error(`Refusing to verify non-test database "${dbName}". Expected hrm_medpark_test_*.`); + } + return dbName; +} + +function sourcePath(fileName: string) { + return resolve(process.cwd(), '..', '..', '..', fileName); +} + +function docxText(filePath: string): string { + const zip = new PizZip(readFileSync(filePath)); + const xml = Object.keys(zip.files) + .filter((name) => /^word\/(document|header|footer).*\.xml$/.test(name)) + .map((name) => zip.file(name)?.asText() ?? '') + .join('\n'); + return xml + .replace(/<\/w:p>/g, '\n') + .replace(/<[^>]+>/g, ' ') + .replace(/\s+/g, ' ') + .trim(); +} + +async function verifySourceFiles() { + const controlDocx = process.env.CONTROL_MEDICAL_DOCX ?? sourcePath('Control medical (5).docx'); + const rubriciXlsx = process.env.RUBRICI_NECESARE_XLSX ?? sourcePath('Rubrici necesare (6).xlsx'); + + assert(existsSync(controlDocx), `Missing source file: ${controlDocx}`); + assert(existsSync(rubriciXlsx), `Missing source file: ${rubriciXlsx}`); + + const controlText = docxText(controlDocx); + for (const phrase of [ + /Baza de date a angajatilor trebuie sa contina/i, + /Persoana expusa profesional la radiatii ionizante/i, + /Tipul controlului medical/i, + /Fisa de solicitare/i, + /aptitudine/i, + /Apt condi/i, + /Inapt temporar/i, + ]) { + assert(phrase.test(controlText), `Control medical checklist phrase not found: ${phrase}`); + } + + const workbook = new ExcelJS.Workbook(); + await workbook.xlsx.readFile(rubriciXlsx); + const rubrici = workbook.getWorksheet('Rubrici'); + const performance = workbook.getWorksheet('Sheet1'); + assert(rubrici, 'Rubrici necesare workbook must contain sheet "Rubrici"'); + assert(performance, 'Rubrici necesare workbook must contain sheet "Sheet1"'); + + const fields = new Set<string>(); + for (let rowIndex = 1; rowIndex <= rubrici.actualRowCount; rowIndex += 1) { + const value = excelCellText(rubrici.getRow(rowIndex).getCell(3)).trim(); + if (value) fields.add(value); + } + for (const field of ['IDNP', 'Nume', 'Prenume', 'Data nasterii', 'Domiciliu', 'Nr de telefon personal', 'tipul actului de identitate', 'Nr CIM']) { + assert(fields.has(field), `Rubrici checklist field not found: ${field}`); + } + + const performanceText = docxLikeSheetText(performance); + for (const phrase of ['Abilitati clinice nursing', 'Judecata clinica', 'Respectarea Dress Code', 'Membru unui comitet']) { + assert(performanceText.includes(phrase), `Performance checklist phrase not found: ${phrase}`); + } + + ok('source DOCX/XLSX checklists are present and readable'); +} + +function docxLikeSheetText(worksheet: ExcelJS.Worksheet) { + const parts: string[] = []; + worksheet.eachRow((row) => { + row.eachCell((cell) => { + const text = excelCellText(cell).trim(); + if (text) parts.push(text); + }); + }); + return parts.join(' '); +} + +function excelCellText(cell: ExcelJS.Cell) { + const value = cell.value; + if (value == null) return ''; + if (value instanceof Date) return value.toISOString(); + if (typeof value !== 'object') return String(value); + if ('text' in value && typeof value.text === 'string') return value.text; + if ('result' in value && value.result != null) return String(value.result); + if ('richText' in value && Array.isArray(value.richText)) { + return value.richText.map((part) => part.text).join(''); + } + if ('hyperlink' in value && 'text' in value && typeof value.text === 'string') return value.text; + return ''; +} + +async function verifyDatabaseCoverage() { + const [ + employees, + identityDocuments, + familyMembers, + educations, + qualifications, + trainings, + sanctions, + benefits, + contracts, + riskCards, + profiles, + checkups, + evaluationForms, + ] = await Promise.all([ + prisma.employee.count(), + prisma.identityDocument.count(), + prisma.familyMember.count(), + prisma.education.count(), + prisma.qualification.count(), + prisma.training.count(), + prisma.disciplinarySanction.count(), + prisma.benefit.count(), + prisma.employmentContract.count(), + prisma.workplaceRiskCard.count(), + prisma.employeeMedicalProfile.count(), + prisma.medicalCheckup.count(), + prisma.evaluationForm.count(), + ]); + + assert(employees >= 6, `Expected at least 6 employees, got ${employees}`); + assert(identityDocuments >= employees, 'Every seeded employee should have an identity document'); + assert(familyMembers >= 3, 'Expected family/contact records'); + assert(educations >= employees, 'Expected education records for all employees'); + assert(qualifications >= 4, 'Expected qualification records'); + assert(trainings >= employees, 'Expected training records for all employees'); + assert(sanctions >= 2, 'Expected disciplinary sanction scenarios'); + assert(benefits >= 2, 'Expected benefit scenarios'); + assert(contracts >= employees, 'Expected active CIM for all employees'); + assert(riskCards >= 3, 'Expected STANDARD, radiation, and DISTANTA_DIGITAL risk cards'); + assert(profiles >= employees, 'Expected medical profile for all employees'); + assert(checkups >= 8, 'Expected pending and completed checkups'); + assert(evaluationForms >= 3, 'Expected performance evaluation forms'); + + const exposureTypes = await prisma.workplaceRiskExposure.findMany({ select: { tip: true }, distinct: ['tip'] }); + const seededExposureTypes = new Set(exposureTypes.map((row) => row.tip)); + for (const type of Object.values(RiskExposureType)) { + assert(seededExposureTypes.has(type), `Missing risk exposure type in test seed: ${type}`); + } + + const verdicts = await prisma.medicalCheckup.findMany({ + where: { verdict: { not: null } }, + select: { verdict: true }, + distinct: ['verdict'], + }); + const seededVerdicts = new Set(verdicts.map((row) => row.verdict)); + for (const verdict of Object.values(MedicalVerdict)) { + assert(seededVerdicts.has(verdict), `Missing medical verdict scenario: ${verdict}`); + } + + const radiationProfiles = await prisma.employeeMedicalProfile.count({ where: { expusRadiatiiIonizante: true } }); + const overexposures = await prisma.radiationOverexposure.findMany({ select: { fel: true }, distinct: ['fel'] }); + const remoteCards = await prisma.workplaceRiskCard.count({ where: { tipFisa: 'DISTANTA_DIGITAL' } }); + const pending = await prisma.medicalCheckup.count({ where: { verdict: null } }); + + assert(radiationProfiles >= 2, 'Expected at least two radiation-exposed employees'); + assert(overexposures.length >= 2, 'Expected exceptional and accidental overexposure rows'); + assert(remoteCards >= 1, 'Expected Anexa 4A/DISTANTA_DIGITAL risk card'); + assert(pending >= 3, 'Expected pending checkups for medic inbox'); + + ok('database seed covers HR, performance, and Control medical scenarios'); +} + +function extractTemplatePlaceholders(fileName: string) { + const fullPath = resolve(process.cwd(), 'templates', 'docx', fileName); + assert(existsSync(fullPath), `Missing DOCX template: ${fullPath}`); + const zip = new PizZip(readFileSync(fullPath)); + const xml = Object.keys(zip.files) + .filter((name) => /^word\/(document|header|footer).*\.xml$/.test(name)) + .map((name) => zip.file(name)?.asText() ?? '') + .join('\n'); + const opens = (xml.match(/\{/g) ?? []).length; + const closes = (xml.match(/\}/g) ?? []).length; + assert(opens === closes, `${fileName} has unbalanced placeholders: opens=${opens}, closes=${closes}`); + const placeholders = Array.from(xml.matchAll(/\{([^{}]+)\}/g)).map((match) => match[1]); + return { placeholders, opens }; +} + +function valueForPlaceholder(name: string, index = 1) { + if (name.startsWith('cb')) return index % 2 === 0 ? '☐' : '☑'; + if (/data|PanaLa/i.test(name)) return '27.05.2026'; + if (/email/i.test(name)) return 'hr.test@medpark.md'; + if (/telefon|fax/i.test(name)) return '+373 22 000 000'; + if (/idnp/i.test(name)) return `19850615000${index}`; + if (/nr|numar|anNastere|ani/i.test(name)) return String(index); + if (/doza/i.test(name)) return (index + 0.25).toFixed(4); + return `Test ${name} ${index}`; +} + +function sampleDocxData(placeholders: string[]) { + const data: Record<string, unknown> = {}; + for (const raw of placeholders) { + const name = raw.replace(/^#|\//g, ''); + if (!name || raw.startsWith('#') || raw.startsWith('/')) continue; + data[name] = valueForPlaceholder(name); + } + const row = (index: number) => { + const values: Record<string, string> = {}; + for (const raw of placeholders) { + const name = raw.replace(/^#|\//g, ''); + if (!name || raw.startsWith('#') || raw.startsWith('/')) continue; + values[name] = valueForPlaceholder(name, index); + } + values.nr = String(index); + values.numePrenume = index === 1 ? 'Popescu Alexandru' : 'Ionescu Maria'; + values.denumire = index === 1 ? 'Glutaraldehidă' : 'HBV/HCV/HIV'; + values.tipExpunere = index === 1 ? 'X externă' : 'gamma externă'; + return values; + }; + for (const loopName of ['angajati', 'chimici', 'pulberi', 'biologici', 'zgomot', 'vibratii', 'campEM', 'optice', 'supraexpExceptionale', 'supraexpAccidentale']) { + data[loopName] = [row(1), row(2)]; + } + return data; +} + +async function verifyDocxTemplates() { + const service = new DocxTemplateService(); + const files: Record<AnexaType, string> = { + ANEXA_3: 'anexa-3.docx', + ANEXA_4: 'anexa-4.docx', + ANEXA_4A: 'anexa-4a.docx', + ANEXA_4B: 'anexa-4b.docx', + ANEXA_6: 'anexa-6.docx', + }; + + for (const [type, fileName] of Object.entries(files) as [AnexaType, string][]) { + const { placeholders, opens } = extractTemplatePlaceholders(fileName); + assert(opens > 0, `${fileName} should contain docxtemplater placeholders`); + const rendered = service.render(type, sampleDocxData(placeholders)); + const zip = new PizZip(rendered); + const badParts: string[] = []; + for (const name of Object.keys(zip.files).filter((entry) => /^word\/(document|header|footer).*\.xml$/.test(entry))) { + const xml = zip.file(name)?.asText() ?? ''; + if (/[{}]/.test(xml) || /\b(undefined|null)\b/i.test(xml)) badParts.push(name); + } + assert(badParts.length === 0, `${fileName} rendered XML still contains placeholders/nulls in ${badParts.join(', ')}`); + } + + ok('all Anexa DOCX templates render cleanly through DocxTemplateService'); +} + +async function isMinioAvailable() { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), 1500); + try { + const response = await fetch('http://localhost:9000/minio/health/live', { signal: controller.signal }); + return response.ok; + } catch { + return false; + } finally { + clearTimeout(timeout); + } +} + +async function apiRequest(baseUrl: string, method: string, path: string, body?: unknown, token?: string): Promise<HttpResult> { + let lastError: unknown; + for (let attempt = 1; attempt <= 3; attempt += 1) { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), 20_000); + try { + const headers: Record<string, string> = { Accept: 'application/json' }; + if (body !== undefined) headers['Content-Type'] = 'application/json'; + if (token) headers.Authorization = `Bearer ${token}`; + const response = await fetch(`${baseUrl}${path}`, { + method, + headers, + body: body === undefined ? undefined : JSON.stringify(body), + signal: controller.signal, + }); + const text = await response.text(); + let parsed: unknown = null; + try { + parsed = text ? JSON.parse(text) : null; + } catch { + parsed = text; + } + return { status: response.status, body: parsed, text }; + } catch (error) { + lastError = error; + if (attempt < 3) await new Promise((resolvePromise) => setTimeout(resolvePromise, 1000 * attempt)); + } finally { + clearTimeout(timeout); + } + } + throw new Error(`${method} ${path} failed after retries: ${String(lastError)}`); +} + +function tokenFrom(body: unknown) { + if (typeof body === 'object' && body && 'token' in body && typeof (body as { token: unknown }).token === 'string') { + return (body as { token: string }).token; + } + throw new Error('dev-login response did not include token'); +} + +async function verifyHttpSmoke(minioAvailable: boolean) { + const baseUrl = process.env.API_BASE_URL; + if (!baseUrl) { + warn('API_BASE_URL is not set; skipped HTTP smoke tests. testdb:run starts a temporary API automatically.'); + return; + } + + const adminLogin = await apiRequest(baseUrl, 'POST', '/auth/dev-login', { username: 'test-admin', role: 'hr_admin' }); + const specialistLogin = await apiRequest(baseUrl, 'POST', '/auth/dev-login', { username: 'test-specialist', role: 'hr_specialist' }); + const medicLogin = await apiRequest(baseUrl, 'POST', '/auth/dev-login', { username: 'test-medic', role: 'medic_familie' }); + assert(adminLogin.status === 201 || adminLogin.status === 200, `hr_admin dev-login failed: ${adminLogin.text}`); + assert(specialistLogin.status === 201 || specialistLogin.status === 200, `hr_specialist dev-login failed: ${specialistLogin.text}`); + assert(medicLogin.status === 201 || medicLogin.status === 200, `medic_familie dev-login failed: ${medicLogin.text}`); + const adminToken = tokenFrom(adminLogin.body); + const specialistToken = tokenFrom(specialistLogin.body); + const medicToken = tokenFrom(medicLogin.body); + + for (const path of ['/dashboard/stats', '/medical/risk-cards', '/medical/upcoming-expirations']) { + const response = await apiRequest(baseUrl, 'GET', path, undefined, adminToken); + assert(response.status >= 200 && response.status < 300, `GET ${path} failed: ${response.status} ${response.text}`); + } + + const employees = await prisma.employee.findMany({ + where: { status: 'activ', medicalProfile: { workplaceRiskCardId: { not: null } } }, + select: { id: true }, + take: 5, + }); + assert(employees.length >= 5, 'HTTP bulk smoke needs at least five eligible employees'); + const bulkBody = { + employeeIds: employees.map((employee) => employee.id), + tip: MedicalCheckupType.periodic, + dataPlanificata: '2026-06-15', + documentContext: { + telefon: '+373 22 000 000', + fax: '+373 22 000 001', + email: 'hr.test@medpark.md', + solicitant: 'Test HR Admin', + functia: 'Specialist resurse umane', + }, + }; + + const forbidden = await apiRequest(baseUrl, 'POST', '/medical/bulk/initiate', bulkBody, specialistToken); + assert(forbidden.status === 403, `hr_specialist bulk initiate should be 403, got ${forbidden.status}: ${forbidden.text}`); + + if (!minioAvailable) { + warn('MinIO is not reachable on localhost:9000; skipped full upload-dependent bulk success and medic completion HTTP tests.'); + ok('HTTP smoke passed for auth, read endpoints, and role-based 403'); + return; + } + + const bulk = await apiRequest(baseUrl, 'POST', '/medical/bulk/initiate', bulkBody, adminToken); + assert(bulk.status >= 200 && bulk.status < 300, `hr_admin bulk initiate failed: ${bulk.status} ${bulk.text}`); + assert(typeof bulk.body === 'object' && bulk.body && 'groupsCount' in bulk.body, 'bulk response should include groupsCount'); + + const pending = await prisma.medicalCheckup.findFirst({ + where: { verdict: null }, + orderBy: { createdAt: 'asc' }, + }); + assert(pending, 'No pending checkup found for medic completion smoke'); + const complete = await apiRequest( + baseUrl, + 'PATCH', + `/medical/checkups/${pending.id}/complete`, + { + verdict: MedicalVerdict.apt_conditionat, + dataEfectuata: '2026-06-16', + recomandari: 'Test: lucru cu dozimetru și reevaluare anuală.', + valabilPanaLa: '2027-06-16', + semnatDe: 'Dr. Verificare Test', + }, + medicToken, + ); + assert(complete.status >= 200 && complete.status < 300, `medic completion failed: ${complete.status} ${complete.text}`); + + const completed = await prisma.medicalCheckup.findUnique({ where: { id: pending.id } }); + assert(completed?.verdict === MedicalVerdict.apt_conditionat, 'Medic completion did not persist verdict'); + assert(completed.semnatDe === 'Dr. Verificare Test', 'Medic completion did not persist semnatDe'); + assert(Array.isArray(completed.documenteGenerate), 'Completed checkup should contain generated documents'); + assert(JSON.stringify(completed.documenteGenerate).includes('Anexa_6_Final'), 'Completed checkup should include final Anexa 6 document'); + + ok('HTTP smoke passed, including MinIO-backed document generation'); +} + +async function main() { + const dbName = requireTemporaryDatabase(); + console.log(`Verifying Medpark test database ${dbName}...`); + await verifySourceFiles(); + await verifyDatabaseCoverage(); + await verifyDocxTemplates(); + const minioAvailable = await isMinioAvailable(); + if (minioAvailable) ok('MinIO is reachable on localhost:9000'); + else warn('MinIO is not reachable on localhost:9000; upload-dependent checks will be skipped or marked failed.'); + await verifyHttpSmoke(minioAvailable); + + if (warnings.length > 0) { + console.log('\nVerification completed with warnings:'); + for (const message of warnings) console.log(`- ${message}`); + } else { + console.log('\nVerification completed without warnings.'); + } +} + +main() + .catch((error: unknown) => { + console.error(error); + process.exitCode = 1; + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/apps/api/src/app.module.ts b/apps/api/src/app.module.ts new file mode 100644 index 0000000..29f244a --- /dev/null +++ b/apps/api/src/app.module.ts @@ -0,0 +1,58 @@ +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { ThrottlerModule } from '@nestjs/throttler'; +import { BullModule } from '@nestjs/bull'; +import { I18nModule, AcceptLanguageResolver } from 'nestjs-i18n'; +import * as path from 'path'; +import { PrismaModule } from './common/prisma/prisma.module'; +import { AuditModule } from './common/audit/audit.module'; +import { AuthModule } from './modules/auth/auth.module'; +import { EmployeesModule } from './modules/employees/employees.module'; +import { DepartmentsModule } from './modules/departments/departments.module'; +import { ReferenceModule } from './modules/reference/reference.module'; +import { EvaluationModule } from './modules/evaluation/evaluation.module'; +import { MedicalModule } from './modules/medical/medical.module'; +import { DashboardModule } from './modules/dashboard/dashboard.module'; +import { ContractsGlobalModule } from './modules/contracts/contracts-global.module'; +import { AdminModule } from './modules/admin/admin.module'; +import { InventoryModule } from './modules/inventory/inventory.module'; +import { NotificationsModule } from './modules/notifications/notifications.module'; + +@Module({ + imports: [ + ConfigModule.forRoot({ isGlobal: true }), + + ThrottlerModule.forRoot([{ ttl: 60_000, limit: 100 }]), + + BullModule.forRoot({ + redis: { + host: process.env.REDIS_HOST ?? 'localhost', + port: Number(process.env.REDIS_PORT ?? 6379), + }, + }), + + I18nModule.forRoot({ + fallbackLanguage: 'ro', + loaderOptions: { + path: path.join(process.cwd(), 'i18n'), + watch: true, + }, + resolvers: [AcceptLanguageResolver], + }), + + PrismaModule, + AuditModule, + AuthModule, + EmployeesModule, + DepartmentsModule, + ReferenceModule, + EvaluationModule, + MedicalModule, + DashboardModule, + ContractsGlobalModule, + AdminModule, + InventoryModule, + NotificationsModule, + ], +}) +export class AppModule {} diff --git a/apps/api/src/common/audit/audit.decorator.ts b/apps/api/src/common/audit/audit.decorator.ts new file mode 100644 index 0000000..80d63f3 --- /dev/null +++ b/apps/api/src/common/audit/audit.decorator.ts @@ -0,0 +1,12 @@ +import { SetMetadata } from '@nestjs/common'; +import { AuditAction } from './audit.service'; + +export const AUDIT_META_KEY = 'audit_meta'; + +export interface AuditMeta { + action: AuditAction; + entity: string; +} + +export const Audit = (action: AuditAction, entity: string) => + SetMetadata(AUDIT_META_KEY, { action, entity } satisfies AuditMeta); diff --git a/apps/api/src/common/audit/audit.interceptor.ts b/apps/api/src/common/audit/audit.interceptor.ts new file mode 100644 index 0000000..aa8869b --- /dev/null +++ b/apps/api/src/common/audit/audit.interceptor.ts @@ -0,0 +1,43 @@ +import { + Injectable, + NestInterceptor, + ExecutionContext, + CallHandler, +} from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; +import { Observable, tap } from 'rxjs'; +import { AuditService } from './audit.service'; +import { AUDIT_META_KEY, AuditMeta } from './audit.decorator'; + +@Injectable() +export class AuditInterceptor implements NestInterceptor { + constructor( + private readonly auditService: AuditService, + private readonly reflector: Reflector, + ) {} + + intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> { + const meta = this.reflector.get<AuditMeta>( + AUDIT_META_KEY, + context.getHandler(), + ); + if (!meta) return next.handle(); + + const req = context.switchToHttp().getRequest(); + const user = req.user as { id: string; role: string } | undefined; + + return next.handle().pipe( + tap(() => { + if (!user) return; + void this.auditService.log({ + userId: user.id, + userRole: user.role, + ip: req.ip, + action: meta.action, + entity: meta.entity, + entityId: req.params?.id ?? 'bulk', + }); + }), + ); + } +} diff --git a/apps/api/src/common/audit/audit.module.ts b/apps/api/src/common/audit/audit.module.ts new file mode 100644 index 0000000..d1bf72c --- /dev/null +++ b/apps/api/src/common/audit/audit.module.ts @@ -0,0 +1,10 @@ +import { Global, Module } from '@nestjs/common'; +import { AuditService } from './audit.service'; +import { AuditInterceptor } from './audit.interceptor'; + +@Global() +@Module({ + providers: [AuditService, AuditInterceptor], + exports: [AuditService, AuditInterceptor], +}) +export class AuditModule {} diff --git a/apps/api/src/common/audit/audit.service.ts b/apps/api/src/common/audit/audit.service.ts new file mode 100644 index 0000000..c1dab94 --- /dev/null +++ b/apps/api/src/common/audit/audit.service.ts @@ -0,0 +1,38 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../prisma/prisma.service'; + +export type AuditAction = 'READ' | 'CREATE' | 'UPDATE' | 'DELETE' | 'EXPORT'; + +export interface AuditParams { + userId: string; + userRole: string; + ip?: string; + action: AuditAction; + entity: string; + entityId: string; + field?: string; + oldValue?: string; + newValue?: string; + reason?: string; +} + +@Injectable() +export class AuditService { + constructor(private readonly prisma: PrismaService) {} + + async log(params: AuditParams): Promise<void> { + await this.prisma.auditLog.create({ data: params }); + } + + async logRead(params: Omit<AuditParams, 'action'>): Promise<void> { + await this.log({ ...params, action: 'READ' }); + } + + async logChange( + params: Omit<AuditParams, 'action'> & { + action: 'CREATE' | 'UPDATE' | 'DELETE'; + }, + ): Promise<void> { + await this.log(params); + } +} diff --git a/apps/api/src/common/decorators/roles.decorator.ts b/apps/api/src/common/decorators/roles.decorator.ts new file mode 100644 index 0000000..23ca852 --- /dev/null +++ b/apps/api/src/common/decorators/roles.decorator.ts @@ -0,0 +1,13 @@ +import { SetMetadata } from '@nestjs/common'; + +export type AppRole = + | 'hr_admin' + | 'hr_specialist' + | 'nursing_director' + | 'quality_auditor' + | 'manager' + | 'medic_familie' + | 'employee'; + +export const ROLES_KEY = 'roles'; +export const Roles = (...roles: AppRole[]) => SetMetadata(ROLES_KEY, roles); diff --git a/apps/api/src/common/guards/roles.guard.ts b/apps/api/src/common/guards/roles.guard.ts new file mode 100644 index 0000000..8178be8 --- /dev/null +++ b/apps/api/src/common/guards/roles.guard.ts @@ -0,0 +1,19 @@ +import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; +import { AppRole, ROLES_KEY } from '../decorators/roles.decorator'; + +@Injectable() +export class RolesGuard implements CanActivate { + constructor(private reflector: Reflector) {} + + canActivate(context: ExecutionContext): boolean { + const required = this.reflector.getAllAndOverride<AppRole[]>(ROLES_KEY, [ + context.getHandler(), + context.getClass(), + ]); + if (!required?.length) return true; + + const { user } = context.switchToHttp().getRequest<{ user: { role: AppRole } }>(); + return required.includes(user?.role); + } +} diff --git a/apps/api/src/common/prisma/prisma.module.ts b/apps/api/src/common/prisma/prisma.module.ts new file mode 100644 index 0000000..7207426 --- /dev/null +++ b/apps/api/src/common/prisma/prisma.module.ts @@ -0,0 +1,9 @@ +import { Global, Module } from '@nestjs/common'; +import { PrismaService } from './prisma.service'; + +@Global() +@Module({ + providers: [PrismaService], + exports: [PrismaService], +}) +export class PrismaModule {} diff --git a/apps/api/src/common/prisma/prisma.service.ts b/apps/api/src/common/prisma/prisma.service.ts new file mode 100644 index 0000000..7ffd32d --- /dev/null +++ b/apps/api/src/common/prisma/prisma.service.ts @@ -0,0 +1,16 @@ +import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common'; +import { PrismaClient } from '@prisma/client'; + +@Injectable() +export class PrismaService + extends PrismaClient + implements OnModuleInit, OnModuleDestroy +{ + async onModuleInit() { + await this.$connect(); + } + + async onModuleDestroy() { + await this.$disconnect(); + } +} diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts new file mode 100644 index 0000000..3de65d9 --- /dev/null +++ b/apps/api/src/main.ts @@ -0,0 +1,37 @@ +import { NestFactory } from '@nestjs/core'; +import { + FastifyAdapter, + NestFastifyApplication, +} from '@nestjs/platform-fastify'; +import { ValidationPipe } from '@nestjs/common'; +import { AppModule } from './app.module'; + +async function bootstrap() { + const app = await NestFactory.create<NestFastifyApplication>( + AppModule, + new FastifyAdapter({ logger: true }), + ); + + app.setGlobalPrefix('api/v1'); + + app.useGlobalPipes( + new ValidationPipe({ + whitelist: true, + forbidNonWhitelisted: true, + transform: true, + }), + ); + + app.enableCors({ + origin: process.env.FRONTEND_URL + ? process.env.FRONTEND_URL + : /^http:\/\/localhost(:\d+)?$/, + credentials: true, + }); + + const port = process.env.PORT ?? 3001; + await app.listen(port, '0.0.0.0'); + console.log(`HRM API running on http://localhost:${port}/api/v1`); +} + +bootstrap(); diff --git a/apps/api/src/modules/admin/admin.module.ts b/apps/api/src/modules/admin/admin.module.ts new file mode 100644 index 0000000..9148ad9 --- /dev/null +++ b/apps/api/src/modules/admin/admin.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { AnexaTemplatesController } from './anexa-templates/anexa-templates.controller'; +import { AnexaTemplatesService } from './anexa-templates/anexa-templates.service'; + +@Module({ + controllers: [AnexaTemplatesController], + providers: [AnexaTemplatesService], +}) +export class AdminModule {} diff --git a/apps/api/src/modules/admin/anexa-templates/anexa-templates.controller.ts b/apps/api/src/modules/admin/anexa-templates/anexa-templates.controller.ts new file mode 100644 index 0000000..cf7a67f --- /dev/null +++ b/apps/api/src/modules/admin/anexa-templates/anexa-templates.controller.ts @@ -0,0 +1,54 @@ +import { + Controller, Get, Put, Post, Body, Param, UseGuards, Request, HttpCode, HttpStatus, +} from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { AnexaType } from '@prisma/client'; +import { RolesGuard } from '../../../common/guards/roles.guard'; +import { Roles } from '../../../common/decorators/roles.decorator'; +import { AnexaTemplatesService } from './anexa-templates.service'; +import { UpdateTemplateDto } from './dto/update-template.dto'; + +interface AuthReq extends Request { user: { id: string; role: string } } + +@Controller('admin/anexa-templates') +@UseGuards(AuthGuard('jwt'), RolesGuard) +@Roles('hr_admin') +export class AnexaTemplatesController { + constructor(private readonly svc: AnexaTemplatesService) {} + + // Literal routes BEFORE :type to avoid routing conflicts in Fastify + @Get('preview-employee') + getPreviewEmployee() { + return this.svc.getPreviewEmployee(); + } + + @Get() + list() { + return this.svc.list(); + } + + @Get(':type') + findOne(@Param('type') type: AnexaType) { + return this.svc.findOne(type); + } + + @Put(':type') + update(@Param('type') type: AnexaType, @Body() dto: UpdateTemplateDto, @Request() req: AuthReq) { + return this.svc.update(type, dto, req.user.id, req.user.role); + } + + @Get(':type/versions') + getVersions(@Param('type') type: AnexaType) { + return this.svc.getVersions(type); + } + + @Post(':type/restore/:versionId') + @HttpCode(HttpStatus.OK) + restore( + @Param('type') type: AnexaType, + @Param('versionId') versionId: string, + @Request() req: AuthReq, + ) { + return this.svc.restore(type, versionId, req.user.id, req.user.role); + } +} diff --git a/apps/api/src/modules/admin/anexa-templates/anexa-templates.service.ts b/apps/api/src/modules/admin/anexa-templates/anexa-templates.service.ts new file mode 100644 index 0000000..855350b --- /dev/null +++ b/apps/api/src/modules/admin/anexa-templates/anexa-templates.service.ts @@ -0,0 +1,116 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import { AnexaType } from '@prisma/client'; +import { PrismaService } from '../../../common/prisma/prisma.service'; +import { AuditService } from '../../../common/audit/audit.service'; +import { UpdateTemplateDto } from './dto/update-template.dto'; + +const ANEXA_NAMES: Record<AnexaType, string> = { + ANEXA_3: 'Fișa de solicitare a examenului medical', + ANEXA_4: 'Fișa de evaluare a riscurilor profesionale', + ANEXA_4A: 'Fișa de evaluare — muncă la distanță/platforme digitale', + ANEXA_4B: 'Supliment radiații ionizante', + ANEXA_6: 'Verdict medic de familie', +}; + +@Injectable() +export class AnexaTemplatesService { + constructor( + private readonly prisma: PrismaService, + private readonly audit: AuditService, + ) {} + + list() { + return this.prisma.anexaTemplate.findMany({ + select: { id: true, type: true, name: true, updatedById: true, updatedAt: true }, + orderBy: { type: 'asc' }, + }); + } + + async findOne(type: AnexaType) { + const t = await this.prisma.anexaTemplate.findUnique({ where: { type } }); + if (!t) throw new NotFoundException(`Template ${type} nu există`); + return t; + } + + async update(type: AnexaType, dto: UpdateTemplateDto, userId: string, role: string) { + const existing = await this.prisma.anexaTemplate.findUnique({ where: { type } }); + + if (existing) { + await this.prisma.anexaTemplateVersion.create({ + data: { + templateId: existing.id, + contentJson: existing.contentJson as never, + savedById: userId, + }, + }); + } + + const template = await this.prisma.anexaTemplate.upsert({ + where: { type }, + update: { + contentJson: dto.contentJson as never, + updatedById: userId, + ...(dto.name ? { name: dto.name } : {}), + }, + create: { + type, + name: dto.name ?? ANEXA_NAMES[type], + contentJson: dto.contentJson as never, + updatedById: userId, + }, + }); + + await this.audit.logChange({ + userId, + userRole: role, + action: 'UPDATE', + entity: 'AnexaTemplate', + entityId: template.id, + }); + return template; + } + + getVersions(type: AnexaType) { + return this.prisma.anexaTemplateVersion.findMany({ + where: { template: { type } }, + orderBy: { savedAt: 'desc' }, + take: 50, + }); + } + + async restore(type: AnexaType, versionId: string, userId: string, role: string) { + const version = await this.prisma.anexaTemplateVersion.findUniqueOrThrow({ + where: { id: versionId }, + }); + return this.update(type, { contentJson: version.contentJson }, userId, role); + } + + getPreviewEmployee() { + return this.prisma.employee.findFirst({ + select: { + id: true, + idnp: true, + nume: true, + prenume: true, + dataNasterii: true, + contracts: { + select: { + functiaOrganigrama: true, + functiaClasificator: true, + department: { select: { name: true } }, + }, + orderBy: { dataAngajarii: 'desc' }, + take: 1, + }, + medicalProfile: { + select: { + ocupatieCorm: true, + dozaCumulataExternaMsv: true, + dozaCumulataInternaMsv: true, + }, + }, + }, + orderBy: { createdAt: 'desc' }, + }); + } +} diff --git a/apps/api/src/modules/admin/anexa-templates/dto/update-template.dto.ts b/apps/api/src/modules/admin/anexa-templates/dto/update-template.dto.ts new file mode 100644 index 0000000..9403a44 --- /dev/null +++ b/apps/api/src/modules/admin/anexa-templates/dto/update-template.dto.ts @@ -0,0 +1,10 @@ +import { IsOptional, IsString } from 'class-validator'; + +export class UpdateTemplateDto { + @IsOptional() + contentJson?: unknown; + + @IsOptional() + @IsString() + name?: string; +} diff --git a/apps/api/src/modules/auth/auth.controller.ts b/apps/api/src/modules/auth/auth.controller.ts new file mode 100644 index 0000000..3796eb8 --- /dev/null +++ b/apps/api/src/modules/auth/auth.controller.ts @@ -0,0 +1,50 @@ +import { Controller, Post, Body, Get, UseGuards, Request, ForbiddenException } from '@nestjs/common'; +import { JwtService } from '@nestjs/jwt'; +import { AuthGuard } from '@nestjs/passport'; + +const DEV_SECRET = process.env.DEV_JWT_SECRET ?? 'dev-secret-hrm-2026'; + +const VALID_ROLES = [ + 'hr_admin', 'hr_specialist', 'nursing_director', + 'quality_auditor', 'manager', 'medic_familie', 'employee', +]; + +@Controller('auth') +export class AuthController { + constructor(private readonly jwt: JwtService) {} + + /** + * Local dev login — generates HS256 token. + * Blocked in production via NODE_ENV check. + * Safe in production: when KEYCLOAK_URL is set, the JWT strategy uses RS256/JWKS + * and will reject any HS256 token automatically. + */ + @Post('dev-login') + devLogin(@Body() body: { username?: string; role?: string }) { + if (process.env.NODE_ENV === 'production' && process.env.ALLOW_DEV_LOGIN !== 'true') { + throw new ForbiddenException('Dev-login este dezactivat în producție'); + } + const username = (body.username ?? 'admin').trim() || 'admin'; + const role = VALID_ROLES.includes(body.role ?? '') ? body.role! : 'hr_admin'; + + const payload = { + sub: `dev-${role}`, + preferred_username: username, + realm_access: { roles: [role] }, + }; + + const token = this.jwt.sign(payload, { + secret: DEV_SECRET, + expiresIn: '8h', + }); + + return { token, username, role }; + } + + /** Returns current user info from JWT — useful for the frontend */ + @Get('me') + @UseGuards(AuthGuard('jwt')) + me(@Request() req: { user: { id: string; username: string; role: string } }) { + return req.user; + } +} diff --git a/apps/api/src/modules/auth/auth.module.ts b/apps/api/src/modules/auth/auth.module.ts new file mode 100644 index 0000000..0997a48 --- /dev/null +++ b/apps/api/src/modules/auth/auth.module.ts @@ -0,0 +1,16 @@ +import { Module } from '@nestjs/common'; +import { PassportModule } from '@nestjs/passport'; +import { JwtModule } from '@nestjs/jwt'; +import { KeycloakStrategy } from './keycloak.strategy'; +import { AuthController } from './auth.controller'; + +@Module({ + imports: [ + PassportModule.register({ defaultStrategy: 'jwt' }), + JwtModule.register({}), + ], + controllers: [AuthController], + providers: [KeycloakStrategy], + exports: [PassportModule], +}) +export class AuthModule {} diff --git a/apps/api/src/modules/auth/keycloak.strategy.ts b/apps/api/src/modules/auth/keycloak.strategy.ts new file mode 100644 index 0000000..c553c08 --- /dev/null +++ b/apps/api/src/modules/auth/keycloak.strategy.ts @@ -0,0 +1,93 @@ +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { PassportStrategy } from '@nestjs/passport'; +import { ExtractJwt, Strategy } from 'passport-jwt'; +import { passportJwtSecret } from 'jwks-rsa'; +import { AppRole } from '../../common/decorators/roles.decorator'; + +interface KeycloakToken { + sub: string; + preferred_username: string; + email?: string; + realm_access?: { roles: string[] }; + resource_access?: Record<string, { roles: string[] }>; +} + +type JwksSecretCallback = ( + request: unknown, + rawJwtToken: string, + done: (err: Error | null, secret?: string | Buffer) => void, +) => void; + +const DEV_SECRET = process.env.DEV_JWT_SECRET ?? 'dev-secret-hrm-2026'; + +// Lazy-initialised JWKS provider (only when KEYCLOAK_URL is set) +let jwksProvider: JwksSecretCallback | null = null; +function getJwksProvider(): JwksSecretCallback { + if (!jwksProvider) { + jwksProvider = passportJwtSecret({ + cache: true, + rateLimit: true, + jwksRequestsPerMinute: 5, + jwksUri: `${process.env.KEYCLOAK_URL}/realms/${process.env.KEYCLOAK_REALM}/protocol/openid-connect/certs`, + }) as unknown as JwksSecretCallback; + } + return jwksProvider; +} + +function parseTokenHeader(raw: string): Record<string, unknown> { + try { + return JSON.parse(Buffer.from(raw.split('.')[0], 'base64url').toString('utf8')); + } catch { + return {}; + } +} + +@Injectable() +export class KeycloakStrategy extends PassportStrategy(Strategy, 'jwt') { + constructor() { + super({ + jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + ignoreExpiration: false, + // Accept both HS256 (dev tokens) and RS256 (Keycloak tokens) + algorithms: ['HS256', 'RS256'], + secretOrKeyProvider: ( + request: unknown, + rawToken: string, + done: (err: Error | null, secret?: string | Buffer) => void, + ) => { + const header = parseTokenHeader(rawToken); + if (header['alg'] === 'HS256') { + // Dev-login token — validate with local secret + done(null, DEV_SECRET); + return; + } + // Keycloak RS256 token — validate via JWKS + if (!process.env.KEYCLOAK_URL) { + done(new UnauthorizedException('Keycloak not configured for RS256')); + return; + } + getJwksProvider()(request, rawToken, done); + }, + }); + } + + validate(payload: KeycloakToken) { + const realmRoles = payload.realm_access?.roles ?? []; + const clientRoles = + payload.resource_access?.[process.env.KEYCLOAK_CLIENT_ID ?? 'hrm-api'] + ?.roles ?? []; + + const hrm_roles: AppRole[] = [ + 'hr_admin', 'hr_specialist', 'nursing_director', + 'quality_auditor', 'manager', 'medic_familie', 'employee', + ]; + + const role = [...realmRoles, ...clientRoles].find((r) => + hrm_roles.includes(r as AppRole), + ) as AppRole | undefined; + + if (!role) throw new UnauthorizedException('No HRM role assigned'); + + return { id: payload.sub, username: payload.preferred_username, role }; + } +} diff --git a/apps/api/src/modules/contracts/contracts-global.controller.ts b/apps/api/src/modules/contracts/contracts-global.controller.ts new file mode 100644 index 0000000..4f6b1f8 --- /dev/null +++ b/apps/api/src/modules/contracts/contracts-global.controller.ts @@ -0,0 +1,39 @@ +import { Controller, Get, Query, UseGuards, Request } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from '../../common/guards/roles.guard'; +import { Roles } from '../../common/decorators/roles.decorator'; +import { ContractsGlobalService, ContractStatus } from './contracts-global.service'; + +interface AuthReq extends Request { user: { id: string; role: string } } + +interface ContractsQuery { + page?: string; + limit?: string; + departmentId?: string; + perioada?: string; + status?: ContractStatus; + search?: string; +} + +@Controller('contracts') +@UseGuards(AuthGuard('jwt'), RolesGuard) +export class ContractsGlobalController { + constructor(private readonly svc: ContractsGlobalService) {} + + @Get() + @Roles('hr_admin', 'hr_specialist') + findAll(@Query() q: ContractsQuery, @Request() req: AuthReq) { + return this.svc.findAll( + { + page: q.page ? Number(q.page) : 1, + limit: q.limit ? Number(q.limit) : 50, + departmentId: q.departmentId, + perioada: q.perioada, + status: q.status, + search: q.search, + }, + req.user.id, + req.user.role, + ); + } +} diff --git a/apps/api/src/modules/contracts/contracts-global.module.ts b/apps/api/src/modules/contracts/contracts-global.module.ts new file mode 100644 index 0000000..dd81492 --- /dev/null +++ b/apps/api/src/modules/contracts/contracts-global.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { ContractsGlobalController } from './contracts-global.controller'; +import { ContractsGlobalService } from './contracts-global.service'; + +@Module({ + controllers: [ContractsGlobalController], + providers: [ContractsGlobalService], +}) +export class ContractsGlobalModule {} diff --git a/apps/api/src/modules/contracts/contracts-global.service.ts b/apps/api/src/modules/contracts/contracts-global.service.ts new file mode 100644 index 0000000..5c0a0b7 --- /dev/null +++ b/apps/api/src/modules/contracts/contracts-global.service.ts @@ -0,0 +1,105 @@ +import { Injectable } from '@nestjs/common'; +import { Prisma, ContractPeriod } from '@prisma/client'; +import { PrismaService } from '../../common/prisma/prisma.service'; +import { AuditService } from '../../common/audit/audit.service'; + +export type ContractStatus = 'activ' | 'expirat' | 'expira_in_curand'; + +interface ListQuery { + page: number; + limit: number; + departmentId?: string; + perioada?: string; + status?: ContractStatus; + search?: string; +} + +@Injectable() +export class ContractsGlobalService { + constructor( + private readonly prisma: PrismaService, + private readonly audit: AuditService, + ) {} + + async findAll(query: ListQuery, userId: string, role: string) { + const { page, limit, departmentId, perioada, status, search } = query; + + // Issue 4: cap limit at 200 + const safLimit = Math.min(limit, 200); + + const now = new Date(); + const in30Days = new Date(now.getTime() + 30 * 86_400_000); + + // Issue 1: use Prisma.EmploymentContractWhereInput instead of Record<string, unknown> + const where: Prisma.EmploymentContractWhereInput = {}; + if (departmentId) where.departmentId = departmentId; + if (perioada) where.perioada = perioada as ContractPeriod; + if (search) { + where.employee = { + OR: [ + { nume: { contains: search, mode: 'insensitive' } }, + { prenume: { contains: search, mode: 'insensitive' } }, + ], + }; + } + + // Issue 2: push status filter to DB instead of in-memory full-table scan + if (status === 'expirat') { + where.OR = [ + { dataDemisiei: { lt: now } }, + { AND: [{ perioada: ContractPeriod.determinata }, { dataTerminarii: { lt: now } }] }, + ]; + } else if (status === 'expira_in_curand') { + where.AND = [ + { dataDemisiei: null }, + { perioada: ContractPeriod.determinata }, + { dataTerminarii: { gte: now, lte: in30Days } }, + ]; + } else if (status === 'activ') { + where.dataDemisiei = null; + where.NOT = { + OR: [ + { dataTerminarii: { lt: now } }, + { AND: [{ dataTerminarii: { gte: now, lte: in30Days } }, { perioada: ContractPeriod.determinata }] }, + ], + }; + } + + const include = { + employee: { select: { id: true, idnp: true, nume: true, prenume: true } }, + department: { select: { id: true, name: true } }, + workSchedule: { select: { id: true, name: true } }, + categoriiServicii: true, + } satisfies Prisma.EmploymentContractInclude; + + const [total, rows] = await this.prisma.$transaction([ + this.prisma.employmentContract.count({ where }), + this.prisma.employmentContract.findMany({ + where, + include, + orderBy: { dataAngajarii: 'desc' }, + skip: (page - 1) * safLimit, + take: safLimit, + }), + ]); + + const items = rows.map((c) => ({ ...c, status: this.computeStatus(c, now) })); + + await this.audit.logRead({ userId, userRole: role, entity: 'EmploymentContract', entityId: 'GLOBAL_LIST' }); + return { total, page, limit: safLimit, items }; + } + + private computeStatus( + c: { dataDemisiei: Date | null; perioada: ContractPeriod; dataTerminarii: Date | null }, + now: Date, + ): ContractStatus { + // Issue 3: use <= instead of < + if (c.dataDemisiei && c.dataDemisiei <= now) return 'expirat'; + if (c.perioada === ContractPeriod.determinata && c.dataTerminarii) { + const daysLeft = Math.floor((c.dataTerminarii.getTime() - now.getTime()) / 86_400_000); + if (daysLeft < 0) return 'expirat'; + if (daysLeft <= 30) return 'expira_in_curand'; + } + return 'activ'; + } +} diff --git a/apps/api/src/modules/dashboard/dashboard.controller.ts b/apps/api/src/modules/dashboard/dashboard.controller.ts new file mode 100644 index 0000000..c8c2763 --- /dev/null +++ b/apps/api/src/modules/dashboard/dashboard.controller.ts @@ -0,0 +1,14 @@ +import { Controller, Get, UseGuards } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { DashboardService } from './dashboard.service'; + +@Controller('dashboard') +@UseGuards(AuthGuard('jwt')) +export class DashboardController { + constructor(private readonly svc: DashboardService) {} + + @Get('stats') + getStats() { + return this.svc.getStats(); + } +} diff --git a/apps/api/src/modules/dashboard/dashboard.module.ts b/apps/api/src/modules/dashboard/dashboard.module.ts new file mode 100644 index 0000000..c4a4a45 --- /dev/null +++ b/apps/api/src/modules/dashboard/dashboard.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { DashboardController } from './dashboard.controller'; +import { DashboardService } from './dashboard.service'; + +@Module({ + controllers: [DashboardController], + providers: [DashboardService], +}) +export class DashboardModule {} diff --git a/apps/api/src/modules/dashboard/dashboard.service.ts b/apps/api/src/modules/dashboard/dashboard.service.ts new file mode 100644 index 0000000..bf1783c --- /dev/null +++ b/apps/api/src/modules/dashboard/dashboard.service.ts @@ -0,0 +1,136 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../../common/prisma/prisma.service'; + +@Injectable() +export class DashboardService { + constructor(private readonly prisma: PrismaService) {} + + async getStats() { + const today = new Date(); + const in30 = new Date(today); in30.setDate(today.getDate() + 30); + const in60 = new Date(today); in60.setDate(today.getDate() + 60); + const in90 = new Date(today); in90.setDate(today.getDate() + 90); + const ago30 = new Date(today); ago30.setDate(today.getDate() - 30); + + const [ + employeesByStatus, + activeContracts, + contractsDeterminata, + recentHires, + activeSanctions, + expiringDocs, + upcomingCheckups, + expiringQualifications, + ] = await Promise.all([ + // Employee counts by status + this.prisma.employee.groupBy({ + by: ['status'], + _count: { _all: true }, + }), + + // Active contracts (no dataDemisiei) + this.prisma.employmentContract.count({ + where: { dataDemisiei: null }, + }), + + // Determinata contracts expiring in 30 days + this.prisma.employmentContract.findMany({ + where: { + dataDemisiei: null, + perioada: 'determinata', + dataTerminarii: { gte: today, lte: in30 }, + }, + select: { + id: true, + nrCim: true, + dataTerminarii: true, + employee: { select: { id: true, nume: true, prenume: true, idnp: true } }, + department: { select: { name: true } }, + }, + orderBy: { dataTerminarii: 'asc' }, + take: 20, + }), + + // Recent hires (last 30 days) + this.prisma.employmentContract.count({ + where: { + dataAngajarii: { gte: ago30 }, + dataDemisiei: null, + }, + }), + + // Active (non-stinsa) disciplinary sanctions + this.prisma.disciplinarySanction.count({ + where: { isStinsa: false }, + }), + + // Identity documents expiring in 30 days + this.prisma.identityDocument.findMany({ + where: { + dataExpirarii: { gte: today, lte: in30 }, + }, + select: { + id: true, + tipAct: true, + dataExpirarii: true, + employee: { select: { id: true, nume: true, prenume: true, idnp: true } }, + }, + orderBy: { dataExpirarii: 'asc' }, + take: 20, + }), + + // Medical checkups due in 60 days (dataPlanificata, not yet effectuated) + this.prisma.medicalCheckup.findMany({ + where: { + dataEfectuata: null, + dataPlanificata: { gte: today, lte: in60 }, + }, + select: { + id: true, + tip: true, + dataPlanificata: true, + employee: { select: { id: true, nume: true, prenume: true, idnp: true } }, + }, + orderBy: { dataPlanificata: 'asc' }, + take: 20, + }), + + // Qualifications expiring in 90 days + this.prisma.qualification.findMany({ + where: { + dataExpirarii: { gte: today, lte: in90 }, + }, + select: { + id: true, + categorie: true, + dataExpirarii: true, + employee: { select: { id: true, nume: true, prenume: true, idnp: true } }, + }, + orderBy: { dataExpirarii: 'asc' }, + take: 20, + }), + ]); + + const statusMap = Object.fromEntries( + employeesByStatus.map((r) => [r.status, r._count._all]), + ); + + return { + employees: { + total: Object.values(statusMap).reduce((a, b) => a + b, 0), + activ: statusMap['activ'] ?? 0, + concediat: statusMap['concediat'] ?? 0, + suspendat: statusMap['suspendat'] ?? 0, + }, + activeContracts, + recentHires, + activeSanctions, + expirations: { + contractsDeterminata, + expiringDocs, + upcomingCheckups, + expiringQualifications, + }, + }; + } +} diff --git a/apps/api/src/modules/departments/departments.controller.ts b/apps/api/src/modules/departments/departments.controller.ts new file mode 100644 index 0000000..590aca6 --- /dev/null +++ b/apps/api/src/modules/departments/departments.controller.ts @@ -0,0 +1,44 @@ +import { Controller, Get, Post, Patch, Delete, Body, Param, ParseUUIDPipe, UseGuards, HttpCode, HttpStatus } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from '../../common/guards/roles.guard'; +import { Roles } from '../../common/decorators/roles.decorator'; +import { DepartmentsService } from './departments.service'; + +@Controller('departments') +@UseGuards(AuthGuard('jwt'), RolesGuard) +export class DepartmentsController { + constructor(private readonly svc: DepartmentsService) {} + + @Get() + findAll() { + return this.svc.findAll(); + } + + @Get(':id') + findOne(@Param('id', ParseUUIDPipe) id: string) { + return this.svc.findOne(id); + } + + @Post() + @Roles('hr_admin') + create(@Body() body: { name: string; code?: string; parentId?: string }) { + return this.svc.create(body); + } + + @Patch(':id') + @Roles('hr_admin') + update( + @Param('id', ParseUUIDPipe) id: string, + @Body() body: { parentId?: string | null; name?: string }, + ) { + if (body.name !== undefined) return this.svc.rename(id, body.name); + return this.svc.move(id, body.parentId ?? null); + } + + @Delete(':id') + @Roles('hr_admin') + @HttpCode(HttpStatus.NO_CONTENT) + remove(@Param('id', ParseUUIDPipe) id: string) { + return this.svc.delete(id); + } +} diff --git a/apps/api/src/modules/departments/departments.module.ts b/apps/api/src/modules/departments/departments.module.ts new file mode 100644 index 0000000..eaf0f61 --- /dev/null +++ b/apps/api/src/modules/departments/departments.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { DepartmentsController } from './departments.controller'; +import { DepartmentsService } from './departments.service'; + +@Module({ + controllers: [DepartmentsController], + providers: [DepartmentsService], +}) +export class DepartmentsModule {} diff --git a/apps/api/src/modules/departments/departments.service.ts b/apps/api/src/modules/departments/departments.service.ts new file mode 100644 index 0000000..66002b2 --- /dev/null +++ b/apps/api/src/modules/departments/departments.service.ts @@ -0,0 +1,81 @@ +import { Injectable, BadRequestException } from '@nestjs/common'; +import { PrismaService } from '../../common/prisma/prisma.service'; + +@Injectable() +export class DepartmentsService { + constructor(private readonly prisma: PrismaService) {} + + async findAll() { + const all = await this.prisma.department.findMany({ + orderBy: { name: 'asc' }, + }); + + const map = new Map<string, any>(); + all.forEach(d => map.set(d.id, { ...d, children: [] })); + + const tree: any[] = []; + all.forEach(d => { + if (d.parentId) { + const parent = map.get(d.parentId); + if (parent) { + parent.children.push(map.get(d.id)); + } else { + tree.push(map.get(d.id)); + } + } else { + tree.push(map.get(d.id)); + } + }); + + return tree; + } + + findOne(id: string) { + return this.prisma.department.findUniqueOrThrow({ + where: { id }, + include: { children: true, parent: true }, + }); + } + + create(data: { name: string; code?: string; parentId?: string }) { + return this.prisma.department.create({ data }); + } + + async rename(id: string, name: string) { + const trimmed = name.trim(); + if (!trimmed) throw new BadRequestException('Denumirea nu poate fi goală.'); + return this.prisma.department.update({ where: { id }, data: { name: trimmed } }); + } + + async move(id: string, parentId: string | null) { + if (parentId === id) { + throw new BadRequestException('Un departament nu poate fi sub-departament al lui însuși.'); + } + if (parentId) { + // circular reference check: walk up from parentId, must not reach id + let cur = await this.prisma.department.findUnique({ where: { id: parentId } }); + while (cur?.parentId) { + if (cur.parentId === id) { + throw new BadRequestException('Mutarea creează o referință circulară în ierarhia departamentelor.'); + } + cur = await this.prisma.department.findUnique({ where: { id: cur.parentId } }); + } + } + return this.prisma.department.update({ + where: { id }, + data: { parentId: parentId ?? null }, + }); + } + + async delete(id: string) { + const contracts = await this.prisma.employmentContract.count({ where: { departmentId: id } }); + if (contracts > 0) { + throw new BadRequestException('Departamentul are contracte asociate. Transferați angajații înainte de ștergere.'); + } + const children = await this.prisma.department.count({ where: { parentId: id } }); + if (children > 0) { + throw new BadRequestException('Departamentul are sub-departamente. Ștergeți-le mai întâi.'); + } + return this.prisma.department.delete({ where: { id } }); + } +} diff --git a/apps/api/src/modules/employees/dto/create-employee.dto.ts b/apps/api/src/modules/employees/dto/create-employee.dto.ts new file mode 100644 index 0000000..8d4d59a --- /dev/null +++ b/apps/api/src/modules/employees/dto/create-employee.dto.ts @@ -0,0 +1,108 @@ +import { + IsString, + IsEnum, + IsDateString, + IsOptional, + IsEmail, + MinLength, + MaxLength, + Matches, + IsUUID, +} from 'class-validator'; +import { Sex, MaritalStatus, EmployeeStatus } from '@prisma/client'; + +// Алгоритм валидации IDNP Молдовы (контрольная цифра) +function validateIdnp(idnp: string): boolean { + if (!/^\d{13}$/.test(idnp)) return false; + const weights = [7, 3, 1, 7, 3, 1, 7, 3, 1, 7, 3, 1]; + const sum = weights.reduce( + (acc, w, i) => acc + w * parseInt(idnp[i], 10), + 0, + ); + return (sum % 10) === parseInt(idnp[12], 10); +} + +import { registerDecorator, ValidationOptions } from 'class-validator'; + +function IsIdnp(opts?: ValidationOptions) { + return function (object: object, propertyName: string) { + registerDecorator({ + name: 'isIdnp', + target: object.constructor, + propertyName, + options: { message: 'IDNP invalid (13 cifre, cifra de control incorectă)', ...opts }, + validator: { validate: (v: unknown) => typeof v === 'string' && validateIdnp(v) }, + }); + }; +} + +export class CreateEmployeeDto { + @IsIdnp() + idnp!: string; + + @IsString() + @MinLength(1) + @MaxLength(100) + nume!: string; + + @IsString() + @MinLength(1) + @MaxLength(100) + prenume!: string; + + @IsOptional() + @IsString() + patronimic?: string; + + @IsOptional() + @IsString() + numeAnterior?: string; + + @IsDateString() + dataNasterii!: string; + + @IsString() + domiciliu!: string; + + @IsOptional() + @IsString() + adresaReala?: string; + + @Matches(/^\+?[0-9\s\-()]{7,20}$/) + telefonPersonal!: string; + + @IsOptional() + @Matches(/^\+?[0-9\s\-()]{7,20}$/) + telefonServiciu?: string; + + @IsOptional() + @IsEmail() + emailPersonal?: string; + + @IsOptional() + @IsEmail() + emailCorporativ?: string; + + @IsEnum(Sex) + sex!: Sex; + + @IsOptional() + @IsString() + codCpas?: string; + + @IsOptional() + @IsEnum(MaritalStatus) + stareCivila?: MaritalStatus; + + @IsOptional() + @IsUUID() + gradDizabilitateId?: string; + + @IsOptional() + @IsUUID() + recomandareInternaId?: string; + + @IsOptional() + @IsEnum(EmployeeStatus) + status?: EmployeeStatus; +} diff --git a/apps/api/src/modules/employees/dto/query-employee.dto.ts b/apps/api/src/modules/employees/dto/query-employee.dto.ts new file mode 100644 index 0000000..79a7f73 --- /dev/null +++ b/apps/api/src/modules/employees/dto/query-employee.dto.ts @@ -0,0 +1,30 @@ +import { IsOptional, IsString, IsEnum, IsInt, Min, Max } from 'class-validator'; +import { Type } from 'class-transformer'; +import { EmployeeStatus } from '@prisma/client'; + +export class QueryEmployeeDto { + @IsOptional() + @IsString() + search?: string; // поиск по nume, prenume, idnp + + @IsOptional() + @IsEnum(EmployeeStatus) + status?: EmployeeStatus; + + @IsOptional() + @IsString() + departmentId?: string; + + @IsOptional() + @Type(() => Number) + @IsInt() + @Min(1) + page?: number = 1; + + @IsOptional() + @Type(() => Number) + @IsInt() + @Min(1) + @Max(1000) + limit?: number = 20; +} diff --git a/apps/api/src/modules/employees/employees.controller.ts b/apps/api/src/modules/employees/employees.controller.ts new file mode 100644 index 0000000..02bffdf --- /dev/null +++ b/apps/api/src/modules/employees/employees.controller.ts @@ -0,0 +1,63 @@ +import { + Controller, + Get, + Post, + Patch, + Param, + Body, + Query, + UseGuards, + Request, + HttpCode, + HttpStatus, + ParseUUIDPipe, +} from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from '../../common/guards/roles.guard'; +import { Roles } from '../../common/decorators/roles.decorator'; +import { EmployeesService } from './employees.service'; +import { CreateEmployeeDto } from './dto/create-employee.dto'; +import { QueryEmployeeDto } from './dto/query-employee.dto'; + +interface AuthRequest extends Request { + user: { id: string; role: string }; +} + +@Controller('employees') +@UseGuards(AuthGuard('jwt'), RolesGuard) +export class EmployeesController { + constructor(private readonly svc: EmployeesService) {} + + @Get() + @Roles('hr_admin', 'hr_specialist', 'manager', 'nursing_director') + findAll(@Query() query: QueryEmployeeDto, @Request() req: AuthRequest) { + return this.svc.findAll(query, req.user.id, req.user.role); + } + + @Get(':id') + @Roles('hr_admin', 'hr_specialist', 'manager', 'nursing_director', 'medic_familie') + findOne( + @Param('id', ParseUUIDPipe) id: string, + @Query('reason') reason: string | undefined, + @Request() req: AuthRequest, + ) { + return this.svc.findOne(id, req.user.id, req.user.role, reason); + } + + @Post() + @Roles('hr_admin') + @HttpCode(HttpStatus.CREATED) + create(@Body() dto: CreateEmployeeDto, @Request() req: AuthRequest) { + return this.svc.create(dto, req.user.id, req.user.role); + } + + @Patch(':id') + @Roles('hr_admin', 'hr_specialist') + update( + @Param('id', ParseUUIDPipe) id: string, + @Body() dto: Partial<CreateEmployeeDto>, + @Request() req: AuthRequest, + ) { + return this.svc.update(id, dto, req.user.id, req.user.role); + } +} diff --git a/apps/api/src/modules/employees/employees.module.ts b/apps/api/src/modules/employees/employees.module.ts new file mode 100644 index 0000000..3da13bb --- /dev/null +++ b/apps/api/src/modules/employees/employees.module.ts @@ -0,0 +1,46 @@ +import { Module } from '@nestjs/common'; +import { EmployeesController } from './employees.controller'; +import { EmployeesService } from './employees.service'; +import { IdentityDocumentsController } from './sub-resources/identity-documents.controller'; +import { IdentityDocumentsService } from './sub-resources/identity-documents.service'; +import { FamilyMembersController } from './sub-resources/family-members.controller'; +import { FamilyMembersService } from './sub-resources/family-members.service'; +import { EducationsController } from './sub-resources/educations.controller'; +import { EducationsService } from './sub-resources/educations.service'; +import { QualificationsController } from './sub-resources/qualifications.controller'; +import { QualificationsService } from './sub-resources/qualifications.service'; +import { TrainingsController } from './sub-resources/trainings.controller'; +import { TrainingsService } from './sub-resources/trainings.service'; +import { DisciplinarySanctionsController } from './sub-resources/disciplinary-sanctions.controller'; +import { DisciplinarySanctionsService } from './sub-resources/disciplinary-sanctions.service'; +import { BenefitController } from './sub-resources/benefit.controller'; +import { BenefitService } from './sub-resources/benefit.service'; +import { ContractsController } from './sub-resources/contracts.controller'; +import { ContractsService } from './sub-resources/contracts.service'; + +@Module({ + controllers: [ + EmployeesController, + IdentityDocumentsController, + FamilyMembersController, + EducationsController, + QualificationsController, + TrainingsController, + DisciplinarySanctionsController, + BenefitController, + ContractsController, + ], + providers: [ + EmployeesService, + IdentityDocumentsService, + FamilyMembersService, + EducationsService, + QualificationsService, + TrainingsService, + DisciplinarySanctionsService, + BenefitService, + ContractsService, + ], + exports: [EmployeesService], +}) +export class EmployeesModule {} diff --git a/apps/api/src/modules/employees/employees.service.ts b/apps/api/src/modules/employees/employees.service.ts new file mode 100644 index 0000000..8c10270 --- /dev/null +++ b/apps/api/src/modules/employees/employees.service.ts @@ -0,0 +1,184 @@ +import { + Injectable, + NotFoundException, + ConflictException, + BadRequestException, +} from '@nestjs/common'; +import { PrismaService } from '../../common/prisma/prisma.service'; +import { AuditService } from '../../common/audit/audit.service'; +import { CreateEmployeeDto } from './dto/create-employee.dto'; +import { QueryEmployeeDto } from './dto/query-employee.dto'; +import { Prisma } from '@prisma/client'; + +@Injectable() +export class EmployeesService { + constructor( + private readonly prisma: PrismaService, + private readonly audit: AuditService, + ) {} + + async findAll(query: QueryEmployeeDto, actorId: string, actorRole: string) { + const { search, status, departmentId, page = 1, limit = 20 } = query; + + const where: Prisma.EmployeeWhereInput = { + ...(status && { status }), + ...(search && { + OR: [ + { idnp: { contains: search } }, + { nume: { contains: search, mode: 'insensitive' } }, + { prenume: { contains: search, mode: 'insensitive' } }, + ], + }), + ...(departmentId && { + contracts: { some: { departmentId, dataDemisiei: null } }, + }), + }; + + const [total, items] = await this.prisma.$transaction([ + this.prisma.employee.count({ where }), + this.prisma.employee.findMany({ + where, + skip: (page - 1) * limit, + take: limit, + orderBy: [{ nume: 'asc' }, { prenume: 'asc' }], + select: { + id: true, + idnp: true, + nume: true, + prenume: true, + sex: true, + status: true, + dataNasterii: true, + telefonPersonal: true, + emailCorporativ: true, + contracts: { + where: { dataDemisiei: null }, + take: 1, + select: { functiaOrganigrama: true, department: { select: { name: true } } }, + }, + }, + }), + ]); + + await this.audit.logRead({ + userId: actorId, + userRole: actorRole, + entity: 'Employee', + entityId: 'list', + }); + + return { total, page, limit, items }; + } + + async findOne(id: string, actorId: string, actorRole: string, reason?: string) { + const employee = await this.prisma.employee.findUnique({ + where: { id }, + include: { + identityDocuments: true, + familyMembers: { include: { tipScutire: true } }, + educations: true, + qualifications: true, + trainings: true, + disciplinarySanctions: true, + benefit: { include: { uniforma: true, halat: true, ciupici: true, vesta: true, aparatTelefon: true } }, + contracts: { include: { department: true, categoriiServicii: true } }, + gradDizabilitate: true, + medicalProfile: { include: { workplaceRiskCard: true } }, + }, + }); + + if (!employee) throw new NotFoundException(`Angajatul cu id=${id} nu există`); + + await this.audit.logRead({ + userId: actorId, + userRole: actorRole, + entity: 'Employee', + entityId: id, + reason, + }); + + return employee; + } + + async create(dto: CreateEmployeeDto, actorId: string, actorRole: string) { + const exists = await this.prisma.employee.findUnique({ + where: { idnp: dto.idnp }, + }); + if (exists) throw new ConflictException(`IDNP ${dto.idnp} deja există`); + + // Бизнес-правило: нельзя рекомендовать супруга текущего сотрудника + if (dto.recomandareInternaId) { + await this.validateRecomandare(dto.idnp, dto.recomandareInternaId); + } + + const employee = await this.prisma.employee.create({ + data: { ...dto, dataNasterii: new Date(dto.dataNasterii) }, + }); + + await this.audit.logChange({ + userId: actorId, + userRole: actorRole, + action: 'CREATE', + entity: 'Employee', + entityId: employee.id, + }); + + return employee; + } + + async update( + id: string, + dto: Partial<CreateEmployeeDto>, + actorId: string, + actorRole: string, + ) { + const existing = await this.findOne(id, actorId, actorRole); + + if (dto.recomandareInternaId) { + await this.validateRecomandare(existing.idnp, dto.recomandareInternaId); + } + + const updated = await this.prisma.employee.update({ + where: { id }, + data: { + ...dto, + ...(dto.dataNasterii && { dataNasterii: new Date(dto.dataNasterii) }), + }, + }); + + await this.audit.logChange({ + userId: actorId, + userRole: actorRole, + action: 'UPDATE', + entity: 'Employee', + entityId: id, + }); + + return updated; + } + + // Проверка: нельзя назначить рекомендатора, который является супругом текущего сотрудника + private async validateRecomandare( + currentIdnp: string, + recomandareId: string, + ) { + const current = await this.prisma.employee.findUnique({ + where: { idnp: currentIdnp }, + include: { + familyMembers: { where: { tip: { in: ['sot', 'sotie'] } } }, + }, + }); + + const spouseIdnps = current?.familyMembers.map((f) => f.idnp) ?? []; + const recommender = await this.prisma.employee.findUnique({ + where: { id: recomandareId }, + select: { idnp: true }, + }); + + if (recommender && spouseIdnps.includes(recommender.idnp)) { + throw new BadRequestException( + 'Nu se poate selecta soțul/soția angajatului ca recomandare internă', + ); + } + } +} diff --git a/apps/api/src/modules/employees/sub-resources/benefit.controller.ts b/apps/api/src/modules/employees/sub-resources/benefit.controller.ts new file mode 100644 index 0000000..b1d252a --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/benefit.controller.ts @@ -0,0 +1,26 @@ +import { Controller, Get, Post, Body, Param, ParseUUIDPipe, UseGuards, Request } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from '../../../common/guards/roles.guard'; +import { Roles } from '../../../common/decorators/roles.decorator'; +import { BenefitService } from './benefit.service'; +import { UpsertBenefitDto } from './upsert-benefit.dto'; + +interface AuthReq extends Request { user: { id: string; role: string } } + +@Controller('employees/:employeeId/benefit') +@UseGuards(AuthGuard('jwt'), RolesGuard) +export class BenefitController { + constructor(private readonly svc: BenefitService) {} + + @Get() + @Roles('hr_admin', 'hr_specialist', 'manager', 'nursing_director', 'medic_familie', 'quality_auditor', 'employee') + findOne(@Param('employeeId', ParseUUIDPipe) employeeId: string) { + return this.svc.findOne(employeeId); + } + + @Post() + @Roles('hr_admin', 'hr_specialist') + upsert(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Body() dto: UpsertBenefitDto, @Request() req: AuthReq) { + return this.svc.upsert(employeeId, dto, req.user.id, req.user.role); + } +} diff --git a/apps/api/src/modules/employees/sub-resources/benefit.service.ts b/apps/api/src/modules/employees/sub-resources/benefit.service.ts new file mode 100644 index 0000000..a5c7709 --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/benefit.service.ts @@ -0,0 +1,74 @@ +import { BadRequestException, Injectable } from '@nestjs/common'; +import { PrismaService } from '../../../common/prisma/prisma.service'; +import { AuditService } from '../../../common/audit/audit.service'; +import { UpsertBenefitDto } from './upsert-benefit.dto'; + +const INVENTORY_FIELDS = [ + 'uniformaId', + 'halatId', + 'ciupiciId', + 'vestaId', + 'aparatTelefonId', +] as const; + +type InventoryField = (typeof INVENTORY_FIELDS)[number]; + +@Injectable() +export class BenefitService { + constructor(private readonly prisma: PrismaService, private readonly audit: AuditService) {} + + findOne(employeeId: string) { + return this.prisma.benefit.findUnique({ + where: { employeeId }, + include: { + uniforma: true, + halat: true, + ciupici: true, + vesta: true, + aparatTelefon: true, + }, + }); + } + + async upsert(employeeId: string, dto: UpsertBenefitDto, userId: string, role: string) { + await this.prisma.employee.findUniqueOrThrow({ where: { id: employeeId } }); + const old = await this.prisma.benefit.findUnique({ where: { employeeId } }); + + const record = await this.prisma.$transaction(async (tx) => { + for (const f of INVENTORY_FIELDS) { + const oldId = (old?.[f as InventoryField] as string | null | undefined) ?? null; + const newId = (dto[f] as string | null | undefined) ?? null; + if (oldId === newId) continue; + if (oldId) { + await tx.inventoryItem.update({ + where: { id: oldId }, + data: { stockQty: { increment: 1 } }, + }); + } + if (newId) { + const item = await tx.inventoryItem.update({ + where: { id: newId }, + data: { stockQty: { decrement: 1 } }, + }); + if (item.stockQty < 0) { + throw new BadRequestException(`Stoc epuizat pentru ${f}`); + } + } + } + return tx.benefit.upsert({ + where: { employeeId }, + create: { ...dto, employeeId }, + update: dto, + }); + }); + + await this.audit.logChange({ + userId, + userRole: role, + action: old ? 'UPDATE' : 'CREATE', + entity: 'Benefit', + entityId: record.id, + }); + return record; + } +} diff --git a/apps/api/src/modules/employees/sub-resources/contracts.controller.ts b/apps/api/src/modules/employees/sub-resources/contracts.controller.ts new file mode 100644 index 0000000..15030d6 --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/contracts.controller.ts @@ -0,0 +1,83 @@ +import { + Controller, Get, Post, Patch, Delete, Body, Param, + ParseUUIDPipe, UseGuards, Request, HttpCode, HttpStatus, +} from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from '../../../common/guards/roles.guard'; +import { Roles } from '../../../common/decorators/roles.decorator'; +import { ContractsService } from './contracts.service'; +import { CreateContractDto } from './create-contract.dto'; + +interface AuthReq extends Request { user: { id: string; role: string } } + +@Controller('employees/:employeeId/contracts') +@UseGuards(AuthGuard('jwt'), RolesGuard) +export class ContractsController { + constructor(private readonly svc: ContractsService) {} + + @Get() + @Roles('hr_admin', 'hr_specialist', 'manager', 'nursing_director', 'quality_auditor', 'employee') + findAll(@Param('employeeId', ParseUUIDPipe) employeeId: string) { + return this.svc.findAll(employeeId); + } + + /** MAX(zile_concediu) across all CIM of this employee */ + @Get('zile-concediu-max') + @Roles('hr_admin', 'hr_specialist', 'manager', 'nursing_director', 'quality_auditor', 'employee') + getMaxZileConcediu(@Param('employeeId', ParseUUIDPipe) employeeId: string) { + return this.svc.getMaxZileConcediu(employeeId); + } + + @Get(':id') + @Roles('hr_admin', 'hr_specialist', 'manager', 'nursing_director', 'quality_auditor', 'employee') + findOne( + @Param('employeeId', ParseUUIDPipe) employeeId: string, + @Param('id', ParseUUIDPipe) id: string, + ) { + return this.svc.findOne(employeeId, id); + } + + @Post() + @Roles('hr_admin', 'hr_specialist') + @HttpCode(HttpStatus.CREATED) + create( + @Param('employeeId', ParseUUIDPipe) employeeId: string, + @Body() dto: CreateContractDto, + @Request() req: AuthReq, + ) { + return this.svc.create(employeeId, dto, req.user.id, req.user.role); + } + + @Patch(':id') + @Roles('hr_admin', 'hr_specialist') + update( + @Param('employeeId', ParseUUIDPipe) employeeId: string, + @Param('id', ParseUUIDPipe) id: string, + @Body() dto: Partial<CreateContractDto>, + @Request() req: AuthReq, + ) { + return this.svc.update(employeeId, id, dto, req.user.id, req.user.role); + } + + @Patch(':id/terminate') + @Roles('hr_admin', 'hr_specialist') + terminate( + @Param('employeeId', ParseUUIDPipe) employeeId: string, + @Param('id', ParseUUIDPipe) id: string, + @Body('dataDemisiei') dataDemisiei: string, + @Request() req: AuthReq, + ) { + return this.svc.terminate(employeeId, id, dataDemisiei, req.user.id, req.user.role); + } + + @Delete(':id') + @Roles('hr_admin') + @HttpCode(HttpStatus.NO_CONTENT) + remove( + @Param('employeeId', ParseUUIDPipe) employeeId: string, + @Param('id', ParseUUIDPipe) id: string, + @Request() req: AuthReq, + ) { + return this.svc.remove(employeeId, id, req.user.id, req.user.role); + } +} diff --git a/apps/api/src/modules/employees/sub-resources/contracts.service.ts b/apps/api/src/modules/employees/sub-resources/contracts.service.ts new file mode 100644 index 0000000..8273ca3 --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/contracts.service.ts @@ -0,0 +1,124 @@ +import { Injectable, NotFoundException, ConflictException } from '@nestjs/common'; +import { PrismaService } from '../../../common/prisma/prisma.service'; +import { AuditService } from '../../../common/audit/audit.service'; +import { CreateContractDto } from './create-contract.dto'; + +@Injectable() +export class ContractsService { + constructor(private readonly prisma: PrismaService, private readonly audit: AuditService) {} + + findAll(employeeId: string) { + return this.prisma.employmentContract.findMany({ + where: { employeeId }, + include: { + department: true, + workSchedule: true, + categoriiServicii: true, + }, + orderBy: { dataAngajarii: 'desc' }, + }); + } + + async findOne(employeeId: string, id: string) { + const c = await this.prisma.employmentContract.findFirst({ + where: { id, employeeId }, + include: { department: true, workSchedule: true, categoriiServicii: true }, + }); + if (!c) throw new NotFoundException(); + return c; + } + + async create(employeeId: string, dto: CreateContractDto, userId: string, role: string) { + await this.prisma.employee.findUniqueOrThrow({ where: { id: employeeId } }); + + const existing = await this.prisma.employmentContract.findUnique({ where: { nrCim: dto.nrCim } }); + if (existing) throw new ConflictException(`Contractul cu nr. ${dto.nrCim} există deja`); + + const { categoriiServicii, ...rest } = dto; + + const contract = await this.prisma.employmentContract.create({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + data: { + ...rest, + employeeId, + dataSemnarii: new Date(dto.dataSemnarii), + dataAngajarii: new Date(dto.dataAngajarii), + dataDemisiei: dto.dataDemisiei ? new Date(dto.dataDemisiei) : null, + dataTerminarii: dto.dataTerminarii ? new Date(dto.dataTerminarii) : null, + salarizareDetails: (dto.salarizareDetails ?? null) as never, + clausaAditionala: (dto.clausaAditionala ?? null) as never, + categoriiServicii: categoriiServicii?.length + ? { create: categoriiServicii } + : undefined, + } as never, + include: { department: true, workSchedule: true, categoriiServicii: true }, + }); + + await this.audit.logChange({ userId, userRole: role, action: 'CREATE', entity: 'EmploymentContract', entityId: contract.id }); + return contract; + } + + async update(employeeId: string, id: string, dto: Partial<CreateContractDto>, userId: string, role: string) { + await this.findOne(employeeId, id); + + const { categoriiServicii, ...rest } = dto; + + if (rest.dataSemnarii) (rest as Record<string, unknown>).dataSemnarii = new Date(rest.dataSemnarii) as unknown; + if (rest.dataAngajarii) (rest as Record<string, unknown>).dataAngajarii = new Date(rest.dataAngajarii) as unknown; + if (rest.dataDemisiei !== undefined) (rest as Record<string, unknown>).dataDemisiei = rest.dataDemisiei ? new Date(rest.dataDemisiei) : null; + if (rest.dataTerminarii !== undefined) (rest as Record<string, unknown>).dataTerminarii = rest.dataTerminarii ? new Date(rest.dataTerminarii) : null; + + const updated = await this.prisma.employmentContract.update({ + where: { id }, + data: { + ...rest, + ...(rest.salarizareDetails !== undefined ? { salarizareDetails: (rest.salarizareDetails ?? null) as never } : {}), + ...(rest.clausaAditionala !== undefined ? { clausaAditionala: (rest.clausaAditionala ?? null) as never } : {}), + ...(categoriiServicii !== undefined ? { + categoriiServicii: { deleteMany: {}, create: categoriiServicii }, + } : {}), + } as never, + include: { department: true, workSchedule: true, categoriiServicii: true }, + }); + + await this.audit.logChange({ userId, userRole: role, action: 'UPDATE', entity: 'EmploymentContract', entityId: id }); + return updated; + } + + async remove(employeeId: string, id: string, userId: string, role: string) { + await this.findOne(employeeId, id); + await this.prisma.employmentContract.delete({ where: { id } }); + await this.audit.logChange({ userId, userRole: role, action: 'DELETE', entity: 'EmploymentContract', entityId: id }); + } + + /** + * MAX(zile_concediu) across all contracts of an employee. + * `zileConcediu` lives inside the `salarizareDetails` JSONB column. + * Returns null if the employee has no contracts or no contract carries the field. + */ + async getMaxZileConcediu(employeeId: string): Promise<{ employeeId: string; maxZileConcediu: number | null; contractsConsidered: number }> { + const contracts = await this.prisma.employmentContract.findMany({ + where: { employeeId }, + select: { salarizareDetails: true }, + }); + let max: number | null = null; + for (const c of contracts) { + const raw = (c.salarizareDetails as { zileConcediu?: unknown } | null)?.zileConcediu; + const n = typeof raw === 'number' ? raw : typeof raw === 'string' ? Number(raw) : NaN; + if (Number.isFinite(n) && n > 0 && (max === null || n > max)) max = n; + } + return { employeeId, maxZileConcediu: max, contractsConsidered: contracts.length }; + } + + /** Terminate a contract — sets dataDemisiei, keeps record */ + async terminate(employeeId: string, id: string, dataDemisiei: string, userId: string, role: string) { + await this.findOne(employeeId, id); + const updated = await this.prisma.employmentContract.update({ + where: { id }, + data: { dataDemisiei: new Date(dataDemisiei) }, + include: { department: true, workSchedule: true, categoriiServicii: true }, + }); + await this.audit.logChange({ userId, userRole: role, action: 'UPDATE', entity: 'EmploymentContract', entityId: id }); + return updated; + } +} diff --git a/apps/api/src/modules/employees/sub-resources/create-contract.dto.ts b/apps/api/src/modules/employees/sub-resources/create-contract.dto.ts new file mode 100644 index 0000000..20aaa4a --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/create-contract.dto.ts @@ -0,0 +1,78 @@ +import { + IsEnum, IsDateString, IsString, IsOptional, IsUUID, + IsArray, ValidateNested, IsIn, IsNumber, Min, +} from 'class-validator'; +import { Type } from 'class-transformer'; + +export class CimServiceCategoryDto { + @IsString() + categorieId!: string; + + @IsIn(['tarif', 'procent']) + tipRemunerare!: 'tarif' | 'procent'; + + @IsOptional() @IsNumber({ maxDecimalPlaces: 2 }) @Min(0) + sumaNeta?: number; + + @IsOptional() @IsNumber({ maxDecimalPlaces: 2 }) @Min(0) + procent?: number; +} + +export class CreateContractDto { + @IsString() + nrCim!: string; + + @IsEnum(['principal', 'secundar']) + categorie!: 'principal' | 'secundar'; + + @IsDateString() + dataSemnarii!: string; + + @IsDateString() + dataAngajarii!: string; + + @IsOptional() @IsDateString() + dataDemisiei?: string; + + @IsEnum(['determinata', 'nedeterminata', 'replasare_temporara']) + perioada!: 'determinata' | 'nedeterminata' | 'replasare_temporara'; + + @IsOptional() @IsDateString() + dataTerminarii?: string; + + @IsOptional() @IsString() + functiaClasificator?: string; + + @IsOptional() @IsString() + codFunctie?: string; + + @IsOptional() @IsString() + functiaOrganigrama?: string; + + @IsEnum(['de_baza', 'cumul']) + tipCim!: 'de_baza' | 'cumul'; + + @IsUUID() + departmentId!: string; + + @IsOptional() @IsString() + regimMunca?: string; + + @IsOptional() @IsEnum(['fix', 'pe_ore', 'in_acord']) + tipSalarizare?: 'fix' | 'pe_ore' | 'in_acord'; + + @IsOptional() + salarizareDetails?: unknown; + + @IsOptional() + clausaAditionala?: unknown; + + @IsOptional() @IsUUID() + workScheduleId?: string; + + @IsOptional() + @IsArray() + @ValidateNested({ each: true }) + @Type(() => CimServiceCategoryDto) + categoriiServicii?: CimServiceCategoryDto[]; +} diff --git a/apps/api/src/modules/employees/sub-resources/create-disciplinary-sanction.dto.ts b/apps/api/src/modules/employees/sub-resources/create-disciplinary-sanction.dto.ts new file mode 100644 index 0000000..27380eb --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/create-disciplinary-sanction.dto.ts @@ -0,0 +1,11 @@ +import { IsEnum, IsDateString } from 'class-validator'; +import { DisciplinarySanctionType } from '@prisma/client'; + +export class CreateDisciplinarySanctionDto { + @IsEnum(DisciplinarySanctionType) + tip!: DisciplinarySanctionType; + + @IsDateString() + dataAplicarii!: string; + // dataExpirarii is computed server-side: dataAplicarii + 6 months +} diff --git a/apps/api/src/modules/employees/sub-resources/create-education.dto.ts b/apps/api/src/modules/employees/sub-resources/create-education.dto.ts new file mode 100644 index 0000000..927bb0f --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/create-education.dto.ts @@ -0,0 +1,15 @@ +import { IsEnum, IsString, IsOptional, IsDateString } from 'class-validator'; +import { StudyType, StudyLevel, PostUniversityType, DiplomaStatus } from '@prisma/client'; + +export class CreateEducationDto { + @IsEnum(StudyType) tipStudii!: StudyType; + @IsString() institutia!: string; + @IsString() specialitatea!: string; + @IsOptional() @IsDateString() dataAbsolvirii?: string; + @IsOptional() @IsString() nrSeriaDiploma?: string; + @IsOptional() @IsDateString() dataEmiterii?: string; + @IsOptional() @IsString() nrInregistrare?: string; + @IsOptional() @IsEnum(DiplomaStatus) confirmare?: DiplomaStatus; + @IsOptional() @IsEnum(StudyLevel) nivel?: StudyLevel; + @IsOptional() @IsEnum(PostUniversityType) tipPostuniversitar?: PostUniversityType; +} diff --git a/apps/api/src/modules/employees/sub-resources/create-family-member.dto.ts b/apps/api/src/modules/employees/sub-resources/create-family-member.dto.ts new file mode 100644 index 0000000..6627966 --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/create-family-member.dto.ts @@ -0,0 +1,22 @@ +import { IsEnum, IsString, IsOptional, IsDateString, IsUUID } from 'class-validator'; +import { FamilyMemberType } from '@prisma/client'; + +export class CreateFamilyMemberDto { + @IsEnum(FamilyMemberType) + tip!: FamilyMemberType; + + @IsString() + numePrenume!: string; + + @IsOptional() @IsDateString() + dataNasterii?: string; + + @IsOptional() @IsString() + idnp?: string; + + @IsOptional() @IsString() + telefon?: string; + + @IsOptional() @IsUUID() + tipScutireId?: string; +} diff --git a/apps/api/src/modules/employees/sub-resources/create-identity-document.dto.ts b/apps/api/src/modules/employees/sub-resources/create-identity-document.dto.ts new file mode 100644 index 0000000..e50046d --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/create-identity-document.dto.ts @@ -0,0 +1,23 @@ +import { IsEnum, IsString, IsOptional, IsDateString } from 'class-validator'; +import { DocumentType } from '@prisma/client'; + +export class CreateIdentityDocumentDto { + @IsEnum(DocumentType) + tipAct!: DocumentType; + + @IsOptional() + @IsString() + seria?: string; + + @IsString() + nr!: string; + + @IsDateString() + dataEmiterii!: string; + + @IsString() + autoritateEmitenta!: string; + + @IsDateString() + dataExpirarii!: string; +} diff --git a/apps/api/src/modules/employees/sub-resources/create-qualification.dto.ts b/apps/api/src/modules/employees/sub-resources/create-qualification.dto.ts new file mode 100644 index 0000000..30a5463 --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/create-qualification.dto.ts @@ -0,0 +1,10 @@ +import { IsEnum, IsString, IsOptional, IsDateString } from 'class-validator'; +import { QualificationCategory } from '@prisma/client'; + +export class CreateQualificationDto { + @IsEnum(QualificationCategory) categorie!: QualificationCategory; + @IsOptional() @IsString() specialitate?: string; + @IsOptional() @IsDateString() dataObtinerii?: string; + @IsOptional() @IsDateString() dataUltimeiConfirmari?: string; + @IsOptional() @IsDateString() dataExpirarii?: string; +} diff --git a/apps/api/src/modules/employees/sub-resources/create-training.dto.ts b/apps/api/src/modules/employees/sub-resources/create-training.dto.ts new file mode 100644 index 0000000..ed4e722 --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/create-training.dto.ts @@ -0,0 +1,14 @@ +import { IsEnum, IsString, IsOptional, IsDateString, IsBoolean, IsInt, IsPositive } from 'class-validator'; +import { TrainingType } from '@prisma/client'; + +export class CreateTrainingDto { + @IsString() denumire!: string; + @IsDateString() inceput!: string; + @IsOptional() @IsDateString() sfirsit?: string; + @IsEnum(TrainingType) tip!: TrainingType; + @IsOptional() @IsString() tara?: string; + @IsOptional() @IsInt() @IsPositive() nrOre?: number; + @IsOptional() @IsString() organizatia?: string; + @IsBoolean() certificat!: boolean; + @IsOptional() @IsString() cost?: string; +} diff --git a/apps/api/src/modules/employees/sub-resources/disciplinary-sanctions.controller.ts b/apps/api/src/modules/employees/sub-resources/disciplinary-sanctions.controller.ts new file mode 100644 index 0000000..757662c --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/disciplinary-sanctions.controller.ts @@ -0,0 +1,26 @@ +import { Controller, Get, Post, Patch, Delete, Body, Param, ParseUUIDPipe, UseGuards, Request, HttpCode, HttpStatus } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from '../../../common/guards/roles.guard'; +import { Roles } from '../../../common/decorators/roles.decorator'; +import { DisciplinarySanctionsService } from './disciplinary-sanctions.service'; +import { CreateDisciplinarySanctionDto } from './create-disciplinary-sanction.dto'; + +interface AuthReq extends Request { user: { id: string; role: string } } + +@Controller('employees/:employeeId/disciplinary-sanctions') +@UseGuards(AuthGuard('jwt'), RolesGuard) +export class DisciplinarySanctionsController { + constructor(private readonly svc: DisciplinarySanctionsService) {} + + @Get() @Roles('hr_admin', 'hr_specialist', 'manager', 'nursing_director', 'medic_familie', 'quality_auditor', 'employee') + findAll(@Param('employeeId', ParseUUIDPipe) employeeId: string) { return this.svc.findAll(employeeId); } + + @Post() @Roles('hr_admin', 'hr_specialist') @HttpCode(HttpStatus.CREATED) + create(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Body() dto: CreateDisciplinarySanctionDto, @Request() req: AuthReq) { return this.svc.create(employeeId, dto, req.user.id, req.user.role); } + + @Patch(':id') @Roles('hr_admin', 'hr_specialist') + update(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Param('id', ParseUUIDPipe) id: string, @Body() dto: Partial<CreateDisciplinarySanctionDto>, @Request() req: AuthReq) { return this.svc.update(employeeId, id, dto, req.user.id, req.user.role); } + + @Delete(':id') @Roles('hr_admin') @HttpCode(HttpStatus.NO_CONTENT) + remove(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Param('id', ParseUUIDPipe) id: string, @Request() req: AuthReq) { return this.svc.remove(employeeId, id, req.user.id, req.user.role); } +} diff --git a/apps/api/src/modules/employees/sub-resources/disciplinary-sanctions.service.ts b/apps/api/src/modules/employees/sub-resources/disciplinary-sanctions.service.ts new file mode 100644 index 0000000..ff45ebe --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/disciplinary-sanctions.service.ts @@ -0,0 +1,52 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import { PrismaService } from '../../../common/prisma/prisma.service'; +import { AuditService } from '../../../common/audit/audit.service'; +import { CreateDisciplinarySanctionDto } from './create-disciplinary-sanction.dto'; + +@Injectable() +export class DisciplinarySanctionsService { + constructor(private readonly prisma: PrismaService, private readonly audit: AuditService) {} + + findAll(employeeId: string) { + return this.prisma.disciplinarySanction.findMany({ where: { employeeId }, orderBy: { dataAplicarii: 'desc' } }); + } + + async create(employeeId: string, dto: CreateDisciplinarySanctionDto, userId: string, role: string) { + await this.prisma.employee.findUniqueOrThrow({ where: { id: employeeId } }); + const dataAplicarii = new Date(dto.dataAplicarii); + const dataExpirarii = new Date(dataAplicarii); + dataExpirarii.setMonth(dataExpirarii.getMonth() + 6); + + const record = await this.prisma.disciplinarySanction.create({ + data: { tip: dto.tip, dataAplicarii, dataExpirarii, employeeId }, + }); + await this.audit.logChange({ userId, userRole: role, action: 'CREATE', entity: 'DisciplinarySanction', entityId: record.id }); + return record; + } + + async update(employeeId: string, id: string, dto: Partial<CreateDisciplinarySanctionDto>, userId: string, role: string) { + const existing = await this.prisma.disciplinarySanction.findFirst({ where: { id, employeeId } }); + if (!existing) throw new NotFoundException(); + + const updateData: { tip?: typeof dto.tip; dataAplicarii?: Date; dataExpirarii?: Date } = {}; + if (dto.tip) updateData.tip = dto.tip; + if (dto.dataAplicarii) { + const dataAplicarii = new Date(dto.dataAplicarii); + const dataExpirarii = new Date(dataAplicarii); + dataExpirarii.setMonth(dataExpirarii.getMonth() + 6); + updateData.dataAplicarii = dataAplicarii; + updateData.dataExpirarii = dataExpirarii; + } + + const updated = await this.prisma.disciplinarySanction.update({ where: { id }, data: updateData }); + await this.audit.logChange({ userId, userRole: role, action: 'UPDATE', entity: 'DisciplinarySanction', entityId: id }); + return updated; + } + + async remove(employeeId: string, id: string, userId: string, role: string) { + const existing = await this.prisma.disciplinarySanction.findFirst({ where: { id, employeeId } }); + if (!existing) throw new NotFoundException(); + await this.prisma.disciplinarySanction.delete({ where: { id } }); + await this.audit.logChange({ userId, userRole: role, action: 'DELETE', entity: 'DisciplinarySanction', entityId: id }); + } +} diff --git a/apps/api/src/modules/employees/sub-resources/educations.controller.ts b/apps/api/src/modules/employees/sub-resources/educations.controller.ts new file mode 100644 index 0000000..1318bf6 --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/educations.controller.ts @@ -0,0 +1,26 @@ +import { Controller, Get, Post, Patch, Delete, Body, Param, ParseUUIDPipe, UseGuards, Request, HttpCode, HttpStatus } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from '../../../common/guards/roles.guard'; +import { Roles } from '../../../common/decorators/roles.decorator'; +import { EducationsService } from './educations.service'; +import { CreateEducationDto } from './create-education.dto'; + +interface AuthReq extends Request { user: { id: string; role: string } } + +@Controller('employees/:employeeId/educations') +@UseGuards(AuthGuard('jwt'), RolesGuard) +export class EducationsController { + constructor(private readonly svc: EducationsService) {} + + @Get() @Roles('hr_admin', 'hr_specialist', 'manager', 'nursing_director', 'medic_familie', 'quality_auditor', 'employee') + findAll(@Param('employeeId', ParseUUIDPipe) employeeId: string) { return this.svc.findAll(employeeId); } + + @Post() @Roles('hr_admin', 'hr_specialist') @HttpCode(HttpStatus.CREATED) + create(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Body() dto: CreateEducationDto, @Request() req: AuthReq) { return this.svc.create(employeeId, dto, req.user.id, req.user.role); } + + @Patch(':id') @Roles('hr_admin', 'hr_specialist') + update(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Param('id', ParseUUIDPipe) id: string, @Body() dto: Partial<CreateEducationDto>, @Request() req: AuthReq) { return this.svc.update(employeeId, id, dto, req.user.id, req.user.role); } + + @Delete(':id') @Roles('hr_admin') @HttpCode(HttpStatus.NO_CONTENT) + remove(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Param('id', ParseUUIDPipe) id: string, @Request() req: AuthReq) { return this.svc.remove(employeeId, id, req.user.id, req.user.role); } +} diff --git a/apps/api/src/modules/employees/sub-resources/educations.service.ts b/apps/api/src/modules/employees/sub-resources/educations.service.ts new file mode 100644 index 0000000..aff6f89 --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/educations.service.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../../../common/prisma/prisma.service'; +import { AuditService } from '../../../common/audit/audit.service'; +import { CreateEducationDto } from './create-education.dto'; +import { subCreate, subUpdate, subRemove } from './sub-resources.service-factory'; + +@Injectable() +export class EducationsService { + constructor(private readonly prisma: PrismaService, private readonly audit: AuditService) {} + + findAll(employeeId: string) { + return this.prisma.education.findMany({ where: { employeeId }, orderBy: { dataAbsolvirii: 'desc' } }); + } + + create(employeeId: string, dto: CreateEducationDto, userId: string, role: string) { + return subCreate(this.prisma, this.audit, this.prisma.education as never, employeeId, dto, userId, role, 'Education'); + } + + update(employeeId: string, id: string, dto: Partial<CreateEducationDto>, userId: string, role: string) { + return subUpdate(this.prisma.education as never, this.audit, employeeId, id, dto, userId, role, 'Education'); + } + + remove(employeeId: string, id: string, userId: string, role: string) { + return subRemove(this.prisma.education as never, this.audit, employeeId, id, userId, role, 'Education'); + } +} diff --git a/apps/api/src/modules/employees/sub-resources/family-members.controller.ts b/apps/api/src/modules/employees/sub-resources/family-members.controller.ts new file mode 100644 index 0000000..7e7731f --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/family-members.controller.ts @@ -0,0 +1,26 @@ +import { Controller, Get, Post, Patch, Delete, Body, Param, ParseUUIDPipe, UseGuards, Request, HttpCode, HttpStatus } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from '../../../common/guards/roles.guard'; +import { Roles } from '../../../common/decorators/roles.decorator'; +import { FamilyMembersService } from './family-members.service'; +import { CreateFamilyMemberDto } from './create-family-member.dto'; + +interface AuthReq extends Request { user: { id: string; role: string } } + +@Controller('employees/:employeeId/family-members') +@UseGuards(AuthGuard('jwt'), RolesGuard) +export class FamilyMembersController { + constructor(private readonly svc: FamilyMembersService) {} + + @Get() @Roles('hr_admin', 'hr_specialist', 'manager', 'nursing_director', 'medic_familie', 'quality_auditor', 'employee') + findAll(@Param('employeeId', ParseUUIDPipe) employeeId: string) { return this.svc.findAll(employeeId); } + + @Post() @Roles('hr_admin', 'hr_specialist') @HttpCode(HttpStatus.CREATED) + create(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Body() dto: CreateFamilyMemberDto, @Request() req: AuthReq) { return this.svc.create(employeeId, dto, req.user.id, req.user.role); } + + @Patch(':id') @Roles('hr_admin', 'hr_specialist') + update(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Param('id', ParseUUIDPipe) id: string, @Body() dto: Partial<CreateFamilyMemberDto>, @Request() req: AuthReq) { return this.svc.update(employeeId, id, dto, req.user.id, req.user.role); } + + @Delete(':id') @Roles('hr_admin') @HttpCode(HttpStatus.NO_CONTENT) + remove(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Param('id', ParseUUIDPipe) id: string, @Request() req: AuthReq) { return this.svc.remove(employeeId, id, req.user.id, req.user.role); } +} diff --git a/apps/api/src/modules/employees/sub-resources/family-members.service.ts b/apps/api/src/modules/employees/sub-resources/family-members.service.ts new file mode 100644 index 0000000..05d1db1 --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/family-members.service.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../../../common/prisma/prisma.service'; +import { AuditService } from '../../../common/audit/audit.service'; +import { CreateFamilyMemberDto } from './create-family-member.dto'; +import { subCreate, subUpdate, subRemove } from './sub-resources.service-factory'; + +@Injectable() +export class FamilyMembersService { + constructor(private readonly prisma: PrismaService, private readonly audit: AuditService) {} + + findAll(employeeId: string) { + return this.prisma.familyMember.findMany({ where: { employeeId }, include: { tipScutire: true } }); + } + + create(employeeId: string, dto: CreateFamilyMemberDto, userId: string, role: string) { + return subCreate(this.prisma, this.audit, this.prisma.familyMember as never, employeeId, dto, userId, role, 'FamilyMember'); + } + + update(employeeId: string, id: string, dto: Partial<CreateFamilyMemberDto>, userId: string, role: string) { + return subUpdate(this.prisma.familyMember as never, this.audit, employeeId, id, dto, userId, role, 'FamilyMember'); + } + + remove(employeeId: string, id: string, userId: string, role: string) { + return subRemove(this.prisma.familyMember as never, this.audit, employeeId, id, userId, role, 'FamilyMember'); + } +} diff --git a/apps/api/src/modules/employees/sub-resources/identity-documents.controller.ts b/apps/api/src/modules/employees/sub-resources/identity-documents.controller.ts new file mode 100644 index 0000000..205f410 --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/identity-documents.controller.ts @@ -0,0 +1,40 @@ +import { Controller, Get, Post, Patch, Delete, Body, Param, ParseUUIDPipe, UseGuards, Request, HttpCode, HttpStatus } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from '../../../common/guards/roles.guard'; +import { Roles } from '../../../common/decorators/roles.decorator'; +import { IdentityDocumentsService } from './identity-documents.service'; +import { CreateIdentityDocumentDto } from './create-identity-document.dto'; + +interface AuthReq extends Request { user: { id: string; role: string } } + +@Controller('employees/:employeeId/identity-documents') +@UseGuards(AuthGuard('jwt'), RolesGuard) +export class IdentityDocumentsController { + constructor(private readonly svc: IdentityDocumentsService) {} + + @Get() + @Roles('hr_admin', 'hr_specialist', 'manager', 'nursing_director', 'medic_familie', 'quality_auditor', 'employee') + findAll(@Param('employeeId', ParseUUIDPipe) employeeId: string) { + return this.svc.findAll(employeeId); + } + + @Post() + @Roles('hr_admin', 'hr_specialist') + @HttpCode(HttpStatus.CREATED) + create(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Body() dto: CreateIdentityDocumentDto, @Request() req: AuthReq) { + return this.svc.create(employeeId, dto, req.user.id, req.user.role); + } + + @Patch(':id') + @Roles('hr_admin', 'hr_specialist') + update(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Param('id', ParseUUIDPipe) id: string, @Body() dto: Partial<CreateIdentityDocumentDto>, @Request() req: AuthReq) { + return this.svc.update(employeeId, id, dto, req.user.id, req.user.role); + } + + @Delete(':id') + @Roles('hr_admin') + @HttpCode(HttpStatus.NO_CONTENT) + remove(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Param('id', ParseUUIDPipe) id: string, @Request() req: AuthReq) { + return this.svc.remove(employeeId, id, req.user.id, req.user.role); + } +} diff --git a/apps/api/src/modules/employees/sub-resources/identity-documents.service.ts b/apps/api/src/modules/employees/sub-resources/identity-documents.service.ts new file mode 100644 index 0000000..8f8f117 --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/identity-documents.service.ts @@ -0,0 +1,36 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import { PrismaService } from '../../../common/prisma/prisma.service'; +import { AuditService } from '../../../common/audit/audit.service'; +import { CreateIdentityDocumentDto } from './create-identity-document.dto'; +import { parseDateFields } from './sub-resources.service-factory'; + +@Injectable() +export class IdentityDocumentsService { + constructor(private readonly prisma: PrismaService, private readonly audit: AuditService) {} + + findAll(employeeId: string) { + return this.prisma.identityDocument.findMany({ where: { employeeId }, orderBy: { dataExpirarii: 'asc' } }); + } + + async create(employeeId: string, dto: CreateIdentityDocumentDto, userId: string, role: string) { + await this.prisma.employee.findUniqueOrThrow({ where: { id: employeeId } }); + const doc = await this.prisma.identityDocument.create({ data: { ...parseDateFields(dto), employeeId } }); + await this.audit.logChange({ userId, userRole: role, action: 'CREATE', entity: 'IdentityDocument', entityId: doc.id }); + return doc; + } + + async update(employeeId: string, id: string, dto: Partial<CreateIdentityDocumentDto>, userId: string, role: string) { + const existing = await this.prisma.identityDocument.findFirst({ where: { id, employeeId } }); + if (!existing) throw new NotFoundException(); + const updated = await this.prisma.identityDocument.update({ where: { id }, data: parseDateFields(dto) }); + await this.audit.logChange({ userId, userRole: role, action: 'UPDATE', entity: 'IdentityDocument', entityId: id }); + return updated; + } + + async remove(employeeId: string, id: string, userId: string, role: string) { + const existing = await this.prisma.identityDocument.findFirst({ where: { id, employeeId } }); + if (!existing) throw new NotFoundException(); + await this.prisma.identityDocument.delete({ where: { id } }); + await this.audit.logChange({ userId, userRole: role, action: 'DELETE', entity: 'IdentityDocument', entityId: id }); + } +} diff --git a/apps/api/src/modules/employees/sub-resources/qualifications.controller.ts b/apps/api/src/modules/employees/sub-resources/qualifications.controller.ts new file mode 100644 index 0000000..100b7f4 --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/qualifications.controller.ts @@ -0,0 +1,26 @@ +import { Controller, Get, Post, Patch, Delete, Body, Param, ParseUUIDPipe, UseGuards, Request, HttpCode, HttpStatus } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from '../../../common/guards/roles.guard'; +import { Roles } from '../../../common/decorators/roles.decorator'; +import { QualificationsService } from './qualifications.service'; +import { CreateQualificationDto } from './create-qualification.dto'; + +interface AuthReq extends Request { user: { id: string; role: string } } + +@Controller('employees/:employeeId/qualifications') +@UseGuards(AuthGuard('jwt'), RolesGuard) +export class QualificationsController { + constructor(private readonly svc: QualificationsService) {} + + @Get() @Roles('hr_admin', 'hr_specialist', 'manager', 'nursing_director', 'medic_familie', 'quality_auditor', 'employee') + findAll(@Param('employeeId', ParseUUIDPipe) employeeId: string) { return this.svc.findAll(employeeId); } + + @Post() @Roles('hr_admin', 'hr_specialist') @HttpCode(HttpStatus.CREATED) + create(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Body() dto: CreateQualificationDto, @Request() req: AuthReq) { return this.svc.create(employeeId, dto, req.user.id, req.user.role); } + + @Patch(':id') @Roles('hr_admin', 'hr_specialist') + update(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Param('id', ParseUUIDPipe) id: string, @Body() dto: Partial<CreateQualificationDto>, @Request() req: AuthReq) { return this.svc.update(employeeId, id, dto, req.user.id, req.user.role); } + + @Delete(':id') @Roles('hr_admin') @HttpCode(HttpStatus.NO_CONTENT) + remove(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Param('id', ParseUUIDPipe) id: string, @Request() req: AuthReq) { return this.svc.remove(employeeId, id, req.user.id, req.user.role); } +} diff --git a/apps/api/src/modules/employees/sub-resources/qualifications.service.ts b/apps/api/src/modules/employees/sub-resources/qualifications.service.ts new file mode 100644 index 0000000..027cca1 --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/qualifications.service.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../../../common/prisma/prisma.service'; +import { AuditService } from '../../../common/audit/audit.service'; +import { CreateQualificationDto } from './create-qualification.dto'; +import { subCreate, subUpdate, subRemove } from './sub-resources.service-factory'; + +@Injectable() +export class QualificationsService { + constructor(private readonly prisma: PrismaService, private readonly audit: AuditService) {} + + findAll(employeeId: string) { + return this.prisma.qualification.findMany({ where: { employeeId }, orderBy: { dataExpirarii: 'asc' } }); + } + + create(employeeId: string, dto: CreateQualificationDto, userId: string, role: string) { + return subCreate(this.prisma, this.audit, this.prisma.qualification as never, employeeId, dto, userId, role, 'Qualification'); + } + + update(employeeId: string, id: string, dto: Partial<CreateQualificationDto>, userId: string, role: string) { + return subUpdate(this.prisma.qualification as never, this.audit, employeeId, id, dto, userId, role, 'Qualification'); + } + + remove(employeeId: string, id: string, userId: string, role: string) { + return subRemove(this.prisma.qualification as never, this.audit, employeeId, id, userId, role, 'Qualification'); + } +} diff --git a/apps/api/src/modules/employees/sub-resources/sub-resources.service-factory.ts b/apps/api/src/modules/employees/sub-resources/sub-resources.service-factory.ts new file mode 100644 index 0000000..1c317b3 --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/sub-resources.service-factory.ts @@ -0,0 +1,73 @@ +// Shared helper used by all sub-resource services +import { NotFoundException } from '@nestjs/common'; +import { PrismaService } from '../../../common/prisma/prisma.service'; +import { AuditService } from '../../../common/audit/audit.service'; + +// Converts "YYYY-MM-DD" string values to Date objects so Prisma @db.Date fields accept them +export function parseDateFields<T extends object>(obj: T): T { + const result: Record<string, unknown> = {}; + for (const [key, value] of Object.entries(obj)) { + if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(value)) { + result[key] = new Date(value); + } else { + result[key] = value; + } + } + return result as T; +} + +export type SubResourceDelegate = { + findMany: (args: unknown) => Promise<unknown[]>; + findFirst: (args: unknown) => Promise<unknown | null>; + create: (args: unknown) => Promise<unknown>; + update: (args: unknown) => Promise<unknown>; + delete: (args: unknown) => Promise<unknown>; +}; + +export async function subCreate<T>( + prisma: PrismaService, + audit: AuditService, + delegate: SubResourceDelegate, + employeeId: string, + data: T, + userId: string, + role: string, + entity: string, +) { + await prisma.employee.findUniqueOrThrow({ where: { id: employeeId } }); + const record = await delegate.create({ data: { ...parseDateFields(data as object), employeeId } }) as { id: string }; + await audit.logChange({ userId, userRole: role, action: 'CREATE', entity, entityId: record.id }); + return record; +} + +export async function subUpdate<T>( + delegate: SubResourceDelegate, + audit: AuditService, + employeeId: string, + id: string, + data: T, + userId: string, + role: string, + entity: string, +) { + const existing = await delegate.findFirst({ where: { id, employeeId } }); + if (!existing) throw new NotFoundException(); + const updated = await delegate.update({ where: { id }, data: parseDateFields(data as object) }); + await audit.logChange({ userId, userRole: role, action: 'UPDATE', entity, entityId: id }); + return updated; +} + +export async function subRemove( + delegate: SubResourceDelegate, + audit: AuditService, + employeeId: string, + id: string, + userId: string, + role: string, + entity: string, +) { + const existing = await delegate.findFirst({ where: { id, employeeId } }); + if (!existing) throw new NotFoundException(); + await delegate.delete({ where: { id } }); + await audit.logChange({ userId, userRole: role, action: 'DELETE', entity, entityId: id }); +} diff --git a/apps/api/src/modules/employees/sub-resources/trainings.controller.ts b/apps/api/src/modules/employees/sub-resources/trainings.controller.ts new file mode 100644 index 0000000..08a88c3 --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/trainings.controller.ts @@ -0,0 +1,26 @@ +import { Controller, Get, Post, Patch, Delete, Body, Param, ParseUUIDPipe, UseGuards, Request, HttpCode, HttpStatus } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from '../../../common/guards/roles.guard'; +import { Roles } from '../../../common/decorators/roles.decorator'; +import { TrainingsService } from './trainings.service'; +import { CreateTrainingDto } from './create-training.dto'; + +interface AuthReq extends Request { user: { id: string; role: string } } + +@Controller('employees/:employeeId/trainings') +@UseGuards(AuthGuard('jwt'), RolesGuard) +export class TrainingsController { + constructor(private readonly svc: TrainingsService) {} + + @Get() @Roles('hr_admin', 'hr_specialist', 'manager', 'nursing_director', 'medic_familie', 'quality_auditor', 'employee') + findAll(@Param('employeeId', ParseUUIDPipe) employeeId: string) { return this.svc.findAll(employeeId); } + + @Post() @Roles('hr_admin', 'hr_specialist') @HttpCode(HttpStatus.CREATED) + create(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Body() dto: CreateTrainingDto, @Request() req: AuthReq) { return this.svc.create(employeeId, dto, req.user.id, req.user.role); } + + @Patch(':id') @Roles('hr_admin', 'hr_specialist') + update(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Param('id', ParseUUIDPipe) id: string, @Body() dto: Partial<CreateTrainingDto>, @Request() req: AuthReq) { return this.svc.update(employeeId, id, dto, req.user.id, req.user.role); } + + @Delete(':id') @Roles('hr_admin') @HttpCode(HttpStatus.NO_CONTENT) + remove(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Param('id', ParseUUIDPipe) id: string, @Request() req: AuthReq) { return this.svc.remove(employeeId, id, req.user.id, req.user.role); } +} diff --git a/apps/api/src/modules/employees/sub-resources/trainings.service.ts b/apps/api/src/modules/employees/sub-resources/trainings.service.ts new file mode 100644 index 0000000..c83036d --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/trainings.service.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../../../common/prisma/prisma.service'; +import { AuditService } from '../../../common/audit/audit.service'; +import { CreateTrainingDto } from './create-training.dto'; +import { subCreate, subUpdate, subRemove } from './sub-resources.service-factory'; + +@Injectable() +export class TrainingsService { + constructor(private readonly prisma: PrismaService, private readonly audit: AuditService) {} + + findAll(employeeId: string) { + return this.prisma.training.findMany({ where: { employeeId }, orderBy: { inceput: 'desc' } }); + } + + create(employeeId: string, dto: CreateTrainingDto, userId: string, role: string) { + return subCreate(this.prisma, this.audit, this.prisma.training as never, employeeId, dto, userId, role, 'Training'); + } + + update(employeeId: string, id: string, dto: Partial<CreateTrainingDto>, userId: string, role: string) { + return subUpdate(this.prisma.training as never, this.audit, employeeId, id, dto, userId, role, 'Training'); + } + + remove(employeeId: string, id: string, userId: string, role: string) { + return subRemove(this.prisma.training as never, this.audit, employeeId, id, userId, role, 'Training'); + } +} diff --git a/apps/api/src/modules/employees/sub-resources/upsert-benefit.dto.ts b/apps/api/src/modules/employees/sub-resources/upsert-benefit.dto.ts new file mode 100644 index 0000000..878c578 --- /dev/null +++ b/apps/api/src/modules/employees/sub-resources/upsert-benefit.dto.ts @@ -0,0 +1,16 @@ +import { IsBoolean, IsOptional, IsString, IsUUID } from 'class-validator'; + +export class UpsertBenefitDto { + @IsBoolean() ticheteMasa!: boolean; + @IsOptional() @IsString() valoareTichet?: string; + @IsBoolean() alimentatiePersonal!: boolean; + @IsOptional() @IsString() abonamentTel?: string; + @IsOptional() @IsString() cardCompanie?: string; + @IsOptional() @IsString() automobilServiciu?: string; + + @IsOptional() @IsUUID() uniformaId?: string | null; + @IsOptional() @IsUUID() halatId?: string | null; + @IsOptional() @IsUUID() ciupiciId?: string | null; + @IsOptional() @IsUUID() vestaId?: string | null; + @IsOptional() @IsUUID() aparatTelefonId?: string | null; +} diff --git a/apps/api/src/modules/evaluation/dto/approve-form.dto.ts b/apps/api/src/modules/evaluation/dto/approve-form.dto.ts new file mode 100644 index 0000000..fb9d5b9 --- /dev/null +++ b/apps/api/src/modules/evaluation/dto/approve-form.dto.ts @@ -0,0 +1,11 @@ +import { IsEnum, IsOptional, IsString } from 'class-validator'; +import { ProposedCategory } from '@prisma/client'; + +export class ApproveFormDto { + @IsEnum(ProposedCategory) + categorieAprobata!: ProposedCategory; + + @IsOptional() + @IsString() + observatii?: string; +} diff --git a/apps/api/src/modules/evaluation/dto/create-campaign.dto.ts b/apps/api/src/modules/evaluation/dto/create-campaign.dto.ts new file mode 100644 index 0000000..d78b694 --- /dev/null +++ b/apps/api/src/modules/evaluation/dto/create-campaign.dto.ts @@ -0,0 +1,14 @@ +import { IsString, IsUUID, IsDateString, MinLength } from 'class-validator'; + +export class CreateCampaignDto { + @IsString() + @MinLength(2) + name!: string; + + @IsUUID() + departmentId!: string; + + // First day of the campaign month — format: YYYY-MM-01 + @IsDateString() + month!: string; +} diff --git a/apps/api/src/modules/evaluation/dto/update-form.dto.ts b/apps/api/src/modules/evaluation/dto/update-form.dto.ts new file mode 100644 index 0000000..fec5f46 --- /dev/null +++ b/apps/api/src/modules/evaluation/dto/update-form.dto.ts @@ -0,0 +1,34 @@ +import { IsEnum, IsOptional, IsBoolean, IsObject, IsString } from 'class-validator'; +import { EvaluationScore } from '@prisma/client'; + +export class UpdateFormDto { + // A. Competente clinice + @IsOptional() @IsEnum(EvaluationScore) abilitatiClinice?: EvaluationScore; + @IsOptional() @IsEnum(EvaluationScore) judecataClinica?: EvaluationScore; + @IsOptional() @IsEnum(EvaluationScore) manopere?: EvaluationScore; + @IsOptional() @IsEnum(EvaluationScore) gestionareaSarcinilor?: EvaluationScore; + + // B. Comunicare si empatie + @IsOptional() @IsEnum(EvaluationScore) constiintaProfesionala?: EvaluationScore; + @IsOptional() @IsEnum(EvaluationScore) atitudineaPacienti?: EvaluationScore; + @IsOptional() @IsEnum(EvaluationScore) atitudineaColegi?: EvaluationScore; + @IsOptional() @IsEnum(EvaluationScore) atitudineaPersonalNonMed?: EvaluationScore; + + // C. Disciplina + @IsOptional() @IsEnum(EvaluationScore) utilizareSmartphone?: EvaluationScore; + @IsOptional() @IsEnum(EvaluationScore) respectareaProgramului?: EvaluationScore; + @IsOptional() @IsEnum(EvaluationScore) respectareaDressCode?: EvaluationScore; + + // D. Documentatie + @IsOptional() @IsObject() testJci?: Record<string, unknown>; + @IsOptional() @IsBoolean() completareaDocMed?: boolean; + @IsOptional() @IsBoolean() perfectioneazaCunostinte?: boolean; + + // E. Candidat expert + @IsOptional() @IsBoolean() membruComitetCalitate?: boolean; + @IsOptional() @IsBoolean() functieDeMonitor?: boolean; + @IsOptional() @IsBoolean() inlocuiesteSuperiorul?: boolean; + + // F. Observatii (director overrides category separately) + @IsOptional() @IsString() observatii?: string; +} diff --git a/apps/api/src/modules/evaluation/evaluation.controller.ts b/apps/api/src/modules/evaluation/evaluation.controller.ts new file mode 100644 index 0000000..85e2c64 --- /dev/null +++ b/apps/api/src/modules/evaluation/evaluation.controller.ts @@ -0,0 +1,102 @@ +import { + Controller, Get, Post, Patch, Delete, Body, Param, Query, + ParseUUIDPipe, UseGuards, Request, HttpCode, HttpStatus, +} from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from '../../common/guards/roles.guard'; +import { Roles } from '../../common/decorators/roles.decorator'; +import { EvaluationService } from './evaluation.service'; +import { CreateCampaignDto } from './dto/create-campaign.dto'; +import { UpdateFormDto } from './dto/update-form.dto'; +import { ApproveFormDto } from './dto/approve-form.dto'; +import { CampaignStatus } from '@prisma/client'; +import { IsEnum } from 'class-validator'; + +class UpdateStatusDto { + @IsEnum(CampaignStatus) + status!: CampaignStatus; +} + +interface AuthReq extends Request { user: { id: string; role: string } } + +@Controller('evaluation') +@UseGuards(AuthGuard('jwt'), RolesGuard) +export class EvaluationController { + constructor(private readonly svc: EvaluationService) {} + + // ── Campaigns ────────────────────────────────────────────────────────────── + + @Get('campaigns') + @Roles('hr_admin', 'hr_specialist', 'nursing_director', 'quality_auditor', 'manager') + listCampaigns(@Query('departmentId') deptId?: string) { + return this.svc.findAllCampaigns(deptId); + } + + @Get('campaigns/:id') + @Roles('hr_admin', 'hr_specialist', 'nursing_director', 'quality_auditor', 'manager') + getCampaign(@Param('id', ParseUUIDPipe) id: string) { + return this.svc.findCampaign(id); + } + + @Post('campaigns') + @Roles('hr_admin') + @HttpCode(HttpStatus.CREATED) + createCampaign(@Body() dto: CreateCampaignDto, @Request() req: AuthReq) { + return this.svc.createCampaign(dto, req.user.id, req.user.role); + } + + // Generate evaluation forms for all eligible employees + @Post('campaigns/:id/generate-forms') + @Roles('hr_admin') + generateForms(@Param('id', ParseUUIDPipe) id: string, @Request() req: AuthReq) { + return this.svc.generateForms(id, req.user.id, req.user.role); + } + + @Patch('campaigns/:id/status') + @Roles('hr_admin', 'nursing_director') + updateStatus(@Param('id', ParseUUIDPipe) id: string, @Body() dto: UpdateStatusDto, @Request() req: AuthReq) { + return this.svc.updateCampaignStatus(id, dto.status, req.user.id, req.user.role); + } + + @Delete('campaigns/:id') + @Roles('hr_admin') + @HttpCode(HttpStatus.NO_CONTENT) + deleteCampaign(@Param('id', ParseUUIDPipe) id: string, @Request() req: AuthReq) { + return this.svc.deleteCampaign(id, req.user.id, req.user.role); + } + + // ── Forms ────────────────────────────────────────────────────────────────── + + @Get('forms/:id') + @Roles('hr_admin', 'hr_specialist', 'nursing_director', 'quality_auditor', 'manager', 'employee') + getForm(@Param('id', ParseUUIDPipe) id: string) { + return this.svc.findForm(id); + } + + // quality_auditor + manager fill in scores (blocks A, B, C, D) + @Patch('forms/:id') + @Roles('hr_admin', 'quality_auditor', 'manager') + updateForm(@Param('id', ParseUUIDPipe) id: string, @Body() dto: UpdateFormDto, @Request() req: AuthReq) { + return this.svc.updateForm(id, dto, req.user.id, req.user.role); + } + + // nursing_director approves final category + @Patch('forms/:id/approve') + @Roles('nursing_director') + approveForm(@Param('id', ParseUUIDPipe) id: string, @Body() dto: ApproveFormDto, @Request() req: AuthReq) { + return this.svc.approveForm(id, dto, req.user.id, req.user.role); + } + + // Academy Ocean webhook — no auth guard (uses secret header validation in prod) + @Post('webhook/academy-ocean') + @HttpCode(HttpStatus.OK) + academyOceanWebhook(@Body() payload: { + employeeIdnp: string; + score: number; + maxScore: number; + completedAt: string; + externalId: string; + }) { + return this.svc.receiveAcademyOceanWebhook(payload); + } +} diff --git a/apps/api/src/modules/evaluation/evaluation.module.ts b/apps/api/src/modules/evaluation/evaluation.module.ts new file mode 100644 index 0000000..797392a --- /dev/null +++ b/apps/api/src/modules/evaluation/evaluation.module.ts @@ -0,0 +1,16 @@ +import { Module } from '@nestjs/common'; +import { BullModule } from '@nestjs/bull'; +import { HttpModule } from '@nestjs/axios'; +import { EvaluationController } from './evaluation.controller'; +import { EvaluationService } from './evaluation.service'; +import { EvaluationNotificationsProcessor } from './workers/evaluation-notifications.processor'; + +@Module({ + imports: [ + BullModule.registerQueue({ name: 'evaluation-notifications' }), + HttpModule, + ], + controllers: [EvaluationController], + providers: [EvaluationService, EvaluationNotificationsProcessor], +}) +export class EvaluationModule {} diff --git a/apps/api/src/modules/evaluation/evaluation.service.ts b/apps/api/src/modules/evaluation/evaluation.service.ts new file mode 100644 index 0000000..f04fcbc --- /dev/null +++ b/apps/api/src/modules/evaluation/evaluation.service.ts @@ -0,0 +1,278 @@ +import { + Injectable, + NotFoundException, + BadRequestException, + ConflictException, +} from '@nestjs/common'; +import { InjectQueue } from '@nestjs/bull'; +import { Queue } from 'bull'; +import { PrismaService } from '../../common/prisma/prisma.service'; +import { AuditService } from '../../common/audit/audit.service'; +import { CreateCampaignDto } from './dto/create-campaign.dto'; +import { UpdateFormDto } from './dto/update-form.dto'; +import { ApproveFormDto } from './dto/approve-form.dto'; +import { CampaignStatus, EvaluationScore, Prisma, ProposedCategory } from '@prisma/client'; + +// Category calculation algorithm based on A+B+C scores and E expert flags +function calculateCategory(form: { + abilitatiClinice?: EvaluationScore | null; + judecataClinica?: EvaluationScore | null; + manopere?: EvaluationScore | null; + gestionareaSarcinilor?: EvaluationScore | null; + constiintaProfesionala?: EvaluationScore | null; + atitudineaPacienti?: EvaluationScore | null; + atitudineaColegi?: EvaluationScore | null; + atitudineaPersonalNonMed?: EvaluationScore | null; + utilizareSmartphone?: EvaluationScore | null; + respectareaProgramului?: EvaluationScore | null; + respectareaDressCode?: EvaluationScore | null; + membruComitetCalitate?: boolean | null; + functieDeMonitor?: boolean | null; + inlocuiesteSuperiorul?: boolean | null; +}): ProposedCategory { + const scores: (EvaluationScore | null | undefined)[] = [ + form.abilitatiClinice, form.judecataClinica, form.manopere, form.gestionareaSarcinilor, + form.constiintaProfesionala, form.atitudineaPacienti, form.atitudineaColegi, form.atitudineaPersonalNonMed, + form.utilizareSmartphone, form.respectareaProgramului, form.respectareaDressCode, + ]; + + const filled = scores.filter((s) => s != null) as EvaluationScore[]; + if (filled.length < 8) return ProposedCategory.fara; + + const scoreValue = (s: EvaluationScore) => + s === EvaluationScore.bine ? 2 : s === EvaluationScore.mediu ? 1 : 0; + + const total = filled.reduce((acc, s) => acc + scoreValue(s), 0); + const max = filled.length * 2; + const percent = total / max; + + const expertCount = [form.membruComitetCalitate, form.functieDeMonitor, form.inlocuiesteSuperiorul] + .filter(Boolean).length; + + if (percent >= 0.9 && expertCount >= 1) return ProposedCategory.superioara; + if (percent >= 0.75) return ProposedCategory.cat_I; + if (percent >= 0.5) return ProposedCategory.cat_II; + return ProposedCategory.fara; +} + +@Injectable() +export class EvaluationService { + constructor( + private readonly prisma: PrismaService, + private readonly audit: AuditService, + @InjectQueue('evaluation-notifications') private readonly notifQueue: Queue, + ) {} + + // ─── Campaigns ──────────────────────────────────────────── + + findAllCampaigns(departmentId?: string) { + return this.prisma.evaluationCampaign.findMany({ + where: departmentId ? { departmentId } : undefined, + orderBy: { month: 'desc' }, + include: { + department: { select: { name: true } }, + _count: { select: { forms: true } }, + }, + }); + } + + async findCampaign(id: string) { + const campaign = await this.prisma.evaluationCampaign.findUnique({ + where: { id }, + include: { + department: true, + forms: { + include: { + employee: { + select: { id: true, idnp: true, nume: true, prenume: true, status: true }, + }, + }, + orderBy: [{ categorieAprobata: 'asc' }, { completedAt: 'desc' }], + }, + }, + }); + if (!campaign) throw new NotFoundException(`Campania ${id} nu există`); + return campaign; + } + + async createCampaign(dto: CreateCampaignDto, userId: string, role: string) { + const month = new Date(dto.month); + + // Check no duplicate campaign for same dept+month + const existing = await this.prisma.evaluationCampaign.findFirst({ + where: { departmentId: dto.departmentId, month }, + }); + if (existing) throw new ConflictException('Există deja o campanie pentru această lună și departament'); + + const campaign = await this.prisma.evaluationCampaign.create({ + data: { name: dto.name, departmentId: dto.departmentId, month }, + include: { department: true }, + }); + + await this.audit.logChange({ userId, userRole: role, action: 'CREATE', entity: 'EvaluationCampaign', entityId: campaign.id }); + return campaign; + } + + // Generate forms for all eligible employees (>6 months at campaign month start) + async generateForms(campaignId: string, userId: string, role: string) { + const campaign = await this.prisma.evaluationCampaign.findUniqueOrThrow({ where: { id: campaignId } }); + + if (campaign.status !== CampaignStatus.draft) { + throw new BadRequestException('Formularele se pot genera doar pentru campanii în status draft'); + } + + // All active employees with a contract in this department (active or not yet dismissed) + const eligible = await this.prisma.employee.findMany({ + where: { + status: 'activ', + contracts: { + some: { + departmentId: campaign.departmentId, + OR: [{ dataDemisiei: null }, { dataDemisiei: { gt: campaign.month } }], + }, + }, + // Skip employees already in this campaign + evaluationForms: { none: { campaignId } }, + }, + select: { id: true }, + }); + + if (eligible.length === 0) return { generated: 0 }; + + await this.prisma.evaluationForm.createMany({ + data: eligible.map((e) => ({ campaignId, employeeId: e.id })), + skipDuplicates: true, + }); + + await this.prisma.evaluationCampaign.update({ + where: { id: campaignId }, + data: { status: CampaignStatus.scheduled }, + }); + + await this.audit.logChange({ userId, userRole: role, action: 'UPDATE', entity: 'EvaluationCampaign', entityId: campaignId }); + + // Schedule 14-day notification job + const campaignDate = new Date(campaign.month); + const notifyAt = new Date(campaignDate); + notifyAt.setDate(notifyAt.getDate() - 14); + const delay = Math.max(0, notifyAt.getTime() - Date.now()); + + await this.notifQueue.add('campaign-reminder', { campaignId }, { delay }); + + return { generated: eligible.length }; + } + + async updateCampaignStatus(id: string, status: CampaignStatus, userId: string, role: string) { + const campaign = await this.prisma.evaluationCampaign.findUniqueOrThrow({ where: { id } }); + + const allowed: Record<CampaignStatus, CampaignStatus[]> = { + draft: [CampaignStatus.scheduled], + scheduled: [CampaignStatus.in_progress, CampaignStatus.draft], + in_progress: [CampaignStatus.closed], + closed: [], + }; + + if (!allowed[campaign.status].includes(status)) { + throw new BadRequestException(`Tranziție invalidă: ${campaign.status} → ${status}`); + } + + const updated = await this.prisma.evaluationCampaign.update({ where: { id }, data: { status } }); + await this.audit.logChange({ userId, userRole: role, action: 'UPDATE', entity: 'EvaluationCampaign', entityId: id }); + return updated; + } + + async deleteCampaign(id: string, userId: string, role: string) { + const campaign = await this.prisma.evaluationCampaign.findUniqueOrThrow({ where: { id } }); + if (campaign.status === CampaignStatus.in_progress) { + throw new BadRequestException('Nu se poate șterge o campanie în desfășurare.'); + } + await this.prisma.evaluationCampaign.delete({ where: { id } }); + await this.audit.logChange({ userId, userRole: role, action: 'DELETE', entity: 'EvaluationCampaign', entityId: id }); + } + + // ─── Forms ──────────────────────────────────────────────── + + findForm(id: string) { + return this.prisma.evaluationForm.findUniqueOrThrow({ + where: { id }, + include: { + employee: { + select: { + id: true, idnp: true, nume: true, prenume: true, status: true, + qualifications: { orderBy: { dataExpirarii: 'desc' }, take: 1 }, + disciplinarySanctions: { where: { isStinsa: false } }, + }, + }, + campaign: { include: { department: { select: { name: true } } } }, + }, + }); + } + + async updateForm(id: string, dto: UpdateFormDto, userId: string, role: string) { + const form = await this.prisma.evaluationForm.findUniqueOrThrow({ where: { id } }); + + // Merge with existing scores to recalculate category + const merged = { ...form, ...dto }; + const categorieCalculata = calculateCategory(merged); + + const updated = await this.prisma.evaluationForm.update({ + where: { id }, + data: { ...dto, categorieCalculata } as Prisma.EvaluationFormUpdateInput, + }); + + await this.audit.logChange({ userId, userRole: role, action: 'UPDATE', entity: 'EvaluationForm', entityId: id }); + return updated; + } + + async approveForm(id: string, dto: ApproveFormDto, userId: string, role: string) { + const updated = await this.prisma.evaluationForm.update({ + where: { id }, + data: { + categorieAprobata: dto.categorieAprobata, + observatii: dto.observatii, + completedAt: new Date(), + }, + }); + await this.audit.logChange({ userId, userRole: role, action: 'UPDATE', entity: 'EvaluationForm', entityId: id }); + return updated; + } + + // Academy Ocean webhook — auto-fill D1 JCI test result + async receiveAcademyOceanWebhook(payload: { + employeeIdnp: string; + score: number; + maxScore: number; + completedAt: string; + externalId: string; + }) { + const employee = await this.prisma.employee.findUnique({ where: { idnp: payload.employeeIdnp } }); + if (!employee) return { accepted: false, reason: 'Employee not found' }; + + // Find open form for this employee (in_progress campaign) + const form = await this.prisma.evaluationForm.findFirst({ + where: { + employeeId: employee.id, + campaign: { status: CampaignStatus.in_progress }, + completedAt: null, + }, + orderBy: { createdAt: 'desc' }, + }); + if (!form) return { accepted: false, reason: 'No open form found' }; + + await this.prisma.evaluationForm.update({ + where: { id: form.id }, + data: { + testJci: { + score: payload.score, + max_score: payload.maxScore, + percent: Math.round((payload.score / payload.maxScore) * 100), + completed_at: payload.completedAt, + source: 'academy_ocean', + external_id: payload.externalId, + }, + }, + }); + + return { accepted: true, formId: form.id }; + } +} diff --git a/apps/api/src/modules/evaluation/workers/evaluation-notifications.processor.ts b/apps/api/src/modules/evaluation/workers/evaluation-notifications.processor.ts new file mode 100644 index 0000000..351c322 --- /dev/null +++ b/apps/api/src/modules/evaluation/workers/evaluation-notifications.processor.ts @@ -0,0 +1,63 @@ +import { Processor, Process } from '@nestjs/bull'; +import { Job } from 'bull'; +import { Injectable, Logger } from '@nestjs/common'; +import { PrismaService } from '../../../common/prisma/prisma.service'; +import { HttpService } from '@nestjs/axios'; +import { firstValueFrom } from 'rxjs'; + +interface CampaignReminderJob { campaignId: string } + +@Injectable() +@Processor('evaluation-notifications') +export class EvaluationNotificationsProcessor { + private readonly logger = new Logger(EvaluationNotificationsProcessor.name); + + constructor( + private readonly prisma: PrismaService, + private readonly http: HttpService, + ) {} + + @Process('campaign-reminder') + async handleCampaignReminder(job: Job<CampaignReminderJob>) { + const { campaignId } = job.data; + + const campaign = await this.prisma.evaluationCampaign.findUnique({ + where: { id: campaignId }, + include: { + department: true, + forms: { include: { employee: { select: { idnp: true, nume: true, prenume: true } } } }, + }, + }); + + if (!campaign) { + this.logger.warn(`Campaign ${campaignId} not found, skipping notification`); + return; + } + + const employeeList = campaign.forms.map((f) => + `${f.employee.nume} ${f.employee.prenume} (${f.employee.idnp})` + ).join('\n'); + + const n8nWebhook = process.env.N8N_WEBHOOK_BASE; + if (!n8nWebhook) { + this.logger.warn('N8N_WEBHOOK_BASE not set, skipping notification'); + return; + } + + try { + await firstValueFrom( + this.http.post(`${n8nWebhook}/evaluation-reminder`, { + type: 'evaluation-reminder', + campaignName: campaign.name, + departmentName: campaign.department.name, + month: campaign.month, + employeeCount: campaign.forms.length, + employeeList, + }), + ); + this.logger.log(`Evaluation reminder sent for campaign ${campaign.name}`); + } catch (err) { + this.logger.error(`Failed to send evaluation reminder: ${(err as Error).message}`); + } + } +} diff --git a/apps/api/src/modules/inventory/dto/adjust-stock.dto.ts b/apps/api/src/modules/inventory/dto/adjust-stock.dto.ts new file mode 100644 index 0000000..7f1d981 --- /dev/null +++ b/apps/api/src/modules/inventory/dto/adjust-stock.dto.ts @@ -0,0 +1,6 @@ +import { IsNumber, IsString } from 'class-validator'; + +export class AdjustStockDto { + @IsNumber() delta!: number; + @IsString() reason!: string; +} diff --git a/apps/api/src/modules/inventory/dto/create-inventory.dto.ts b/apps/api/src/modules/inventory/dto/create-inventory.dto.ts new file mode 100644 index 0000000..1a3f9e1 --- /dev/null +++ b/apps/api/src/modules/inventory/dto/create-inventory.dto.ts @@ -0,0 +1,13 @@ +import { IsBoolean, IsEnum, IsNumber, IsOptional, IsString, Min } from 'class-validator'; +import { InventoryItemType } from '@prisma/client'; + +export class CreateInventoryDto { + @IsString() sku!: string; + @IsString() name!: string; + @IsEnum(InventoryItemType) type!: InventoryItemType; + @IsOptional() @IsString() size?: string; + @IsOptional() @IsString() color?: string; + @IsOptional() @IsNumber() pricePerUnit?: number; + @IsNumber() @Min(0) stockQty!: number; + @IsOptional() @IsBoolean() active?: boolean; +} diff --git a/apps/api/src/modules/inventory/dto/list-query.dto.ts b/apps/api/src/modules/inventory/dto/list-query.dto.ts new file mode 100644 index 0000000..5c45c1d --- /dev/null +++ b/apps/api/src/modules/inventory/dto/list-query.dto.ts @@ -0,0 +1,11 @@ +import { IsBoolean, IsEnum, IsInt, IsOptional, IsString } from 'class-validator'; +import { Type } from 'class-transformer'; +import { InventoryItemType } from '@prisma/client'; + +export class InventoryQueryDto { + @IsOptional() @IsEnum(InventoryItemType) type?: InventoryItemType; + @IsOptional() @Type(() => Boolean) @IsBoolean() active?: boolean; + @IsOptional() @IsString() search?: string; + @IsOptional() @Type(() => Number) @IsInt() page?: number = 1; + @IsOptional() @Type(() => Number) @IsInt() limit?: number = 50; +} diff --git a/apps/api/src/modules/inventory/dto/update-inventory.dto.ts b/apps/api/src/modules/inventory/dto/update-inventory.dto.ts new file mode 100644 index 0000000..925adf1 --- /dev/null +++ b/apps/api/src/modules/inventory/dto/update-inventory.dto.ts @@ -0,0 +1,14 @@ +import { IsBoolean, IsEnum, IsNumber, IsOptional, IsString, Min } from 'class-validator'; +import { InventoryItemType } from '@prisma/client'; + +// Manual partial of CreateInventoryDto (avoids @nestjs/mapped-types dep). +export class UpdateInventoryDto { + @IsOptional() @IsString() sku?: string; + @IsOptional() @IsString() name?: string; + @IsOptional() @IsEnum(InventoryItemType) type?: InventoryItemType; + @IsOptional() @IsString() size?: string; + @IsOptional() @IsString() color?: string; + @IsOptional() @IsNumber() pricePerUnit?: number; + @IsOptional() @IsNumber() @Min(0) stockQty?: number; + @IsOptional() @IsBoolean() active?: boolean; +} diff --git a/apps/api/src/modules/inventory/inventory.controller.ts b/apps/api/src/modules/inventory/inventory.controller.ts new file mode 100644 index 0000000..c03c85f --- /dev/null +++ b/apps/api/src/modules/inventory/inventory.controller.ts @@ -0,0 +1,73 @@ +import { + Body, + Controller, + Delete, + Get, + Param, + ParseUUIDPipe, + Patch, + Post, + Query, + Request, + UseGuards, +} from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from '../../common/guards/roles.guard'; +import { Roles } from '../../common/decorators/roles.decorator'; +import { InventoryService } from './inventory.service'; +import { CreateInventoryDto } from './dto/create-inventory.dto'; +import { UpdateInventoryDto } from './dto/update-inventory.dto'; +import { InventoryQueryDto } from './dto/list-query.dto'; +import { AdjustStockDto } from './dto/adjust-stock.dto'; + +interface AuthReq extends Request { user: { id: string; role: string } } + +@Controller('inventory') +@UseGuards(AuthGuard('jwt'), RolesGuard) +export class InventoryController { + constructor(private readonly svc: InventoryService) {} + + @Get() + @Roles('hr_admin', 'hr_specialist') + list(@Query() q: InventoryQueryDto, @Request() req: AuthReq) { + return this.svc.list(q, req.user.id, req.user.role); + } + + @Get(':id') + @Roles('hr_admin', 'hr_specialist') + findOne(@Param('id', ParseUUIDPipe) id: string, @Request() req: AuthReq) { + return this.svc.findOne(id, req.user.id, req.user.role); + } + + @Post() + @Roles('hr_admin') + create(@Body() dto: CreateInventoryDto, @Request() req: AuthReq) { + return this.svc.create(dto, req.user.id, req.user.role); + } + + @Patch(':id') + @Roles('hr_admin') + update( + @Param('id', ParseUUIDPipe) id: string, + @Body() dto: UpdateInventoryDto, + @Request() req: AuthReq, + ) { + return this.svc.update(id, dto, req.user.id, req.user.role); + } + + @Delete(':id') + @Roles('hr_admin') + remove(@Param('id', ParseUUIDPipe) id: string, @Request() req: AuthReq) { + return this.svc.remove(id, req.user.id, req.user.role); + } + + @Post(':id/adjust-stock') + @Roles('hr_admin') + adjust( + @Param('id', ParseUUIDPipe) id: string, + @Body() dto: AdjustStockDto, + @Request() req: AuthReq, + ) { + return this.svc.adjustStock(id, dto, req.user.id, req.user.role); + } +} diff --git a/apps/api/src/modules/inventory/inventory.module.ts b/apps/api/src/modules/inventory/inventory.module.ts new file mode 100644 index 0000000..4795564 --- /dev/null +++ b/apps/api/src/modules/inventory/inventory.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { InventoryController } from './inventory.controller'; +import { InventoryService } from './inventory.service'; + +@Module({ + controllers: [InventoryController], + providers: [InventoryService], +}) +export class InventoryModule {} diff --git a/apps/api/src/modules/inventory/inventory.service.ts b/apps/api/src/modules/inventory/inventory.service.ts new file mode 100644 index 0000000..e6edc8a --- /dev/null +++ b/apps/api/src/modules/inventory/inventory.service.ts @@ -0,0 +1,131 @@ +import { BadRequestException, Injectable } from '@nestjs/common'; +import { Prisma } from '@prisma/client'; +import { PrismaService } from '../../common/prisma/prisma.service'; +import { AuditService } from '../../common/audit/audit.service'; +import { CreateInventoryDto } from './dto/create-inventory.dto'; +import { UpdateInventoryDto } from './dto/update-inventory.dto'; +import { InventoryQueryDto } from './dto/list-query.dto'; +import { AdjustStockDto } from './dto/adjust-stock.dto'; + +@Injectable() +export class InventoryService { + constructor( + private readonly prisma: PrismaService, + private readonly audit: AuditService, + ) {} + + async list(q: InventoryQueryDto, userId: string, role: string) { + const where: Prisma.InventoryItemWhereInput = {}; + if (q.type) where.type = q.type; + if (q.active !== undefined) where.active = q.active; + if (q.search) { + where.OR = [ + { sku: { contains: q.search, mode: 'insensitive' } }, + { name: { contains: q.search, mode: 'insensitive' } }, + ]; + } + const limit = Math.min(q.limit ?? 50, 200); + const page = q.page ?? 1; + const [total, items] = await this.prisma.$transaction([ + this.prisma.inventoryItem.count({ where }), + this.prisma.inventoryItem.findMany({ + where, + orderBy: { name: 'asc' }, + skip: (page - 1) * limit, + take: limit, + }), + ]); + await this.audit.logRead({ userId, userRole: role, entity: 'InventoryItem', entityId: 'LIST' }); + return { total, page, limit, items }; + } + + async findOne(id: string, userId: string, role: string) { + const item = await this.prisma.inventoryItem.findUniqueOrThrow({ where: { id } }); + await this.audit.logRead({ userId, userRole: role, entity: 'InventoryItem', entityId: id }); + return item; + } + + async create(dto: CreateInventoryDto, userId: string, role: string) { + const item = await this.prisma.inventoryItem.create({ data: dto }); + await this.audit.logChange({ + userId, + userRole: role, + action: 'CREATE', + entity: 'InventoryItem', + entityId: item.id, + }); + return item; + } + + async update(id: string, dto: UpdateInventoryDto, userId: string, role: string) { + const item = await this.prisma.inventoryItem.update({ where: { id }, data: dto }); + await this.audit.logChange({ + userId, + userRole: role, + action: 'UPDATE', + entity: 'InventoryItem', + entityId: id, + }); + return item; + } + + async remove(id: string, userId: string, role: string) { + const used = await this.prisma.benefit.count({ + where: { + OR: [ + { uniformaId: id }, + { halatId: id }, + { ciupiciId: id }, + { vestaId: id }, + { aparatTelefonId: id }, + ], + }, + }); + if (used > 0) { + await this.prisma.inventoryItem.update({ where: { id }, data: { active: false } }); + await this.audit.logChange({ + userId, + userRole: role, + action: 'UPDATE', + entity: 'InventoryItem', + entityId: id, + field: 'active', + newValue: 'false', + }); + return { softDeleted: true }; + } + await this.prisma.inventoryItem.delete({ where: { id } }); + await this.audit.logChange({ + userId, + userRole: role, + action: 'DELETE', + entity: 'InventoryItem', + entityId: id, + }); + return { deleted: true }; + } + + async adjustStock(id: string, dto: AdjustStockDto, userId: string, role: string) { + const item = await this.prisma.$transaction(async (tx) => { + const updated = await tx.inventoryItem.update({ + where: { id }, + data: { stockQty: { increment: dto.delta } }, + }); + if (updated.stockQty < 0) { + throw new BadRequestException('Stoc negativ nu este permis'); + } + return updated; + }); + await this.audit.logChange({ + userId, + userRole: role, + action: 'UPDATE', + entity: 'InventoryItem', + entityId: id, + field: 'stockQty', + newValue: String(item.stockQty), + reason: dto.reason, + }); + return item; + } +} diff --git a/apps/api/src/modules/medical/dto/checkup.dto.ts b/apps/api/src/modules/medical/dto/checkup.dto.ts new file mode 100644 index 0000000..64d8f2e --- /dev/null +++ b/apps/api/src/modules/medical/dto/checkup.dto.ts @@ -0,0 +1,60 @@ +import { + IsEnum, IsDateString, IsOptional, IsString, IsArray, ArrayNotEmpty, IsUUID, + ValidateNested, +} from 'class-validator'; +import { Type } from 'class-transformer'; +import { MedicalCheckupType, MedicalVerdict } from '@prisma/client'; + +export class CreateCheckupDto { + @IsEnum(MedicalCheckupType) + tip!: MedicalCheckupType; + + @IsDateString() + dataPlanificata!: string; +} + +export class CompleteCheckupDto { + @IsEnum(MedicalVerdict) + verdict!: MedicalVerdict; + + @IsDateString() + dataEfectuata!: string; + + @IsOptional() + @IsString() + recomandari?: string; + + @IsOptional() + @IsDateString() + valabilPanaLa?: string; + + @IsOptional() + @IsString() + semnatDe?: string; +} + +export class DocumentContextDto { + @IsOptional() @IsString() telefon?: string; + @IsOptional() @IsString() fax?: string; + @IsOptional() @IsString() email?: string; + @IsOptional() @IsString() solicitant?: string; + @IsOptional() @IsString() functia?: string; +} + +export class BulkInitiateDto { + @IsArray() + @ArrayNotEmpty() + @IsUUID('4', { each: true }) + employeeIds!: string[]; + + @IsEnum(MedicalCheckupType) + tip!: MedicalCheckupType; + + @IsDateString() + dataPlanificata!: string; + + @IsOptional() + @ValidateNested() + @Type(() => DocumentContextDto) + documentContext?: DocumentContextDto; +} diff --git a/apps/api/src/modules/medical/dto/medical-profile.dto.ts b/apps/api/src/modules/medical/dto/medical-profile.dto.ts new file mode 100644 index 0000000..46df343 --- /dev/null +++ b/apps/api/src/modules/medical/dto/medical-profile.dto.ts @@ -0,0 +1,41 @@ +import { + IsString, IsOptional, IsBoolean, IsUUID, IsDateString, IsInt, IsNumber, Min, + IsEnum, IsArray, ValidateNested, +} from 'class-validator'; +import { Type } from 'class-transformer'; +import { OverexposureKind } from '@prisma/client'; + +// Supraexpunere la radiații ionizante — rând din Anexa 4B. +export class OverexposureDto { + @IsEnum(OverexposureKind) fel!: OverexposureKind; + @IsOptional() @IsString() tipExpunere?: string; + @IsOptional() @IsDateString() data?: string; + @IsOptional() @IsNumber() dozaMsv?: number; +} + +export class UpsertMedicalProfileDto { + @IsOptional() @IsString() ocupatieCorm?: string; + + @IsOptional() @IsUUID() + workplaceRiskCardId?: string; + + @IsOptional() @IsDateString() + dataUltimControlMedical?: string; + + @IsBoolean() + expusRadiatiiIonizante!: boolean; + + // Conditional fields — required only when expusRadiatiiIonizante = true + @IsOptional() @IsDateString() dataIntrarii?: string; + @IsOptional() @IsString() expunereAnterioaraPerioda?: string; + @IsOptional() @IsInt() @Min(0) expunereAnterioaraAni?: number; + @IsOptional() @IsNumber() dozaCumulataExternaMsv?: number; + @IsOptional() @IsNumber() dozaCumulataInternaMsv?: number; + + // Supraexpuneri (Anexa 4B) — set complet (înlocuiește la salvare) + @IsOptional() + @IsArray() + @ValidateNested({ each: true }) + @Type(() => OverexposureDto) + overexposures?: OverexposureDto[]; +} diff --git a/apps/api/src/modules/medical/dto/risk-card.dto.ts b/apps/api/src/modules/medical/dto/risk-card.dto.ts new file mode 100644 index 0000000..324507d --- /dev/null +++ b/apps/api/src/modules/medical/dto/risk-card.dto.ts @@ -0,0 +1,78 @@ +import { + IsString, IsObject, MinLength, IsOptional, IsInt, IsBoolean, IsEnum, + IsArray, ValidateNested, IsIn, +} from 'class-validator'; +import { Type } from 'class-transformer'; +import { RiskExposureType } from '@prisma/client'; + +// Un rând dintr-un tabel factorial al Anexei 4 (NU-10-MS-2026). +export class RiskExposureDto { + @IsEnum(RiskExposureType) tip!: RiskExposureType; + @IsString() @MinLength(1) denumire!: string; + @IsOptional() @IsString() cas?: string; + @IsOptional() @IsString() einecs?: string; + @IsOptional() @IsString() clasificare?: string; + @IsOptional() @IsString() zonaAfectata?: string; + @IsOptional() @IsString() timpExpunere?: string; + @IsOptional() @IsString() vep?: string; + @IsOptional() @IsString() vlep?: string; + @IsOptional() @IsString() caracteristici?: string; + @IsOptional() @IsString() procesVerbal?: string; +} + +// Câmpurile comune (create + update) ale cardului de risc / Anexa 4. +class RiskCardBaseDto { + // legacy: { chimici, fizici, biologici, ergonomici, psihosociali } + @IsOptional() @IsObject() riskFactors?: Record<string, string[]>; + + // ── Antet Anexa 4 ── + @IsOptional() @IsString() filiala?: string; + @IsOptional() @IsString() adresaFiliala?: string; + @IsOptional() @IsString() telefonFiliala?: string; + @IsOptional() @IsString() caemPrimeleDouaCifre?: string; + @IsOptional() @IsString() cormSubgrupaMajora?: string; + @IsOptional() @IsString() directiaSectiaSectorul?: string; + @IsOptional() @IsString() numarulLoculuiDeMunca?: string; + @IsOptional() @IsString() caemDiviziune?: string; + @IsOptional() @IsString() clasaConditiilorDeMunca?: string; + @IsOptional() @IsInt() numarLucratoriPosibili?: number; + @IsOptional() @IsIn(['STANDARD', 'DISTANTA_DIGITAL']) tipFisa?: string; + + // ── Bloc descriptiv (checkbox-uri / descrieri) ── + @IsOptional() @IsObject() evaluareDetalii?: Record<string, unknown>; + + // ── Radiații ionizante (per loc de muncă) ── + @IsOptional() @IsBoolean() radiatiiIonizante?: boolean; + @IsOptional() @IsString() radiatiiGrupa?: string; + @IsOptional() @IsString() radiatiiAparatura?: string; + @IsOptional() @IsString() radiatiiSurse?: string; + @IsOptional() @IsString() radiatiiTipExpunere?: string; + @IsOptional() @IsString() radiatiiMasuriProtectie?: string; + + // ── Subsol ── + @IsOptional() @IsString() mijloaceProtectieColectiva?: string; + @IsOptional() @IsString() mijloaceProtectieIndividuala?: string; + @IsOptional() @IsString() echipamentLucru?: string; + @IsOptional() @IsString() observatii?: string; + @IsOptional() @IsObject() anexeIgienicoSanitare?: Record<string, unknown>; + + // ── Tabele factoriale ── + @IsOptional() + @IsArray() + @ValidateNested({ each: true }) + @Type(() => RiskExposureDto) + exposures?: RiskExposureDto[]; +} + +export class CreateRiskCardDto extends RiskCardBaseDto { + @IsString() + @MinLength(2) + name!: string; +} + +export class UpdateRiskCardDto extends RiskCardBaseDto { + @IsOptional() + @IsString() + @MinLength(2) + name?: string; +} diff --git a/apps/api/src/modules/medical/medical.controller.ts b/apps/api/src/modules/medical/medical.controller.ts new file mode 100644 index 0000000..4bf6a46 --- /dev/null +++ b/apps/api/src/modules/medical/medical.controller.ts @@ -0,0 +1,155 @@ +import { + Controller, Get, Post, Patch, Delete, Body, Param, Query, ParseUUIDPipe, + UseGuards, Request, HttpCode, HttpStatus, +} from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from '../../common/guards/roles.guard'; +import { Roles } from '../../common/decorators/roles.decorator'; +import { RiskCardsService } from './services/risk-cards.service'; +import { MedicalProfileService } from './services/medical-profile.service'; +import { CheckupService } from './services/checkup.service'; +import { BulkService } from './services/bulk.service'; +import { StorageService } from './services/storage.service'; +import { CreateRiskCardDto, UpdateRiskCardDto } from './dto/risk-card.dto'; +import { UpsertMedicalProfileDto } from './dto/medical-profile.dto'; +import { CreateCheckupDto, CompleteCheckupDto, BulkInitiateDto } from './dto/checkup.dto'; + +interface AuthReq extends Request { user: { id: string; role: string } } + +@Controller('medical') +@UseGuards(AuthGuard('jwt'), RolesGuard) +export class MedicalController { + constructor( + private readonly riskCards: RiskCardsService, + private readonly profiles: MedicalProfileService, + private readonly checkups: CheckupService, + private readonly bulk: BulkService, + private readonly storage: StorageService, + ) {} + + // ─── Risk Cards ───────────────────────────────────────────────── + + @Get('risk-cards') + @Roles('hr_admin', 'hr_specialist', 'manager', 'medic_familie') + listRiskCards() { return this.riskCards.findAll(); } + + @Get('risk-cards/:id') + @Roles('hr_admin', 'hr_specialist', 'manager', 'medic_familie') + getRiskCard(@Param('id', ParseUUIDPipe) id: string) { return this.riskCards.findOne(id); } + + @Post('risk-cards') + @Roles('hr_admin') + @HttpCode(HttpStatus.CREATED) + createRiskCard(@Body() dto: CreateRiskCardDto, @Request() req: AuthReq) { + return this.riskCards.create(dto, req.user.id, req.user.role); + } + + @Patch('risk-cards/:id') + @Roles('hr_admin') + updateRiskCard(@Param('id', ParseUUIDPipe) id: string, @Body() dto: UpdateRiskCardDto, @Request() req: AuthReq) { + return this.riskCards.update(id, dto, req.user.id, req.user.role); + } + + @Delete('risk-cards/:id') + @Roles('hr_admin') + @HttpCode(HttpStatus.NO_CONTENT) + deleteRiskCard(@Param('id', ParseUUIDPipe) id: string, @Request() req: AuthReq) { + return this.riskCards.remove(id, req.user.id, req.user.role); + } + + // ─── Employee Medical Profile ─────────────────────────────────── + + @Get('profiles/:employeeId') + @Roles('hr_admin', 'hr_specialist', 'manager', 'medic_familie', 'employee') + getProfile(@Param('employeeId', ParseUUIDPipe) employeeId: string) { + return this.profiles.findOne(employeeId); + } + + @Post('profiles/:employeeId') + @Roles('hr_admin', 'hr_specialist') + upsertProfile(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Body() dto: UpsertMedicalProfileDto, @Request() req: AuthReq) { + return this.profiles.upsert(employeeId, dto, req.user.id, req.user.role); + } + + // ─── Medical Checkups ────────────────────────────────────────── + + @Get('checkups/employee/:employeeId') + @Roles('hr_admin', 'hr_specialist', 'manager', 'medic_familie', 'employee') + listByEmployee(@Param('employeeId', ParseUUIDPipe) employeeId: string) { + return this.checkups.findByEmployee(employeeId); + } + + @Get('checkups/:id') + @Roles('hr_admin', 'hr_specialist', 'manager', 'medic_familie') + getCheckup(@Param('id', ParseUUIDPipe) id: string) { return this.checkups.findOne(id); } + + @Post('checkups/employee/:employeeId') + @Roles('hr_admin', 'hr_specialist') + @HttpCode(HttpStatus.CREATED) + createCheckup(@Param('employeeId', ParseUUIDPipe) employeeId: string, @Body() dto: CreateCheckupDto, @Request() req: AuthReq) { + return this.checkups.create(employeeId, dto, req.user.id, req.user.role); + } + + // medic_familie completes the checkup with verdict + @Patch('checkups/:id/complete') + @Roles('medic_familie') + completeCheckup(@Param('id', ParseUUIDPipe) id: string, @Body() dto: CompleteCheckupDto, @Request() req: AuthReq) { + return this.checkups.complete(id, dto, req.user.id, req.user.role); + } + + // medic_familie inbox + @Get('checkups/inbox/pending') + @Roles('medic_familie', 'hr_admin') + pendingForMedic() { return this.checkups.findPendingForMedic(); } + + // ─── Bulk Initiation ─────────────────────────────────────────── + + @Post('bulk/initiate') + @Roles('hr_admin') + bulkInitiate(@Body() dto: BulkInitiateDto, @Request() req: AuthReq) { + return this.bulk.initiate(dto, req.user.id, req.user.role); + } + + // Dashboard: employees overdue / due in 30 days + @Get('upcoming-expirations') + @Roles('hr_admin', 'hr_specialist', 'manager') + upcoming() { return this.bulk.upcomingExpirations(); } + + // ─── Document download (presigned URL) ───────────────────────── + + @Get('documents/presign') + @Roles('hr_admin', 'hr_specialist', 'manager', 'medic_familie', 'employee') + async presignDocument(@Query('key') key: string) { + return { url: await this.storage.presignedUrl(key) }; + } + + // ─── Delete a single document from a checkup ─────────────────── + + @Delete('checkups/:id') + @Roles('hr_admin') + @HttpCode(HttpStatus.NO_CONTENT) + removeCheckup(@Param('id', ParseUUIDPipe) id: string, @Request() req: AuthReq) { + return this.checkups.remove(id, req.user.id, req.user.role); + } + + @Delete('checkups/:id/documents') + @Roles('hr_admin', 'hr_specialist') + @HttpCode(HttpStatus.NO_CONTENT) + deleteDocument( + @Param('id', ParseUUIDPipe) id: string, + @Query('name') name: string, + @Request() req: AuthReq, + ) { + return this.checkups.deleteDocument(id, name, req.user.id, req.user.role); + } + + @Delete('checkups/:id/documents/all') + @Roles('hr_admin', 'hr_specialist') + @HttpCode(HttpStatus.NO_CONTENT) + deleteAllDocuments( + @Param('id', ParseUUIDPipe) id: string, + @Request() req: AuthReq, + ) { + return this.checkups.deleteAllDocuments(id, req.user.id, req.user.role); + } +} diff --git a/apps/api/src/modules/medical/medical.module.ts b/apps/api/src/modules/medical/medical.module.ts new file mode 100644 index 0000000..827f6ea --- /dev/null +++ b/apps/api/src/modules/medical/medical.module.ts @@ -0,0 +1,23 @@ +import { Module } from '@nestjs/common'; +import { MedicalController } from './medical.controller'; +import { RiskCardsService } from './services/risk-cards.service'; +import { MedicalProfileService } from './services/medical-profile.service'; +import { CheckupService } from './services/checkup.service'; +import { BulkService } from './services/bulk.service'; +import { DocumentGeneratorService } from './services/document-generator.service'; +import { DocxTemplateService } from './services/docx-template.service'; +import { StorageService } from './services/storage.service'; + +@Module({ + controllers: [MedicalController], + providers: [ + RiskCardsService, + MedicalProfileService, + CheckupService, + BulkService, + DocumentGeneratorService, + DocxTemplateService, + StorageService, + ], +}) +export class MedicalModule {} diff --git a/apps/api/src/modules/medical/services/bulk.service.ts b/apps/api/src/modules/medical/services/bulk.service.ts new file mode 100644 index 0000000..853e7b0 --- /dev/null +++ b/apps/api/src/modules/medical/services/bulk.service.ts @@ -0,0 +1,182 @@ +import { Injectable, BadRequestException } from '@nestjs/common'; +import { randomUUID } from 'node:crypto'; +import { PrismaService } from '../../../common/prisma/prisma.service'; +import { AuditService } from '../../../common/audit/audit.service'; +import { DocumentGeneratorService, GeneratedDoc } from './document-generator.service'; +import { BulkInitiateDto } from '../dto/checkup.dto'; + +@Injectable() +export class BulkService { + constructor( + private readonly prisma: PrismaService, + private readonly audit: AuditService, + private readonly docs: DocumentGeneratorService, + ) {} + + /** + * Initiate medical control for a batch of employees: + * 1. Group by workplace_risk_card_id + * 2. For each group, generate documents (Anexa 4, fisa solicitare, optional 4B, Anexa 6 per employee) + * 3. Create MedicalCheckup record per employee with documenteGenerate links + */ + async initiate(dto: BulkInitiateDto, userId: string, role: string) { + const employees = await this.prisma.employee.findMany({ + where: { id: { in: dto.employeeIds } }, + include: { + medicalProfile: { + include: { workplaceRiskCard: { include: { exposures: true } }, overexposures: true }, + }, + }, + }); + + if (employees.length !== dto.employeeIds.length) { + throw new BadRequestException('Unul sau mai mulți angajați nu au fost găsiți'); + } + + const missingProfile = employees.filter((e) => !e.medicalProfile?.workplaceRiskCardId); + if (missingProfile.length > 0) { + throw new BadRequestException( + `Angajații fără carte de risc atribuită: ${missingProfile.map((e) => `${e.nume} ${e.prenume}`).join(', ')}`, + ); + } + + // Group by riskCardId + const groups = new Map<string, typeof employees>(); + for (const emp of employees) { + const cardId = emp.medicalProfile!.workplaceRiskCardId!; + if (!groups.has(cardId)) groups.set(cardId, []); + groups.get(cardId)!.push(emp); + } + + // Pre-fetch active contracts for department names + const contractMap = new Map<string, string>(); + for (const emp of employees) { + const contract = await this.prisma.employmentContract.findFirst({ + where: { employeeId: emp.id, dataDemisiei: null }, + include: { department: true }, + }); + if (contract) contractMap.set(emp.id, contract.department.name); + } + + const batchId = randomUUID(); + const createdCheckups: { employeeId: string; checkupId: string; documents: GeneratedDoc[] }[] = []; + + for (const [, groupEmployees] of groups) { + const riskCard = groupEmployees[0].medicalProfile!.workplaceRiskCard!; + const deptName = contractMap.get(groupEmployees[0].id); + + const { groupDocs, perEmployee } = await this.docs.generateForGroup( + { + id: riskCard.id, + name: riskCard.name, + filiala: riskCard.filiala, + adresaFiliala: riskCard.adresaFiliala, + telefonFiliala: riskCard.telefonFiliala, + caemPrimeleDouaCifre: riskCard.caemPrimeleDouaCifre, + cormSubgrupaMajora: riskCard.cormSubgrupaMajora, + directiaSectiaSectorul: riskCard.directiaSectiaSectorul, + numarulLoculuiDeMunca: riskCard.numarulLoculuiDeMunca, + caemDiviziune: riskCard.caemDiviziune, + clasaConditiilorDeMunca: riskCard.clasaConditiilorDeMunca, + numarLucratoriPosibili: riskCard.numarLucratoriPosibili, + tipFisa: riskCard.tipFisa, + evaluareDetalii: riskCard.evaluareDetalii as Record<string, unknown> | null, + anexeIgienicoSanitare: riskCard.anexeIgienicoSanitare as Record<string, unknown> | null, + mijloaceProtectieColectiva: riskCard.mijloaceProtectieColectiva, + mijloaceProtectieIndividuala: riskCard.mijloaceProtectieIndividuala, + echipamentLucru: riskCard.echipamentLucru, + observatii: riskCard.observatii, + radiatiiIonizante: riskCard.radiatiiIonizante, + radiatiiGrupa: riskCard.radiatiiGrupa, + radiatiiAparatura: riskCard.radiatiiAparatura, + radiatiiSurse: riskCard.radiatiiSurse, + radiatiiTipExpunere: riskCard.radiatiiTipExpunere, + radiatiiMasuriProtectie: riskCard.radiatiiMasuriProtectie, + exposures: riskCard.exposures, + }, + groupEmployees.map((e) => ({ + id: e.id, + idnp: e.idnp, + nume: e.nume, + prenume: e.prenume, + dataNasterii: e.dataNasterii.toISOString(), + ocupatieCorm: e.medicalProfile!.ocupatieCorm, + expusRadiatiiIonizante: e.medicalProfile!.expusRadiatiiIonizante, + dataIntrarii: e.medicalProfile!.dataIntrarii?.toISOString(), + expunereAnterioaraPerioda: e.medicalProfile!.expunereAnterioaraPerioda, + expunereAnterioaraAni: e.medicalProfile!.expunereAnterioaraAni, + dozaCumulataExternaMsv: e.medicalProfile!.dozaCumulataExternaMsv?.toString(), + dozaCumulataInternaMsv: e.medicalProfile!.dozaCumulataInternaMsv?.toString(), + departmentName: contractMap.get(e.id), + overexposures: e.medicalProfile!.overexposures?.map((o) => ({ + fel: o.fel, + tipExpunere: o.tipExpunere, + data: o.data?.toISOString(), + dozaMsv: o.dozaMsv?.toString(), + })), + })), + batchId, + dto.tip, + deptName, + dto.documentContext, + ); + + // Create MedicalCheckup for each employee with documents + for (const emp of groupEmployees) { + const checkup = await this.prisma.medicalCheckup.create({ + data: { + employeeId: emp.id, + tip: dto.tip, + dataPlanificata: new Date(dto.dataPlanificata), + documenteGenerate: [...groupDocs, perEmployee[emp.id]], + }, + }); + createdCheckups.push({ + employeeId: emp.id, + checkupId: checkup.id, + documents: [...groupDocs, perEmployee[emp.id]], + }); + await this.audit.logChange({ userId, userRole: role, action: 'CREATE', entity: 'MedicalCheckup', entityId: checkup.id }); + } + } + + return { + batchId, + groupsCount: groups.size, + employeesCount: employees.length, + checkups: createdCheckups, + }; + } + + /** Inbox: employees whose medical control is overdue or due in next 30 days */ + async upcomingExpirations() { + const now = new Date(); + const cutoff = new Date(now); + cutoff.setFullYear(cutoff.getFullYear() - 1); + cutoff.setDate(cutoff.getDate() + 30); + + return this.prisma.employeeMedicalProfile.findMany({ + where: { + OR: [ + { dataUltimControlMedical: null }, + { dataUltimControlMedical: { lte: cutoff } }, + ], + employee: { status: 'activ' }, + }, + include: { + employee: { + select: { + id: true, idnp: true, nume: true, prenume: true, + contracts: { + where: { dataDemisiei: null }, + select: { department: { select: { name: true } } }, + take: 1, + }, + }, + }, + workplaceRiskCard: { select: { id: true, name: true } }, + }, + orderBy: { dataUltimControlMedical: 'asc' }, + }); + } +} diff --git a/apps/api/src/modules/medical/services/checkup.service.ts b/apps/api/src/modules/medical/services/checkup.service.ts new file mode 100644 index 0000000..01e3790 --- /dev/null +++ b/apps/api/src/modules/medical/services/checkup.service.ts @@ -0,0 +1,218 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import { PrismaService } from '../../../common/prisma/prisma.service'; +import { AuditService } from '../../../common/audit/audit.service'; +import { DocumentGeneratorService } from './document-generator.service'; +import { StorageService } from './storage.service'; +import { CompleteCheckupDto, CreateCheckupDto } from '../dto/checkup.dto'; +import { MedicalCheckupType } from '@prisma/client'; + +@Injectable() +export class CheckupService { + constructor( + private readonly prisma: PrismaService, + private readonly audit: AuditService, + private readonly docs: DocumentGeneratorService, + private readonly storage: StorageService, + ) {} + + findByEmployee(employeeId: string) { + return this.prisma.medicalCheckup.findMany({ + where: { employeeId }, + orderBy: { dataPlanificata: 'desc' }, + }); + } + + async findOne(id: string) { + const c = await this.prisma.medicalCheckup.findUnique({ + where: { id }, + include: { + employee: { + include: { + medicalProfile: { include: { workplaceRiskCard: true } }, + contracts: { + where: { dataDemisiei: null }, + include: { department: true }, + take: 1, + }, + }, + }, + }, + }); + if (!c) throw new NotFoundException(); + return c; + } + + async create(employeeId: string, dto: CreateCheckupDto, userId: string, role: string) { + await this.prisma.employee.findUniqueOrThrow({ where: { id: employeeId } }); + const checkup = await this.prisma.medicalCheckup.create({ + data: { + employeeId, + tip: dto.tip, + dataPlanificata: new Date(dto.dataPlanificata), + }, + }); + await this.audit.logChange({ userId, userRole: role, action: 'CREATE', entity: 'MedicalCheckup', entityId: checkup.id }); + return checkup; + } + + // medic_familie completes the checkup with verdict + recommendations + async complete(id: string, dto: CompleteCheckupDto, userId: string, role: string) { + const existing = await this.prisma.medicalCheckup.findUniqueOrThrow({ + where: { id }, + include: { + employee: { + include: { + medicalProfile: { include: { workplaceRiskCard: true } }, + contracts: { + where: { dataDemisiei: null }, + include: { department: true }, + take: 1, + }, + }, + }, + }, + }); + + const checkup = await this.prisma.medicalCheckup.update({ + where: { id }, + data: { + verdict: dto.verdict, + dataEfectuata: new Date(dto.dataEfectuata), + recomandari: dto.recomandari, + valabilPanaLa: dto.valabilPanaLa ? new Date(dto.valabilPanaLa) : null, + semnatDe: dto.semnatDe, + }, + }); + + // Sync dataUltimControlMedical on the employee profile + const updateProfile = ([ + MedicalCheckupType.la_angajare, + MedicalCheckupType.periodic, + MedicalCheckupType.la_reluarea_activitatii, + ] as MedicalCheckupType[]).includes(checkup.tip); + + if (updateProfile) { + await this.prisma.employeeMedicalProfile.updateMany({ + where: { employeeId: checkup.employeeId }, + data: { dataUltimControlMedical: new Date(dto.dataEfectuata) }, + }); + } + + // Generate completed Anexa 6 if risk card is available + const profile = existing.employee.medicalProfile; + if (profile?.workplaceRiskCard) { + const anex6 = await this.docs.generateAnex6Completed( + { + id: existing.employee.id, + idnp: existing.employee.idnp, + nume: existing.employee.nume, + prenume: existing.employee.prenume, + dataNasterii: existing.employee.dataNasterii.toISOString(), + ocupatieCorm: profile.ocupatieCorm, + expusRadiatiiIonizante: profile.expusRadiatiiIonizante, + departmentName: existing.employee.contracts[0]?.department.name, + }, + { + id: profile.workplaceRiskCard.id, + name: profile.workplaceRiskCard.name, + riskFactors: profile.workplaceRiskCard.riskFactors as Record<string, string[]>, + filiala: profile.workplaceRiskCard.filiala, + adresaFiliala: profile.workplaceRiskCard.adresaFiliala, + telefonFiliala: profile.workplaceRiskCard.telefonFiliala, + caemPrimeleDouaCifre: profile.workplaceRiskCard.caemPrimeleDouaCifre, + cormSubgrupaMajora: profile.workplaceRiskCard.cormSubgrupaMajora, + directiaSectiaSectorul: profile.workplaceRiskCard.directiaSectiaSectorul, + numarulLoculuiDeMunca: profile.workplaceRiskCard.numarulLoculuiDeMunca, + caemDiviziune: profile.workplaceRiskCard.caemDiviziune, + clasaConditiilorDeMunca: profile.workplaceRiskCard.clasaConditiilorDeMunca, + }, + checkup.tip, + dto.verdict, + dto.recomandari, + dto.dataEfectuata, + dto.valabilPanaLa, + dto.semnatDe, + id, + ); + + // Append generated Anexa 6 to existing documents + const existingDocs = (existing.documenteGenerate as { name: string; url: string; type: string }[] | null) ?? []; + await this.prisma.medicalCheckup.update({ + where: { id }, + data: { documenteGenerate: [...existingDocs, anex6] }, + }); + } + + await this.audit.logChange({ userId, userRole: role, action: 'UPDATE', entity: 'MedicalCheckup', entityId: id }); + return checkup; + } + + async deleteDocument(checkupId: string, docName: string, userId: string, role: string): Promise<void> { + const checkup = await this.prisma.medicalCheckup.findUnique({ where: { id: checkupId } }); + if (!checkup) throw new NotFoundException(); + + const docs = (checkup.documenteGenerate as { name: string; url: string; type: string }[] | null) ?? []; + const target = docs.find((d) => d.name === docName); + if (!target) throw new NotFoundException('Document not found'); + + // Delete from MinIO — extract key from s3://bucket/key + const key = target.url.replace(/^s3:\/\/[^/]+\//, ''); + try { await this.storage.remove(key); } catch { /* ignore if already gone */ } + + const updated = docs.filter((d) => d.name !== docName); + await this.prisma.medicalCheckup.update({ + where: { id: checkupId }, + data: { documenteGenerate: updated }, + }); + await this.audit.logChange({ userId, userRole: role, action: 'DELETE', entity: 'MedicalDocument', entityId: checkupId }); + } + + async remove(checkupId: string, userId: string, role: string): Promise<void> { + const checkup = await this.prisma.medicalCheckup.findUnique({ where: { id: checkupId } }); + if (!checkup) throw new NotFoundException(); + + const docs = (checkup.documenteGenerate as { name: string; url: string; type: string }[] | null) ?? []; + await Promise.all(docs.map(async (d) => { + const key = d.url.replace(/^s3:\/\/[^/]+\//, ''); + try { await this.storage.remove(key); } catch { /* ignore */ } + })); + + await this.prisma.medicalCheckup.delete({ where: { id: checkupId } }); + await this.audit.logChange({ userId, userRole: role, action: 'DELETE', entity: 'MedicalCheckup', entityId: checkupId }); + } + + async deleteAllDocuments(checkupId: string, userId: string, role: string): Promise<void> { + const checkup = await this.prisma.medicalCheckup.findUnique({ where: { id: checkupId } }); + if (!checkup) throw new NotFoundException(); + + const docs = (checkup.documenteGenerate as { name: string; url: string; type: string }[] | null) ?? []; + if (!docs.length) return; + + await Promise.all(docs.map(async (d) => { + const key = d.url.replace(/^s3:\/\/[^/]+\//, ''); + try { await this.storage.remove(key); } catch { /* ignore if already gone */ } + })); + + await this.prisma.medicalCheckup.update({ + where: { id: checkupId }, + data: { documenteGenerate: [] }, + }); + await this.audit.logChange({ userId, userRole: role, action: 'DELETE', entity: 'MedicalDocumentBatch', entityId: checkupId }); + } + + // Pending checkups for medic_familie inbox + findPendingForMedic() { + return this.prisma.medicalCheckup.findMany({ + where: { verdict: null }, + orderBy: { dataPlanificata: 'asc' }, + include: { + employee: { + select: { + id: true, idnp: true, nume: true, prenume: true, sex: true, dataNasterii: true, + medicalProfile: { include: { workplaceRiskCard: { select: { name: true } } } }, + }, + }, + }, + }); + } +} diff --git a/apps/api/src/modules/medical/services/document-generator.service.ts b/apps/api/src/modules/medical/services/document-generator.service.ts new file mode 100644 index 0000000..d99e305 --- /dev/null +++ b/apps/api/src/modules/medical/services/document-generator.service.ts @@ -0,0 +1,627 @@ +import { Injectable } from '@nestjs/common'; +import { Document, Packer } from 'docx'; +import { AnexaType } from '@prisma/client'; +import { PrismaService } from '../../../common/prisma/prisma.service'; +import { StorageService } from './storage.service'; +import { DocxTemplateService } from './docx-template.service'; +import { tiptapToDocx, TemplateVars } from './tiptap-to-docx'; + +export type GeneratedDoc = { name: string; url: string; type: string }; +export type DocumentContext = { + telefon?: string; + fax?: string; + email?: string; + solicitant?: string; + functia?: string; +}; + +const COMPANY = 'Medpark International Hospital'; +const COMPANY_IDNO = '1003600035476'; +const COMPANY_ADDR = 'str. Nicolae Testemițanu 29, Chișinău, MD-2025'; + +const markCb = (b: unknown) => (b ? '☑' : '☐'); + +// evaluareDetalii (cheie internă) → placeholder checkbox din șablonul .docx (vezi templates/docx/README.md) +const CB_MAP: Record<string, string> = { + echipa: 'cbEchipa', schimbNoapte: 'cbSchimbNoapte', pauzeOrganizate: 'cbPauze', + riscInfectare: 'cbInfectare', riscElectrocutare: 'cbElectrocutare', riscTensiuneInalta: 'cbTensiuneInalta', + riscInecare: 'cbInecare', riscAsfixiere: 'cbAsfixiere', riscStrivire: 'cbStrivire', riscTaiere: 'cbTaiere', + riscIntepare: 'cbIntepare', riscLovire: 'cbLovire', riscMuscatura: 'cbMuscatura', riscMicrotraumatisme: 'cbMicrotraumatisme', + conduceMasina: 'cbConduceMasina', conduceUtilajeIntrauzinal: 'cbUtilajeIntrauzinal', + suprafataVerticala: 'cbSuprafVerticala', suprafataOrizontala: 'cbSuprafOrizontala', suprafataOblica: 'cbSuprafOblica', + muncaIzolare: 'cbMuncaIzolare', muncaInaltime: 'cbMuncaInaltime', muncaInMiscare: 'cbMuncaMiscare', + pozitieOrtostatica: 'cbPozitieOrtostatica', pozitieAsezat: 'cbPozitieAsezat', pozitieAplecata: 'cbPozitieAplecata', + pozitieMixta: 'cbPozitieMixta', pozitieFortata: 'cbPozitieFortata', + coloanaCervicala: 'cbColoanaCervicala', coloanaToracala: 'cbColoanaToracala', coloanaLombara: 'cbColoanaLombara', + manipulareRidicare: 'cbManipRidicare', manipulareCoborare: 'cbManipCoborare', manipulareImpingere: 'cbManipImpingere', + manipulareTragere: 'cbManipTragere', manipularePurtare: 'cbManipPurtare', manipulareDeplasare: 'cbManipDeplasare', + suprasolicitariVizuale: 'cbVizuale', suprasolicitariAuditive: 'cbAuditive', suprasolicitariNeuropsihice: 'cbNeuropsihice', + microclimatInterior: 'cbMicroclimatInterior', microclimatExterior: 'cbMicroclimatExterior', + radiatiiCaloriceRece: 'cbCaloriceRece', radiatiiCaloriceCalda: 'cbCaloriceCalda', + iluminatSuficient: 'cbIluminatSuficient', iluminatInsuficient: 'cbIluminatInsuficient', iluminatNatural: 'cbIluminatNatural', + iluminatArtificial: 'cbIluminatArtificial', iluminatMixt: 'cbIluminatMixt', + lucruMonitor: 'cbLucruMonitor', platformeDigitale: 'cbPlatformeDigitale', deplasari: 'cbDeplasari', +}; +const TEXT_MAP: Record<string, string> = { + oreZi: 'oreZi', schimburi: 'schimburi', conduceMasinaCategorie: 'categorieConducere', + spatiuL: 'spatiuL', spatiul: 'spatiul', spatiuH: 'spatiuH', greutateMaxima: 'greutateMaxima', + operatiuni: 'operatiuni', deplasariDescriere: 'deplasariDescriere', alteRiscuri: 'alteRiscuri', +}; +const ANEXE_MAP: Record<string, string> = { + vestiar: 'cbVestiar', chiuveta: 'cbChiuveta', wc: 'cbWc', dus: 'cbDus', salaMese: 'cbSalaMese', recreere: 'cbRecreere', +}; +const TIP_TO_KEY: Record<string, string> = { + AGENT_CHIMIC: 'chimici', PULBERI: 'pulberi', AGENT_BIOLOGIC: 'biologici', + ZGOMOT: 'zgomot', VIBRATII: 'vibratii', CAMP_ELECTROMAGNETIC: 'campEM', RADIATII_OPTICE: 'optice', +}; + +interface EmployeeForDoc { + id: string; + idnp: string; + nume: string; + prenume: string; + dataNasterii?: string; + ocupatieCorm?: string | null; + expusRadiatiiIonizante: boolean; + dataIntrarii?: string | null; + expunereAnterioaraPerioda?: string | null; + expunereAnterioaraAni?: number | null; + dozaCumulataExternaMsv?: string | null; + dozaCumulataInternaMsv?: string | null; + departmentName?: string; + overexposures?: { fel: string; tipExpunere?: string | null; data?: string | null; dozaMsv?: string | number | null }[]; +} + +interface RiskExposureData { + tip: string; + denumire: string; + cas?: string | null; + einecs?: string | null; + clasificare?: string | null; + zonaAfectata?: string | null; + timpExpunere?: string | null; + vep?: string | null; + vlep?: string | null; + caracteristici?: string | null; +} + +interface RiskCardData { + id: string; + name: string; + riskFactors?: unknown; + // Antet Anexa 4 + filiala?: string | null; + adresaFiliala?: string | null; + telefonFiliala?: string | null; + caemPrimeleDouaCifre?: string | null; + cormSubgrupaMajora?: string | null; + directiaSectiaSectorul?: string | null; + numarulLoculuiDeMunca?: string | null; + caemDiviziune?: string | null; + clasaConditiilorDeMunca?: string | null; + numarLucratoriPosibili?: number | null; + tipFisa?: string | null; // STANDARD | DISTANTA_DIGITAL + // Bloc descriptiv + subsol + evaluareDetalii?: Record<string, unknown> | null; + anexeIgienicoSanitare?: Record<string, unknown> | null; + mijloaceProtectieColectiva?: string | null; + mijloaceProtectieIndividuala?: string | null; + echipamentLucru?: string | null; + observatii?: string | null; + // Radiații ionizante (per loc de muncă) + radiatiiIonizante?: boolean | null; + radiatiiGrupa?: string | null; + radiatiiAparatura?: string | null; + radiatiiSurse?: string | null; + radiatiiTipExpunere?: string | null; + radiatiiMasuriProtectie?: string | null; + // Tabele factoriale + exposures?: RiskExposureData[]; +} + +const TIP_LABELS: Record<string, string> = { + la_angajare: 'Examen medical la angajarea în muncă', + periodic: 'Examen medical periodic', + la_reluarea_activitatii: 'Examen medical la reluarea activității', + la_incetarea_expunerii: 'Examen medical la încetarea expunerii profesionale', + suplimentar: 'Suplimentar (la solicitare)', +}; + +function fmtDateRo(s: string | Date | null | undefined): string { + if (!s) return '—'; + const d = s instanceof Date ? s : new Date(s); + return `${String(d.getDate()).padStart(2, '0')}.${String(d.getMonth() + 1).padStart(2, '0')}.${d.getFullYear()}`; +} + +// ─── Service ────────────────────────────────────────────────────────────────── + +@Injectable() +export class DocumentGeneratorService { + constructor( + private readonly storage: StorageService, + private readonly prisma: PrismaService, + private readonly docx: DocxTemplateService, + ) {} + + private async packBuffer(buffer: Buffer, key: string, name: string): Promise<GeneratedDoc> { + const url = await this.storage.upload( + `${key}.docx`, + buffer, + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + ); + return { name: `${name}.docx`, url, type: 'docx' }; + } + + private async pack(doc: Document, key: string, name: string): Promise<GeneratedDoc> { + return this.packBuffer(await Packer.toBuffer(doc), key, name); + } + + private async loadTemplate(type: AnexaType) { + const template = await this.prisma.anexaTemplate.findUnique({ where: { type } }); + if (!template) throw new Error(`Șablonul ${type} nu a fost seeded. Rulați pnpm db:seed.`); + return template.contentJson as { type: string; content: unknown[] }; + } + + /** + * Build a template-vars map for a single employee within an Anexa context. + * Group-level fields (riskCard, tipExamen, departmentName, row index) are + * injected via the optional `ctx` parameter so the same helper works for + * group documents (Anexa 3/4/4B) and per-employee Anexa 6. + */ + private buildVars( + employee: EmployeeForDoc, + ctx?: { + riskCard?: RiskCardData; + tipExamen?: string; + departmentName?: string; + rowIndex?: number; + verdict?: string; + recomandari?: string; + }, + ): TemplateVars { + const dob = employee.dataNasterii ? new Date(employee.dataNasterii) : null; + const externa = employee.dozaCumulataExternaMsv; + const interna = employee.dozaCumulataInternaMsv; + const totala = externa != null && interna != null + ? (Number(externa) + Number(interna)).toFixed(4) + : '—'; + + const verdictKey = ctx?.verdict ? this.matchVerdictKey(ctx.verdict) : null; + const cb = (key: string) => (verdictKey === key ? '☑' : '☐'); + + return { + // Company + 'company.name': COMPANY, + 'company.idno': COMPANY_IDNO, + 'company.address': COMPANY_ADDR, + + // Document meta + 'document.date': fmtDateRo(new Date()), + 'document.number': '001', + + // Employee + 'employee.lastName': employee.nume, + 'employee.firstName': employee.prenume, + 'employee.fullName': `${employee.nume} ${employee.prenume}`, + 'employee.idnp': employee.idnp, + 'employee.birthYear': dob ? String(dob.getFullYear()) : '—', + 'employee.birthDate': fmtDateRo(employee.dataNasterii), + 'employee.occupation': employee.ocupatieCorm ?? '—', + 'employee.department': employee.departmentName ?? ctx?.departmentName ?? '—', + + // Group / context + 'tipExamen': ctx?.tipExamen ?? '—', + 'riskCard.name': ctx?.riskCard?.name ?? '—', + 'department.name': ctx?.departmentName ?? employee.departmentName ?? '—', + + // Row (used inside table loops in seed templates) + 'row.index': String(ctx?.rowIndex ?? 1), + 'row.seatNumber': String(ctx?.rowIndex ?? 1), + 'row.employeeName': `${employee.prenume} ${employee.nume}`, + 'row.idnp': employee.idnp, + 'row.birthYear': dob ? String(dob.getFullYear()) : '—', + 'row.occupation': employee.ocupatieCorm ?? '—', + 'row.tipExamen': ctx?.tipExamen ?? '—', + 'row.riskFactors': ctx?.riskCard?.name ?? '—', + + // Radiation + 'radiation.exposed': employee.expusRadiatiiIonizante ? 'DA' : 'Nu', + 'radiation.entryDate': fmtDateRo(employee.dataIntrarii), + 'radiation.priorPeriod': employee.expunereAnterioaraPerioda ?? '—', + 'radiation.priorYears': employee.expunereAnterioaraAni != null ? String(employee.expunereAnterioaraAni) : '—', + 'radiation.externalMsv': externa != null ? Number(externa).toFixed(4) : '0.0000', + 'radiation.internalMsv': interna != null ? Number(interna).toFixed(4) : '0.0000', + 'radiation.totalMsv': totala, + + // Verdict (Anexa 6) + 'verdict.label': ctx?.verdict ?? '—', + 'verdict.recomandari': ctx?.recomandari ?? '—', + 'verdict.checkbox.apt': cb('apt'), + 'verdict.checkbox.apt_perioada_adaptare': cb('apt_perioada_adaptare'), + 'verdict.checkbox.apt_conditionat': cb('apt_conditionat'), + 'verdict.checkbox.inapt_temporar': cb('inapt_temporar'), + 'verdict.checkbox.inapt': cb('inapt'), + }; + } + + /** Normalize verdict (either raw key or human label) back to the canonical key. */ + private matchVerdictKey(verdict: string): string | null { + const labelToKey: Record<string, string> = { + apt: 'apt', + 'Apt': 'apt', + apt_perioada_adaptare: 'apt_perioada_adaptare', + 'Apt în perioada de adaptare': 'apt_perioada_adaptare', + apt_conditionat: 'apt_conditionat', + 'Apt condiționat': 'apt_conditionat', + inapt_temporar: 'inapt_temporar', + 'Inapt temporar': 'inapt_temporar', + inapt: 'inapt', + 'Inapt': 'inapt', + }; + return labelToKey[verdict] ?? null; + } + + private async renderAnexa( + type: AnexaType, + employee: EmployeeForDoc, + ctx?: Parameters<DocumentGeneratorService['buildVars']>[1], + rows?: Record<string, string>[], + extra?: { rowSets?: Record<string, Record<string, string>[]>; extraVars?: TemplateVars }, + ): Promise<Document> { + const template = await this.loadTemplate(type); + const vars = { ...this.buildVars(employee, ctx), ...(extra?.extraVars ?? {}) }; + const children = tiptapToDocx(template as never, vars, { rows, rowSets: extra?.rowSets }); + return new Document({ sections: [{ children }] }); + } + + /** + * Builds Anexa 4 ("Fișa de evaluare a riscurilor profesionale") variables and + * factor-table row-sets from a workplace risk card. The card is per-workplace, + * so Anexa 4 carries NO employee list (that belongs to Anexa 3). + */ + private buildAnexa4(card: RiskCardData): { vars: TemplateVars; rowSets: Record<string, Record<string, string>[]> } { + const mark = (b: unknown) => (b ? '☑' : '☐'); + const vars: TemplateVars = { + 'a4.unitatea': COMPANY, + 'a4.adresa': COMPANY_ADDR, + 'a4.filiala': card.filiala ?? '—', + 'a4.adresaFiliala': card.adresaFiliala ?? '—', + 'a4.caem2': card.caemPrimeleDouaCifre ?? '—', + 'a4.cormSubgrupa': card.cormSubgrupaMajora ?? '—', + 'a4.directiaSectia': card.directiaSectiaSectorul ?? '—', + 'a4.numarLoc': card.numarulLoculuiDeMunca ?? '—', + 'a4.caemDiviziune': card.caemDiviziune ?? '—', + 'a4.numarLucratori': card.numarLucratoriPosibili != null ? String(card.numarLucratoriPosibili) : '—', + 'a4.clasa': card.clasaConditiilorDeMunca ?? '—', + 'a4.protectieColectiva': card.mijloaceProtectieColectiva ?? '—', + 'a4.protectieIndividuala': card.mijloaceProtectieIndividuala ?? '—', + 'a4.echipament': card.echipamentLucru ?? '—', + 'a4.observatii': card.observatii ?? '—', + 'a4.rad.grupa': card.radiatiiGrupa ?? '—', + 'a4.rad.aparatura': card.radiatiiAparatura ?? '—', + 'a4.rad.surse': card.radiatiiSurse ?? '—', + 'a4.rad.tipExpunere': card.radiatiiTipExpunere ?? '—', + 'a4.rad.masuriProtectie': card.radiatiiMasuriProtectie ?? '—', + 'a4.cb.radiatii_da': mark(card.radiatiiIonizante), + 'a4.cb.radiatii_nu': mark(!card.radiatiiIonizante), + }; + + // Descriptive block: booleans → checkbox chips, other values → text chips. + for (const [k, v] of Object.entries(card.evaluareDetalii ?? {})) { + if (typeof v === 'boolean') vars[`a4.cb.${k}`] = mark(v); + else if (v != null) vars[`a4.val.${k}`] = String(v); + } + for (const [k, v] of Object.entries(card.anexeIgienicoSanitare ?? {})) { + vars[`a4.cb.anexe.${k}`] = mark(v); + } + + // Factor tables grouped by exposure type + da/nu flags. + const TIP_TO_KEY: Record<string, string> = { + AGENT_CHIMIC: 'chimici', PULBERI: 'pulberi', AGENT_BIOLOGIC: 'biologici', + ZGOMOT: 'zgomot', VIBRATII: 'vibratii', CAMP_ELECTROMAGNETIC: 'campEM', RADIATII_OPTICE: 'optice', + }; + const rowSets: Record<string, Record<string, string>[]> = {}; + for (const key of Object.values(TIP_TO_KEY)) rowSets[key] = []; + for (const e of card.exposures ?? []) { + const key = TIP_TO_KEY[e.tip]; + if (!key) continue; + rowSets[key].push({ + 'row.denumire': e.denumire ?? '—', + 'row.cas': e.cas ?? '—', + 'row.einecs': e.einecs ?? '—', + 'row.clasificare': e.clasificare ?? '—', + 'row.zona': e.zonaAfectata ?? '—', + 'row.timp': e.timpExpunere ?? '—', + 'row.vep': e.vep ?? '—', + 'row.vlep': e.vlep ?? '—', + 'row.caracteristici': e.caracteristici ?? '—', + }); + } + for (const [key, rows] of Object.entries(rowSets)) { + vars[`a4.cb.${key}_da`] = mark(rows.length > 0); + vars[`a4.cb.${key}_nu`] = mark(rows.length === 0); + } + + return { vars, rowSets }; + } + + // ─── docxtemplater data builders (placeholder-uri din templates/docx/README.md) ─── + + private dataAnexa3( + card: RiskCardData, + employees: EmployeeForDoc[], + tipLabel: string, + documentContext?: DocumentContext, + ): Record<string, unknown> { + const factorRisc = (card.exposures ?? []).map((e) => e.denumire).join(', '); + return { + unitatea: COMPANY, idno: COMPANY_IDNO, adresa: COMPANY_ADDR, + telefon: documentContext?.telefon ?? '', fax: documentContext?.fax ?? '', email: documentContext?.email ?? '', + filiala: card.filiala ?? '', adresaFiliala: card.adresaFiliala ?? '', telefonFiliala: card.telefonFiliala ?? '', + dataCompletarii: fmtDateRo(new Date()), solicitant: documentContext?.solicitant ?? '', functia: documentContext?.functia ?? '', + angajati: employees.map((e, i) => ({ + nr: String(i + 1), + numePrenume: `${e.nume} ${e.prenume}`, + anNastere: e.dataNasterii ? String(new Date(e.dataNasterii).getFullYear()) : '', + idnp: e.idnp, + tipExamen: tipLabel, + ocupatieCorm: e.ocupatieCorm ?? '', + caem: card.caemDiviziune ?? '', + numarLoc: card.numarulLoculuiDeMunca ?? '', + factorRisc, + })), + }; + } + + private dataAnexa4(card: RiskCardData, documentContext?: DocumentContext): Record<string, unknown> { + const data: Record<string, unknown> = { + unitatea: COMPANY, idno: COMPANY_IDNO, adresa: COMPANY_ADDR, + telefon: documentContext?.telefon ?? '', fax: documentContext?.fax ?? '', email: documentContext?.email ?? '', + filiala: card.filiala ?? '', adresaFiliala: card.adresaFiliala ?? '', telefonFiliala: card.telefonFiliala ?? '', + caem2: card.caemPrimeleDouaCifre ?? '', + cormSubgrupa: card.cormSubgrupaMajora ?? '', directiaSectia: card.directiaSectiaSectorul ?? '', + numarLoc: card.numarulLoculuiDeMunca ?? '', caemDiviziune: card.caemDiviziune ?? '', + numarLucratori: card.numarLucratoriPosibili != null ? String(card.numarLucratoriPosibili) : '', + clasa: card.clasaConditiilorDeMunca ?? '', + protectieColectiva: card.mijloaceProtectieColectiva ?? '', protectieIndividuala: card.mijloaceProtectieIndividuala ?? '', + echipament: card.echipamentLucru ?? '', observatii: card.observatii ?? '', + radGrupa: card.radiatiiGrupa ?? '', radSurse: card.radiatiiSurse ?? '', radTipExpunere: card.radiatiiTipExpunere ?? '', + radAparatura: card.radiatiiAparatura ?? '', radMasuri: card.radiatiiMasuriProtectie ?? '', + cbRadiatii: markCb(card.radiatiiIonizante), + cbRadiatiiNu: markCb(!card.radiatiiIonizante), + // text fields default + oreZi: '', schimburi: '', categorieConducere: '', spatiuL: '', spatiul: '', spatiuH: '', greutateMaxima: '', + operatiuni: '', deplasariDescriere: '', alteRiscuri: '', + dataCompletarii: fmtDateRo(new Date()), + }; + for (const cbName of Object.values(CB_MAP)) data[cbName] = '☐'; + for (const cbName of Object.values(ANEXE_MAP)) data[cbName] = '☐'; + for (const [k, v] of Object.entries((card.evaluareDetalii ?? {}) as Record<string, unknown>)) { + if (CB_MAP[k]) data[CB_MAP[k]] = markCb(v); + else if (TEXT_MAP[k]) data[TEXT_MAP[k]] = v != null ? String(v) : ''; + } + for (const [k, v] of Object.entries((card.anexeIgienicoSanitare ?? {}) as Record<string, unknown>)) { + if (ANEXE_MAP[k]) data[ANEXE_MAP[k]] = markCb(v); + } + const loops: Record<string, unknown[]> = { chimici: [], pulberi: [], biologici: [], zgomot: [], vibratii: [], campEM: [], optice: [] }; + for (const e of card.exposures ?? []) { + const key = TIP_TO_KEY[e.tip]; + if (!key) continue; + loops[key].push({ + denumire: e.denumire ?? '', cas: e.cas ?? '', einecs: e.einecs ?? '', clasificare: e.clasificare ?? '', + note: e.caracteristici ?? '', zona: e.zonaAfectata ?? '', timp: e.timpExpunere ?? '', + vep: e.vep ?? '', vlep: e.vlep ?? '', caracteristici: e.caracteristici ?? '', + }); + } + Object.assign(data, loops); + const groupFlags: Record<string, string> = { + chimici: 'Chimici', + pulberi: 'Pulberi', + biologici: 'Biologici', + zgomot: 'Zgomot', + vibratii: 'Vibratii', + campEM: 'CampEM', + optice: 'Optice', + }; + for (const [key, suffix] of Object.entries(groupFlags)) { + const rows = loops[key] ?? []; + data[`cb${suffix}`] = markCb(rows.length > 0); + data[`cb${suffix}Nu`] = markCb(rows.length === 0); + } + return data; + } + + private dataAnexa4B(emp: EmployeeForDoc, card: RiskCardData, documentContext?: DocumentContext): Record<string, unknown> { + const ext = emp.dozaCumulataExternaMsv; + const int = emp.dozaCumulataInternaMsv; + const mapOv = (o: NonNullable<EmployeeForDoc['overexposures']>[number]) => ({ + tipExpunere: o.tipExpunere ?? '', + data: o.data ? fmtDateRo(o.data) : '', + doza: o.dozaMsv != null ? String(o.dozaMsv) : '', + }); + const ov = emp.overexposures ?? []; + return { + unitatea: COMPANY, idno: COMPANY_IDNO, adresa: COMPANY_ADDR, + telefon: documentContext?.telefon ?? '', fax: documentContext?.fax ?? '', email: documentContext?.email ?? '', + filiala: card.filiala ?? '', adresaFiliala: card.adresaFiliala ?? '', telefonFiliala: card.telefonFiliala ?? '', + caem2: card.caemPrimeleDouaCifre ?? '', + cormSubgrupa: card.cormSubgrupaMajora ?? '', directiaSectia: card.directiaSectiaSectorul ?? '', + numarLoc: card.numarulLoculuiDeMunca ?? '', caemDiviziune: card.caemDiviziune ?? '', + numePrenume: `${emp.nume} ${emp.prenume}`, idnp: emp.idnp, + cbRadiatii: markCb(emp.expusRadiatiiIonizante), + dataIntrarii: emp.dataIntrarii ? fmtDateRo(emp.dataIntrarii) : '', + expAnterioaraPerioada: emp.expunereAnterioaraPerioda ?? '', + expAnterioaraAni: emp.expunereAnterioaraAni != null ? String(emp.expunereAnterioaraAni) : '', + dozaExterna: ext != null ? Number(ext).toFixed(4) : '', + dozaInterna: int != null ? Number(int).toFixed(4) : '', + dozaTotala: ext != null && int != null ? (Number(ext) + Number(int)).toFixed(4) : '', + supraexpExceptionale: ov.filter((o) => o.fel === 'EXCEPTIONALA').map(mapOv), + supraexpAccidentale: ov.filter((o) => o.fel === 'ACCIDENTALA').map(mapOv), + dataCompletarii: fmtDateRo(new Date()), + }; + } + + private dataAnexa6( + emp: EmployeeForDoc, + tipLabel: string, + options?: { + riskCard?: RiskCardData; + verdict?: string; + recomandari?: string; + dataCompletarii?: string | Date; + valabilPanaLa?: string | Date; + semnatDe?: string; + }, + ): Record<string, unknown> { + const key = options?.verdict ? this.matchVerdictKey(options.verdict) : null; + const cbv = (k: string) => (key === k ? '☑' : '☐'); + return { + unitatea: COMPANY, adresa: COMPANY_ADDR, + numePrenume: `${emp.nume} ${emp.prenume}`, idnp: emp.idnp, + anNastere: emp.dataNasterii ? String(new Date(emp.dataNasterii).getFullYear()) : '', + ocupatieCorm: emp.ocupatieCorm ?? '', departament: emp.departmentName ?? '', + caemDiviziune: options?.riskCard?.caemDiviziune ?? '', numarLoc: options?.riskCard?.numarulLoculuiDeMunca ?? '', + factorRisc: options?.riskCard?.name ?? '', + tipExamen: tipLabel, dataCompletarii: fmtDateRo(options?.dataCompletarii ?? new Date()), + cbApt: cbv('apt'), cbAptAdaptare: cbv('apt_perioada_adaptare'), cbAptConditionat: cbv('apt_conditionat'), + cbInaptTemporar: cbv('inapt_temporar'), cbInapt: cbv('inapt'), + recomandari: options?.recomandari ?? '', valabilPanaLa: options?.valabilPanaLa ? fmtDateRo(options.valabilPanaLa) : '', + semnatDe: options?.semnatDe ?? '', + }; + } + + private buildRowVars(employees: EmployeeForDoc[], tipLabel: string): Record<string, string>[] { + return employees.map((emp, idx) => { + const dob = emp.dataNasterii ? new Date(emp.dataNasterii) : null; + return { + 'row.index': String(idx + 1), + 'row.seatNumber': String(idx + 1), + 'row.employeeName': `${emp.prenume} ${emp.nume}`, + 'row.idnp': emp.idnp, + 'row.birthYear': dob ? String(dob.getFullYear()) : '—', + 'row.birthDate': fmtDateRo(emp.dataNasterii), + 'row.occupation': emp.ocupatieCorm ?? '—', + 'row.tipExamen': tipLabel, + 'row.department': emp.departmentName ?? '—', + 'row.radiationExposed': emp.expusRadiatiiIonizante ? 'DA' : 'Nu', + 'row.entryDate': fmtDateRo(emp.dataIntrarii), + 'row.priorPeriod': emp.expunereAnterioaraPerioda ?? '—', + 'row.priorYears': emp.expunereAnterioaraAni != null ? String(emp.expunereAnterioaraAni) : '—', + 'row.externalMsv': emp.dozaCumulataExternaMsv != null ? Number(emp.dozaCumulataExternaMsv).toFixed(4) : '0.0000', + 'row.internalMsv': emp.dozaCumulataInternaMsv != null ? Number(emp.dozaCumulataInternaMsv).toFixed(4) : '0.0000', + 'row.totalMsv': emp.dozaCumulataExternaMsv != null && emp.dozaCumulataInternaMsv != null + ? (Number(emp.dozaCumulataExternaMsv) + Number(emp.dozaCumulataInternaMsv)).toFixed(4) + : '—', + }; + }); + } + + async generateForGroup( + riskCard: RiskCardData, + employees: EmployeeForDoc[], + checkupBatchId: string, + tipExamen: string, + departmentName?: string, + documentContext?: DocumentContext, + ): Promise<{ groupDocs: GeneratedDoc[]; perEmployee: Record<string, GeneratedDoc> }> { + const groupDocs: GeneratedDoc[] = []; + const base = `medical/${checkupBatchId}/${riskCard.id}`; + const tipLabel = TIP_LABELS[tipExamen] ?? tipExamen; + + const primary = employees[0]; + const ctx = { + riskCard, + tipExamen: tipLabel, + departmentName, + rowIndex: 1, + }; + const allRows = this.buildRowVars(employees, tipLabel); + + // 1. Anexa 3 — Fișa de solicitare (group) + const buf3 = this.docx.has('ANEXA_3') + ? this.docx.render('ANEXA_3', this.dataAnexa3(riskCard, employees, tipLabel, documentContext)) + : await Packer.toBuffer(await this.renderAnexa('ANEXA_3', primary, ctx, allRows)); + groupDocs.push(await this.packBuffer(buf3, `${base}/anex3_fisa_solicitare`, 'Anexa_3_Fisa_Solicitare')); + + // 2. Anexa 4 (sau 4A pentru muncă la distanță) — per loc de muncă, fără listă de angajați + const a4type: AnexaType = riskCard.tipFisa === 'DISTANTA_DIGITAL' ? 'ANEXA_4A' : 'ANEXA_4'; + let buf4: Buffer; + if (this.docx.has(a4type)) { + buf4 = this.docx.render(a4type, this.dataAnexa4(riskCard, documentContext)); + } else { + const a4 = this.buildAnexa4(riskCard); + buf4 = await Packer.toBuffer(await this.renderAnexa('ANEXA_4', primary, ctx, undefined, { rowSets: a4.rowSets, extraVars: a4.vars })); + } + const a4name = a4type === 'ANEXA_4A' ? 'Anexa_4A_Fisa_Evaluare' : 'Anexa_4_Fisa_Evaluare'; + groupDocs.push(await this.packBuffer(buf4, `${base}/anex4_fisa_evaluare`, a4name)); + + // 3. Anexa 4B — supliment radiații (per lucrător expus, conform regulamentului) + const radiationEmployees = employees.filter((e) => e.expusRadiatiiIonizante); + if (radiationEmployees.length > 0) { + if (this.docx.has('ANEXA_4B')) { + for (const emp of radiationEmployees) { + const buf = this.docx.render('ANEXA_4B', this.dataAnexa4B(emp, riskCard, documentContext)); + groupDocs.push(await this.packBuffer(buf, `${base}/anex4b_${emp.idnp}`, `Anexa_4B_${emp.nume}_${emp.prenume}`)); + } + } else { + const radiationRows = this.buildRowVars(radiationEmployees, tipLabel); + const anex4BDoc = await this.renderAnexa('ANEXA_4B', radiationEmployees[0], ctx, radiationRows); + groupDocs.push(await this.pack(anex4BDoc, `${base}/anex4b_radiatii`, 'Anexa_4B_Radiatii')); + } + } + + // 4. Anexa 6 — Fișa de aptitudine per employee (blank, to be completed after checkup) + const perEmployee: Record<string, GeneratedDoc> = {}; + for (const emp of employees) { + const buf6 = this.docx.has('ANEXA_6') + ? this.docx.render('ANEXA_6', this.dataAnexa6(emp, tipLabel, { riskCard })) + : await Packer.toBuffer(await this.renderAnexa('ANEXA_6', emp, { riskCard, tipExamen: tipLabel, departmentName, rowIndex: 1 })); + perEmployee[emp.id] = await this.packBuffer(buf6, `${base}/anex6_${emp.idnp}`, `Anexa_6_${emp.nume}_${emp.prenume}`); + } + + return { groupDocs, perEmployee }; + } + + /** Generate Anexa 6 with completed verdict — called after medic_familie completes the checkup */ + async generateAnex6Completed( + employee: EmployeeForDoc, + riskCard: RiskCardData, + tipExamen: string, + verdict: string, + recomandari: string | undefined, + dataEfectuata: string | Date | undefined, + valabilPanaLa: string | Date | undefined, + semnatDe: string | undefined, + checkupId: string, + ): Promise<GeneratedDoc> { + const tipLabel = TIP_LABELS[tipExamen] ?? tipExamen; + const verdictLabels: Record<string, string> = { + apt: 'Apt', + apt_perioada_adaptare: 'Apt în perioada de adaptare', + apt_conditionat: 'Apt condiționat', + inapt_temporar: 'Inapt temporar', + inapt: 'Inapt', + }; + const buf = this.docx.has('ANEXA_6') + ? this.docx.render('ANEXA_6', this.dataAnexa6(employee, tipLabel, { + riskCard, + verdict, + recomandari, + dataCompletarii: dataEfectuata, + valabilPanaLa, + semnatDe, + })) + : await Packer.toBuffer(await this.renderAnexa('ANEXA_6', employee, { + riskCard, + tipExamen: tipLabel, + verdict: verdictLabels[verdict] ?? verdict, + recomandari, + rowIndex: 1, + })); + return this.packBuffer( + buf, + `medical/checkups/${checkupId}/anex6_final`, + `Anexa_6_Final_${employee.nume}_${employee.prenume}`, + ); + } +} diff --git a/apps/api/src/modules/medical/services/docx-template.service.ts b/apps/api/src/modules/medical/services/docx-template.service.ts new file mode 100644 index 0000000..7107ec2 --- /dev/null +++ b/apps/api/src/modules/medical/services/docx-template.service.ts @@ -0,0 +1,41 @@ +import { Injectable } from '@nestjs/common'; +import { existsSync, readFileSync } from 'node:fs'; +import { join } from 'node:path'; +import PizZip from 'pizzip'; +import Docxtemplater from 'docxtemplater'; +import { AnexaType } from '@prisma/client'; + +const TEMPLATE_DIR = process.env.DOCX_TEMPLATE_DIR ?? join(process.cwd(), 'templates', 'docx'); + +const FILE_BY_TYPE: Record<AnexaType, string> = { + ANEXA_3: 'anexa-3.docx', + ANEXA_4: 'anexa-4.docx', + ANEXA_4A: 'anexa-4a.docx', + ANEXA_4B: 'anexa-4b.docx', + ANEXA_6: 'anexa-6.docx', +}; + +@Injectable() +export class DocxTemplateService { + private pathFor(type: AnexaType): string { + return join(TEMPLATE_DIR, FILE_BY_TYPE[type]); + } + + /** True if a user-authored .docx template exists for this Anexa. */ + has(type: AnexaType): boolean { + return existsSync(this.pathFor(type)); + } + + /** Render the .docx template with `data` (docxtemplater) and return the buffer. */ + render(type: AnexaType, data: Record<string, unknown>): Buffer { + const content = readFileSync(this.pathFor(type)); + const zip = new PizZip(content); + const doc = new Docxtemplater(zip, { + paragraphLoop: true, + linebreaks: true, + nullGetter: () => '', // câmpurile lipsă → gol (nu aruncă) + }); + doc.render(data); + return doc.getZip().generate({ type: 'nodebuffer', compression: 'DEFLATE' }) as Buffer; + } +} diff --git a/apps/api/src/modules/medical/services/medical-profile.service.ts b/apps/api/src/modules/medical/services/medical-profile.service.ts new file mode 100644 index 0000000..94b62ea --- /dev/null +++ b/apps/api/src/modules/medical/services/medical-profile.service.ts @@ -0,0 +1,93 @@ +import { Injectable, BadRequestException } from '@nestjs/common'; +import { PrismaService } from '../../../common/prisma/prisma.service'; +import { AuditService } from '../../../common/audit/audit.service'; +import { UpsertMedicalProfileDto } from '../dto/medical-profile.dto'; + +@Injectable() +export class MedicalProfileService { + constructor(private readonly prisma: PrismaService, private readonly audit: AuditService) {} + + async findOne(employeeId: string) { + const profile = await this.prisma.employeeMedicalProfile.findUnique({ + where: { employeeId }, + include: { workplaceRiskCard: true, overexposures: { orderBy: { data: 'asc' } } }, + }); + if (!profile) return null; + + // dozaTotalaMsv is computed, not stored + const externa = Number(profile.dozaCumulataExternaMsv ?? 0); + const interna = Number(profile.dozaCumulataInternaMsv ?? 0); + + return { + ...profile, + dozaTotalaMsv: externa + interna, + }; + } + + async upsert(employeeId: string, dto: UpsertMedicalProfileDto, userId: string, role: string) { + if (dto.expusRadiatiiIonizante && !dto.dataIntrarii) { + throw new BadRequestException('Data intrării în mediu cu radiații este obligatorie pentru personalul expus'); + } + + await this.prisma.employee.findUniqueOrThrow({ where: { id: employeeId } }); + + const data = { + ocupatieCorm: dto.ocupatieCorm, + workplaceRiskCardId: dto.workplaceRiskCardId, + dataUltimControlMedical: dto.dataUltimControlMedical ? new Date(dto.dataUltimControlMedical) : undefined, + expusRadiatiiIonizante: dto.expusRadiatiiIonizante, + dataIntrarii: dto.dataIntrarii ? new Date(dto.dataIntrarii) : null, + expunereAnterioaraPerioda: dto.expunereAnterioaraPerioda, + expunereAnterioaraAni: dto.expunereAnterioaraAni, + dozaCumulataExternaMsv: dto.dozaCumulataExternaMsv, + dozaCumulataInternaMsv: dto.dozaCumulataInternaMsv, + }; + + // Supraexpuneri (Anexa 4B): set sent → replace whole set; cleared if not exposed. + const mapOverexposures = () => + (dto.expusRadiatiiIonizante ? dto.overexposures ?? [] : []).map((o) => ({ + fel: o.fel, + tipExpunere: o.tipExpunere, + data: o.data ? new Date(o.data) : null, + dozaMsv: o.dozaMsv, + })); + + const profile = await this.prisma.employeeMedicalProfile.upsert({ + where: { employeeId }, + create: { ...data, employeeId, overexposures: { create: mapOverexposures() } }, + update: { + ...data, + ...(dto.overexposures !== undefined || !dto.expusRadiatiiIonizante + ? { overexposures: { deleteMany: {}, create: mapOverexposures() } } + : {}), + }, + }); + + await this.audit.logChange({ + userId, userRole: role, + action: 'UPDATE', entity: 'EmployeeMedicalProfile', entityId: profile.id, + }); + return profile; + } + + // Returns employees whose last checkup is within 30 days of expiration (12-month cycle) + async findUpcomingExpirations() { + const today = new Date(); + const thirtyDaysFromNow = new Date(today); + thirtyDaysFromNow.setDate(today.getDate() + 30); + + // dataUltimControlMedical + 12 months < today + 30 days → expires soon + const oneYearAgoMinus30 = new Date(thirtyDaysFromNow); + oneYearAgoMinus30.setFullYear(oneYearAgoMinus30.getFullYear() - 1); + + return this.prisma.employeeMedicalProfile.findMany({ + where: { + dataUltimControlMedical: { lte: oneYearAgoMinus30 }, + }, + include: { + employee: { select: { id: true, idnp: true, nume: true, prenume: true, status: true } }, + workplaceRiskCard: { select: { name: true } }, + }, + }); + } +} diff --git a/apps/api/src/modules/medical/services/risk-cards.service.ts b/apps/api/src/modules/medical/services/risk-cards.service.ts new file mode 100644 index 0000000..ee2f3e7 --- /dev/null +++ b/apps/api/src/modules/medical/services/risk-cards.service.ts @@ -0,0 +1,96 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import { Prisma } from '@prisma/client'; +import { PrismaService } from '../../../common/prisma/prisma.service'; +import { AuditService } from '../../../common/audit/audit.service'; +import { CreateRiskCardDto, UpdateRiskCardDto, RiskExposureDto } from '../dto/risk-card.dto'; + +// Maps a validated exposure DTO to the Prisma nested-create shape (drops cardId). +function mapExposure(e: RiskExposureDto): Prisma.WorkplaceRiskExposureCreateWithoutCardInput { + return { + tip: e.tip, + denumire: e.denumire, + cas: e.cas, + einecs: e.einecs, + clasificare: e.clasificare, + zonaAfectata: e.zonaAfectata, + timpExpunere: e.timpExpunere, + vep: e.vep, + vlep: e.vlep, + caracteristici: e.caracteristici, + procesVerbal: e.procesVerbal, + }; +} + +@Injectable() +export class RiskCardsService { + constructor(private readonly prisma: PrismaService, private readonly audit: AuditService) {} + + findAll() { + return this.prisma.workplaceRiskCard.findMany({ + orderBy: { name: 'asc' }, + include: { exposures: true, _count: { select: { profiles: true } } }, + }); + } + + async findOne(id: string) { + const card = await this.prisma.workplaceRiskCard.findUnique({ + where: { id }, + include: { + exposures: true, + profiles: { + include: { + employee: { select: { id: true, idnp: true, nume: true, prenume: true } }, + }, + }, + }, + }); + if (!card) throw new NotFoundException(); + return card; + } + + async create(dto: CreateRiskCardDto, userId: string, role: string) { + const { exposures, riskFactors, evaluareDetalii, anexeIgienicoSanitare, ...scalars } = dto; + const card = await this.prisma.workplaceRiskCard.create({ + data: { + ...scalars, + ...(riskFactors != null ? { riskFactors: riskFactors as Prisma.InputJsonValue } : {}), + ...(evaluareDetalii != null ? { evaluareDetalii: evaluareDetalii as Prisma.InputJsonValue } : {}), + ...(anexeIgienicoSanitare != null ? { anexeIgienicoSanitare: anexeIgienicoSanitare as Prisma.InputJsonValue } : {}), + ...(exposures?.length ? { exposures: { create: exposures.map(mapExposure) } } : {}), + }, + include: { exposures: true }, + }); + await this.audit.logChange({ userId, userRole: role, action: 'CREATE', entity: 'WorkplaceRiskCard', entityId: card.id }); + return card; + } + + async update(id: string, dto: UpdateRiskCardDto, userId: string, role: string) { + const { exposures, riskFactors, evaluareDetalii, anexeIgienicoSanitare, ...scalars } = dto; + + const updated = await this.prisma.$transaction(async (tx) => { + // exposures sent → replace the whole set for this card + if (exposures !== undefined) { + await tx.workplaceRiskExposure.deleteMany({ where: { cardId: id } }); + } + return tx.workplaceRiskCard.update({ + where: { id }, + data: { + ...scalars, + ...(riskFactors != null ? { riskFactors: riskFactors as Prisma.InputJsonValue } : {}), + ...(evaluareDetalii != null ? { evaluareDetalii: evaluareDetalii as Prisma.InputJsonValue } : {}), + ...(anexeIgienicoSanitare != null ? { anexeIgienicoSanitare: anexeIgienicoSanitare as Prisma.InputJsonValue } : {}), + ...(exposures !== undefined ? { exposures: { create: exposures.map(mapExposure) } } : {}), + }, + include: { exposures: true }, + }); + }); + + await this.audit.logChange({ userId, userRole: role, action: 'UPDATE', entity: 'WorkplaceRiskCard', entityId: id }); + return updated; + } + + async remove(id: string, userId: string, role: string) { + await this.prisma.workplaceRiskCard.delete({ where: { id } }); + await this.audit.logChange({ userId, userRole: role, action: 'DELETE', entity: 'WorkplaceRiskCard', entityId: id }); + } +} diff --git a/apps/api/src/modules/medical/services/storage.service.ts b/apps/api/src/modules/medical/services/storage.service.ts new file mode 100644 index 0000000..af7c9b4 --- /dev/null +++ b/apps/api/src/modules/medical/services/storage.service.ts @@ -0,0 +1,45 @@ +import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; +import { Client as MinioClient } from 'minio'; + +@Injectable() +export class StorageService implements OnModuleInit { + private readonly logger = new Logger(StorageService.name); + private client!: MinioClient; + private bucket!: string; + + async onModuleInit() { + this.bucket = process.env.MINIO_BUCKET ?? 'hrm-docs'; + this.client = new MinioClient({ + endPoint: process.env.MINIO_ENDPOINT ?? 'localhost', + port: Number(process.env.MINIO_PORT ?? 9000), + useSSL: false, + accessKey: process.env.MINIO_ACCESS_KEY ?? 'minioadmin', + secretKey: process.env.MINIO_SECRET_KEY ?? 'minioadmin', + }); + + try { + const exists = await this.client.bucketExists(this.bucket); + if (!exists) { + await this.client.makeBucket(this.bucket, 'us-east-1'); + this.logger.log(`Bucket ${this.bucket} created`); + } + } catch (e) { + this.logger.warn(`MinIO not reachable on init: ${(e as Error).message}`); + } + } + + async upload(key: string, buffer: Buffer, contentType: string): Promise<string> { + await this.client.putObject(this.bucket, key, buffer, buffer.length, { + 'Content-Type': contentType, + }); + return `s3://${this.bucket}/${key}`; + } + + presignedUrl(key: string, expirySec = 3600): Promise<string> { + return this.client.presignedGetObject(this.bucket, key, expirySec); + } + + async remove(key: string): Promise<void> { + await this.client.removeObject(this.bucket, key); + } +} diff --git a/apps/api/src/modules/medical/services/tiptap-to-docx.ts b/apps/api/src/modules/medical/services/tiptap-to-docx.ts new file mode 100644 index 0000000..28fa527 --- /dev/null +++ b/apps/api/src/modules/medical/services/tiptap-to-docx.ts @@ -0,0 +1,141 @@ +import { + Paragraph, TextRun, Table, TableRow, TableCell, + HeadingLevel, AlignmentType, WidthType, BorderStyle, + ITableBordersOptions, +} from 'docx'; + +type TiptapMark = { type: string }; +type TiptapNode = { + type: string; + attrs?: Record<string, unknown>; + content?: TiptapNode[]; + text?: string; + marks?: TiptapMark[]; +}; + +export type TemplateVars = Record<string, string>; + +interface ConvertOpts { + rows?: Record<string, string>[]; // tabel repetabil unic (Anexa 3) + rowSets?: Record<string, Record<string, string>[]>; // tabele repetabile numite (Anexa 4) +} + +const THIN_BORDER: ITableBordersOptions = { + top: { style: BorderStyle.SINGLE, size: 1, color: '999999' }, + bottom: { style: BorderStyle.SINGLE, size: 1, color: '999999' }, + left: { style: BorderStyle.SINGLE, size: 1, color: '999999' }, + right: { style: BorderStyle.SINGLE, size: 1, color: '999999' }, +}; + +export function tiptapToDocx( + doc: TiptapNode, + vars: TemplateVars, + opts?: ConvertOpts, +): (Paragraph | Table)[] { + return (doc.content ?? []).flatMap((node) => convertBlock(node, vars, opts)); +} + +function convertBlock(node: TiptapNode, vars: TemplateVars, opts?: ConvertOpts): (Paragraph | Table)[] { + switch (node.type) { + case 'paragraph': + return [new Paragraph({ + alignment: resolveAlign(node.attrs?.textAlign as string | undefined), + children: inlineRuns(node.content ?? [], vars), + })]; + + case 'heading': + return [new Paragraph({ + heading: resolveHeading(node.attrs?.level as number | undefined), + alignment: resolveAlign(node.attrs?.textAlign as string | undefined), + children: inlineRuns(node.content ?? [], vars), + })]; + + case 'bulletList': + case 'orderedList': + return (node.content ?? []).flatMap((item) => + (item.content ?? []).flatMap((p) => convertBlock(p, vars, opts)), + ); + + case 'table': + return [buildTable(node, vars, opts)]; + + default: + return []; + } +} + +function inlineRuns(nodes: TiptapNode[], vars: TemplateVars): TextRun[] { + return nodes.flatMap((node) => { + if (node.type === 'text') { + const bold = node.marks?.some((m) => m.type === 'bold') ?? false; + const italics = node.marks?.some((m) => m.type === 'italic') ?? false; + const underline = node.marks?.some((m) => m.type === 'underline') ? {} : undefined; + return [new TextRun({ text: node.text ?? '', bold, italics, underline })]; + } + if (node.type === 'variableChip') { + const key = node.attrs?.key as string; + const value = vars[key] ?? `[${key}]`; + return [new TextRun({ text: value, bold: true })]; + } + if (node.type === 'hardBreak') { + return [new TextRun({ break: 1 })]; + } + return []; + }); +} + +function buildRow(rowNode: TiptapNode, vars: TemplateVars, opts?: ConvertOpts): TableRow { + return new TableRow({ + children: (rowNode.content ?? []).map((cellNode) => { + const paragraphs = (cellNode.content ?? []).flatMap((p) => convertBlock(p, vars, opts)); + return new TableCell({ + children: paragraphs.length > 0 + ? (paragraphs as Paragraph[]) + : [new Paragraph({ children: [] })], + borders: THIN_BORDER, + }); + }), + }); +} + +function buildTable(node: TiptapNode, vars: TemplateVars, opts?: ConvertOpts): Table { + const repeatRows = node.attrs?.repeatRows === true; + const rowsKey = node.attrs?.rowsKey as string | undefined; + // Named row-set (Anexa 4 factor tables) falls back to the single `rows` (Anexa 3). + const repeatData = rowsKey ? opts?.rowSets?.[rowsKey] : opts?.rows; + const children = node.content ?? []; + + let rows: TableRow[]; + if (repeatRows && children.length >= 2) { + const header = children[0]; + const template = children[1]; + rows = [buildRow(header, vars, opts)]; + for (const entry of repeatData ?? []) { + rows.push(buildRow(template, { ...vars, ...entry }, opts)); + } + } else { + rows = children.map((rowNode) => buildRow(rowNode, vars, opts)); + } + + return new Table({ + rows, + width: { size: 100, type: WidthType.PERCENTAGE }, + }); +} + +function resolveAlign(align?: string) { + if (align === 'center') return AlignmentType.CENTER; + if (align === 'right') return AlignmentType.RIGHT; + if (align === 'justify') return AlignmentType.JUSTIFIED; + return AlignmentType.LEFT; +} + +function resolveHeading(level?: number) { + const map = { + 1: HeadingLevel.HEADING_1, + 2: HeadingLevel.HEADING_2, + 3: HeadingLevel.HEADING_3, + 4: HeadingLevel.HEADING_4, + } as const; + return map[(level ?? 1) as 1 | 2 | 3 | 4] ?? HeadingLevel.HEADING_1; +} diff --git a/apps/api/src/modules/notifications/notifications.controller.ts b/apps/api/src/modules/notifications/notifications.controller.ts new file mode 100644 index 0000000..d3081da --- /dev/null +++ b/apps/api/src/modules/notifications/notifications.controller.ts @@ -0,0 +1,26 @@ +import { Controller, Get, Post, Query, UseGuards } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from '../../common/guards/roles.guard'; +import { Roles } from '../../common/decorators/roles.decorator'; +import { NotificationsService } from './notifications.service'; + +@Controller('notifications') +@UseGuards(AuthGuard('jwt'), RolesGuard) +@Roles('hr_admin') +export class NotificationsController { + constructor(private readonly notifications: NotificationsService) {} + + /** Preview the current expiry report without sending. */ + @Get('expiry-preview') + async preview(@Query('windowDays') windowDays?: string) { + return this.notifications.buildExpiryReport(windowDays ? Number(windowDays) : 30); + } + + /** Manually trigger the daily-expiry webhook (admin only). */ + @Post('trigger-daily-expiry') + async trigger(@Query('windowDays') windowDays?: string) { + const report = await this.notifications.buildExpiryReport(windowDays ? Number(windowDays) : 30); + const result = await this.notifications.sendReport(report); + return { ...result, items: report.items.length, totals: report.totals }; + } +} diff --git a/apps/api/src/modules/notifications/notifications.module.ts b/apps/api/src/modules/notifications/notifications.module.ts new file mode 100644 index 0000000..a1b6e47 --- /dev/null +++ b/apps/api/src/modules/notifications/notifications.module.ts @@ -0,0 +1,49 @@ +import { Module, OnModuleInit } from '@nestjs/common'; +import { BullModule, InjectQueue } from '@nestjs/bull'; +import { HttpModule } from '@nestjs/axios'; +import { Queue } from 'bull'; +import { Logger } from '@nestjs/common'; +import { DailyExpiryProcessor } from './workers/daily-expiry.processor'; +import { NotificationsController } from './notifications.controller'; +import { NotificationsService } from './notifications.service'; + +const DAILY_EXPIRY_QUEUE = 'daily-expiry'; +const DAILY_EXPIRY_JOB = 'daily-expiry-scan'; + +@Module({ + imports: [ + BullModule.registerQueue({ name: DAILY_EXPIRY_QUEUE }), + HttpModule, + ], + controllers: [NotificationsController], + providers: [NotificationsService, DailyExpiryProcessor], + exports: [NotificationsService], +}) +export class NotificationsModule implements OnModuleInit { + private readonly logger = new Logger(NotificationsModule.name); + + constructor(@InjectQueue(DAILY_EXPIRY_QUEUE) private readonly queue: Queue) {} + + async onModuleInit(): Promise<void> { + // Remove stale repeatables first so changes to the cron expression take effect + const repeatables = await this.queue.getRepeatableJobs(); + for (const r of repeatables) { + if (r.name === DAILY_EXPIRY_JOB) { + await this.queue.removeRepeatableByKey(r.key); + } + } + // Schedule daily at 08:00 Europe/Bucharest + await this.queue.add( + DAILY_EXPIRY_JOB, + {}, + { + repeat: { cron: '0 8 * * *', tz: 'Europe/Bucharest' }, + removeOnComplete: 20, + removeOnFail: 50, + }, + ); + this.logger.log('Daily expiry job scheduled (cron 0 8 * * * Europe/Bucharest)'); + } +} + +export { DAILY_EXPIRY_QUEUE, DAILY_EXPIRY_JOB }; diff --git a/apps/api/src/modules/notifications/notifications.service.ts b/apps/api/src/modules/notifications/notifications.service.ts new file mode 100644 index 0000000..6c4510c --- /dev/null +++ b/apps/api/src/modules/notifications/notifications.service.ts @@ -0,0 +1,135 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { HttpService } from '@nestjs/axios'; +import { firstValueFrom } from 'rxjs'; +import { PrismaService } from '../../common/prisma/prisma.service'; + +export interface ExpiryItem { + category: 'document' | 'qualification' | 'contract' | 'medical' | 'sanction'; + employeeId: string; + employeeName: string; + idnp: string; + label: string; + expiresAt: string; // ISO YYYY-MM-DD + daysUntil: number; +} + +export interface ExpiryReport { + generatedAt: string; + totals: Record<ExpiryItem['category'], number>; + items: ExpiryItem[]; +} + +@Injectable() +export class NotificationsService { + private readonly logger = new Logger(NotificationsService.name); + + constructor( + private readonly prisma: PrismaService, + private readonly http: HttpService, + ) {} + + /** Build the expiry report for everything that expires within `windowDays` (or has expired). */ + async buildExpiryReport(windowDays = 30): Promise<ExpiryReport> { + const now = new Date(); + const horizon = new Date(now.getTime() + windowDays * 24 * 3600 * 1000); + const items: ExpiryItem[] = []; + + // 1. Identity documents + const idDocs = await this.prisma.identityDocument.findMany({ + where: { dataExpirarii: { lte: horizon } }, + include: { employee: { select: { id: true, nume: true, prenume: true, idnp: true } } }, + }); + for (const d of idDocs) { + items.push(this.toItem('document', d.employee, `${d.tipAct} ${d.seria ?? ''}${d.nr}`.trim(), d.dataExpirarii, now)); + } + + // 2. Qualifications + const quals = await this.prisma.qualification.findMany({ + where: { dataExpirarii: { lte: horizon, not: null } }, + include: { employee: { select: { id: true, nume: true, prenume: true, idnp: true } } }, + }); + for (const q of quals) { + if (!q.dataExpirarii) continue; + const lbl = q.specialitate ? `${q.categorie} — ${q.specialitate}` : String(q.categorie); + items.push(this.toItem('qualification', q.employee, lbl, q.dataExpirarii, now)); + } + + // 3. Contracts (fixed-term) — dataTerminarii within window + const contracts = await this.prisma.employmentContract.findMany({ + where: { dataTerminarii: { lte: horizon, not: null } }, + include: { employee: { select: { id: true, nume: true, prenume: true, idnp: true } } }, + }); + for (const c of contracts) { + if (!c.dataTerminarii) continue; + items.push(this.toItem('contract', c.employee, `Contract ${c.nrCim}`, c.dataTerminarii, now)); + } + + // 4. Medical — next planned checkup (dataPlanificata, not yet executed) + const medical = await this.prisma.medicalCheckup.findMany({ + where: { dataPlanificata: { lte: horizon }, dataEfectuata: null }, + include: { employee: { select: { id: true, nume: true, prenume: true, idnp: true } } }, + }); + for (const m of medical) { + items.push(this.toItem('medical', m.employee, `Control medical ${m.tip}`, m.dataPlanificata, now)); + } + + // 5. Disciplinary sanctions — expiry transition (still active) + const sanctions = await this.prisma.disciplinarySanction.findMany({ + where: { dataExpirarii: { lte: horizon }, isStinsa: false }, + include: { employee: { select: { id: true, nume: true, prenume: true, idnp: true } } }, + }); + for (const s of sanctions) { + items.push(this.toItem('sanction', s.employee, `Sancțiune ${s.tip}`, s.dataExpirarii, now)); + } + + items.sort((a, b) => a.daysUntil - b.daysUntil); + + const totals: ExpiryReport['totals'] = { + document: 0, qualification: 0, contract: 0, medical: 0, sanction: 0, + }; + for (const it of items) totals[it.category] += 1; + + return { generatedAt: now.toISOString(), totals, items }; + } + + async sendReport(report: ExpiryReport): Promise<{ delivered: boolean; reason?: string }> { + const webhook = process.env.N8N_WEBHOOK_BASE; + if (!webhook) { + this.logger.warn('N8N_WEBHOOK_BASE not set — skipping expiry notification webhook'); + return { delivered: false, reason: 'N8N_WEBHOOK_BASE not configured' }; + } + try { + await firstValueFrom(this.http.post(`${webhook}/daily-expiry`, report)); + this.logger.log( + `Daily expiry report sent (${report.items.length} items: ` + + `${report.totals.document} doc, ${report.totals.qualification} calif, ` + + `${report.totals.contract} contr, ${report.totals.medical} med, ` + + `${report.totals.sanction} sanct)`, + ); + return { delivered: true }; + } catch (err) { + const msg = (err as Error).message; + this.logger.error(`Failed to POST daily-expiry webhook: ${msg}`); + return { delivered: false, reason: msg }; + } + } + + private toItem( + category: ExpiryItem['category'], + employee: { id: string; nume: string; prenume: string; idnp: string }, + label: string, + expiresAt: Date, + now: Date, + ): ExpiryItem { + const daysUntil = Math.floor((expiresAt.getTime() - now.getTime()) / (24 * 3600 * 1000)); + return { + category, + employeeId: employee.id, + employeeName: `${employee.nume} ${employee.prenume}`, + idnp: employee.idnp, + label, + expiresAt: expiresAt.toISOString().slice(0, 10), + daysUntil, + }; + } +} diff --git a/apps/api/src/modules/notifications/workers/daily-expiry.processor.ts b/apps/api/src/modules/notifications/workers/daily-expiry.processor.ts new file mode 100644 index 0000000..e65588a --- /dev/null +++ b/apps/api/src/modules/notifications/workers/daily-expiry.processor.ts @@ -0,0 +1,24 @@ +import { Processor, Process } from '@nestjs/bull'; +import { Job } from 'bull'; +import { Injectable, Logger } from '@nestjs/common'; +import { NotificationsService } from '../notifications.service'; +import { DAILY_EXPIRY_JOB } from '../notifications.module'; + +@Injectable() +@Processor('daily-expiry') +export class DailyExpiryProcessor { + private readonly logger = new Logger(DailyExpiryProcessor.name); + + constructor(private readonly notifications: NotificationsService) {} + + @Process(DAILY_EXPIRY_JOB) + async handle(_job: Job): Promise<void> { + this.logger.log('Running daily expiry scan…'); + const report = await this.notifications.buildExpiryReport(30); + if (report.items.length === 0) { + this.logger.log('No expiring items in the next 30 days — skipping webhook'); + return; + } + await this.notifications.sendReport(report); + } +} diff --git a/apps/api/src/modules/reference/reference.controller.ts b/apps/api/src/modules/reference/reference.controller.ts new file mode 100644 index 0000000..cba7672 --- /dev/null +++ b/apps/api/src/modules/reference/reference.controller.ts @@ -0,0 +1,32 @@ +import { Controller, Get, UseGuards } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { RolesGuard } from '../../common/guards/roles.guard'; +import { Roles } from '../../common/decorators/roles.decorator'; +import { PrismaService } from '../../common/prisma/prisma.service'; + +@Controller('reference') +@UseGuards(AuthGuard('jwt'), RolesGuard) +@Roles('hr_admin', 'hr_specialist', 'manager', 'nursing_director', 'medic_familie', 'quality_auditor', 'employee') +export class ReferenceController { + constructor(private readonly prisma: PrismaService) {} + + @Get('disability-grades') + disabilityGrades() { + return this.prisma.disabilityGrade.findMany({ orderBy: { name: 'asc' } }); + } + + @Get('tax-exemptions') + taxExemptions() { + return this.prisma.taxExemption.findMany({ orderBy: { code: 'asc' } }); + } + + @Get('work-schedules') + workSchedules() { + return this.prisma.workSchedule.findMany({ orderBy: { name: 'asc' } }); + } + + @Get('departments/flat') + departmentsFlat() { + return this.prisma.department.findMany({ orderBy: { name: 'asc' } }); + } +} diff --git a/apps/api/src/modules/reference/reference.module.ts b/apps/api/src/modules/reference/reference.module.ts new file mode 100644 index 0000000..f734306 --- /dev/null +++ b/apps/api/src/modules/reference/reference.module.ts @@ -0,0 +1,7 @@ +import { Module } from '@nestjs/common'; +import { ReferenceController } from './reference.controller'; + +@Module({ + controllers: [ReferenceController], +}) +export class ReferenceModule {} diff --git a/apps/api/templates/docx/README.md b/apps/api/templates/docx/README.md new file mode 100644 index 0000000..2717141 --- /dev/null +++ b/apps/api/templates/docx/README.md @@ -0,0 +1,162 @@ +# Șabloane DOCX — Control medical (docxtemplater) + +Сюда кладутся **`.docx`-шаблоны** (вы их делаете в Word, вставляя плейсхолдеры). Движок генерации +загружает нужный файл, подставляет данные и отдаёт готовый документ. + +- **Где лежат:** `apps/api/templates/docx/` +- **Движок:** `docxtemplater` + `pizzip` (уже в зависимостях). +- **Синтаксис плейсхолдеров:** фигурные скобки `{...}`. + +## Имена файлов (фиксированные — по ним движок находит шаблон) + +| Файл | Источник (регламент) | На что генерируется | +|------|----------------------|---------------------| +| `anexa-3.docx` | Anexa 3 — Fișa de solicitare | 1 на группу (карту риска) | +| `anexa-4.docx` | Anexa 4 — Fișa de evaluare a riscurilor | 1 на карту риска (`tipFisa = STANDARD`) | +| `anexa-4a.docx` | Anexa 4A — muncă la distanță/digital | 1 на карту риска (`tipFisa = DISTANTA_DIGITAL`) | +| `anexa-4b.docx` | Anexa 4B — supliment radiații | 1 на каждого облучаемого сотрудника | +| `anexa-6.docx` | Anexa 6 — Fișa de aptitudine | 1 на каждого сотрудника (вердикт врача) | + +## Синтаксис docxtemplater (шпаргалка для Word) + +| Нужно | Пишете в шаблоне | +|------|------------------| +| Простое значение | `{numePrenume}` | +| Таблица/список (повтор строки) | в строке таблицы: `{#chimici}` … `{denumire}` `{vlep}` … `{/chimici}` | +| Чек-бокс | `{cbEchipa}` — движок подставит `☑` или `☐` | +| Условный блок | `{#esteRadiatii}…текст…{/esteRadiatii}` (показать, если true); `{^esteRadiatii}…{/esteRadiatii}` (если false) | + +> ⚠️ Циклы в таблицах: `{#name}` ставится в **первую ячейку строки-шаблона**, `{/name}` — в **последнюю ячейку той же строки**. Эта строка повторится для каждого элемента массива. + +> ⚠️ Не оставляйте «висячих» `{` без пары — docxtemplater упадёт. Один плейсхолдер не должен быть разорван форматированием Word (выделите и наберите его одним стилем). + +--- + +# Контракт данных по приложениям + +Ниже — **точная форма `data`**, которую движок передаёт в каждый шаблон, и откуда берётся каждое значение. +Вставляйте в `.docx` плейсхолдеры именно с этими именами. + +## Общее (есть во всех) +| Плейсхолдер | Значение | Источник | +|---|---|---| +| `{unitatea}` | Medpark International Hospital | константа | +| `{idno}` | 1003600035476 | константа | +| `{adresa}` | str. Nicolae Testemițanu 29, Chișinău | константа | +| `{dataCompletarii}` | дата генерации (DD.MM.YYYY) | now() | + +## Контекст генерации batch +Эти поля заполняются в modal-е «Inițiere control medical» и используются в Anexa 3 / 4 / 4A / 4B: +`{telefon}` `{fax}` `{email}` `{solicitant}` `{functia}`. + +`{telefonFiliala}` берётся из `WorkplaceRiskCard.telefonFiliala`. + +--- + +## `anexa-3.docx` — Fișa de solicitare +**Уровень:** группа сотрудников (по карте риска). + +Шапка: `{unitatea}` `{idno}` `{adresa}` `{telefon}` `{fax}` `{email}` `{filiala}` `{adresaFiliala}` `{telefonFiliala}` +Подвал: `{dataCompletarii}` `{solicitant}` `{functia}` + +**Таблица сотрудников** — строку оборачиваете `{#angajati}` … `{/angajati}`: +| Плейсхолдер (в строке) | Значение | Источник | +|---|---|---| +| `{nr}` | порядковый № | счётчик | +| `{numePrenume}` | Фамилия Имя | Employee.nume/prenume | +| `{anNastere}` | год рождения | Employee.dataNasterii | +| `{idnp}` | IDNP | Employee.idnp | +| `{tipExamen}` | тип контроля (текст) | Batch.tip | +| `{ocupatieCorm}` | occupația CORM | EmployeeMedicalProfile.ocupatieCorm | +| `{caem}` | CAEM (diviziune) | WorkplaceRiskCard.caemDiviziune | +| `{numarLoc}` | № locului de muncă | WorkplaceRiskCard.numarulLoculuiDeMunca | +| `{factorRisc}` | факторы (через запятую) | WorkplaceRiskCard.exposures[].denumire | + +--- + +## `anexa-4.docx` — Fișa de evaluare a riscurilor profesionale +**Уровень:** карта риска (`WorkplaceRiskCard`). + +**Шапка:** `{unitatea}` `{adresa}` `{telefon}` `{fax}` `{email}` `{filiala}` `{adresaFiliala}` `{telefonFiliala}` `{caem2}` `{cormSubgrupa}` `{directiaSectia}` `{numarLoc}` `{caemDiviziune}` `{numarLucratori}` `{clasa}` + +**Чек-боксы описательного блока** (`☑`/`☐`) — источник `WorkplaceRiskCard.evaluareDetalii`: +`{cbEchipa}` `{cbSchimbNoapte}` `{cbPauze}` +`{cbInfectare}` `{cbElectrocutare}` `{cbTensiuneInalta}` `{cbInecare}` `{cbAsfixiere}` `{cbStrivire}` `{cbTaiere}` `{cbIntepare}` `{cbLovire}` `{cbMuscatura}` `{cbMicrotraumatisme}` +`{cbConduceMasina}` `{categorieConducere}` `{cbUtilajeIntrauzinal}` +`{spatiuL}` `{spatiul}` `{spatiuH}` `{cbSuprafVerticala}` `{cbSuprafOrizontala}` `{cbSuprafOblica}` `{cbMuncaIzolare}` `{cbMuncaInaltime}` `{cbMuncaMiscare}` +`{cbPozitieOrtostatica}` `{cbPozitieAsezat}` `{cbPozitieAplecata}` `{cbPozitieMixta}` `{cbPozitieFortata}` +`{cbColoanaCervicala}` `{cbColoanaToracala}` `{cbColoanaLombara}` +`{cbManipRidicare}` `{cbManipCoborare}` `{cbManipImpingere}` `{cbManipTragere}` `{cbManipPurtare}` `{cbManipDeplasare}` `{greutateMaxima}` +`{cbVizuale}` `{cbAuditive}` `{cbNeuropsihice}` +Microclimat/iluminat: `{cbMicroclimatInterior}` `{cbMicroclimatExterior}` `{cbCaloriceRece}` `{cbCaloriceCalda}` `{cbIluminatSuficient}` `{cbIluminatInsuficient}` `{cbIluminatNatural}` `{cbIluminatArtificial}` `{cbIluminatMixt}` + +**Факторные таблицы** — каждая = свой цикл; источник `WorkplaceRiskCard.exposures` (сгруппированы по `tip`): +Секции также имеют чек-боксы наличия данных: `{cbChimici}`/`{cbChimiciNu}`, `{cbPulberi}`/`{cbPulberiNu}`, `{cbBiologici}`/`{cbBiologiciNu}`, `{cbZgomot}`/`{cbZgomotNu}`, `{cbVibratii}`/`{cbVibratiiNu}`, `{cbCampEM}`/`{cbCampEMNu}`, `{cbOptice}`/`{cbOpticeNu}`. +| Цикл | Поля строки | +|---|---| +| `{#chimici}…{/chimici}` | `{denumire}` `{cas}` `{einecs}` `{timp}` `{vep}` `{vlep}` `{caracteristici}` | +| `{#pulberi}…{/pulberi}` | те же | +| `{#biologici}…{/biologici}` | `{denumire}` `{clasificare}` `{note}` | +| `{#zgomot}…{/zgomot}` | `{denumire}` `{timp}` `{vep}` `{vlep}` `{caracteristici}` | +| `{#vibratii}…{/vibratii}` | `{denumire}` `{zona}` `{timp}` `{vep}` `{vlep}` `{caracteristici}` | +| `{#campEM}…{/campEM}` | `{denumire}` `{zona}` `{timp}` `{vep}` `{vlep}` `{caracteristici}` | +| `{#optice}…{/optice}` | `{denumire}` `{zona}` `{timp}` `{vep}` `{vlep}` `{caracteristici}` | + +**Радиация ионизирующая** (источник `WorkplaceRiskCard.radiatii*`): +`{cbRadiatii}` `{cbRadiatiiNu}` `{radGrupa}` `{radSurse}` `{radTipExpunere}` `{radAparatura}` `{radMasuri}` + +**Подвал:** `{protectieColectiva}` `{protectieIndividuala}` `{echipament}` `{cbVestiar}` `{cbChiuveta}` `{cbWc}` `{cbDus}` `{cbSalaMese}` `{cbRecreere}` `{observatii}` + +--- + +## `anexa-4a.docx` — muncă la distanță / platforme digitale +**Уровень:** карта риска (`tipFisa = DISTANTA_DIGITAL`). **Без факторных таблиц.** + +Шапка: `{unitatea}` `{adresa}` `{telefon}` `{fax}` `{email}` `{filiala}` `{adresaFiliala}` `{telefonFiliala}` `{caem2}` `{cormSubgrupa}` `{directiaSectia}` `{numarLoc}` `{caemDiviziune}` `{clasa}` +Тело: `{cbEchipa}` `{oreZi}` `{schimburi}` `{cbSchimbNoapte}` `{cbPauze}` **`{cbLucruMonitor}`** **`{cbPlatformeDigitale}`** +`{cbConduceMasina}` `{categorieConducere}` `{operatiuni}` +`{cbDeplasari}` `{deplasariDescriere}` +`{cbManipRidicare}…{cbManipDeplasare}` `{greutateMaxima}` +`{cbVizuale}` `{cbAuditive}` `{cbNeuropsihice}` `{alteRiscuri}` +Подвал: `{dataCompletarii}` + +--- + +## `anexa-4b.docx` — Supliment radiații ionizante +**Уровень:** один облучаемый сотрудник. Источник: `EmployeeMedicalProfile` + `overexposures`. + +Шапка: `{unitatea}` `{adresa}` `{telefon}` `{fax}` `{email}` `{filiala}` `{adresaFiliala}` `{telefonFiliala}` `{caem2}` +Контекст места: `{cormSubgrupa}` `{directiaSectia}` `{numarLoc}` `{caemDiviziune}` +Сотрудник: `{numePrenume}` `{idnp}` + +| Плейсхолдер | Значение | Источник | +|---|---|---| +| `{cbRadiatii}` | ☑/☐ | profile.expusRadiatiiIonizante | +| `{dataIntrarii}` | дата | profile.dataIntrarii | +| `{expAnterioaraPerioada}` | период | profile.expunereAnterioaraPerioda | +| `{expAnterioaraAni}` | лет | profile.expunereAnterioaraAni | +| `{dozaExterna}` | mSv | profile.dozaCumulataExternaMsv | +| `{dozaInterna}` | mSv | profile.dozaCumulataInternaMsv | +| `{dozaTotala}` | mSv (ext+int) | вычисляется | + +Циклы supraexpuneri (источник `overexposures`, разделены по `fel`): +- `{#supraexpExceptionale}` `{tipExpunere}` `{data}` `{doza}` `{/supraexpExceptionale}` +- `{#supraexpAccidentale}` `{tipExpunere}` `{data}` `{doza}` `{/supraexpAccidentale}` + +Подвал: `{dataCompletarii}` + +--- + +## `anexa-6.docx` — Fișa de aptitudine +**Уровень:** один сотрудник. Источник: `MedicalCheckup` (вердикт врача). + +Шапка/сотрудник: `{unitatea}` `{adresa}` `{numePrenume}` `{idnp}` `{anNastere}` `{ocupatieCorm}` `{departament}` `{caemDiviziune}` `{numarLoc}` `{factorRisc}` `{tipExamen}` `{dataCompletarii}` +Вердикт (чек-боксы): `{cbApt}` `{cbAptAdaptare}` `{cbAptConditionat}` `{cbInaptTemporar}` `{cbInapt}` +`{recomandari}` `{valabilPanaLa}` `{semnatDe}`. +`{valabilPanaLa}` и `{semnatDe}` заполняет medic_familie при finalizarea controlului. + +--- + +## Статус движка +`DocxTemplateService.render(type, data)` уже подключён. Если файл `apps/api/templates/docx/anexa-*.docx` +существует, bulk-generation использует официальный `.docx`-шаблон через `docxtemplater`; старый `docx`+tiptap-JSON renderer остаётся fallback-ом. diff --git a/apps/api/templates/docx/anexa-3.docx b/apps/api/templates/docx/anexa-3.docx new file mode 100644 index 0000000000000000000000000000000000000000..f513d8eb0957cb0ae26a629a1f487ee5d885b4fe GIT binary patch literal 36125 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 T_#g_O2uuMM46G>#boYM%+z7&f literal 0 HcmV?d00001 diff --git a/apps/api/templates/docx/anexa-4.docx b/apps/api/templates/docx/anexa-4.docx new file mode 100644 index 0000000000000000000000000000000000000000..a1f969e285780d308b67f9e1727ac3ee2db446b1 GIT binary patch literal 45706 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 O69x?iwpIN2>Hh%aNQPqo literal 0 HcmV?d00001 diff --git a/apps/api/templates/docx/anexa-4a.docx b/apps/api/templates/docx/anexa-4a.docx new file mode 100644 index 0000000000000000000000000000000000000000..2d38d9568c97f9a209a56963938dcd9efee61334 GIT binary patch literal 32786 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 W%0k2Z`hNiEHxe48X65zkum1zN>fR3k literal 0 HcmV?d00001 diff --git a/apps/api/templates/docx/anexa-4b.docx b/apps/api/templates/docx/anexa-4b.docx new file mode 100644 index 0000000000000000000000000000000000000000..ec3143ead511469c9e131bf03e93dd08f85591d6 GIT binary patch literal 30861 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 literal 0 HcmV?d00001 diff --git a/apps/api/templates/docx/anexa-6.docx b/apps/api/templates/docx/anexa-6.docx new file mode 100644 index 0000000000000000000000000000000000000000..6cd20bb9a062dd2a7cbcb9a3b674234d2af64022 GIT binary patch literal 34499 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 literal 0 HcmV?d00001 diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json new file mode 100644 index 0000000..a1c778d --- /dev/null +++ b/apps/api/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "ES2021", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": true, + "noImplicitAny": true, + "strictBindCallApply": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true + } +} diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile new file mode 100644 index 0000000..684e234 --- /dev/null +++ b/apps/web/Dockerfile @@ -0,0 +1,19 @@ +# syntax=docker/dockerfile:1 +# Build context = monorepo root (hrm-medpark/) + +FROM node:20-bookworm-slim AS build +ENV PNPM_HOME="/pnpm" PATH="/pnpm:$PATH" +RUN corepack enable +WORKDIR /repo +COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./ +COPY apps/api/package.json apps/api/package.json +COPY apps/web/package.json apps/web/package.json +RUN pnpm install --frozen-lockfile +COPY apps/web apps/web +RUN pnpm --filter web build + +# ---- nginx serves the static build and proxies /api to the api container ---- +FROM nginx:alpine AS runtime +COPY apps/web/nginx.conf /etc/nginx/conf.d/default.conf +COPY --from=build /repo/apps/web/dist /usr/share/nginx/html +EXPOSE 80 diff --git a/apps/web/index.html b/apps/web/index.html new file mode 100644 index 0000000..392e122 --- /dev/null +++ b/apps/web/index.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<html lang="ro"> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title>HRM Medpark + + +
+ + + diff --git a/apps/web/nginx.conf b/apps/web/nginx.conf new file mode 100644 index 0000000..3fb63e9 --- /dev/null +++ b/apps/web/nginx.conf @@ -0,0 +1,22 @@ +server { + listen 80; + server_name _; + root /usr/share/nginx/html; + index index.html; + + # API requests are proxied to the NestJS container (same origin → no CORS, no build-time URL) + location /api/ { + proxy_pass http://api:3001; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_read_timeout 120s; + } + + # SPA fallback + location / { + try_files $uri $uri/ /index.html; + } +} diff --git a/apps/web/package.json b/apps/web/package.json new file mode 100644 index 0000000..3966af0 --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,46 @@ +{ + "name": "web", + "version": "0.1.0", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@hookform/resolvers": "^3.3.4", + "@mantine/core": "^7.6.2", + "@mantine/dates": "^7.6.2", + "@mantine/form": "^7.6.2", + "@mantine/hooks": "^7.6.2", + "@mantine/modals": "^7.6.2", + "@mantine/notifications": "^7.6.2", + "@tabler/icons-react": "^3.41.1", + "@tanstack/react-query": "^5.28.6", + "@tiptap/core": "^3.23.1", + "@tiptap/extension-table": "^3.23.1", + "@tiptap/extension-underline": "^3.23.1", + "@tiptap/pm": "^3.23.1", + "@tiptap/react": "^3.23.1", + "@tiptap/starter-kit": "^3.23.1", + "axios": "^1.6.8", + "dayjs": "^1.11.10", + "i18next": "^23.10.1", + "i18next-browser-languagedetector": "^8.0.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-hook-form": "^7.51.0", + "react-i18next": "^14.1.0", + "react-router-dom": "^6.22.3", + "zod": "^3.22.4" + }, + "devDependencies": { + "@types/react": "^18.2.74", + "@types/react-dom": "^18.2.24", + "@vitejs/plugin-react": "^4.2.1", + "postcss": "^8.4.38", + "postcss-preset-mantine": "^1.13.0", + "typescript": "^5.4.2", + "vite": "^5.2.6" + } +} diff --git a/apps/web/public/logo-medpark.png b/apps/web/public/logo-medpark.png new file mode 100644 index 0000000000000000000000000000000000000000..02611a2938cca31f849be1ff61da36dc98a2b6f2 GIT binary patch literal 463008 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

Sp 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 !Or3SzOGW%dtDAvnb$yJql_j4=M# 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 ZLdYrCr22xACd=eRO;vMC$|lR>{{vt4qJ01W literal 0 HcmV?d00001 diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx new file mode 100644 index 0000000..6a4716d --- /dev/null +++ b/apps/web/src/App.tsx @@ -0,0 +1,237 @@ +import { useState } from 'react'; +import { BrowserRouter, Routes, Route, Navigate, useLocation, useNavigate } from 'react-router-dom'; +import { useTranslation } from 'react-i18next'; +import { AppShell, Group, Text, Stack, UnstyledButton, Menu, Avatar, Badge } from '@mantine/core'; +import { + IconLayoutDashboard, IconUsers, IconSitemap, + IconTargetArrow, IconShieldExclamation, IconStethoscope, IconMailbox, + IconFileDescription, IconBox, +} from '@tabler/icons-react'; +import { EmployeesPage } from './pages/employees/EmployeesPage'; +import { EmployeeDetailPage } from './pages/employees/EmployeeDetailPage'; +import { DepartmentsPage } from './pages/departments/DepartmentsPage'; +import { EvaluationPage } from './pages/evaluation/EvaluationPage'; +import { CampaignDetailPage } from './pages/evaluation/CampaignDetailPage'; +import { EvaluationFormPage } from './pages/evaluation/EvaluationFormPage'; +import { RiskCardsPage } from './pages/medical/RiskCardsPage'; +import { MedicalControlPage } from './pages/medical/MedicalControlPage'; +import { MedicalInboxPage } from './pages/medical/MedicalInboxPage'; +import { DashboardPage } from './pages/dashboard/DashboardPage'; +import { LoginPage } from './pages/auth/LoginPage'; +import { ContractsPage } from './pages/contracts/ContractsPage'; +import { InventoryPage } from './pages/inventory/InventoryPage'; + +const font = "'Montserrat', Arial, sans-serif"; +const teal = '#008286'; + +// ── Navigation items ────────────────────────────────────── + +interface NavItem { labelKey: string; path: string; icon: React.ReactNode; roles?: string[] } + +// roles: undefined = all authenticated users; defined = only those roles +const NAV_ITEMS: NavItem[] = [ + { labelKey: 'nav.dashboard', path: '/dashboard', icon: }, + { labelKey: 'nav.employees', path: '/employees', icon: , roles: ['hr_admin', 'hr_specialist', 'manager', 'nursing_director'] }, + { labelKey: 'nav.departments', path: '/departments', icon: , roles: ['hr_admin', 'hr_specialist'] }, + { labelKey: 'nav.contracts', path: '/contracts', icon: , roles: ['hr_admin', 'hr_specialist'] }, + { labelKey: 'nav.inventory', path: '/inventory', icon: , roles: ['hr_admin', 'hr_specialist'] }, + { labelKey: 'nav.evaluation', path: '/evaluation', icon: , roles: ['hr_admin', 'hr_specialist', 'manager', 'nursing_director', 'quality_auditor'] }, + { labelKey: 'nav.risk_cards', path: '/risk-cards', icon: , roles: ['hr_admin', 'hr_specialist', 'manager', 'medic_familie'] }, + { labelKey: 'nav.medical', path: '/medical', icon: , roles: ['hr_admin', 'hr_specialist', 'manager'] }, + { labelKey: 'nav.inbox', path: '/medic-inbox', icon: , roles: ['hr_admin', 'medic_familie'] }, +]; + +function NavLink({ item }: { item: NavItem }) { + const location = useLocation(); + const navigate = useNavigate(); + const { t } = useTranslation(); + const active = location.pathname === item.path || + (item.path !== '/dashboard' && location.pathname.startsWith(item.path + '/')); + + return ( + navigate(item.path)} + style={{ + display: 'flex', + alignItems: 'center', + gap: 12, + padding: '12px 18px 12px 15px', + borderRadius: 6, + borderLeft: active ? `3px solid ${teal}` : '3px solid transparent', + background: active ? '#e6f4f4' : 'transparent', + color: active ? teal : '#58595b', + fontFamily: font, + fontWeight: active ? 600 : 400, + fontSize: '0.9375rem', + width: '100%', + cursor: 'pointer', + }} + onMouseEnter={(e) => { + if (!active) (e.currentTarget as HTMLElement).style.background = '#f8f9fa'; + }} + onMouseLeave={(e) => { + if (!active) (e.currentTarget as HTMLElement).style.background = 'transparent'; + }} + > + {item.icon} + {t(item.labelKey)} + + ); +} + +// ── Shell ───────────────────────────────────────────────── + +function ProtectedRoute({ roles, children }: { roles?: string[]; children: React.ReactNode }) { + const role = localStorage.getItem('kc_role') ?? ''; + if (roles && !roles.includes(role)) return ; + return <>{children}; +} + +function RouteFade({ children }: { children: React.ReactNode }) { + const location = useLocation(); + return ( +

+ ); +} + +function Shell({ onLogout }: { onLogout: () => void }) { + const username = localStorage.getItem('kc_username') ?? 'HR Admin'; + const role = localStorage.getItem('kc_role') ?? 'hr_admin'; + + const visibleNav = NAV_ITEMS.filter(item => !item.roles || item.roles.includes(role)); + + const initials = username + .split(' ') + .map((w) => w[0]?.toUpperCase() ?? '') + .slice(0, 2) + .join(''); + + return ( + + {/* ── HEADER ── */} + + + Medpark International Hospital { + const el = e.target as HTMLImageElement; + el.style.display = 'none'; + }} + /> + + + + {role} + + + + + + {initials || 'HR'} + + + {username} + + + + + {role} + + + Ieșire + + + + + + + + {/* ── NAVBAR ── */} + + + + HRM + + + {visibleNav.map((item) => ( + + ))} + + + + {/* ── CONTENT ── */} + + + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + + + ); +} + +// ── Root ────────────────────────────────────────────────── + +export default function App() { + const [authed, setAuthed] = useState(() => !!localStorage.getItem('kc_token')); + + const handleLogin = () => setAuthed(true); + + const handleLogout = () => { + localStorage.removeItem('kc_token'); + localStorage.removeItem('kc_username'); + localStorage.removeItem('kc_role'); + setAuthed(false); + }; + + if (!authed) { + return ; + } + + return ( + + + + ); +} diff --git a/apps/web/src/api/client.ts b/apps/web/src/api/client.ts new file mode 100644 index 0000000..9547c04 --- /dev/null +++ b/apps/web/src/api/client.ts @@ -0,0 +1,17 @@ +import axios from 'axios'; + +export const apiClient = axios.create({ + baseURL: '/api/v1', +}); + +// Прикрепляем Keycloak-токен из localStorage (Keycloak.js управляет им на клиенте) +apiClient.interceptors.request.use((config) => { + const token = localStorage.getItem('kc_token'); + if (token) config.headers.Authorization = `Bearer ${token}`; + return config; +}); + +apiClient.interceptors.response.use( + (r) => r, + (err) => Promise.reject(err), +); diff --git a/apps/web/src/api/types.ts b/apps/web/src/api/types.ts new file mode 100644 index 0000000..9d83b09 --- /dev/null +++ b/apps/web/src/api/types.ts @@ -0,0 +1,544 @@ +// Shared TypeScript interfaces mirroring Prisma models as returned by the API. +// All dates are ISO strings from JSON. + +export type Sex = 'F' | 'M'; +export type MaritalStatus = 'casatorit' | 'necasatorit' | 'divortat' | 'vaduv'; +export type EmployeeStatus = 'activ' | 'concediat' | 'suspendat'; +export type DocumentType = 'buletin_de_identitate' | 'pasaport'; +export type FamilyMemberType = 'contact_principal' | 'sot' | 'sotie' | 'mama' | 'tata' | 'copil'; +export type StudyType = 'superioare' | 'medii_de_specialitate' | 'secundare_tehnice' | 'medii'; +export type StudyLevel = 'de_baza' | 'postuniversitar'; +export type PostUniversityType = 'masterat' | 'rezidentiat' | 'secundariat' | 'altele'; +export type DiplomaStatus = 'confirmata' | 'neconfirmata'; +export type QualificationCategory = 'fara' | 'cat_II' | 'cat_I' | 'superioara'; +export type ScientificTitle = 'doctor' | 'doctor_habilitat'; +export type TrainingType = 'orientare' | 'intern' | 'extern_RM' | 'extern_international'; +export type DisciplinarySanctionType = 'avertisment' | 'mustrare' | 'mustrare_aspra'; +export type ContractPeriod = 'determinata' | 'nedeterminata' | 'replasare_temporara'; +export type ContractCategory = 'principal' | 'secundar'; +export type ContractType = 'de_baza' | 'cumul'; +export type SalaryType = 'fix' | 'pe_ore' | 'in_acord'; + +// ─── Reference entities ────────────────────────────────────── + +export interface DisabilityGrade { + id: string; + code: string; + name: string; +} + +export interface TaxExemption { + id: string; + code: string; + description: string; +} + +export interface WorkSchedule { + id: string; + name: string; + daysWork: number; + daysRest: number; + hoursPerDay: number; +} + +export interface Department { + id: string; + name: string; + code: string | null; + parentId: string | null; + children?: Department[]; + parent?: Department | null; +} + +// ─── Sub-entities ──────────────────────────────────────────── + +export interface IdentityDocument { + id: string; + employeeId: string; + tipAct: DocumentType; + seria: string | null; + nr: string; + dataEmiterii: string; + autoritateEmitenta: string; + dataExpirarii: string; + createdAt: string; + updatedAt: string; +} + +export interface FamilyMember { + id: string; + employeeId: string; + tip: FamilyMemberType; + numePrenume: string; + dataNasterii: string | null; + idnp: string | null; + telefon: string | null; + tipScutireId: string | null; + tipScutire: TaxExemption | null; + createdAt: string; + updatedAt: string; +} + +export interface Education { + id: string; + employeeId: string; + tipStudii: StudyType; + institutia: string; + specialitatea: string; + dataAbsolvirii: string | null; + nrSeriaDiploma: string | null; + dataEmiterii: string | null; + nrInregistrare: string | null; + confirmare: DiplomaStatus | null; + nivel: StudyLevel | null; + tipPostuniversitar: PostUniversityType | null; + createdAt: string; + updatedAt: string; +} + +export interface Qualification { + id: string; + employeeId: string; + categorie: QualificationCategory; + dataObtinerii: string | null; + dataUltimeiConfirmari: string | null; + dataExpirarii: string | null; + specialitate: string | null; + createdAt: string; + updatedAt: string; +} + +export interface Training { + id: string; + employeeId: string; + denumire: string; + inceput: string; + sfirsit: string | null; + tip: TrainingType; + tara: string | null; + nrOre: number | null; + organizatia: string | null; + certificat: boolean; + cost: string | null; + createdAt: string; + updatedAt: string; +} + +export interface DisciplinarySanction { + id: string; + employeeId: string; + tip: DisciplinarySanctionType; + dataAplicarii: string; + dataExpirarii: string; + isStinsa: boolean; + createdAt: string; + updatedAt: string; +} + +export interface Benefit { + id: string; + employeeId: string; + uniformaId: string | null; + uniforma: InventoryItem | null; + halatId: string | null; + halat: InventoryItem | null; + ciupiciId: string | null; + ciupici: InventoryItem | null; + vestaId: string | null; + vesta: InventoryItem | null; + ticheteMasa: boolean; + valoareTichet: string | null; + alimentatiePersonal: boolean; + abonamentTel: string | null; + aparatTelefonId: string | null; + aparatTelefon: InventoryItem | null; + cardCompanie: string | null; + automobilServiciu: string | null; + createdAt: string; + updatedAt: string; +} + +export type InventoryItemType = 'uniforma' | 'halat' | 'ciupici' | 'vesta' | 'aparat_telefon' | 'alte'; + +export interface InventoryItem { + id: string; + sku: string; + name: string; + type: InventoryItemType; + size: string | null; + color: string | null; + pricePerUnit: string | null; + stockQty: number; + active: boolean; + createdAt: string; + updatedAt: string; +} + +export interface PaginatedInventory { + total: number; + page: number; + limit: number; + items: InventoryItem[]; +} + +export interface CimServiceCategory { + id: string; + contractId: string; + categorieId: string; + tipRemunerare: 'tarif' | 'procent'; + sumaNeta: string | null; + procent: string | null; +} + +export interface EmploymentContract { + id: string; + nrCim: string; + employeeId: string; + categorie: ContractCategory; + dataSemnarii: string; + dataAngajarii: string; + dataDemisiei: string | null; + perioada: ContractPeriod; + dataTerminarii: string | null; + functiaClasificator: string | null; + codFunctie: string | null; + functiaOrganigrama: string | null; + tipCim: ContractType; + departmentId: string; + department: Department; + regimMunca: string | null; + tipSalarizare: SalaryType | null; + salarizareDetails: unknown; + clausaAditionala: unknown; + workScheduleId: string | null; + workSchedule: WorkSchedule | null; + categoriiServicii: CimServiceCategory[]; + createdAt: string; + updatedAt: string; +} + +export interface ContractListItem extends EmploymentContract { + status: 'activ' | 'expirat' | 'expira_in_curand'; + employee: Pick; +} + +export interface PaginatedContracts { + total: number; + page: number; + limit: number; + items: ContractListItem[]; +} + +// ─── Core Employee ──────────────────────────────────────────── + +export interface Employee { + id: string; + idnp: string; + nume: string; + prenume: string; + patronimic: string | null; + numeAnterior: string | null; + dataNasterii: string; + domiciliu: string; + adresaReala: string | null; + telefonPersonal: string; + telefonServiciu: string | null; + emailPersonal: string | null; + emailCorporativ: string | null; + sex: Sex; + codCpas: string | null; + stareCivila: MaritalStatus | null; + titluStiintific: ScientificTitle | null; + titluUniversitar: string | null; + status: EmployeeStatus; + gradDizabilitateId: string | null; + gradDizabilitate: DisabilityGrade | null; + recomandareInternaId: string | null; + recomandareInterna: Pick | null; + identityDocuments: IdentityDocument[]; + familyMembers: FamilyMember[]; + educations: Education[]; + qualifications: Qualification[]; + trainings: Training[]; + disciplinarySanctions: DisciplinarySanction[]; + benefit: Benefit | null; + contracts: EmploymentContract[]; + createdAt: string; + updatedAt: string; +} + +// ─── Paginated list response ────────────────────────────────── + +export interface PaginatedEmployees { + total: number; + page: number; + limit: number; + items: EmployeeListItem[]; +} + +export interface EmployeeListItem { + id: string; + idnp: string; + nume: string; + prenume: string; + sex: Sex; + status: EmployeeStatus; + dataNasterii: string; + telefonPersonal: string; + emailCorporativ: string | null; + contracts: { + functiaOrganigrama: string | null; + department: { name: string }; + }[]; +} + +// ─── Phase 5: Medical Control ───────────────────────────────── + +export type MedicalCheckupType = + | 'la_angajare' + | 'periodic' + | 'la_reluarea_activitatii' + | 'la_incetarea_expunerii' + | 'suplimentar'; + +export type MedicalVerdict = + | 'apt' + | 'apt_perioada_adaptare' + | 'apt_conditionat' + | 'inapt_temporar' + | 'inapt'; + +export interface RiskFactors { + chimici?: string[]; + fizici?: string[]; + biologici?: string[]; + ergonomici?: string[]; + psihosociali?: string[]; +} + +export type RiskExposureType = + | 'AGENT_CHIMIC' | 'PULBERI' | 'AGENT_BIOLOGIC' | 'ZGOMOT' + | 'VIBRATII' | 'CAMP_ELECTROMAGNETIC' | 'RADIATII_OPTICE'; + +export interface RiskExposure { + id?: string; + tip: RiskExposureType; + denumire: string; + cas?: string | null; + einecs?: string | null; + clasificare?: string | null; + zonaAfectata?: string | null; + timpExpunere?: string | null; + vep?: string | null; + vlep?: string | null; + caracteristici?: string | null; + procesVerbal?: string | null; +} + +export interface WorkplaceRiskCard { + id: string; + name: string; + riskFactors: RiskFactors | null; + // Antet Anexa 4 + filiala?: string | null; + adresaFiliala?: string | null; + telefonFiliala?: string | null; + caemPrimeleDouaCifre?: string | null; + cormSubgrupaMajora?: string | null; + directiaSectiaSectorul?: string | null; + numarulLoculuiDeMunca?: string | null; + caemDiviziune?: string | null; + clasaConditiilorDeMunca?: string | null; + numarLucratoriPosibili?: number | null; + tipFisa?: string; // STANDARD | DISTANTA_DIGITAL + // Bloc descriptiv + subsol + evaluareDetalii?: Record | null; + anexeIgienicoSanitare?: Record | null; + mijloaceProtectieColectiva?: string | null; + mijloaceProtectieIndividuala?: string | null; + echipamentLucru?: string | null; + observatii?: string | null; + // Radiații ionizante (per loc de muncă) + radiatiiIonizante?: boolean | null; + radiatiiGrupa?: string | null; + radiatiiAparatura?: string | null; + radiatiiSurse?: string | null; + radiatiiTipExpunere?: string | null; + radiatiiMasuriProtectie?: string | null; + exposures?: RiskExposure[]; + _count?: { profiles: number }; + profiles?: { + id: string; + employee: { id: string; idnp: string; nume: string; prenume: string }; + }[]; + createdAt: string; + updatedAt: string; +} + +export type OverexposureKind = 'EXCEPTIONALA' | 'ACCIDENTALA'; + +export interface RadiationOverexposure { + id?: string; + fel: OverexposureKind; + tipExpunere?: string | null; + data?: string | null; + dozaMsv?: number | string | null; +} + +export interface EmployeeMedicalProfile { + id: string; + employeeId: string; + ocupatieCorm: string | null; + workplaceRiskCardId: string | null; + workplaceRiskCard: WorkplaceRiskCard | null; + dataUltimControlMedical: string | null; + expusRadiatiiIonizante: boolean; + dataIntrarii: string | null; + expunereAnterioaraPerioda: string | null; + expunereAnterioaraAni: number | null; + dozaCumulataExternaMsv: string | null; + dozaCumulataInternaMsv: string | null; + dozaTotalaMsv?: number; + overexposures?: RadiationOverexposure[]; + createdAt: string; + updatedAt: string; +} + +export interface GeneratedDoc { + name: string; + url: string; + type: string; +} + +export interface MedicalCheckup { + id: string; + employeeId: string; + tip: MedicalCheckupType; + dataPlanificata: string; + dataEfectuata: string | null; + verdict: MedicalVerdict | null; + recomandari: string | null; + valabilPanaLa: string | null; + semnatDe: string | null; + documenteGenerate: GeneratedDoc[] | null; + employee?: Pick & { + medicalProfile?: EmployeeMedicalProfile | null; + }; + createdAt: string; + updatedAt: string; +} + +export interface UpcomingExpiration { + id: string; + employeeId: string; + dataUltimControlMedical: string | null; + expusRadiatiiIonizante: boolean; + employee: { + id: string; + idnp: string; + nume: string; + prenume: string; + contracts: { department: { name: string } }[]; + }; + workplaceRiskCard: { id: string; name: string } | null; +} + +// ─── Dashboard ─────────────────────────────────────────────── + +export interface DashboardStats { + employees: { total: number; activ: number; concediat: number; suspendat: number }; + activeContracts: number; + recentHires: number; + activeSanctions: number; + expirations: { + contractsDeterminata: Array<{ + id: string; + nrCim: string; + dataTerminarii: string; + employee: { id: string; nume: string; prenume: string; idnp: string }; + department: { name: string }; + }>; + expiringDocs: Array<{ + id: string; + tipAct: string; + dataExpirarii: string; + employee: { id: string; nume: string; prenume: string; idnp: string }; + }>; + upcomingCheckups: Array<{ + id: string; + tip: string; + dataPlanificata: string; + employee: { id: string; nume: string; prenume: string; idnp: string }; + }>; + expiringQualifications: Array<{ + id: string; + categorie: string; + dataExpirarii: string; + employee: { id: string; nume: string; prenume: string; idnp: string }; + }>; + }; +} + +export interface BulkInitiateResult { + batchId: string; + groupsCount: number; + employeesCount: number; + checkups: { + employeeId: string; + checkupId: string; + documents: GeneratedDoc[]; + }[]; +} + +export interface BulkDocumentContext { + telefon?: string; + fax?: string; + email?: string; + solicitant?: string; + functia?: string; +} + + + +// ─── Anexa Templates ───────────────────────────────────────── + +export type AnexaType = 'ANEXA_3' | 'ANEXA_4' | 'ANEXA_4B' | 'ANEXA_6'; + +export interface AnexaTemplateMeta { + id: string; + type: AnexaType; + name: string; + updatedById: string; + updatedAt: string; +} + +export interface AnexaTemplate extends AnexaTemplateMeta { + contentJson: unknown; +} + +export interface AnexaTemplateVersion { + id: string; + templateId: string; + contentJson: unknown; + savedById: string; + savedAt: string; + label: string | null; +} + +export interface PreviewEmployee { + id: string; + idnp: string; + nume: string; + prenume: string; + dataNasterii: string; + contracts: { + functiaOrganigrama: string | null; + functiaClasificator: string | null; + department: { name: string }; + }[]; + medicalProfile: { + ocupatieCorm: string | null; + dozaCumulataExternaMsv: string | null; + dozaCumulataInternaMsv: string | null; + } | null; +} diff --git a/apps/web/src/i18n/en.json b/apps/web/src/i18n/en.json new file mode 100644 index 0000000..77860e3 --- /dev/null +++ b/apps/web/src/i18n/en.json @@ -0,0 +1,39 @@ +{ + "nav": { + "employees": "Employees", + "departments": "Departments", + "contracts": "Contracts", + "evaluation": "Evaluation", + "medical": "Medical control" + }, + "employees": { + "title": "Employees", + "add": "Add employee", + "search": "Search by name, surname, IDNP...", + "columns": { + "idnp": "IDNP", + "name": "Name", + "position": "Position", + "department": "Department", + "status": "Status", + "phone": "Phone" + }, + "status": { + "activ": "Active", + "concediat": "Dismissed", + "suspendat": "Suspended" + } + }, + "actions": { + "save": "Save", + "cancel": "Cancel", + "edit": "Edit", + "delete": "Delete", + "view": "View" + }, + "validation": { + "idnp_invalid": "Invalid IDNP (13 digits, wrong check digit)", + "required": "Required field", + "email_invalid": "Invalid email address" + } +} diff --git a/apps/web/src/i18n/i18n.ts b/apps/web/src/i18n/i18n.ts new file mode 100644 index 0000000..52b17c6 --- /dev/null +++ b/apps/web/src/i18n/i18n.ts @@ -0,0 +1,14 @@ +import i18n from 'i18next'; +import { initReactI18next } from 'react-i18next'; +import ro from './ro.json'; + +i18n + .use(initReactI18next) + .init({ + resources: { ro: { translation: ro } }, + lng: 'ro', + fallbackLng: 'ro', + interpolation: { escapeValue: false }, + }); + +export default i18n; diff --git a/apps/web/src/i18n/ro.json b/apps/web/src/i18n/ro.json new file mode 100644 index 0000000..e49b68e --- /dev/null +++ b/apps/web/src/i18n/ro.json @@ -0,0 +1,44 @@ +{ + "nav": { + "dashboard": "Dashboard", + "employees": "Angajați", + "departments": "Departamente", + "contracts": "Contracte", + "inventory": "Inventar", + "evaluation": "Evaluare", + "risk_cards": "Carduri de risc", + "medical": "Control medical", + "inbox": "Inbox medic" + }, + "employees": { + "title": "Angajați", + "add": "Adaugă angajat", + "search": "Caută după nume, prenume, IDNP...", + "columns": { + "idnp": "IDNP", + "name": "Nume", + "position": "Funcție", + "department": "Departament", + "status": "Statut", + "phone": "Telefon" + }, + "status": { + "all": "Toate statutele", + "activ": "Activ", + "concediat": "Concediat", + "suspendat": "Suspendat" + } + }, + "actions": { + "save": "Salvează", + "cancel": "Anulează", + "edit": "Editează", + "delete": "Șterge", + "view": "Vizualizează" + }, + "validation": { + "idnp_invalid": "IDNP invalid (13 cifre, cifra de control incorectă)", + "required": "Câmp obligatoriu", + "email_invalid": "Adresă email invalidă" + } +} diff --git a/apps/web/src/i18n/ru.json b/apps/web/src/i18n/ru.json new file mode 100644 index 0000000..9078b36 --- /dev/null +++ b/apps/web/src/i18n/ru.json @@ -0,0 +1,39 @@ +{ + "nav": { + "employees": "Сотрудники", + "departments": "Отделы", + "contracts": "Контракты", + "evaluation": "Оценка", + "medical": "Медконтроль" + }, + "employees": { + "title": "Сотрудники", + "add": "Добавить сотрудника", + "search": "Поиск по имени, фамилии, IDNP...", + "columns": { + "idnp": "IDNP", + "name": "Фамилия", + "position": "Должность", + "department": "Отдел", + "status": "Статус", + "phone": "Телефон" + }, + "status": { + "activ": "Активен", + "concediat": "Уволен", + "suspendat": "Приостановлен" + } + }, + "actions": { + "save": "Сохранить", + "cancel": "Отмена", + "edit": "Редактировать", + "delete": "Удалить", + "view": "Просмотр" + }, + "validation": { + "idnp_invalid": "Некорректный IDNP (13 цифр, неверная контрольная цифра)", + "required": "Обязательное поле", + "email_invalid": "Некорректный email" + } +} diff --git a/apps/web/src/main.tsx b/apps/web/src/main.tsx new file mode 100644 index 0000000..7715dd8 --- /dev/null +++ b/apps/web/src/main.tsx @@ -0,0 +1,97 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import { MantineProvider, createTheme } from '@mantine/core'; +import { Notifications } from '@mantine/notifications'; +import { ModalsProvider } from '@mantine/modals'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import '@mantine/core/styles.css'; +import '@mantine/notifications/styles.css'; +import '@mantine/dates/styles.css'; +import './styles/global.css'; +import './i18n/i18n'; +import App from './App'; + +// Medpark brand teal shades for Mantine (centered on #008286) +const medparkTeal: [string, string, string, string, string, string, string, string, string, string] = [ + '#e6f4f4', // 0 — lightest + '#ccebeb', + '#99d7d8', + '#66c3c5', + '#33afb2', + '#009b9f', + '#008286', // 6 ← brand primary + '#006b6e', + '#005457', + '#003d3f', // 9 — darkest +]; + +const theme = createTheme({ + fontFamily: "'Montserrat', Arial, sans-serif", + fontFamilyMonospace: "'Courier New', monospace", + primaryColor: 'medpark', + colors: { medpark: medparkTeal }, + defaultRadius: 'sm', + fontSizes: { + xs: '0.8rem', + sm: '0.9375rem', // 15px — base for most UI text + md: '1.0625rem', // 17px + lg: '1.1875rem', // 19px + xl: '1.3125rem', // 21px + }, + lineHeights: { + xs: '1.5', + sm: '1.55', + md: '1.6', + lg: '1.65', + xl: '1.7', + }, + components: { + Button: { + defaultProps: { radius: 'sm', size: 'sm' }, + styles: { root: { fontFamily: "'Montserrat', Arial, sans-serif", fontWeight: 500 } }, + }, + TextInput: { + defaultProps: { size: 'sm' }, + styles: { input: { fontFamily: "'Montserrat', Arial, sans-serif" } }, + }, + Select: { + defaultProps: { size: 'sm' }, + styles: { input: { fontFamily: "'Montserrat', Arial, sans-serif" } }, + }, + DateInput: { + defaultProps: { size: 'sm' }, + }, + Table: { + styles: { table: { fontFamily: "'Montserrat', Arial, sans-serif", fontSize: '0.9rem' } }, + }, + Badge: { + styles: { root: { fontFamily: "'Montserrat', Arial, sans-serif", fontWeight: 500 } }, + }, + Tabs: { + styles: { tab: { fontFamily: "'Montserrat', Arial, sans-serif", fontWeight: 500, fontSize: '0.9rem' } }, + }, + Modal: { + defaultProps: { size: 'lg' }, + }, + Drawer: { + defaultProps: { size: 'xl' }, + }, + }, +}); + +const queryClient = new QueryClient({ + defaultOptions: { queries: { staleTime: 30_000, retry: 1 } }, +}); + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + + + + + + + + , +); diff --git a/apps/web/src/pages/auth/LoginPage.tsx b/apps/web/src/pages/auth/LoginPage.tsx new file mode 100644 index 0000000..029f6e7 --- /dev/null +++ b/apps/web/src/pages/auth/LoginPage.tsx @@ -0,0 +1,154 @@ +import { useState } from 'react'; +import { Box, Button, Select, Text, TextInput, Alert, Group, Stack } from '@mantine/core'; +import { apiClient } from '../../api/client'; + +const font = "'Montserrat', Arial, sans-serif"; +const teal = '#008286'; + +const ROLES = [ + { value: 'hr_admin', label: 'HR Admin' }, + { value: 'hr_specialist', label: 'HR Specialist' }, + { value: 'nursing_director', label: 'Nursing Director' }, + { value: 'quality_auditor', label: 'Quality Auditor' }, + { value: 'manager', label: 'Manager' }, + { value: 'medic_familie', label: 'Medic Familie' }, + { value: 'employee', label: 'Angajat' }, +]; + +interface Props { + onLogin: () => void; +} + +export function LoginPage({ onLogin }: Props) { + const [username, setUsername] = useState('admin'); + const [role, setRole] = useState('hr_admin'); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + const handleLogin = async () => { + setLoading(true); + setError(null); + try { + const res = await apiClient.post<{ token: string; username: string; role: string }>( + '/auth/dev-login', + { username, role }, + ); + localStorage.setItem('kc_token', res.data.token); + localStorage.setItem('kc_username', res.data.username); + localStorage.setItem('kc_role', res.data.role); + onLogin(); + } catch { + setError('Nu s-a putut autentifica. Verificați că API-ul rulează.'); + } finally { + setLoading(false); + } + }; + + return ( + + + {/* Logo */} + + Medpark International Hospital { (e.target as HTMLImageElement).style.display = 'none'; }} + /> + + HRM — Sistem de management HR + + + Mod dezvoltare — autentificare locală + + + + {error && ( + + {error} + + )} + + + setUsername(e.currentTarget.value)} + placeholder="admin" + styles={{ + label: { fontFamily: font, fontWeight: 500, fontSize: '0.8rem' }, + input: { fontFamily: font }, + }} + /> + + + + + + {isLoading ? ( +
+ ) : ( + + + + + Nr. CIM + Angajat + Funcția + Secția + Perioadă + Data angajării + Data terminării + Salarizare + Status + + + + {(data?.items ?? []).map((c) => ( + openRow(c)} + style={{ cursor: 'pointer', borderBottom: '1px solid #e9ecef' }} + > + {c.nrCim} + + { e.stopPropagation(); navigate(`/employees/${c.employee.id}`); }} + style={{ fontFamily: font, color: teal, fontWeight: 500 }} + > + {c.employee.nume} {c.employee.prenume} + + + {c.functiaOrganigrama ?? '—'} + {c.department.name} + {PERIOD_LABEL[c.perioada]} + {dayjs(c.dataAngajarii).format('DD.MM.YYYY')} + + {c.dataTerminarii + ? dayjs(c.dataTerminarii).format('DD.MM.YYYY') + : c.dataDemisiei + ? dayjs(c.dataDemisiei).format('DD.MM.YYYY') + : '—'} + + {c.tipSalarizare ?? '—'} + + + {STATUS_LABEL[c.status]} + + + + ))} + {(data?.items ?? []).length === 0 && ( + + + + Niciun contract găsit. + + + + )} + +
+
+ )} + + setAddModalOpen(false)} + title={Selectează angajatul} + size="md" + > + setEditVal(e.target.value)} + onKeyDown={(e) => { + if (e.key === 'Enter') commitRename(); + if (e.key === 'Escape') cancelRename(); + }} + onBlur={commitRename} + style={{ + flex: 1, + fontFamily: font, + fontWeight: level === 0 ? 500 : 300, + fontSize: '0.875rem', + color: charcoal, + border: `1px solid ${teal}`, + borderRadius: 4, + padding: '2px 8px', + outline: 'none', + background: '#fff', + }} + /> + ) : ( + + {dept.name} + + )} + + {/* Actions */} + {editing ? ( + + { e.preventDefault(); commitRename(); }}> + + + { e.preventDefault(); cancelRename(); }}> + + + + ) : ( + + {!dragMode && ( + + { e.stopPropagation(); setEditVal(dept.name); setEditing(true); }} + > + + + + )} + + { e.stopPropagation(); onDelete(dept); }} + > + + + + + )} + + + {expanded && dept.children?.map((child) => ( + + ))} + + ); +} + +// ── Page ───────────────────────────────────────────────────── + +interface DeptFormValues { name: string; parentId?: string } + +function findName(depts: Department[], id: string): string { + for (const d of depts) { + if (d.id === id) return d.name; + const hit = findName(d.children ?? [], id); + if (hit) return hit; + } + return ''; +} + +// Returns the parentId of the node with given id (null = root-level) +function findParentId(depts: Department[], id: string, parentId: string | null = null): string | null | undefined { + for (const d of depts) { + if (d.id === id) return parentId; + const hit = findParentId(d.children ?? [], id, d.id); + if (hit !== undefined) return hit; + } + return undefined; +} + +export function DepartmentsPage() { + const qc = useQueryClient(); + const [modalOpen, setModalOpen] = useState(false); + const [deleteTarget, setDeleteTarget] = useState(null); + const [dragMode, setDragMode] = useState(false); + const [activeId, setActiveId] = useState(null); + const [moveHistory, setMoveHistory] = useState<{ id: string; name: string; prevParentId: string | null }[]>([]); + + const { data, isLoading } = useQuery({ + queryKey: ['departments'], + queryFn: () => apiClient.get('/departments').then((r) => r.data), + }); + + const { data: flat } = useQuery({ + queryKey: ['ref', 'departments-flat'], + queryFn: () => apiClient.get('/reference/departments/flat').then((r) => r.data), + staleTime: 300_000, + }); + + const { register, handleSubmit, reset, setValue, watch, formState: { isSubmitting } } = useForm(); + + const createMutation = useMutation({ + mutationFn: (d: DeptFormValues) => + apiClient.post('/departments', { ...d, parentId: d.parentId || undefined }), + onSuccess: () => { + void qc.invalidateQueries({ queryKey: ['departments'] }); + void qc.invalidateQueries({ queryKey: ['ref', 'departments-flat'] }); + notifications.show({ color: 'medpark', title: 'Creat', message: 'Departament adăugat.' }); + setModalOpen(false); + reset(); + }, + onError: () => notifications.show({ color: 'red', title: 'Eroare', message: 'Nu s-a putut crea.' }), + }); + + const deleteMutation = useMutation({ + mutationFn: (id: string) => apiClient.delete(`/departments/${id}`), + onSuccess: () => { + void qc.invalidateQueries({ queryKey: ['departments'] }); + void qc.invalidateQueries({ queryKey: ['ref', 'departments-flat'] }); + notifications.show({ color: 'medpark', title: 'Șters', message: 'Departamentul a fost șters.' }); + setDeleteTarget(null); + }, + onError: (err: unknown) => { + const msg = (err as { response?: { data?: { message?: string } } })?.response?.data?.message ?? 'Eroare la ștergere.'; + notifications.show({ color: 'red', title: 'Eroare', message: msg }); + setDeleteTarget(null); + }, + }); + + const moveMutation = useMutation({ + mutationFn: ({ id, parentId }: { id: string; parentId: string | null }) => + apiClient.patch(`/departments/${id}`, { parentId }), + onSuccess: () => { + void qc.invalidateQueries({ queryKey: ['departments'] }); + void qc.invalidateQueries({ queryKey: ['ref', 'departments-flat'] }); + notifications.show({ color: 'medpark', title: 'Reorganizat', message: 'Structura departamentelor actualizată.' }); + }, + onError: (err: unknown) => { + const msg = (err as { response?: { data?: { message?: string } } })?.response?.data?.message ?? 'Eroare la mutare.'; + notifications.show({ color: 'red', title: 'Eroare', message: msg }); + }, + }); + + const undoMutation = useMutation({ + mutationFn: ({ id, prevParentId }: { id: string; prevParentId: string | null }) => + apiClient.patch(`/departments/${id}`, { parentId: prevParentId }), + onSuccess: () => { + void qc.invalidateQueries({ queryKey: ['departments'] }); + void qc.invalidateQueries({ queryKey: ['ref', 'departments-flat'] }); + setMoveHistory((h) => h.slice(0, -1)); + notifications.show({ color: 'gray', title: 'Anulat', message: 'Ultima mutare a fost anulată.' }); + }, + onError: (err: unknown) => { + const msg = (err as { response?: { data?: { message?: string } } })?.response?.data?.message ?? 'Eroare la anulare.'; + notifications.show({ color: 'red', title: 'Eroare', message: msg }); + }, + }); + + return ( + + + + + Departamente + + + + + {dragMode && moveHistory.length > 0 && ( + + + + )} + + {!dragMode && ( + + )} + + + + setActiveId(active.id as string)} + onDragEnd={({ active, over }) => { + setActiveId(null); + if (!over || active.id === over.id) return; + const id = active.id as string; + const prevParentId = findParentId(data ?? [], id) ?? null; + const name = findName(data ?? [], id); + setMoveHistory((h) => [...h, { id, name, prevParentId }]); + moveMutation.mutate({ + id, + parentId: over.id === '__root__' ? null : over.id as string, + }); + }} + onDragCancel={() => setActiveId(null)} + > + + {/* Header */} +
+ + Denumire + +
+ + {isLoading ? ( +
+ ) : ( +
+ + {!data?.length ? ( +
+ Niciun departament. Adăugați primul departament. +
+ ) : ( + data.map((dept) => ( + + )) + )} +
+ )} +
+ + + {activeId && data ? ( +
+ + {findName(data, activeId)} +
+ ) : null} +
+
+ + {/* Create Modal */} + { setModalOpen(false); reset(); }} + title={Departament nou} + styles={{ header: { borderBottom: `2px solid ${teal}` } }} + > + + +
createMutation.mutate(d))}> + + + { setStatus(v); setPage(1); }} + style={{ width: 160 }} + styles={{ + input: { fontFamily: font, fontWeight: 300, fontSize: '0.875rem', color: charcoal }, + }} + /> + + + + {/* ── Table ── */} + + {isLoading ? ( +
+ ) : ( + <> + + + + + {[ + t('employees.columns.idnp'), + t('employees.columns.name'), + t('employees.columns.position'), + t('employees.columns.department'), + t('employees.columns.phone'), + t('employees.columns.status'), + '', + ].map((col, i) => ( + + ))} + + + + {!data?.items.length ? ( + + + + ) : ( + data.items.map((emp, idx) => { + const st = STATUS_CONFIG[emp.status]; + return ( + navigate(`/employees/${emp.id}`)} + style={{ + background: idx % 2 === 0 ? '#ffffff' : '#fafafa', + cursor: 'pointer', + transition: 'background 0.1s', + }} + onMouseEnter={(e) => + ((e.currentTarget as HTMLElement).style.background = '#e6f4f4') + } + onMouseLeave={(e) => + ((e.currentTarget as HTMLElement).style.background = + idx % 2 === 0 ? '#ffffff' : '#fafafa') + } + > + + + + + + + + + ); + }) + )} + +
+ {col} +
+ Niciun angajat găsit +
+ {emp.idnp} + + {emp.nume} {emp.prenume} + + {emp.contracts[0]?.functiaOrganigrama ?? ( + + )} + + {emp.contracts[0]?.department.name ?? ( + + )} + + {emp.telefonPersonal} + + + {st.label_ro} + + + + + → + + +
+
+ + {/* Footer: count + pagination */} + {(data?.total ?? 0) > 0 && ( + + + {data?.total} angajați total + + {totalPages > 1 && ( + + )} + + )} + + )} +
+ + setDrawerOpen(false)} + /> +
+ ); +} diff --git a/apps/web/src/pages/employees/components/EmployeeDrawer.tsx b/apps/web/src/pages/employees/components/EmployeeDrawer.tsx new file mode 100644 index 0000000..8b4e25a --- /dev/null +++ b/apps/web/src/pages/employees/components/EmployeeDrawer.tsx @@ -0,0 +1,367 @@ +import { useEffect } from 'react'; +import { + Drawer, TextInput, Select, SegmentedControl, Button, + Group, Stack, Box, Text, Loader, LoadingOverlay, +} from '@mantine/core'; +import { DateInput } from '@mantine/dates'; +import { useForm, Controller } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { useQuery, useQueryClient, useMutation } from '@tanstack/react-query'; +import { notifications } from '@mantine/notifications'; +import dayjs from 'dayjs'; +import { apiClient } from '../../../api/client'; +import type { Employee, DisabilityGrade } from '../../../api/types'; +import { employeeSchema, type EmployeeFormValues } from '../employeeSchema'; + +const font = "'Montserrat', Arial, sans-serif"; +const teal = '#008286'; +const charcoal = '#58595b'; + +function idnpValid(v: string): boolean { + if (!/^\d{13}$/.test(v)) return false; + const weights = [7, 3, 1, 7, 3, 1, 7, 3, 1, 7, 3, 1]; + const sum = weights.reduce((acc, w, i) => acc + w * parseInt(v[i], 10), 0); + return (sum % 10) === parseInt(v[12], 10); +} + +function SectionLabel({ children }: { children: string }) { + return ( + + + {children} + + + ); +} + +interface Props { + opened: boolean; + onClose: () => void; + employeeId?: string; +} + +export function EmployeeDrawer({ opened, onClose, employeeId }: Props) { + const isEdit = !!employeeId; + const qc = useQueryClient(); + + const { data: existing, isLoading: loadingExisting } = useQuery({ + queryKey: ['employee', employeeId], + queryFn: () => apiClient.get(`/employees/${employeeId}`).then((r) => r.data), + enabled: isEdit && opened, + staleTime: 30_000, + }); + + const { data: grades } = useQuery({ + queryKey: ['ref', 'disability-grades'], + queryFn: () => apiClient.get('/reference/disability-grades').then((r) => r.data), + staleTime: 300_000, + }); + + const { data: employeesRes } = useQuery({ + queryKey: ['employees', 'list-all'], + queryFn: () => apiClient.get<{items: Employee[]}>('/employees?limit=1000').then((r) => r.data), + staleTime: 60_000, + }); + const allEmployees = employeesRes?.items ?? []; + + const { + register, + handleSubmit, + control, + watch, + reset, + formState: { errors, isSubmitting }, + } = useForm({ resolver: zodResolver(employeeSchema) }); + + useEffect(() => { + if (existing && isEdit) { + reset({ + idnp: existing.idnp, + nume: existing.nume, + prenume: existing.prenume, + patronimic: existing.patronimic ?? '', + numeAnterior: existing.numeAnterior ?? '', + dataNasterii: existing.dataNasterii.slice(0, 10), + domiciliu: existing.domiciliu, + adresaReala: existing.adresaReala ?? '', + telefonPersonal: existing.telefonPersonal, + telefonServiciu: existing.telefonServiciu ?? '', + emailPersonal: existing.emailPersonal ?? '', + emailCorporativ: existing.emailCorporativ ?? '', + sex: existing.sex, + stareCivila: existing.stareCivila ?? undefined, + codCpas: existing.codCpas ?? '', + gradDizabilitateId: existing.gradDizabilitateId ?? '', + recomandareInternaId: existing.recomandareInternaId ?? '', + titluStiintific: existing.titluStiintific ?? undefined, + titluUniversitar: existing.titluUniversitar ?? '', + status: existing.status ?? 'activ', + }); + } else if (!isEdit) { + reset({}); + } + }, [existing, isEdit, reset]); + + const mutation = useMutation({ + mutationFn: (data: EmployeeFormValues) => { + const payload = { + ...data, + gradDizabilitateId: data.gradDizabilitateId || undefined, + recomandareInternaId: data.recomandareInternaId || undefined, + telefonServiciu: data.telefonServiciu || undefined, + emailPersonal: data.emailPersonal || undefined, + emailCorporativ: data.emailCorporativ || undefined, + patronimic: data.patronimic || undefined, + numeAnterior: data.numeAnterior || undefined, + adresaReala: data.adresaReala || undefined, + codCpas: data.codCpas || undefined, + titluUniversitar: data.titluUniversitar || undefined, + }; + return isEdit + ? apiClient.patch(`/employees/${employeeId}`, payload) + : apiClient.post('/employees', payload); + }, + onSuccess: () => { + void qc.invalidateQueries({ queryKey: ['employees'] }); + void qc.invalidateQueries({ queryKey: ['dashboard-stats'] }); + if (isEdit) void qc.invalidateQueries({ queryKey: ['employee', employeeId] }); + notifications.show({ + color: 'medpark', + title: isEdit ? 'Salvat' : 'Angajat creat', + message: isEdit ? 'Modificările au fost salvate.' : 'Angajatul a fost adăugat.', + }); + onClose(); + }, + onError: (err: unknown) => { + const msg = (err as { response?: { data?: { message?: string } } })?.response?.data?.message ?? 'Eroare necunoscută'; + notifications.show({ color: 'red', title: 'Eroare', message: msg }); + }, + }); + + const idnp = watch('idnp') ?? ''; + const idnpOk = idnpValid(idnp); + const idnpIndicator = idnp.length === 0 ? null : idnpOk ? '✓' : '✗'; + + return ( + + {isEdit ? 'Editează angajat' : 'Angajat nou'} + + } + position="right" + size="xl" + styles={{ + header: { borderBottom: `2px solid ${teal}` }, + body: { padding: '0 24px 24px' }, + }} + > + {isEdit && loadingExisting ? ( + + + + ) : ( + + + + mutation.mutate(d))}> + {/* ── Date personale ── */} + Date personale + + + {idnpIndicator} + + ) + } + styles={{ input: { fontFamily: "'Courier New', monospace", letterSpacing: '0.1em' }, label: { fontFamily: font, fontWeight: 500, fontSize: '0.8rem' } }} + {...register('idnp')} + /> + + + + + + + + + + + + + ( + field.onChange(d ? dayjs(d).format('YYYY-MM-DD') : '')} + error={errors.dataNasterii?.message} + styles={{ label: { fontFamily: font, fontWeight: 500, fontSize: '0.8rem' } }} + /> + )} + /> + + Sex * + ( + + )} + /> + {errors.sex && {errors.sex.message}} + + + + ( + e.id !== employeeId) // prevent self-recommendation visually + .map((e) => ({ value: e.id, label: `${e.nume} ${e.prenume} (${e.idnp})` }))} + value={field.value || null} + onChange={(v) => field.onChange(v ?? '')} + styles={{ label: { fontFamily: font, fontWeight: 500, fontSize: '0.8rem' } }} + /> + )} + /> + + ( + field.onChange(v ?? undefined)} + styles={{ label: { fontFamily: font, fontWeight: 500, fontSize: '0.8rem' } }} + /> + )} + /> + + + + {isEdit && ( + ( + field.onChange(v)} + searchable + clearable + nothingFoundMessage="Niciun articol disponibil" + styles={selectStyles} + /> + )} /> + ( + field.onChange(v)} + searchable + clearable + nothingFoundMessage="Niciun articol disponibil" + styles={selectStyles} + /> + )} /> + ( + field.onChange(v)} + searchable + clearable + nothingFoundMessage="Niciun aparat disponibil" + styles={selectStyles} + /> + )} /> + + + + + + + + + + + +
+ + ); +} diff --git a/apps/web/src/pages/employees/drawers/ContractDrawer.tsx b/apps/web/src/pages/employees/drawers/ContractDrawer.tsx new file mode 100644 index 0000000..34ee417 --- /dev/null +++ b/apps/web/src/pages/employees/drawers/ContractDrawer.tsx @@ -0,0 +1,426 @@ +import { useEffect, useState } from 'react'; +import { + Drawer, Button, Group, Stack, Text, LoadingOverlay, Box, + Select, TextInput, NumberInput, SegmentedControl, Divider, ActionIcon, Textarea, +} from '@mantine/core'; +import { DateInput } from '@mantine/dates'; +import { useForm, Controller } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { z } from 'zod'; +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { notifications } from '@mantine/notifications'; +import dayjs from 'dayjs'; +import { apiClient } from '../../../api/client'; +import type { EmploymentContract, Department, WorkSchedule } from '../../../api/types'; + +const font = "'Montserrat', Arial, sans-serif"; +const teal = '#008286'; +const charcoal = '#58595b'; + +const schema = z.object({ + nrCim: z.string().min(1, 'Câmp obligatoriu'), + categorie: z.enum(['principal', 'secundar']), + dataSemnarii: z.string().regex(/^\d{4}-\d{2}-\d{2}$/), + dataAngajarii: z.string().regex(/^\d{4}-\d{2}-\d{2}$/), + dataDemisiei: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional().or(z.literal('')), + perioada: z.enum(['determinata', 'nedeterminata', 'replasare_temporara']), + dataTerminarii: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional().or(z.literal('')), + functiaClasificator: z.string().optional(), + codFunctie: z.string().optional(), + functiaOrganigrama: z.string().optional(), + tipCim: z.enum(['de_baza', 'cumul']), + departmentId: z.string().uuid('Selectați departamentul'), + regimMunca: z.string().optional(), + tipSalarizare: z.enum(['fix', 'pe_ore', 'in_acord']).optional(), + workScheduleId: z.string().uuid().optional().or(z.literal('')), + zileConcediu: z.number().int().min(0).max(365).optional(), +}); +type FormValues = z.infer; + +interface ServiceCatRow { categorieId: string; tipRemunerare: 'tarif' | 'procent'; sumaNeta: string; procent: string } +const emptyRow = (): ServiceCatRow => ({ categorieId: '', tipRemunerare: 'tarif', sumaNeta: '', procent: '' }); + +interface ClausaRow { titlu: string; text: string } +const emptyClausaRow = (): ClausaRow => ({ titlu: '', text: '' }); + +interface Props { + employeeId: string; + record?: EmploymentContract; + opened: boolean; + onClose: () => void; +} + +export function ContractDrawer({ employeeId, record, opened, onClose }: Props) { + const isEdit = !!record; + const qc = useQueryClient(); + const [serviceCats, setServiceCats] = useState([]); + const [clauze, setClauze] = useState([]); + + const { data: depts } = useQuery({ + queryKey: ['ref', 'departments-flat'], + queryFn: () => apiClient.get('/reference/departments/flat').then((r) => r.data), + staleTime: 300_000, + }); + + const { data: schedules } = useQuery({ + queryKey: ['ref', 'work-schedules'], + queryFn: () => apiClient.get('/reference/work-schedules').then((r) => r.data), + staleTime: 300_000, + }); + + const { handleSubmit, control, reset, watch, formState: { errors, isSubmitting } } = + useForm({ resolver: zodResolver(schema) }); + + const perioadaValue = watch('perioada'); + + useEffect(() => { + if (record) { + reset({ + nrCim: record.nrCim, + categorie: record.categorie, + dataSemnarii: record.dataSemnarii.slice(0, 10), + dataAngajarii: record.dataAngajarii.slice(0, 10), + dataDemisiei: record.dataDemisiei?.slice(0, 10) ?? '', + perioada: record.perioada, + dataTerminarii: record.dataTerminarii?.slice(0, 10) ?? '', + functiaClasificator: record.functiaClasificator ?? '', + codFunctie: record.codFunctie ?? '', + functiaOrganigrama: record.functiaOrganigrama ?? '', + tipCim: record.tipCim, + departmentId: record.departmentId, + regimMunca: record.regimMunca ?? '', + tipSalarizare: record.tipSalarizare ?? undefined, + workScheduleId: record.workSchedule?.id ?? '', + zileConcediu: (record.salarizareDetails as { zileConcediu?: number } | null)?.zileConcediu ?? undefined, + }); + setServiceCats(record.categoriiServicii.map((c) => ({ + categorieId: c.categorieId, + tipRemunerare: c.tipRemunerare as 'tarif' | 'procent', + sumaNeta: c.sumaNeta?.toString() ?? '', + procent: c.procent?.toString() ?? '', + }))); + const cl = (record.clausaAditionala as { clauze?: ClausaRow[] } | null)?.clauze; + setClauze(Array.isArray(cl) ? cl.map(c => ({ titlu: c.titlu ?? '', text: c.text ?? '' })) : []); + } else { + reset({ + categorie: 'principal', + tipCim: 'de_baza', + perioada: 'nedeterminata', + dataSemnarii: dayjs().format('YYYY-MM-DD'), + dataAngajarii: dayjs().format('YYYY-MM-DD'), + }); + setServiceCats([]); + setClauze([]); + } + }, [record, opened, reset]); + + const mutation = useMutation({ + mutationFn: (data: FormValues) => { + const { zileConcediu, ...rest } = data; + const payload = { + ...rest, + dataDemisiei: data.dataDemisiei || undefined, + dataTerminarii: data.dataTerminarii || undefined, + functiaClasificator: data.functiaClasificator || undefined, + codFunctie: data.codFunctie || undefined, + functiaOrganigrama: data.functiaOrganigrama || undefined, + regimMunca: data.regimMunca || undefined, + workScheduleId: data.workScheduleId || undefined, + salarizareDetails: zileConcediu != null ? { zileConcediu } : undefined, + clausaAditionala: clauze.filter(c => c.titlu.trim() || c.text.trim()).length + ? { clauze: clauze.filter(c => c.titlu.trim() || c.text.trim()) } + : undefined, + categoriiServicii: serviceCats + .filter((r) => r.categorieId) + .map((r) => ({ + categorieId: r.categorieId, + tipRemunerare: r.tipRemunerare, + sumaNeta: r.tipRemunerare === 'tarif' && r.sumaNeta ? Number(r.sumaNeta) : undefined, + procent: r.tipRemunerare === 'procent' && r.procent ? Number(r.procent) : undefined, + })), + }; + return isEdit + ? apiClient.patch(`/employees/${employeeId}/contracts/${record.id}`, payload) + : apiClient.post(`/employees/${employeeId}/contracts`, payload); + }, + onSuccess: () => { + void qc.invalidateQueries({ queryKey: ['employee', employeeId] }); + void qc.invalidateQueries({ queryKey: ['contracts'] }); + notifications.show({ color: 'medpark', title: 'Salvat', message: isEdit ? 'Contract actualizat.' : 'Contract creat.' }); + onClose(); + }, + onError: (err: unknown) => { + const msg = (err as { response?: { data?: { message?: string } } })?.response?.data?.message ?? 'Eroare'; + notifications.show({ color: 'red', title: 'Eroare', message: msg }); + }, + }); + + const deptData = (depts ?? []).map((d) => ({ value: d.id, label: d.name })); + const scheduleData = [ + { value: '', label: '— Fără program fix —' }, + ...(schedules ?? []).map((s) => ({ value: s.id, label: s.name })), + ]; + + const section = (label: string) => ( + {label}} + labelPosition="left" my={12} + /> + ); + + return ( + {isEdit ? 'Editare contract' : 'Contract nou'}} + styles={{ header: { borderBottom: `2px solid ${teal}` } }} + > + + + +
mutation.mutate(d))}> + + + {section('Date contract')} + + ( + + )} /> + ( + + Categorie * + + + )} /> + + + + ( + + Tip CIM * + + + )} /> + ( + field.onChange(v ?? '')} + error={errors.departmentId?.message} + styles={{ label: { fontFamily: font, fontWeight: 500, fontSize: '0.8rem' } }} /> + )} /> + + + ( + + )} /> + ( + + )} /> + + + + ( + + )} /> + ( + + )} /> + + + {section('Salarizare și program')} + + ( + field.onChange(v ?? '')} + styles={{ label: { fontFamily: font, fontWeight: 500, fontSize: '0.8rem' } }} /> + )} /> + + ( + field.onChange(typeof v === 'number' ? v : undefined)} + error={errors.zileConcediu?.message} + styles={{ label: { fontFamily: font, fontWeight: 500, fontSize: '0.8rem' }, description: { fontFamily: font } }} + style={{ maxWidth: 240 }} + /> + )} /> + + {section('Categorii servicii')} + + {serviceCats.map((row, i) => ( + + setServiceCats((prev) => prev.map((r, j) => j === i ? { ...r, categorieId: e.currentTarget.value } : r))} + style={{ flex: 2 }} + styles={{ label: { fontFamily: font, fontWeight: 500, fontSize: '0.8rem' } }} + /> +