Merged
Conversation
There was a problem hiding this comment.
Pull request overview
This PR migrates the application to version 3.x with ULID (Universally Unique Lexicographically Sortable Identifiers) as primary keys across all core tables. This is a major architectural change that includes:
- Migration from auto-increment integer IDs to ULID string IDs (26 characters)
- Comprehensive test suite for import/export functionality
- Updates to custom fields configuration for multi-value and unique value support
- Logo and UI refinements
Key Changes
- ULID migration for all core entity tables (users, teams, companies, people, opportunities, tasks, notes)
- New import/export test coverage with 15+ test files
- Custom field model binding and configuration updates
- Horizon queue configuration for dedicated import processing
Reviewed changes
Copilot reviewed 149 out of 155 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
database/migrations/2025_12_20_000000_migrate_to_ulid.php |
Comprehensive ULID migration with two-phase approach |
tests/Feature/Filament/App/Imports/* |
Extensive test coverage for import functionality (9 new test files) |
tests/Feature/Services/Import/CompanyMatcherTest.php |
Tests for company matching logic during imports |
tests/Feature/Migrations/UlidMigrationTest.php |
Tests verifying ULID migration correctness |
app/Models/*.php |
Added HasUlids trait to all core models |
database/migrations/*.php |
Updated all migration files to use ULID columns |
app/Providers/AppServiceProvider.php |
Custom field model binding and morph map updates |
config/custom-fields.php |
Enabled multi-value and unique value features |
config/horizon.php |
Added dedicated imports queue configuration |
composer.json |
Updated custom-fields and flowforge to v3 beta |
resources/views/filament/app/logo.blade.php |
Logo sizing improvements |
tests/Feature/Commands/InstallCommandTest.php |
Fixed to use temp env files |
tests/Feature/Auth/AuthenticationTest.php |
Fixed hardcoded team ID |
phpstan.neon & phpstan-baseline.neon |
Updated for ULID type changes |
…ning - Fix bug: enrichRowWithCompanyMatch was reading $row['id'] (person/opportunity ID) instead of $row['company_id'] (actual company ID) - Add hasMappingWarnings() to detect multiple warning conditions - Add hasCompanyNameWithoutId() to detect company_name without company_id mapping - Add getMappingWarningsHtml() to generate dynamic modal content - Extend existing warning modal to show both unique identifier and company warnings
Improvements
add intelligent date format detection that analyzes csv values to determine whether dates are iso, european (dd/mm), or american (mm/dd) format based on unambiguous evidence (values where day > 12). - add DateFormat and TimestampFormat enums with parsing support - add DateFormatResult dto for detection results with confidence - add DateValidator service for validating dates with format awareness - add date format detection to DataTypeInferencer - integrate date validation into CsvAnalyzer for date/datetime fields - add date format selector dropdown to review step ui - extend ColumnAnalysis with date format properties and helpers - extend ValueIssue with issue type for date ambiguity warnings
completely rewrites the import documentation to: - fix incorrect required fields (people: company_name is not required) - correct duplicate detection methods (only companies/people have non-id matching; opportunities, tasks, notes use id-only matching) - add comprehensive date format detection section explaining iso, european, and american formats with ambiguity handling - document company matching priority for people imports (id > domain > name) - simplify structure using tables instead of verbose prose - reduce file size by 40% while improving accuracy also fixes config/custom-fields.php to remove non-existent feature enum
add commonmark tableextension to markdown config so tables render as html instead of raw pipe-separated text also moves system_sections_enabled to disabled features in custom-fields
- Replace 5 overlapping docs with 4 focused guides - Add getting-started.md (actionable user onboarding) - Add developer-guide.md (streamlined technical docs) - Update api-guide.md with Coming Soon banner - Keep import-guide.md (already accurate) - Delete business-guide.md, quick-start-guide.md, technical-guide.md - Fix inaccuracies: auth is Jetstream not Fortify - Fix inaccuracies: Task/Note use morphToMany relationships - Remove non-existent keyboard shortcuts - Update config and icon mappings
3x/import wizard date formats
Chore/import wizard modernization
- remove unused getOptionsFormComponents() from BaseImporter - remove unused loadOpportunities() from ImportRecordResolver - simplify instanceof checks to null-safe operator in ImportPreviewTable - simplify hasMappingWarnings() to single-line boolean expression - standardize entity name to singular 'opportunity' for consistency - apply rector/pint code style improvements across codebase
extract match type constants into dedicated enum for type safety and Filament HasLabel integration in import wizard company matching
apply consistent blank line formatting between traits and break ProcessImportPreview dispatch into readable multi-line format
- Configure People entity with email-based lookup identifier - Configure Company entity with domain-based lookup identifier - Add LookupFieldMatcher service for matching records by unique attributes - Add relationship mapping support with company/contact columns - Add public email domain filtering for company matching - Enhance import preview with relationship match status - Add MatchType enum for standardized match type handling - Improve date/timestamp format detection in CSV analysis - Add polymorphic relationship syncing for tasks and notes
…ts in custom-fields.php and StreamingImportCsv.php
…umn entity links Expanded from 2-case (FindOnly/AlwaysCreate) to 3-case (UpdateOnly/FindOrCreate/AlwaysCreate) design with multi-column entity link mapping support.
…m field entity links
…ield guesses Normalize spaces, dashes, and underscores as interchangeable when matching CSV headers to import fields (Filament convention). Auto-generate guess aliases for custom fields from code and name plus singular forms.
Add `validateBoolean` method to support boolean value validation. Update `composer.lock` to incorporate `relaticle/custom-fields` package changes (beta9).
…to beta11 - Updated `relaticle/custom-fields` package to beta11 in `composer.lock`. - Enhanced intra-import deduplication by implementing row-level matching for matchable fields. - Merged multi-choice custom field values during updates and deduplication. - Improved error handling by including validation error messages in the UI.
- Updated "import-guide.md" to correct field mappings for Notes (Content → Title) and Tasks (Assignee_Email → Assignee). - Documented new update behaviors: blank field handling, multi-value merging, and duplicate rows. - Adjusted CSV templates for Tasks and Notes to reflect updated mappings and guidance.
MatchOrCreate previously created related records (e.g., People via email) with only the name set, leaving the matching custom field empty. This meant future imports couldn't re-match by the same field and the record lacked usable contact data. Now carries the matchField through RelationshipMatch and creates a CustomFieldValue after auto-creation.
Invalid values like "GlobalHealth Inc" for domain matchers were passing validation and triggering auto-creation of companies. Now format rules from custom field type definitions (email, link, phone) are checked before the DB lookup, and format-invalid values are excluded from relationship writing.
- Deduplicate pendingCustomFieldValues by unique key before upserting to prevent ON CONFLICT DO UPDATE from hitting the same row twice in one INSERT statement (postgres rejects this, sqlite silently handles it) - Cast json_value to jsonb in EntityLinkResolver pgsql branch since the column is json type but jsonb_typeof/jsonb_array_elements_text require jsonb input - Use class constant for Export model in migration to satisfy rector
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.