BOC v1.0: RS256 auth, Ledger integration, Prometheus metrics, CI/CD, backup
This commit is contained in:
+146
@@ -0,0 +1,146 @@
|
||||
# REXO Task: quiXzoom + LandveX Transaction System
|
||||
|
||||
## Overview
|
||||
Build automated transaction monitoring and customer self-service for quiXzoom (DE) and LandveX (SE/TX).
|
||||
|
||||
## Part 1: quiXzoom Event Streaming
|
||||
|
||||
### Requirements
|
||||
- Log EVERY transaction event to Kafka topic `quixzoom.events`
|
||||
- Events: user lifecycle, job lifecycle, payments, payouts, QZ tokens
|
||||
- Full searchability via Elasticsearch
|
||||
- Real-time alerting for anomalies
|
||||
|
||||
### Database Schema (PostgreSQL)
|
||||
```sql
|
||||
-- Events table (immutable)
|
||||
CREATE TABLE qz_events (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
event_type TEXT NOT NULL, -- user.registered, job.matched, payment.received, etc
|
||||
payload JSONB NOT NULL,
|
||||
user_id UUID,
|
||||
job_id UUID,
|
||||
company_id UUID,
|
||||
amount DECIMAL(15,2),
|
||||
currency TEXT,
|
||||
status TEXT, -- success, failed, pending
|
||||
ip_address INET,
|
||||
user_agent TEXT,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_qz_events_type ON qz_events(event_type, created_at DESC);
|
||||
CREATE INDEX idx_qz_events_user ON qz_events(user_id, created_at DESC);
|
||||
CREATE INDEX idx_qz_events_job ON qz_events(job_id);
|
||||
```
|
||||
|
||||
### API Endpoints
|
||||
- `POST /api/v1/events` — ingest event
|
||||
- `GET /api/v1/events/search` — search events (Elasticsearch)
|
||||
- `GET /api/v1/events/:user_id` — user transaction history
|
||||
- `GET /api/v1/events/summary` — aggregated stats
|
||||
|
||||
### Kafka Topics
|
||||
- `quixzoom.events` — all events
|
||||
- `quixzoom.payments` — payment events for ledger
|
||||
- `quixzoom.payouts` — payout events for ledger
|
||||
- `quixzoom.alerts` — anomaly alerts
|
||||
|
||||
## Part 2: LandveX Customer Portal
|
||||
|
||||
### Requirements
|
||||
- Self-service: view contract, invoices, usage
|
||||
- Automatic recurring billing (Stripe)
|
||||
- No manual invoicing — everything is automated
|
||||
|
||||
### Database Schema
|
||||
```sql
|
||||
-- Contracts (auto-generated)
|
||||
CREATE TABLE lv_contracts (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
company_id UUID NOT NULL,
|
||||
plan_type TEXT NOT NULL, -- basic, pro, enterprise
|
||||
start_date DATE NOT NULL,
|
||||
end_date DATE,
|
||||
auto_renew BOOLEAN DEFAULT TRUE,
|
||||
monthly_fee DECIMAL(15,2) NOT NULL,
|
||||
currency TEXT DEFAULT 'SEK',
|
||||
status TEXT DEFAULT 'active',
|
||||
stripe_subscription_id TEXT,
|
||||
metadata JSONB DEFAULT '{}',
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Invoices (auto-generated)
|
||||
CREATE TABLE lv_invoices (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
contract_id UUID REFERENCES lv_contracts(id),
|
||||
invoice_number TEXT NOT NULL,
|
||||
period_start DATE NOT NULL,
|
||||
period_end DATE NOT NULL,
|
||||
amount DECIMAL(15,2) NOT NULL,
|
||||
vat_amount DECIMAL(15,2) NOT NULL,
|
||||
total_amount DECIMAL(15,2) NOT NULL,
|
||||
currency TEXT DEFAULT 'SEK',
|
||||
status TEXT DEFAULT 'draft', -- draft, sent, paid, overdue
|
||||
stripe_invoice_id TEXT,
|
||||
paid_at TIMESTAMPTZ,
|
||||
metadata JSONB DEFAULT '{}',
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Usage tracking
|
||||
CREATE TABLE lv_usage (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
contract_id UUID REFERENCES lv_contracts(id),
|
||||
resource_type TEXT NOT NULL, -- api_calls, storage, users
|
||||
quantity DECIMAL(15,2) NOT NULL,
|
||||
unit TEXT NOT NULL,
|
||||
period DATE NOT NULL,
|
||||
metadata JSONB DEFAULT '{}',
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
```
|
||||
|
||||
### API Endpoints
|
||||
- `GET /api/v1/contract` — view current contract
|
||||
- `GET /api/v1/invoices` — list invoices
|
||||
- `GET /api/v1/invoices/:id/download` — download PDF
|
||||
- `GET /api/v1/usage` — view usage report
|
||||
- `POST /api/v1/upgrade` — upgrade/downgrade plan
|
||||
- `POST /api/v1/cancel` — request cancellation
|
||||
|
||||
### Frontend
|
||||
- Customer dashboard (React/Vue)
|
||||
- Invoice viewer with PDF download
|
||||
- Usage charts (Chart.js)
|
||||
- Stripe payment integration
|
||||
|
||||
## Part 3: Automated Accounting
|
||||
|
||||
### Requirements
|
||||
- Every payment → auto-booked to ledger
|
||||
- Every payout → auto-booked to ledger
|
||||
- VAT calculated per transaction
|
||||
- Employer contributions calculated per payroll
|
||||
|
||||
### Integration Points
|
||||
- quiXzoom payments → BOC ledger (SEK/USD)
|
||||
- LandveX invoices → BOC ledger (SEK)
|
||||
- Payroll → BOC ledger (SEK)
|
||||
- Intercompany → BOC ledger (USD/SEK conversion)
|
||||
|
||||
## Deliverables
|
||||
1. Go backend with Chi router
|
||||
2. PostgreSQL migrations
|
||||
3. Kafka producers/consumers
|
||||
4. Elasticsearch indexing
|
||||
5. React frontend for customer portal
|
||||
6. Stripe integration
|
||||
7. Automated accounting hooks
|
||||
|
||||
## Notes
|
||||
- Use RS256 auth (same as BOC)
|
||||
- Multi-tenant (3 companies)
|
||||
- Currency: SEK for LandveX AB, USD for quiXzoom Inc + Landvex Inc
|
||||
- All code must be production-ready with tests
|
||||
Reference in New Issue
Block a user