feat: add daily manual price review workflow
This commit is contained in:
@@ -5,7 +5,9 @@
|
||||
ARR2.0 accepts Opera XML plus a separate Booking Tour Code/`โรงแรม` workbook and owns both deterministic processing
|
||||
lifecycles. It writes immutable private
|
||||
objects, runs the frozen processor locally, independently validates the complete artifacts, and atomically commits
|
||||
accepted facts to PostgreSQL. Downstream analytics and report programs read committed facts.
|
||||
accepted facts to PostgreSQL. A pure `PRICE_UNMATCHED` result instead enters an authenticated, auditable manual-price
|
||||
review state and cannot create Finance facts until the original XML is replayed with a frozen canonical manifest.
|
||||
Downstream analytics and report programs read committed facts.
|
||||
Successful daily commits also create a durable outbox event. A separate worker derives the affected month and watermark
|
||||
from committed `ARRIVAL` facts, publishes a validated workbook, and records metadata-only report state in PostgreSQL.
|
||||
|
||||
@@ -14,11 +16,11 @@ from committed `ARRIVAL` facts, publishes a validated workbook, and records meta
|
||||
| Component | Responsibility |
|
||||
|---|---|
|
||||
| `arr_web.auth` / authenticated `SessionLedger` | Environment-owned operator credentials, bounded login attempts, random server-side sessions, CSRF and logout revocation |
|
||||
| `arr_web.programmatic` | Terminal upload orchestration and safe public error mapping |
|
||||
| `arr_web.programmatic` | XML upload plus synchronous frozen-review final replay orchestration and safe public error mapping |
|
||||
| `arr_processing.local` / `arr_processing.policy` | Isolated frozen processor execution and approved version/rule identity |
|
||||
| `arr_storage` | Immutable staged/committed OSS workflow; all object ACLs private |
|
||||
| `arr_ingestion.validation` | Strict delivery/result/structured validation plus independent daily validation |
|
||||
| `arr_ingestion.postgres` | Job lifecycle, artifact registration, atomic Finance version commit and outbox |
|
||||
| `arr_ingestion.validation` | Strict v3/v4 delivery/result/structured validation plus independent daily/review-manifest replay |
|
||||
| `arr_ingestion.postgres` | Job/review lifecycle, artifact registration, atomic final Finance version commit and outbox |
|
||||
| `booking_ingestion.excel` | Bounded Tour Code/`โรงแรม` extraction, latest-row/cancellation semantics and room-item normalization |
|
||||
| `booking_ingestion.excel_review_postgres` | Durable editable draft state and zero-pending atomic current-source activation |
|
||||
| `arr_web.booking_uploads` | Private Booking workbook upload, draft review orchestration and privacy-minimized source summaries |
|
||||
@@ -37,6 +39,8 @@ from committed `ARRIVAL` facts, publishes a validated workbook, and records meta
|
||||
- Operator credentials come only from runtime `ARR_WEB_USERNAME` / `ARR_WEB_PASSWORD`; the application fails closed when either is absent. Authenticated mutations also require the per-session CSRF token.
|
||||
- Processor exit code and JSON status must agree; output paths are confined to an isolated temporary directory.
|
||||
- Validation completes before the database transaction; any transaction failure leaves no partial active version.
|
||||
- `review_required` is valid only for a non-empty error set entirely composed of `PRICE_UNMATCHED`. It records neither a Finance version nor an `arr.processing_failed`/monthly event; a final manual value is limited to the verified missing key and is entered as a non-negative integer (including `0`) before exact `.00` storage/manifest normalization.
|
||||
- All review mutations use the authenticated session plus CSRF protection and optimistic revision checks. Finalization is idempotent; infrastructure failures retain the frozen manifest for retry, while deterministic replay failures close the case and job as failed.
|
||||
- Booking uploads create review drafts first. Only an explicit activation with no retained pending items can atomically
|
||||
create immutable Booking facts and switch `booking.current_source_batch`; an open draft blocks company-report creation.
|
||||
- Only recognized transient PostgreSQL concurrency errors receive bounded transaction retries.
|
||||
@@ -53,4 +57,4 @@ from committed `ARRIVAL` facts, publishes a validated workbook, and records meta
|
||||
|
||||
## Last Updated
|
||||
|
||||
2026-08-03
|
||||
2026-08-06
|
||||
|
||||
Reference in New Issue
Block a user