/* 
 * 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>
    /// GradeDO &lt;p&gt;Grade of a fuel.&lt;br /&gt;&lt;/p&gt;
    /// </summary>
    [DataContract]
    public partial class ComGkSoftwareGkrApiServerMdPetrolDtoDomGradeDO :  IEquatable<ComGkSoftwareGkrApiServerMdPetrolDtoDomGradeDO>, IValidatableObject
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="ComGkSoftwareGkrApiServerMdPetrolDtoDomGradeDO" /> class.
        /// </summary>
        [JsonConstructorAttribute]
        protected ComGkSoftwareGkrApiServerMdPetrolDtoDomGradeDO() { }
        /// <summary>
        /// Initializes a new instance of the <see cref="ComGkSoftwareGkrApiServerMdPetrolDtoDomGradeDO" /> class.
        /// </summary>
        /// <param name="key">&lt;p&gt;Getter for inner key class.&lt;/p&gt; (required).</param>
        /// <param name="posItemID">&lt;p&gt;The barcode, point of sale scan code or other keyed identifying number used at POS and the internal stock keping ItemID for the item.&lt;br /&gt;&lt;/p&gt; (required).</param>
        /// <param name="firstTankID">&lt;p&gt;A unique identifier for this Tank&lt;br /&gt;&lt;/p&gt; (required).</param>
        /// <param name="secondTankID">&lt;p&gt;A unique identifier for this Tank&lt;br /&gt;&lt;/p&gt;.</param>
        /// <param name="blendPercentage">&lt;p&gt;The percentage of the final blend that the given  BULK ITEM constitutes. This ratio refers to the first tank. Meaning that the ratio for the 2nd tank in case of blended grades is 100 - BlendPercentage.&lt;br /&gt;&lt;/p&gt; (required).</param>
        /// <param name="xxcustom05">&lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;.</param>
        /// <param name="xxcustom03">&lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;.</param>
        /// <param name="xxcustom02">&lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;.</param>
        /// <param name="xxcustom04">&lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;.</param>
        /// <param name="xxcustom01">&lt;p&gt;Additional field for custom development.&lt;br /&gt;&lt;/p&gt;.</param>
        public ComGkSoftwareGkrApiServerMdPetrolDtoDomGradeDO(ComGkSoftwareGkrApiServerMdPetrolDtoDomGradeDOKey key = default(ComGkSoftwareGkrApiServerMdPetrolDtoDomGradeDOKey), string posItemID = default(string), string firstTankID = default(string), string secondTankID = default(string), double? blendPercentage = default(double?), string xxcustom05 = default(string), string xxcustom03 = default(string), string xxcustom02 = default(string), string xxcustom04 = default(string), string xxcustom01 = default(string))
        {
            // to ensure "key" is required (not null)
            if (key == null)
            {
                throw new InvalidDataException("key is a required property for ComGkSoftwareGkrApiServerMdPetrolDtoDomGradeDO and cannot be null");
            }
            else
            {
                this.Key = key;
            }
            // to ensure "posItemID" is required (not null)
            if (posItemID == null)
            {
                throw new InvalidDataException("posItemID is a required property for ComGkSoftwareGkrApiServerMdPetrolDtoDomGradeDO and cannot be null");
            }
            else
            {
                this.PosItemID = posItemID;
            }
            // to ensure "firstTankID" is required (not null)
            if (firstTankID == null)
            {
                throw new InvalidDataException("firstTankID is a required property for ComGkSoftwareGkrApiServerMdPetrolDtoDomGradeDO and cannot be null");
            }
            else
            {
                this.FirstTankID = firstTankID;
            }
            // to ensure "blendPercentage" is required (not null)
            if (blendPercentage == null)
            {
                throw new InvalidDataException("blendPercentage is a required property for ComGkSoftwareGkrApiServerMdPetrolDtoDomGradeDO and cannot be null");
            }
            else
            {
                this.BlendPercentage = blendPercentage;
            }
            this.SecondTankID = secondTankID;
            this.Xxcustom05 = xxcustom05;
            this.Xxcustom03 = xxcustom03;
            this.Xxcustom02 = xxcustom02;
            this.Xxcustom04 = xxcustom04;
            this.Xxcustom01 = xxcustom01;
        }
        
        /// <summary>
        /// &lt;p&gt;Getter for inner key class.&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;Getter for inner key class.&lt;/p&gt;</value>
        [DataMember(Name="key", EmitDefaultValue=false)]
        public ComGkSoftwareGkrApiServerMdPetrolDtoDomGradeDOKey Key { get; set; }

        /// <summary>
        /// &lt;p&gt;The barcode, point of sale scan code or other keyed identifying number used at POS and the internal stock keping ItemID for the item.&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;The barcode, point of sale scan code or other keyed identifying number used at POS and the internal stock keping ItemID for the item.&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="posItemID", EmitDefaultValue=false)]
        public string PosItemID { get; set; }

        /// <summary>
        /// &lt;p&gt;A unique identifier for this Tank&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;A unique identifier for this Tank&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="firstTankID", EmitDefaultValue=false)]
        public string FirstTankID { get; set; }

        /// <summary>
        /// &lt;p&gt;A unique identifier for this Tank&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;A unique identifier for this Tank&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="secondTankID", EmitDefaultValue=false)]
        public string SecondTankID { get; set; }

        /// <summary>
        /// &lt;p&gt;The percentage of the final blend that the given  BULK ITEM constitutes. This ratio refers to the first tank. Meaning that the ratio for the 2nd tank in case of blended grades is 100 - BlendPercentage.&lt;br /&gt;&lt;/p&gt;
        /// </summary>
        /// <value>&lt;p&gt;The percentage of the final blend that the given  BULK ITEM constitutes. This ratio refers to the first tank. Meaning that the ratio for the 2nd tank in case of blended grades is 100 - BlendPercentage.&lt;br /&gt;&lt;/p&gt;</value>
        [DataMember(Name="blendPercentage", EmitDefaultValue=false)]
        public double? BlendPercentage { get; set; }

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

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

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

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

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

        /// <summary>
        /// Returns the string presentation of the object
        /// </summary>
        /// <returns>String presentation of the object</returns>
        public override string ToString()
        {
            var sb = new StringBuilder();
            sb.Append("class ComGkSoftwareGkrApiServerMdPetrolDtoDomGradeDO {\n");
            sb.Append("  Key: ").Append(Key).Append("\n");
            sb.Append("  PosItemID: ").Append(PosItemID).Append("\n");
            sb.Append("  FirstTankID: ").Append(FirstTankID).Append("\n");
            sb.Append("  SecondTankID: ").Append(SecondTankID).Append("\n");
            sb.Append("  BlendPercentage: ").Append(BlendPercentage).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 ComGkSoftwareGkrApiServerMdPetrolDtoDomGradeDO);
        }

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

            return 
                (
                    this.Key == input.Key ||
                    (this.Key != null &&
                    this.Key.Equals(input.Key))
                ) && 
                (
                    this.PosItemID == input.PosItemID ||
                    (this.PosItemID != null &&
                    this.PosItemID.Equals(input.PosItemID))
                ) && 
                (
                    this.FirstTankID == input.FirstTankID ||
                    (this.FirstTankID != null &&
                    this.FirstTankID.Equals(input.FirstTankID))
                ) && 
                (
                    this.SecondTankID == input.SecondTankID ||
                    (this.SecondTankID != null &&
                    this.SecondTankID.Equals(input.SecondTankID))
                ) && 
                (
                    this.BlendPercentage == input.BlendPercentage ||
                    (this.BlendPercentage != null &&
                    this.BlendPercentage.Equals(input.BlendPercentage))
                ) && 
                (
                    this.Xxcustom05 == input.Xxcustom05 ||
                    (this.Xxcustom05 != null &&
                    this.Xxcustom05.Equals(input.Xxcustom05))
                ) && 
                (
                    this.Xxcustom03 == input.Xxcustom03 ||
                    (this.Xxcustom03 != null &&
                    this.Xxcustom03.Equals(input.Xxcustom03))
                ) && 
                (
                    this.Xxcustom02 == input.Xxcustom02 ||
                    (this.Xxcustom02 != null &&
                    this.Xxcustom02.Equals(input.Xxcustom02))
                ) && 
                (
                    this.Xxcustom04 == input.Xxcustom04 ||
                    (this.Xxcustom04 != null &&
                    this.Xxcustom04.Equals(input.Xxcustom04))
                ) && 
                (
                    this.Xxcustom01 == input.Xxcustom01 ||
                    (this.Xxcustom01 != null &&
                    this.Xxcustom01.Equals(input.Xxcustom01))
                );
        }

        /// <summary>
        /// Gets the hash code
        /// </summary>
        /// <returns>Hash code</returns>
        public override int GetHashCode()
        {
            unchecked // Overflow is fine, just wrap
            {
                int hashCode = 41;
                if (this.Key != null)
                    hashCode = hashCode * 59 + this.Key.GetHashCode();
                if (this.PosItemID != null)
                    hashCode = hashCode * 59 + this.PosItemID.GetHashCode();
                if (this.FirstTankID != null)
                    hashCode = hashCode * 59 + this.FirstTankID.GetHashCode();
                if (this.SecondTankID != null)
                    hashCode = hashCode * 59 + this.SecondTankID.GetHashCode();
                if (this.BlendPercentage != null)
                    hashCode = hashCode * 59 + this.BlendPercentage.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;
        }
    }

}
