TarifasANEEL/Models/Tarifa.cs

169 lines
6.7 KiB
C#

using System.Diagnostics.Eventing.Reader;
using System.Globalization;
using System.Text.Json.Nodes;
using TarifasANEEL.Services;
using TarifasANEEL.Utilities;
namespace TarifasANEEL.Models
{
public class Tarifa
{
private const string DISTRIBUTOR_KEY = "NumCPFCNPJ";
private const string SUBGROUP_KEY = "DscSubGrupoTarifario";
private const string MODALITY_KEY = "DscModalidadeTarifaria";
public required int ID_dist { get; set; }
public required string Grupo { get; set; }
public required string Perfil { get; set; }
public required string Ciclo { get; set; }
public DateTime? DatInicioVigencia { get; set;}
public DateTime? DatFimVigencia { get; set;}
public double Energia_P { get; set;}
public double Energia_FP { get; set;}
public double Enc_P { get; set;}
public double Enc_FP { get; set;}
public double Dem_P { get; set;}
public double Dem_FP { get; set;}
public double ER_P { get; set;}
public double ER_FP { get; set;}
public double Megaflex { get; set;}
public double Covid_P { get; set;}
public double Covid_FP { get; set;}
public double Desc_Rural { get; set;}
public double EH_P { get; set;}
public double EH_FP { get; set;}
public static Tarifa FromRecord(JsonNode record)
{
ArgumentNullException.ThrowIfNull(record);
return new Tarifa
{
ID_dist = DatabaseService.GetDistribuidoraId(record[DISTRIBUTOR_KEY]?.ToString() ?? ""),
Grupo = record[SUBGROUP_KEY]?.ToString() ?? "",
Perfil = TarifaHelper.BuildProfileName(record, record[MODALITY_KEY]?.ToString() ?? ""),
Ciclo = TarifaHelper.ParseResolution(record),
DatInicioVigencia = DateTime.Parse(record[nameof(DatInicioVigencia)]?.ToString()!),
DatFimVigencia = DateTime.Parse(record[nameof(DatFimVigencia)]?.ToString()!)
};
}
public void UpdateComponentValue(JsonNode record)
{
int test = 0;
var subgroupSuffix = Grupo[0].ToString();
var component = record["DscComponenteTarifario"]?.ToString() ?? "";
var unit = record["DscUnidade"]?.ToString() ?? "";
var rawpeak = record["DscPostoTarifario"]?.ToString() ?? "";
var modality = record["DscModalidadeTarifaria"]?.ToString().ToUpper() ?? "";
var value = double.TryParse(record["VlrComponenteTarifario"]?.ToString(), out var parsedValue)
? parsedValue
: 0;
var peakSuffix = rawpeak[0].ToString();
switch ((subgroupSuffix, modality, component, unit, peakSuffix))
{
// Group A cases
case ("A", "GERAÇÃO", "TUSD", "R$/kW", "N"):
Dem_P = Dem_FP = value;
break;
case ("A", "CONVENCIONAL", "TE", "R$/MWh", var peak):
switch (peak)
{
case "N": Energia_P = Energia_FP = value; break;
case "F": Energia_FP = value; break;
case "P": Energia_P = value; break;
}
break;
case ("A", "CONVENCIONAL", "TUSD", "R$/MWh", "N"):
Enc_P = Enc_FP = value;
break;
case ("A", "AZUL", "TE", "R$/MWh", var peak) when peak is "F" or "P":
if (peak == "F") Energia_FP = value;
else Energia_P = value;
break;
case ("A", "AZUL", "TUSD", "R$/MWh", var peak) when peak is "F" or "P":
if (peak == "F") Enc_FP = value;
else Enc_P = value;
break;
case ("A", "AZUL", "TUSD", "R$/kW", var peak) when peak is "F" or "P":
if (peak == "F") Dem_FP = value;
else Dem_P = value;
break;
case ("A", "VERDE", "TE", "R$/MWh", var peak) when peak is "F" or "P":
if (peak == "P") Energia_P = value;
else Energia_FP = value;
break;
case ("A", "VERDE", "TUSD", "R$/kW", "N"):
Dem_FP = value;
Dem_P = 0;
break;
case ("A", "VERDE", "TUSD", "R$/MWh", var peak) when peak is "F" or "P":
if (peak == "P") Enc_P = value;
else Enc_FP = value;
break;
// Group B cases
case ("B", "CONVENCIONAL" or "PRÉ-PAGAMENTO", var comp, "R$/MWh", "N"):
if (comp == "TUSD") Enc_P = Enc_FP = value;
else if (comp == "TE") Energia_P = Energia_FP = value;
break;
case ("B", "BRANCA", var comp, "R$/MWh", var peak):
if (comp == "TE")
if (peak == "P") Energia_P = value;
else Energia_FP += value;
else if (comp == "TUSD")
if (peak == "P") Enc_P = value;
else Enc_FP += value;
break;
case ("B", "GERAÇÃO", "TUSD", "R$/kW", "N"):
Dem_P = Dem_FP = value;
break;
default:
if ((component == "TE" && unit == "R$/kW" && value != 0) ||
!((subgroupSuffix == "A" || subgroupSuffix == "B") &&
(modality is "GERAÇÃO" or "CONVENCIONAL" or "AZUL" or "VERDE" or "BRANCA" or "PRÉ-PAGAMENTO" or "DISTRIBUIÇÃO" or "ENERGIA SUPRIMENTO")))
{
test++;
}
break;
}
if (test > 0) { Console.WriteLine("Sem lógica:\t{0}",string.Join("\t",new string[] { ID_dist.ToString(), Ciclo, Grupo, Perfil, component, peakSuffix, unit, value.ToString("C", CultureInfo.CreateSpecificCulture("pt-BR")) })); }
}
public bool HasAllEmptyValues()
{
// Adjust this method based on your Tarifa properties
return Energia_P == 0 &&
Energia_FP == 0 &&
Enc_P == 0 &&
Enc_FP == 0 &&
Dem_P == 0 &&
Dem_FP == 0 &&
ER_P == 0 &&
ER_FP == 0 &&
Megaflex == 0 &&
Covid_P == 0 &&
Covid_FP == 0 &&
Desc_Rural == 0 &&
EH_P == 0 &&
EH_FP == 0;
}
}
}