Cash live grup:9,612,311 RON · €1,831,335 Native: 2.03M RON + €1.44M EUR + $1 USD
A/R operational NET:+4,404,803 RON · €839,000 After excl. IC + special + closed
A/P operational NET:−932,670 RON · −€177,694 After excl. IC + special + closed
Working capital total:~13.1M RON · €2.5M Cash + AR op − AP op
🆕 What changed 2026-06-06 → 2026-06-07 · Keez SPA full integration
Major upgrade · the cash daily now pulls 8 distinct reports directly from Keez SPA (no manual Excel dependency on these surfaces · supersedes the prior Controlling-maintained workflow). All persisted in hub_tool_data · 30-min cron auto-sync · paste fresh Bearer at /admin/keez-bearer/ once a day.
Closed (✕) · LEXINGTON MANAGEMENT & HOLDING (CIF 38376950 · dizolvată) · 595K AR Advisory + 380K AP BPS · awaits Controller write-off · auto-clears next sync after Keez postare
Advance / pre-posting (💰 ADV) · negative amount on TXN BANK without matching PURCHASES invoice · typically salary advance (LV ASSURANCE -38K · CRACIUN MIHAELA −22K) or vendor pre-paid · timing gap that resolves at posting match
UI surfaces shipped today
Cover tab top panel · 💰 Keez Live Bank Position · per-entity RON/EUR/USD split + Total RON + Total EUR · click view → for per-account IBAN + sync status
AP tab · per-invoice grid (was per-vendor aggregate) · 10 columns · cross-position ⇄ badge · Txn type pill (PURCH/BANK⚠/INIT/VAR) · ★ special · ✕ closed · 💰 advance · 📄 deep-link to Keez invoice
AR tab · mirror of AP · same operational breakdown · 7 columns
Both tabs · 6-card operational breakdown summary cards + EUR equiv per card · bank-feed staleness banner · aging bucket chip-row (≤30 / 30-60 / 60-90 / 90-180 / 180-365 / 365+) · Show all reset
Cash withdrawal tab · 5311 cashbox movements categorized · 5 color cards by category
/admin/keez-bearer/ · paste-Bearer UI · live state · 30-min cron auto-sync · email alert when expired
Live sync architecture
Cron · */30 3-17 * * 1-5 (every 30 min between 06:00-20:00 EEST · Mon-Fri) calls /api/keez-ap-ar-sync-cron · reads stored Bearer · chain-syncs AP+AR
Bearer rotation · 1h TTL · paste once a day at /admin/keez-bearer/ · alert email at 06:30 EEST if expired
Stelian REST whitelist ask · pending (Resend 3c23ae96 · 2026-06-06) · when granted, REST cielreports/xls replaces SPA Bearer for AccountsPayable+Receivable · zero rotation forever
T-080 · Keez AP+AR live sync productization · 30-min cron + admin paste UI shipped today · awaiting Stelian REST whitelist for full auto
T-081 · ANAF CUI closed-company detection · queued · Lexington already manually added to CLOSED_VENDOR_CIFS
What this module is
The Hub-native replacement for the daily cash report formerly maintained in Excel by Controlling (YYYY_MM_DD_Daily Report.xlsx at /01. FINANCE AND CONTROLLING/01. REPORTING/01. DAILY REPORTING/ on SharePoint). Since the post-2026-06-04 cutover the Hub is the source of truth · the legacy XLSX is no longer the operating document.
It aggregates: cash & bank (per IBAN · per entity · per currency) · AR/AP (live from Keez + sibling SP file) · intercompany loans · client cash (with offset rules from Logica input date) · into a consolidated daily view in EUR.
🔒 Confidentiality
Access locked to controlling@cla.com.ro + ionut.zeche@cla.com.ro · only these 2 accounts can open this module
No BI team · no Alina Stratan · no partners@ · no clients · no controlling@ group mailbox access (paper-trail CC on emails OK)
Every write generates an entry in hub_audit_log · all versions of the daily report are preserved
📅 Daily routine
Morning · open this page · check FX bar (BNR rates of the day) · open Money status
If Open Banking live · balances refresh automatically · skip to step 4
If still on manual · go to ⬆ Upload tab · drop today's bank exports (one per bank) · Hub parses + maps to entity via IBAN · Money status updates
Verify AP · Unpaid + AR · Outstanding have refreshed from sibling SP file (auto via cron · manual via the section button)
Check 🩺 Checks & Recon tab · look for any anomaly flags · confirm "EUR conversion - Total" matches expectations
The Hub auto-saves a snapshot · auto-mirrors to SharePoint in /01. FINANCE.../01. REPORTING/01. DAILY REPORTING/YYYY/YYYY_MM/YYYY_MM_DD_Daily Report.xlsx
Glossary · entity codes & account types
Code
Full name
CLA AUDIT
CLA Romania Audit S.R.L.
CLA TC&R
CLA Romania Tax Compliance & Representation S.R.L.
CLA TAX ADVISORY
CLA Romania Tax Advisory S.R.L. (with sub-line TP)
CLA BPS
CLA Romania BPS S.R.L.
CLA CONSULTING
CLA Romania Consulting S.R.L.
CLA ROMANIA
CLA Global Romania S.A. (the consolidating parent)
CLA CORPORATE
CLA Romania Corporate S.R.L. (incl. Translations sub-line)
CLA ER
CLA Romania Employer of Records S.R.L.
CLA BIA
CLA Romania Business Intelligence & Automation S.R.L.
P RESIDENTIAL · MCM · BCI · US
Family-office vehicles · P Residential · Mirus Capital Markets · Benetton Cliff Investments · US = Asociația Uniskyline (Romanian non-profit association, not a US-jurisdiction entity)
Account types (Cash & Bank section)
BT current / BT current secundar · Banca Transilvania main + secondary current accounts (RON · EUR · USD)
Client account - LEI / EUR · client-money pass-through (these subtract from "EUR Total" to give "EUR Total w/o Client")
EUR conversion - Total · all RON / USD balances converted to EUR at BNR fixing of the day · row 17 in Excel · grand total
Client cash · offset logic (from Logica input date sheet)
Prevents double-counting between Transaction details and Client Cash sheets:
Caz 1 · client pays Mirus in advance → Mirus pays taxes for client → Mirus invoices later (refacturare)
Caz 2 · Mirus pays taxes first → invoices client → client pays invoice
When something doesn't match
Open 🩺 Checks & Recon tab · look at the freshness + reconciliation flags first
Compare to the SharePoint mirror XLSX (the Hub writes back to the same daily folder · same naming convention)
Check hub_audit_log · who edited what and when (technical audit · ask Ionut to query if needed)
Roll back · every version is in hub_tool_data · prior states retrievable
Autonomous mode · operating since 2026-06-04
Post-Controlling cutover. Since 2026-06-04 the module runs autonomously without daily operator input from the prior Controlling role. Ionut + controlling@ open the dashboard daily · act only when correlations/analytics flag something needing decision.
What runs automatically every day at 07:00 UTC (10:00 Bucharest):
Glance at Money status · Group cash header (sum of Keez bank_accounts EUR-equivalent) · per-IBAN detail rows where iban_map is known · 🟢 Canonical row always shown for entities without per-IBAN coverage
Check 🩺 Checks & Recon · should be majority OK · FAIL items have remediation hints + driver tables
Check 📊 Analytics · 15 cards · focus on red/amber (cash runway, FX exposure, ICO aging) · click "drivers" for detail
If something needs decision · use ⬇ Excel · 🖨 Print · ✉ Email toolbar buttons
What still needs human input:
Keez Bearer paste · once per session (1h TTL) at /admin/keez-bearer/ · UI header shows live countdown
IBAN mapping expansion · ⚙ IBAN mapping tab · accept auto-suggestions for new IBANs as banks roll over · current coverage ~26% (60+ IBANs unmapped · mostly cash registers + TREZ accounts)
Reviewing flagged anomalies · 1-2 FAIL items per day typical (today: ICO register vs Keez ct.451 + CLA BPS cash runway)
Access: ionut.zeche + controlling@cla.com.ro only. Cron uses CRON_SECRET (server-side) · not user auth · runs regardless of UI access state.
Architecture (Phase 1-4)
Data model · 11 normalized sections in hub_tool_data · entities · accounts · daily_balances · transactions · ap · ar · ico_loans · client_cash · daily_report · correlations · analytics
Open Banking via Keez · cash-daily-keez-balances pulls Balanță class-5 (treasury) + class-451 (intercompany) for all 13 Keez tenants daily · source=keez_balanta confidence=high
2026-05-26 · v0.1 · Hub-native scaffold · 11 tabs · BNR FX + Keez ICO + Summary live · access locked to 2 emails
📅 —Refreshed:—
Loading...
📅 Today's transactions
—loading...
Only transactions dated the same day as the report (top-left date picker). Use this when checking what actually moved today, isolated from the rolling 90-day window of the Transaction details tab.
Transaction details
loading...
Per-transaction view · last 5 working days · sourced from the Power Query Transaction details sheet (1M+ row file · trimmed for Hub storage). Filter by company/bank/date.
Awaiting aux ingest · click "Refresh from XLSX" above
Facturi intercompany deschise (furnizor = entitate de grup CLA) · grupate pe pereche emitent → plătitor, cu brut (+/−) și net. Mai jos: registrul de împrumuturi intercompany (ct.451).
Loading…
Intercompany loans
loading...
Registru împrumuturi intercompany (Lender · Borrower · Amount · Date). Sursa XLSX e goală — împrumuturile reale (multiple) se re-aduc din Keez ct.451 + acordurile din SharePoint (în lucru).
Registru gol — sursa XLSX nu a fost încărcată
Summary · per-entity + consolidated
Computing Total cash + AR · Total payables · Net (EUR) per entity...
Purpose: Reconciles the Money Status "Group total" headline against its building blocks · identifies entities where Keez Open Banking can't see the full cash position (the gap class Ionut called "missing bank statements").
Three Keez columns per entity:
Bank accounts · sum of class 5121 + 5124 in Keez trial balance · pure bank money · what the Money Status banner uses
Liquid full · full class-5 position · bank + cash on hand + accreditive + treasury advances · what Keez calls "liquid assets"
Non-bank class 5 · the delta · treasury items that aren't bank money (LCs, supplier advances, cash, etc.)
Coverage status badge:
COVERED · Keez bank_accounts ≥ 50% of liquid_full · Open Banking sees most of the money
PARTIAL · 10-50% coverage · some money sits in accounts Keez doesn't pull
MISSING BANK STATEMENT · < 10% coverage AND liquid > 100K RON · real money exists outside Keez (action item for Stelian / Open Banking expansion)
DORMANT · < 1K RON total · entity has no meaningful position today
Known holes (from project memory, surfaced as annotations at the bottom): BCI 1M EUR account · BPS/TC&R BRD client-money in 462/419 accounts.
Purpose: 10 automated checks that validate the daily report's internal consistency. Run every morning at 06:30 UTC via cron · also on-demand via "⟳ Re-run correlations". Each check returns OK / WARN / FAIL with concrete remediation hint and per-driver detail.
Status pills:
OK · check passed · no action needed
WARN · threshold breached but not critical · monitor · drill into drivers
FAIL · threshold crossed materially · investigate before partner sign-off
The 10 checks (in order):
bank_real_vs_keez_books · per-entity reconciliation between Money Status (bank-real) and Keez Balanță class-5 (books). FAIL = booking lag >15% · investigate missing entries.
ar_drop_matches_cash_in · when AR for client X drops €Y, expect cash inflow of €Y to entity owning that client. Mismatches surface AR write-offs or collection lag.
ap_drop_matches_cash_out · symmetric to AR drop · AP cleared should match cash outflows to vendors.
ico_register_vs_keez_ct451 · Excel loans register (formal ICO loans) vs Keez ct.451 net (includes operational intercompany invoicing). EXPECTED divergence on operational-invoicing entities (e.g. CLA ROMANIA · ~€1.4M from intercompany operational, not loans). Register tracks formal loans only.
client_cash_caz_offset_balanced · per (entity, client), Caz 1 ins should net to zero with Caz 2 outs. Scope: last 90 days · Caz-inferred buckets only. data-quality flag separates sign-flipped source rows from real reconciliation gaps.
day_delta_equals_net_tx · balance change today should be covered by recorded transactions. Reframed as "visibility ratio" since transactions feed is sparse · <30% coverage = FAIL. Normal sub-100% under current Open Banking scope (comisioane / dobânzi / FX conversions not all recorded as discrete tx).
buffer_covers_pending_tax · BRD buffer balance ≥ 110% of pending tax payments due. Last 60d scope.
fx_isolated_from_real_movement · separates FX revaluation impact from real cash movement (helpful when EUR balances move purely because of RON FX shift).
spv_routes_to_authorized_entity · for each AR invoice, the issuing entity should be in the Latitude SPV-authorized list for that client. WARN threshold = 10%/10ct mismatch. Cross-practice billing is normal (e.g. CLA CORPORATE invoicing while CLA TC&R holds the ANAF authorization) · WARN only fires above threshold.
group_consolidation_integrity · sanity that the 9 operating + 3 family-office + 1 non-profit cluster split adds up · CLA ROMANIA is consolidating parent.
When to act:
FAIL on a check that was OK yesterday · investigate today's drivers · likely a data ingestion gap or a real reconciliation issue
Persistent FAIL across multiple days · process gap rather than data quality · refer to Cover/Manual procedures for documented interpretations · escalate to Ionut if unsure
All OK · partner sign-off ready · no action needed
📡 Source: shared/cash-daily-correlations.js · 10 functions · each returns {check_id, status, detail, drivers, threshold_applied}. Re-run writes to cla_cd_correlations_YYYYMMDD.
No correlation run yet for today · click "Re-run correlations" or wait for the 06:30 UTC cron
📡 Live freshness probes
Running checks...
🏗️ Source Infrastructure
loading...
Per-connector status of the data sources feeding the Hub. Every balance shown above eventually reads from one of these.
Until live bank-API feeds land, all values route through Keez book-side (last-posted closing balance per 5121.03 account) ·
dormant-account entities flatline · the brief's Stale balances (>2d) callout surfaces that.
Bank-feed connectors
Connector
Kind
Status
Coverage
Blocked on · Next step
Loading connector registry…
Per-entity book-side freshness
Entity
Latest balance (RON)
Last book posting
Freshness
Loading entity freshness…
Source: cla_cd_balances_YYYYMMDD (daily snapshot) · freshness derived from source_metadata.keez_invoice_date per IBAN ·
connector registry hardcoded in api/cash-infrastructure-status.js until live-status backing wired.
BT API integration in flight · last escalation Resend ff4840b8 (2026-06-10).
✅ Validation history · Hub vs Controlling format-compare
loading...
Side-by-side cell-by-cell comparison between the Controlling team's Daily Report XLSX and the Hub-generated parallel file. IDENTICAL = 100% cell match · CLOSE_MATCH = ≥95% · DIVERGENT = <80%. Cutover criterion: ≥10 working days at IDENTICAL or CLOSE_MATCH ≥95%.
Click "Last 14 days" above to run format-compare across recent dates · ~15s for 14 days
Each metric carries a decisioning hint — what action this number drives. Vanity charts without decisions don't ship here.
No analytics run yet for today · click "Re-run analytics" or wait for the 06:30 UTC cron
Client cash · pass-through with offset logic
loading...
Client cash pass-through (BRD client · BT partner HERO · etc). Each transaction shows base amount RON + offset column. Offset logic preserves Caz 1 / Caz 2 from "Logica input date": a Cash-in from client is offset by the matching Cash-out to authority (taxes / refacturare), preventing double-count vs Transaction details.
Awaiting aux ingest
⚙ IBAN → entity mapping auto-suggested from last 30d
📖 How to use this tab
Purpose: Maps each bank IBAN to a CLA entity + account type. This is the bridge between raw bank statements (which know only IBANs) and the Money Status grid (which is organized by entity × account-type).
When this matters: Every time a bank statement is uploaded via the ⬆ Upload tab, Hub looks up each IBAN here to route the closing balance to the correct cell in Money Status. Without a mapping, the row is marked "unmapped · auto-suggest pending" and isn't auto-applied.
How to add or correct a row:
Click + Add IBAN at the bottom
Paste the IBAN (24 chars · starts with RO) in the IBAN field
Pick Currency (RON / EUR / USD / GBP)
Pick Bank (BT / BRD / other)
Pick Entity from the 13-entity dropdown (CLA AUDIT, CLA TC&R, etc.)
Pick Account type (BT current · BRD client · BRD buffer · BT partner HERO · other)
Click 💾 Save mapping when done · saves to hub_tool_data.cla_cash_daily_iban_map · audit-logged
Auto-suggest mechanism:/api/cash-daily-iban-map-suggest proposes entity + currency + account label for any unmapped IBAN based on the last 30 days of observed cash_bank groupings. Empty entity field = no observation yet · UI lets you accept-one-click when suggestion appears.
Pro tip: When importing a new bank statement and seeing "unmapped" rows in the Upload preview, return here, add the IBAN with proper entity + account type, then re-upload. The next pass will route correctly.
📡 Downstream: this map flows into /api/cash-daily-bank-parse (IBAN auto-match) + Money Status renderer (entity column resolver) + Settings tab (account master view).
IBAN
Currency
Bank
Entity
Account type
⬆ Upload bank exports · daily heuristic v1
📖 How to import bank exports
Purpose: Update today's Money Status grid from real bank statement exports · one file per bank account. Hub auto-detects IBAN + closing balance + currency · maps to the right entity column via the ⚙ IBAN mapping tab · shows you the preview · you commit.
Format expected: Standard Romanian bank export · IBAN in header or first column · closing balance labeled "Sold final / Sold curent / Sold disponibil"
Step 2 · Drop or browse:
Click the upload zone below · OR drag-and-drop files directly
You can upload multiple files at once (one per bank account)
Max file size 25 MB per file · CSV / XLSX / XLS accepted
Step 3 · Review preview: For each file dropped, Hub shows:
IBAN(s) detected · should match what you exported
Currency · auto-detected from headers
Closing balance · the last "Sold" value in the file
Mapped to: the entity + account-type your IBAN map says · OR unmapped · auto-suggest pending if IBAN not in the map yet
Money Status preview · which cell(s) will be updated and to what value
Step 4 · Apply (or fix):
If the preview looks correct · click ✓ Apply N ready updates · writes to Money Status · audit-logged
If an IBAN shows "unmapped" · open ⚙ IBAN mapping tab · add the row · come back here and re-upload
If a number looks wrong · the parser missed the right "Sold" line · you can inline-edit the cell on Money Status after applying
⚠ Heuristic v1 caveat: Today's parser detects IBAN + closing balance heuristically (regex for RO IBANs · last "Sold final / Sold curent / Closing balance" cell · auto-detected delimiter for CSV). Confidence = medium. Open Banking via Keez is already wired for the 13 entities · so even before parser hardens to named-column extraction, the books-side view is current and the upload path is a fallback only.
📡 Source: shared/cash-daily-bank-parsers.js → /api/cash-daily-bank-parse · audit-logged with action cash_daily_bank_parse_preview (review-only) or cash_daily_bank_parse_applied (committed).
Configuration values driving the correlations + analytics. Read-only view today · edit-in-UI on roadmap (low priority because thresholds rarely change · current values were calibrated 2026-05 and have held). Source: hub_tool_data.cla_cd_entities + cla_cd_accounts + hardcoded correlation thresholds in shared/cash-daily-correlations.js. To adjust a threshold in the meantime · edit the file + push (covered by the cash-daily-correlations invariant suite).
🏦 Bank API · live feed + payments · BT + BRD framework built · not live
Direct bank connectivity for live balances (and later, outgoing payments). The code is built and self-tested but stays inert until credentials + egress are provisioned — that is what makes the daily report "as of yesterday" instead of live. Run the checks to see exactly what is ready and what is blocking go-live. All calls are gated server-side to Ionut + Controlling.