/* 
 * 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>
    /// RetailTransactionPromotionPriceDerivationRule &lt;emph&gt;undocumented&lt;/emph&gt;
    /// </summary>
    [DataContract]
    public partial class ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule :  IEquatable<ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule>, IValidatableObject
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule" /> class.
        /// </summary>
        [JsonConstructorAttribute]
        protected ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule() { }
        /// <summary>
        /// Initializes a new instance of the <see cref="ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule" /> class.
        /// </summary>
        /// <param name="key">&lt;p&gt;Getter for inner key class.&lt;/p&gt; (required).</param>
        /// <param name="promotionDescription">Short description of the promotion .</param>
        /// <param name="receiptPrinterName">Text to be printed on the receipt .</param>
        /// <param name="promotionPriceDerivationRuleSequence">Sequence - for collision handling .</param>
        /// <param name="promotionPriceDerivationRuleResolution">Resolution - for collision handling .</param>
        /// <param name="promotionPriceDerivationRuleTypeCode">The typecode of the promotion price derivation rule .</param>
        /// <param name="transactionControlBreakCode">This type code defines the base for applying the condition and it defines the calculation time..</param>
        /// <param name="priceModificationMethodCode">A code denoting the method of modifying the price that is being applied to the transaction resp. line item .</param>
        /// <param name="priceDerivationRuleDescription">Business description for this price derivation rule. .</param>
        /// <param name="promotionOriginatorTypeCode">The typecode of the originator of the promotion .</param>
        /// <param name="externalPromotionID">The external identifier of the promotion .</param>
        /// <param name="externalPriceDerivationRuleID">The external identifier of the price derivation rule .</param>
        /// <param name="triggerQuantity">The quantity of items fulfilling the eligibility which is required to be purchased to trigger the price derivation rule.  (required).</param>
        /// <param name="giftCertificateExpirationDate">End of the date range in which the gift certificate is valid ; Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone).</param>
        /// <param name="discountMethodCode">Determines how the discount influences the transaction..</param>
        /// <param name="frequentShopperPointsFlag">Determines whether disocunt or frequent shopper points are awarded by the price derivation rule  (required).</param>
        /// <param name="customerGroupLoyaltyPointsDefaultQuantity">The count of default loyalty points assigned to the customer group  (required).</param>
        /// <param name="prohibitPrintFlag">Determines whether the result of the applied price derivation rule is to be suppressed on displays / not printed on the receipt; e.g. line item-related default points are not printed after each position, but only summarized at the end of the receipt  (required).</param>
        /// <param name="tenderTypeCode">A code which uniquely identifies the tender in case of rebate as tender..</param>
        /// <param name="promotionTypeName">Promotion type name .</param>
        /// <param name="calculationBase">Defines the calculation base for transaction related discounts..</param>
        /// <param name="pointsConversionAmount">Exchange rate for the conversion from points into local currency  (required).</param>
        /// <param name="noEffectOnSubsequentPriceDerivationRulesFlag">Determines whether applying this price derivation rule influences the calculation base of subsequent price derivation rules (false) or not (true). (required).</param>
        /// <param name="prohibitTransactionRelatedPriceDerivationRulesFlag">Determines whether applying this price derivation rule influences the calculation base of subsequent transaction-related price derivation rules (false) or not (true); is relevant for line item-related &#39;money&#39; price derivation rules only  (required).</param>
        /// <param name="couponPrintoutID">The number of the printout coupon .</param>
        /// <param name="couponPrintoutRule">The type code of the printout rule..</param>
        /// <param name="couponPrintoutText">The formatted text of the printout coupon .</param>
        /// <param name="exclusiveFlag">Determines whether this price derivation rule is an exclusive one  (required).</param>
        /// <param name="requireUserInteractionFlag">Determines whether an additional user interaction (pressing a button) is necessary in order to fulfill the eligibility for applying the price derivation rule  (required).</param>
        /// <param name="considerPreviousPriceDerivationRulesFlag">Indicates whether all price derivation rules which were applied before are to be considered (true) or not (false). (required).</param>
        /// <param name="concurrenceControlVector">Determines how this price derivation rule works in relation to other applicable price derivation rules .</param>
        /// <param name="appliedCount">Describes how often the current price derivation rule was applied  (required).</param>
        /// <param name="printoutValidityPeriod">Describes how long (how many days) the printed coupon/gift certificate is valid  (required).</param>
        /// <param name="externalActionID">The ident of the action which is to be performed by the client which invoked the pricing engine.</param>
        /// <param name="externalActionDescription">The description of the action which is to be performed by the client which invoked the pricing engine.</param>
        /// <param name="externalActionTextList">The texts for the action which is to be performed by the client which invoked the pricing engine.</param>
        /// <param name="externalActionParameterList">The parameters for the action which is to be performed by the client which invoked the pricing engine.</param>
        /// <param name="calculationBaseSequence">Determines which one of the previously applied modifiers is to be considered as calculation base for the current modification. In detail, the calculation base for the current price derivation rule is to be determined as following:- In case that no price derivation rules were applied before, it is the original price/total.- Null: all price derivation rules which were applied before the current price derivation rule are to be considered, i.e. the calculation base for the current price derivation rule equals to the new price of the price derivation rule which was applied just before it &#x3D; as latest. - Otherwise, the calculation base for the current price derivation rule equals to the new price of that price derivation rule which was applied one or more steps before it having the highest sequence &lt;&#x3D; CalculationBaseSequence (or the original price if no such price derivation rule was applied)..</param>
        /// <param name="externalOfferID">Another external ident of the promotion.It is needed by/known to the retailer..</param>
        /// <param name="additionalPriceTypeCode">The price type code of the additional price which got applied.</param>
        /// <param name="xxcustom08">Customizable information.</param>
        /// <param name="xxcustom10">Customizable information.</param>
        /// <param name="xxcustom09">Customizable information.</param>
        /// <param name="xxcustom07">Customizable information.</param>
        /// <param name="xxcustom05">Customizable information.</param>
        /// <param name="xxcustom06">Customizable information.</param>
        /// <param name="xxcustom11">Customizable information.</param>
        /// <param name="xxcustom12">Customizable information.</param>
        /// <param name="xxcustom13">Customizable information.</param>
        /// <param name="xxcustom14">Customizable information.</param>
        /// <param name="xxcustom15">Customizable information.</param>
        /// <param name="xxcustom03">Customizable information.</param>
        /// <param name="xxcustom02">Customizable information.</param>
        /// <param name="xxcustom04">Customizable information.</param>
        /// <param name="xxcustom01">Customizable information.</param>
        public ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule(ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRuleKey key = default(ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRuleKey), string promotionDescription = default(string), string receiptPrinterName = default(string), string promotionPriceDerivationRuleSequence = default(string), string promotionPriceDerivationRuleResolution = default(string), string promotionPriceDerivationRuleTypeCode = default(string), string transactionControlBreakCode = default(string), string priceModificationMethodCode = default(string), string priceDerivationRuleDescription = default(string), string promotionOriginatorTypeCode = default(string), string externalPromotionID = default(string), string externalPriceDerivationRuleID = default(string), double? triggerQuantity = default(double?), string giftCertificateExpirationDate = default(string), string discountMethodCode = default(string), bool? frequentShopperPointsFlag = default(bool?), double? customerGroupLoyaltyPointsDefaultQuantity = default(double?), bool? prohibitPrintFlag = default(bool?), string tenderTypeCode = default(string), string promotionTypeName = default(string), string calculationBase = default(string), double? pointsConversionAmount = default(double?), bool? noEffectOnSubsequentPriceDerivationRulesFlag = default(bool?), bool? prohibitTransactionRelatedPriceDerivationRulesFlag = default(bool?), string couponPrintoutID = default(string), string couponPrintoutRule = default(string), Object couponPrintoutText = default(Object), bool? exclusiveFlag = default(bool?), bool? requireUserInteractionFlag = default(bool?), bool? considerPreviousPriceDerivationRulesFlag = default(bool?), string concurrenceControlVector = default(string), double? appliedCount = default(double?), double? printoutValidityPeriod = default(double?), string externalActionID = default(string), string externalActionDescription = default(string), List<ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionExternalActionText> externalActionTextList = default(List<ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionExternalActionText>), List<ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionExternalActionParameter> externalActionParameterList = default(List<ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionExternalActionParameter>), string calculationBaseSequence = default(string), string externalOfferID = default(string), string additionalPriceTypeCode = default(string), string xxcustom08 = default(string), string xxcustom10 = default(string), string xxcustom09 = default(string), string xxcustom07 = default(string), string xxcustom05 = default(string), string xxcustom06 = default(string), string xxcustom11 = default(string), string xxcustom12 = default(string), string xxcustom13 = default(string), string xxcustom14 = default(string), string xxcustom15 = 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 ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule and cannot be null");
            }
            else
            {
                this.Key = key;
            }
            // to ensure "triggerQuantity" is required (not null)
            if (triggerQuantity == null)
            {
                throw new InvalidDataException("triggerQuantity is a required property for ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule and cannot be null");
            }
            else
            {
                this.TriggerQuantity = triggerQuantity;
            }
            // to ensure "frequentShopperPointsFlag" is required (not null)
            if (frequentShopperPointsFlag == null)
            {
                throw new InvalidDataException("frequentShopperPointsFlag is a required property for ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule and cannot be null");
            }
            else
            {
                this.FrequentShopperPointsFlag = frequentShopperPointsFlag;
            }
            // to ensure "customerGroupLoyaltyPointsDefaultQuantity" is required (not null)
            if (customerGroupLoyaltyPointsDefaultQuantity == null)
            {
                throw new InvalidDataException("customerGroupLoyaltyPointsDefaultQuantity is a required property for ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule and cannot be null");
            }
            else
            {
                this.CustomerGroupLoyaltyPointsDefaultQuantity = customerGroupLoyaltyPointsDefaultQuantity;
            }
            // to ensure "prohibitPrintFlag" is required (not null)
            if (prohibitPrintFlag == null)
            {
                throw new InvalidDataException("prohibitPrintFlag is a required property for ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule and cannot be null");
            }
            else
            {
                this.ProhibitPrintFlag = prohibitPrintFlag;
            }
            // to ensure "pointsConversionAmount" is required (not null)
            if (pointsConversionAmount == null)
            {
                throw new InvalidDataException("pointsConversionAmount is a required property for ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule and cannot be null");
            }
            else
            {
                this.PointsConversionAmount = pointsConversionAmount;
            }
            // to ensure "noEffectOnSubsequentPriceDerivationRulesFlag" is required (not null)
            if (noEffectOnSubsequentPriceDerivationRulesFlag == null)
            {
                throw new InvalidDataException("noEffectOnSubsequentPriceDerivationRulesFlag is a required property for ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule and cannot be null");
            }
            else
            {
                this.NoEffectOnSubsequentPriceDerivationRulesFlag = noEffectOnSubsequentPriceDerivationRulesFlag;
            }
            // to ensure "prohibitTransactionRelatedPriceDerivationRulesFlag" is required (not null)
            if (prohibitTransactionRelatedPriceDerivationRulesFlag == null)
            {
                throw new InvalidDataException("prohibitTransactionRelatedPriceDerivationRulesFlag is a required property for ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule and cannot be null");
            }
            else
            {
                this.ProhibitTransactionRelatedPriceDerivationRulesFlag = prohibitTransactionRelatedPriceDerivationRulesFlag;
            }
            // to ensure "exclusiveFlag" is required (not null)
            if (exclusiveFlag == null)
            {
                throw new InvalidDataException("exclusiveFlag is a required property for ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule and cannot be null");
            }
            else
            {
                this.ExclusiveFlag = exclusiveFlag;
            }
            // to ensure "requireUserInteractionFlag" is required (not null)
            if (requireUserInteractionFlag == null)
            {
                throw new InvalidDataException("requireUserInteractionFlag is a required property for ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule and cannot be null");
            }
            else
            {
                this.RequireUserInteractionFlag = requireUserInteractionFlag;
            }
            // to ensure "considerPreviousPriceDerivationRulesFlag" is required (not null)
            if (considerPreviousPriceDerivationRulesFlag == null)
            {
                throw new InvalidDataException("considerPreviousPriceDerivationRulesFlag is a required property for ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule and cannot be null");
            }
            else
            {
                this.ConsiderPreviousPriceDerivationRulesFlag = considerPreviousPriceDerivationRulesFlag;
            }
            // to ensure "appliedCount" is required (not null)
            if (appliedCount == null)
            {
                throw new InvalidDataException("appliedCount is a required property for ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule and cannot be null");
            }
            else
            {
                this.AppliedCount = appliedCount;
            }
            // to ensure "printoutValidityPeriod" is required (not null)
            if (printoutValidityPeriod == null)
            {
                throw new InvalidDataException("printoutValidityPeriod is a required property for ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule and cannot be null");
            }
            else
            {
                this.PrintoutValidityPeriod = printoutValidityPeriod;
            }
            this.PromotionDescription = promotionDescription;
            this.ReceiptPrinterName = receiptPrinterName;
            this.PromotionPriceDerivationRuleSequence = promotionPriceDerivationRuleSequence;
            this.PromotionPriceDerivationRuleResolution = promotionPriceDerivationRuleResolution;
            this.PromotionPriceDerivationRuleTypeCode = promotionPriceDerivationRuleTypeCode;
            this.TransactionControlBreakCode = transactionControlBreakCode;
            this.PriceModificationMethodCode = priceModificationMethodCode;
            this.PriceDerivationRuleDescription = priceDerivationRuleDescription;
            this.PromotionOriginatorTypeCode = promotionOriginatorTypeCode;
            this.ExternalPromotionID = externalPromotionID;
            this.ExternalPriceDerivationRuleID = externalPriceDerivationRuleID;
            this.GiftCertificateExpirationDate = giftCertificateExpirationDate;
            this.DiscountMethodCode = discountMethodCode;
            this.TenderTypeCode = tenderTypeCode;
            this.PromotionTypeName = promotionTypeName;
            this.CalculationBase = calculationBase;
            this.CouponPrintoutID = couponPrintoutID;
            this.CouponPrintoutRule = couponPrintoutRule;
            this.CouponPrintoutText = couponPrintoutText;
            this.ConcurrenceControlVector = concurrenceControlVector;
            this.ExternalActionID = externalActionID;
            this.ExternalActionDescription = externalActionDescription;
            this.ExternalActionTextList = externalActionTextList;
            this.ExternalActionParameterList = externalActionParameterList;
            this.CalculationBaseSequence = calculationBaseSequence;
            this.ExternalOfferID = externalOfferID;
            this.AdditionalPriceTypeCode = additionalPriceTypeCode;
            this.Xxcustom08 = xxcustom08;
            this.Xxcustom10 = xxcustom10;
            this.Xxcustom09 = xxcustom09;
            this.Xxcustom07 = xxcustom07;
            this.Xxcustom05 = xxcustom05;
            this.Xxcustom06 = xxcustom06;
            this.Xxcustom11 = xxcustom11;
            this.Xxcustom12 = xxcustom12;
            this.Xxcustom13 = xxcustom13;
            this.Xxcustom14 = xxcustom14;
            this.Xxcustom15 = xxcustom15;
            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 ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRuleKey Key { get; set; }

        /// <summary>
        /// Short description of the promotion 
        /// </summary>
        /// <value>Short description of the promotion </value>
        [DataMember(Name="promotionDescription", EmitDefaultValue=false)]
        public string PromotionDescription { get; set; }

        /// <summary>
        /// Text to be printed on the receipt 
        /// </summary>
        /// <value>Text to be printed on the receipt </value>
        [DataMember(Name="receiptPrinterName", EmitDefaultValue=false)]
        public string ReceiptPrinterName { get; set; }

        /// <summary>
        /// Sequence - for collision handling 
        /// </summary>
        /// <value>Sequence - for collision handling </value>
        [DataMember(Name="promotionPriceDerivationRuleSequence", EmitDefaultValue=false)]
        public string PromotionPriceDerivationRuleSequence { get; set; }

        /// <summary>
        /// Resolution - for collision handling 
        /// </summary>
        /// <value>Resolution - for collision handling </value>
        [DataMember(Name="promotionPriceDerivationRuleResolution", EmitDefaultValue=false)]
        public string PromotionPriceDerivationRuleResolution { get; set; }

        /// <summary>
        /// The typecode of the promotion price derivation rule 
        /// </summary>
        /// <value>The typecode of the promotion price derivation rule </value>
        [DataMember(Name="promotionPriceDerivationRuleTypeCode", EmitDefaultValue=false)]
        public string PromotionPriceDerivationRuleTypeCode { get; set; }

        /// <summary>
        /// This type code defines the base for applying the condition and it defines the calculation time.
        /// </summary>
        /// <value>This type code defines the base for applying the condition and it defines the calculation time.</value>
        [DataMember(Name="transactionControlBreakCode", EmitDefaultValue=false)]
        public string TransactionControlBreakCode { get; set; }

        /// <summary>
        /// A code denoting the method of modifying the price that is being applied to the transaction resp. line item 
        /// </summary>
        /// <value>A code denoting the method of modifying the price that is being applied to the transaction resp. line item </value>
        [DataMember(Name="priceModificationMethodCode", EmitDefaultValue=false)]
        public string PriceModificationMethodCode { get; set; }

        /// <summary>
        /// Business description for this price derivation rule. 
        /// </summary>
        /// <value>Business description for this price derivation rule. </value>
        [DataMember(Name="priceDerivationRuleDescription", EmitDefaultValue=false)]
        public string PriceDerivationRuleDescription { get; set; }

        /// <summary>
        /// The typecode of the originator of the promotion 
        /// </summary>
        /// <value>The typecode of the originator of the promotion </value>
        [DataMember(Name="promotionOriginatorTypeCode", EmitDefaultValue=false)]
        public string PromotionOriginatorTypeCode { get; set; }

        /// <summary>
        /// The external identifier of the promotion 
        /// </summary>
        /// <value>The external identifier of the promotion </value>
        [DataMember(Name="externalPromotionID", EmitDefaultValue=false)]
        public string ExternalPromotionID { get; set; }

        /// <summary>
        /// The external identifier of the price derivation rule 
        /// </summary>
        /// <value>The external identifier of the price derivation rule </value>
        [DataMember(Name="externalPriceDerivationRuleID", EmitDefaultValue=false)]
        public string ExternalPriceDerivationRuleID { get; set; }

        /// <summary>
        /// The quantity of items fulfilling the eligibility which is required to be purchased to trigger the price derivation rule. 
        /// </summary>
        /// <value>The quantity of items fulfilling the eligibility which is required to be purchased to trigger the price derivation rule. </value>
        [DataMember(Name="triggerQuantity", EmitDefaultValue=false)]
        public double? TriggerQuantity { get; set; }

        /// <summary>
        /// End of the date range in which the gift certificate is valid ; Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone)
        /// </summary>
        /// <value>End of the date range in which the gift certificate is valid ; Date format &#39;yyyy-MM-dd&#39;T&#39;HH:mm:ss.SSS&#39; (no timezone)</value>
        [DataMember(Name="giftCertificateExpirationDate", EmitDefaultValue=false)]
        public string GiftCertificateExpirationDate { get; set; }

        /// <summary>
        /// Determines how the discount influences the transaction.
        /// </summary>
        /// <value>Determines how the discount influences the transaction.</value>
        [DataMember(Name="discountMethodCode", EmitDefaultValue=false)]
        public string DiscountMethodCode { get; set; }

        /// <summary>
        /// Determines whether disocunt or frequent shopper points are awarded by the price derivation rule 
        /// </summary>
        /// <value>Determines whether disocunt or frequent shopper points are awarded by the price derivation rule </value>
        [DataMember(Name="frequentShopperPointsFlag", EmitDefaultValue=false)]
        public bool? FrequentShopperPointsFlag { get; set; }

        /// <summary>
        /// The count of default loyalty points assigned to the customer group 
        /// </summary>
        /// <value>The count of default loyalty points assigned to the customer group </value>
        [DataMember(Name="customerGroupLoyaltyPointsDefaultQuantity", EmitDefaultValue=false)]
        public double? CustomerGroupLoyaltyPointsDefaultQuantity { get; set; }

        /// <summary>
        /// Determines whether the result of the applied price derivation rule is to be suppressed on displays / not printed on the receipt; e.g. line item-related default points are not printed after each position, but only summarized at the end of the receipt 
        /// </summary>
        /// <value>Determines whether the result of the applied price derivation rule is to be suppressed on displays / not printed on the receipt; e.g. line item-related default points are not printed after each position, but only summarized at the end of the receipt </value>
        [DataMember(Name="prohibitPrintFlag", EmitDefaultValue=false)]
        public bool? ProhibitPrintFlag { get; set; }

        /// <summary>
        /// A code which uniquely identifies the tender in case of rebate as tender.
        /// </summary>
        /// <value>A code which uniquely identifies the tender in case of rebate as tender.</value>
        [DataMember(Name="tenderTypeCode", EmitDefaultValue=false)]
        public string TenderTypeCode { get; set; }

        /// <summary>
        /// Promotion type name 
        /// </summary>
        /// <value>Promotion type name </value>
        [DataMember(Name="promotionTypeName", EmitDefaultValue=false)]
        public string PromotionTypeName { get; set; }

        /// <summary>
        /// Defines the calculation base for transaction related discounts.
        /// </summary>
        /// <value>Defines the calculation base for transaction related discounts.</value>
        [DataMember(Name="calculationBase", EmitDefaultValue=false)]
        public string CalculationBase { get; set; }

        /// <summary>
        /// Exchange rate for the conversion from points into local currency 
        /// </summary>
        /// <value>Exchange rate for the conversion from points into local currency </value>
        [DataMember(Name="pointsConversionAmount", EmitDefaultValue=false)]
        public double? PointsConversionAmount { get; set; }

        /// <summary>
        /// Determines whether applying this price derivation rule influences the calculation base of subsequent price derivation rules (false) or not (true).
        /// </summary>
        /// <value>Determines whether applying this price derivation rule influences the calculation base of subsequent price derivation rules (false) or not (true).</value>
        [DataMember(Name="noEffectOnSubsequentPriceDerivationRulesFlag", EmitDefaultValue=false)]
        public bool? NoEffectOnSubsequentPriceDerivationRulesFlag { get; set; }

        /// <summary>
        /// Determines whether applying this price derivation rule influences the calculation base of subsequent transaction-related price derivation rules (false) or not (true); is relevant for line item-related &#39;money&#39; price derivation rules only 
        /// </summary>
        /// <value>Determines whether applying this price derivation rule influences the calculation base of subsequent transaction-related price derivation rules (false) or not (true); is relevant for line item-related &#39;money&#39; price derivation rules only </value>
        [DataMember(Name="prohibitTransactionRelatedPriceDerivationRulesFlag", EmitDefaultValue=false)]
        public bool? ProhibitTransactionRelatedPriceDerivationRulesFlag { get; set; }

        /// <summary>
        /// The number of the printout coupon 
        /// </summary>
        /// <value>The number of the printout coupon </value>
        [DataMember(Name="couponPrintoutID", EmitDefaultValue=false)]
        public string CouponPrintoutID { get; set; }

        /// <summary>
        /// The type code of the printout rule.
        /// </summary>
        /// <value>The type code of the printout rule.</value>
        [DataMember(Name="couponPrintoutRule", EmitDefaultValue=false)]
        public string CouponPrintoutRule { get; set; }

        /// <summary>
        /// The formatted text of the printout coupon 
        /// </summary>
        /// <value>The formatted text of the printout coupon </value>
        [DataMember(Name="couponPrintoutText", EmitDefaultValue=false)]
        public Object CouponPrintoutText { get; set; }

        /// <summary>
        /// Determines whether this price derivation rule is an exclusive one 
        /// </summary>
        /// <value>Determines whether this price derivation rule is an exclusive one </value>
        [DataMember(Name="exclusiveFlag", EmitDefaultValue=false)]
        public bool? ExclusiveFlag { get; set; }

        /// <summary>
        /// Determines whether an additional user interaction (pressing a button) is necessary in order to fulfill the eligibility for applying the price derivation rule 
        /// </summary>
        /// <value>Determines whether an additional user interaction (pressing a button) is necessary in order to fulfill the eligibility for applying the price derivation rule </value>
        [DataMember(Name="requireUserInteractionFlag", EmitDefaultValue=false)]
        public bool? RequireUserInteractionFlag { get; set; }

        /// <summary>
        /// Indicates whether all price derivation rules which were applied before are to be considered (true) or not (false).
        /// </summary>
        /// <value>Indicates whether all price derivation rules which were applied before are to be considered (true) or not (false).</value>
        [DataMember(Name="considerPreviousPriceDerivationRulesFlag", EmitDefaultValue=false)]
        public bool? ConsiderPreviousPriceDerivationRulesFlag { get; set; }

        /// <summary>
        /// Determines how this price derivation rule works in relation to other applicable price derivation rules 
        /// </summary>
        /// <value>Determines how this price derivation rule works in relation to other applicable price derivation rules </value>
        [DataMember(Name="concurrenceControlVector", EmitDefaultValue=false)]
        public string ConcurrenceControlVector { get; set; }

        /// <summary>
        /// Describes how often the current price derivation rule was applied 
        /// </summary>
        /// <value>Describes how often the current price derivation rule was applied </value>
        [DataMember(Name="appliedCount", EmitDefaultValue=false)]
        public double? AppliedCount { get; set; }

        /// <summary>
        /// Describes how long (how many days) the printed coupon/gift certificate is valid 
        /// </summary>
        /// <value>Describes how long (how many days) the printed coupon/gift certificate is valid </value>
        [DataMember(Name="printoutValidityPeriod", EmitDefaultValue=false)]
        public double? PrintoutValidityPeriod { get; set; }

        /// <summary>
        /// The ident of the action which is to be performed by the client which invoked the pricing engine
        /// </summary>
        /// <value>The ident of the action which is to be performed by the client which invoked the pricing engine</value>
        [DataMember(Name="externalActionID", EmitDefaultValue=false)]
        public string ExternalActionID { get; set; }

        /// <summary>
        /// The description of the action which is to be performed by the client which invoked the pricing engine
        /// </summary>
        /// <value>The description of the action which is to be performed by the client which invoked the pricing engine</value>
        [DataMember(Name="externalActionDescription", EmitDefaultValue=false)]
        public string ExternalActionDescription { get; set; }

        /// <summary>
        /// The texts for the action which is to be performed by the client which invoked the pricing engine
        /// </summary>
        /// <value>The texts for the action which is to be performed by the client which invoked the pricing engine</value>
        [DataMember(Name="externalActionTextList", EmitDefaultValue=false)]
        public List<ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionExternalActionText> ExternalActionTextList { get; set; }

        /// <summary>
        /// The parameters for the action which is to be performed by the client which invoked the pricing engine
        /// </summary>
        /// <value>The parameters for the action which is to be performed by the client which invoked the pricing engine</value>
        [DataMember(Name="externalActionParameterList", EmitDefaultValue=false)]
        public List<ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionExternalActionParameter> ExternalActionParameterList { get; set; }

        /// <summary>
        /// Determines which one of the previously applied modifiers is to be considered as calculation base for the current modification. In detail, the calculation base for the current price derivation rule is to be determined as following:- In case that no price derivation rules were applied before, it is the original price/total.- Null: all price derivation rules which were applied before the current price derivation rule are to be considered, i.e. the calculation base for the current price derivation rule equals to the new price of the price derivation rule which was applied just before it &#x3D; as latest. - Otherwise, the calculation base for the current price derivation rule equals to the new price of that price derivation rule which was applied one or more steps before it having the highest sequence &lt;&#x3D; CalculationBaseSequence (or the original price if no such price derivation rule was applied).
        /// </summary>
        /// <value>Determines which one of the previously applied modifiers is to be considered as calculation base for the current modification. In detail, the calculation base for the current price derivation rule is to be determined as following:- In case that no price derivation rules were applied before, it is the original price/total.- Null: all price derivation rules which were applied before the current price derivation rule are to be considered, i.e. the calculation base for the current price derivation rule equals to the new price of the price derivation rule which was applied just before it &#x3D; as latest. - Otherwise, the calculation base for the current price derivation rule equals to the new price of that price derivation rule which was applied one or more steps before it having the highest sequence &lt;&#x3D; CalculationBaseSequence (or the original price if no such price derivation rule was applied).</value>
        [DataMember(Name="calculationBaseSequence", EmitDefaultValue=false)]
        public string CalculationBaseSequence { get; set; }

        /// <summary>
        /// Another external ident of the promotion.It is needed by/known to the retailer.
        /// </summary>
        /// <value>Another external ident of the promotion.It is needed by/known to the retailer.</value>
        [DataMember(Name="externalOfferID", EmitDefaultValue=false)]
        public string ExternalOfferID { get; set; }

        /// <summary>
        /// The price type code of the additional price which got applied
        /// </summary>
        /// <value>The price type code of the additional price which got applied</value>
        [DataMember(Name="additionalPriceTypeCode", EmitDefaultValue=false)]
        public string AdditionalPriceTypeCode { get; set; }

        /// <summary>
        /// Customizable information
        /// </summary>
        /// <value>Customizable information</value>
        [DataMember(Name="xxcustom08", EmitDefaultValue=false)]
        public string Xxcustom08 { get; set; }

        /// <summary>
        /// Customizable information
        /// </summary>
        /// <value>Customizable information</value>
        [DataMember(Name="xxcustom10", EmitDefaultValue=false)]
        public string Xxcustom10 { get; set; }

        /// <summary>
        /// Customizable information
        /// </summary>
        /// <value>Customizable information</value>
        [DataMember(Name="xxcustom09", EmitDefaultValue=false)]
        public string Xxcustom09 { get; set; }

        /// <summary>
        /// Customizable information
        /// </summary>
        /// <value>Customizable information</value>
        [DataMember(Name="xxcustom07", EmitDefaultValue=false)]
        public string Xxcustom07 { get; set; }

        /// <summary>
        /// Customizable information
        /// </summary>
        /// <value>Customizable information</value>
        [DataMember(Name="xxcustom05", EmitDefaultValue=false)]
        public string Xxcustom05 { get; set; }

        /// <summary>
        /// Customizable information
        /// </summary>
        /// <value>Customizable information</value>
        [DataMember(Name="xxcustom06", EmitDefaultValue=false)]
        public string Xxcustom06 { get; set; }

        /// <summary>
        /// Customizable information
        /// </summary>
        /// <value>Customizable information</value>
        [DataMember(Name="xxcustom11", EmitDefaultValue=false)]
        public string Xxcustom11 { get; set; }

        /// <summary>
        /// Customizable information
        /// </summary>
        /// <value>Customizable information</value>
        [DataMember(Name="xxcustom12", EmitDefaultValue=false)]
        public string Xxcustom12 { get; set; }

        /// <summary>
        /// Customizable information
        /// </summary>
        /// <value>Customizable information</value>
        [DataMember(Name="xxcustom13", EmitDefaultValue=false)]
        public string Xxcustom13 { get; set; }

        /// <summary>
        /// Customizable information
        /// </summary>
        /// <value>Customizable information</value>
        [DataMember(Name="xxcustom14", EmitDefaultValue=false)]
        public string Xxcustom14 { get; set; }

        /// <summary>
        /// Customizable information
        /// </summary>
        /// <value>Customizable information</value>
        [DataMember(Name="xxcustom15", EmitDefaultValue=false)]
        public string Xxcustom15 { get; set; }

        /// <summary>
        /// Customizable information
        /// </summary>
        /// <value>Customizable information</value>
        [DataMember(Name="xxcustom03", EmitDefaultValue=false)]
        public string Xxcustom03 { get; set; }

        /// <summary>
        /// Customizable information
        /// </summary>
        /// <value>Customizable information</value>
        [DataMember(Name="xxcustom02", EmitDefaultValue=false)]
        public string Xxcustom02 { get; set; }

        /// <summary>
        /// Customizable information
        /// </summary>
        /// <value>Customizable information</value>
        [DataMember(Name="xxcustom04", EmitDefaultValue=false)]
        public string Xxcustom04 { get; set; }

        /// <summary>
        /// Customizable information
        /// </summary>
        /// <value>Customizable information</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 ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule {\n");
            sb.Append("  Key: ").Append(Key).Append("\n");
            sb.Append("  PromotionDescription: ").Append(PromotionDescription).Append("\n");
            sb.Append("  ReceiptPrinterName: ").Append(ReceiptPrinterName).Append("\n");
            sb.Append("  PromotionPriceDerivationRuleSequence: ").Append(PromotionPriceDerivationRuleSequence).Append("\n");
            sb.Append("  PromotionPriceDerivationRuleResolution: ").Append(PromotionPriceDerivationRuleResolution).Append("\n");
            sb.Append("  PromotionPriceDerivationRuleTypeCode: ").Append(PromotionPriceDerivationRuleTypeCode).Append("\n");
            sb.Append("  TransactionControlBreakCode: ").Append(TransactionControlBreakCode).Append("\n");
            sb.Append("  PriceModificationMethodCode: ").Append(PriceModificationMethodCode).Append("\n");
            sb.Append("  PriceDerivationRuleDescription: ").Append(PriceDerivationRuleDescription).Append("\n");
            sb.Append("  PromotionOriginatorTypeCode: ").Append(PromotionOriginatorTypeCode).Append("\n");
            sb.Append("  ExternalPromotionID: ").Append(ExternalPromotionID).Append("\n");
            sb.Append("  ExternalPriceDerivationRuleID: ").Append(ExternalPriceDerivationRuleID).Append("\n");
            sb.Append("  TriggerQuantity: ").Append(TriggerQuantity).Append("\n");
            sb.Append("  GiftCertificateExpirationDate: ").Append(GiftCertificateExpirationDate).Append("\n");
            sb.Append("  DiscountMethodCode: ").Append(DiscountMethodCode).Append("\n");
            sb.Append("  FrequentShopperPointsFlag: ").Append(FrequentShopperPointsFlag).Append("\n");
            sb.Append("  CustomerGroupLoyaltyPointsDefaultQuantity: ").Append(CustomerGroupLoyaltyPointsDefaultQuantity).Append("\n");
            sb.Append("  ProhibitPrintFlag: ").Append(ProhibitPrintFlag).Append("\n");
            sb.Append("  TenderTypeCode: ").Append(TenderTypeCode).Append("\n");
            sb.Append("  PromotionTypeName: ").Append(PromotionTypeName).Append("\n");
            sb.Append("  CalculationBase: ").Append(CalculationBase).Append("\n");
            sb.Append("  PointsConversionAmount: ").Append(PointsConversionAmount).Append("\n");
            sb.Append("  NoEffectOnSubsequentPriceDerivationRulesFlag: ").Append(NoEffectOnSubsequentPriceDerivationRulesFlag).Append("\n");
            sb.Append("  ProhibitTransactionRelatedPriceDerivationRulesFlag: ").Append(ProhibitTransactionRelatedPriceDerivationRulesFlag).Append("\n");
            sb.Append("  CouponPrintoutID: ").Append(CouponPrintoutID).Append("\n");
            sb.Append("  CouponPrintoutRule: ").Append(CouponPrintoutRule).Append("\n");
            sb.Append("  CouponPrintoutText: ").Append(CouponPrintoutText).Append("\n");
            sb.Append("  ExclusiveFlag: ").Append(ExclusiveFlag).Append("\n");
            sb.Append("  RequireUserInteractionFlag: ").Append(RequireUserInteractionFlag).Append("\n");
            sb.Append("  ConsiderPreviousPriceDerivationRulesFlag: ").Append(ConsiderPreviousPriceDerivationRulesFlag).Append("\n");
            sb.Append("  ConcurrenceControlVector: ").Append(ConcurrenceControlVector).Append("\n");
            sb.Append("  AppliedCount: ").Append(AppliedCount).Append("\n");
            sb.Append("  PrintoutValidityPeriod: ").Append(PrintoutValidityPeriod).Append("\n");
            sb.Append("  ExternalActionID: ").Append(ExternalActionID).Append("\n");
            sb.Append("  ExternalActionDescription: ").Append(ExternalActionDescription).Append("\n");
            sb.Append("  ExternalActionTextList: ").Append(ExternalActionTextList).Append("\n");
            sb.Append("  ExternalActionParameterList: ").Append(ExternalActionParameterList).Append("\n");
            sb.Append("  CalculationBaseSequence: ").Append(CalculationBaseSequence).Append("\n");
            sb.Append("  ExternalOfferID: ").Append(ExternalOfferID).Append("\n");
            sb.Append("  AdditionalPriceTypeCode: ").Append(AdditionalPriceTypeCode).Append("\n");
            sb.Append("  Xxcustom08: ").Append(Xxcustom08).Append("\n");
            sb.Append("  Xxcustom10: ").Append(Xxcustom10).Append("\n");
            sb.Append("  Xxcustom09: ").Append(Xxcustom09).Append("\n");
            sb.Append("  Xxcustom07: ").Append(Xxcustom07).Append("\n");
            sb.Append("  Xxcustom05: ").Append(Xxcustom05).Append("\n");
            sb.Append("  Xxcustom06: ").Append(Xxcustom06).Append("\n");
            sb.Append("  Xxcustom11: ").Append(Xxcustom11).Append("\n");
            sb.Append("  Xxcustom12: ").Append(Xxcustom12).Append("\n");
            sb.Append("  Xxcustom13: ").Append(Xxcustom13).Append("\n");
            sb.Append("  Xxcustom14: ").Append(Xxcustom14).Append("\n");
            sb.Append("  Xxcustom15: ").Append(Xxcustom15).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 ComGkSoftwareGkrApiTxpoolDtoRetailTransactionPromotionPriceDerivationRule);
        }

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

            return 
                (
                    this.Key == input.Key ||
                    (this.Key != null &&
                    this.Key.Equals(input.Key))
                ) && 
                (
                    this.PromotionDescription == input.PromotionDescription ||
                    (this.PromotionDescription != null &&
                    this.PromotionDescription.Equals(input.PromotionDescription))
                ) && 
                (
                    this.ReceiptPrinterName == input.ReceiptPrinterName ||
                    (this.ReceiptPrinterName != null &&
                    this.ReceiptPrinterName.Equals(input.ReceiptPrinterName))
                ) && 
                (
                    this.PromotionPriceDerivationRuleSequence == input.PromotionPriceDerivationRuleSequence ||
                    (this.PromotionPriceDerivationRuleSequence != null &&
                    this.PromotionPriceDerivationRuleSequence.Equals(input.PromotionPriceDerivationRuleSequence))
                ) && 
                (
                    this.PromotionPriceDerivationRuleResolution == input.PromotionPriceDerivationRuleResolution ||
                    (this.PromotionPriceDerivationRuleResolution != null &&
                    this.PromotionPriceDerivationRuleResolution.Equals(input.PromotionPriceDerivationRuleResolution))
                ) && 
                (
                    this.PromotionPriceDerivationRuleTypeCode == input.PromotionPriceDerivationRuleTypeCode ||
                    (this.PromotionPriceDerivationRuleTypeCode != null &&
                    this.PromotionPriceDerivationRuleTypeCode.Equals(input.PromotionPriceDerivationRuleTypeCode))
                ) && 
                (
                    this.TransactionControlBreakCode == input.TransactionControlBreakCode ||
                    (this.TransactionControlBreakCode != null &&
                    this.TransactionControlBreakCode.Equals(input.TransactionControlBreakCode))
                ) && 
                (
                    this.PriceModificationMethodCode == input.PriceModificationMethodCode ||
                    (this.PriceModificationMethodCode != null &&
                    this.PriceModificationMethodCode.Equals(input.PriceModificationMethodCode))
                ) && 
                (
                    this.PriceDerivationRuleDescription == input.PriceDerivationRuleDescription ||
                    (this.PriceDerivationRuleDescription != null &&
                    this.PriceDerivationRuleDescription.Equals(input.PriceDerivationRuleDescription))
                ) && 
                (
                    this.PromotionOriginatorTypeCode == input.PromotionOriginatorTypeCode ||
                    (this.PromotionOriginatorTypeCode != null &&
                    this.PromotionOriginatorTypeCode.Equals(input.PromotionOriginatorTypeCode))
                ) && 
                (
                    this.ExternalPromotionID == input.ExternalPromotionID ||
                    (this.ExternalPromotionID != null &&
                    this.ExternalPromotionID.Equals(input.ExternalPromotionID))
                ) && 
                (
                    this.ExternalPriceDerivationRuleID == input.ExternalPriceDerivationRuleID ||
                    (this.ExternalPriceDerivationRuleID != null &&
                    this.ExternalPriceDerivationRuleID.Equals(input.ExternalPriceDerivationRuleID))
                ) && 
                (
                    this.TriggerQuantity == input.TriggerQuantity ||
                    (this.TriggerQuantity != null &&
                    this.TriggerQuantity.Equals(input.TriggerQuantity))
                ) && 
                (
                    this.GiftCertificateExpirationDate == input.GiftCertificateExpirationDate ||
                    (this.GiftCertificateExpirationDate != null &&
                    this.GiftCertificateExpirationDate.Equals(input.GiftCertificateExpirationDate))
                ) && 
                (
                    this.DiscountMethodCode == input.DiscountMethodCode ||
                    (this.DiscountMethodCode != null &&
                    this.DiscountMethodCode.Equals(input.DiscountMethodCode))
                ) && 
                (
                    this.FrequentShopperPointsFlag == input.FrequentShopperPointsFlag ||
                    (this.FrequentShopperPointsFlag != null &&
                    this.FrequentShopperPointsFlag.Equals(input.FrequentShopperPointsFlag))
                ) && 
                (
                    this.CustomerGroupLoyaltyPointsDefaultQuantity == input.CustomerGroupLoyaltyPointsDefaultQuantity ||
                    (this.CustomerGroupLoyaltyPointsDefaultQuantity != null &&
                    this.CustomerGroupLoyaltyPointsDefaultQuantity.Equals(input.CustomerGroupLoyaltyPointsDefaultQuantity))
                ) && 
                (
                    this.ProhibitPrintFlag == input.ProhibitPrintFlag ||
                    (this.ProhibitPrintFlag != null &&
                    this.ProhibitPrintFlag.Equals(input.ProhibitPrintFlag))
                ) && 
                (
                    this.TenderTypeCode == input.TenderTypeCode ||
                    (this.TenderTypeCode != null &&
                    this.TenderTypeCode.Equals(input.TenderTypeCode))
                ) && 
                (
                    this.PromotionTypeName == input.PromotionTypeName ||
                    (this.PromotionTypeName != null &&
                    this.PromotionTypeName.Equals(input.PromotionTypeName))
                ) && 
                (
                    this.CalculationBase == input.CalculationBase ||
                    (this.CalculationBase != null &&
                    this.CalculationBase.Equals(input.CalculationBase))
                ) && 
                (
                    this.PointsConversionAmount == input.PointsConversionAmount ||
                    (this.PointsConversionAmount != null &&
                    this.PointsConversionAmount.Equals(input.PointsConversionAmount))
                ) && 
                (
                    this.NoEffectOnSubsequentPriceDerivationRulesFlag == input.NoEffectOnSubsequentPriceDerivationRulesFlag ||
                    (this.NoEffectOnSubsequentPriceDerivationRulesFlag != null &&
                    this.NoEffectOnSubsequentPriceDerivationRulesFlag.Equals(input.NoEffectOnSubsequentPriceDerivationRulesFlag))
                ) && 
                (
                    this.ProhibitTransactionRelatedPriceDerivationRulesFlag == input.ProhibitTransactionRelatedPriceDerivationRulesFlag ||
                    (this.ProhibitTransactionRelatedPriceDerivationRulesFlag != null &&
                    this.ProhibitTransactionRelatedPriceDerivationRulesFlag.Equals(input.ProhibitTransactionRelatedPriceDerivationRulesFlag))
                ) && 
                (
                    this.CouponPrintoutID == input.CouponPrintoutID ||
                    (this.CouponPrintoutID != null &&
                    this.CouponPrintoutID.Equals(input.CouponPrintoutID))
                ) && 
                (
                    this.CouponPrintoutRule == input.CouponPrintoutRule ||
                    (this.CouponPrintoutRule != null &&
                    this.CouponPrintoutRule.Equals(input.CouponPrintoutRule))
                ) && 
                (
                    this.CouponPrintoutText == input.CouponPrintoutText ||
                    (this.CouponPrintoutText != null &&
                    this.CouponPrintoutText.Equals(input.CouponPrintoutText))
                ) && 
                (
                    this.ExclusiveFlag == input.ExclusiveFlag ||
                    (this.ExclusiveFlag != null &&
                    this.ExclusiveFlag.Equals(input.ExclusiveFlag))
                ) && 
                (
                    this.RequireUserInteractionFlag == input.RequireUserInteractionFlag ||
                    (this.RequireUserInteractionFlag != null &&
                    this.RequireUserInteractionFlag.Equals(input.RequireUserInteractionFlag))
                ) && 
                (
                    this.ConsiderPreviousPriceDerivationRulesFlag == input.ConsiderPreviousPriceDerivationRulesFlag ||
                    (this.ConsiderPreviousPriceDerivationRulesFlag != null &&
                    this.ConsiderPreviousPriceDerivationRulesFlag.Equals(input.ConsiderPreviousPriceDerivationRulesFlag))
                ) && 
                (
                    this.ConcurrenceControlVector == input.ConcurrenceControlVector ||
                    (this.ConcurrenceControlVector != null &&
                    this.ConcurrenceControlVector.Equals(input.ConcurrenceControlVector))
                ) && 
                (
                    this.AppliedCount == input.AppliedCount ||
                    (this.AppliedCount != null &&
                    this.AppliedCount.Equals(input.AppliedCount))
                ) && 
                (
                    this.PrintoutValidityPeriod == input.PrintoutValidityPeriod ||
                    (this.PrintoutValidityPeriod != null &&
                    this.PrintoutValidityPeriod.Equals(input.PrintoutValidityPeriod))
                ) && 
                (
                    this.ExternalActionID == input.ExternalActionID ||
                    (this.ExternalActionID != null &&
                    this.ExternalActionID.Equals(input.ExternalActionID))
                ) && 
                (
                    this.ExternalActionDescription == input.ExternalActionDescription ||
                    (this.ExternalActionDescription != null &&
                    this.ExternalActionDescription.Equals(input.ExternalActionDescription))
                ) && 
                (
                    this.ExternalActionTextList == input.ExternalActionTextList ||
                    this.ExternalActionTextList != null &&
                    this.ExternalActionTextList.SequenceEqual(input.ExternalActionTextList)
                ) && 
                (
                    this.ExternalActionParameterList == input.ExternalActionParameterList ||
                    this.ExternalActionParameterList != null &&
                    this.ExternalActionParameterList.SequenceEqual(input.ExternalActionParameterList)
                ) && 
                (
                    this.CalculationBaseSequence == input.CalculationBaseSequence ||
                    (this.CalculationBaseSequence != null &&
                    this.CalculationBaseSequence.Equals(input.CalculationBaseSequence))
                ) && 
                (
                    this.ExternalOfferID == input.ExternalOfferID ||
                    (this.ExternalOfferID != null &&
                    this.ExternalOfferID.Equals(input.ExternalOfferID))
                ) && 
                (
                    this.AdditionalPriceTypeCode == input.AdditionalPriceTypeCode ||
                    (this.AdditionalPriceTypeCode != null &&
                    this.AdditionalPriceTypeCode.Equals(input.AdditionalPriceTypeCode))
                ) && 
                (
                    this.Xxcustom08 == input.Xxcustom08 ||
                    (this.Xxcustom08 != null &&
                    this.Xxcustom08.Equals(input.Xxcustom08))
                ) && 
                (
                    this.Xxcustom10 == input.Xxcustom10 ||
                    (this.Xxcustom10 != null &&
                    this.Xxcustom10.Equals(input.Xxcustom10))
                ) && 
                (
                    this.Xxcustom09 == input.Xxcustom09 ||
                    (this.Xxcustom09 != null &&
                    this.Xxcustom09.Equals(input.Xxcustom09))
                ) && 
                (
                    this.Xxcustom07 == input.Xxcustom07 ||
                    (this.Xxcustom07 != null &&
                    this.Xxcustom07.Equals(input.Xxcustom07))
                ) && 
                (
                    this.Xxcustom05 == input.Xxcustom05 ||
                    (this.Xxcustom05 != null &&
                    this.Xxcustom05.Equals(input.Xxcustom05))
                ) && 
                (
                    this.Xxcustom06 == input.Xxcustom06 ||
                    (this.Xxcustom06 != null &&
                    this.Xxcustom06.Equals(input.Xxcustom06))
                ) && 
                (
                    this.Xxcustom11 == input.Xxcustom11 ||
                    (this.Xxcustom11 != null &&
                    this.Xxcustom11.Equals(input.Xxcustom11))
                ) && 
                (
                    this.Xxcustom12 == input.Xxcustom12 ||
                    (this.Xxcustom12 != null &&
                    this.Xxcustom12.Equals(input.Xxcustom12))
                ) && 
                (
                    this.Xxcustom13 == input.Xxcustom13 ||
                    (this.Xxcustom13 != null &&
                    this.Xxcustom13.Equals(input.Xxcustom13))
                ) && 
                (
                    this.Xxcustom14 == input.Xxcustom14 ||
                    (this.Xxcustom14 != null &&
                    this.Xxcustom14.Equals(input.Xxcustom14))
                ) && 
                (
                    this.Xxcustom15 == input.Xxcustom15 ||
                    (this.Xxcustom15 != null &&
                    this.Xxcustom15.Equals(input.Xxcustom15))
                ) && 
                (
                    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.PromotionDescription != null)
                    hashCode = hashCode * 59 + this.PromotionDescription.GetHashCode();
                if (this.ReceiptPrinterName != null)
                    hashCode = hashCode * 59 + this.ReceiptPrinterName.GetHashCode();
                if (this.PromotionPriceDerivationRuleSequence != null)
                    hashCode = hashCode * 59 + this.PromotionPriceDerivationRuleSequence.GetHashCode();
                if (this.PromotionPriceDerivationRuleResolution != null)
                    hashCode = hashCode * 59 + this.PromotionPriceDerivationRuleResolution.GetHashCode();
                if (this.PromotionPriceDerivationRuleTypeCode != null)
                    hashCode = hashCode * 59 + this.PromotionPriceDerivationRuleTypeCode.GetHashCode();
                if (this.TransactionControlBreakCode != null)
                    hashCode = hashCode * 59 + this.TransactionControlBreakCode.GetHashCode();
                if (this.PriceModificationMethodCode != null)
                    hashCode = hashCode * 59 + this.PriceModificationMethodCode.GetHashCode();
                if (this.PriceDerivationRuleDescription != null)
                    hashCode = hashCode * 59 + this.PriceDerivationRuleDescription.GetHashCode();
                if (this.PromotionOriginatorTypeCode != null)
                    hashCode = hashCode * 59 + this.PromotionOriginatorTypeCode.GetHashCode();
                if (this.ExternalPromotionID != null)
                    hashCode = hashCode * 59 + this.ExternalPromotionID.GetHashCode();
                if (this.ExternalPriceDerivationRuleID != null)
                    hashCode = hashCode * 59 + this.ExternalPriceDerivationRuleID.GetHashCode();
                if (this.TriggerQuantity != null)
                    hashCode = hashCode * 59 + this.TriggerQuantity.GetHashCode();
                if (this.GiftCertificateExpirationDate != null)
                    hashCode = hashCode * 59 + this.GiftCertificateExpirationDate.GetHashCode();
                if (this.DiscountMethodCode != null)
                    hashCode = hashCode * 59 + this.DiscountMethodCode.GetHashCode();
                if (this.FrequentShopperPointsFlag != null)
                    hashCode = hashCode * 59 + this.FrequentShopperPointsFlag.GetHashCode();
                if (this.CustomerGroupLoyaltyPointsDefaultQuantity != null)
                    hashCode = hashCode * 59 + this.CustomerGroupLoyaltyPointsDefaultQuantity.GetHashCode();
                if (this.ProhibitPrintFlag != null)
                    hashCode = hashCode * 59 + this.ProhibitPrintFlag.GetHashCode();
                if (this.TenderTypeCode != null)
                    hashCode = hashCode * 59 + this.TenderTypeCode.GetHashCode();
                if (this.PromotionTypeName != null)
                    hashCode = hashCode * 59 + this.PromotionTypeName.GetHashCode();
                if (this.CalculationBase != null)
                    hashCode = hashCode * 59 + this.CalculationBase.GetHashCode();
                if (this.PointsConversionAmount != null)
                    hashCode = hashCode * 59 + this.PointsConversionAmount.GetHashCode();
                if (this.NoEffectOnSubsequentPriceDerivationRulesFlag != null)
                    hashCode = hashCode * 59 + this.NoEffectOnSubsequentPriceDerivationRulesFlag.GetHashCode();
                if (this.ProhibitTransactionRelatedPriceDerivationRulesFlag != null)
                    hashCode = hashCode * 59 + this.ProhibitTransactionRelatedPriceDerivationRulesFlag.GetHashCode();
                if (this.CouponPrintoutID != null)
                    hashCode = hashCode * 59 + this.CouponPrintoutID.GetHashCode();
                if (this.CouponPrintoutRule != null)
                    hashCode = hashCode * 59 + this.CouponPrintoutRule.GetHashCode();
                if (this.CouponPrintoutText != null)
                    hashCode = hashCode * 59 + this.CouponPrintoutText.GetHashCode();
                if (this.ExclusiveFlag != null)
                    hashCode = hashCode * 59 + this.ExclusiveFlag.GetHashCode();
                if (this.RequireUserInteractionFlag != null)
                    hashCode = hashCode * 59 + this.RequireUserInteractionFlag.GetHashCode();
                if (this.ConsiderPreviousPriceDerivationRulesFlag != null)
                    hashCode = hashCode * 59 + this.ConsiderPreviousPriceDerivationRulesFlag.GetHashCode();
                if (this.ConcurrenceControlVector != null)
                    hashCode = hashCode * 59 + this.ConcurrenceControlVector.GetHashCode();
                if (this.AppliedCount != null)
                    hashCode = hashCode * 59 + this.AppliedCount.GetHashCode();
                if (this.PrintoutValidityPeriod != null)
                    hashCode = hashCode * 59 + this.PrintoutValidityPeriod.GetHashCode();
                if (this.ExternalActionID != null)
                    hashCode = hashCode * 59 + this.ExternalActionID.GetHashCode();
                if (this.ExternalActionDescription != null)
                    hashCode = hashCode * 59 + this.ExternalActionDescription.GetHashCode();
                if (this.ExternalActionTextList != null)
                    hashCode = hashCode * 59 + this.ExternalActionTextList.GetHashCode();
                if (this.ExternalActionParameterList != null)
                    hashCode = hashCode * 59 + this.ExternalActionParameterList.GetHashCode();
                if (this.CalculationBaseSequence != null)
                    hashCode = hashCode * 59 + this.CalculationBaseSequence.GetHashCode();
                if (this.ExternalOfferID != null)
                    hashCode = hashCode * 59 + this.ExternalOfferID.GetHashCode();
                if (this.AdditionalPriceTypeCode != null)
                    hashCode = hashCode * 59 + this.AdditionalPriceTypeCode.GetHashCode();
                if (this.Xxcustom08 != null)
                    hashCode = hashCode * 59 + this.Xxcustom08.GetHashCode();
                if (this.Xxcustom10 != null)
                    hashCode = hashCode * 59 + this.Xxcustom10.GetHashCode();
                if (this.Xxcustom09 != null)
                    hashCode = hashCode * 59 + this.Xxcustom09.GetHashCode();
                if (this.Xxcustom07 != null)
                    hashCode = hashCode * 59 + this.Xxcustom07.GetHashCode();
                if (this.Xxcustom05 != null)
                    hashCode = hashCode * 59 + this.Xxcustom05.GetHashCode();
                if (this.Xxcustom06 != null)
                    hashCode = hashCode * 59 + this.Xxcustom06.GetHashCode();
                if (this.Xxcustom11 != null)
                    hashCode = hashCode * 59 + this.Xxcustom11.GetHashCode();
                if (this.Xxcustom12 != null)
                    hashCode = hashCode * 59 + this.Xxcustom12.GetHashCode();
                if (this.Xxcustom13 != null)
                    hashCode = hashCode * 59 + this.Xxcustom13.GetHashCode();
                if (this.Xxcustom14 != null)
                    hashCode = hashCode * 59 + this.Xxcustom14.GetHashCode();
                if (this.Xxcustom15 != null)
                    hashCode = hashCode * 59 + this.Xxcustom15.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;
        }
    }

}
