Compare commits
No commits in common. "fa05359e97ebec9d4d1a0649e917a1cc3e4f6017" and "ae557a3cc8116e31f8bbc841d8fc3f3af81c1993" have entirely different histories.
fa05359e97
...
ae557a3cc8
|
|
@ -203,39 +203,6 @@ namespace line_gestao_api.Controllers
|
||||||
return Ok(clients);
|
return Ok(clients);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ==========================================================
|
|
||||||
// ✅ 2.1 ENDPOINT: LINHAS POR CLIENTE (para SELECT do MUREG)
|
|
||||||
// GET: /api/lines/by-client?cliente=...
|
|
||||||
// ==========================================================
|
|
||||||
[HttpGet("by-client")]
|
|
||||||
public async Task<ActionResult<List<LineOptionDto>>> GetLinesByClient([FromQuery] string cliente)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrWhiteSpace(cliente))
|
|
||||||
return Ok(new List<LineOptionDto>());
|
|
||||||
|
|
||||||
var c = cliente.Trim();
|
|
||||||
|
|
||||||
// ⚠️ use ILike para não depender de maiúscula/minúscula
|
|
||||||
var items = await _db.MobileLines
|
|
||||||
.AsNoTracking()
|
|
||||||
.Where(x => x.Cliente != null && EF.Functions.ILike(x.Cliente, c))
|
|
||||||
.Where(x => x.Linha != null && x.Linha != "")
|
|
||||||
.OrderBy(x => x.Item)
|
|
||||||
.Select(x => new LineOptionDto
|
|
||||||
{
|
|
||||||
Id = x.Id,
|
|
||||||
Item = x.Item,
|
|
||||||
Linha = x.Linha,
|
|
||||||
Chip = x.Chip,
|
|
||||||
Cliente = x.Cliente,
|
|
||||||
Usuario = x.Usuario,
|
|
||||||
Skil = x.Skil
|
|
||||||
})
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
return Ok(items);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==========================================================
|
// ==========================================================
|
||||||
// ✅ 3. GET ALL (GERAL)
|
// ✅ 3. GET ALL (GERAL)
|
||||||
// ==========================================================
|
// ==========================================================
|
||||||
|
|
@ -497,7 +464,10 @@ namespace line_gestao_api.Controllers
|
||||||
}
|
}
|
||||||
|
|
||||||
// ==========================================================
|
// ==========================================================
|
||||||
// ✅ 8. IMPORT EXCEL
|
// ✅ 8. IMPORT EXCEL (GERAL + MUREG + FATURAMENTO + DADOS USUÁRIOS + VIGÊNCIA + TROCA DE NÚMERO)
|
||||||
|
//
|
||||||
|
// ✅ CORREÇÕES IMPORTANTES PARA NÃO ESTOURAR ERRO 500:
|
||||||
|
// - LINHA/CHIP vazios viram NULL (evita violar índice UNIQUE da LINHA com várias strings vazias)
|
||||||
// ==========================================================
|
// ==========================================================
|
||||||
[HttpPost("import-excel")]
|
[HttpPost("import-excel")]
|
||||||
[Consumes("multipart/form-data")]
|
[Consumes("multipart/form-data")]
|
||||||
|
|
@ -610,7 +580,7 @@ namespace line_gestao_api.Controllers
|
||||||
}
|
}
|
||||||
|
|
||||||
// =========================
|
// =========================
|
||||||
// ✅ IMPORTA MUREG (ALTERADO: NÃO ESTOURA ERRO SE LINHANOVA JÁ EXISTIR)
|
// ✅ IMPORTA MUREG
|
||||||
// =========================
|
// =========================
|
||||||
await ImportMuregFromWorkbook(wb);
|
await ImportMuregFromWorkbook(wb);
|
||||||
|
|
||||||
|
|
@ -646,10 +616,6 @@ namespace line_gestao_api.Controllers
|
||||||
|
|
||||||
// ==========================================================
|
// ==========================================================
|
||||||
// ✅ IMPORTAÇÃO DA ABA MUREG
|
// ✅ IMPORTAÇÃO DA ABA MUREG
|
||||||
// ✅ NOVA REGRA:
|
|
||||||
// - Se LinhaNova já existir em OUTRA linha da GERAL => NÃO atualiza a GERAL, NÃO dá erro
|
|
||||||
// - Mesmo assim salva o registro na MUREG normalmente
|
|
||||||
// - Evita duplicidade na coluna Linha da GERAL
|
|
||||||
// ==========================================================
|
// ==========================================================
|
||||||
private async Task ImportMuregFromWorkbook(XLWorkbook wb)
|
private async Task ImportMuregFromWorkbook(XLWorkbook wb)
|
||||||
{
|
{
|
||||||
|
|
@ -668,38 +634,8 @@ namespace line_gestao_api.Controllers
|
||||||
|
|
||||||
var startRow = headerRow.RowNumber() + 1;
|
var startRow = headerRow.RowNumber() + 1;
|
||||||
|
|
||||||
// limpa MUREG antes (idempotente)
|
|
||||||
await _db.MuregLines.ExecuteDeleteAsync();
|
await _db.MuregLines.ExecuteDeleteAsync();
|
||||||
|
|
||||||
// ✅ dicionários para resolver MobileLineId por Linha/Chip
|
|
||||||
var mobilePairs = await _db.MobileLines
|
|
||||||
.AsNoTracking()
|
|
||||||
.Select(x => new { x.Id, x.Linha, x.Chip })
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
var mobileByLinha = new Dictionary<string, Guid>(StringComparer.Ordinal);
|
|
||||||
var mobileByChip = new Dictionary<string, Guid>(StringComparer.Ordinal);
|
|
||||||
|
|
||||||
foreach (var m in mobilePairs)
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrWhiteSpace(m.Linha))
|
|
||||||
{
|
|
||||||
var k = OnlyDigits(m.Linha);
|
|
||||||
if (!string.IsNullOrWhiteSpace(k) && !mobileByLinha.ContainsKey(k))
|
|
||||||
mobileByLinha[k] = m.Id;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(m.Chip))
|
|
||||||
{
|
|
||||||
var k = OnlyDigits(m.Chip);
|
|
||||||
if (!string.IsNullOrWhiteSpace(k) && !mobileByChip.ContainsKey(k))
|
|
||||||
mobileByChip[k] = m.Id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ✅ cache de entidades tracked para atualizar a GERAL sem consultar toda hora
|
|
||||||
var mobileCache = new Dictionary<Guid, MobileLine>();
|
|
||||||
|
|
||||||
var buffer = new List<MuregLine>(600);
|
var buffer = new List<MuregLine>(600);
|
||||||
var lastRow = wsM.LastRowUsed()?.RowNumber() ?? startRow;
|
var lastRow = wsM.LastRowUsed()?.RowNumber() ?? startRow;
|
||||||
|
|
||||||
|
|
@ -708,100 +644,19 @@ namespace line_gestao_api.Controllers
|
||||||
var itemStr = GetCellString(wsM, r, colItem);
|
var itemStr = GetCellString(wsM, r, colItem);
|
||||||
if (string.IsNullOrWhiteSpace(itemStr)) break;
|
if (string.IsNullOrWhiteSpace(itemStr)) break;
|
||||||
|
|
||||||
var linhaAntiga = NullIfEmptyDigits(GetCellByHeader(wsM, r, map, "LINHA ANTIGA"));
|
|
||||||
var linhaNova = NullIfEmptyDigits(GetCellByHeader(wsM, r, map, "LINHA NOVA"));
|
|
||||||
var iccid = NullIfEmptyDigits(GetCellByHeader(wsM, r, map, "ICCID"));
|
|
||||||
var dataMureg = TryDate(wsM, r, map, "DATA DA MUREG");
|
|
||||||
|
|
||||||
// ✅ resolve MobileLineId (prioridade: LinhaAntiga, depois ICCID)
|
|
||||||
Guid mobileLineId = Guid.Empty;
|
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(linhaAntiga) && mobileByLinha.TryGetValue(linhaAntiga, out var idPorLinha))
|
|
||||||
mobileLineId = idPorLinha;
|
|
||||||
else if (!string.IsNullOrWhiteSpace(iccid) && mobileByChip.TryGetValue(iccid, out var idPorChip))
|
|
||||||
mobileLineId = idPorChip;
|
|
||||||
|
|
||||||
// Se não encontrou correspondência na GERAL, não dá pra salvar (MobileLineId é obrigatório)
|
|
||||||
if (mobileLineId == Guid.Empty)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// ✅ snapshot da linha antiga: se vier vazia na planilha, pega a linha atual da GERAL
|
|
||||||
string? linhaAntigaSnapshot = linhaAntiga;
|
|
||||||
if (string.IsNullOrWhiteSpace(linhaAntigaSnapshot))
|
|
||||||
{
|
|
||||||
if (!mobileCache.TryGetValue(mobileLineId, out var mobTmp))
|
|
||||||
{
|
|
||||||
mobTmp = await _db.MobileLines.FirstOrDefaultAsync(x => x.Id == mobileLineId);
|
|
||||||
if (mobTmp != null) mobileCache[mobileLineId] = mobTmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
linhaAntigaSnapshot = mobTmp?.Linha;
|
|
||||||
}
|
|
||||||
|
|
||||||
var now = DateTime.UtcNow;
|
|
||||||
|
|
||||||
// ✅ salva MUREG sempre
|
|
||||||
var e = new MuregLine
|
var e = new MuregLine
|
||||||
{
|
{
|
||||||
Id = Guid.NewGuid(),
|
Id = Guid.NewGuid(),
|
||||||
Item = TryInt(itemStr),
|
Item = TryInt(itemStr),
|
||||||
MobileLineId = mobileLineId,
|
LinhaAntiga = NullIfEmptyDigits(GetCellByHeader(wsM, r, map, "LINHA ANTIGA")),
|
||||||
LinhaAntiga = linhaAntigaSnapshot,
|
LinhaNova = NullIfEmptyDigits(GetCellByHeader(wsM, r, map, "LINHA NOVA")),
|
||||||
LinhaNova = linhaNova,
|
ICCID = NullIfEmptyDigits(GetCellByHeader(wsM, r, map, "ICCID")),
|
||||||
ICCID = iccid,
|
DataDaMureg = TryDate(wsM, r, map, "DATA DA MUREG"),
|
||||||
DataDaMureg = dataMureg,
|
Cliente = GetCellByHeader(wsM, r, map, "CLIENTE"),
|
||||||
CreatedAt = now,
|
|
||||||
UpdatedAt = now
|
|
||||||
};
|
};
|
||||||
|
|
||||||
buffer.Add(e);
|
buffer.Add(e);
|
||||||
|
|
||||||
// ✅ REFLETE NA GERAL (somente se NÃO houver conflito)
|
|
||||||
if (!string.IsNullOrWhiteSpace(linhaNova))
|
|
||||||
{
|
|
||||||
// Se LinhaNova já existe na GERAL em OUTRA MobileLine => ignora update (não duplica)
|
|
||||||
if (mobileByLinha.TryGetValue(linhaNova, out var idJaExiste) && idJaExiste != mobileLineId)
|
|
||||||
{
|
|
||||||
// ignora update da GERAL
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// carrega entity tracked (cache) e atualiza
|
|
||||||
if (!mobileCache.TryGetValue(mobileLineId, out var mobile))
|
|
||||||
{
|
|
||||||
mobile = await _db.MobileLines.FirstOrDefaultAsync(x => x.Id == mobileLineId);
|
|
||||||
if (mobile != null) mobileCache[mobileLineId] = mobile;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mobile != null)
|
|
||||||
{
|
|
||||||
// valida conflito de ICCID também (evita duplicidade de CHIP)
|
|
||||||
var iccidConflita = false;
|
|
||||||
if (!string.IsNullOrWhiteSpace(iccid) &&
|
|
||||||
mobileByChip.TryGetValue(iccid, out var chipJaExiste) &&
|
|
||||||
chipJaExiste != mobileLineId)
|
|
||||||
{
|
|
||||||
iccidConflita = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// atualiza Linha
|
|
||||||
mobile.Linha = linhaNova;
|
|
||||||
|
|
||||||
// atualiza Chip se ICCID vier e NÃO conflitar
|
|
||||||
if (!string.IsNullOrWhiteSpace(iccid) && !iccidConflita)
|
|
||||||
mobile.Chip = iccid;
|
|
||||||
|
|
||||||
mobile.UpdatedAt = DateTime.UtcNow;
|
|
||||||
|
|
||||||
// atualiza os dicionários para próximas linhas do MUREG
|
|
||||||
mobileByLinha[linhaNova] = mobileLineId;
|
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(iccid) && !iccidConflita)
|
|
||||||
mobileByChip[iccid] = mobileLineId;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (buffer.Count >= 500)
|
if (buffer.Count >= 500)
|
||||||
{
|
{
|
||||||
await _db.MuregLines.AddRangeAsync(buffer);
|
await _db.MuregLines.AddRangeAsync(buffer);
|
||||||
|
|
@ -1304,7 +1159,7 @@ namespace line_gestao_api.Controllers
|
||||||
}
|
}
|
||||||
|
|
||||||
// ==========================================================
|
// ==========================================================
|
||||||
// HELPERS (SEUS)
|
// HELPERS (SEUS - + AJUSTES)
|
||||||
// ==========================================================
|
// ==========================================================
|
||||||
private static Dictionary<string, int> BuildHeaderMap(IXLRow headerRow)
|
private static Dictionary<string, int> BuildHeaderMap(IXLRow headerRow)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -23,13 +23,11 @@ namespace line_gestao_api.Controllers
|
||||||
}
|
}
|
||||||
|
|
||||||
// ==========================================================
|
// ==========================================================
|
||||||
// ✅ GET: /api/mureg (paginação, busca e ordenação)
|
// ✅ GET: /api/mureg (com paginação, busca e ordenação)
|
||||||
// Cliente vem da GERAL (MobileLines)
|
|
||||||
// ==========================================================
|
// ==========================================================
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task<ActionResult<PagedResult<MuregListDto>>> GetAll(
|
public async Task<ActionResult<PagedResult<MuregListDto>>> GetAll(
|
||||||
[FromQuery] string? search,
|
[FromQuery] string? search,
|
||||||
[FromQuery] string? client,
|
|
||||||
[FromQuery] int page = 1,
|
[FromQuery] int page = 1,
|
||||||
[FromQuery] int pageSize = 10,
|
[FromQuery] int pageSize = 10,
|
||||||
[FromQuery] string? sortBy = "item",
|
[FromQuery] string? sortBy = "item",
|
||||||
|
|
@ -38,16 +36,7 @@ namespace line_gestao_api.Controllers
|
||||||
page = page < 1 ? 1 : page;
|
page = page < 1 ? 1 : page;
|
||||||
pageSize = pageSize < 1 ? 10 : pageSize;
|
pageSize = pageSize < 1 ? 10 : pageSize;
|
||||||
|
|
||||||
var q = _db.MuregLines
|
var q = _db.MuregLines.AsNoTracking();
|
||||||
.AsNoTracking()
|
|
||||||
.Include(x => x.MobileLine)
|
|
||||||
.AsQueryable();
|
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(client))
|
|
||||||
{
|
|
||||||
var c = client.Trim();
|
|
||||||
q = q.Where(x => EF.Functions.ILike((x.MobileLine.Cliente ?? ""), c));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(search))
|
if (!string.IsNullOrWhiteSpace(search))
|
||||||
{
|
{
|
||||||
|
|
@ -56,9 +45,7 @@ namespace line_gestao_api.Controllers
|
||||||
EF.Functions.ILike((x.LinhaAntiga ?? ""), $"%{s}%") ||
|
EF.Functions.ILike((x.LinhaAntiga ?? ""), $"%{s}%") ||
|
||||||
EF.Functions.ILike((x.LinhaNova ?? ""), $"%{s}%") ||
|
EF.Functions.ILike((x.LinhaNova ?? ""), $"%{s}%") ||
|
||||||
EF.Functions.ILike((x.ICCID ?? ""), $"%{s}%") ||
|
EF.Functions.ILike((x.ICCID ?? ""), $"%{s}%") ||
|
||||||
EF.Functions.ILike((x.MobileLine.Cliente ?? ""), $"%{s}%") ||
|
EF.Functions.ILike((x.Cliente ?? ""), $"%{s}%") ||
|
||||||
EF.Functions.ILike((x.MobileLine.Usuario ?? ""), $"%{s}%") ||
|
|
||||||
EF.Functions.ILike((x.MobileLine.Skil ?? ""), $"%{s}%") ||
|
|
||||||
EF.Functions.ILike(x.Item.ToString(), $"%{s}%"));
|
EF.Functions.ILike(x.Item.ToString(), $"%{s}%"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -74,7 +61,7 @@ namespace line_gestao_api.Controllers
|
||||||
"linhanova" => desc ? q.OrderByDescending(x => x.LinhaNova ?? "").ThenBy(x => x.Item) : q.OrderBy(x => x.LinhaNova ?? "").ThenBy(x => x.Item),
|
"linhanova" => desc ? q.OrderByDescending(x => x.LinhaNova ?? "").ThenBy(x => x.Item) : q.OrderBy(x => x.LinhaNova ?? "").ThenBy(x => x.Item),
|
||||||
"iccid" => desc ? q.OrderByDescending(x => x.ICCID ?? "").ThenBy(x => x.Item) : q.OrderBy(x => x.ICCID ?? "").ThenBy(x => x.Item),
|
"iccid" => desc ? q.OrderByDescending(x => x.ICCID ?? "").ThenBy(x => x.Item) : q.OrderBy(x => x.ICCID ?? "").ThenBy(x => x.Item),
|
||||||
"datadamureg" => desc ? q.OrderByDescending(x => x.DataDaMureg).ThenBy(x => x.Item) : q.OrderBy(x => x.DataDaMureg).ThenBy(x => x.Item),
|
"datadamureg" => desc ? q.OrderByDescending(x => x.DataDaMureg).ThenBy(x => x.Item) : q.OrderBy(x => x.DataDaMureg).ThenBy(x => x.Item),
|
||||||
"cliente" => desc ? q.OrderByDescending(x => x.MobileLine.Cliente ?? "").ThenBy(x => x.Item) : q.OrderBy(x => x.MobileLine.Cliente ?? "").ThenBy(x => x.Item),
|
"cliente" => desc ? q.OrderByDescending(x => x.Cliente ?? "").ThenBy(x => x.Item) : q.OrderBy(x => x.Cliente ?? "").ThenBy(x => x.Item),
|
||||||
_ => desc ? q.OrderByDescending(x => x.Item) : q.OrderBy(x => x.Item)
|
_ => desc ? q.OrderByDescending(x => x.Item) : q.OrderBy(x => x.Item)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -89,8 +76,7 @@ namespace line_gestao_api.Controllers
|
||||||
LinhaNova = x.LinhaNova,
|
LinhaNova = x.LinhaNova,
|
||||||
ICCID = x.ICCID,
|
ICCID = x.ICCID,
|
||||||
DataDaMureg = x.DataDaMureg,
|
DataDaMureg = x.DataDaMureg,
|
||||||
Cliente = x.MobileLine.Cliente,
|
Cliente = x.Cliente
|
||||||
MobileLineId = x.MobileLineId
|
|
||||||
})
|
})
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
|
|
@ -104,279 +90,17 @@ namespace line_gestao_api.Controllers
|
||||||
}
|
}
|
||||||
|
|
||||||
// ==========================================================
|
// ==========================================================
|
||||||
// ✅ GET: /api/mureg/{id}
|
// ✅ POST: /api/mureg/import-excel (opcional)
|
||||||
// Detalhe para modal (puxa dados da GERAL)
|
// Se você usar o botão "Importar" da tela MUREG, ele vai bater aqui
|
||||||
// ==========================================================
|
|
||||||
[HttpGet("{id:guid}")]
|
|
||||||
public async Task<ActionResult<MuregDetailDto>> GetById(Guid id)
|
|
||||||
{
|
|
||||||
var x = await _db.MuregLines
|
|
||||||
.AsNoTracking()
|
|
||||||
.Include(a => a.MobileLine)
|
|
||||||
.FirstOrDefaultAsync(a => a.Id == id);
|
|
||||||
|
|
||||||
if (x == null) return NotFound();
|
|
||||||
|
|
||||||
return Ok(new MuregDetailDto
|
|
||||||
{
|
|
||||||
Id = x.Id,
|
|
||||||
Item = x.Item,
|
|
||||||
LinhaAntiga = x.LinhaAntiga,
|
|
||||||
LinhaNova = x.LinhaNova,
|
|
||||||
ICCID = x.ICCID,
|
|
||||||
DataDaMureg = x.DataDaMureg,
|
|
||||||
MobileLineId = x.MobileLineId,
|
|
||||||
|
|
||||||
Cliente = x.MobileLine?.Cliente,
|
|
||||||
Usuario = x.MobileLine?.Usuario,
|
|
||||||
Skil = x.MobileLine?.Skil,
|
|
||||||
LinhaAtualNaGeral = x.MobileLine?.Linha,
|
|
||||||
ChipNaGeral = x.MobileLine?.Chip,
|
|
||||||
ContaNaGeral = x.MobileLine?.Conta,
|
|
||||||
StatusNaGeral = x.MobileLine?.Status
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==========================================================
|
|
||||||
// ✅ GET: /api/mureg/clients (filtro no front)
|
|
||||||
// ==========================================================
|
|
||||||
[HttpGet("clients")]
|
|
||||||
public async Task<ActionResult<List<string>>> GetClients()
|
|
||||||
{
|
|
||||||
var clients = await _db.MuregLines
|
|
||||||
.AsNoTracking()
|
|
||||||
.Include(x => x.MobileLine)
|
|
||||||
.Where(x => x.MobileLine.Cliente != null && x.MobileLine.Cliente != "")
|
|
||||||
.Select(x => x.MobileLine.Cliente!)
|
|
||||||
.Distinct()
|
|
||||||
.OrderBy(x => x)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
return Ok(clients);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==========================================================
|
|
||||||
// ✅ POST: /api/mureg
|
|
||||||
// Cria MUREG manualmente (usando MobileLineId)
|
|
||||||
// - MobileLines (GERAL) prevalece: Cliente/Usuário/Skil etc vêm da GERAL
|
|
||||||
// - Se LinhaNova vier, reflete na GERAL (Linha e Chip=ICCID se vier)
|
|
||||||
// ==========================================================
|
|
||||||
public class CreateMuregDto
|
|
||||||
{
|
|
||||||
public int Item { get; set; }
|
|
||||||
public Guid MobileLineId { get; set; }
|
|
||||||
|
|
||||||
public string? LinhaAntiga { get; set; } // opcional (snapshot)
|
|
||||||
public string? LinhaNova { get; set; } // opcional
|
|
||||||
public string? ICCID { get; set; } // opcional
|
|
||||||
public DateTime? DataDaMureg { get; set; } // opcional
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpPost]
|
|
||||||
public async Task<ActionResult<MuregDetailDto>> Create([FromBody] CreateMuregDto req)
|
|
||||||
{
|
|
||||||
if (req.MobileLineId == Guid.Empty)
|
|
||||||
return BadRequest(new { message = "mobileLineId é obrigatório." });
|
|
||||||
|
|
||||||
// linha canônica (GERAL)
|
|
||||||
var mobile = await _db.MobileLines.FirstOrDefaultAsync(x => x.Id == req.MobileLineId);
|
|
||||||
if (mobile == null)
|
|
||||||
return BadRequest(new { message = "MobileLine não encontrada (mobileLineId inválido)." });
|
|
||||||
|
|
||||||
// normaliza números
|
|
||||||
string? linhaNova = NullIfEmptyDigits(req.LinhaNova);
|
|
||||||
string? iccid = NullIfEmptyDigits(req.ICCID);
|
|
||||||
string? linhaAntiga = NullIfEmptyDigits(req.LinhaAntiga);
|
|
||||||
|
|
||||||
// snapshot: se LinhaAntiga não veio, captura da GERAL
|
|
||||||
var linhaAntigaSnapshot = !string.IsNullOrWhiteSpace(linhaAntiga) ? linhaAntiga : mobile.Linha;
|
|
||||||
|
|
||||||
// conflito: LinhaNova já existe em outra MobileLine
|
|
||||||
if (!string.IsNullOrWhiteSpace(linhaNova))
|
|
||||||
{
|
|
||||||
var exists = await _db.MobileLines.AsNoTracking()
|
|
||||||
.AnyAsync(x => x.Linha == linhaNova && x.Id != mobile.Id);
|
|
||||||
|
|
||||||
if (exists)
|
|
||||||
return Conflict(new { message = $"Conflito: a LinhaNova {linhaNova} já existe em outra linha da GERAL." });
|
|
||||||
}
|
|
||||||
|
|
||||||
// item: se não vier, gera sequencial
|
|
||||||
int item = req.Item;
|
|
||||||
if (item <= 0)
|
|
||||||
{
|
|
||||||
var maxItem = await _db.MuregLines.MaxAsync(x => (int?)x.Item) ?? 0;
|
|
||||||
item = maxItem + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
var now = DateTime.UtcNow;
|
|
||||||
|
|
||||||
var entity = new MuregLine
|
|
||||||
{
|
|
||||||
Id = Guid.NewGuid(),
|
|
||||||
Item = item,
|
|
||||||
MobileLineId = mobile.Id,
|
|
||||||
LinhaAntiga = linhaAntigaSnapshot,
|
|
||||||
LinhaNova = linhaNova,
|
|
||||||
ICCID = iccid,
|
|
||||||
DataDaMureg = ToUtc(req.DataDaMureg),
|
|
||||||
CreatedAt = now,
|
|
||||||
UpdatedAt = now
|
|
||||||
};
|
|
||||||
|
|
||||||
_db.MuregLines.Add(entity);
|
|
||||||
|
|
||||||
// ✅ reflete na GERAL (prevalece)
|
|
||||||
if (!string.IsNullOrWhiteSpace(linhaNova))
|
|
||||||
mobile.Linha = linhaNova;
|
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(iccid))
|
|
||||||
mobile.Chip = iccid;
|
|
||||||
|
|
||||||
mobile.UpdatedAt = DateTime.UtcNow;
|
|
||||||
|
|
||||||
await _db.SaveChangesAsync();
|
|
||||||
|
|
||||||
// devolve detalhe
|
|
||||||
return CreatedAtAction(nameof(GetById), new { id = entity.Id }, new MuregDetailDto
|
|
||||||
{
|
|
||||||
Id = entity.Id,
|
|
||||||
Item = entity.Item,
|
|
||||||
LinhaAntiga = entity.LinhaAntiga,
|
|
||||||
LinhaNova = entity.LinhaNova,
|
|
||||||
ICCID = entity.ICCID,
|
|
||||||
DataDaMureg = entity.DataDaMureg,
|
|
||||||
MobileLineId = entity.MobileLineId,
|
|
||||||
|
|
||||||
Cliente = mobile.Cliente,
|
|
||||||
Usuario = mobile.Usuario,
|
|
||||||
Skil = mobile.Skil,
|
|
||||||
LinhaAtualNaGeral = mobile.Linha,
|
|
||||||
ChipNaGeral = mobile.Chip,
|
|
||||||
ContaNaGeral = mobile.Conta,
|
|
||||||
StatusNaGeral = mobile.Status
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==========================================================
|
|
||||||
// ✅ PUT: /api/mureg/{id}
|
|
||||||
// Atualiza o registro MUREG e (se LinhaNova/ICCID vierem) reflete na GERAL
|
|
||||||
// ==========================================================
|
|
||||||
public class UpdateMuregDto
|
|
||||||
{
|
|
||||||
public int? Item { get; set; }
|
|
||||||
public Guid? MobileLineId { get; set; } // opcional mudar vínculo
|
|
||||||
|
|
||||||
public string? LinhaAntiga { get; set; }
|
|
||||||
public string? LinhaNova { get; set; }
|
|
||||||
public string? ICCID { get; set; }
|
|
||||||
public DateTime? DataDaMureg { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpPut("{id:guid}")]
|
|
||||||
public async Task<IActionResult> Update(Guid id, [FromBody] UpdateMuregDto req)
|
|
||||||
{
|
|
||||||
var entity = await _db.MuregLines.FirstOrDefaultAsync(x => x.Id == id);
|
|
||||||
if (entity == null) return NotFound();
|
|
||||||
|
|
||||||
// troca vínculo (se mandou)
|
|
||||||
if (req.MobileLineId.HasValue && req.MobileLineId.Value != Guid.Empty && req.MobileLineId.Value != entity.MobileLineId)
|
|
||||||
{
|
|
||||||
var mobileNew = await _db.MobileLines.FirstOrDefaultAsync(x => x.Id == req.MobileLineId.Value);
|
|
||||||
if (mobileNew == null)
|
|
||||||
return BadRequest(new { message = "MobileLineId inválido." });
|
|
||||||
|
|
||||||
entity.MobileLineId = mobileNew.Id;
|
|
||||||
}
|
|
||||||
|
|
||||||
// carrega MobileLine atual vinculada
|
|
||||||
var mobile = await _db.MobileLines.FirstOrDefaultAsync(x => x.Id == entity.MobileLineId);
|
|
||||||
if (mobile == null)
|
|
||||||
return BadRequest(new { message = "MobileLine vinculada não encontrada." });
|
|
||||||
|
|
||||||
// normaliza
|
|
||||||
string? linhaNova = req.LinhaNova != null ? NullIfEmptyDigits(req.LinhaNova) : null;
|
|
||||||
string? iccid = req.ICCID != null ? NullIfEmptyDigits(req.ICCID) : null;
|
|
||||||
string? linhaAntiga = req.LinhaAntiga != null ? NullIfEmptyDigits(req.LinhaAntiga) : null;
|
|
||||||
|
|
||||||
// item
|
|
||||||
if (req.Item.HasValue && req.Item.Value > 0)
|
|
||||||
entity.Item = req.Item.Value;
|
|
||||||
|
|
||||||
// snapshot linha antiga (se enviar null/"" não mexe; se enviar valor, atualiza)
|
|
||||||
if (req.LinhaAntiga != null)
|
|
||||||
entity.LinhaAntiga = string.IsNullOrWhiteSpace(linhaAntiga) ? entity.LinhaAntiga : linhaAntiga;
|
|
||||||
|
|
||||||
if (req.DataDaMureg != null)
|
|
||||||
entity.DataDaMureg = ToUtc(req.DataDaMureg);
|
|
||||||
|
|
||||||
if (req.LinhaNova != null)
|
|
||||||
entity.LinhaNova = linhaNova; // pode virar null
|
|
||||||
|
|
||||||
if (req.ICCID != null)
|
|
||||||
entity.ICCID = iccid; // pode virar null
|
|
||||||
|
|
||||||
// conflito de LinhaNova na GERAL
|
|
||||||
if (!string.IsNullOrWhiteSpace(linhaNova))
|
|
||||||
{
|
|
||||||
var exists = await _db.MobileLines.AsNoTracking()
|
|
||||||
.AnyAsync(x => x.Linha == linhaNova && x.Id != mobile.Id);
|
|
||||||
|
|
||||||
if (exists)
|
|
||||||
return Conflict(new { message = $"Conflito: a LinhaNova {linhaNova} já existe em outra linha da GERAL." });
|
|
||||||
}
|
|
||||||
|
|
||||||
// ✅ reflete na GERAL (se o usuário mandou esses campos)
|
|
||||||
if (req.LinhaNova != null && !string.IsNullOrWhiteSpace(linhaNova))
|
|
||||||
mobile.Linha = linhaNova;
|
|
||||||
|
|
||||||
if (req.ICCID != null && !string.IsNullOrWhiteSpace(iccid))
|
|
||||||
mobile.Chip = iccid;
|
|
||||||
|
|
||||||
entity.UpdatedAt = DateTime.UtcNow;
|
|
||||||
mobile.UpdatedAt = DateTime.UtcNow;
|
|
||||||
|
|
||||||
await _db.SaveChangesAsync();
|
|
||||||
return NoContent();
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==========================================================
|
|
||||||
// ✅ POST: /api/mureg/import-excel (mantido)
|
|
||||||
// ==========================================================
|
// ==========================================================
|
||||||
[HttpPost("import-excel")]
|
[HttpPost("import-excel")]
|
||||||
[Consumes("multipart/form-data")]
|
[Consumes("multipart/form-data")]
|
||||||
[RequestSizeLimit(50_000_000)]
|
[RequestSizeLimit(50_000_000)]
|
||||||
public async Task<IActionResult> ImportExcel([FromForm] ImportExcelForm form)
|
public async Task<IActionResult> ImportExcel([FromForm] ImportExcelForm form)
|
||||||
{
|
{
|
||||||
return BadRequest(new
|
// Se você quiser manter "importa só no GERAL", pode remover este endpoint.
|
||||||
{
|
// Eu deixei para não quebrar o botão do seu front (que chama /api/mureg/import-excel).
|
||||||
message = "Importe a planilha pela página GERAL. O MUREG será carregado automaticamente."
|
return BadRequest(new { message = "Importe a planilha pela página GERAL. O MUREG será carregado automaticamente." });
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// ==========================================================
|
|
||||||
// HELPERS (iguais ao LinesController, só o que precisamos aqui)
|
|
||||||
// ==========================================================
|
|
||||||
private static DateTime? ToUtc(DateTime? dt)
|
|
||||||
{
|
|
||||||
if (dt == null) return null;
|
|
||||||
var v = dt.Value;
|
|
||||||
return v.Kind == DateTimeKind.Utc ? v :
|
|
||||||
(v.Kind == DateTimeKind.Local ? v.ToUniversalTime() : DateTime.SpecifyKind(v, DateTimeKind.Utc));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string OnlyDigits(string? s)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrWhiteSpace(s)) return "";
|
|
||||||
var sb = new System.Text.StringBuilder();
|
|
||||||
foreach (var c in s) if (char.IsDigit(c)) sb.Append(c);
|
|
||||||
return sb.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string? NullIfEmptyDigits(string? s)
|
|
||||||
{
|
|
||||||
var d = OnlyDigits(s);
|
|
||||||
return string.IsNullOrWhiteSpace(d) ? null : d;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,320 +0,0 @@
|
||||||
using line_gestao_api.Data;
|
|
||||||
using line_gestao_api.Dtos;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
|
|
||||||
namespace line_gestao_api.Controllers
|
|
||||||
{
|
|
||||||
[ApiController]
|
|
||||||
[Route("api/relatorios")]
|
|
||||||
public class RelatoriosController : ControllerBase
|
|
||||||
{
|
|
||||||
private readonly AppDbContext _db;
|
|
||||||
|
|
||||||
public RelatoriosController(AppDbContext db)
|
|
||||||
{
|
|
||||||
_db = db;
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet("dashboard")]
|
|
||||||
public async Task<ActionResult<RelatoriosDashboardDto>> GetDashboard()
|
|
||||||
{
|
|
||||||
var today = DateTime.UtcNow.Date;
|
|
||||||
var last30 = today.AddDays(-30);
|
|
||||||
var limit30 = today.AddDays(30);
|
|
||||||
|
|
||||||
var minUtc = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
|
|
||||||
|
|
||||||
// =========================
|
|
||||||
// GERAL (MobileLines)
|
|
||||||
// =========================
|
|
||||||
var qLines = _db.MobileLines.AsNoTracking();
|
|
||||||
|
|
||||||
var totalLinhas = await qLines.CountAsync();
|
|
||||||
|
|
||||||
var clientesUnicos = await qLines
|
|
||||||
.Where(x => x.Cliente != null && x.Cliente != "")
|
|
||||||
.Select(x => x.Cliente!)
|
|
||||||
.Distinct()
|
|
||||||
.CountAsync();
|
|
||||||
|
|
||||||
var ativos = await qLines.CountAsync(x =>
|
|
||||||
EF.Functions.ILike((x.Status ?? "").Trim(), "%ativo%"));
|
|
||||||
|
|
||||||
var bloqueadosPerdaRoubo = await qLines.CountAsync(x =>
|
|
||||||
EF.Functions.ILike((x.Status ?? "").Trim(), "%perda%") ||
|
|
||||||
EF.Functions.ILike((x.Status ?? "").Trim(), "%roubo%"));
|
|
||||||
|
|
||||||
var bloqueados120Dias = await qLines.CountAsync(x =>
|
|
||||||
EF.Functions.ILike((x.Status ?? "").Trim(), "%bloque%") &&
|
|
||||||
EF.Functions.ILike((x.Status ?? "").Trim(), "%120%") &&
|
|
||||||
EF.Functions.ILike((x.Status ?? "").Trim(), "%dia%"));
|
|
||||||
|
|
||||||
var bloqueadosOutros = await qLines.CountAsync(x =>
|
|
||||||
EF.Functions.ILike((x.Status ?? "").Trim(), "%bloque%") &&
|
|
||||||
!(EF.Functions.ILike((x.Status ?? "").Trim(), "%120%") && EF.Functions.ILike((x.Status ?? "").Trim(), "%dia%")) &&
|
|
||||||
!(EF.Functions.ILike((x.Status ?? "").Trim(), "%perda%") || EF.Functions.ILike((x.Status ?? "").Trim(), "%roubo%"))
|
|
||||||
);
|
|
||||||
|
|
||||||
var bloqueados = bloqueadosPerdaRoubo + bloqueados120Dias + bloqueadosOutros;
|
|
||||||
|
|
||||||
var reservas = await qLines.CountAsync(x =>
|
|
||||||
(x.Cliente ?? "").ToUpper() == "RESERVA" ||
|
|
||||||
(x.Usuario ?? "").ToUpper() == "RESERVA" ||
|
|
||||||
(x.Skil ?? "").ToUpper() == "RESERVA");
|
|
||||||
|
|
||||||
var topClientes = await qLines
|
|
||||||
.Where(x => x.Cliente != null && x.Cliente != "")
|
|
||||||
.GroupBy(x => x.Cliente!)
|
|
||||||
.Select(g => new TopClienteDto
|
|
||||||
{
|
|
||||||
Cliente = g.Key,
|
|
||||||
Linhas = g.Count()
|
|
||||||
})
|
|
||||||
.OrderByDescending(x => x.Linhas)
|
|
||||||
.ThenBy(x => x.Cliente)
|
|
||||||
.Take(10)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
// =========================
|
|
||||||
// MUREG
|
|
||||||
// =========================
|
|
||||||
var qMureg = _db.MuregLines.AsNoTracking().Include(x => x.MobileLine);
|
|
||||||
|
|
||||||
var totalMuregs = await qMureg.CountAsync();
|
|
||||||
|
|
||||||
var muregsUltimos30 = await qMureg.CountAsync(x =>
|
|
||||||
x.DataDaMureg != null && x.DataDaMureg.Value.Date >= last30);
|
|
||||||
|
|
||||||
var muregsRecentes = await qMureg
|
|
||||||
.OrderByDescending(x => x.DataDaMureg ?? minUtc)
|
|
||||||
.ThenByDescending(x => x.Item)
|
|
||||||
.Take(10)
|
|
||||||
.Select(x => new MuregRecenteDto
|
|
||||||
{
|
|
||||||
Id = x.Id,
|
|
||||||
Item = x.Item,
|
|
||||||
LinhaAntiga = x.LinhaAntiga,
|
|
||||||
LinhaNova = x.LinhaNova,
|
|
||||||
ICCID = x.ICCID,
|
|
||||||
DataDaMureg = x.DataDaMureg,
|
|
||||||
Cliente = x.MobileLine != null ? x.MobileLine.Cliente : null,
|
|
||||||
MobileLineId = x.MobileLineId
|
|
||||||
})
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
var serieMureg12 = await BuildSerieUltimos12Meses_Mureg(today);
|
|
||||||
|
|
||||||
// =========================
|
|
||||||
// TROCA DE NÚMERO
|
|
||||||
// =========================
|
|
||||||
var qTroca = _db.TrocaNumeroLines.AsNoTracking();
|
|
||||||
|
|
||||||
var totalTrocas = await qTroca.CountAsync();
|
|
||||||
|
|
||||||
var trocasUltimos30 = await qTroca.CountAsync(x =>
|
|
||||||
x.DataTroca != null && x.DataTroca.Value.Date >= last30);
|
|
||||||
|
|
||||||
var trocasRecentes = await qTroca
|
|
||||||
.OrderByDescending(x => x.DataTroca ?? minUtc)
|
|
||||||
.ThenByDescending(x => x.Item)
|
|
||||||
.Take(10)
|
|
||||||
.Select(x => new TrocaRecenteDto
|
|
||||||
{
|
|
||||||
Id = x.Id,
|
|
||||||
Item = x.Item,
|
|
||||||
LinhaAntiga = x.LinhaAntiga,
|
|
||||||
LinhaNova = x.LinhaNova,
|
|
||||||
ICCID = x.ICCID,
|
|
||||||
DataTroca = x.DataTroca,
|
|
||||||
Motivo = x.Motivo
|
|
||||||
})
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
var serieTroca12 = await BuildSerieUltimos12Meses_Troca(today);
|
|
||||||
|
|
||||||
// =========================
|
|
||||||
// VIGÊNCIA
|
|
||||||
// =========================
|
|
||||||
var qVig = _db.VigenciaLines.AsNoTracking();
|
|
||||||
|
|
||||||
var totalVig = await qVig.CountAsync();
|
|
||||||
|
|
||||||
var vigVencidos = await qVig.CountAsync(x =>
|
|
||||||
x.DtTerminoFidelizacao != null && x.DtTerminoFidelizacao.Value.Date < today);
|
|
||||||
|
|
||||||
var vigAVencer30 = await qVig.CountAsync(x =>
|
|
||||||
x.DtTerminoFidelizacao != null &&
|
|
||||||
x.DtTerminoFidelizacao.Value.Date >= today &&
|
|
||||||
x.DtTerminoFidelizacao.Value.Date <= limit30);
|
|
||||||
|
|
||||||
// ✅ NOVO: série próximos 12 meses (mês/ano)
|
|
||||||
var serieVigProx12 = await BuildSerieProximos12Meses_VigenciaEncerramentos(today);
|
|
||||||
|
|
||||||
// ✅ NOVO: buckets de supervisão
|
|
||||||
var vigBuckets = await BuildVigenciaBuckets(today);
|
|
||||||
|
|
||||||
// =========================
|
|
||||||
// USER DATA
|
|
||||||
// =========================
|
|
||||||
var qUserData = _db.UserDatas.AsNoTracking();
|
|
||||||
|
|
||||||
var userDataRegistros = await qUserData.CountAsync();
|
|
||||||
var userDataComCpf = await qUserData.CountAsync(x => x.Cpf != null && x.Cpf != "");
|
|
||||||
var userDataComEmail = await qUserData.CountAsync(x => x.Email != null && x.Email != "");
|
|
||||||
|
|
||||||
// =========================
|
|
||||||
// RESPOSTA
|
|
||||||
// =========================
|
|
||||||
var dto = new RelatoriosDashboardDto
|
|
||||||
{
|
|
||||||
Kpis = new DashboardKpisDto
|
|
||||||
{
|
|
||||||
TotalLinhas = totalLinhas,
|
|
||||||
ClientesUnicos = clientesUnicos,
|
|
||||||
Ativos = ativos,
|
|
||||||
|
|
||||||
Bloqueados = bloqueados,
|
|
||||||
BloqueadosPerdaRoubo = bloqueadosPerdaRoubo,
|
|
||||||
Bloqueados120Dias = bloqueados120Dias,
|
|
||||||
BloqueadosOutros = bloqueadosOutros,
|
|
||||||
|
|
||||||
Reservas = reservas,
|
|
||||||
|
|
||||||
TotalMuregs = totalMuregs,
|
|
||||||
MuregsUltimos30Dias = muregsUltimos30,
|
|
||||||
|
|
||||||
TotalVigenciaLinhas = totalVig,
|
|
||||||
VigenciaVencidos = vigVencidos,
|
|
||||||
VigenciaAVencer30 = vigAVencer30,
|
|
||||||
|
|
||||||
TotalTrocas = totalTrocas,
|
|
||||||
TrocasUltimos30Dias = trocasUltimos30,
|
|
||||||
|
|
||||||
UserDataRegistros = userDataRegistros,
|
|
||||||
UserDataComCpf = userDataComCpf,
|
|
||||||
UserDataComEmail = userDataComEmail
|
|
||||||
},
|
|
||||||
TopClientes = topClientes,
|
|
||||||
SerieMuregUltimos12Meses = serieMureg12,
|
|
||||||
SerieTrocaUltimos12Meses = serieTroca12,
|
|
||||||
MuregsRecentes = muregsRecentes,
|
|
||||||
TrocasRecentes = trocasRecentes,
|
|
||||||
|
|
||||||
SerieVigenciaEncerramentosProx12Meses = serieVigProx12,
|
|
||||||
VigenciaBuckets = vigBuckets
|
|
||||||
};
|
|
||||||
|
|
||||||
return Ok(dto);
|
|
||||||
}
|
|
||||||
|
|
||||||
// =========================
|
|
||||||
// Helpers
|
|
||||||
// =========================
|
|
||||||
private async Task<List<SerieMesDto>> BuildSerieUltimos12Meses_Mureg(DateTime todayUtcDate)
|
|
||||||
{
|
|
||||||
var start = new DateTime(todayUtcDate.Year, todayUtcDate.Month, 1, 0, 0, 0, DateTimeKind.Utc)
|
|
||||||
.AddMonths(-11);
|
|
||||||
|
|
||||||
var raw = await _db.MuregLines.AsNoTracking()
|
|
||||||
.Where(x => x.DataDaMureg != null && x.DataDaMureg.Value >= start)
|
|
||||||
.GroupBy(x => new { x.DataDaMureg!.Value.Year, x.DataDaMureg!.Value.Month })
|
|
||||||
.Select(g => new { g.Key.Year, g.Key.Month, Total = g.Count() })
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
return Fill12Months(start, raw.Select(r => (r.Year, r.Month, r.Total)));
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<List<SerieMesDto>> BuildSerieUltimos12Meses_Troca(DateTime todayUtcDate)
|
|
||||||
{
|
|
||||||
var start = new DateTime(todayUtcDate.Year, todayUtcDate.Month, 1, 0, 0, 0, DateTimeKind.Utc)
|
|
||||||
.AddMonths(-11);
|
|
||||||
|
|
||||||
var raw = await _db.TrocaNumeroLines.AsNoTracking()
|
|
||||||
.Where(x => x.DataTroca != null && x.DataTroca.Value >= start)
|
|
||||||
.GroupBy(x => new { x.DataTroca!.Value.Year, x.DataTroca!.Value.Month })
|
|
||||||
.Select(g => new { g.Key.Year, g.Key.Month, Total = g.Count() })
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
return Fill12Months(start, raw.Select(r => (r.Year, r.Month, r.Total)));
|
|
||||||
}
|
|
||||||
|
|
||||||
// ✅ série próximos 12 meses (vigência encerrando)
|
|
||||||
private async Task<List<SerieMesDto>> BuildSerieProximos12Meses_VigenciaEncerramentos(DateTime todayUtcDate)
|
|
||||||
{
|
|
||||||
var start = new DateTime(todayUtcDate.Year, todayUtcDate.Month, 1, 0, 0, 0, DateTimeKind.Utc);
|
|
||||||
var end = start.AddMonths(12);
|
|
||||||
|
|
||||||
var raw = await _db.VigenciaLines.AsNoTracking()
|
|
||||||
.Where(x => x.DtTerminoFidelizacao != null &&
|
|
||||||
x.DtTerminoFidelizacao.Value >= start &&
|
|
||||||
x.DtTerminoFidelizacao.Value < end)
|
|
||||||
.GroupBy(x => new { x.DtTerminoFidelizacao!.Value.Year, x.DtTerminoFidelizacao!.Value.Month })
|
|
||||||
.Select(g => new { g.Key.Year, g.Key.Month, Total = g.Count() })
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
return Fill12MonthsForward(start, raw.Select(r => (r.Year, r.Month, r.Total)));
|
|
||||||
}
|
|
||||||
|
|
||||||
// ✅ buckets de supervisão de vigência
|
|
||||||
private async Task<VigenciaBucketsDto> BuildVigenciaBuckets(DateTime todayUtcDate)
|
|
||||||
{
|
|
||||||
// Importante: DtTerminoFidelizacao pode ser null
|
|
||||||
var rows = await _db.VigenciaLines.AsNoTracking()
|
|
||||||
.Where(x => x.DtTerminoFidelizacao != null)
|
|
||||||
.Select(x => x.DtTerminoFidelizacao!.Value)
|
|
||||||
.ToListAsync();
|
|
||||||
|
|
||||||
int vencidos = 0, a0_30 = 0, a31_60 = 0, a61_90 = 0, acima90 = 0;
|
|
||||||
|
|
||||||
foreach (var dt in rows)
|
|
||||||
{
|
|
||||||
var days = (dt.Date - todayUtcDate).Days;
|
|
||||||
|
|
||||||
if (days < 0) vencidos++;
|
|
||||||
else if (days <= 30) a0_30++;
|
|
||||||
else if (days <= 60) a31_60++;
|
|
||||||
else if (days <= 90) a61_90++;
|
|
||||||
else acima90++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new VigenciaBucketsDto
|
|
||||||
{
|
|
||||||
Vencidos = vencidos,
|
|
||||||
AVencer0a30 = a0_30,
|
|
||||||
AVencer31a60 = a31_60,
|
|
||||||
AVencer61a90 = a61_90,
|
|
||||||
Acima90 = acima90
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private static List<SerieMesDto> Fill12Months(DateTime startMonth, IEnumerable<(int year, int month, int total)> raw)
|
|
||||||
{
|
|
||||||
var dict = raw.ToDictionary(x => $"{x.year:D4}-{x.month:D2}", x => x.total);
|
|
||||||
|
|
||||||
var list = new List<SerieMesDto>(12);
|
|
||||||
for (int i = 0; i < 12; i++)
|
|
||||||
{
|
|
||||||
var dt = startMonth.AddMonths(i);
|
|
||||||
var key = $"{dt.Year:D4}-{dt.Month:D2}";
|
|
||||||
list.Add(new SerieMesDto { Mes = key, Total = dict.TryGetValue(key, out var v) ? v : 0 });
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ✅ para frente (começa no mês atual e vai +11)
|
|
||||||
private static List<SerieMesDto> Fill12MonthsForward(DateTime startMonth, IEnumerable<(int year, int month, int total)> raw)
|
|
||||||
{
|
|
||||||
var dict = raw.ToDictionary(x => $"{x.year:D4}-{x.month:D2}", x => x.total);
|
|
||||||
|
|
||||||
var list = new List<SerieMesDto>(12);
|
|
||||||
for (int i = 0; i < 12; i++)
|
|
||||||
{
|
|
||||||
var dt = startMonth.AddMonths(i);
|
|
||||||
var key = $"{dt.Year:D4}-{dt.Month:D2}";
|
|
||||||
list.Add(new SerieMesDto { Mes = key, Total = dict.TryGetValue(key, out var v) ? v : 0 });
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -18,13 +18,10 @@ public class AppDbContext : DbContext
|
||||||
// ✅ tabela para espelhar o FATURAMENTO (PF/PJ)
|
// ✅ tabela para espelhar o FATURAMENTO (PF/PJ)
|
||||||
public DbSet<BillingClient> BillingClients => Set<BillingClient>();
|
public DbSet<BillingClient> BillingClients => Set<BillingClient>();
|
||||||
|
|
||||||
// ✅ tabela DADOS DOS USUÁRIOS
|
|
||||||
public DbSet<UserData> UserDatas => Set<UserData>();
|
public DbSet<UserData> UserDatas => Set<UserData>();
|
||||||
|
|
||||||
// ✅ tabela VIGÊNCIA
|
public DbSet<VigenciaLine> VigenciaLines { get; set; } = default!;
|
||||||
public DbSet<VigenciaLine> VigenciaLines => Set<VigenciaLine>();
|
|
||||||
|
|
||||||
// ✅ tabela TROCA DE NÚMERO
|
|
||||||
public DbSet<TrocaNumeroLine> TrocaNumeroLines => Set<TrocaNumeroLine>();
|
public DbSet<TrocaNumeroLine> TrocaNumeroLines => Set<TrocaNumeroLine>();
|
||||||
|
|
||||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||||
|
|
@ -41,44 +38,23 @@ public class AppDbContext : DbContext
|
||||||
// =========================
|
// =========================
|
||||||
// ✅ GERAL (MobileLine)
|
// ✅ GERAL (MobileLine)
|
||||||
// =========================
|
// =========================
|
||||||
modelBuilder.Entity<MobileLine>(e =>
|
modelBuilder.Entity<MobileLine>()
|
||||||
{
|
.HasIndex(x => x.Linha)
|
||||||
// Mantém UNIQUE por Linha (se Linha puder ser null no banco, Postgres aceita múltiplos nulls)
|
.IsUnique();
|
||||||
e.HasIndex(x => x.Linha).IsUnique();
|
|
||||||
|
|
||||||
// performance
|
|
||||||
e.HasIndex(x => x.Chip);
|
|
||||||
e.HasIndex(x => x.Cliente);
|
|
||||||
e.HasIndex(x => x.Usuario);
|
|
||||||
e.HasIndex(x => x.Skil);
|
|
||||||
e.HasIndex(x => x.Status);
|
|
||||||
});
|
|
||||||
|
|
||||||
// =========================
|
// =========================
|
||||||
// ✅ MUREG (FK para MobileLines)
|
// ✅ MUREG
|
||||||
// =========================
|
// =========================
|
||||||
modelBuilder.Entity<MuregLine>(e =>
|
modelBuilder.Entity<MuregLine>().HasIndex(x => x.Item);
|
||||||
{
|
modelBuilder.Entity<MuregLine>().HasIndex(x => x.Cliente);
|
||||||
e.HasIndex(x => x.Item);
|
modelBuilder.Entity<MuregLine>().HasIndex(x => x.ICCID);
|
||||||
e.HasIndex(x => x.ICCID);
|
modelBuilder.Entity<MuregLine>().HasIndex(x => x.LinhaNova);
|
||||||
e.HasIndex(x => x.LinhaAntiga);
|
|
||||||
e.HasIndex(x => x.LinhaNova);
|
|
||||||
|
|
||||||
// FK + index
|
// ==========================================================
|
||||||
e.HasIndex(x => x.MobileLineId);
|
// ✅ FATURAMENTO (BillingClient) - mantém seu mapeamento
|
||||||
|
// ==========================================================
|
||||||
e.HasOne(x => x.MobileLine)
|
|
||||||
.WithMany(m => m.Muregs)
|
|
||||||
.HasForeignKey(x => x.MobileLineId)
|
|
||||||
.OnDelete(DeleteBehavior.Restrict);
|
|
||||||
});
|
|
||||||
|
|
||||||
// =========================
|
|
||||||
// ✅ FATURAMENTO (BillingClient)
|
|
||||||
// =========================
|
|
||||||
modelBuilder.Entity<BillingClient>(e =>
|
modelBuilder.Entity<BillingClient>(e =>
|
||||||
{
|
{
|
||||||
// ⚠️ só mantenha se seu banco realmente usa esse nome
|
|
||||||
e.ToTable("billing_clients");
|
e.ToTable("billing_clients");
|
||||||
|
|
||||||
e.HasKey(x => x.Id);
|
e.HasKey(x => x.Id);
|
||||||
|
|
@ -92,40 +68,17 @@ public class AppDbContext : DbContext
|
||||||
e.HasIndex(x => x.Item);
|
e.HasIndex(x => x.Item);
|
||||||
});
|
});
|
||||||
|
|
||||||
// =========================
|
// ==========================================================
|
||||||
// ✅ DADOS DOS USUÁRIOS (UserData)
|
// ✅ VIGÊNCIA (se você quiser índices aqui também, pode manter)
|
||||||
// ✅ (SEM "Nome" pq não existe no model)
|
// ==========================================================
|
||||||
// =========================
|
// modelBuilder.Entity<VigenciaLine>().HasIndex(x => x.Cliente);
|
||||||
modelBuilder.Entity<UserData>(e =>
|
// modelBuilder.Entity<VigenciaLine>().HasIndex(x => x.Linha);
|
||||||
{
|
|
||||||
e.HasIndex(x => x.Item);
|
|
||||||
e.HasIndex(x => x.Cliente);
|
|
||||||
e.HasIndex(x => x.Linha);
|
|
||||||
e.HasIndex(x => x.Cpf);
|
|
||||||
e.HasIndex(x => x.Email);
|
|
||||||
});
|
|
||||||
|
|
||||||
// =========================
|
// ==========================================================
|
||||||
// ✅ VIGÊNCIA
|
// ✅ TROCA NÚMERO (opcional: índices)
|
||||||
// =========================
|
// ==========================================================
|
||||||
modelBuilder.Entity<VigenciaLine>(e =>
|
// modelBuilder.Entity<TrocaNumeroLine>().HasIndex(x => x.Cliente);
|
||||||
{
|
// modelBuilder.Entity<TrocaNumeroLine>().HasIndex(x => x.LinhaAntiga);
|
||||||
e.HasIndex(x => x.Item);
|
// modelBuilder.Entity<TrocaNumeroLine>().HasIndex(x => x.LinhaNova);
|
||||||
e.HasIndex(x => x.Cliente);
|
|
||||||
e.HasIndex(x => x.Linha);
|
|
||||||
e.HasIndex(x => x.DtTerminoFidelizacao);
|
|
||||||
});
|
|
||||||
|
|
||||||
// =========================
|
|
||||||
// ✅ TROCA NÚMERO
|
|
||||||
// =========================
|
|
||||||
modelBuilder.Entity<TrocaNumeroLine>(e =>
|
|
||||||
{
|
|
||||||
e.HasIndex(x => x.Item);
|
|
||||||
e.HasIndex(x => x.LinhaAntiga);
|
|
||||||
e.HasIndex(x => x.LinhaNova);
|
|
||||||
e.HasIndex(x => x.ICCID);
|
|
||||||
e.HasIndex(x => x.DataTroca);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -98,16 +98,4 @@
|
||||||
{
|
{
|
||||||
public int Imported { get; set; }
|
public int Imported { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class LineOptionDto
|
|
||||||
{
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public int Item { get; set; }
|
|
||||||
public string? Linha { get; set; }
|
|
||||||
public string? Chip { get; set; }
|
|
||||||
public string? Cliente { get; set; }
|
|
||||||
public string? Usuario { get; set; }
|
|
||||||
public string? Skil { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace line_gestao_api.Dtos
|
|
||||||
{
|
|
||||||
public class MuregDetailDto
|
|
||||||
{
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public int Item { get; set; }
|
|
||||||
|
|
||||||
public string? LinhaAntiga { get; set; }
|
|
||||||
public string? LinhaNova { get; set; }
|
|
||||||
public string? ICCID { get; set; }
|
|
||||||
public DateTime? DataDaMureg { get; set; }
|
|
||||||
|
|
||||||
// ✅ FK para a linha “canônica” na GERAL
|
|
||||||
public Guid MobileLineId { get; set; }
|
|
||||||
|
|
||||||
// ✅ Dados vindos da GERAL (MobileLines)
|
|
||||||
public string? Cliente { get; set; }
|
|
||||||
public string? Usuario { get; set; }
|
|
||||||
public string? Skil { get; set; }
|
|
||||||
public string? LinhaAtualNaGeral { get; set; }
|
|
||||||
public string? ChipNaGeral { get; set; }
|
|
||||||
public string? ContaNaGeral { get; set; }
|
|
||||||
public string? StatusNaGeral { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -5,19 +5,11 @@ namespace line_gestao_api.Dtos
|
||||||
public class MuregListDto
|
public class MuregListDto
|
||||||
{
|
{
|
||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
|
|
||||||
public int Item { get; set; }
|
public int Item { get; set; }
|
||||||
|
|
||||||
public string? LinhaAntiga { get; set; }
|
public string? LinhaAntiga { get; set; }
|
||||||
public string? LinhaNova { get; set; }
|
public string? LinhaNova { get; set; }
|
||||||
public string? ICCID { get; set; }
|
public string? ICCID { get; set; }
|
||||||
|
|
||||||
public DateTime? DataDaMureg { get; set; }
|
public DateTime? DataDaMureg { get; set; }
|
||||||
|
|
||||||
// ✅ Cliente vem da MobileLine (GERAL)
|
|
||||||
public string? Cliente { get; set; }
|
public string? Cliente { get; set; }
|
||||||
|
|
||||||
// ✅ Novo: referência do registro "canônico" na GERAL
|
|
||||||
public Guid MobileLineId { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,91 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace line_gestao_api.Dtos
|
|
||||||
{
|
|
||||||
public class RelatoriosDashboardDto
|
|
||||||
{
|
|
||||||
public DashboardKpisDto Kpis { get; set; } = new();
|
|
||||||
public List<TopClienteDto> TopClientes { get; set; } = new();
|
|
||||||
public List<SerieMesDto> SerieMuregUltimos12Meses { get; set; } = new();
|
|
||||||
public List<SerieMesDto> SerieTrocaUltimos12Meses { get; set; } = new();
|
|
||||||
public List<MuregRecenteDto> MuregsRecentes { get; set; } = new();
|
|
||||||
public List<TrocaRecenteDto> TrocasRecentes { get; set; } = new();
|
|
||||||
|
|
||||||
// ✅ NOVO: VIGÊNCIA
|
|
||||||
public List<SerieMesDto> SerieVigenciaEncerramentosProx12Meses { get; set; } = new();
|
|
||||||
public VigenciaBucketsDto VigenciaBuckets { get; set; } = new();
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DashboardKpisDto
|
|
||||||
{
|
|
||||||
public int TotalLinhas { get; set; }
|
|
||||||
public int ClientesUnicos { get; set; }
|
|
||||||
public int Ativos { get; set; }
|
|
||||||
|
|
||||||
public int Bloqueados { get; set; }
|
|
||||||
public int BloqueadosPerdaRoubo { get; set; }
|
|
||||||
public int Bloqueados120Dias { get; set; }
|
|
||||||
public int BloqueadosOutros { get; set; }
|
|
||||||
|
|
||||||
public int Reservas { get; set; }
|
|
||||||
|
|
||||||
public int TotalMuregs { get; set; }
|
|
||||||
public int MuregsUltimos30Dias { get; set; }
|
|
||||||
|
|
||||||
public int TotalVigenciaLinhas { get; set; }
|
|
||||||
public int VigenciaVencidos { get; set; }
|
|
||||||
public int VigenciaAVencer30 { get; set; }
|
|
||||||
|
|
||||||
public int TotalTrocas { get; set; }
|
|
||||||
public int TrocasUltimos30Dias { get; set; }
|
|
||||||
|
|
||||||
public int UserDataRegistros { get; set; }
|
|
||||||
public int UserDataComCpf { get; set; }
|
|
||||||
public int UserDataComEmail { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class TopClienteDto
|
|
||||||
{
|
|
||||||
public string Cliente { get; set; } = "";
|
|
||||||
public int Linhas { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class SerieMesDto
|
|
||||||
{
|
|
||||||
public string Mes { get; set; } = "";
|
|
||||||
public int Total { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class VigenciaBucketsDto
|
|
||||||
{
|
|
||||||
public int Vencidos { get; set; }
|
|
||||||
public int AVencer0a30 { get; set; }
|
|
||||||
public int AVencer31a60 { get; set; }
|
|
||||||
public int AVencer61a90 { get; set; }
|
|
||||||
public int Acima90 { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class MuregRecenteDto
|
|
||||||
{
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public int Item { get; set; }
|
|
||||||
public string? LinhaAntiga { get; set; }
|
|
||||||
public string? LinhaNova { get; set; }
|
|
||||||
public string? ICCID { get; set; }
|
|
||||||
public DateTime? DataDaMureg { get; set; }
|
|
||||||
public string? Cliente { get; set; }
|
|
||||||
public Guid MobileLineId { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class TrocaRecenteDto
|
|
||||||
{
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public int Item { get; set; }
|
|
||||||
public string? LinhaAntiga { get; set; }
|
|
||||||
public string? LinhaNova { get; set; }
|
|
||||||
public string? ICCID { get; set; }
|
|
||||||
public DateTime? DataTroca { get; set; }
|
|
||||||
public string? Motivo { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,447 +0,0 @@
|
||||||
// <auto-generated />
|
|
||||||
using System;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|
||||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
|
||||||
using line_gestao_api.Data;
|
|
||||||
|
|
||||||
#nullable disable
|
|
||||||
|
|
||||||
namespace line_gestao_api.Migrations
|
|
||||||
{
|
|
||||||
[DbContext(typeof(AppDbContext))]
|
|
||||||
[Migration("20260113151828_AddMuregMobileLineRelations")]
|
|
||||||
partial class AddMuregMobileLineRelations
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
|
||||||
{
|
|
||||||
#pragma warning disable 612, 618
|
|
||||||
modelBuilder
|
|
||||||
.HasAnnotation("ProductVersion", "10.0.1")
|
|
||||||
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
|
||||||
|
|
||||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.BillingClient", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<string>("Aparelho")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Cliente")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(255)
|
|
||||||
.HasColumnType("character varying(255)");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("FormaPagamento")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<decimal?>("FranquiaLine")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("FranquiaVivo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<decimal?>("Lucro")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<int?>("QtdLinhas")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("Tipo")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(2)
|
|
||||||
.HasColumnType("character varying(2)");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<decimal?>("ValorContratoLine")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("ValorContratoVivo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("Cliente");
|
|
||||||
|
|
||||||
b.HasIndex("Item");
|
|
||||||
|
|
||||||
b.HasIndex("Tipo");
|
|
||||||
|
|
||||||
b.HasIndex("Tipo", "Cliente");
|
|
||||||
|
|
||||||
b.ToTable("billing_clients", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.MobileLine", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<string>("Cedente")
|
|
||||||
.HasMaxLength(150)
|
|
||||||
.HasColumnType("character varying(150)");
|
|
||||||
|
|
||||||
b.Property<string>("Chip")
|
|
||||||
.HasMaxLength(40)
|
|
||||||
.HasColumnType("character varying(40)");
|
|
||||||
|
|
||||||
b.Property<string>("Cliente")
|
|
||||||
.HasMaxLength(200)
|
|
||||||
.HasColumnType("character varying(200)");
|
|
||||||
|
|
||||||
b.Property<string>("Conta")
|
|
||||||
.HasMaxLength(80)
|
|
||||||
.HasColumnType("character varying(80)");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DataBloqueio")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DataEntregaCliente")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DataEntregaOpera")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<decimal?>("Desconto")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("FranquiaGestao")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("FranquiaLine")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("FranquiaVivo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("GestaoVozDados")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("Linha")
|
|
||||||
.HasMaxLength(30)
|
|
||||||
.HasColumnType("character varying(30)");
|
|
||||||
|
|
||||||
b.Property<decimal?>("LocacaoAp")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("Lucro")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<string>("Modalidade")
|
|
||||||
.HasMaxLength(80)
|
|
||||||
.HasColumnType("character varying(80)");
|
|
||||||
|
|
||||||
b.Property<string>("PlanoContrato")
|
|
||||||
.HasMaxLength(200)
|
|
||||||
.HasColumnType("character varying(200)");
|
|
||||||
|
|
||||||
b.Property<decimal?>("Skeelo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<string>("Skil")
|
|
||||||
.HasMaxLength(80)
|
|
||||||
.HasColumnType("character varying(80)");
|
|
||||||
|
|
||||||
b.Property<string>("Solicitante")
|
|
||||||
.HasMaxLength(150)
|
|
||||||
.HasColumnType("character varying(150)");
|
|
||||||
|
|
||||||
b.Property<string>("Status")
|
|
||||||
.HasMaxLength(80)
|
|
||||||
.HasColumnType("character varying(80)");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("Usuario")
|
|
||||||
.HasMaxLength(200)
|
|
||||||
.HasColumnType("character varying(200)");
|
|
||||||
|
|
||||||
b.Property<decimal?>("ValorContratoLine")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("ValorContratoVivo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("ValorPlanoVivo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<string>("VencConta")
|
|
||||||
.HasMaxLength(50)
|
|
||||||
.HasColumnType("character varying(50)");
|
|
||||||
|
|
||||||
b.Property<decimal?>("VivoGestaoDispositivo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("VivoNewsPlus")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("VivoTravelMundo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("Chip");
|
|
||||||
|
|
||||||
b.HasIndex("Cliente");
|
|
||||||
|
|
||||||
b.HasIndex("Linha")
|
|
||||||
.IsUnique();
|
|
||||||
|
|
||||||
b.ToTable("MobileLines");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.MuregLine", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DataDaMureg")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("ICCID")
|
|
||||||
.HasMaxLength(40)
|
|
||||||
.HasColumnType("character varying(40)");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("LinhaAntiga")
|
|
||||||
.HasMaxLength(30)
|
|
||||||
.HasColumnType("character varying(30)");
|
|
||||||
|
|
||||||
b.Property<string>("LinhaNova")
|
|
||||||
.HasMaxLength(30)
|
|
||||||
.HasColumnType("character varying(30)");
|
|
||||||
|
|
||||||
b.Property<Guid>("MobileLineId")
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("ICCID");
|
|
||||||
|
|
||||||
b.HasIndex("Item");
|
|
||||||
|
|
||||||
b.HasIndex("LinhaAntiga");
|
|
||||||
|
|
||||||
b.HasIndex("LinhaNova");
|
|
||||||
|
|
||||||
b.HasIndex("MobileLineId");
|
|
||||||
|
|
||||||
b.ToTable("MuregLines");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.TrocaNumeroLine", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DataTroca")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("ICCID")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("LinhaAntiga")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("LinhaNova")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Motivo")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Observacao")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.ToTable("TrocaNumeroLines");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.User", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("Email")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(120)
|
|
||||||
.HasColumnType("character varying(120)");
|
|
||||||
|
|
||||||
b.Property<string>("Name")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(120)
|
|
||||||
.HasColumnType("character varying(120)");
|
|
||||||
|
|
||||||
b.Property<string>("PasswordHash")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Phone")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(20)
|
|
||||||
.HasColumnType("character varying(20)");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("Email")
|
|
||||||
.IsUnique();
|
|
||||||
|
|
||||||
b.ToTable("Users");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.UserData", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<string>("Celular")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Cliente")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Cpf")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DataNascimento")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("Email")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Endereco")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("Linha")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Rg")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("TelefoneFixo")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.ToTable("UserDatas");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.VigenciaLine", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<string>("Cliente")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Conta")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DtEfetivacaoServico")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DtTerminoFidelizacao")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("Linha")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("PlanoContrato")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<decimal?>("Total")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("Usuario")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.ToTable("VigenciaLines");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.MuregLine", b =>
|
|
||||||
{
|
|
||||||
b.HasOne("line_gestao_api.Models.MobileLine", "MobileLine")
|
|
||||||
.WithMany("Muregs")
|
|
||||||
.HasForeignKey("MobileLineId")
|
|
||||||
.OnDelete(DeleteBehavior.Restrict)
|
|
||||||
.IsRequired();
|
|
||||||
|
|
||||||
b.Navigation("MobileLine");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.MobileLine", b =>
|
|
||||||
{
|
|
||||||
b.Navigation("Muregs");
|
|
||||||
});
|
|
||||||
#pragma warning restore 612, 618
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,157 +0,0 @@
|
||||||
using System;
|
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
|
|
||||||
#nullable disable
|
|
||||||
|
|
||||||
namespace line_gestao_api.Migrations
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
public partial class AddMuregMobileLineRelations : Migration
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void Up(MigrationBuilder migrationBuilder)
|
|
||||||
{
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_MuregLines_Cliente",
|
|
||||||
table: "MuregLines");
|
|
||||||
|
|
||||||
migrationBuilder.DropColumn(
|
|
||||||
name: "Cliente",
|
|
||||||
table: "MuregLines");
|
|
||||||
|
|
||||||
migrationBuilder.AlterColumn<string>(
|
|
||||||
name: "LinhaNova",
|
|
||||||
table: "MuregLines",
|
|
||||||
type: "character varying(30)",
|
|
||||||
maxLength: 30,
|
|
||||||
nullable: true,
|
|
||||||
oldClrType: typeof(string),
|
|
||||||
oldType: "text",
|
|
||||||
oldNullable: true);
|
|
||||||
|
|
||||||
migrationBuilder.AlterColumn<string>(
|
|
||||||
name: "LinhaAntiga",
|
|
||||||
table: "MuregLines",
|
|
||||||
type: "character varying(30)",
|
|
||||||
maxLength: 30,
|
|
||||||
nullable: true,
|
|
||||||
oldClrType: typeof(string),
|
|
||||||
oldType: "text",
|
|
||||||
oldNullable: true);
|
|
||||||
|
|
||||||
migrationBuilder.AlterColumn<string>(
|
|
||||||
name: "ICCID",
|
|
||||||
table: "MuregLines",
|
|
||||||
type: "character varying(40)",
|
|
||||||
maxLength: 40,
|
|
||||||
nullable: true,
|
|
||||||
oldClrType: typeof(string),
|
|
||||||
oldType: "text",
|
|
||||||
oldNullable: true);
|
|
||||||
|
|
||||||
migrationBuilder.AddColumn<Guid>(
|
|
||||||
name: "MobileLineId",
|
|
||||||
table: "MuregLines",
|
|
||||||
type: "uuid",
|
|
||||||
nullable: false,
|
|
||||||
defaultValue: new Guid("00000000-0000-0000-0000-000000000000"));
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_MuregLines_LinhaAntiga",
|
|
||||||
table: "MuregLines",
|
|
||||||
column: "LinhaAntiga");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_MuregLines_MobileLineId",
|
|
||||||
table: "MuregLines",
|
|
||||||
column: "MobileLineId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_MobileLines_Chip",
|
|
||||||
table: "MobileLines",
|
|
||||||
column: "Chip");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_MobileLines_Cliente",
|
|
||||||
table: "MobileLines",
|
|
||||||
column: "Cliente");
|
|
||||||
|
|
||||||
migrationBuilder.AddForeignKey(
|
|
||||||
name: "FK_MuregLines_MobileLines_MobileLineId",
|
|
||||||
table: "MuregLines",
|
|
||||||
column: "MobileLineId",
|
|
||||||
principalTable: "MobileLines",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Restrict);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void Down(MigrationBuilder migrationBuilder)
|
|
||||||
{
|
|
||||||
migrationBuilder.DropForeignKey(
|
|
||||||
name: "FK_MuregLines_MobileLines_MobileLineId",
|
|
||||||
table: "MuregLines");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_MuregLines_LinhaAntiga",
|
|
||||||
table: "MuregLines");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_MuregLines_MobileLineId",
|
|
||||||
table: "MuregLines");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_MobileLines_Chip",
|
|
||||||
table: "MobileLines");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_MobileLines_Cliente",
|
|
||||||
table: "MobileLines");
|
|
||||||
|
|
||||||
migrationBuilder.DropColumn(
|
|
||||||
name: "MobileLineId",
|
|
||||||
table: "MuregLines");
|
|
||||||
|
|
||||||
migrationBuilder.AlterColumn<string>(
|
|
||||||
name: "LinhaNova",
|
|
||||||
table: "MuregLines",
|
|
||||||
type: "text",
|
|
||||||
nullable: true,
|
|
||||||
oldClrType: typeof(string),
|
|
||||||
oldType: "character varying(30)",
|
|
||||||
oldMaxLength: 30,
|
|
||||||
oldNullable: true);
|
|
||||||
|
|
||||||
migrationBuilder.AlterColumn<string>(
|
|
||||||
name: "LinhaAntiga",
|
|
||||||
table: "MuregLines",
|
|
||||||
type: "text",
|
|
||||||
nullable: true,
|
|
||||||
oldClrType: typeof(string),
|
|
||||||
oldType: "character varying(30)",
|
|
||||||
oldMaxLength: 30,
|
|
||||||
oldNullable: true);
|
|
||||||
|
|
||||||
migrationBuilder.AlterColumn<string>(
|
|
||||||
name: "ICCID",
|
|
||||||
table: "MuregLines",
|
|
||||||
type: "text",
|
|
||||||
nullable: true,
|
|
||||||
oldClrType: typeof(string),
|
|
||||||
oldType: "character varying(40)",
|
|
||||||
oldMaxLength: 40,
|
|
||||||
oldNullable: true);
|
|
||||||
|
|
||||||
migrationBuilder.AddColumn<string>(
|
|
||||||
name: "Cliente",
|
|
||||||
table: "MuregLines",
|
|
||||||
type: "text",
|
|
||||||
nullable: true);
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_MuregLines_Cliente",
|
|
||||||
table: "MuregLines",
|
|
||||||
column: "Cliente");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,447 +0,0 @@
|
||||||
// <auto-generated />
|
|
||||||
using System;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|
||||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
|
||||||
using line_gestao_api.Data;
|
|
||||||
|
|
||||||
#nullable disable
|
|
||||||
|
|
||||||
namespace line_gestao_api.Migrations
|
|
||||||
{
|
|
||||||
[DbContext(typeof(AppDbContext))]
|
|
||||||
[Migration("20260120204206_AddMuregMobileLineFk")]
|
|
||||||
partial class AddMuregMobileLineFk
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
|
||||||
{
|
|
||||||
#pragma warning disable 612, 618
|
|
||||||
modelBuilder
|
|
||||||
.HasAnnotation("ProductVersion", "10.0.1")
|
|
||||||
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
|
||||||
|
|
||||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.BillingClient", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<string>("Aparelho")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Cliente")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(255)
|
|
||||||
.HasColumnType("character varying(255)");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("FormaPagamento")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<decimal?>("FranquiaLine")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("FranquiaVivo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<decimal?>("Lucro")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<int?>("QtdLinhas")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("Tipo")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(2)
|
|
||||||
.HasColumnType("character varying(2)");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<decimal?>("ValorContratoLine")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("ValorContratoVivo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("Cliente");
|
|
||||||
|
|
||||||
b.HasIndex("Item");
|
|
||||||
|
|
||||||
b.HasIndex("Tipo");
|
|
||||||
|
|
||||||
b.HasIndex("Tipo", "Cliente");
|
|
||||||
|
|
||||||
b.ToTable("billing_clients", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.MobileLine", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<string>("Cedente")
|
|
||||||
.HasMaxLength(150)
|
|
||||||
.HasColumnType("character varying(150)");
|
|
||||||
|
|
||||||
b.Property<string>("Chip")
|
|
||||||
.HasMaxLength(40)
|
|
||||||
.HasColumnType("character varying(40)");
|
|
||||||
|
|
||||||
b.Property<string>("Cliente")
|
|
||||||
.HasMaxLength(200)
|
|
||||||
.HasColumnType("character varying(200)");
|
|
||||||
|
|
||||||
b.Property<string>("Conta")
|
|
||||||
.HasMaxLength(80)
|
|
||||||
.HasColumnType("character varying(80)");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DataBloqueio")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DataEntregaCliente")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DataEntregaOpera")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<decimal?>("Desconto")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("FranquiaGestao")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("FranquiaLine")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("FranquiaVivo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("GestaoVozDados")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("Linha")
|
|
||||||
.HasMaxLength(30)
|
|
||||||
.HasColumnType("character varying(30)");
|
|
||||||
|
|
||||||
b.Property<decimal?>("LocacaoAp")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("Lucro")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<string>("Modalidade")
|
|
||||||
.HasMaxLength(80)
|
|
||||||
.HasColumnType("character varying(80)");
|
|
||||||
|
|
||||||
b.Property<string>("PlanoContrato")
|
|
||||||
.HasMaxLength(200)
|
|
||||||
.HasColumnType("character varying(200)");
|
|
||||||
|
|
||||||
b.Property<decimal?>("Skeelo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<string>("Skil")
|
|
||||||
.HasMaxLength(80)
|
|
||||||
.HasColumnType("character varying(80)");
|
|
||||||
|
|
||||||
b.Property<string>("Solicitante")
|
|
||||||
.HasMaxLength(150)
|
|
||||||
.HasColumnType("character varying(150)");
|
|
||||||
|
|
||||||
b.Property<string>("Status")
|
|
||||||
.HasMaxLength(80)
|
|
||||||
.HasColumnType("character varying(80)");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("Usuario")
|
|
||||||
.HasMaxLength(200)
|
|
||||||
.HasColumnType("character varying(200)");
|
|
||||||
|
|
||||||
b.Property<decimal?>("ValorContratoLine")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("ValorContratoVivo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("ValorPlanoVivo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<string>("VencConta")
|
|
||||||
.HasMaxLength(50)
|
|
||||||
.HasColumnType("character varying(50)");
|
|
||||||
|
|
||||||
b.Property<decimal?>("VivoGestaoDispositivo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("VivoNewsPlus")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("VivoTravelMundo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("Chip");
|
|
||||||
|
|
||||||
b.HasIndex("Cliente");
|
|
||||||
|
|
||||||
b.HasIndex("Linha")
|
|
||||||
.IsUnique();
|
|
||||||
|
|
||||||
b.ToTable("MobileLines");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.MuregLine", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DataDaMureg")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("ICCID")
|
|
||||||
.HasMaxLength(40)
|
|
||||||
.HasColumnType("character varying(40)");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("LinhaAntiga")
|
|
||||||
.HasMaxLength(30)
|
|
||||||
.HasColumnType("character varying(30)");
|
|
||||||
|
|
||||||
b.Property<string>("LinhaNova")
|
|
||||||
.HasMaxLength(30)
|
|
||||||
.HasColumnType("character varying(30)");
|
|
||||||
|
|
||||||
b.Property<Guid>("MobileLineId")
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("ICCID");
|
|
||||||
|
|
||||||
b.HasIndex("Item");
|
|
||||||
|
|
||||||
b.HasIndex("LinhaAntiga");
|
|
||||||
|
|
||||||
b.HasIndex("LinhaNova");
|
|
||||||
|
|
||||||
b.HasIndex("MobileLineId");
|
|
||||||
|
|
||||||
b.ToTable("MuregLines");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.TrocaNumeroLine", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DataTroca")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("ICCID")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("LinhaAntiga")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("LinhaNova")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Motivo")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Observacao")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.ToTable("TrocaNumeroLines");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.User", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("Email")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(120)
|
|
||||||
.HasColumnType("character varying(120)");
|
|
||||||
|
|
||||||
b.Property<string>("Name")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(120)
|
|
||||||
.HasColumnType("character varying(120)");
|
|
||||||
|
|
||||||
b.Property<string>("PasswordHash")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Phone")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(20)
|
|
||||||
.HasColumnType("character varying(20)");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("Email")
|
|
||||||
.IsUnique();
|
|
||||||
|
|
||||||
b.ToTable("Users");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.UserData", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<string>("Celular")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Cliente")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Cpf")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DataNascimento")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("Email")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Endereco")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("Linha")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Rg")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("TelefoneFixo")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.ToTable("UserDatas");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.VigenciaLine", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<string>("Cliente")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Conta")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DtEfetivacaoServico")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DtTerminoFidelizacao")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("Linha")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("PlanoContrato")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<decimal?>("Total")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("Usuario")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.ToTable("VigenciaLines");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.MuregLine", b =>
|
|
||||||
{
|
|
||||||
b.HasOne("line_gestao_api.Models.MobileLine", "MobileLine")
|
|
||||||
.WithMany("Muregs")
|
|
||||||
.HasForeignKey("MobileLineId")
|
|
||||||
.OnDelete(DeleteBehavior.Restrict)
|
|
||||||
.IsRequired();
|
|
||||||
|
|
||||||
b.Navigation("MobileLine");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.MobileLine", b =>
|
|
||||||
{
|
|
||||||
b.Navigation("Muregs");
|
|
||||||
});
|
|
||||||
#pragma warning restore 612, 618
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
|
|
||||||
#nullable disable
|
|
||||||
|
|
||||||
namespace line_gestao_api.Migrations
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
public partial class AddMuregMobileLineFk : Migration
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void Up(MigrationBuilder migrationBuilder)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void Down(MigrationBuilder migrationBuilder)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,481 +0,0 @@
|
||||||
// <auto-generated />
|
|
||||||
using System;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|
||||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
|
||||||
using line_gestao_api.Data;
|
|
||||||
|
|
||||||
#nullable disable
|
|
||||||
|
|
||||||
namespace line_gestao_api.Migrations
|
|
||||||
{
|
|
||||||
[DbContext(typeof(AppDbContext))]
|
|
||||||
[Migration("20260121190524_AddIndexesReportsSupport")]
|
|
||||||
partial class AddIndexesReportsSupport
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
|
||||||
{
|
|
||||||
#pragma warning disable 612, 618
|
|
||||||
modelBuilder
|
|
||||||
.HasAnnotation("ProductVersion", "10.0.1")
|
|
||||||
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
|
||||||
|
|
||||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.BillingClient", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<string>("Aparelho")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Cliente")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(255)
|
|
||||||
.HasColumnType("character varying(255)");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("FormaPagamento")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<decimal?>("FranquiaLine")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("FranquiaVivo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<decimal?>("Lucro")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<int?>("QtdLinhas")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("Tipo")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(2)
|
|
||||||
.HasColumnType("character varying(2)");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<decimal?>("ValorContratoLine")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("ValorContratoVivo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("Cliente");
|
|
||||||
|
|
||||||
b.HasIndex("Item");
|
|
||||||
|
|
||||||
b.HasIndex("Tipo");
|
|
||||||
|
|
||||||
b.HasIndex("Tipo", "Cliente");
|
|
||||||
|
|
||||||
b.ToTable("billing_clients", (string)null);
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.MobileLine", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<string>("Cedente")
|
|
||||||
.HasMaxLength(150)
|
|
||||||
.HasColumnType("character varying(150)");
|
|
||||||
|
|
||||||
b.Property<string>("Chip")
|
|
||||||
.HasMaxLength(40)
|
|
||||||
.HasColumnType("character varying(40)");
|
|
||||||
|
|
||||||
b.Property<string>("Cliente")
|
|
||||||
.HasMaxLength(200)
|
|
||||||
.HasColumnType("character varying(200)");
|
|
||||||
|
|
||||||
b.Property<string>("Conta")
|
|
||||||
.HasMaxLength(80)
|
|
||||||
.HasColumnType("character varying(80)");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DataBloqueio")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DataEntregaCliente")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DataEntregaOpera")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<decimal?>("Desconto")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("FranquiaGestao")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("FranquiaLine")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("FranquiaVivo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("GestaoVozDados")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("Linha")
|
|
||||||
.HasMaxLength(30)
|
|
||||||
.HasColumnType("character varying(30)");
|
|
||||||
|
|
||||||
b.Property<decimal?>("LocacaoAp")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("Lucro")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<string>("Modalidade")
|
|
||||||
.HasMaxLength(80)
|
|
||||||
.HasColumnType("character varying(80)");
|
|
||||||
|
|
||||||
b.Property<string>("PlanoContrato")
|
|
||||||
.HasMaxLength(200)
|
|
||||||
.HasColumnType("character varying(200)");
|
|
||||||
|
|
||||||
b.Property<decimal?>("Skeelo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<string>("Skil")
|
|
||||||
.HasMaxLength(80)
|
|
||||||
.HasColumnType("character varying(80)");
|
|
||||||
|
|
||||||
b.Property<string>("Solicitante")
|
|
||||||
.HasMaxLength(150)
|
|
||||||
.HasColumnType("character varying(150)");
|
|
||||||
|
|
||||||
b.Property<string>("Status")
|
|
||||||
.HasMaxLength(80)
|
|
||||||
.HasColumnType("character varying(80)");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("Usuario")
|
|
||||||
.HasMaxLength(200)
|
|
||||||
.HasColumnType("character varying(200)");
|
|
||||||
|
|
||||||
b.Property<decimal?>("ValorContratoLine")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("ValorContratoVivo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("ValorPlanoVivo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<string>("VencConta")
|
|
||||||
.HasMaxLength(50)
|
|
||||||
.HasColumnType("character varying(50)");
|
|
||||||
|
|
||||||
b.Property<decimal?>("VivoGestaoDispositivo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("VivoNewsPlus")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<decimal?>("VivoTravelMundo")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("Chip");
|
|
||||||
|
|
||||||
b.HasIndex("Cliente");
|
|
||||||
|
|
||||||
b.HasIndex("Linha")
|
|
||||||
.IsUnique();
|
|
||||||
|
|
||||||
b.HasIndex("Skil");
|
|
||||||
|
|
||||||
b.HasIndex("Status");
|
|
||||||
|
|
||||||
b.HasIndex("Usuario");
|
|
||||||
|
|
||||||
b.ToTable("MobileLines");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.MuregLine", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DataDaMureg")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("ICCID")
|
|
||||||
.HasMaxLength(40)
|
|
||||||
.HasColumnType("character varying(40)");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("LinhaAntiga")
|
|
||||||
.HasMaxLength(30)
|
|
||||||
.HasColumnType("character varying(30)");
|
|
||||||
|
|
||||||
b.Property<string>("LinhaNova")
|
|
||||||
.HasMaxLength(30)
|
|
||||||
.HasColumnType("character varying(30)");
|
|
||||||
|
|
||||||
b.Property<Guid>("MobileLineId")
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("ICCID");
|
|
||||||
|
|
||||||
b.HasIndex("Item");
|
|
||||||
|
|
||||||
b.HasIndex("LinhaAntiga");
|
|
||||||
|
|
||||||
b.HasIndex("LinhaNova");
|
|
||||||
|
|
||||||
b.HasIndex("MobileLineId");
|
|
||||||
|
|
||||||
b.ToTable("MuregLines");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.TrocaNumeroLine", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DataTroca")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("ICCID")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("LinhaAntiga")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("LinhaNova")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Motivo")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Observacao")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("DataTroca");
|
|
||||||
|
|
||||||
b.HasIndex("ICCID");
|
|
||||||
|
|
||||||
b.HasIndex("Item");
|
|
||||||
|
|
||||||
b.HasIndex("LinhaAntiga");
|
|
||||||
|
|
||||||
b.HasIndex("LinhaNova");
|
|
||||||
|
|
||||||
b.ToTable("TrocaNumeroLines");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.User", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("Email")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(120)
|
|
||||||
.HasColumnType("character varying(120)");
|
|
||||||
|
|
||||||
b.Property<string>("Name")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(120)
|
|
||||||
.HasColumnType("character varying(120)");
|
|
||||||
|
|
||||||
b.Property<string>("PasswordHash")
|
|
||||||
.IsRequired()
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Phone")
|
|
||||||
.IsRequired()
|
|
||||||
.HasMaxLength(20)
|
|
||||||
.HasColumnType("character varying(20)");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("Email")
|
|
||||||
.IsUnique();
|
|
||||||
|
|
||||||
b.ToTable("Users");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.UserData", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<string>("Celular")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Cliente")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Cpf")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DataNascimento")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("Email")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Endereco")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("Linha")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Rg")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("TelefoneFixo")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("Cliente");
|
|
||||||
|
|
||||||
b.HasIndex("Cpf");
|
|
||||||
|
|
||||||
b.HasIndex("Email");
|
|
||||||
|
|
||||||
b.HasIndex("Item");
|
|
||||||
|
|
||||||
b.HasIndex("Linha");
|
|
||||||
|
|
||||||
b.ToTable("UserDatas");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.VigenciaLine", b =>
|
|
||||||
{
|
|
||||||
b.Property<Guid>("Id")
|
|
||||||
.ValueGeneratedOnAdd()
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<string>("Cliente")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("Conta")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DtEfetivacaoServico")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<DateTime?>("DtTerminoFidelizacao")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
|
||||||
.HasColumnType("integer");
|
|
||||||
|
|
||||||
b.Property<string>("Linha")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<string>("PlanoContrato")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.Property<decimal?>("Total")
|
|
||||||
.HasColumnType("numeric");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
|
||||||
.HasColumnType("timestamp with time zone");
|
|
||||||
|
|
||||||
b.Property<string>("Usuario")
|
|
||||||
.HasColumnType("text");
|
|
||||||
|
|
||||||
b.HasKey("Id");
|
|
||||||
|
|
||||||
b.HasIndex("Cliente");
|
|
||||||
|
|
||||||
b.HasIndex("DtTerminoFidelizacao");
|
|
||||||
|
|
||||||
b.HasIndex("Item");
|
|
||||||
|
|
||||||
b.HasIndex("Linha");
|
|
||||||
|
|
||||||
b.ToTable("VigenciaLines");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.MuregLine", b =>
|
|
||||||
{
|
|
||||||
b.HasOne("line_gestao_api.Models.MobileLine", "MobileLine")
|
|
||||||
.WithMany("Muregs")
|
|
||||||
.HasForeignKey("MobileLineId")
|
|
||||||
.OnDelete(DeleteBehavior.Restrict)
|
|
||||||
.IsRequired();
|
|
||||||
|
|
||||||
b.Navigation("MobileLine");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.MobileLine", b =>
|
|
||||||
{
|
|
||||||
b.Navigation("Muregs");
|
|
||||||
});
|
|
||||||
#pragma warning restore 612, 618
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,171 +0,0 @@
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
|
|
||||||
#nullable disable
|
|
||||||
|
|
||||||
namespace line_gestao_api.Migrations
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
public partial class AddIndexesReportsSupport : Migration
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void Up(MigrationBuilder migrationBuilder)
|
|
||||||
{
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_VigenciaLines_Cliente",
|
|
||||||
table: "VigenciaLines",
|
|
||||||
column: "Cliente");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_VigenciaLines_DtTerminoFidelizacao",
|
|
||||||
table: "VigenciaLines",
|
|
||||||
column: "DtTerminoFidelizacao");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_VigenciaLines_Item",
|
|
||||||
table: "VigenciaLines",
|
|
||||||
column: "Item");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_VigenciaLines_Linha",
|
|
||||||
table: "VigenciaLines",
|
|
||||||
column: "Linha");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_UserDatas_Cliente",
|
|
||||||
table: "UserDatas",
|
|
||||||
column: "Cliente");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_UserDatas_Cpf",
|
|
||||||
table: "UserDatas",
|
|
||||||
column: "Cpf");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_UserDatas_Email",
|
|
||||||
table: "UserDatas",
|
|
||||||
column: "Email");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_UserDatas_Item",
|
|
||||||
table: "UserDatas",
|
|
||||||
column: "Item");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_UserDatas_Linha",
|
|
||||||
table: "UserDatas",
|
|
||||||
column: "Linha");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_TrocaNumeroLines_DataTroca",
|
|
||||||
table: "TrocaNumeroLines",
|
|
||||||
column: "DataTroca");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_TrocaNumeroLines_ICCID",
|
|
||||||
table: "TrocaNumeroLines",
|
|
||||||
column: "ICCID");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_TrocaNumeroLines_Item",
|
|
||||||
table: "TrocaNumeroLines",
|
|
||||||
column: "Item");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_TrocaNumeroLines_LinhaAntiga",
|
|
||||||
table: "TrocaNumeroLines",
|
|
||||||
column: "LinhaAntiga");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_TrocaNumeroLines_LinhaNova",
|
|
||||||
table: "TrocaNumeroLines",
|
|
||||||
column: "LinhaNova");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_MobileLines_Skil",
|
|
||||||
table: "MobileLines",
|
|
||||||
column: "Skil");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_MobileLines_Status",
|
|
||||||
table: "MobileLines",
|
|
||||||
column: "Status");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_MobileLines_Usuario",
|
|
||||||
table: "MobileLines",
|
|
||||||
column: "Usuario");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void Down(MigrationBuilder migrationBuilder)
|
|
||||||
{
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_VigenciaLines_Cliente",
|
|
||||||
table: "VigenciaLines");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_VigenciaLines_DtTerminoFidelizacao",
|
|
||||||
table: "VigenciaLines");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_VigenciaLines_Item",
|
|
||||||
table: "VigenciaLines");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_VigenciaLines_Linha",
|
|
||||||
table: "VigenciaLines");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_UserDatas_Cliente",
|
|
||||||
table: "UserDatas");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_UserDatas_Cpf",
|
|
||||||
table: "UserDatas");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_UserDatas_Email",
|
|
||||||
table: "UserDatas");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_UserDatas_Item",
|
|
||||||
table: "UserDatas");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_UserDatas_Linha",
|
|
||||||
table: "UserDatas");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_TrocaNumeroLines_DataTroca",
|
|
||||||
table: "TrocaNumeroLines");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_TrocaNumeroLines_ICCID",
|
|
||||||
table: "TrocaNumeroLines");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_TrocaNumeroLines_Item",
|
|
||||||
table: "TrocaNumeroLines");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_TrocaNumeroLines_LinhaAntiga",
|
|
||||||
table: "TrocaNumeroLines");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_TrocaNumeroLines_LinhaNova",
|
|
||||||
table: "TrocaNumeroLines");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_MobileLines_Skil",
|
|
||||||
table: "MobileLines");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_MobileLines_Status",
|
|
||||||
table: "MobileLines");
|
|
||||||
|
|
||||||
migrationBuilder.DropIndex(
|
|
||||||
name: "IX_MobileLines_Usuario",
|
|
||||||
table: "MobileLines");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -200,19 +200,9 @@ namespace line_gestao_api.Migrations
|
||||||
|
|
||||||
b.HasKey("Id");
|
b.HasKey("Id");
|
||||||
|
|
||||||
b.HasIndex("Chip");
|
|
||||||
|
|
||||||
b.HasIndex("Cliente");
|
|
||||||
|
|
||||||
b.HasIndex("Linha")
|
b.HasIndex("Linha")
|
||||||
.IsUnique();
|
.IsUnique();
|
||||||
|
|
||||||
b.HasIndex("Skil");
|
|
||||||
|
|
||||||
b.HasIndex("Status");
|
|
||||||
|
|
||||||
b.HasIndex("Usuario");
|
|
||||||
|
|
||||||
b.ToTable("MobileLines");
|
b.ToTable("MobileLines");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -222,6 +212,9 @@ namespace line_gestao_api.Migrations
|
||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
.HasColumnType("uuid");
|
.HasColumnType("uuid");
|
||||||
|
|
||||||
|
b.Property<string>("Cliente")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
b.Property<DateTime>("CreatedAt")
|
b.Property<DateTime>("CreatedAt")
|
||||||
.HasColumnType("timestamp with time zone");
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
|
@ -229,38 +222,30 @@ namespace line_gestao_api.Migrations
|
||||||
.HasColumnType("timestamp with time zone");
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
b.Property<string>("ICCID")
|
b.Property<string>("ICCID")
|
||||||
.HasMaxLength(40)
|
.HasColumnType("text");
|
||||||
.HasColumnType("character varying(40)");
|
|
||||||
|
|
||||||
b.Property<int>("Item")
|
b.Property<int>("Item")
|
||||||
.HasColumnType("integer");
|
.HasColumnType("integer");
|
||||||
|
|
||||||
b.Property<string>("LinhaAntiga")
|
b.Property<string>("LinhaAntiga")
|
||||||
.HasMaxLength(30)
|
.HasColumnType("text");
|
||||||
.HasColumnType("character varying(30)");
|
|
||||||
|
|
||||||
b.Property<string>("LinhaNova")
|
b.Property<string>("LinhaNova")
|
||||||
.HasMaxLength(30)
|
.HasColumnType("text");
|
||||||
.HasColumnType("character varying(30)");
|
|
||||||
|
|
||||||
b.Property<Guid>("MobileLineId")
|
|
||||||
.HasColumnType("uuid");
|
|
||||||
|
|
||||||
b.Property<DateTime>("UpdatedAt")
|
b.Property<DateTime>("UpdatedAt")
|
||||||
.HasColumnType("timestamp with time zone");
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
b.HasKey("Id");
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("Cliente");
|
||||||
|
|
||||||
b.HasIndex("ICCID");
|
b.HasIndex("ICCID");
|
||||||
|
|
||||||
b.HasIndex("Item");
|
b.HasIndex("Item");
|
||||||
|
|
||||||
b.HasIndex("LinhaAntiga");
|
|
||||||
|
|
||||||
b.HasIndex("LinhaNova");
|
b.HasIndex("LinhaNova");
|
||||||
|
|
||||||
b.HasIndex("MobileLineId");
|
|
||||||
|
|
||||||
b.ToTable("MuregLines");
|
b.ToTable("MuregLines");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -299,16 +284,6 @@ namespace line_gestao_api.Migrations
|
||||||
|
|
||||||
b.HasKey("Id");
|
b.HasKey("Id");
|
||||||
|
|
||||||
b.HasIndex("DataTroca");
|
|
||||||
|
|
||||||
b.HasIndex("ICCID");
|
|
||||||
|
|
||||||
b.HasIndex("Item");
|
|
||||||
|
|
||||||
b.HasIndex("LinhaAntiga");
|
|
||||||
|
|
||||||
b.HasIndex("LinhaNova");
|
|
||||||
|
|
||||||
b.ToTable("TrocaNumeroLines");
|
b.ToTable("TrocaNumeroLines");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -392,16 +367,6 @@ namespace line_gestao_api.Migrations
|
||||||
|
|
||||||
b.HasKey("Id");
|
b.HasKey("Id");
|
||||||
|
|
||||||
b.HasIndex("Cliente");
|
|
||||||
|
|
||||||
b.HasIndex("Cpf");
|
|
||||||
|
|
||||||
b.HasIndex("Email");
|
|
||||||
|
|
||||||
b.HasIndex("Item");
|
|
||||||
|
|
||||||
b.HasIndex("Linha");
|
|
||||||
|
|
||||||
b.ToTable("UserDatas");
|
b.ToTable("UserDatas");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -446,32 +411,8 @@ namespace line_gestao_api.Migrations
|
||||||
|
|
||||||
b.HasKey("Id");
|
b.HasKey("Id");
|
||||||
|
|
||||||
b.HasIndex("Cliente");
|
|
||||||
|
|
||||||
b.HasIndex("DtTerminoFidelizacao");
|
|
||||||
|
|
||||||
b.HasIndex("Item");
|
|
||||||
|
|
||||||
b.HasIndex("Linha");
|
|
||||||
|
|
||||||
b.ToTable("VigenciaLines");
|
b.ToTable("VigenciaLines");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.MuregLine", b =>
|
|
||||||
{
|
|
||||||
b.HasOne("line_gestao_api.Models.MobileLine", "MobileLine")
|
|
||||||
.WithMany("Muregs")
|
|
||||||
.HasForeignKey("MobileLineId")
|
|
||||||
.OnDelete(DeleteBehavior.Restrict)
|
|
||||||
.IsRequired();
|
|
||||||
|
|
||||||
b.Navigation("MobileLine");
|
|
||||||
});
|
|
||||||
|
|
||||||
modelBuilder.Entity("line_gestao_api.Models.MobileLine", b =>
|
|
||||||
{
|
|
||||||
b.Navigation("Muregs");
|
|
||||||
});
|
|
||||||
#pragma warning restore 612, 618
|
#pragma warning restore 612, 618
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,62 +6,62 @@ namespace line_gestao_api.Models
|
||||||
{
|
{
|
||||||
public Guid Id { get; set; } = Guid.NewGuid();
|
public Guid Id { get; set; } = Guid.NewGuid();
|
||||||
|
|
||||||
public int Item { get; set; }
|
// ===== Planilha (GERAL) =====
|
||||||
|
public int Item { get; set; } // ITÉM
|
||||||
[MaxLength(80)]
|
[MaxLength(80)]
|
||||||
public string? Conta { get; set; }
|
public string? Conta { get; set; } // CONTA
|
||||||
[MaxLength(30)]
|
[MaxLength(30)]
|
||||||
public string? Linha { get; set; }
|
public string? Linha { get; set; } // LINHA (telefone)
|
||||||
[MaxLength(40)]
|
[MaxLength(40)]
|
||||||
public string? Chip { get; set; }
|
public string? Chip { get; set; } // CHIP
|
||||||
|
|
||||||
[MaxLength(200)]
|
[MaxLength(200)]
|
||||||
public string? Cliente { get; set; }
|
public string? Cliente { get; set; } // CLIENTE
|
||||||
[MaxLength(200)]
|
[MaxLength(200)]
|
||||||
public string? Usuario { get; set; }
|
public string? Usuario { get; set; } // USUÁRIO
|
||||||
[MaxLength(200)]
|
[MaxLength(200)]
|
||||||
public string? PlanoContrato { get; set; }
|
public string? PlanoContrato { get; set; } // PLANO CONTRATO
|
||||||
|
|
||||||
public decimal? FranquiaVivo { get; set; }
|
// ===== Valores Vivo (ROXO no modal do front) =====
|
||||||
public decimal? ValorPlanoVivo { get; set; }
|
public decimal? FranquiaVivo { get; set; } // FRAQUIA
|
||||||
public decimal? GestaoVozDados { get; set; }
|
public decimal? ValorPlanoVivo { get; set; } // VALOR DO PLANO R$
|
||||||
public decimal? Skeelo { get; set; }
|
public decimal? GestaoVozDados { get; set; } // GESTÃO VOZ E DADOS R$
|
||||||
public decimal? VivoNewsPlus { get; set; }
|
public decimal? Skeelo { get; set; } // SKEELO
|
||||||
public decimal? VivoTravelMundo { get; set; }
|
public decimal? VivoNewsPlus { get; set; } // VIVO NEWS PLUS
|
||||||
public decimal? VivoGestaoDispositivo { get; set; }
|
public decimal? VivoTravelMundo { get; set; } // VIVO TRAVEL MUNDO
|
||||||
public decimal? ValorContratoVivo { get; set; }
|
public decimal? VivoGestaoDispositivo { get; set; } // VIVO GESTÃO DISPOSITIVO
|
||||||
|
public decimal? ValorContratoVivo { get; set; } // VALOR CONTRATO VIVO
|
||||||
|
|
||||||
public decimal? FranquiaLine { get; set; }
|
// ===== Valores Line Móvel (paleta do sistema no modal) =====
|
||||||
public decimal? FranquiaGestao { get; set; }
|
public decimal? FranquiaLine { get; set; } // FRANQUIA LINE
|
||||||
public decimal? LocacaoAp { get; set; }
|
public decimal? FranquiaGestao { get; set; } // FRANQUIA GESTÃO
|
||||||
public decimal? ValorContratoLine { get; set; }
|
public decimal? LocacaoAp { get; set; } // LOCAÇÃO AP.
|
||||||
|
public decimal? ValorContratoLine { get; set; } // VALOR CONTRATO LINE
|
||||||
|
|
||||||
public decimal? Desconto { get; set; }
|
public decimal? Desconto { get; set; } // DESCONTO
|
||||||
public decimal? Lucro { get; set; }
|
public decimal? Lucro { get; set; } // LUCRO
|
||||||
|
|
||||||
[MaxLength(80)]
|
[MaxLength(80)]
|
||||||
public string? Status { get; set; }
|
public string? Status { get; set; } // STATUS
|
||||||
public DateTime? DataBloqueio { get; set; }
|
public DateTime? DataBloqueio { get; set; } // DATA DO BLOQUEIO
|
||||||
|
|
||||||
[MaxLength(80)]
|
[MaxLength(80)]
|
||||||
public string? Skil { get; set; }
|
public string? Skil { get; set; } // SKIL
|
||||||
[MaxLength(80)]
|
[MaxLength(80)]
|
||||||
public string? Modalidade { get; set; }
|
public string? Modalidade { get; set; } // MODALIDADE
|
||||||
|
|
||||||
[MaxLength(150)]
|
[MaxLength(150)]
|
||||||
public string? Cedente { get; set; }
|
public string? Cedente { get; set; } // CEDENTE
|
||||||
[MaxLength(150)]
|
[MaxLength(150)]
|
||||||
public string? Solicitante { get; set; }
|
public string? Solicitante { get; set; } // SOLICITANTE
|
||||||
|
|
||||||
public DateTime? DataEntregaOpera { get; set; }
|
public DateTime? DataEntregaOpera { get; set; } // DATA DA ENTREGA OPERA.
|
||||||
public DateTime? DataEntregaCliente { get; set; }
|
public DateTime? DataEntregaCliente { get; set; } // DATA DA ENTREGA CLIENTE
|
||||||
|
|
||||||
[MaxLength(50)]
|
[MaxLength(50)]
|
||||||
public string? VencConta { get; set; }
|
public string? VencConta { get; set; } // VENC. DA CONTA
|
||||||
|
|
||||||
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
|
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
|
||||||
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
|
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
|
||||||
|
|
||||||
// ✅ Navegação (1 MobileLine -> N Muregs)
|
|
||||||
public ICollection<MuregLine> Muregs { get; set; } = new List<MuregLine>();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System;
|
||||||
|
|
||||||
namespace line_gestao_api.Models
|
namespace line_gestao_api.Models
|
||||||
{
|
{
|
||||||
|
|
@ -8,23 +8,13 @@ namespace line_gestao_api.Models
|
||||||
|
|
||||||
public int Item { get; set; }
|
public int Item { get; set; }
|
||||||
|
|
||||||
// Linha escolhida da GERAL no momento do mureg
|
|
||||||
[MaxLength(30)]
|
|
||||||
public string? LinhaAntiga { get; set; }
|
public string? LinhaAntiga { get; set; }
|
||||||
|
|
||||||
// Linha que o usuário digitou/selecionou como nova
|
|
||||||
[MaxLength(30)]
|
|
||||||
public string? LinhaNova { get; set; }
|
public string? LinhaNova { get; set; }
|
||||||
|
|
||||||
// Se na sua aba MUREG vem o ICCID
|
|
||||||
[MaxLength(40)]
|
|
||||||
public string? ICCID { get; set; }
|
public string? ICCID { get; set; }
|
||||||
|
|
||||||
public DateTime? DataDaMureg { get; set; }
|
public DateTime? DataDaMureg { get; set; }
|
||||||
|
|
||||||
// ✅ FK para a linha “canônica” na GERAL (a mesma linha que será atualizada)
|
public string? Cliente { get; set; }
|
||||||
public Guid MobileLineId { get; set; }
|
|
||||||
public MobileLine MobileLine { get; set; } = null!;
|
|
||||||
|
|
||||||
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
|
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
|
||||||
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
|
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue