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 @@
import{r as i,g as K,c as T,j as a,e as E,P as b,H as w,d as g,at as U,a9 as V,aa as H,i as I}from"./index-oAPVDf-r.js";import{c as N,R as z,I as $}from"./index-DGH-oZ97.js";import{C as W}from"./circle-030W8joh.js";var C="Radio",[X,P]=E(C),[Y,J]=X(C),_=i.forwardRef((r,t)=>{const{__scopeRadio:e,name:c,checked:o=!1,required:s,disabled:d,value:f="on",onCheck:u,form:R,...v}=r,[p,m]=i.useState(null),n=w(t,x=>m(x)),l=i.useRef(!1),y=p?R||!!p.closest("form"):!0;return a.jsxs(Y,{scope:e,checked:o,disabled:d,children:[a.jsx(b.button,{type:"button",role:"radio","aria-checked":o,"data-state":S(o),"data-disabled":d?"":void 0,disabled:d,value:f,...v,ref:n,onClick:g(r.onClick,x=>{o||u==null||u(),y&&(l.current=x.isPropagationStopped(),l.current||x.stopPropagation())})}),y&&a.jsx(k,{control:p,bubbles:!l.current,name:c,value:f,checked:o,required:s,disabled:d,form:R,style:{transform:"translateX(-100%)"}})]})});_.displayName=C;var j="RadioIndicator",G=i.forwardRef((r,t)=>{const{__scopeRadio:e,forceMount:c,...o}=r,s=J(j,e);return a.jsx(U,{present:c||s.checked,children:a.jsx(b.span,{"data-state":S(s.checked),"data-disabled":s.disabled?"":void 0,...o,ref:t})})});G.displayName=j;var Q="RadioBubbleInput",k=i.forwardRef(({__scopeRadio:r,control:t,checked:e,bubbles:c=!0,...o},s)=>{const d=i.useRef(null),f=w(d,s),u=V(e),R=H(t);return i.useEffect(()=>{const v=d.current;if(!v)return;const p=window.HTMLInputElement.prototype,n=Object.getOwnPropertyDescriptor(p,"checked").set;if(u!==e&&n){const l=new Event("click",{bubbles:c});n.call(v,e),v.dispatchEvent(l)}},[u,e,c]),a.jsx(b.input,{type:"radio","aria-hidden":!0,defaultChecked:e,...o,tabIndex:-1,ref:f,style:{...o.style,...R,position:"absolute",pointerEvents:"none",opacity:0,margin:0}})});k.displayName=Q;function S(r){return r?"checked":"unchecked"}var Z=["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"],h="RadioGroup",[ee]=E(h,[N,P]),A=N(),D=P(),[oe,re]=ee(h),M=i.forwardRef((r,t)=>{const{__scopeRadioGroup:e,name:c,defaultValue:o,value:s,required:d=!1,disabled:f=!1,orientation:u,dir:R,loop:v=!0,onValueChange:p,...m}=r,n=A(e),l=K(R),[y,x]=T({prop:s,defaultProp:o??null,onChange:p,caller:h});return a.jsx(oe,{scope:e,name:c,required:d,disabled:f,value:y,onValueChange:x,children:a.jsx(z,{asChild:!0,...n,orientation:u,dir:l,loop:v,children:a.jsx(b.div,{role:"radiogroup","aria-required":d,"aria-orientation":u,"data-disabled":f?"":void 0,dir:l,...m,ref:t})})})});M.displayName=h;var O="RadioGroupItem",F=i.forwardRef((r,t)=>{const{__scopeRadioGroup:e,disabled:c,...o}=r,s=re(O,e),d=s.disabled||c,f=A(e),u=D(e),R=i.useRef(null),v=w(t,R),p=s.value===o.value,m=i.useRef(!1);return i.useEffect(()=>{const n=y=>{Z.includes(y.key)&&(m.current=!0)},l=()=>m.current=!1;return document.addEventListener("keydown",n),document.addEventListener("keyup",l),()=>{document.removeEventListener("keydown",n),document.removeEventListener("keyup",l)}},[]),a.jsx($,{asChild:!0,...f,focusable:!d,active:p,children:a.jsx(_,{disabled:d,required:s.required,checked:p,...u,...o,name:s.name,ref:v,onCheck:()=>s.onValueChange(o.value),onKeyDown:g(n=>{n.key==="Enter"&&n.preventDefault()}),onFocus:g(o.onFocus,()=>{var n;m.current&&((n=R.current)==null||n.click())})})})});F.displayName=O;var ae="RadioGroupIndicator",L=i.forwardRef((r,t)=>{const{__scopeRadioGroup:e,...c}=r,o=D(e);return a.jsx(G,{...o,...c,ref:t})});L.displayName=ae;var q=M,B=F,te=L;const se=i.forwardRef(({className:r,...t},e)=>a.jsx(q,{className:I("grid gap-2",r),...t,ref:e}));se.displayName=q.displayName;const ne=i.forwardRef(({className:r,...t},e)=>a.jsx(B,{ref:e,className:I("aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",r),...t,children:a.jsx(te,{className:"flex items-center justify-center",children:a.jsx(W,{className:"h-2.5 w-2.5 fill-current text-current"})})}));ne.displayName=B.displayName;export{se as R,ne as a};