/* 
 * 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>
    /// TillDO &lt;p&gt;Tills&lt;br /&gt;&lt;/p&gt;
    /// </summary>
    [DataContract]
    public partial class ComGkSoftwareGkrApiServerMdTillDtoDomTillDO :  IEquatable<ComGkSoftwareGkrApiServerMdTillDtoDomTillDO>, IValidatableObject
    {
        /// <summary>
        /// &lt;p&gt;The assignment mode which is used for that till&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt; DRAWER_FOR_ONLY_ONE_CASHIER01(01)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; JOINT_DRAWER_FOR_SEVERAL_CASHIERS(02)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; DRAWER_FOR_ONLY_ONE_CASH_REGISTER(03)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; DRAWER_FOR_ONLY_ONE_CASH_RECYCLER(04)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;
        /// </summary>
        /// <value>&lt;p&gt;The assignment mode which is used for that till&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt; DRAWER_FOR_ONLY_ONE_CASHIER01(01)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; JOINT_DRAWER_FOR_SEVERAL_CASHIERS(02)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; DRAWER_FOR_ONLY_ONE_CASH_REGISTER(03)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; DRAWER_FOR_ONLY_ONE_CASH_RECYCLER(04)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;</value>
        [JsonConverter(typeof(StringEnumConverter))]
        public enum AssignmentTypeCodeEnum
        {
            
            /// <summary>
            /// Enum DRAWERFORONLYONECASHIER for value: DRAWER_FOR_ONLY_ONE_CASHIER
            /// </summary>
            [EnumMember(Value = "DRAWER_FOR_ONLY_ONE_CASHIER")]
            DRAWERFORONLYONECASHIER = 1,
            
            /// <summary>
            /// Enum JOINTDRAWERFORSEVERALCASHIERS for value: JOINT_DRAWER_FOR_SEVERAL_CASHIERS
            /// </summary>
            [EnumMember(Value = "JOINT_DRAWER_FOR_SEVERAL_CASHIERS")]
            JOINTDRAWERFORSEVERALCASHIERS = 2,
            
            /// <summary>
            /// Enum DRAWERFORONLYONECASHREGISTER for value: DRAWER_FOR_ONLY_ONE_CASH_REGISTER
            /// </summary>
            [EnumMember(Value = "DRAWER_FOR_ONLY_ONE_CASH_REGISTER")]
            DRAWERFORONLYONECASHREGISTER = 3,
            
            /// <summary>
            /// Enum DRAWERFORONLYONECASHRECYCLER for value: DRAWER_FOR_ONLY_ONE_CASH_RECYCLER
            /// </summary>
            [EnumMember(Value = "DRAWER_FOR_ONLY_ONE_CASH_RECYCLER")]
            DRAWERFORONLYONECASHRECYCLER = 4,
            
            /// <summary>
            /// Enum DRAWERWITHOUTASSIGNMENT for value: DRAWER_WITHOUT_ASSIGNMENT
            /// </summary>
            [EnumMember(Value = "DRAWER_WITHOUT_ASSIGNMENT")]
            DRAWERWITHOUTASSIGNMENT = 5
        }

        /// <summary>
        /// &lt;p&gt;The assignment mode which is used for that till&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt; DRAWER_FOR_ONLY_ONE_CASHIER01(01)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; JOINT_DRAWER_FOR_SEVERAL_CASHIERS(02)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; DRAWER_FOR_ONLY_ONE_CASH_REGISTER(03)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; DRAWER_FOR_ONLY_ONE_CASH_RECYCLER(04)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;
        /// </summary>
        /// <value>&lt;p&gt;The assignment mode which is used for that till&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt; DRAWER_FOR_ONLY_ONE_CASHIER01(01)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; JOINT_DRAWER_FOR_SEVERAL_CASHIERS(02)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; DRAWER_FOR_ONLY_ONE_CASH_REGISTER(03)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; DRAWER_FOR_ONLY_ONE_CASH_RECYCLER(04)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;</value>
        [DataMember(Name="assignmentTypeCode", EmitDefaultValue=false)]
        public AssignmentTypeCodeEnum AssignmentTypeCode { get; set; }
        /// <summary>
        /// &lt;p&gt;Determines how the till is to be cleared&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt; VARIABLE_CHANGE(01)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; FIXED_CHANGE_AMOUNT(02)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; COMPLETE_PICKUP(03)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; MANUAL_CHANGE(04)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; COMPLETE_PICKUP_TARGET(13)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;
        /// </summary>
        /// <value>&lt;p&gt;Determines how the till is to be cleared&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt; VARIABLE_CHANGE(01)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; FIXED_CHANGE_AMOUNT(02)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; COMPLETE_PICKUP(03)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; MANUAL_CHANGE(04)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; COMPLETE_PICKUP_TARGET(13)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;</value>
        [JsonConverter(typeof(StringEnumConverter))]
        public enum TillClearingTypeCodeEnum
        {
            
            /// <summary>
            /// Enum VARIABLECHANGE for value: VARIABLE_CHANGE
            /// </summary>
            [EnumMember(Value = "VARIABLE_CHANGE")]
            VARIABLECHANGE = 1,
            
            /// <summary>
            /// Enum FIXEDCHANGEAMOUNT for value: FIXED_CHANGE_AMOUNT
            /// </summary>
            [EnumMember(Value = "FIXED_CHANGE_AMOUNT")]
            FIXEDCHANGEAMOUNT = 2,
            
            /// <summary>
            /// Enum COMPLETEPICKUP for value: COMPLETE_PICKUP
            /// </summary>
            [EnumMember(Value = "COMPLETE_PICKUP")]
            COMPLETEPICKUP = 3,
            
            /// <summary>
            /// Enum MANUALCHANGE for value: MANUAL_CHANGE
            /// </summary>
            [EnumMember(Value = "MANUAL_CHANGE")]
            MANUALCHANGE = 4,
            
            /// <summary>
            /// Enum COMPLETEPICKUPTARGET for value: COMPLETE_PICKUP_TARGET
            /// </summary>
            [EnumMember(Value = "COMPLETE_PICKUP_TARGET")]
            COMPLETEPICKUPTARGET = 5
        }

        /// <summary>
        /// &lt;p&gt;Determines how the till is to be cleared&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt; VARIABLE_CHANGE(01)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; FIXED_CHANGE_AMOUNT(02)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; COMPLETE_PICKUP(03)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; MANUAL_CHANGE(04)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; COMPLETE_PICKUP_TARGET(13)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;
        /// </summary>
        /// <value>&lt;p&gt;Determines how the till is to be cleared&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt; VARIABLE_CHANGE(01)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; FIXED_CHANGE_AMOUNT(02)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; COMPLETE_PICKUP(03)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; MANUAL_CHANGE(04)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; COMPLETE_PICKUP_TARGET(13)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;</value>
        [DataMember(Name="tillClearingTypeCode", EmitDefaultValue=false)]
        public TillClearingTypeCodeEnum TillClearingTypeCode { get; set; }
        /// <summary>
        /// &lt;p&gt;Defines the settlement mode&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt; CONTINUOUS_USE(01)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; ON_A_DAILY_BASIS(02)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;
        /// </summary>
        /// <value>&lt;p&gt;Defines the settlement mode&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt; CONTINUOUS_USE(01)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; ON_A_DAILY_BASIS(02)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;</value>
        [JsonConverter(typeof(StringEnumConverter))]
        public enum SettlementTypeCodeEnum
        {
            
            /// <summary>
            /// Enum CONTINUOUSUSE for value: CONTINUOUS_USE
            /// </summary>
            [EnumMember(Value = "CONTINUOUS_USE")]
            CONTINUOUSUSE = 1,
            
            /// <summary>
            /// Enum ONADAILYBASIS for value: ON_A_DAILY_BASIS
            /// </summary>
            [EnumMember(Value = "ON_A_DAILY_BASIS")]
            ONADAILYBASIS = 2
        }

        /// <summary>
        /// &lt;p&gt;Defines the settlement mode&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt; CONTINUOUS_USE(01)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; ON_A_DAILY_BASIS(02)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;
        /// </summary>
        /// <value>&lt;p&gt;Defines the settlement mode&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt; CONTINUOUS_USE(01)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; ON_A_DAILY_BASIS(02)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;</value>
        [DataMember(Name="settlementTypeCode", EmitDefaultValue=false)]
        public SettlementTypeCodeEnum SettlementTypeCode { get; set; }
        /// <summary>
        /// Initializes a new instance of the <see cref="ComGkSoftwareGkrApiServerMdTillDtoDomTillDO" /> class.
        /// </summary>
        [JsonConstructorAttribute]
        protected ComGkSoftwareGkrApiServerMdTillDtoDomTillDO() { }
        /// <summary>
        /// Initializes a new instance of the <see cref="ComGkSoftwareGkrApiServerMdTillDtoDomTillDO" /> class.
        /// </summary>
        /// <param name="key">&lt;p&gt;Getter for inner key class.&lt;/p&gt; (required).</param>
        /// <param name="defaultOpeningCashBalanceAmount">&lt;p&gt;The opening Tender balance with which the Till will typically start.&lt;br /&gt;&lt;/p&gt; (required).</param>
        /// <param name="loanCalculationRequiredFlag">&lt;p&gt;Determines whether function &#39;loan&#39; requires counting the cash money and registering the counted amount, or whether counting is skipped and the default amount is used&lt;br /&gt;&lt;/p&gt;.</param>
        /// <param name="loanRequiredFlag">&lt;p&gt;Determines whether the loan function should be used&lt;br /&gt;&lt;/p&gt;.</param>
        /// <param name="blockingFlag">&lt;p&gt;Determines whether the till is locked&lt;br /&gt;&lt;/p&gt;.</param>
        /// <param name="tillBarcode">&lt;p&gt;The barcode of the till&lt;br /&gt;&lt;/p&gt;.</param>
        /// <param name="assignmentTypeCode">&lt;p&gt;The assignment mode which is used for that till&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt; DRAWER_FOR_ONLY_ONE_CASHIER01(01)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; JOINT_DRAWER_FOR_SEVERAL_CASHIERS(02)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; DRAWER_FOR_ONLY_ONE_CASH_REGISTER(03)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; DRAWER_FOR_ONLY_ONE_CASH_RECYCLER(04)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt; (required).</param>
        /// <param name="workstationID">&lt;p&gt;ID of the workstation. It is only filled if till is assigned to workstation.&lt;br /&gt;&lt;/p&gt;.</param>
        /// <param name="tillOperatorList">&lt;p&gt;The list operators that are allowed to use the till.&lt;br /&gt;&lt;/p&gt;.</param>
        /// <param name="tillClearingTypeCode">&lt;p&gt;Determines how the till is to be cleared&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt; VARIABLE_CHANGE(01)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; FIXED_CHANGE_AMOUNT(02)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; COMPLETE_PICKUP(03)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; MANUAL_CHANGE(04)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; COMPLETE_PICKUP_TARGET(13)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt; (required).</param>
        /// <param name="settlementTypeCode">&lt;p&gt;Defines the settlement mode&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt; CONTINUOUS_USE(01)&lt;/li&gt;&lt;br /&gt; &lt;li&gt; ON_A_DAILY_BASIS(02)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt; (required).</param>
        /// <param name="packageID">&lt;p&gt;Internal identification of the import package (e.g. IDoc file). The identification is used for monitoring purposes.&lt;br /&gt;&lt;/p&gt;.</param>
        /// <param name="trainingModeFlag">&lt;p&gt;Determines whether the till is used for education.&lt;br /&gt;&lt;/p&gt; (required).</param>
        /// <param name="statusDateTimeStamp">&lt;p&gt;date and time of the till status&lt;br /&gt;&lt;/p&gt; Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone).</param>
        /// <param name="tillEnabled">&lt;p&gt;TODO&lt;br /&gt;&lt;/p&gt;.</param>
        /// <param name="xxcustom05">&lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;.</param>
        /// <param name="xxcustom03">&lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;.</param>
        /// <param name="xxcustom02">&lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;.</param>
        /// <param name="xxcustom04">&lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;.</param>
        /// <param name="xxcustom01">&lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;.</param>
        public ComGkSoftwareGkrApiServerMdTillDtoDomTillDO(ComGkSoftwareGkrApiServerMdTillDtoDomTillDOKey key = default(ComGkSoftwareGkrApiServerMdTillDtoDomTillDOKey), double? defaultOpeningCashBalanceAmount = default(double?), bool? loanCalculationRequiredFlag = default(bool?), bool? loanRequiredFlag = default(bool?), bool? blockingFlag = default(bool?), string tillBarcode = default(string), AssignmentTypeCodeEnum assignmentTypeCode = default(AssignmentTypeCodeEnum), string workstationID = default(string), List<ComGkSoftwareGkrApiServerMdTillDtoDomTillOperatorDO> tillOperatorList = default(List<ComGkSoftwareGkrApiServerMdTillDtoDomTillOperatorDO>), TillClearingTypeCodeEnum tillClearingTypeCode = default(TillClearingTypeCodeEnum), SettlementTypeCodeEnum settlementTypeCode = default(SettlementTypeCodeEnum), string packageID = default(string), bool? trainingModeFlag = default(bool?), string statusDateTimeStamp = default(string), bool? tillEnabled = default(bool?), string xxcustom05 = default(string), string xxcustom03 = default(string), string xxcustom02 = default(string), string xxcustom04 = default(string), string xxcustom01 = default(string))
        {
            // to ensure "key" is required (not null)
            if (key == null)
            {
                throw new InvalidDataException("key is a required property for ComGkSoftwareGkrApiServerMdTillDtoDomTillDO and cannot be null");
            }
            else
            {
                this.Key = key;
            }
            // to ensure "defaultOpeningCashBalanceAmount" is required (not null)
            if (defaultOpeningCashBalanceAmount == null)
            {
                throw new InvalidDataException("defaultOpeningCashBalanceAmount is a required property for ComGkSoftwareGkrApiServerMdTillDtoDomTillDO and cannot be null");
            }
            else
            {
                this.DefaultOpeningCashBalanceAmount = defaultOpeningCashBalanceAmount;
            }
            // to ensure "assignmentTypeCode" is required (not null)
            if (assignmentTypeCode == null)
            {
                throw new InvalidDataException("assignmentTypeCode is a required property for ComGkSoftwareGkrApiServerMdTillDtoDomTillDO and cannot be null");
            }
            else
            {
                this.AssignmentTypeCode = assignmentTypeCode;
            }
            // to ensure "tillClearingTypeCode" is required (not null)
            if (tillClearingTypeCode == null)
            {
                throw new InvalidDataException("tillClearingTypeCode is a required property for ComGkSoftwareGkrApiServerMdTillDtoDomTillDO and cannot be null");
            }
            else
            {
                this.TillClearingTypeCode = tillClearingTypeCode;
            }
            // to ensure "settlementTypeCode" is required (not null)
            if (settlementTypeCode == null)
            {
                throw new InvalidDataException("settlementTypeCode is a required property for ComGkSoftwareGkrApiServerMdTillDtoDomTillDO and cannot be null");
            }
            else
            {
                this.SettlementTypeCode = settlementTypeCode;
            }
            // to ensure "trainingModeFlag" is required (not null)
            if (trainingModeFlag == null)
            {
                throw new InvalidDataException("trainingModeFlag is a required property for ComGkSoftwareGkrApiServerMdTillDtoDomTillDO and cannot be null");
            }
            else
            {
                this.TrainingModeFlag = trainingModeFlag;
            }
            this.LoanCalculationRequiredFlag = loanCalculationRequiredFlag;
            this.LoanRequiredFlag = loanRequiredFlag;
            this.BlockingFlag = blockingFlag;
            this.TillBarcode = tillBarcode;
            this.WorkstationID = workstationID;
            this.TillOperatorList = tillOperatorList;
            this.PackageID = packageID;
            this.StatusDateTimeStamp = statusDateTimeStamp;
            this.TillEnabled = tillEnabled;
            this.Xxcustom05 = xxcustom05;
            this.Xxcustom03 = xxcustom03;
            this.Xxcustom02 = xxcustom02;
            this.Xxcustom04 = xxcustom04;
            this.Xxcustom01 = xxcustom01;
        }
        
        /// <summary>
        /// &lt;p&gt;Getter for inner key class.&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;Getter for inner key class.&lt;/p&gt;</value>
        [DataMember(Name="key", EmitDefaultValue=false)]
        public ComGkSoftwareGkrApiServerMdTillDtoDomTillDOKey Key { get; set; }

        /// <summary>
        /// &lt;p&gt;The opening Tender balance with which the Till will typically start.&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;The opening Tender balance with which the Till will typically start.&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="defaultOpeningCashBalanceAmount", EmitDefaultValue=false)]
        public double? DefaultOpeningCashBalanceAmount { get; set; }

        /// <summary>
        /// &lt;p&gt;Determines whether function &#39;loan&#39; requires counting the cash money and registering the counted amount, or whether counting is skipped and the default amount is used&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;Determines whether function &#39;loan&#39; requires counting the cash money and registering the counted amount, or whether counting is skipped and the default amount is used&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="loanCalculationRequiredFlag", EmitDefaultValue=false)]
        public bool? LoanCalculationRequiredFlag { get; set; }

        /// <summary>
        /// &lt;p&gt;Determines whether the loan function should be used&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;Determines whether the loan function should be used&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="loanRequiredFlag", EmitDefaultValue=false)]
        public bool? LoanRequiredFlag { get; set; }

        /// <summary>
        /// &lt;p&gt;Determines whether the till is locked&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;Determines whether the till is locked&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="blockingFlag", EmitDefaultValue=false)]
        public bool? BlockingFlag { get; set; }

        /// <summary>
        /// &lt;p&gt;The barcode of the till&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;The barcode of the till&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="tillBarcode", EmitDefaultValue=false)]
        public string TillBarcode { get; set; }


        /// <summary>
        /// &lt;p&gt;ID of the workstation. It is only filled if till is assigned to workstation.&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;ID of the workstation. It is only filled if till is assigned to workstation.&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="workstationID", EmitDefaultValue=false)]
        public string WorkstationID { get; set; }

        /// <summary>
        /// &lt;p&gt;The list operators that are allowed to use the till.&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;The list operators that are allowed to use the till.&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="tillOperatorList", EmitDefaultValue=false)]
        public List<ComGkSoftwareGkrApiServerMdTillDtoDomTillOperatorDO> TillOperatorList { get; set; }



        /// <summary>
        /// &lt;p&gt;Internal identification of the import package (e.g. IDoc file). The identification is used for monitoring purposes.&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;Internal identification of the import package (e.g. IDoc file). The identification is used for monitoring purposes.&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="packageID", EmitDefaultValue=false)]
        public string PackageID { get; set; }

        /// <summary>
        /// &lt;p&gt;Determines whether the till is used for education.&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;Determines whether the till is used for education.&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="trainingModeFlag", EmitDefaultValue=false)]
        public bool? TrainingModeFlag { get; set; }

        /// <summary>
        /// &lt;p&gt;date and time of the till status&lt;br /&gt;&lt;/p&gt; Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone)
        /// </summary>
        /// <value>&lt;p&gt;date and time of the till status&lt;br /&gt;&lt;/p&gt; Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone)</value>
        [DataMember(Name="statusDateTimeStamp", EmitDefaultValue=false)]
        public string StatusDateTimeStamp { get; set; }

        /// <summary>
        /// &lt;p&gt;TODO&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;TODO&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="tillEnabled", EmitDefaultValue=false)]
        public bool? TillEnabled { get; set; }

        /// <summary>
        /// &lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="xxcustom05", EmitDefaultValue=false)]
        public string Xxcustom05 { get; set; }

        /// <summary>
        /// &lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="xxcustom03", EmitDefaultValue=false)]
        public string Xxcustom03 { get; set; }

        /// <summary>
        /// &lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="xxcustom02", EmitDefaultValue=false)]
        public string Xxcustom02 { get; set; }

        /// <summary>
        /// &lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="xxcustom04", EmitDefaultValue=false)]
        public string Xxcustom04 { get; set; }

        /// <summary>
        /// &lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="xxcustom01", EmitDefaultValue=false)]
        public string Xxcustom01 { 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 ComGkSoftwareGkrApiServerMdTillDtoDomTillDO {\n");
            sb.Append("  Key: ").Append(Key).Append("\n");
            sb.Append("  DefaultOpeningCashBalanceAmount: ").Append(DefaultOpeningCashBalanceAmount).Append("\n");
            sb.Append("  LoanCalculationRequiredFlag: ").Append(LoanCalculationRequiredFlag).Append("\n");
            sb.Append("  LoanRequiredFlag: ").Append(LoanRequiredFlag).Append("\n");
            sb.Append("  BlockingFlag: ").Append(BlockingFlag).Append("\n");
            sb.Append("  TillBarcode: ").Append(TillBarcode).Append("\n");
            sb.Append("  AssignmentTypeCode: ").Append(AssignmentTypeCode).Append("\n");
            sb.Append("  WorkstationID: ").Append(WorkstationID).Append("\n");
            sb.Append("  TillOperatorList: ").Append(TillOperatorList).Append("\n");
            sb.Append("  TillClearingTypeCode: ").Append(TillClearingTypeCode).Append("\n");
            sb.Append("  SettlementTypeCode: ").Append(SettlementTypeCode).Append("\n");
            sb.Append("  PackageID: ").Append(PackageID).Append("\n");
            sb.Append("  TrainingModeFlag: ").Append(TrainingModeFlag).Append("\n");
            sb.Append("  StatusDateTimeStamp: ").Append(StatusDateTimeStamp).Append("\n");
            sb.Append("  TillEnabled: ").Append(TillEnabled).Append("\n");
            sb.Append("  Xxcustom05: ").Append(Xxcustom05).Append("\n");
            sb.Append("  Xxcustom03: ").Append(Xxcustom03).Append("\n");
            sb.Append("  Xxcustom02: ").Append(Xxcustom02).Append("\n");
            sb.Append("  Xxcustom04: ").Append(Xxcustom04).Append("\n");
            sb.Append("  Xxcustom01: ").Append(Xxcustom01).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 ComGkSoftwareGkrApiServerMdTillDtoDomTillDO);
        }

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

            return 
                (
                    this.Key == input.Key ||
                    (this.Key != null &&
                    this.Key.Equals(input.Key))
                ) && 
                (
                    this.DefaultOpeningCashBalanceAmount == input.DefaultOpeningCashBalanceAmount ||
                    (this.DefaultOpeningCashBalanceAmount != null &&
                    this.DefaultOpeningCashBalanceAmount.Equals(input.DefaultOpeningCashBalanceAmount))
                ) && 
                (
                    this.LoanCalculationRequiredFlag == input.LoanCalculationRequiredFlag ||
                    (this.LoanCalculationRequiredFlag != null &&
                    this.LoanCalculationRequiredFlag.Equals(input.LoanCalculationRequiredFlag))
                ) && 
                (
                    this.LoanRequiredFlag == input.LoanRequiredFlag ||
                    (this.LoanRequiredFlag != null &&
                    this.LoanRequiredFlag.Equals(input.LoanRequiredFlag))
                ) && 
                (
                    this.BlockingFlag == input.BlockingFlag ||
                    (this.BlockingFlag != null &&
                    this.BlockingFlag.Equals(input.BlockingFlag))
                ) && 
                (
                    this.TillBarcode == input.TillBarcode ||
                    (this.TillBarcode != null &&
                    this.TillBarcode.Equals(input.TillBarcode))
                ) && 
                (
                    this.AssignmentTypeCode == input.AssignmentTypeCode ||
                    (this.AssignmentTypeCode != null &&
                    this.AssignmentTypeCode.Equals(input.AssignmentTypeCode))
                ) && 
                (
                    this.WorkstationID == input.WorkstationID ||
                    (this.WorkstationID != null &&
                    this.WorkstationID.Equals(input.WorkstationID))
                ) && 
                (
                    this.TillOperatorList == input.TillOperatorList ||
                    this.TillOperatorList != null &&
                    this.TillOperatorList.SequenceEqual(input.TillOperatorList)
                ) && 
                (
                    this.TillClearingTypeCode == input.TillClearingTypeCode ||
                    (this.TillClearingTypeCode != null &&
                    this.TillClearingTypeCode.Equals(input.TillClearingTypeCode))
                ) && 
                (
                    this.SettlementTypeCode == input.SettlementTypeCode ||
                    (this.SettlementTypeCode != null &&
                    this.SettlementTypeCode.Equals(input.SettlementTypeCode))
                ) && 
                (
                    this.PackageID == input.PackageID ||
                    (this.PackageID != null &&
                    this.PackageID.Equals(input.PackageID))
                ) && 
                (
                    this.TrainingModeFlag == input.TrainingModeFlag ||
                    (this.TrainingModeFlag != null &&
                    this.TrainingModeFlag.Equals(input.TrainingModeFlag))
                ) && 
                (
                    this.StatusDateTimeStamp == input.StatusDateTimeStamp ||
                    (this.StatusDateTimeStamp != null &&
                    this.StatusDateTimeStamp.Equals(input.StatusDateTimeStamp))
                ) && 
                (
                    this.TillEnabled == input.TillEnabled ||
                    (this.TillEnabled != null &&
                    this.TillEnabled.Equals(input.TillEnabled))
                ) && 
                (
                    this.Xxcustom05 == input.Xxcustom05 ||
                    (this.Xxcustom05 != null &&
                    this.Xxcustom05.Equals(input.Xxcustom05))
                ) && 
                (
                    this.Xxcustom03 == input.Xxcustom03 ||
                    (this.Xxcustom03 != null &&
                    this.Xxcustom03.Equals(input.Xxcustom03))
                ) && 
                (
                    this.Xxcustom02 == input.Xxcustom02 ||
                    (this.Xxcustom02 != null &&
                    this.Xxcustom02.Equals(input.Xxcustom02))
                ) && 
                (
                    this.Xxcustom04 == input.Xxcustom04 ||
                    (this.Xxcustom04 != null &&
                    this.Xxcustom04.Equals(input.Xxcustom04))
                ) && 
                (
                    this.Xxcustom01 == input.Xxcustom01 ||
                    (this.Xxcustom01 != null &&
                    this.Xxcustom01.Equals(input.Xxcustom01))
                );
        }

        /// <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.Key != null)
                    hashCode = hashCode * 59 + this.Key.GetHashCode();
                if (this.DefaultOpeningCashBalanceAmount != null)
                    hashCode = hashCode * 59 + this.DefaultOpeningCashBalanceAmount.GetHashCode();
                if (this.LoanCalculationRequiredFlag != null)
                    hashCode = hashCode * 59 + this.LoanCalculationRequiredFlag.GetHashCode();
                if (this.LoanRequiredFlag != null)
                    hashCode = hashCode * 59 + this.LoanRequiredFlag.GetHashCode();
                if (this.BlockingFlag != null)
                    hashCode = hashCode * 59 + this.BlockingFlag.GetHashCode();
                if (this.TillBarcode != null)
                    hashCode = hashCode * 59 + this.TillBarcode.GetHashCode();
                if (this.AssignmentTypeCode != null)
                    hashCode = hashCode * 59 + this.AssignmentTypeCode.GetHashCode();
                if (this.WorkstationID != null)
                    hashCode = hashCode * 59 + this.WorkstationID.GetHashCode();
                if (this.TillOperatorList != null)
                    hashCode = hashCode * 59 + this.TillOperatorList.GetHashCode();
                if (this.TillClearingTypeCode != null)
                    hashCode = hashCode * 59 + this.TillClearingTypeCode.GetHashCode();
                if (this.SettlementTypeCode != null)
                    hashCode = hashCode * 59 + this.SettlementTypeCode.GetHashCode();
                if (this.PackageID != null)
                    hashCode = hashCode * 59 + this.PackageID.GetHashCode();
                if (this.TrainingModeFlag != null)
                    hashCode = hashCode * 59 + this.TrainingModeFlag.GetHashCode();
                if (this.StatusDateTimeStamp != null)
                    hashCode = hashCode * 59 + this.StatusDateTimeStamp.GetHashCode();
                if (this.TillEnabled != null)
                    hashCode = hashCode * 59 + this.TillEnabled.GetHashCode();
                if (this.Xxcustom05 != null)
                    hashCode = hashCode * 59 + this.Xxcustom05.GetHashCode();
                if (this.Xxcustom03 != null)
                    hashCode = hashCode * 59 + this.Xxcustom03.GetHashCode();
                if (this.Xxcustom02 != null)
                    hashCode = hashCode * 59 + this.Xxcustom02.GetHashCode();
                if (this.Xxcustom04 != null)
                    hashCode = hashCode * 59 + this.Xxcustom04.GetHashCode();
                if (this.Xxcustom01 != null)
                    hashCode = hashCode * 59 + this.Xxcustom01.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;
        }
    }

}
