public int fnM1(string pStrIn, string pRegEntry, ref string pStrOut, ref string pStrOutM50, int nSize, bool bApplyHistory, bool bUseDefaultArticleDef) { int nRes = 1; try { Guard.IsNullOrEmptyString(pStrIn, nameof(pStrIn)); LoadParams(pRegEntry); trace.Write(TraceLevel.Debug, $"GeneralParams.UnitId loaded {GeneralParams.UnitId}"); CDatM1 m1 = new CDatM1(loggerManager); CDatM1 m1Return = new CDatM1(loggerManager); CDatM1 m1Amp = new CDatM1(loggerManager); COPSPacket opsPacket = new COPSPacket(loggerManager); bool exitCurrentOperationInOtherGroup = false; trace.Write(TraceLevel.Info, "Waiting For Unlock ....."); //TODO : Añadir en lock toda la seccion trace.Write(TraceLevel.Info, "Inside Lock ....."); if (!OpenDatabase()) { throw new InvalidOperationException("Open database has failed"); } if (!InitComputeM1()) { throw new InvalidOperationException("Compute1 initialization has failed"); } tariffCalculator.SetDBB(database); opsPacket.Parse(pStrIn); if (opsPacket.GetMsg(0) == null) { throw new InvalidOperationException("OPSPacket doesn't conatin any message"); } if (!m1.SetData(opsPacket.GetMsg(0))) { throw new InvalidOperationException("M1 Extracting data from OPSPacket"); } if (m1.GetInArticleDef() == GlobalDefs.DEF_UNDEFINED_VALUE) { trace.Write(TraceLevel.Debug, $"Set M1 InArticleDef from parameters"); m1.SetInArticleDef(defaultArticleDef); } if (tariffCalculator == null) { throw new InvalidOperationException("TariffCalculator is NULL"); } trace.Write(TraceLevel.Info, "FnM1 "); m1.Trace(); if (!database.IsOpened()) { trace.Write(TraceLevel.Info, "Database is not connected"); if (!database.Close()) { trace.Write(TraceLevel.Error, "ERROR Closing Database"); } if (!OpenDatabase()) { throw new InvalidOperationException("Open database has failed"); } } if (m1.GetInOperType() == OperationDat.DEF_OPERTYPE_RETN) { if (!m1Return.SetData(opsPacket.GetMsg(0))) { throw new InvalidOperationException("M1RETURN Extracting data from OPSPacket"); } if (m1Return.GetInArticleDef() == GlobalDefs.DEF_UNDEFINED_VALUE) { trace.Write(TraceLevel.Debug, $"Set M1RETURN InArticleDef from parameters"); m1.SetInArticleDef(defaultArticleDef); } if (!ComputeReturn(m1Return, m1)) { trace.Write(TraceLevel.Info, $"ERROR: Computing Return"); } } else { bool isVIP = false; bool isResident = false; if (!bUseDefaultArticleDef) { if (!IsVehicleIdVIP(m1, ref isVIP)) { trace.Write(TraceLevel.Error, "ERROR : IsVehicleIdVIP"); } if (!isVIP) { if (!IsVehicleIdResident(m1, ref isResident)) { trace.Write(TraceLevel.Error, "ERROR : IsVehicleIdResident"); } } } // Modify tariffs for abonos in Zumarraga trace.Write(TraceLevel.Info, "System ID %1", GeneralParams.SystemId.ToString()); if (GeneralParams.SystemId == SYSTEM_IDENTIFIER_ZUMARRAGA) { if (m1.GetInArticleDef() >= 102 && m1.GetInArticleDef() <= 113) { trace.Write(TraceLevel.Info, "Modifying tariffs for Zumarraga"); COPSPlate strVehicleId = m1.GetInVehicleID(); if (!database.SetTariffDates(tariffCalculator.GetTree(), m1.GetInArticleDef(), strVehicleId)) { throw new InvalidOperationException("Setting tariff dates before calling M1"); } } } bool bM1Plus = false; int nMaxQuantity = (int)m1.GetOutIntAcumul(); if (!tariffCalculator.GetM1(m1, bM1Plus, nMaxQuantity, bApplyHistory)) { trace.Write(TraceLevel.Info, "ERROR : GetM1"); } m1AppliedHistory = (tariffCalculator.GetApplyVehicleHistory()) ? 1: 0; m1RealCurrMinutes = (int)tariffCalculator.GetRealCurrMinutes(); if (lookOtherGroups) { m1Amp = new CDatM1(loggerManager); if (m1Amp == null) { throw new InvalidOperationException("ERROR : pM1 is NULL"); } if (!m1Amp.SetData(opsPacket.GetMsg(0))) { throw new InvalidOperationException("ERROR : pM1 Extracting data from OPSPacket"); } if (m1Amp.GetInArticleDef() == GlobalDefs.DEF_UNDEFINED_VALUE) { m1Amp.SetInArticleDef(defaultArticleDef); } if (!ComputeAmpliation(m1Amp, ref exitCurrentOperationInOtherGroup)) { trace.Write(TraceLevel.Info, "ERROR : Computing Ampliation"); } } } m1.Trace(); string szOutMessage; string szOutMessageM50; //// Format Result Message szOutMessage = FormatOutMessage(m1, true, "A"); if (exitCurrentOperationInOtherGroup && m1Amp != null) { szOutMessage = FormatOutMessage(m1Amp, false, "B"); } szOutMessageM50 = FormatOutMessageM50(m1); trace.Write(TraceLevel.Info, $"Message {szOutMessage}"); trace.Write(TraceLevel.Info, $"Message 50 {szOutMessageM50}"); pStrOut = szOutMessage; pStrOutM50 = szOutMessageM50; ////// Format Result Message //XmlDocument xmlMessage = FormatOutMessage(m1, true, "A"); //if (exitCurrentOperationInOtherGroup && m1Amp != null) //{ // xmlMessage = FormatOutMessage(m1Amp, false, "B", xmlMessage); //} //szOutMessage = xmlMessage.InnerXml; //xmlMessage.RemoveAll(); //xmlMessage = FormatOutMessageM50(m1); //szOutMessageM50 = xmlMessage.InnerXml; //trace.Write(TraceLevel.Info, $"Message {szOutMessage}"); //trace.Write(TraceLevel.Info, $"Message 50 {szOutMessageM50}"); //pStrOut = szOutMessage; //pStrOutM50 = szOutMessageM50; } catch (LoadParametersException error) { trace.Write(TraceLevel.Error, error.ToLogString()); nRes = -3; } catch (Exception error) { trace.Write(TraceLevel.Error, error.ToLogString()); nRes = -1; } finally { if (!database.Close()) { trace.Write(TraceLevel.Error, "ERROR Closing Database"); } } return(nRes); }