Skip to content

3.x#68

Merged
ManukMinasyan merged 417 commits intomainfrom
3.x
Feb 15, 2026
Merged

3.x#68
ManukMinasyan merged 417 commits intomainfrom
3.x

Conversation

@ManukMinasyan
Copy link
Contributor

No description provided.

Copilot AI review requested due to automatic review settings December 27, 2025 22:32
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
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
- 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.
…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
@ManukMinasyan ManukMinasyan merged commit c4f698e into main Feb 15, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant