using FruitBank.Common.Entities; using FruitBank.Common.Enums; namespace Nop.Plugin.Misc.FruitBankPlugin.Services; public interface IOrderDraftService { /// /// Egy bejövő szöveges üzenet alapján létrehozza a rendelés tervezet(eke)t. /// Ha az üzenetben több különböző szállítási dátum szerepel, minden dátumhoz külön draft jön létre. /// Task> CreateDraftsFromMessageAsync(string externalUsername, string rawMessageText); /// Egy draft betöltése tételeivel együtt. Task GetByIdAsync(int id, bool loadRelations = true); /// Pending draftek listája, opcionálisan szűrve partner szerint. Task> GetPendingAsync(int? customerId = null); /// Összes draft lapozhatóan (admin lista). Task<(List Items, int TotalCount)> GetPagedAsync( int pageIndex, int pageSize, OrderDraftStatus? status = null, int? customerId = null); /// /// Admin jóváhagyja a draftot: minden tétel SelectedProductId-ja be kell legyen állítva. /// A dátumtól függően PreOrder vagy Order jön létre. /// Menti a ProductTextMapping rekordokat a tanuláshoz. /// Task ApproveAsync(int draftId, int adminId); /// Admin elutasítja a draftot. Task RejectAsync(int draftId, int adminId, string? adminNote = null); /// Admin hozzárendeli a partnert egy mappingból még hiányzó drafthoz. Task AssignCustomerAsync(int draftId, int customerId, int adminId); /// Admin frissíti egy tétel kiválasztott termékét és/vagy mennyiségét. Task UpdateDraftItemAsync(int draftItemId, int selectedProductId, int quantity); /// 14 napnál régebbi pending draftek automatikus lejáratása (background job hívja). Task ExpireOldDraftsAsync(); } public class OrderDraftApproveResult { public bool Success { get; set; } public string? ErrorMessage { get; set; } /// A létrehozott PreOrder ID-k (ha előrendelés lett). public List PreOrderIds { get; set; } = []; /// A létrehozott Order ID-k (ha azonnali rendelés lett). public List OrderIds { get; set; } = []; }