KB: suitecrm-dev

← All workspaces
4075 entries 165 domains 5.21 MB database Last ingest: 2026-03-20 09:07

4075 results — page 1 of 82

Title Domain Type Severity Source Freshness Updated
v1.1 - 2026-03-15 suitecrm knowledge medium CURRENT-architecture.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-architecture.md
Source date: 2026-03-19
Keywords: ["v11","20260315"]
Cross-domain: []
Symptoms: []
Body:
### v1.1 - 2026-03-15 - Updated with MP-0001 (Hybrid UI Customization Framework) results - Added magitekExt extension to file structure and build instructions - Added Node.js 18, Yarn 4.10.3, 4GB swap to stack - Added deploy_css and get_view_layout MCP tools - CSS strategy: extension styles.scss (custom-overrides.css deprecated) ### v1.0 - 2026-03-15 - Extracted from magitek-ops EXPERT-infra-suitecrm-v1.6 — all app-domain content - Renumbered gotchas from SC-NN to DEV-NN for clarity - Added DEV-13 (customCode ignorert) from customizations registry
v1.8 - 2026-03-17 suitecrm knowledge medium CURRENT-architecture.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-architecture.md
Source date: 2026-03-19
Keywords: ["v18","20260317"]
Cross-domain: []
Symptoms: []
Body:
### v1.8 - 2026-03-17 - RETTET DEV-23: setTimeout(0) virker IKKE — erstattet med metadata pre-load som korrekt fix - Lagt til DEV-24: serena-suitecrm kan ikke lese core/ (gitignored) - Lagt til DEV-25: Angular produksjonsbygg — ingen debug-tools - Versjonsbump 1.7 → 1.8 ### v1.7 - 2026-03-17 - Lagt til DEV-23: RecordModal — 3 regler (setTimeout, modalOptions.size, RecordModalService) - Versjonsbump 1.6 → 1.7 ### v1.6 - 2026-03-16 - MCP-servere utvidet fra 9 til 10: lagt til `serena-suitecrm` (remote SSE paa port 8282, read-only, systemd service paa 172.20.0.102) - Tydeliggjort forskjell mellom `serena` (lokal, stdio) og `serena-suitecrm` (remote, SSE) ### v1.5 - 2026-03-16 - Lagt til DEV-21: magitekExt webpack requiredVersion warnings (ufarlige) - Lagt til DEV-22: Feilsoking ved 500-feil — sjekk prod.log forst - Versjonsbump 1.4 → 1.5 ### v1.4 - 2026-03-16 - Lagt til 6 nye GraphQL MCP-verktoy fra MP-0004: get_angular_view_definition, get_module_metadata, get_app_metadata, get_system_config, introspect_graphql_schema, run_graphql_query - MCP-verktoy totalt oppdatert fra 17 til 23 - Lagt til graphql_client.py og tools/graphql.py i MCP-server filreferanser - Lagt til GraphQL-baserte tools seksjon med forklaring paa forskjell mellom get_view_layout og get_angular_view_definition ### v1.3 - 2026-03-16 - Lagt til GraphQL API seksjon: session-basert auth, CSRF-tokens, tilgjengelige queries/mutations - Lagt til DEV-18: Symfony/PHP versjonslaas (psr/log ^1.0, config.platform.php 8.1.0) - Lagt til DEV-19: Composer lokasjon paa suitecrm-serveren (/tmp/composer) - Lagt til DEV-20: Generiske GraphQL MCP-servere inkompatible med SuiteCRM session-auth - Composer lagt til i stack-tabell - Core Layer API-beskrivelse utvidet med GraphQL-endepunkt ### v1.2 - 2026-03-16 - MCP-servere utvidet fra 3 til 9 (+ serena, github, lighthouse, accessibility, css, mysql) - MySQL MCP: suitecrm_ro read-only bruker, bind-address aapnet for LAN - Lagt til DEV-14: Playwright --headless krav uten DISPLAY - Lagt til DEV-15: Extension SCSS scoping (treffer ikke host-DOM) - Lagt til DEV-16: MCP deploy_css replace-bug - Lagt til DEV-17: $SUDO_PASS ikke tilgjengelig paa remote - CSS-strategi korrigert: extension SCSS er scoped, custom-overrides.css er riktig vei - .mcp.json naa git-tracket (fjernet fra .gitignore)
v2.7 - 2026-03-17 suitecrm knowledge critical CURRENT-architecture.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-architecture.md
Source date: 2026-03-19
Keywords: ["v27","20260317","Contacts"]
Cross-domain: []
Symptoms: []
Body:
### v2.7 - 2026-03-17 - Lagt til DEV-33: REST V8 vs GraphQL som diagnostisk teknikk for tom-liste-feil - Lagt til DEV-34: ContactLastTouchPoint hardkodede array-indekser (core bug, ignorerbar) ### v2.5 - 2026-03-17 - Lagt til DEV-32: fields_meta_data orphan pattern — stille 0-resultat fra GraphQL (CRITICAL) ### v2.4 - 2026-03-17 - Lagt til DEV-31: NavbarRegistry component override pattern (last-write-wins, template-synk ved oppgradering) - Filstruktur utvidet med navbar/ katalog under magitekExt/app/src/ (SC-0034) - Versjonsbump 2.3 → 2.4 ### v2.3 - 2026-03-17 - Filstruktur utvidet med scripts/ (inject-custom-css.sh, theme-toggle.sh) og public/dist/ (custom-overrides.css, index.html) - Lagt til tema-system kryssreferanse (CURRENT-theme-system.md) ved CSS-strategi - Versjonsbump 2.2 → 2.3 ### v2.2 - 2026-03-17 - Lagt til DEV-28: RecordModal labels forsvinner i create-modus — ULOEST (backend metadata korrekt, Angular-side problem) - Lagt til DEV-29: GraphQL viewDefinition.extra krasjer for Contacts - Lagt til DEV-30: GraphQL moduleMetadata.editView krasjer for ALLE moduler (SuiteCRM 8.9 bug) - MCP-servere redusert fra 10 til 9: fjernet accessibility (konfliktet med Playwright) - Playwright MCP pinned til @0.0.68 - Oppdatert DEV-26: fjernet accessibility-referanse - Versjonsbump 2.1 → 2.2 ### v2.1 - 2026-03-17 - Lagt til DEV-27: Serena MCP parameterfeil — PreToolUse-hook som blokkerer feil parameternavn (pattern vs substring_pattern, manglende relative_path) - Versjonsbump 2.0 → 2.1 ### v2.0 - 2026-03-17 - RETTET DEV-24: Rotarsak oppdatert — gitignore var IKKE problemet, Serena-prosessen var startet foer project.yml ble oppdatert. Losning endret fra "bruk SSH" til "restart Serena SSE-service". Severity oppgradert MEDIUM → HIGH. - Lagt til verifiseringskommandoer, LSP-indeksering-info, og service-fil-referanse i DEV-24 - Korrigert serena-suitecrm port fra 8282 til 8000 i MCP-server-tabellen - Versjonsbump 1.9 → 2.0 ### v1.9 - 2026-03-17 - Lagt til DEV-26: Playwright/Accessibility MCP krever PLAYWRIGHT_BROWSERS_PATH i .mcp.json - Oppdatert DEV-14 med kryssreferanse til DEV-26 - Rettet SC-GOTCHA-18 referanse fra SC-0030 til SC-0031 (i customizations) - Versjonsbump 1.8 → 1.9
DEV-34: `ContactLastTouchPoint.php` hardkodede array-indekser (LOW) suitecrm knowledge high CURRENT-architecture.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-architecture.md
Source date: 2026-03-19
Keywords: ["dev34","contactlasttouchpointphp","hardkodede","arrayindekser","low","Contacts","Meetings","Calls"]
Cross-domain: []
Symptoms: []
Body:
### DEV-34: `ContactLastTouchPoint.php` hardkodede array-indekser (LOW) - **Symptom:** `Undefined array key 6` i prod.log fra `core/modules/Contacts/Statistics/ContactLastTouchPoint.php:140`. Ledsages av "Databasefeil" fra `include/utils.php:2116`. - **Arsak:** Core-filen bruker hardkodede indekser `$queries[2]` (meetings), `$queries[3]` (calls), `$queries[5]` (emails), `$queries[6]` (linkedemails) for history-subpanel collection queries. Indeksene antar eksakt 7 elementer i history-collection. Endringer i history-subpanel (fjerne/legge til elementer) forskyver indeksene. - **Paavirkning:** Krasjer statistikk-widgeten, men blokkerer IKKE listview eller record-visning. GraphQL returnerer data normalt. - **Tiltak:** Ingen — dette er core SuiteCRM 8.9-kode vi ikke endrer. Logg-stoeyen kan ignoreres. Vurder aa rapportere upstream. - **Ref:** AUDIT-2026-03-17 ### DEV-22: Feilsoking ved 500-feil — sjekk prod.log FOERST (HIGH) - **Symptom:** GraphQL 500, login feiler, blank side - **Foerste steg:** `ssh suitecrm "tail -20 /var/www/suitecrm/logs/prod/prod.log"` — viser root cause - **Typiske arsaker:** PHP Fatal Error i custom/ PHP-filer (syntaksfeil, manglende klasse, manglende variabel-prefix) - **VIKTIG:** Console-warnings fra remoteEntry.js ("Unsatisfied version", "shared singleton module") er ALDRI arsaken til 500-feil. Ikke deaktiver extensions basert paa console-warnings. - **PHP syntax-sjekk:** `find /var/www/suitecrm/public/legacy/custom -name '*.php' -exec php -l {} \; 2>&1 | grep -v 'No syntax errors'` --- ## Changelog ### v2.8 - 2026-03-19 - Migrert ALLE sudo-kommandoer fra `echo "$SUDO_PASS" | sudo -S` til `sudo -n` (NOPASSWD konfigurert) - DEV-11: Oppdatert arsak og losning for NOPASSWD-kontekst - DEV-12: Omskrevet fra quoting-monster til NOPASSWD `sudo -n` referanse - DEV-17: Markert RESOLVED — NOPASSWD konfigurert, Playwright env-vars dokumentert - Frontend extension build, QR&R, og cache:clear kommandoer oppdatert ### v2.6 - 2026-03-17 - DEV-32 utvidet: orphan kan ogsaa gi ghost-felt (tom streng) uten aa krasje. Lagt til diagnose-sammenligning mot _cstm-kolonner, varsel om aa sjekke fields_meta_data ved vardef-sletting, dokumentert kjent orphan `Contactsmcp_test_c` (per 2026-03-17)
DEV-32: `fields_meta_data` orphan — stille 0-resultat eller ghost-felt fra GraphQL (CRITICAL) suitecrm knowledge critical CURRENT-architecture.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-architecture.md
Source date: 2026-03-19
Keywords: ["dev32","fieldsmetadata","orphan","stille","0resultat","eller","ghostfelt","fra","graphql","critical","Contacts"]
Cross-domain: []
Symptoms: []
Body:
### DEV-32: `fields_meta_data` orphan — stille 0-resultat eller ghost-felt fra GraphQL (CRITICAL) - **Symptom:** GraphQL `recordList` returnerer `total: 0` for en modul, ELLER returnerer foreldreloese felt-attributter (f.eks. `"mcp_test_c": ""`). REST V8 API kan fungere normalt. Ingen feilmelding i prod.log. - **Arsak:** En vardef Extension-fil ble slettet, men `fields_meta_data`-tabellen har fortsatt en rad for feltet. SugarBean bygger vardefs fra BAADE Extension-filer OG `fields_meta_data`. Avhengig av tidspunkt kan den foreldreloese raden faa `create_new_list_query()` til aa JOINe en ikke-eksisterende kolonne i `{modul}_cstm` → stille SQL-feil → 0 rader. I andre tilfeller returnerer GraphQL feltet med tom verdi. - **Diagnose:** `SELECT * FROM fields_meta_data WHERE custom_module = '{Module}' AND deleted = 0;` — sammenlign med `SHOW COLUMNS FROM {modul}_cstm` — felt i meta_data uten kolonne i _cstm er orphans. - **Fix:** `DELETE FROM fields_meta_data WHERE id = '{Module}{felt}';` + `rebuild_extensions` + `cache_clear` - **VIKTIG:** Naar du sletter en custom field vardef Extension-fil, sjekk ALLTID om feltet ogsaa finnes i `fields_meta_data`. Slett BEGGE for aa unngaa orphan. - **KRITISK:** Aa kun slette DB-raden uten `rebuild_extensions` fikser IKKE problemet varig — den kompilerte `vardefs.ext.php` inneholder fortsatt feltet og gjenskaper `fields_meta_data`-raden ved neste cache-rebuild. BEGGE steg maa utfoeres. - **Kjent orphan `Contactsmcp_test_c`: LOEST 2026-03-17.** DB-rad slettet + `rebuild_extensions` regenererte kompilert vardefs uten feltet. Gjenskapt to ganger for riktig prosedyre ble fulgt. - **Ref:** AUDIT-2026-03-17 — orphan `mcp_test_c` tok ned Contacts listview to ganger ### DEV-33: REST V8 vs GraphQL som diagnostisk teknikk (HIGH) - **Bruk:** Naar UI viser tom liste men du mistenker at data finnes, sammenlign REST V8 API (`list_records` MCP) med GraphQL (`run_graphql_query` MCP). - **Hvis V8 returnerer data men GraphQL returnerer 0:** Feilen er i legacy `SugarBean::create_new_list_query()` — IKKE i API-laget. V8 REST bruker enklere query-path (direkte DB) mens GraphQL gaar gjennom SugarBean som bygger JOINs basert paa vardefs+fields_meta_data. - **Typiske arsaker:** Orphan i `fields_meta_data` (DEV-32), ugyldig relate-vardef, manglende _cstm-kolonne. - **Foerste steg ved "tom liste i UI":** (1) `list_records` MCP, (2) `run_graphql_query` med samme modul, (3) sammenlign total. Hvis divergens → problemet er i vardef/fields_meta_data-laget. - **Ref:** AUDIT-2026-03-17
DEV-28: RecordModal labels forsvinner i create-modus — ULOEST (HIGH) suitecrm knowledge high CURRENT-architecture.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-architecture.md
Source date: 2026-03-19
Keywords: ["dev28","recordmodal","labels","forsvinner","createmodus","uloest","high","Contacts"]
Cross-domain: []
Symptoms: []
Body:
### DEV-28: RecordModal labels forsvinner i create-modus — ULOEST (HIGH) - **Symptom:** "Opprett kontaktperson"-modal (fra Lead detail view via contact-relate +knapp) viser felt uten labels (phone_work, phone_mobile, title, department, account_name, lead_name). Backend-metadata er 100% korrekt — GraphQL `recordView` og `recordModal` returnerer riktige labels for ALLE felt. - **Verifisert:** SC-0031 (eksplisitte labels i editviewdefs) fikset backend-siden. Labels vises korrekt i GraphQL-respons. Problemet vedvarer i Angular-rendering etter hard refresh + logout/login. - **Arkitektur-funn:** `RecordModalStore` bruker `meta.recordView` (fra `defaultEntries`), IKKE `meta.extra.recordView` (som er `undefined` fordi `recordView` er i `defaultEntries`, ikke `nonDefaultEntries`). - **Rotarsak:** Ukjent — mulig Angular-side issue med hvordan RecordModalStore prosesserer metadata for create-modus. Krever `/bug-crusher` med Angular source-analyse. - **Ref:** MP-0005 bug-crusher sesjon 2026-03-17 ### DEV-29: GraphQL `viewDefinition.extra` krasjer for Contacts (MEDIUM) - **Symptom:** GraphQL-query med `extra` felt i `viewDefinition` for Contacts returnerer "Internal server error" - **Arsak:** Ukjent — mulig serialiseringsfeil i backend. Pavirker IKKE normal drift (Angular bruker ikke `extra` direkte). - **Ref:** Oppdaget under DEV-28 debugging 2026-03-17 ### DEV-30: GraphQL `moduleMetadata.editView` krasjer for ALLE moduler (MEDIUM) - **Symptom:** `moduleMetadata` query med `editView` felt returnerer "Internal server error" for alle moduler, ikke kun Contacts - **Arsak:** Sannsynlig SuiteCRM 8.9 bug i `ModuleMetadataHandler` — editView-serialisering feiler - **Workaround:** Bruk `get_angular_view_definition(module, 'record')` for aa hente view-metadata. `get_view_layout(module, 'edit')` for legacy PHP viewdefs. - **Ref:** Oppdaget under DEV-28 debugging 2026-03-17 ### DEV-31: NavbarRegistry component override — last-write-wins (MEDIUM) - **Symptom:** Trenger aa erstatte en core Angular-komponent (navbar, sidebar, etc.) med en custom versjon - **Mekanisme:** SuiteCRM 8 bruker `*Registry` klasser (`NavbarRegistry`, `FieldRegistry`, etc.) som arver `BaseComponentRegistry` → `OverridableMap`. Extension-kode kaller `registry.register('default', 'default', CustomComponent)` i constructor — siste registrering overskriver forrige (last-write-wins). `NavbarUiComponent` bruker `ndc-dynamic` til aa rendre det som er registrert. - **Implementering:** (1) Subclass den abstrakte klassen (f.eks. `NavbarAbstract`), (2) Subclass komponenten (f.eks. `BaseNavbarComponent`), (3) Override `ngOnInit()` til aa instansiere din subklasse, (4) Registrer via registry i `extension.module.ts` constructor - **Viktig:** `NavbarAbstract` instansieres direkte i `ngOnInit` (IKKE via DI), saa du maa override `ngOnInit()` for aa bruke din subklasse. `vm$` er en class field (lazy Observable) — den kjoerer ETTER `ngOnInit` takket vaere template-subscription timing. - **Template-risiko:** Custom HTML-template (kopi av base-template) maa synkroniseres etter SuiteCRM-oppgraderinger. Diff mot `base-navbar.component.html` (367 linjer per 8.9.2). - **Ref:** SC-0034 (statisk navbar), EX-0026/EX-0027 (explore-rapporter)
DEV-25: Angular produksjonsbygg — ingen debug-tools (LOW) suitecrm knowledge low CURRENT-architecture.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-architecture.md
Source date: 2026-03-19
Keywords: ["dev25","angular","produksjonsbygg","ingen","debugtools","low"]
Cross-domain: []
Symptoms: []
Body:
### DEV-25: Angular produksjonsbygg — ingen debug-tools (LOW) - **Symptom:** `window.ng` er `undefined`, `ng.getComponent()` returnerer null - **Arsak:** SuiteCRM kjorer Angular i production mode — debug tools er disabled - **Losning:** Bruk `browser_evaluate` med DOM-inspeksjon (innerHTML, querySelector) og `console.error` monkey-patching for feilsoking. Ikke forsoek `ng.getComponent()`. ### DEV-26: Playwright MCP krever PLAYWRIGHT_BROWSERS_PATH (MEDIUM) - **Symptom:** Playwright MCP finner ikke Chrome/Chromium — feiler med "Executable doesn't exist" eller lignende - **Arsak:** MCP-servere startet via `npx` arver ikke brukerens shell-miljo. Playwright finner ikke browser-binarer uten eksplisitt sti. - **Losning:** Legg til `PLAYWRIGHT_BROWSERS_PATH` i `env`-blokken for `playwright` MCP-server i `.mcp.json`: `"PLAYWRIGHT_BROWSERS_PATH": "/home/heine/.cache/ms-playwright"` - **Merk:** `accessibility` MCP (mcp-accessibility-scanner) er fjernet — konfliktet med Playwright MCP. Playwright @0.0.68 pinned. - **Ref:** Oppdaget under SC-0031 bug-crusher sesjon 2026-03-17 ### DEV-27: Serena MCP — modeller forveksler parameternavn (MEDIUM) - **Symptom:** `search_for_pattern` returnerer feil/tom respons, `find_file` feiler med "missing parameter" - **Arsak:** Claude-modeller forveksler parameternavn: bruker `pattern` (fra Grep-verktoeyet) i stedet for `substring_pattern` (Serena), og glemmer required `relative_path` paa `find_file` - **Losning:** PreToolUse-hook (`~/.claude/hooks/pre-tool-use-serena-param-fix.sh`) blokkerer kall med feil parameternavn og gir agenten forklaring slik den kan proeve igjen med riktige parametere - **Hook-matcher:** `mcp__serena.*__search_for_pattern|mcp__serena.*__find_file` (dekker baade `serena` og `serena-suitecrm`) - **Registrert i:** `~/.claude/settings.json` under `hooks.PreToolUse` - **Se ogsaa:** knowledge-mcp-tools.md seksjon "VANLIGE PARAMETERFEIL" - **Ref:** Oppdaget 2026-03-17, testet mot alle 4 scenarier (feil param, riktig param, manglende path, med path)
DEV-23: RecordModal — metadata pre-load + modalOptions.size + RecordModalService (HIGH) suitecrm knowledge high CURRENT-architecture.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-architecture.md
Source date: 2026-03-19
Keywords: ["dev23","recordmodal","metadata","preload","modaloptionssize","recordmodalservice","high","Contacts"]
Cross-domain: []
Symptoms: []
Body:
### DEV-23: RecordModal — metadata pre-load + modalOptions.size + RecordModalService (HIGH) - **Symptom:** Modal aapnes tom (ingen felt/knapper) ved foerste klikk, fungerer ved andre klikk - **Rotarsak:** `RecordModalComponent.init()` kaller `loadMetadata(module)` som bruker `shareReplay(1)`. Foerste kall er async (HTTP). Observable-kjeden inne i modal-komponenten klarer IKKE aa motta den asynkrone emisjonen — `record` settes aldri, modal forblir tom permanent. Andre klikk fungerer fordi metadata er cachet og leveres synkront via `shareReplay(1)`. - **3 regler for RecordModal:** 1. **Metadata pre-load (IKKE setTimeout):** Pre-load metadata FOER `showModal()`: ```typescript this.metadataStore.getMetadata('Contacts').pipe(take(1)).subscribe(() => { this.recordModalService.showModal({...}); }); ``` `setTimeout(0)` ble testet og virker IKKE — metadata-caching er den reelle fixen. 2. **modalOptions.size:** Bruk `modalOptions: { size: 'xl' }` INNE i options — top-level `size` ignoreres av RecordModalService 3. **RecordModalService:** Bruk ALLTID `RecordModalService.showModal()` — ALDRI `NgbModal.open(RecordModalComponent)` direkte - **Ref:** SC-0027, SC-0028, MP-0005 bug-crusher 2026-03-17 ### DEV-24: serena-suitecrm — search_for_pattern og find_symbol tomt for core/ (HIGH) - **Symptom:** `find_symbol`, `get_symbols_overview`, `search_for_pattern` returnerer tomme resultater for `core/`-kataloger. Enkeltfiler fungerer (`relative_path=core/backend/Kernel.php`), kataloger gir `{}`. - **Rotarsak (bekreftet 2026-03-17):** Serena SSE-prosessen ble startet FoR `project.yml` ble oppdatert med `ignore_all_files_in_gitignore: false`. Den kjorende prosessen hadde da gitignore-patterns (`/*`) i sin `_ignore_spec` som blokkerte traversal av `core/`. `.gitignore` paa suitecrm-serveren ignorerer alt (`/*`) og tracked bare `public/legacy/custom/`, `extensions/`, `config/`. - **Losning:** Restart Serena SSE-service: `ssh suitecrm 'systemctl --user restart serena-suitecrm'`. Serena MÅ lese `project.yml` (med `ignore_all_files_in_gitignore: false`) ved oppstart. - **Verifisering etter restart:** `search_for_pattern('class Kernel', 'core/backend/Kernel.php')` skal returnere treff. `search_for_pattern('class', 'core/backend/Authentication/Controller')` skal returnere SecurityController.php. - **MERK:** Etter restart kobler SSE-tilkoblingen seg fra — Claude Code maa starte ny session for aa faa re-tilkobling til ny Serena-prosess. - **find_symbol for TypeScript/PHP i core/:** Trenger LSP-indeksering. Intelephense indekserer automatisk ved oppstart (tar 1-5 min, 30-50% CPU). `find_symbol` fungerer foerst naar indeksering er ferdig. - **service-fil:** `/home/heine/.config/systemd/user/serena-suitecrm.service` paa suitecrm (172.20.0.102) Serena fungerer fint for `extensions/` og `public/legacy/custom/`
DEV-17: NOPASSWD sudo konfigurert — bruk `sudo -n` (RESOLVED) suitecrm knowledge high CURRENT-architecture.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-architecture.md
Source date: 2026-03-19
Keywords: ["dev17","nopasswd","sudo","konfigurert","bruk","resolved"]
Cross-domain: []
Symptoms: []
Body:
### DEV-17: NOPASSWD sudo konfigurert — bruk `sudo -n` (RESOLVED) - **Opprinnelig symptom:** `echo "$SUDO_PASS" | sudo -S ...` feilet paa 172.20.0.102 - **Losning (2026-03-19):** NOPASSWD sudo konfigurert via `/etc/sudoers.d/heine-nopasswd`. Tillatte kommandoer: cp, chmod, chown, find, rm, mkdir, php, mysql, systemctl. Bruk `sudo -n` (non-interactive), ALDRI `echo "$SUDO_PASS" | sudo -S`. - **Playwright-credentials:** `$SUITECRM_ADMIN_USER` og `$SUITECRM_ADMIN_PASS` env-variabler (satt i project settings). ### DEV-18: Symfony/PHP versjonslaas blokkerer moderne pakker (MEDIUM) - **Symptom:** `composer require` av moderne Symfony-pakker (AI, MCP bundles) feiler med versjonskonflikter - **Arsak:** SuiteCRM 8.9 har `config.platform.php` satt til 8.1.0 (faktisk PHP er 8.3.6). `psr/log ^1.0` er laast — blokkerer pakker som krever `psr/log ^2.0|^3.0`. `symfony/process` har uloest security advisory som blokkerer composer-operasjoner. - **Losning:** IKKE forsoek aa installere tredjeparts Symfony bundles (Symfony MCP Bundle, Symfony Mate, osv). Utvid vaar egen Python MCP-server i stedet. Se MP-0004. ### DEV-19: Composer ikke i PATH paa suitecrm-serveren (LOW) - **Symptom:** `composer` kommando ikke funnet via SSH - **Arsak:** Composer installert som `/tmp/composer` (manuelt), ikke i system PATH - **Losning:** Bruk `/tmp/composer` eksplisitt for dependency-sjekker. Ikke bruk for `install`/`update` paa produksjon. ### DEV-20: Generiske GraphQL MCP-servere fungerer IKKE med SuiteCRM (HIGH) - **Symptom:** Tredjeparters GraphQL MCP-pakker (f.eks. mcp-graphql/blurrah) feiler mot SuiteCRM - **Arsak:** SuiteCRM bruker session-basert auth med CSRF-tokens. Generiske GraphQL MCP-servere sender kun statiske headers (f.eks. Bearer token), som gir 403. - **Losning:** Bruk vaar egen Python MCP-server (FastMCP) som allerede haandterer V8 API auth. For GraphQL-stoette: utvid denne med session-auth (MP-0004). ### DEV-21: magitekExt webpack `requiredVersion: 'auto'` gir console-warnings (LOW) - **Symptom:** `remoteEntry.js` logger "Unsatisfied version 18.2.8 from shell of shared singleton module @angular/core (required ^auto)" for alle shared dependencies - **Arsak:** `@angular-architects/module-federation` evaluerer ikke `^auto` korrekt som semver-range mot shell-versjonene. Warningene er UFARLIGE — singleton:true tvinger bruk av shell-versjonene uansett. - **Losning:** webpack.config.js endret til aa lese versjoner dynamisk fra root package.json (SC-0018). Etter SuiteCRM-oppgradering: kjor `yarn build:extension magitekExt`. - **VIKTIG:** ALDRI deaktiver magitekExt pga disse warningene — de er kosmetiske. Deaktivering fjerner address group-komponent og andre custom fields.
DEV-11: SSH heredoc+sudo filskriving fungerer ikke (HIGH) suitecrm knowledge high CURRENT-architecture.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-architecture.md
Source date: 2026-03-19
Keywords: ["dev11","ssh","heredocsudo","filskriving","fungerer","ikke","high"]
Cross-domain: []
Symptoms: []
Body:
### DEV-11: SSH heredoc+sudo filskriving fungerer ikke (HIGH) - **Symptom:** Agent skriver fil via `ssh suitecrm "sudo tee file" << 'EOF'` — feiler - **Arsak:** Heredoc pa stdin kolliderer med sudo (selv med NOPASSWD, stdin-redirect er problematisk) - **Losning:** Bruk 5-stegs scp-metoden: (1) skriv til lokal `/tmp/`, (2) `scp` til remote `/tmp/`, (3) `ssh sudo -n cp`, (4) `ssh sudo -n chown`, (5) verifiser ### DEV-12: SSH sudo — bruk `sudo -n` (NOPASSWD konfigurert) - **Losning:** NOPASSWD sudo er konfigurert via `/etc/sudoers.d/heine-nopasswd`. Bruk `sudo -n` (non-interactive). Tillatte kommandoer: cp, chmod, chown, find, rm, mkdir, php, mysql, systemctl. Monster: `ssh suitecrm 'sudo -n -u www-data kommando'` ### DEV-13: `customCode` i editviewdefs ignoreres av SuiteCRM 8 - **Arsak:** SuiteCRM 8 Angular/Vue-frontend ignorerer `customCode` fullstendig — leser kun feltnavnet - **Losning:** For visuell tilpasning: bruk CSS-overrides via SuiteCRM 8 extension-systemet ### DEV-14: Playwright MCP krever --headless uten DISPLAY (MEDIUM) - **Symptom:** Playwright MCP feiler med "browser launch failed" paa servere uten grafisk miljo - **Arsak:** Ingen DISPLAY-variabel satt paa dev-serveren (headless LXC) - **Losning:** Start Playwright MCP med `--headless` flag i .mcp.json-konfigurasjonen - **Se ogsaa:** DEV-26 (PLAYWRIGHT_BROWSERS_PATH) ### DEV-15: Extension SCSS treffer IKKE host-appens DOM (HIGH) - **Symptom:** CSS-regler i `extensions/magitekExt/app/src/styles.scss` har ingen effekt paa SuiteCRM-felt - **Arsak:** Module Federation laster KUN JS-chunks, IKKE CSS fra extension-bundelen. Extension SCSS er scoped. - **Losning:** Bruk `public/dist/custom-overrides.css` for globale CSS-overrides. Se CURRENT-angular-css.md for detaljer. - **Ref:** Oppdaget under SC-0015, dokumentert i cache-busting explore-rapport ### DEV-16: MCP deploy_css mode=replace toommer filen (HIGH) - **Symptom:** `deploy_css` med `mode='replace'` returnerer `file_size: 0` — filen blir tom - **Arsak:** Bug i suitecrm MCP server — replace-modus skriver tom fil - **Losning:** Bruk `scp` eller `ssh tee` for aa deploye custom-overrides.css direkte
DEV-04: Repair & Rebuild synkroniserer ikke alltid vardefs med DB suitecrm knowledge high CURRENT-architecture.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-architecture.md
Source date: 2026-03-19
Keywords: ["dev04","repair","rebuild","synkroniserer","ikke","alltid","vardefs","med"]
Cross-domain: []
Symptoms: []
Body:
### DEV-04: Repair & Rebuild synkroniserer ikke alltid vardefs med DB - **Symptom:** Programmatisk opprettede vardefs lager ikke DB-kolonner - **Arsak:** Kjent bug i SuiteCRM 8 (GitHub issue #532) - **Losning:** Kjoer Quick Repair & Rebuild fra Admin → Repair, velg "Execute" paa SQL ### DEV-05: V8 API bruker `like` som LIKE-operator, ikke `lk` - **Symptom:** Filter med `lk` returnerer ingen resultater eller feil - **Losning:** Bruk `{"name": {"like": "%sokeord%"}}`. Gyldige operatorer: eq, lt, gt, lte, gte, like ### DEV-06: Angular frontend har INGEN egne sprakfiler - **Symptom:** Leter etter i18n/JSON-filer i Angular-koden, finner ingenting - **Arsak:** SuiteCRM 8 frontend henter alle labels fra legacy PHP via GraphQL (language.store.ts) - **Losning:** Alle oversettelser gjores i legacy PHP-filene (lag 3-4). Frontend reflekterer automatisk. ### DEV-07: SuiteCRM 8 Vue.js layout = detailviewdefs, IKKE editviewdefs (HIGH) - **Symptom:** Endrer editviewdefs.php men layout i SPA-frontend endres ikke - **Arsak:** SuiteCRM 8 frontend leser visningslayout fra `detailviewdefs.php` via `RecordViewDefinitionHandler`. editviewdefs kontrollerer kun hvilke felt som er redigerbare. - **Losning:** ALLTID endre `detailviewdefs.php` for layout. Endre `editviewdefs.php` i tillegg for legacy-kompatibilitet. ### DEV-08: Custom fields krever `'source' => 'custom_fields'` i vardef (HIGH) - **Symptom:** Custom field finnes i `_cstm` DB-tabell men er usynlig i UI - **Losning:** Legg til `'source' => 'custom_fields'` i vardef-definisjonen. Kjoer rebuild_extensions.php. ### DEV-09: Composite address widget — alt-eller-ingenting - **Symptom:** Onsker a vise enkelt adressefelt men hele adresseblokken rendres - **Losning:** For enkeltfelt-kontroll: bruk plain strenger i panels-arrayen, uten composite address type. ### DEV-10: Template cache — 4 uavhengige lag, `cache:clear` fjerner kun 1 (HIGH) - **Arsak:** 4 cache-lag: (1) modul tpl-cache, (2) Smarty-kompilert, (3) Symfony app-cache, (4) Extension-kompilert - **Losning:** Fullstendig refresh: slett `cache/themes/suite8/modules/{Mod}/*.tpl` + clear `cache/smarty/templates_c/*` + `cache:clear` + `rebuild_extensions.php`
GraphQL-baserte tools (MP-0004, 2026-03-16) suitecrm knowledge high CURRENT-architecture.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-architecture.md
Source date: 2026-03-19
Keywords: ["graphqlbaserte","tools","mp0004","20260316"]
Cross-domain: []
Symptoms: []
Body:
### GraphQL-baserte tools (MP-0004, 2026-03-16) De 6 siste verktoeyene over bruker SuiteCRM 8 GraphQL API (`/api/graphql`) via session-basert auth. Klient: `graphql_client.py` i MCP-serveren. Auto-relogin ved session-timeout. Viktig forskjell: `get_view_layout` leser legacy PHP viewdefs via SSH. `get_angular_view_definition` leser det Angular-frontenden faktisk bruker — dette er korrekt for aa forstaa hva brukeren ser. ### Filter-operatorer for list_records | Operator | Betydning | Eksempel | |----------|-----------|----------| | `eq` | Lik | `{"status": {"eq": "Active"}}` | | `lt` | Mindre enn | `{"amount": {"lt": "1000"}}` | | `gt` | Storre enn | `{"amount": {"gt": "500"}}` | | `lte` | Mindre enn eller lik | | | `gte` | Storre enn eller lik | | | `like` | LIKE-sok (% wildcard) | `{"name": {"like": "%Smith%"}}` | ### Ressurser - `config://suitecrm-info` — Tilkoblingsinfo og tilgjengelige moduler ### Claude Agent - **Agent:** `~/.claude/agents/suitecrm-specialist.md` - **Slash-kommando:** `/suitecrm` --- ## Utvikler-Gotchas ### DEV-01: defaultExt er disabled etter upgrade - **Symptom:** `'enabled' => false` i extension.php - **Arsak:** Oppgradering til 8.9.2 deaktiverte defaultExt - **Losning:** Sett `enabled => true`, kjoer `yarn run build:defaultExt`, clear cache ### DEV-02: Studio custom fields lagres i DB, ikke filer - **Symptom:** Custom fields fra Studio finnes ikke i Ext/Vardefs/ - **Arsak:** Studio bruker `fields_meta_data` DB-tabell - **Losning:** Normalt. For versjonskontroll, opprett vardefs-filer manuelt ### DEV-03: Extension-filer krever QR&R-kompilering, IKKE bare cache:clear (HIGH) - **Symptom:** Endret/opprettet fil i `custom/Extension/modules/{Mod}/Ext/` men endringen synes ikke i UI - **Arsak:** Extension-filer er KILDEFILER som maa kompileres til `custom/modules/{Mod}/Ext/{Type}/{type}.ext.php` via `ModuleInstaller->rebuild_extensions()`. `cache:clear` fjerner bare Symfony/SuiteCRM-cache, den kompilerer IKKE Extension-filer. - **Losning:** Kjoer `ssh suitecrm 'sudo -n -u www-data php /var/www/suitecrm/scripts/rebuild_extensions.php'`. ALDRI skriv direkte til `*.ext.php`.
MySQL MCP — Read-only tilgang suitecrm knowledge medium CURRENT-architecture.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-architecture.md
Source date: 2026-03-19
Keywords: ["mysql","mcp","readonly","tilgang","Leads","Contacts","Accounts","Opportunities","Cases","Meetings","Calls","Tasks","Notes"]
Cross-domain: []
Symptoms: []
Body:
### MySQL MCP — Read-only tilgang - **Bruker:** `suitecrm_ro` (SELECT-only paa `suitecrm` DB) - **MySQL bind-address:** `0.0.0.0` (aapnet for LAN 172.20.0.0/24, endret fra 127.0.0.1) - **Bruksomraade:** Direkte DB-spoerrringer uten aa gaa via V8 API ### MCP-moduler (19 stk) | Kategori | Moduler | |----------|---------| | **Kjernedata** | Contacts, Accounts, Leads, Opportunities | | **Aktiviteter** | Meetings, Tasks, Calls, Emails, Notes | | **Markedsfoering** | Campaigns, Prospects, ProspectLists | | **Support** | Cases, Documents | | **Fakturering (AOS)** | AOS_Quotes, AOS_Invoices, AOS_Products, AOS_Contracts | | **System** | Users | ### MCP-verktoy (23 stk) | Verktoy | Beskrivelse | Parametere | |---------|-------------|------------| | `list_records` | Bla i poster med paginering, filtrering og feltutvlag | module, page_size, page_number, sort, filter, fields | | `get_record` | Hent enkeltpost med alle felt og relasjoner | module, record_id | | `create_record` | Opprett ny post | module, attributes | | `update_record` | Oppdater eksisterende post | module, record_id, attributes | | `delete_record` | Slett post | module, record_id | | `search_records` | Navnesok (LIKE) pa tvers av modul | module, query, page_size | | `get_record_count` | Totalt antall poster i modul | module | | `import_records` | Batch-opprett opptil 50 poster, rapporterer per-post resultat | module, records | | `get_relationships` | Hent relaterte poster | module, record_id, relationship, page_size | | `create_relationship` | Koble to poster (POST) | parent_module, parent_id, related_module, related_id | | `delete_relationship` | Fjern kobling mellom to poster (DELETE) | parent_module, parent_id, related_module, related_id | | `get_module_fields` | Hent feltdefinisjoner for modul | module | | `get_language_strings` | Hent oversatte labels for modul/global | module, language | | `search_labels` | Sok etter labels, finn uoversatte | module, query, language | | `set_label` | Skriv/oppdater label i custom Extension (lag 4) | module, key, value, language | | `deploy_css` | Skriv CSS til magitekExt styles.scss | rules, mode (append/replace), rebuild | | `get_view_layout` | Les viewdefs (detail/edit/list) som JSON | module, view | | `get_angular_view_definition` | Hent Angular view-definisjon (det frontend faktisk rendrer) | module, view | | `get_module_metadata` | Komplett modul-metadata fra Angular-laget | module | | `get_app_metadata` | App-level metadata (navigasjon, modulliste, global config) | (ingen) | | `get_system_config` | Systemkonfigurasjon (enkelt key eller alle) | key (valgfri) | | `introspect_graphql_schema` | Introspekt GraphQL schema — queries, mutations, types | (ingen) | | `run_graphql_query` | Kjoer vilkaarlig GraphQL query (debug/utforskning) | query, variables (valgfri) |
MCP/API-integrasjon suitecrm knowledge low CURRENT-architecture.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-architecture.md
Source date: 2026-03-19
Keywords: ["mcpapiintegrasjon"]
Cross-domain: []
Symptoms: []
Body:
## MCP/API-integrasjon ### V8 API — OAuth2 klient registrert | Egenskap | Verdi | |----------|-------| | **Client ID** | 1d2f243f-1f7a-11f1-9cd8-bc2411ea6c8c | | **Client Secret** | MagitekMCP2026 | | **Grant Type** | password | | **API URL** | http://172.20.0.102/Api/V8/ | | **Auth URL** | http://172.20.0.102/Api/access_token | ### GraphQL API — Session-basert (IKKE OAuth2) | Egenskap | Verdi | |----------|-------| | **Endpoint** | `http://172.20.0.102/api/graphql` | | **Auth** | Session-basert (cookies), IKKE OAuth2 bearer tokens | | **CSRF** | X-XSRF-TOKEN header (fra XSRF-TOKEN cookie) | **Auth-flow:** 1. `GET /` -- hent cookies (SCRMSESSID + XSRF-TOKEN) 2. `POST /login` med username/password + `X-XSRF-TOKEN` header -- etabler session 3. `POST /api/graphql` med session-cookies + `X-XSRF-TOKEN` -- autentisert **Queries:** viewDefinition, moduleMetadata, appMetadata, systemConfig, navbar, record, recordList, fieldDefinition, appListStrings, modStrings, userPreference, process, statistic, themeImages **Mutations:** saveRecord, createProcess, media object CRUD **KRITISK:** OAuth2 bearer tokens (fra V8 API) gir `403 Invalid CSRF token` paa GraphQL-endepunktet. De to API-ene har FORSKJELLIGE auth-mekanismer. ### MCP-servere (9 stk i suitecrm-dev) | MCP-server | Formaal | Framework | |------------|---------|-----------| | **suitecrm** | CRUD, metadata, labels, CSS-deploy, viewdefs | FastMCP (Python) | | **context7** | SuiteCRM 8 Angular/Symfony dokumentasjon | context7 | | **playwright** | Browser-testing av UI-endringer | Playwright MCP (@0.0.68, pinned) | | **serena** | Lokal kodenavigasjon (suitecrm-dev workspace) | Serena (stdio) | | **serena-suitecrm** | Remote kodenavigasjon paa SuiteCRM-server (PHP+TS LSP, read-only) | Serena (SSE, port 8000) | | **github** | Issues, PRs, releases | GitHub MCP | | **lighthouse** | Performance/accessibility audits | Lighthouse MCP | | **css** | CSS-analyse og validering | CSS MCP | | **mysql** | Direkte DB-spoerrringer (read-only via suitecrm_ro) | MySQL MCP | **Fjernet:** `accessibility` (mcp-accessibility-scanner) — konfliktet med Playwright MCP og forhindret lasting. Playwright @0.0.68 dekker WCAG-testing. - **SuiteCRM MCP kode:** `/var/www/mcp-servers/packages/mcp-suitecrm/server.py` - **GraphQL-klient:** `/var/www/mcp-servers/packages/mcp-suitecrm/graphql_client.py` (session-auth, auto-relogin) - **GraphQL-tools:** `/var/www/mcp-servers/packages/mcp-suitecrm/tools/graphql.py` (6 tools) - **Config:** `.mcp.json` i suitecrm-dev (git-tracket) - **Tester:** `/var/www/mcp-servers/packages/mcp-suitecrm/test_server.py` - **Framework:** FastMCP (Python)
Tre strengtyper suitecrm knowledge medium CURRENT-architecture.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-architecture.md
Source date: 2026-03-19
Keywords: ["tre","strengtyper","Contacts","Accounts"]
Cross-domain: []
Symptoms: []
Body:
### Tre strengtyper | Type | Scope | Eksempel | |------|-------|----------| | `app_strings` | Globale labels | LBL_SAVE_BUTTON_LABEL, LBL_SEARCH | | `app_list_strings` | Dropdowns/lister | sales_stage_dom, lead_source_dom | | `mod_strings` | Per-modul labels | LBL_FIRST_NAME (i Contacts) | ### Viktige regler - Custom labels ALLTID i lag 4 (Custom Extension) — overlever oppgraderinger - Etter label-endring i Extension-filer: kjoer Quick Repair & Rebuild via CLI-script — `cache:clear` er IKKE nok - Angular frontend har INGEN egne i18n-filer — henter alt fra legacy via GraphQL - Studio-opprettede labels lagres i `fields_meta_data` DB-tabell (32 entries, 0 med custom vname) ### Vanlige oversettelsesoperasjoner #### Oversett en modul-label ```php // public/legacy/custom/Extension/modules/Contacts/Ext/Language/nb_NO.custom_translations.php <?php $mod_strings['LBL_FIRST_NAME'] = 'Fornavn'; $mod_strings['LBL_LAST_NAME'] = 'Etternavn'; ``` #### Oversett en global label ```php // public/legacy/custom/include/language/nb_NO.lang.php $app_strings['LBL_SAVE_BUTTON_LABEL'] = 'Lagre'; ``` #### Oversett dropdown-verdier ```php // public/legacy/custom/include/language/nb_NO.lang.php $app_list_strings['sales_stage_dom']['Prospecting'] = 'Prospektering'; $app_list_strings['sales_stage_dom']['Qualification'] = 'Kvalifisering'; ``` #### Finn uoversatte labels (SSH) ```bash ssh suitecrm "cd /var/www/suitecrm && php -r \" require 'public/legacy/include/entryPoint.php'; \\\$en = return_module_language('en_us', 'Contacts'); \\\$nb = return_module_language('nb_NO', 'Contacts'); foreach(\\\$en as \\\$k => \\\$v) { if(!isset(\\\$nb[\\\$k]) || \\\$nb[\\\$k] === \\\$v) echo \\\$k . ': ' . \\\$v . PHP_EOL; } \"" ``` --- ## Database — Nokkeltabeller (226 totalt) | Tabell | Innhold | Rader (per 2026-03-14) | |--------|---------|----------------------| | `contacts` | Kontakter | 4 | | `accounts` | Firmaer | 3 | | `relationships` | Relasjonsmetadata | 471 | | `acl_actions` | Tilgangskontroll | 448 | | `fields_meta_data` | Custom fields (Studio) | 32 | | `users` | Brukere | 3 (admin, kinga, heine) | | `config` | Systemkonfigurasjon | 18 | | `schedulers` | Planlagte jobber | 13 | | `email_templates` | E-postmaler | 9 | **Relasjonstabeller:** `{modul1}_{modul2}` (f.eks. `accounts_contacts`) **Custom fields:** `{modul}_cstm` (f.eks. `accounts_cstm`) ---
Utvikling — Vanlige Oppgaver suitecrm knowledge medium CURRENT-architecture.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-architecture.md
Source date: 2026-03-19
Keywords: ["utvikling","vanlige","oppgaver","Contacts"]
Cross-domain: []
Symptoms: []
Body:
## Utvikling — Vanlige Oppgaver ### Custom Fields (Vardefs) ```php // public/legacy/custom/Extension/modules/Contacts/Ext/Vardefs/custom_fields.php $dictionary['Contact']['fields']['my_field_c'] = array( 'name' => 'my_field_c', 'vname' => 'LBL_MY_FIELD', 'type' => 'varchar', 'len' => 255, 'source' => 'custom_fields', ); ``` Deretter: Quick Repair & Rebuild (se gotcha DEV-03 — `cache:clear` er IKKE nok for Extension-filer) ### Custom Labels ```php // public/legacy/custom/Extension/modules/Contacts/Ext/Language/en_us.custom.php $mod_strings['LBL_MY_FIELD'] = 'My Field'; ``` ### Logic Hooks ```php // public/legacy/custom/modules/Contacts/logic_hooks.php $hook_array['before_save'][] = array( 1, 'Hook Name', 'custom/modules/Contacts/MyHook.php', 'MyHook', 'beforeSave' ); ``` ### Frontend Extension (Angular) **magitekExt** er vaar aktive extension (`enabled: true`). defaultExt er `enabled: false`. Bygg etter endring: ```bash ssh suitecrm 'cd /var/www/suitecrm && sudo -n -u www-data yarn build:extension magitekExt' ``` VIKTIG: Bygg MÅ kjores paa suitecrm-serveren (172.20.0.102) — Angular build avhenger av relative paths til dist/core. CSS-strategi: Extension SCSS er SCOPED og treffer IKKE host-DOM (se DEV-15). Globale CSS-overrides maa i `public/dist/custom-overrides.css`. Se CURRENT-angular-css.md. Tema-system: Multi-tema med CSS custom properties (Nordic + HubSpot). Se CURRENT-theme-system.md for variabler, legacy-lag, gotchas. ### Quick Repair & Rebuild fra CLI (etter Extension-endringer) Extension-filer (Vardefs, Language, Layoutdefs) MÅ kompileres til `*.ext.php` — `cache:clear` er ikke nok. ```bash ssh suitecrm 'sudo -n -u www-data php /var/www/suitecrm/scripts/rebuild_extensions.php' ``` ### Cache Clear (etter ikke-Extension-endringer) ```bash ssh suitecrm 'cd /var/www/suitecrm && sudo -n -u www-data php bin/console cache:clear' ``` --- ## Oversettelser og Sprak ### Installerte sprak - `en_us` (standard) - `nb_NO` (norsk bokmal) ### 6-lags oversettelseshierarki Senere lag overstyrer tidligere. Kun lag 3 og 4 er redigerbare. | Lag | Plassering | Beskrivelse | Redigerbar? | |-----|-----------|-------------|-------------| | 1. Core app_strings | `legacy/include/language/{lang}.lang.php` | Globale labels (3000+) | NEI — overskrives ved upgrade | | 2. Core mod_strings | `legacy/modules/{Mod}/language/{lang}.lang.php` | Per-modul labels (108 av 118 moduler har nb_NO) | NEI | | 3. Custom global | `legacy/custom/include/language/{lang}.lang.php` | Overstyring av app_strings/app_list_strings | JA | | 4. Custom Extension | `legacy/custom/Extension/modules/{Mod}/Ext/Language/*.php` | Per-modul custom labels (47 nb_NO-filer) | JA — dette er riktig sted | | 5. Custom compiled | `legacy/custom/modules/{Mod}/Ext/Language/{lang}.lang.ext.php` | Auto-kompilert fra lag 4 ved Quick Repair | Auto-generert | | 6. Angular frontend | `core/app/.../language.store.ts` → GraphQL → Legacy | Henter alt fra lag 1-5 via API | Indirekte |
Filstruktur for Utvikling suitecrm knowledge medium CURRENT-architecture.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-architecture.md
Source date: 2026-03-19
Keywords: ["filstruktur","for","utvikling","Leads"]
Cross-domain: []
Symptoms: []
Body:
## Filstruktur for Utvikling ``` /var/www/suitecrm/ ├── extensions/ │ ├── defaultExt/ # Standard extension (enabled=false) │ │ ├── config/extension.php # MERK: enabled=false etter upgrade │ │ └── ... # Standard Angular/backend scaffold │ └── magitekExt/ # VAAR extension (enabled=true, aktiv) │ ├── app/src/ │ │ ├── extension.module.ts # Angular entry point │ │ ├── styles.scss # Global CSS-overrides (oppgraderingssikker) │ │ ├── navbar/ │ │ │ ├── static-navbar.model.ts # NavbarAbstract subklasse (SC-0034) │ │ │ ├── static-navbar.component.ts # BaseNavbarComponent override │ │ │ ├── static-navbar.component.html # Statisk meny-template │ │ │ └── static-navbar.module.ts # NgModule │ │ └── fields/ │ │ ├── postalcode/ # Norsk postnummer (Bring API) │ │ └── orgnr/ # Org-nr validering (Brreg API) │ ├── backend/ # Symfony backend (autowired) │ ├── config/ │ │ ├── extension.php # enabled=true, remoteEntry=../extensions/magitekExt/remoteEntry.js │ │ └── services.yaml # Symfony DI config │ └── modules/ │ └── Leads/Service/ │ └── CopyAddressHandler.php # ProcessHandler: copy-address ├── scripts/ │ ├── rebuild_extensions.php # CLI Quick Repair & Rebuild (Extension compilation) │ ├── inject-custom-css.sh # Re-injiser CSS-link + tema-script i index.html etter oppgradering │ └── theme-toggle.sh # Slaa tema-overrides av/paa (renamer .bak) ├── core/backend/ # Core Symfony backend ├── public/legacy/ │ ├── modules/ # 120 Legacy-moduler │ ├── custom/ │ │ ├── modules/{Module}/ # Per-modul tilpasning │ │ └── Extension/modules/{Module}/ │ │ ├── Ext/Vardefs/ # Custom field definitions │ │ ├── Ext/Language/ # Custom labels │ │ └── Ext/Layoutdefs/ # Custom layouts │ └── config.php # Legacy DB config ├── public/dist/ │ ├── custom-overrides.css # Globale CSS-overrides med CSS custom properties (multi-tema) │ └── index.html # Tema-script + cache-buster (overskrives ved oppgradering!) └── bin/console # Symfony CLI ``` ---
Arkitektur — Dual-Layer System suitecrm knowledge medium CURRENT-architecture.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-architecture.md
Source date: 2026-03-19
Keywords: ["arkitektur","duallayer","system","Leads","Contacts"]
Cross-domain: []
Symptoms: []
Body:
# SuiteCRM 8 Architecture & Development Guide **Version:** 2.8 **Date:** 2026-03-19 **Source:** Extracted from magitek-ops EXPERT-infra-suitecrm-v1.6, updated with MP-0001, MP-0004, DEV-24 rotarsak-oppdatering, DEV-27 Serena param-hook, DEV-28/29/30 RecordModal+GraphQL bugs, SC-0033 multi-tema, SC-0034 statisk navbar, DEV-32 orphan-utvidelse, NOPASSWD sudo migration **Load:** coordination/experts/suitecrm/CURRENT-architecture.md --- ## Arkitektur — Dual-Layer System SuiteCRM 8 har **to lag** som sameksisterer: ### Core Layer (moderne) - **Frontend:** Angular 18 SPA med Module Federation (Webpack) - **Backend:** Symfony 6.4 (PHP 8.3) med Doctrine ORM - **API:** JSON API V8 (`/Api/V8/`) — RESTful, OAuth2 | GraphQL (`/api/graphql`) — session-auth, CSRF - **Extensions:** `/var/www/suitecrm/extensions/` - **CLI:** `php bin/console` (Symfony console) ### Legacy Layer (Sugar-arv) - **Engine:** SugarCRM CE 6.5.25-basert PHP - **Moduler:** `/var/www/suitecrm/public/legacy/modules/` (120 moduler) - **Custom:** `/var/www/suitecrm/public/legacy/custom/` (vardefs, layouts, logic hooks) - **Studio/ModuleBuilder:** Kun i Legacy-laget - **Import Wizard:** Kun i Legacy-laget --- ## B2B-tilpasning — Leads som firmakort Magitek bruker Leads som firmakort i tidlig salgsfase (B2B). Leads har flere kontaktpersoner via many-to-many relasjon (`leads_contacts_1`) + primaer lead-felt paa Contact (`contacts.lead_id`). Se `CURRENT-leads-contacts-architecture.md` for komplett dokumentasjon. Denne arkitekturen betyr at agenter som jobber med Leads ALLTID maa lese `CURRENT-leads-contacts-architecture.md` foerst. --- ## Stack | Komponent | Versjon | Status | |-----------|---------|--------| | SuiteCRM | 8.9.2 (oppgradert fra 8.9.0 2026-03-13) | Aktiv | | Legacy engine | sugar_version 6.5.25 | Aktiv | | Apache | 2.4 | Aktiv | | PHP | 8.3.6 (cli) | Aktiv | | MySQL | 8.0.43 | Aktiv | | Node.js | 18.20.8 | Aktiv (for Angular extension builds) | | Yarn | 4.10.3 | Aktiv (PnP, for extension builds) | | Swap | 4GB (`/swapfile`) | Aktiv (lagt til for Angular builds) | | Composer | `/tmp/composer` (ikke i PATH) | Manuelt installert, kun for sjekker | **APP_ENV:** prod **DocumentRoot:** /var/www/suitecrm/public ---
Etter SuiteCRM-oppgradering suitecrm knowledge medium CURRENT-theme-system.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-theme-system.md
Source date: 2026-03-17
Keywords: ["etter","suitecrmoppgradering"]
Cross-domain: []
Symptoms: []
Body:
### Etter SuiteCRM-oppgradering ```bash # 1. Kopier CSS tilbake scp coordination/themes/custom-overrides.css suitecrm:/var/www/suitecrm/public/dist/ # 2. Re-injiser <link> tag og tema-script ssh suitecrm "/var/www/suitecrm/scripts/inject-custom-css.sh" # 3. Oppdater cache-buster ssh suitecrm "sed -i 's/custom-overrides.css\"/custom-overrides.css?v=YYYYMMDD-themesN\"/' /var/www/suitecrm/public/dist/index.html" ``` ### Verifikasjon ```bash # Sjekk at filen finnes og har innhold ssh suitecrm "wc -l /var/www/suitecrm/public/dist/custom-overrides.css" # Sjekk at <link> tag og tema-script er i index.html ssh suitecrm "grep -E 'custom-overrides|suitecrmTheme' /var/www/suitecrm/public/dist/index.html" # Visuell verifikasjon via Playwright # mcp__playwright__browser_navigate → https://suitecrm-url/ # mcp__playwright__browser_take_screenshot ``` ### Toggle tema-overrides av/paa Script paa remote server: `/var/www/suitecrm/scripts/theme-toggle.sh` ```bash # Sjekk status ssh suitecrm "/var/www/suitecrm/scripts/theme-toggle.sh status" # Slaa av alle overrides (vis original SuiteCRM) ssh suitecrm "/var/www/suitecrm/scripts/theme-toggle.sh off" # Slaa paa igjen ssh suitecrm "/var/www/suitecrm/scripts/theme-toggle.sh on" ``` Scriptet renamer begge CSS-lag (.bak) slik at original SuiteCRM vises. Hard refresh (Ctrl+Shift+R) i nettleseren etter bytte. --- ## 10. Hva som IKKE skal endres | Sti | Grunn | |-----|-------| | `core/app/shell/src/themes/suite8/css/` | Core SCSS -- overskrives ved oppgradering | | `public/dist/styles.<hash>.css` | Kompilert Angular CSS -- regenereres ved bygg | | Global `a { color }` uten scope | Treffer ALT inkl. knapper og meny | | `extensions/{ext}/app/src/styles.scss` for globale overrides | SCOPED -- treffer aldri host-DOM | --- ## 11. Gjeldende cache-buster ``` custom-overrides.css?v=20260317-themes5 ``` Sist oppdatert: 2026-03-17 (SC-0033 multi-tema system). --- ## 12. Relaterte registreringer | SC-ID | Beskrivelse | Dato | |-------|-------------|------| | SC-0026 | Lenkefarger (staalblaa `#4a6fa5`) | 2026-03-16 | | SC-0027 | Nordisk SaaS meny | 2026-03-16 | | SC-0033 | Multi-tema system (Nordic + HubSpot) med CSS custom properties og legacy colourSelector | 2026-03-17 | | SC-0007 | CSS recovery script (`inject-custom-css.sh`) | 2026-03-15 | | SC-0008 | magitekExt (extension SCSS scoping-oppdagelse) | 2026-03-15 | | SC-0015 | Postnr+poststed CSS (inline layout) | 2026-03-16 | | SC-0034 | Statisk navbar (aktiv modul beholder posisjon, CSS `.active`-klasse) | 2026-03-17 |
8. SuiteCRM 8 innebygd tema-system (referanse) suitecrm knowledge medium CURRENT-theme-system.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-theme-system.md
Source date: 2026-03-17
Keywords: ["suitecrm","innebygd","temasystem","referanse"]
Cross-domain: []
Symptoms: []
Body:
## 8. SuiteCRM 8 innebygd tema-system (referanse) SuiteCRM 8 har et rudimentaert tema-system som vi IKKE bruker aktivt. ### Tema-kataloger ``` core/app/shell/src/themes/ suite8/ <-- Aktivt tema (SCSS + images) css/ abstracts/_variables.scss <-- Alle fargevariabler (kompileringstid) layout/_navbar.scss <-- Navbar-regler vi overrider layout/_navbar-mobile.scss <-- Mobil-navbar (ogsaa $salmon-pink) components/_button.scss <-- Knappefarger ($salmon-pink bakgrunn) components/_dropdown.scss <-- Dropdown-meny-regler images/ <-- Tema-ikoner (SVG, PNG) default/ default.php <-- Stub ("stub for default view") ``` ### Backend tema-preferanse - `user_preferences` har `user_theme`-noekkel per bruker - `AppMetadata` GraphQL returnerer `themeImages` til frontend - `ThemeImagesStore` (Angular) kan laste tema-spesifikke bilder - MEN: Ingen Angular UI for tema-bytting i SuiteCRM 8 standard - MEN: Ingen runtime CSS-variabel-system -- alle SCSS-variabler kompileres til statisk CSS ### Noekkelvariabel i suite8-temaet | Variabel | Verdi | Beskrivelse | |----------|-------|-------------| | `$salmon-pink` | `#f5aea6` | Aktiv meny, SVG, knapper -- den "rosa" fargen vi erstatter | | `$lighter-salmon-pink` | `#faeeeb` | Saved search bakgrunn | | `$very-light-salmon-pink` | `#f2d4ce` | Lyseste variant | | `$off-white` | `#f5f5f5` | Bakgrunner, meny inaktiv tekst i noen kontekster | | `$median-grey` | `#333333` | Tekst | | `$midnight-grey` | `#666666` | Sekundaer tekst | --- ## 9. Deploy-prosedyre ### Endre Angular-lag CSS ```bash # 1. Deploy CSS til remote server scp coordination/themes/custom-overrides.css suitecrm:/var/www/suitecrm/public/dist/custom-overrides.css # 2. Bump cache-buster i index.html ssh suitecrm "sed -i 's/custom-overrides.css?v=[^\"'\'']*\"/custom-overrides.css?v=YYYYMMDD-themesN\"/' /var/www/suitecrm/public/dist/index.html" ``` ### Endre legacy-lag CSS ```bash # 1. Deploy colourSelector.php scp colourSelector.php suitecrm:/var/www/suitecrm/public/legacy/custom/themes/suite8/css/colourSelector.php # 2. Toemm legacy CSS-cache ssh suitecrm "rm -rf /var/www/suitecrm/cache/themes/suite8/css/" # 3. Bump js_custom_version i config.php (valgfritt men anbefalt) ssh suitecrm "cd /var/www/suitecrm && php -r '\$c=include\"config.php\"; echo \$c[\"js_custom_version\"];'" ```
6. Komplett selektor-referanse suitecrm knowledge medium CURRENT-theme-system.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-theme-system.md
Source date: 2026-03-17
Keywords: ["komplett","selektorreferanse"]
Cross-domain: []
Symptoms: []
Body:
## 6. Komplett selektor-referanse ### Toppmeny (Angular-lag, bruker CSS variabler) | Selektor | Treffer | Brukt i | |----------|---------|---------| | `nav.navbar` | Hele toppmenyen (full bredde) | SC-0027 bakgrunn | | `nav.navbar .top-nav-link` | Alle toppnivaa menylenker | SC-0027 tekst | | `nav.navbar .top-nav-link.nav-link-nongrouped` | Menylenker uten dropdown | SC-0027 tekst | | `nav.navbar .top-nav-link.nav-link-grouped` | Menylenker med dropdown | SC-0027 tekst | | `nav.navbar .home-nav-link` | Hjem-lenken | SC-0027 tekst | | `nav.navbar .nav-link` | Generisk nav-link (fallback) | SC-0027 tekst | | `.nav-item.active .nav-link-nongrouped` | Aktiv menyitem (uten dropdown) | SC-0027 aktiv | | `.nav-item.active .nav-link-grouped` | Aktiv menyitem (med dropdown) | SC-0027 aktiv | | `.nav-item.active .home-nav-link` | Aktiv hjem-lenke | SC-0027 aktiv | | `nav.navbar .dropdown-menu` | Dropdown-container | SC-0027 dropdown | | `nav.navbar .dropdown-menu .sub-nav-link` | Dropdown-lenker (sub) | SC-0027 dropdown | | `nav.navbar .dropdown-menu .submenu-nav-link` | Dropdown-lenker (submenu) | SC-0027 dropdown | | `nav.navbar .dropdown-menu .dropdown-item` | Dropdown-item (generisk) | SC-0027 dropdown | | `nav.navbar .search-bar input` | Soekefelt input | SC-0027 soekefelt | | `nav.navbar .search-bar-term` | Soekefelt term-visning | SC-0027 soekefelt | | `nav.navbar svg` | Alle SVG-ikoner i navbar | SC-0027 ikoner | ### Lenker (liste- og detaljvisning) | Selektor | Treffer | Brukt i | |----------|---------|---------| | `a.field-link` | Listevisning lenker (felt-lenker) | SC-0026 | | `.list-view-table a` | Listevisning fallback (alle lenker i tabellen) | SC-0026 | | `.field-layout-field-wrapper a` | Detaljvisning felt-lenker | SC-0026 | | `.sub-panel a.field-link` | Subpanel felt-lenker | SC-0026 | | `scrm-subpanel-table a` | Subpanel alle lenker (fallback) | SC-0026 | --- ## 7. Hvordan lage et nytt tema 1. **Legg til CSS variabler:** Ny `[data-theme="mitttema"]` seksjon i `custom-overrides.css` med ALLE variabler fra seksjon 2 2. **Legg til legacy-farger:** Oppdater `colourSelector.php` til aa vaere tema-aware (les tema fra cookie/parameter), eller lag en separat fil 3. **Deploy CSS:** Kopier `custom-overrides.css` til remote server + bump cache-buster i `index.html` 4. **Bytt tema:** `localStorage.setItem('suitecrmTheme', 'mitttema'); document.documentElement.setAttribute('data-theme', 'mitttema'); location.reload();` Foreloepig krever legacy-laget manuell oppdatering av hardkodede farger i colourSelector.php per tema. ---
THEME-GOTCHA-05: index.html overskrives ved oppgradering suitecrm knowledge medium CURRENT-theme-system.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-theme-system.md
Source date: 2026-03-17
Keywords: ["themegotcha05","indexhtml","overskrives","ved","oppgradering"]
Cross-domain: []
Symptoms: []
Body:
### THEME-GOTCHA-05: index.html overskrives ved oppgradering SuiteCRM-oppgradering regenererer `public/dist/index.html`. Baade `custom-overrides.css`-filen, `<link>`-taggen og tema-scriptet maa gjenopprettes: 1. Kopier CSS-filen tilbake til `public/dist/` 2. Kjoer `scripts/inject-custom-css.sh` for aa re-injisere `<link>`-taggen og tema-scriptet 3. Oppdater cache-buster ### THEME-GOTCHA-06: Legacy iframe har IKKE tilgang til CSS custom properties Legacy dashboard iframe lastes i en separat kontekst og har IKKE tilgang til `--nav-bg` etc. fra Angular-laget. Legacy overrides MAA bruke hardkodede fargeverdier i colourSelector.php. ### THEME-GOTCHA-07: Legacy CSS caches i `cache/themes/suite8/css/` Legacy CSS caches i `cache/themes/suite8/css/Dawn/style.css`. Etter endring av colourSelector.php eller style.css: 1. Slett `cache/themes/suite8/css/` mappen paa remote server 2. Bump `js_custom_version` i `config.php` ### THEME-GOTCHA-08: colourSelector.php lastes ikke fra custom/ automatisk SuiteCRM laster IKKE filer fra `custom/themes/suite8/css/` automatisk. colourSelector.php krever en `_head.tpl` override i `custom/themes/suite8/tpls/_head.tpl` som eksplisitt inkluderer den. ### THEME-GOTCHA-09: `.dashletPanel .h3Row` har sterk specificity Dashboard header bruker `.dashletPanel .h3Row` som har hoey specificity. MAA overrides eksplisitt -- generiske `.hd` selektorer er ikke nok. ### THEME-GOTCHA-10: `#dashboard #tab-actions` bruker ID-selektorer Actions-knappen paa dashboard bruker ID-selektorer som krever matchende ID-selektor i override. Class-selektorer er ikke spesifikke nok. ### THEME-GOTCHA-11: SVG sort-piler har inline `fill="#FFFFFF"` Sort-piler i tabellheadere har inline SVG `fill` attributt. CSS `fill` property med `!important` overstyrer dette, men krever eksplisitte selektorer for `svg`, `svg g`, og `svg polygon`. ### THEME-GOTCHA-12: `#pageContainer .dashletcontainer .pagination td` har ID-selektor Pagination-omraadet bruker ID-selektor `#pageContainer` som krever matchende ID-selektor i override. ---
4. Filer paa remote server (172.20.0.102) suitecrm knowledge medium CURRENT-theme-system.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-theme-system.md
Source date: 2026-03-17
Keywords: ["filer","paa","remote","server","172200102"]
Cross-domain: []
Symptoms: []
Body:
## 4. Filer paa remote server (172.20.0.102) | Fil | Formaal | |-----|---------| | `/var/www/suitecrm/public/dist/custom-overrides.css` | Angular-lag CSS med custom properties | | `/var/www/suitecrm/public/dist/index.html` | Tema-script + cache-buster | | `/var/www/suitecrm/public/legacy/custom/themes/suite8/css/colourSelector.php` | Legacy dashboard overrides (HubSpot-farger) | | `/var/www/suitecrm/public/legacy/custom/themes/suite8/css/Dawn/style.css` | Legacy style override (appended til cached style.css) | | `/var/www/suitecrm/public/legacy/custom/themes/suite8/tpls/_head.tpl` | Template override for aa laste colourSelector.php | **Lokal kopi:** `coordination/themes/custom-overrides.css` -- kilde for Angular-lag CSS --- ## 5. CSS Specificity-gotchas (KRITISK) ### THEME-GOTCHA-01: Angular-temaets `!important`-regler SuiteCRM 8 suite8-tema bruker `!important` paa aktiv menyitem: ```scss // _navbar.scss linje 136-137: .nav-item.active .nav-link-nongrouped, .nav-item.active .nav-link-grouped, .nav-item.active .home-nav-link { color: $salmon-pink!important; // #f5aea6 border-top: 0.2em solid $salmon-pink; // #f5aea6 } ``` For aa overstyre: vaar CSS MAA matche eller overgaa specificity OG bruke `!important`. Siden `custom-overrides.css` lastes ETTER `styles.css`, vinner vaar regel ved lik specificity + begge `!important`. ### THEME-GOTCHA-02: `$salmon-pink` (#f5aea6) er gjennomgaaende Variabelen `$salmon-pink` brukes i 30+ regler paa tvers av navbar, navbar-mobile, buttons, dropdowns, SVG, saved-search. Vi overrider kun de synlige elementene -- knappefarger og noen SVG-ikoner beholder original `$salmon-pink` foreloepig. ### THEME-GOTCHA-03: Cache-buster i index.html Nettlesere cacher `index.html` aggressivt. Etter CSS-deploy: 1. Bump `?v=` parameteren i `index.html` 2. Hard-refresh i nettleser (Ctrl+Shift+R) Uten begge steg kan gammel CSS vises. ### THEME-GOTCHA-04: Unscoped `a { color }` treffer knapper og meny ALDRI bruk `a { color: ... }` uten scope -- det treffer ALLE lenker inkludert menylenker, knapper med `<a>` tag, og modale dialoger. Bruk alltid scopede selektorer (`.field-link`, `.list-view-table a`, etc.).
KRITISK: Extension SCSS treffer IKKE host-DOM suitecrm knowledge medium CURRENT-theme-system.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-theme-system.md
Source date: 2026-03-17
Keywords: ["kritisk","extension","scss","treffer","ikke","hostdom"]
Cross-domain: []
Symptoms: []
Body:
### KRITISK: Extension SCSS treffer IKKE host-DOM Extension `styles.scss` (f.eks. `extensions/magitekExt/app/src/styles.scss`) er SCOPED av Module Federation. Den treffer KUN komponenter inne i extensionens egne Angular-komponenter, ALDRI navbar, listview, eller andre host-elementer. Se CURRENT-angular-css.md for full forklaring. **Eneste mekanisme for globale CSS-overrides: `custom-overrides.css`** --- ## 2. CSS Custom Properties (variabel-referanse) Alle variabler defineres i `custom-overrides.css` per tema: | Variabel | Formaal | Nordic | HubSpot | |----------|---------|--------|---------| | `--nav-bg` | Navbar bakgrunn | `#374151` | `#2D3E50` | | `--nav-text` | Navbar tekst (inaktiv) | `#F9FAFB` | `#C1D6E6` | | `--nav-hover-bg` | Navbar hover bakgrunn | `#4B5563` | `#4A657D` | | `--nav-hover-text` | Navbar hover tekst | `#FFFFFF` | `#FFFFFF` | | `--nav-active-bg` | Navbar aktiv bakgrunn | `#3B82F6` | `#5B7A99` | | `--nav-active-text` | Navbar aktiv tekst | `#FFFFFF` | `#FFFFFF` | | `--nav-active-border` | Navbar aktiv border | `#3B82F6` | `#5B7A99` | | `--dropdown-bg` | Dropdown bakgrunn | `#FFFFFF` | `#3F5870` | | `--dropdown-border` | Dropdown border | `#E5E7EB` | `#4A657D` | | `--dropdown-text` | Dropdown tekst | `#374151` | `#EAF0F6` | | `--dropdown-hover-bg` | Dropdown hover bakgrunn | `#EEF2FF` | `#4A657D` | | `--dropdown-hover-text` | Dropdown hover tekst | `#1E40AF` | `#FFFFFF` | | `--search-bg` | Soekefelt bakgrunn | `#4B5563` | `#3F5870` | | `--search-border` | Soekefelt border | `#6B7280` | `#4A657D` | | `--search-text` | Soekefelt tekst | `#F9FAFB` | `#EAF0F6` | | `--search-placeholder` | Soekefelt placeholder | `#9CA3AF` | `#8FAABE` | | `--link-color` | Lenker standard | `#4a6fa5` | `#4a6fa5` | | `--link-visited` | Lenker visited | `#3d5a87` | `#3d5a87` | | `--link-hover` | Lenker hover | `#2e4f78` | `#2e4f78` | | `--icon-filter` | SVG ikon-filter | `brightness(2)` | `brightness(2)` | --- ## 3. HubSpot tema -- Legacy dashboard-verdier colourSelector.php bruker hardkodede farger (IKKE CSS variabler): | Element | Selektorer | Bakgrunn | Tekst | Border | |---------|-----------|----------|-------|--------| | Dashlet header | `.dashletPanel .h3Row`, `.hd.dashlet` | `#F6F9FC` | `#33475B` | `1px solid #EAF0F6` | | Column headers | `.dashletPanel thead`, `table.list.view thead` | `#EAF0F6` | `#33475B` | -- | | Pagination | `#pageContainer .dashletcontainer .pagination td` | `#EAF0F6` | `#33475B` | -- | | Active tab | `.content .nav-tabs > li.active > a` | `#FFFFFF` | `#33475B` | `1px solid #EAF0F6` | | Tab (inaktiv) | `.content .nav-tabs > li > a` | `#F6F9FC` | `#33475B` | `1px solid #EAF0F6` | | Actions button | `#dashboard #tab-actions > a.dropdown-toggle` | `#F6F9FC` | `#33475B` | `1px solid #EAF0F6` | | Actions dropdown | `#dashboard #tab-actions ul.dropdown-menu` | `#FFFFFF` | `#33475B` | -- | | Actions hover | `#dashboard #tab-actions ul.dropdown-menu li:hover` | `#EAF0F6` | `#33475B` | -- | | SVG sort-piler | `.dashletPanel thead svg polygon` | fill: `#33475B` | opacity: `0.8` | -- | ---
1. Tema-arkitektur suitecrm knowledge medium CURRENT-theme-system.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-theme-system.md
Source date: 2026-03-17
Keywords: ["temaarkitektur"]
Cross-domain: []
Symptoms: []
Body:
# SuiteCRM 8 Theme System -- Ekspertfil **Version:** 2.0 **Date:** 2026-03-17 **Source:** SC-0026 (lenkefarger), SC-0027 (Nordisk SaaS meny), SC-0033 (multi-tema system), verifisert mot remote server **Load:** coordination/experts/suitecrm/CURRENT-theme-system.md --- ## 1. Tema-arkitektur ### Multi-tema system med to CSS-lag Vi bruker et multi-tema system med CSS custom properties for Angular-laget og en custom colourSelector.php for legacy dashboard iframe. | Egenskap | Verdi | |----------|-------| | **Angular-lag** | `public/dist/custom-overrides.css` | | **Legacy iframe-lag** | `custom/themes/suite8/css/colourSelector.php` | | **Tema-bytting** | `localStorage.setItem('suitecrmTheme', 'hubspot')` + `document.documentElement.setAttribute('data-theme', 'hubspot')` | | **Tema-script** | I `public/dist/index.html`, leser tema fra localStorage ved page load | | **Cache-buster** | `?v=YYYYMMDD-themesN` parameter paa link-taggen | | **Recovery** | `scripts/inject-custom-css.sh` re-injiserer `<link>` etter oppgradering | | **Temaer** | `nordic` (default), `hubspot` | | **Lokal kopi** | `coordination/themes/custom-overrides.css` | ### To CSS-lag **Angular-lag** (`public/dist/custom-overrides.css`): - Bruker CSS custom properties (`--nav-bg`, `--nav-text`, etc.) - Tema-spesifikke verdier via `[data-theme="nordic"]` og `[data-theme="hubspot"]` selektorer - `:root` har Nordic-verdier som default **Legacy iframe-lag** (`custom/themes/suite8/css/colourSelector.php`): - Lastes via custom `_head.tpl` override (`custom/themes/suite8/tpls/_head.tpl`) - Overstyrer dashboard headers, column headers, pagination, tabs, Actions dropdown - Bruker HARDKODEDE fargeverdier -- legacy iframe har IKKE tilgang til Angular-lagets CSS custom properties - Foreloepig kun HubSpot-farger (legacy iframe vises kun paa dashboard) ### Specificity-modell ``` styles.<hash>.css <-- Angular-kompilert, laster FOERST custom-overrides.css <-- Vaar fil, laster SIST (med CSS custom properties) ``` Ved lik specificity + begge `!important`: **sist leste fil vinner**. MEN: mange Angular-tema-regler bruker `!important` -- vaar CSS MAA ogsaa bruke `!important` for aa overstyre disse.
GOTCHA-E-21: tsconfig.app.json — bevar original `files`/`include`-struktur suitecrm knowledge low CURRENT-extension-magitekext.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-extension-magitekext.md
Source date: 2026-03-17
Keywords: ["gotchae21","tsconfigappjson","bevar","original","filesincludestruktur"]
Cross-domain: []
Symptoms: []
Body:
### GOTCHA-E-21: tsconfig.app.json — bevar original `files`/`include`-struktur Minimal erstatning av tsconfig.app.json (f.eks. kun `compilerOptions`) inkluderer `e2e/`-katalogen i kompilering → bygge-feil. Legg kun til nye `compilerOptions`-felt (som `resolveJsonModule:true`), ikke erstatt hele filen. ### GOTCHA-E-22: Playwright `fill()` trigger IKKE Angular `(input)`-events `fill()` setter value direkte uten tastatur-events. Angular-komponentar som lyttar paa `(input)` (t.d. postnr-autofyll) reagerer ikkje. Bruk `pressSequentially()` med `slowly:true` for aa trigge korrekte input-events.
Gotchas (Extension-spesifikke) suitecrm knowledge medium CURRENT-extension-magitekext.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-extension-magitekext.md
Source date: 2026-03-17
Keywords: ["gotchas","extensionspesifikke"]
Cross-domain: []
Symptoms: []
Body:
## Gotchas (Extension-spesifikke) ### GOTCHA-E-01: Extension styles.scss er scoped — treffer ALDRI host-DOM Angular ViewEncapsulation scoper all CSS i extension SCSS til extension-elementene. Globale CSS-overrides (navbar-farger, lenkefarger, etc.) MÅ deployes via `public/dist/custom-overrides.css`. Se `CURRENT-angular-css.md` for detaljer. ### GOTCHA-E-15: `RecordModalOptions.size` (top-level) ignoreres `RecordModalService.showModal()` sender kun `modalOptions` til NgbModal. Top-level `size` leses aldri. **Riktig:** `showModal({ module: '...', modalOptions: { size: 'xl' } })` ### GOTCHA-E-16: RecordModal krever metadata pre-load FØR `showModal()` `loadMetadata()` bruker `shareReplay(1)` — første kall er async. Modal forblir tom ved første klikk. `setTimeout(0)` virker IKKE. Bruk pipe(take(1)).subscribe(). ### GOTCHA-E-17: Bruk `RecordModalService.showModal()`, IKKE `NgbModal.open()` direkte `RecordModalService` setter props korrekt via template binding. Direkte `NgbModal.open()` gir timing-problemer (ngOnInit kjører før componentInstance er satt). ### GOTCHA-E-19: GraphQL `moduleMetadata.editView` krasjer for ALLE moduler (SuiteCRM 8.9 bug) `moduleMetadata` query med `editView` returnerer "Internal server error". Bruk `get_angular_view_definition(module, 'record')` eller `get_view_layout(module, 'edit')` som workaround. Se DEV-29/DEV-30. ### GOTCHA-E-20: `RecordViewStore` er IKKJE tilgjengeleg fraa extensions (SuiteCRM 8 arkitekturbegrensning) `RecordViewStore` er ikkje eksportert i `public-api.ts` og kan dermed ikkje injiserast i extension-komponentar. Direkte import fraa `core/app/core/src/store/record-view/record-view.store.ts` bryt Angular-kompilatoren med NG8001-feil ("not a known element" / module not found). **Konsekvens:** Extensions kan ikkje lytte direkte paa record-state-endringar eller tvinge reload av record data. Monkey-patching av `window.fetch`, `XMLHttpRequest`, eller `MutationObserver` er FORBUDT — foraarsaka reload-loop og datatap i SC-0035. **Akseptabel løysing:** SessionStorage-flagg sett i `onAdd`/`onClear` callbacks, sjekka i `ngOnInit` av detail-komponent (trigger `window.location.reload()` etter edit→detail overgang). Gjeld KUN felt→subpanel retning. **Subpanel→felt retning:** Krever arkitektonisk løysing — eskaler til `/architect` etter 3 feilede forsøk.
SC-0034: Statisk navbar — aktiv modul beholder sin posisjon suitecrm knowledge medium CURRENT-extension-magitekext.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-extension-magitekext.md
Source date: 2026-03-17
Keywords: ["sc0034","statisk","navbar","aktiv","modul","beholder","sin","posisjon","Leads"]
Cross-domain: []
Symptoms: []
Body:
### SC-0034: Statisk navbar — aktiv modul beholder sin posisjon - **Dato:** 2026-03-17 - **Filer:** - `extensions/magitekExt/app/src/navbar/static-navbar.model.ts` (NavbarAbstract subklasse) - `extensions/magitekExt/app/src/navbar/static-navbar.component.ts` - `extensions/magitekExt/app/src/navbar/static-navbar.component.html` - `extensions/magitekExt/app/src/navbar/static-navbar.module.ts` - `extensions/magitekExt/app/src/extension.module.ts` (NavbarRegistry.register + import) - **Endring:** Overstyrer `NavbarAbstract.buildTabMenu()` via NavbarRegistry for å fjerne atferden der aktiv modul flyttes til første posisjon. Aktiv modul bruker `[class.active]` binding istedenfor separat rendering. - **Oppgraderingssikker:** Ja. Risiko: hvis SuiteCRM endrer `NavbarAbstract.buildTabMenu()`-signatur brytes bygget ved kompilering. Templaten må synkroniseres mot `base-navbar.component.html` ved oppgradering. --- ## Filkart ``` /var/www/suitecrm/extensions/magitekExt/ ├── config/ │ └── extension.php ← enabled=true, remoteEntry (SC-0008) ├── app/ │ ├── webpack.config.js ← dynamisk versjon-lesing (SC-0018) │ └── src/ │ ├── extension.module.ts ← entry point, registreringer (SC-0008,27,34,40) │ ├── styles.scss ← ADVARSEL: scoped! (SC-0008) │ ├── data/ │ │ └── postnummer.json ← 5122 norske postnumre, statisk (SC-0041) │ ├── services/ │ │ └── postal-code-lookup.ts ← Gjenbrukbar postnr→poststed/kommune/fylke (SC-0041) │ ├── fields/ │ │ ├── postalcode/ ← DEPRECATED — erstattet av SC-0041 │ │ ├── orgnr/ ← Brreg validering (SC-0010) │ │ ├── address-group/ ← AddressGroupComponent (SC-0016,41) │ │ ├── contact-relate/ ← Contact relate modal (SC-0027,28,32) │ │ └── lead-relate/ ← Lead relate sessionStorage+reload (SC-0040) │ └── navbar/ │ ├── static-navbar.model.ts ← (SC-0034) │ ├── static-navbar.component.ts ← (SC-0034) │ ├── static-navbar.component.html← (SC-0034) │ └── static-navbar.module.ts ← (SC-0034) ├── backend/ ← Symfony backend (autowired) └── modules/ └── Leads/Service/ └── CopyAddressHandler.php ← ProcessHandler (SC-0011) ``` ---
SC-0041: Postnummer auto-lookup — statisk JSON erstatter Bring API (MP-0006) suitecrm knowledge medium CURRENT-extension-magitekext.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-extension-magitekext.md
Source date: 2026-03-17
Keywords: ["sc0041","postnummer","autolookup","statisk","json","erstatter","bring","api","mp0006"]
Cross-domain: []
Symptoms: []
Body:
### SC-0041: Postnummer auto-lookup — statisk JSON erstatter Bring API (MP-0006) - **Dato:** 2026-03-17 - **Masterplan:** MP-0006 - **Erstatter:** SC-0009 (Bring API) - **Filer:** - `extensions/magitekExt/app/src/data/postnummer.json` (~5122 entries, ~450KB, bundlet statisk) - `extensions/magitekExt/app/src/services/postal-code-lookup.ts` (gjenbrukbar lookup-service) - `extensions/magitekExt/app/src/fields/address-group/address-group-edit.component.ts` (bruker lokal JSON istedenfor HTTP) - `extensions/magitekExt/app/src/fields/address-group/address-group-edit.component.html` (kommune_c-binding fikset, Fylke-felt lagt til) - `extensions/magitekExt/app/src/fields/address-group/address-group-detail.component.html` (viser fylke etter kommune) - `extensions/magitekExt/app/src/fields/address-group/address-group.module.ts` (fjernet HttpClientModule) - `extensions/magitekExt/app/tsconfig.app.json` (resolveJsonModule:true) - **Endring:** Erstattet Bring API HTTP-kall med bundlet statisk JSON (~5122 norske postnumre). Ved 4-sifret postnr fylles poststed, kommune (kommune_c), fylke (primary_address_state) og land (primary_address_country='Norge') automatisk. - **Feltrekkefølge i templates (edit + detail):** Postnr → Poststed → Kommune → Fylke → Land - **Bugfikser:** - Edit-template felt 4 var bundet til `primary_address_state` med placeholder "Kommune" — nå korrekt bundet til `kommune_c` - `updateCityField()` skrev poststed til BÅDE city OG state — nå skriver `updateAddressFields()` city=poststed, kommune_c=kommune, state=fylke - Land (primary_address_country) settes til 'Norge' automatisk ved gyldig postnr-oppslag - **Arkitekturbeslutninger:** - AD-2: Ingen fylke_c felt — bruker standard `primary_address_state` for fylke (finnes på alle moduler) - AD-3: Statisk TypeScript import (bundlet i extension JS, ikke lazy-loaded) - Fylke-mapping: 39=Vestfold, 40=Telemark (verifisert mot Bring-data — IKKE 38/39 som ofte antatt) - **Oppgraderingssikker:** Ja — Extension-filer. Postnummer-data kan bli utdatert — oppdater JSON ved behov.
SC-0027: RecordModal — saveNew action handler + RecordModalService (MP-0005 BUGFIX-4) suitecrm knowledge medium CURRENT-extension-magitekext.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-extension-magitekext.md
Source date: 2026-03-17
Keywords: ["sc0027","recordmodal","savenew","action","handler","recordmodalservice","mp0005","bugfix4","Leads","Contacts"]
Cross-domain: []
Symptoms: []
Body:
### SC-0027: RecordModal — saveNew action handler + RecordModalService (MP-0005 BUGFIX-4) - **Dato:** 2026-03-17 - **Filer:** - `extensions/magitekExt/app/src/extension.module.ts` (saveNew handler + DI) - `extensions/magitekExt/app/src/fields/contact-relate/contact-relate-edit.component.ts` - `extensions/magitekExt/app/src/fields/contact-relate/contact-relate-detail.component.ts` - **Rotårsak:** Lagre-knappen manglet i create-modal. `RecordModalActionManager` registrerer kun `save`, men create-mode bruker `saveNew`. - **Fix:** 1. `extension.module.ts` registrerer `saveNew` som alias for `save`-handler 2. Komponentene bruker `RecordModalService.showModal()` (istedenfor `AppStateStore.openRecordModal()`) - **Oppgraderingssikker:** Ja — Extension-filer ### SC-0028: contact-relate modal bredde — modalOptions size: xl (MP-0005 BUGFIX-5) - **Dato:** 2026-03-17 - **Filer:** - `extensions/magitekExt/app/src/fields/contact-relate/contact-relate-edit.component.ts` - `extensions/magitekExt/app/src/fields/contact-relate/contact-relate-detail.component.ts` - **Fix:** `modalOptions: { size: 'xl' }` i showModal()-kall. Se GOTCHA-E-15. - **Oppgraderingssikker:** Ja ### SC-0032: contact-relate — metadata pre-load + stopPropagation (MP-0005 BUGFIX-FINAL) - **Dato:** 2026-03-17 - **Filer:** - `extensions/magitekExt/app/src/fields/contact-relate/contact-relate-edit.component.ts` - `extensions/magitekExt/app/src/fields/contact-relate/contact-relate-detail.component.ts` - `extensions/magitekExt/app/src/fields/contact-relate/contact-relate-detail.component.html` - **Fix:** Pre-load metadata FØR showModal() via `metadataStore.getMetadata('Contacts').pipe(take(1)).subscribe(...)`. Se GOTCHA-E-16. - **Oppgraderingssikker:** Ja ### SC-0040: lead-relate Angular komponenter (sessionStorage + reload mønster) - **Dato:** 2026-03-17 - **Filer:** - `extensions/magitekExt/app/src/fields/lead-relate/lead-relate-edit.component.ts` - `extensions/magitekExt/app/src/fields/lead-relate/lead-relate-edit.component.html` - `extensions/magitekExt/app/src/fields/lead-relate/lead-relate-detail.component.ts` - `extensions/magitekExt/app/src/fields/lead-relate/lead-relate-detail.component.html` - `extensions/magitekExt/app/src/fields/lead-relate/lead-relate.module.ts` - `extensions/magitekExt/app/src/extension.module.ts` (registrering) - **Registrert:** module='contacts', field='lead_name' - **Mønster:** Edit-komponent set `sessionStorage.setItem('lead_relate_reload', '1')` naar `lead_id` endres. Detail-komponent sjekkar flagget i `ngOnInit` og kaller `window.location.reload()` for aa oppdatere Leads-subpanelet etter edit→detail overgang. - **Identisk mønster:** Speilar `contact-relate`-komponentane (SC-0035) men for Contacts→Leads-retningen. - **Oppgraderingssikker:** Ja — Extension-filer
SC-0010: Org-nr validering (Brreg API + modulo-11) suitecrm knowledge medium CURRENT-extension-magitekext.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-extension-magitekext.md
Source date: 2026-03-17
Keywords: ["sc0010","orgnr","validering","brreg","api","modulo11","Leads","Accounts"]
Cross-domain: []
Symptoms: []
Body:
### SC-0010: Org-nr validering (Brreg API + modulo-11) - **Dato:** 2026-03-15 - **Filer:** - `extensions/magitekExt/app/src/fields/orgnr/` (Angular komponent) - **Endring:** Custom field-komponent for norsk org-nr. Validerer med modulo-11 og slår opp i Brreg API for firmanavn. - **Brukes av:** SC-0012 (Accounts org_nr_c felt) - **Oppgraderingssikker:** Ja — i extension ### SC-0016: AddressGroupComponent — Angular composite address widget (MP-0003) - **Dato:** 2026-03-16 - **Masterplan:** MP-0003 - **Filer:** - `extensions/magitekExt/app/src/fields/address-group/address-group-edit.component.ts` - `extensions/magitekExt/app/src/fields/address-group/address-group-detail.component.ts` - `extensions/magitekExt/app/src/fields/address-group/address-group.module.ts` - `extensions/magitekExt/app/src/extension.module.ts` (registrering) - `public/legacy/custom/Extension/modules/Leads/Ext/Vardefs/address_group_c.php` (source=non-db) - `public/legacy/custom/modules/Leads/metadata/detailviewdefs.php` - `public/legacy/custom/modules/Leads/metadata/editviewdefs.php` - **Endring:** Custom Angular-komponent som rendrer hele adresse-seksjonen (gatenavn, postnr, poststed, land, kommune) med full layout-kontroll. Inkluderer Bring API auto-fill og "Kopier adresse"-knapp. - **Arkitekturbeslutninger:** Se MP-0003 MASTERPLAN.md for AD-1 til AD-6 - **Oppgraderingssikker:** Ja — Krever `yarn build:extension magitekExt` etter SuiteCRM-oppgradering. ### SC-0018: magitekExt webpack.config.js — dynamisk versjon-lesing - **Dato:** 2026-03-16 - **Filer:** - `extensions/magitekExt/app/webpack.config.js` - **Endring:** Leser nå dependency-versjoner dynamisk fra SuiteCRM sin root `package.json` istedenfor `requiredVersion: 'auto'`. Eliminerer "Unsatisfied version X from shell" console-warnings. - **Rotårsak:** `@angular-architects/module-federation` evaluerer ikke `^auto` korrekt. - **VIKTIG:** Etter SuiteCRM-oppgradering: kjør `yarn build:extension magitekExt` for å bygge med nye versjoner. - **Oppgraderingssikker:** Ja — extensions/ overlever, men KREVER rebuild etter upgrade
Oversikt suitecrm knowledge medium CURRENT-extension-magitekext.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-extension-magitekext.md
Source date: 2026-03-17
Keywords: ["oversikt"]
Cross-domain: []
Symptoms: []
Body:
# magitekExt — Angular Extension Tilpasninger **Siste SC-ID:** SC-0041 **Antall endringer:** 10 **Dato:** 2026-03-17 **Load:** Når oppgaven involverer magitekExt Angular extension, custom field-komponenter, navbar, eller RecordModal --- ## Oversikt `magitekExt` er vår primære Angular extension i `/var/www/suitecrm/extensions/magitekExt/`. Den inneholder alle upgrade-safe Angular-tilpasninger: custom field-komponenter, navbar-override, ProcessHandlers, og RecordModal-integrasjon. **Bygg-kommando (kjøres på serveren):** ```bash ssh suitecrm "cd /var/www/suitecrm && sudo -u www-data yarn build:extension magitekExt" ``` **VIKTIG:** Bygg MÅ kjøres på suitecrm-serveren (relative paths til dist/core). --- ## Aktive tilpasninger ### SC-0008: magitekExt Angular extension (Hybrid UI Framework) - **Dato:** 2026-03-15 - **Masterplan:** MP-0001 - **Filer:** - `extensions/magitekExt/config/extension.php` (enabled=true, remoteEntry) - `extensions/magitekExt/app/src/styles.scss` (ADVARSEL: scoped, treffer ikke host-DOM — se GOTCHA-E-01) - `extensions/magitekExt/app/src/extension.module.ts` (Angular entry point) - `extensions/magitekExt/backend/` (Symfony backend, autowired) - `extensions/magitekExt/modules/` (module-specific backend handlers) - **Arkitekturbeslutninger:** - AD-1: Extension SCSS er scoped (ViewEncapsulation) — globale CSS MÅ via `custom-overrides.css` - AD-2: Klonet fra defaultExt, alle referanser erstattet - AD-3: Bygg MÅ kjøres på serveren - AD-4: PHP metadata for konfigurasjon, Angular for custom rendering - **Oppgraderingssikker:** Ja — extensions/ overlever oppgraderinger ### SC-0009: Norsk postnummer auto-fill (DEPRECATED — erstattet av SC-0041) - **Dato:** 2026-03-15 - **Status:** DEPRECATED — Bring API-kallet erstattet av statisk JSON-oppslag i SC-0041. - **Filer:** - `extensions/magitekExt/app/src/fields/postalcode/` (Angular komponent — ikke lenger i bruk for adresse-autofyll) - **Oppgraderingssikker:** Ja — i extension
Leads — modul-spesifikt custom språk (lag 3) suitecrm knowledge medium CURRENT-translations-global.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-translations-global.md
Source date: 2026-03-17
Keywords: ["leads","modulspesifikt","custom","sprk","lag","Leads"]
Cross-domain: []
Symptoms: []
Body:
### Leads — modul-spesifikt custom språk (lag 3) - `custom/modules/Leads/language/nb_NO.lang.php` — Lag 3-override (overstyrer core Leads-strings) --- ## Deploy-mønster for labels ### Alternativ A: MCP set_label (enklest) ``` mcp__suitecrm__set_label(key="LBL_FELTNAME", value="Norsk label", module="ModuleName", language="nb_NO") ``` Velger automatisk riktig Extension-fil og kjører rebuild. ### Alternativ B: Manuell Extension-fil (for app_list_strings og dropdown-verdier) ```bash # 1. Opprett/rediger Ext/Language-fil på serveren # 2. Kjør rebuild ssh suitecrm "cd /var/www/suitecrm && php -f public/legacy/custom/modules/relationships/rebuild_extensions.php" # 3. Clear cache ``` ### Alternativ C: Global nb_NO.lang.php (for app_list_strings) Rediger `custom/include/language/nb_NO.lang.php` direkte. Brukes for dropdown-verdier som gjelder på tvers av moduler. --- ## Gotchas (Oversettelse-spesifikke) ### GOTCHA-T-01: Extension Language-filer kompileres alfabetisk `nb_NO.lang.ext.php` bygges ved å konkatenere alle Extension-filer i `Ext/Language/` i **alfabetisk filnavn-rekkefølge**. Ved duplikate keys vinner **siste fil**. Eksempel: `nb_NO.custom_agent.php` (c) kompileres FØR `nb_NO.old_kontakt_label.php` (o) → o-filen vinner. **Regel:** For å endre en eksisterende label: endre verdien i den opprinnelige filen, IKKE opprett ny fil. ### GOTCHA-T-02: set_label MCP kan rapportere success uten å oppdatere Observert i SC-0023/SC-0024: `set_label` returnerte success men labelen endret seg ikke i UI. Mulig årsak: cache-lag eller write-feil. **Verifiser alltid:** Sjekk Extension-filen etter set_label, og bruk Playwright for visuell verifisering. ### GOTCHA-T-03: app_list_strings MÅ ligge i Ext/Language-fil, ikke i vardef Dropdown-verdier via `$app_list_strings` for custom enum-felt MÅ defineres i Ext/Language-fil (lag 4). Verdier i vardef-filen registreres ikke.
SC-0003: Leads status-dropdown — ny salgspipeline (global del) suitecrm knowledge low CURRENT-translations-global.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-translations-global.md
Source date: 2026-03-17
Keywords: ["sc0003","leads","statusdropdown","salgspipeline","global","del","Leads","Contacts","Accounts","Opportunities","Meetings"]
Cross-domain: []
Symptoms: []
Body:
### SC-0003: Leads status-dropdown — ny salgspipeline (global del) - **Dato:** 2026-03-15 - **Fil:** `public/legacy/custom/include/language/nb_NO.lang.php` (app_list_strings → lead_status_dom) - **Verdier:** New/Ny, Contacted/Kontaktet, Contacted_Low_Interest/Kontaktet lite interessert, In_Dialog/I dialog, Converted/Konvertert til kunde, On_Hold/Avventende, Dead/Tapt lead - **Oppgraderingssikker:** Ja — custom language override --- ## Pre-eksisterende oversettelser ### Modul-oversettelser (nb_NO via Extension-framework) 17 moduler har norske oversettelser via `_override_nb_NO.lang.php`: | Modul | Fil | |-------|-----| | Accounts | `custom/Extension/modules/Accounts/Ext/Language/_override_nb_NO.lang.php` | | Campaigns | `custom/Extension/modules/Campaigns/Ext/Language/_override_nb_NO.lang.php` | | Contacts | `custom/Extension/modules/Contacts/Ext/Language/_override_nb_NO.lang.php` | | EmailMarketing | `custom/Extension/modules/EmailMarketing/Ext/Language/_override_nb_NO.lang.php` | | Emails | `custom/Extension/modules/Emails/Ext/Language/_override_nb_NO.lang.php` | | Employees | `custom/Extension/modules/Employees/Ext/Language/_override_nb_NO.lang.php` | | FP_events | `custom/Extension/modules/FP_events/Ext/Language/_override_nb_NO.lang.php` | | Leads | `custom/Extension/modules/Leads/Ext/Language/_override_nb_NO.lang.php` | | Meetings | `custom/Extension/modules/Meetings/Ext/Language/_override_nb_NO.lang.php` | | Opportunities | `custom/Extension/modules/Opportunities/Ext/Language/_override_nb_NO.lang.php` | | ProspectLists | `custom/Extension/modules/ProspectLists/Ext/Language/_override_nb_NO.lang.php` | | Prospects | `custom/Extension/modules/Prospects/Ext/Language/_override_nb_NO.lang.php` | | Users | `custom/Extension/modules/Users/Ext/Language/_override_nb_NO.lang.php` | | jjwg_Maps | `custom/Extension/modules/jjwg_Maps/Ext/Language/_override_nb_NO.lang.php` | ### Globale språk-overrides - `custom/include/language/nb_NO.lang.php` — Globale norske labels og app_list_strings (inkl. lead_status_dom, LBL_SUMMARY_LEAD_COMPANY) - `custom/include/language/en_us.lang.php` — Engelske tilpasninger (inkl. LBL_SUMMARY_LEAD_COMPANY)
Oversikt: 6-lags label-system suitecrm knowledge medium CURRENT-translations-global.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-translations-global.md
Source date: 2026-03-17
Keywords: ["oversikt","6lags","labelsystem","Leads"]
Cross-domain: []
Symptoms: []
Body:
# Oversettelser og Språk — Globale tilpasninger **Siste SC-ID:** SC-0037 **Dato:** 2026-03-17 **Load:** Når oppgaven involverer globale labels, norske oversettelser, dropdown-verdier, eller module-level oversettelser --- ## Oversikt: 6-lags label-system | Lag | Type | Fil-plassering | |-----|------|----------------| | 1 | Core SuiteCRM | `include/language/nb_NO.lang.php` | | 2 | Module core | `modules/{Mod}/language/nb_NO.lang.php` | | 3 | Module custom | `custom/modules/{Mod}/language/nb_NO.lang.php` | | 4 | Extension (lang 4) | `custom/Extension/modules/{Mod}/Ext/Language/*.php` → kompilert til `nb_NO.lang.ext.php` | | 5 | Global custom | `custom/include/language/nb_NO.lang.php` | | 6 | User preferences | (ikke relevant for label-overrides) | **Viktig:** Extension Language-filer (lag 4) kompileres i **alfabetisk filnavn-rekkefølge**. Ved duplikate keys vinner siste fil (alfabetisk). For å endre en eksisterende label: rediger verdien i original filen, ikke opprett ny fil. --- ## Aktive tilpasninger ### SC-0002: ProspectLists — "liste over mål" → "segment/segmenter" - **Dato:** 2026-03-14 - **Fil:** `public/legacy/custom/Extension/modules/ProspectLists/Ext/Language/_override_nb_NO.lang.php` - **Endring:** Komplett oversettelse av ProspectLists-modulen: modultitler, menylabels, søk, skjema, subpaneler - **Terminologi:** Target=Prospekt, Lead=Lead, Target List=Segment - **Oppgraderingssikker:** Ja — Extension framework override ### SC-0037: Leads LBL_NAME + LBL_LIST_NAME → "Kundenavn" - **Dato:** 2026-03-17 - **Fil:** `public/legacy/custom/Extension/modules/Leads/Ext/Language/nb_NO.custom_agent.php` - **Endring:** - `LBL_NAME` = "Kundenavn" (var: "OLD_kontakt") - `LBL_LIST_NAME` = "Kundenavn" (var: "OLD_kontakt") - **Hvorfor:** SC-0023 hadde satt disse til "OLD_kontakt" som midlertidig verdi. Leads er firmakort i B2B-arkitektur — feltet viser firmanavnet og skal hete "Kundenavn". - **Relatert:** SC-0023 (ULØST) er nå løst med denne endringen. - **Oppgraderingssikker:** Ja — Extension language override
GOTCHA-G-19: GraphQL `moduleMetadata.editView` krasjer (SuiteCRM 8.9 bug) suitecrm knowledge medium CURRENT-customizations.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-customizations.md
Source date: 2026-03-17
Keywords: ["gotchag19","graphql","modulemetadataeditview","krasjer","suitecrm","bug"]
Cross-domain: []
Symptoms: []
Body:
### GOTCHA-G-19: GraphQL `moduleMetadata.editView` krasjer (SuiteCRM 8.9 bug) Bruk `get_angular_view_definition(module, 'record')` eller `get_view_layout(module, 'edit')` som workaround.
Logic Hooks suitecrm knowledge medium CURRENT-customizations.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-customizations.md
Source date: 2026-03-17
Keywords: ["logic","hooks","Leads","Contacts"]
Cross-domain: []
Symptoms: []
Body:
### Logic Hooks - Contacts: `SyncLeadIdHook` (after_relationship_add/delete) - Contacts: `SyncLeadRelateToM2MHook` (after_save) — felt→M2M+contact_id synk (SC-0039) - Leads: `SyncLeadIdFromLeadHook` (after_relationship_add/delete) - Leads: `SyncContactIdOnLeadHook` (after_relationship_add/delete) - Leads: `SyncContactRelateToM2MHook` (after_save) — felt→M2M synk (SC-0035) --- ## Globale Gotchas (gjelder alle moduler) ### GOTCHA-G-01: Auto-genererte ext-filer — rediger aldri direkte `*.lang.ext.php`, `vardefs.ext.php`, `layoutdefs.ext.php` er auto-kompilert fra Extension-filene. De regenereres ved Quick Repair & Rebuild. Rediger alltid kildefilen i `Extension/modules/{Mod}/Ext/`. ### GOTCHA-G-03: .env.local inneholder credentials `.env.local` med DB-passord og APP_SECRET trackes i git. Repoet er privat. ### GOTCHA-G-04: Quick Repair & Rebuild — subpaneler kan kreve web-kontekst `rebuild_extensions.php` CLI fungerer for Vardefs, Language, Layoutdefs. UNNTAK: Subpanel-endringer kan kreve Admin UI → Quick Repair & Rebuild. ### GOTCHA-G-08: 4 uavhengige cacher 1. `cache/themes/suite8/modules/{Module}/EditView.tpl` + `DetailView.tpl` 2. `cache/smarty/templates_c/` 3. Symfony app cache (`cache:clear`) 4. `cache:clear` fjerner KUN Symfony-cache, IKKE Smarty/tpl-cacher Fullstendig refresh: slett `cache/themes/suite8/modules/{Mod}/*.tpl` + `cache/smarty/templates_c/*` + `cache:clear` ### GOTCHA-G-10: `fields_meta_data` DB-rad — manglende ELLER foreldreloes **Manglende rad:** Uten rad i `fields_meta_data`: feltet vises ikke i Studio og kan ikke brukes i Reports. MCP `create_custom_field` oppretter raden automatisk (fikset 2026-03-16). **Foreldreloes rad (orphan):** Naar du sletter en vardef Extension-fil for et custom field, MÅ du ogsaa slette raden i `fields_meta_data`. Ellers bygger SugarBean vardefs med et felt som ikke har DB-kolonne → kan krasje GraphQL listview (0 rader) eller returnere ghost-felt. Se DEV-32 i CURRENT-architecture.md. **Verifiser orphans:** `SELECT fmd.id, fmd.name FROM fields_meta_data fmd WHERE fmd.custom_module = '{Module}' AND fmd.deleted = 0` — sammenlign med `SHOW COLUMNS FROM {modul}_cstm`. **Kjent orphan:** `Contactsmcp_test_c` (per 2026-03-17) — vardef slettet, DB-rad gjenstaar.
Modul-Oversikt suitecrm knowledge medium CURRENT-customizations.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-customizations.md
Source date: 2026-03-17
Keywords: ["moduloversikt","Leads","Contacts","Accounts","Opportunities","Cases","Meetings"]
Cross-domain: []
Symptoms: []
Body:
## Modul-Oversikt | Modul | Antall SC | Domene-fil | |-------|-----------|------------| | Leads | 17 | `CURRENT-module-leads.md` | | Contacts | 6 | `CURRENT-module-contacts.md` | | Leads↔Contacts | 4 | `CURRENT-leads-contacts-architecture.md` | | magitekExt (Angular) | 10 | `CURRENT-extension-magitekext.md` | | Tema/CSS | 4 | `CURRENT-theme-system.md` | | Accounts | 1 | `CURRENT-module-accounts.md` | | Oversettelser (global) | 2 | `CURRENT-translations-global.md` | **For nye moduler:** Opprett `CURRENT-module-{modul}.md` og legg til rad i tabellene over. --- ## Pre-eksisterende tilpasninger (for git-tracking) Disse filene fantes allerede ved initial commit. Opprinnelse: Studio, MCP-agent, eller manuelt. ### Oversettelser (nb_NO) — 17 moduler Accounts, Campaigns, Contacts, EmailMarketing, Emails, Employees, FP_events, Leads, Meetings, Opportunities, ProspectLists, Prospects, Users, jjwg_Maps via `custom/Extension/modules/{Mod}/Ext/Language/_override_nb_NO.lang.php` ### Custom relasjoner | Relasjon | Mellom | Type | |----------|--------|------| | `leads_contacts_1` | Leads ↔ Contacts | Many-to-Many | | `leads_contacts_lead_id` | Leads → Contacts | One-to-Many (contacts.lead_id) | | `leads_prospectlists_1` | Leads ↔ ProspectLists | Many-to-Many | | `contact_leads` | Contacts → Leads | One-to-Many (core — gjenbrukt av SC-0024) | | `accounts_prospectlists_1` | Accounts ↔ ProspectLists | Many-to-Many | ### Metadata-overrides (pre-eksisterende) | Modul | View | Fil | |-------|------|-----| | Accounts | Search | `custom/modules/Accounts/metadata/searchdefs.php` + `SearchFields.php` | | ProspectLists | Quick Create | `custom/modules/ProspectLists/metadata/quickcreatedefs.php` | | Contacts | Subpanel | `custom/modules/Contacts/metadata/subpanels/Account_subpanel_contacts.php` | ### Vardefs (jjwg_Maps geocoding) 8 moduler har jjwg_Maps-relaterte custom fields: Accounts, Cases, Contacts, Leads, Meetings, Opportunities, Project, Prospects ### Konfigurasjon - `custom/include/tabConfig.php` — Tab-rekkefølge i navigasjonsmenyen - `custom/modules/Connectors/metadata/` — Connector-konfigurasjon - `custom/modules/Home/dashlets.php` — Dashboard-konfigurasjon - `custom/modules/unified_search_modules_display.php` — Global søk-moduler
Git Repo suitecrm knowledge info CURRENT-customizations.md 100 2026-03-20 02:00:02
Source file: coordination/experts/suitecrm/CURRENT-customizations.md
Source date: 2026-03-17
Keywords: ["git","repo","Leads","Contacts","Accounts","Notes"]
Cross-domain: []
Symptoms: []
Body:
# SuiteCRM Customization Registry — Indeks **Version:** 3.2 (expert-training update — orphan gotcha, verified state) **Date:** 2026-03-17 **Siste SC-ID:** SC-0041 > Dette er indeks-filen. Detaljer finnes i domene-filene under. > Les denne FØR du velger hvilke domene-filer du trenger. --- ## Git Repo | Egenskap | Verdi | |----------|-------| | **GitHub** | `heinesalbu/suitecrm-custom` (private) | | **Server-sti** | `/var/www/suitecrm/` | | **Tracker** | `custom/`, `extensions/`, `config/`, `.env.local` | | **Ignorerer** | vendor, cache, logs, tmp, core, node_modules | | **SSH key** | `~/.ssh/id_ed25519_github` → deploy key med write | | **SSH alias** | `github-suitecrm-custom` i `~/.ssh/config` | | **Remote** | `git@github-suitecrm-custom:heinesalbu/suitecrm-custom.git` | ```bash # Etter endring på serveren: ssh suitecrm "cd /var/www/suitecrm && git add -A && git commit -m 'beskrivelse' && git push" ``` --- ## Domene-filer (les relevant fil basert på oppgave) | Fil | Last når... | Inneholder | |-----|-------------|------------| | `CURRENT-module-leads.md` | Oppgaven gjelder Leads (felt, metadata, layout, labels) | SC-0001,03-06,11,13-15,17,19-21,23,26,37,38 | | `CURRENT-module-contacts.md` | Oppgaven gjelder Contacts (felt, metadata, modal) | SC-0025,28,31,32,36,39 | | `CURRENT-module-accounts.md` | Oppgaven gjelder Accounts | SC-0012 | | `CURRENT-leads-contacts-architecture.md` | Oppgaven gjelder Leads↔Contacts relasjon eller logic hooks | SC-0022,24,35,39 | | `CURRENT-extension-magitekext.md` | Oppgaven gjelder Angular extension, custom komponenter, navbar, RecordModal | SC-0008,09,10,16,18,27,28,32,34,40,41 | | `CURRENT-theme-system.md` | Oppgaven gjelder CSS, farger, tema | SC-0007,29,30,33,34 | | `CURRENT-translations-global.md` | Oppgaven gjelder norske oversettelser, labels, dropdowns | SC-0002,03 (global del),37 | --- ## SC-Register (komplett tabell) | SC-ID | Beskrivelse | Domene-fil | |-------|-------------|------------| | SC-0001 | Leads listview — klikkbar kundenavn | `CURRENT-module-leads.md` | | SC-0002 | ProspectLists — segment-terminologi | `CURRENT-translations-global.md` | | SC-0003 | Leads status-dropdown — salgspipeline | `CURRENT-module-leads.md` + `CURRENT-translations-global.md` | | SC-0004 | Leads — dedikert Notes-subpanel | `CURRENT-module-leads.md` | | SC-0005 | Leads — inline notes_c custom field | `CURRENT-module-leads.md` | | SC-0006 | Leads — enkel adresseblokk + kommune_c | `CURRENT-module-leads.md` | | SC-0007 | CSS recovery script (deprecated) | `CURRENT-theme-system.md` | | SC-0008 | magitekExt Angular extension | `CURRENT-extension-magitekext.md` | | SC-0009 | Norsk postnummer auto-fill (DEPRECATED — erstattet av SC-0041) | `CURRENT-extension-magitekext.md` | | SC-0010 | Org-nr validering (Brreg API) | `CURRENT-extension-magitekext.md` | | SC-0011 | Leads display/required logic | `CURRENT-module-leads.md` | | SC-0012 | org_nr_c custom felt på Accounts | `CURRENT-module-accounts.md` | | SC-0013 | Kontaktstrategi dropdown-felt på Leads | `CURRENT-module-leads.md` | | SC-0014 | account_name øverst + label FIRMANAVN | `CURRENT-module-leads.md` | | SC-0015 | Postnr+poststed inline layout | `CURRENT-module-leads.md` | | SC-0016 | AddressGroupComponent — Angular address widget | `CURRENT-extension-magitekext.md` | | SC-0017 | notater_c varchar-felt på Leads | `CURRENT-module-leads.md` | | SC-0018 | magitekExt webpack.config.js — dynamisk versjon | `CURRENT-extension-magitekext.md` | | SC-0019 | LBL_NOTES_C label → "Tilleggsinfo" | `CURRENT-module-leads.md` | | SC-0020 | LBL_LIST_NAME → "Kontaktperson" | `CURRENT-module-leads.md` | | SC-0021 | Leads listview — custom _c-felt i kolonnevalg | `CURRENT-module-leads.md` | | SC-0022 | Leads↔Contacts B2B arkitektur | `CURRENT-leads-contacts-architecture.md` | | SC-0023 | LBL_NAME → "OLD_kontakt" (LØST via SC-0037) | `CURRENT-module-leads.md` | | SC-0024 | contact_name relate-felt på Lead | `CURRENT-leads-contacts-architecture.md` | | SC-0025 | Contacts LBL_TITLE → "Stilling" | `CURRENT-module-contacts.md` | | SC-0026 | Leads — FIRMANAVN som record-tittel | `CURRENT-module-leads.md` | | SC-0027 | RecordModal saveNew action handler | `CURRENT-extension-magitekext.md` | | SC-0028 | contact-relate modal bredde (size: xl) | `CURRENT-extension-magitekext.md` + `CURRENT-module-contacts.md` | | SC-0029 | Lenkefarger — stålblå | `CURRENT-theme-system.md` | | SC-0030 | Nordisk SaaS meny (SuperOffice-stil) | `CURRENT-theme-system.md` | | SC-0031 | Contacts editviewdefs — eksplisitte labels | `CURRENT-module-contacts.md` | | SC-0032 | contact-relate metadata pre-load | `CURRENT-extension-magitekext.md` + `CURRENT-module-contacts.md` | | SC-0033 | Multi-tema system (Nordic + HubSpot) | `CURRENT-theme-system.md` | | SC-0034 | Statisk navbar | `CURRENT-extension-magitekext.md` + `CURRENT-theme-system.md` | | SC-0035 | Toveis synk KONTAKTPERSON ↔ Kontakter-subpanel (after_save hook + sessionStorage reload) | `CURRENT-leads-contacts-architecture.md` | | SC-0036 | lead_name vardef rname='account_name' — viser firmanavn istedenfor personnavn | `CURRENT-module-contacts.md` | | SC-0037 | Leads LBL_NAME + LBL_LIST_NAME → "Kundenavn" | `CURRENT-module-leads.md` | | SC-0038 | Leads default subpanel override — account_name-kolonne | `CURRENT-module-leads.md` | | SC-0039 | SyncLeadRelateToM2MHook på Contacts — felt→M2M+contact_id (bidireksjonell) | `CURRENT-module-contacts.md` + `CURRENT-leads-contacts-architecture.md` | | SC-0040 | lead-relate Angular komponenter (edit+detail) — sessionStorage + reload mønster | `CURRENT-extension-magitekext.md` | | SC-0041 | Postnummer auto-lookup — statisk JSON, auto-fill poststed/kommune/fylke/land='Norge' (MP-0006) | `CURRENT-extension-magitekext.md` | ---
v1.0 - 2026-03-16 suitecrm knowledge info CURRENT-orchestration.md 100 2026-03-20 02:00:01
Source file: coordination/experts/suitecrm/CURRENT-orchestration.md
Source date: 2026-03-16
Keywords: ["v10","20260316"]
Cross-domain: []
Symptoms: []
Body:
### v1.0 - 2026-03-16 - Initial creation from MP-0003 postmortem audit - Documented F-01 through F-05 orchestrator rules - Documented 5 known failure modes (FM-01 to FM-05) - Documented SuiteCRM-specific sequencing and pipeline differences - Documented information transfer patterns
FM-09: Silent uncommitted side-effects suitecrm knowledge critical CURRENT-orchestration.md 100 2026-03-20 02:00:01
Source file: coordination/experts/suitecrm/CURRENT-orchestration.md
Source date: 2026-03-16
Keywords: ["fm09","silent","uncommitted","sideeffects","Calls"]
Cross-domain: []
Symptoms: []
Body:
### FM-09: Silent uncommitted side-effects **Symptom:** `git status` shows modified files the user was never told about **Root cause:** Subagent modified feedback/log files as side-effect, orchestrator excluded them from commit but never reported them **Prevention:** Session-end checklist item 2 (report uncommitted files) --- ## Information Transfer Pattern ### "Already Verified" list for subagents The orchestrator maintains a verified-facts list passed to each subagent to prevent re-verification of known state. ``` ## Already Verified (trenger ikke sjekkes igjen) - SuiteCRM versjon: 8.9.2 paa /var/www/suitecrm/ - extensions/magitekExt/ eksisterer, enabled: true - public/dist/custom-overrides.css eksisterer - public/dist/index.html har <link> til custom-overrides.css - Node.js er IKKE installert paa server [UTDATERT: Node.js 18.20.8 installert] - Eksisterende customizations: SC-0001 til SC-NNNN ## Ikke sjekk disse (returnerer ubrukelig output) - cat /var/www/suitecrm/public/dist/index.html (minifisert) - cat /var/www/suitecrm/public/legacy/themes/suite8/css/Dawn/style.css (699KB) ``` **Critical:** Keep this list ACCURATE. Outdated facts (e.g., "Node.js not installed" when it was later installed) cause subagents to make wrong assumptions. ### Compact debug prompt (F-03) ``` ## Debug task - Feilmelding: [exact error] - Fil: [path] - Forventet: [what should happen] - Sjekk: [specific verification steps] ``` --- ## Changelog ### v1.1 - 2026-03-16 - Added F-06: KB-query before implementation (from MP-0004: 206 tool calls / 139k tokens waste) - Added F-07: Schema introspection before API code (from MP-0004: thin module/app metadata queries) - Added Subagent Prompt Checklist section (mandatory KB + expert + schema + rapport) - Added Session-End Checklist (git push all repos, report uncommitted side-effects) - Added Coordination Monitor note (graceful degradation when script missing) - Added FM-06 through FM-09 (trial-and-error, thin queries, unpushed commits, silent side-effects)
Known Failure Modes suitecrm knowledge low CURRENT-orchestration.md 100 2026-03-20 02:00:01
Source file: coordination/experts/suitecrm/CURRENT-orchestration.md
Source date: 2026-03-16
Keywords: ["known","failure","modes","Calls","Tasks"]
Cross-domain: []
Symptoms: []
Body:
## Known Failure Modes ### FM-01: Subagent context overflow **Symptom:** Subagent responds with truncated output or "I need to summarize" **Root cause:** Orchestrator passed too much context (session history, prior reports) **Prevention:** F-03 rules (1500-char debug prompt budget) ### FM-02: False negative in Playwright verification **Symptom:** "Component not rendering" when component is actually deployed correctly **Root cause:** Test record has empty fields, component only renders with data **Prevention:** F-02 rules (find record with data before testing) ### FM-03: Incomplete subagent report **Symptom:** Orchestrator cannot determine task status **Root cause:** Subagent focused on MCP gap logging instead of task reporting **Prevention:** F-01 mandatory report format ### FM-04: Orchestrator becomes implementor **Symptom:** Orchestrator runs 10+ SSH commands, reads source files, attempts fixes **Root cause:** All subagents failed, orchestrator "just does one quick grep" **Prevention:** F-04 role boundaries; delegate to `generic-development` instead ### FM-05: Re-running completed tasks **Symptom:** Task deployed twice, second deployment may overwrite correct state **Root cause:** Orchestrator re-delegated because subagent report lacked status field **Prevention:** F-05 state check before re-delegation ### FM-06: Trial-and-error implementation without KB **Symptom:** Subagent uses 200+ tool calls / 100k+ tokens for a single file **Root cause:** Agent did not query KB or read expert files first, resorted to iterative API probing **Prevention:** F-06 KB-query rule, subagent prompt checklist ### FM-07: Thin API queries (docstring-implementation mismatch) **Symptom:** Tool docstring promises "fields, ACL, view definitions" but query returns 3 scalars **Root cause:** Agent did not introspect API schema before writing queries **Prevention:** F-07 schema introspection rule ### FM-08: Unpushed commits in external repos **Symptom:** Next session finds repo "ahead of origin by N commits" with no explanation **Root cause:** Orchestrator committed but forgot to push before ending session **Prevention:** Session-end checklist item 1 (git push in all repos)
Verification with data (F-02 integration) suitecrm knowledge low CURRENT-orchestration.md 100 2026-03-20 02:00:01
Source file: coordination/experts/suitecrm/CURRENT-orchestration.md
Source date: 2026-03-16
Keywords: ["verification","with","data","f02","integration"]
Cross-domain: []
Symptoms: []
Body:
### Verification with data (F-02 integration) Step 8 must use records with populated data. Empty records give false negatives. --- ## Subagent Prompt Checklist (Established MP-0004) When the orchestrator delegates an implementation task to a subagent, the prompt MUST include: ``` ## Subagent Prompt Checklist - [ ] KB-query: Kjoer `vendor/bin/kb query "TOPIC"` FOER implementering - [ ] Expert files: Les relevante CURRENT-*.md filer pekt paa av KB - [ ] Schema-introspeksjon: Bruk introspect/discovery-verktoy foer API-kode - [ ] Rapport: Lever ## Rapport med task_id, status, files_deployed, errors ``` Purpose: Prevents trial-and-error implementation (F-06) and thin API queries (F-07). The checklist is a mandatory prefix to every implementation delegation prompt. --- ## Session-End Checklist (Established MP-0004) Before ending an orchestration session, verify ALL of the following: 1. **Git push in all repos:** Check `git log --oneline origin/main..HEAD` in every repo where commits were made. Push if ahead. 2. **Uncommitted side-effects:** Run `git status` in all workspaces. Report any modified files NOT part of the implementation commits to the user. 3. **Masterplan status:** Move completed masterplans to `coordination/masterplans/completed/`. 4. **Expert file updates:** Flag if expert files need updating based on session learnings. ### Why MP-0004 left commit `e7f045a` unpushed in mcp-servers. The orchestrator also failed to report that `suitecrm-mcp-gaps.md` was modified as a side-effect by a subagent but excluded from commits. ### Cross-reference Memory files: `feedback_push_after_commit.md`, `feedback_uncommitted_sideeffects.md`. --- ## Coordination Monitor The orchestrator can optionally use `coordination/scripts/coordination-monitor.sh` for progress tracking. This script is NOT required for orchestration to function. If the script is missing, the orchestrator proceeds without it (graceful degradation, no error). Note: The suitecrm-dev workspace may not have `coordination-monitor.sh` -- it is primarily a ReportMaker/Laravel feature. The orchestrate.md command file was updated to handle this gracefully. ---
Rule suitecrm knowledge medium CURRENT-orchestration.md 100 2026-03-20 02:00:01
Source file: coordination/experts/suitecrm/CURRENT-orchestration.md
Source date: 2026-03-16
Keywords: ["rule","Leads","Tasks"]
Cross-domain: []
Symptoms: []
Body:
### Rule When implementing tools that wrap an external API: 1. Run schema introspection / discovery FIRST to understand available fields 2. Select fields that match the tool's documented purpose (docstring) 3. Do not ship tools where the docstring promises "fields, ACL, view definitions" but the query returns 3 scalars ### Applies to - GraphQL tools (use `introspect_graphql_schema`) - REST API tools (check API documentation via context7 MCP) - Any tool wrapping an external data source --- ## Re-delegation State Check (F-05) Established after MP-0003: orchestrator re-ran a task that was already completed because the subagent's report was incomplete (missing status field). ### Rule Before re-delegating a task due to incomplete report: 1. Check if the task is already done via MCP or SSH 2. Example: `ssh suitecrm "ls /path/to/expected/file && echo DONE || echo MISSING"` 3. Example: `mcp__suitecrm__get_view_layout(module="Leads", view="detail")` and check for expected field 4. Only re-delegate if state confirms task is NOT completed ### Cost of violation Re-running a completed task wastes 20-50k tokens and risks overwriting correct state with a second attempt that may use stale context. --- ## Pipeline Sequencing for SuiteCRM ### Standard masterplan pipeline ``` /explore --> /architect --> /review-masterplan --> /patch-revise-masterplan | /implement-masterplan | /audit-masterplan ``` ### Orchestrated implementation sequence Within `/orchestrate` or `/implement-masterplan`, tasks are ordered by dependency: 1. **Backend vardefs** -- DB column creation (prerequisite for everything) 2. **Extension files** -- Language, Layoutdefs (compiled by QR&R) 3. **Metadata files** -- detailviewdefs, editviewdefs (depend on fields existing) 4. **ProcessHandlers** -- Backend PHP (depend on extension structure) 5. **Angular components** -- Extension frontend (depend on backend + metadata) 6. **CSS overrides** -- custom-overrides.css (cosmetic, last) 7. **Cache clear sequence** -- rebuild_extensions + TPL delete + cache:clear 8. **Verification** -- MCP queries + Playwright screenshots
Orchestrator Role Boundaries (F-04) suitecrm knowledge low CURRENT-orchestration.md 100 2026-03-20 02:00:01
Source file: coordination/experts/suitecrm/CURRENT-orchestration.md
Source date: 2026-03-16
Keywords: ["orchestrator","role","boundaries","f04","Calls","Tasks"]
Cross-domain: []
Symptoms: []
Body:
## Orchestrator Role Boundaries (F-04) The orchestrator is a COORDINATOR, not an implementor. This distinction was violated during MP-0003 when context overflows forced direct SSH analysis. ### Forbidden actions for orchestrator 1. Running `grep`, `cat`, or code analysis via SSH 2. Reading source files to understand implementation details 3. Debugging code issues directly 4. Writing or deploying files to the remote server ### What the orchestrator SHOULD do instead 1. Delegate to `suitecrm-specialist` for implementation tasks 2. Delegate to `generic-development` for debugging tasks 3. Use MCP tools only for STATUS VERIFICATION (not implementation) 4. Track progress and coordinate sequencing ### Exception When all subagents have failed and re-delegation is not viable, the orchestrator MAY perform a single targeted MCP query (not SSH) to verify state. This is a last resort. --- ## KB-Query Before Implementation (F-06) Established after MP-0004: Steg 1 subagent used 206 tool calls / 139k tokens for a single file (`graphql_client.py`) because it did trial-and-error against the live API instead of querying KB or reading expert files first. ### Rule Before implementation, every subagent MUST: 1. Query KB: `vendor/bin/kb query "TOPIC" --limit=5 --project-root=$(pwd)` (or `php artisan kb:query` in Laravel workspaces) 2. Read relevant expert files pointed to by KB results 3. Use `introspect_graphql_schema` or equivalent schema-discovery tools before writing API code ### Cost of violation 206 tool calls / 139k tokens for one file. A single KB query + expert file read would have provided the auth flow, query format, and known gotchas in ~5k tokens. ### Orchestrator enforcement Include KB-query requirement in the subagent prompt checklist (see "Subagent Prompt Checklist" section). --- ## Schema Introspection Before API Code (F-07) Established after MP-0004: Steg 2-4 subagent wrote `get_module_metadata` and `get_app_metadata` with minimal field selection (only `id`, `_name`, `_type`) because it did not run schema introspection first. The audit flagged this as A-001 (thin queries, docstrings promise more than queries deliver).
Testdata for UI Verification (F-02) suitecrm knowledge low CURRENT-orchestration.md 100 2026-03-20 02:00:01
Source file: coordination/experts/suitecrm/CURRENT-orchestration.md
Source date: 2026-03-16
Keywords: ["testdata","for","verification","f02","Tasks"]
Cross-domain: []
Symptoms: []
Body:
## Testdata for UI Verification (F-02) Established after MP-0003: Playwright test against an empty Lead record produced false alarm ("component not rendering") because the address fields were empty and the AddressGroupComponent only renders when address data exists. ### Rule Before Playwright verification of UI components that render based on data: 1. Use `search_records` MCP to find a record WITH relevant data populated 2. Navigate to THAT record, not a random or empty one 3. If no record has the data, create one with `create_record` or `update_record` first ### Applies to - Address fields (composite or individual) - Subpanels (need related records) - Conditional display logic (needs trigger field values) - Custom field components (need field data) --- ## Context Budget for Debug Delegation (F-03) Established after MP-0003: two subagent context overflows occurred because the orchestrator passed full session history + "Already Verified" lists + all previous agent reports into debug prompts. ### Rules 1. **Use `generic-development` for debugging**, not `suitecrm-specialist` - `suitecrm-specialist` loads 8 knowledge files (~30k tokens) before starting - Debug tasks rarely need full CRM knowledge 2. **Debug prompt budget: ~1500 characters max** - Include ONLY: error message + relevant task info + specific checks to perform - Exclude: session history, Already Verified lists, previous agent reports 3. **Never pass full session context** into debug prompts - The orchestrator's context is 100k+ tokens; passing it to subagent wastes budget 4. **Knowledge file opt-in** (E-02 change to suitecrm-specialist): - 5 KJERNE files load always for relevant tasks - 3 OPT-IN files load only when task explicitly requires them - Orchestrator can activate compact mode: `[Kompakt modus: ...]` ### Cost of violation Two subagents hit context overflow in MP-0003, each wasting ~50k tokens and forcing orchestrator to break Forbidden #6 (no direct SSH analysis) to recover. ---
Purpose suitecrm knowledge medium CURRENT-orchestration.md 100 2026-03-20 02:00:01
Source file: coordination/experts/suitecrm/CURRENT-orchestration.md
Source date: 2026-03-16
Keywords: ["purpose","Tasks"]
Cross-domain: []
Symptoms: []
Body:
# SuiteCRM Orchestration Patterns -- Expert File > Version: 1.1 > Date: 2026-03-16 > Source: MP-0003 postmortem audit + MP-0004 orchestration session learnings > Load: coordination/experts/suitecrm/CURRENT-orchestration.md --- ## Purpose Documents orchestration-specific learnings for the SuiteCRM dev workspace. Covers subagent coordination, context management, forbidden patterns, and the differences between this workspace's orchestrator and standard multi-workspace orchestration. --- ## SuiteCRM Orchestrator vs Standard Orchestrator | Aspect | Standard (ReportMaker etc.) | SuiteCRM | |--------|---------------------------|----------| | Code location | Local filesystem | Remote server (172.20.0.102) | | Parallelism | Git worktrees, parallel agents | Sequential, single remote target | | Deploy | Local file writes | SSH/SCP/MCP to remote | | File locks | Worktree-based | None needed (sequential) | | Build step | None (PHP) | Angular extension builds on remote | | Cache | Single (PHP opcache) | 4-layer cache system (DEV-10) | **Key implication:** The orchestrator cannot parallelize code-writing tasks. It CAN parallelize research, MCP queries, and verification steps. --- ## Subagent Report Format (F-01) Established after MP-0003 postmortem: subagents delivered incomplete reports (MCP gap logs only, no task status), forcing orchestrator to guess whether tasks were completed. ### Required format Every subagent response that concludes a task MUST contain: ``` ## Rapport - task_id: TASK-NNN - status: completed | failed | partial - files_deployed: [full paths] - errors: ingen | [error message] ``` ### Invalid report examples - MCP gap logging without task_id or status -- re-delegate - "Done" without listing files_deployed -- re-delegate - Status only without files_deployed -- acceptable for data-only tasks, not for file deploy tasks ### Enforcement Orchestrator checks for `## Rapport` section with all 4 fields. Missing any field triggers re-delegation or state verification (F-05). ---
GOTCHA-C-17: Bruk `RecordModalService.showModal()`, IKKE `NgbModal.open()` direkte suitecrm knowledge medium CURRENT-module-contacts.md 100 2026-03-20 02:00:01
Source file: coordination/experts/suitecrm/CURRENT-module-contacts.md
Source date: 2026-03-17
Keywords: ["gotchac17","bruk","recordmodalserviceshowmodal","ikke","ngbmodalopen","direkte"]
Cross-domain: []
Symptoms: []
Body:
### GOTCHA-C-17: Bruk `RecordModalService.showModal()`, IKKE `NgbModal.open()` direkte `RecordModalService.showModal()` håndterer modal-initialisering korrekt. Direkte `NgbModal.open(RecordModalComponent)` med `componentInstance`-tilordning gir timing-problemer. ### GOTCHA-C-18: editviewdefs-felt uten eksplisitt `label` viser ingen label i RecordModal (DELVIS LØST) Felt som mangler `label`-attributt i editviewdefs får **ingen label** i RecordModal create-modus. **Backend-fix (SC-0031):** Alle felt i editviewdefs har nå eksplisitt label. Backend returnerer korrekte labels. **ULØST (Angular):** Labels mangler fortsatt i UI etter SC-0031. Angular renderer dem ikke. Se DEV-28. **Arkitektur:** `RecordModalStore` bruker `meta.recordView` (defaultEntries), IKKE `meta.extra.recordView`. ### GOTCHA-C-19: `mcp_test_c` orphan i `fields_meta_data` — LOEST 2026-03-17 ~~`fields_meta_data` hadde rad `Contactsmcp_test_c` uten tilhoerende kolonne i `contacts_cstm`.~~ **Status:** LOEST. Orphan slettet fra DB + kompilert `vardefs.ext.php` renset via `rebuild_extensions` (2026-03-17). **Laerdom:** Aa slette kun DB-raden er IKKE nok — den kompilerte `vardefs.ext.php` gjenskaper raden ved neste cache-rebuild. `rebuild_extensions` MAA kjoeres for aa regenerere den kompilerte filen fra kildene. **Se:** DEV-32 i CURRENT-architecture.md for generelt orphan-moenster.
Filkart — alle custom filer for Contacts på serveren suitecrm knowledge medium CURRENT-module-contacts.md 100 2026-03-20 02:00:01
Source file: coordination/experts/suitecrm/CURRENT-module-contacts.md
Source date: 2026-03-17
Keywords: ["filkart","alle","custom","filer","for","contacts","serveren","Leads","Contacts"]
Cross-domain: []
Symptoms: []
Body:
## Filkart — alle custom filer for Contacts på serveren ``` /var/www/suitecrm/public/legacy/custom/ ├── modules/Contacts/ │ ├── metadata/ │ │ ├── detailviewdefs.php ← lead_name felt (SC-0022) │ │ ├── editviewdefs.php ← eksplisitte labels (SC-0031), lead_name (SC-0022) │ │ └── subpanels/ │ │ └── Account_subpanel_contacts.php ← pre-eksisterende │ ├── SyncLeadIdHook.php ← Logic hook (SC-0022) │ └── SyncLeadRelateToM2MHook.php ← Logic hook: felt→M2M+contact_id (SC-0039) └── Extension/modules/Contacts/Ext/ ├── Vardefs/ │ ├── lead_relate_fields.php ← lead_name (rname=account_name), lead_id (SC-0022, SC-0036) │ └── leads_contacts_1_Contacts.php ← M2M link med side=right (SC-0022) ├── Layoutdefs/ │ └── leads_subpanel_fix.php ← Override core subpanel → M2M (SC-0022) ├── Language/ │ └── nb_NO.custom_agent.php ← LBL_TITLE=Stilling (SC-0025), LBL_LEAD_NAME (SC-0022) ├── LogicHooks/ │ ├── sync_lead_id.php ← Hook-registrering (SC-0022) │ └── sync_lead_relate_to_m2m.php ← Hook-registrering (SC-0039) # NB: Leads default subpanel (custom/modules/Leads/metadata/subpanels/default.php) # overridet til account_name — påvirker Leads-subpanelet på Contacts. Se SC-0038. ``` --- ## Gotchas (Contacts-spesifikke) ### GOTCHA-C-15: `RecordModalOptions.size` (top-level) ignoreres `RecordModalService.showModal()` sender KUN `recordModalOptions.modalOptions` videre til NgbModal. Top-level `size`-felt leses ALDRI. **Riktig:** `showModal({ module: '...', modalOptions: { size: 'xl' } })` **Feil (ignoreres stille):** `showModal({ module: '...', size: 'xl' })` ### GOTCHA-C-16: RecordModal krever metadata pre-load FØR `showModal()` `loadMetadata()` bruker `shareReplay(1)`. Første kall er asynkront — modal forblir tom. `setTimeout(0)` virker IKKE. Bruk: ```typescript metadataStore.getMetadata('Contacts').pipe(take(1)).subscribe(() => showModal(...)); ```
SC-0036: lead_name vardef rname — viser firmanavn (account_name) istedenfor personnavn suitecrm knowledge medium CURRENT-module-contacts.md 100 2026-03-20 02:00:01
Source file: coordination/experts/suitecrm/CURRENT-module-contacts.md
Source date: 2026-03-17
Keywords: ["sc0036","leadname","vardef","rname","viser","firmanavn","accountname","istedenfor","personnavn","Leads","Contacts"]
Cross-domain: []
Symptoms: []
Body:
### SC-0036: lead_name vardef rname — viser firmanavn (account_name) istedenfor personnavn - **Dato:** 2026-03-17 - **Fil:** `public/legacy/custom/Extension/modules/Contacts/Ext/Vardefs/lead_relate_fields.php` - **Endring:** `rname` på `lead_name` relate-felt endret fra `'name'` til `'account_name'`. Viser nå Lead-kortets firmanavn i feltet istedenfor format "Fornavn Etternavn". - **Hvorfor:** Lead brukes som firmakort (B2B-arkitektur). Brukeren forventer firmanavn, ikke personnavn, i "NAVN PÅ LEAD"-feltet på Contacts. - **Oppgraderingssikker:** Ja — Extension vardef override ### SC-0039: SyncLeadRelateToM2MHook på Contacts — bidireksjonell synk - **Dato:** 2026-03-17 - **Filer:** - `public/legacy/custom/modules/Contacts/SyncLeadRelateToM2MHook.php` (PHP-klasse) - `public/legacy/custom/Extension/modules/Contacts/Ext/LogicHooks/sync_lead_relate_to_m2m.php` (hook-registrering) - **Trigger:** `after_save` på Contacts - **Logikk:** 1. Når `lead_id` endres på et Contact-kort (via lead_name relate-felt i editview) 2. Hook sjekker om den nye lead allerede er i `leads_contacts_1_c` join-tabellen 3. Hvis IKKE: legg til rad i join-tabellen (synk felt→M2M subpanel) 4. Setter også `contact_id` på Lead-kortet hvis det er tomt (bidireksjonell) 5. Hvis gammel `lead_id` fjernes: fjern raden fra join-tabellen - **Forskjell fra SC-0035:** SC-0035 (`SyncContactRelateToM2MHook`) kjører på Leads-modulen. SC-0039 kjører på Contacts-modulen. Begge synker bidireksjonelt. - **Oppgraderingssikker:** Ja — custom/ og Extension/ ### SC-0032: contact-relate — metadata pre-load + stopPropagation (MP-0005 BUGFIX-FINAL) - **Dato:** 2026-03-17 - **Filer:** - `extensions/magitekExt/app/src/fields/contact-relate/contact-relate-edit.component.ts` - `extensions/magitekExt/app/src/fields/contact-relate/contact-relate-detail.component.ts` - `extensions/magitekExt/app/src/fields/contact-relate/contact-relate-detail.component.html` - **Rotårsak:** Modal var tom ved første klikk. `loadMetadata()` bruker `shareReplay(1)` — første kall er async (HTTP), Observable-kjeden i modal mottar ikke emisjonen. - **Fix:** Pre-load metadata FØR showModal(): ```typescript this.metadataStore.getMetadata('Contacts').pipe(take(1)).subscribe(() => { this.recordModalService.showModal({...}); }); ``` - **stopPropagation:** (+)-knapp i detail-template fikk `(click)="$event.stopPropagation()"` for å hindre trigger av inline-edit. - **Verifisert:** Playwright-screenshot bekrefter første klikk viser modal-innhold. - **Oppgraderingssikker:** Ja — Extension-filer ---
Ingestion History

Loading…