Approved proposals were only written to company_ai_insights table.
Now also writes to Company.description_short, services_offered, core_values,
industry_sector — but ONLY when the field is currently empty.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Modal had overflow:hidden cutting off the footer buttons. Changed to
overflow-y:auto with sticky footer so 'Zapisz wybrane' is always reachable.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. Auto-strip legal form from name (CONSTELLATION SP. Z O.O. → Constellation)
2. Auto-suggest category from main PKD code (62.02.Z → IT)
3. Clean empty 'https://' from WWW field
4. Rename button to 'Wyszukaj w internecie'
5. Auto-advance to step 4 after logo confirmation
6. Larger logo preview in summary step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Green checkmarks appear next to correctly filled fields in Step 2
- Live validation on input (checkmarks update as user types)
- 'Wyszukaj stronę' recognizes when URL already from KRS
- Backend returns existing website without Brave search if already known
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
KRS for PROS POLAND has no www/email/phone. All Brave results are directory
sites (filtered). Show clear message about what's missing from registry.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
'PROS POLAND SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ' returned no results.
Now searches 'PROS POLAND Sopot' and applies found URL to company.website.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add 'Wyszukaj stronę' button in Step 2 next to WWW field (uses WebsiteDiscoveryService/Brave)
- Fix company name: update from legal_name when KRS enrichment provides it
- Add discover-website endpoint
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ORM db.delete() doesn't honor ondelete='CASCADE' on FK constraints,
causing NotNullViolation on company_financial_reports and other tables.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The FK created a second path between companies→users, breaking SQLAlchemy
mapper initialization for User.company relationship.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Allows Kierownik Biura to independently add new member companies via NIP lookup,
registry data enrichment (KRS/CEIDG), logo discovery, SEO/GBP/Social audits.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Logo upload in company edit was writing the file path to `logo_dark_bg`
(a Boolean column), causing TypeError and rolling back ALL profile changes.
Now saves to static/img/companies/{slug}.{ext} where company_detail expects it.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Hide "Zapisz zmiany" and preview panel when team tab is active
- Show last login date or "Nie zalogował/a się jeszcze" per member
- Add "Wyślij ponownie zaproszenie" button for inactive accounts
- New endpoint POST /firma/<id>/zespol/<user_id>/zaproszenie
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Permission checkboxes now show descriptive labels with hints explaining
what each permission controls. Role descriptions visible under each member.
Dropdown options in add form also more descriptive.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
nordaConfirm(message, callback) signature requires callback as 2nd arg,
not 3rd. The description text is now part of the message HTML.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Allow company MANAGERs to add/remove users, change roles,
and manage granular permissions from the company edit page.
New "Zespół" tab with AJAX-based team CRUD.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
nordaConfirm now accepts both (form, message, options) for form submission
and (message, callback, options) for AJAX-based confirmations like guest deletion.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
nordaConfirm() expects (form, message, options) for form submission,
not a callback. Using native confirm() for AJAX-based guest deletion.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
7 tasks: migration, model, API endpoints, template, local test, staging deploy, production deploy.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Menu was placed outside header (for iOS z-index stacking) but used
position:absolute relative to body, rendering it below viewport.
Changed to position:fixed with dynamic top calculated from trigger
button position via getBoundingClientRect.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds direct shortcut to company edit (MANAGER) or company profile (EMPLOYEE)
in the user avatar dropdown. Addresses feedback that editing company data
required searching for own company in the directory.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Shows: total active, paying members, subsidiaries (fee in parent),
resignations, standard vs premium fee tier counts.
All dynamic from database.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Migration 095:
- Fix Pelmar parent: TTM (not P&P) based on Excel positioning
- New TTM subsidiaries: ARD Invest, Progress Optima
- N33/STUDIO N°33 → TERMO
- Fiume Studio + Alter Energy → Pacific Sun (new)
- Radio Norda FM, Nadmorski24.pl: set fee_included_in_parent
- New companies: Pacific Sun, Ultramare, IBET, Prospoland, Ekonsul,
Steamset, Goodwill, Orlex Invest
- Rename: Iwona Spaleniak → Coach 4 You
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Allows users to register accompanying guests (non-portal users) for events.
Covers data model, API endpoints, UI design, and migration plan.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When Google returns a longer name (e.g. "Sprzedaż i Wynajem Wózków
Widłowych" for "Sprzedaż Wózków"), max(company_words, google_words)
penalized the score unfairly (2/4 = 0.5 < 1.0 threshold). Now we
check what fraction of OUR words appear in Google (2/2 = 1.0).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The constructor used 'url' which doesn't exist on the model — the
correct column name is 'website_url'. This caused GBP audit to fail
for companies without a prior website analysis record.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
GBP audit modal displayed raw <span> tags instead of rendered HTML
because updateStep() used textContent instead of innerHTML.
Migration 090: Lord Alkohole NIP update (company transformation).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Images pasted as base64 had their src stripped by bleach (only http/https
allowed by default). Now data: protocol is whitelisted.
Also allow width/height/style on img for resize support.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Root cause of double paste: Quill's internal clipboard handler AND my DOM
handler both processed the image. Fix: override clipboard.onPaste directly
to intercept images before Quill processes them.
- uploadAndInsertImage() extracted as reusable method
- CSS: img.selected gets resize:both for native browser resize handle
- Removed complex DOM resize hack (didn't work with Quill contenteditable)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>