[CL-HOTELSYNC-REVENUE-PULL-VALIDATE] Валидация totalRevenue в GET /revenue pull #859

Closed
andrei wants to merge 0 commits from feature/claude-hotelsync-revenue-pull-validate into master
Owner

Что сделано

Sibling-фикс к PR #858. GET /revenue (admin-pull из hotel-sync API) тоже писал upstream totalRevenue напрямую в финансовую propertyObject.annualRevenue без проверки. Добавлен тот же guard Number.isFinite(item.totalRevenue) && >= 0 перед persist; невалидное → warn-лог + updated:false.

Зачем

PR #858 закрыл inbound-webhook вектор, но /revenue (pull из HOTEL_API/api/sync/bookings/stats) остался незащищён. Источник trusted-internal (risk ниже webhook), но buggy upstream-ответ (NaN/Infinity/negative) так же портит investor yield-проекции. Консистентность обоих write-sites annualRevenue.

План тестирования

  • Регресс-тест hotel-sync.test.ts с fetch-mock: valid 98000 → пишет; negative/NaN → skip. RED до фикса, GREEN после.
  • vitest 16/16 в файле. tsc clean, eslint --max-warnings 0 clean.

Где могу ошибаться

  • Верхний bound не задан (как и в #858).
  • updated:false в ответе на invalid — клиент видит skip, не ошибку; warn-лог фиксирует.
## Что сделано Sibling-фикс к PR #858. `GET /revenue` (admin-pull из hotel-sync API) тоже писал upstream `totalRevenue` напрямую в финансовую `propertyObject.annualRevenue` без проверки. Добавлен тот же guard `Number.isFinite(item.totalRevenue) && >= 0` перед persist; невалидное → warn-лог + `updated:false`. ## Зачем PR #858 закрыл inbound-webhook вектор, но `/revenue` (pull из `HOTEL_API/api/sync/bookings/stats`) остался незащищён. Источник trusted-internal (risk ниже webhook), но buggy upstream-ответ (NaN/Infinity/negative) так же портит investor yield-проекции. Консистентность обоих write-sites `annualRevenue`. ## План тестирования - Регресс-тест `hotel-sync.test.ts` с fetch-mock: valid 98000 → пишет; negative/NaN → skip. RED до фикса, GREEN после. - vitest 16/16 в файле. tsc clean, eslint `--max-warnings 0` clean. ## Где могу ошибаться - Верхний bound не задан (как и в #858). - `updated:false` в ответе на invalid — клиент видит skip, не ошибку; warn-лог фиксирует.
[CL-HOTELSYNC-REVENUE-PULL-VALIDATE] fix(hotel-sync): валидация totalRevenue в GET /revenue pull
Some checks failed
CI / Prisma Migrate Gate (pull_request) Has been cancelled
PR Janitor / janitor (pull_request) Has been cancelled
CI / App (pull_request) Has been cancelled
React Doctor / React Doctor / App (pull_request) Has been cancelled
CI / API (pull_request) Has been cancelled
CI / Secrets Scan (pull_request) Failing after 45h16m36s
CI / Telegram Mini App (pull_request) Failing after 45h18m22s
CI / Contracts (pull_request) Failing after 45h20m30s
CI / Python SDK (pull_request) Failing after 45h21m45s
0e11abb296
Sibling-фикс к PR #858: GET /revenue тоже писал upstream totalRevenue
напрямую в financial-колонку annualRevenue без проверки. Источник —
trusted internal pull (HOTEL_API/api/sync/bookings/stats), risk ниже
inbound-webhook, но buggy upstream-ответ (NaN/Infinity/negative) так же
портит yield-проекции. Тот же guard Number.isFinite && >= 0 + warn-лог
+ updated:false. Регресс-тест с fetch-mock (valid/negative/NaN).
fix(admin-payouts): исправление теста approvePayout и передача twoFactorCode
Some checks failed
Deploy EuropaTech / Production Release Gate (push) Waiting to run
CI / App (pull_request) Failing after 2m35s
CI / API (pull_request) Has been cancelled
CI / Prisma Migrate Gate (pull_request) Has been cancelled
React Doctor / React Doctor / App (pull_request) Has been cancelled
React Doctor / React Doctor / App (push) Has been cancelled
CI / App (push) Failing after 3m2s
Deploy EuropaTech / SEO Health Gate (push) Has been cancelled
Deploy EuropaTech / Deploy API to Hetzner (push) Has been cancelled
Deploy EuropaTech / Deploy Static to Hetzner (push) Has been cancelled
CI / Prisma Migrate Gate (push) Failing after 45h2m18s
CI / Secrets Scan (push) Failing after 45h2m30s
CI / Python SDK (push) Failing after 45h2m59s
CI / Telegram Mini App (push) Failing after 45h3m24s
CI / API (push) Failing after 45h8m0s
CI / Contracts (push) Failing after 45h4m56s
PR Janitor / janitor (pull_request) Failing after 45h9m16s
CI / Secrets Scan (pull_request) Failing after 45h9m58s
CI / Telegram Mini App (pull_request) Failing after 45h10m52s
CI / Contracts (pull_request) Failing after 45h12m24s
CI / Python SDK (pull_request) Failing after 45h15m9s
f41fa54ea6
fix(admin-payouts): устранение eslint-предупреждения no-explicit-any
Some checks failed
CI / App (pull_request) Failing after 14m47s
CI / App (push) Failing after 16m17s
CI / Prisma Migrate Gate (push) Failing after 44h44m42s
CI / Python SDK (push) Failing after 44h45m25s
CI / Telegram Mini App (push) Failing after 44h46m8s
CI / API (push) Failing after 44h52m40s
React Doctor / React Doctor / App (pull_request) Failing after 44h53m48s
PR Janitor / janitor (pull_request) Failing after 44h53m56s
CI / Prisma Migrate Gate (pull_request) Failing after 44h54m7s
CI / Secrets Scan (pull_request) Failing after 44h54m21s
CI / Telegram Mini App (pull_request) Failing after 44h56m5s
CI / Contracts (pull_request) Failing after 44h58m6s
CI / API (pull_request) Failing after 45h1m59s
CI / Secrets Scan (push) Failing after 44h49m40s
CI / Contracts (push) Failing after 44h53m5s
CI / Python SDK (pull_request) Failing after 44h59m18s
Deploy EuropaTech / Production Release Gate (push) Waiting to run
Deploy EuropaTech / SEO Health Gate (push) Waiting to run
Deploy EuropaTech / Deploy API to Hetzner (push) Waiting to run
Deploy EuropaTech / Deploy Static to Hetzner (push) Waiting to run
React Doctor / React Doctor / App (push) Waiting to run
6b49a4f168
Author
Owner

Контент этого PR (commit 0e11abb29, /revenue totalRevenue guard) уже на master — diff vs master пустой. Коммит попал в master-историю через ветку admin-payouts (f41fa54ea построен поверх него). Закрываю как content-merged. Оба hotel-sync fix (webhook #858 + /revenue) подтверждены в master коде.

Контент этого PR (commit 0e11abb29, /revenue totalRevenue guard) уже на master — diff vs master пустой. Коммит попал в master-историю через ветку admin-payouts (f41fa54ea построен поверх него). Закрываю как content-merged. Оба hotel-sync fix (webhook #858 + /revenue) подтверждены в master коде.
andrei closed this pull request 2026-06-24 17:02:14 +00:00
Some checks failed
CI / App (pull_request) Failing after 14m47s
CI / App (push) Failing after 16m17s
CI / Prisma Migrate Gate (push) Failing after 44h44m42s
CI / Python SDK (push) Failing after 44h45m25s
CI / Telegram Mini App (push) Failing after 44h46m8s
CI / API (push) Failing after 44h52m40s
React Doctor / React Doctor / App (pull_request) Failing after 44h53m48s
PR Janitor / janitor (pull_request) Failing after 44h53m56s
CI / Prisma Migrate Gate (pull_request) Failing after 44h54m7s
CI / Secrets Scan (pull_request) Failing after 44h54m21s
CI / Telegram Mini App (pull_request) Failing after 44h56m5s
CI / Contracts (pull_request) Failing after 44h58m6s
CI / API (pull_request) Failing after 45h1m59s
CI / Secrets Scan (push) Failing after 44h49m40s
CI / Contracts (push) Failing after 44h53m5s
CI / Python SDK (pull_request) Failing after 44h59m18s
Deploy EuropaTech / Production Release Gate (push) Waiting to run
Deploy EuropaTech / SEO Health Gate (push) Waiting to run
Deploy EuropaTech / Deploy API to Hetzner (push) Waiting to run
Deploy EuropaTech / Deploy Static to Hetzner (push) Waiting to run
React Doctor / React Doctor / App (push) Waiting to run

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
europa-tech-srl/europatech!859
No description provided.