Compare commits

..

6 Commits

Author SHA1 Message Date
Eduardo Lopes e62208b680
Merge f14059dd2c into 91bd6d8d0f 2026-01-28 15:21:17 -03:00
Eduardo Lopes f14059dd2c Import chip virgens tables side by side 2026-01-28 10:05:44 -03:00
Eduardo Lopes b07b1d2cd7 Import both chip virgens tables 2026-01-28 09:57:08 -03:00
Eduardo Lopes f0ec95363d Detect all chip virgens headers 2026-01-28 09:49:45 -03:00
Eduardo Lopes cd1066f203 Import multiple chip virgens tables 2026-01-28 09:32:05 -03:00
Eduardo Lopes c9d8bdfda6 Null vigencia notification links before delete 2026-01-27 17:22:20 -03:00
1 changed files with 98 additions and 31 deletions

View File

@ -1177,6 +1177,16 @@ namespace line_gestao_api.Controllers
var lastRow = ws.LastRowUsed()?.RowNumber() ?? startRow;
var tenantId = GetTenantIdFromClaims();
var notificationsQuery = _db.Notifications
.IgnoreQueryFilters()
.Where(n => n.VigenciaLineId != null);
if (tenantId.HasValue)
{
notificationsQuery = notificationsQuery.Where(n => n.TenantId == tenantId.Value);
}
await notificationsQuery.ExecuteUpdateAsync(setters =>
setters.SetProperty(n => n.VigenciaLineId, n => null));
var vigenciaQuery = _db.VigenciaLines.IgnoreQueryFilters();
if (tenantId.HasValue)
{
@ -1336,28 +1346,53 @@ namespace line_gestao_api.Controllers
if (ws == null) return;
var headerRow = ws.RowsUsed().FirstOrDefault(r => r.CellsUsed().Any(c => NormalizeHeader(c.GetString()) == "ITEM"));
if (headerRow == null) return;
var map = BuildHeaderMap(headerRow);
int colItem = GetCol(map, "ITEM");
if (colItem == 0) return;
var startRow = headerRow.RowNumber() + 1;
var lastRow = ws.LastRowUsed()?.RowNumber() ?? startRow;
var headers = ws.RowsUsed()
.Where(IsChipsVirgensHeader)
.OrderBy(r => r.RowNumber())
.ToList();
if (headers.Count == 0) return;
await _db.ChipVirgemLines.ExecuteDeleteAsync();
var buffer = new List<ChipVirgemLine>(500);
var lastRow = ws.LastRowUsed()?.RowNumber() ?? 1;
for (int r = startRow; r <= lastRow; r++)
for (int i = 0; i < headers.Count; i++)
{
var headerRow = headers[i];
var itemColumns = headerRow.CellsUsed()
.Where(c => NormalizeHeader(c.GetString()) == "ITEM")
.Select(c => c.Address.ColumnNumber)
.OrderBy(c => c)
.ToList();
if (itemColumns.Count == 0) continue;
var startRow = headerRow.RowNumber() + 1;
var endRow = i + 1 < headers.Count ? headers[i + 1].RowNumber() - 1 : lastRow;
for (int tableIndex = 0; tableIndex < itemColumns.Count; tableIndex++)
{
var startCol = itemColumns[tableIndex];
var endCol = tableIndex + 1 < itemColumns.Count
? itemColumns[tableIndex + 1] - 1
: headerRow.LastCellUsed()?.Address.ColumnNumber ?? startCol;
var map = BuildHeaderMapRange(headerRow, startCol, endCol);
int colItem = GetCol(map, "ITEM");
if (colItem == 0) continue;
for (int r = startRow; r <= endRow; r++)
{
var itemStr = GetCellString(ws, r, colItem);
if (string.IsNullOrWhiteSpace(itemStr)) break;
if (string.IsNullOrWhiteSpace(itemStr)) continue;
var numeroChip = NullIfEmptyDigits(GetCellByHeaderAny(ws, r, map,
"Nº DO CHIP", "N° DO CHIP", "NUMERO DO CHIP", "N DO CHIP", "NUM. DO CHIP"));
var observacoes = GetCellByHeaderAny(ws, r, map, "OBSERVAÇÕES", "OBSERVACOES", "OBS");
if (string.IsNullOrWhiteSpace(numeroChip) && string.IsNullOrWhiteSpace(observacoes))
{
continue;
}
var now = DateTime.UtcNow;
@ -1380,6 +1415,8 @@ namespace line_gestao_api.Controllers
buffer.Clear();
}
}
}
}
if (buffer.Count > 0)
{
@ -1580,6 +1617,21 @@ namespace line_gestao_api.Controllers
return false;
}
private static bool IsChipsVirgensHeader(IXLRow row)
{
var hasItem = false;
var hasNumeroChip = false;
foreach (var cell in row.CellsUsed())
{
var k = NormalizeHeader(cell.GetString());
if (k == "ITEM") hasItem = true;
if (k.Contains("CHIP")) hasNumeroChip = true;
}
return hasItem && hasNumeroChip;
}
// ==========================================================
// HELPERS (SEUS)
// ==========================================================
@ -1595,6 +1647,21 @@ namespace line_gestao_api.Controllers
return map;
}
private static Dictionary<string, int> BuildHeaderMapRange(IXLRow headerRow, int startCol, int endCol)
{
var map = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
foreach (var cell in headerRow.CellsUsed())
{
var col = cell.Address.ColumnNumber;
if (col < startCol || col > endCol) continue;
var k = NormalizeHeader(cell.GetString());
if (!string.IsNullOrWhiteSpace(k) && !map.ContainsKey(k))
map[k] = col;
}
return map;
}
private static DateTime? ToUtc(DateTime? dt)
{
if (dt == null) return null;