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

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

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


import com.wix.pay.creditcard.networks.Networks
import com.wix.pay.creditcard.validators.{Validator, IsracardValidator, LuhnValidator}


/** Represents a credit card.
  *
  * @author Raz, Ohad
  */
case class CreditCard(number: String,
                      expiration: YearMonth,
                      additionalFields: Option[CreditCardOptionalFields] = None)
    extends Serializable with CommonCreditCardFields {


  if (!validator.validate(number)) {
    throw InvalidCreditCardNumberException(number)
  }

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

  private def validator: Validator = {
    object Isracard {
      def unapply(number: String): Boolean = {
        Networks(number).fold(false)(_ == Networks.isracard)
      }
    }

    number match {
      case Isracard() => IsracardValidator
      case _ => LuhnValidator
    }
  }
}


/** The companion object of the [[CreditCard]] case class, introduces alternative means to create a credit card,
  * e.g., based on a given [[PublicCreditCard]].
  *
  * @author Raz, Ohad
  */
object CreditCard {

  def apply(creditCard: PublicCreditCard, number: String): CreditCard = {
    CreditCard(
      number = number,
      expiration = creditCard.expiration,
      additionalFields = Some(CreditCardOptionalFields(None, creditCard.additionalFields)))
  }

  def apply(creditCard: PublicCreditCard, number: String, csc: String): CreditCard = {
    CreditCard(
      number = number,
      expiration = creditCard.expiration,
      additionalFields = Some(CreditCardOptionalFields(Option(csc), creditCard.additionalFields)))
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy