6.2 KiB
6.2 KiB
phase, plan, subsystem, tags, requires, provides, affects, tech-stack, key-files, key-decisions, patterns-established, duration, started, completed
| phase | plan | subsystem | tags | requires | provides | affects | tech-stack | key-files | key-decisions | patterns-established | duration | started | completed | |||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 68-code-deduplication-refactor | 01 | infra |
|
|
|
|
|
|
|
~25min | 2026-04-03T19:10:00Z | 2026-04-03T19:35:00Z |
Phase 68 Plan 01: Code Deduplication Refactor Summary
Extracted 3 shared utilities + 1 service from 17+ duplicated methods across codebase, eliminating ~250 lines of copy-pasted code
Performance
| Metric | Value |
|---|---|
| Duration | ~25min |
| Started | 2026-04-03T19:10:00Z |
| Completed | 2026-04-03T19:35:00Z |
| Tasks | 3 completed (+ 1 pre-plan ReceiptService) |
| Files modified | 18 |
| Delegation | 3 tasks via Claude Agent (parallel) |
Acceptance Criteria Results
| Criterion | Status | Notes |
|---|---|---|
| AC-1: getCaBundlePath eliminated from 7 classes | Pass | 0 occurrences remain, SslCertificateResolver is sole source |
| AC-2: toggleStatus consolidated in trait | Pass | 4 repos use ToggleableRepositoryTrait, controllers unchanged |
| AC-3: resolveRedirectPath consolidated | Pass | 0 occurrences remain, RedirectPathResolver is sole source |
Accomplishments
- Extracted
SslCertificateResolverreplacing 7 identicalgetCaBundlePath()copies - Extracted
ToggleableRepositoryTraitused by 4 repositories (Automation, EmailMailbox, EmailTemplate, ReceiptConfig) - Extracted
RedirectPathResolverreplacing 3 identicalresolveRedirectPath()copies - Extracted
ReceiptServiceconsolidating receipt issuance from ReceiptController + AutomationService (pre-plan bugfix that prompted this phase) - Fixed receipt datetime bug:
date('Y-m-d')→date('Y-m-d H:i:s')in automation path - Migration 000077:
sale_dateDATE→DATETIME + backfill old receipts fromcreated_at
Files Created/Modified
| File | Change | Purpose |
|---|---|---|
src/Core/Http/SslCertificateResolver.php |
Created | CA bundle path resolution (was in 7 classes) |
src/Core/Http/ToggleableRepositoryTrait.php |
Created | Shared toggle active/inactive pattern |
src/Core/Http/RedirectPathResolver.php |
Created | Redirect path validation (was in 3 controllers) |
src/Modules/Accounting/ReceiptService.php |
Created | Centralized receipt issuance logic |
src/Modules/Accounting/ReceiptIssueException.php |
Created | Dedicated exception for receipt errors |
database/migrations/20260403_000077_* |
Created | sale_date DATETIME + backfill |
| 7x API/Tracking clients | Modified | getCaBundlePath → SslCertificateResolver |
| 4x Repositories | Modified | toggleActive → ToggleableRepositoryTrait |
| 3x Integration controllers | Modified | resolveRedirectPath → RedirectPathResolver |
ReceiptController.php |
Modified | Delegates to ReceiptService |
AutomationService.php |
Modified | Delegates to ReceiptService, removed 7 private methods |
CronHandlerFactory.php |
Modified | Wires ReceiptService |
routes/web.php |
Modified | Wires ReceiptService |
Deviations from Plan
Summary
| Type | Count | Impact |
|---|---|---|
| Scope additions | 1 | ReceiptService extracted pre-plan as bugfix response |
| Auto-fixed | 0 | None |
| Deferred | 0 | None |
Total impact: ReceiptService was essential — it fixed the datetime bug AND eliminated the largest duplication case.
Re-analysis Results (Post-Refactor)
Remaining duplications found:
| Priority | Issue | Copies | Recommendation |
|---|---|---|---|
| HIGH | validateCsrf() | 6 | CsrfValidator service |
| MEDIUM | isActive filter closure | 3 | Utility function |
| LOW | array_values(array_filter()) | 12+ | ArrayHelper |
| LOW | date instantiation pattern | 8+ | Monitor only |
| LOW | array_map('intval') | 4 | Monitor only |
Next Phase Readiness
Ready:
- Core/Http/ established as location for shared utilities
- Pattern proven: static resolvers + traits work cleanly with existing architecture
- Re-analysis baseline documented for plan 68-02
Concerns:
- validateCsrf duplication is security-sensitive — should be next priority
- ToggleableRepositoryTrait uses
$this->pdo— verify consistency across repos
Blockers: None
Phase: 68-code-deduplication-refactor, Plan: 01 Completed: 2026-04-03