70 lines
2.7 KiB
C#
70 lines
2.7 KiB
C#
using Distribution.Data;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace Distribution.Features.Item;
|
|
|
|
public class ItemRepository(AppDBContext context) : IItemRepository
|
|
{
|
|
public async Task<Models.Item?> GetByIdAsync(Guid id) =>
|
|
await context.Items
|
|
.Include(i => i.Category)
|
|
.Include(i => i.SubCategory)
|
|
.Include(i => i.Brand)
|
|
.Include(i => i.BaseUom)
|
|
.Include(i => i.Conversions).ThenInclude(c => c.FromUom)
|
|
.Include(i => i.Conversions).ThenInclude(c => c.ToUom)
|
|
.FirstOrDefaultAsync(i => i.Id == id);
|
|
|
|
public async Task<Models.Item?> GetBySkuAsync(string sku) =>
|
|
await context.Items.FirstOrDefaultAsync(i => i.Sku == sku && i.IsActive);
|
|
|
|
public async Task<List<Models.Item>> GetAllAsync(Guid? categoryId = null, Guid? subCategoryId = null, Guid? brandId = null)
|
|
{
|
|
// Deleted items stay IsActive=false but remain visible with an Inactive status —
|
|
// Delete never removes the row, only marks it (same rule as Orders/Stores).
|
|
var query = context.Items
|
|
.Include(i => i.Category)
|
|
.Include(i => i.SubCategory)
|
|
.Include(i => i.Brand)
|
|
.Include(i => i.BaseUom)
|
|
.AsQueryable();
|
|
|
|
if (categoryId.HasValue) query = query.Where(i => i.FK_CategoryId == categoryId);
|
|
if (subCategoryId.HasValue) query = query.Where(i => i.FK_SubCategoryId == subCategoryId);
|
|
if (brandId.HasValue) query = query.Where(i => i.FK_BrandId == brandId);
|
|
|
|
return await query.ToListAsync();
|
|
}
|
|
|
|
public async Task<bool> SkuExistsAsync(string sku, Guid? excludeId = null)
|
|
{
|
|
var query = context.Items.Where(i => i.Sku == sku);
|
|
if (excludeId.HasValue) query = query.Where(i => i.Id != excludeId);
|
|
return await query.AnyAsync();
|
|
}
|
|
|
|
public async Task<Models.Item?> GetByExternalErpItemIdAsync(int erpId) =>
|
|
await context.Items
|
|
.Include(i => i.Conversions)
|
|
.FirstOrDefaultAsync(i => i.ExternalErpItemId == erpId);
|
|
|
|
public async Task AddAsync(Models.Item entity) =>
|
|
await context.Items.AddAsync(entity);
|
|
|
|
public void Update(Models.Item entity) =>
|
|
context.Items.Update(entity);
|
|
|
|
public void Remove(Models.Item entity)
|
|
{
|
|
entity.IsActive = false;
|
|
context.Items.Update(entity);
|
|
}
|
|
|
|
public async Task ReplaceConversionsAsync(Guid itemId, List<Models.UomConversion> conversions)
|
|
{
|
|
var existing = await context.UomConversions.Where(c => c.FK_ItemId == itemId).ToListAsync();
|
|
context.UomConversions.RemoveRange(existing);
|
|
await context.UomConversions.AddRangeAsync(conversions);
|
|
}
|
|
}
|