/* 
 * 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>
    /// LayawaySummary &lt;emph&gt;undocumented&lt;/emph&gt;
    /// </summary>
    [DataContract]
    public partial class ComGkSoftwareGkrApiLayawayDtoLayawaySummary :  IEquatable<ComGkSoftwareGkrApiLayawayDtoLayawaySummary>, IValidatableObject
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="ComGkSoftwareGkrApiLayawayDtoLayawaySummary" /> class.
        /// </summary>
        [JsonConstructorAttribute]
        protected ComGkSoftwareGkrApiLayawayDtoLayawaySummary() { }
        /// <summary>
        /// Initializes a new instance of the <see cref="ComGkSoftwareGkrApiLayawayDtoLayawaySummary" /> class.
        /// </summary>
        /// <param name="businessUnitGroupID">BusinessUnitGroup identificator of the business unit, where the Layaway was created (required).</param>
        /// <param name="layawayID">ID of the Layaway (&#x3D; Transaction ID of Layaway create TX) (required).</param>
        /// <param name="createTimestamp">Timestamp when Layaway was created; Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone) (required).</param>
        /// <param name="createTimestampUTC0">UTC0 timestamp when Layaway was created; UTC0 date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZ&#39; (with timezone) (required).</param>
        /// <param name="statusCode">Status of the Layaway. Supported are:ACTIVEVOIDED FULLY_PAIDCLAIMEDTERMINATEDEXPIREDREBOOKED (required).</param>
        /// <param name="suspendedFlag">Layaway is blocked while there is a suspended, non-retrieved  Layaway relevant TX .Its not allowed to do anything else than to retrieve this suspend and finalize it. Or to expire/rebook/terminate a layaway. (required).</param>
        /// <param name="rebookedFlag">To know if layaway was already rebooked even if it is in CLAIMED status.Default: falseWill only be changed if Layaway Rebooking TX is consumed. (required).</param>
        /// <param name="claimedFlag">To know if layaway was already claimed even if it is in REBOOKED status.Default: falseWill only be changed if Layaway Claimed TX  is consumed. (required).</param>
        /// <param name="laywayUpdateSequence">Incrementing number counting modifications of a layaway, so that it is possible to find out which LW manipulation was the last (required).</param>
        /// <param name="pendingTransactionID">N/A.</param>
        /// <param name="lastUpdateTimeStamp">Last change of StatusCode; Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone) (required).</param>
        /// <param name="lastUpdateTimeStampUTC0">UTC0 timestamp of the last change of StatusCode; UTC0 date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZ&#39; (with timezone) (required).</param>
        /// <param name="customerID">Assigned customer ID to Layaway..</param>
        /// <param name="expirationDate">Expiration date of the Layaway (including the tolerance time). Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone).</param>
        /// <param name="expirationDateUTC0">UTC0 time of expiration date. UTC0 date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZ&#39; (with timezone).</param>
        /// <param name="expirationNotificationDate">Expiration date for customer (excluding the tolerance time). Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone).</param>
        /// <param name="expirationNotificationDateUTC0">UTC0 time of expiration date for customer. UTC0 date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZ&#39; (with timezone).</param>
        /// <param name="terminationDate">Termination date of the layaway. This is the date after no futher modifications of layaway are not allowed. Be it payment or whatever. Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone).</param>
        /// <param name="terminationDateUTC0">UTC0 time of TerminationDate; UTC0 date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZ&#39; (with timezone).</param>
        /// <param name="totalAmount">Total order value of the Layaway. (required).</param>
        /// <param name="totalDownPaymentsAmount">Total of the already payed down payments of the Layaway. (required).</param>
        /// <param name="penaltyFee">The fee has to be paid in case the customer retrieves its money back from an expired Layaway..</param>
        /// <param name="cancellationFee">The fee has to be paid in case the customer is voiding the complete Layaway..</param>
        /// <param name="layawayLineItemList">List of Layaway line items.</param>
        /// <param name="layawayCorrelationChecksum">Checksum of all related layaway transactions, used to guaranteee the state of the layaway while modifying it by storing additional transaction..</param>
        /// <param name="latestOrderPositionTransactionID">TransactionID for &#39;Latest Order Position Relevant TX&#39;.</param>
        /// <param name="expirationDateExtendedFlag">To know if the expiration date of a layaway was already extended.Default: falseWill only be changed if Extended Layaway TX is consumed..</param>
        /// <param name="xxcustom05">standard extension pattern for extending calculation in project.</param>
        /// <param name="xxcustom03">standard extension pattern for extending calculation in project.</param>
        /// <param name="xxcustom02">standard extension pattern for extending calculation in project.</param>
        /// <param name="xxcustom04">standard extension pattern for extending calculation in project.</param>
        /// <param name="xxcustom01">standard extension pattern for extending calculation in project.</param>
        public ComGkSoftwareGkrApiLayawayDtoLayawaySummary(string businessUnitGroupID = default(string), string layawayID = default(string), string createTimestamp = default(string), DateTime? createTimestampUTC0 = default(DateTime?), string statusCode = default(string), bool? suspendedFlag = default(bool?), bool? rebookedFlag = default(bool?), bool? claimedFlag = default(bool?), int? laywayUpdateSequence = default(int?), string pendingTransactionID = default(string), string lastUpdateTimeStamp = default(string), DateTime? lastUpdateTimeStampUTC0 = default(DateTime?), string customerID = default(string), string expirationDate = default(string), DateTime? expirationDateUTC0 = default(DateTime?), string expirationNotificationDate = default(string), DateTime? expirationNotificationDateUTC0 = default(DateTime?), string terminationDate = default(string), DateTime? terminationDateUTC0 = default(DateTime?), double? totalAmount = default(double?), double? totalDownPaymentsAmount = default(double?), double? penaltyFee = default(double?), double? cancellationFee = default(double?), List<ComGkSoftwareGkrApiLayawayDtoLayawayLineItem> layawayLineItemList = default(List<ComGkSoftwareGkrApiLayawayDtoLayawayLineItem>), string layawayCorrelationChecksum = default(string), string latestOrderPositionTransactionID = default(string), bool? expirationDateExtendedFlag = default(bool?), string xxcustom05 = default(string), string xxcustom03 = default(string), string xxcustom02 = default(string), string xxcustom04 = default(string), string xxcustom01 = default(string))
        {
            // to ensure "businessUnitGroupID" is required (not null)
            if (businessUnitGroupID == null)
            {
                throw new InvalidDataException("businessUnitGroupID is a required property for ComGkSoftwareGkrApiLayawayDtoLayawaySummary and cannot be null");
            }
            else
            {
                this.BusinessUnitGroupID = businessUnitGroupID;
            }
            // to ensure "layawayID" is required (not null)
            if (layawayID == null)
            {
                throw new InvalidDataException("layawayID is a required property for ComGkSoftwareGkrApiLayawayDtoLayawaySummary and cannot be null");
            }
            else
            {
                this.LayawayID = layawayID;
            }
            // to ensure "createTimestamp" is required (not null)
            if (createTimestamp == null)
            {
                throw new InvalidDataException("createTimestamp is a required property for ComGkSoftwareGkrApiLayawayDtoLayawaySummary and cannot be null");
            }
            else
            {
                this.CreateTimestamp = createTimestamp;
            }
            // to ensure "createTimestampUTC0" is required (not null)
            if (createTimestampUTC0 == null)
            {
                throw new InvalidDataException("createTimestampUTC0 is a required property for ComGkSoftwareGkrApiLayawayDtoLayawaySummary and cannot be null");
            }
            else
            {
                this.CreateTimestampUTC0 = createTimestampUTC0;
            }
            // to ensure "statusCode" is required (not null)
            if (statusCode == null)
            {
                throw new InvalidDataException("statusCode is a required property for ComGkSoftwareGkrApiLayawayDtoLayawaySummary and cannot be null");
            }
            else
            {
                this.StatusCode = statusCode;
            }
            // to ensure "suspendedFlag" is required (not null)
            if (suspendedFlag == null)
            {
                throw new InvalidDataException("suspendedFlag is a required property for ComGkSoftwareGkrApiLayawayDtoLayawaySummary and cannot be null");
            }
            else
            {
                this.SuspendedFlag = suspendedFlag;
            }
            // to ensure "rebookedFlag" is required (not null)
            if (rebookedFlag == null)
            {
                throw new InvalidDataException("rebookedFlag is a required property for ComGkSoftwareGkrApiLayawayDtoLayawaySummary and cannot be null");
            }
            else
            {
                this.RebookedFlag = rebookedFlag;
            }
            // to ensure "claimedFlag" is required (not null)
            if (claimedFlag == null)
            {
                throw new InvalidDataException("claimedFlag is a required property for ComGkSoftwareGkrApiLayawayDtoLayawaySummary and cannot be null");
            }
            else
            {
                this.ClaimedFlag = claimedFlag;
            }
            // to ensure "laywayUpdateSequence" is required (not null)
            if (laywayUpdateSequence == null)
            {
                throw new InvalidDataException("laywayUpdateSequence is a required property for ComGkSoftwareGkrApiLayawayDtoLayawaySummary and cannot be null");
            }
            else
            {
                this.LaywayUpdateSequence = laywayUpdateSequence;
            }
            // to ensure "lastUpdateTimeStamp" is required (not null)
            if (lastUpdateTimeStamp == null)
            {
                throw new InvalidDataException("lastUpdateTimeStamp is a required property for ComGkSoftwareGkrApiLayawayDtoLayawaySummary and cannot be null");
            }
            else
            {
                this.LastUpdateTimeStamp = lastUpdateTimeStamp;
            }
            // to ensure "lastUpdateTimeStampUTC0" is required (not null)
            if (lastUpdateTimeStampUTC0 == null)
            {
                throw new InvalidDataException("lastUpdateTimeStampUTC0 is a required property for ComGkSoftwareGkrApiLayawayDtoLayawaySummary and cannot be null");
            }
            else
            {
                this.LastUpdateTimeStampUTC0 = lastUpdateTimeStampUTC0;
            }
            // to ensure "totalAmount" is required (not null)
            if (totalAmount == null)
            {
                throw new InvalidDataException("totalAmount is a required property for ComGkSoftwareGkrApiLayawayDtoLayawaySummary and cannot be null");
            }
            else
            {
                this.TotalAmount = totalAmount;
            }
            // to ensure "totalDownPaymentsAmount" is required (not null)
            if (totalDownPaymentsAmount == null)
            {
                throw new InvalidDataException("totalDownPaymentsAmount is a required property for ComGkSoftwareGkrApiLayawayDtoLayawaySummary and cannot be null");
            }
            else
            {
                this.TotalDownPaymentsAmount = totalDownPaymentsAmount;
            }
            this.PendingTransactionID = pendingTransactionID;
            this.CustomerID = customerID;
            this.ExpirationDate = expirationDate;
            this.ExpirationDateUTC0 = expirationDateUTC0;
            this.ExpirationNotificationDate = expirationNotificationDate;
            this.ExpirationNotificationDateUTC0 = expirationNotificationDateUTC0;
            this.TerminationDate = terminationDate;
            this.TerminationDateUTC0 = terminationDateUTC0;
            this.PenaltyFee = penaltyFee;
            this.CancellationFee = cancellationFee;
            this.LayawayLineItemList = layawayLineItemList;
            this.LayawayCorrelationChecksum = layawayCorrelationChecksum;
            this.LatestOrderPositionTransactionID = latestOrderPositionTransactionID;
            this.ExpirationDateExtendedFlag = expirationDateExtendedFlag;
            this.Xxcustom05 = xxcustom05;
            this.Xxcustom03 = xxcustom03;
            this.Xxcustom02 = xxcustom02;
            this.Xxcustom04 = xxcustom04;
            this.Xxcustom01 = xxcustom01;
        }
        
        /// <summary>
        /// BusinessUnitGroup identificator of the business unit, where the Layaway was created
        /// </summary>
        /// <value>BusinessUnitGroup identificator of the business unit, where the Layaway was created</value>
        [DataMember(Name="businessUnitGroupID", EmitDefaultValue=false)]
        public string BusinessUnitGroupID { get; set; }

        /// <summary>
        /// ID of the Layaway (&#x3D; Transaction ID of Layaway create TX)
        /// </summary>
        /// <value>ID of the Layaway (&#x3D; Transaction ID of Layaway create TX)</value>
        [DataMember(Name="layawayID", EmitDefaultValue=false)]
        public string LayawayID { get; set; }

        /// <summary>
        /// Timestamp when Layaway was created; Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone)
        /// </summary>
        /// <value>Timestamp when Layaway was created; Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone)</value>
        [DataMember(Name="createTimestamp", EmitDefaultValue=false)]
        public string CreateTimestamp { get; set; }

        /// <summary>
        /// UTC0 timestamp when Layaway was created; UTC0 date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZ&#39; (with timezone)
        /// </summary>
        /// <value>UTC0 timestamp when Layaway was created; UTC0 date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZ&#39; (with timezone)</value>
        [DataMember(Name="createTimestampUTC0", EmitDefaultValue=false)]
        public DateTime? CreateTimestampUTC0 { get; set; }

        /// <summary>
        /// Status of the Layaway. Supported are:ACTIVEVOIDED FULLY_PAIDCLAIMEDTERMINATEDEXPIREDREBOOKED
        /// </summary>
        /// <value>Status of the Layaway. Supported are:ACTIVEVOIDED FULLY_PAIDCLAIMEDTERMINATEDEXPIREDREBOOKED</value>
        [DataMember(Name="statusCode", EmitDefaultValue=false)]
        public string StatusCode { get; set; }

        /// <summary>
        /// Layaway is blocked while there is a suspended, non-retrieved  Layaway relevant TX .Its not allowed to do anything else than to retrieve this suspend and finalize it. Or to expire/rebook/terminate a layaway.
        /// </summary>
        /// <value>Layaway is blocked while there is a suspended, non-retrieved  Layaway relevant TX .Its not allowed to do anything else than to retrieve this suspend and finalize it. Or to expire/rebook/terminate a layaway.</value>
        [DataMember(Name="suspendedFlag", EmitDefaultValue=false)]
        public bool? SuspendedFlag { get; set; }

        /// <summary>
        /// To know if layaway was already rebooked even if it is in CLAIMED status.Default: falseWill only be changed if Layaway Rebooking TX is consumed.
        /// </summary>
        /// <value>To know if layaway was already rebooked even if it is in CLAIMED status.Default: falseWill only be changed if Layaway Rebooking TX is consumed.</value>
        [DataMember(Name="rebookedFlag", EmitDefaultValue=false)]
        public bool? RebookedFlag { get; set; }

        /// <summary>
        /// To know if layaway was already claimed even if it is in REBOOKED status.Default: falseWill only be changed if Layaway Claimed TX  is consumed.
        /// </summary>
        /// <value>To know if layaway was already claimed even if it is in REBOOKED status.Default: falseWill only be changed if Layaway Claimed TX  is consumed.</value>
        [DataMember(Name="claimedFlag", EmitDefaultValue=false)]
        public bool? ClaimedFlag { get; set; }

        /// <summary>
        /// Incrementing number counting modifications of a layaway, so that it is possible to find out which LW manipulation was the last
        /// </summary>
        /// <value>Incrementing number counting modifications of a layaway, so that it is possible to find out which LW manipulation was the last</value>
        [DataMember(Name="laywayUpdateSequence", EmitDefaultValue=false)]
        public int? LaywayUpdateSequence { get; set; }

        /// <summary>
        /// N/A
        /// </summary>
        /// <value>N/A</value>
        [DataMember(Name="pendingTransactionID", EmitDefaultValue=false)]
        public string PendingTransactionID { get; set; }

        /// <summary>
        /// Last change of StatusCode; Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone)
        /// </summary>
        /// <value>Last change of StatusCode; Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone)</value>
        [DataMember(Name="lastUpdateTimeStamp", EmitDefaultValue=false)]
        public string LastUpdateTimeStamp { get; set; }

        /// <summary>
        /// UTC0 timestamp of the last change of StatusCode; UTC0 date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZ&#39; (with timezone)
        /// </summary>
        /// <value>UTC0 timestamp of the last change of StatusCode; UTC0 date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZ&#39; (with timezone)</value>
        [DataMember(Name="lastUpdateTimeStampUTC0", EmitDefaultValue=false)]
        public DateTime? LastUpdateTimeStampUTC0 { get; set; }

        /// <summary>
        /// Assigned customer ID to Layaway.
        /// </summary>
        /// <value>Assigned customer ID to Layaway.</value>
        [DataMember(Name="customerID", EmitDefaultValue=false)]
        public string CustomerID { get; set; }

        /// <summary>
        /// Expiration date of the Layaway (including the tolerance time). Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone)
        /// </summary>
        /// <value>Expiration date of the Layaway (including the tolerance time). Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone)</value>
        [DataMember(Name="expirationDate", EmitDefaultValue=false)]
        public string ExpirationDate { get; set; }

        /// <summary>
        /// UTC0 time of expiration date. UTC0 date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZ&#39; (with timezone)
        /// </summary>
        /// <value>UTC0 time of expiration date. UTC0 date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZ&#39; (with timezone)</value>
        [DataMember(Name="expirationDateUTC0", EmitDefaultValue=false)]
        public DateTime? ExpirationDateUTC0 { get; set; }

        /// <summary>
        /// Expiration date for customer (excluding the tolerance time). Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone)
        /// </summary>
        /// <value>Expiration date for customer (excluding the tolerance time). Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone)</value>
        [DataMember(Name="expirationNotificationDate", EmitDefaultValue=false)]
        public string ExpirationNotificationDate { get; set; }

        /// <summary>
        /// UTC0 time of expiration date for customer. UTC0 date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZ&#39; (with timezone)
        /// </summary>
        /// <value>UTC0 time of expiration date for customer. UTC0 date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZ&#39; (with timezone)</value>
        [DataMember(Name="expirationNotificationDateUTC0", EmitDefaultValue=false)]
        public DateTime? ExpirationNotificationDateUTC0 { get; set; }

        /// <summary>
        /// Termination date of the layaway. This is the date after no futher modifications of layaway are not allowed. Be it payment or whatever. Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone)
        /// </summary>
        /// <value>Termination date of the layaway. This is the date after no futher modifications of layaway are not allowed. Be it payment or whatever. Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone)</value>
        [DataMember(Name="terminationDate", EmitDefaultValue=false)]
        public string TerminationDate { get; set; }

        /// <summary>
        /// UTC0 time of TerminationDate; UTC0 date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZ&#39; (with timezone)
        /// </summary>
        /// <value>UTC0 time of TerminationDate; UTC0 date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSSZ&#39; (with timezone)</value>
        [DataMember(Name="terminationDateUTC0", EmitDefaultValue=false)]
        public DateTime? TerminationDateUTC0 { get; set; }

        /// <summary>
        /// Total order value of the Layaway.
        /// </summary>
        /// <value>Total order value of the Layaway.</value>
        [DataMember(Name="totalAmount", EmitDefaultValue=false)]
        public double? TotalAmount { get; set; }

        /// <summary>
        /// Total of the already payed down payments of the Layaway.
        /// </summary>
        /// <value>Total of the already payed down payments of the Layaway.</value>
        [DataMember(Name="totalDownPaymentsAmount", EmitDefaultValue=false)]
        public double? TotalDownPaymentsAmount { get; set; }

        /// <summary>
        /// The fee has to be paid in case the customer retrieves its money back from an expired Layaway.
        /// </summary>
        /// <value>The fee has to be paid in case the customer retrieves its money back from an expired Layaway.</value>
        [DataMember(Name="penaltyFee", EmitDefaultValue=false)]
        public double? PenaltyFee { get; set; }

        /// <summary>
        /// The fee has to be paid in case the customer is voiding the complete Layaway.
        /// </summary>
        /// <value>The fee has to be paid in case the customer is voiding the complete Layaway.</value>
        [DataMember(Name="cancellationFee", EmitDefaultValue=false)]
        public double? CancellationFee { get; set; }

        /// <summary>
        /// List of Layaway line items
        /// </summary>
        /// <value>List of Layaway line items</value>
        [DataMember(Name="layawayLineItemList", EmitDefaultValue=false)]
        public List<ComGkSoftwareGkrApiLayawayDtoLayawayLineItem> LayawayLineItemList { get; set; }

        /// <summary>
        /// Checksum of all related layaway transactions, used to guaranteee the state of the layaway while modifying it by storing additional transaction.
        /// </summary>
        /// <value>Checksum of all related layaway transactions, used to guaranteee the state of the layaway while modifying it by storing additional transaction.</value>
        [DataMember(Name="layawayCorrelationChecksum", EmitDefaultValue=false)]
        public string LayawayCorrelationChecksum { get; set; }

        /// <summary>
        /// TransactionID for &#39;Latest Order Position Relevant TX&#39;
        /// </summary>
        /// <value>TransactionID for &#39;Latest Order Position Relevant TX&#39;</value>
        [DataMember(Name="latestOrderPositionTransactionID", EmitDefaultValue=false)]
        public string LatestOrderPositionTransactionID { get; set; }

        /// <summary>
        /// To know if the expiration date of a layaway was already extended.Default: falseWill only be changed if Extended Layaway TX is consumed.
        /// </summary>
        /// <value>To know if the expiration date of a layaway was already extended.Default: falseWill only be changed if Extended Layaway TX is consumed.</value>
        [DataMember(Name="expirationDateExtendedFlag", EmitDefaultValue=false)]
        public bool? ExpirationDateExtendedFlag { get; set; }

        /// <summary>
        /// standard extension pattern for extending calculation in project
        /// </summary>
        /// <value>standard extension pattern for extending calculation in project</value>
        [DataMember(Name="xxcustom05", EmitDefaultValue=false)]
        public string Xxcustom05 { get; set; }

        /// <summary>
        /// standard extension pattern for extending calculation in project
        /// </summary>
        /// <value>standard extension pattern for extending calculation in project</value>
        [DataMember(Name="xxcustom03", EmitDefaultValue=false)]
        public string Xxcustom03 { get; set; }

        /// <summary>
        /// standard extension pattern for extending calculation in project
        /// </summary>
        /// <value>standard extension pattern for extending calculation in project</value>
        [DataMember(Name="xxcustom02", EmitDefaultValue=false)]
        public string Xxcustom02 { get; set; }

        /// <summary>
        /// standard extension pattern for extending calculation in project
        /// </summary>
        /// <value>standard extension pattern for extending calculation in project</value>
        [DataMember(Name="xxcustom04", EmitDefaultValue=false)]
        public string Xxcustom04 { get; set; }

        /// <summary>
        /// standard extension pattern for extending calculation in project
        /// </summary>
        /// <value>standard extension pattern for extending calculation in project</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 ComGkSoftwareGkrApiLayawayDtoLayawaySummary {\n");
            sb.Append("  BusinessUnitGroupID: ").Append(BusinessUnitGroupID).Append("\n");
            sb.Append("  LayawayID: ").Append(LayawayID).Append("\n");
            sb.Append("  CreateTimestamp: ").Append(CreateTimestamp).Append("\n");
            sb.Append("  CreateTimestampUTC0: ").Append(CreateTimestampUTC0).Append("\n");
            sb.Append("  StatusCode: ").Append(StatusCode).Append("\n");
            sb.Append("  SuspendedFlag: ").Append(SuspendedFlag).Append("\n");
            sb.Append("  RebookedFlag: ").Append(RebookedFlag).Append("\n");
            sb.Append("  ClaimedFlag: ").Append(ClaimedFlag).Append("\n");
            sb.Append("  LaywayUpdateSequence: ").Append(LaywayUpdateSequence).Append("\n");
            sb.Append("  PendingTransactionID: ").Append(PendingTransactionID).Append("\n");
            sb.Append("  LastUpdateTimeStamp: ").Append(LastUpdateTimeStamp).Append("\n");
            sb.Append("  LastUpdateTimeStampUTC0: ").Append(LastUpdateTimeStampUTC0).Append("\n");
            sb.Append("  CustomerID: ").Append(CustomerID).Append("\n");
            sb.Append("  ExpirationDate: ").Append(ExpirationDate).Append("\n");
            sb.Append("  ExpirationDateUTC0: ").Append(ExpirationDateUTC0).Append("\n");
            sb.Append("  ExpirationNotificationDate: ").Append(ExpirationNotificationDate).Append("\n");
            sb.Append("  ExpirationNotificationDateUTC0: ").Append(ExpirationNotificationDateUTC0).Append("\n");
            sb.Append("  TerminationDate: ").Append(TerminationDate).Append("\n");
            sb.Append("  TerminationDateUTC0: ").Append(TerminationDateUTC0).Append("\n");
            sb.Append("  TotalAmount: ").Append(TotalAmount).Append("\n");
            sb.Append("  TotalDownPaymentsAmount: ").Append(TotalDownPaymentsAmount).Append("\n");
            sb.Append("  PenaltyFee: ").Append(PenaltyFee).Append("\n");
            sb.Append("  CancellationFee: ").Append(CancellationFee).Append("\n");
            sb.Append("  LayawayLineItemList: ").Append(LayawayLineItemList).Append("\n");
            sb.Append("  LayawayCorrelationChecksum: ").Append(LayawayCorrelationChecksum).Append("\n");
            sb.Append("  LatestOrderPositionTransactionID: ").Append(LatestOrderPositionTransactionID).Append("\n");
            sb.Append("  ExpirationDateExtendedFlag: ").Append(ExpirationDateExtendedFlag).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 ComGkSoftwareGkrApiLayawayDtoLayawaySummary);
        }

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

            return 
                (
                    this.BusinessUnitGroupID == input.BusinessUnitGroupID ||
                    (this.BusinessUnitGroupID != null &&
                    this.BusinessUnitGroupID.Equals(input.BusinessUnitGroupID))
                ) && 
                (
                    this.LayawayID == input.LayawayID ||
                    (this.LayawayID != null &&
                    this.LayawayID.Equals(input.LayawayID))
                ) && 
                (
                    this.CreateTimestamp == input.CreateTimestamp ||
                    (this.CreateTimestamp != null &&
                    this.CreateTimestamp.Equals(input.CreateTimestamp))
                ) && 
                (
                    this.CreateTimestampUTC0 == input.CreateTimestampUTC0 ||
                    (this.CreateTimestampUTC0 != null &&
                    this.CreateTimestampUTC0.Equals(input.CreateTimestampUTC0))
                ) && 
                (
                    this.StatusCode == input.StatusCode ||
                    (this.StatusCode != null &&
                    this.StatusCode.Equals(input.StatusCode))
                ) && 
                (
                    this.SuspendedFlag == input.SuspendedFlag ||
                    (this.SuspendedFlag != null &&
                    this.SuspendedFlag.Equals(input.SuspendedFlag))
                ) && 
                (
                    this.RebookedFlag == input.RebookedFlag ||
                    (this.RebookedFlag != null &&
                    this.RebookedFlag.Equals(input.RebookedFlag))
                ) && 
                (
                    this.ClaimedFlag == input.ClaimedFlag ||
                    (this.ClaimedFlag != null &&
                    this.ClaimedFlag.Equals(input.ClaimedFlag))
                ) && 
                (
                    this.LaywayUpdateSequence == input.LaywayUpdateSequence ||
                    (this.LaywayUpdateSequence != null &&
                    this.LaywayUpdateSequence.Equals(input.LaywayUpdateSequence))
                ) && 
                (
                    this.PendingTransactionID == input.PendingTransactionID ||
                    (this.PendingTransactionID != null &&
                    this.PendingTransactionID.Equals(input.PendingTransactionID))
                ) && 
                (
                    this.LastUpdateTimeStamp == input.LastUpdateTimeStamp ||
                    (this.LastUpdateTimeStamp != null &&
                    this.LastUpdateTimeStamp.Equals(input.LastUpdateTimeStamp))
                ) && 
                (
                    this.LastUpdateTimeStampUTC0 == input.LastUpdateTimeStampUTC0 ||
                    (this.LastUpdateTimeStampUTC0 != null &&
                    this.LastUpdateTimeStampUTC0.Equals(input.LastUpdateTimeStampUTC0))
                ) && 
                (
                    this.CustomerID == input.CustomerID ||
                    (this.CustomerID != null &&
                    this.CustomerID.Equals(input.CustomerID))
                ) && 
                (
                    this.ExpirationDate == input.ExpirationDate ||
                    (this.ExpirationDate != null &&
                    this.ExpirationDate.Equals(input.ExpirationDate))
                ) && 
                (
                    this.ExpirationDateUTC0 == input.ExpirationDateUTC0 ||
                    (this.ExpirationDateUTC0 != null &&
                    this.ExpirationDateUTC0.Equals(input.ExpirationDateUTC0))
                ) && 
                (
                    this.ExpirationNotificationDate == input.ExpirationNotificationDate ||
                    (this.ExpirationNotificationDate != null &&
                    this.ExpirationNotificationDate.Equals(input.ExpirationNotificationDate))
                ) && 
                (
                    this.ExpirationNotificationDateUTC0 == input.ExpirationNotificationDateUTC0 ||
                    (this.ExpirationNotificationDateUTC0 != null &&
                    this.ExpirationNotificationDateUTC0.Equals(input.ExpirationNotificationDateUTC0))
                ) && 
                (
                    this.TerminationDate == input.TerminationDate ||
                    (this.TerminationDate != null &&
                    this.TerminationDate.Equals(input.TerminationDate))
                ) && 
                (
                    this.TerminationDateUTC0 == input.TerminationDateUTC0 ||
                    (this.TerminationDateUTC0 != null &&
                    this.TerminationDateUTC0.Equals(input.TerminationDateUTC0))
                ) && 
                (
                    this.TotalAmount == input.TotalAmount ||
                    (this.TotalAmount != null &&
                    this.TotalAmount.Equals(input.TotalAmount))
                ) && 
                (
                    this.TotalDownPaymentsAmount == input.TotalDownPaymentsAmount ||
                    (this.TotalDownPaymentsAmount != null &&
                    this.TotalDownPaymentsAmount.Equals(input.TotalDownPaymentsAmount))
                ) && 
                (
                    this.PenaltyFee == input.PenaltyFee ||
                    (this.PenaltyFee != null &&
                    this.PenaltyFee.Equals(input.PenaltyFee))
                ) && 
                (
                    this.CancellationFee == input.CancellationFee ||
                    (this.CancellationFee != null &&
                    this.CancellationFee.Equals(input.CancellationFee))
                ) && 
                (
                    this.LayawayLineItemList == input.LayawayLineItemList ||
                    this.LayawayLineItemList != null &&
                    this.LayawayLineItemList.SequenceEqual(input.LayawayLineItemList)
                ) && 
                (
                    this.LayawayCorrelationChecksum == input.LayawayCorrelationChecksum ||
                    (this.LayawayCorrelationChecksum != null &&
                    this.LayawayCorrelationChecksum.Equals(input.LayawayCorrelationChecksum))
                ) && 
                (
                    this.LatestOrderPositionTransactionID == input.LatestOrderPositionTransactionID ||
                    (this.LatestOrderPositionTransactionID != null &&
                    this.LatestOrderPositionTransactionID.Equals(input.LatestOrderPositionTransactionID))
                ) && 
                (
                    this.ExpirationDateExtendedFlag == input.ExpirationDateExtendedFlag ||
                    (this.ExpirationDateExtendedFlag != null &&
                    this.ExpirationDateExtendedFlag.Equals(input.ExpirationDateExtendedFlag))
                ) && 
                (
                    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.BusinessUnitGroupID != null)
                    hashCode = hashCode * 59 + this.BusinessUnitGroupID.GetHashCode();
                if (this.LayawayID != null)
                    hashCode = hashCode * 59 + this.LayawayID.GetHashCode();
                if (this.CreateTimestamp != null)
                    hashCode = hashCode * 59 + this.CreateTimestamp.GetHashCode();
                if (this.CreateTimestampUTC0 != null)
                    hashCode = hashCode * 59 + this.CreateTimestampUTC0.GetHashCode();
                if (this.StatusCode != null)
                    hashCode = hashCode * 59 + this.StatusCode.GetHashCode();
                if (this.SuspendedFlag != null)
                    hashCode = hashCode * 59 + this.SuspendedFlag.GetHashCode();
                if (this.RebookedFlag != null)
                    hashCode = hashCode * 59 + this.RebookedFlag.GetHashCode();
                if (this.ClaimedFlag != null)
                    hashCode = hashCode * 59 + this.ClaimedFlag.GetHashCode();
                if (this.LaywayUpdateSequence != null)
                    hashCode = hashCode * 59 + this.LaywayUpdateSequence.GetHashCode();
                if (this.PendingTransactionID != null)
                    hashCode = hashCode * 59 + this.PendingTransactionID.GetHashCode();
                if (this.LastUpdateTimeStamp != null)
                    hashCode = hashCode * 59 + this.LastUpdateTimeStamp.GetHashCode();
                if (this.LastUpdateTimeStampUTC0 != null)
                    hashCode = hashCode * 59 + this.LastUpdateTimeStampUTC0.GetHashCode();
                if (this.CustomerID != null)
                    hashCode = hashCode * 59 + this.CustomerID.GetHashCode();
                if (this.ExpirationDate != null)
                    hashCode = hashCode * 59 + this.ExpirationDate.GetHashCode();
                if (this.ExpirationDateUTC0 != null)
                    hashCode = hashCode * 59 + this.ExpirationDateUTC0.GetHashCode();
                if (this.ExpirationNotificationDate != null)
                    hashCode = hashCode * 59 + this.ExpirationNotificationDate.GetHashCode();
                if (this.ExpirationNotificationDateUTC0 != null)
                    hashCode = hashCode * 59 + this.ExpirationNotificationDateUTC0.GetHashCode();
                if (this.TerminationDate != null)
                    hashCode = hashCode * 59 + this.TerminationDate.GetHashCode();
                if (this.TerminationDateUTC0 != null)
                    hashCode = hashCode * 59 + this.TerminationDateUTC0.GetHashCode();
                if (this.TotalAmount != null)
                    hashCode = hashCode * 59 + this.TotalAmount.GetHashCode();
                if (this.TotalDownPaymentsAmount != null)
                    hashCode = hashCode * 59 + this.TotalDownPaymentsAmount.GetHashCode();
                if (this.PenaltyFee != null)
                    hashCode = hashCode * 59 + this.PenaltyFee.GetHashCode();
                if (this.CancellationFee != null)
                    hashCode = hashCode * 59 + this.CancellationFee.GetHashCode();
                if (this.LayawayLineItemList != null)
                    hashCode = hashCode * 59 + this.LayawayLineItemList.GetHashCode();
                if (this.LayawayCorrelationChecksum != null)
                    hashCode = hashCode * 59 + this.LayawayCorrelationChecksum.GetHashCode();
                if (this.LatestOrderPositionTransactionID != null)
                    hashCode = hashCode * 59 + this.LatestOrderPositionTransactionID.GetHashCode();
                if (this.ExpirationDateExtendedFlag != null)
                    hashCode = hashCode * 59 + this.ExpirationDateExtendedFlag.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;
        }
    }

}
