All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.wix.pay.creditcard.CreditCardOptionalFields.scala Maven / Gradle / Ivy

The newest version!
/*      __ __ _____  __                                              *\
**     / // // /_/ |/ /          Wix                                 **
**    / // // / /|   /           (c) 2006-2015, Wix LTD.             **
**   / // // / //   |            http://www.wix.com/                 **
**   \__/|__/_//_/| |                                                **
\*                |/                                                 */
package com.wix.pay.creditcard


/** Container that holds optional fields of a Credit Card (e.g., csc, holder ID).
  *
  * @author Raz, Ohad
  */
case class CreditCardOptionalFields(override val csc: Option[String] = None,
                                    publicFields: Option[PublicCreditCardOptionalFields] = None)
    extends Serializable with CommonCreditCardFields {

  override def holderId: Option[String] = publicFields flatMap(_.holderId)
  override def holderName: Option[String] = publicFields flatMap(_.holderName)
  override def billingAddress: Option[String] = publicFields flatMap(_.billingAddress)
  override def billingPostalCode: Option[String] = publicFields flatMap(_.billingPostalCode)
  override def billingAddressDetailed: Option[AddressDetailed] = publicFields flatMap(_.billingAddressDetailed)

  def withBillingAddressDetailed(billingAddress : Option[AddressDetailed]) : CreditCardOptionalFields = {
    publicFields match {
      case None => copy(publicFields =
        Some(PublicCreditCardOptionalFields(holderId = None, holderName = None, billingAddressDetailed = billingAddress)))
      case Some(pubFields) => copy(publicFields = Some(
        PublicCreditCardOptionalFields(
          holderId =  pubFields.holderId,
          holderName =  pubFields.holderName,
          billingAddressDetailed =  billingAddress
      )))
    }
  }

  def fillMissing(other: CreditCardOptionalFields): CreditCardOptionalFields = {
    def bothAddressDetailedIsNull(thisFields: PublicCreditCardOptionalFields, otherFields: PublicCreditCardOptionalFields): Boolean = {
      (thisFields.billingAddressDetailed == None) && (otherFields.billingAddressDetailed == None)
    }
    val fieldsMerged = (this.publicFields, other.publicFields) match {
      case (Some(thisFields), Some(otherFields)) =>
        if (bothAddressDetailedIsNull(thisFields, otherFields) )
          Some(PublicCreditCardOptionalFields(
            holderId = thisFields.holderId.orElse(otherFields.holderId),
            holderName = thisFields.holderName.orElse(otherFields.holderName),
            billingAddress = thisFields.billingAddress.orElse(otherFields.billingAddress),
            billingPostalCode = thisFields.billingPostalCode.orElse(otherFields.billingPostalCode))
          )
        else {
          Some(PublicCreditCardOptionalFields(
            holderId = thisFields.holderId.orElse(otherFields.holderId),
            holderName = thisFields.holderName.orElse(otherFields.holderName),
            billingAddressDetailed = thisFields.billingAddressDetailed.orElse(otherFields.billingAddressDetailed))
          )
        }


      case (None, Some(fields)) =>
        Option(fields)

      case (Some(fields), None) =>
        Option(fields)

      case _ =>
        None
    }
    val cscMerged = this.csc.orElse(other.csc)

    CreditCardOptionalFields(csc = cscMerged, publicFields = fieldsMerged)
  }
}


/** The companion object of the [[CreditCardOptionalFields]] case class, introduces alternative means to create credit
  * card optional fields, e.g., by specifying the Public Credit Card attributes.
  *
  * @author Raz, Ohad
  */
object CreditCardOptionalFields {

  def empty(): CreditCardOptionalFields = {
    withFields()
  }

  def withFields(csc: Option[String] = None,
                 holderId: Option[String] = None,
                 holderName: Option[String] = None,
                 billingAddress: Option[String] = None,
                 billingPostalCode: Option[String] = None): CreditCardOptionalFields = {
    CreditCardOptionalFields(
      csc,
      (holderId, holderName, billingAddress, billingPostalCode) match {
        case (None, None, None, None) => None

        case _ =>
          Some(PublicCreditCardOptionalFields(
            holderId = holderId,
            holderName = holderName,
            billingAddress = billingAddress,
            billingPostalCode = billingPostalCode))
      })
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy