using Microsoft.Data.SqlClient; using Microsoft.EntityFrameworkCore; using MP.Core.DTO; using MP.Data.DbModels; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Threading.Tasks; namespace MP.Data.Repository.Anag { public class AnagRepository : BaseRepository, IAnagRepository { #region Public Constructors public AnagRepository(IDbContextFactory ctxFactory) : base(ctxFactory) { } #endregion Public Constructors #region Public Methods /// public async Task AnagCountersGetNextAsync(string cntType) { AnagCountersModel answ = new AnagCountersModel(); await using var dbCtx = await CreateContextAsync(); bool outTable = true; if (outTable) { var pCntType = new SqlParameter("@CntType", cntType); var pLastNum = new SqlParameter { ParameterName = "@LastNum", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Output }; var dbResult = await dbCtx .DbSetAnagCount .FromSqlRaw("EXEC dbo.stp_getNextNumb @CntType, @LastNum OUTPUT", pCntType, pLastNum) .AsNoTracking() .FirstOrDefaultAsync(); if (dbResult != null) { answ = dbResult; } } else { // se si volessero impiegare parametri OUTPUT (qui ne mancherebbe 1 nella stored x CntCode...) var pCntType = new SqlParameter("@CntType", cntType); var pLastNum = new SqlParameter { ParameterName = "@LastNum", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Output }; var pCntCode = new SqlParameter { ParameterName = "@CntCode", SqlDbType = SqlDbType.NVarChar, Direction = ParameterDirection.Output }; var dbResult = await dbCtx .Database .ExecuteSqlRawAsync("EXEC dbo.stp_getNextNumb @CntType, @LastNum OUTPUT, @CntCode OUTPUT", pCntType, pLastNum, pCntCode); if (dbResult != 0) { answ.CntType = cntType; answ.CntCode = $"{pCntCode.Value}"; int lNum = 0; int.TryParse($"{pLastNum.Value}", out lNum); answ.LastNum = lNum; } } return answ; } /// public async Task> AnagEventiGeneralAsync(string TableName = "EvList", string FieldName = "Common") { await using var dbCtx = await CreateContextAsync(); var pTableName = new SqlParameter("@TableName", TableName); var pFieldName = new SqlParameter("@FieldName", FieldName); var dbResult = await dbCtx .DbSetVSEB .FromSqlRaw("exec dbo.stp_vseb_getGenerallyAvailable @TableName, @FieldName", pTableName, pFieldName) .AsNoTracking() .ToListAsync(); return dbResult ?? new(); } /// public async Task> AnagGruppiAziendeAsync() { return await AnagGruppiGetTipoAsync("AZIENDA"); } /// public async Task AnagGruppiDeleteAsync(AnagGruppiModel updRec) { await using var dbCtx = await CreateContextAsync(); var dbRec = await dbCtx .DbSetAnagGruppi .AsNoTracking() .Where(x => x.CodGruppo == updRec.CodGruppo) .FirstOrDefaultAsync(); if (dbRec != null) { dbCtx.DbSetAnagGruppi.Remove(dbRec); } var numRes = await dbCtx.SaveChangesAsync(); return numRes != 0; } /// public async Task> AnagGruppiFaseAsync() { return await AnagGruppiGetTipoAsync("FASE"); } /// public async Task> AnagGruppiGetTipoAsync(string tipoGruppo) { await using var dbCtx = await CreateContextAsync(); return await dbCtx .DbSetAnagGruppi .Where(x => x.TipoGruppo == tipoGruppo) .AsNoTracking() .OrderBy(x => x.CodGruppo) .ToListAsync(); } /// public async Task> AnagGruppiRepartoDtoAsync() { await using var dbCtx = await CreateContextAsync(); var listReparti = await AnagGruppiGetTipoAsync("REPARTO"); var listMacc = await dbCtx .DbSetGrp2Macc .AsNoTracking() .ToListAsync(); var listOpr = await dbCtx .DbSetGrp2Oper .AsNoTracking() .ToListAsync(); return listReparti .Select(x => new RepartiDTO() { CodGruppo = x.CodGruppo, TipoGruppo = x.TipoGruppo, DescrGruppo = x.DescrGruppo, SelEnabled = x.SelEnabled, CountMacc = listMacc.Where(y => y.CodGruppo == x.CodGruppo).Select(y => y.IdxMacchina).Distinct().Count(), CountOpr = listOpr.Where(y => y.CodGruppo == x.CodGruppo).Select(y => y.MatrOpr).Distinct().Count() }) .ToList(); } /// public async Task AnagGruppiUpsertAsync(AnagGruppiModel updRec) { await using var dbCtx = await CreateContextAsync(); var dbRec = await dbCtx .DbSetAnagGruppi .AsNoTracking() .Where(x => x.CodGruppo == updRec.CodGruppo) .FirstOrDefaultAsync(); if (dbRec != null) { dbRec.DescrGruppo = updRec.DescrGruppo; dbCtx.Entry(dbRec).State = EntityState.Modified; } else { await dbCtx.DbSetAnagGruppi.AddAsync(updRec); } var numRes = await dbCtx.SaveChangesAsync(); return numRes != 0; } /// public async Task> AnagStatiCommAsync() { return await ListValuesFiltAsync("PODL", "StatoComm"); } /// public async Task> AnagTipoArtLvAsync() { return await ListValuesFiltAsync("AnagArticoli", "Tipo"); } /// public async Task ArticoliCountAsync() { await using var dbCtx = await CreateContextAsync(); return await dbCtx.DbSetArticoli.CountAsync(); } /// public async Task ArticoliCountSearchAsync(string tipoArt = "*", string azienda = "*", string searchVal = "") { await using var dbCtx = await CreateContextAsync(); IQueryable query = dbCtx.DbSetArticoli.AsNoTracking(); if (tipoArt != "*") { query = query.Where(x => EF.Functions.Like(x.Tipo, tipoArt)); } if (azienda != "*") { query = query.Where(x => EF.Functions.Like(x.Azienda, azienda)); } if (!string.IsNullOrWhiteSpace(searchVal)) { string pattern = $"%{searchVal}%"; query = query.Where(x => EF.Functions.Like(x.CodArticolo, pattern) || EF.Functions.Like(x.DescArticolo, pattern) || EF.Functions.Like(x.Disegno, pattern)); } return await query.OrderBy(x => x.CodArticolo).CountAsync(); } /// public async Task ArticoliCountUsedAsync() { await using var dbCtx = await CreateContextAsync(); var result = await dbCtx .DbSetCounter .FromSqlRaw("EXEC stp_ART_CountUsed") .AsNoTracking() .ToListAsync(); return result.FirstOrDefault()?.NumCount ?? 0; } /// public async Task ArticoliDeleteRecordAsync(AnagArticoliModel currRec) { await using var dbCtx = await CreateContextAsync(); var currVal = await dbCtx .DbSetArticoli .Where(x => x.CodArticolo == currRec.CodArticolo) .FirstOrDefaultAsync(); if (currVal != null) { dbCtx.DbSetArticoli.Remove(currVal); return await dbCtx.SaveChangesAsync() > 0; } return false; } /// public async Task> ArticoliGetByTipoAsync(string tipo, string azienda = "*") { await using var dbCtx = await CreateContextAsync(); return await dbCtx .DbSetArticoli .AsNoTracking() .Where(x => x.Tipo.ToUpper() == tipo.ToUpper() && (azienda == "*" || x.Azienda.ToUpper() == azienda.ToUpper())) .OrderBy(x => x.CodArticolo) .ToListAsync(); } /// public async Task> ArticoliGetSearchAsync(int numRecord, string tipoArt = "*", string azienda = "*", string searchVal = "") { await using var dbCtx = await CreateContextAsync(); IQueryable query = dbCtx.DbSetArticoli.AsNoTracking(); if (tipoArt != "*") { query = query.Where(x => EF.Functions.Like(x.Tipo, tipoArt)); } if (azienda != "*") { query = query.Where(x => EF.Functions.Like(x.Azienda, azienda)); } if (!string.IsNullOrWhiteSpace(searchVal)) { string pattern = $"%{searchVal}%"; query = query.Where(x => EF.Functions.Like(x.CodArticolo, pattern) || EF.Functions.Like(x.DescArticolo, pattern) || EF.Functions.Like(x.Disegno, pattern)); } return await query.OrderBy(x => x.CodArticolo).Take(numRecord).ToListAsync(); } /// public async Task> ArticoliGetUnusedAsync() { await using var dbCtx = await CreateContextAsync(); return await dbCtx.DbSetArticoli.FromSqlRaw("EXEC stp_ART_getNotUsed").AsNoTracking().ToListAsync(); } /// public async Task> ArticoliGetUsedAsync() { await using var dbCtx = await CreateContextAsync(); return await dbCtx.DbSetArticoli.FromSqlRaw("EXEC stp_ART_getUsed").AsNoTracking().ToListAsync(); } /// public async Task> ArticoliInKitAsync() { await using var dbCtx = await CreateContextAsync(); return await dbCtx.DbSetArticoli.FromSqlRaw("EXEC stp_TempKIT_getArtChild").AsNoTracking().ToListAsync(); } /// public async Task ArticoliUpdateRecord(AnagArticoliModel editRec) { await using var dbCtx = await CreateContextAsync(); var currRec = await dbCtx.DbSetArticoli.FirstOrDefaultAsync(x => x.CodArticolo == editRec.CodArticolo); if (currRec != null) { currRec.Disegno = editRec.Disegno; currRec.DescArticolo = editRec.DescArticolo; currRec.Tipo = editRec.Tipo; currRec.Azienda = editRec.Azienda; dbCtx.Entry(currRec).State = EntityState.Modified; return await dbCtx.SaveChangesAsync() > 0; } return false; } /// public async Task> ListValuesFiltAsync(string tabName, string fieldName) { await using var dbCtx = await CreateContextAsync(); return await dbCtx.DbSetListValues .Where(x => x.TableName == tabName && x.FieldName == fieldName) .AsNoTracking() .OrderBy(x => x.ordinal) .ToListAsync(); } /// public async Task> MacchineByMatrOperAsync(int MatrOpr) { await using var dbCtx = await CreateContextAsync(); if (MatrOpr == 0) { return await dbCtx.DbSetMacchine.AsNoTracking().OrderBy(x => x.IdxMacchina).ToListAsync(); } else { return await dbCtx.DbSetGrp2Oper .Where(g => g.MatrOpr == MatrOpr) .Join(dbCtx.DbSetGrp2Macc, g => g.CodGruppo, m => m.CodGruppo, (g, m) => m) .Distinct() .Join(dbCtx.DbSetMacchine, g => g.IdxMacchina, m => m.IdxMacchina, (g, m) => m) .Distinct() .AsNoTracking() .OrderBy(x => x.IdxMacchina) .ToListAsync(); } } /// public async Task> MacchineGetFiltAsync(string codGruppo) { await using var dbCtx = await CreateContextAsync(); if (codGruppo == "*") { return await dbCtx.DbSetMacchine.AsNoTracking().OrderBy(x => x.IdxMacchina).ToListAsync(); } else { return await dbCtx.DbSetGrp2Macc .Where(g => g.CodGruppo == codGruppo) .Join(dbCtx.DbSetMacchine, g => g.IdxMacchina, m => m.IdxMacchina, (g, m) => m) .AsNoTracking() .OrderBy(x => x.IdxMacchina) .ToListAsync(); } } /// public async Task> OperatoriGetFiltAsync(string codGruppo) { List dbResult = new List(); await using var dbCtx = await CreateContextAsync(); if (codGruppo == "*") { dbResult = await dbCtx .DbOperatori .AsNoTracking() .OrderBy(x => x.MatrOpr) .ToListAsync(); } else { dbResult = await dbCtx .DbSetGrp2Oper .Where(g => g.CodGruppo == codGruppo) .Join(dbCtx.DbOperatori, g => g.MatrOpr, m => m.MatrOpr, (g, m) => m ) .AsNoTracking() .OrderBy(x => x.MatrOpr) .ToListAsync(); } return dbResult; } /// public async Task> PODL_getDictOdlPodlAsync(List missingIds) { if (missingIds == null || !missingIds.Any()) return new Dictionary(); await using var dbCtx = await CreateContextAsync(); return await dbCtx .DbSetPODL .AsNoTracking() .Where(x => missingIds.Contains(x.IdxOdl)) .ToDictionaryAsync(x => x.IdxOdl, x => x.IdxPromessa); } /// /// Recupero dizionario traduzioni da cache o DB /// /// Codice lingua /// Dizionario di traduzioni public async Task> VocabolarioGetLangAsync(string lingua) { await using var dbCtx = await CreateContextAsync(); var rawList = dbCtx .DbSetVocabolario .AsNoTracking() .Where(x => x.Lingua.ToLower() == lingua.ToLower()) .OrderBy(x => x.Lemma) .ToList(); // Proietto in dizionario return rawList .DistinctBy(t => t.Lemma, StringComparer.OrdinalIgnoreCase) .ToDictionary(t => t.Lemma, t => t.Traduzione, StringComparer.OrdinalIgnoreCase); } #endregion Public Methods } }