diff --git a/support-models/src/main/scala/com/gu/support/workers/states/CreateZuoraSubscriptionState.scala b/support-models/src/main/scala/com/gu/support/workers/states/CreateZuoraSubscriptionState.scala index e3109a5308..cd1893e89b 100644 --- a/support-models/src/main/scala/com/gu/support/workers/states/CreateZuoraSubscriptionState.scala +++ b/support-models/src/main/scala/com/gu/support/workers/states/CreateZuoraSubscriptionState.scala @@ -1,109 +1,30 @@ package com.gu.support.workers.states -import com.gu.i18n.Country import com.gu.salesforce.Salesforce.SalesforceContactRecords import com.gu.support.acquisitions.AcquisitionData +import com.gu.support.encoding.Codec +import com.gu.support.encoding.CustomCodecs._ import com.gu.support.encoding.Codec.deriveCodec -import com.gu.support.encoding.{Codec, DiscriminatedType} -import com.gu.support.workers.{PaymentMethod, SalesforceContactRecord, User, _} -import org.joda.time.LocalDate -import com.gu.support.encoding.CustomCodecs.{decodeCountry, decodeLocalTime, encodeCountryAsAlpha2, encodeLocalTime} -import com.gu.support.encoding.{Codec, DiscriminatedType} import com.gu.support.workers._ import org.joda.time.LocalDate import java.util.UUID case class CreateZuoraSubscriptionState( - productSpecificState: CreateZuoraSubscriptionProductState, requestId: UUID, user: User, + giftRecipient: Option[GiftRecipient], product: ProductType, + paymentMethod: PaymentMethod, analyticsInfo: AnalyticsInfo, firstDeliveryDate: Option[LocalDate], appliedPromotion: Option[AppliedPromotion], csrUsername: Option[String], salesforceCaseId: Option[String], acquisitionData: Option[AcquisitionData], + salesforceContacts: SalesforceContactRecords, ) extends FailureHandlerState object CreateZuoraSubscriptionState { implicit val codec: Codec[CreateZuoraSubscriptionState] = deriveCodec[CreateZuoraSubscriptionState] } - -sealed trait CreateZuoraSubscriptionProductState - -object CreateZuoraSubscriptionProductState { - - case class ContributionState( - product: Contribution, - paymentMethod: PaymentMethod, - salesForceContact: SalesforceContactRecord, - ) extends CreateZuoraSubscriptionProductState - - case class SupporterPlusState( - billingCountry: Country, - product: SupporterPlus, - paymentMethod: PaymentMethod, - appliedPromotion: Option[AppliedPromotion], - salesForceContact: SalesforceContactRecord, - ) extends CreateZuoraSubscriptionProductState - - case class TierThreeState( - user: User, - product: TierThree, - paymentMethod: PaymentMethod, - firstDeliveryDate: LocalDate, - appliedPromotion: Option[AppliedPromotion], - salesForceContact: SalesforceContactRecord, - ) extends CreateZuoraSubscriptionProductState - - case class GuardianAdLiteState( - product: GuardianAdLite, - paymentMethod: PaymentMethod, - salesForceContact: SalesforceContactRecord, - ) extends CreateZuoraSubscriptionProductState - - case class DigitalSubscriptionState( - billingCountry: Country, - product: DigitalPack, - paymentMethod: PaymentMethod, - appliedPromotion: Option[AppliedPromotion], - salesForceContact: SalesforceContactRecord, - ) extends CreateZuoraSubscriptionProductState - - case class PaperState( - user: User, - product: Paper, - paymentMethod: PaymentMethod, - firstDeliveryDate: LocalDate, - appliedPromotion: Option[AppliedPromotion], - salesForceContact: SalesforceContactRecord, - ) extends CreateZuoraSubscriptionProductState - - case class GuardianWeeklyState( - user: User, - giftRecipient: Option[GiftRecipient], - product: GuardianWeekly, - paymentMethod: PaymentMethod, - firstDeliveryDate: LocalDate, - appliedPromotion: Option[AppliedPromotion], - salesforceContacts: SalesforceContactRecords, - ) extends CreateZuoraSubscriptionProductState - - import ExecutionTypeDiscriminators._ - - private val discriminatedType = new DiscriminatedType[CreateZuoraSubscriptionProductState](fieldName) - implicit val codec: Codec[CreateZuoraSubscriptionProductState] = discriminatedType.codec( - List( - discriminatedType.variant[ContributionState](contribution), - discriminatedType.variant[SupporterPlusState](supporterPlus), - discriminatedType.variant[DigitalSubscriptionState](digitalSubscription), - discriminatedType.variant[PaperState](paper), - discriminatedType.variant[GuardianWeeklyState](guardianWeekly), - discriminatedType.variant[TierThreeState](tierThree), - discriminatedType.variant[GuardianAdLiteState](guardianAdLite), - ), - ) - -} diff --git a/support-models/src/test/scala/com/gu/support/workers/Fixtures.scala b/support-models/src/test/scala/com/gu/support/workers/Fixtures.scala index dab8eaf555..9d4f79edbc 100644 --- a/support-models/src/test/scala/com/gu/support/workers/Fixtures.scala +++ b/support-models/src/test/scala/com/gu/support/workers/Fixtures.scala @@ -260,23 +260,31 @@ object Fixtures { def createContributionZuoraSubscriptionJson(billingPeriod: BillingPeriod = Monthly): String = s""" { - "productType": "Contribution", $requestIdJson, $userJson, + "analyticsInfo": { + "paymentProvider": "PayPal", + "isGiftPurchase": false + }, "product": ${contribution(billingPeriod = billingPeriod)}, "paymentMethod": $stripePaymentMethod, - "salesForceContact": $salesforceContactJson + "salesforceContacts": $salesforceContactsJson } """ def createDigiPackZuoraSubscriptionJson: String = s""" { - "productType": "DigitalSubscription", + $requestIdJson, + $userJson, "billingCountry": "GB", "product": $digitalPackJson, "paymentMethod": $stripePaymentMethod, - "salesForceContact": $salesforceContactJson + "salesforceContacts": $salesforceContactsJson, + "analyticsInfo": { + "paymentProvider": "PayPal", + "isGiftPurchase": false } + } """ val zuoraErrorResponse = diff --git a/support-models/src/test/scala/com/gu/support/workers/SerialisationSpec.scala b/support-models/src/test/scala/com/gu/support/workers/SerialisationSpec.scala index 6e23a8a23d..93a136ff9d 100644 --- a/support-models/src/test/scala/com/gu/support/workers/SerialisationSpec.scala +++ b/support-models/src/test/scala/com/gu/support/workers/SerialisationSpec.scala @@ -1,10 +1,10 @@ package com.gu.support.workers import com.gu.i18n.{Country, Currency} +import com.gu.salesforce.Salesforce.SalesforceContactRecords import com.gu.support.SerialisationTestHelpers import com.gu.support.catalog.RestOfWorld import com.gu.support.workers.Fixtures._ -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.DigitalSubscriptionState import com.gu.support.workers.states._ import com.typesafe.scalalogging.LazyLogging import org.scalatest.EitherValues @@ -37,10 +37,10 @@ class SerialisationSpec extends AnyFlatSpec with SerialisationTestHelpers with L testDecoding[CreateSalesforceContactState](createSalesforceContactJson) } - "CreateZuoraSubscription" should "deserialise correctly" in { - testDecoding[CreateZuoraSubscriptionProductState](createContributionZuoraSubscriptionJson()) - testDecoding[CreateZuoraSubscriptionProductState](createContributionZuoraSubscriptionJson(Annual)) - testDecoding[CreateZuoraSubscriptionProductState](createDigiPackZuoraSubscriptionJson) + "CreateZuoraSubscriptionState" should "deserialise correctly" in { + testDecoding[CreateZuoraSubscriptionState](createContributionZuoraSubscriptionJson()) + testDecoding[CreateZuoraSubscriptionState](createContributionZuoraSubscriptionJson(Annual)) + testDecoding[CreateZuoraSubscriptionState](createDigiPackZuoraSubscriptionJson) } "FailureHandlerState" should "deserialise correctly from any lambda" in { @@ -95,22 +95,18 @@ object StatesTestData { ) val createZuoraSubscriptionState: CreateZuoraSubscriptionState = CreateZuoraSubscriptionState( - DigitalSubscriptionState( - Country.UK, - product = DigitalPack(Currency.GBP, Monthly), - paymentMethod = PayPalReferenceTransaction("baid", "me@somewhere.com"), - appliedPromotion = None, - salesForceContact = SalesforceContactRecord("sfbuy", "sfbuyacid"), - ), - UUID.fromString("f7651338-5d94-4f57-85fd-262030de9ad5"), - User("111222", "email@blah.com", None, "bertha", "smith", Address(None, None, None, None, None, Country.UK)), - DigitalPack(Currency.GBP, Monthly), - AnalyticsInfo(false, StripeApplePay), - None, - None, + requestId = UUID.fromString("f7651338-5d94-4f57-85fd-262030de9ad5"), + user = User("111222", "email@blah.com", None, "bertha", "smith", Address(None, None, None, None, None, Country.UK)), + giftRecipient = None, + product = DigitalPack(Currency.GBP, Monthly), + analyticsInfo = AnalyticsInfo(false, StripeApplePay), + paymentMethod = PayPalReferenceTransaction("baid", "me@somewhere.com"), + firstDeliveryDate = None, + appliedPromotion = None, csrUsername = None, salesforceCaseId = None, - None, + acquisitionData = None, + salesforceContacts = SalesforceContactRecords(SalesforceContactRecord("sfbuy", "sfbuyacid"), None), ) val thankYouEmailProductTypeState: SendThankYouEmailState = diff --git a/support-workers/src/main/scala/com/gu/support/workers/exceptions/ErrorHandler.scala b/support-workers/src/main/scala/com/gu/support/workers/exceptions/ErrorHandler.scala index b84047acc4..dedfbf8021 100644 --- a/support-workers/src/main/scala/com/gu/support/workers/exceptions/ErrorHandler.scala +++ b/support-workers/src/main/scala/com/gu/support/workers/exceptions/ErrorHandler.scala @@ -7,7 +7,7 @@ import com.gu.salesforce.Salesforce.SalesforceErrorResponse import com.gu.stripe.StripeError import com.gu.support.workers.lambdas.StateNotValidException import com.gu.support.zuora.api.response.ZuoraErrorResponse -import com.gu.zuora.productHandlers.BuildSubscribePromoError +import com.gu.zuora.productHandlers.BuildSubscribeError import io.circe.syntax._ import io.circe.{DecodingFailure, ParsingFailure} @@ -31,7 +31,7 @@ object ErrorHandler extends SafeLogging { case e: PayPalError => e.asRetryException case e: ZuoraErrorResponse => e.asRetryException case e: SalesforceErrorResponse => e.asRetryException - case e: BuildSubscribePromoError => new RetryNone(e.cause.msg, cause = e) + case e: BuildSubscribeError => new RetryNone(e.cause, cause = e) case e: StateNotValidException => new RetryNone(e.message, cause = e) case e: BadRequestException => new RetryNone(e.getMessage, cause = e) case wshe: WebServiceHelperError[_] if wshe.cause.isInstanceOf[DecodingFailure] => diff --git a/support-workers/src/main/scala/com/gu/support/workers/lambdas/CreateSalesforceContact.scala b/support-workers/src/main/scala/com/gu/support/workers/lambdas/CreateSalesforceContact.scala index 47014f14ac..4730e0712b 100644 --- a/support-workers/src/main/scala/com/gu/support/workers/lambdas/CreateSalesforceContact.scala +++ b/support-workers/src/main/scala/com/gu/support/workers/lambdas/CreateSalesforceContact.scala @@ -5,17 +5,7 @@ import com.gu.salesforce.Salesforce.SalesforceContactRecords import com.gu.services.{ServiceProvider, Services} import com.gu.support.workers._ import com.gu.support.workers.exceptions.SalesforceException -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.{ - ContributionState, - DigitalSubscriptionState, - GuardianAdLiteState, - GuardianWeeklyState, - PaperState, - SupporterPlusState, - TierThreeState, -} import com.gu.support.workers.states.{CreateSalesforceContactState, CreateZuoraSubscriptionState} -import com.gu.support.zuora.api.ReaderType import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future @@ -33,7 +23,7 @@ class CreateSalesforceContact services.salesforceService.createContactRecords(state.user, state.giftRecipient).flatMap { response => if (response.successful) { - Future.successful(HandlerResult(new NextState(state).build(response.contactRecords), requestInfo)) + Future.successful(HandlerResult(buildCreateZuoraSubscriptionState(state, response.contactRecords), requestInfo)) } else { val errorMessage = response.errorMessage.getOrElse("No error message returned") logger.warn(s"Error creating Salesforce contact:\n$errorMessage") @@ -42,200 +32,24 @@ class CreateSalesforceContact } } -} -class NextState(state: CreateSalesforceContactState) { - - import state._ - - // scalastyle:off cyclomatic.complexity - def build( - salesforceContactRecords: SalesforceContactRecords, - ): CreateZuoraSubscriptionState = - (product, paymentMethod) match { - case (product: Contribution, purchase) => - toNextContribution(salesforceContactRecords, product, purchase) - case (product: SupporterPlus, purchase) => - toNextSupporterPlus(salesforceContactRecords, product, purchase) - case (product: TierThree, purchase) => - toNextTierThree(salesforceContactRecords, product, purchase) - case (product: GuardianAdLite, purchase) => - toNextGuardianAdLite(salesforceContactRecords, product, purchase) - case (product: DigitalPack, purchase) if product.readerType == ReaderType.Direct => - toNextDSDirect(salesforceContactRecords.buyer, product, purchase) - case (product: Paper, purchase) => - toNextPaper(salesforceContactRecords.buyer, product, purchase) - case (product: GuardianWeekly, purchase) => - toNextWeekly(salesforceContactRecords, product, purchase) - case _ => throw new RuntimeException("could not create value state") - } - // scalastyle:on cyclomatic.complexity - - def toNextContribution( - salesforceContactRecords: SalesforceContactRecords, - product: Contribution, - purchase: PaymentMethod, - ): CreateZuoraSubscriptionState = - CreateZuoraSubscriptionState( - ContributionState( - product, - purchase, - salesforceContactRecords.buyer, - ), - requestId, - user, - product, - analyticsInfo, - None, - None, - state.csrUsername, - state.salesforceCaseId, - acquisitionData, - ) - - def toNextSupporterPlus( - salesforceContactRecords: SalesforceContactRecords, - product: SupporterPlus, - purchase: PaymentMethod, - ): CreateZuoraSubscriptionState = - CreateZuoraSubscriptionState( - SupporterPlusState( - user.billingAddress.country, - product, - purchase, - appliedPromotion, - salesforceContactRecords.buyer, - ), - requestId, - user, - product, - analyticsInfo, - None, - appliedPromotion, - state.csrUsername, - state.salesforceCaseId, - acquisitionData, - ) - - def toNextTierThree( - salesforceContactRecords: SalesforceContactRecords, - product: TierThree, - purchase: PaymentMethod, - ): CreateZuoraSubscriptionState = - CreateZuoraSubscriptionState( - TierThreeState( - user, - product, - purchase, - firstDeliveryDate.get, - appliedPromotion, - salesforceContactRecords.buyer, - ), - requestId, - user, - product, - analyticsInfo, - firstDeliveryDate, - appliedPromotion, - state.csrUsername, - state.salesforceCaseId, - acquisitionData, - ) - - def toNextGuardianAdLite( - salesforceContactRecords: SalesforceContactRecords, - product: GuardianAdLite, - purchase: PaymentMethod, - ): CreateZuoraSubscriptionState = - CreateZuoraSubscriptionState( - GuardianAdLiteState( - product, - purchase, - salesforceContactRecords.buyer, - ), - requestId, - user, - product, - analyticsInfo, - firstDeliveryDate, - appliedPromotion, - state.csrUsername, - state.salesforceCaseId, - acquisitionData, - ) - - def toNextWeekly( + def buildCreateZuoraSubscriptionState( + state: CreateSalesforceContactState, salesforceContactRecords: SalesforceContactRecords, - product: GuardianWeekly, - purchase: PaymentMethod, - ): CreateZuoraSubscriptionState = + ): CreateZuoraSubscriptionState = { + import state._ CreateZuoraSubscriptionState( - GuardianWeeklyState( - user, - giftRecipient, - product, - purchase, - firstDeliveryDate.get, - appliedPromotion, - salesforceContactRecords, - ), - requestId, - user, - product, - analyticsInfo, - firstDeliveryDate, - appliedPromotion, - state.csrUsername, - state.salesforceCaseId, - acquisitionData, + requestId = requestId, + user = user, + product = product, + analyticsInfo = analyticsInfo, + giftRecipient = giftRecipient, + paymentMethod = paymentMethod, + firstDeliveryDate = firstDeliveryDate, + appliedPromotion = appliedPromotion, + csrUsername = csrUsername, + salesforceCaseId = salesforceCaseId, + acquisitionData = acquisitionData, + salesforceContacts = salesforceContactRecords, ) - - def toNextPaper( - salesforceContactRecord: SalesforceContactRecord, - product: Paper, - purchase: PaymentMethod, - ): CreateZuoraSubscriptionState = - CreateZuoraSubscriptionState( - PaperState( - user, - product, - purchase, - firstDeliveryDate.get, - appliedPromotion, - salesforceContactRecord, - ), - requestId, - user, - product, - analyticsInfo, - firstDeliveryDate, - appliedPromotion, - state.csrUsername, - state.salesforceCaseId, - acquisitionData, - ) - - def toNextDSDirect( - salesforceContactRecord: SalesforceContactRecord, - product: DigitalPack, - purchase: PaymentMethod, - ): CreateZuoraSubscriptionState = - CreateZuoraSubscriptionState( - DigitalSubscriptionState( - user.billingAddress.country, - product, - purchase, - appliedPromotion, - salesforceContactRecord, - ), - requestId, - user, - product, - analyticsInfo, - firstDeliveryDate, - appliedPromotion, - state.csrUsername, - state.salesforceCaseId, - acquisitionData, - ) - + } } diff --git a/support-workers/src/main/scala/com/gu/support/workers/lambdas/CreateZuoraSubscription.scala b/support-workers/src/main/scala/com/gu/support/workers/lambdas/CreateZuoraSubscription.scala index 9aae5928a8..01611bd1b5 100644 --- a/support-workers/src/main/scala/com/gu/support/workers/lambdas/CreateZuoraSubscription.scala +++ b/support-workers/src/main/scala/com/gu/support/workers/lambdas/CreateZuoraSubscription.scala @@ -6,7 +6,6 @@ import com.gu.helpers.DateGenerator import com.gu.services.{ServiceProvider, Services} import com.gu.support.config.TouchPointEnvironments import com.gu.support.workers._ -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState._ import com.gu.support.workers.states.{CreateZuoraSubscriptionState, SendAcquisitionEventState} import com.gu.zuora.ZuoraSubscriptionCreator import com.gu.zuora.productHandlers._ @@ -20,63 +19,31 @@ class CreateZuoraSubscription(servicesProvider: ServiceProvider = ServiceProvide def this() = this(ServiceProvider) override protected def servicesHandler( - zuoraSubscriptionState: CreateZuoraSubscriptionState, + state: CreateZuoraSubscriptionState, requestInfo: RequestInfo, context: Context, services: Services, ): FutureHandlerResult = { - val zuoraProductHandlers = new ZuoraProductHandlers(services, zuoraSubscriptionState) + val zuoraProductHandlers = new ZuoraProductHandlers(services, state) import zuoraProductHandlers._ - val eventualSendThankYouEmailState = zuoraSubscriptionState.productSpecificState match { - case state: SupporterPlusState => - zuoraSupporterPlusHandler.subscribe( - state, - zuoraSubscriptionState.csrUsername, - zuoraSubscriptionState.salesforceCaseId, - ) - case state: TierThreeState => - zuoraTierThreeHandler.subscribe( - state, - zuoraSubscriptionState.csrUsername, - zuoraSubscriptionState.salesforceCaseId, - ) - case state: DigitalSubscriptionState => - zuoraDigitalSubscriptionDirectHandler.subscribe( - state, - zuoraSubscriptionState.csrUsername, - zuoraSubscriptionState.salesforceCaseId, - ) - case state: ContributionState => - zuoraContributionHandler.subscribe(state) - case state: PaperState => - zuoraPaperHandler.subscribe( - state, - zuoraSubscriptionState.csrUsername, - zuoraSubscriptionState.salesforceCaseId, - ) - case state: GuardianWeeklyState => - zuoraGuardianWeeklyHandler.subscribe( - state, - zuoraSubscriptionState.csrUsername, - zuoraSubscriptionState.salesforceCaseId, - ) - case state: GuardianAdLiteState => - zuoraGuardianAdLiteHandler.subscribe( - state, - zuoraSubscriptionState.csrUsername, - zuoraSubscriptionState.salesforceCaseId, - ) + val eventualSendThankYouEmailState = state.product match { + case product: SupporterPlus => zuoraSupporterPlusHandler.subscribe(product, state) + case product: TierThree => zuoraTierThreeHandler.subscribe(product, state) + case product: DigitalPack => zuoraDigitalSubscriptionDirectHandler.subscribe(product, state) + case product: Contribution => zuoraContributionHandler.subscribe(product, state) + case product: Paper => zuoraPaperHandler.subscribe(product, state) + case product: GuardianWeekly => zuoraGuardianWeeklyHandler.subscribe(product, state) + case product: GuardianAdLite => zuoraGuardianAdLiteHandler.subscribe(product, state) } - eventualSendThankYouEmailState.map { nextState => HandlerResult( SendAcquisitionEventState( - requestId = zuoraSubscriptionState.requestId, - analyticsInfo = zuoraSubscriptionState.analyticsInfo, + requestId = state.requestId, + analyticsInfo = state.analyticsInfo, sendThankYouEmailState = nextState, - acquisitionData = zuoraSubscriptionState.acquisitionData, + acquisitionData = state.acquisitionData, ), requestInfo, ) diff --git a/support-workers/src/main/scala/com/gu/support/workers/lambdas/PreparePaymentMethodForReuse.scala b/support-workers/src/main/scala/com/gu/support/workers/lambdas/PreparePaymentMethodForReuse.scala index 6543fd44a7..ef19adbf3d 100644 --- a/support-workers/src/main/scala/com/gu/support/workers/lambdas/PreparePaymentMethodForReuse.scala +++ b/support-workers/src/main/scala/com/gu/support/workers/lambdas/PreparePaymentMethodForReuse.scala @@ -3,10 +3,10 @@ package com.gu.support.workers.lambdas import com.amazonaws.services.lambda.runtime.Context import com.gu.gocardless.GoCardlessWorkersService import com.gu.i18n.{Country, CountryGroup} +import com.gu.salesforce.Salesforce.SalesforceContactRecords import com.gu.services.{ServiceProvider, Services} import com.gu.support.workers._ import com.gu.support.workers.lambdas.PaymentMethodExtensions.PaymentMethodExtension -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.{ContributionState, SupporterPlusState} import com.gu.support.workers.states.{CreateZuoraSubscriptionState, PreparePaymentMethodForReuseState} import com.gu.support.zuora.api.PaymentGateway import com.gu.support.zuora.api.response.{ @@ -18,6 +18,7 @@ import com.gu.support.zuora.api.response.{ import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future import scala.util.{Failure, Success} +import com.gu.WithLoggingSugar._ class PreparePaymentMethodForReuse(servicesProvider: ServiceProvider = ServiceProvider) extends ServicesHandler[PreparePaymentMethodForReuseState, CreateZuoraSubscriptionState](servicesProvider) { @@ -31,11 +32,21 @@ class PreparePaymentMethodForReuse(servicesProvider: ServiceProvider = ServicePr services: Services, ) = { - import com.gu.WithLoggingSugar._ - val zuoraService = services.zuoraService val accountId = state.paymentFields.billingAccountId for { + _ <- Future.fromTry(state.product match { + case c: Contribution => + Success(c) + case sp: SupporterPlus => + Success(sp) + case _ => + Failure( + new RuntimeException( + "Reusing payment methods is not yet supported for products other than contributions or SupporterPlus", + ), + ) + }) account <- zuoraService.getAccount(accountId).withEventualLogging(s"getObjectAccount($accountId)") accountIdentityId <- getOrFailWithMessage( account.basicInfo.IdentityId__c, @@ -66,49 +77,19 @@ class PreparePaymentMethodForReuse(servicesProvider: ServiceProvider = ServicePr account.billingAndPayment.paymentGateway, ) sfContact = SalesforceContactRecord(sfContactId, account.basicInfo.crmId) - (productState, productType) <- Future.fromTry(state.product match { - case c: Contribution => - Success( - ( - ContributionState( - product = c, - paymentMethod = paymentMethod, - salesForceContact = sfContact, - ), - ), - c, - ) - case sp: SupporterPlus => - Success( - ( - SupporterPlusState( - product = sp, - paymentMethod = paymentMethod, - appliedPromotion = state.appliedPromotion, - salesForceContact = sfContact, - billingCountry = state.user.billingAddress.country, - ), - ), - sp, - ) - case _ => - Failure( - new RuntimeException( - "Reusing payment methods is not yet supported for products other than contributions or SupporterPlus", - ), - ) - }) } yield HandlerResult( CreateZuoraSubscriptionState( - productSpecificState = productState, requestId = state.requestId, user = state.user, - product = productType, + giftRecipient = state.giftRecipient, + paymentMethod = paymentMethod, + product = state.product, analyticsInfo = state.analyticsInfo, firstDeliveryDate = None, appliedPromotion = state.appliedPromotion, csrUsername = None, salesforceCaseId = None, + salesforceContacts = SalesforceContactRecords(sfContact, None), acquisitionData = state.acquisitionData, ), requestInfo diff --git a/support-workers/src/main/scala/com/gu/zuora/productHandlers/BuildSubscribeError.scala b/support-workers/src/main/scala/com/gu/zuora/productHandlers/BuildSubscribeError.scala new file mode 100644 index 0000000000..dc7f66e541 --- /dev/null +++ b/support-workers/src/main/scala/com/gu/zuora/productHandlers/BuildSubscribeError.scala @@ -0,0 +1,3 @@ +package com.gu.zuora.productHandlers + +case class BuildSubscribeError(cause: String) extends RuntimeException diff --git a/support-workers/src/main/scala/com/gu/zuora/productHandlers/BuildSubscribePromoError.scala b/support-workers/src/main/scala/com/gu/zuora/productHandlers/BuildSubscribePromoError.scala deleted file mode 100644 index 619ac553cd..0000000000 --- a/support-workers/src/main/scala/com/gu/zuora/productHandlers/BuildSubscribePromoError.scala +++ /dev/null @@ -1,5 +0,0 @@ -package com.gu.zuora.productHandlers - -import com.gu.support.promotions.PromoError - -case class BuildSubscribePromoError(cause: PromoError) extends RuntimeException diff --git a/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraContributionHandler.scala b/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraContributionHandler.scala index 2e0316dd4d..9b4b92df69 100644 --- a/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraContributionHandler.scala +++ b/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraContributionHandler.scala @@ -1,9 +1,8 @@ package com.gu.zuora.productHandlers -import com.gu.support.workers.User -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.ContributionState -import com.gu.support.workers.states.SendThankYouEmailState import com.gu.support.workers.states.SendThankYouEmailState.SendThankYouEmailContributionState +import com.gu.support.workers.states.{CreateZuoraSubscriptionState, SendThankYouEmailState} +import com.gu.support.workers.{Contribution, User} import com.gu.zuora.ZuoraSubscriptionCreator import com.gu.zuora.subscriptionBuilders.ContributionSubscriptionBuilder @@ -16,9 +15,11 @@ class ZuoraContributionHandler( user: User, ) { - def subscribe(state: ContributionState): Future[SendThankYouEmailState] = + def subscribe(product: Contribution, state: CreateZuoraSubscriptionState): Future[SendThankYouEmailState] = for { - (account, sub) <- zuoraSubscriptionCreator.ensureSubscriptionCreated(contributionSubscriptionBuilder.build(state)) - } yield SendThankYouEmailContributionState(user, state.product, state.paymentMethod, account.value, sub.value) + (account, sub) <- zuoraSubscriptionCreator.ensureSubscriptionCreated( + contributionSubscriptionBuilder.build(product, state), + ) + } yield SendThankYouEmailContributionState(user, product, state.paymentMethod, account.value, sub.value) } diff --git a/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraDigitalSubscriptionHandler.scala b/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraDigitalSubscriptionHandler.scala index e6b7be5873..c710f699f3 100644 --- a/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraDigitalSubscriptionHandler.scala +++ b/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraDigitalSubscriptionHandler.scala @@ -2,11 +2,9 @@ package com.gu.zuora.productHandlers import cats.implicits._ import com.gu.WithLoggingSugar._ -import com.gu.support.acquisitions.{AbTest, AcquisitionData} -import com.gu.support.workers.User -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.DigitalSubscriptionState -import com.gu.support.workers.states.SendThankYouEmailState import com.gu.support.workers.states.SendThankYouEmailState.SendThankYouEmailDigitalSubscriptionState +import com.gu.support.workers.states.{CreateZuoraSubscriptionState, SendThankYouEmailState} +import com.gu.support.workers.{DigitalPack, User} import com.gu.zuora.ZuoraSubscriptionCreator import com.gu.zuora.subscriptionBuilders.DigitalSubscriptionBuilder @@ -20,16 +18,15 @@ class ZuoraDigitalSubscriptionHandler( ) { def subscribe( - state: DigitalSubscriptionState, - csrUsername: Option[String], - salesforceCaseId: Option[String], + product: DigitalPack, + state: CreateZuoraSubscriptionState, ): Future[SendThankYouEmailState] = { for { subscribeItem <- Future .fromTry( digitalSubscriptionBuilder - .build(state, csrUsername, salesforceCaseId) - .leftMap(BuildSubscribePromoError) + .build(product, state) + .leftMap(BuildSubscribeError) .toTry, ) .withEventualLogging("subscription data") @@ -37,7 +34,7 @@ class ZuoraDigitalSubscriptionHandler( (account, sub) <- zuoraSubscriptionCreator.ensureSubscriptionCreated(subscribeItem) } yield SendThankYouEmailDigitalSubscriptionState( user, - state.product, + product, state.paymentMethod, paymentSchedule, state.appliedPromotion.map(_.promoCode), diff --git a/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraGuardianAdLiteHandler.scala b/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraGuardianAdLiteHandler.scala index 347e3ddef7..17d07ddacd 100644 --- a/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraGuardianAdLiteHandler.scala +++ b/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraGuardianAdLiteHandler.scala @@ -1,10 +1,8 @@ package com.gu.zuora.productHandlers -import com.gu.support.acquisitions.AcquisitionData -import com.gu.support.workers.User -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.GuardianAdLiteState -import com.gu.support.workers.states.SendThankYouEmailState import com.gu.support.workers.states.SendThankYouEmailState.SendThankYouEmailGuardianAdLiteState +import com.gu.support.workers.states.{CreateZuoraSubscriptionState, SendThankYouEmailState} +import com.gu.support.workers.{GuardianAdLite, User} import com.gu.zuora.ZuoraSubscriptionCreator import com.gu.zuora.subscriptionBuilders.GuardianAdLiteSubscriptionBuilder @@ -18,18 +16,17 @@ class ZuoraGuardianAdLiteHandler( ) { def subscribe( - state: GuardianAdLiteState, - csrUsername: Option[String], - salesforceCaseId: Option[String], + product: GuardianAdLite, + state: CreateZuoraSubscriptionState, ): Future[SendThankYouEmailState] = { - val subscribeItem = subscriptionBuilder.build(state, csrUsername, salesforceCaseId) + val subscribeItem = subscriptionBuilder.build(product, state) for { paymentSchedule <- zuoraSubscriptionCreator.preview(subscribeItem, state.product.billingPeriod) (account, sub) <- zuoraSubscriptionCreator.ensureSubscriptionCreated(subscribeItem) } yield SendThankYouEmailGuardianAdLiteState( user, - state.product, + product, state.paymentMethod, paymentSchedule, account.value, diff --git a/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraGuardianWeeklyHandler.scala b/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraGuardianWeeklyHandler.scala index 8953753bc5..a7cc8d9929 100644 --- a/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraGuardianWeeklyHandler.scala +++ b/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraGuardianWeeklyHandler.scala @@ -1,10 +1,11 @@ package com.gu.zuora.productHandlers import cats.implicits._ +import scala.util.Try import com.gu.WithLoggingSugar._ -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.GuardianWeeklyState -import com.gu.support.workers.states.SendThankYouEmailState +import com.gu.support.workers.GuardianWeekly import com.gu.support.workers.states.SendThankYouEmailState.SendThankYouEmailGuardianWeeklyState +import com.gu.support.workers.states.{CreateZuoraSubscriptionState, SendThankYouEmailState} import com.gu.zuora.ZuoraSubscriptionCreator import com.gu.zuora.subscriptionBuilders._ @@ -17,16 +18,18 @@ class ZuoraGuardianWeeklyHandler( ) { def subscribe( - state: GuardianWeeklyState, - csrUsername: Option[String], - salesforceCaseId: Option[String], - ): Future[SendThankYouEmailState] = + product: GuardianWeekly, + state: CreateZuoraSubscriptionState, + ): Future[SendThankYouEmailState] = { + val firstDeliveryDate = + state.firstDeliveryDate.toRight(new IllegalStateException("firstDeliveryDate is required")).toTry for { + firstDeliveryDate <- Future.fromTry(firstDeliveryDate) subscribeItem <- Future .fromTry( guardianWeeklySubscriptionBuilder - .build(state, csrUsername, salesforceCaseId) - .leftMap(BuildSubscribePromoError) + .build(product, state) + .leftMap(BuildSubscribeError) .toTry, ) .withEventualLogging("subscription data") @@ -34,14 +37,15 @@ class ZuoraGuardianWeeklyHandler( (account, sub) <- zuoraSubscriptionCreator.ensureSubscriptionCreated(subscribeItem) } yield SendThankYouEmailGuardianWeeklyState( state.user, - state.product, + product, state.giftRecipient, state.paymentMethod, paymentSchedule, state.appliedPromotion.map(_.promoCode), account.value, sub.value, - state.firstDeliveryDate, + firstDeliveryDate, ) + } } diff --git a/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraPaperHandler.scala b/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraPaperHandler.scala index 7512f6ec9e..5aef564c8b 100644 --- a/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraPaperHandler.scala +++ b/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraPaperHandler.scala @@ -2,9 +2,9 @@ package com.gu.zuora.productHandlers import cats.implicits._ import com.gu.WithLoggingSugar._ -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.PaperState -import com.gu.support.workers.states.SendThankYouEmailState +import com.gu.support.workers.Paper import com.gu.support.workers.states.SendThankYouEmailState.SendThankYouEmailPaperState +import com.gu.support.workers.states.{CreateZuoraSubscriptionState, SendThankYouEmailState} import com.gu.zuora.ZuoraSubscriptionCreator import com.gu.zuora.subscriptionBuilders.PaperSubscriptionBuilder @@ -17,27 +17,32 @@ class ZuoraPaperHandler( ) { def subscribe( - state: PaperState, - csrUsername: Option[String], - salesforceCaseId: Option[String], + product: Paper, + state: CreateZuoraSubscriptionState, ): Future[SendThankYouEmailState] = for { + firstDeliveryDate <- Future.fromTry( + state.firstDeliveryDate + .toRight("First delivery date is required for a Paper subscription") + .leftMap(BuildSubscribeError) + .toTry, + ) subscribeItem <- Future .fromTry( - paperSubscriptionBuilder.build(state, csrUsername, salesforceCaseId).leftMap(BuildSubscribePromoError).toTry, + paperSubscriptionBuilder.build(product, state).leftMap(BuildSubscribeError).toTry, ) .withEventualLogging("subscription data") paymentSchedule <- zuoraSubscriptionCreator.preview(subscribeItem, state.product.billingPeriod) (account, sub) <- zuoraSubscriptionCreator.ensureSubscriptionCreated(subscribeItem) } yield SendThankYouEmailPaperState( state.user, - state.product, + product, state.paymentMethod, paymentSchedule, state.appliedPromotion.map(_.promoCode), account.value, sub.value, - state.firstDeliveryDate, + firstDeliveryDate, ) } diff --git a/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraSupporterPlusHandler.scala b/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraSupporterPlusHandler.scala index a79cdc84e1..62f6f56360 100644 --- a/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraSupporterPlusHandler.scala +++ b/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraSupporterPlusHandler.scala @@ -1,9 +1,9 @@ package com.gu.zuora.productHandlers import cats.implicits._ -import com.gu.support.workers.User -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.SupporterPlusState +import com.gu.support.workers.states.CreateZuoraSubscriptionState import com.gu.support.workers.states.SendThankYouEmailState.SendThankYouEmailSupporterPlusState +import com.gu.support.workers.{SupporterPlus, User} import com.gu.zuora.ZuoraSubscriptionCreator import com.gu.zuora.subscriptionBuilders.SupporterPlusSubcriptionBuilder @@ -16,22 +16,21 @@ class ZuoraSupporterPlusHandler( user: User, ) { def subscribe( - state: SupporterPlusState, - csrUsername: Option[String], - salesforceCaseId: Option[String], + product: SupporterPlus, + state: CreateZuoraSubscriptionState, ): Future[SendThankYouEmailSupporterPlusState] = for { subscribeItem <- Future.fromTry( supporterPlusSubscriptionBuilder - .build(state, csrUsername, salesforceCaseId) - .leftMap(BuildSubscribePromoError) + .build(product, state) + .leftMap(BuildSubscribeError) .toTry, ) paymentSchedule <- zuoraSubscriptionCreator.preview(subscribeItem, state.product.billingPeriod) (account, sub) <- zuoraSubscriptionCreator.ensureSubscriptionCreated(subscribeItem) } yield SendThankYouEmailSupporterPlusState( user, - state.product, + product, state.paymentMethod, paymentSchedule, state.appliedPromotion.map(_.promoCode), diff --git a/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraTierThreeHandler.scala b/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraTierThreeHandler.scala index 121482f6ac..97244cf1c6 100644 --- a/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraTierThreeHandler.scala +++ b/support-workers/src/main/scala/com/gu/zuora/productHandlers/ZuoraTierThreeHandler.scala @@ -2,9 +2,9 @@ package com.gu.zuora.productHandlers import cats.implicits._ import com.gu.WithLoggingSugar._ -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.TierThreeState -import com.gu.support.workers.states.SendThankYouEmailState +import com.gu.support.workers.TierThree import com.gu.support.workers.states.SendThankYouEmailState.SendThankYouEmailTierThreeState +import com.gu.support.workers.states.{CreateZuoraSubscriptionState, SendThankYouEmailState} import com.gu.zuora.ZuoraSubscriptionCreator import com.gu.zuora.subscriptionBuilders._ @@ -17,16 +17,21 @@ class ZuoraTierThreeHandler( ) { def subscribe( - state: TierThreeState, - csrUsername: Option[String], - salesforceCaseId: Option[String], - ): Future[SendThankYouEmailState] = + product: TierThree, + state: CreateZuoraSubscriptionState, + ): Future[SendThankYouEmailState] = { for { + firstDeliveryDate <- Future.fromTry( + state.firstDeliveryDate + .toRight("First delivery date is required for a Tier Three subscription") + .leftMap(BuildSubscribeError) + .toTry, + ) subscribeItem <- Future .fromTry( tierThreeSubscriptionBuilder - .build(state, csrUsername, salesforceCaseId) - .leftMap(BuildSubscribePromoError) + .build(product, state) + .leftMap(BuildSubscribeError) .toTry, ) .withEventualLogging("subscription data") @@ -34,13 +39,14 @@ class ZuoraTierThreeHandler( (account, sub) <- zuoraSubscriptionCreator.ensureSubscriptionCreated(subscribeItem) } yield SendThankYouEmailTierThreeState( state.user, - state.product, + product, state.paymentMethod, paymentSchedule, state.appliedPromotion.map(_.promoCode), account.value, sub.value, - state.firstDeliveryDate, + firstDeliveryDate, ) + } } diff --git a/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/ContributionSubscriptionBuilder.scala b/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/ContributionSubscriptionBuilder.scala index 015b650065..a1f92404db 100644 --- a/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/ContributionSubscriptionBuilder.scala +++ b/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/ContributionSubscriptionBuilder.scala @@ -1,32 +1,31 @@ package com.gu.zuora.subscriptionBuilders import com.gu.support.config.ZuoraContributionConfig -import com.gu.support.workers.BillingPeriod -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.ContributionState +import com.gu.support.workers.states.CreateZuoraSubscriptionState +import com.gu.support.workers.{BillingPeriod, Contribution} import com.gu.support.zuora.api.ReaderType.Direct import com.gu.support.zuora.api._ -import org.joda.time.{DateTimeZone, LocalDate} class ContributionSubscriptionBuilder( config: BillingPeriod => ZuoraContributionConfig, subscribeItemBuilder: SubscribeItemBuilder, ) { - def build(state: ContributionState): SubscribeItem = { - val contributionConfig = config(state.product.billingPeriod) + def build(product: Contribution, state: CreateZuoraSubscriptionState): SubscribeItem = { + val contributionConfig = config(product.billingPeriod) val subscriptionData = subscribeItemBuilder.buildProductSubscription( contributionConfig.productRatePlanId, List( RatePlanChargeData( RatePlanChargeOverride( contributionConfig.productRatePlanChargeId, - price = state.product.amount, + price = product.amount, ), // Pass the amount the user selected into Zuora ), ), readerType = Direct, ) - subscribeItemBuilder.build(subscriptionData, state.salesForceContact, Some(state.paymentMethod), None) + subscribeItemBuilder.build(subscriptionData, state.salesforceContacts.recipient, Some(state.paymentMethod), None) } } diff --git a/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/DigitalSubscriptionBuilder.scala b/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/DigitalSubscriptionBuilder.scala index 66e26b43b7..a8d638cf15 100644 --- a/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/DigitalSubscriptionBuilder.scala +++ b/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/DigitalSubscriptionBuilder.scala @@ -1,11 +1,13 @@ package com.gu.zuora.subscriptionBuilders +import cats.syntax.either._ import com.gu.helpers.DateGenerator -import com.gu.support.acquisitions.AcquisitionData +import com.gu.support.acquisitions.AbTest import com.gu.support.config.{TouchPointEnvironment, ZuoraDigitalPackConfig} import com.gu.support.promotions.{PromoError, PromotionService} import com.gu.support.workers.ProductTypeRatePlans.digitalRatePlan -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.DigitalSubscriptionState +import com.gu.support.workers.states.CreateZuoraSubscriptionState +import com.gu.support.workers.{DigitalPack, Monthly} import com.gu.support.zuora.api._ import com.gu.zuora.subscriptionBuilders.ProductSubscriptionBuilders.{applyPromoCodeIfPresent, validateRatePlan} @@ -18,12 +20,11 @@ class DigitalSubscriptionBuilder( ) { def build( - state: DigitalSubscriptionState, - csrUsername: Option[String], - salesforceCaseId: Option[String], - ): Either[PromoError, SubscribeItem] = { + product: DigitalPack, + state: CreateZuoraSubscriptionState, + ): Either[String, SubscribeItem] = { - val productRatePlanId = validateRatePlan(digitalRatePlan(state.product, environment), state.product.describe) + val productRatePlanId = validateRatePlan(digitalRatePlan(product, environment), product.describe) val todaysDate = dateGenerator.today val contractAcceptanceDate = todaysDate.plusDays(config.defaultFreeTrialPeriod + config.paymentGracePeriod) @@ -32,10 +33,10 @@ class DigitalSubscriptionBuilder( productRatePlanId = productRatePlanId, contractEffectiveDate = todaysDate, contractAcceptanceDate = contractAcceptanceDate, - readerType = ReaderType.impliedBySomeAppliedPromotion(state.appliedPromotion) getOrElse state.product.readerType, + readerType = ReaderType.impliedBySomeAppliedPromotion(state.appliedPromotion) getOrElse product.readerType, initialTermPeriodType = Month, - csrUsername = csrUsername, - salesforceCaseId = salesforceCaseId, + csrUsername = state.csrUsername, + salesforceCaseId = state.salesforceCaseId, ) applyPromoCodeIfPresent( @@ -43,9 +44,9 @@ class DigitalSubscriptionBuilder( state.appliedPromotion, productRatePlanId, subscriptionData, - ).map { subscriptionData => - subscribeItemBuilder.build(subscriptionData, state.salesForceContact, Some(state.paymentMethod), None) - } + ).map(subscriptionData => + subscribeItemBuilder.build(subscriptionData, state.salesforceContacts.recipient, Some(state.paymentMethod), None), + ).leftMap(_.toString) } diff --git a/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/GuardianAdLiteSubscriptionBuilder.scala b/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/GuardianAdLiteSubscriptionBuilder.scala index 4fcd27e8e7..9b3ec7350a 100644 --- a/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/GuardianAdLiteSubscriptionBuilder.scala +++ b/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/GuardianAdLiteSubscriptionBuilder.scala @@ -2,8 +2,9 @@ package com.gu.zuora.subscriptionBuilders import com.gu.helpers.DateGenerator import com.gu.support.config.TouchPointEnvironment +import com.gu.support.workers.GuardianAdLite import com.gu.support.workers.ProductTypeRatePlans.guardianAdLiteRatePlan -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.GuardianAdLiteState +import com.gu.support.workers.states.CreateZuoraSubscriptionState import com.gu.support.zuora.api.ReaderType.Direct import com.gu.support.zuora.api.SubscribeItem import com.gu.zuora.subscriptionBuilders.ProductSubscriptionBuilders.validateRatePlan @@ -14,12 +15,11 @@ class GuardianAdLiteSubscriptionBuilder( subscribeItemBuilder: SubscribeItemBuilder, ) { def build( - state: GuardianAdLiteState, - csrUsername: Option[String], - salesforceCaseId: Option[String], + product: GuardianAdLite, + state: CreateZuoraSubscriptionState, ): SubscribeItem = { val productRatePlanId = { - validateRatePlan(guardianAdLiteRatePlan(state.product, environment), state.product.describe) + validateRatePlan(guardianAdLiteRatePlan(product, environment), product.describe) } val todaysDate = dateGenerator.today @@ -28,11 +28,11 @@ class GuardianAdLiteSubscriptionBuilder( contractEffectiveDate = todaysDate, contractAcceptanceDate = todaysDate.plusDays(GuardianAdLiteSubscriptionBuilder.gracePeriodInDays), readerType = Direct, - csrUsername = csrUsername, - salesforceCaseId = salesforceCaseId, + csrUsername = state.csrUsername, + salesforceCaseId = state.salesforceCaseId, ) - subscribeItemBuilder.build(subscriptionData, state.salesForceContact, Some(state.paymentMethod), None) + subscribeItemBuilder.build(subscriptionData, state.salesforceContacts.recipient, Some(state.paymentMethod), None) } } diff --git a/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/GuardianWeeklySubscriptionBuilder.scala b/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/GuardianWeeklySubscriptionBuilder.scala index 89b0f4bd49..012734961b 100644 --- a/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/GuardianWeeklySubscriptionBuilder.scala +++ b/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/GuardianWeeklySubscriptionBuilder.scala @@ -1,10 +1,12 @@ package com.gu.zuora.subscriptionBuilders +import cats.syntax.either._ import com.gu.helpers.DateGenerator import com.gu.support.config.TouchPointEnvironment import com.gu.support.promotions.{PromoError, PromotionService} +import com.gu.support.workers.GuardianWeekly import com.gu.support.workers.ProductTypeRatePlans._ -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.GuardianWeeklyState +import com.gu.support.workers.states.CreateZuoraSubscriptionState import com.gu.support.zuora.api.ReaderType.Gift import com.gu.support.zuora.api._ import com.gu.zuora.subscriptionBuilders.GuardianWeeklySubscriptionBuilder.initialTermInDays @@ -19,70 +21,79 @@ class GuardianWeeklySubscriptionBuilder( ) { def build( - state: GuardianWeeklyState, - csrUsername: Option[String], - salesforceCaseId: Option[String], - ): Either[PromoError, SubscribeItem] = { + product: GuardianWeekly, + state: CreateZuoraSubscriptionState, + ): Either[String, SubscribeItem] = { + val contractEffectiveDate = dateGenerator.today val readerType = if (state.giftRecipient.isDefined) ReaderType.Gift else ReaderType.Direct val recurringProductRatePlanId = - validateRatePlan(weeklyRatePlan(state.product, environment, readerType), state.product.describe) - - val (initialTerm, autoRenew, initialTermPeriodType) = - if (readerType == Gift) - ( - initialTermInDays(contractEffectiveDate, state.firstDeliveryDate, state.product.billingPeriod.monthsInPeriod), - false, - Day, - ) - else - (12, true, Month) - - val subscriptionData = subscribeItemBuilder.buildProductSubscription( - recurringProductRatePlanId, - contractAcceptanceDate = state.firstDeliveryDate, - contractEffectiveDate = contractEffectiveDate, - readerType = ReaderType.impliedBySomeAppliedPromotion(state.appliedPromotion) getOrElse readerType, - autoRenew = autoRenew, - initialTerm = initialTerm, - initialTermPeriodType = initialTermPeriodType, - csrUsername = csrUsername, - salesforceCaseId = salesforceCaseId, - ) - - applyPromoCodeIfPresent( - promotionService, - state.appliedPromotion, - recurringProductRatePlanId, - subscriptionData, - ).map { subscriptionData => - val soldToContact = state.giftRecipient match { - case None => - SubscribeItemBuilder.buildContactDetails( - Some(state.user.primaryEmailAddress), - state.user.firstName, - state.user.lastName, - state.user.deliveryAddress.get, - None, - ) - case Some(gR) => - SubscribeItemBuilder.buildContactDetails( - gR.email, - gR.firstName, - gR.lastName, - state.user.deliveryAddress.get, - None, + validateRatePlan(weeklyRatePlan(product, environment, readerType), product.describe) + for { + firstDeliveryDate <- state.firstDeliveryDate.toRight( + "First delivery date is required for a Guardian Weekly subscription", + ) + (initialTerm, autoRenew, initialTermPeriodType) = + if (readerType == Gift) + ( + initialTermInDays(contractEffectiveDate, firstDeliveryDate, state.product.billingPeriod.monthsInPeriod), + false, + Day, ) - } - subscribeItemBuilder.build( - subscriptionData, - state.salesforceContacts.recipient, - Some(state.paymentMethod), - Some(soldToContact), + else + (12, true, Month) + subscriptionData = subscribeItemBuilder.buildProductSubscription( + recurringProductRatePlanId, + contractAcceptanceDate = firstDeliveryDate, + contractEffectiveDate = contractEffectiveDate, + readerType = ReaderType.impliedBySomeAppliedPromotion(state.appliedPromotion) getOrElse readerType, + autoRenew = autoRenew, + initialTerm = initialTerm, + initialTermPeriodType = initialTermPeriodType, + csrUsername = state.csrUsername, + salesforceCaseId = state.salesforceCaseId, ) - } + subscribeItem <- applyPromo(subscriptionData, recurringProductRatePlanId, state) + } yield subscribeItem + } + def applyPromo( + subscriptionData: SubscriptionData, + recurringProductRatePlanId: String, + state: CreateZuoraSubscriptionState, + ): Either[String, SubscribeItem] = applyPromoCodeIfPresent( + promotionService, + state.appliedPromotion, + recurringProductRatePlanId, + subscriptionData, + ).map { subscriptionData => + val soldToContact = state.giftRecipient match { + case None => + SubscribeItemBuilder.buildContactDetails( + Some(state.user.primaryEmailAddress), + state.user.firstName, + state.user.lastName, + state.user.deliveryAddress.get, + None, + ) + case Some(gR) => + SubscribeItemBuilder.buildContactDetails( + gR.email, + gR.firstName, + gR.lastName, + state.user.deliveryAddress.get, + None, + ) + } + subscribeItemBuilder.build( + subscriptionData, + state.salesforceContacts.recipient, + Some(state.paymentMethod), + Some(soldToContact), + ) + }.leftMap(_.toString) } + object GuardianWeeklySubscriptionBuilder { def initialTermInDays( contractEffectiveDate: LocalDate, diff --git a/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/PaperSubscriptionBuilder.scala b/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/PaperSubscriptionBuilder.scala index f35f835f75..1b52381776 100644 --- a/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/PaperSubscriptionBuilder.scala +++ b/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/PaperSubscriptionBuilder.scala @@ -1,9 +1,11 @@ package com.gu.zuora.subscriptionBuilders +import cats.syntax.either._ import com.gu.support.config.TouchPointEnvironment import com.gu.support.promotions.{PromoError, PromotionService} +import com.gu.support.workers.Paper import com.gu.support.workers.ProductTypeRatePlans._ -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.PaperState +import com.gu.support.workers.states.CreateZuoraSubscriptionState import com.gu.support.zuora.api.ReaderType.Direct import com.gu.support.zuora.api._ import com.gu.zuora.subscriptionBuilders.ProductSubscriptionBuilders.{applyPromoCodeIfPresent, validateRatePlan} @@ -16,47 +18,50 @@ class PaperSubscriptionBuilder( ) { def build( - state: PaperState, - csrUsername: Option[String], - salesforceCaseId: Option[String], - ): Either[PromoError, SubscribeItem] = { - - import state._ + product: Paper, + state: CreateZuoraSubscriptionState, + ): Either[String, SubscribeItem] = { val contractEffectiveDate = LocalDate.now(DateTimeZone.UTC) val productRatePlanId = validateRatePlan(paperRatePlan(product, environment), product.describe) - val subscriptionData = subscribeItemBuilder.buildProductSubscription( - productRatePlanId, - contractAcceptanceDate = state.firstDeliveryDate, - contractEffectiveDate = contractEffectiveDate, - readerType = Direct, - csrUsername = csrUsername, - salesforceCaseId = salesforceCaseId, - deliveryAgent = product.deliveryAgent, - ) - - applyPromoCodeIfPresent( - promotionService, - state.appliedPromotion, - productRatePlanId, - subscriptionData, - ).map { subscriptionData => - val soldToContact = SubscribeItemBuilder.buildContactDetails( - Some(user.primaryEmailAddress), - user.firstName, - user.lastName, - user.deliveryAddress.get, - user.deliveryInstructions, + for { + firstDeliveryDate <- state.firstDeliveryDate.toRight( + "First delivery date is required for a Paper subscription", ) - subscribeItemBuilder.build( - subscriptionData, - state.salesForceContact, - Some(state.paymentMethod), - Some(soldToContact), + subscriptionData = subscribeItemBuilder.buildProductSubscription( + productRatePlanId, + contractAcceptanceDate = firstDeliveryDate, + contractEffectiveDate = contractEffectiveDate, + readerType = Direct, + csrUsername = state.csrUsername, + salesforceCaseId = state.salesforceCaseId, + deliveryAgent = product.deliveryAgent, ) - } + subscribeItem <- applyPromoCodeIfPresent( + promotionService, + state.appliedPromotion, + productRatePlanId, + subscriptionData, + ).map { subscriptionData => + val soldToContact = SubscribeItemBuilder.buildContactDetails( + Some(state.user.primaryEmailAddress), + state.user.firstName, + state.user.lastName, + state.user.deliveryAddress.get, + state.user.deliveryInstructions, + ) + + subscribeItemBuilder.build( + subscriptionData, + state.salesforceContacts.recipient, + Some(state.paymentMethod), + Some(soldToContact), + ) + }.leftMap(_.toString) + } yield subscribeItem + } } diff --git a/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/SupporterPlusSubcriptionBuilder.scala b/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/SupporterPlusSubcriptionBuilder.scala index 7161a0115b..229e58089c 100644 --- a/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/SupporterPlusSubcriptionBuilder.scala +++ b/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/SupporterPlusSubcriptionBuilder.scala @@ -1,18 +1,18 @@ package com.gu.zuora.subscriptionBuilders +import cats.syntax.either._ import com.gu.helpers.DateGenerator import com.gu.i18n.Currency import com.gu.support.catalog.{CatalogService, ProductRatePlanId} import com.gu.support.config.{TouchPointEnvironment, ZuoraSupporterPlusConfig} -import com.gu.support.promotions.{PromoError, PromotionService} -import com.gu.support.workers.Monthly +import com.gu.support.promotions.PromotionService import com.gu.support.workers.ProductTypeRatePlans.supporterPlusRatePlan import com.gu.support.workers.exceptions.{BadRequestException, CatalogDataNotFoundException} -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.SupporterPlusState +import com.gu.support.workers.states.CreateZuoraSubscriptionState +import com.gu.support.workers.{Monthly, SupporterPlus} import com.gu.support.zuora.api.ReaderType.Direct import com.gu.support.zuora.api._ import com.gu.zuora.subscriptionBuilders.ProductSubscriptionBuilders.{applyPromoCodeIfPresent, validateRatePlan} -import com.gu.support.catalog.NoFulfilmentOptions class SupporterPlusSubcriptionBuilder( config: ZuoraSupporterPlusConfig, @@ -24,18 +24,17 @@ class SupporterPlusSubcriptionBuilder( ) { def build( - state: SupporterPlusState, - csrUsername: Option[String], - salesforceCaseId: Option[String], - ): Either[PromoError, SubscribeItem] = { + product: SupporterPlus, + state: CreateZuoraSubscriptionState, + ): Either[String, SubscribeItem] = { val productRatePlanId = - validateRatePlan(supporterPlusRatePlan(state.product, environment), state.product.describe) + validateRatePlan(supporterPlusRatePlan(product, environment), product.describe) val contributionRatePlanChargeId = - if (state.product.billingPeriod == Monthly) config.v2.monthlyContributionChargeId + if (product.billingPeriod == Monthly) config.v2.monthlyContributionChargeId else config.v2.annualContributionChargeId val todaysDate = dateGenerator.today - val contributionAmount = state.product.amount - getBaseProductPrice(productRatePlanId, state.product.currency) + val contributionAmount = product.amount - getBaseProductPrice(productRatePlanId, product.currency) if (contributionAmount < 0) throw new BadRequestException( s"The contribution amount of a supporter plus subscription cannot be less than zero, but here it would be $contributionAmount", @@ -54,8 +53,8 @@ class SupporterPlusSubcriptionBuilder( contractEffectiveDate = todaysDate, contractAcceptanceDate = todaysDate, readerType = Direct, - csrUsername = csrUsername, - salesforceCaseId = salesforceCaseId, + csrUsername = state.csrUsername, + salesforceCaseId = state.salesforceCaseId, ) applyPromoCodeIfPresent( @@ -64,8 +63,8 @@ class SupporterPlusSubcriptionBuilder( productRatePlanId, subscriptionData, ).map { subscriptionData => - subscribeItemBuilder.build(subscriptionData, state.salesForceContact, Some(state.paymentMethod), None) - } + subscribeItemBuilder.build(subscriptionData, state.salesforceContacts.recipient, Some(state.paymentMethod), None) + }.leftMap(_.toString) } private def getBaseProductPrice(productRatePlanId: ProductRatePlanId, currency: Currency) = diff --git a/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/TierThreeSubscriptionBuilder.scala b/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/TierThreeSubscriptionBuilder.scala index f36d9e983a..829878a161 100644 --- a/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/TierThreeSubscriptionBuilder.scala +++ b/support-workers/src/main/scala/com/gu/zuora/subscriptionBuilders/TierThreeSubscriptionBuilder.scala @@ -1,10 +1,12 @@ package com.gu.zuora.subscriptionBuilders +import cats.syntax.either._ import com.gu.helpers.DateGenerator import com.gu.support.config.TouchPointEnvironment import com.gu.support.promotions.{PromoError, PromotionService} import com.gu.support.workers.ProductTypeRatePlans._ -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.TierThreeState +import com.gu.support.workers.TierThree +import com.gu.support.workers.states.CreateZuoraSubscriptionState import com.gu.support.zuora.api._ import com.gu.zuora.subscriptionBuilders.ProductSubscriptionBuilders.{applyPromoCodeIfPresent, validateRatePlan} @@ -16,46 +18,49 @@ class TierThreeSubscriptionBuilder( ) { def build( - state: TierThreeState, - csrUsername: Option[String], - salesforceCaseId: Option[String], - ): Either[PromoError, SubscribeItem] = { + product: TierThree, + state: CreateZuoraSubscriptionState, + ): Either[String, SubscribeItem] = { val contractEffectiveDate = dateGenerator.today val productRatePlanId = - validateRatePlan(tierThreeRatePlan(state.product, environment), state.product.describe) + validateRatePlan(tierThreeRatePlan(product, environment), product.describe) - val subscriptionData = subscribeItemBuilder.buildProductSubscription( - productRatePlanId, - contractAcceptanceDate = state.firstDeliveryDate, - contractEffectiveDate = contractEffectiveDate, - readerType = ReaderType.Direct, - csrUsername = csrUsername, - salesforceCaseId = salesforceCaseId, - ) + for { + firstDeliveryDate <- state.firstDeliveryDate.toRight( + "First delivery date is required for a Tier Three subscription", + ) + subscriptionData = subscribeItemBuilder.buildProductSubscription( + productRatePlanId, + contractAcceptanceDate = firstDeliveryDate, + contractEffectiveDate = contractEffectiveDate, + readerType = ReaderType.Direct, + csrUsername = state.csrUsername, + salesforceCaseId = state.salesforceCaseId, + ) + subscribeItem <- applyPromoCodeIfPresent( + promotionService, + state.appliedPromotion, + productRatePlanId, + subscriptionData, + ).map { subscriptionData => + val soldToContact = + SubscribeItemBuilder.buildContactDetails( + Some(state.user.primaryEmailAddress), + state.user.firstName, + state.user.lastName, + state.user.deliveryAddress.get, + None, + ) - applyPromoCodeIfPresent( - promotionService, - state.appliedPromotion, - productRatePlanId, - subscriptionData, - ).map { subscriptionData => - val soldToContact = - SubscribeItemBuilder.buildContactDetails( - Some(state.user.primaryEmailAddress), - state.user.firstName, - state.user.lastName, - state.user.deliveryAddress.get, - None, + subscribeItemBuilder.build( + subscriptionData, + state.salesforceContacts.recipient, + Some(state.paymentMethod), + Some(soldToContact), ) - - subscribeItemBuilder.build( - subscriptionData, - state.salesForceContact, - Some(state.paymentMethod), - Some(soldToContact), - ) - } + }.leftMap(_.toString) + } yield subscribeItem } } diff --git a/support-workers/src/test/scala/com/gu/support/workers/JsonFixtures.scala b/support-workers/src/test/scala/com/gu/support/workers/JsonFixtures.scala index c0f07dbe9a..c0f872318a 100644 --- a/support-workers/src/test/scala/com/gu/support/workers/JsonFixtures.scala +++ b/support-workers/src/test/scala/com/gu/support/workers/JsonFixtures.scala @@ -1,23 +1,23 @@ package com.gu.support.workers -import com.gu.i18n.{Country, CountryGroup, Currency, Title} import com.gu.i18n.Country.UK import com.gu.i18n.Currency.GBP +import com.gu.i18n.{Country, CountryGroup, Currency, Title} import com.gu.salesforce.Fixtures.{emailAddress, idId} import com.gu.salesforce.Salesforce.SalesforceContactRecords -import com.gu.support.catalog.{Domestic, Everyday, HomeDelivery, NationalDelivery, RestOfWorld} +import com.gu.support.catalog._ import com.gu.support.paperround.AgentId import com.gu.support.workers.encoding.Conversions.StringInputStreamConversions -import com.gu.support.workers.states.{AnalyticsInfo, CreateZuoraSubscriptionProductState, CreateZuoraSubscriptionState} -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.{ - ContributionState, - DigitalSubscriptionState, - GuardianAdLiteState, - GuardianWeeklyState, - PaperState, - SupporterPlusState, - TierThreeState, +import com.gu.support.workers.{ + DigitalPack, + GuardianWeekly, + TierThree, + Contribution, + SupporterPlus, + Paper, + GuardianAdLite, } +import com.gu.support.workers.states.{AnalyticsInfo, CreateZuoraSubscriptionState} import com.gu.support.zuora.api.StripeGatewayDefault import com.gu.zuora.Fixtures.deliveryAgentId import io.circe.parser @@ -26,7 +26,6 @@ import org.joda.time.{DateTimeZone, LocalDate} import java.io.ByteArrayInputStream import java.util.UUID -import com.gu.support.catalog.FulfilmentOptions //noinspection TypeAnnotation object JsonFixtures { @@ -452,20 +451,18 @@ object JsonFixtures { def createContributionZuoraSubscriptionJson(amount: BigDecimal = 5, billingPeriod: BillingPeriod = Monthly): String = CreateZuoraSubscriptionState( - ContributionState( - Contribution(amount, GBP, billingPeriod), - stripePaymentMethodObj, - salesforceContact, - ), UUID.randomUUID(), user(), + None, Contribution(amount, GBP, billingPeriod), + stripePaymentMethodObj, AnalyticsInfo(isGiftPurchase = false, Stripe), None, None, None, None, None, + salesforceContacts, ).asJson.spaces2 def createSupporterPlusZuoraSubscriptionJson( @@ -475,22 +472,18 @@ object JsonFixtures { country: Country = UK, ): String = CreateZuoraSubscriptionState( - SupporterPlusState( - Country.UK, - SupporterPlus(amount, currency, billingPeriod), - stripePaymentMethodObj, - None, - salesforceContact, - ), UUID.randomUUID(), user("9999998", country), - SupporterPlus(amount, currency, Monthly), + None, + SupporterPlus(amount, currency, billingPeriod), + stripePaymentMethodObj, AnalyticsInfo(isGiftPurchase = false, Stripe), None, None, None, None, None, + salesforceContacts, ).asJson.spaces2 def createTierThreeZuoraSubscriptionJson( @@ -500,106 +493,83 @@ object JsonFixtures { country: Country = UK, ): String = CreateZuoraSubscriptionState( - productSpecificState = TierThreeState( - userJsonWithDeliveryAddress, - TierThree(currency, billingPeriod, fulfilmentOptions), - stripePaymentMethodObj, - LocalDate.now(DateTimeZone.UTC).plusDays(10), - None, - salesforceContact, - ), requestId = UUID.randomUUID(), user = user("9999998", country), - product = TierThree(currency, Monthly, fulfilmentOptions), + giftRecipient = None, + product = TierThree(currency, billingPeriod, fulfilmentOptions), + paymentMethod = stripePaymentMethodObj, analyticsInfo = AnalyticsInfo(isGiftPurchase = false, Stripe), - firstDeliveryDate = None, + firstDeliveryDate = Some(LocalDate.now(DateTimeZone.UTC).plusDays(10)), appliedPromotion = None, csrUsername = None, salesforceCaseId = None, acquisitionData = None, + salesforceContacts = salesforceContacts, ).asJson.spaces2 val createDigiPackZuoraSubscriptionJson = CreateZuoraSubscriptionState( - DigitalSubscriptionState( - Country.UK, - DigitalPack(GBP, Annual), - stripePaymentMethodObj, - None, - salesforceContact, - ), - UUID.randomUUID(), - user(), - DigitalPack(GBP, Annual), - AnalyticsInfo(isGiftPurchase = false, Stripe), - None, - None, - None, - None, - None, + requestId = UUID.randomUUID(), + user = user(), + giftRecipient = None, + product = DigitalPack(GBP, Annual), + paymentMethod = stripePaymentMethodObj, + analyticsInfo = AnalyticsInfo(isGiftPurchase = false, Stripe), + firstDeliveryDate = None, + appliedPromotion = None, + csrUsername = None, + salesforceCaseId = None, + acquisitionData = None, + salesforceContacts = salesforceContacts, ).asJson.spaces2 val createDigiPackSubscriptionWithPromoJson = CreateZuoraSubscriptionState( - DigitalSubscriptionState( - Country.UK, - DigitalPack(GBP, Annual), - stripePaymentMethodObj, - Some(AppliedPromotion("DJP8L27FY", CountryGroup.UK.id)), - salesforceContact, - ), - UUID.randomUUID(), - user(), - DigitalPack(GBP, Annual), - AnalyticsInfo(isGiftPurchase = false, Stripe), - None, - None, - None, - None, - None, + requestId = UUID.randomUUID(), + user = user(), + giftRecipient = None, + product = DigitalPack(GBP, Annual), + paymentMethod = stripePaymentMethodObj, + analyticsInfo = AnalyticsInfo(isGiftPurchase = false, Stripe), + firstDeliveryDate = None, + appliedPromotion = Some(AppliedPromotion("DJP8L27FY", CountryGroup.UK.id)), + csrUsername = None, + salesforceCaseId = None, + acquisitionData = None, + salesforceContacts = salesforceContacts, ).asJson.spaces2 val createEverydayPaperSubscriptionJson = CreateZuoraSubscriptionState( - PaperState( - userJsonWithDeliveryAddress, - Paper(GBP, Monthly, HomeDelivery, Everyday, None), - stripePaymentMethodObj, - LocalDate.now(DateTimeZone.UTC), - None, - salesforceContact, - ), - UUID.randomUUID(), - userJsonWithDeliveryAddress, - Paper(GBP, Monthly, HomeDelivery, Everyday, None), - AnalyticsInfo(isGiftPurchase = false, Stripe), - None, - None, - None, - None, - None, + requestId = UUID.randomUUID(), + user = userJsonWithDeliveryAddress, + giftRecipient = None, + product = Paper(GBP, Monthly, HomeDelivery, Everyday, None), + paymentMethod = stripePaymentMethodObj, + analyticsInfo = AnalyticsInfo(isGiftPurchase = false, Stripe), + firstDeliveryDate = Some(LocalDate.now(DateTimeZone.UTC)), + appliedPromotion = None, + csrUsername = None, + salesforceCaseId = None, + acquisitionData = None, + salesforceContacts = salesforceContacts, ).asJson.spaces2 val createEverydayNationalDeliveryPaperSubscriptionJson = { val paper = Paper(GBP, Monthly, NationalDelivery, Everyday, Some(AgentId(deliveryAgentId))) CreateZuoraSubscriptionState( - PaperState( - userJsonWithDeliveryAddressOutsideLondon, - paper, - stripePaymentMethodObj, - LocalDate.now(DateTimeZone.UTC), - None, - salesforceContact, - ), UUID.randomUUID(), userJsonWithDeliveryAddressOutsideLondon, + None, paper, + stripePaymentMethodObj, AnalyticsInfo(isGiftPurchase = false, Stripe), + Some(LocalDate.now(DateTimeZone.UTC)), None, None, None, None, - None, + salesforceContacts, ).asJson.spaces2 } @@ -607,71 +577,57 @@ object JsonFixtures { billingPeriod: BillingPeriod, ): String = CreateZuoraSubscriptionState( - GuardianWeeklyState( - userJsonWithDeliveryAddress, - None, - GuardianWeekly(GBP, billingPeriod, RestOfWorld), - stripePaymentMethodObj, - LocalDate.now(DateTimeZone.UTC).plusDays(10), - None, - salesforceContacts, - ), UUID.randomUUID(), userJsonWithDeliveryAddress, + None, GuardianWeekly(GBP, billingPeriod, RestOfWorld), + stripePaymentMethodObj, AnalyticsInfo(isGiftPurchase = false, Stripe), Some(LocalDate.now(DateTimeZone.UTC).plusDays(10)), None, None, None, None, + salesforceContacts, ).asJson.spaces2 val guardianWeeklyGiftJson = CreateZuoraSubscriptionState( - GuardianWeeklyState( - userJsonWithDeliveryAddress, - Some( - GiftRecipient( - Some(Title.Mr), - "Harry", - "Ramsden", - None, - ), - ), - GuardianWeekly(GBP, Quarterly, RestOfWorld), - stripePaymentMethodObj, - LocalDate.now(DateTimeZone.UTC).plusDays(10), - None, - salesforceContacts, - ), UUID.randomUUID(), userJsonWithDeliveryAddress, + Some( + GiftRecipient( + Some(Title.Mr), + "Harry", + "Ramsden", + None, + ), + ), GuardianWeekly(GBP, Quarterly, RestOfWorld), + stripePaymentMethodObj, AnalyticsInfo(isGiftPurchase = false, Stripe), Some(LocalDate.now(DateTimeZone.UTC).plusDays(10)), None, None, None, None, + salesforceContacts, ).asJson.spaces2 val createGuardianAdLiteZuoraSubscriptionJson = CreateZuoraSubscriptionState( - GuardianAdLiteState( - GuardianAdLite(GBP), - stripePaymentMethodObj, - salesforceContact, - ), UUID.randomUUID(), user(), + None, GuardianAdLite(GBP), + stripePaymentMethodObj, AnalyticsInfo(isGiftPurchase = false, Stripe), None, None, None, None, None, + salesforceContacts, ).asJson.spaces2 val failureJson = @@ -954,22 +910,18 @@ object JsonFixtures { """ val digipackSubscriptionWithDiscountAndFreeTrialJson = CreateZuoraSubscriptionState( - DigitalSubscriptionState( - Country.UK, - DigitalPack(GBP, Annual), - stripePaymentMethodObj, - Some(AppliedPromotion("DJRHYMDS8", CountryGroup.UK.id)), - salesforceContact, - ), UUID.randomUUID(), user(), + None, DigitalPack(GBP, Annual), + stripePaymentMethodObj, AnalyticsInfo(isGiftPurchase = false, Stripe), None, Some(AppliedPromotion("DJRHYMDS8", CountryGroup.UK.id)), None, None, None, + salesforceContacts, ).asJson.spaces2 def getPaymentMethodJson(billingAccountId: String, userId: String): String = diff --git a/support-workers/src/test/scala/com/gu/support/workers/createZuoraSubscription/CreateZuoraSubscriptionDigitalSubscriptionStepsSpec.scala b/support-workers/src/test/scala/com/gu/support/workers/createZuoraSubscription/CreateZuoraSubscriptionDigitalSubscriptionStepsSpec.scala index 81e22f650d..421d4686ff 100644 --- a/support-workers/src/test/scala/com/gu/support/workers/createZuoraSubscription/CreateZuoraSubscriptionDigitalSubscriptionStepsSpec.scala +++ b/support-workers/src/test/scala/com/gu/support/workers/createZuoraSubscription/CreateZuoraSubscriptionDigitalSubscriptionStepsSpec.scala @@ -2,10 +2,11 @@ package com.gu.support.workers.createZuoraSubscription import com.gu.helpers.DateGenerator import com.gu.i18n.{Country, Currency} +import com.gu.salesforce.Salesforce.SalesforceContactRecords import com.gu.support.config.{TouchPointEnvironments, ZuoraDigitalPackConfig} -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.DigitalSubscriptionState -import com.gu.support.workers.states.SendThankYouEmailState.SendThankYouEmailDigitalSubscriptionState import com.gu.support.workers._ +import com.gu.support.workers.states.SendThankYouEmailState.SendThankYouEmailDigitalSubscriptionState +import com.gu.support.workers.states.{AnalyticsInfo, CreateZuoraSubscriptionState} import com.gu.support.zuora.api.response._ import com.gu.support.zuora.api.{PreviewSubscribeRequest, ReaderType, SubscribeRequest} import com.gu.support.zuora.domain @@ -24,12 +25,28 @@ class CreateZuoraSubscriptionDigitalSubscriptionStepsSpec extends AsyncFlatSpec it should "create a Digital Pack standard (paid) subscription" in { - val state = DigitalSubscriptionState( - billingCountry = Country.UK, - product = DigitalPack(Currency.GBP, Monthly), + val product = DigitalPack(Currency.GBP, Monthly) + val user = User( + "111222", + "email@blah.com", + None, + "bertha", + "smith", + Address(None, None, None, None, None, Country.UK), + ) + val state = CreateZuoraSubscriptionState( + requestId = UUID.randomUUID(), + user = user, + giftRecipient = None, + product = product, paymentMethod = PayPalReferenceTransaction("baid", "me@somewhere.com"), + analyticsInfo = AnalyticsInfo(isGiftPurchase = false, PayPal), + firstDeliveryDate = None, appliedPromotion = None, - salesForceContact = SalesforceContactRecord("sfbuy", "sfbuyacid"), + csrUsername = None, + salesforceCaseId = None, + acquisitionData = None, + salesforceContacts = SalesforceContactRecords(SalesforceContactRecord("sfbuy", "sfbuyacid"), None), ) val zuora = new ZuoraSubscribeService { @@ -79,14 +96,7 @@ class CreateZuoraSubscriptionDigitalSubscriptionStepsSpec extends AsyncFlatSpec TouchPointEnvironments.CODE, new SubscribeItemBuilder( requestId = UUID.fromString("f7651338-5d94-4f57-85fd-262030de9ad5"), - user = User( - "111222", - "email@blah.com", - None, - "bertha", - "smith", - Address(None, None, None, None, None, Country.UK), - ), + user = user, Currency.GBP, ), ), @@ -94,7 +104,7 @@ class CreateZuoraSubscriptionDigitalSubscriptionStepsSpec extends AsyncFlatSpec User("111222", "email@blah.com", None, "bertha", "smith", Address(None, None, None, None, None, Country.UK)), ) - val result = subscriptionCreator.subscribe(state, None, None) + val result = subscriptionCreator.subscribe(product, state) result.map { sendThankYouEmailState => withClue(sendThankYouEmailState) { diff --git a/support-workers/src/test/scala/com/gu/support/workers/createZuoraSubscription/CreateZuoraSubscriptionSupporterPlusStepsSpec.scala b/support-workers/src/test/scala/com/gu/support/workers/createZuoraSubscription/CreateZuoraSubscriptionSupporterPlusStepsSpec.scala index d996e37f1c..5c2418f06d 100644 --- a/support-workers/src/test/scala/com/gu/support/workers/createZuoraSubscription/CreateZuoraSubscriptionSupporterPlusStepsSpec.scala +++ b/support-workers/src/test/scala/com/gu/support/workers/createZuoraSubscription/CreateZuoraSubscriptionSupporterPlusStepsSpec.scala @@ -3,12 +3,13 @@ package com.gu.support.workers.createZuoraSubscription import com.gu.helpers.DateGenerator import com.gu.i18n.CountryGroup.UK import com.gu.i18n.{Country, Currency} +import com.gu.salesforce.Salesforce.SalesforceContactRecords import com.gu.support.catalog.{CatalogServiceSpec, ProductRatePlanId} import com.gu.support.config.{TouchPointEnvironments, V2, ZuoraSupporterPlusConfig} +import com.gu.support.workers._ import com.gu.support.workers.integration.TestData.supporterPlusPromotionService -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.SupporterPlusState import com.gu.support.workers.states.SendThankYouEmailState.SendThankYouEmailSupporterPlusState -import com.gu.support.workers._ +import com.gu.support.workers.states.{AnalyticsInfo, CreateZuoraSubscriptionState} import com.gu.support.zuora.api.response._ import com.gu.support.zuora.api.{PreviewSubscribeRequest, ReaderType, SubscribeRequest} import com.gu.support.zuora.{api, domain} @@ -34,12 +35,28 @@ class CreateZuoraSubscriptionSupporterPlusStepsSpec extends AsyncFlatSpec with M it should "create a supporter plus subscription with promo" in { - val state = SupporterPlusState( - billingCountry = Country.UK, - product = SupporterPlus(20, Currency.GBP, Monthly), + val product = SupporterPlus(20, Currency.GBP, Monthly) + val user = User( + "111222", + "email@blah.com", + None, + "bertha", + "smith", + Address(None, None, None, None, None, Country.UK), + ) + val state = CreateZuoraSubscriptionState( + requestId = UUID.randomUUID(), + user = user, + giftRecipient = None, + product = product, paymentMethod = PayPalReferenceTransaction("baid", "me@somewhere.com"), + analyticsInfo = AnalyticsInfo(isGiftPurchase = false, PayPal), + firstDeliveryDate = None, appliedPromotion = Some(AppliedPromotion("SUPPORTER_PLUS_PROMO", UK.id)), - salesForceContact = SalesforceContactRecord("sfbuy", "sfbuyacid"), + csrUsername = None, + salesforceCaseId = None, + acquisitionData = None, + salesforceContacts = SalesforceContactRecords(SalesforceContactRecord("sfbuy", "sfbuyacid"), None), ) val zuora = new ZuoraSubscribeService { @@ -129,14 +146,7 @@ class CreateZuoraSubscriptionSupporterPlusStepsSpec extends AsyncFlatSpec with M TouchPointEnvironments.PROD, new SubscribeItemBuilder( requestId = UUID.fromString("f7651338-5d94-4f57-85fd-262030de9ad5"), - user = User( - "111222", - "email@blah.com", - None, - "bertha", - "smith", - Address(None, None, None, None, None, Country.UK), - ), + user = user, Currency.GBP, ), ), @@ -144,7 +154,7 @@ class CreateZuoraSubscriptionSupporterPlusStepsSpec extends AsyncFlatSpec with M User("111222", "email@blah.com", None, "bertha", "smith", Address(None, None, None, None, None, Country.UK)), ) - val result = subscriptionCreator.subscribe(state, None, None) + val result = subscriptionCreator.subscribe(product, state) result.map { sendThankYouEmailState => withClue(sendThankYouEmailState) { diff --git a/support-workers/src/test/scala/com/gu/support/workers/integration/CreateSalesforceContactSpec.scala b/support-workers/src/test/scala/com/gu/support/workers/integration/CreateSalesforceContactSpec.scala index 2fa9a8c247..6384092014 100644 --- a/support-workers/src/test/scala/com/gu/support/workers/integration/CreateSalesforceContactSpec.scala +++ b/support-workers/src/test/scala/com/gu/support/workers/integration/CreateSalesforceContactSpec.scala @@ -5,7 +5,6 @@ import com.gu.support.workers.JsonFixtures.{createSalesForceContactJson, createS import com.gu.support.workers.encoding.Conversions.FromOutputStream import com.gu.support.workers.encoding.Encoding import com.gu.support.workers.lambdas.CreateSalesforceContact -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.{ContributionState, GuardianWeeklyState} import com.gu.support.workers.states.CreateZuoraSubscriptionState import com.gu.support.workers.{AsyncLambdaSpec, MockContext} import com.gu.test.tags.annotations.IntegrationTest @@ -24,8 +23,8 @@ class CreateSalesforceContactSpec extends AsyncLambdaSpec with MockContext { createContact.handleRequestFuture(wrapFixture(createSalesForceContactJson), outStream, context).map { _ => val result = Encoding.in[CreateZuoraSubscriptionState](outStream.toInputStream) result.isSuccess should be(true) - inside(result.get._1.productSpecificState) { case state: ContributionState => - state.salesForceContact.Id should be("003UD00000Enm1yYAB") + inside(result.get._1) { case state: CreateZuoraSubscriptionState => + state.salesforceContacts.buyer.Id should be("003UD00000Enm1yYAB") } } } @@ -38,7 +37,7 @@ class CreateSalesforceContactSpec extends AsyncLambdaSpec with MockContext { createContact.handleRequestFuture(wrapFixture(createSalesForceGiftContactJson), outStream, context).map { _ => val result = Encoding.in[CreateZuoraSubscriptionState](outStream.toInputStream) result.isSuccess should be(true) - inside(result.get._1.productSpecificState) { case state: GuardianWeeklyState => + inside(result.get._1) { case state: CreateZuoraSubscriptionState => state.salesforceContacts.buyer.Id should be(salesforceId) state.salesforceContacts.giftRecipient shouldBe defined } diff --git a/support-workers/src/test/scala/com/gu/support/workers/integration/PreparePaymentMethodForReuseSpec.scala b/support-workers/src/test/scala/com/gu/support/workers/integration/PreparePaymentMethodForReuseSpec.scala index cf3d4c0033..edefc81381 100644 --- a/support-workers/src/test/scala/com/gu/support/workers/integration/PreparePaymentMethodForReuseSpec.scala +++ b/support-workers/src/test/scala/com/gu/support/workers/integration/PreparePaymentMethodForReuseSpec.scala @@ -9,7 +9,6 @@ import com.gu.support.workers.encoding.Conversions.FromOutputStream import com.gu.support.workers.encoding.Encoding import com.gu.support.workers.errors.MockServicesCreator import com.gu.support.workers.lambdas.PreparePaymentMethodForReuse -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.ContributionState import com.gu.support.workers.states.CreateZuoraSubscriptionState import com.gu.support.workers.{AsyncLambdaSpec, CreditCardReferenceTransaction, MockContext} import com.gu.support.zuora.api.StripeGatewayPaymentIntentsDefault @@ -35,7 +34,7 @@ class PreparePaymentMethodForReuseSpec extends AsyncLambdaSpec with MockServices preparePaymentMethodForReuse.handleRequestFuture(in, outStream, context).map { _ => val response = Encoding.in[CreateZuoraSubscriptionState](outStream.toInputStream).get - inside(response._1.productSpecificState) { case state: ContributionState => + inside(response._1) { case state: CreateZuoraSubscriptionState => state.paymentMethod shouldBe CreditCardReferenceTransaction( TokenId = "card_EdajV2eXkZPrVV", SecondTokenId = "cus_EdajoRmjUSlef9", diff --git a/support-workers/src/test/scala/com/gu/zuora/subscriptionBuilders/DigitalSubscriptionBuilderSpec.scala b/support-workers/src/test/scala/com/gu/zuora/subscriptionBuilders/DigitalSubscriptionBuilderSpec.scala index 6687611753..74becb3492 100644 --- a/support-workers/src/test/scala/com/gu/zuora/subscriptionBuilders/DigitalSubscriptionBuilderSpec.scala +++ b/support-workers/src/test/scala/com/gu/zuora/subscriptionBuilders/DigitalSubscriptionBuilderSpec.scala @@ -4,12 +4,13 @@ import com.gu.helpers.DateGenerator import com.gu.i18n.Country import com.gu.i18n.CountryGroup.UK import com.gu.i18n.Currency.GBP +import com.gu.salesforce.Salesforce.SalesforceContactRecords import com.gu.support.acquisitions.{AbTest, AcquisitionData, OphanIds} import com.gu.support.config.TouchPointEnvironments.CODE import com.gu.support.config.ZuoraDigitalPackConfig import com.gu.support.promotions.{Promotion, PromotionService, PromotionWithCode} import com.gu.support.workers._ -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.DigitalSubscriptionState +import com.gu.support.workers.states.{AnalyticsInfo, CreateZuoraSubscriptionState} import com.gu.support.zuora.api.AcquisitionSource.CSR import com.gu.support.zuora.api._ import com.gu.zuora.Fixtures.blankReferrerAcquisitionData @@ -146,33 +147,41 @@ class DigitalSubscriptionBuilderSpec extends AsyncFlatSpec with Matchers { ), ) + val requestId = UUID.fromString("f7651338-5d94-4f57-85fd-262030de9ad5") + val product = DigitalPack(GBP, Monthly) + val user = User("123", "hi@thegulocal.com", None, "Bob", "Smith", Address(None, None, None, None, None, Country.UK)) + val analyticsInfo = AnalyticsInfo(isGiftPurchase = false, PayPal) + val salesforceContactRecords = SalesforceContactRecords(SalesforceContactRecord("", ""), None) + val state = CreateZuoraSubscriptionState( + requestId = requestId, + user = user, + giftRecipient = None, + product = product, + paymentMethod = PayPalReferenceTransaction("baid", "hi@thegulocal.com"), + analyticsInfo = analyticsInfo, + firstDeliveryDate = None, + appliedPromotion = None, + csrUsername = None, + salesforceCaseId = None, + acquisitionData = None, + salesforceContacts = salesforceContactRecords, + ) lazy val monthly = subscriptionDirectPurchaseBuilder .build( - DigitalSubscriptionState( - Country.UK, - DigitalPack(GBP, Monthly), - PayPalReferenceTransaction("baid", "hi@thegulocal.com"), - None, - SalesforceContactRecord("", ""), - ), - None, - None, + product, + state, ) .toOption .get lazy val csrSubscription = subscriptionDirectPurchaseBuilder .build( - DigitalSubscriptionState( - Country.UK, - DigitalPack(GBP, Monthly), - PayPalReferenceTransaction("baid", "hi@thegulocal.com"), - None, - SalesforceContactRecord("", ""), + product, + state.copy( + csrUsername = Some("Dan Csr"), + salesforceCaseId = Some("test_case_id"), ), - Some("Dan Csr"), - Some("test_case_id"), ) .toOption .get @@ -181,15 +190,10 @@ class DigitalSubscriptionBuilderSpec extends AsyncFlatSpec with Matchers { lazy val monthlyWithPromo = subscriptionDirectPurchaseBuilder .build( - DigitalSubscriptionState( - Country.UK, - DigitalPack(GBP, Monthly), - PayPalReferenceTransaction("baid", "hi@thegulocal.com"), - Some(AppliedPromotion("NOTAPATRONPROMO", UK.id)), - SalesforceContactRecord("", ""), + product, + state.copy( + appliedPromotion = Some(AppliedPromotion("NOTAPATRONPROMO", UK.id)), ), - None, - None, ) .toOption .get @@ -197,15 +201,10 @@ class DigitalSubscriptionBuilderSpec extends AsyncFlatSpec with Matchers { lazy val monthlyPatron = subscriptionDirectPurchaseBuilder .build( - DigitalSubscriptionState( - Country.UK, - DigitalPack(GBP, Monthly), - PayPalReferenceTransaction("baid", "hi@thegulocal.com"), - Some(AppliedPromotion("FOOPATRON", UK.id)), - SalesforceContactRecord("", ""), + product, + state.copy( + appliedPromotion = Some(AppliedPromotion("FOOPATRON", UK.id)), ), - None, - None, ) .toOption .get diff --git a/support-workers/src/test/scala/com/gu/zuora/subscriptionBuilders/GuardianWeeklySubscriptionBuildersSpec.scala b/support-workers/src/test/scala/com/gu/zuora/subscriptionBuilders/GuardianWeeklySubscriptionBuildersSpec.scala index 7b47ef20d8..9a0c64ec2b 100644 --- a/support-workers/src/test/scala/com/gu/zuora/subscriptionBuilders/GuardianWeeklySubscriptionBuildersSpec.scala +++ b/support-workers/src/test/scala/com/gu/zuora/subscriptionBuilders/GuardianWeeklySubscriptionBuildersSpec.scala @@ -9,7 +9,7 @@ import com.gu.support.catalog.Domestic import com.gu.support.config.TouchPointEnvironments.CODE import com.gu.support.promotions.{Promotion, PromotionService, PromotionWithCode} import com.gu.support.workers._ -import com.gu.support.workers.states.CreateZuoraSubscriptionProductState.GuardianWeeklyState +import com.gu.support.workers.states.{AnalyticsInfo, CreateZuoraSubscriptionState} import com.gu.support.zuora.api.AcquisitionSource.CSR import com.gu.support.zuora.api.ReaderType.{Direct, Patron} import com.gu.support.zuora.api.{Day, Month, SubscriptionData} @@ -132,22 +132,39 @@ class GuardianWeeklySubscriptionBuildersSpec extends AnyFlatSpec with Matchers { nonGiftPatron.subscription.readerType shouldBe Patron } - lazy val weekly = GuardianWeekly(GBP, Quarterly, Domestic) + val requestId = UUID.fromString("f7651338-5d94-4f57-85fd-262030de9ad5") + val user = User( + "1234", + "hi@thegulocal.com", + None, + "bob", + "smith", + Address(None, None, None, None, None, Country.UK), + Some(Address(None, None, None, None, None, Country.UK)), + ) + lazy val product = GuardianWeekly(GBP, Quarterly, Domestic) lazy val promotionService = mock[PromotionService] lazy val saleDate = new LocalDate(2019, 10, 24) lazy val firstDeliveryDate = saleDate.plusDays(3) + val salesforceContactRecords = SalesforceContactRecords(SalesforceContactRecord("", ""), None) + lazy val state = CreateZuoraSubscriptionState( + requestId = requestId, + user = user, + giftRecipient = None, + product = product, + paymentMethod = PayPalReferenceTransaction("baid", "hi@thegulocal.com"), + analyticsInfo = AnalyticsInfo(false, PayPal), + firstDeliveryDate = Some(firstDeliveryDate), + appliedPromotion = None, + csrUsername = None, + salesforceCaseId = None, + acquisitionData = None, + salesforceContacts = salesforceContactRecords, + ) lazy val subscribeItemBuilder = new SubscribeItemBuilder( - UUID.randomUUID(), - User( - "1234", - "hi@thegulocal.com", - None, - "bob", - "smith", - Address(None, None, None, None, None, Country.UK), - Some(Address(None, None, None, None, None, Country.UK)), - ), + requestId, + user, GBP, ) @@ -157,56 +174,20 @@ class GuardianWeeklySubscriptionBuildersSpec extends AnyFlatSpec with Matchers { DateGenerator(saleDate), subscribeItemBuilder, ).build( - GuardianWeeklyState( - User( - "1234", - "hi@thegulocal.com", - None, - "bob", - "smith", - Address(None, None, None, None, None, Country.UK), - Some(Address(None, None, None, None, None, Country.UK)), - ), - Some(GiftRecipient(None, "bob", "smith", None)), - weekly, - PayPalReferenceTransaction("baid", "hi@thegulocal.com"), - firstDeliveryDate, - None, - SalesforceContactRecords(SalesforceContactRecord("", ""), Some(SalesforceContactRecord("", ""))), - ), - None, - None, + product, + state.copy(giftRecipient = Some(GiftRecipient(None, "bob", "smith", None))), ).toOption .get .subscriptionData - val nonGiftState = GuardianWeeklyState( - User( - "1234", - "hi@thegulocal.com", - None, - "bob", - "smith", - Address(None, None, None, None, None, Country.UK), - Some(Address(None, None, None, None, None, Country.UK)), - ), - None, - weekly, - PayPalReferenceTransaction("baid", "hi@thegulocal.com"), - firstDeliveryDate, - None, - SalesforceContactRecords(SalesforceContactRecord("", ""), Some(SalesforceContactRecord("", ""))), - ); - lazy val nonGift = new GuardianWeeklySubscriptionBuilder( promotionService, CODE, DateGenerator(saleDate), subscribeItemBuilder, ).build( - nonGiftState, - None, - None, + product, + state, ).toOption .get .subscriptionData @@ -217,25 +198,11 @@ class GuardianWeeklySubscriptionBuildersSpec extends AnyFlatSpec with Matchers { DateGenerator(saleDate), subscribeItemBuilder, ).build( - GuardianWeeklyState( - User( - "1234", - "hi@thegulocal.com", - None, - "bob", - "smith", - Address(None, None, None, None, None, Country.UK), - Some(Address(None, None, None, None, None, Country.UK)), - ), - None, - weekly, - PayPalReferenceTransaction("baid", "hi@thegulocal.com"), - firstDeliveryDate, - None, - SalesforceContactRecords(SalesforceContactRecord("", ""), Some(SalesforceContactRecord("", ""))), + product, + state.copy( + csrUsername = Some("Dan Csr"), + salesforceCaseId = Some("test_case_id"), ), - Some("Dan Csr"), - Some("test_case_id"), ).toOption .get .subscriptionData @@ -246,9 +213,8 @@ class GuardianWeeklySubscriptionBuildersSpec extends AnyFlatSpec with Matchers { DateGenerator(saleDate), subscribeItemBuilder, ).build( - nonGiftState.copy(appliedPromotion = Some(AppliedPromotion("FOOPATRON", "uk"))), - None, - None, + product, + state.copy(appliedPromotion = Some(AppliedPromotion("FOOPATRON", "uk"))), ).toOption .get .subscriptionData @@ -259,9 +225,8 @@ class GuardianWeeklySubscriptionBuildersSpec extends AnyFlatSpec with Matchers { DateGenerator(saleDate), subscribeItemBuilder, ).build( - nonGiftState.copy(appliedPromotion = Some(AppliedPromotion("NOTAPATRONPROMO", "uk"))), - None, - None, + product, + state.copy(appliedPromotion = Some(AppliedPromotion("NOTAPATRONPROMO", "uk"))), ).toOption .get .subscriptionData