Add CRM order queue: live sync, view modal, receipt tabs, delete

Wires the CRM (exoCRM GetOrders) into the dashboard as a locally
persisted order queue instead of the previous static mockup:

- CrmClient Protocol + ExoCrmClient/StubCrmClient for the CRM's
  signed JSON-RPC API
- Order model + migration, synced from CRM on each queue view;
  soft-deleted orders stay hidden across re-syncs
- GET/DELETE /api/v1/orders with "no receipt"/"receipt issued" tabs
  (the latter is empty until Checkbox fiscalization lands)
- Dashboard: real order list, item-detail modal, tab switcher,
  one-click delete

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-22 21:39:03 +03:00
co-authored by Claude Sonnet 5
parent ef55689295
commit f4072be451
30 changed files with 1326 additions and 82 deletions
+75
View File
@@ -85,6 +85,32 @@
cursor: not-allowed;
}
.orders-tabs {
display: flex;
gap: 8px;
}
.orders-tab {
border: 1px solid var(--color-border);
background: var(--color-surface);
color: var(--color-text-muted);
border-radius: 999px;
padding: 6px 16px;
font-size: 13px;
font-weight: 600;
cursor: pointer;
}
.orders-tab:hover {
color: var(--color-text);
}
.orders-tab--active {
background: var(--color-primary);
border-color: var(--color-primary);
color: #fff;
}
.orders-filterbar {
display: flex;
align-items: center;
@@ -198,6 +224,11 @@
color: #166534;
}
.orders-status--approved {
background: #dcfce7;
color: #166534;
}
@media (prefers-color-scheme: dark) {
.orders-status--processing {
background: rgba(217, 119, 6, 0.18);
@@ -213,6 +244,50 @@
background: rgba(22, 163, 74, 0.18);
color: #86efac;
}
.orders-status--approved {
background: rgba(22, 163, 74, 0.18);
color: #86efac;
}
}
.orders-actions-cell {
display: flex;
gap: 8px;
}
.orders-view-btn {
border: 1px solid var(--color-border);
background: var(--color-surface);
color: var(--color-text);
border-radius: 6px;
padding: 6px 12px;
font-size: 13px;
cursor: pointer;
}
.orders-view-btn:hover {
border-color: var(--color-primary);
color: var(--color-primary);
}
.orders-delete-btn {
border: 1px solid var(--color-border);
background: var(--color-surface);
color: #b91c1c;
border-radius: 6px;
padding: 6px 12px;
font-size: 13px;
cursor: pointer;
}
.orders-delete-btn:hover:not(:disabled) {
border-color: #b91c1c;
}
.orders-delete-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.orders-receipt-btn {