API для зіставлення бронювань з страховими випадками (claims matching).
Цей проект реалізує NestJS API з одним ендпоінтом POST /match, який приймає два списки:
- bookings: список бронювань
- claims: список страхових випадків
API здійснює метчинг (зіставлення) кожного бронювання з найбільш відповідним кейсом.
- patient — Ідентифікатор пацієнта має збігатися
- bookingDate в claim і reservationDate в booking — дата (не час) має бути однакова
- Співпадіння test і medicalServiceCode (через testsMap)
- Співпадіння точного часу бронювання (години та хвилини)
- Співпадіння страхової компанії (insurance)
- Метч може бути тільки 1 до 1
- Якщо є декілька потенційних метчів, обирається той, який має найбільше співпадінь (найвищий score)
- Якщо є метч, але не всі поля співпадають, в об'єкті метчу додається поле
mismatchз переліком полів, які не співпали
- Базовий score (обов'язкові критерії виконані): 100 балів
- Співпадіння тесту: +50 балів
- Співпадіння часу: +30 балів
- Співпадіння страхової компанії: +20 балів
Максимальний score: 200 балів
src/
├── main.ts # Точка входу застосунку
├── app.module.ts # Головний модуль
└── matching/ # Модуль матчингу
├── matching.module.ts # Модуль
├── matching.controller.ts # Контролер з ендпоінтом
├── matching.service.ts # Сервіс з логікою матчингу
├── matching.service.spec.ts # Unit тести
└── dto/ # Data Transfer Objects
├── booking.dto.ts
├── claim.dto.ts
├── match-request.dto.ts
└── match-response.dto.ts
# Встановлення залежностей
npm install# Development режим
npm run start:dev
# Production режим
npm run build
npm run start:prodСервер запуститься на http://localhost:3000
# Unit тести
npm run test
# E2E тести
npm run test:e2e
# Покриття тестами
npm run test:covURL: http://localhost:3000/match
Request Body:
{
"bookings": [
{
"id": "booking_1",
"patient": "patient_1",
"test": "test_1",
"insurance": "AON",
"reservationDate": "2025-05-16T11:00:00.000Z"
}
],
"claims": [
{
"id": "claim_1",
"medicalServiceCode": "medical_service_1",
"bookingDate": "2025-05-15T10:33:00.000Z",
"insurance": "AON",
"patient": "patient_1"
}
]
}Response:
[
{
"claim": "claim_10",
"booking": "booking_9",
"mismatch": ["time", "test"]
}
]curl -X POST http://localhost:3000/match \
-H "Content-Type: application/json" \
-d '{
"bookings": [
{
"id": "booking_9",
"patient": "patient_8",
"test": "test_1",
"insurance": "FASCHIM",
"reservationDate": "2025-05-15T10:30:00.000Z"
}
],
"claims": [
{
"id": "claim_10",
"medicalServiceCode": "medical_service_2",
"bookingDate": "2025-05-15T00:00:00.000Z",
"insurance": "FASCHIM",
"patient": "patient_8"
}
]
}'Повний набір тестових даних знаходиться в файлі test-data/full-test-data.json
curl -X POST http://localhost:3000/match \
-H "Content-Type: application/json" \
-d @test-data/full-test-data.jsonКожен об'єкт у відповіді містить:
claim(string) - ID страхового випадкуbooking(string) - ID бронюванняmismatch(string[], optional) - масив полів, які не співпали
Можливі значення в mismatch:
"test"- тести не співпадають"time"- час не співпадає"insurance"- страхові компанії не співпадають
- NestJS 10.3.0 - framework
- TypeScript 5.3.3
- class-validator - валідація DTO
- class-transformer - трансформація об'єктів
- Jest - тестування
- У одного пацієнта може бути декілька бронювань та декілька клеймів в один день
- В базі завжди claims менше ніж bookings
- Мап тестів (testsMap) зашитий в сервіс для співставлення тестів між системами
MIT