Fix resumo reserva DDD forward fill
This commit is contained in:
parent
dfce34f64d
commit
c174033583
|
|
@ -1814,34 +1814,78 @@ namespace line_gestao_api.Controllers
|
||||||
|
|
||||||
private async Task ImportResumoTabela6(IXLWorksheet ws, DateTime now)
|
private async Task ImportResumoTabela6(IXLWorksheet ws, DateTime now)
|
||||||
{
|
{
|
||||||
const int headerRow = 91;
|
var lastRowUsed = ws.LastRowUsed()?.RowNumber() ?? 1;
|
||||||
const int totalRow = 139;
|
var sectionRow = FindSectionRow(ws, "LINHAS NA RESERVA");
|
||||||
var lastRow = Math.Min(totalRow - 1, ws.LastRowUsed()?.RowNumber() ?? totalRow - 1);
|
if (sectionRow == 0) return;
|
||||||
|
|
||||||
|
var headerRow = FindHeaderRowForReserva(ws, sectionRow + 1, lastRowUsed);
|
||||||
|
if (headerRow == 0) return;
|
||||||
|
|
||||||
var map = BuildHeaderMap(ws.Row(headerRow));
|
var map = BuildHeaderMap(ws.Row(headerRow));
|
||||||
var colDdd = GetCol(map, "DDD");
|
var colDdd = GetCol(map, "DDD");
|
||||||
var colFranquiaGb = GetColAny(map, "FRANQUIA GB", "FRAQUIA GB");
|
var colFranquiaGb = GetColAny(map, "FRANQUIA GB", "FRAQUIA GB");
|
||||||
var colQtdLinhas = GetColAny(map, "QTD. DE LINHAS", "QTD DE LINHAS", "QTD. LINHAS");
|
var colQtdLinhas = GetColAny(map, "QTD. DE LINHAS", "QTD DE LINHAS", "QTD. LINHAS", "QTDLINHAS");
|
||||||
var colTotal = GetCol(map, "TOTAL");
|
var colTotal = GetCol(map, "TOTAL");
|
||||||
|
|
||||||
var buffer = new List<ResumoReservaLine>(200);
|
var buffer = new List<ResumoReservaLine>(200);
|
||||||
decimal? lastTotal = null;
|
decimal? lastTotal = null;
|
||||||
|
string? lastDddValid = null;
|
||||||
|
var dataStarted = false;
|
||||||
|
var emptyRowStreak = 0;
|
||||||
|
int? totalRowIndex = null;
|
||||||
|
|
||||||
for (int r = headerRow + 1; r <= lastRow; r++)
|
for (int r = headerRow + 1; r <= lastRowUsed; r++)
|
||||||
{
|
{
|
||||||
var ddd = GetCellString(ws, r, colDdd);
|
var ddd = GetCellString(ws, r, colDdd);
|
||||||
var franquia = GetCellString(ws, r, colFranquiaGb);
|
var franquia = GetCellString(ws, r, colFranquiaGb);
|
||||||
var qtdLinhas = GetCellString(ws, r, colQtdLinhas);
|
var qtdLinhas = GetCellString(ws, r, colQtdLinhas);
|
||||||
var total = GetCellString(ws, r, colTotal);
|
var total = GetCellString(ws, r, colTotal);
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(ddd)
|
var hasAnyValue = !(string.IsNullOrWhiteSpace(ddd)
|
||||||
&& string.IsNullOrWhiteSpace(franquia)
|
&& string.IsNullOrWhiteSpace(franquia)
|
||||||
&& string.IsNullOrWhiteSpace(qtdLinhas)
|
&& string.IsNullOrWhiteSpace(qtdLinhas)
|
||||||
&& string.IsNullOrWhiteSpace(total))
|
&& string.IsNullOrWhiteSpace(total));
|
||||||
|
|
||||||
|
if (!hasAnyValue)
|
||||||
{
|
{
|
||||||
|
if (dataStarted)
|
||||||
|
{
|
||||||
|
emptyRowStreak++;
|
||||||
|
if (emptyRowStreak >= 2) break;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
emptyRowStreak = 0;
|
||||||
|
|
||||||
|
var franquiaValue = TryDecimal(franquia);
|
||||||
|
var qtdValue = TryNullableInt(qtdLinhas);
|
||||||
|
var isDataRow = franquiaValue.HasValue || qtdValue.HasValue;
|
||||||
|
var dddCandidate = NullIfEmptyDigits(ddd);
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(dddCandidate))
|
||||||
|
{
|
||||||
|
lastDddValid = dddCandidate;
|
||||||
|
}
|
||||||
|
|
||||||
|
var isTotalRow = !isDataRow && !string.IsNullOrWhiteSpace(total);
|
||||||
|
if (isTotalRow)
|
||||||
|
{
|
||||||
|
totalRowIndex = r;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isDataRow && dataStarted)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isDataRow) dataStarted = true;
|
||||||
|
|
||||||
|
var resolvedDdd = isDataRow
|
||||||
|
? (dddCandidate ?? lastDddValid)
|
||||||
|
: dddCandidate;
|
||||||
|
|
||||||
var totalValue = TryDecimal(total);
|
var totalValue = TryDecimal(total);
|
||||||
if (!totalValue.HasValue && lastTotal.HasValue)
|
if (!totalValue.HasValue && lastTotal.HasValue)
|
||||||
{
|
{
|
||||||
|
|
@ -1854,25 +1898,36 @@ namespace line_gestao_api.Controllers
|
||||||
|
|
||||||
buffer.Add(new ResumoReservaLine
|
buffer.Add(new ResumoReservaLine
|
||||||
{
|
{
|
||||||
Ddd = string.IsNullOrWhiteSpace(ddd) ? null : ddd.Trim(),
|
Ddd = string.IsNullOrWhiteSpace(resolvedDdd) ? null : resolvedDdd,
|
||||||
FranquiaGb = TryDecimal(franquia),
|
FranquiaGb = franquiaValue,
|
||||||
QtdLinhas = TryNullableInt(qtdLinhas),
|
QtdLinhas = qtdValue,
|
||||||
Total = totalValue,
|
Total = totalValue,
|
||||||
CreatedAt = now,
|
CreatedAt = now,
|
||||||
UpdatedAt = now
|
UpdatedAt = now
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var missingDddCount = buffer.Count(x => x.Ddd == null && (x.FranquiaGb.HasValue || x.QtdLinhas.HasValue));
|
||||||
|
if (missingDddCount > 0)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"Import RESUMO/RESERVA: {missingDddCount} linhas de dados ficaram sem DDD.");
|
||||||
|
}
|
||||||
|
|
||||||
if (buffer.Count > 0)
|
if (buffer.Count > 0)
|
||||||
{
|
{
|
||||||
await _db.ResumoReservaLines.AddRangeAsync(buffer);
|
await _db.ResumoReservaLines.AddRangeAsync(buffer);
|
||||||
await _db.SaveChangesAsync();
|
await _db.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (totalRowIndex == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var totalEntity = new ResumoReservaTotal
|
var totalEntity = new ResumoReservaTotal
|
||||||
{
|
{
|
||||||
QtdLinhasTotal = TryNullableInt(GetCellString(ws, totalRow, colQtdLinhas)),
|
QtdLinhasTotal = TryNullableInt(GetCellString(ws, totalRowIndex.Value, colQtdLinhas)),
|
||||||
Total = TryDecimal(GetCellString(ws, totalRow, colTotal)),
|
Total = TryDecimal(GetCellString(ws, totalRowIndex.Value, colTotal)),
|
||||||
CreatedAt = now,
|
CreatedAt = now,
|
||||||
UpdatedAt = now
|
UpdatedAt = now
|
||||||
};
|
};
|
||||||
|
|
@ -1881,6 +1936,43 @@ namespace line_gestao_api.Controllers
|
||||||
await _db.SaveChangesAsync();
|
await _db.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static int FindSectionRow(IXLWorksheet ws, string sectionName)
|
||||||
|
{
|
||||||
|
var normalizedTarget = NormalizeHeader(sectionName);
|
||||||
|
foreach (var row in ws.RowsUsed())
|
||||||
|
{
|
||||||
|
foreach (var cell in row.CellsUsed())
|
||||||
|
{
|
||||||
|
var key = NormalizeHeader(cell.GetString());
|
||||||
|
if (string.IsNullOrWhiteSpace(key)) continue;
|
||||||
|
if (key.Contains(normalizedTarget)) return row.RowNumber();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int FindHeaderRowForReserva(IXLWorksheet ws, int startRow, int lastRow)
|
||||||
|
{
|
||||||
|
for (int r = startRow; r <= lastRow; r++)
|
||||||
|
{
|
||||||
|
var row = ws.Row(r);
|
||||||
|
if (!row.CellsUsed().Any()) continue;
|
||||||
|
|
||||||
|
var map = BuildHeaderMap(row);
|
||||||
|
var hasDdd = GetCol(map, "DDD") > 0;
|
||||||
|
var hasFranquia = GetColAny(map, "FRANQUIA GB", "FRAQUIA GB") > 0;
|
||||||
|
var hasQtd = GetColAny(map, "QTD. DE LINHAS", "QTD DE LINHAS", "QTD. LINHAS", "QTDLINHAS") > 0;
|
||||||
|
|
||||||
|
if (hasDdd && hasFranquia && hasQtd)
|
||||||
|
{
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
private async Task ImportControleRecebidosSheet(IXLWorksheet ws, int year)
|
private async Task ImportControleRecebidosSheet(IXLWorksheet ws, int year)
|
||||||
{
|
{
|
||||||
var buffer = new List<ControleRecebidoLine>(500);
|
var buffer = new List<ControleRecebidoLine>(500);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue