1354 Commits

Author SHA1 Message Date
kelly
f9130d1c67 feat: add plus addressing for user-specific email routing
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
- Reply-To can include user ID: inbox+u123@domain.com
- InboundEmailService parses plus address to auto-assign threads
- When user starts conversation, replies route back to them
- Verifies user belongs to business before assigning
2025-12-16 18:02:29 -07:00
kelly
a542112361 feat: add Reply-To headers to all transactional emails
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
- Create HasBusinessReplyTo trait for consistent Reply-To handling
- Apply trait to QuoteMail, InvoiceSentMail, and all Order emails
- Reply-To uses business's primary email identity when configured
- Enables email replies to route back to CRM inbox
2025-12-16 17:53:20 -07:00
kelly
b2108651d8 feat: enable email replies to route to CRM inbox
Some checks failed
ci/woodpecker/push/ci Pipeline failed
- Add Reply-To header to QuoteMail using business's primary email identity
- Add emailIdentities() and primaryEmailIdentity() relationships to Business model
- Add notification to InboundEmailService for inbound email messages

When a user sends a quote (or invoice/order) email and the recipient
replies, the reply will:
1. Come in via webhook (Postmark, SendGrid, etc.)
2. Be processed by InboundEmailService
3. Threaded using In-Reply-To/References headers
4. Create a CrmChannelMessage in the CRM inbox
5. Send notification to assigned user or business users
2025-12-16 17:50:17 -07:00
kelly
b81b3ea8eb feat: remove chat widget from seller side, add message notifications
Some checks failed
ci/woodpecker/push/ci Pipeline failed
- Hide marketplace chat widget for sellers (only show for buyers)
- Sellers use CRM inbox instead of chat widget
- Create CrmNewMessageNotification for inbound messages
- Add 'message' style to NotificationStyleService
- Send notifications to assigned user or business users on new messages
2025-12-16 17:46:14 -07:00
kelly
3ae38ff5ee fix: resolve PDF generation and invoice location validation
Some checks failed
ci/woodpecker/push/ci Pipeline failed
- QuoteController: Change pdf->inline() to pdf->stream() for DomPDF v3.x compatibility
- InvoiceController: Fix validation rule to use 'locations' table (not 'business_locations')

Fixes Issue #5 (PDF error) and Issue #8 (invoice submission error)
2025-12-16 17:45:55 -07:00
kelly
5218a44701 refactor: remove agent status from inbox, rely on user area
Some checks failed
ci/woodpecker/push/ci Pipeline failed
- Remove agent status dropdown from inbox top bar
- Remove presence channel subscription
- Remove agent status heartbeat
- Remove onlineUsers tracking
- Status is managed in user area settings instead
2025-12-16 17:43:52 -07:00
kelly
6234cea62c fix: remove character limit validation from product descriptions (Issue #7)
Some checks failed
ci/woodpecker/push/ci Pipeline failed
Long description fields (long_description, consumer_long_description,
buyer_long_description) no longer have max character limits, allowing
full product descriptions without truncation.
2025-12-16 17:39:48 -07:00
kelly
6e26a65f12 feat: add menu toggle button to inbox top bar
Some checks failed
ci/woodpecker/push/ci Pipeline failed
Hamburger icon toggles sidebar expanded/collapsed state so users
can access navigation menu while in the inbox view.
2025-12-16 17:38:56 -07:00
kelly
86532e27fe fix: swap SMS and Chat icons
Some checks failed
ci/woodpecker/push/ci Pipeline failed
- SMS: phone icon (device-phone-mobile)
- Chat: chat bubble icon (chat-bubble-left-right)
2025-12-16 17:37:22 -07:00
kelly
f2b8d04d03 feat: auto-collapse sidebar on inbox page for more space
User can hover to expand sidebar if needed.
2025-12-16 17:36:40 -07:00
kelly
615dbd3ee6 refactor: redesign unified inbox with Chatwoot-style layout
Some checks failed
ci/woodpecker/push/ci Pipeline failed
- Add top bar with channel tabs (All, Email, SMS, WhatsApp, Instagram, Chat)
- Move status filters (All, Open, Pending, Closed) to top bar right side
- Move agent status dropdown to top bar
- Inline thread list with search and assignment filter
- Clean 3-column layout: thread list | messages | context sidebar
- Remove separate agent-status-widget and thread-filters partials
- Add null checks for Echo to prevent errors if WebSockets unavailable
2025-12-16 17:34:12 -07:00
kelly
fb6cf407d4 fix: make contacts.last_name nullable (Issue #9)
Some checks failed
ci/woodpecker/push/ci Pipeline failed
The controller validation allows null last_name but the database
column was NOT NULL, causing insert failures.
2025-12-16 17:29:00 -07:00
kelly
9fcfc8b484 fix: correct users table column names in unified inbox query
Some checks failed
ci/woodpecker/push/ci Pipeline failed
The users table has first_name/last_name columns, not a name column.
Map the query results to include a computed 'name' field for view
compatibility since the Blade templates expect member.name.
2025-12-16 17:27:11 -07:00
kelly
60e1564c0f Merge branch 'feat/omnichannel-inbox' into develop
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
2025-12-16 16:40:06 -07:00
kelly
a42d1bc3c8 fix(ci): remove --parallel flag (paratest not installed)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
2025-12-16 16:19:43 -07:00
kelly
729234bd7f fix(ci): install dev dependencies for lint/test steps
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-16 16:18:23 -07:00
kelly
d718741cd3 fix: resolve invoice submission error (Issue #8)
Some checks failed
ci/woodpecker/push/ci Pipeline failed
- Add auto-generation of view_token on CrmInvoice creation
- Add migration to make account_id nullable (controller allows null)
2025-12-16 16:16:31 -07:00
kelly
1e7e1b5934 feat: add omnichannel unified inbox for sales reps
Some checks failed
ci/woodpecker/pr/ci Pipeline failed
Implements a Chatwoot-style unified inbox with real-time messaging
for sales reps to manage communications across all channels.

Features:
- Real-time messaging via Laravel Reverb WebSockets
- Sales rep filtering ("My Accounts Only") for assigned accounts
- Typing indicators showing when others are composing
- Agent status (online/away/busy) with heartbeat monitoring
- Email engagement sidebar (opens/clicks from marketing)
- Quick replies with variable substitution
- Presence awareness (who's online in team)
- Three-column layout: thread list, conversation, context sidebar

New files:
- Broadcasting events for real-time updates
- Unified inbox view with Alpine.js component
- 9 Blade partials for modular UI

Access via: Inbox → Conversations in sidebar
Route: /s/{business}/crm/inbox
2025-12-16 15:40:59 -07:00
kelly
3ac4358c0b fix: create supervisor log directory in Dockerfile
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
2025-12-16 12:19:04 -07:00
kelly
cc997cfa20 Merge feat/chat-ui: unified chat inbox (Chatwoot-style)
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-16 10:37:42 -07:00
kelly
37dd49f9ec fix(ci): use registry.spdy.io (HTTPS) instead of internal HTTP registry
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-16 10:36:55 -07:00
kelly
e16281e237 fix(ci): use registry.spdy.io (HTTPS) instead of internal HTTP registry 2025-12-16 10:36:36 -07:00
kelly
64479a5c84 fix: include coworkers (own business contacts) in chat targets 2025-12-16 10:36:17 -07:00
kelly
5b1b085e06 feat: add unified chat UI at /s/{business}/chat
Chatwoot-style 3-panel chat interface:
- Left panel: conversation list with filters (status, assignee, search)
- Center panel: message thread with reply box and AI draft
- Right panel: contact details, assignment, internal notes

Features:
- Real-time thread loading via fetch API
- Keyboard shortcuts (Cmd+Enter to send)
- Collision detection heartbeat
- New conversation modal
- Thread status management (close/reopen)
- AI reply generation
- Internal notes

Routes added at /s/{business}/chat/*
Sidebar link added under Inbox section (requires Sales Suite)
2025-12-16 10:29:24 -07:00
kelly
e0caa83325 fix: use CDN URL for default images instead of internal MinIO URL
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-16 10:12:55 -07:00
kelly
90bc7f3907 fix: resolve Crystal's issues #5, #6, #7
Some checks failed
ci/woodpecker/push/ci Pipeline failed
Issue #7 - Description Characters:
- Remove minlength/maxlength constraints from product description fields
- Increase backend validation limit from 500 to 5000 characters
- Update help text to remove character range guidance

Issue #6 - Edit Quote error:
- Create missing edit.blade.php view for quotes
- Simplify controller edit method - don't need to load all accounts/contacts
- Pre-populate form with existing quote data

Issue #5 - Quotes PDF (storage fix):
- Ensure storage/fonts directory exists for DomPDF font caching
2025-12-16 09:56:22 -07:00
kelly
b7fb6c5a66 style: fix pint formatting issues
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-16 09:36:47 -07:00
kelly
0d38f6dc5e fix: use MinIO paths for default images instead of local paths
Some checks failed
ci/woodpecker/push/ci Pipeline failed
- Upload dispensary.svg and placeholder-product.svg to MinIO
- Update stores/index.blade.php to use Storage::disk('minio')->url()
- Update stores/show.blade.php to use MinIO for dispensary icon and placeholder
- Update stores/orders.blade.php to use MinIO dispensary icon
- Update Filament ProductsTable to use MinIO placeholder

Fixes missing images on production where local paths don't exist.
2025-12-16 09:35:07 -07:00
kelly
8c4b424eb6 fix(ci): use correct Kaniko flags for internal registry
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-16 09:33:45 -07:00
kelly
2cf335d019 fix(ci): use internal registry (no auth needed)
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-16 09:32:00 -07:00
kelly
9f0678a17c ci: retry build
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-16 09:24:40 -07:00
kelly
ad9c41dd28 ci: trigger build with updated secrets
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-16 09:20:17 -07:00
kelly
1732bcbee2 fix(ci): use username/password format for registry auth
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-16 01:47:59 -07:00
kelly
96276cc118 fix(ci): use printf for proper base64 auth encoding
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-16 01:40:02 -07:00
kelly
dc69033ca4 ci: retry with cannabrands user
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-16 01:18:54 -07:00
kelly
bcf25eba38 ci: retry
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-16 01:16:15 -07:00
kelly
9116d9b055 ci: retry
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-16 01:08:11 -07:00
kelly
b7a3b5c924 ci: retry with updated secrets
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-16 01:04:42 -07:00
kelly
5b9be3368a ci: retry
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-16 01:01:30 -07:00
kelly
5c7ea61937 ci: retry with org token
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-16 00:59:11 -07:00
kelly
29a8bdc85f ci: retry 2025-12-15 23:30:09 -07:00
kelly
8116de4659 ci: retry
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-15 23:24:55 -07:00
kelly
578753235d ci: retry
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-15 22:45:24 -07:00
kelly
8eef5c265e ci: trigger
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-15 21:59:44 -07:00
kelly
1fe1749d6f ci: trigger build
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-15 21:53:01 -07:00
kelly
a9c7b3034c ci: trigger build (secrets syntax fixed)
Some checks failed
ci/woodpecker/push/ci Pipeline failed
2025-12-15 21:27:00 -07:00
kelly
0d17575f56 fix(ci): Update secrets syntax for Woodpecker v3
Some checks failed
ci/woodpecker/push/ci Pipeline failed
Replace deprecated 'secrets:' with 'environment' + 'from_secret'
2025-12-15 21:25:12 -07:00
kelly
9366f099ec ci: trigger build 2025-12-15 21:21:11 -07:00
kelly
b3edc4bf87 ci: trigger build with setup-registry-auth step 2025-12-15 21:20:01 -07:00
kelly
00aa796daf fix: use Docker Hub for base image (buildx can't access insecure registry) 2025-12-15 21:18:49 -07:00