feat(boc): Complete Business Operations Center v1.0

- Go backend API with full CRUD for all modules (CRM, Sales, Finance, HR, Legal, Marketing, Support, Purchase, Inventory, Projects, Automation, Analytics)
- Rust analytics service with parallel report generation
- C runtime with POSIX shared memory IPC
- PostgreSQL schema with 30+ tables, full migrations
- Redis cache, sessions, pub/sub
- Kafka event streaming with Zookeeper
- WebSocket hub for real-time updates
- Automation engine with cron jobs, workflows, event triggers
- JWT authentication, multi-tenant from start
- Docker Compose with all services
- Nginx reverse proxy with rate limiting
- Integration tests passing
- Feature gap analysis against Fortnox/Odoo/Visma

Refs: BOC-001
This commit is contained in:
Bernt
2026-07-12 12:41:35 +00:00
parent 4789a7fb48
commit 58ca4e68db
26666 changed files with 575891 additions and 2074516 deletions
+15
View File
@@ -0,0 +1,15 @@
FROM node:18-alpine
WORKDIR /app
# Installera dependencies
RUN apk add --no-cache curl
COPY package*.json ./
RUN npm install
# Kopiera källkod
COPY . .
# Kör cron-jobb
CMD ["node", "payout-cron.js"]
+13
View File
@@ -0,0 +1,13 @@
{
"name": "quixzoom-payout-cron",
"version": "1.0.0",
"description": "Weekly payout cron for quiXzoom",
"main": "payout-cron.js",
"scripts": {
"start": "node payout-cron.js"
},
"dependencies": {
"pg": "^8.11.0",
"axios": "^1.4.0"
}
}
+85
View File
@@ -0,0 +1,85 @@
// ============================================================
// PAYOUT CRON — Veckovis utbetalning
// ============================================================
// Kör varje måndag 09:00 UTC
// Hämtar alla zoomers med payout-schema och utför utbetalning
const { Pool } = require('pg');
const axios = require('axios');
const pool = new Pool({
connectionString: process.env.DATABASE_URL
});
const API_BASE = process.env.API_BASE || 'http://localhost:8080';
async function executeWeeklyPayouts() {
console.log('💸 Startar veckovis payout...');
console.log(`📅 ${new Date().toISOString()}`);
try {
// Hämta dagens dag (1 = Måndag)
const today = new Date().getDay();
if (today !== 1) {
console.log('📅 Idag är inte måndag. Avslutar.');
return;
}
// Hämta alla aktiva payout-scheman för idag
const schedules = await pool.query(
`SELECT ps.*, zw.balance_qz_token, zw.stripe_connect_account_id, z.name as zoomer_name
FROM payout_schedules ps
JOIN zoomer_wallets zw ON zw.id = ps.wallet_id
JOIN zoomers z ON z.id = ps.zoomer_id
WHERE ps.day_of_week = $1
AND ps.status = 'active'
AND zw.stripe_connect_status = 'active'
AND zw.balance_qz_token >= ps.minimum_qz_token`,
[today]
);
console.log(`📊 Hittade ${schedules.rows.length} zoomers för payout`);
let successCount = 0;
let failCount = 0;
for (const schedule of schedules.rows) {
try {
console.log(`\n💸 Behandlar payout för ${schedule.zoomer_name}...`);
console.log(` Saldo: ${schedule.balance_qz_token} QZ TOKEN`);
// Anropa API för att utföra payout
const response = await axios.post(`${API_BASE}/api/v1/payouts/execute`, {
zoomer_id: schedule.zoomer_id
});
if (response.data.success) {
console.log(` ✅ Payout utförd: $${response.data.results[0]?.amount_usd}`);
successCount++;
}
} catch (error) {
console.error(` ❌ Payout misslyckades: ${error.message}`);
failCount++;
}
}
console.log('\n📊 Payout-sammanfattning:');
console.log(` Lyckade: ${successCount}`);
console.log(` Misslyckade: ${failCount}`);
console.log(` Totalt: ${schedules.rows.length}`);
} catch (error) {
console.error('❌ Kritiskt fel vid payout:', error);
process.exit(1);
} finally {
await pool.end();
}
}
// Kör om detta är huvudscript
if (require.main === module) {
executeWeeklyPayouts();
}
module.exports = { executeWeeklyPayouts };