using System; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using MMDAL.DTO.LotDetail; using MMDAL.DTO.MMHead; namespace MMDAL.CustomCode.MMHead { public interface IMMHeadDAL { // ── Row-level incremental save (SessionGuid path) ───────────────────────── // columnMap parameters are the caller's verified DTO-property → DB-column // mapping (MMHeadBLL's existing HeadMapping/DetailMapping/ChargeMapping) — // reused here rather than duplicated, so there is a single source of truth // for column names across both the legacy TVP path and this incremental path. Task SaveHeaderScalarAsync( LoginDTO login, MMHeadDTO head, bool isNewDocument, Dictionary headMapping, DbTransaction tx, CancellationToken ct); Task SaveIncrementalDetailAsync( LoginDTO login, int documentId, List newRows, List modifiedRows, List deletedIds, Dictionary detailMapping, DbTransaction tx, CancellationToken ct); Task SaveIncrementalChargeAsync( LoginDTO login, int documentId, List newRows, List modifiedRows, List deletedIds, Dictionary chargeMapping, DbTransaction tx, CancellationToken ct); Task SaveIncrementalScheduleAsync( LoginDTO login, int documentId, List newRows, List modifiedRows, List deletedIds, Dictionary scheduleMapping, DbTransaction tx, CancellationToken ct); // documentHeaderId = MMHeadId — TLOTDETAIL has no direct DocumentId column, it links // via the polymorphic OBJECTHEADERID (= MMHeadId) / OBJECTID (= parent MMDetailId) pair. Task SaveIncrementalLotAsync( LoginDTO login, int documentHeaderId, List newRows, List modifiedRows, List deletedIds, Dictionary lotMapping, DbTransaction tx, CancellationToken ct); // Recomputes TOTALQUANTITY/TOTALNETVALUE/DOCUMENTVALUE from TMMDETAIL's current, // committed rows for the document — the incremental path's own delta (MMDetailArray) // is never a complete detail set, unlike the full-batch path, so the aggregate has to // be sourced from the DB, not memory. Call after the detail insert/update/delete for // this save has been applied, within the same transaction. Task RecomputeAndUpdateHeaderTotalsAsync(LoginDTO login, int documentId, DbTransaction tx, CancellationToken ct); Task BeginTransactionAsync(LoginDTO login); Task CommitAsync(DbTransaction tx); Task RollbackAsync(DbTransaction tx); Task SaveTVPAsync(LoginDTO loginDTO, DataTable heads, DataTable details, DataTable charges, DataTable AddonList, DataTable PackDeatilList, DataTable LotDetailList, DataTable PacknumberList, DataTable ScheduleList, DataTable parameterList, DataTable ItemReasonList, DataTable DetailProcessList, DataTable CostCenterAllocationList, DataTable AllocationList = null, DataTable StockLedgerList = null); // Update counterpart to SaveTVPAsync — routes to POST_MM_DOCUMENT_UPDATE for // existing documents (MMHeadDTO.MMHeadId != 0) instead of the INSERT-only // POST_MM_DOCUMENT. Task UpdateTVPAsync(LoginDTO loginDTO, DataTable heads, DataTable details, DataTable charges, DataTable AddonList, DataTable PackDeatilList, DataTable LotDetailList, DataTable PacknumberList, DataTable ScheduleList, DataTable parameterList, DataTable ItemReasonList, DataTable DetailProcessList, DataTable CostCenterAllocationList, DataTable AllocationList = null, DataTable StockLedgerList = null); Task GetMMHead(int DocumentId, LoginDTO LoginDTO); Task GetMMHeadList(int[] DocumentIds, LoginDTO LoginDTO); Task GetSelectListForDocument(int FirstNumber, int MaxResult, CriteriaDTO CriteriaDTO, LoginDTO LoginDTO); // GB4 parity: MMHead.svc/Get/MM/Load/Picklist/In/Voucher — MM documents not yet linked to a posted voucher. Task GetSelectListMMHeadForVoucher(int FirstNumber, int MaxResult, CriteriaDTO CriteriaDTO, LoginDTO LoginDTO); // ── Load endpoints ──────────────────────────────────────────────────────── Task GetLoadMMHeadFromAllocation( int[] documentIds, int[]? detailIds, int bizTransactionClassId, int nature, int storeId, int? partyId, LoginDTO login, CancellationToken ct); Task GetLoadMMHeadFromIndent( int[] indentIds, int[]? detailIds, int storeId, LoginDTO login, CancellationToken ct); Task GetLoadMMHeadFromGateEntry( int[] gateEntryIds, int storeId, LoginDTO login, CancellationToken ct); Task MarkGateEntryLoadedAsync(int[] gateEntryIds, LoginDTO login, CancellationToken ct); Task GetMMHeadForFinalizeAsync(int documentId, LoginDTO login, CancellationToken ct); // Returns rows-affected: 1 = success, 0 = race-lost or unexpected current status. Task UpdateMMHeadStatusConditionalAsync(int documentId, short expectedStatus, short newStatus, LoginDTO login, CancellationToken ct); // ── Delete (ported from GB4 MMHeadBLL.Delete) ───────────────────────────── Task GetMMHeadForDeleteAsync(int documentId, LoginDTO login, CancellationToken ct); Task GetMMHeadDeleteBlockersAsync(int documentId, LoginDTO login, CancellationToken ct); Task DeleteMMHeadCascadeAsync(int documentId, int referenceDocumentId, LoginDTO login, DbTransaction tx, CancellationToken ct); // ── Voucher forming from MMHead (ProcedureBased) ────────────────────────── Task GetMMHeadHeaderForVoucherForming(int documentId, LoginDTO login, CancellationToken ct); Task> GetMM2AccountPostData(int documentId, LoginDTO login, CancellationToken ct); // GB4 parity: MMHead.svc/Account/Posting/From/FE/?IsSummary= — account posting preview // computed from an unsaved, FE-submitted document (TVPs, not a DOCUMENTID lookup). Task> GetMM2AccountPostPreviewData( DataTable head, DataTable detail, DataTable charges, byte isSummary, LoginDTO login, CancellationToken ct); Task GetAccountForPosting(int accountId, LoginDTO login, CancellationToken ct); Task GetCostCenterForPosting(int costCenterId, LoginDTO login, CancellationToken ct); Task GetCurrencyForPosting(int currencyId, LoginDTO login, CancellationToken ct); Task CostCategoryConditionExistsForAccountGroup(int accountGroupId, LoginDTO login, CancellationToken ct); Task GetDefaultCashInstrumentId(LoginDTO login, CancellationToken ct); Task GetSelectListMMHead(CriteriaDTO crt, LoginDTO loginDTO); } }