@@ -18,17 +18,20 @@ package controllers.amend
1818
1919import controllers .actions ._
2020import forms .amend .WhichSubcontractorsToAddFormProvider
21- import javax .inject .Inject
2221import models .Mode
2322import models .amend .WhichSubcontractorsToAdd
2423import navigation .Navigator
2524import pages .amend .WhichSubcontractorsToAddPage
25+ import pages .monthlyreturns .{CisIdPage , DateConfirmPaymentsPage }
26+ import play .api .Logging
2627import play .api .i18n .{I18nSupport , MessagesApi }
2728import play .api .mvc .{Action , AnyContent , MessagesControllerComponents }
2829import repositories .SessionRepository
30+ import services .SubcontractorService
2931import uk .gov .hmrc .play .bootstrap .frontend .controller .FrontendBaseController
3032import views .html .amend .WhichSubcontractorsToAddView
3133
34+ import javax .inject .Inject
3235import scala .concurrent .{ExecutionContext , Future }
3336
3437class WhichSubcontractorsToAddController @ Inject () (
@@ -39,40 +42,75 @@ class WhichSubcontractorsToAddController @Inject() (
3942 getData : DataRetrievalAction ,
4043 requireData : DataRequiredAction ,
4144 formProvider : WhichSubcontractorsToAddFormProvider ,
45+ subcontractorService : SubcontractorService ,
4246 val controllerComponents : MessagesControllerComponents ,
4347 view : WhichSubcontractorsToAddView
4448)(implicit ec : ExecutionContext )
4549 extends FrontendBaseController
46- with I18nSupport {
47-
48- private val subcontractors = WhichSubcontractorsToAdd .mockSubcontractors
49- val form = formProvider(subcontractors)
50-
51- def onPageLoad (mode : Mode ): Action [AnyContent ] = (identify andThen getData andThen requireData) { implicit request =>
50+ with I18nSupport
51+ with Logging {
5252
53- val selectedIds = request.userAnswers
54- .get(WhichSubcontractorsToAddPage )
55- .getOrElse(WhichSubcontractorsToAdd .mockPreSelectedIds)
56-
57- val checkboxItems = WhichSubcontractorsToAdd .checkboxItems(subcontractors, selectedIds)
53+ def onPageLoad (mode : Mode ): Action [AnyContent ] = (identify andThen getData andThen requireData).async {
54+ implicit request =>
55+ val requiredAnswers = for {
56+ cisId <- request.userAnswers.get(CisIdPage )
57+ taxDate <- request.userAnswers.get(DateConfirmPaymentsPage )
58+ } yield (cisId, taxDate.getMonthValue, taxDate.getYear)
5859
59- Ok (view(form, mode, checkboxItems))
60+ requiredAnswers
61+ .map { case (cisId, taxMonth, taxYear) =>
62+ subcontractorService
63+ .buildAmendWhichSubcontractorsPage(cisId, taxMonth, taxYear, Some (request.userAnswers))
64+ .map { model =>
65+ val form = formProvider(model.subcontractors)
66+ val selectedIds = request.userAnswers
67+ .get(WhichSubcontractorsToAddPage )
68+ .getOrElse(model.preSelectedIds)
69+ val checkboxItems = WhichSubcontractorsToAdd .checkboxItems(model.subcontractors, selectedIds)
70+ Ok (view(form, mode, checkboxItems))
71+ }
72+ .recover { case ex =>
73+ logger.error(s " [WhichSubcontractorsToAddController] Failed to load subcontractors: ${ex.getMessage}" , ex)
74+ Redirect (controllers.routes.SystemErrorController .onPageLoad())
75+ }
76+ }
77+ .getOrElse(Future .successful(Redirect (controllers.routes.JourneyRecoveryController .onPageLoad())))
6078 }
6179
6280 def onSubmit (mode : Mode ): Action [AnyContent ] = (identify andThen getData andThen requireData).async {
6381 implicit request =>
64- form
65- .bindFromRequest()
66- .fold(
67- formWithErrors =>
68- Future .successful(
69- BadRequest (view(formWithErrors, mode, WhichSubcontractorsToAdd .checkboxItems(subcontractors)))
70- ),
71- value =>
72- for {
73- updatedAnswers <- Future .fromTry(request.userAnswers.set(WhichSubcontractorsToAddPage , value))
74- _ <- sessionRepository.set(updatedAnswers)
75- } yield Redirect (navigator.nextPage(WhichSubcontractorsToAddPage , mode, updatedAnswers))
76- )
82+ val requiredAnswers = for {
83+ cisId <- request.userAnswers.get(CisIdPage )
84+ taxDate <- request.userAnswers.get(DateConfirmPaymentsPage )
85+ } yield (cisId, taxDate.getMonthValue, taxDate.getYear)
86+
87+ requiredAnswers
88+ .map { case (cisId, taxMonth, taxYear) =>
89+ subcontractorService
90+ .buildAmendWhichSubcontractorsPage(cisId, taxMonth, taxYear, Some (request.userAnswers))
91+ .flatMap { model =>
92+ val form = formProvider(model.subcontractors)
93+ form
94+ .bindFromRequest()
95+ .fold(
96+ formWithErrors =>
97+ Future .successful(
98+ BadRequest (
99+ view(formWithErrors, mode, WhichSubcontractorsToAdd .checkboxItems(model.subcontractors))
100+ )
101+ ),
102+ value =>
103+ for {
104+ updatedAnswers <- Future .fromTry(request.userAnswers.set(WhichSubcontractorsToAddPage , value))
105+ _ <- sessionRepository.set(updatedAnswers)
106+ } yield Redirect (navigator.nextPage(WhichSubcontractorsToAddPage , mode, updatedAnswers))
107+ )
108+ }
109+ .recover { case ex =>
110+ logger.error(s " [WhichSubcontractorsToAddController] Submit failed: ${ex.getMessage}" , ex)
111+ Redirect (controllers.routes.SystemErrorController .onPageLoad())
112+ }
113+ }
114+ .getOrElse(Future .successful(Redirect (controllers.routes.JourneyRecoveryController .onPageLoad())))
77115 }
78116}
0 commit comments