BUG-017: Декомпозиция

Баг 1: GET 404 → пустой объект

User Service (erp-user-service)

  • LegalDetailsService.get(): вместо 404 при отсутствии записи возвращать 200 с пустым объектом (все поля null)
    // Было: .orElseThrow(() -> new ApiException("LEGAL_DETAILS_NOT_FOUND", ...))
    // Стало: .orElse(EmployeeLegalDetails.builder().employeeId(employeeId).build())

Баг 2: PUT 500 — несовпадение полей

Admin Web (erp-admin/web)

  • ViewPage.tsx вкладка “Юридические детали”: исправить имена полей формы:
    • passport → разделить на passport_series (4 цифры) + passport_number (6 цифр) — два отдельных input
    • driver_licensedriver_license_number
    • inn — оставить, но добавить валидацию: ровно 12 цифр (физлицо)
    • Добавить поле driver_license_expiry (date input) — отсутствует на форме

Shared Types (erp-admin/shared)

  • Проверить что UpsertLegalDetailsRequest в shared types совпадает с бэкенд DTO (passport_series, passport_number, driver_license_number, driver_license_expiry, inn, snils)

Тестирование

  • GET legal-details для сотрудника без данных → 200 с null полями
  • PUT legal-details с правильными полями → 200, данные сохранены
  • GET после PUT → 200 с заполненными полями
  • PUT с невалидным inn (10 цифр) → 400 VALIDATION_ERROR
  • PUT с невалидным snils → 400 VALIDATION_ERROR