line-gestao-api/Services/DataConsistencyService.cs

97 lines
2.8 KiB
C#

using line_gestao_api.Data;
using line_gestao_api.Models;
using Microsoft.EntityFrameworkCore;
namespace line_gestao_api.Services;
public class DataConsistencyService : IDataConsistencyService
{
private readonly AppDbContext _db;
public DataConsistencyService(AppDbContext db)
{
_db = db;
}
public async Task SyncFromMobileLineAsync(MobileLine line, CancellationToken cancellationToken = default)
{
await ApplyMobileLineToSatellitesAsync(line, cancellationToken);
await _db.SaveChangesAsync(cancellationToken);
}
public async Task SyncFromTrocaNumeroAsync(TrocaNumeroLine trocaNumero, CancellationToken cancellationToken = default)
{
var linhaAntiga = OnlyDigits(trocaNumero.LinhaAntiga);
if (string.IsNullOrWhiteSpace(linhaAntiga))
{
return;
}
var mobile = await _db.MobileLines
.FirstOrDefaultAsync(x => x.Linha != null && OnlyDigits(x.Linha) == linhaAntiga, cancellationToken);
if (mobile == null)
{
return;
}
var linhaNova = OnlyDigits(trocaNumero.LinhaNova);
if (!string.IsNullOrWhiteSpace(linhaNova))
{
mobile.Linha = linhaNova;
}
var iccid = OnlyDigits(trocaNumero.ICCID);
if (!string.IsNullOrWhiteSpace(iccid))
{
mobile.Chip = iccid;
}
mobile.UpdatedAt = DateTime.UtcNow;
await _db.SaveChangesAsync(cancellationToken);
await ApplyMobileLineToSatellitesAsync(mobile, cancellationToken);
await _db.SaveChangesAsync(cancellationToken);
}
private static string OnlyDigits(string? value)
{
if (string.IsNullOrWhiteSpace(value))
{
return string.Empty;
}
var chars = value.Where(char.IsDigit).ToArray();
return new string(chars);
}
private async Task ApplyMobileLineToSatellitesAsync(MobileLine line, CancellationToken cancellationToken)
{
var item = line.Item;
var vigencias = await _db.VigenciaLines
.Where(x => x.Item == item)
.ToListAsync(cancellationToken);
foreach (var vigencia in vigencias)
{
vigencia.Conta = line.Conta;
vigencia.Linha = line.Linha;
vigencia.Cliente = line.Cliente;
vigencia.Usuario = line.Usuario;
vigencia.PlanoContrato = line.PlanoContrato;
vigencia.UpdatedAt = DateTime.UtcNow;
}
var userDatas = await _db.UserDatas
.Where(x => x.Item == item)
.ToListAsync(cancellationToken);
foreach (var userData in userDatas)
{
userData.Linha = line.Linha;
userData.Cliente = line.Cliente;
userData.UpdatedAt = DateTime.UtcNow;
}
}
}