147 lines
4.4 KiB
Markdown
147 lines
4.4 KiB
Markdown
|
|
# 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
|