/*
 * Swagger of Opencellsoft Api
 * @#Introduction
 *
 * The version of the OpenAPI document: 7.3.1-SNAPSHOT
 * Contact: contact@opencellsoft.fr
 *
 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
 * https://openapi-generator.tech
 * Do not edit the class manually.
 */


package org.openapitools.client.model;

import java.util.Objects;
import java.util.Arrays;
import com.google.gson.TypeAdapter;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.openapitools.client.model.BillingAccount;
import org.openapitools.client.model.Characteristic;
import org.openapitools.client.model.CustomFieldsDto;
import org.openapitools.client.model.Customer;
import org.openapitools.client.model.GenerateInvoiceResultDto;
import org.openapitools.client.model.Note;
import org.openapitools.client.model.ProductQuoteItem;
import org.openapitools.client.model.QuoteProductOfferingPrice;
import org.openapitools.client.model.RelatedParty;
import org.openapitools.client.model.ServiceLevelAgreement;
import org.openapitools.client.model.TimeRange;
import org.threeten.bp.OffsetDateTime;

/**
 * ProductQuote
 */
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2019-09-13T10:03:17.753Z[GMT]")
public class ProductQuote {
  public static final String SERIALIZED_NAME_BILLING_ACCOUNT = "billingAccount";
  @SerializedName(SERIALIZED_NAME_BILLING_ACCOUNT)
  private List<BillingAccount> billingAccount = null;

  public static final String SERIALIZED_NAME_STATE = "state";
  @SerializedName(SERIALIZED_NAME_STATE)
  private String state;

  public static final String SERIALIZED_NAME_ID = "id";
  @SerializedName(SERIALIZED_NAME_ID)
  private String id;

  public static final String SERIALIZED_NAME_HREF = "href";
  @SerializedName(SERIALIZED_NAME_HREF)
  private String href;

  public static final String SERIALIZED_NAME_EXTERNAL_ID = "externalId";
  @SerializedName(SERIALIZED_NAME_EXTERNAL_ID)
  private String externalId;

  public static final String SERIALIZED_NAME_DESCRIPTION = "description";
  @SerializedName(SERIALIZED_NAME_DESCRIPTION)
  private String description;

  public static final String SERIALIZED_NAME_CATEGORY = "category";
  @SerializedName(SERIALIZED_NAME_CATEGORY)
  private String category;

  public static final String SERIALIZED_NAME_VERSION = "version";
  @SerializedName(SERIALIZED_NAME_VERSION)
  private String version;

  public static final String SERIALIZED_NAME_QUOTE_DATE = "quoteDate";
  @SerializedName(SERIALIZED_NAME_QUOTE_DATE)
  private OffsetDateTime quoteDate;

  public static final String SERIALIZED_NAME_EFFECTIVE_QUOTE_COMPLETION_DATE = "effectiveQuoteCompletionDate";
  @SerializedName(SERIALIZED_NAME_EFFECTIVE_QUOTE_COMPLETION_DATE)
  private OffsetDateTime effectiveQuoteCompletionDate;

  public static final String SERIALIZED_NAME_QUOTE_COMPLETION_DATE = "quoteCompletionDate";
  @SerializedName(SERIALIZED_NAME_QUOTE_COMPLETION_DATE)
  private OffsetDateTime quoteCompletionDate;

  public static final String SERIALIZED_NAME_FULFILLMENT_START_DATE = "fulfillmentStartDate";
  @SerializedName(SERIALIZED_NAME_FULFILLMENT_START_DATE)
  private OffsetDateTime fulfillmentStartDate;

  public static final String SERIALIZED_NAME_NOTIFICATION_CONTACT = "notificationContact";
  @SerializedName(SERIALIZED_NAME_NOTIFICATION_CONTACT)
  private String notificationContact;

  public static final String SERIALIZED_NAME_VALID_FOR = "validFor";
  @SerializedName(SERIALIZED_NAME_VALID_FOR)
  private TimeRange validFor;

  public static final String SERIALIZED_NAME_NOTE = "note";
  @SerializedName(SERIALIZED_NAME_NOTE)
  private List<Note> note = null;

  public static final String SERIALIZED_NAME_CHARACTERISTIC = "characteristic";
  @SerializedName(SERIALIZED_NAME_CHARACTERISTIC)
  private List<Characteristic> characteristic = null;

  public static final String SERIALIZED_NAME_CUSTOMER = "customer";
  @SerializedName(SERIALIZED_NAME_CUSTOMER)
  private Customer customer;

  public static final String SERIALIZED_NAME_RELATED_PARTY = "relatedParty";
  @SerializedName(SERIALIZED_NAME_RELATED_PARTY)
  private List<RelatedParty> relatedParty = null;

  public static final String SERIALIZED_NAME_AGREEMENT = "agreement";
  @SerializedName(SERIALIZED_NAME_AGREEMENT)
  private List<ServiceLevelAgreement> agreement = null;

  public static final String SERIALIZED_NAME_QUOTE_PRODUCT_OFFERING_PRICE = "quoteProductOfferingPrice";
  @SerializedName(SERIALIZED_NAME_QUOTE_PRODUCT_OFFERING_PRICE)
  private List<QuoteProductOfferingPrice> quoteProductOfferingPrice = null;

  public static final String SERIALIZED_NAME_QUOTE_ITEM = "quoteItem";
  @SerializedName(SERIALIZED_NAME_QUOTE_ITEM)
  private List<ProductQuoteItem> quoteItem = null;

  public static final String SERIALIZED_NAME_GENERATE_PDF = "generatePdf";
  @SerializedName(SERIALIZED_NAME_GENERATE_PDF)
  private Boolean generatePdf;

  public static final String SERIALIZED_NAME_CUSTOM_FIELDS = "customFields";
  @SerializedName(SERIALIZED_NAME_CUSTOM_FIELDS)
  private CustomFieldsDto customFields;

  public static final String SERIALIZED_NAME_INVOICES = "invoices";
  @SerializedName(SERIALIZED_NAME_INVOICES)
  private List<GenerateInvoiceResultDto> invoices = null;


  public ProductQuote billingAccount(List<BillingAccount> billingAccount) {
    
    this.billingAccount = billingAccount;
    return this;
  }

  public ProductQuote addBillingAccountItem(BillingAccount billingAccountItem) {
    if (this.billingAccount == null) {
      this.billingAccount = new ArrayList<BillingAccount>();
    }
    this.billingAccount.add(billingAccountItem);
    return this;
  }

   /**
   * Get billingAccount
   * @return billingAccount
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<BillingAccount> getBillingAccount() {
    return billingAccount;
  }



  public void setBillingAccount(List<BillingAccount> billingAccount) {
    this.billingAccount = billingAccount;
  }


  public ProductQuote state(String state) {
    
    this.state = state;
    return this;
  }

   /**
   * Get state
   * @return state
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public String getState() {
    return state;
  }



  public void setState(String state) {
    this.state = state;
  }


  public ProductQuote id(String id) {
    
    this.id = id;
    return this;
  }

   /**
   * Get id
   * @return id
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public String getId() {
    return id;
  }



  public void setId(String id) {
    this.id = id;
  }


  public ProductQuote href(String href) {
    
    this.href = href;
    return this;
  }

   /**
   * Get href
   * @return href
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public String getHref() {
    return href;
  }



  public void setHref(String href) {
    this.href = href;
  }


  public ProductQuote externalId(String externalId) {
    
    this.externalId = externalId;
    return this;
  }

   /**
   * Get externalId
   * @return externalId
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public String getExternalId() {
    return externalId;
  }



  public void setExternalId(String externalId) {
    this.externalId = externalId;
  }


  public ProductQuote description(String description) {
    
    this.description = description;
    return this;
  }

   /**
   * Get description
   * @return description
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public String getDescription() {
    return description;
  }



  public void setDescription(String description) {
    this.description = description;
  }


  public ProductQuote category(String category) {
    
    this.category = category;
    return this;
  }

   /**
   * Get category
   * @return category
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public String getCategory() {
    return category;
  }



  public void setCategory(String category) {
    this.category = category;
  }


  public ProductQuote version(String version) {
    
    this.version = version;
    return this;
  }

   /**
   * Get version
   * @return version
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public String getVersion() {
    return version;
  }



  public void setVersion(String version) {
    this.version = version;
  }


  public ProductQuote quoteDate(OffsetDateTime quoteDate) {
    
    this.quoteDate = quoteDate;
    return this;
  }

   /**
   * Get quoteDate
   * @return quoteDate
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public OffsetDateTime getQuoteDate() {
    return quoteDate;
  }



  public void setQuoteDate(OffsetDateTime quoteDate) {
    this.quoteDate = quoteDate;
  }


  public ProductQuote effectiveQuoteCompletionDate(OffsetDateTime effectiveQuoteCompletionDate) {
    
    this.effectiveQuoteCompletionDate = effectiveQuoteCompletionDate;
    return this;
  }

   /**
   * Get effectiveQuoteCompletionDate
   * @return effectiveQuoteCompletionDate
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public OffsetDateTime getEffectiveQuoteCompletionDate() {
    return effectiveQuoteCompletionDate;
  }



  public void setEffectiveQuoteCompletionDate(OffsetDateTime effectiveQuoteCompletionDate) {
    this.effectiveQuoteCompletionDate = effectiveQuoteCompletionDate;
  }


  public ProductQuote quoteCompletionDate(OffsetDateTime quoteCompletionDate) {
    
    this.quoteCompletionDate = quoteCompletionDate;
    return this;
  }

   /**
   * Get quoteCompletionDate
   * @return quoteCompletionDate
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public OffsetDateTime getQuoteCompletionDate() {
    return quoteCompletionDate;
  }



  public void setQuoteCompletionDate(OffsetDateTime quoteCompletionDate) {
    this.quoteCompletionDate = quoteCompletionDate;
  }


  public ProductQuote fulfillmentStartDate(OffsetDateTime fulfillmentStartDate) {
    
    this.fulfillmentStartDate = fulfillmentStartDate;
    return this;
  }

   /**
   * Get fulfillmentStartDate
   * @return fulfillmentStartDate
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public OffsetDateTime getFulfillmentStartDate() {
    return fulfillmentStartDate;
  }



  public void setFulfillmentStartDate(OffsetDateTime fulfillmentStartDate) {
    this.fulfillmentStartDate = fulfillmentStartDate;
  }


  public ProductQuote notificationContact(String notificationContact) {
    
    this.notificationContact = notificationContact;
    return this;
  }

   /**
   * Get notificationContact
   * @return notificationContact
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public String getNotificationContact() {
    return notificationContact;
  }



  public void setNotificationContact(String notificationContact) {
    this.notificationContact = notificationContact;
  }


  public ProductQuote validFor(TimeRange validFor) {
    
    this.validFor = validFor;
    return this;
  }

   /**
   * Get validFor
   * @return validFor
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public TimeRange getValidFor() {
    return validFor;
  }



  public void setValidFor(TimeRange validFor) {
    this.validFor = validFor;
  }


  public ProductQuote note(List<Note> note) {
    
    this.note = note;
    return this;
  }

  public ProductQuote addNoteItem(Note noteItem) {
    if (this.note == null) {
      this.note = new ArrayList<Note>();
    }
    this.note.add(noteItem);
    return this;
  }

   /**
   * Get note
   * @return note
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<Note> getNote() {
    return note;
  }



  public void setNote(List<Note> note) {
    this.note = note;
  }


  public ProductQuote characteristic(List<Characteristic> characteristic) {
    
    this.characteristic = characteristic;
    return this;
  }

  public ProductQuote addCharacteristicItem(Characteristic characteristicItem) {
    if (this.characteristic == null) {
      this.characteristic = new ArrayList<Characteristic>();
    }
    this.characteristic.add(characteristicItem);
    return this;
  }

   /**
   * Get characteristic
   * @return characteristic
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<Characteristic> getCharacteristic() {
    return characteristic;
  }



  public void setCharacteristic(List<Characteristic> characteristic) {
    this.characteristic = characteristic;
  }


  public ProductQuote customer(Customer customer) {
    
    this.customer = customer;
    return this;
  }

   /**
   * Get customer
   * @return customer
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public Customer getCustomer() {
    return customer;
  }



  public void setCustomer(Customer customer) {
    this.customer = customer;
  }


  public ProductQuote relatedParty(List<RelatedParty> relatedParty) {
    
    this.relatedParty = relatedParty;
    return this;
  }

  public ProductQuote addRelatedPartyItem(RelatedParty relatedPartyItem) {
    if (this.relatedParty == null) {
      this.relatedParty = new ArrayList<RelatedParty>();
    }
    this.relatedParty.add(relatedPartyItem);
    return this;
  }

   /**
   * Get relatedParty
   * @return relatedParty
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<RelatedParty> getRelatedParty() {
    return relatedParty;
  }



  public void setRelatedParty(List<RelatedParty> relatedParty) {
    this.relatedParty = relatedParty;
  }


  public ProductQuote agreement(List<ServiceLevelAgreement> agreement) {
    
    this.agreement = agreement;
    return this;
  }

  public ProductQuote addAgreementItem(ServiceLevelAgreement agreementItem) {
    if (this.agreement == null) {
      this.agreement = new ArrayList<ServiceLevelAgreement>();
    }
    this.agreement.add(agreementItem);
    return this;
  }

   /**
   * Get agreement
   * @return agreement
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<ServiceLevelAgreement> getAgreement() {
    return agreement;
  }



  public void setAgreement(List<ServiceLevelAgreement> agreement) {
    this.agreement = agreement;
  }


  public ProductQuote quoteProductOfferingPrice(List<QuoteProductOfferingPrice> quoteProductOfferingPrice) {
    
    this.quoteProductOfferingPrice = quoteProductOfferingPrice;
    return this;
  }

  public ProductQuote addQuoteProductOfferingPriceItem(QuoteProductOfferingPrice quoteProductOfferingPriceItem) {
    if (this.quoteProductOfferingPrice == null) {
      this.quoteProductOfferingPrice = new ArrayList<QuoteProductOfferingPrice>();
    }
    this.quoteProductOfferingPrice.add(quoteProductOfferingPriceItem);
    return this;
  }

   /**
   * Get quoteProductOfferingPrice
   * @return quoteProductOfferingPrice
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<QuoteProductOfferingPrice> getQuoteProductOfferingPrice() {
    return quoteProductOfferingPrice;
  }



  public void setQuoteProductOfferingPrice(List<QuoteProductOfferingPrice> quoteProductOfferingPrice) {
    this.quoteProductOfferingPrice = quoteProductOfferingPrice;
  }


  public ProductQuote quoteItem(List<ProductQuoteItem> quoteItem) {
    
    this.quoteItem = quoteItem;
    return this;
  }

  public ProductQuote addQuoteItemItem(ProductQuoteItem quoteItemItem) {
    if (this.quoteItem == null) {
      this.quoteItem = new ArrayList<ProductQuoteItem>();
    }
    this.quoteItem.add(quoteItemItem);
    return this;
  }

   /**
   * Get quoteItem
   * @return quoteItem
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<ProductQuoteItem> getQuoteItem() {
    return quoteItem;
  }



  public void setQuoteItem(List<ProductQuoteItem> quoteItem) {
    this.quoteItem = quoteItem;
  }


  public ProductQuote generatePdf(Boolean generatePdf) {
    
    this.generatePdf = generatePdf;
    return this;
  }

   /**
   * Get generatePdf
   * @return generatePdf
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public Boolean getGeneratePdf() {
    return generatePdf;
  }



  public void setGeneratePdf(Boolean generatePdf) {
    this.generatePdf = generatePdf;
  }


  public ProductQuote customFields(CustomFieldsDto customFields) {
    
    this.customFields = customFields;
    return this;
  }

   /**
   * Get customFields
   * @return customFields
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public CustomFieldsDto getCustomFields() {
    return customFields;
  }



  public void setCustomFields(CustomFieldsDto customFields) {
    this.customFields = customFields;
  }


  public ProductQuote invoices(List<GenerateInvoiceResultDto> invoices) {
    
    this.invoices = invoices;
    return this;
  }

  public ProductQuote addInvoicesItem(GenerateInvoiceResultDto invoicesItem) {
    if (this.invoices == null) {
      this.invoices = new ArrayList<GenerateInvoiceResultDto>();
    }
    this.invoices.add(invoicesItem);
    return this;
  }

   /**
   * Get invoices
   * @return invoices
  **/
  @javax.annotation.Nullable
  @ApiModelProperty(value = "")

  public List<GenerateInvoiceResultDto> getInvoices() {
    return invoices;
  }



  public void setInvoices(List<GenerateInvoiceResultDto> invoices) {
    this.invoices = invoices;
  }


  @Override
  public boolean equals(java.lang.Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    ProductQuote productQuote = (ProductQuote) o;
    return Objects.equals(this.billingAccount, productQuote.billingAccount) &&
        Objects.equals(this.state, productQuote.state) &&
        Objects.equals(this.id, productQuote.id) &&
        Objects.equals(this.href, productQuote.href) &&
        Objects.equals(this.externalId, productQuote.externalId) &&
        Objects.equals(this.description, productQuote.description) &&
        Objects.equals(this.category, productQuote.category) &&
        Objects.equals(this.version, productQuote.version) &&
        Objects.equals(this.quoteDate, productQuote.quoteDate) &&
        Objects.equals(this.effectiveQuoteCompletionDate, productQuote.effectiveQuoteCompletionDate) &&
        Objects.equals(this.quoteCompletionDate, productQuote.quoteCompletionDate) &&
        Objects.equals(this.fulfillmentStartDate, productQuote.fulfillmentStartDate) &&
        Objects.equals(this.notificationContact, productQuote.notificationContact) &&
        Objects.equals(this.validFor, productQuote.validFor) &&
        Objects.equals(this.note, productQuote.note) &&
        Objects.equals(this.characteristic, productQuote.characteristic) &&
        Objects.equals(this.customer, productQuote.customer) &&
        Objects.equals(this.relatedParty, productQuote.relatedParty) &&
        Objects.equals(this.agreement, productQuote.agreement) &&
        Objects.equals(this.quoteProductOfferingPrice, productQuote.quoteProductOfferingPrice) &&
        Objects.equals(this.quoteItem, productQuote.quoteItem) &&
        Objects.equals(this.generatePdf, productQuote.generatePdf) &&
        Objects.equals(this.customFields, productQuote.customFields) &&
        Objects.equals(this.invoices, productQuote.invoices);
  }

  @Override
  public int hashCode() {
    return Objects.hash(billingAccount, state, id, href, externalId, description, category, version, quoteDate, effectiveQuoteCompletionDate, quoteCompletionDate, fulfillmentStartDate, notificationContact, validFor, note, characteristic, customer, relatedParty, agreement, quoteProductOfferingPrice, quoteItem, generatePdf, customFields, invoices);
  }


  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class ProductQuote {\n");
    sb.append("    billingAccount: ").append(toIndentedString(billingAccount)).append("\n");
    sb.append("    state: ").append(toIndentedString(state)).append("\n");
    sb.append("    id: ").append(toIndentedString(id)).append("\n");
    sb.append("    href: ").append(toIndentedString(href)).append("\n");
    sb.append("    externalId: ").append(toIndentedString(externalId)).append("\n");
    sb.append("    description: ").append(toIndentedString(description)).append("\n");
    sb.append("    category: ").append(toIndentedString(category)).append("\n");
    sb.append("    version: ").append(toIndentedString(version)).append("\n");
    sb.append("    quoteDate: ").append(toIndentedString(quoteDate)).append("\n");
    sb.append("    effectiveQuoteCompletionDate: ").append(toIndentedString(effectiveQuoteCompletionDate)).append("\n");
    sb.append("    quoteCompletionDate: ").append(toIndentedString(quoteCompletionDate)).append("\n");
    sb.append("    fulfillmentStartDate: ").append(toIndentedString(fulfillmentStartDate)).append("\n");
    sb.append("    notificationContact: ").append(toIndentedString(notificationContact)).append("\n");
    sb.append("    validFor: ").append(toIndentedString(validFor)).append("\n");
    sb.append("    note: ").append(toIndentedString(note)).append("\n");
    sb.append("    characteristic: ").append(toIndentedString(characteristic)).append("\n");
    sb.append("    customer: ").append(toIndentedString(customer)).append("\n");
    sb.append("    relatedParty: ").append(toIndentedString(relatedParty)).append("\n");
    sb.append("    agreement: ").append(toIndentedString(agreement)).append("\n");
    sb.append("    quoteProductOfferingPrice: ").append(toIndentedString(quoteProductOfferingPrice)).append("\n");
    sb.append("    quoteItem: ").append(toIndentedString(quoteItem)).append("\n");
    sb.append("    generatePdf: ").append(toIndentedString(generatePdf)).append("\n");
    sb.append("    customFields: ").append(toIndentedString(customFields)).append("\n");
    sb.append("    invoices: ").append(toIndentedString(invoices)).append("\n");
    sb.append("}");
    return sb.toString();
  }

  /**
   * Convert the given object to string with each line indented by 4 spaces
   * (except the first line).
   */
  private String toIndentedString(java.lang.Object o) {
    if (o == null) {
      return "null";
    }
    return o.toString().replace("\n", "\n    ");
  }

}

