using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using GB5Shared.GOP.Qualifier.DTOs; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; namespace GB5Shared.GOP.Qualifier { // ============================================================ // IQualifierBLL — Qualifier Engine Business Logic // // Save/Update/Activate operations use the ExecuteSaveAsync // pattern: BeginTransaction → GetAutoNumber → DAL callback → // CommitTransaction. All writes are transactional. // // ActivateQualifierVersion must archive the currently Active // version and activate the target version in the same DB // transaction to prevent dual-active-version on crash. // ============================================================ public interface IQualifierBLL { // ── Definition ──────────────────────────────────────────── Task SaveQualifierDefinition(QualifierDefinitionDTO dto, LoginDTO loginDTO, CancellationToken ct = default); Task DeleteQualifier(int qualifierId, LoginDTO loginDTO, CancellationToken ct = default); Task GetQualifierById(int qualifierId, LoginDTO loginDTO, CancellationToken ct = default); Task GetQualifierByCode(string qualifierCode, LoginDTO loginDTO, CancellationToken ct = default); Task> GetQualifierList(LoginDTO loginDTO, CancellationToken ct = default); Task> GetSelectListQualifier(CriteriaDTO criteriaDTO, LoginDTO loginDTO, CancellationToken ct = default); Task> GetQualifierLibrary(LoginDTO loginDTO, CancellationToken ct = default); // ── Version ─────────────────────────────────────────────── Task SaveQualifierVersion(QualifierVersionDTO dto, LoginDTO loginDTO, CancellationToken ct = default); /// /// Compiles the qualifier plan (topological sort, NCalc/SQL validation), /// archives the currently Active version, and activates the target version — /// all inside a single DB transaction. /// Task ActivateQualifierVersion(int qualifierVersionId, int qualifierId, LoginDTO loginDTO, CancellationToken ct = default); Task GetActiveQualifierPlan(int qualifierId, LoginDTO loginDTO, CancellationToken ct = default); Task> GetQualifierVersionList(int qualifierId, LoginDTO loginDTO, CancellationToken ct = default); /// Only a Draft (VersionStatus=0) version may be deleted — Active/Archived versions /// are audit/replay history and must never be removable. Throws ArgumentException otherwise. Task DeleteQualifierVersion(int qualifierVersionId, LoginDTO loginDTO, CancellationToken ct = default); // ── Entity (bindings) ───────────────────────────────────── Task SaveQualifierEntity(QualifierEntityDTO dto, LoginDTO loginDTO, CancellationToken ct = default); Task> GetEntityBindings(string entityCode, byte stage, byte scope, LoginDTO loginDTO, CancellationToken ct = default); Task> GetEntityBindingsByQualifier(int qualifierId, LoginDTO loginDTO, CancellationToken ct = default); // ── Method ──────────────────────────────────────────────── Task SaveQualifierMethod(QualifierMethodDTO dto, LoginDTO loginDTO, CancellationToken ct = default); Task> GetQualifierMethods(int qualifierId, LoginDTO loginDTO, CancellationToken ct = default); Task DeleteQualifierMethod(int qualifierMethodId, LoginDTO loginDTO, CancellationToken ct = default); // ── Rule Groups ─────────────────────────────────────────── Task SaveQualifierRuleGroup(QualifierRuleGroupDTO dto, LoginDTO loginDTO, CancellationToken ct = default); Task> GetRuleGroups(int qualifierId, LoginDTO loginDTO, CancellationToken ct = default); Task DeleteQualifierRuleGroup(int ruleGroupId, LoginDTO loginDTO, CancellationToken ct = default); // ── Rule Conditions ─────────────────────────────────────── Task SaveQualifierRuleCondition(QualifierRuleConditionDTO dto, LoginDTO loginDTO, CancellationToken ct = default); Task> GetRuleConditions(int qualifierId, LoginDTO loginDTO, CancellationToken ct = default); Task DeleteQualifierRuleCondition(int conditionId, LoginDTO loginDTO, CancellationToken ct = default); // ── Outputs ─────────────────────────────────────────────── Task SaveQualifierOutput(QualifierOutputDTO dto, LoginDTO loginDTO, CancellationToken ct = default); Task> GetQualifierOutputs(int qualifierId, LoginDTO loginDTO, CancellationToken ct = default); Task DeleteQualifierOutput(int outputId, LoginDTO loginDTO, CancellationToken ct = default); // ── Dependencies ────────────────────────────────────────── Task SaveQualifierDependency(QualifierDependencyDTO dto, LoginDTO loginDTO, CancellationToken ct = default); Task> GetQualifierDependencies(int qualifierId, LoginDTO loginDTO, CancellationToken ct = default); Task DeleteQualifierDependency(int dependencyId, LoginDTO loginDTO, CancellationToken ct = default); // ── Scope ─────────────────────────────────────────────────── Task SaveQualifierScope(QualifierScopeDTO dto, LoginDTO loginDTO, CancellationToken ct = default); Task> GetQualifierScopes(int qualifierId, LoginDTO loginDTO, CancellationToken ct = default); Task DeleteQualifierScope(int qualifierScopeId, LoginDTO loginDTO, CancellationToken ct = default); // ── Clone ───────────────────────────────────────────────── /// /// Deep-clones a qualifier definition with all its rule groups, conditions, /// outputs, methods, and dependencies into a new qualifier. /// All ParentRuleGroupId references within rule groups are remapped to the /// cloned IDs — no dangling foreign key references remain. /// The clone is created as Status=1 (active definition), no active version. /// Task CloneQualifier( int sourceQualifierId, string newQualifierCode, string newQualifierName, LoginDTO loginDTO, CancellationToken ct = default); } }