#!/usr/bin/env bash set -Eeuo pipefail ROOT="${1:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}" cd "$ROOT" checks=0 ok() { checks=$((checks+1)); echo "OK $1"; } fail() { echo "FAIL $1"; exit 1; } [[ "$(node -p "require('./api-v3/package.json').version")" == "0.19.6-4" ]] || fail 'API 0.19.6-4' ok 'API 0.19.6-4' [[ "$(node -p "require('./web-v2/package.json').version")" == "0.19.6-4" ]] || fail 'WEB 0.19.6-4' ok 'WEB 0.19.6-4' grep -Fq "API_PHASE = 'D5.6.4'" api-v3/src/version.ts || fail 'fase API' ok 'fase API D5.6.4' grep -Fq "Fase D5.6.4 · Inspecciones simples y combobox buscables" web-v2/src/config/version.ts || fail 'fase WEB' ok 'fase WEB D5.6.4' DTO='api-v3/src/inspection-visits/dto/create-inspection-visit.dto.ts' grep -Fq 'operationalAreaId!' "$DTO" && grep -Fq 'operatorCompanyId!' "$DTO" && grep -Fq 'plannedStartAt!' "$DTO" && grep -Fq 'leadInspectorUserId!' "$DTO" || fail 'DTO mínimo' ! grep -Eq 'code!|title!|plannedEndAt' "$DTO" || fail 'DTO conserva campos eliminados' ok 'creación mínima Área + Operadora + inicio + Inspector' grep -Fq 'pg_advisory_xact_lock' api-v3/src/inspection-visits/inspection-visit-code.ts || fail 'lock código' grep -Fq 'America/Argentina/Mendoza' api-v3/src/inspection-visits/inspection-visit-code.ts || fail 'zona código' grep -Fq 'INS-${year}-${String(sequence).padStart(6, '\''0'\'')}' api-v3/src/inspection-visits/inspection-visit-code.ts || fail 'formato código' ok 'código INS anual automático y transaccional' grep -Fq 'title: code' api-v3/src/inspection-visits/inspection-visits.service.ts || fail 'título interno' grep -Fq 'plannedEndAt: null' api-v3/src/inspection-visits/inspection-visits.service.ts || fail 'fin null' ok 'sin título editable ni fin planificado nuevo' grep -Fq 'leadInspectorUserId: dto.leadInspectorUserId' api-v3/src/inspection-visits/inspection-visits.service.ts || fail 'lead create' grep -Fq 'await this.replaceMemberLinks(' api-v3/src/inspection-visits/inspection-visits.service.ts || fail 'team create' grep -Fq 'generateChecklistInternal(manager, visit, principal.userId)' api-v3/src/inspection-visits/inspection-visits.service.ts || fail 'checklist create' ok 'inspector + equipo + checklist en creación' grep -Fq "@RequirePermissions('inspections.manage', 'inspections.assign')" api-v3/src/inspection-visits/inspection-visits.controller.ts || fail 'permisos create' ok 'creación requiere planificación y asignación' ! grep -Fq 'plannedEndAt' api-v3/src/inspection-verifications/dto/plan-verification-visit.dto.ts || fail 'fin verificación DTO' grep -Fq 'nextInspectionVisitCode(manager, plannedStartAt)' api-v3/src/inspection-verifications/inspection-verifications.service.ts || fail 'código verificación' ok 'verificaciones usan misma numeración y sólo inicio' grep -Fq 'CREACIÓN RÁPIDA' web-v2/src/pages/InspectionVisitEditorPage.tsx || fail 'creación rápida UI' grep -Fq 'Fecha y hora de inicio' web-v2/src/pages/InspectionVisitEditorPage.tsx || fail 'inicio UI' grep -Fq 'Buscar Inspector…' web-v2/src/pages/InspectionVisitEditorPage.tsx || fail 'inspector buscable' ! grep -Fq 'Fin previsto' web-v2/src/pages/InspectionVisitEditorPage.tsx || fail 'fin UI' ! grep -Fq 'Título' web-v2/src/pages/InspectionVisitEditorPage.tsx || fail 'título UI' ok 'formulario rápido de Inspección' grep -Fq 'searchable-select-search' web-v2/src/styles.css || fail 'estilos combobox' test -f web-v2/src/components/SearchableSelect.tsx || fail 'componente combobox' ok 'componente de combobox buscable' if grep -R '/dev/null; then echo 'Quedaron selects nativos:' grep -R '= 59 )) || fail 'cantidad combobox migrados' ok "$COUNT usos de SearchableSelect" if find api-v3/src/database/migrations -maxdepth 1 -type f -iname '*d5-6-4*' | grep -q .; then fail 'migración inesperada'; fi ok 'sin migración D5.6.4' echo echo "D5.6.4 checks: $checks/$checks OK"