private static void SaveTransaction(Intertoll.Data.Transaction realTransaction, Intertoll.Data.ETCTransaction etcTransaction, Intertoll.Data.ETCIAuthenticator IAuthenticator, Intertoll.Data.ETCOAuthenticator OAuthenticator, uspGetTransactionByLaneAndSeq_Result dbTransaction)
 {
     try
     {
         //Insert into DB
         using (var context = new PCSStagingDataContext())
         {
             context.Transactions.Insert(
                 new Transaction()
             {
                 ANPRLicensePlate      = realTransaction.ANPRLicensePlate,
                 AVCClass              = realTransaction.AVCClassGUID.HasValue ? realTransaction.AVCClassGUID : (Guid?)null,
                 AVCSeqNr              = realTransaction.AVCSeqNr,
                 AvcStatus             = realTransaction.AVCDetail,
                 BankCardExpiryDate    = dbTransaction.BankCardExpiryDate,
                 BankCardNumber        = dbTransaction.BankCardNumber,
                 CollectorClass        = realTransaction.ColClassGUID.HasValue ? realTransaction.ColClassGUID : (Guid?)null,
                 CollectorID           = dbTransaction.CollectorID.HasValue ? (int)dbTransaction.CollectorID : 0,
                 SessionGuid           = realTransaction.SessionGUID,
                 ContextMark           = dbTransaction.ContextMark,
                 ContextMarkId         = etcTransaction.ContextMarkId,
                 ETCTransactionGUID    = realTransaction.ETCTransactionGuid.HasValue ? realTransaction.ETCTransactionGuid : (Guid?)null,
                 FrequentUserPANNumber = dbTransaction.FrequentUserPANNumber,
                 AccountUserGUID       = realTransaction.AccountUserGUID,
                 IDVL    = etcTransaction.IDVL,
                 IsKeyed = realTransaction.IsKeyed,
                 IssuerAuthenticator_DData = IAuthenticator.Authenticator,
                 IssuerAuthenticator_DMAC  = dbTransaction.IssuerAuthenticator_DMAC,
                 IssuerAuthenticator_KRef  = IAuthenticator.KeyRef,
                 IssuerAuthenticator_KSID  = dbTransaction.IssuerAuthenticator_KSID,
                 IssuerAuthenticator_KV    = dbTransaction.IssuerAuthenticator_KV.ToString(),
                 IssuerAuthenticator_MAC   = IAuthenticator.Nonce,
                 IssuerAuthenticatorGuid   = etcTransaction.IssuerAuthenticatorGuid,
                 LaneCode       = dbTransaction.LaneCode,
                 LaneStatus     = realTransaction.LaneStatusGUID.ToString(),
                 LaneTransSeqNr = realTransaction.LaneTransSeqNr,
                 LicensePlate   = realTransaction.LicensePlate,
                 OperatorAuthenticator_DData = OAuthenticator.Authenticator,
                 OperatorAuthenticator_DMAC  = dbTransaction.OperatorAuthenticator_DMAC,
                 OperatorAuthenticator_KRef  = OAuthenticator.KeyRef,
                 OperatorAuthenticator_KSID  = dbTransaction.OperatorAuthenticator_KSID,
                 OperatorAuthenticator_KV    = dbTransaction.OperatorAuthenticator_MAC,
                 OperatorAuthenticator_MAC   = OAuthenticator.Nonce,
                 OperatorAuthenticatorGuid   = etcTransaction.OperatorAuthenticatorGuid,
                 PAN                    = etcTransaction.PAN.ToString(),
                 PaymentGroup           = realTransaction.PaymentGroupGUID.ToString(),
                 PaymentMech            = realTransaction.PaymentMechGUID.ToString(),
                 PaymentMethod          = realTransaction.PaymentMethodGUID.ToString(),
                 PaymentType            = realTransaction.PaymentTypeGUID.ToString(),
                 ReceiptCount           = realTransaction.ReceiptCount,
                 ReceiptTaxInvoiceDate  = realTransaction.ReceiptTaxInvoiceDate,
                 Shift_Identifier       = dbTransaction.Shift_Identifier.HasValue ? dbTransaction.Shift_Identifier.ToString() : null,
                 TagClass               = dbTransaction.TagClass,
                 TagStatus              = etcTransaction.VehichleState,
                 TariffAmount           = realTransaction.TariffAmount,
                 TaxInvNr               = realTransaction.TaxInvNr,
                 TimeStamp              = DateTime.Now,
                 Transaction_Identifier = dbTransaction.Transaction_Identifier.ToString(),
                 TransactionDate        = realTransaction.TransDate,
                 TransactionStartDate   = realTransaction.TransStartDate,
                 TransGuid              = realTransaction.TransGUID,
                 TariffGuid             = (Guid)realTransaction.TariffGUID,
                 TAGEFCM                = dbTransaction.TAGEFCM,
                 TAGMAID                = dbTransaction.TAGMAID,
                 TAGOBUID               = dbTransaction.TAGOBUID
             });
             context.Save();
         }
     }
     catch (Exception ex)
     {
         Log.LogException(ex);
     }
 }
        private static bool SendTransaction(PCSStagingDataContext dc, Transaction _Transaction)
        {
            Log.LogInfoMessage(string.Format("[Enter] sending previously sent transaction Lane{0} Sequence{1}", _Transaction.LaneCode, _Transaction.LaneTransSeqNr));

            var syncTransaction = new Intertoll.Data.Transaction();

            // Account user details
            if (!(string.IsNullOrWhiteSpace(_Transaction.FrequentUserPANNumber)))
            {
                var accountuser = dc.GetAccountUserDetails(_Transaction.FrequentUserPANNumber);

                if (accountuser == null)
                {
                    Log.LogFatal("Account user details not found PAN: " + _Transaction.FrequentUserPANNumber);
                    return(false);
                }
                syncTransaction.AccountGUID     = accountuser.AccountGUID;
                syncTransaction.AccountUserGUID = accountuser.AccountUserGUID;
            }

            Log.LogTrace("SessioGuid: " + _Transaction.SessionGuid);

            //add transaction
            syncTransaction.AppliedClassGUID = _Transaction.CollectorClass;
            syncTransaction.AVCClassGUID     = _Transaction.AVCClass;
            syncTransaction.AVCSeqNr         = _Transaction.AVCSeqNr;
            syncTransaction.ColClassGUID     = _Transaction.CollectorClass;
            syncTransaction.CurrencyGUID     = new Guid("942190CD-5053-41B4-9A08-CD472C99ECAF");
            syncTransaction.ExchangeRate     = new Guid("5A5AE37F-AABC-428D-B4DC-2B4C87B8646C");
            syncTransaction.IsKeyed          = _Transaction.IsKeyed.HasValue && (bool)_Transaction.IsKeyed;

            syncTransaction.LaneTransSeqNr = (int)(_Transaction.LaneTransSeqNr);
            syncTransaction.LicensePlate   = _Transaction.LicensePlate;
            syncTransaction.PaymentDetail  = EncryptString(_Transaction.LaneCode, _Transaction.BankCardNumber, GetExpiryDateFromTrack2(_Transaction.BankCardExpiryDate, _Transaction.BankCardNumber));


            syncTransaction.PaymentGroupGUID          = new Guid(_Transaction.PaymentGroup);
            syncTransaction.PaymentMechGUID           = new Guid(_Transaction.PaymentMech);
            syncTransaction.PaymentMethodGUID         = new Guid(_Transaction.PaymentMethod);
            syncTransaction.PaymentTypeGUID           = new Guid(_Transaction.PaymentType);
            syncTransaction.PreviousLicensePlate      = null;
            syncTransaction.PreviousPaymentMethodGUID = null;
            syncTransaction.RealClassGUID             = null;
            syncTransaction.ReceiptCount          = _Transaction.ReceiptCount.HasValue ? _Transaction.ReceiptCount : null;
            syncTransaction.ReceiptTaxInvoiceDate = _Transaction.ReceiptTaxInvoiceDate;
            syncTransaction.SessionGUID           = _Transaction.SessionGuid;
            syncTransaction.TariffAmount          = _Transaction.TariffAmount;
            syncTransaction.TariffGUID            = _Transaction.TariffGuid;
            syncTransaction.TariffVat             = 0;
            syncTransaction.TaxInvNr             = _Transaction.TaxInvNr;
            syncTransaction.TotalInLocalCurrency = _Transaction.TariffAmount;
            syncTransaction.TransDate            = _Transaction.TransactionDate;
            syncTransaction.TransStartDate       = _Transaction.TransactionStartDate;
            syncTransaction.TransGUID            = _Transaction.TransGuid;
            syncTransaction.AVCDetail            = _Transaction.AvcStatus;

            if (_Transaction.ETCTransactionGUID.HasValue)
            {
                var etcTransaction = new Intertoll.Data.ETCTransaction();
                var IAuthenticator = new Intertoll.Data.ETCIAuthenticator();
                var OAuthenticator = new Intertoll.Data.ETCOAuthenticator();

                IAuthenticator.Authenticator     = _Transaction.IssuerAuthenticator_DData;
                IAuthenticator.AuthenticatorGuid = _Transaction.IssuerAuthenticatorGuid.Value;
                IAuthenticator.KeyRef            = _Transaction.IssuerAuthenticator_KRef;
                IAuthenticator.Nonce             = _Transaction.IssuerAuthenticator_MAC; //TODO ??Confirm

                OAuthenticator.Authenticator     = _Transaction.OperatorAuthenticator_DData;
                OAuthenticator.AuthenticatorGuid = _Transaction.OperatorAuthenticatorGuid.Value;
                OAuthenticator.KeyRef            = _Transaction.OperatorAuthenticator_KRef;
                OAuthenticator.Nonce             = _Transaction.OperatorAuthenticator_MAC; //TODO ??Confirm

                etcTransaction.ClassGUID = _Transaction.TagClass.HasValue ? LookupManager.Classes((Int32)_Transaction.TagClass) :
                                           new Guid("57C3EBAF-AD68-46CB-B048-3E9E9F1D5F74");
                etcTransaction.ContextMarkId      = short.Parse(_Transaction.ContextMark);
                etcTransaction.ETCTransactionGuid = _Transaction.ETCTransactionGUID.Value;
                etcTransaction.ExpiryDate         = string.Empty;
                etcTransaction.IDVL = (long)_Transaction.IDVL;
                etcTransaction.IssuerAuthenticatorGuid   = IAuthenticator.AuthenticatorGuid;
                etcTransaction.LaneTransSeqNr            = _Transaction.LaneTransSeqNr;
                etcTransaction.LicensePlate              = _Transaction.LicensePlate;
                etcTransaction.OperatorAuthenticatorGuid = OAuthenticator.AuthenticatorGuid;
                etcTransaction.PAN           = long.Parse(_Transaction.PAN);
                etcTransaction.VehichleState = _Transaction.TagStatus;

                syncTransaction.ETCTransactionGuid = etcTransaction.ETCTransactionGuid;

                Sync.Client.SyncClient.SubmitETCTransaction(syncTransaction, etcTransaction, IAuthenticator, OAuthenticator);
            }
            else
            {
                Sync.Client.SyncClient.SubmitTransaction(syncTransaction);
            }

            Log.LogInfoMessage(string.Format("[Exit] sending previously sent transaction Lane{0} Sequence{1}", _Transaction.LaneCode, _Transaction.LaneTransSeqNr));

            return(true);
        }
        private static bool SendTransaction(PCSStagingDataContext dc, uspGetTransactionByLaneAndSeq_Result TransactionData)
        {
            Log.LogInfoMessage(string.Format("[Enter] sending transaction Lane{0} Sequence{1}", TransactionData.LaneCode, TransactionData.LaneTransSeqNr));

            var syncTransaction = new Intertoll.Data.Transaction();

            // Account user details
            if (!(string.IsNullOrWhiteSpace(TransactionData.FrequentUserPANNumber)))
            {
                var accountuser = dc.GetAccountUserDetails(TransactionData.FrequentUserPANNumber);

                if (accountuser == null)
                {
                    Log.LogFatal("Account user details not found PAN: " + TransactionData.FrequentUserPANNumber);
                    return(false);
                }
                syncTransaction.AccountGUID     = accountuser.AccountGUID;
                syncTransaction.AccountUserGUID = accountuser.AccountUserGUID;
            }

            // Session
            var session = dc.Sessions.FirstOrDefault(x => x.StartDate <= TransactionData.TransactionDate &&
                                                     (x.EndDate >= TransactionData.TransactionDate || x.EndDate == null) &&
                                                     x.LaneCode == TransactionData.LaneCode)
            ;

            if (session == null)
            {
                Log.LogFatal(string.Format("Session not found: time({0}),lane({1})", TransactionData.TransactionDate, TransactionData.LaneCode));
                return(false);
            }

            Log.LogTrace("SessioGuid: " + session.SessionGUID);

            //add transaction
            syncTransaction.AppliedClassGUID = TransactionData.CollectorClass.MappedClass();
            syncTransaction.AVCClassGUID     = TransactionData.AVCClass.MappedClass();
            syncTransaction.AVCSeqNr         = (int)TransactionData.AVCSeqNr;
            syncTransaction.ColClassGUID     = TransactionData.CollectorClass.MappedClass();
            syncTransaction.CurrencyGUID     = new Guid("942190CD-5053-41B4-9A08-CD472C99ECAF");
            syncTransaction.ExchangeRate     = new Guid("5A5AE37F-AABC-428D-B4DC-2B4C87B8646C");
            syncTransaction.IsKeyed          = TransactionData.IsKeyed.HasValue && (bool)TransactionData.IsKeyed;

            syncTransaction.LaneTransSeqNr = (int)(TransactionData.LaneTransSeqNr);
            syncTransaction.LicensePlate   = TransactionData.LicensePlate;
            syncTransaction.PaymentDetail  = EncryptString(TransactionData.LaneCode, TransactionData.BankCardNumber, GetExpiryDateFromTrack2(TransactionData.BankCardExpiryDate, TransactionData.BankCardNumber));


            syncTransaction.PaymentGroupGUID          = TransactionData.PaymentGroup.MappedPaymentGroup();
            syncTransaction.PaymentMechGUID           = TransactionData.PaymentMech.MappedPaymentMech();
            syncTransaction.PaymentMethodGUID         = TransactionData.PaymentMethod.MappedPaymentMethod();
            syncTransaction.PaymentTypeGUID           = TransactionData.PaymentType.MappedPaymentType();
            syncTransaction.PreviousLicensePlate      = null;
            syncTransaction.PreviousPaymentMethodGUID = null;
            syncTransaction.RealClassGUID             = null;
            syncTransaction.ReceiptCount          = TransactionData.ReceiptCount.HasValue ? (int)TransactionData.ReceiptCount : (int?)null;
            syncTransaction.ReceiptTaxInvoiceDate = TransactionData.ReceiptTaxInvoiceDate;
            syncTransaction.SessionGUID           = session.SessionGUID;
            syncTransaction.TariffAmount          = (decimal)TransactionData.TariffAmount;
            syncTransaction.TariffGUID            = TransactionData.VirtualPlazaID.MappedTariff(TransactionData.CollectorClass, TransactionData.TollTariffPlanID);;
            syncTransaction.TariffVat             = 0;
            syncTransaction.TaxInvNr             = TransactionData.TaxInvNr;
            syncTransaction.TotalInLocalCurrency = (decimal)TransactionData.TariffAmount;
            syncTransaction.TransDate            = TransactionData.TransactionDate;
            syncTransaction.TransStartDate       = TransactionData.TransactionStartDate;
            syncTransaction.TransGUID            = Guid.NewGuid();
            syncTransaction.AVCDetail            = TransactionData.AvcStatus;

            if (!(string.IsNullOrWhiteSpace(TransactionData.ETCTransactionGUID)))
            {
                var etcTransaction = new Intertoll.Data.ETCTransaction();
                var IAuthenticator = new Intertoll.Data.ETCIAuthenticator();
                var OAuthenticator = new Intertoll.Data.ETCOAuthenticator();

                IAuthenticator.Authenticator     = TransactionData.IssuerAuthenticator_DData;
                IAuthenticator.AuthenticatorGuid = Guid.NewGuid();
                IAuthenticator.KeyRef            = TransactionData.IssuerAuthenticator_KRef.ToString();
                IAuthenticator.Nonce             = TransactionData.IssuerAuthenticator_MAC; //TODO ??Confirm

                OAuthenticator.Authenticator     = TransactionData.OperatorAuthenticator_DData;
                OAuthenticator.AuthenticatorGuid = Guid.NewGuid();
                OAuthenticator.KeyRef            = TransactionData.OperatorAuthenticator_KRef.ToString();
                OAuthenticator.Nonce             = TransactionData.OperatorAuthenticator_MAC; //TODO ??Confirm

                etcTransaction.ClassGUID = TransactionData.TagClass.HasValue ? LookupManager.Classes((Int32)TransactionData.TagClass) :
                                           new Guid("57C3EBAF-AD68-46CB-B048-3E9E9F1D5F74");
                etcTransaction.ContextMarkId      = short.Parse(TransactionData.ContextMark);
                etcTransaction.ETCTransactionGuid = Guid.Parse(TransactionData.ETCTransactionGUID);
                etcTransaction.ExpiryDate         = string.Empty;
                etcTransaction.IDVL = (long)TransactionData.IDVL;
                etcTransaction.IssuerAuthenticatorGuid   = IAuthenticator.AuthenticatorGuid;
                etcTransaction.LaneTransSeqNr            = TransactionData.LaneTransSeqNr;
                etcTransaction.LicensePlate              = TransactionData.LicensePlate;
                etcTransaction.OperatorAuthenticatorGuid = OAuthenticator.AuthenticatorGuid;
                etcTransaction.PAN           = long.Parse(TransactionData.PAN);
                etcTransaction.VehichleState = TransactionData.TagStatus;

                syncTransaction.ETCTransactionGuid = etcTransaction.ETCTransactionGuid;

                SaveTransaction(syncTransaction, etcTransaction, IAuthenticator, OAuthenticator, TransactionData);
                Sync.Client.SyncClient.SubmitETCTransaction(syncTransaction, etcTransaction, IAuthenticator, OAuthenticator);
            }
            else
            {
                SaveTransaction(syncTransaction, new Intertoll.Data.ETCTransaction(), new Intertoll.Data.ETCIAuthenticator(), new Intertoll.Data.ETCOAuthenticator(), TransactionData);
                Sync.Client.SyncClient.SubmitTransaction(syncTransaction);
            }

            Log.LogInfoMessage(string.Format("[Exit] sending transaction Lane{0} Sequence{1}", TransactionData.LaneCode, TransactionData.LaneTransSeqNr));

            return(true);
        }