AndreyandClaude Opus 4.8 19ad83ff0a ✨ feat(sales): legacy orders migration command (ADR-HUB-0025 §11)
Phase 3 миграции legacy orders → домен продаж. Команда import_legacy_orders,
по умолчанию DRY-RUN (только отчёт по классам, без записи).

- classify_legacy_order: external / manual / pending_ambiguous; PENDING не
  считается продажей и требует ручного решения (§11.2)
- import_legacy_order: подтверждённый Order (PAID/REFUNDED/CANCELLED) →
  Sale + SaleEvent(sale.legacy_imported), sales_source=null, идемпотентно по
  metadata.legacy_order_id; OrderItem → line_items_snapshot; fulfillment_status
  и legacy id — только в metadata; contact/conversation сохраняются
- provision_product_sales_source: создать SalesSource(PRODUCT_API) и скопировать
  действующий Product.ingest_token_hash (§11 шаг 2-3) — без генерации/ротации
- флаги --apply / --provision-sources / --product; команда НИКОГДА не удаляет
  legacy, не отключает legacy write API и не ротирует token (гейты §11 11-12)
- 7 тестов (dry-run, import, идемпотентность, refund→0, PENDING-skip, provision)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 09:51:35 +03:00
2026-07-12 01:17:17 +03:00
2026-06-26 15:10:36 +03:00
2026-06-17 18:14:16 +03:00
2026-06-17 18:41:41 +03:00
2026-07-12 01:17:17 +03:00
2026-06-26 15:10:36 +03:00

Edevs Hub

Canonical implementation workspace for hub.edevs.tech.

Local start

Copy-Item .env.example .env
.\scripts\start.ps1

The local compose stack contains:

  • Django ASGI backend and background worker;
  • PostgreSQL;
  • Redis;
  • Internal Hub UI;
  • Web Chat UI;
  • local Nginx reverse proxy.

No production secrets are stored in the repository.

Default local URLs:

  • Internal Hub UI: http://localhost:5173
  • Django admin: http://localhost:8010/admin/
  • Web Chat: http://localhost:5175
  • Backend API: http://localhost:8010/api/v1

Local accounts (TOTP disabled). These credentials are fixed — do not change them:

  • OWNER — owner@edevs.tech / Owner-Local-2026
  • OPERATOR — a.kotova@edevs.tech / Operator-Local-2026

Bootstrap the organization and both accounts:

docker compose run --rm backend python manage.py bootstrap_owner --email owner@edevs.tech --password Owner-Local-2026 --name "Иван Петров"

Tests

All suites run in Docker, so no manual environment is required — the test runners auto-detect themselves and relax production hardening (secret-key fail-fast, SSL redirect, throttling) for the duration of the run.

Run everything (backend tests, frontend unit tests, typechecks):

.\scripts\check.ps1

Individual suites:

# Backend (pytest + pytest-django)
docker compose run --rm backend pytest

# Frontend unit tests (vitest)
docker compose run --rm internal-ui npm run test

# End-to-end (Playwright, internal-ui) — auto-starts the dev server
npx playwright install chromium   # one-time
npx playwright test --project=internal-ui

Backend pytest configuration lives in apps/backend/pytest.ini (it must sit next to manage.py so it is also visible inside the backend container).

Languages
Python 54.4%
TypeScript 35.6%
CSS 8.2%
Shell 0.8%
JavaScript 0.6%
Other 0.3%