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
@@ -0,0 +1,18 @@
// File generated from our OpenAPI spec
import { StripeResource } from '../../StripeResource.js';
const stripeMethod = StripeResource.method;
export const CreditReversals = StripeResource.extend({
create: stripeMethod({
method: 'POST',
fullPath: '/v1/treasury/credit_reversals',
}),
retrieve: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/credit_reversals/{credit_reversal}',
}),
list: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/credit_reversals',
methodType: 'list',
}),
});
@@ -0,0 +1,18 @@
// File generated from our OpenAPI spec
import { StripeResource } from '../../StripeResource.js';
const stripeMethod = StripeResource.method;
export const DebitReversals = StripeResource.extend({
create: stripeMethod({
method: 'POST',
fullPath: '/v1/treasury/debit_reversals',
}),
retrieve: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/debit_reversals/{debit_reversal}',
}),
list: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/debit_reversals',
methodType: 'list',
}),
});
@@ -0,0 +1,30 @@
// File generated from our OpenAPI spec
import { StripeResource } from '../../StripeResource.js';
const stripeMethod = StripeResource.method;
export const FinancialAccounts = StripeResource.extend({
create: stripeMethod({
method: 'POST',
fullPath: '/v1/treasury/financial_accounts',
}),
retrieve: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/financial_accounts/{financial_account}',
}),
update: stripeMethod({
method: 'POST',
fullPath: '/v1/treasury/financial_accounts/{financial_account}',
}),
list: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/financial_accounts',
methodType: 'list',
}),
retrieveFeatures: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/financial_accounts/{financial_account}/features',
}),
updateFeatures: stripeMethod({
method: 'POST',
fullPath: '/v1/treasury/financial_accounts/{financial_account}/features',
}),
});
@@ -0,0 +1,22 @@
// File generated from our OpenAPI spec
import { StripeResource } from '../../StripeResource.js';
const stripeMethod = StripeResource.method;
export const InboundTransfers = StripeResource.extend({
create: stripeMethod({
method: 'POST',
fullPath: '/v1/treasury/inbound_transfers',
}),
retrieve: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/inbound_transfers/{id}',
}),
list: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/inbound_transfers',
methodType: 'list',
}),
cancel: stripeMethod({
method: 'POST',
fullPath: '/v1/treasury/inbound_transfers/{inbound_transfer}/cancel',
}),
});
@@ -0,0 +1,22 @@
// File generated from our OpenAPI spec
import { StripeResource } from '../../StripeResource.js';
const stripeMethod = StripeResource.method;
export const OutboundPayments = StripeResource.extend({
create: stripeMethod({
method: 'POST',
fullPath: '/v1/treasury/outbound_payments',
}),
retrieve: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/outbound_payments/{id}',
}),
list: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/outbound_payments',
methodType: 'list',
}),
cancel: stripeMethod({
method: 'POST',
fullPath: '/v1/treasury/outbound_payments/{id}/cancel',
}),
});
@@ -0,0 +1,22 @@
// File generated from our OpenAPI spec
import { StripeResource } from '../../StripeResource.js';
const stripeMethod = StripeResource.method;
export const OutboundTransfers = StripeResource.extend({
create: stripeMethod({
method: 'POST',
fullPath: '/v1/treasury/outbound_transfers',
}),
retrieve: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/outbound_transfers/{outbound_transfer}',
}),
list: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/outbound_transfers',
methodType: 'list',
}),
cancel: stripeMethod({
method: 'POST',
fullPath: '/v1/treasury/outbound_transfers/{outbound_transfer}/cancel',
}),
});
@@ -0,0 +1,14 @@
// File generated from our OpenAPI spec
import { StripeResource } from '../../StripeResource.js';
const stripeMethod = StripeResource.method;
export const ReceivedCredits = StripeResource.extend({
retrieve: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/received_credits/{id}',
}),
list: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/received_credits',
methodType: 'list',
}),
});
@@ -0,0 +1,14 @@
// File generated from our OpenAPI spec
import { StripeResource } from '../../StripeResource.js';
const stripeMethod = StripeResource.method;
export const ReceivedDebits = StripeResource.extend({
retrieve: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/received_debits/{id}',
}),
list: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/received_debits',
methodType: 'list',
}),
});
@@ -0,0 +1,14 @@
// File generated from our OpenAPI spec
import { StripeResource } from '../../StripeResource.js';
const stripeMethod = StripeResource.method;
export const TransactionEntries = StripeResource.extend({
retrieve: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/transaction_entries/{id}',
}),
list: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/transaction_entries',
methodType: 'list',
}),
});
@@ -0,0 +1,14 @@
// File generated from our OpenAPI spec
import { StripeResource } from '../../StripeResource.js';
const stripeMethod = StripeResource.method;
export const Transactions = StripeResource.extend({
retrieve: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/transactions/{id}',
}),
list: stripeMethod({
method: 'GET',
fullPath: '/v1/treasury/transactions',
methodType: 'list',
}),
});