using Indotalent.ConfigBackEnd.Extensions; using Indotalent.Data.Entities; using Indotalent.Data.Enums; using Microsoft.EntityFrameworkCore; namespace Indotalent.Infrastructure.Database.Demo; public static class PositiveAdjustmentSeeder { public static async Task GenerateDataAsync(AppDbContext context) { if (await context.PositiveAdjustment.AnyAsync()) return; var random = new Random(); var adjustmentStatusValues = Enum.GetValues(typeof(AdjustmentStatus)).Cast().ToList(); var entityName = nameof(PositiveAdjustment); var ivtEntityName = nameof(InventoryTransaction); var products = await context.Product .Where(x => x.Physical == true) .ToListAsync(); var warehouses = await context.Warehouse .Where(x => x.SystemWarehouse == false) .Select(x => x.Id) .ToListAsync(); if (!products.Any() || !warehouses.Any()) return; var dateFinish = DateTime.Now; var dateStart = new DateTime(dateFinish.AddMonths(-12).Year, dateFinish.AddMonths(-12).Month, 1); for (DateTime date = dateStart; date < dateFinish; date = date.AddMonths(1)) { DateTime[] transactionDates = GetRandomDays(date.Year, date.Month, 6); foreach (var transDate in transactionDates) { var autoNo = await context.GenerateAutoNumberAsync( entityName: entityName, prefixTemplate: $"{entityName.ToShortNameConsonant(3)}/{{Year}}/" ); var adjustmentPlus = new PositiveAdjustment { AutoNumber = autoNo, AdjustmentDate = transDate, Status = adjustmentStatusValues[random.Next(adjustmentStatusValues.Count)], }; await context.PositiveAdjustment.AddAsync(adjustmentPlus); int numberOfProducts = random.Next(3, 6); for (int i = 0; i < numberOfProducts; i++) { var product = products[random.Next(products.Count)]; var autoNoIVT = await context.GenerateAutoNumberAsync( entityName: ivtEntityName, prefixTemplate: $"{ivtEntityName.ToShortNameConsonant(3)}/{{Year}}/" ); var inventoryTransaction = new InventoryTransaction { ModuleId = adjustmentPlus.Id, ModuleName = entityName, ModuleCode = "ADJ+", ModuleNumber = adjustmentPlus.AutoNumber, MovementDate = adjustmentPlus.AdjustmentDate!.Value, Status = (InventoryTransactionStatus)adjustmentPlus.Status, AutoNumber = autoNoIVT, WarehouseId = GetRandomValue(warehouses, random), ProductId = product.Id, Movement = random.Next(5, 10) }; context.CalculateInvenTrans(inventoryTransaction); await context.InventoryTransaction.AddAsync(inventoryTransaction); } } } await context.SaveChangesAsync(); } private static DateTime[] GetRandomDays(int year, int month, int count) { var random = new Random(); var daysInMonth = DateTime.DaysInMonth(year, month); return Enumerable.Range(1, count) .Select(_ => new DateTime(year, month, random.Next(1, daysInMonth + 1))) .ToArray(); } private static T GetRandomValue(IList list, Random random) { return list[random.Next(list.Count)]; } }