/* 
 * GK application - OmniPOS Service API
 *
 * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
 *
 * OpenAPI spec version: 5.21.1-b03
 * 
 * Generated by: https://github.com/swagger-api/swagger-codegen.git
 */

using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Runtime.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System.ComponentModel.DataAnnotations;
using SwaggerDateConverter = IO.Swagger.Client.SwaggerDateConverter;

namespace IO.Swagger.Model
{
    /// <summary>
    /// PosSession
    /// </summary>
    [DataContract]
    public partial class PosSession :  IEquatable<PosSession>, IValidatableObject
    {
        /// <summary>
        /// Defines ActiveLanguageScope
        /// </summary>
        [JsonConverter(typeof(StringEnumConverter))]
        public enum ActiveLanguageScopeEnum
        {
            
            /// <summary>
            /// Enum Operator for value: Operator
            /// </summary>
            [EnumMember(Value = "Operator")]
            Operator = 1,
            
            /// <summary>
            /// Enum Customer for value: Customer
            /// </summary>
            [EnumMember(Value = "Customer")]
            Customer = 2,
            
            /// <summary>
            /// Enum Transaction for value: Transaction
            /// </summary>
            [EnumMember(Value = "Transaction")]
            Transaction = 3,
            
            /// <summary>
            /// Enum MasterData for value: MasterData
            /// </summary>
            [EnumMember(Value = "MasterData")]
            MasterData = 4
        }

        /// <summary>
        /// Gets or Sets ActiveLanguageScope
        /// </summary>
        [DataMember(Name="activeLanguageScope", EmitDefaultValue=false)]
        public ActiveLanguageScopeEnum? ActiveLanguageScope { get; set; }
        /// <summary>
        /// Initializes a new instance of the <see cref="PosSession" /> class.
        /// </summary>
        /// <param name="id">id.</param>
        /// <param name="transaction">transaction.</param>
        /// <param name="tenantId">tenantId.</param>
        /// <param name="workstationId">workstationId.</param>
        /// <param name="workstationTypeCode">workstationTypeCode.</param>
        /// <param name="operatorId">operatorId.</param>
        /// <param name="deviceId">deviceId.</param>
        /// <param name="tillId">tillId.</param>
        /// <param name="clientVersion">clientVersion.</param>
        /// <param name="activeLanguageScope">activeLanguageScope.</param>
        /// <param name="trainingMode">trainingMode.</param>
        /// <param name="readOnlyLastSetTimestamp">readOnlyLastSetTimestamp.</param>
        /// <param name="workstationStatus">workstationStatus.</param>
        /// <param name="workstationTenderRepositoryStatus">workstationTenderRepositoryStatus.</param>
        /// <param name="posServerLogoutRequested">posServerLogoutRequested.</param>
        /// <param name="useLoginTypeTechnicalForLoginManager">useLoginTypeTechnicalForLoginManager.</param>
        /// <param name="promotionServiceEnabled">promotionServiceEnabled.</param>
        /// <param name="packagePricingSession">packagePricingSession.</param>
        /// <param name="packagePricingServiceEnabled">packagePricingServiceEnabled.</param>
        /// <param name="additionalSessionCriteria01">additionalSessionCriteria01.</param>
        /// <param name="additionalSessionCriteria02">additionalSessionCriteria02.</param>
        /// <param name="dataPrivacyEnabled">dataPrivacyEnabled.</param>
        /// <param name="storeTransaction">storeTransaction.</param>
        /// <param name="pceContext">pceContext.</param>
        /// <param name="mainTransaction">mainTransaction.</param>
        /// <param name="posSessionData">posSessionData.</param>
        /// <param name="lastServerStatusOnline">lastServerStatusOnline.</param>
        /// <param name="tempTransactionBoundCache">tempTransactionBoundCache.</param>
        /// <param name="retailStore">retailStore.</param>
        /// <param name="temoraryPromotionSO">temoraryPromotionSO.</param>
        public PosSession(ComGkSoftwarePosApiSessionPosSessionId id = default(ComGkSoftwarePosApiSessionPosSessionId), PosTransaction transaction = default(PosTransaction), string tenantId = default(string), string workstationId = default(string), string workstationTypeCode = default(string), string operatorId = default(string), string deviceId = default(string), ComGkSoftwareGkrApiServerMdTillDtoDomTillDOKey tillId = default(ComGkSoftwareGkrApiServerMdTillDtoDomTillDOKey), string clientVersion = default(string), ActiveLanguageScopeEnum? activeLanguageScope = default(ActiveLanguageScopeEnum?), bool? trainingMode = default(bool?), long? readOnlyLastSetTimestamp = default(long?), ComGkSoftwareGkrApiLoginManagerDtoWorkstationStatus workstationStatus = default(ComGkSoftwareGkrApiLoginManagerDtoWorkstationStatus), ComGkSoftwareGkrApiLoginManagerDtoWorkstationTenderRepositoryStatus workstationTenderRepositoryStatus = default(ComGkSoftwareGkrApiLoginManagerDtoWorkstationTenderRepositoryStatus), bool? posServerLogoutRequested = default(bool?), bool? useLoginTypeTechnicalForLoginManager = default(bool?), bool? promotionServiceEnabled = default(bool?), ComGkSoftwarePackagePricingPosApiCalculationPackagePricingSession packagePricingSession = default(ComGkSoftwarePackagePricingPosApiCalculationPackagePricingSession), bool? packagePricingServiceEnabled = default(bool?), string additionalSessionCriteria01 = default(string), string additionalSessionCriteria02 = default(string), bool? dataPrivacyEnabled = default(bool?), bool? storeTransaction = default(bool?), PceContext pceContext = default(PceContext), PosTransaction mainTransaction = default(PosTransaction), ComGkSoftwarePosApiSessionPosSessionData posSessionData = default(ComGkSoftwarePosApiSessionPosSessionData), bool? lastServerStatusOnline = default(bool?), Dictionary<string, Object> tempTransactionBoundCache = default(Dictionary<string, Object>), ComGkSoftwareGkrApiServerMdBusinessUnitDtoDomBusinessUnitDO retailStore = default(ComGkSoftwareGkrApiServerMdBusinessUnitDtoDomBusinessUnitDO), List<ComGkSoftwareSweeSesApiServerMdPromotionDtoSoPromotionSO> temoraryPromotionSO = default(List<ComGkSoftwareSweeSesApiServerMdPromotionDtoSoPromotionSO>))
        {
            this.Id = id;
            this.Transaction = transaction;
            this.TenantId = tenantId;
            this.WorkstationId = workstationId;
            this.WorkstationTypeCode = workstationTypeCode;
            this.OperatorId = operatorId;
            this.DeviceId = deviceId;
            this.TillId = tillId;
            this.ClientVersion = clientVersion;
            this.ActiveLanguageScope = activeLanguageScope;
            this.TrainingMode = trainingMode;
            this.ReadOnlyLastSetTimestamp = readOnlyLastSetTimestamp;
            this.WorkstationStatus = workstationStatus;
            this.WorkstationTenderRepositoryStatus = workstationTenderRepositoryStatus;
            this.PosServerLogoutRequested = posServerLogoutRequested;
            this.UseLoginTypeTechnicalForLoginManager = useLoginTypeTechnicalForLoginManager;
            this.PromotionServiceEnabled = promotionServiceEnabled;
            this.PackagePricingSession = packagePricingSession;
            this.PackagePricingServiceEnabled = packagePricingServiceEnabled;
            this.AdditionalSessionCriteria01 = additionalSessionCriteria01;
            this.AdditionalSessionCriteria02 = additionalSessionCriteria02;
            this.DataPrivacyEnabled = dataPrivacyEnabled;
            this.StoreTransaction = storeTransaction;
            this.PceContext = pceContext;
            this.MainTransaction = mainTransaction;
            this.PosSessionData = posSessionData;
            this.LastServerStatusOnline = lastServerStatusOnline;
            this.TempTransactionBoundCache = tempTransactionBoundCache;
            this.RetailStore = retailStore;
            this.TemoraryPromotionSO = temoraryPromotionSO;
        }
        
        /// <summary>
        /// Gets or Sets Id
        /// </summary>
        [DataMember(Name="id", EmitDefaultValue=false)]
        public ComGkSoftwarePosApiSessionPosSessionId Id { get; set; }

        /// <summary>
        /// Gets or Sets Transaction
        /// </summary>
        [DataMember(Name="transaction", EmitDefaultValue=false)]
        public PosTransaction Transaction { get; set; }

        /// <summary>
        /// Gets or Sets TenantId
        /// </summary>
        [DataMember(Name="tenantId", EmitDefaultValue=false)]
        public string TenantId { get; set; }

        /// <summary>
        /// Gets or Sets WorkstationId
        /// </summary>
        [DataMember(Name="workstationId", EmitDefaultValue=false)]
        public string WorkstationId { get; set; }

        /// <summary>
        /// Gets or Sets WorkstationTypeCode
        /// </summary>
        [DataMember(Name="workstationTypeCode", EmitDefaultValue=false)]
        public string WorkstationTypeCode { get; set; }

        /// <summary>
        /// Gets or Sets OperatorId
        /// </summary>
        [DataMember(Name="operatorId", EmitDefaultValue=false)]
        public string OperatorId { get; set; }

        /// <summary>
        /// Gets or Sets DeviceId
        /// </summary>
        [DataMember(Name="deviceId", EmitDefaultValue=false)]
        public string DeviceId { get; set; }

        /// <summary>
        /// Gets or Sets TillId
        /// </summary>
        [DataMember(Name="tillId", EmitDefaultValue=false)]
        public ComGkSoftwareGkrApiServerMdTillDtoDomTillDOKey TillId { get; set; }

        /// <summary>
        /// Gets or Sets ClientVersion
        /// </summary>
        [DataMember(Name="clientVersion", EmitDefaultValue=false)]
        public string ClientVersion { get; set; }


        /// <summary>
        /// Gets or Sets TrainingMode
        /// </summary>
        [DataMember(Name="trainingMode", EmitDefaultValue=false)]
        public bool? TrainingMode { get; set; }

        /// <summary>
        /// Gets or Sets ReadOnlyLastSetTimestamp
        /// </summary>
        [DataMember(Name="readOnlyLastSetTimestamp", EmitDefaultValue=false)]
        public long? ReadOnlyLastSetTimestamp { get; set; }

        /// <summary>
        /// Gets or Sets WorkstationStatus
        /// </summary>
        [DataMember(Name="workstationStatus", EmitDefaultValue=false)]
        public ComGkSoftwareGkrApiLoginManagerDtoWorkstationStatus WorkstationStatus { get; set; }

        /// <summary>
        /// Gets or Sets WorkstationTenderRepositoryStatus
        /// </summary>
        [DataMember(Name="workstationTenderRepositoryStatus", EmitDefaultValue=false)]
        public ComGkSoftwareGkrApiLoginManagerDtoWorkstationTenderRepositoryStatus WorkstationTenderRepositoryStatus { get; set; }

        /// <summary>
        /// Gets or Sets PosServerLogoutRequested
        /// </summary>
        [DataMember(Name="posServerLogoutRequested", EmitDefaultValue=false)]
        public bool? PosServerLogoutRequested { get; set; }

        /// <summary>
        /// Gets or Sets UseLoginTypeTechnicalForLoginManager
        /// </summary>
        [DataMember(Name="useLoginTypeTechnicalForLoginManager", EmitDefaultValue=false)]
        public bool? UseLoginTypeTechnicalForLoginManager { get; set; }

        /// <summary>
        /// Gets or Sets PromotionServiceEnabled
        /// </summary>
        [DataMember(Name="promotionServiceEnabled", EmitDefaultValue=false)]
        public bool? PromotionServiceEnabled { get; set; }

        /// <summary>
        /// Gets or Sets PackagePricingSession
        /// </summary>
        [DataMember(Name="packagePricingSession", EmitDefaultValue=false)]
        public ComGkSoftwarePackagePricingPosApiCalculationPackagePricingSession PackagePricingSession { get; set; }

        /// <summary>
        /// Gets or Sets PackagePricingServiceEnabled
        /// </summary>
        [DataMember(Name="packagePricingServiceEnabled", EmitDefaultValue=false)]
        public bool? PackagePricingServiceEnabled { get; set; }

        /// <summary>
        /// Gets or Sets AdditionalSessionCriteria01
        /// </summary>
        [DataMember(Name="additionalSessionCriteria_01", EmitDefaultValue=false)]
        public string AdditionalSessionCriteria01 { get; set; }

        /// <summary>
        /// Gets or Sets AdditionalSessionCriteria02
        /// </summary>
        [DataMember(Name="additionalSessionCriteria_02", EmitDefaultValue=false)]
        public string AdditionalSessionCriteria02 { get; set; }

        /// <summary>
        /// Gets or Sets DataPrivacyEnabled
        /// </summary>
        [DataMember(Name="dataPrivacyEnabled", EmitDefaultValue=false)]
        public bool? DataPrivacyEnabled { get; set; }

        /// <summary>
        /// Gets or Sets StoreTransaction
        /// </summary>
        [DataMember(Name="storeTransaction", EmitDefaultValue=false)]
        public bool? StoreTransaction { get; set; }

        /// <summary>
        /// Gets or Sets PceContext
        /// </summary>
        [DataMember(Name="pceContext", EmitDefaultValue=false)]
        public PceContext PceContext { get; set; }

        /// <summary>
        /// Gets or Sets MainTransaction
        /// </summary>
        [DataMember(Name="mainTransaction", EmitDefaultValue=false)]
        public PosTransaction MainTransaction { get; set; }

        /// <summary>
        /// Gets or Sets PosSessionData
        /// </summary>
        [DataMember(Name="posSessionData", EmitDefaultValue=false)]
        public ComGkSoftwarePosApiSessionPosSessionData PosSessionData { get; set; }

        /// <summary>
        /// Gets or Sets LastServerStatusOnline
        /// </summary>
        [DataMember(Name="lastServerStatusOnline", EmitDefaultValue=false)]
        public bool? LastServerStatusOnline { get; set; }

        /// <summary>
        /// Gets or Sets TempTransactionBoundCache
        /// </summary>
        [DataMember(Name="tempTransactionBoundCache", EmitDefaultValue=false)]
        public Dictionary<string, Object> TempTransactionBoundCache { get; set; }

        /// <summary>
        /// Gets or Sets RetailStore
        /// </summary>
        [DataMember(Name="retailStore", EmitDefaultValue=false)]
        public ComGkSoftwareGkrApiServerMdBusinessUnitDtoDomBusinessUnitDO RetailStore { get; set; }

        /// <summary>
        /// Gets or Sets TemoraryPromotionSO
        /// </summary>
        [DataMember(Name="temoraryPromotionSO", EmitDefaultValue=false)]
        public List<ComGkSoftwareSweeSesApiServerMdPromotionDtoSoPromotionSO> TemoraryPromotionSO { get; set; }

        /// <summary>
        /// Returns the string presentation of the object
        /// </summary>
        /// <returns>String presentation of the object</returns>
        public override string ToString()
        {
            var sb = new StringBuilder();
            sb.Append("class PosSession {\n");
            sb.Append("  Id: ").Append(Id).Append("\n");
            sb.Append("  Transaction: ").Append(Transaction).Append("\n");
            sb.Append("  TenantId: ").Append(TenantId).Append("\n");
            sb.Append("  WorkstationId: ").Append(WorkstationId).Append("\n");
            sb.Append("  WorkstationTypeCode: ").Append(WorkstationTypeCode).Append("\n");
            sb.Append("  OperatorId: ").Append(OperatorId).Append("\n");
            sb.Append("  DeviceId: ").Append(DeviceId).Append("\n");
            sb.Append("  TillId: ").Append(TillId).Append("\n");
            sb.Append("  ClientVersion: ").Append(ClientVersion).Append("\n");
            sb.Append("  ActiveLanguageScope: ").Append(ActiveLanguageScope).Append("\n");
            sb.Append("  TrainingMode: ").Append(TrainingMode).Append("\n");
            sb.Append("  ReadOnlyLastSetTimestamp: ").Append(ReadOnlyLastSetTimestamp).Append("\n");
            sb.Append("  WorkstationStatus: ").Append(WorkstationStatus).Append("\n");
            sb.Append("  WorkstationTenderRepositoryStatus: ").Append(WorkstationTenderRepositoryStatus).Append("\n");
            sb.Append("  PosServerLogoutRequested: ").Append(PosServerLogoutRequested).Append("\n");
            sb.Append("  UseLoginTypeTechnicalForLoginManager: ").Append(UseLoginTypeTechnicalForLoginManager).Append("\n");
            sb.Append("  PromotionServiceEnabled: ").Append(PromotionServiceEnabled).Append("\n");
            sb.Append("  PackagePricingSession: ").Append(PackagePricingSession).Append("\n");
            sb.Append("  PackagePricingServiceEnabled: ").Append(PackagePricingServiceEnabled).Append("\n");
            sb.Append("  AdditionalSessionCriteria01: ").Append(AdditionalSessionCriteria01).Append("\n");
            sb.Append("  AdditionalSessionCriteria02: ").Append(AdditionalSessionCriteria02).Append("\n");
            sb.Append("  DataPrivacyEnabled: ").Append(DataPrivacyEnabled).Append("\n");
            sb.Append("  StoreTransaction: ").Append(StoreTransaction).Append("\n");
            sb.Append("  PceContext: ").Append(PceContext).Append("\n");
            sb.Append("  MainTransaction: ").Append(MainTransaction).Append("\n");
            sb.Append("  PosSessionData: ").Append(PosSessionData).Append("\n");
            sb.Append("  LastServerStatusOnline: ").Append(LastServerStatusOnline).Append("\n");
            sb.Append("  TempTransactionBoundCache: ").Append(TempTransactionBoundCache).Append("\n");
            sb.Append("  RetailStore: ").Append(RetailStore).Append("\n");
            sb.Append("  TemoraryPromotionSO: ").Append(TemoraryPromotionSO).Append("\n");
            sb.Append("}\n");
            return sb.ToString();
        }
  
        /// <summary>
        /// Returns the JSON string presentation of the object
        /// </summary>
        /// <returns>JSON string presentation of the object</returns>
        public virtual string ToJson()
        {
            return JsonConvert.SerializeObject(this, Formatting.Indented);
        }

        /// <summary>
        /// Returns true if objects are equal
        /// </summary>
        /// <param name="input">Object to be compared</param>
        /// <returns>Boolean</returns>
        public override bool Equals(object input)
        {
            return this.Equals(input as PosSession);
        }

        /// <summary>
        /// Returns true if PosSession instances are equal
        /// </summary>
        /// <param name="input">Instance of PosSession to be compared</param>
        /// <returns>Boolean</returns>
        public bool Equals(PosSession input)
        {
            if (input == null)
                return false;

            return 
                (
                    this.Id == input.Id ||
                    (this.Id != null &&
                    this.Id.Equals(input.Id))
                ) && 
                (
                    this.Transaction == input.Transaction ||
                    (this.Transaction != null &&
                    this.Transaction.Equals(input.Transaction))
                ) && 
                (
                    this.TenantId == input.TenantId ||
                    (this.TenantId != null &&
                    this.TenantId.Equals(input.TenantId))
                ) && 
                (
                    this.WorkstationId == input.WorkstationId ||
                    (this.WorkstationId != null &&
                    this.WorkstationId.Equals(input.WorkstationId))
                ) && 
                (
                    this.WorkstationTypeCode == input.WorkstationTypeCode ||
                    (this.WorkstationTypeCode != null &&
                    this.WorkstationTypeCode.Equals(input.WorkstationTypeCode))
                ) && 
                (
                    this.OperatorId == input.OperatorId ||
                    (this.OperatorId != null &&
                    this.OperatorId.Equals(input.OperatorId))
                ) && 
                (
                    this.DeviceId == input.DeviceId ||
                    (this.DeviceId != null &&
                    this.DeviceId.Equals(input.DeviceId))
                ) && 
                (
                    this.TillId == input.TillId ||
                    (this.TillId != null &&
                    this.TillId.Equals(input.TillId))
                ) && 
                (
                    this.ClientVersion == input.ClientVersion ||
                    (this.ClientVersion != null &&
                    this.ClientVersion.Equals(input.ClientVersion))
                ) && 
                (
                    this.ActiveLanguageScope == input.ActiveLanguageScope ||
                    (this.ActiveLanguageScope != null &&
                    this.ActiveLanguageScope.Equals(input.ActiveLanguageScope))
                ) && 
                (
                    this.TrainingMode == input.TrainingMode ||
                    (this.TrainingMode != null &&
                    this.TrainingMode.Equals(input.TrainingMode))
                ) && 
                (
                    this.ReadOnlyLastSetTimestamp == input.ReadOnlyLastSetTimestamp ||
                    (this.ReadOnlyLastSetTimestamp != null &&
                    this.ReadOnlyLastSetTimestamp.Equals(input.ReadOnlyLastSetTimestamp))
                ) && 
                (
                    this.WorkstationStatus == input.WorkstationStatus ||
                    (this.WorkstationStatus != null &&
                    this.WorkstationStatus.Equals(input.WorkstationStatus))
                ) && 
                (
                    this.WorkstationTenderRepositoryStatus == input.WorkstationTenderRepositoryStatus ||
                    (this.WorkstationTenderRepositoryStatus != null &&
                    this.WorkstationTenderRepositoryStatus.Equals(input.WorkstationTenderRepositoryStatus))
                ) && 
                (
                    this.PosServerLogoutRequested == input.PosServerLogoutRequested ||
                    (this.PosServerLogoutRequested != null &&
                    this.PosServerLogoutRequested.Equals(input.PosServerLogoutRequested))
                ) && 
                (
                    this.UseLoginTypeTechnicalForLoginManager == input.UseLoginTypeTechnicalForLoginManager ||
                    (this.UseLoginTypeTechnicalForLoginManager != null &&
                    this.UseLoginTypeTechnicalForLoginManager.Equals(input.UseLoginTypeTechnicalForLoginManager))
                ) && 
                (
                    this.PromotionServiceEnabled == input.PromotionServiceEnabled ||
                    (this.PromotionServiceEnabled != null &&
                    this.PromotionServiceEnabled.Equals(input.PromotionServiceEnabled))
                ) && 
                (
                    this.PackagePricingSession == input.PackagePricingSession ||
                    (this.PackagePricingSession != null &&
                    this.PackagePricingSession.Equals(input.PackagePricingSession))
                ) && 
                (
                    this.PackagePricingServiceEnabled == input.PackagePricingServiceEnabled ||
                    (this.PackagePricingServiceEnabled != null &&
                    this.PackagePricingServiceEnabled.Equals(input.PackagePricingServiceEnabled))
                ) && 
                (
                    this.AdditionalSessionCriteria01 == input.AdditionalSessionCriteria01 ||
                    (this.AdditionalSessionCriteria01 != null &&
                    this.AdditionalSessionCriteria01.Equals(input.AdditionalSessionCriteria01))
                ) && 
                (
                    this.AdditionalSessionCriteria02 == input.AdditionalSessionCriteria02 ||
                    (this.AdditionalSessionCriteria02 != null &&
                    this.AdditionalSessionCriteria02.Equals(input.AdditionalSessionCriteria02))
                ) && 
                (
                    this.DataPrivacyEnabled == input.DataPrivacyEnabled ||
                    (this.DataPrivacyEnabled != null &&
                    this.DataPrivacyEnabled.Equals(input.DataPrivacyEnabled))
                ) && 
                (
                    this.StoreTransaction == input.StoreTransaction ||
                    (this.StoreTransaction != null &&
                    this.StoreTransaction.Equals(input.StoreTransaction))
                ) && 
                (
                    this.PceContext == input.PceContext ||
                    (this.PceContext != null &&
                    this.PceContext.Equals(input.PceContext))
                ) && 
                (
                    this.MainTransaction == input.MainTransaction ||
                    (this.MainTransaction != null &&
                    this.MainTransaction.Equals(input.MainTransaction))
                ) && 
                (
                    this.PosSessionData == input.PosSessionData ||
                    (this.PosSessionData != null &&
                    this.PosSessionData.Equals(input.PosSessionData))
                ) && 
                (
                    this.LastServerStatusOnline == input.LastServerStatusOnline ||
                    (this.LastServerStatusOnline != null &&
                    this.LastServerStatusOnline.Equals(input.LastServerStatusOnline))
                ) && 
                (
                    this.TempTransactionBoundCache == input.TempTransactionBoundCache ||
                    this.TempTransactionBoundCache != null &&
                    this.TempTransactionBoundCache.SequenceEqual(input.TempTransactionBoundCache)
                ) && 
                (
                    this.RetailStore == input.RetailStore ||
                    (this.RetailStore != null &&
                    this.RetailStore.Equals(input.RetailStore))
                ) && 
                (
                    this.TemoraryPromotionSO == input.TemoraryPromotionSO ||
                    this.TemoraryPromotionSO != null &&
                    this.TemoraryPromotionSO.SequenceEqual(input.TemoraryPromotionSO)
                );
        }

        /// <summary>
        /// Gets the hash code
        /// </summary>
        /// <returns>Hash code</returns>
        public override int GetHashCode()
        {
            unchecked // Overflow is fine, just wrap
            {
                int hashCode = 41;
                if (this.Id != null)
                    hashCode = hashCode * 59 + this.Id.GetHashCode();
                if (this.Transaction != null)
                    hashCode = hashCode * 59 + this.Transaction.GetHashCode();
                if (this.TenantId != null)
                    hashCode = hashCode * 59 + this.TenantId.GetHashCode();
                if (this.WorkstationId != null)
                    hashCode = hashCode * 59 + this.WorkstationId.GetHashCode();
                if (this.WorkstationTypeCode != null)
                    hashCode = hashCode * 59 + this.WorkstationTypeCode.GetHashCode();
                if (this.OperatorId != null)
                    hashCode = hashCode * 59 + this.OperatorId.GetHashCode();
                if (this.DeviceId != null)
                    hashCode = hashCode * 59 + this.DeviceId.GetHashCode();
                if (this.TillId != null)
                    hashCode = hashCode * 59 + this.TillId.GetHashCode();
                if (this.ClientVersion != null)
                    hashCode = hashCode * 59 + this.ClientVersion.GetHashCode();
                if (this.ActiveLanguageScope != null)
                    hashCode = hashCode * 59 + this.ActiveLanguageScope.GetHashCode();
                if (this.TrainingMode != null)
                    hashCode = hashCode * 59 + this.TrainingMode.GetHashCode();
                if (this.ReadOnlyLastSetTimestamp != null)
                    hashCode = hashCode * 59 + this.ReadOnlyLastSetTimestamp.GetHashCode();
                if (this.WorkstationStatus != null)
                    hashCode = hashCode * 59 + this.WorkstationStatus.GetHashCode();
                if (this.WorkstationTenderRepositoryStatus != null)
                    hashCode = hashCode * 59 + this.WorkstationTenderRepositoryStatus.GetHashCode();
                if (this.PosServerLogoutRequested != null)
                    hashCode = hashCode * 59 + this.PosServerLogoutRequested.GetHashCode();
                if (this.UseLoginTypeTechnicalForLoginManager != null)
                    hashCode = hashCode * 59 + this.UseLoginTypeTechnicalForLoginManager.GetHashCode();
                if (this.PromotionServiceEnabled != null)
                    hashCode = hashCode * 59 + this.PromotionServiceEnabled.GetHashCode();
                if (this.PackagePricingSession != null)
                    hashCode = hashCode * 59 + this.PackagePricingSession.GetHashCode();
                if (this.PackagePricingServiceEnabled != null)
                    hashCode = hashCode * 59 + this.PackagePricingServiceEnabled.GetHashCode();
                if (this.AdditionalSessionCriteria01 != null)
                    hashCode = hashCode * 59 + this.AdditionalSessionCriteria01.GetHashCode();
                if (this.AdditionalSessionCriteria02 != null)
                    hashCode = hashCode * 59 + this.AdditionalSessionCriteria02.GetHashCode();
                if (this.DataPrivacyEnabled != null)
                    hashCode = hashCode * 59 + this.DataPrivacyEnabled.GetHashCode();
                if (this.StoreTransaction != null)
                    hashCode = hashCode * 59 + this.StoreTransaction.GetHashCode();
                if (this.PceContext != null)
                    hashCode = hashCode * 59 + this.PceContext.GetHashCode();
                if (this.MainTransaction != null)
                    hashCode = hashCode * 59 + this.MainTransaction.GetHashCode();
                if (this.PosSessionData != null)
                    hashCode = hashCode * 59 + this.PosSessionData.GetHashCode();
                if (this.LastServerStatusOnline != null)
                    hashCode = hashCode * 59 + this.LastServerStatusOnline.GetHashCode();
                if (this.TempTransactionBoundCache != null)
                    hashCode = hashCode * 59 + this.TempTransactionBoundCache.GetHashCode();
                if (this.RetailStore != null)
                    hashCode = hashCode * 59 + this.RetailStore.GetHashCode();
                if (this.TemoraryPromotionSO != null)
                    hashCode = hashCode * 59 + this.TemoraryPromotionSO.GetHashCode();
                return hashCode;
            }
        }

        /// <summary>
        /// To validate all properties of the instance
        /// </summary>
        /// <param name="validationContext">Validation context</param>
        /// <returns>Validation Result</returns>
        IEnumerable<System.ComponentModel.DataAnnotations.ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)
        {
            yield break;
        }
    }

}
