Skip to content

Commit

Permalink
Merge 0d48d04 into af4562b
Browse files Browse the repository at this point in the history
  • Loading branch information
Mario Galic committed Sep 24, 2019
2 parents af4562b + 0d48d04 commit cf3e2aa
Show file tree
Hide file tree
Showing 4 changed files with 221 additions and 17 deletions.
Expand Up @@ -5,6 +5,7 @@ import java.time.LocalDate
import com.gu.holiday_stops.ActionCalculator.SundayVoucherIssueSuspensionConstants
import com.gu.holiday_stops._
import com.gu.salesforce.holiday_stops.SalesforceHolidayStopRequestsDetail.{HolidayStopRequestsDetail, HolidayStopRequestsDetailChargeCode, HolidayStopRequestsDetailChargePrice, ProductName, ProductRatePlanKey, ProductRatePlanName, ProductType, StoppedPublicationDate, SubscriptionName}
import cats.implicits._

object SundayVoucherHolidayStopProcessor {

Expand All @@ -23,12 +24,21 @@ object SundayVoucherHolidayStopProcessor {
case Right(holidayStopRequestsFromSalesforce) =>
val holidayStops = holidayStopRequestsFromSalesforce.distinct.map(HolidayStop(_))
val alreadyActionedHolidayStops = holidayStopRequestsFromSalesforce.flatMap(_.Charge_Code__c).distinct
// val allZuoraHolidayStopResponses = holidayStops.map(writeHolidayStopToZuora(
// config.holidayCreditProduct,
// getSubscription,
// updateSubscription: (Subscription, HolidayCreditUpdate) => Either[ZuoraHolidayWriteError, Unit]
// ))
ProcessResult(Nil, Nil, Nil, None)
val allZuoraHolidayStopResponses = holidayStops.map(writeHolidayStopToZuora(
config.holidayCreditProduct,
config.productRatePlanChargeId,
getSubscription,
updateSubscription: (Subscription, HolidayCreditUpdate) => Either[ZuoraHolidayWriteError, Unit]
))
val (failedZuoraResponses, successfulZuoraResponses) = allZuoraHolidayStopResponses.separate
val notAlreadyActionedHolidays = successfulZuoraResponses.filterNot(v => alreadyActionedHolidayStops.contains(v.chargeCode))
val salesforceExportResult = writeHolidayStopsToSalesforce(notAlreadyActionedHolidays)
ProcessResult(
holidayStops,
allZuoraHolidayStopResponses,
notAlreadyActionedHolidays,
OverallFailure(failedZuoraResponses, salesforceExportResult)
)
}
}
private def calculateProcessDate(processDateOverride: Option[LocalDate]) = {
Expand All @@ -37,21 +47,24 @@ object SundayVoucherHolidayStopProcessor {

private def writeHolidayStopToZuora(
holidayCreditProduct: HolidayCreditProduct,
sundayVoucherProductRatePlanChargeId: String,
getSubscription: SubscriptionName => Either[ZuoraHolidayWriteError, Subscription],
updateSubscription: (Subscription, HolidayCreditUpdate) => Either[ZuoraHolidayWriteError, Unit]
)(stop: HolidayStop): Either[ZuoraHolidayWriteError, HolidayStopResponse] = {
for {
subscription <- getSubscription(stop.subscriptionName)
_ <- if (subscription.autoRenew) Right(()) else Left(ZuoraHolidayWriteError("Cannot currently process non-auto-renewing subscription"))
currentSundayVoucherSubscription <- CurrentSundayVoucherSubscription(subscription, SundayVoucherHolidayStopConfig.Dev.productRatePlanChargeId)
currentSundayVoucherSubscription <- CurrentSundayVoucherSubscription(subscription, sundayVoucherProductRatePlanChargeId)
nextInvoiceStartDate = SundayVoucherNextBillingPeriodStartDate(currentSundayVoucherSubscription)
maybeExtendedTerm = ExtendedTerm(nextInvoiceStartDate, subscription)
holidayCredit = -10.79 / 4 // FIXME: wire in CreditCalculator.sundayVoucher
holidayCredit <- CreditCalculator.sundayVoucherCredit(sundayVoucherProductRatePlanChargeId, stop.stoppedPublicationDate)(subscription)
holidayCreditUpdate <- HolidayCreditUpdate(holidayCreditProduct, subscription, stop.stoppedPublicationDate, nextInvoiceStartDate, maybeExtendedTerm, holidayCredit)
_ <- if (subscription.hasHolidayStop(stop)) Right(()) else updateSubscription(subscription, holidayCreditUpdate)
updatedSubscription <- getSubscription(stop.subscriptionName)
addedCharge <- updatedSubscription.ratePlanCharge(stop).toRight(ZuoraHolidayWriteError(s"Failed to write holiday stop to Zuora: $stop"))
} yield {
println("woohoo")
println(holidayCreditUpdate)
HolidayStopResponse(
stop.requestId,
stop.subscriptionName,
Expand Down
@@ -1,17 +1,207 @@
package com.gu.holidaystopprocessor

import com.gu.holiday_stops.Fixtures
import java.time.LocalDate

import com.gu.holiday_stops._
import com.gu.salesforce.holiday_stops.SalesforceHolidayStopRequestsDetail._
import org.scalatest.{FlatSpec, Matchers}

import scala.collection.mutable

class SundayVoucherHolidayStopProcessTest extends FlatSpec with Matchers {
"SundayVoucherHolidayStopProcess" should "not process anything" in {

val holidayStopRequestsFromSalesforce = List(
HolidayStopRequestsDetail(
HolidayStopRequestsDetailId("a2j3E000002Vl3OQAS"),
SubscriptionName("A-S00051832"),
ProductName("Newspaper Voucher"),
StoppedPublicationDate(LocalDate.parse("2019-10-20")),
Some(HolidayStopRequestsDetailChargePrice(-2.7)), // Estimated_Price__c: Option[HolidayStopRequestsDetailChargePrice],
Some(HolidayStopRequestsDetailChargeCode("C-00057516")), // Charge_Code__c: Option[HolidayStopRequestsDetailChargeCode],
None, // Actual_Price__c: Option[HolidayStopRequestsDetailChargePrice]
)
)


val holidayStops = List(
HolidayStop(
HolidayStopRequestsDetailId("a2j3E000002Vl3OQAS"),
SubscriptionName("A-S00051832"),
ProductName("Newspaper Voucher"),
LocalDate.parse("2019-10-20"),
Some(HolidayStopRequestsDetailChargePrice(-2.7))
)
)

val alreadyActionedHolidayStops = Nil

// writeHolidayStopToZuora
val subscription =
Subscription(
"A-S00051832",
LocalDate.parse("2019-09-24"),
LocalDate.parse("2020-09-24"),
12,
"Month",
true,
List(RatePlan(
"Newspaper Voucher",
List(RatePlanCharge(
"Sunday",
"C-00057516",
10.79,
Some("Month"),
LocalDate.parse("2019-10-20"),
Some(LocalDate.parse("2019-11-20")),
None,
None,
Some(LocalDate.parse("2019-10-20")),
"2c92c0f95aff3b56015b1045fba832d4")),
"2c92c0f95aff3b56015b1045fb9332d2",
"2c92c0f86d6263c0016d6271c6750a35")
)
)

val updatedSubscription =
Subscription(
"A-S00051832",
LocalDate.parse("2019-09-24"),
LocalDate.parse("2020-09-24"),
12,
"Month",
true,
List(
RatePlan("Discounts",
List(
RatePlanCharge(
"Holiday Credit",
"C-00057517",
-2.7,
None,
LocalDate.parse("2019-11-20"),
None,
Some(LocalDate.parse("2019-10-20")),
Some(LocalDate.parse("2019-10-20")),
None,
"2c92c0f96b03800b016b081fc0f41bb4"
)
),
"2c92c0f96b03800b016b081fc04f1ba2",
"2c92c0fb6d627309016d628f3f6231cc"
),
RatePlan("Newspaper Voucher",
List(
RatePlanCharge(
"Sunday",
"C-00057516",
10.79,
Some("Month"),
LocalDate.parse("2019-10-20"),
Some(LocalDate.parse("2019-11-20")),
None,
None,
Some(LocalDate.parse("2019-10-20")),
"2c92c0f95aff3b56015b1045fba832d4"
)
),
"2c92c0f95aff3b56015b1045fb9332d2",
"2c92c0fb6d627309016d628f3fda31d7"
)
)
)

val zuoraGetSubscriptionResponsesStack = mutable.Stack[Subscription](
subscription,
updatedSubscription
)

def getSubscriptionMock(): Subscription = zuoraGetSubscriptionResponsesStack.pop

val allZuoraHolidayStopResponses = List(
Right(
HolidayStopResponse(
HolidayStopRequestsDetailId("a2j3E000002Vl3OQAS"),
SubscriptionName("A-S00051832"),
ProductName("Newspaper Voucher"),
HolidayStopRequestsDetailChargeCode("C-00057517"),
Some(HolidayStopRequestsDetailChargePrice(-2.7)),
HolidayStopRequestsDetailChargePrice(-2.7),
StoppedPublicationDate(LocalDate.parse("2019-10-20"))
)
)
)

val failedZuoraResponses = Nil
val successfulZuoraResponses =
Right(
HolidayStopResponse(
HolidayStopRequestsDetailId("a2j3E000002Vl3OQAS"),
SubscriptionName("A-S00051832"),
ProductName("Newspaper Voucher"),
HolidayStopRequestsDetailChargeCode("C-00057517"),
Some(HolidayStopRequestsDetailChargePrice(-2.7)),
HolidayStopRequestsDetailChargePrice(-2.7),
StoppedPublicationDate(LocalDate.parse("2019-10-20"))
)
)

val notAlreadyActionedHolidays = List(
HolidayStopResponse(
HolidayStopRequestsDetailId("a2j3E000002Vl3OQAS"),
SubscriptionName("A-S00051832"),
ProductName("Newspaper Voucher"),
HolidayStopRequestsDetailChargeCode("C-00057517"),
Some(HolidayStopRequestsDetailChargePrice(-2.7)),
HolidayStopRequestsDetailChargePrice(-2.7),
StoppedPublicationDate(LocalDate.parse("2019-10-20"))
)
)

val salesforceExportResult = Right(())

val processResult = ProcessResult(
holidayStops,
allZuoraHolidayStopResponses,
notAlreadyActionedHolidays,
OverallFailure(failedZuoraResponses, salesforceExportResult)
)



"SundayVoucherHolidayStopProcess" should "pass in correct HolidayCreditUpdate request to zuora updateSubscription call" in {
val exptedStoppedPublicationDate = LocalDate.parse("2019-10-20")
val expectedCustomerAcceptanceDateForHolidayStop = LocalDate.parse("2019-11-20")
val expectedCredit = -2.7
val ExpectedHolidayCreditUpdate = HolidayCreditUpdate(
None,
None,
List(
Add(
"2c92c0f96b03800b016b081fc04f1ba2",
expectedCustomerAcceptanceDateForHolidayStop,
expectedCustomerAcceptanceDateForHolidayStop,
expectedCustomerAcceptanceDateForHolidayStop,
List(
ChargeOverride(
SundayVoucherHolidayStopConfig.Dev.holidayCreditProduct.productRatePlanChargeId,
exptedStoppedPublicationDate,
exptedStoppedPublicationDate,
expectedCredit
)
)
)
)
)

val SubscriptionMock = subscription

SundayVoucherHolidayStopProcessor.processHolidayStops(
Fixtures.sundayVoucherHolidayStopConfig,
(_, _) => Right(Nil),
_ => throw new RuntimeException(),
(_, _) => throw new RuntimeException(),
_ => throw new RuntimeException(),
(_, _) => Right(holidayStopRequestsFromSalesforce),
getSubscription = _ => Right(getSubscriptionMock()),
updateSubscription = { case (SubscriptionMock, ExpectedHolidayCreditUpdate) => Right(()) }, // here is main logic of test
_ => Right(()),
None
) should equal(ProcessResult(Nil, Nil, Nil, None))
) should equal(processResult)
}
}
Expand Up @@ -12,4 +12,4 @@ object BillingPeriodToApproxWeekCount {
s"billing period: $billingPeriod"
)
}
}
}
Expand Up @@ -247,7 +247,8 @@ object Fixtures {
GuardianWeeklyHolidayStopConfig.Prod.nForNProductRatePlanIds
)

val sundayVoucherHolidayStopConfig = SundayVoucherHolidayStopConfig(HolidayCreditProduct("", ""), "")
// val sundayVoucherHolidayStopConfig = SundayVoucherHolidayStopConfig(HolidayCreditProduct("", ""), "")
val sundayVoucherHolidayStopConfig = SundayVoucherHolidayStopConfig.Dev

val config = Config(
zuoraConfig = ZuoraConfig(baseUrl = "", holidayStopProcessor = HolidayStopProcessor(Oauth(clientId = "", clientSecret = ""))),
Expand Down

0 comments on commit cf3e2aa

Please sign in to comment.