KOSA Sports AB

Arkitekturkarta — AI-system

64 Edge Functions   84 Tabeller   6 Externa system   Supabase: oyzrcjrvppzhbuethicc
🗺️ Översikt
⚡ Edge Functions
🗄️ Tabeller
🔒 Säkerhet
🔴
Säkerhetsvarning: fortnox_tokens (OAuth-nycklar till Fortnox) saknar RLS-skydd — läsbar med anon-key. Se Säkerhetspanelen för fullständig analys.
64
Edge Functions
84
Tabeller
62
Funktioner utan JWT
44
Tabeller utan RLS
40
Tabeller med RLS
523k
Fakturarader

Dataflöde

Externa system
🏪 Lagerkoll
Store 985002
📊 Fortnox
Ekonomi & faktura
🛒 WooCommerce
kosa.se
📋 Monday.com
Board 1174999001
🤖 Claude API
claude-sonnet-4
📧 Outlook/Azure
⏳ Väntar admin
Supabase Edge Functions (64 st) — mellanskikt för alla API-anrop
Lagerkoll-synk
14 funktioner
Fortnox-synk & API
20 funktioner
WooCommerce
5 funktioner
B24 / PRICAT
7 funktioner
KOSA AI & Övrigt
18 funktioner
Supabase — databas (PostgreSQL, eu-central-1)
lagerkoll_*
13 tabeller, RLS ✅
fortnox_*
15 tabeller, RLS ⚠️
woocommerce_*
5 tabeller, RLS ⚠️
sublim_* / prognos_*
12 tabeller, RLS ⚠️
budget / crm / övrigt
39 tabeller, mix
Frontend-verktyg (statiska HTML-filer, öppnas i webbläsaren)
KOSA Hubb
kosa-hubb.html
Morgonbrief
morgonbriefing.html
Morgonrapporten
kosa_morgonrapport.html
Prognosverktyget
prognosverktyg.html
Resultatrapporten
resultatrapport.html
Budget
budget.html
Kundstatistik
kundstatistik.html
Artikelstatistik
artikelstatistik.html
Masterartikel
produktinfo.html
Produktgeneratorn
produktgenerator.html
Sublimering
sublimering.html
CRM
crm.html

Vilket system äger vad

DatafältPrimär källaSupabase-tabellNotering
ArtikelnummerFortnoxfortnox_artiklar_v2Master-ID
EAN-koderLagerkolllagerkoll_articles463 artiklar saknar EAN
LagersaldoLagerkolllagerkoll_articlesSynkas via lagerkoll-sync
UtprisLagerkolllagerkoll_prices146 priskonflikter vs WC
Fakturor / försäljningFortnoxfortnox_faktura_rader523 556 rader — primärkälla
Bokföring (konton 3xxx)Fortnox SIEfortnox_verifikat_posterKör sync_sie_local.py lokalt
BudgetSupabasebudget_entriesRedigeras i budget.html
PrognosSupabaseprognos_entriesRedigeras i prognosverktyget.html
Sublimerings-ordrarMonday.comsublim_ordersBoard 1174999001
ProduktbeskrivningarWooCommercewoocommerce_productsMatchningsbug — 0 beskr. synkas
Filtrera:
lagerkoll-sync LK
Huvud-synk orchestrator — startar alla LK-synk-funktioner
Ingen JWTv16
lagerkoll-sync-articles LK
Synkar artiklar → lagerkoll_articles (2 680 aktiva)
Ingen JWTv4
lagerkoll-sync-customers LK
Synkar kunder → lagerkoll_customers (12 745 rader)
Ingen JWTv3
lagerkoll-sync-suppliers LK
Synkar leverantörer → lagerkoll_suppliers (787 st)
Ingen JWTv3
lagerkoll-sync-orders LK
Synkar kundordrar → lagerkoll_customer_orders
Ingen JWTv3
lagerkoll-sync-order-rows LK
Synkar orderrader → lagerkoll_order_rows (17 310 rader)
Ingen JWTv3
lagerkoll-sync-currencies-categories LK
Valutor (33 st) och kategorier (99 st)
Ingen JWTv5
lagerkoll-sync-purchase-orders LK
Inköpsordrar → lagerkoll_purchase_orders (363 st)
Ingen JWTv3
lagerkoll-sync-article-history LK
Artikelhistorik → lagerkoll_article_history (141 438 rader)
Ingen JWTv4
lagerkoll-sync-prices LK
Prislistor → lagerkoll_prices (32 002 prisposter)
Ingen JWTv3
lagerkoll-create-order LK
Skapar ny order i Lagerkoll (skrivoperation)
Ingen JWTv2
lagerkoll-create-article LK
Skapar ny artikel i Lagerkoll (skrivoperation)
Ingen JWTv1
lagerkoll-proxy LK
Proxy för Lagerkoll API v5 — inkl. offers-list, offers-get, offers-create, offers-by-article, sync-offers-summary
Ingen JWTv5
lagerkoll-probe-quotes LK
Undersöker och testar offert-API:et i Lagerkoll
Ingen JWTv5
fortnox-oauth FX
Startar OAuth-flödet mot Fortnox — omdirigerar till Fortnox login
Ingen JWTv4
fortnox-callback FX
OAuth callback — tar emot auth-code och sparar tokens i fortnox_tokens
Ingen JWTv4
fortnox-sync FX
Huvud-synk orchestrator för Fortnox — kör alla FX-synkare
Ingen JWTv7
fortnox-sync-artiklar FX
Synkar artiklar → fortnox_artiklar_v2 (14 716 rader)
Ingen JWTv2
fortnox-sync-faktura-rader FX
Synkar fakturarader → fortnox_faktura_rader (523 556 rader — primärkälla för all försäljning)
Ingen JWTv3
fortnox-sync-faktura-rader-progress FX
Hanterar progress för fakturarader-synk
Ingen JWTv3
fortnox-sync-kunder FX
Synkar kunder → fortnox_kunder (13 750 st)
Ingen JWTv3
fortnox-sync-leverantorer FX
Synkar leverantörer → fortnox_leverantorer (785 st)
Ingen JWTv2
fortnox-sync-ordrar FX
Synkar ordrar → fortnox_ordrar (20 945 st)
Ingen JWTv2
fortnox-sync-bokforing FX
Synkar bokföring/verifikat — hämtar alltid 2 senaste räkenskapsåren, nattlig synk
Ingen JWTv9
fortnox-sync-verifikat FX
Synkar enskilda verifikat
Ingen JWTv2
fortnox-sync-sie FX
SIE-filexport från Fortnox
Ingen JWTv1
fortnox-sync-artikelstatistik FX
Synkar artikelstatistik från Fortnox
Ingen JWTv2
fortnox-artikelstatistik-import FX
Importerar artikelstatistik till Supabase
Ingen JWTv1
fortnox-sync-kund-land FX
Synkar kundland-data från Fortnox
Ingen JWTv1
fortnox-sales-api FX
Huvud-försäljnings-API för Morgonrapporten — v8 med cache (30 min TTL)
Ingen JWTv8
fortnox-resultatrapport FX
Resultatrapport-data — läser fortnox_verifikat_poster
Ingen JWTv3
fortnox-customer-detail FX
Kunddetaljer inkl. fakturor — används i Morgonrapporten
Ingen JWTv5
fortnox-kund-stats FX
Kundstatistik per VT — levererar dynamisk CEXT_MAP till Morgonrapporten
Ingen JWTv7
fortnox-api-explorer FX
Debug-verktyg för att utforska Fortnox API direkt
Ingen JWTv1
fortnox-likviditet FX
Likviditetsprognos-API — cashflow, drill, budget, balances från likviditet_monthly + fortnox_account_balances
Ingen JWTv6
fortnox-likviditet-prognos FX
Kassaflödesprognos — receivables forecast, bank IB + faktiskt saldo, utfall (inkl. moms/skatt 2xxx), params, purchase_orders (PO med delad betalning), save_po_override
Ingen JWTv6
woocommerce-api WC
Huvud-API för WooCommerce-operationer — läser produkter och varianter
Ingen JWTv15
wc-sync WC
Synkar produkter WooCommerce → woocommerce_products
Ingen JWTv1
wc-sync-runner WC
Kör WC-synk asynkront — hanterar lång synk-process
Ingen JWTv2
wc-push WC ⚠️ 500-fel
Pushar produktdata till live-sajten kosa.se — update_variation ger 500-fel. Kräver wcConfirm()-dialog.
Ingen JWTv2
wc-csv-import WC
CSV-import av produktdata till WooCommerce
Ingen JWTv1
produktgenerator-api B24
Huvud-API för produktgeneratorn — skapar och hanterar produktdata mot B24/PRICAT
Ingen JWTv28
pricat-api B24
PRICAT/B24-hantering — produktdata för leverantörer. Add/Change-toggle (action_override).
Ingen JWTv27
b24-artiklar B24
B24-artikelhantering — validering av PRICAT-fält (EAN, Färg, FEDAS, Kön, Ålder, Indication Color, Sub-Model/modelColor), problemtaggar röd/gul, auto-sync Indication Color från Färg
Ingen JWTv19
fill-b24-namn B24
Fyller in B24-namn på artiklar som saknar det
Ingen JWTv1
prisat-price-sync B24
Prissynk mot PRICAT — uppdaterar priser
Ingen JWTv1
scan-brand B24
Skannar varumärken i artikeldatabasen
Ingen JWTv1
render-design B24
Renderar produktdesign för B24
Ingen JWTv1
claude-proxy AI
Proxy för Claude API-anrop från frontend — håller API-nyckeln säker i Edge Function
Ingen JWTv3
monday-proxy AI
Proxy för Monday.com GraphQL-anrop och fil-uppladdningar — API-nyckel server-side, CORS-säkrad för file://-ursprung
Ingen JWTv1
prognos-api AI
API för Prognosverktyget — läser/skriver prognos_entries, prognos_comments, prognos_marginaler
Ingen JWTv2
crm-api AI
CRM API — kontakter, notter, relationer, avtal, tasks, aktiviteter, lk_info, meta
Ingen JWTv9
send-morning-report AI
Skickar morgonrapport via Outlook
Ingen JWTv1
outlook-auth AI
Outlook OAuth v5 — Azure app d638f22e. ⏳ Väntar Azure-admin från EgerydsGruppen IT
Ingen JWTv5
sublimering-submit AI
Tar emot sublimerings-formulär och sparar till Supabase
Ingen JWTv1
kosa-intervju AI
Intervjuformulär för AI-analys av teamets behov
Ingen JWTv2
intervju-submit AI
Sparar intervjusvar → ai_intervju (7 svar klara)
Ingen JWTv2
kallkarta AI
Källkarta — hanterar datakällans prioritetsordning (12 rader)
Ingen JWTv2
kallkarta-api AI
API för källkarta
Ingen JWTv1
bugg-api AI
Buggrapportering — sparar buggrapporter från frontend
Ingen JWTv1
save-reply AI
Sparar AI-svar/replies till databasen
Ingen JWTv1
sql-import DEV
Kör godtycklig SQL via POST — Dev-verktyg, bör begränsas
Ingen JWTv1
kosa-import-g000 DEV
Engångs-import — kan tas bort
Ingen JWTv1
kosa-pl-debug DEV
PL-debug — felsökningsverktyg
Ingen JWTv10
kosa-debug-keys DEV
Debug-nyckelkoll — kontrollerar vilka hemligheter som finns
✅ JWT krävsv2
auth-signup DEV
Auth signup — hanterar användarregistrering
✅ JWT krävsv2
erik-intervju-submit DEV
Separat intervju-submit för Erik
Ingen JWTv1
RLS på = skyddad    RLS av = publik med anon-key    Totalt 84 tabeller
TabellSystemRLSRaderNotering
🔴
3 kritiska fynd — åtgärda i prioritetsordning nedan

🔴 KRITISKT — fortnox_tokens saknar RLS

Tabellen fortnox_tokens innehåller era Fortnox OAuth-tokens (access_token + refresh_token) och har RLS avstängt. Det betyder att vem som helst med er anon-key kan läsa ut Fortnox-tokenerna direkt via REST-API:et.

Anon-nyckeln är publik och syns i alla era HTML-filer.

Åtgärd: Aktivera RLS på fortnox_tokens och lägg till en policy som bara tillåter service_role (Edge Functions) att läsa. Inga frontend-verktyg ska kunna läsa denna tabell direkt.

SQL: ALTER TABLE fortnox_tokens ENABLE ROW LEVEL SECURITY;
Lägg sedan till policy för service_role.

🔴 KRITISKT — sql-import utan JWT

Funktionen sql-import kör godtycklig SQL via en POST-request och har ingen JWT-verifiering. Vem som helst som hittar URL:en kan köra valfri SQL mot er databas.

Åtgärd: Sätt verify_jwt: truesql-import, eller ta bort funktionen om den inte längre behövs (den var skapad för engångsimport).

🟡 VARNING — 62 av 64 Edge Functions saknar JWT-verifiering

Nästan alla era Edge Functions kan anropas av vem som helst utan inloggning. I nuläget är detta ett medvetet val (internt verktyg, ingen publik inloggning ännu) men det innebär att:

  • Alla synk-funktioner (Lagerkoll, Fortnox) kan triggas externt
  • lagerkoll-create-order kan skapa ordrar utan godkännande
  • wc-push kan potentiellt ändra priser på kosa.se
  • claude-proxy kan användas för att ringa Claude API på er bekostnad
Åtgärd (inför lansering): Implementera Supabase Auth (magic link) och sätt verify_jwt: true på alla skrivfunktioner. Läs-funktioner kan fortsatt vara öppna. Prioritera: lagerkoll-create-order, wc-push, claude-proxy, sql-import.

🟡 VARNING — 44 tabeller saknar RLS

Dessa tabeller är läsbara (och i vissa fall skrivbara) direkt via REST-API med anon-key:

  • fortnox_tokens ⚠️
  • fortnox_kunder
  • fortnox_leverantorer
  • fortnox_fakturor
  • fortnox_faktura_rader
  • fortnox_ordrar
  • fortnox_artiklar_v2
  • fortnox_verifikat_rader
  • budget_entries
  • prognos_entries
  • prognos_comments
  • prognos_marginaler
  • sublim_customers
  • sublim_orders
  • sublim_order_rows
  • sublim_designs
  • sublim_design_articles
  • sublim_design_variants
  • sublim_sticky_notes
  • crm_agreements
  • crm_kund_meta
  • woocommerce_products
  • woocommerce_variations
  • pricat_settings
  • b24_model_no_overrides
  • email_interactions
Prioritering: Fokusera på tabeller med känslig data — fortnox_tokens (kritisk), sedan budget_entries, prognos_entries och sublim_*. Fortnox-tabellerna är läsdata och lägre risk om ni inte oroar er för konkurrenter som tittar på försäljningsdata.

✅ Bra — dessa saker är rätt gjorda

  • Claude API-nyckeln är skyddad bakom claude-proxy Edge Function — exponeras inte i frontend
  • Fortnox OAuth-tokens hanteras via Edge Functions (server-side) — aldrig i frontend-koden
  • Lagerkoll-tabellerna har RLS aktiverat
  • Alla skrivoperationer mot WooCommerce kräver wcConfirm()-dialog
  • Fortnox-data ändras aldrig autonomt — alltid human-in-the-loop
  • wc-push blockeras nu av 500-fel på update_variation — inga oinavsiktliga WC-uppdateringar möjliga

Prioriterad åtgärdslista

#ÅtgärdRiskTid
1Aktivera RLS på fortnox_tokensKritisk5 min
2Sätt verify_jwt: true eller ta bort sql-importKritisk10 min
3Aktivera RLS på budget_entries och prognos_entriesMedel15 min
4Aktivera RLS på sublim_*-tabellernaMedel20 min
5Supabase Auth (magic link) + JWT på skrivfunktionerInför lanseringPlanerat