Atomic extraction of the deadline-rule compute engine + types from
internal/services into a new pkg/litigationplanner package that paliad
+ youpc.org can both import. No behaviour change — every existing test
passes against the post-move shape.
Package contents (~1850 LoC):
- doc.go package docstring + reuse manifesto
- types.go Rule, ProceedingType, NullableJSON, AdjustmentReason,
HolidayDTO, CalcOptions, CalcRuleParams, Timeline,
TimelineEntry, RuleCalculation*, FristenrechnerType,
ProjectHint, sentinel errors
- catalog.go Catalog interface (proceeding + rule lookups)
- holidays.go HolidayCalendar interface
- courts.go CourtRegistry interface + DefaultsForJurisdiction +
country/regime constants
- expr.go EvalConditionExpr + HasConditionExpr +
ExtractFlagsFromExpr (jsonb gate evaluator)
- durations.go ApplyDuration + AddWorkingDays (pure compute)
- subtrack.go SubTrackRouting + LookupSubTrackRouting registry
- legal_source.go FormatLegalSourceDisplay + BuildLegalSourceURL
- proceeding_mapping.go MapLitigationToFristenrechner + code constants
(CodeUPCInfringement, CodeDEInfringementLG, ...)
- engine.go Calculate + CalculateRule + the trigger-event
branch + applyRuleOverrides (the big move)
paliad side (~1900 LoC net deletion):
- internal/services/fristenrechner.go shrinks from 1505 → ~290 lines
(thin paliad Catalog adapter + type aliases for back-compat).
- internal/models/models.go: DeadlineRule, ProceedingType, NullableJSON
become type aliases to litigationplanner.* — every sqlx scan and
every projection_service caller compiles unchanged.
- internal/services/holidays.go: AdjustmentReason + HolidayDTO become
aliases to lp.* (canonical definitions now in the package).
- internal/services/proceeding_mapping.go: rewritten as thin re-exports
of lp constants + helpers.
- internal/services/deadline_search_service.go: FormatLegalSourceDisplay
+ BuildLegalSourceURL replaced with delegating wrappers to lp.
Catalog interface satisfaction:
- DeadlineRuleService → paliadCatalog adapter (wraps the existing
service, replicates the original SELECT shapes).
- HolidayService → satisfies lp.HolidayCalendar directly (compile-
time assertion at end of fristenrechner.go).
- CourtService → satisfies lp.CourtRegistry directly.
Wire shape is byte-identical. JSON tags on Rule / ProceedingType /
Timeline / TimelineEntry / RuleCalculation match the historical
UIResponse / UIDeadline shape; the frontend reads the same bytes.
Slice B (Catalog interface + paliad loader cleanup) is folded into
this commit since Slice A already needs the interfaces to call
Calculate across the boundary. Slice C (embedded UPC snapshot +
generator) is the next coder shift; the Berufung unification m
called out lands in Slice B/C per head's brief.
Refs: docs/design-litigation-planner-2026-05-26.md
50 lines
1.8 KiB
Go
50 lines
1.8 KiB
Go
package litigationplanner
|
|
|
|
// CourtRegistry maps a court id (e.g. "upc-ld-paris", "de-bgh") to its
|
|
// (country, regime) tuple, which drives non-working-day adjustment.
|
|
//
|
|
// Implementations:
|
|
// - paliad: reads paliad.courts (CourtService.CountryRegime).
|
|
// - embedded/upc (Slice C): in-memory map populated from the embedded
|
|
// JSON snapshot.
|
|
//
|
|
// Empty courtID falls back to (defaultCountry, defaultRegime) so callers
|
|
// without a court_id (the abstract Verfahrensablauf path) still get
|
|
// sensible behaviour. Returns an error when courtID is non-empty and
|
|
// not in the registry.
|
|
type CourtRegistry interface {
|
|
CountryRegime(courtID, defaultCountry, defaultRegime string) (country, regime string, err error)
|
|
}
|
|
|
|
// Country and regime constants — keep in sync with the paliad.countries
|
|
// seed list and the holidays_regime_chk / courts_regime_chk constraints.
|
|
const (
|
|
CountryDE = "DE"
|
|
RegimeUPC = "UPC"
|
|
RegimeEPO = "EPO"
|
|
)
|
|
|
|
// DefaultsForJurisdiction maps the proceeding-type jurisdiction text
|
|
// ('UPC' | 'DE' | 'EPA' | 'DPMA' | nil) to the (country, regime) tuple
|
|
// a holiday lookup should default to when the caller didn't pass an
|
|
// explicit CourtID. UPC proceedings get DE+UPC (München LD is HLC's
|
|
// most common venue, German federal holidays plus UPC vacations apply);
|
|
// DE / DPMA / EPA get DE-only (German federal). Future EPA-specific
|
|
// closures will require callers to pick an EPA court explicitly so the
|
|
// EPO regime kicks in.
|
|
//
|
|
// Helper kept tiny and stateless — when a caller passes a real CourtID,
|
|
// these defaults are bypassed entirely and the court's actual country +
|
|
// regime are used.
|
|
func DefaultsForJurisdiction(jurisdiction *string) (country, regime string) {
|
|
if jurisdiction == nil {
|
|
return CountryDE, ""
|
|
}
|
|
switch *jurisdiction {
|
|
case "UPC":
|
|
return CountryDE, RegimeUPC
|
|
default:
|
|
return CountryDE, ""
|
|
}
|
|
}
|