diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/config/AppConfig.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/config/AppConfig.scala
index 2ae451eb6..1609d79c6 100755
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/config/AppConfig.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/config/AppConfig.scala
@@ -34,20 +34,10 @@ class AppConfig @Inject() (config: Configuration, servicesConfig: ServicesConfig
lazy val nrsApiKey: String = servicesConfig.getConfString("nrs.api-key", "dummyNrsApiKey")
- lazy val movementCollectionName = config.getOptional[String]("mongodb.movement.collectionName").getOrElse("movements")
-
lazy val movementTTL: Duration = config
.getOptional[String]("mongodb.movement.TTL")
.fold(Duration.create(30, DAYS))(Duration.create(_).asInstanceOf[FiniteDuration])
- lazy val movementV2TTL: Duration = config
- .getOptional[String]("mongodb.movementV2.TTL")
- .fold(Duration.create(30, DAYS))(Duration.create(_).asInstanceOf[FiniteDuration])
-
- lazy val transformLogTTL: Duration = config
- .getOptional[String]("mongodb.transformLog.TTL")
- .fold(Duration.create(30, DAYS))(Duration.create(_).asInstanceOf[FiniteDuration])
-
lazy val ernRetrievalTTL: Duration = config
.getOptional[String]("mongodb.ernRetrieval.TTL")
.fold(Duration.create(30, DAYS))(Duration.create(_).asInstanceOf[FiniteDuration])
@@ -61,10 +51,8 @@ class AppConfig @Inject() (config: Configuration, servicesConfig: ServicesConfig
.map(JavaDuration.ofMinutes)
.getOrElse(JavaDuration.ofMinutes(10))
- lazy val runV1Validation: Boolean = config.getOptional[Boolean]("featureFlags.runV1Validation").getOrElse(false)
+ lazy val pushNotificationsEnabled: Boolean = servicesConfig.getBoolean("featureFlags.pushNotificationsEnabled")
- lazy val pushNotificationsEnabled: Boolean = servicesConfig.getBoolean("featureFlags.pushNotificationsEnabled")
- lazy val latestSpec: Boolean = servicesConfig.getBoolean("featureFlags.latestFunctionalSpecEnabled")
lazy val newAuditingEnabled: Boolean = config.getOptional[Boolean]("featureFlags.newAuditingEnabled").getOrElse(false)
lazy val oldAuditingEnabled: Boolean = config.getOptional[Boolean]("featureFlags.oldAuditingEnabled").getOrElse(false)
lazy val processingAuditingEnabled: Boolean =
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/config/Module.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/config/Module.scala
index da7c3304d..fe957a95f 100755
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/config/Module.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/config/Module.scala
@@ -18,55 +18,20 @@ package uk.gov.hmrc.excisemovementcontrolsystemapi.config
import play.api.inject.Binding
import play.api.{Configuration, Environment}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.connectors.{NrsCircuitBreakerProvider, TraderMovementConnector, TraderMovementConnectorV1, TraderMovementConnectorV2}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.connectors.NrsCircuitBreakerProvider
import uk.gov.hmrc.excisemovementcontrolsystemapi.connectors.NrsConnector.NrsCircuitBreaker
-import uk.gov.hmrc.excisemovementcontrolsystemapi.controllers.{DraftExciseMovementController, DraftExciseMovementControllerV1, DraftExciseMovementControllerV2}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.factories.{IEMessageFactory, IEMessageFactoryV1, IEMessageFactoryV2}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.{AuditEventFactory, AuditEventFactoryV2}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.validation.{MessageValidation, MessageValidationV1, MessageValidationV2}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.scheduling.TransformJob
-import uk.gov.hmrc.excisemovementcontrolsystemapi.services.{AuditService, AuditServiceV1, AuditServiceV2, MessageService, MessageServiceV1, MessageServiceV2}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.{NrsEventIdMapper, NrsEventIdMapperV1, NrsEventIdMapperV2}
import uk.gov.hmrc.mongo.metrix.MetricOrchestrator
import java.time.Clock
class Module extends play.api.inject.Module {
- override def bindings(environment: Environment, configuration: Configuration): collection.Seq[Binding[_]] = {
- val latestSpec = configuration.get[Boolean]("featureFlags.latestFunctionalSpecEnabled")
- val transformJobEnabled = configuration.get[Boolean]("featureFlags.transformJobEnabled")
- val transformJob = if (transformJobEnabled) Seq(bind[TransformJob].toSelf.eagerly()) else Seq()
- val versionBindings =
- if (latestSpec)
- Seq(
- bind[DraftExciseMovementController].to[DraftExciseMovementControllerV2],
- bind[MessageService].to[MessageServiceV2],
- bind[IEMessageFactory].to[IEMessageFactoryV2],
- bind[TraderMovementConnector].to[TraderMovementConnectorV2],
- bind[AuditEventFactory].to[AuditEventFactoryV2],
- bind[NrsEventIdMapper].to[NrsEventIdMapperV2],
- bind[AuditService].to[AuditServiceV2],
- bind[MessageValidation].to[MessageValidationV2]
- )
- else
- Seq(
- bind[DraftExciseMovementController].to[DraftExciseMovementControllerV1],
- bind[MessageService].to[MessageServiceV1],
- bind[IEMessageFactory].to[IEMessageFactoryV1],
- bind[TraderMovementConnector].to[TraderMovementConnectorV1],
- bind[AuditEventFactory].to[AuditEventFactoryV2],
- bind[NrsEventIdMapper].to[NrsEventIdMapperV1],
- bind[AuditService].to[AuditServiceV1],
- bind[MessageValidation].to[MessageValidationV1]
- )
-
+ override def bindings(environment: Environment, configuration: Configuration): collection.Seq[Binding[_]] =
Seq(
bind[AppConfig].toSelf.eagerly(),
bind[JobScheduler].toSelf.eagerly(),
bind[Clock].toInstance(Clock.systemUTC()),
bind[MetricOrchestrator].toProvider[MetricsProvider],
bind[NrsCircuitBreaker].toProvider[NrsCircuitBreakerProvider]
- ) ++ versionBindings ++ transformJob
- }
+ )
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/MessageConnector.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/MessageConnector.scala
index fb3344753..d45ab1e70 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/MessageConnector.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/MessageConnector.scala
@@ -16,9 +16,7 @@
package uk.gov.hmrc.excisemovementcontrolsystemapi.connectors
-import generated.v1
-import generated.v2
-
+import generated.NewMessagesDataResponse
import play.api.http.Status.OK
import play.api.libs.json.{Json, Reads}
import play.api.{Configuration, Logging}
@@ -147,27 +145,12 @@ class MessageConnector @Inject() (
response: EISConsumptionResponse
)(implicit headerCarrier: HeaderCarrier): Try[Seq[IEMessage]] = Try {
val decodedMessage: String = base64Decode(response.message)
-
- if (appConfig.latestSpec) {
- val xmlResponse = scalaxb.fromXML[v2.NewMessagesDataResponse](scala.xml.XML.loadString(decodedMessage))
-
- if (appConfig.oldAuditingEnabled) {
-
- xmlResponse.Messages.messagesoption.map(m => messageFactory.createIEMessage(Right(m))).tapEach {
- auditService.auditMessage(_)(headerCarrier)
- }
- } else xmlResponse.Messages.messagesoption.map(m => messageFactory.createIEMessage(Right(m)))
- } else {
- val xmlResponse = scalaxb.fromXML[v1.NewMessagesDataResponse](scala.xml.XML.loadString(decodedMessage))
-
- if (appConfig.oldAuditingEnabled) {
-
- xmlResponse.Messages.messagesoption.map(m => messageFactory.createIEMessage(Left(m))).tapEach {
- auditService.auditMessage(_)(headerCarrier)
- }
- } else xmlResponse.Messages.messagesoption.map(m => messageFactory.createIEMessage(Left(m)))
- }
-
+ val xmlResponse = scalaxb.fromXML[NewMessagesDataResponse](scala.xml.XML.loadString(decodedMessage))
+ if (appConfig.oldAuditingEnabled) {
+ xmlResponse.Messages.messagesoption.map(messageFactory.createIEMessage).tapEach {
+ auditService.auditMessage(_)(headerCarrier)
+ }
+ } else xmlResponse.Messages.messagesoption.map(messageFactory.createIEMessage)
}
private def countOfMessagesAvailable(encodedMessage: String): Try[Int] = Try {
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/TraderMovementConnector.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/TraderMovementConnector.scala
index 87a719f7a..25a539225 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/TraderMovementConnector.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/TraderMovementConnector.scala
@@ -16,11 +16,96 @@
package uk.gov.hmrc.excisemovementcontrolsystemapi.connectors
+import generated.{MessageBodyType, MovementForTraderDataResponse}
+import play.api.{Configuration, Logging}
+import play.api.http.Status.{OK, UNPROCESSABLE_ENTITY}
+import play.api.libs.json.{Json, Reads}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.config.Service
+import uk.gov.hmrc.excisemovementcontrolsystemapi.factories.IEMessageFactory
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.eis.EISConsumptionResponse
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.http.HeaderCarrier
+import uk.gov.hmrc.excisemovementcontrolsystemapi.services.HttpHeader
+import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.DateTimeService
+import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.DateTimeService._
+import uk.gov.hmrc.http.HttpReads.Implicits._
+import uk.gov.hmrc.http.client.HttpClientV2
+import uk.gov.hmrc.http.{HeaderCarrier, HttpResponse, StringContextOps}
-import scala.concurrent.Future
+import java.nio.charset.StandardCharsets
+import java.util.{Base64, UUID}
+import javax.inject.{Inject, Singleton}
+import scala.concurrent.{ExecutionContext, Future}
+import scala.util.Try
-trait TraderMovementConnector {
- def getMovementMessages(ern: String, arc: String)(implicit hc: HeaderCarrier): Future[Seq[IEMessage]]
+@Singleton
+class TraderMovementConnector @Inject() (
+ configuration: Configuration,
+ httpClient: HttpClientV2,
+ messageFactory: IEMessageFactory,
+ dateTimeService: DateTimeService
+)(implicit ec: ExecutionContext)
+ extends Logging {
+
+ private def enforceCorrelationId(hc: HeaderCarrier): HeaderCarrier =
+ hc.headers(Seq(HttpHeader.xCorrelationId)).headOption match {
+ case Some(_) => hc
+ case None =>
+ val correlationId = UUID.randomUUID().toString
+ logger.info(s"generated new correlation id: $correlationId")
+ hc.withExtraHeaders(HttpHeader.xCorrelationId -> correlationId)
+ }
+
+ private val service: Service = configuration.get[Service]("microservice.services.eis")
+ private val bearerToken: String = configuration.get[String]("microservice.services.eis.movement-bearer-token")
+
+ def getMovementMessages(ern: String, arc: String)(implicit hc: HeaderCarrier): Future[Seq[IEMessage]] = {
+ logger.info(s"[TraderMovementConnector]: Getting movement messages")
+ val timestamp = dateTimeService.timestamp().asStringInMilliseconds
+ val hc2 = enforceCorrelationId(hc)
+
+ httpClient
+ .get(url"${service.baseUrl}/emcs/movements/v1/trader-movement?exciseregistrationnumber=$ern&arc=$arc")(hc2)
+ .setHeader("X-Forwarded-Host" -> "MDTP")
+ .setHeader("Source" -> "APIP")
+ .setHeader("DateTime" -> timestamp)
+ .setHeader("Authorization" -> s"Bearer $bearerToken")
+ .execute[HttpResponse]
+ .flatMap { response =>
+ if (response.status == OK) Future.fromTry {
+ for {
+ response <- parseJson[EISConsumptionResponse](response.body)
+ messages <- getMessages(response)
+ } yield messages
+ }
+ else if (response.status == UNPROCESSABLE_ENTITY) {
+ Future.successful(Seq())
+ } else {
+ logger.warn(s"[TraderMovementConnector]: Invalid status returned: ${response.status}")
+ Future.failed(new RuntimeException("[TraderMovementConnector]: Invalid status returned"))
+ }
+ }
+ }
+
+ private def parseJson[A](string: String)(implicit reads: Reads[A]): Try[A] =
+ for {
+ json <- Try(Json.parse(string))
+ response <- Try(json.as[A])
+ } yield response
+
+ private def getMessages(
+ response: EISConsumptionResponse
+ ): Try[Seq[IEMessage]] = Try {
+ val decodedMessage: String = base64Decode(response.message)
+ val xmlResponse = scalaxb.fromXML[MovementForTraderDataResponse](scala.xml.XML.loadString(decodedMessage))
+ xmlResponse.IE934.Body.MessagePackage.MessageBody.map(getIeMessage)
+ }
+
+ private def getIeMessage(messageBodyType: MessageBodyType): IEMessage = {
+ val messageType = messageBodyType.TechnicalMessageType.toString
+ val decodedXml = scala.xml.XML.loadString(base64Decode(messageBodyType.MessageData.toString))
+ messageFactory.createFromXml(messageType, decodedXml)
+ }
+
+ private def base64Decode(string: String): String =
+ new String(Base64.getDecoder.decode(string), StandardCharsets.UTF_8)
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/TraderMovementConnectorV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/TraderMovementConnectorV1.scala
deleted file mode 100644
index d151c344e..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/TraderMovementConnectorV1.scala
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright 2025 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.connectors
-
-import generated.v1.{MessageBodyType, MovementForTraderDataResponse}
-import play.api.http.Status.{OK, UNPROCESSABLE_ENTITY}
-import play.api.libs.json.{Json, Reads}
-import play.api.{Configuration, Logging}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.config.Service
-import uk.gov.hmrc.excisemovementcontrolsystemapi.factories.IEMessageFactory
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.eis.EISConsumptionResponse
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.services.HttpHeader
-import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.DateTimeService
-import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.DateTimeService._
-import uk.gov.hmrc.http.HttpReads.Implicits._
-import uk.gov.hmrc.http.client.HttpClientV2
-import uk.gov.hmrc.http.{HeaderCarrier, HttpResponse, StringContextOps}
-
-import java.nio.charset.StandardCharsets
-import java.util.{Base64, UUID}
-import javax.inject.{Inject, Singleton}
-import scala.concurrent.{ExecutionContext, Future}
-import scala.util.Try
-
-@Singleton
-class TraderMovementConnectorV1 @Inject() (
- configuration: Configuration,
- httpClient: HttpClientV2,
- messageFactory: IEMessageFactory,
- dateTimeService: DateTimeService
-)(implicit ec: ExecutionContext)
- extends Logging
- with TraderMovementConnector {
-
- private def enforceCorrelationId(hc: HeaderCarrier): HeaderCarrier =
- hc.headers(Seq(HttpHeader.xCorrelationId)).headOption match {
- case Some(_) => hc
- case None =>
- val correlationId = UUID.randomUUID().toString
- logger.info(s"generated new correlation id: $correlationId")
- hc.withExtraHeaders(HttpHeader.xCorrelationId -> correlationId)
- }
-
- private val service: Service = configuration.get[Service]("microservice.services.eis")
- private val bearerToken: String = configuration.get[String]("microservice.services.eis.movement-bearer-token")
-
- def getMovementMessages(ern: String, arc: String)(implicit hc: HeaderCarrier): Future[Seq[IEMessage]] = {
- logger.info(s"[TraderMovementConnector]: Getting movement messages")
- val timestamp = dateTimeService.timestamp().asStringInMilliseconds
- val hc2 = enforceCorrelationId(hc)
-
- httpClient
- .get(url"${service.baseUrl}/emcs/movements/v1/trader-movement?exciseregistrationnumber=$ern&arc=$arc")(hc2)
- .setHeader("X-Forwarded-Host" -> "MDTP")
- .setHeader("Source" -> "APIP")
- .setHeader("DateTime" -> timestamp)
- .setHeader("Authorization" -> s"Bearer $bearerToken")
- .execute[HttpResponse]
- .flatMap { response =>
- if (response.status == OK) Future.fromTry {
- for {
- response <- parseJson[EISConsumptionResponse](response.body)
- messages <- getMessages(response)
- } yield messages
- }
- else if (response.status == UNPROCESSABLE_ENTITY) {
- Future.successful(Seq())
- } else {
- logger.warn(s"[TraderMovementConnector]: Invalid status returned: ${response.status}")
- Future.failed(new RuntimeException("[TraderMovementConnector]: Invalid status returned"))
- }
- }
- }
-
- private def parseJson[A](string: String)(implicit reads: Reads[A]): Try[A] =
- for {
- json <- Try(Json.parse(string))
- response <- Try(json.as[A])
- } yield response
-
- private def getMessages(
- response: EISConsumptionResponse
- ): Try[Seq[IEMessage]] = Try {
- val decodedMessage: String = base64Decode(response.message)
- val xmlResponse = scalaxb.fromXML[MovementForTraderDataResponse](scala.xml.XML.loadString(decodedMessage))
- xmlResponse.IE934.Body.MessagePackage.MessageBody.map(getIeMessage)
- }
-
- private def getIeMessage(messageBodyType: MessageBodyType): IEMessage = {
- val messageType = messageBodyType.TechnicalMessageType.toString
- val decodedXml = scala.xml.XML.loadString(base64Decode(messageBodyType.MessageData.toString))
- messageFactory.createFromXml(messageType, decodedXml)
- }
-
- private def base64Decode(string: String): String =
- new String(Base64.getDecoder.decode(string), StandardCharsets.UTF_8)
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/TraderMovementConnectorV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/TraderMovementConnectorV2.scala
deleted file mode 100644
index b4a47c0dd..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/TraderMovementConnectorV2.scala
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright 2025 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.connectors
-
-import generated.v2.{MessageBodyType, MovementForTraderDataResponse}
-import play.api.http.Status.{OK, UNPROCESSABLE_ENTITY}
-import play.api.libs.json.{Json, Reads}
-import play.api.{Configuration, Logging}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.config.Service
-import uk.gov.hmrc.excisemovementcontrolsystemapi.factories.IEMessageFactory
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.eis.EISConsumptionResponse
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.services.HttpHeader
-import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.DateTimeService
-import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.DateTimeService._
-import uk.gov.hmrc.http.HttpReads.Implicits._
-import uk.gov.hmrc.http.client.HttpClientV2
-import uk.gov.hmrc.http.{HeaderCarrier, HttpResponse, StringContextOps}
-
-import java.nio.charset.StandardCharsets
-import java.util.{Base64, UUID}
-import javax.inject.{Inject, Singleton}
-import scala.concurrent.{ExecutionContext, Future}
-import scala.util.Try
-
-@Singleton
-class TraderMovementConnectorV2 @Inject() (
- configuration: Configuration,
- httpClient: HttpClientV2,
- messageFactory: IEMessageFactory,
- dateTimeService: DateTimeService
-)(implicit ec: ExecutionContext)
- extends Logging
- with TraderMovementConnector {
-
- private def enforceCorrelationId(hc: HeaderCarrier): HeaderCarrier =
- hc.headers(Seq(HttpHeader.xCorrelationId)).headOption match {
- case Some(_) => hc
- case None =>
- val correlationId = UUID.randomUUID().toString
- logger.info(s"generated new correlation id: $correlationId")
- hc.withExtraHeaders(HttpHeader.xCorrelationId -> correlationId)
- }
-
- private val service: Service = configuration.get[Service]("microservice.services.eis")
- private val bearerToken: String = configuration.get[String]("microservice.services.eis.movement-bearer-token")
-
- def getMovementMessages(ern: String, arc: String)(implicit hc: HeaderCarrier): Future[Seq[IEMessage]] = {
- logger.info(s"[TraderMovementConnector]: Getting movement messages")
- val timestamp = dateTimeService.timestamp().asStringInMilliseconds
- val hc2 = enforceCorrelationId(hc)
-
- httpClient
- .get(url"${service.baseUrl}/emcs/movements/v1/trader-movement?exciseregistrationnumber=$ern&arc=$arc")(hc2)
- .setHeader("X-Forwarded-Host" -> "MDTP")
- .setHeader("Source" -> "APIP")
- .setHeader("DateTime" -> timestamp)
- .setHeader("Authorization" -> s"Bearer $bearerToken")
- .execute[HttpResponse]
- .flatMap { response =>
- if (response.status == OK) Future.fromTry {
- for {
- response <- parseJson[EISConsumptionResponse](response.body)
- messages <- getMessages(response)
- } yield messages
- }
- else if (response.status == UNPROCESSABLE_ENTITY) {
- Future.successful(Seq())
- } else {
- logger.warn(s"[TraderMovementConnector]: Invalid status returned: ${response.status}")
- Future.failed(new RuntimeException("[TraderMovementConnector]: Invalid status returned"))
- }
- }
- }
-
- private def parseJson[A](string: String)(implicit reads: Reads[A]): Try[A] =
- for {
- json <- Try(Json.parse(string))
- response <- Try(json.as[A])
- } yield response
-
- private def getMessages(
- response: EISConsumptionResponse
- ): Try[Seq[IEMessage]] = Try {
- val decodedMessage: String = base64Decode(response.message)
- val xmlResponse = scalaxb.fromXML[MovementForTraderDataResponse](scala.xml.XML.loadString(decodedMessage))
- xmlResponse.IE934.Body.MessagePackage.MessageBody.map(getIeMessage)
- }
-
- private def getIeMessage(messageBodyType: MessageBodyType): IEMessage = {
- val messageType = messageBodyType.TechnicalMessageType.toString
- val decodedXml = scala.xml.XML.loadString(base64Decode(messageBodyType.MessageData.toString))
- messageFactory.createFromXml(messageType, decodedXml)
- }
-
- private def base64Decode(string: String): String =
- new String(Base64.getDecoder.decode(string), StandardCharsets.UTF_8)
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/AdminDetailsController.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/AdminDetailsController.scala
index 64aa58a06..d3816b476 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/AdminDetailsController.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/AdminDetailsController.scala
@@ -18,7 +18,7 @@ package uk.gov.hmrc.excisemovementcontrolsystemapi.controllers
import play.api.libs.json.{Json, OFormat}
import play.api.mvc._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.{MovementRepository, TransformLogRepository, TransformationRepository}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.MovementRepository
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.Movement
import uk.gov.hmrc.internalauth.client._
import uk.gov.hmrc.play.bootstrap.backend.controller.BackendController
@@ -31,8 +31,7 @@ import scala.concurrent.ExecutionContext
class AdminDetailsController @Inject() (
cc: ControllerComponents,
auth: BackendAuthComponents,
- movementRepository: MovementRepository,
- transformLogRepository: TransformLogRepository
+ movementRepository: MovementRepository
)(implicit
ec: ExecutionContext
) extends BackendController(cc) {
@@ -56,14 +55,6 @@ class AdminDetailsController @Inject() (
}
}
- def getTransformLogDetails(movementId: String): Action[AnyContent] =
- authorised.async {
- transformLogRepository.findLog(movementId).map {
- case Some(transformLog) => Ok(Json.toJson(transformLog))
- case None => NotFound(s"No Transform Log Found with id: $movementId")
- }
- }
-
}
case class MovementDetails(
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/DraftExciseMovementController.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/DraftExciseMovementController.scala
index f782578ed..a92edddc5 100755
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/DraftExciseMovementController.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/DraftExciseMovementController.scala
@@ -16,10 +16,199 @@
package uk.gov.hmrc.excisemovementcontrolsystemapi.controllers
+import cats.data.EitherT
+import play.api.Logging
+import play.api.libs.json.Json
import play.api.mvc._
+import uk.gov.hmrc.excisemovementcontrolsystemapi.config.AppConfig
+import uk.gov.hmrc.excisemovementcontrolsystemapi.controllers.actions.{AuthAction, CorrelationIdAction, ParseXmlAction}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auth.ParsedXmlRequest
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.eis.EISSubmissionResponse
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{IE815Message, IEMessage}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.notification.Constants
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.validation._
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models._
+import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.BoxIdRepository
+import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.Movement
+import uk.gov.hmrc.excisemovementcontrolsystemapi.services._
+import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.DateTimeService
+import uk.gov.hmrc.http.HeaderCarrier
+import uk.gov.hmrc.play.bootstrap.backend.controller.BackendController
+import uk.gov.hmrc.play.http.HeaderCarrierConverter
+import javax.inject.{Inject, Singleton}
+import scala.concurrent.{ExecutionContext, Future}
import scala.xml.NodeSeq
-trait DraftExciseMovementController {
- def submit: Action[NodeSeq]
+@Singleton
+class DraftExciseMovementController @Inject() (
+ authAction: AuthAction,
+ xmlParser: ParseXmlAction,
+ movementMessageService: MovementService,
+ submissionMessageService: SubmissionMessageService,
+ notificationService: PushNotificationService,
+ messageValidator: MessageValidation,
+ dateTimeService: DateTimeService,
+ auditService: AuditService,
+ boxIdRepository: BoxIdRepository,
+ appConfig: AppConfig,
+ cc: ControllerComponents,
+ correlationIdAction: CorrelationIdAction
+)(implicit ec: ExecutionContext)
+ extends BackendController(cc)
+ with Logging {
+
+ def submit: Action[NodeSeq] =
+ (authAction andThen correlationIdAction andThen xmlParser).async(parse.xml) { implicit request =>
+ implicit val hc: HeaderCarrier = HeaderCarrierConverter.fromRequest(request)
+ (for {
+ ie815Message <- getIe815Message(request.ieMessage)
+ authorisedErn <- validateMessage(ie815Message, request.erns)
+ clientId <- retrieveClientIdFromHeader(request)
+ maybeBoxId <- getBoxId(clientId)
+ _ <- submitAndHandleError(request, authorisedErn, ie815Message)
+ movement <- getDraftOrSaveNew(maybeBoxId, ie815Message, request)
+ } yield (movement, maybeBoxId, ie815Message)).fold[Result](
+ failResult => failResult,
+ success => {
+ val (movement, boxId, ie815Message) = success
+
+ if (appConfig.oldAuditingEnabled) auditService.auditMessage(request.ieMessage).value
+ auditService.messageSubmitted(movement, true, ie815Message.correlationId, request)
+
+ Accepted(
+ Json.toJson(
+ ExciseMovementResponse(
+ movement._id,
+ boxId,
+ movement.localReferenceNumber,
+ movement.consignorId,
+ movement.consigneeId,
+ movement.administrativeReferenceCode,
+ None
+ )
+ )
+ )
+ }
+ )
+ }
+
+ private def submitAndHandleError(
+ request: ParsedXmlRequest[NodeSeq],
+ ern: String,
+ message: IE815Message
+ )(implicit hc: HeaderCarrier): EitherT[Future, Result, EISSubmissionResponse] =
+ EitherT {
+ submissionMessageService.submit(request, ern).map {
+ case Left(error) =>
+ if (appConfig.oldAuditingEnabled) auditService.auditMessage(message, "Failed to submit") //OLD auditing
+ auditService
+ .messageSubmittedNoMovement(message, false, message.correlationId, request) //NEW auditing
+ Left(
+ Status(error.status)(
+ Json.toJson(
+ EisErrorResponsePresentation(
+ error.dateTime,
+ error.message,
+ error.debugMessage,
+ error.correlationId,
+ error.validatorResults
+ )
+ )
+ )
+ )
+ case Right(response) =>
+ Right(response)
+ }
+ }
+
+ private def validateMessage(
+ message: IE815Message,
+ authErns: Set[String]
+ ): EitherT[Future, Result, String] =
+ EitherT.fromEither(messageValidator.validateDraftMovement(authErns, message).left.map { x =>
+ messageValidator.convertErrorToResponse(x, dateTimeService.timestamp())
+ })
+
+ private def getDraftOrSaveNew(
+ maybeBoxId: Option[String],
+ message: IE815Message,
+ request: ParsedXmlRequest[NodeSeq]
+ )(implicit hc: HeaderCarrier): EitherT[Future, Result, Movement] =
+ EitherT {
+
+ //TODO cannot find by ID as a new ID is generate from the message here
+ val unsavedMovement: Movement = createMovementFomMessage(message, maybeBoxId)
+ maybeBoxId.foreach(boxIdRepository.save(unsavedMovement.consignorId, _))
+
+ movementMessageService.getDraftMovementOrSaveNew(unsavedMovement).map {
+ case Left(result) =>
+ if (appConfig.oldAuditingEnabled) auditService.auditMessage(message, "Failed to Save")
+ auditService.messageSubmittedNoMovement(message, true, message.correlationId, request)
+ Left(result)
+ case Right(movement) =>
+ Right(movement)
+ }
+
+ }
+
+ private def createMovementFomMessage(message: IE815Message, boxId: Option[String]): Movement = {
+ val consignorId: String =
+ message.consignorId.getOrElse(
+ throw new Exception(s"No Consignor on IE815: ${message.messageIdentifier}")
+ )
+ Movement(
+ boxId,
+ message.localReferenceNumber,
+ consignorId,
+ message.consigneeId,
+ None
+ )
+ }
+
+ private def getBoxId(
+ clientId: String
+ )(implicit request: ParsedXmlRequest[_]): EitherT[Future, Result, Option[String]] =
+ if (appConfig.pushNotificationsEnabled) {
+ val clientBoxId = request.headers.get(Constants.XCallbackBoxId)
+ EitherT(
+ notificationService.getBoxId(clientId, clientBoxId).map(futureValue => futureValue.map(boxId => Some(boxId)))
+ )
+ } else {
+ EitherT.fromEither(Right(None))
+ }
+
+ private def getIe815Message(message: IEMessage): EitherT[Future, Result, IE815Message] =
+ EitherT.fromEither(message match {
+ case x: IE815Message => Right(x)
+ case _ =>
+ logger.warn(
+ s"[DraftExciseMovementController] - Message type ${message.messageType} cannot be sent to the draft excise movement endpoint"
+ )
+ Left(
+ BadRequest(
+ Json.toJson(
+ ErrorResponse(
+ dateTimeService.timestamp(),
+ "Invalid message type",
+ s"Message type ${message.messageType} cannot be sent to the draft excise movement endpoint"
+ )
+ )
+ )
+ )
+ })
+
+ private def retrieveClientIdFromHeader(implicit request: ParsedXmlRequest[_]): EitherT[Future, Result, String] =
+ EitherT.fromOption(
+ request.headers.get(Constants.XClientIdHeader),
+ BadRequest(
+ Json.toJson(
+ ErrorResponse(
+ dateTimeService.timestamp(),
+ s"ClientId error",
+ s"Request header is missing ${Constants.XClientIdHeader}"
+ )
+ )
+ )
+ )
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/DraftExciseMovementControllerV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/DraftExciseMovementControllerV1.scala
deleted file mode 100755
index 057e95883..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/DraftExciseMovementControllerV1.scala
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.controllers
-
-import cats.data.EitherT
-import play.api.Logging
-import play.api.libs.json.Json
-import play.api.mvc._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.config.AppConfig
-import uk.gov.hmrc.excisemovementcontrolsystemapi.controllers.actions.{AuthAction, CorrelationIdAction, ParseXmlAction}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auth.ParsedXmlRequest
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.eis.EISSubmissionResponse
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.IE815MessageV1
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.notification.Constants
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.validation._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.BoxIdRepository
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.Movement
-import uk.gov.hmrc.excisemovementcontrolsystemapi.services._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.DateTimeService
-import uk.gov.hmrc.http.HeaderCarrier
-import uk.gov.hmrc.play.bootstrap.backend.controller.BackendController
-import uk.gov.hmrc.play.http.HeaderCarrierConverter
-
-import javax.inject.{Inject, Singleton}
-import scala.concurrent.{ExecutionContext, Future}
-import scala.xml.NodeSeq
-
-@Singleton
-class DraftExciseMovementControllerV1 @Inject() (
- authAction: AuthAction,
- xmlParser: ParseXmlAction,
- movementMessageService: MovementService,
- submissionMessageService: SubmissionMessageService,
- notificationService: PushNotificationService,
- messageValidator: MessageValidation,
- dateTimeService: DateTimeService,
- auditService: AuditService,
- boxIdRepository: BoxIdRepository,
- appConfig: AppConfig,
- cc: ControllerComponents,
- correlationIdAction: CorrelationIdAction
-)(implicit ec: ExecutionContext)
- extends BackendController(cc)
- with Logging
- with DraftExciseMovementController {
-
- def submit: Action[NodeSeq] =
- (authAction andThen correlationIdAction andThen xmlParser).async(parse.xml) { implicit request =>
- implicit val hc: HeaderCarrier = HeaderCarrierConverter.fromRequest(request)
- (for {
- ie815MessageV1 <- getIE815MessageV1(request.ieMessage)
- authorisedErn <- validateMessage(ie815MessageV1, request.erns)
- clientId <- retrieveClientIdFromHeader(request)
- maybeBoxId <- getBoxId(clientId)
- _ <- submitAndHandleError(request, authorisedErn, ie815MessageV1)
- movement <- getDraftOrSaveNew(maybeBoxId, ie815MessageV1, request)
- } yield (movement, maybeBoxId, ie815MessageV1)).fold[Result](
- failResult => failResult,
- success => {
- val (movement, boxId, ie815MessageV1) = success
-
- if (appConfig.oldAuditingEnabled) auditService.auditMessage(request.ieMessage).value
- auditService.messageSubmitted(movement, true, ie815MessageV1.correlationId, request)
-
- Accepted(
- Json.toJson(
- ExciseMovementResponse(
- movement._id,
- boxId,
- movement.localReferenceNumber,
- movement.consignorId,
- movement.consigneeId,
- movement.administrativeReferenceCode,
- None
- )
- )
- )
- }
- )
- }
-
- private def submitAndHandleError(
- request: ParsedXmlRequest[NodeSeq],
- ern: String,
- message: IE815MessageV1
- )(implicit hc: HeaderCarrier): EitherT[Future, Result, EISSubmissionResponse] =
- EitherT {
- submissionMessageService.submit(request, ern).map {
- case Left(error) =>
- if (appConfig.oldAuditingEnabled) auditService.auditMessage(message, "Failed to submit") //OLD auditing
- auditService
- .messageSubmittedNoMovement(message, false, message.correlationId, request) //NEW auditing
- Left(
- Status(error.status)(
- Json.toJson(
- EisErrorResponsePresentation(
- error.dateTime,
- error.message,
- error.debugMessage,
- error.correlationId,
- error.validatorResults
- )
- )
- )
- )
- case Right(response) =>
- Right(response)
- }
- }
-
- private def validateMessage(
- message: IE815MessageV1,
- authErns: Set[String]
- ): EitherT[Future, Result, String] =
- EitherT.fromEither(messageValidator.validateDraftMovement(authErns, message).left.map { x =>
- messageValidator.convertErrorToResponse(x, dateTimeService.timestamp())
- })
-
- private def getDraftOrSaveNew(
- maybeBoxId: Option[String],
- message: IE815MessageV1,
- request: ParsedXmlRequest[NodeSeq]
- )(implicit hc: HeaderCarrier): EitherT[Future, Result, Movement] =
- EitherT {
-
- //TODO cannot find by ID as a new ID is generate from the message here
- val unsavedMovement: Movement = createMovementFomMessage(message, maybeBoxId)
- maybeBoxId.foreach(boxIdRepository.save(unsavedMovement.consignorId, _))
-
- movementMessageService.getDraftMovementOrSaveNew(unsavedMovement).map {
- case Left(result) =>
- if (appConfig.oldAuditingEnabled) auditService.auditMessage(message, "Failed to Save")
- auditService.messageSubmittedNoMovement(message, true, message.correlationId, request)
- Left(result)
- case Right(movement) =>
- Right(movement)
- }
-
- }
-
- private def createMovementFomMessage(message: IE815MessageV1, boxId: Option[String]): Movement = {
- val consignorId: String =
- message.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE815: ${message.messageIdentifier}")
- )
- Movement(
- boxId,
- message.localReferenceNumber,
- consignorId,
- message.consigneeId,
- None
- )
- }
-
- private def getBoxId(
- clientId: String
- )(implicit request: ParsedXmlRequest[_]): EitherT[Future, Result, Option[String]] =
- if (appConfig.pushNotificationsEnabled) {
- val clientBoxId = request.headers.get(Constants.XCallbackBoxId)
- EitherT(
- notificationService.getBoxId(clientId, clientBoxId).map(futureValue => futureValue.map(boxId => Some(boxId)))
- )
- } else {
- EitherT.fromEither(Right(None))
- }
-
- private def getIE815MessageV1(message: IEMessage): EitherT[Future, Result, IE815MessageV1] =
- EitherT.fromEither(message match {
- case x: IE815MessageV1 => Right(x)
- case _ =>
- logger.warn(
- s"[DraftExciseMovementController] - Message type ${message.messageType} cannot be sent to the draft excise movement endpoint"
- )
- Left(
- BadRequest(
- Json.toJson(
- ErrorResponse(
- dateTimeService.timestamp(),
- "Invalid message type",
- s"Message type ${message.messageType} cannot be sent to the draft excise movement endpoint"
- )
- )
- )
- )
- })
-
- private def retrieveClientIdFromHeader(implicit request: ParsedXmlRequest[_]): EitherT[Future, Result, String] =
- EitherT.fromOption(
- request.headers.get(Constants.XClientIdHeader),
- BadRequest(
- Json.toJson(
- ErrorResponse(
- dateTimeService.timestamp(),
- s"ClientId error",
- s"Request header is missing ${Constants.XClientIdHeader}"
- )
- )
- )
- )
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/DraftExciseMovementControllerV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/DraftExciseMovementControllerV2.scala
deleted file mode 100755
index dbab5f5c8..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/DraftExciseMovementControllerV2.scala
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.controllers
-
-import cats.data.EitherT
-import play.api.Logging
-import play.api.libs.json.Json
-import play.api.mvc._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.config.AppConfig
-import uk.gov.hmrc.excisemovementcontrolsystemapi.controllers.actions.{AuthAction, CorrelationIdAction, ParseXmlAction}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auth.ParsedXmlRequest
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.eis.EISSubmissionResponse
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.IE815MessageV2
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.notification.Constants
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.validation._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.BoxIdRepository
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.Movement
-import uk.gov.hmrc.excisemovementcontrolsystemapi.services._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.DateTimeService
-import uk.gov.hmrc.http.HeaderCarrier
-import uk.gov.hmrc.play.bootstrap.backend.controller.BackendController
-import uk.gov.hmrc.play.http.HeaderCarrierConverter
-
-import javax.inject.{Inject, Singleton}
-import scala.concurrent.{ExecutionContext, Future}
-import scala.xml.NodeSeq
-
-@Singleton
-class DraftExciseMovementControllerV2 @Inject() (
- authAction: AuthAction,
- xmlParser: ParseXmlAction,
- movementMessageService: MovementService,
- submissionMessageService: SubmissionMessageService,
- notificationService: PushNotificationService,
- messageValidator: MessageValidation,
- dateTimeService: DateTimeService,
- auditService: AuditService,
- boxIdRepository: BoxIdRepository,
- appConfig: AppConfig,
- cc: ControllerComponents,
- correlationIdAction: CorrelationIdAction
-)(implicit ec: ExecutionContext)
- extends BackendController(cc)
- with Logging
- with DraftExciseMovementController {
-
- def submit: Action[NodeSeq] =
- (authAction andThen correlationIdAction andThen xmlParser).async(parse.xml) { implicit request =>
- implicit val hc: HeaderCarrier = HeaderCarrierConverter.fromRequest(request)
- (for {
- ie815MessageV2 <- getIE815MessageV2(request.ieMessage)
- authorisedErn <- validateMessage(ie815MessageV2, request.erns)
- clientId <- retrieveClientIdFromHeader(request)
- maybeBoxId <- getBoxId(clientId)
- _ <- submitAndHandleError(request, authorisedErn, ie815MessageV2)
- movement <- getDraftOrSaveNew(maybeBoxId, ie815MessageV2, request)
- } yield (movement, maybeBoxId, ie815MessageV2)).fold[Result](
- failResult => failResult,
- success => {
- val (movement, boxId, ie815MessageV2) = success
-
- if (appConfig.oldAuditingEnabled) auditService.auditMessage(request.ieMessage).value
- auditService.messageSubmitted(movement, true, ie815MessageV2.correlationId, request)
-
- Accepted(
- Json.toJson(
- ExciseMovementResponse(
- movement._id,
- boxId,
- movement.localReferenceNumber,
- movement.consignorId,
- movement.consigneeId,
- movement.administrativeReferenceCode,
- None
- )
- )
- )
- }
- )
- }
-
- private def submitAndHandleError(
- request: ParsedXmlRequest[NodeSeq],
- ern: String,
- message: IE815MessageV2
- )(implicit hc: HeaderCarrier): EitherT[Future, Result, EISSubmissionResponse] =
- EitherT {
- submissionMessageService.submit(request, ern).map {
- case Left(error) =>
- if (appConfig.oldAuditingEnabled) auditService.auditMessage(message, "Failed to submit") //OLD auditing
- auditService
- .messageSubmittedNoMovement(message, false, message.correlationId, request) //NEW auditing
- Left(
- Status(error.status)(
- Json.toJson(
- EisErrorResponsePresentation(
- error.dateTime,
- error.message,
- error.debugMessage,
- error.correlationId,
- error.validatorResults
- )
- )
- )
- )
- case Right(response) =>
- Right(response)
- }
- }
-
- private def validateMessage(
- message: IE815MessageV2,
- authErns: Set[String]
- ): EitherT[Future, Result, String] =
- EitherT.fromEither(messageValidator.validateDraftMovement(authErns, message).left.map { x =>
- messageValidator.convertErrorToResponse(x, dateTimeService.timestamp())
- })
-
- private def getDraftOrSaveNew(
- maybeBoxId: Option[String],
- message: IE815MessageV2,
- request: ParsedXmlRequest[NodeSeq]
- )(implicit hc: HeaderCarrier): EitherT[Future, Result, Movement] =
- EitherT {
-
- //TODO cannot find by ID as a new ID is generate from the message here
- val unsavedMovement: Movement = createMovementFomMessage(message, maybeBoxId)
- maybeBoxId.foreach(boxIdRepository.save(unsavedMovement.consignorId, _))
-
- movementMessageService.getDraftMovementOrSaveNew(unsavedMovement).map {
- case Left(result) =>
- if (appConfig.oldAuditingEnabled) auditService.auditMessage(message, "Failed to Save")
- auditService.messageSubmittedNoMovement(message, true, message.correlationId, request)
- Left(result)
- case Right(movement) =>
- Right(movement)
- }
-
- }
-
- private def createMovementFomMessage(message: IE815MessageV2, boxId: Option[String]): Movement = {
- val consignorId: String =
- message.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE815: ${message.messageIdentifier}")
- )
- Movement(
- boxId,
- message.localReferenceNumber,
- consignorId,
- message.consigneeId,
- None
- )
- }
-
- private def getBoxId(
- clientId: String
- )(implicit request: ParsedXmlRequest[_]): EitherT[Future, Result, Option[String]] =
- if (appConfig.pushNotificationsEnabled) {
- val clientBoxId = request.headers.get(Constants.XCallbackBoxId)
- EitherT(
- notificationService.getBoxId(clientId, clientBoxId).map(futureValue => futureValue.map(boxId => Some(boxId)))
- )
- } else {
- EitherT.fromEither(Right(None))
- }
-
- private def getIE815MessageV2(message: IEMessage): EitherT[Future, Result, IE815MessageV2] =
- EitherT.fromEither(message match {
- case x: IE815MessageV2 => Right(x)
- case _ =>
- logger.warn(
- s"[DraftExciseMovementController] - Message type ${message.messageType} cannot be sent to the draft excise movement endpoint"
- )
- Left(
- BadRequest(
- Json.toJson(
- ErrorResponse(
- dateTimeService.timestamp(),
- "Invalid message type",
- s"Message type ${message.messageType} cannot be sent to the draft excise movement endpoint"
- )
- )
- )
- )
- })
-
- private def retrieveClientIdFromHeader(implicit request: ParsedXmlRequest[_]): EitherT[Future, Result, String] =
- EitherT.fromOption(
- request.headers.get(Constants.XClientIdHeader),
- BadRequest(
- Json.toJson(
- ErrorResponse(
- dateTimeService.timestamp(),
- s"ClientId error",
- s"Request header is missing ${Constants.XClientIdHeader}"
- )
- )
- )
- )
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/factories/IEMessageFactory.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/factories/IEMessageFactory.scala
index 9d42c9f07..bc3d98cda 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/factories/IEMessageFactory.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/factories/IEMessageFactory.scala
@@ -16,19 +16,67 @@
package uk.gov.hmrc.excisemovementcontrolsystemapi.factories
-import generated.v1
-import generated.v2
+import generated.MessagesOption
+import play.api.Logging
import scalaxb.DataRecord
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages._
import scala.xml.NodeSeq
-trait IEMessageFactory {
- type MessageOption = Either[DataRecord[v1.MessagesOption], DataRecord[v2.MessagesOption]]
+case class IEMessageFactory() extends Logging {
+ def createIEMessage(message: DataRecord[MessagesOption]): IEMessage = {
+ val messageType = message.key.getOrElse {
+ logger.warn(s"[IEMessageFactory] - Could not create Message object. Message type is empty")
+ throw new IEMessageFactoryException("Could not create Message object. Message type is empty")
+ }
- def createIEMessage(message: MessageOption): IEMessage
+ MessageTypes.withValueOpt(messageType) match {
+ case Some(MessageTypes.IE704) => IE704Message(message)
+ case Some(MessageTypes.IE801) => IE801Message(message)
+ case Some(MessageTypes.IE802) => IE802Message(message)
+ case Some(MessageTypes.IE803) => IE803Message(message)
+ case Some(MessageTypes.IE807) => IE807Message(message)
+ case Some(MessageTypes.IE810) => IE810Message(message)
+ case Some(MessageTypes.IE813) => IE813Message(message)
+ case Some(MessageTypes.IE818) => IE818Message(message)
+ case Some(MessageTypes.IE819) => IE819Message(message)
+ case Some(MessageTypes.IE829) => IE829Message(message)
+ case Some(MessageTypes.IE837) => IE837Message(message)
+ case Some(MessageTypes.IE839) => IE839Message(message)
+ case Some(MessageTypes.IE840) => IE840Message(message)
+ case Some(MessageTypes.IE871) => IE871Message(message)
+ case Some(MessageTypes.IE881) => IE881Message(message)
+ case Some(MessageTypes.IE905) => IE905Message(message)
+ case _ =>
+ logger.warn(s"[IEMessageFactory] - Could not create Message object. Unsupported message: $messageType")
+ throw new IEMessageFactoryException(s"Could not create Message object. Unsupported message: $messageType")
+ }
+ }
- def createFromXml(messageType: String, xml: NodeSeq): IEMessage
+ def createFromXml(messageType: String, xml: NodeSeq): IEMessage =
+ MessageTypes.withValueOpt(messageType) match {
+ case Some(MessageTypes.IE704) => IE704Message.createFromXml(xml)
+ case Some(MessageTypes.IE801) => IE801Message.createFromXml(xml)
+ case Some(MessageTypes.IE802) => IE802Message.createFromXml(xml)
+ case Some(MessageTypes.IE803) => IE803Message.createFromXml(xml)
+ case Some(MessageTypes.IE807) => IE807Message.createFromXml(xml)
+ case Some(MessageTypes.IE810) => IE810Message.createFromXml(xml)
+ case Some(MessageTypes.IE813) => IE813Message.createFromXml(xml)
+ case Some(MessageTypes.IE815) => IE815Message.createFromXml(xml)
+ case Some(MessageTypes.IE818) => IE818Message.createFromXml(xml)
+ case Some(MessageTypes.IE819) => IE819Message.createFromXml(xml)
+ case Some(MessageTypes.IE829) => IE829Message.createFromXml(xml)
+ case Some(MessageTypes.IE837) => IE837Message.createFromXml(xml)
+ case Some(MessageTypes.IE839) => IE839Message.createFromXml(xml)
+ case Some(MessageTypes.IE840) => IE840Message.createFromXml(xml)
+ case Some(MessageTypes.IE871) => IE871Message.createFromXml(xml)
+ case Some(MessageTypes.IE881) => IE881Message.createFromXml(xml)
+ case Some(MessageTypes.IE905) => IE905Message.createFromXml(xml)
+ case _ =>
+ logger.warn(s"[IEMessageFactory] - Could not create Message object. Unsupported message: $messageType")
+ throw new IEMessageFactoryException(s"Could not create Message object. Unsupported message: $messageType")
+ }
}
class IEMessageFactoryException(message: String) extends RuntimeException(message)
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/factories/IEMessageFactoryV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/factories/IEMessageFactoryV1.scala
deleted file mode 100644
index 5c5493dc4..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/factories/IEMessageFactoryV1.scala
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.factories
-
-import play.api.Logging
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1._
-
-import scala.xml.NodeSeq
-
-case class IEMessageFactoryV1() extends Logging with IEMessageFactory {
- def createIEMessage(message: MessageOption): IEMessage = {
- val (messageType, record) = message match {
- case Left(m) =>
- (
- m.key.getOrElse {
- logger.warn(s"[IEMessageFactory] - Could not create Message object. Message type is empty")
- throw new IEMessageFactoryException("Could not create Message object. Message type is empty")
- },
- m
- )
- case Right(a) =>
- logger.warn(s"[IEMessageFactory] - Invalid Control flow.")
- throw new IllegalStateException("Invalid state - should not have reached.")
- }
-
- MessageTypes.withValueOpt(messageType) match {
- case Some(MessageTypes.IE704) => IE704MessageV1(record)
- case Some(MessageTypes.IE801) => IE801MessageV1(record)
- case Some(MessageTypes.IE802) => IE802MessageV1(record)
- case Some(MessageTypes.IE803) => IE803MessageV1(record)
- case Some(MessageTypes.IE807) => IE807MessageV1(record)
- case Some(MessageTypes.IE810) => IE810MessageV1(record)
- case Some(MessageTypes.IE813) => IE813MessageV1(record)
- case Some(MessageTypes.IE818) => IE818MessageV1(record)
- case Some(MessageTypes.IE819) => IE819MessageV1(record)
- case Some(MessageTypes.IE829) => IE829MessageV1(record)
- case Some(MessageTypes.IE837) => IE837MessageV1(record)
- case Some(MessageTypes.IE839) => IE839MessageV1(record)
- case Some(MessageTypes.IE840) => IE840MessageV1(record)
- case Some(MessageTypes.IE871) => IE871MessageV1(record)
- case Some(MessageTypes.IE881) => IE881MessageV1(record)
- case Some(MessageTypes.IE905) => IE905MessageV1(record)
- case _ =>
- logger.warn(s"[IEMessageFactory] - Could not create Message object. Unsupported message: $messageType")
- throw new IEMessageFactoryException(s"Could not create Message object. Unsupported message: $messageType")
- }
- }
-
- def createFromXml(messageType: String, xml: NodeSeq): IEMessage =
- MessageTypes.withValueOpt(messageType) match {
- case Some(MessageTypes.IE704) => IE704MessageV1.createFromXml(xml)
- case Some(MessageTypes.IE801) => IE801MessageV1.createFromXml(xml)
- case Some(MessageTypes.IE802) => IE802MessageV1.createFromXml(xml)
- case Some(MessageTypes.IE803) => IE803MessageV1.createFromXml(xml)
- case Some(MessageTypes.IE807) => IE807MessageV1.createFromXml(xml)
- case Some(MessageTypes.IE810) => IE810MessageV1.createFromXml(xml)
- case Some(MessageTypes.IE813) => IE813MessageV1.createFromXml(xml)
- case Some(MessageTypes.IE815) => IE815MessageV1.createFromXml(xml)
- case Some(MessageTypes.IE818) => IE818MessageV1.createFromXml(xml)
- case Some(MessageTypes.IE819) => IE819MessageV1.createFromXml(xml)
- case Some(MessageTypes.IE829) => IE829MessageV1.createFromXml(xml)
- case Some(MessageTypes.IE837) => IE837MessageV1.createFromXml(xml)
- case Some(MessageTypes.IE839) => IE839MessageV1.createFromXml(xml)
- case Some(MessageTypes.IE840) => IE840MessageV1.createFromXml(xml)
- case Some(MessageTypes.IE871) => IE871MessageV1.createFromXml(xml)
- case Some(MessageTypes.IE881) => IE881MessageV1.createFromXml(xml)
- case Some(MessageTypes.IE905) => IE905MessageV1.createFromXml(xml)
- case _ =>
- logger.warn(s"[IEMessageFactory] - Could not create Message object. Unsupported message: $messageType")
- throw new IEMessageFactoryException(s"Could not create Message object. Unsupported message: $messageType")
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/factories/IEMessageFactoryV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/factories/IEMessageFactoryV2.scala
deleted file mode 100644
index 9a69f5665..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/factories/IEMessageFactoryV2.scala
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.factories
-
-import play.api.Logging
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2._
-
-import scala.xml.NodeSeq
-
-case class IEMessageFactoryV2() extends Logging with IEMessageFactory {
- def createIEMessage(message: MessageOption): IEMessage = {
- val (messageType, record) = message match {
- case Left(m) =>
- logger.warn(s"[IEMessageFactory] - Invalid Control flow.")
- throw new IllegalStateException("Invalid state - should not have reached.")
- case Right(m) =>
- (
- m.key.getOrElse {
- logger.warn(s"[IEMessageFactory] - Could not create Message object. Message type is empty")
- throw new IEMessageFactoryException("Could not create Message object. Message type is empty")
- },
- m
- )
-
- }
-
- MessageTypes.withValueOpt(messageType) match {
- case Some(MessageTypes.IE704) => IE704MessageV2(record)
- case Some(MessageTypes.IE801) => IE801MessageV2(record)
- case Some(MessageTypes.IE802) => IE802MessageV2(record)
- case Some(MessageTypes.IE803) => IE803MessageV2(record)
- case Some(MessageTypes.IE807) => IE807MessageV2(record)
- case Some(MessageTypes.IE810) => IE810MessageV2(record)
- case Some(MessageTypes.IE813) => IE813MessageV2(record)
- case Some(MessageTypes.IE818) => IE818MessageV2(record)
- case Some(MessageTypes.IE819) => IE819MessageV2(record)
- case Some(MessageTypes.IE829) => IE829MessageV2(record)
- case Some(MessageTypes.IE837) => IE837MessageV2(record)
- case Some(MessageTypes.IE839) => IE839MessageV2(record)
- case Some(MessageTypes.IE840) => IE840MessageV2(record)
- case Some(MessageTypes.IE871) => IE871MessageV2(record)
- case Some(MessageTypes.IE881) => IE881MessageV2(record)
- case Some(MessageTypes.IE905) => IE905MessageV2(record)
- case _ =>
- logger.warn(s"[IEMessageFactory] - Could not create Message object. Unsupported message: $messageType")
- throw new IEMessageFactoryException(s"Could not create Message object. Unsupported message: $messageType")
- }
- }
-
- def createFromXml(messageType: String, xml: NodeSeq): IEMessage =
- MessageTypes.withValueOpt(messageType) match {
- case Some(MessageTypes.IE704) => IE704MessageV2.createFromXml(xml)
- case Some(MessageTypes.IE801) => IE801MessageV2.createFromXml(xml)
- case Some(MessageTypes.IE802) => IE802MessageV2.createFromXml(xml)
- case Some(MessageTypes.IE803) => IE803MessageV2.createFromXml(xml)
- case Some(MessageTypes.IE807) => IE807MessageV2.createFromXml(xml)
- case Some(MessageTypes.IE810) => IE810MessageV2.createFromXml(xml)
- case Some(MessageTypes.IE813) => IE813MessageV2.createFromXml(xml)
- case Some(MessageTypes.IE815) => IE815MessageV2.createFromXml(xml)
- case Some(MessageTypes.IE818) => IE818MessageV2.createFromXml(xml)
- case Some(MessageTypes.IE819) => IE819MessageV2.createFromXml(xml)
- case Some(MessageTypes.IE829) => IE829MessageV2.createFromXml(xml)
- case Some(MessageTypes.IE837) => IE837MessageV2.createFromXml(xml)
- case Some(MessageTypes.IE839) => IE839MessageV2.createFromXml(xml)
- case Some(MessageTypes.IE840) => IE840MessageV2.createFromXml(xml)
- case Some(MessageTypes.IE871) => IE871MessageV2.createFromXml(xml)
- case Some(MessageTypes.IE881) => IE881MessageV2.createFromXml(xml)
- case Some(MessageTypes.IE905) => IE905MessageV2.createFromXml(xml)
- case _ =>
- logger.warn(s"[IEMessageFactory] - Could not create Message object. Unsupported message: $messageType")
- throw new IEMessageFactoryException(s"Could not create Message object. Unsupported message: $messageType")
- }
-
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/auditing/AuditEventFactory.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/auditing/AuditEventFactory.scala
index 3afdbdd5f..14d9b683b 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/auditing/AuditEventFactory.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/auditing/AuditEventFactory.scala
@@ -16,57 +16,118 @@
package uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing
+import cats.data.NonEmptySeq
import play.api.mvc.AnyContent
+import uk.gov.hmrc.excisemovementcontrolsystemapi.factories.IEMessageFactory
import uk.gov.hmrc.excisemovementcontrolsystemapi.filters.MovementFilter
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auth.{EnrolmentRequest, ParsedXmlRequest}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.IE815MessageV1
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.IE815MessageV2
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{GetMessagesResponse, IEMessage}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{GetMessagesResponse, IE815Message, IEMessage}
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Message, Movement}
-
+import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.EmcsUtils
import uk.gov.hmrc.http.HeaderCarrier
-
+import uk.gov.hmrc.play.audit.AuditExtensions.auditHeaderCarrier
import uk.gov.hmrc.play.audit.model.ExtendedDataEvent
+import javax.inject.{Inject, Singleton}
import scala.xml.NodeSeq
-trait AuditEventFactory {
+@Singleton
+class AuditEventFactory @Inject() (emcsUtils: EmcsUtils, ieMessageFactory: IEMessageFactory) extends Auditing {
def createMessageAuditEvent(input: IEMessage, failureOpt: Option[String])(implicit
hc: HeaderCarrier
- ): ExtendedDataEvent
-
- def createMessageSubmittedNoMovement(
- message: IE815MessageV1,
- submittedToCore: Boolean,
- correlationId: Option[String],
- request: ParsedXmlRequest[NodeSeq]
- ): MessageSubmittedDetails
+ ): ExtendedDataEvent = {
+ val detail = AuditDetail(input.messageType, input.toJson, failureOpt)
+ ExtendedDataEvent(
+ auditSource = auditSource,
+ auditType = input.messageAuditType.name,
+ tags = hc.toAuditTags(),
+ detail = detail.toJsObj
+ )
+ }
def createMessageSubmittedNoMovement(
- message: IE815MessageV2,
+ message: IE815Message,
submittedToCore: Boolean,
correlationId: Option[String],
request: ParsedXmlRequest[NodeSeq]
- ): MessageSubmittedDetails
+ ): MessageSubmittedDetails = {
+ val consignorId: String =
+ message.consignorId.getOrElse(
+ throw new Exception(s"No Consignor on IE815: ${message.messageIdentifier}")
+ )
+ MessageSubmittedDetails(
+ message.messageType,
+ message.messageAuditType.name,
+ message.localReferenceNumber,
+ None,
+ None,
+ consignorId,
+ message.consigneeId,
+ submittedToCore,
+ message.messageIdentifier,
+ correlationId,
+ request.userDetails,
+ NonEmptySeq(request.erns.head, request.erns.tail.toList),
+ message.toJsObject
+ )
+ }
def createMessageSubmitted(
movement: Movement,
submittedToCore: Boolean,
correlationId: Option[String],
request: ParsedXmlRequest[NodeSeq]
- ): MessageSubmittedDetails
+ ): MessageSubmittedDetails =
+ MessageSubmittedDetails(
+ request.ieMessage.messageType,
+ request.ieMessage.messageAuditType.name,
+ movement.localReferenceNumber,
+ movement.administrativeReferenceCode,
+ Some(movement._id),
+ movement.consignorId,
+ movement.consigneeId,
+ submittedToCore,
+ request.ieMessage.messageIdentifier,
+ correlationId,
+ request.userDetails,
+ NonEmptySeq(request.erns.head, request.erns.tail.toList),
+ request.ieMessage.toJsObject
+ )
def createGetMovementsDetails(
movementFilter: MovementFilter,
movements: Seq[Movement],
request: EnrolmentRequest[AnyContent]
- ): GetMovementsAuditInfo
+ ): GetMovementsAuditInfo = {
+ val parameters = GetMovementsParametersAuditInfo(
+ movementFilter.ern,
+ movementFilter.arc,
+ movementFilter.lrn,
+ movementFilter.updatedSince.map(x => x.toString),
+ movementFilter.traderType.map(x => x.traderType)
+ )
+ val response = GetMovementsResponseAuditInfo(
+ movements.length
+ )
+ GetMovementsAuditInfo(
+ request = parameters,
+ response = response,
+ userDetails = request.userDetails,
+ authExciseNumber = convertErns(request.erns)
+ )
+
+ }
def createGetSpecificMovementDetails(
movementId: String,
request: EnrolmentRequest[AnyContent]
- ): GetSpecificMovementAuditInfo
+ ): GetSpecificMovementAuditInfo =
+ GetSpecificMovementAuditInfo(
+ request = GetSpecificMovementRequestAuditInfo(movementId),
+ userDetails = request.userDetails,
+ authExciseNumber = convertErns(request.erns)
+ )
def createGetMessagesAuditInfo(
messages: Seq[Message],
@@ -74,34 +135,124 @@ trait AuditEventFactory {
updatedSince: Option[String],
traderType: Option[String],
request: EnrolmentRequest[AnyContent]
- ): GetMessagesAuditInfo
+ ): GetMessagesAuditInfo = {
+ val requestAuditInfo = GetMessagesRequestAuditInfo(movement._id, updatedSince, traderType)
+ val messagesAuditInfo = messages.map { msg =>
+ val decodedXml = emcsUtils.decode(msg.encodedMessage)
+ val decodedXmlNodeList = xml.XML.loadString(decodedXml)
+
+ val ieMessage = ieMessageFactory.createFromXml(msg.messageType, decodedXmlNodeList)
+ MessageAuditInfo(
+ msg.messageId,
+ ieMessage.correlationId,
+ ieMessage.messageType,
+ ieMessage.messageAuditType.name,
+ msg.recipient,
+ msg.createdOn
+ )
+ }
+ val response = GetMessagesResponseAuditInfo(
+ messages.length,
+ messagesAuditInfo,
+ movement.localReferenceNumber,
+ movement.administrativeReferenceCode,
+ movement.consignorId,
+ movement.consigneeId
+ )
+ GetMessagesAuditInfo(
+ request = requestAuditInfo,
+ response = response,
+ userDetails = request.userDetails,
+ authExciseNumber = convertErns(request.erns)
+ )
+ }
def createGetSpecificMessageAuditInfo(
movement: Movement,
message: Message,
request: EnrolmentRequest[AnyContent]
- ): GetSpecificMessageAuditInfo
+ ): GetSpecificMessageAuditInfo = {
+ val requestAuditInfo = GetSpecificMessageRequestAuditInfo(movement._id, message.messageId)
+ val decodedXml = emcsUtils.decode(message.encodedMessage)
+ val decodedXmlNodeList = xml.XML.loadString(decodedXml)
+
+ val ieMessage = ieMessageFactory.createFromXml(message.messageType, decodedXmlNodeList)
+ val response = GetSpecificMessageResponseAuditInfo(
+ ieMessage.correlationId,
+ ieMessage.messageType,
+ ieMessage.messageAuditType.name,
+ movement.localReferenceNumber,
+ movement.administrativeReferenceCode,
+ movement.consignorId,
+ movement.consigneeId
+ )
+ GetSpecificMessageAuditInfo(
+ request = requestAuditInfo,
+ response = response,
+ userDetails = request.userDetails,
+ authExciseNumber = convertErns(request.erns)
+ )
+ }
def createMessageProcessingSuccessAuditInfo(
ern: String,
response: GetMessagesResponse,
batchId: String,
jobId: Option[String]
- ): MessageProcessingSuccessAuditInfo
+ ): MessageProcessingSuccessAuditInfo = {
+
+ val messages =
+ response.messages.map(message =>
+ MessageProcessingMessageAuditInfo(
+ message.messageIdentifier,
+ message.correlationId,
+ message.messageType,
+ message.messageAuditType.name,
+ message.optionalLocalReferenceNumber,
+ message.administrativeReferenceCode.head,
+ message.consignorId,
+ message.consigneeId
+ )
+ )
+
+ MessageProcessingSuccessAuditInfo(
+ ern,
+ response.messageCount,
+ response.messages.length,
+ messages,
+ batchId,
+ jobId
+ )
+ }
def createMessageProcessingFailureAuditInfo(
ern: String,
failureReason: String,
batchId: String,
jobId: Option[String]
- ): MessageProcessingFailureAuditInfo
+ ): MessageProcessingFailureAuditInfo = MessageProcessingFailureAuditInfo(ern, failureReason, batchId, jobId)
def createMovementSavedSuccessAuditInfo(
updatedMovement: Movement,
batchId: Option[String],
jobId: Option[String],
newMessages: Seq[Message]
- ): MovementSavedSuccessAuditInfo
+ ): MovementSavedSuccessAuditInfo = {
+ val messagePairs = convertToIEMessage(newMessages)
+ MovementSavedSuccessAuditInfo(
+ newMessages.length,
+ updatedMovement.messages.length,
+ updatedMovement._id,
+ Some(updatedMovement.localReferenceNumber),
+ updatedMovement.administrativeReferenceCode,
+ updatedMovement.consignorId,
+ updatedMovement.consigneeId,
+ batchId,
+ jobId,
+ generateKeyMessageDetailsAuditInfo(messagePairs),
+ messagePairs.map(_._2.toJson)
+ )
+ }
def createMovementSavedFailureAuditInfo(
movement: Movement,
@@ -109,20 +260,60 @@ trait AuditEventFactory {
batchId: Option[String],
jobId: Option[String],
messagesToBeAdded: Seq[Message]
- ): MovementSavedFailureAuditInfo
+ ): MovementSavedFailureAuditInfo = {
+ val messagePairs = convertToIEMessage(movement.messages)
+ MovementSavedFailureAuditInfo(
+ failureReason,
+ messagesToBeAdded.length,
+ movement.messages.length,
+ movement._id,
+ Some(movement.localReferenceNumber),
+ movement.administrativeReferenceCode,
+ movement.consignorId,
+ movement.consigneeId,
+ batchId,
+ jobId,
+ generateKeyMessageDetailsAuditInfo(messagePairs),
+ messagePairs.map(_._2.toJson)
+ )
+ }
+ private def generateKeyMessageDetailsAuditInfo(
+ messagePairs: Seq[(Message, IEMessage)]
+ ): Seq[KeyMessageDetailsAuditInfo] =
+ messagePairs.map { pair =>
+ val (message, ieMessage) = pair
+ val correlationId = ieMessage.correlationId
+ KeyMessageDetailsAuditInfo(
+ ieMessage.messageIdentifier,
+ correlationId,
+ ieMessage.messageType,
+ ieMessage.messageAuditType.name,
+ message.recipient
+ )
+ }
+
+ private def convertToIEMessage(messages: Seq[Message]): Seq[(Message, IEMessage)] =
+ messages.map { message =>
+ val decodedXml = emcsUtils.decode(message.encodedMessage)
+ val decodedXmlNodeList = xml.XML.loadString(decodedXml)
+ val ieMessage = ieMessageFactory.createFromXml(message.messageType, decodedXmlNodeList)
+ (message, ieMessage)
+ }
def createMessageAcknowledgedEvent(
ern: String,
batchId: String,
jobId: Option[String],
recordsAffected: Int
- ): MessageAcknowledgedSuccessAuditInfo
+ ): MessageAcknowledgedSuccessAuditInfo =
+ MessageAcknowledgedSuccessAuditInfo(batchId, jobId, ern, recordsAffected)
def createMessageNotAcknowledgedEvent(
ern: String,
batchId: String,
jobId: Option[String],
failureReason: String
- ): MessageAcknowledgedFailureAuditInfo
-
+ ): MessageAcknowledgedFailureAuditInfo =
+ MessageAcknowledgedFailureAuditInfo(failureReason, batchId, jobId, ern)
+ private def convertErns(erns: Set[String]): NonEmptySeq[String] = NonEmptySeq(erns.head, erns.tail.toSeq)
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/auditing/AuditEventFactoryV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/auditing/AuditEventFactoryV1.scala
deleted file mode 100644
index 4fe50d44c..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/auditing/AuditEventFactoryV1.scala
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Copyright 2025 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing
-
-import cats.data.NonEmptySeq
-import play.api.mvc.AnyContent
-import uk.gov.hmrc.excisemovementcontrolsystemapi.factories.IEMessageFactory
-import uk.gov.hmrc.excisemovementcontrolsystemapi.filters.MovementFilter
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auth.{EnrolmentRequest, ParsedXmlRequest}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.IE815MessageV1
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.IE815MessageV2
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{GetMessagesResponse, IEMessage}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Message, Movement}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.EmcsUtils
-import uk.gov.hmrc.http.HeaderCarrier
-import uk.gov.hmrc.play.audit.AuditExtensions.auditHeaderCarrier
-import uk.gov.hmrc.play.audit.model.ExtendedDataEvent
-
-import javax.inject.{Inject, Singleton}
-import scala.xml.NodeSeq
-
-@Singleton
-class AuditEventFactoryV1 @Inject() (emcsUtils: EmcsUtils, ieMessageFactory: IEMessageFactory)
- extends Auditing
- with AuditEventFactory {
-
- def createMessageAuditEvent(input: IEMessage, failureOpt: Option[String])(implicit
- hc: HeaderCarrier
- ): ExtendedDataEvent = {
- val detail = AuditDetail(input.messageType, input.toJson, failureOpt)
- ExtendedDataEvent(
- auditSource = auditSource,
- auditType = input.messageAuditType.name,
- tags = hc.toAuditTags(),
- detail = detail.toJsObj
- )
- }
- def createMessageSubmittedNoMovement(
- message: IE815MessageV1,
- submittedToCore: Boolean,
- correlationId: Option[String],
- request: ParsedXmlRequest[NodeSeq]
- ): MessageSubmittedDetails = {
- val consignorId: String =
- message.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE815: ${message.messageIdentifier}")
- )
- MessageSubmittedDetails(
- message.messageType,
- message.messageAuditType.name,
- message.localReferenceNumber,
- None,
- None,
- consignorId,
- message.consigneeId,
- submittedToCore,
- message.messageIdentifier,
- correlationId,
- request.userDetails,
- NonEmptySeq(request.erns.head, request.erns.tail.toList),
- message.toJsObject
- )
- }
-
- def createMessageSubmittedNoMovement(
- message: IE815MessageV2,
- submittedToCore: Boolean,
- correlationId: Option[String],
- request: ParsedXmlRequest[NodeSeq]
- ): MessageSubmittedDetails = {
- val consignorId: String =
- message.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE815: ${message.messageIdentifier}")
- )
- MessageSubmittedDetails(
- message.messageType,
- message.messageAuditType.name,
- message.localReferenceNumber,
- None,
- None,
- consignorId,
- message.consigneeId,
- submittedToCore,
- message.messageIdentifier,
- correlationId,
- request.userDetails,
- NonEmptySeq(request.erns.head, request.erns.tail.toList),
- message.toJsObject
- )
- }
-
- def createMessageSubmitted(
- movement: Movement,
- submittedToCore: Boolean,
- correlationId: Option[String],
- request: ParsedXmlRequest[NodeSeq]
- ): MessageSubmittedDetails =
- MessageSubmittedDetails(
- request.ieMessage.messageType,
- request.ieMessage.messageAuditType.name,
- movement.localReferenceNumber,
- movement.administrativeReferenceCode,
- Some(movement._id),
- movement.consignorId,
- movement.consigneeId,
- submittedToCore,
- request.ieMessage.messageIdentifier,
- correlationId,
- request.userDetails,
- NonEmptySeq(request.erns.head, request.erns.tail.toList),
- request.ieMessage.toJsObject
- )
-
- def createGetMovementsDetails(
- movementFilter: MovementFilter,
- movements: Seq[Movement],
- request: EnrolmentRequest[AnyContent]
- ): GetMovementsAuditInfo = {
- val parameters = GetMovementsParametersAuditInfo(
- movementFilter.ern,
- movementFilter.arc,
- movementFilter.lrn,
- movementFilter.updatedSince.map(x => x.toString),
- movementFilter.traderType.map(x => x.traderType)
- )
- val response = GetMovementsResponseAuditInfo(
- movements.length
- )
- GetMovementsAuditInfo(
- request = parameters,
- response = response,
- userDetails = request.userDetails,
- authExciseNumber = convertErns(request.erns)
- )
-
- }
-
- def createGetSpecificMovementDetails(
- movementId: String,
- request: EnrolmentRequest[AnyContent]
- ): GetSpecificMovementAuditInfo =
- GetSpecificMovementAuditInfo(
- request = GetSpecificMovementRequestAuditInfo(movementId),
- userDetails = request.userDetails,
- authExciseNumber = convertErns(request.erns)
- )
-
- def createGetMessagesAuditInfo(
- messages: Seq[Message],
- movement: Movement,
- updatedSince: Option[String],
- traderType: Option[String],
- request: EnrolmentRequest[AnyContent]
- ): GetMessagesAuditInfo = {
- val requestAuditInfo = GetMessagesRequestAuditInfo(movement._id, updatedSince, traderType)
- val messagesAuditInfo = messages.map { msg =>
- val decodedXml = emcsUtils.decode(msg.encodedMessage)
- val decodedXmlNodeList = xml.XML.loadString(decodedXml)
-
- val ieMessage = ieMessageFactory.createFromXml(msg.messageType, decodedXmlNodeList)
- MessageAuditInfo(
- msg.messageId,
- ieMessage.correlationId,
- ieMessage.messageType,
- ieMessage.messageAuditType.name,
- msg.recipient,
- msg.createdOn
- )
- }
- val response = GetMessagesResponseAuditInfo(
- messages.length,
- messagesAuditInfo,
- movement.localReferenceNumber,
- movement.administrativeReferenceCode,
- movement.consignorId,
- movement.consigneeId
- )
- GetMessagesAuditInfo(
- request = requestAuditInfo,
- response = response,
- userDetails = request.userDetails,
- authExciseNumber = convertErns(request.erns)
- )
- }
-
- def createGetSpecificMessageAuditInfo(
- movement: Movement,
- message: Message,
- request: EnrolmentRequest[AnyContent]
- ): GetSpecificMessageAuditInfo = {
- val requestAuditInfo = GetSpecificMessageRequestAuditInfo(movement._id, message.messageId)
- val decodedXml = emcsUtils.decode(message.encodedMessage)
- val decodedXmlNodeList = xml.XML.loadString(decodedXml)
-
- val ieMessage = ieMessageFactory.createFromXml(message.messageType, decodedXmlNodeList)
- val response = GetSpecificMessageResponseAuditInfo(
- ieMessage.correlationId,
- ieMessage.messageType,
- ieMessage.messageAuditType.name,
- movement.localReferenceNumber,
- movement.administrativeReferenceCode,
- movement.consignorId,
- movement.consigneeId
- )
- GetSpecificMessageAuditInfo(
- request = requestAuditInfo,
- response = response,
- userDetails = request.userDetails,
- authExciseNumber = convertErns(request.erns)
- )
- }
-
- def createMessageProcessingSuccessAuditInfo(
- ern: String,
- response: GetMessagesResponse,
- batchId: String,
- jobId: Option[String]
- ): MessageProcessingSuccessAuditInfo = {
-
- val messages =
- response.messages.map(message =>
- MessageProcessingMessageAuditInfo(
- message.messageIdentifier,
- message.correlationId,
- message.messageType,
- message.messageAuditType.name,
- message.optionalLocalReferenceNumber,
- message.administrativeReferenceCode.head,
- message.consignorId,
- message.consigneeId
- )
- )
-
- MessageProcessingSuccessAuditInfo(
- ern,
- response.messageCount,
- response.messages.length,
- messages,
- batchId,
- jobId
- )
- }
-
- def createMessageProcessingFailureAuditInfo(
- ern: String,
- failureReason: String,
- batchId: String,
- jobId: Option[String]
- ): MessageProcessingFailureAuditInfo = MessageProcessingFailureAuditInfo(ern, failureReason, batchId, jobId)
-
- def createMovementSavedSuccessAuditInfo(
- updatedMovement: Movement,
- batchId: Option[String],
- jobId: Option[String],
- newMessages: Seq[Message]
- ): MovementSavedSuccessAuditInfo = {
- val messagePairs = convertToIEMessage(newMessages)
- MovementSavedSuccessAuditInfo(
- newMessages.length,
- updatedMovement.messages.length,
- updatedMovement._id,
- Some(updatedMovement.localReferenceNumber),
- updatedMovement.administrativeReferenceCode,
- updatedMovement.consignorId,
- updatedMovement.consigneeId,
- batchId,
- jobId,
- generateKeyMessageDetailsAuditInfo(messagePairs),
- messagePairs.map(_._2.toJson)
- )
- }
-
- def createMovementSavedFailureAuditInfo(
- movement: Movement,
- failureReason: String,
- batchId: Option[String],
- jobId: Option[String],
- messagesToBeAdded: Seq[Message]
- ): MovementSavedFailureAuditInfo = {
- val messagePairs = convertToIEMessage(movement.messages)
- MovementSavedFailureAuditInfo(
- failureReason,
- messagesToBeAdded.length,
- movement.messages.length,
- movement._id,
- Some(movement.localReferenceNumber),
- movement.administrativeReferenceCode,
- movement.consignorId,
- movement.consigneeId,
- batchId,
- jobId,
- generateKeyMessageDetailsAuditInfo(messagePairs),
- messagePairs.map(_._2.toJson)
- )
- }
- private def generateKeyMessageDetailsAuditInfo(
- messagePairs: Seq[(Message, IEMessage)]
- ): Seq[KeyMessageDetailsAuditInfo] =
- messagePairs.map { pair =>
- val (message, ieMessage) = pair
- val correlationId = ieMessage.correlationId
- KeyMessageDetailsAuditInfo(
- ieMessage.messageIdentifier,
- correlationId,
- ieMessage.messageType,
- ieMessage.messageAuditType.name,
- message.recipient
- )
- }
-
- private def convertToIEMessage(messages: Seq[Message]): Seq[(Message, IEMessage)] =
- messages.map { message =>
- val decodedXml = emcsUtils.decode(message.encodedMessage)
- val decodedXmlNodeList = xml.XML.loadString(decodedXml)
- val ieMessage = ieMessageFactory.createFromXml(message.messageType, decodedXmlNodeList)
- (message, ieMessage)
- }
-
- def createMessageAcknowledgedEvent(
- ern: String,
- batchId: String,
- jobId: Option[String],
- recordsAffected: Int
- ): MessageAcknowledgedSuccessAuditInfo =
- MessageAcknowledgedSuccessAuditInfo(batchId, jobId, ern, recordsAffected)
-
- def createMessageNotAcknowledgedEvent(
- ern: String,
- batchId: String,
- jobId: Option[String],
- failureReason: String
- ): MessageAcknowledgedFailureAuditInfo =
- MessageAcknowledgedFailureAuditInfo(failureReason, batchId, jobId, ern)
- private def convertErns(erns: Set[String]): NonEmptySeq[String] = NonEmptySeq(erns.head, erns.tail.toSeq)
-
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/auditing/AuditEventFactoryV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/auditing/AuditEventFactoryV2.scala
deleted file mode 100644
index 94cc2c067..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/auditing/AuditEventFactoryV2.scala
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Copyright 2025 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing
-
-import cats.data.NonEmptySeq
-import play.api.mvc.AnyContent
-import uk.gov.hmrc.excisemovementcontrolsystemapi.factories.IEMessageFactory
-import uk.gov.hmrc.excisemovementcontrolsystemapi.filters.MovementFilter
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auth.{EnrolmentRequest, ParsedXmlRequest}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.IE815MessageV1
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.IE815MessageV2
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{GetMessagesResponse, IEMessage}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Message, Movement}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.EmcsUtils
-import uk.gov.hmrc.http.HeaderCarrier
-import uk.gov.hmrc.play.audit.AuditExtensions.auditHeaderCarrier
-import uk.gov.hmrc.play.audit.model.ExtendedDataEvent
-
-import javax.inject.{Inject, Singleton}
-import scala.xml.NodeSeq
-
-@Singleton
-class AuditEventFactoryV2 @Inject() (emcsUtils: EmcsUtils, ieMessageFactory: IEMessageFactory)
- extends Auditing
- with AuditEventFactory {
-//read from config
- def createMessageAuditEvent(input: IEMessage, failureOpt: Option[String])(implicit
- hc: HeaderCarrier
- ): ExtendedDataEvent = {
- val detail = AuditDetail(input.messageType, input.toJson, failureOpt)
- ExtendedDataEvent(
- auditSource = auditSource,
- auditType = input.messageAuditType.name,
- tags = hc.toAuditTags(),
- detail = detail.toJsObj
- )
- }
-
- def createMessageSubmittedNoMovement(
- message: IE815MessageV1,
- submittedToCore: Boolean,
- correlationId: Option[String],
- request: ParsedXmlRequest[NodeSeq]
- ): MessageSubmittedDetails = {
- val consignorId: String =
- message.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE815: ${message.messageIdentifier}")
- )
- MessageSubmittedDetails(
- message.messageType,
- message.messageAuditType.name,
- message.localReferenceNumber,
- None,
- None,
- consignorId,
- message.consigneeId,
- submittedToCore,
- message.messageIdentifier,
- correlationId,
- request.userDetails,
- NonEmptySeq(request.erns.head, request.erns.tail.toList),
- message.toJsObject
- )
- }
-
- def createMessageSubmittedNoMovement(
- message: IE815MessageV2,
- submittedToCore: Boolean,
- correlationId: Option[String],
- request: ParsedXmlRequest[NodeSeq]
- ): MessageSubmittedDetails = {
- val consignorId: String =
- message.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE815: ${message.messageIdentifier}")
- )
- MessageSubmittedDetails(
- message.messageType,
- message.messageAuditType.name,
- message.localReferenceNumber,
- None,
- None,
- consignorId,
- message.consigneeId,
- submittedToCore,
- message.messageIdentifier,
- correlationId,
- request.userDetails,
- NonEmptySeq(request.erns.head, request.erns.tail.toList),
- message.toJsObject
- )
- }
-
- def createMessageSubmitted(
- movement: Movement,
- submittedToCore: Boolean,
- correlationId: Option[String],
- request: ParsedXmlRequest[NodeSeq]
- ): MessageSubmittedDetails =
- MessageSubmittedDetails(
- request.ieMessage.messageType,
- request.ieMessage.messageAuditType.name,
- movement.localReferenceNumber,
- movement.administrativeReferenceCode,
- Some(movement._id),
- movement.consignorId,
- movement.consigneeId,
- submittedToCore,
- request.ieMessage.messageIdentifier,
- correlationId,
- request.userDetails,
- NonEmptySeq(request.erns.head, request.erns.tail.toList),
- request.ieMessage.toJsObject
- )
-
- def createGetMovementsDetails(
- movementFilter: MovementFilter,
- movements: Seq[Movement],
- request: EnrolmentRequest[AnyContent]
- ): GetMovementsAuditInfo = {
- val parameters = GetMovementsParametersAuditInfo(
- movementFilter.ern,
- movementFilter.arc,
- movementFilter.lrn,
- movementFilter.updatedSince.map(x => x.toString),
- movementFilter.traderType.map(x => x.traderType)
- )
- val response = GetMovementsResponseAuditInfo(
- movements.length
- )
- GetMovementsAuditInfo(
- request = parameters,
- response = response,
- userDetails = request.userDetails,
- authExciseNumber = convertErns(request.erns)
- )
-
- }
-
- def createGetSpecificMovementDetails(
- movementId: String,
- request: EnrolmentRequest[AnyContent]
- ): GetSpecificMovementAuditInfo =
- GetSpecificMovementAuditInfo(
- request = GetSpecificMovementRequestAuditInfo(movementId),
- userDetails = request.userDetails,
- authExciseNumber = convertErns(request.erns)
- )
-
- def createGetMessagesAuditInfo(
- messages: Seq[Message],
- movement: Movement,
- updatedSince: Option[String],
- traderType: Option[String],
- request: EnrolmentRequest[AnyContent]
- ): GetMessagesAuditInfo = {
- val requestAuditInfo = GetMessagesRequestAuditInfo(movement._id, updatedSince, traderType)
- val messagesAuditInfo = messages.map { msg =>
- val decodedXml = emcsUtils.decode(msg.encodedMessage)
- val decodedXmlNodeList = xml.XML.loadString(decodedXml)
-
- val ieMessage = ieMessageFactory.createFromXml(msg.messageType, decodedXmlNodeList)
- MessageAuditInfo(
- msg.messageId,
- ieMessage.correlationId,
- ieMessage.messageType,
- ieMessage.messageAuditType.name,
- msg.recipient,
- msg.createdOn
- )
- }
- val response = GetMessagesResponseAuditInfo(
- messages.length,
- messagesAuditInfo,
- movement.localReferenceNumber,
- movement.administrativeReferenceCode,
- movement.consignorId,
- movement.consigneeId
- )
- GetMessagesAuditInfo(
- request = requestAuditInfo,
- response = response,
- userDetails = request.userDetails,
- authExciseNumber = convertErns(request.erns)
- )
- }
-
- def createGetSpecificMessageAuditInfo(
- movement: Movement,
- message: Message,
- request: EnrolmentRequest[AnyContent]
- ): GetSpecificMessageAuditInfo = {
- val requestAuditInfo = GetSpecificMessageRequestAuditInfo(movement._id, message.messageId)
- val decodedXml = emcsUtils.decode(message.encodedMessage)
- val decodedXmlNodeList = xml.XML.loadString(decodedXml)
-
- val ieMessage = ieMessageFactory.createFromXml(message.messageType, decodedXmlNodeList)
- val response = GetSpecificMessageResponseAuditInfo(
- ieMessage.correlationId,
- ieMessage.messageType,
- ieMessage.messageAuditType.name,
- movement.localReferenceNumber,
- movement.administrativeReferenceCode,
- movement.consignorId,
- movement.consigneeId
- )
- GetSpecificMessageAuditInfo(
- request = requestAuditInfo,
- response = response,
- userDetails = request.userDetails,
- authExciseNumber = convertErns(request.erns)
- )
- }
-
- def createMessageProcessingSuccessAuditInfo(
- ern: String,
- response: GetMessagesResponse,
- batchId: String,
- jobId: Option[String]
- ): MessageProcessingSuccessAuditInfo = {
-
- val messages =
- response.messages.map(message =>
- MessageProcessingMessageAuditInfo(
- message.messageIdentifier,
- message.correlationId,
- message.messageType,
- message.messageAuditType.name,
- message.optionalLocalReferenceNumber,
- message.administrativeReferenceCode.head,
- message.consignorId,
- message.consigneeId
- )
- )
-
- MessageProcessingSuccessAuditInfo(
- ern,
- response.messageCount,
- response.messages.length,
- messages,
- batchId,
- jobId
- )
- }
-
- def createMessageProcessingFailureAuditInfo(
- ern: String,
- failureReason: String,
- batchId: String,
- jobId: Option[String]
- ): MessageProcessingFailureAuditInfo = MessageProcessingFailureAuditInfo(ern, failureReason, batchId, jobId)
-
- def createMovementSavedSuccessAuditInfo(
- updatedMovement: Movement,
- batchId: Option[String],
- jobId: Option[String],
- newMessages: Seq[Message]
- ): MovementSavedSuccessAuditInfo = {
- val messagePairs = convertToIEMessage(newMessages)
- MovementSavedSuccessAuditInfo(
- newMessages.length,
- updatedMovement.messages.length,
- updatedMovement._id,
- Some(updatedMovement.localReferenceNumber),
- updatedMovement.administrativeReferenceCode,
- updatedMovement.consignorId,
- updatedMovement.consigneeId,
- batchId,
- jobId,
- generateKeyMessageDetailsAuditInfo(messagePairs),
- messagePairs.map(_._2.toJson)
- )
- }
-
- def createMovementSavedFailureAuditInfo(
- movement: Movement,
- failureReason: String,
- batchId: Option[String],
- jobId: Option[String],
- messagesToBeAdded: Seq[Message]
- ): MovementSavedFailureAuditInfo = {
- val messagePairs = convertToIEMessage(movement.messages)
- MovementSavedFailureAuditInfo(
- failureReason,
- messagesToBeAdded.length,
- movement.messages.length,
- movement._id,
- Some(movement.localReferenceNumber),
- movement.administrativeReferenceCode,
- movement.consignorId,
- movement.consigneeId,
- batchId,
- jobId,
- generateKeyMessageDetailsAuditInfo(messagePairs),
- messagePairs.map(_._2.toJson)
- )
- }
- private def generateKeyMessageDetailsAuditInfo(
- messagePairs: Seq[(Message, IEMessage)]
- ): Seq[KeyMessageDetailsAuditInfo] =
- messagePairs.map { pair =>
- val (message, ieMessage) = pair
- val correlationId = ieMessage.correlationId
- KeyMessageDetailsAuditInfo(
- ieMessage.messageIdentifier,
- correlationId,
- ieMessage.messageType,
- ieMessage.messageAuditType.name,
- message.recipient
- )
- }
-
- private def convertToIEMessage(messages: Seq[Message]): Seq[(Message, IEMessage)] =
- messages.map { message =>
- val decodedXml = emcsUtils.decode(message.encodedMessage)
- val decodedXmlNodeList = xml.XML.loadString(decodedXml)
- val ieMessage = ieMessageFactory.createFromXml(message.messageType, decodedXmlNodeList)
- (message, ieMessage)
- }
-
- def createMessageAcknowledgedEvent(
- ern: String,
- batchId: String,
- jobId: Option[String],
- recordsAffected: Int
- ): MessageAcknowledgedSuccessAuditInfo =
- MessageAcknowledgedSuccessAuditInfo(batchId, jobId, ern, recordsAffected)
-
- def createMessageNotAcknowledgedEvent(
- ern: String,
- batchId: String,
- jobId: Option[String],
- failureReason: String
- ): MessageAcknowledgedFailureAuditInfo =
- MessageAcknowledgedFailureAuditInfo(failureReason, batchId, jobId, ern)
- private def convertErns(erns: Set[String]): NonEmptySeq[String] = NonEmptySeq(erns.head, erns.tail.toSeq)
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE704MessageV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE704Message.scala
similarity index 79%
rename from app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE704MessageV1.scala
rename to app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE704Message.scala
index fba2742f8..efa80a6f0 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE704MessageV1.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE704Message.scala
@@ -14,27 +14,25 @@
* limitations under the License.
*/
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1
+package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
-import generated.v1
-import generated.v1.{IE704Type, MessagesOption}
+import generated.{IE704Type, MessagesOption}
import play.api.libs.json.{JsObject, JsValue, Json}
import scalaxb.DataRecord
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.Refused
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats.GeneratedJsonWriters
import scala.xml.NodeSeq
-case class IE704MessageV1(
+case class IE704Message(
obj: IE704Type,
key: Option[String],
namespace: Option[String],
messageAuditType: MessageAuditType
) extends IEMessage
- with GeneratedJsonWritersV1 {
+ with GeneratedJsonWriters {
override def consigneeId: Option[String] = None
override def consignorId: Option[String] = None
@@ -49,7 +47,7 @@ case class IE704MessageV1(
override def messageIdentifier: String = obj.Header.MessageIdentifier
override def toXml: NodeSeq =
- scalaxb.toXML[IE704Type](obj, namespace, key, v1.defaultScope)
+ scalaxb.toXML[IE704Type](obj, namespace, key, generated.defaultScope)
override def toJson: JsValue = Json.toJson(obj)
@@ -72,12 +70,12 @@ case class IE704MessageV1(
def correlationId = obj.Header.CorrelationIdentifier
}
-object IE704MessageV1 {
- def apply(message: DataRecord[MessagesOption]): IE704MessageV1 =
- IE704MessageV1(message.as[IE704Type], message.key, message.namespace, Refused)
+object IE704Message {
+ def apply(message: DataRecord[MessagesOption]): IE704Message =
+ IE704Message(message.as[IE704Type], message.key, message.namespace, Refused)
- def createFromXml(xml: NodeSeq): IE704MessageV1 = {
+ def createFromXml(xml: NodeSeq): IE704Message = {
val ie704: IE704Type = scalaxb.fromXML[IE704Type](xml)
- IE704MessageV1(ie704, Some(xml.head.label), Option(xml.head.namespace), Refused)
+ IE704Message(ie704, Some(xml.head.label), Option(xml.head.namespace), Refused)
}
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE801MessageV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE801Message.scala
similarity index 79%
rename from app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE801MessageV1.scala
rename to app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE801Message.scala
index 5d585ee73..1ed38d92a 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE801MessageV1.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE801Message.scala
@@ -14,27 +14,25 @@
* limitations under the License.
*/
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1
+package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
-import generated.v1
-import generated.v1.{IE801Type, MessagesOption}
+import generated.{IE801Type, MessagesOption}
import play.api.libs.json.{JsObject, JsValue, Json}
import scalaxb.DataRecord
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.MovementGenerated
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats.GeneratedJsonWriters
import scala.xml.NodeSeq
-case class IE801MessageV1(
+case class IE801Message(
obj: IE801Type,
key: Option[String],
namespace: Option[String],
messageAuditType: MessageAuditType
) extends IEMessage
- with GeneratedJsonWritersV1 {
+ with GeneratedJsonWriters {
def localReferenceNumber: String =
obj.Body.EADESADContainer.EadEsad.LocalReferenceNumber
@@ -52,7 +50,7 @@ case class IE801MessageV1(
override def messageType: String = MessageTypes.IE801.value
override def toXml: NodeSeq =
- scalaxb.toXML[IE801Type](obj, namespace, key, v1.defaultScope)
+ scalaxb.toXML[IE801Type](obj, namespace, key, generated.defaultScope)
override def toJson: JsValue = Json.toJson(obj)
@@ -68,12 +66,12 @@ case class IE801MessageV1(
override def correlationId: Option[String] = obj.Header.CorrelationIdentifier
}
-object IE801MessageV1 {
- def apply(message: DataRecord[MessagesOption]): IE801MessageV1 =
- IE801MessageV1(message.as[IE801Type], message.key, message.namespace, MovementGenerated)
+object IE801Message {
+ def apply(message: DataRecord[MessagesOption]): IE801Message =
+ IE801Message(message.as[IE801Type], message.key, message.namespace, MovementGenerated)
- def createFromXml(xml: NodeSeq): IE801MessageV1 = {
+ def createFromXml(xml: NodeSeq): IE801Message = {
val ie801: IE801Type = scalaxb.fromXML[IE801Type](xml)
- IE801MessageV1(ie801, Some(xml.head.label), Option(xml.head.namespace), MovementGenerated)
+ IE801Message(ie801, Some(xml.head.label), Option(xml.head.namespace), MovementGenerated)
}
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE802MessageV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE802Message.scala
similarity index 77%
rename from app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE802MessageV1.scala
rename to app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE802Message.scala
index 986581624..5d98ef1bb 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE802MessageV1.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE802Message.scala
@@ -14,27 +14,25 @@
* limitations under the License.
*/
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1
+package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
-import generated.v1
-import generated.v1.{IE802Type, MessagesOption}
+import generated.{IE802Type, MessagesOption}
import play.api.libs.json.{JsObject, JsValue, Json}
import scalaxb.DataRecord
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.Reminder
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats.GeneratedJsonWriters
import scala.xml.NodeSeq
-case class IE802MessageV1(
+case class IE802Message(
obj: IE802Type,
key: Option[String],
namespace: Option[String],
messageAuditType: MessageAuditType
) extends IEMessage
- with GeneratedJsonWritersV1 {
+ with GeneratedJsonWriters {
def consignorId: Option[String] = None
def consigneeId: Option[String] = None
@@ -43,7 +41,7 @@ case class IE802MessageV1(
Seq(Some(obj.Body.ReminderMessageForExciseMovement.ExciseMovement.AdministrativeReferenceCode))
override def toXml: NodeSeq =
- scalaxb.toXML[IE802Type](obj, namespace, key, v1.defaultScope)
+ scalaxb.toXML[IE802Type](obj, namespace, key, generated.defaultScope)
override def toJson: JsValue = Json.toJson(obj)
@@ -63,12 +61,12 @@ case class IE802MessageV1(
def optionalLocalReferenceNumber: Option[String] = None
}
-object IE802MessageV1 {
- def apply(message: DataRecord[MessagesOption]): IE802MessageV1 =
- IE802MessageV1(message.as[IE802Type], message.key, message.namespace, Reminder)
+object IE802Message {
+ def apply(message: DataRecord[MessagesOption]): IE802Message =
+ IE802Message(message.as[IE802Type], message.key, message.namespace, Reminder)
- def createFromXml(xml: NodeSeq): IE802MessageV1 = {
+ def createFromXml(xml: NodeSeq): IE802Message = {
val ie802: IE802Type = scalaxb.fromXML[IE802Type](xml)
- IE802MessageV1(ie802, Some(xml.head.label), Option(xml.head.namespace), Reminder)
+ IE802Message(ie802, Some(xml.head.label), Option(xml.head.namespace), Reminder)
}
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE803MessageV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE803Message.scala
similarity index 76%
rename from app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE803MessageV2.scala
rename to app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE803Message.scala
index 47317827d..d056dea35 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE803MessageV2.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE803Message.scala
@@ -14,27 +14,25 @@
* limitations under the License.
*/
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2
+package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
-import generated.v2
-import generated.v2.{IE803Type, MessagesOption}
+import generated.{IE803Type, MessagesOption}
import play.api.libs.json.{JsObject, JsValue, Json}
import scalaxb.DataRecord
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.NotificationOfDivertedMovement
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.MessageTypeFormats.GeneratedJsonWritersV2
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats.GeneratedJsonWriters
import scala.xml.NodeSeq
-case class IE803MessageV2(
+case class IE803Message(
obj: IE803Type,
key: Option[String],
namespace: Option[String],
messageAuditType: MessageAuditType
) extends IEMessage
- with GeneratedJsonWritersV2 {
+ with GeneratedJsonWriters {
override def consignorId: Option[String] = None
override def consigneeId: Option[String] = None
@@ -43,7 +41,7 @@ case class IE803MessageV2(
Seq(Some(obj.Body.NotificationOfDivertedEADESAD.ExciseNotification.AdministrativeReferenceCode))
override def toXml: NodeSeq =
- scalaxb.toXML[IE803Type](obj, namespace, key, v2.defaultScope)
+ scalaxb.toXML[IE803Type](obj, namespace, key, generated.defaultScope)
override def toJson: JsValue = Json.toJson(obj)
@@ -63,12 +61,12 @@ case class IE803MessageV2(
def optionalLocalReferenceNumber: Option[String] = None
}
-object IE803MessageV2 {
- def apply(message: DataRecord[MessagesOption]): IE803MessageV2 =
- IE803MessageV2(message.as[IE803Type], message.key, message.namespace, NotificationOfDivertedMovement)
+object IE803Message {
+ def apply(message: DataRecord[MessagesOption]): IE803Message =
+ IE803Message(message.as[IE803Type], message.key, message.namespace, NotificationOfDivertedMovement)
- def createFromXml(xml: NodeSeq): IE803MessageV2 = {
+ def createFromXml(xml: NodeSeq): IE803Message = {
val ie803: IE803Type = scalaxb.fromXML[IE803Type](xml)
- IE803MessageV2(ie803, Some(xml.head.label), Option(xml.head.namespace), NotificationOfDivertedMovement)
+ IE803Message(ie803, Some(xml.head.label), Option(xml.head.namespace), NotificationOfDivertedMovement)
}
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE807MessageV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE807Message.scala
similarity index 76%
rename from app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE807MessageV1.scala
rename to app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE807Message.scala
index 9887f6c32..8922d6425 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE807MessageV1.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE807Message.scala
@@ -14,27 +14,25 @@
* limitations under the License.
*/
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1
+package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
-import generated.v1
-import generated.v1.{IE807Type, MessagesOption}
+import generated.{IE807Type, MessagesOption}
import play.api.libs.json.{JsObject, JsValue, Json}
import scalaxb.DataRecord
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.InterruptionOfMovement
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats.GeneratedJsonWriters
import scala.xml.NodeSeq
-case class IE807MessageV1(
+case class IE807Message(
obj: IE807Type,
key: Option[String],
namespace: Option[String],
messageAuditType: MessageAuditType
) extends IEMessage
- with GeneratedJsonWritersV1 {
+ with GeneratedJsonWriters {
override def consignorId: Option[String] = None
override def consigneeId: Option[String] = None
@@ -43,7 +41,7 @@ case class IE807MessageV1(
Seq(Some(obj.Body.InterruptionOfMovement.AttributesValue.AdministrativeReferenceCode))
override def toXml: NodeSeq =
- scalaxb.toXML[IE807Type](obj, namespace, key, v1.defaultScope)
+ scalaxb.toXML[IE807Type](obj, namespace, key, generated.defaultScope)
override def toJson: JsValue = Json.toJson(obj)
@@ -63,12 +61,12 @@ case class IE807MessageV1(
def optionalLocalReferenceNumber: Option[String] = None
}
-object IE807MessageV1 {
- def apply(message: DataRecord[MessagesOption]): IE807MessageV1 =
- IE807MessageV1(message.as[IE807Type], message.key, message.namespace, InterruptionOfMovement)
+object IE807Message {
+ def apply(message: DataRecord[MessagesOption]): IE807Message =
+ IE807Message(message.as[IE807Type], message.key, message.namespace, InterruptionOfMovement)
- def createFromXml(xml: NodeSeq): IE807MessageV1 = {
+ def createFromXml(xml: NodeSeq): IE807Message = {
val ie807: IE807Type = scalaxb.fromXML[IE807Type](xml)
- IE807MessageV1(ie807, Some(xml.head.label), Option(xml.head.namespace), InterruptionOfMovement)
+ IE807Message(ie807, Some(xml.head.label), Option(xml.head.namespace), InterruptionOfMovement)
}
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE810MessageV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE810Message.scala
similarity index 76%
rename from app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE810MessageV1.scala
rename to app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE810Message.scala
index 2d7a9157d..7894bfae6 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE810MessageV1.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE810Message.scala
@@ -14,27 +14,25 @@
* limitations under the License.
*/
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1
+package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
-import generated.v1
-import generated.v1.{IE810Type, MessagesOption}
+import generated.{IE810Type, MessagesOption}
import play.api.libs.json.{JsObject, JsValue, Json}
import scalaxb.DataRecord
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.CancelMovement
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats.GeneratedJsonWriters
import scala.xml.NodeSeq
-case class IE810MessageV1(
+case class IE810Message(
obj: IE810Type,
key: Option[String],
namespace: Option[String],
messageAuditType: MessageAuditType
) extends IEMessage
- with GeneratedJsonWritersV1 {
+ with GeneratedJsonWriters {
override def consignorId: Option[String] = None
@@ -46,7 +44,7 @@ case class IE810MessageV1(
override def messageType: String = MessageTypes.IE810.value
override def toXml: NodeSeq =
- scalaxb.toXML[IE810Type](obj, namespace, key, v1.defaultScope)
+ scalaxb.toXML[IE810Type](obj, namespace, key, generated.defaultScope)
override def toJson: JsValue = Json.toJson(obj)
@@ -64,12 +62,12 @@ case class IE810MessageV1(
def optionalLocalReferenceNumber: Option[String] = None
}
-object IE810MessageV1 {
- def apply(message: DataRecord[MessagesOption]): IE810MessageV1 =
- IE810MessageV1(message.as[IE810Type], message.key, message.namespace, CancelMovement)
+object IE810Message {
+ def apply(message: DataRecord[MessagesOption]): IE810Message =
+ IE810Message(message.as[IE810Type], message.key, message.namespace, CancelMovement)
- def createFromXml(xml: NodeSeq): IE810MessageV1 = {
+ def createFromXml(xml: NodeSeq): IE810Message = {
val ie810: IE810Type = scalaxb.fromXML[IE810Type](xml)
- IE810MessageV1(ie810, Some(xml.head.label), Option(xml.head.namespace), CancelMovement)
+ IE810Message(ie810, Some(xml.head.label), Option(xml.head.namespace), CancelMovement)
}
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE813MessageV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE813Message.scala
similarity index 77%
rename from app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE813MessageV1.scala
rename to app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE813Message.scala
index 9680e2ac2..45899483b 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE813MessageV1.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE813Message.scala
@@ -14,27 +14,25 @@
* limitations under the License.
*/
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1
+package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
-import generated.v1
-import generated.v1.{IE813Type, MessagesOption}
+import generated.{IE813Type, MessagesOption}
import play.api.libs.json.{JsObject, JsValue, Json}
import scalaxb.DataRecord
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.ChangeOfDestination
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats.GeneratedJsonWriters
import scala.xml.NodeSeq
-case class IE813MessageV1(
+case class IE813Message(
obj: IE813Type,
key: Option[String],
namespace: Option[String],
messageAuditType: MessageAuditType
) extends IEMessage
- with GeneratedJsonWritersV1 {
+ with GeneratedJsonWriters {
override def consignorId: Option[String] = None
@@ -47,7 +45,7 @@ case class IE813MessageV1(
override def messageType: String = MessageTypes.IE813.value
override def toXml: NodeSeq =
- scalaxb.toXML[IE813Type](obj, namespace, key, v1.defaultScope)
+ scalaxb.toXML[IE813Type](obj, namespace, key, generated.defaultScope)
override def toJson: JsValue = Json.toJson(obj)
@@ -65,12 +63,12 @@ case class IE813MessageV1(
def optionalLocalReferenceNumber: Option[String] = None
}
-object IE813MessageV1 {
- def apply(message: DataRecord[MessagesOption]): IE813MessageV1 =
- IE813MessageV1(message.as[IE813Type], message.key, message.namespace, ChangeOfDestination)
+object IE813Message {
+ def apply(message: DataRecord[MessagesOption]): IE813Message =
+ IE813Message(message.as[IE813Type], message.key, message.namespace, ChangeOfDestination)
- def createFromXml(xml: NodeSeq): IE813MessageV1 = {
+ def createFromXml(xml: NodeSeq): IE813Message = {
val ie813: IE813Type = scalaxb.fromXML[IE813Type](xml)
- IE813MessageV1(ie813, Some(xml.head.label), Option(xml.head.namespace), ChangeOfDestination)
+ IE813Message(ie813, Some(xml.head.label), Option(xml.head.namespace), ChangeOfDestination)
}
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE815MessageV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE815Message.scala
similarity index 81%
rename from app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE815MessageV1.scala
rename to app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE815Message.scala
index 1004498f6..54dc90ca5 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE815MessageV1.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE815Message.scala
@@ -14,22 +14,20 @@
* limitations under the License.
*/
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1
+package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
-import generated.v1
-import generated.v1.IE815Type
+import generated.IE815Type
import play.api.libs.json.{JsObject, JsValue, Json}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.DraftMovement
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats.GeneratedJsonWriters
import scala.xml.NodeSeq
-case class IE815MessageV1(obj: IE815Type, messageAuditType: MessageAuditType)
+case class IE815Message(obj: IE815Type, messageAuditType: MessageAuditType)
extends IEMessage
- with GeneratedJsonWritersV1 {
+ with GeneratedJsonWriters {
def localReferenceNumber: String =
obj.Body.SubmittedDraftOfEADESAD.EadEsadDraft.LocalReferenceNumber
@@ -48,7 +46,7 @@ case class IE815MessageV1(obj: IE815Type, messageAuditType: MessageAuditType)
override def messageType: String = MessageTypes.IE815.value
override def toXml: NodeSeq =
- scalaxb.toXML[IE815Type](obj, MessageTypes.IE815.value, v1.defaultScope)
+ scalaxb.toXML[IE815Type](obj, MessageTypes.IE815.value, generated.defaultScope)
override def toJson: JsValue = Json.toJson(obj)
@@ -63,8 +61,8 @@ case class IE815MessageV1(obj: IE815Type, messageAuditType: MessageAuditType)
def correlationId = obj.Header.CorrelationIdentifier
}
-object IE815MessageV1 {
- def createFromXml(xml: NodeSeq): IE815MessageV1 =
- IE815MessageV1(scalaxb.fromXML[IE815Type](xml), DraftMovement)
+object IE815Message {
+ def createFromXml(xml: NodeSeq): IE815Message =
+ IE815Message(scalaxb.fromXML[IE815Type](xml), DraftMovement)
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE818MessageV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE818Message.scala
similarity index 77%
rename from app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE818MessageV1.scala
rename to app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE818Message.scala
index e23d6e86b..432186756 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE818MessageV1.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE818Message.scala
@@ -14,27 +14,25 @@
* limitations under the License.
*/
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1
+package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
-import generated.v1
-import generated.v1.{IE818Type, MessagesOption}
+import generated.{IE818Type, MessagesOption}
import play.api.libs.json.{JsObject, JsValue, Json}
import scalaxb.DataRecord
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.ReportOfReceipt
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats.GeneratedJsonWriters
import scala.xml.NodeSeq
-case class IE818MessageV1(
+case class IE818Message(
obj: IE818Type,
key: Option[String],
namespace: Option[String],
messageAuditType: MessageAuditType
) extends IEMessage
- with GeneratedJsonWritersV1 {
+ with GeneratedJsonWriters {
override def consignorId: Option[String] = None
override def consigneeId: Option[String] =
@@ -46,7 +44,7 @@ case class IE818MessageV1(
override def messageType: String = MessageTypes.IE818.value
override def toXml: NodeSeq =
- scalaxb.toXML[IE818Type](obj, namespace, key, v1.defaultScope)
+ scalaxb.toXML[IE818Type](obj, namespace, key, generated.defaultScope)
override def toJson: JsValue = Json.toJson(obj)
@@ -64,12 +62,12 @@ case class IE818MessageV1(
def optionalLocalReferenceNumber: Option[String] = None
}
-object IE818MessageV1 {
- def apply(message: DataRecord[MessagesOption]): IE818MessageV1 =
- IE818MessageV1(message.as[IE818Type], message.key, message.namespace, ReportOfReceipt)
+object IE818Message {
+ def apply(message: DataRecord[MessagesOption]): IE818Message =
+ IE818Message(message.as[IE818Type], message.key, message.namespace, ReportOfReceipt)
- def createFromXml(xml: NodeSeq): IE818MessageV1 = {
+ def createFromXml(xml: NodeSeq): IE818Message = {
val ie818: IE818Type = scalaxb.fromXML[IE818Type](xml)
- IE818MessageV1(ie818, Some(xml.head.label), Option(xml.head.namespace), ReportOfReceipt)
+ IE818Message(ie818, Some(xml.head.label), Option(xml.head.namespace), ReportOfReceipt)
}
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE819MessageV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE819Message.scala
similarity index 77%
rename from app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE819MessageV2.scala
rename to app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE819Message.scala
index 1fd8123cb..e5aafdedc 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE819MessageV2.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE819Message.scala
@@ -14,27 +14,25 @@
* limitations under the License.
*/
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2
+package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
-import generated.v2
-import generated.v2.{IE819Type, MessagesOption}
+import generated.{IE819Type, MessagesOption}
import play.api.libs.json.{JsObject, JsValue, Json}
import scalaxb.DataRecord
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.AlertRejection
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.MessageTypeFormats.GeneratedJsonWritersV2
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats.GeneratedJsonWriters
import scala.xml.NodeSeq
-case class IE819MessageV2(
+case class IE819Message(
obj: IE819Type,
key: Option[String],
namespace: Option[String],
messageAuditType: MessageAuditType
) extends IEMessage
- with GeneratedJsonWritersV2 {
+ with GeneratedJsonWriters {
override def consignorId: Option[String] = None
override def consigneeId: Option[String] =
@@ -46,7 +44,7 @@ case class IE819MessageV2(
override def messageType: String = MessageTypes.IE819.value
override def toXml: NodeSeq =
- scalaxb.toXML[IE819Type](obj, namespace, key, v2.defaultScope)
+ scalaxb.toXML[IE819Type](obj, namespace, key, generated.defaultScope)
override def toJson: JsValue = Json.toJson(obj)
override def toJsObject: JsObject = Json.toJsObject(obj)
@@ -63,12 +61,12 @@ case class IE819MessageV2(
def optionalLocalReferenceNumber: Option[String] = None
}
-object IE819MessageV2 {
- def apply(message: DataRecord[MessagesOption]): IE819MessageV2 =
- IE819MessageV2(message.as[IE819Type], message.key, message.namespace, AlertRejection)
+object IE819Message {
+ def apply(message: DataRecord[MessagesOption]): IE819Message =
+ IE819Message(message.as[IE819Type], message.key, message.namespace, AlertRejection)
- def createFromXml(xml: NodeSeq): IE819MessageV2 = {
+ def createFromXml(xml: NodeSeq): IE819Message = {
val ie819: IE819Type = scalaxb.fromXML[IE819Type](xml)
- IE819MessageV2(ie819, Some(xml.head.label), Option(xml.head.namespace), AlertRejection)
+ IE819Message(ie819, Some(xml.head.label), Option(xml.head.namespace), AlertRejection)
}
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE829MessageV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE829Message.scala
similarity index 77%
rename from app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE829MessageV2.scala
rename to app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE829Message.scala
index 77c23942c..46945f5bb 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE829MessageV2.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE829Message.scala
@@ -14,27 +14,25 @@
* limitations under the License.
*/
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2
+package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
-import generated.v2
-import generated.v2.{IE829Type, MessagesOption}
+import generated.{IE829Type, MessagesOption}
import play.api.libs.json.{JsObject, JsValue, Json}
import scalaxb.DataRecord
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.NotificationOfAcceptedExport
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.MessageTypeFormats.GeneratedJsonWritersV2
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats.GeneratedJsonWriters
import scala.xml.NodeSeq
-case class IE829MessageV2(
+case class IE829Message(
obj: IE829Type,
key: Option[String],
namespace: Option[String],
messageAuditType: MessageAuditType
) extends IEMessage
- with GeneratedJsonWritersV2 {
+ with GeneratedJsonWriters {
override def consignorId: Option[String] = None
@@ -47,7 +45,7 @@ case class IE829MessageV2(
override def messageType: String = MessageTypes.IE829.value
override def toXml: NodeSeq =
- scalaxb.toXML[IE829Type](obj, namespace, key, v2.defaultScope)
+ scalaxb.toXML[IE829Type](obj, namespace, key, generated.defaultScope)
override def toJson: JsValue = Json.toJson(obj)
override def toJsObject: JsObject = Json.toJsObject(obj)
@@ -64,12 +62,12 @@ case class IE829MessageV2(
def optionalLocalReferenceNumber: Option[String] = None
}
-object IE829MessageV2 {
- def apply(message: DataRecord[MessagesOption]): IE829MessageV2 =
- IE829MessageV2(message.as[IE829Type], message.key, message.namespace, NotificationOfAcceptedExport)
+object IE829Message {
+ def apply(message: DataRecord[MessagesOption]): IE829Message =
+ IE829Message(message.as[IE829Type], message.key, message.namespace, NotificationOfAcceptedExport)
- def createFromXml(xml: NodeSeq): IE829MessageV2 = {
+ def createFromXml(xml: NodeSeq): IE829Message = {
val ie829: IE829Type = scalaxb.fromXML[IE829Type](xml)
- IE829MessageV2(ie829, Some(xml.head.label), Option(xml.head.namespace), NotificationOfAcceptedExport)
+ IE829Message(ie829, Some(xml.head.label), Option(xml.head.namespace), NotificationOfAcceptedExport)
}
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE837MessageV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE837Message.scala
similarity index 77%
rename from app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE837MessageV2.scala
rename to app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE837Message.scala
index 5b83cb2c9..5d7393d77 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE837MessageV2.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE837Message.scala
@@ -14,29 +14,27 @@
* limitations under the License.
*/
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2
+package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
-import generated.v2
-import generated.v2.{IE837Type, MessagesOption}
+import generated.{IE837Type, MessagesOption}
import play.api.libs.json.{JsObject, JsValue, Json}
import scalaxb.DataRecord
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.Delay
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{Consignee, Consignor, ExciseTraderType, IEMessage, SubmitterTypeConverter}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.MessageTypeFormats.GeneratedJsonWritersV2
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats.GeneratedJsonWriters
import scala.xml.NodeSeq
-case class IE837MessageV2(
+case class IE837Message(
obj: IE837Type,
key: Option[String],
namespace: Option[String],
messageAuditType: MessageAuditType
) extends IEMessage
with SubmitterTypeConverter
- with GeneratedJsonWritersV2 {
- def submitter: ExciseTraderType = convertSubmitterTypeV2(
+ with GeneratedJsonWriters {
+ def submitter: ExciseTraderType = convertSubmitterType(
obj.Body.ExplanationOnDelayForDelivery.AttributesValue.SubmitterType
)
@@ -56,7 +54,7 @@ case class IE837MessageV2(
override def messageType: String = MessageTypes.IE837.value
override def toXml: NodeSeq =
- scalaxb.toXML[IE837Type](obj, namespace, key, v2.defaultScope)
+ scalaxb.toXML[IE837Type](obj, namespace, key, generated.defaultScope)
override def toJson: JsValue = Json.toJson(obj)
@@ -74,12 +72,12 @@ case class IE837MessageV2(
def optionalLocalReferenceNumber: Option[String] = None
}
-object IE837MessageV2 {
- def apply(message: DataRecord[MessagesOption]): IE837MessageV2 =
- IE837MessageV2(message.as[IE837Type], message.key, message.namespace, Delay)
+object IE837Message {
+ def apply(message: DataRecord[MessagesOption]): IE837Message =
+ IE837Message(message.as[IE837Type], message.key, message.namespace, Delay)
- def createFromXml(xml: NodeSeq): IE837MessageV2 = {
+ def createFromXml(xml: NodeSeq): IE837Message = {
val ie837: IE837Type = scalaxb.fromXML[IE837Type](xml)
- IE837MessageV2(ie837, Some(xml.head.label), Option(xml.head.namespace), Delay)
+ IE837Message(ie837, Some(xml.head.label), Option(xml.head.namespace), Delay)
}
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE839MessageV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE839Message.scala
similarity index 78%
rename from app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE839MessageV2.scala
rename to app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE839Message.scala
index 39e6016b8..28a2c12f1 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE839MessageV2.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE839Message.scala
@@ -14,27 +14,25 @@
* limitations under the License.
*/
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2
+package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
-import generated.v2
-import generated.v2.{IE839Type, MessagesOption}
+import generated.{IE839Type, MessagesOption}
import play.api.libs.json.{JsObject, JsValue, Json}
import scalaxb.DataRecord
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.RefusalByCustoms
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.MessageTypeFormats.GeneratedJsonWritersV2
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats.GeneratedJsonWriters
import scala.xml.NodeSeq
-case class IE839MessageV2(
+case class IE839Message(
obj: IE839Type,
key: Option[String],
namespace: Option[String],
messageAuditType: MessageAuditType
) extends IEMessage
- with GeneratedJsonWritersV2 {
+ with GeneratedJsonWriters {
def localReferenceNumber: Option[String] =
obj.Body.RefusalByCustoms.NEadSub.map(_.LocalReferenceNumber)
@@ -51,7 +49,7 @@ case class IE839MessageV2(
override def messageType: String = MessageTypes.IE839.value
override def toXml: NodeSeq =
- scalaxb.toXML[IE839Type](obj, namespace, key, v2.defaultScope)
+ scalaxb.toXML[IE839Type](obj, namespace, key, generated.defaultScope)
override def toJson: JsValue = Json.toJson(obj)
override def toJsObject: JsObject = Json.toJsObject(obj)
@@ -66,12 +64,12 @@ case class IE839MessageV2(
override def correlationId: Option[String] = obj.Header.CorrelationIdentifier
}
-object IE839MessageV2 {
- def apply(message: DataRecord[MessagesOption]): IE839MessageV2 =
- IE839MessageV2(message.as[IE839Type], message.key, message.namespace, RefusalByCustoms)
+object IE839Message {
+ def apply(message: DataRecord[MessagesOption]): IE839Message =
+ IE839Message(message.as[IE839Type], message.key, message.namespace, RefusalByCustoms)
- def createFromXml(xml: NodeSeq): IE839MessageV2 = {
+ def createFromXml(xml: NodeSeq): IE839Message = {
val ie839: IE839Type = scalaxb.fromXML[IE839Type](xml)
- IE839MessageV2(ie839, Some(xml.head.label), Option(xml.head.namespace), RefusalByCustoms)
+ IE839Message(ie839, Some(xml.head.label), Option(xml.head.namespace), RefusalByCustoms)
}
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE840MessageV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE840Message.scala
similarity index 77%
rename from app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE840MessageV2.scala
rename to app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE840Message.scala
index 43a93e441..8e04a3440 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE840MessageV2.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE840Message.scala
@@ -14,27 +14,25 @@
* limitations under the License.
*/
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2
+package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
-import generated.v2
-import generated.v2.{IE840Type, MessagesOption}
+import generated.{IE840Type, MessagesOption}
import play.api.libs.json.{JsObject, JsValue, Json}
import scalaxb.DataRecord
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.EventReport
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.MessageTypeFormats.GeneratedJsonWritersV2
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats.GeneratedJsonWriters
import scala.xml.NodeSeq
-case class IE840MessageV2(
+case class IE840Message(
obj: IE840Type,
key: Option[String],
namespace: Option[String],
messageAuditType: MessageAuditType
) extends IEMessage
- with GeneratedJsonWritersV2 {
+ with GeneratedJsonWriters {
override def consigneeId: Option[String] = None
override def consignorId: Option[String] = None
@@ -45,7 +43,7 @@ case class IE840MessageV2(
override def messageType: String = MessageTypes.IE840.value
override def toXml: NodeSeq =
- scalaxb.toXML[IE840Type](obj, namespace, key, v2.defaultScope)
+ scalaxb.toXML[IE840Type](obj, namespace, key, generated.defaultScope)
override def toJson: JsValue = Json.toJson(obj)
override def toJsObject: JsObject = Json.toJsObject(obj)
@@ -62,12 +60,12 @@ case class IE840MessageV2(
override def optionalLocalReferenceNumber: Option[String] = None
}
-object IE840MessageV2 {
- def apply(message: DataRecord[MessagesOption]): IE840MessageV2 =
- IE840MessageV2(message.as[IE840Type], message.key, message.namespace, EventReport)
+object IE840Message {
+ def apply(message: DataRecord[MessagesOption]): IE840Message =
+ IE840Message(message.as[IE840Type], message.key, message.namespace, EventReport)
- def createFromXml(xml: NodeSeq): IE840MessageV2 = {
+ def createFromXml(xml: NodeSeq): IE840Message = {
val ie840: IE840Type = scalaxb.fromXML[IE840Type](xml)
- IE840MessageV2(ie840, Some(xml.head.label), Option(xml.head.namespace), EventReport)
+ IE840Message(ie840, Some(xml.head.label), Option(xml.head.namespace), EventReport)
}
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE871MessageV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE871Message.scala
similarity index 77%
rename from app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE871MessageV2.scala
rename to app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE871Message.scala
index 30964e04c..35abbcdb8 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE871MessageV2.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE871Message.scala
@@ -14,29 +14,27 @@
* limitations under the License.
*/
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2
+package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
-import generated.v2
-import generated.v2.{IE871Type, MessagesOption}
+import generated.{IE871Type, MessagesOption}
import play.api.libs.json.{JsObject, JsValue, Json}
import scalaxb.DataRecord
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.ShortageOrExcess
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{ExciseTraderType, IEMessage, SubmitterTypeConverter}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.MessageTypeFormats.GeneratedJsonWritersV2
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats.GeneratedJsonWriters
import scala.xml.NodeSeq
-case class IE871MessageV2(
+case class IE871Message(
obj: IE871Type,
key: Option[String],
namespace: Option[String],
messageAuditType: MessageAuditType
) extends IEMessage
with SubmitterTypeConverter
- with GeneratedJsonWritersV2 {
- def submitter: ExciseTraderType = convertSubmitterTypeV2(
+ with GeneratedJsonWriters {
+ def submitter: ExciseTraderType = convertSubmitterType(
obj.Body.ExplanationOnReasonForShortage.AttributesValue.SubmitterType
)
def optionalLocalReferenceNumber: Option[String] = None
@@ -53,7 +51,7 @@ case class IE871MessageV2(
override def messageType: String = MessageTypes.IE871.value
override def toXml: NodeSeq =
- scalaxb.toXML[IE871Type](obj, namespace, key, v2.defaultScope)
+ scalaxb.toXML[IE871Type](obj, namespace, key, generated.defaultScope)
override def toJson: JsValue = Json.toJson(obj)
@@ -69,12 +67,12 @@ case class IE871MessageV2(
override def correlationId: Option[String] = obj.Header.CorrelationIdentifier
}
-object IE871MessageV2 {
- def apply(message: DataRecord[MessagesOption]): IE871MessageV2 =
- IE871MessageV2(message.as[IE871Type], message.key, message.namespace, ShortageOrExcess)
+object IE871Message {
+ def apply(message: DataRecord[MessagesOption]): IE871Message =
+ IE871Message(message.as[IE871Type], message.key, message.namespace, ShortageOrExcess)
- def createFromXml(xml: NodeSeq): IE871MessageV2 = {
+ def createFromXml(xml: NodeSeq): IE871Message = {
val ie871: IE871Type = scalaxb.fromXML[IE871Type](xml)
- IE871MessageV2(ie871, Some(xml.head.label), Option(xml.head.namespace), ShortageOrExcess)
+ IE871Message(ie871, Some(xml.head.label), Option(xml.head.namespace), ShortageOrExcess)
}
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE881MessageV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE881Message.scala
similarity index 77%
rename from app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE881MessageV2.scala
rename to app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE881Message.scala
index c9753fc8f..469ed9689 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE881MessageV2.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE881Message.scala
@@ -14,27 +14,25 @@
* limitations under the License.
*/
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2
+package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
-import generated.v2
-import generated.v2.{IE881Type, MessagesOption}
+import generated.{IE881Type, MessagesOption}
import play.api.libs.json.{JsObject, JsValue, Json}
import scalaxb.DataRecord
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.ManualClosure
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.MessageTypeFormats.GeneratedJsonWritersV2
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats.GeneratedJsonWriters
import scala.xml.NodeSeq
-case class IE881MessageV2(
+case class IE881Message(
obj: IE881Type,
key: Option[String],
namespace: Option[String],
messageAuditType: MessageAuditType
) extends IEMessage
- with GeneratedJsonWritersV2 {
+ with GeneratedJsonWriters {
override def consigneeId: Option[String] = None
@@ -46,7 +44,7 @@ case class IE881MessageV2(
override def messageType: String = MessageTypes.IE881.value
override def toXml: NodeSeq =
- scalaxb.toXML[IE881Type](obj, namespace, key, v2.defaultScope)
+ scalaxb.toXML[IE881Type](obj, namespace, key, generated.defaultScope)
override def toJson: JsValue = Json.toJson(obj)
override def toJsObject: JsObject = Json.toJsObject(obj)
@@ -63,12 +61,12 @@ case class IE881MessageV2(
override def optionalLocalReferenceNumber: Option[String] = None
}
-object IE881MessageV2 {
- def apply(message: DataRecord[MessagesOption]): IE881MessageV2 =
- IE881MessageV2(message.as[IE881Type], message.key, message.namespace, ManualClosure)
+object IE881Message {
+ def apply(message: DataRecord[MessagesOption]): IE881Message =
+ IE881Message(message.as[IE881Type], message.key, message.namespace, ManualClosure)
- def createFromXml(xml: NodeSeq): IE881MessageV2 = {
+ def createFromXml(xml: NodeSeq): IE881Message = {
val ie881: IE881Type = scalaxb.fromXML[IE881Type](xml)
- IE881MessageV2(ie881, Some(xml.head.label), Option(xml.head.namespace), ManualClosure)
+ IE881Message(ie881, Some(xml.head.label), Option(xml.head.namespace), ManualClosure)
}
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE905MessageV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE905Message.scala
similarity index 76%
rename from app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE905MessageV1.scala
rename to app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE905Message.scala
index cc84cebee..a2257c951 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE905MessageV1.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IE905Message.scala
@@ -14,27 +14,25 @@
* limitations under the License.
*/
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1
+package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
-import generated.v1
-import generated.v1.{IE905Type, MessagesOption}
+import generated.{IE905Type, MessagesOption}
import play.api.libs.json.{JsObject, JsValue, Json}
import scalaxb.DataRecord
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.StatusResponse
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats.GeneratedJsonWriters
import scala.xml.NodeSeq
-case class IE905MessageV1(
+case class IE905Message(
obj: IE905Type,
key: Option[String],
namespace: Option[String],
messageAuditType: MessageAuditType
) extends IEMessage
- with GeneratedJsonWritersV1 {
+ with GeneratedJsonWriters {
override def consigneeId: Option[String] = None
override def consignorId: Option[String] = None
@@ -45,7 +43,7 @@ case class IE905MessageV1(
override def messageType: String = MessageTypes.IE905.value
override def toXml: NodeSeq =
- scalaxb.toXML[IE905Type](obj, namespace, key, v1.defaultScope)
+ scalaxb.toXML[IE905Type](obj, namespace, key, generated.defaultScope)
override def toJson: JsValue = Json.toJson(obj)
override def toJsObject: JsObject = Json.toJsObject(obj)
@@ -62,12 +60,12 @@ case class IE905MessageV1(
override def optionalLocalReferenceNumber: Option[String] = None
}
-object IE905MessageV1 {
- def apply(message: DataRecord[MessagesOption]): IE905MessageV1 =
- IE905MessageV1(message.as[IE905Type], message.key, message.namespace, StatusResponse)
+object IE905Message {
+ def apply(message: DataRecord[MessagesOption]): IE905Message =
+ IE905Message(message.as[IE905Type], message.key, message.namespace, StatusResponse)
- def createFromXml(xml: NodeSeq): IE905MessageV1 = {
+ def createFromXml(xml: NodeSeq): IE905Message = {
val ie905: IE905Type = scalaxb.fromXML[IE905Type](xml)
- IE905MessageV1(ie905, Some(xml.head.label), Option(xml.head.namespace), StatusResponse)
+ IE905Message(ie905, Some(xml.head.label), Option(xml.head.namespace), StatusResponse)
}
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IEMessage.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IEMessage.scala
index 854583809..ce0ec3cfe 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IEMessage.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IEMessage.scala
@@ -17,8 +17,7 @@
package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
import play.api.libs.json.{JsObject, JsValue}
-import generated.v1
-import generated.v2
+import generated.{Number1Value30, Number1Value31, Number2Value29, Number2Value30, SubmitterType}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
import scala.xml.NodeSeq
@@ -48,15 +47,9 @@ trait IEMessage {
}
trait SubmitterTypeConverter {
- def convertSubmitterTypeV1(submitterType: v1.SubmitterType): ExciseTraderType =
+ def convertSubmitterType(submitterType: SubmitterType): ExciseTraderType =
submitterType match {
- case v1.Number1Value31 => Consignor
- case v1.Number2Value30 => Consignee
- }
-
- def convertSubmitterTypeV2(submitterType: v2.SubmitterType): ExciseTraderType =
- submitterType match {
- case v2.Number1Value30 => Consignor
- case v2.Number2Value29 => Consignee
+ case Number1Value30 => Consignor
+ case Number2Value29 => Consignee
}
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/MessageTypeFormats/GeneratedJsonWritersV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/MessageTypeFormats/GeneratedJsonWriters.scala
similarity index 99%
rename from app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/MessageTypeFormats/GeneratedJsonWritersV2.scala
rename to app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/MessageTypeFormats/GeneratedJsonWriters.scala
index 3762ee1d4..46b2866ce 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/MessageTypeFormats/GeneratedJsonWritersV2.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/MessageTypeFormats/GeneratedJsonWriters.scala
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.MessageTypeFormats
+package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats
-import generated.v2._
+import generated._
import play.api.libs.json.{Format, JsError, JsObject, JsString, JsSuccess, Json, OWrites, Reads, Writes}
import scalaxb.{DataRecord, DataTypeFactory}
@@ -27,7 +27,7 @@ import scala.util.Try
* It is important to make sure that the implicit writers are in child-first order in this file.
* xImplicit writes in the same file must always be before the writes that use them.
*/
-trait GeneratedJsonWritersV2 {
+trait GeneratedJsonWriters {
implicit val mapWrites: OWrites[Map[String, DataRecord[Any]]] = OWrites { map =>
JsObject(map.toSeq.map { case (s, r) =>
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE803MessageV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE803MessageV1.scala
deleted file mode 100644
index 9b9abc67c..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE803MessageV1.scala
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1
-
-import generated.v1
-import generated.v1.{IE803Type, MessagesOption}
-import play.api.libs.json.{JsObject, JsValue, Json}
-import scalaxb.DataRecord
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.NotificationOfDivertedMovement
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
-
-import scala.xml.NodeSeq
-
-case class IE803MessageV1(
- obj: IE803Type,
- key: Option[String],
- namespace: Option[String],
- messageAuditType: MessageAuditType
-) extends IEMessage
- with GeneratedJsonWritersV1 {
-
- override def consignorId: Option[String] = None
- override def consigneeId: Option[String] = None
-
- override def administrativeReferenceCode: Seq[Option[String]] =
- Seq(Some(obj.Body.NotificationOfDivertedEADESAD.ExciseNotification.AdministrativeReferenceCode))
-
- override def toXml: NodeSeq =
- scalaxb.toXML[IE803Type](obj, namespace, key, v1.defaultScope)
-
- override def toJson: JsValue = Json.toJson(obj)
-
- override def toJsObject: JsObject = Json.toJsObject(obj)
-
- override def messageType: String = MessageTypes.IE803.value
-
- override def messageIdentifier: String = obj.Header.MessageIdentifier
-
- override def lrnEquals(lrn: String): Boolean = false
-
- override def toString: String =
- s"Message type: $messageType, message identifier: $messageIdentifier, ARC: $administrativeReferenceCode"
-
- override def correlationId: Option[String] = obj.Header.CorrelationIdentifier
-
- def optionalLocalReferenceNumber: Option[String] = None
-}
-
-object IE803MessageV1 {
- def apply(message: DataRecord[MessagesOption]): IE803MessageV1 =
- IE803MessageV1(message.as[IE803Type], message.key, message.namespace, NotificationOfDivertedMovement)
-
- def createFromXml(xml: NodeSeq): IE803MessageV1 = {
- val ie803: IE803Type = scalaxb.fromXML[IE803Type](xml)
- IE803MessageV1(ie803, Some(xml.head.label), Option(xml.head.namespace), NotificationOfDivertedMovement)
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE819MessageV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE819MessageV1.scala
deleted file mode 100644
index 887a35dfd..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE819MessageV1.scala
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1
-
-import generated.v1
-import generated.v1.{IE819Type, MessagesOption}
-import play.api.libs.json.{JsObject, JsValue, Json}
-import scalaxb.DataRecord
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.AlertRejection
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
-
-import scala.xml.NodeSeq
-
-case class IE819MessageV1(
- obj: IE819Type,
- key: Option[String],
- namespace: Option[String],
- messageAuditType: MessageAuditType
-) extends IEMessage
- with GeneratedJsonWritersV1 {
- override def consignorId: Option[String] = None
-
- override def consigneeId: Option[String] =
- obj.Body.AlertOrRejectionOfEADESAD.ConsigneeTrader.flatMap(_.Traderid)
-
- override def administrativeReferenceCode: Seq[Option[String]] =
- Seq(Some(obj.Body.AlertOrRejectionOfEADESAD.ExciseMovement.AdministrativeReferenceCode))
-
- override def messageType: String = MessageTypes.IE819.value
-
- override def toXml: NodeSeq =
- scalaxb.toXML[IE819Type](obj, namespace, key, v1.defaultScope)
- override def toJson: JsValue = Json.toJson(obj)
-
- override def toJsObject: JsObject = Json.toJsObject(obj)
-
- override def lrnEquals(lrn: String): Boolean = false
-
- override def messageIdentifier: String = obj.Header.MessageIdentifier
-
- override def toString: String =
- s"Message type: $messageType, message identifier: $messageIdentifier, ARC: $administrativeReferenceCode"
-
- override def correlationId: Option[String] = obj.Header.CorrelationIdentifier
-
- def optionalLocalReferenceNumber: Option[String] = None
-}
-
-object IE819MessageV1 {
- def apply(message: DataRecord[MessagesOption]): IE819MessageV1 =
- IE819MessageV1(message.as[IE819Type], message.key, message.namespace, AlertRejection)
-
- def createFromXml(xml: NodeSeq): IE819MessageV1 = {
- val ie819: IE819Type = scalaxb.fromXML[IE819Type](xml)
- IE819MessageV1(ie819, Some(xml.head.label), Option(xml.head.namespace), AlertRejection)
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE829MessageV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE829MessageV1.scala
deleted file mode 100644
index 90547c81e..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE829MessageV1.scala
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1
-
-import generated.v1
-import generated.v1.{IE829Type, MessagesOption}
-import play.api.libs.json.{JsObject, JsValue, Json}
-import scalaxb.DataRecord
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.NotificationOfAcceptedExport
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
-
-import scala.xml.NodeSeq
-
-case class IE829MessageV1(
- obj: IE829Type,
- key: Option[String],
- namespace: Option[String],
- messageAuditType: MessageAuditType
-) extends IEMessage
- with GeneratedJsonWritersV1 {
-
- override def consignorId: Option[String] = None
-
- override def consigneeId: Option[String] =
- obj.Body.NotificationOfAcceptedExport.ConsigneeTrader.Traderid
-
- override def administrativeReferenceCode: Seq[Option[String]] =
- obj.Body.NotificationOfAcceptedExport.ExciseMovementEad.map(x => Some(x.AdministrativeReferenceCode))
-
- override def messageType: String = MessageTypes.IE829.value
-
- override def toXml: NodeSeq =
- scalaxb.toXML[IE829Type](obj, namespace, key, v1.defaultScope)
-
- override def toJson: JsValue = Json.toJson(obj)
- override def toJsObject: JsObject = Json.toJsObject(obj)
-
- override def lrnEquals(lrn: String): Boolean = false
-
- override def messageIdentifier: String = obj.Header.MessageIdentifier
-
- override def toString: String =
- s"Message type: $messageType, message identifier: $messageIdentifier, ARCs: $administrativeReferenceCode"
-
- override def correlationId: Option[String] = obj.Header.CorrelationIdentifier
-
- def optionalLocalReferenceNumber: Option[String] = None
-}
-
-object IE829MessageV1 {
- def apply(message: DataRecord[MessagesOption]): IE829MessageV1 =
- IE829MessageV1(message.as[IE829Type], message.key, message.namespace, NotificationOfAcceptedExport)
-
- def createFromXml(xml: NodeSeq): IE829MessageV1 = {
- val ie829: IE829Type = scalaxb.fromXML[IE829Type](xml)
- IE829MessageV1(ie829, Some(xml.head.label), Option(xml.head.namespace), NotificationOfAcceptedExport)
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE837MessageV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE837MessageV1.scala
deleted file mode 100644
index cb78c46d7..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE837MessageV1.scala
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1
-
-import generated.v1
-import generated.v1.{IE837Type, MessagesOption}
-import play.api.libs.json.{JsObject, JsValue, Json}
-import scalaxb.DataRecord
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.Delay
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{Consignee, Consignor, ExciseTraderType, IEMessage, SubmitterTypeConverter}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
-
-import scala.xml.NodeSeq
-
-case class IE837MessageV1(
- obj: IE837Type,
- key: Option[String],
- namespace: Option[String],
- messageAuditType: MessageAuditType
-) extends IEMessage
- with SubmitterTypeConverter
- with GeneratedJsonWritersV1 {
- def submitter: ExciseTraderType = convertSubmitterTypeV1(
- obj.Body.ExplanationOnDelayForDelivery.AttributesValue.SubmitterType
- )
-
- override def consignorId: Option[String] = submitter match {
- case Consignor => Some(obj.Body.ExplanationOnDelayForDelivery.AttributesValue.SubmitterIdentification)
- case _ => None
- }
-
- override def consigneeId: Option[String] = submitter match {
- case Consignee => Some(obj.Body.ExplanationOnDelayForDelivery.AttributesValue.SubmitterIdentification)
- case _ => None
- }
-
- override def administrativeReferenceCode: Seq[Option[String]] =
- Seq(Some(obj.Body.ExplanationOnDelayForDelivery.ExciseMovement.AdministrativeReferenceCode))
-
- override def messageType: String = MessageTypes.IE837.value
-
- override def toXml: NodeSeq =
- scalaxb.toXML[IE837Type](obj, namespace, key, v1.defaultScope)
-
- override def toJson: JsValue = Json.toJson(obj)
-
- override def toJsObject: JsObject = Json.toJsObject(obj)
-
- override def lrnEquals(lrn: String): Boolean = false
-
- override def messageIdentifier: String = obj.Header.MessageIdentifier
-
- override def toString: String =
- s"Message type: $messageType, message identifier: $messageIdentifier, ARC: $administrativeReferenceCode"
-
- override def correlationId: Option[String] = obj.Header.CorrelationIdentifier
-
- def optionalLocalReferenceNumber: Option[String] = None
-}
-
-object IE837MessageV1 {
- def apply(message: DataRecord[MessagesOption]): IE837MessageV1 =
- IE837MessageV1(message.as[IE837Type], message.key, message.namespace, Delay)
-
- def createFromXml(xml: NodeSeq): IE837MessageV1 = {
- val ie837: IE837Type = scalaxb.fromXML[IE837Type](xml)
- IE837MessageV1(ie837, Some(xml.head.label), Option(xml.head.namespace), Delay)
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE839MessageV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE839MessageV1.scala
deleted file mode 100644
index d1d956b55..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE839MessageV1.scala
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1
-
-import generated.v1
-import generated.v1.{IE839Type, MessagesOption}
-import play.api.libs.json.{JsObject, JsValue, Json}
-import scalaxb.DataRecord
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.RefusalByCustoms
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
-
-import scala.xml.NodeSeq
-
-case class IE839MessageV1(
- obj: IE839Type,
- key: Option[String],
- namespace: Option[String],
- messageAuditType: MessageAuditType
-) extends IEMessage
- with GeneratedJsonWritersV1 {
-
- def localReferenceNumber: Option[String] =
- obj.Body.RefusalByCustoms.NEadSub.map(_.LocalReferenceNumber)
-
- def optionalLocalReferenceNumber: Option[String] = localReferenceNumber
-
- override def consignorId: Option[String] = None
- override def consigneeId: Option[String] =
- obj.Body.RefusalByCustoms.ConsigneeTrader.Traderid
-
- override def administrativeReferenceCode: Seq[Option[String]] =
- obj.Body.RefusalByCustoms.CEadVal.map(x => Some(x.AdministrativeReferenceCode))
-
- override def messageType: String = MessageTypes.IE839.value
-
- override def toXml: NodeSeq =
- scalaxb.toXML[IE839Type](obj, namespace, key, v1.defaultScope)
-
- override def toJson: JsValue = Json.toJson(obj)
- override def toJsObject: JsObject = Json.toJsObject(obj)
-
- override def lrnEquals(lrn: String): Boolean = localReferenceNumber.contains(lrn)
-
- override def messageIdentifier: String = obj.Header.MessageIdentifier
-
- override def toString: String =
- s"Message type: $messageType, message identifier: $messageIdentifier, LRN: $localReferenceNumber, ARCs: $administrativeReferenceCode"
-
- override def correlationId: Option[String] = obj.Header.CorrelationIdentifier
-}
-
-object IE839MessageV1 {
- def apply(message: DataRecord[MessagesOption]): IE839MessageV1 =
- IE839MessageV1(message.as[IE839Type], message.key, message.namespace, RefusalByCustoms)
-
- def createFromXml(xml: NodeSeq): IE839MessageV1 = {
- val ie839: IE839Type = scalaxb.fromXML[IE839Type](xml)
- IE839MessageV1(ie839, Some(xml.head.label), Option(xml.head.namespace), RefusalByCustoms)
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE840MessageV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE840MessageV1.scala
deleted file mode 100644
index 16b1f24d8..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE840MessageV1.scala
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1
-
-import generated.v1
-import generated.v1.{IE840Type, MessagesOption}
-import play.api.libs.json.{JsObject, JsValue, Json}
-import scalaxb.DataRecord
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.EventReport
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
-
-import scala.xml.NodeSeq
-
-case class IE840MessageV1(
- obj: IE840Type,
- key: Option[String],
- namespace: Option[String],
- messageAuditType: MessageAuditType
-) extends IEMessage
- with GeneratedJsonWritersV1 {
-
- override def consigneeId: Option[String] = None
- override def consignorId: Option[String] = None
-
- override def administrativeReferenceCode: Seq[Option[String]] =
- Seq(obj.Body.EventReportEnvelope.ExciseMovement.map(_.AdministrativeReferenceCode))
-
- override def messageType: String = MessageTypes.IE840.value
-
- override def toXml: NodeSeq =
- scalaxb.toXML[IE840Type](obj, namespace, key, v1.defaultScope)
-
- override def toJson: JsValue = Json.toJson(obj)
- override def toJsObject: JsObject = Json.toJsObject(obj)
-
- override def lrnEquals(lrn: String): Boolean = false
-
- override def messageIdentifier: String = obj.Header.MessageIdentifier
-
- override def toString: String =
- s"Message type: $messageType, message identifier: $messageIdentifier, ARC: $administrativeReferenceCode"
-
- override def correlationId: Option[String] = obj.Header.CorrelationIdentifier
-
- override def optionalLocalReferenceNumber: Option[String] = None
-}
-
-object IE840MessageV1 {
- def apply(message: DataRecord[MessagesOption]): IE840MessageV1 =
- IE840MessageV1(message.as[IE840Type], message.key, message.namespace, EventReport)
-
- def createFromXml(xml: NodeSeq): IE840MessageV1 = {
- val ie840: IE840Type = scalaxb.fromXML[IE840Type](xml)
- IE840MessageV1(ie840, Some(xml.head.label), Option(xml.head.namespace), EventReport)
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE871MessageV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE871MessageV1.scala
deleted file mode 100644
index 7e87b3ac4..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE871MessageV1.scala
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1
-
-import generated.v1
-import generated.v1.{IE871Type, MessagesOption}
-import play.api.libs.json.{JsObject, JsValue, Json}
-import scalaxb.DataRecord
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.ShortageOrExcess
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{ExciseTraderType, IEMessage, SubmitterTypeConverter}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
-
-import scala.xml.NodeSeq
-
-case class IE871MessageV1(
- obj: IE871Type,
- key: Option[String],
- namespace: Option[String],
- messageAuditType: MessageAuditType
-) extends IEMessage
- with SubmitterTypeConverter
- with GeneratedJsonWritersV1 {
- def submitter: ExciseTraderType = convertSubmitterTypeV1(
- obj.Body.ExplanationOnReasonForShortage.AttributesValue.SubmitterType
- )
- def optionalLocalReferenceNumber: Option[String] = None
-
- override def consignorId: Option[String] = Some(
- obj.Body.ExplanationOnReasonForShortage.ConsignorTrader.map(_.TraderExciseNumber)
- ).flatten
-
- override def consigneeId: Option[String] = obj.Body.ExplanationOnReasonForShortage.ConsigneeTrader.flatMap(_.Traderid)
-
- override def administrativeReferenceCode: Seq[Option[String]] =
- Seq(Some(obj.Body.ExplanationOnReasonForShortage.ExciseMovement.AdministrativeReferenceCode))
-
- override def messageType: String = MessageTypes.IE871.value
-
- override def toXml: NodeSeq =
- scalaxb.toXML[IE871Type](obj, namespace, key, v1.defaultScope)
-
- override def toJson: JsValue = Json.toJson(obj)
-
- override def toJsObject: JsObject = Json.toJsObject(obj)
-
- override def lrnEquals(lrn: String): Boolean = false
-
- override def messageIdentifier: String = obj.Header.MessageIdentifier
-
- override def toString: String =
- s"Message type: $messageType, message identifier: $messageIdentifier, ARC: $administrativeReferenceCode"
-
- override def correlationId: Option[String] = obj.Header.CorrelationIdentifier
-}
-
-object IE871MessageV1 {
- def apply(message: DataRecord[MessagesOption]): IE871MessageV1 =
- IE871MessageV1(message.as[IE871Type], message.key, message.namespace, ShortageOrExcess)
-
- def createFromXml(xml: NodeSeq): IE871MessageV1 = {
- val ie871: IE871Type = scalaxb.fromXML[IE871Type](xml)
- IE871MessageV1(ie871, Some(xml.head.label), Option(xml.head.namespace), ShortageOrExcess)
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE881MessageV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE881MessageV1.scala
deleted file mode 100644
index b3b071994..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/IE881MessageV1.scala
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1
-
-import generated.v1
-import generated.v1.{IE881Type, MessagesOption}
-import play.api.libs.json.{JsObject, JsValue, Json}
-import scalaxb.DataRecord
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.ManualClosure
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
-
-import scala.xml.NodeSeq
-
-case class IE881MessageV1(
- obj: IE881Type,
- key: Option[String],
- namespace: Option[String],
- messageAuditType: MessageAuditType
-) extends IEMessage
- with GeneratedJsonWritersV1 {
-
- override def consigneeId: Option[String] = None
-
- override def consignorId: Option[String] = None
-
- override def administrativeReferenceCode: Seq[Option[String]] =
- Seq(Some(obj.Body.ManualClosureResponse.AttributesValue.AdministrativeReferenceCode))
-
- override def messageType: String = MessageTypes.IE881.value
-
- override def toXml: NodeSeq =
- scalaxb.toXML[IE881Type](obj, namespace, key, v1.defaultScope)
-
- override def toJson: JsValue = Json.toJson(obj)
- override def toJsObject: JsObject = Json.toJsObject(obj)
-
- override def lrnEquals(lrn: String): Boolean = false
-
- override def messageIdentifier: String = obj.Header.MessageIdentifier
-
- override def toString: String =
- s"Message type: $messageType, message identifier: $messageIdentifier, ARC: $administrativeReferenceCode"
-
- override def correlationId: Option[String] = obj.Header.CorrelationIdentifier
-
- override def optionalLocalReferenceNumber: Option[String] = None
-}
-
-object IE881MessageV1 {
- def apply(message: DataRecord[MessagesOption]): IE881MessageV1 =
- IE881MessageV1(message.as[IE881Type], message.key, message.namespace, ManualClosure)
-
- def createFromXml(xml: NodeSeq): IE881MessageV1 = {
- val ie881: IE881Type = scalaxb.fromXML[IE881Type](xml)
- IE881MessageV1(ie881, Some(xml.head.label), Option(xml.head.namespace), ManualClosure)
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/MessageTypeFormats/GeneratedJsonWritersV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/MessageTypeFormats/GeneratedJsonWritersV1.scala
deleted file mode 100644
index 4774c901b..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v1/MessageTypeFormats/GeneratedJsonWritersV1.scala
+++ /dev/null
@@ -1,487 +0,0 @@
-/*
- * Copyright 2025 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats
-import generated.v1._
-import play.api.libs.json.{Format, JsError, JsObject, JsString, JsSuccess, Json, OWrites, Reads, Writes}
-import scalaxb.{DataRecord, DataTypeFactory}
-
-import javax.xml.datatype.XMLGregorianCalendar
-import scala.util.Try
-
-/**
- * It is important to make sure that the implicit writers are in child-first order in this file.
- * xImplicit writes in the same file must always be before the writes that use them.
- */
-trait GeneratedJsonWritersV1 {
-
- implicit val mapWrites: OWrites[Map[String, DataRecord[Any]]] = OWrites { map =>
- JsObject(map.toSeq.map { case (s, r) =>
- s -> JsString(r.value.toString)
- })
- }
-
- implicit val xmlDateTime: Format[XMLGregorianCalendar] = Format(xmlDateTimeReads, xmlDateTimeWrites)
- implicit lazy val xmlDateTimeWrites: Writes[XMLGregorianCalendar] = Writes { dateTime =>
- JsString(dateTime.toXMLFormat)
- }
- implicit lazy val xmlDateTimeReads: Reads[XMLGregorianCalendar] = Reads {
- case JsString(dateTime) =>
- Try(JsSuccess(DataTypeFactory.initialValue().newXMLGregorianCalendar(dateTime))).getOrElse(JsError())
- case _ => JsError()
- }
-
- implicit val SubmissionType: Writes[SubmissionType] = Writes[SubmissionType] { submissionType =>
- JsString(submissionType.toString)
- }
- implicit val Flag: Writes[Flag] = Writes[Flag] { flag =>
- JsString(flag.toString)
- }
-
- implicit val AttributesTypeType11: OWrites[AttributesTypeType11] = Json.writes[AttributesTypeType11]
-
- implicit val ConsigneeTraderTypeType2: OWrites[ConsigneeTraderTypeType2] = Json.writes[ConsigneeTraderTypeType2]
- implicit val ConsignorTraderTypeType: OWrites[ConsignorTraderTypeType] = Json.writes[ConsignorTraderTypeType]
-
- implicit val PlaceOfDispatchTraderTypeType: OWrites[PlaceOfDispatchTraderTypeType] =
- Json.writes[PlaceOfDispatchTraderTypeType]
-
- implicit val DispatchImportOfficeType: OWrites[DispatchImportOfficeType] = Json.writes[DispatchImportOfficeType]
-
- implicit val ComplementConsigneeTraderType: OWrites[ComplementConsigneeTraderType] =
- Json.writes[ComplementConsigneeTraderType]
-
- implicit val DeliveryPlaceTraderTypeType4: OWrites[DeliveryPlaceTraderTypeType4] =
- Json.writes[DeliveryPlaceTraderTypeType4]
-
- implicit val DeliveryPlaceCustomsOfficeTypeType3: OWrites[DeliveryPlaceCustomsOfficeTypeType3] =
- Json.writes[DeliveryPlaceCustomsOfficeTypeType3]
-
- implicit val CompetentAuthorityDispatchOfficeTypeType: OWrites[CompetentAuthorityDispatchOfficeTypeType] =
- Json.writes[CompetentAuthorityDispatchOfficeTypeType]
- implicit val TransportArrangerTraderTypeType: OWrites[TransportArrangerTraderTypeType] =
- Json.writes[TransportArrangerTraderTypeType]
- implicit val FirstTransporterTraderTypeType: OWrites[FirstTransporterTraderTypeType] =
- Json.writes[FirstTransporterTraderTypeType]
- implicit val LSDReferenceOfDocumentTypeType: OWrites[LSDReferenceOfDocumentTypeType] =
- Json.writes[LSDReferenceOfDocumentTypeType]
-
- implicit val DestinationTypeCode: Writes[DestinationTypeCode] = Writes[DestinationTypeCode] { code =>
- JsString(code.toString)
- }
-
- implicit val LSDComplementaryInformationTypeType10: OWrites[LSDComplementaryInformationTypeType10] =
- Json.writes[LSDComplementaryInformationTypeType10]
-
- implicit val GuarantorTypeCode: Writes[GuarantorTypeCode] = Writes[GuarantorTypeCode] { code =>
- JsString(code.toString)
- }
-
- implicit val LSDFiscalMarkTypeType2: OWrites[LSDFiscalMarkTypeType2] = Json.writes[LSDFiscalMarkTypeType2]
- implicit val LSDDesignationOfOriginTypeType: OWrites[LSDDesignationOfOriginTypeType] =
- Json.writes[LSDDesignationOfOriginTypeType]
- implicit val LSDCommercialDescriptionTypeType2: OWrites[LSDCommercialDescriptionTypeType2] =
- Json.writes[LSDCommercialDescriptionTypeType2]
- implicit val LSDBrandNameOfProductsTypeType2: OWrites[LSDBrandNameOfProductsTypeType2] =
- Json.writes[LSDBrandNameOfProductsTypeType2]
- implicit val LSDMaturationPeriodOrAgeOfProductsTypeType: OWrites[LSDMaturationPeriodOrAgeOfProductsTypeType] =
- Json.writes[LSDMaturationPeriodOrAgeOfProductsTypeType]
- implicit val LSDIndependentSmallProducersDeclarationTypeType
- : OWrites[LSDIndependentSmallProducersDeclarationTypeType] =
- Json.writes[LSDIndependentSmallProducersDeclarationTypeType]
- implicit val ImportSadTypeType: OWrites[ImportSadTypeType] =
- Json.writes[ImportSadTypeType]
- implicit val LSDSealInformationTypeType5: OWrites[LSDSealInformationTypeType5] =
- Json.writes[LSDSealInformationTypeType5]
-
- //IE815 Reordered
-
- implicit val ComplementConsigneeTraderTypeType: OWrites[ComplementConsigneeTraderTypeType] =
- Json.writes[ComplementConsigneeTraderTypeType]
- implicit val DispatchImportOfficeTypeType: OWrites[DispatchImportOfficeTypeType] =
- Json.writes[DispatchImportOfficeTypeType]
- implicit val LSDDocumentDescriptionTypeType: OWrites[LSDDocumentDescriptionTypeType] =
- Json.writes[LSDDocumentDescriptionTypeType]
-
- implicit val TransportArrangement: Writes[TransportArrangement] = Writes[TransportArrangement] { a =>
- JsString(a.toString)
- }
-
- implicit val GuarantorTraderTypeType2: OWrites[GuarantorTraderTypeType2] = Json.writes[GuarantorTraderTypeType2]
- implicit val WineOperationTypeType: OWrites[WineOperationTypeType] = Json.writes[WineOperationTypeType]
- implicit val LSDOtherInformationTypeType: OWrites[LSDOtherInformationTypeType] =
- Json.writes[LSDOtherInformationTypeType]
-
- implicit val CategoryOfWineProduct: Writes[CategoryOfWineProduct] = Writes[CategoryOfWineProduct] { cat =>
- JsString(cat.toString)
- }
- implicit val OriginTypeCode: Writes[OriginTypeCode] = Writes[OriginTypeCode] { code =>
- JsString(code.toString)
- }
- implicit val WineProductTypeType: OWrites[WineProductTypeType] = Json.writes[WineProductTypeType]
- implicit val PackageTypeType2: OWrites[PackageTypeType2] = Json.writes[PackageTypeType2]
- implicit val TransportDetailsTypeType5: OWrites[TransportDetailsTypeType5] = Json.writes[TransportDetailsTypeType5]
- implicit val EadEsadDraftType: OWrites[EadEsadDraftType] = Json.writes[EadEsadDraftType]
- implicit val BodyEadEsadTypeType: OWrites[BodyEadEsadTypeType] = Json.writes[BodyEadEsadTypeType]
- implicit val MovementGuaranteeTypeType2: OWrites[MovementGuaranteeTypeType2] = Json.writes[MovementGuaranteeTypeType2]
- implicit val TransportModeTypeType: OWrites[TransportModeTypeType] = Json.writes[TransportModeTypeType]
- implicit val HeaderEadEsadTypeType: OWrites[HeaderEadEsadTypeType] = Json.writes[HeaderEadEsadTypeType]
- implicit val DocumentCertificateTypeType: OWrites[DocumentCertificateTypeType] =
- Json.writes[DocumentCertificateTypeType]
- implicit val SubmittedDraftOfEADESADType: OWrites[SubmittedDraftOfEADESADType] =
- Json.writes[SubmittedDraftOfEADESADType]
-
- implicit val BodyTypeType14: OWrites[BodyTypeType14] = Json.writes[BodyTypeType14]
- implicit val HeaderType: OWrites[HeaderType] = Json.writes[HeaderType]
-
- implicit val IE815Type: OWrites[IE815Type] = Json.writes[IE815Type]
-
- //IE704
-
- implicit val FunctionalErrorCodesType: Writes[FunctionalErrorCodesType] = Writes[FunctionalErrorCodesType] { code =>
- JsString(code.toString)
- }
- implicit val FunctionalErrorType: OWrites[FunctionalErrorType] = Json.writes[FunctionalErrorType]
- implicit val AttributesTypeType9: OWrites[AttributesTypeType9] = Json.writes[AttributesTypeType9]
- implicit val GenericRefusalMessageType: OWrites[GenericRefusalMessageType] = Json.writes[GenericRefusalMessageType]
- implicit val BodyTypeType10: OWrites[BodyTypeType10] = Json.writes[BodyTypeType10]
- implicit val IE704Type: OWrites[IE704Type] = Json.writes[IE704Type]
-
- //IE801
-
- implicit val LSDReferenceOfDocumentType: OWrites[LSDReferenceOfDocumentType] = Json.writes[LSDReferenceOfDocumentType]
- implicit val LSDDocumentDescriptionType: OWrites[LSDDocumentDescriptionType] = Json.writes[LSDDocumentDescriptionType]
- implicit val ImportSadType: OWrites[ImportSadType] = Json.writes[ImportSadType]
- implicit val LSDSealInformationTypeType4: OWrites[LSDSealInformationTypeType4] =
- Json.writes[LSDSealInformationTypeType4]
- implicit val WineOperationType: OWrites[WineOperationType] = Json.writes[WineOperationType]
- implicit val LSDOtherInformationType: OWrites[LSDOtherInformationType] = Json.writes[LSDOtherInformationType]
- implicit val GuarantorTraderTypeType: OWrites[GuarantorTraderTypeType] = Json.writes[GuarantorTraderTypeType]
- implicit val WineProductType: OWrites[WineProductType] = Json.writes[WineProductType]
- implicit val PackageTypeType: OWrites[PackageTypeType] = Json.writes[PackageTypeType]
- implicit val LSDMaturationPeriodOrAgeOfProductsType: OWrites[LSDMaturationPeriodOrAgeOfProductsType] =
- Json.writes[LSDMaturationPeriodOrAgeOfProductsType]
- implicit val LSDIndependentSmallProducersDeclarationType: OWrites[LSDIndependentSmallProducersDeclarationType] =
- Json.writes[LSDIndependentSmallProducersDeclarationType]
- implicit val LSDBrandNameOfProductsTypeType: OWrites[LSDBrandNameOfProductsTypeType] =
- Json.writes[LSDBrandNameOfProductsTypeType]
- implicit val LSDCommercialDescriptionTypeType: OWrites[LSDCommercialDescriptionTypeType] =
- Json.writes[LSDCommercialDescriptionTypeType]
- implicit val LSDDesignationOfOriginType: OWrites[LSDDesignationOfOriginType] = Json.writes[LSDDesignationOfOriginType]
- implicit val LSDFiscalMarkTypeType: OWrites[LSDFiscalMarkTypeType] = Json.writes[LSDFiscalMarkTypeType]
- implicit val LSDComplementaryInformationTypeType8: OWrites[LSDComplementaryInformationTypeType8] =
- Json.writes[LSDComplementaryInformationTypeType8]
- implicit val TransportDetailsTypeType4: OWrites[TransportDetailsTypeType4] = Json.writes[TransportDetailsTypeType4]
- implicit val BodyEadEsadType: OWrites[BodyEadEsadType] = Json.writes[BodyEadEsadType]
- implicit val MovementGuaranteeTypeType: OWrites[MovementGuaranteeTypeType] = Json.writes[MovementGuaranteeTypeType]
- implicit val TransportModeType: OWrites[TransportModeType] = Json.writes[TransportModeType]
- implicit val HeaderEadEsadType: OWrites[HeaderEadEsadType] = Json.writes[HeaderEadEsadType]
- implicit val EadEsadType: OWrites[EadEsadType] = Json.writes[EadEsadType]
- implicit val DocumentCertificateType: OWrites[DocumentCertificateType] = Json.writes[DocumentCertificateType]
- implicit val FirstTransporterTraderType: OWrites[FirstTransporterTraderType] = Json.writes[FirstTransporterTraderType]
- implicit val TransportArrangerTraderType: OWrites[TransportArrangerTraderType] =
- Json.writes[TransportArrangerTraderType]
- implicit val CompetentAuthorityDispatchOfficeType: OWrites[CompetentAuthorityDispatchOfficeType] =
- Json.writes[CompetentAuthorityDispatchOfficeType]
- implicit val DeliveryPlaceCustomsOfficeTypeType2: OWrites[DeliveryPlaceCustomsOfficeTypeType2] =
- Json.writes[DeliveryPlaceCustomsOfficeTypeType2]
- implicit val DeliveryPlaceTraderTypeType3: OWrites[DeliveryPlaceTraderTypeType3] =
- Json.writes[DeliveryPlaceTraderTypeType3]
- implicit val PlaceOfDispatchTraderType: OWrites[PlaceOfDispatchTraderType] = Json.writes[PlaceOfDispatchTraderType]
- implicit val ConsignorTraderType: OWrites[ConsignorTraderType] = Json.writes[ConsignorTraderType]
- implicit val ExciseMovementTypeType5: OWrites[ExciseMovementTypeType5] = Json.writes[ExciseMovementTypeType5]
- implicit val ConsigneeTraderTypeType: OWrites[ConsigneeTraderTypeType] = Json.writes[ConsigneeTraderTypeType]
- implicit val EADESADContainerType: OWrites[EADESADContainerType] = Json.writes[EADESADContainerType]
- implicit val BodyTypeType11: OWrites[BodyTypeType11] = Json.writes[BodyTypeType11]
- implicit val IE801Type: OWrites[IE801Type] = Json.writes[IE801Type]
-
- //IE802
-
- implicit val ReminderMessageType: Writes[ReminderMessageType] = Writes[ReminderMessageType] { t =>
- JsString(t.toString)
- }
- implicit val LSDReminderInformationType: OWrites[LSDReminderInformationType] = Json.writes[LSDReminderInformationType]
- implicit val ExciseMovementTypeType3: OWrites[ExciseMovementTypeType3] = Json.writes[ExciseMovementTypeType3]
- implicit val AttributesTypeType7: OWrites[AttributesTypeType7] = Json.writes[AttributesTypeType7]
- implicit val ReminderMessageForExciseMovementType: OWrites[ReminderMessageForExciseMovementType] =
- Json.writes[ReminderMessageForExciseMovementType]
- implicit val BodyTypeType8: OWrites[BodyTypeType8] = Json.writes[BodyTypeType8]
- implicit val IE802Type: OWrites[IE802Type] = Json.writes[IE802Type]
-
- //IE803
-
- implicit val NotificationType: Writes[NotificationType] = Writes[NotificationType] { t =>
- JsString(t.toString)
- }
- implicit val DownstreamArcType: OWrites[DownstreamArcType] = Json.writes[DownstreamArcType]
- implicit val ExciseNotificationType: OWrites[ExciseNotificationType] = Json.writes[ExciseNotificationType]
- implicit val NotificationOfDivertedEADESADType: OWrites[NotificationOfDivertedEADESADType] =
- Json.writes[NotificationOfDivertedEADESADType]
- implicit val BodyTypeType12: OWrites[BodyTypeType12] = Json.writes[BodyTypeType12]
- implicit val IE803Type: OWrites[IE803Type] = Json.writes[IE803Type]
-
- //IE807
-
- implicit val LSDComplementaryInformationTypeType6: OWrites[LSDComplementaryInformationTypeType6] =
- Json.writes[LSDComplementaryInformationTypeType6]
- implicit val ReferenceEventReportType: OWrites[ReferenceEventReportType] = Json.writes[ReferenceEventReportType]
- implicit val ReferenceControlReportType: OWrites[ReferenceControlReportType] = Json.writes[ReferenceControlReportType]
- implicit val AttributesTypeType6: OWrites[AttributesTypeType6] = Json.writes[AttributesTypeType6]
- implicit val InterruptionOfMovementType: OWrites[InterruptionOfMovementType] = Json.writes[InterruptionOfMovementType]
- implicit val BodyTypeType7: OWrites[BodyTypeType7] = Json.writes[BodyTypeType7]
- implicit val IE807Type: OWrites[IE807Type] = Json.writes[IE807Type]
-
- //IE810
-
- implicit val LSDComplementaryInformationTypeType9: OWrites[LSDComplementaryInformationTypeType9] =
- Json.writes[LSDComplementaryInformationTypeType9]
- implicit val CancellationType: OWrites[CancellationType] = Json.writes[CancellationType]
- implicit val ExciseMovementEadType: OWrites[ExciseMovementEadType] = Json.writes[ExciseMovementEadType]
- implicit val AttributesTypeType10: OWrites[AttributesTypeType10] = Json.writes[AttributesTypeType10]
- implicit val CancellationOfEADType: OWrites[CancellationOfEADType] = Json.writes[CancellationOfEADType]
- implicit val BodyTypeType13: OWrites[BodyTypeType13] = Json.writes[BodyTypeType13]
- implicit val IE810Type: OWrites[IE810Type] = Json.writes[IE810Type]
-
- //IE813
-
- implicit val GuarantorTraderType: OWrites[GuarantorTraderType] = Json.writes[GuarantorTraderType]
- implicit val MovementGuaranteeType: OWrites[MovementGuaranteeType] = Json.writes[MovementGuaranteeType]
- implicit val DeliveryPlaceCustomsOfficeTypeType: OWrites[DeliveryPlaceCustomsOfficeTypeType] =
- Json.writes[DeliveryPlaceCustomsOfficeTypeType]
- implicit val DeliveryPlaceTraderTypeType2: OWrites[DeliveryPlaceTraderTypeType2] =
- Json.writes[DeliveryPlaceTraderTypeType2]
- implicit val NewConsigneeTraderTypeType: OWrites[NewConsigneeTraderTypeType] = Json.writes[NewConsigneeTraderTypeType]
- implicit val LSDSealInformationTypeType2: OWrites[LSDSealInformationTypeType2] =
- Json.writes[LSDSealInformationTypeType2]
- implicit val ChangedDestinationTypeCode: Writes[ChangedDestinationTypeCode] = Writes[ChangedDestinationTypeCode] {
- code => JsString(code.toString)
- }
- implicit val LSDComplementaryInformationTypeType5: OWrites[LSDComplementaryInformationTypeType5] =
- Json.writes[LSDComplementaryInformationTypeType5]
- implicit val TransportDetailsTypeType2: OWrites[TransportDetailsTypeType2] = Json.writes[TransportDetailsTypeType2]
- implicit val NewTransporterTraderTypeType2: OWrites[NewTransporterTraderTypeType2] =
- Json.writes[NewTransporterTraderTypeType2]
- implicit val DestinationChangedTypeType: OWrites[DestinationChangedTypeType] = Json.writes[DestinationChangedTypeType]
- implicit val UpdateEadEsadType: OWrites[UpdateEadEsadType] = Json.writes[UpdateEadEsadType]
- implicit val NewTransportArrangerTraderTypeType2: OWrites[NewTransportArrangerTraderTypeType2] =
- Json.writes[NewTransportArrangerTraderTypeType2]
- implicit val AttributesTypeType5: OWrites[AttributesTypeType5] = Json.writes[AttributesTypeType5]
- implicit val ChangeOfDestinationType: OWrites[ChangeOfDestinationType] = Json.writes[ChangeOfDestinationType]
- implicit val BodyTypeType6: OWrites[BodyTypeType6] = Json.writes[BodyTypeType6]
- implicit val IE813Type: OWrites[IE813Type] = Json.writes[IE813Type]
-
- //IE818
-
- implicit val LSDComplementaryInformationTypeType4: OWrites[LSDComplementaryInformationTypeType4] =
- Json.writes[LSDComplementaryInformationTypeType4]
- implicit val UnsatisfactoryReasonType: OWrites[UnsatisfactoryReasonType] = Json.writes[UnsatisfactoryReasonType]
- implicit val IndicatorOfShortageOrExcess: Writes[IndicatorOfShortageOrExcess] = Writes[IndicatorOfShortageOrExcess] {
- i => JsString(i.toString)
- }
- implicit val GlobalConclusionOfReceipt: Writes[GlobalConclusionOfReceipt] = Writes[GlobalConclusionOfReceipt] { r =>
- JsString(r.toString)
- }
- implicit val BodyReportOfReceiptExportType: OWrites[BodyReportOfReceiptExportType] =
- Json.writes[BodyReportOfReceiptExportType]
- implicit val ReportOfReceiptExportType: OWrites[ReportOfReceiptExportType] = Json.writes[ReportOfReceiptExportType]
- implicit val DestinationOfficeType: OWrites[DestinationOfficeType] = Json.writes[DestinationOfficeType]
- implicit val DeliveryPlaceTraderTypeType: OWrites[DeliveryPlaceTraderTypeType] =
- Json.writes[DeliveryPlaceTraderTypeType]
- implicit val ExciseMovementTypeType2: OWrites[ExciseMovementTypeType2] = Json.writes[ExciseMovementTypeType2]
- implicit val ConsigneeTraderType: OWrites[ConsigneeTraderType] = Json.writes[ConsigneeTraderType]
- implicit val AttributesTypeType4: OWrites[AttributesTypeType4] = Json.writes[AttributesTypeType4]
- implicit val AcceptedOrRejectedReportOfReceiptExportType: OWrites[AcceptedOrRejectedReportOfReceiptExportType] =
- Json.writes[AcceptedOrRejectedReportOfReceiptExportType]
- implicit val BodyTypeType5: OWrites[BodyTypeType5] = Json.writes[BodyTypeType5]
- implicit val IE818Type: OWrites[IE818Type] = Json.writes[IE818Type]
-
- //IE819
-
- implicit val LSDComplementaryInformationTypeType11: OWrites[LSDComplementaryInformationTypeType11] =
- Json.writes[LSDComplementaryInformationTypeType11]
- implicit val AlertOrRejectionOfEadEsadReasonType: OWrites[AlertOrRejectionOfEadEsadReasonType] =
- Json.writes[AlertOrRejectionOfEadEsadReasonType]
- implicit val AlertOrRejectionType: OWrites[AlertOrRejectionType] = Json.writes[AlertOrRejectionType]
- implicit val DestinationOfficeTypeType: OWrites[DestinationOfficeTypeType] = Json.writes[DestinationOfficeTypeType]
- implicit val ExciseMovementTypeType6: OWrites[ExciseMovementTypeType6] = Json.writes[ExciseMovementTypeType6]
- implicit val ConsigneeTraderTypeType3: OWrites[ConsigneeTraderTypeType3] = Json.writes[ConsigneeTraderTypeType3]
- implicit val AttributesTypeType12: OWrites[AttributesTypeType12] = Json.writes[AttributesTypeType12]
- implicit val AlertOrRejectionOfEADESADType: OWrites[AlertOrRejectionOfEADESADType] =
- Json.writes[AlertOrRejectionOfEADESADType]
- implicit val BodyTypeType15: OWrites[BodyTypeType15] = Json.writes[BodyTypeType15]
- implicit val IE819Type: OWrites[IE819Type] = Json.writes[IE819Type]
-
- //IE829
-
- implicit val ExportDeclarationAcceptanceReleaseType: OWrites[ExportDeclarationAcceptanceReleaseType] =
- Json.writes[ExportDeclarationAcceptanceReleaseType]
- implicit val ExportPlaceCustomsOfficeType: OWrites[ExportPlaceCustomsOfficeType] =
- Json.writes[ExportPlaceCustomsOfficeType]
- implicit val ExciseMovementEadTypeType: OWrites[ExciseMovementEadTypeType] = Json.writes[ExciseMovementEadTypeType]
- implicit val ConsigneeTraderTypeType4: OWrites[ConsigneeTraderTypeType4] = Json.writes[ConsigneeTraderTypeType4]
- implicit val AttributesTypeType13: OWrites[AttributesTypeType13] = Json.writes[AttributesTypeType13]
- implicit val NotificationOfAcceptedExportType: OWrites[NotificationOfAcceptedExportType] =
- Json.writes[NotificationOfAcceptedExportType]
- implicit val BodyTypeType16: OWrites[BodyTypeType16] = Json.writes[BodyTypeType16]
- implicit val IE829Type: OWrites[IE829Type] = Json.writes[IE829Type]
-
- //IE837
-
- implicit val MessageRoleCode: Writes[MessageRoleCode] = Writes[MessageRoleCode] { code =>
- JsString(code.toString)
- }
- implicit val LSDComplementaryInformationTypeType2: OWrites[LSDComplementaryInformationTypeType2] =
- Json.writes[LSDComplementaryInformationTypeType2]
- implicit val SubmitterType: Writes[SubmitterType] = Writes[SubmitterType] { t =>
- JsString(t.toString)
- }
- implicit val ExciseMovementTypeType: OWrites[ExciseMovementTypeType] = Json.writes[ExciseMovementTypeType]
- implicit val AttributesTypeType3: OWrites[AttributesTypeType3] = Json.writes[AttributesTypeType3]
- implicit val ExplanationOnDelayForDeliveryType: OWrites[ExplanationOnDelayForDeliveryType] =
- Json.writes[ExplanationOnDelayForDeliveryType]
- implicit val BodyTypeType3: OWrites[BodyTypeType3] = Json.writes[BodyTypeType3]
- implicit val IE837Type: OWrites[IE837Type] = Json.writes[IE837Type]
-
- //IE839
-
- implicit val CustomsRejectionReasonCode: Writes[CustomsRejectionReasonCode] = Writes[CustomsRejectionReasonCode] {
- code => JsString(code.toString)
- }
- implicit val DiagnosisCode: Writes[DiagnosisCode] = Writes[DiagnosisCode] { code =>
- JsString(code.toString)
- }
-
- implicit val NEadSubType: OWrites[NEadSubType] = Json.writes[NEadSubType]
- implicit val CEadValType: OWrites[CEadValType] = Json.writes[CEadValType]
- implicit val RejectionType: OWrites[RejectionType] = Json.writes[RejectionType]
- implicit val ExportPlaceCustomsOfficeTypeType: OWrites[ExportPlaceCustomsOfficeTypeType] =
- Json.writes[ExportPlaceCustomsOfficeTypeType]
- implicit val ConsigneeTraderTypeType5: OWrites[ConsigneeTraderTypeType5] = Json.writes[ConsigneeTraderTypeType5]
- implicit val AttributesTypeType14: OWrites[AttributesTypeType14] = Json.writes[AttributesTypeType14]
- implicit val CombinedNomenclatureCodeCrosscheckResultType: OWrites[CombinedNomenclatureCodeCrosscheckResultType] =
- Json.writes[CombinedNomenclatureCodeCrosscheckResultType]
- implicit val NetMassCrosscheckResultType: OWrites[NetMassCrosscheckResultType] =
- Json.writes[NetMassCrosscheckResultType]
- implicit val UbrCrosscheckResultType: OWrites[UbrCrosscheckResultType] = Json.writes[UbrCrosscheckResultType]
- implicit val NegativeCrosscheckValidationResultsType: OWrites[NegativeCrosscheckValidationResultsType] =
- Json.writes[NegativeCrosscheckValidationResultsType]
- implicit val NNonDesType: OWrites[NNonDesType] = Json.writes[NNonDesType]
- implicit val ExportDeclarationInformationType: OWrites[ExportDeclarationInformationType] =
- Json.writes[ExportDeclarationInformationType]
- implicit val RefusalByCustomsType: OWrites[RefusalByCustomsType] = Json.writes[RefusalByCustomsType]
- implicit val BodyTypeType17: OWrites[BodyTypeType17] = Json.writes[BodyTypeType17]
- implicit val IE839Type: OWrites[IE839Type] = Json.writes[IE839Type]
-
- //IE840
-
- implicit val LSDAssociatedInformationType: OWrites[LSDAssociatedInformationType] =
- Json.writes[LSDAssociatedInformationType]
- implicit val LSDSealInformationType: OWrites[LSDSealInformationType] = Json.writes[LSDSealInformationType]
- implicit val LSDComplementaryInformationTypeType: OWrites[LSDComplementaryInformationTypeType] =
- Json.writes[LSDComplementaryInformationTypeType]
- implicit val LSDEvidenceTypeComplementType: OWrites[LSDEvidenceTypeComplementType] =
- Json.writes[LSDEvidenceTypeComplementType]
- implicit val LSDReferenceOfEvidenceType: OWrites[LSDReferenceOfEvidenceType] = Json.writes[LSDReferenceOfEvidenceType]
- implicit val LSDIssuingAuthorityType: OWrites[LSDIssuingAuthorityType] = Json.writes[LSDIssuingAuthorityType]
- implicit val LSDCommentsType: OWrites[LSDCommentsType] = Json.writes[LSDCommentsType]
- implicit val LSDSubmittingPersonComplementType: OWrites[LSDSubmittingPersonComplementType] =
- Json.writes[LSDSubmittingPersonComplementType]
- implicit val LSDPlaceOfEventType: OWrites[LSDPlaceOfEventType] = Json.writes[LSDPlaceOfEventType]
- implicit val LSDAcoComplementaryInformationType: OWrites[LSDAcoComplementaryInformationType] =
- Json.writes[LSDAcoComplementaryInformationType]
- implicit val TraderPersonType: Writes[TraderPersonType] = Writes[TraderPersonType] { t =>
- JsString(t.toString)
- }
- implicit val MeansOfTransportType: OWrites[MeansOfTransportType] = Json.writes[MeansOfTransportType]
- implicit val GoodsItemType: OWrites[GoodsItemType] = Json.writes[GoodsItemType]
- implicit val PersonInvolvedInMovementTraderType: OWrites[PersonInvolvedInMovementTraderType] =
- Json.writes[PersonInvolvedInMovementTraderType]
- implicit val LSDShortDescriptionOfOtherAccompanyingDocumentType
- : OWrites[LSDShortDescriptionOfOtherAccompanyingDocumentType] =
- Json.writes[LSDShortDescriptionOfOtherAccompanyingDocumentType]
- implicit val OtherAccompanyingDocumentType: Writes[OtherAccompanyingDocumentType] =
- Writes[OtherAccompanyingDocumentType] { t =>
- JsString(t.toString)
- }
- implicit val ReportMessageType: Writes[ReportMessageType] = Writes[ReportMessageType] { t =>
- JsString(t.toString)
- }
- implicit val BodyEventReportType: OWrites[BodyEventReportType] = Json.writes[BodyEventReportType]
- implicit val TransportDetailsType: OWrites[TransportDetailsType] = Json.writes[TransportDetailsType]
- implicit val NewTransporterTraderType: OWrites[NewTransporterTraderType] = Json.writes[NewTransporterTraderType]
- implicit val NewTransportArrangerTraderType: OWrites[NewTransportArrangerTraderType] =
- Json.writes[NewTransportArrangerTraderType]
- implicit val EvidenceOfEventType: OWrites[EvidenceOfEventType] = Json.writes[EvidenceOfEventType]
- implicit val EventReportType: OWrites[EventReportType] = Json.writes[EventReportType]
- implicit val OtherAccompanyingDocumentTypeType: OWrites[OtherAccompanyingDocumentTypeType] =
- Json.writes[OtherAccompanyingDocumentTypeType]
- implicit val ExciseMovementType: OWrites[ExciseMovementType] = Json.writes[ExciseMovementType]
- implicit val HeaderEventReportType: OWrites[HeaderEventReportType] = Json.writes[HeaderEventReportType]
- implicit val AttributesTypeType2: OWrites[AttributesTypeType2] = Json.writes[AttributesTypeType2]
- implicit val EventReportEnvelopeType: OWrites[EventReportEnvelopeType] = Json.writes[EventReportEnvelopeType]
- implicit val BodyTypeType2: OWrites[BodyTypeType2] = Json.writes[BodyTypeType2]
- implicit val IE840Type: OWrites[IE840Type] = Json.writes[IE840Type]
-
- //IE871
-
- implicit val LSDExplanationType: OWrites[LSDExplanationType] = Json.writes[LSDExplanationType]
- implicit val LSDGlobalExplanationType: OWrites[LSDGlobalExplanationType] = Json.writes[LSDGlobalExplanationType]
- implicit val BodyAnalysisType: OWrites[BodyAnalysisType] = Json.writes[BodyAnalysisType]
- implicit val AnalysisType: OWrites[AnalysisType] = Json.writes[AnalysisType]
- implicit val ConsignorTraderTypeType2: OWrites[ConsignorTraderTypeType2] = Json.writes[ConsignorTraderTypeType2]
- implicit val ExciseMovementTypeType7: OWrites[ExciseMovementTypeType7] = Json.writes[ExciseMovementTypeType7]
- implicit val ConsigneeTraderTypeType6: OWrites[ConsigneeTraderTypeType6] = Json.writes[ConsigneeTraderTypeType6]
- implicit val AttributesTypeType15: OWrites[AttributesTypeType15] = Json.writes[AttributesTypeType15]
- implicit val ExplanationOnReasonForShortageType: OWrites[ExplanationOnReasonForShortageType] =
- Json.writes[ExplanationOnReasonForShortageType]
- implicit val BodyTypeType18: OWrites[BodyTypeType18] = Json.writes[BodyTypeType18]
- implicit val IE871Type: OWrites[IE871Type] = Json.writes[IE871Type]
-
- //IE881
-
- implicit val LSDReferenceOfSupportingDocumentTypeType: OWrites[LSDReferenceOfSupportingDocumentTypeType] =
- Json.writes[LSDReferenceOfSupportingDocumentTypeType]
- implicit val LSDSupportingDocumentDescriptionTypeType: OWrites[LSDSupportingDocumentDescriptionTypeType] =
- Json.writes[LSDSupportingDocumentDescriptionTypeType]
- implicit val LSDManualClosureRejectionComplementType: OWrites[LSDManualClosureRejectionComplementType] =
- Json.writes[LSDManualClosureRejectionComplementType]
- implicit val LSDManualClosureRequestReasonCodeComplementTypeType
- : OWrites[LSDManualClosureRequestReasonCodeComplementTypeType] =
- Json.writes[LSDManualClosureRequestReasonCodeComplementTypeType]
- implicit val LSDComplementaryInformationTypeType12: OWrites[LSDComplementaryInformationTypeType12] =
- Json.writes[LSDComplementaryInformationTypeType12]
- implicit val BodyManualClosureTypeType: OWrites[BodyManualClosureTypeType] = Json.writes[BodyManualClosureTypeType]
- implicit val SupportingDocumentsTypeType: OWrites[SupportingDocumentsTypeType] =
- Json.writes[SupportingDocumentsTypeType]
- implicit val AttributesTypeType16: OWrites[AttributesTypeType16] = Json.writes[AttributesTypeType16]
- implicit val ManualClosureResponseType: OWrites[ManualClosureResponseType] = Json.writes[ManualClosureResponseType]
- implicit val BodyTypeType19: OWrites[BodyTypeType19] = Json.writes[BodyTypeType19]
- implicit val IE881Type: OWrites[IE881Type] = Json.writes[IE881Type]
-
- //IE905
-
- implicit val StatusType: Writes[StatusType] = Writes[StatusType] { t =>
- JsString(t.toString)
- }
- implicit val RequestedMessageType: Writes[RequestedMessageType] = Writes[RequestedMessageType] { t =>
- JsString(t.toString)
- }
- implicit val AttributesType: OWrites[AttributesType] = Json.writes[AttributesType]
- implicit val StatusResponseType: OWrites[StatusResponseType] = Json.writes[StatusResponseType]
- implicit val BodyType: OWrites[BodyType] = Json.writes[BodyType]
- implicit val IE905Type: OWrites[IE905Type] = Json.writes[IE905Type]
-
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE704MessageV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE704MessageV2.scala
deleted file mode 100644
index 38f07b73e..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE704MessageV2.scala
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2
-
-import generated.v2
-import generated.v2.{IE704Type, MessagesOption}
-import play.api.libs.json.{JsObject, JsValue, Json}
-import scalaxb.DataRecord
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.Refused
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.MessageTypeFormats.GeneratedJsonWritersV2
-
-import scala.xml.NodeSeq
-
-case class IE704MessageV2(
- obj: IE704Type,
- key: Option[String],
- namespace: Option[String],
- messageAuditType: MessageAuditType
-) extends IEMessage
- with GeneratedJsonWritersV2 {
- override def consigneeId: Option[String] = None
- override def consignorId: Option[String] = None
-
- override def administrativeReferenceCode: Seq[Option[String]] =
- Seq(for {
- attribute <- obj.Body.GenericRefusalMessage.AttributesValue
- arc <- attribute.AdministrativeReferenceCode
- } yield arc)
-
- override def messageType: String = MessageTypes.IE704.value
-
- override def messageIdentifier: String = obj.Header.MessageIdentifier
-
- override def toXml: NodeSeq =
- scalaxb.toXML[IE704Type](obj, namespace, key, v2.defaultScope)
-
- override def toJson: JsValue = Json.toJson(obj)
-
- override def toJsObject: JsObject = Json.toJsObject(obj)
-
- override def lrnEquals(lrn: String): Boolean =
- localReferenceNumber.contains(lrn)
-
- def localReferenceNumber: Option[String] =
- for {
- attribute <- obj.Body.GenericRefusalMessage.AttributesValue
- messageLrn <- attribute.LocalReferenceNumber
- } yield messageLrn
-
- def optionalLocalReferenceNumber: Option[String] = localReferenceNumber
-
- override def toString: String =
- s"Message type: $messageType, message identifier: $messageIdentifier, LRN: $localReferenceNumber, ARC: $administrativeReferenceCode"
-
- def correlationId = obj.Header.CorrelationIdentifier
-}
-
-object IE704MessageV2 {
- def apply(message: DataRecord[MessagesOption]): IE704MessageV2 =
- IE704MessageV2(message.as[IE704Type], message.key, message.namespace, Refused)
-
- def createFromXml(xml: NodeSeq): IE704MessageV2 = {
- val ie704: IE704Type = scalaxb.fromXML[IE704Type](xml)
- IE704MessageV2(ie704, Some(xml.head.label), Option(xml.head.namespace), Refused)
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE801MessageV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE801MessageV2.scala
deleted file mode 100644
index 5e7862c3f..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE801MessageV2.scala
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2
-
-import generated.v2
-import generated.v2.{IE801Type, MessagesOption}
-import play.api.libs.json.{JsObject, JsValue, Json}
-import scalaxb.DataRecord
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.MovementGenerated
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.MessageTypeFormats.GeneratedJsonWritersV2
-
-import scala.xml.NodeSeq
-
-case class IE801MessageV2(
- obj: IE801Type,
- key: Option[String],
- namespace: Option[String],
- messageAuditType: MessageAuditType
-) extends IEMessage
- with GeneratedJsonWritersV2 {
- def localReferenceNumber: String =
- obj.Body.EADESADContainer.EadEsad.LocalReferenceNumber
-
- def optionalLocalReferenceNumber: Option[String] = Some(obj.Body.EADESADContainer.EadEsad.LocalReferenceNumber)
-
- override def consignorId: Option[String] =
- Some(obj.Body.EADESADContainer.ConsignorTrader.TraderExciseNumber)
-
- override def consigneeId: Option[String] =
- obj.Body.EADESADContainer.ConsigneeTrader.flatMap(_.Traderid)
-
- override def administrativeReferenceCode: Seq[Option[String]] =
- Seq(Some(obj.Body.EADESADContainer.ExciseMovement.AdministrativeReferenceCode))
-
- override def messageType: String = MessageTypes.IE801.value
-
- override def toXml: NodeSeq =
- scalaxb.toXML[IE801Type](obj, namespace, key, v2.defaultScope)
-
- override def toJson: JsValue = Json.toJson(obj)
-
- override def toJsObject: JsObject = Json.toJsObject(obj)
-
- override def lrnEquals(lrn: String): Boolean = localReferenceNumber == lrn
-
- override def messageIdentifier: String = obj.Header.MessageIdentifier
-
- override def toString: String =
- s"Message type: $messageType, message identifier: $messageIdentifier, LRN: $localReferenceNumber, ARC: $administrativeReferenceCode"
-
- override def correlationId: Option[String] = obj.Header.CorrelationIdentifier
-}
-
-object IE801MessageV2 {
- def apply(message: DataRecord[MessagesOption]): IE801MessageV2 =
- IE801MessageV2(message.as[IE801Type], message.key, message.namespace, MovementGenerated)
-
- def createFromXml(xml: NodeSeq): IE801MessageV2 = {
- val ie801: IE801Type = scalaxb.fromXML[IE801Type](xml)
- IE801MessageV2(ie801, Some(xml.head.label), Option(xml.head.namespace), MovementGenerated)
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE802MessageV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE802MessageV2.scala
deleted file mode 100644
index 8e8a9f5ed..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE802MessageV2.scala
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2
-
-import generated.v2
-import generated.v2.{IE802Type, MessagesOption}
-import play.api.libs.json.{JsObject, JsValue, Json}
-import scalaxb.DataRecord
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.Reminder
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.MessageTypeFormats.GeneratedJsonWritersV2
-
-import scala.xml.NodeSeq
-
-case class IE802MessageV2(
- obj: IE802Type,
- key: Option[String],
- namespace: Option[String],
- messageAuditType: MessageAuditType
-) extends IEMessage
- with GeneratedJsonWritersV2 {
-
- def consignorId: Option[String] = None
- def consigneeId: Option[String] = None
-
- override def administrativeReferenceCode: Seq[Option[String]] =
- Seq(Some(obj.Body.ReminderMessageForExciseMovement.ExciseMovement.AdministrativeReferenceCode))
-
- override def toXml: NodeSeq =
- scalaxb.toXML[IE802Type](obj, namespace, key, v2.defaultScope)
-
- override def toJson: JsValue = Json.toJson(obj)
-
- override def toJsObject: JsObject = Json.toJsObject(obj)
-
- override def messageType: String = MessageTypes.IE802.value
-
- override def messageIdentifier: String = obj.Header.MessageIdentifier
-
- override def lrnEquals(lrn: String): Boolean = false
-
- override def toString: String =
- s"Message type: $messageType, message identifier: $messageIdentifier, ARC: $administrativeReferenceCode"
-
- override def correlationId: Option[String] = obj.Header.CorrelationIdentifier
-
- def optionalLocalReferenceNumber: Option[String] = None
-}
-
-object IE802MessageV2 {
- def apply(message: DataRecord[MessagesOption]): IE802MessageV2 =
- IE802MessageV2(message.as[IE802Type], message.key, message.namespace, Reminder)
-
- def createFromXml(xml: NodeSeq): IE802MessageV2 = {
- val ie802: IE802Type = scalaxb.fromXML[IE802Type](xml)
- IE802MessageV2(ie802, Some(xml.head.label), Option(xml.head.namespace), Reminder)
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE807MessageV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE807MessageV2.scala
deleted file mode 100644
index fb1266b56..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE807MessageV2.scala
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2
-
-import generated.v2
-import generated.v2.{IE807Type, MessagesOption}
-import play.api.libs.json.{JsObject, JsValue, Json}
-import scalaxb.DataRecord
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.InterruptionOfMovement
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.MessageTypeFormats.GeneratedJsonWritersV2
-
-import scala.xml.NodeSeq
-
-case class IE807MessageV2(
- obj: IE807Type,
- key: Option[String],
- namespace: Option[String],
- messageAuditType: MessageAuditType
-) extends IEMessage
- with GeneratedJsonWritersV2 {
-
- override def consignorId: Option[String] = None
- override def consigneeId: Option[String] = None
-
- override def administrativeReferenceCode: Seq[Option[String]] =
- Seq(Some(obj.Body.InterruptionOfMovement.AttributesValue.AdministrativeReferenceCode))
-
- override def toXml: NodeSeq =
- scalaxb.toXML[IE807Type](obj, namespace, key, v2.defaultScope)
-
- override def toJson: JsValue = Json.toJson(obj)
-
- override def toJsObject: JsObject = Json.toJsObject(obj)
-
- override def messageType: String = MessageTypes.IE807.value
-
- override def messageIdentifier: String = obj.Header.MessageIdentifier
-
- override def lrnEquals(lrn: String): Boolean = false
-
- override def toString: String =
- s"Message type: $messageType, message identifier: $messageIdentifier, ARC: $administrativeReferenceCode"
-
- override def correlationId: Option[String] = obj.Header.CorrelationIdentifier
-
- def optionalLocalReferenceNumber: Option[String] = None
-}
-
-object IE807MessageV2 {
- def apply(message: DataRecord[MessagesOption]): IE807MessageV2 =
- IE807MessageV2(message.as[IE807Type], message.key, message.namespace, InterruptionOfMovement)
-
- def createFromXml(xml: NodeSeq): IE807MessageV2 = {
- val ie807: IE807Type = scalaxb.fromXML[IE807Type](xml)
- IE807MessageV2(ie807, Some(xml.head.label), Option(xml.head.namespace), InterruptionOfMovement)
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE810MessageV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE810MessageV2.scala
deleted file mode 100644
index cf00cce68..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE810MessageV2.scala
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2
-
-import generated.v2
-import generated.v2.{IE810Type, MessagesOption}
-import play.api.libs.json.{JsObject, JsValue, Json}
-import scalaxb.DataRecord
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.CancelMovement
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.MessageTypeFormats.GeneratedJsonWritersV2
-
-import scala.xml.NodeSeq
-
-case class IE810MessageV2(
- obj: IE810Type,
- key: Option[String],
- namespace: Option[String],
- messageAuditType: MessageAuditType
-) extends IEMessage
- with GeneratedJsonWritersV2 {
-
- override def consignorId: Option[String] = None
-
- override def consigneeId: Option[String] = None
-
- override def administrativeReferenceCode: Seq[Option[String]] =
- Seq(Some(obj.Body.CancellationOfEAD.ExciseMovementEad.AdministrativeReferenceCode))
-
- override def messageType: String = MessageTypes.IE810.value
-
- override def toXml: NodeSeq =
- scalaxb.toXML[IE810Type](obj, namespace, key, v2.defaultScope)
-
- override def toJson: JsValue = Json.toJson(obj)
-
- override def toJsObject: JsObject = Json.toJsObject(obj)
-
- override def lrnEquals(lrn: String): Boolean = false
-
- override def messageIdentifier: String = obj.Header.MessageIdentifier
-
- override def toString: String =
- s"Message type: $messageType, message identifier: $messageIdentifier, ARC: $administrativeReferenceCode"
-
- override def correlationId: Option[String] = obj.Header.CorrelationIdentifier
-
- def optionalLocalReferenceNumber: Option[String] = None
-}
-
-object IE810MessageV2 {
- def apply(message: DataRecord[MessagesOption]): IE810MessageV2 =
- IE810MessageV2(message.as[IE810Type], message.key, message.namespace, CancelMovement)
-
- def createFromXml(xml: NodeSeq): IE810MessageV2 = {
- val ie810: IE810Type = scalaxb.fromXML[IE810Type](xml)
- IE810MessageV2(ie810, Some(xml.head.label), Option(xml.head.namespace), CancelMovement)
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE813MessageV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE813MessageV2.scala
deleted file mode 100644
index 1f5eed2d2..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE813MessageV2.scala
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2
-
-import generated.v2
-import generated.v2.{IE813Type, MessagesOption}
-import play.api.libs.json.{JsObject, JsValue, Json}
-import scalaxb.DataRecord
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.ChangeOfDestination
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.MessageTypeFormats.GeneratedJsonWritersV2
-
-import scala.xml.NodeSeq
-
-case class IE813MessageV2(
- obj: IE813Type,
- key: Option[String],
- namespace: Option[String],
- messageAuditType: MessageAuditType
-) extends IEMessage
- with GeneratedJsonWritersV2 {
-
- override def consignorId: Option[String] = None
-
- override def consigneeId: Option[String] =
- obj.Body.ChangeOfDestination.DestinationChanged.NewConsigneeTrader.flatMap(_.Traderid)
-
- override def administrativeReferenceCode: Seq[Option[String]] =
- Seq(Some(obj.Body.ChangeOfDestination.UpdateEadEsad.AdministrativeReferenceCode))
-
- override def messageType: String = MessageTypes.IE813.value
-
- override def toXml: NodeSeq =
- scalaxb.toXML[IE813Type](obj, namespace, key, v2.defaultScope)
-
- override def toJson: JsValue = Json.toJson(obj)
-
- override def toJsObject: JsObject = Json.toJsObject(obj)
-
- override def lrnEquals(lrn: String): Boolean = false
-
- override def messageIdentifier: String = obj.Header.MessageIdentifier
-
- override def toString: String =
- s"Message type: $messageType, message identifier: $messageIdentifier, ARC: $administrativeReferenceCode"
-
- override def correlationId: Option[String] = obj.Header.CorrelationIdentifier
-
- def optionalLocalReferenceNumber: Option[String] = None
-}
-
-object IE813MessageV2 {
- def apply(message: DataRecord[MessagesOption]): IE813MessageV2 =
- IE813MessageV2(message.as[IE813Type], message.key, message.namespace, ChangeOfDestination)
-
- def createFromXml(xml: NodeSeq): IE813MessageV2 = {
- val ie813: IE813Type = scalaxb.fromXML[IE813Type](xml)
- IE813MessageV2(ie813, Some(xml.head.label), Option(xml.head.namespace), ChangeOfDestination)
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE815MessageV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE815MessageV2.scala
deleted file mode 100644
index 8e60adc86..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE815MessageV2.scala
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2
-
-import generated.v2
-import generated.v2.IE815Type
-import play.api.libs.json.{JsObject, JsValue, Json}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.DraftMovement
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.MessageTypeFormats.GeneratedJsonWritersV2
-
-import scala.xml.NodeSeq
-
-case class IE815MessageV2(obj: IE815Type, messageAuditType: MessageAuditType)
- extends IEMessage
- with GeneratedJsonWritersV2 {
- def localReferenceNumber: String =
- obj.Body.SubmittedDraftOfEADESAD.EadEsadDraft.LocalReferenceNumber
-
- def optionalLocalReferenceNumber: Option[String] = Some(
- obj.Body.SubmittedDraftOfEADESAD.EadEsadDraft.LocalReferenceNumber
- )
-
- override def consignorId: Option[String] =
- Some(obj.Body.SubmittedDraftOfEADESAD.ConsignorTrader.TraderExciseNumber)
-
- override def consigneeId: Option[String] =
- obj.Body.SubmittedDraftOfEADESAD.ConsigneeTrader.flatMap(_.Traderid)
-
- override def administrativeReferenceCode: Seq[Option[String]] = Seq(None)
-
- override def messageType: String = MessageTypes.IE815.value
-
- override def toXml: NodeSeq =
- scalaxb.toXML[IE815Type](obj, MessageTypes.IE815.value, v2.defaultScope)
-
- override def toJson: JsValue = Json.toJson(obj)
-
- override def toJsObject: JsObject = Json.toJsObject(obj)
-
- override def lrnEquals(lrn: String): Boolean = localReferenceNumber.equals(lrn)
-
- override def messageIdentifier: String = obj.Header.MessageIdentifier
-
- override def toString: String =
- s"Message type: $messageType, message identifier: $messageIdentifier, LRN: $localReferenceNumber"
- def correlationId = obj.Header.CorrelationIdentifier
-}
-
-object IE815MessageV2 {
- def createFromXml(xml: NodeSeq): IE815MessageV2 =
- IE815MessageV2(scalaxb.fromXML[IE815Type](xml), DraftMovement)
-
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE818MessageV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE818MessageV2.scala
deleted file mode 100644
index 732fa49f8..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE818MessageV2.scala
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2
-
-import generated.v2
-import generated.v2.{IE818Type, MessagesOption}
-import play.api.libs.json.{JsObject, JsValue, Json}
-import scalaxb.DataRecord
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.ReportOfReceipt
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.MessageTypeFormats.GeneratedJsonWritersV2
-
-import scala.xml.NodeSeq
-
-case class IE818MessageV2(
- obj: IE818Type,
- key: Option[String],
- namespace: Option[String],
- messageAuditType: MessageAuditType
-) extends IEMessage
- with GeneratedJsonWritersV2 {
- override def consignorId: Option[String] = None
-
- override def consigneeId: Option[String] =
- obj.Body.AcceptedOrRejectedReportOfReceiptExport.ConsigneeTrader.Traderid
-
- override def administrativeReferenceCode: Seq[Option[String]] =
- Seq(Some(obj.Body.AcceptedOrRejectedReportOfReceiptExport.ExciseMovement.AdministrativeReferenceCode))
-
- override def messageType: String = MessageTypes.IE818.value
-
- override def toXml: NodeSeq =
- scalaxb.toXML[IE818Type](obj, namespace, key, v2.defaultScope)
-
- override def toJson: JsValue = Json.toJson(obj)
-
- override def toJsObject: JsObject = Json.toJsObject(obj)
-
- override def lrnEquals(lrn: String): Boolean = false
-
- override def messageIdentifier: String = obj.Header.MessageIdentifier
-
- override def toString: String =
- s"Message type: $messageType, message identifier: $messageIdentifier, ARC: $administrativeReferenceCode"
-
- override def correlationId: Option[String] = obj.Header.CorrelationIdentifier
-
- def optionalLocalReferenceNumber: Option[String] = None
-}
-
-object IE818MessageV2 {
- def apply(message: DataRecord[MessagesOption]): IE818MessageV2 =
- IE818MessageV2(message.as[IE818Type], message.key, message.namespace, ReportOfReceipt)
-
- def createFromXml(xml: NodeSeq): IE818MessageV2 = {
- val ie818: IE818Type = scalaxb.fromXML[IE818Type](xml)
- IE818MessageV2(ie818, Some(xml.head.label), Option(xml.head.namespace), ReportOfReceipt)
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE905MessageV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE905MessageV2.scala
deleted file mode 100644
index 11944171a..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/v2/IE905MessageV2.scala
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2
-
-import generated.v2
-import generated.v2.{IE905Type, MessagesOption}
-import play.api.libs.json.{JsObject, JsValue, Json}
-import scalaxb.DataRecord
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.MessageAuditType.StatusResponse
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.MessageTypeFormats.GeneratedJsonWritersV2
-
-import scala.xml.NodeSeq
-
-case class IE905MessageV2(
- obj: IE905Type,
- key: Option[String],
- namespace: Option[String],
- messageAuditType: MessageAuditType
-) extends IEMessage
- with GeneratedJsonWritersV2 {
-
- override def consigneeId: Option[String] = None
- override def consignorId: Option[String] = None
-
- override def administrativeReferenceCode: Seq[Option[String]] =
- Seq(Some(obj.Body.StatusResponse.AttributesValue.AdministrativeReferenceCode))
-
- override def messageType: String = MessageTypes.IE905.value
-
- override def toXml: NodeSeq =
- scalaxb.toXML[IE905Type](obj, namespace, key, v2.defaultScope)
-
- override def toJson: JsValue = Json.toJson(obj)
- override def toJsObject: JsObject = Json.toJsObject(obj)
-
- override def lrnEquals(lrn: String): Boolean = false
-
- override def messageIdentifier: String = obj.Header.MessageIdentifier
-
- override def toString: String =
- s"Message type: $messageType, message identifier: $messageIdentifier, ARC: $administrativeReferenceCode"
-
- override def correlationId: Option[String] = obj.Header.CorrelationIdentifier
-
- override def optionalLocalReferenceNumber: Option[String] = None
-}
-
-object IE905MessageV2 {
- def apply(message: DataRecord[MessagesOption]): IE905MessageV2 =
- IE905MessageV2(message.as[IE905Type], message.key, message.namespace, StatusResponse)
-
- def createFromXml(xml: NodeSeq): IE905MessageV2 = {
- val ie905: IE905Type = scalaxb.fromXML[IE905Type](xml)
- IE905MessageV2(ie905, Some(xml.head.label), Option(xml.head.namespace), StatusResponse)
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/validation/MessageValidation.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/validation/MessageValidation.scala
index 6c52e4873..1790cc385 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/validation/MessageValidation.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/validation/MessageValidation.scala
@@ -16,10 +16,11 @@
package uk.gov.hmrc.excisemovementcontrolsystemapi.models.validation
+import play.api.libs.json.Json
import play.api.mvc.Result
+import play.api.mvc.Results.{BadRequest, Forbidden}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.ErrorResponse
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.IE815MessageV2
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.Movement
import java.time.Instant
@@ -28,27 +29,61 @@ sealed trait MessageValidationResponse {
def errorMessage: String
}
-trait MessageValidation {
+case class MessageValidation() {
def validateDraftMovement(
authorisedErns: Set[String],
- ie815: IE815MessageV1
+ ie815: IE815Message
): Either[MessageValidationResponse, String] =
- IE815MessageV1Validator(ie815).validate(authorisedErns)
-
- def validateDraftMovement(
- authorisedErns: Set[String],
- ie815: IE815MessageV2
- ): Either[MessageValidationResponse, String] =
- IE815MessageV2Validator(ie815).validate(authorisedErns)
+ IE815MessageValidator(ie815).validate(authorisedErns)
def validateSubmittedMessage(
authorisedErns: Set[String],
movement: Movement,
message: IEMessage
- ): Either[MessageValidationResponse, String]
+ ): Either[MessageValidationResponse, String] = {
+ val validator: MovementMessageValidator = message match {
+ case m: IE810Message => IE810MessageValidator(m, movement)
+ case m: IE813Message => IE813MessageValidator(m, movement)
+ case m: IE818Message => IE818MessageValidator(m, movement)
+ case m: IE819Message => IE819MessageValidator(m, movement)
+ case m: IE837Message => IE837MessageValidator(m, movement)
+ case m: IE871Message => IE871MessageValidator(m, movement)
+ case m: IEMessage => InvalidMessageTypeValidator(m, movement)
+ }
+ validator.validate(authorisedErns)
+ }
+
+ def convertErrorToResponse(error: MessageValidationResponse, timestamp: Instant): Result =
+ error match {
+ case x: MessageDoesNotMatchMovement =>
+ BadRequest(
+ Json.toJson(
+ ErrorResponse(timestamp, "Message does not match movement", x.errorMessage)
+ )
+ )
+
+ case x: MessageMissingKeyInformation =>
+ BadRequest(
+ Json.toJson(
+ ErrorResponse(timestamp, "Message missing key information", x.errorMessage)
+ )
+ )
- def convertErrorToResponse(error: MessageValidationResponse, timestamp: Instant): Result
+ case x: MessageTypeInvalid =>
+ BadRequest(
+ Json.toJson(
+ ErrorResponse(timestamp, "Message type is invalid", x.errorMessage)
+ )
+ )
+
+ case x: MessageIdentifierIsUnauthorised =>
+ Forbidden(
+ Json.toJson(
+ ErrorResponse(timestamp, "Message cannot be sent", x.errorMessage)
+ )
+ )
+ }
}
object MessageValidation {
@@ -88,33 +123,211 @@ private case object ConsignorIsUnauthorised extends MessageIdentifierIsUnauthori
private case object ConsigneeIsUnauthorised extends MessageIdentifierIsUnauthorised(MessageValidation.consignee)
-private trait MessageValidator {
+private sealed trait MessageValidator {
val message: IEMessage
def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String]
}
-private[validation] sealed trait MovementValidator {
+private sealed trait MovementValidator {
this: MessageValidator =>
val movement: Movement
}
-private[validation] abstract class MovementMessageValidator(
- override val message: IEMessage,
- override val movement: Movement
-) extends MovementValidator
+private abstract class MovementMessageValidator(override val message: IEMessage, override val movement: Movement)
+ extends MovementValidator
with MessageValidator
-case class InvalidMessageTypeValidator(override val message: IEMessage, override val movement: Movement)
+private case class IE815MessageValidator(override val message: IE815Message) extends MessageValidator {
+ override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] = {
+ val consignorId: String =
+ message.consignorId.getOrElse(
+ throw new Exception(s"No Consignor on IE815: ${message.messageIdentifier}")
+ )
+ Either.cond(authorisedErns.contains(consignorId), consignorId, ConsignorIsUnauthorised)
+ }
+}
+
+private case class IE810MessageValidator(override val message: IE810Message, override val movement: Movement)
extends MovementMessageValidator(message, movement) {
override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
- Left(MessageTypeInvalid(message.messageType))
+ if (authorisedErns.contains(movement.consignorId)) {
+ Either.cond(
+ message.administrativeReferenceCode.contains(movement.administrativeReferenceCode),
+ movement.consignorId,
+ ArcDoesNotMatch
+ )
+ } else {
+ Left(ConsignorIsUnauthorised)
+ }
+}
+private case class IE813MessageValidator(override val message: IE813Message, override val movement: Movement)
+ extends MovementMessageValidator(message, movement) {
+ override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
+ if (authorisedErns.contains(movement.consignorId)) {
+ Either.cond(
+ message.administrativeReferenceCode.contains(movement.administrativeReferenceCode),
+ movement.consignorId,
+ ArcDoesNotMatch
+ )
+ } else {
+ Left(ConsignorIsUnauthorised)
+ }
}
-case class SubmitterDetails(
+private case class IE818MessageValidator(override val message: IE818Message, override val movement: Movement)
+ extends MovementMessageValidator(message, movement) {
+ override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
+ message.consigneeId match {
+
+ case Some(consignee) =>
+ if (authorisedErns.contains(consignee)) {
+ if (movement.consigneeId.contains(consignee)) {
+ Either.cond(
+ message.administrativeReferenceCode.contains(movement.administrativeReferenceCode),
+ consignee,
+ ArcDoesNotMatch
+ )
+ } else {
+ Left(ConsigneeDoesNotMatch)
+ }
+ } else {
+ Left(ConsigneeIsUnauthorised)
+ }
+
+ case _ => Left(ConsigneeIsMissing)
+ }
+}
+
+private case class IE819MessageValidator(override val message: IE819Message, override val movement: Movement)
+ extends MovementMessageValidator(message, movement) {
+ override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
+ message.consigneeId match {
+
+ case Some(consignee) =>
+ if (authorisedErns.contains(consignee)) {
+ if (movement.consigneeId.contains(consignee)) {
+ Either.cond(
+ message.administrativeReferenceCode.contains(movement.administrativeReferenceCode),
+ consignee,
+ ArcDoesNotMatch
+ )
+ } else {
+ Left(ConsigneeDoesNotMatch)
+ }
+ } else {
+ Left(ConsigneeIsUnauthorised)
+ }
+
+ case _ => Left(ConsigneeIsMissing)
+ }
+}
+
+private case class SubmitterDetails(
ern: Option[String],
movementMatcher: (Movement, String) => Boolean,
doesNotMatch: MessageDoesNotMatchMovement,
notAuthorised: MessageIdentifierIsUnauthorised
)
+
+private case class IE837MessageValidator(override val message: IE837Message, override val movement: Movement)
+ extends MovementMessageValidator(message, movement) {
+ override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
+ getSubmitter match {
+ case SubmitterDetails(Some(ern), movementMatcher, noMatch, unauthorised) if ern != "" =>
+ if (authorisedErns.contains(ern)) {
+ if (movementMatcher(movement, ern)) {
+ Either.cond(
+ message.administrativeReferenceCode.contains(movement.administrativeReferenceCode),
+ ern,
+ ArcDoesNotMatch
+ )
+ } else {
+ Left(noMatch)
+ }
+ } else {
+ Left(unauthorised)
+ }
+
+ case _ =>
+ //This is the case where SubmitterDetails(None, _, _, _) is returned
+ message.submitter match {
+ case Consignor => Left(ConsignorIsMissing)
+ case Consignee => Left(ConsigneeIsMissing)
+ }
+ }
+
+ private def getSubmitter =
+ message.submitter match {
+ case Consignor =>
+ SubmitterDetails(
+ message.consignorId,
+ (movement, identifier) => movement.consignorId == identifier,
+ ConsignorDoesNotMatch,
+ ConsignorIsUnauthorised
+ )
+
+ case Consignee =>
+ SubmitterDetails(
+ message.consigneeId,
+ (movement, identifier) => movement.consigneeId.contains(identifier),
+ ConsigneeDoesNotMatch,
+ ConsigneeIsUnauthorised
+ )
+ }
+}
+
+private case class IE871MessageValidator(override val message: IE871Message, override val movement: Movement)
+ extends MovementMessageValidator(message, movement) {
+ override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
+ getSubmitter match {
+ case SubmitterDetails(Some(ern), movementMatcher, noMatch, unauthorised) if ern != "" =>
+ if (authorisedErns.contains(ern)) {
+ if (movementMatcher(movement, ern)) {
+ Either.cond(
+ message.administrativeReferenceCode.contains(movement.administrativeReferenceCode),
+ ern,
+ ArcDoesNotMatch
+ )
+ } else {
+ Left(noMatch)
+ }
+ } else {
+ Left(unauthorised)
+ }
+
+ case _ =>
+ //This is the case where SubmitterDetails(None, _, _, _) is returned
+ message.submitter match {
+ case Consignor => Left(ConsignorIsMissing)
+ case Consignee => Left(ConsigneeIsMissing)
+ }
+ }
+
+ private def getSubmitter =
+ message.submitter match {
+ case Consignor =>
+ SubmitterDetails(
+ message.consignorId,
+ (movement, identifier) => movement.consignorId == identifier,
+ ConsignorDoesNotMatch,
+ ConsignorIsUnauthorised
+ )
+
+ case Consignee =>
+ SubmitterDetails(
+ message.consigneeId,
+ (movement, identifier) => movement.consigneeId.contains(identifier),
+ ConsigneeDoesNotMatch,
+ ConsigneeIsUnauthorised
+ )
+ }
+}
+
+private case class InvalidMessageTypeValidator(override val message: IEMessage, override val movement: Movement)
+ extends MovementMessageValidator(message, movement) {
+ override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
+ Left(MessageTypeInvalid(message.messageType))
+
+}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/validation/MessageValidationV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/validation/MessageValidationV1.scala
deleted file mode 100644
index 3c1e07125..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/validation/MessageValidationV1.scala
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Copyright 2025 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.validation
-
-import play.api.libs.json.Json
-import play.api.mvc.Result
-import play.api.mvc.Results.{BadRequest, Forbidden}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.ErrorResponse
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.Movement
-
-import java.time.Instant
-
-case class MessageValidationV1() extends MessageValidation {
-
- def validateSubmittedMessage(
- authorisedErns: Set[String],
- movement: Movement,
- message: IEMessage
- ): Either[MessageValidationResponse, String] = {
- val validator: MovementMessageValidator = message match {
- case m: IE810MessageV1 => IE810MessageV1Validator(m, movement)
- case m: IE813MessageV1 => IE813MessageV1Validator(m, movement)
- case m: IE818MessageV1 => IE818MessageV1Validator(m, movement)
- case m: IE819MessageV1 => IE819MessageV1Validator(m, movement)
- case m: IE837MessageV1 => IE837MessageV1Validator(m, movement)
- case m: IE871MessageV1 => IE871MessageV1Validator(m, movement)
- case m: IEMessage => InvalidMessageTypeValidator(m, movement)
- }
- validator.validate(authorisedErns)
- }
-
- def convertErrorToResponse(error: MessageValidationResponse, timestamp: Instant): Result =
- error match {
- case x: MessageDoesNotMatchMovement =>
- BadRequest(
- Json.toJson(
- ErrorResponse(timestamp, "Message does not match movement", x.errorMessage)
- )
- )
-
- case x: MessageMissingKeyInformation =>
- BadRequest(
- Json.toJson(
- ErrorResponse(timestamp, "Message missing key information", x.errorMessage)
- )
- )
-
- case x: MessageTypeInvalid =>
- BadRequest(
- Json.toJson(
- ErrorResponse(timestamp, "Message type is invalid", x.errorMessage)
- )
- )
-
- case x: MessageIdentifierIsUnauthorised =>
- Forbidden(
- Json.toJson(
- ErrorResponse(timestamp, "Message cannot be sent", x.errorMessage)
- )
- )
- }
-
-}
-
-private case class IE815MessageV1Validator(override val message: IE815MessageV1) extends MessageValidator {
- override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] = {
- val consignorId: String =
- message.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE815: ${message.messageIdentifier}")
- )
- Either.cond(authorisedErns.contains(consignorId), consignorId, ConsignorIsUnauthorised)
- }
-}
-
-private case class IE810MessageV1Validator(override val message: IE810MessageV1, override val movement: Movement)
- extends MovementMessageValidator(message, movement) {
- override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
- if (authorisedErns.contains(movement.consignorId)) {
- Either.cond(
- message.administrativeReferenceCode.contains(movement.administrativeReferenceCode),
- movement.consignorId,
- ArcDoesNotMatch
- )
- } else {
- Left(ConsignorIsUnauthorised)
- }
-}
-
-private case class IE813MessageV1Validator(override val message: IE813MessageV1, override val movement: Movement)
- extends MovementMessageValidator(message, movement) {
- override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
- if (authorisedErns.contains(movement.consignorId)) {
- Either.cond(
- message.administrativeReferenceCode.contains(movement.administrativeReferenceCode),
- movement.consignorId,
- ArcDoesNotMatch
- )
- } else {
- Left(ConsignorIsUnauthorised)
- }
-}
-
-private case class IE818MessageV1Validator(override val message: IE818MessageV1, override val movement: Movement)
- extends MovementMessageValidator(message, movement) {
- override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
- message.consigneeId match {
-
- case Some(consignee) =>
- if (authorisedErns.contains(consignee)) {
- if (movement.consigneeId.contains(consignee)) {
- Either.cond(
- message.administrativeReferenceCode.contains(movement.administrativeReferenceCode),
- consignee,
- ArcDoesNotMatch
- )
- } else {
- Left(ConsigneeDoesNotMatch)
- }
- } else {
- Left(ConsigneeIsUnauthorised)
- }
-
- case _ => Left(ConsigneeIsMissing)
- }
-}
-
-private case class IE819MessageV1Validator(override val message: IE819MessageV1, override val movement: Movement)
- extends MovementMessageValidator(message, movement) {
- override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
- message.consigneeId match {
-
- case Some(consignee) =>
- if (authorisedErns.contains(consignee)) {
- if (movement.consigneeId.contains(consignee)) {
- Either.cond(
- message.administrativeReferenceCode.contains(movement.administrativeReferenceCode),
- consignee,
- ArcDoesNotMatch
- )
- } else {
- Left(ConsigneeDoesNotMatch)
- }
- } else {
- Left(ConsigneeIsUnauthorised)
- }
-
- case _ => Left(ConsigneeIsMissing)
- }
-}
-
-private case class IE837MessageV1Validator(override val message: IE837MessageV1, override val movement: Movement)
- extends MovementMessageValidator(message, movement) {
- override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
- getSubmitter match {
- case SubmitterDetails(Some(ern), movementMatcher, noMatch, unauthorised) if ern != "" =>
- if (authorisedErns.contains(ern)) {
- if (movementMatcher(movement, ern)) {
- Either.cond(
- message.administrativeReferenceCode.contains(movement.administrativeReferenceCode),
- ern,
- ArcDoesNotMatch
- )
- } else {
- Left(noMatch)
- }
- } else {
- Left(unauthorised)
- }
-
- case _ =>
- //This is the case where SubmitterDetails(None, _, _, _) is returned
- message.submitter match {
- case Consignor => Left(ConsignorIsMissing)
- case Consignee => Left(ConsigneeIsMissing)
- }
- }
-
- private def getSubmitter =
- message.submitter match {
- case Consignor =>
- SubmitterDetails(
- message.consignorId,
- (movement, identifier) => movement.consignorId == identifier,
- ConsignorDoesNotMatch,
- ConsignorIsUnauthorised
- )
-
- case Consignee =>
- SubmitterDetails(
- message.consigneeId,
- (movement, identifier) => movement.consigneeId.contains(identifier),
- ConsigneeDoesNotMatch,
- ConsigneeIsUnauthorised
- )
- }
-}
-
-private case class IE871MessageV1Validator(override val message: IE871MessageV1, override val movement: Movement)
- extends MovementMessageValidator(message, movement) {
- override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
- getSubmitter match {
- case SubmitterDetails(Some(ern), movementMatcher, noMatch, unauthorised) if ern != "" =>
- if (authorisedErns.contains(ern)) {
- if (movementMatcher(movement, ern)) {
- Either.cond(
- message.administrativeReferenceCode.contains(movement.administrativeReferenceCode),
- ern,
- ArcDoesNotMatch
- )
- } else {
- Left(noMatch)
- }
- } else {
- Left(unauthorised)
- }
-
- case _ =>
- //This is the case where SubmitterDetails(None, _, _, _) is returned
- message.submitter match {
- case Consignor => Left(ConsignorIsMissing)
- case Consignee => Left(ConsigneeIsMissing)
- }
- }
-
- private def getSubmitter =
- message.submitter match {
- case Consignor =>
- SubmitterDetails(
- message.consignorId,
- (movement, identifier) => movement.consignorId == identifier,
- ConsignorDoesNotMatch,
- ConsignorIsUnauthorised
- )
-
- case Consignee =>
- SubmitterDetails(
- message.consigneeId,
- (movement, identifier) => movement.consigneeId.contains(identifier),
- ConsigneeDoesNotMatch,
- ConsigneeIsUnauthorised
- )
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/validation/MessageValidationV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/validation/MessageValidationV2.scala
deleted file mode 100644
index ba5458e2a..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/models/validation/MessageValidationV2.scala
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Copyright 2025 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.models.validation
-
-import play.api.libs.json.Json
-import play.api.mvc.Result
-import play.api.mvc.Results.{BadRequest, Forbidden}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.ErrorResponse
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.{IE837MessageV2, IE871MessageV2}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.Movement
-
-import java.time.Instant
-
-case class MessageValidationV2() extends MessageValidation {
-
- def validateSubmittedMessage(
- authorisedErns: Set[String],
- movement: Movement,
- message: IEMessage
- ): Either[MessageValidationResponse, String] = {
- val validator: MovementMessageValidator = message match {
- case m: IE810MessageV2 => IE810MessageV2Validator(m, movement)
- case m: IE813MessageV2 => IE813MessageV2Validator(m, movement)
- case m: IE818MessageV2 => IE818MessageV2Validator(m, movement)
- case m: IE819MessageV2 => IE819MessageV2Validator(m, movement)
- case m: IE837MessageV2 => IE837MessageV2Validator(m, movement)
- case m: IE871MessageV2 => IE871MessageV2Validator(m, movement)
- case m: IEMessage => InvalidMessageTypeValidator(m, movement)
- }
- validator.validate(authorisedErns)
- }
-
- def convertErrorToResponse(error: MessageValidationResponse, timestamp: Instant): Result =
- error match {
- case x: MessageDoesNotMatchMovement =>
- BadRequest(
- Json.toJson(
- ErrorResponse(timestamp, "Message does not match movement", x.errorMessage)
- )
- )
-
- case x: MessageMissingKeyInformation =>
- BadRequest(
- Json.toJson(
- ErrorResponse(timestamp, "Message missing key information", x.errorMessage)
- )
- )
-
- case x: MessageTypeInvalid =>
- BadRequest(
- Json.toJson(
- ErrorResponse(timestamp, "Message type is invalid", x.errorMessage)
- )
- )
-
- case x: MessageIdentifierIsUnauthorised =>
- Forbidden(
- Json.toJson(
- ErrorResponse(timestamp, "Message cannot be sent", x.errorMessage)
- )
- )
- }
-
-}
-
-private case class IE815MessageV2Validator(override val message: IE815MessageV2) extends MessageValidator {
- override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] = {
- val consignorId: String =
- message.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE815: ${message.messageIdentifier}")
- )
- Either.cond(authorisedErns.contains(consignorId), consignorId, ConsignorIsUnauthorised)
- }
-}
-
-private case class IE810MessageV2Validator(override val message: IE810MessageV2, override val movement: Movement)
- extends MovementMessageValidator(message, movement) {
- override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
- if (authorisedErns.contains(movement.consignorId)) {
- Either.cond(
- message.administrativeReferenceCode.contains(movement.administrativeReferenceCode),
- movement.consignorId,
- ArcDoesNotMatch
- )
- } else {
- Left(ConsignorIsUnauthorised)
- }
-}
-
-private case class IE813MessageV2Validator(override val message: IE813MessageV2, override val movement: Movement)
- extends MovementMessageValidator(message, movement) {
- override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
- if (authorisedErns.contains(movement.consignorId)) {
- Either.cond(
- message.administrativeReferenceCode.contains(movement.administrativeReferenceCode),
- movement.consignorId,
- ArcDoesNotMatch
- )
- } else {
- Left(ConsignorIsUnauthorised)
- }
-}
-
-private case class IE818MessageV2Validator(override val message: IE818MessageV2, override val movement: Movement)
- extends MovementMessageValidator(message, movement) {
- override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
- message.consigneeId match {
-
- case Some(consignee) =>
- if (authorisedErns.contains(consignee)) {
- if (movement.consigneeId.contains(consignee)) {
- Either.cond(
- message.administrativeReferenceCode.contains(movement.administrativeReferenceCode),
- consignee,
- ArcDoesNotMatch
- )
- } else {
- Left(ConsigneeDoesNotMatch)
- }
- } else {
- Left(ConsigneeIsUnauthorised)
- }
-
- case _ => Left(ConsigneeIsMissing)
- }
-}
-
-private case class IE819MessageV2Validator(override val message: IE819MessageV2, override val movement: Movement)
- extends MovementMessageValidator(message, movement) {
- override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
- message.consigneeId match {
-
- case Some(consignee) =>
- if (authorisedErns.contains(consignee)) {
- if (movement.consigneeId.contains(consignee)) {
- Either.cond(
- message.administrativeReferenceCode.contains(movement.administrativeReferenceCode),
- consignee,
- ArcDoesNotMatch
- )
- } else {
- Left(ConsigneeDoesNotMatch)
- }
- } else {
- Left(ConsigneeIsUnauthorised)
- }
-
- case _ => Left(ConsigneeIsMissing)
- }
-}
-
-private case class IE837MessageV2Validator(override val message: IE837MessageV2, override val movement: Movement)
- extends MovementMessageValidator(message, movement) {
- override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
- getSubmitter match {
- case SubmitterDetails(Some(ern), movementMatcher, noMatch, unauthorised) if ern != "" =>
- if (authorisedErns.contains(ern)) {
- if (movementMatcher(movement, ern)) {
- Either.cond(
- message.administrativeReferenceCode.contains(movement.administrativeReferenceCode),
- ern,
- ArcDoesNotMatch
- )
- } else {
- Left(noMatch)
- }
- } else {
- Left(unauthorised)
- }
-
- case _ =>
- //This is the case where SubmitterDetails(None, _, _, _) is returned
- message.submitter match {
- case Consignor => Left(ConsignorIsMissing)
- case Consignee => Left(ConsigneeIsMissing)
- }
- }
-
- private def getSubmitter =
- message.submitter match {
- case Consignor =>
- SubmitterDetails(
- message.consignorId,
- (movement, identifier) => movement.consignorId == identifier,
- ConsignorDoesNotMatch,
- ConsignorIsUnauthorised
- )
-
- case Consignee =>
- SubmitterDetails(
- message.consigneeId,
- (movement, identifier) => movement.consigneeId.contains(identifier),
- ConsigneeDoesNotMatch,
- ConsigneeIsUnauthorised
- )
- }
-}
-
-private case class IE871MessageV2Validator(override val message: IE871MessageV2, override val movement: Movement)
- extends MovementMessageValidator(message, movement) {
- override def validate(authorisedErns: Set[String]): Either[MessageValidationResponse, String] =
- getSubmitter match {
- case SubmitterDetails(Some(ern), movementMatcher, noMatch, unauthorised) if ern != "" =>
- if (authorisedErns.contains(ern)) {
- if (movementMatcher(movement, ern)) {
- Either.cond(
- message.administrativeReferenceCode.contains(movement.administrativeReferenceCode),
- ern,
- ArcDoesNotMatch
- )
- } else {
- Left(noMatch)
- }
- } else {
- Left(unauthorised)
- }
-
- case _ =>
- //This is the case where SubmitterDetails(None, _, _, _) is returned
- message.submitter match {
- case Consignor => Left(ConsignorIsMissing)
- case Consignee => Left(ConsigneeIsMissing)
- }
- }
-
- private def getSubmitter =
- message.submitter match {
- case Consignor =>
- SubmitterDetails(
- message.consignorId,
- (movement, identifier) => movement.consignorId == identifier,
- ConsignorDoesNotMatch,
- ConsignorIsUnauthorised
- )
-
- case Consignee =>
- SubmitterDetails(
- message.consigneeId,
- (movement, identifier) => movement.consigneeId.contains(identifier),
- ConsigneeDoesNotMatch,
- ConsigneeIsUnauthorised
- )
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/repository/MovementRepository.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/repository/MovementRepository.scala
index 38110592e..443a22abb 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/repository/MovementRepository.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/repository/MovementRepository.scala
@@ -49,7 +49,7 @@ class MovementRepository @Inject() (
configuration: Configuration
)(implicit ec: ExecutionContext)
extends PlayMongoRepository[Movement](
- collectionName = appConfig.movementCollectionName,
+ collectionName = "movements_v2",
mongoComponent = mongo,
domainFormat = Movement.format,
indexes = mongoIndexes(appConfig.movementTTL),
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/repository/TransformLogRepository.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/repository/TransformLogRepository.scala
deleted file mode 100644
index 8f33609a1..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/repository/TransformLogRepository.scala
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright 2025 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.repository
-
-import org.mongodb.scala.model._
-import org.mongodb.scala.model.Filters.equal
-import play.api.Configuration
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.TransformLogRepository.mongoIndexes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Movement, TransformLog}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.{DateTimeService, Mdc}
-import org.mongodb.scala.model.Filters._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.config.AppConfig
-import uk.gov.hmrc.mongo.MongoComponent
-import uk.gov.hmrc.mongo.play.json.PlayMongoRepository
-
-import java.util.concurrent.TimeUnit
-import javax.inject.{Inject, Singleton}
-import scala.concurrent.duration.Duration
-import scala.concurrent.{ExecutionContext, Future}
-
-@Singleton
-class TransformLogRepository @Inject() (
- mongo: MongoComponent,
- configuration: Configuration,
- timeService: DateTimeService,
- appConfig: AppConfig
-)(implicit
- ec: ExecutionContext
-) extends PlayMongoRepository[TransformLog](
- collectionName = "transform_log",
- mongoComponent = mongo,
- domainFormat = TransformLog.format,
- indexes = mongoIndexes(appConfig.transformLogTTL),
- replaceIndexes = true
- ) {
-
- def saveLog(log: Seq[TransformLog]): Future[Boolean] = Mdc.preservingMdc {
- collection
- .insertMany(
- log,
- InsertManyOptions().ordered(false)
- )
- .toFuture()
- .map(_ => true)
- }
-
- def saveLog(transformLog: TransformLog): Future[Boolean] = Mdc.preservingMdc {
- collection
- .replaceOne(
- Filters.eq("_id", transformLog._id),
- transformLog,
- ReplaceOptions().upsert(true)
- )
- .toFuture()
- .map(_ => true)
- }
- def saveLogs(transformLogs: Seq[TransformLog]): Future[Boolean] = Mdc.preservingMdc {
-
- collection
- .bulkWrite {
- transformLogs.map { log =>
- ReplaceOneModel(
- Filters.eq("_id", log._id),
- log,
- ReplaceOptions().upsert(true)
- )
- }
- }
- .toFuture()
- .map(_ => true)
- }
-
- def findLog(movement: Movement) = Mdc.preservingMdc {
- val filter =
- and(equal("_id", movement._id), equal("isTransformSuccess", true), equal("messageCount", movement.messages.size))
-
- collection
- .find(filter)
- .first()
- .toFutureOption()
- .map {
- case Some(log) => true
- case None => false
- }
-
- }
-
- def findLog(movement: String): Future[Option[TransformLog]] = Mdc.preservingMdc {
- val filter = equal("_id", movement)
-
- collection
- .find(filter)
- .first()
- .toFutureOption()
-
- }
-
-}
-
-object TransformLogRepository {
- def mongoIndexes(ttl: Duration): Seq[IndexModel] =
- Seq(
- IndexModel(
- Indexes.ascending("lastUpdatedMovement"),
- IndexOptions()
- .name("lastUpdatedMovement_ttl_index")
- .expireAfter(ttl.toSeconds, TimeUnit.SECONDS)
- ),
- IndexModel(
- Indexes.ascending("lastUpdatedLog"),
- IndexOptions().name("lastUpdatedLog_idx")
- )
- )
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/repository/TransformationRepository.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/repository/TransformationRepository.scala
deleted file mode 100644
index f12637f44..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/repository/TransformationRepository.scala
+++ /dev/null
@@ -1,358 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.repository
-
-import cats.implicits.toFunctorOps
-import org.apache.pekko.Done
-import org.bson.conversions.Bson
-import org.mongodb.scala.model.Filters._
-import org.mongodb.scala.model._
-import play.api.Configuration
-import play.api.libs.Files.logger
-import play.api.libs.json.Json
-import uk.gov.hmrc.excisemovementcontrolsystemapi.config.AppConfig
-import uk.gov.hmrc.excisemovementcontrolsystemapi.filters.MovementFilter
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.MovementRepository._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.{DateTimeService, Mdc}
-import uk.gov.hmrc.mongo.MongoComponent
-import uk.gov.hmrc.mongo.play.json.Codecs.JsonOps
-import uk.gov.hmrc.mongo.play.json.{Codecs, PlayMongoRepository}
-
-import java.time.Instant
-import javax.inject.{Inject, Singleton}
-import scala.concurrent.{ExecutionContext, Future}
-import scala.jdk.CollectionConverters.SeqHasAsJava
-
-@Singleton
-class TransformationRepository @Inject() (
- mongo: MongoComponent,
- appConfig: AppConfig,
- timeService: DateTimeService,
- configuration: Configuration
-)(implicit ec: ExecutionContext)
- extends PlayMongoRepository[Movement](
- collectionName = "movements_v2",
- mongoComponent = mongo,
- domainFormat = Movement.format,
- indexes = mongoIndexes(appConfig.movementV2TTL),
- extraCodecs = Seq(
- Codecs.playFormatCodec(ErnAndLastReceived.format),
- Codecs.playFormatCodec(MessageNotification.format)
- ),
- replaceIndexes = true
- ) {
-
- private def byId(id: String): Bson = Filters.equal("_id", id)
-
- private def byLrnAndErns(localReferenceNumber: String, erns: List[String]): Bson =
- and(
- equal("localReferenceNumber", localReferenceNumber),
- or(in("consignorId", erns: _*), in("consigneeId", erns: _*))
- )
-
- def findDraftMovement(movement: Movement): Future[Option[Movement]] = Mdc.preservingMdc {
- val filters = Seq(
- Some(equal("consignorId", movement.consignorId)),
- Some(equal("localReferenceNumber", movement.localReferenceNumber)),
- Some(not(exists("administrativeReferenceCode")))
- // consigneeId is not included here
- // This should make it match the duplication checking logic in Core so we
- // don't have the problem where movements are saved successfully by Core
- // and then rejected as being duplicates by EMCS API - for more info see CS-6769
- )
- collection
- .find(
- filter = and(
- filters.flatten: _*
- )
- )
- .headOption()
- }
-
- def saveMovement(movement: Movement): Future[Done] = Mdc.preservingMdc {
- collection
- .findOneAndReplace(
- filter = byId(movement._id),
- replacement = movement.copy(lastUpdated = timeService.timestamp()),
- FindOneAndReplaceOptions().upsert(true)
- )
- .toFuture()
- .as(Done)
- }
-
- def saveMovements(movement: Seq[Movement]): Future[Boolean] = Mdc.preservingMdc {
- collection
- .insertMany(
- movement,
- InsertManyOptions().ordered(false)
- )
- .toFuture()
- .map(_ => true)
-
- }
-
- def updateMovements(movements: Seq[Movement]): Future[Boolean] = Mdc.preservingMdc {
- collection
- .bulkWrite {
- movements.map { movement =>
- ReplaceOneModel(
- Filters.eq("_id", movement._id),
- movement,
- ReplaceOptions().upsert(true)
- )
- }
- }
- .toFuture()
- .map(_ => true)
-
- }
-
- def getMovementById(id: String): Future[Option[Movement]] = Mdc.preservingMdc {
- collection.find(byId(id)).headOption()
- }
-
- def getMovementByLRNAndERNIn(lrn: String, erns: List[String]): Future[Seq[Movement]] = Mdc.preservingMdc {
- collection.find(byLrnAndErns(lrn, erns)).toFuture()
- }
-
- private def getFilteredMovementByERN(
- ern: String,
- localReferenceNumbers: Seq[String],
- administrativeReferenceCodes: Seq[String]
- ): Future[Seq[Movement]] = Mdc.preservingMdc {
-
- val ernFilters = or(getErnFilters(Seq(ern)): _*)
-
- val idFilter: Bson = Filters.or(
- Filters.in("localReferenceNumber", localReferenceNumbers: _*),
- Filters.in("administrativeReferenceCode", administrativeReferenceCodes: _*)
- )
-
- collection
- .find(
- and(
- idFilter,
- ernFilters
- )
- )
- .toFuture()
- }
-
- def getMovementByERN(
- ern: Seq[String],
- movementFilter: MovementFilter = MovementFilter.emptyFilter
- ): Future[Seq[Movement]] = Mdc.preservingMdc {
-
- val ernFilters = getErnFilters(ern)
-
- val filters =
- Seq(
- movementFilter.updatedSince.map(Filters.gte("lastUpdated", _)),
- movementFilter.lrn.map(Filters.eq("localReferenceNumber", _)),
- movementFilter.arc.map(Filters.eq("administrativeReferenceCode", _)),
- movementFilter.ern.map(ern =>
- Filters
- .or(Filters.eq("consignorId", ern), Filters.eq("consigneeId", ern), Filters.eq("messages.recipient", ern))
- )
- ).flatten
-
- val filter = if (filters.nonEmpty) Filters.and(filters: _*) else Filters.empty()
-
- collection
- .find(
- and(
- filter,
- or(
- ernFilters: _*
- )
- )
- )
- .toFuture()
- }
-
- private def getErnFilters(ern: Seq[String]) =
- Seq(
- Filters.in("consignorId", ern: _*),
- Filters.in("consigneeId", ern: _*),
- Filters.in("messages.recipient", ern: _*)
- )
-
- object MovementFilterThresholds {
- sealed trait Threshold
-
- case object Normal extends Threshold
-
- case object Filtered extends Threshold
-
- case object Failure extends Threshold
- }
-
- def protectionFilter(ern: String): Future[MovementFilterThresholds.Threshold] = {
- val movementFilter: MovementFilter = MovementFilter.emptyFilter
- val filters =
- Seq(
- movementFilter.updatedSince.map(Filters.gte("lastUpdated", _)),
- movementFilter.lrn.map(Filters.eq("localReferenceNumber", _)),
- movementFilter.arc.map(Filters.eq("administrativeReferenceCode", _)),
- movementFilter.ern.map(ern =>
- Filters
- .or(Filters.eq("consignorId", ern), Filters.eq("consigneeId", ern), Filters.eq("messages.recipient", ern))
- )
- ).flatten
-
- val movementThreshold = configuration.get[Int]("movement.threshold")
- val movementFailureThreshold =
- configuration.getOptional[Int]("movement.failureThreshold").getOrElse(movementThreshold)
-
- val filter = if (filters.nonEmpty) Filters.and(filters: _*) else Filters.empty()
-
- val ernFilters = getErnFilters(Seq(ern))
-
- collection
- .countDocuments(
- and(
- filter,
- or(
- ernFilters: _*
- )
- )
- )
- .toFuture()
- .map { count =>
- if (count > movementThreshold && count <= movementFailureThreshold) {
- logger.warn(s"Protection filter filtering to occur for ERN: $ern - Count is $count")
- MovementFilterThresholds.Filtered
- } else if (count > movementFailureThreshold) {
- logger.warn(s"Protection filter responded with an error for ERN: $ern - Count is $count")
- MovementFilterThresholds.Failure
- } else {
- MovementFilterThresholds.Normal
- }
- }
- }
-
- def getAllBy(
- ern: String,
- localReferenceNumbers: Seq[String],
- administrativeReferenceCodes: Seq[String]
- ): Future[Seq[Movement]] = Mdc.preservingMdc {
- val protectFilter: Future[MovementFilterThresholds.Threshold] =
- if (appConfig.protectionFilterEnabled) {
- protectionFilter(ern)
- } else {
- Future.successful(MovementFilterThresholds.Filtered)
- }
-
- protectFilter.flatMap {
- case MovementFilterThresholds.Filtered =>
- getFilteredMovementByERN(ern, localReferenceNumbers, administrativeReferenceCodes)
- case MovementFilterThresholds.Normal =>
- getMovementByERN(Seq(ern), MovementFilter.emptyFilter)
- case MovementFilterThresholds.Failure =>
- throw new Exception(s"Protection filter responded with an error for ERN: $ern")
- }
- }
-
- def getByArc(arc: String): Future[Option[Movement]] = Mdc.preservingMdc {
- collection
- .find(
- filter = Filters.equal("administrativeReferenceCode", arc)
- )
- .headOption()
- }
-
- def getErnsAndLastReceived: Future[Map[String, Instant]] = Mdc.preservingMdc {
- collection
- .aggregate[ErnAndLastReceived](
- Seq(
- Aggregates.unwind("$messages"),
- Aggregates.group("$messages.recipient", Accumulators.max("lastReceived", "$messages.createdOn"))
- )
- )
- .toFuture()
- .map {
- _.map { field =>
- field._id -> field.lastReceived
- }.toMap
- }
- }
-
- def getPendingMessageNotifications: Future[Seq[MessageNotification]] = Mdc.preservingMdc {
- collection
- .aggregate[MessageNotification](
- Seq(
- // This match is to do an initial filter which filters out all movements that have no
- // messages which need to notify.
- // `Filters.gt("boxesToNotify", "")` is the best way I've found to do this filter which
- // also uses the index on the "boxesToNotify" field
- Aggregates.`match`(Filters.elemMatch("messages", Filters.gt("boxesToNotify", ""))),
- Aggregates.unwind("$messages"),
- Aggregates.unwind("$messages.boxesToNotify"),
- Aggregates.replaceRoot(
- Json
- .obj(
- "movementId" -> "$_id",
- "messageId" -> "$messages.messageId",
- "messageType" -> "$messages.messageType",
- "consignor" -> "$consignorId",
- "consignee" -> "$consigneeId",
- "arc" -> "$administrativeReferenceCode",
- "recipient" -> "$messages.recipient",
- "boxId" -> "$messages.boxesToNotify"
- )
- .toDocument
- )
- )
- )
- .toFuture()
- }
-
- def confirmNotification(movementId: String, messageId: String, boxId: String): Future[Done] = Mdc.preservingMdc {
- collection
- .updateOne(
- Filters.eq("_id", movementId),
- Updates.pull("messages.$[m].boxesToNotify", boxId),
- UpdateOptions().arrayFilters(List(Filters.eq("m.messageId", messageId)).asJava)
- )
- .toFuture()
- .as(Done)
- }
-
- def addBoxIdToMessages(recipient: String, boxId: String): Future[Done] = Mdc.preservingMdc {
- collection
- .updateMany(
- Filters.eq("messages.recipient", recipient),
- Updates.addToSet("messages.$[m].boxesToNotify", boxId),
- UpdateOptions().arrayFilters(List(Filters.eq("m.recipient", recipient)).asJava)
- )
- .toFuture()
- .as(Done)
- }
-
- def removeBoxIdFromMessages(recipient: String, boxId: String): Future[Done] = Mdc.preservingMdc {
- collection
- .updateMany(
- Filters.eq("messages.recipient", recipient),
- Updates.pull("messages.$[m].boxesToNotify", boxId),
- UpdateOptions().arrayFilters(List(Filters.eq("m.recipient", recipient)).asJava)
- )
- .toFuture()
- .as(Done)
- }
-
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/repository/model/TransformLog.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/repository/model/TransformLog.scala
deleted file mode 100644
index e327f33dc..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/repository/model/TransformLog.scala
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2026 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model
-
-import play.api.libs.json.{Format, Json, OFormat}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.services.EnhancedTransformationError
-import uk.gov.hmrc.mongo.play.json.formats.MongoJavatimeFormats
-
-import java.time.Instant
-
-case class TransformLog(
- _id: String,
- isTransformSuccess: Boolean,
- errors: Seq[EnhancedTransformationError], //update to EnhancedError
- lastUpdatedMovement: Instant,
- lastUpdatedLog: Instant,
- messageCount: Int
-)
-
-object TransformLog {
- implicit val instantFormat: Format[Instant] = MongoJavatimeFormats.instantFormat
- implicit lazy val format: OFormat[TransformLog] = Json.format
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/scheduling/TransformJob.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/scheduling/TransformJob.scala
deleted file mode 100644
index 0ecc9f668..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/scheduling/TransformJob.scala
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright 2026 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.scheduling
-
-import cats.implicits.toTraverseOps
-import cats.syntax.parallel._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.{MovementRepository, TransformLogRepository, TransformationRepository}
-import org.apache.pekko.stream.scaladsl._
-import org.apache.pekko.stream.{ActorAttributes, Materializer, Supervision}
-import org.mongodb.scala.model.Filters.equal
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Movement, TransformLog}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.services.{EnhancedTransformationError, TransformService}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.DateTimeService
-import uk.gov.hmrc.mongo.lock.{LockRepository, TimePeriodLockService}
-import play.api.Logging
-import uk.gov.hmrc.mongo.MongoUtils.DuplicateKey
-
-import java.util.concurrent.atomic.AtomicInteger
-import scala.concurrent.{ExecutionContext, Future}
-import scala.concurrent.duration._
-import javax.inject.{Inject, Singleton}
-
-@Singleton
-class TransformJob @Inject() (
- val movementRepository: MovementRepository,
- transformationRepository: TransformationRepository,
- transformLogRepository: TransformLogRepository,
- transformService: TransformService,
- timeService: DateTimeService,
- val lockRepository: LockRepository
-)(implicit val mat: Materializer)
- extends TimePeriodLockService
- with Logging {
-
- def name: String = "movement-transformation-job"
-
- implicit val ec: ExecutionContext = mat.executionContext
- override val lockId: String = name
- override val ttl: Duration = Duration.create(15, MINUTES)
-
- def execute(): Future[ScheduledJob.Result] = {
- logger.warn(s"$name started")
- val movementsCount = movementRepository.collection.countDocuments().toFuture()
- val transformedCount = new AtomicInteger(0)
- val processorCount = Runtime.getRuntime.availableProcessors()
- val done = Source
- .fromPublisher(movementRepository.collection.find().batchSize(100))
- .zipWithIndex
- .mapAsync(1) { case (movement, index) =>
- // Renew the lock every 5000 movements
- if (index % 5000 == 0)
- withRenewedLock(Future.successful(movement))
- else
- Future.successful(Some(movement))
- }
- .collect { case Some(movement) => movement }
- .grouped(100)
- .mapAsyncUnordered(processorCount) { movements =>
- movements.flatTraverse[Future, Movement] { movement =>
- transformLogRepository.findLog(movement).map {
- case true => Nil
- case false => List(movement)
- }
- }
-
- }
- .mapAsyncUnordered(processorCount) { mov =>
- mov
- .flatTraverse[Future, Movement] { movement =>
- val transformResult =
- Future.sequence(movement.messages.map { message =>
- transformService.transform(message.messageType, message.encodedMessage).map {
- case Right(e) => Right(message.copy(encodedMessage = e))
- case Left(err) =>
- logger.warn(
- s"$name Error while transforming movement id: ${movement._id} message type: ${message.messageType} & message Id: ${message.messageId}"
- )
- Left(
- EnhancedTransformationError(err, messageType = message.messageType, messageID = message.messageId)
- )
- }
- })
-
- val updatedMovement = transformResult.map(a => a.collect { case Right(e) => e }).map { messages =>
- movement.copy(messages = messages)
- }
-
- val errorList = transformResult.map(a => a.collect { case Left(e) => e })
-
- for {
- updatedMov <- updatedMovement
- errList <- errorList
- mov <- logTransformation(movement, updatedMov, errList)
- } yield mov
- }
-
- }
- .filter(_.nonEmpty)
- .mapAsyncUnordered(processorCount) { movements =>
- transformationRepository
- .updateMovements(movements)
- .flatMap { _ =>
- transformLogRepository
- .saveLogs(
- movements.map { m =>
- TransformLog(
- m._id,
- isTransformSuccess = true,
- errors = Nil,
- lastUpdatedMovement = m.lastUpdated,
- lastUpdatedLog = timeService.timestamp(),
- m.messages.size
- )
- }
- )
- }
- .recover { case DuplicateKey(e) =>
- logger.warn(s"Illegal State Duplicate key $e")
- false
- }
- }
- .withAttributes(ActorAttributes.withSupervisionStrategy { err =>
- logger.error(
- s"$name : ${err.getClass.getName} "
- )
- Supervision.resume
- })
- .map { _ =>
- movementsCount.foreach { count =>
- if (transformedCount.addAndGet(100) % 1000 == 0)
- logger.warn(
- s"Progress: ${transformedCount.get()}/$count : ${((transformedCount.get().toDouble / count) * 100).round}%"
- )
- }
- }
- .run()
- .map { _ =>
- logger.warn(s"$name completed")
- ScheduledJob.Result.Completed
- }
-
- done
- }
-
- shouldRun().map {
- case true => withRenewedLock(execute())
- case false => logger.warn("All movements are already transformed")
- }
-
- //atomic adder
- private def logTransformation(
- movement: Movement,
- updatedMovement: Movement,
- errList: Seq[EnhancedTransformationError]
- ) =
- if (updatedMovement.messages.size != movement.messages.size) {
- val log = TransformLog(
- updatedMovement._id,
- isTransformSuccess = false,
- errList,
- movement.lastUpdated,
- timeService.timestamp(),
- updatedMovement.messages.size
- )
- transformLogRepository.saveLog(log).map { _ =>
- Nil
- }
-
- } else {
- Future.successful(List(updatedMovement))
- }
-
- private def shouldRun(): Future[Boolean] = {
- val filter = equal("isTransformSuccess", true)
- val movementsCount = movementRepository.collection.countDocuments().toFuture()
- val transformLogCount = transformLogRepository.collection.countDocuments(filter).toFuture()
-
- for {
- movementCount <- movementsCount
- logCount <- transformLogCount
-
- } yield movementCount > logCount
- }
-
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/AuditService.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/AuditService.scala
index 4a9bcf38b..de48e9f49 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/AuditService.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/AuditService.scala
@@ -17,57 +17,100 @@
package uk.gov.hmrc.excisemovementcontrolsystemapi.services
import cats.data.EitherT
+import play.api.Logging
import play.api.mvc.{AnyContent, Result}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.config.AppConfig
import uk.gov.hmrc.excisemovementcontrolsystemapi.filters.MovementFilter
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing._
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auth.{EnrolmentRequest, ParsedXmlRequest}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{GetMessagesResponse, IEMessage}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.IE815MessageV1
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.IE815MessageV2
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{GetMessagesResponse, IE815Message, IEMessage}
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Message, Movement}
import uk.gov.hmrc.http.HeaderCarrier
+import uk.gov.hmrc.play.audit.http.connector.{AuditConnector, AuditResult}
-import scala.concurrent.Future
+import javax.inject.{Inject, Singleton}
+import scala.concurrent.{ExecutionContext, Future}
import scala.xml.NodeSeq
-trait AuditService {
+@Singleton
+class AuditService @Inject() (auditConnector: AuditConnector, appConfig: AppConfig, factory: AuditEventFactory)(implicit
+ ec: ExecutionContext
+) extends Auditing
+ with Logging {
// old auditing
- def auditMessage(message: IEMessage)(implicit hc: HeaderCarrier): EitherT[Future, Result, Unit]
+ def auditMessage(message: IEMessage)(implicit hc: HeaderCarrier): EitherT[Future, Result, Unit] =
+ auditMessage(message, None)
def auditMessage(message: IEMessage, failureReason: String)(implicit
hc: HeaderCarrier
- ): EitherT[Future, Result, Unit]
+ ): EitherT[Future, Result, Unit] =
+ auditMessage(message, Some(failureReason))
def messageSubmitted(
movement: Movement,
submittedToCore: Boolean,
correlationId: Option[String],
request: ParsedXmlRequest[NodeSeq]
- )(implicit hc: HeaderCarrier): Unit
+ )(implicit hc: HeaderCarrier): Unit =
+ if (appConfig.newAuditingEnabled) {
- def messageSubmittedNoMovement(
- message: IE815MessageV1,
- submittedToCore: Boolean,
- correlationId: Option[String],
- request: ParsedXmlRequest[NodeSeq]
- )(implicit hc: HeaderCarrier): Unit
+ val event = factory.createMessageSubmitted(movement, submittedToCore, correlationId, request)
+
+ auditConnector.sendExplicitAudit("MessageSubmitted", event)
+ }
def messageSubmittedNoMovement(
- message: IE815MessageV2,
+ message: IE815Message,
submittedToCore: Boolean,
correlationId: Option[String],
request: ParsedXmlRequest[NodeSeq]
- )(implicit hc: HeaderCarrier): Unit
+ )(implicit hc: HeaderCarrier): Unit =
+ if (appConfig.newAuditingEnabled) {
+
+ val event = factory.createMessageSubmittedNoMovement(
+ message,
+ submittedToCore,
+ correlationId,
+ request
+ )
+
+ auditConnector.sendExplicitAudit("MessageSubmitted", event)
+ }
+
+ // old auditing
+ private def auditMessage(message: IEMessage, failureOpt: Option[String])(implicit
+ hc: HeaderCarrier
+ ): EitherT[Future, Result, Unit] =
+ EitherT {
+
+ auditConnector.sendExtendedEvent(factory.createMessageAuditEvent(message, failureOpt)).map {
+ case f: AuditResult.Failure => Right(logger.error(f.msg))
+ case _ => Right(())
+ }
+ }
def getInformationForGetMovements(
movementFilter: MovementFilter,
movements: Seq[Movement],
request: EnrolmentRequest[AnyContent]
- )(implicit hc: HeaderCarrier): Unit
+ )(implicit hc: HeaderCarrier): Unit =
+ if (appConfig.newAuditingEnabled) {
+ val event = factory.createGetMovementsDetails(
+ movementFilter,
+ movements,
+ request
+ )
+ auditConnector.sendExplicitAudit("GetInformation", event)
+ }
def getInformationForGetSpecificMovement(
movementId: String,
request: EnrolmentRequest[AnyContent]
- )(implicit hc: HeaderCarrier): Unit
+ )(implicit hc: HeaderCarrier): Unit =
+ if (appConfig.newAuditingEnabled) {
+ val event = factory.createGetSpecificMovementDetails(movementId, request)
+ auditConnector.sendExplicitAudit("GetInformation", event)
+ }
def getInformationForGetMessages(
messages: Seq[Message],
@@ -75,31 +118,61 @@ trait AuditService {
updatedSince: Option[String],
traderType: Option[String],
request: EnrolmentRequest[AnyContent]
- )(implicit hc: HeaderCarrier): Unit
+ )(implicit hc: HeaderCarrier): Unit =
+ if (appConfig.newAuditingEnabled) {
+ val event = factory.createGetMessagesAuditInfo(messages, movement, updatedSince, traderType, request)
+ auditConnector.sendExplicitAudit("GetInformation", event)
+ }
def getInformationForGetSpecificMessage(
movement: Movement,
message: Message,
request: EnrolmentRequest[AnyContent]
- )(implicit hc: HeaderCarrier): Unit
+ )(implicit hc: HeaderCarrier): Unit =
+ if (appConfig.newAuditingEnabled) {
+ val event = factory.createGetSpecificMessageAuditInfo(movement, message, request)
+ auditConnector.sendExplicitAudit("GetInformation", event)
+ }
def messageProcessingSuccess(
ern: String,
response: GetMessagesResponse,
batchId: String,
jobId: Option[String]
- )(implicit hc: HeaderCarrier): Unit
+ )(implicit hc: HeaderCarrier): Unit =
+ if (appConfig.processingAuditingEnabled) {
+ val messageProcessingSuccessAuditInfo = factory.createMessageProcessingSuccessAuditInfo(
+ ern,
+ response,
+ batchId,
+ jobId
+ )
+ auditConnector.sendExplicitAudit("MessageProcessing", messageProcessingSuccessAuditInfo)
+
+ }
def messageProcessingFailure(ern: String, failureReason: String, batchId: String, jobId: Option[String])(implicit
hc: HeaderCarrier
- ): Unit
+ ): Unit =
+ if (appConfig.processingAuditingEnabled) {
+ val messageProcessingFailureAuditInfo =
+ factory.createMessageProcessingFailureAuditInfo(ern, failureReason, batchId, jobId)
+
+ auditConnector.sendExplicitAudit("MessageProcessing", messageProcessingFailureAuditInfo)
+ }
def movementSavedSuccess(
movement: Movement,
batchId: Option[String],
jobId: Option[String],
newMessages: Seq[Message]
- )(implicit hc: HeaderCarrier): Unit
+ )(implicit hc: HeaderCarrier): Unit =
+ if (appConfig.processingAuditingEnabled) {
+ val movementSavedSuccessAuditInfo =
+ factory.createMovementSavedSuccessAuditInfo(movement, batchId, jobId, newMessages)
+
+ auditConnector.sendExplicitAudit("MovementSaved", movementSavedSuccessAuditInfo)
+ }
def movementSavedFailure(
movement: Movement,
@@ -107,13 +180,31 @@ trait AuditService {
batchId: Option[String],
jobId: Option[String],
messagesToBeAdded: Seq[Message]
- )(implicit hc: HeaderCarrier): Unit
-
+ )(implicit hc: HeaderCarrier): Unit =
+ if (appConfig.processingAuditingEnabled) {
+ val movementSavedFailureAuditInfo = factory.createMovementSavedFailureAuditInfo(
+ movement,
+ failureReason,
+ batchId,
+ jobId,
+ messagesToBeAdded
+ )
+
+ auditConnector.sendExplicitAudit("MovementSaved", movementSavedFailureAuditInfo)
+ }
def messageAcknowledged(ern: String, batchId: String, jobId: Option[String], recordsAffected: Int)(implicit
hc: HeaderCarrier
- ): Unit
+ ): Unit =
+ if (appConfig.processingAuditingEnabled) {
+ val event = factory.createMessageAcknowledgedEvent(ern, batchId, jobId, recordsAffected)
+ auditConnector.sendExplicitAudit("MessageAcknowledged", event)
+ }
def messageNotAcknowledged(ern: String, batchId: String, jobId: Option[String], failureReason: String)(implicit
hc: HeaderCarrier
- ): Unit
+ ): Unit =
+ if (appConfig.processingAuditingEnabled) {
+ val event = factory.createMessageNotAcknowledgedEvent(ern, batchId, jobId, failureReason)
+ auditConnector.sendExplicitAudit("MessageAcknowledged", event)
+ }
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/AuditServiceV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/AuditServiceV1.scala
deleted file mode 100644
index e8718d435..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/AuditServiceV1.scala
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright 2025 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.services
-
-import cats.data.EitherT
-import play.api.Logging
-import play.api.mvc.{AnyContent, Result}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.config.AppConfig
-import uk.gov.hmrc.excisemovementcontrolsystemapi.filters.MovementFilter
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auth.{EnrolmentRequest, ParsedXmlRequest}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.IE815MessageV1
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.IE815MessageV2
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{GetMessagesResponse, IEMessage}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Message, Movement}
-import uk.gov.hmrc.http.HeaderCarrier
-import uk.gov.hmrc.play.audit.http.connector.{AuditConnector, AuditResult}
-
-import javax.inject.{Inject, Singleton}
-import scala.concurrent.{ExecutionContext, Future}
-import scala.xml.NodeSeq
-
-@Singleton
-class AuditServiceV1 @Inject() (auditConnector: AuditConnector, appConfig: AppConfig, factory: AuditEventFactory)(
- implicit ec: ExecutionContext
-) extends AuditService
- with Logging {
-
- // old auditing
- def auditMessage(message: IEMessage)(implicit hc: HeaderCarrier): EitherT[Future, Result, Unit] =
- auditMessage(message, None)
- def auditMessage(message: IEMessage, failureReason: String)(implicit
- hc: HeaderCarrier
- ): EitherT[Future, Result, Unit] =
- auditMessage(message, Some(failureReason))
-
- def messageSubmitted(
- movement: Movement,
- submittedToCore: Boolean,
- correlationId: Option[String],
- request: ParsedXmlRequest[NodeSeq]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.newAuditingEnabled) {
-
- val event = factory.createMessageSubmitted(movement, submittedToCore, correlationId, request)
-
- auditConnector.sendExplicitAudit("MessageSubmitted", event)
- }
-
- def messageSubmittedNoMovement(
- message: IE815MessageV1,
- submittedToCore: Boolean,
- correlationId: Option[String],
- request: ParsedXmlRequest[NodeSeq]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.newAuditingEnabled) {
-
- val event = factory.createMessageSubmittedNoMovement(
- message,
- submittedToCore,
- correlationId,
- request
- )
-
- auditConnector.sendExplicitAudit("MessageSubmitted", event)
- }
- def messageSubmittedNoMovement(
- message: IE815MessageV2,
- submittedToCore: Boolean,
- correlationId: Option[String],
- request: ParsedXmlRequest[NodeSeq]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.newAuditingEnabled) {
-
- val event = factory.createMessageSubmittedNoMovement(
- message,
- submittedToCore,
- correlationId,
- request
- )
-
- auditConnector.sendExplicitAudit("MessageSubmitted", event)
- }
- // old auditing
- private def auditMessage(message: IEMessage, failureOpt: Option[String])(implicit
- hc: HeaderCarrier
- ): EitherT[Future, Result, Unit] =
- EitherT {
-
- auditConnector.sendExtendedEvent(factory.createMessageAuditEvent(message, failureOpt)).map {
- case f: AuditResult.Failure => Right(logger.error(f.msg))
- case _ => Right(())
- }
- }
-
- def getInformationForGetMovements(
- movementFilter: MovementFilter,
- movements: Seq[Movement],
- request: EnrolmentRequest[AnyContent]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.newAuditingEnabled) {
- val event = factory.createGetMovementsDetails(
- movementFilter,
- movements,
- request
- )
- auditConnector.sendExplicitAudit("GetInformation", event)
- }
-
- def getInformationForGetSpecificMovement(
- movementId: String,
- request: EnrolmentRequest[AnyContent]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.newAuditingEnabled) {
- val event = factory.createGetSpecificMovementDetails(movementId, request)
- auditConnector.sendExplicitAudit("GetInformation", event)
- }
-
- def getInformationForGetMessages(
- messages: Seq[Message],
- movement: Movement,
- updatedSince: Option[String],
- traderType: Option[String],
- request: EnrolmentRequest[AnyContent]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.newAuditingEnabled) {
- val event = factory.createGetMessagesAuditInfo(messages, movement, updatedSince, traderType, request)
- auditConnector.sendExplicitAudit("GetInformation", event)
- }
-
- def getInformationForGetSpecificMessage(
- movement: Movement,
- message: Message,
- request: EnrolmentRequest[AnyContent]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.newAuditingEnabled) {
- val event = factory.createGetSpecificMessageAuditInfo(movement, message, request)
- auditConnector.sendExplicitAudit("GetInformation", event)
- }
-
- def messageProcessingSuccess(
- ern: String,
- response: GetMessagesResponse,
- batchId: String,
- jobId: Option[String]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.processingAuditingEnabled) {
- val messageProcessingSuccessAuditInfo = factory.createMessageProcessingSuccessAuditInfo(
- ern,
- response,
- batchId,
- jobId
- )
- auditConnector.sendExplicitAudit("MessageProcessing", messageProcessingSuccessAuditInfo)
-
- }
-
- def messageProcessingFailure(ern: String, failureReason: String, batchId: String, jobId: Option[String])(implicit
- hc: HeaderCarrier
- ): Unit =
- if (appConfig.processingAuditingEnabled) {
- val messageProcessingFailureAuditInfo =
- factory.createMessageProcessingFailureAuditInfo(ern, failureReason, batchId, jobId)
-
- auditConnector.sendExplicitAudit("MessageProcessing", messageProcessingFailureAuditInfo)
- }
-
- def movementSavedSuccess(
- movement: Movement,
- batchId: Option[String],
- jobId: Option[String],
- newMessages: Seq[Message]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.processingAuditingEnabled) {
- val movementSavedSuccessAuditInfo =
- factory.createMovementSavedSuccessAuditInfo(movement, batchId, jobId, newMessages)
-
- auditConnector.sendExplicitAudit("MovementSaved", movementSavedSuccessAuditInfo)
- }
-
- def movementSavedFailure(
- movement: Movement,
- failureReason: String,
- batchId: Option[String],
- jobId: Option[String],
- messagesToBeAdded: Seq[Message]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.processingAuditingEnabled) {
- val movementSavedFailureAuditInfo = factory.createMovementSavedFailureAuditInfo(
- movement,
- failureReason,
- batchId,
- jobId,
- messagesToBeAdded
- )
-
- auditConnector.sendExplicitAudit("MovementSaved", movementSavedFailureAuditInfo)
- }
- def messageAcknowledged(ern: String, batchId: String, jobId: Option[String], recordsAffected: Int)(implicit
- hc: HeaderCarrier
- ): Unit =
- if (appConfig.processingAuditingEnabled) {
- val event = factory.createMessageAcknowledgedEvent(ern, batchId, jobId, recordsAffected)
- auditConnector.sendExplicitAudit("MessageAcknowledged", event)
- }
-
- def messageNotAcknowledged(ern: String, batchId: String, jobId: Option[String], failureReason: String)(implicit
- hc: HeaderCarrier
- ): Unit =
- if (appConfig.processingAuditingEnabled) {
- val event = factory.createMessageNotAcknowledgedEvent(ern, batchId, jobId, failureReason)
- auditConnector.sendExplicitAudit("MessageAcknowledged", event)
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/AuditServiceV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/AuditServiceV2.scala
deleted file mode 100644
index 0ce1297b8..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/AuditServiceV2.scala
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright 2025 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.services
-
-import cats.data.EitherT
-import play.api.Logging
-import play.api.mvc.{AnyContent, Result}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.config.AppConfig
-import uk.gov.hmrc.excisemovementcontrolsystemapi.filters.MovementFilter
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auth.{EnrolmentRequest, ParsedXmlRequest}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.IE815MessageV1
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.IE815MessageV2
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{GetMessagesResponse, IEMessage}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Message, Movement}
-import uk.gov.hmrc.http.HeaderCarrier
-import uk.gov.hmrc.play.audit.http.connector.{AuditConnector, AuditResult}
-
-import javax.inject.{Inject, Singleton}
-import scala.concurrent.{ExecutionContext, Future}
-import scala.xml.NodeSeq
-
-@Singleton
-class AuditServiceV2 @Inject() (auditConnector: AuditConnector, appConfig: AppConfig, factory: AuditEventFactory)(
- implicit ec: ExecutionContext
-) extends AuditService
- with Logging {
-
- // old auditing
- def auditMessage(message: IEMessage)(implicit hc: HeaderCarrier): EitherT[Future, Result, Unit] =
- auditMessage(message, None)
- def auditMessage(message: IEMessage, failureReason: String)(implicit
- hc: HeaderCarrier
- ): EitherT[Future, Result, Unit] =
- auditMessage(message, Some(failureReason))
-
- def messageSubmitted(
- movement: Movement,
- submittedToCore: Boolean,
- correlationId: Option[String],
- request: ParsedXmlRequest[NodeSeq]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.newAuditingEnabled) {
-
- val event = factory.createMessageSubmitted(movement, submittedToCore, correlationId, request)
-
- auditConnector.sendExplicitAudit("MessageSubmitted", event)
- }
-
- def messageSubmittedNoMovement(
- message: IE815MessageV1,
- submittedToCore: Boolean,
- correlationId: Option[String],
- request: ParsedXmlRequest[NodeSeq]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.newAuditingEnabled) {
-
- val event = factory.createMessageSubmittedNoMovement(
- message,
- submittedToCore,
- correlationId,
- request
- )
-
- auditConnector.sendExplicitAudit("MessageSubmitted", event)
- }
-
- def messageSubmittedNoMovement(
- message: IE815MessageV2,
- submittedToCore: Boolean,
- correlationId: Option[String],
- request: ParsedXmlRequest[NodeSeq]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.newAuditingEnabled) {
-
- val event = factory.createMessageSubmittedNoMovement(
- message,
- submittedToCore,
- correlationId,
- request
- )
-
- auditConnector.sendExplicitAudit("MessageSubmitted", event)
- }
-
- // old auditing
- private def auditMessage(message: IEMessage, failureOpt: Option[String])(implicit
- hc: HeaderCarrier
- ): EitherT[Future, Result, Unit] =
- EitherT {
-
- auditConnector.sendExtendedEvent(factory.createMessageAuditEvent(message, failureOpt)).map {
- case f: AuditResult.Failure => Right(logger.error(f.msg))
- case _ => Right(())
- }
- }
-
- def getInformationForGetMovements(
- movementFilter: MovementFilter,
- movements: Seq[Movement],
- request: EnrolmentRequest[AnyContent]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.newAuditingEnabled) {
- val event = factory.createGetMovementsDetails(
- movementFilter,
- movements,
- request
- )
- auditConnector.sendExplicitAudit("GetInformation", event)
- }
-
- def getInformationForGetSpecificMovement(
- movementId: String,
- request: EnrolmentRequest[AnyContent]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.newAuditingEnabled) {
- val event = factory.createGetSpecificMovementDetails(movementId, request)
- auditConnector.sendExplicitAudit("GetInformation", event)
- }
-
- def getInformationForGetMessages(
- messages: Seq[Message],
- movement: Movement,
- updatedSince: Option[String],
- traderType: Option[String],
- request: EnrolmentRequest[AnyContent]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.newAuditingEnabled) {
- val event = factory.createGetMessagesAuditInfo(messages, movement, updatedSince, traderType, request)
- auditConnector.sendExplicitAudit("GetInformation", event)
- }
-
- def getInformationForGetSpecificMessage(
- movement: Movement,
- message: Message,
- request: EnrolmentRequest[AnyContent]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.newAuditingEnabled) {
- val event = factory.createGetSpecificMessageAuditInfo(movement, message, request)
- auditConnector.sendExplicitAudit("GetInformation", event)
- }
-
- def messageProcessingSuccess(
- ern: String,
- response: GetMessagesResponse,
- batchId: String,
- jobId: Option[String]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.processingAuditingEnabled) {
- val messageProcessingSuccessAuditInfo = factory.createMessageProcessingSuccessAuditInfo(
- ern,
- response,
- batchId,
- jobId
- )
- auditConnector.sendExplicitAudit("MessageProcessing", messageProcessingSuccessAuditInfo)
-
- }
-
- def messageProcessingFailure(ern: String, failureReason: String, batchId: String, jobId: Option[String])(implicit
- hc: HeaderCarrier
- ): Unit =
- if (appConfig.processingAuditingEnabled) {
- val messageProcessingFailureAuditInfo =
- factory.createMessageProcessingFailureAuditInfo(ern, failureReason, batchId, jobId)
-
- auditConnector.sendExplicitAudit("MessageProcessing", messageProcessingFailureAuditInfo)
- }
-
- def movementSavedSuccess(
- movement: Movement,
- batchId: Option[String],
- jobId: Option[String],
- newMessages: Seq[Message]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.processingAuditingEnabled) {
- val movementSavedSuccessAuditInfo =
- factory.createMovementSavedSuccessAuditInfo(movement, batchId, jobId, newMessages)
-
- auditConnector.sendExplicitAudit("MovementSaved", movementSavedSuccessAuditInfo)
- }
-
- def movementSavedFailure(
- movement: Movement,
- failureReason: String,
- batchId: Option[String],
- jobId: Option[String],
- messagesToBeAdded: Seq[Message]
- )(implicit hc: HeaderCarrier): Unit =
- if (appConfig.processingAuditingEnabled) {
- val movementSavedFailureAuditInfo = factory.createMovementSavedFailureAuditInfo(
- movement,
- failureReason,
- batchId,
- jobId,
- messagesToBeAdded
- )
-
- auditConnector.sendExplicitAudit("MovementSaved", movementSavedFailureAuditInfo)
- }
- def messageAcknowledged(ern: String, batchId: String, jobId: Option[String], recordsAffected: Int)(implicit
- hc: HeaderCarrier
- ): Unit =
- if (appConfig.processingAuditingEnabled) {
- val event = factory.createMessageAcknowledgedEvent(ern, batchId, jobId, recordsAffected)
- auditConnector.sendExplicitAudit("MessageAcknowledged", event)
- }
-
- def messageNotAcknowledged(ern: String, batchId: String, jobId: Option[String], failureReason: String)(implicit
- hc: HeaderCarrier
- ): Unit =
- if (appConfig.processingAuditingEnabled) {
- val event = factory.createMessageNotAcknowledgedEvent(ern, batchId, jobId, failureReason)
- auditConnector.sendExplicitAudit("MessageAcknowledged", event)
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MessageService.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MessageService.scala
index 65937706e..a5e381b42 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MessageService.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MessageService.scala
@@ -16,21 +16,569 @@
package uk.gov.hmrc.excisemovementcontrolsystemapi.services
+import cats.data.OptionT
+import cats.syntax.all._
+import com.codahale.metrics.MetricRegistry
import org.apache.pekko.Done
-import uk.gov.hmrc.excisemovementcontrolsystemapi.services.MessageService.UpdateOutcome
+import org.bson.BsonMaximumSizeExceededException
+import org.mongodb.scala.MongoCommandException
+import play.api.{Configuration, Logging}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.config.AppConfig
+import uk.gov.hmrc.excisemovementcontrolsystemapi.connectors.{MessageConnector, TraderMovementConnector}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages._
+import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Message, Movement, MovementIdGenerator}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.{BoxIdRepository, ErnRetrievalRepository, MovementRepository}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.services.MessageService.{EnrichedError, UpdateOutcome}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.{DateTimeService, EmcsUtils}
import uk.gov.hmrc.http.HeaderCarrier
+import uk.gov.hmrc.mongo.lock.{LockService, MongoLockRepository}
import java.time.Instant
-import scala.concurrent.Future
+import java.util.UUID
+import javax.inject.{Inject, Singleton}
+import scala.concurrent.duration.FiniteDuration
+import scala.concurrent.{ExecutionContext, Future}
+import scala.util.control.NonFatal
-trait MessageService {
+@Singleton
+class MessageService @Inject() (
+ configuration: Configuration,
+ movementRepository: MovementRepository,
+ ernRetrievalRepository: ErnRetrievalRepository,
+ boxIdRepository: BoxIdRepository,
+ messageConnector: MessageConnector,
+ traderMovementConnector: TraderMovementConnector,
+ dateTimeService: DateTimeService,
+ emcsUtils: EmcsUtils,
+ auditService: AuditService,
+ mongoLockRepository: MongoLockRepository,
+ metricRegistry: MetricRegistry,
+ movementService: MovementService,
+ movementIdGenerator: MovementIdGenerator,
+ appConfig: AppConfig
+)(implicit executionContext: ExecutionContext)
+ extends Logging {
- def updateAllMessages(erns: Set[String])(implicit hc: HeaderCarrier): Future[Done]
+ private val messageSizes = metricRegistry.histogram("message-size")
+ private val messageCount = metricRegistry.histogram("message-count")
+ private val totalMessageSize = metricRegistry.histogram("total-message-size")
+
+ private val throttleCutoff: FiniteDuration =
+ configuration.get[FiniteDuration]("microservice.services.eis.throttle-cutoff")
+
+ def updateAllMessages(erns: Set[String])(implicit hc: HeaderCarrier): Future[Done] =
+ erns.toSeq
+ .traverse { ern =>
+ ernRetrievalRepository.getLastRetrieved(ern).flatMap { lastRetrieved =>
+ updateMessages(ern, lastRetrieved)
+ .map(_ => Done)
+ .recover({ case NonFatal(error) =>
+ logger.warn(s"[MessageService]: Failed to update messages", error)
+ Done
+ })
+ }
+ }
+ .as(Done)
def updateMessages(ern: String, lastRetrieved: Option[Instant], jobId: Option[String] = None)(implicit
hc: HeaderCarrier
- ): Future[UpdateOutcome]
+ ): Future[UpdateOutcome] = {
+ val lockService = LockService(mongoLockRepository, ern, throttleCutoff)
+ lockService
+ .withLock {
+ val now = dateTimeService.timestamp()
+ if (shouldProcessNewMessages(lastRetrieved, now)) {
+ for {
+ _ <- processNewMessages(ern, jobId)
+ _ <- ernRetrievalRepository.setLastRetrieved(ern, now)
+ } yield UpdateOutcome.Updated
+ } else {
+ Future.successful(UpdateOutcome.NotUpdatedThrottled)
+ }
+ }
+ .map(_.getOrElse(UpdateOutcome.Locked))
+ }
+
+ private def shouldProcessNewMessages(maybeLastRetrieved: Option[Instant], now: Instant): Boolean = {
+ val cutoffTime = now.minus(throttleCutoff.length, throttleCutoff.unit.toChronoUnit)
+ //noinspection MapGetOrElseBoolean
+ maybeLastRetrieved.map(_.isBefore(cutoffTime)).getOrElse(true)
+ }
+
+ private def processNewMessages(ern: String, jobId: Option[String])(implicit hc: HeaderCarrier): Future[Done] = {
+ logger.info(s"[MessageService]: Processing new messages")
+ val batchId = UUID.randomUUID().toString
+
+ for {
+ response <- messageConnector.getNewMessages(ern, batchId, jobId)
+ _ <- updateMovements(ern, response.messages, jobId, Some(batchId))
+ _ <- acknowledgeAndContinue(response, ern, batchId, jobId)
+ } yield Done
+ }
+
+ private def acknowledgeAndContinue(
+ response: GetMessagesResponse,
+ ern: String,
+ batchId: String,
+ jobId: Option[String]
+ )(implicit
+ hc: HeaderCarrier
+ ): Future[Done] =
+ if (response.messageCount == 0) {
+ Future.successful(Done)
+ } else {
+ messageConnector
+ .acknowledgeMessages(ern, batchId, jobId)
+ .flatMap { ackRes =>
+ auditService.messageAcknowledged(ern, batchId, jobId, ackRes.recordsAffected)
+ if (response.messageCount > response.messages.size) {
+ processNewMessages(ern, jobId)
+ } else {
+ Future.successful(Done)
+ }
+ }
+ .recoverWith { case ex =>
+ logger.warn(s"[MessageService]: Unexpected error: ${ex.getMessage}")
+ auditService.messageNotAcknowledged(ern, batchId, jobId, ex.getMessage)
+ Future.failed(ex)
+ }
+ }
+
+ private def updateMovements(
+ ern: String,
+ messages: Seq[IEMessage],
+ jobId: Option[String],
+ batchId: Option[String]
+ )(implicit
+ hc: HeaderCarrier
+ ): Future[Done] = {
+ logger.info(s"[MessageService]: Updating movements")
+ if (messages.nonEmpty) {
+ val administrativeReferenceCodes: Seq[String] = messages.flatMap(_.administrativeReferenceCode).flatten
+ val localReferenceNumbers: Seq[String] = messages.flatMap(_.optionalLocalReferenceNumber)
+
+ movementRepository
+ .getAllBy(ern, localReferenceNumbers, administrativeReferenceCodes)
+ .flatMap { movements: Seq[Movement] =>
+ messages
+ .foldLeft(Future.successful(Seq.empty[Movement])) { (accumulated, message) =>
+ for {
+ accumulatedMovements <- accumulated
+ updatedMovements <- updateOrCreateMovements(
+ ern,
+ movements,
+ accumulatedMovements,
+ message,
+ shouldNotify = true,
+ dateTimeService.timestamp()
+ )
+ } yield (updatedMovements ++ accumulatedMovements)
+ .distinctBy { movement =>
+ (movement.localReferenceNumber, movement.consignorId, movement.administrativeReferenceCode)
+ }
+ }
+ .flatMap {
+ _.traverse { movement =>
+ messageCount.update(movement.messages.length)
+ totalMessageSize.update(movement.messages.map(_.encodedMessage.length).sum)
+ movementService.saveMovement(movement, jobId, batchId).recoverWith { case NonFatal(e) =>
+ createEnrichedError(e, ern, movements, movement)
+ }
+ }
+ }
+ }
+ .as(Done)
+ } else {
+ Future.successful(Done)
+ }
+ }
+
+ private def updateOrCreateMovements(
+ ern: String,
+ movements: Seq[Movement],
+ updatedMovements: Seq[Movement],
+ message: IEMessage,
+ shouldNotify: Boolean,
+ timestamp: Instant
+ )(implicit hc: HeaderCarrier): Future[Seq[Movement]] =
+ findMovementsForMessage(movements, updatedMovements, message).flatMap { matchedMovements =>
+ if (matchedMovements.nonEmpty) {
+ matchedMovements.traverse { movement =>
+ updateMovement(movement, ern, message, shouldNotify = shouldNotify, timestamp)
+ }
+ } else {
+ createMovements(ern, message, movements, updatedMovements, timestamp)
+ .map(movement => (movement +: updatedMovements.map(Some(_))).flatten)
+ }
+ }
+
+ private def updateMovement(
+ movement: Movement,
+ recipient: String,
+ message: IEMessage,
+ shouldNotify: Boolean,
+ timestamp: Instant
+ ): Future[Movement] =
+ if (
+ movement.messages.exists(m =>
+ m.messageId == message.messageIdentifier
+ && m.recipient.equalsIgnoreCase(recipient)
+ )
+ ) {
+ Future.successful(movement)
+ } else {
+ getUpdatedMessages(recipient, movement, message, timestamp, shouldNotify).map { updatedMessages =>
+ movement.copy(
+ messages = updatedMessages,
+ administrativeReferenceCode = getArc(movement, message),
+ consigneeId = getConsignee(movement, message),
+ lastUpdated = List(timestamp, movement.lastUpdated).max
+ )
+ }
+ }
+
+ private def getUpdatedMessages(
+ recipient: String,
+ movement: Movement,
+ message: IEMessage,
+ timestamp: Instant,
+ shouldNotify: Boolean
+ ): Future[Seq[Message]] =
+ message match {
+ case ie801: IE801Message =>
+ val consignorId: String =
+ ie801.consignorId.getOrElse(
+ throw new Exception(s"No Consignor on IE801: ${ie801.messageIdentifier}")
+ )
+ Seq(
+ Some(convertMessage(consignorId, ie801, timestamp, shouldNotify)),
+ ie801.consigneeId.map(convertMessage(_, ie801, timestamp, shouldNotify))
+ ).flatten.sequence.map { messages =>
+ val newMessages = messages.filterNot { m1 =>
+ movement.messages.exists { m2 =>
+ m1.messageId == m2.messageId &&
+ m1.recipient == m2.recipient
+ }
+ }
+ movement.messages ++ newMessages
+ }
+
+ case _ =>
+ convertMessage(recipient, message, timestamp, shouldNotify).map(movement.messages :+ _)
+ }
+
+ private def findMovementsForMessage(
+ movements: Seq[Movement],
+ updatedMovements: Seq[Movement],
+ message: IEMessage
+ ): Future[Seq[Movement]] =
+ (findByArc(updatedMovements, message) orElse
+ findByLrn(updatedMovements, message) orElse
+ findByArc(movements, message) orElse
+ findByLrn(movements, message) orElse
+ findByArcInMessage(message) orElse
+ findByConsignorLrnInMessage(message)).getOrElse(Seq.empty)
+
+ private def getConsignee(movement: Movement, message: IEMessage): Option[String] =
+ message match {
+ case ie801: IE801Message => ie801.consigneeId
+ case ie813: IE813Message => ie813.consigneeId orElse movement.consigneeId
+ case _ => movement.consigneeId
+ }
+
+ private def getArc(movement: Movement, message: IEMessage): Option[String] =
+ message match {
+ case ie801: IE801Message =>
+ movement.administrativeReferenceCode orElse ie801.administrativeReferenceCode.flatten.headOption
+ case _ => movement.administrativeReferenceCode
+ }
+
+ private def createMovements(
+ ern: String,
+ message: IEMessage,
+ movements: Seq[Movement],
+ updatedMovements: Seq[Movement],
+ timestamp: Instant
+ )(implicit
+ hc: HeaderCarrier
+ ): Future[Seq[Movement]] =
+ message match {
+ case ie704: IE704Message if ie704.localReferenceNumber.isDefined =>
+ createMovementFromIE704(ern, ie704, timestamp)
+ case ie801: IE801Message =>
+ createMovementFromIE801(ie801, timestamp).map(Seq(_))
+ case _ =>
+ createMovementsFromTraderMovement(ern, message, movements, updatedMovements, timestamp)
+ }
+
+ private def createMovementsFromTraderMovement(
+ ern: String,
+ message: IEMessage,
+ movements: Seq[Movement],
+ updatedMovements: Seq[Movement],
+ timestamp: Instant
+ )(implicit
+ hc: HeaderCarrier
+ ): Future[Seq[Movement]] =
+ message.administrativeReferenceCode.flatten.headOption
+ .map { arc =>
+ traderMovementConnector.getMovementMessages(ern, arc).flatMap { messages =>
+ buildMovementFromTraderMovement(messages, message, ern, movements, updatedMovements, timestamp)
+ }
+ }
+ .getOrElse {
+ // Auditing here because we only want to audit on the message we've picked up rather than the messages from `getMovementMessages`
+ if (appConfig.oldAuditingEnabled) auditMessageForNoMovement(message)
+ Future.successful(Seq.empty)
+ }
+
+ private def buildMovementFromTraderMovement(
+ messages: Seq[IEMessage],
+ originatingMessage: IEMessage,
+ originatingErn: String,
+ movements: Seq[Movement],
+ updatedMovements: Seq[Movement],
+ timestamp: Instant
+ )(implicit
+ hc: HeaderCarrier
+ ): Future[Seq[Movement]] =
+ messages
+ .collectFirst { case ie801: IE801Message =>
+ findMovementsForMessage(movements, updatedMovements, ie801).flatMap { movements =>
+ if (movements.nonEmpty) {
+ movements.traverse { movement =>
+ val consignorId: String =
+ ie801.consignorId.getOrElse(
+ throw new Exception(s"No Consignor on IE801: ${ie801.messageIdentifier}")
+ )
+ updateMovement(movement, consignorId, ie801, shouldNotify = false, timestamp).flatMap { updatedMovement =>
+ ie801.consigneeId
+ .map { consigneeId =>
+ updateMovement(updatedMovement, consigneeId, ie801, shouldNotify = false, timestamp)
+ }
+ .getOrElse(Future.successful(updatedMovement))
+ .flatMap { updatedMovement =>
+ updateMovement(
+ updatedMovement,
+ originatingErn,
+ originatingMessage,
+ shouldNotify = true,
+ timestamp
+ )
+ }
+ }
+ }
+ } else {
+
+ // For a new movement from trader-movement call, add the IE801 for the consignor and consignee
+ // also add the originating message all at once
+ val consignorId: String =
+ ie801.consignorId.getOrElse(
+ throw new Exception(s"No Consignor on IE801: ${ie801.messageIdentifier}")
+ )
+ Seq(
+ Some(convertMessage(consignorId, ie801, timestamp, shouldNotify = false)),
+ ie801.consigneeId.map(convertMessage(_, ie801, timestamp, shouldNotify = false)),
+ Some(convertMessage(originatingErn, originatingMessage, timestamp, shouldNotify = true))
+ ).flatten.sequence.map { messagesToAdd =>
+ Seq(
+ Movement(
+ movementIdGenerator.generateId,
+ None,
+ ie801.localReferenceNumber,
+ consignorId,
+ ie801.consigneeId,
+ administrativeReferenceCode = ie801.administrativeReferenceCode.head,
+ timestamp,
+ messages = messagesToAdd
+ )
+ )
+ }
+ }
+ }
+ }
+ .getOrElse {
+ if (appConfig.oldAuditingEnabled) auditMessageForNoMovement(originatingMessage)
+ Future.successful(Seq.empty)
+ }
+
+ private def auditMessageForNoMovement(message: IEMessage)(implicit
+ hc: HeaderCarrier
+ ): Unit = {
+ val errorMessage =
+ s"An ${message.messageType} message has been retrieved with no movement, unable to create movement"
+ auditService.auditMessage(message, errorMessage)
+ logger.error(errorMessage)
+ }
+
+ private def createMovementFromIE704(consignor: String, message: IE704Message, timestamp: Instant)(implicit
+ hc: HeaderCarrier
+ ): Future[Seq[Movement]] =
+ convertMessage(consignor, message, timestamp, shouldNotify = true).map { convertedMessage =>
+ message.localReferenceNumber
+ .map { lrn =>
+ Seq(
+ Movement(
+ movementIdGenerator.generateId,
+ None,
+ lrn,
+ consignor,
+ None,
+ administrativeReferenceCode = message.administrativeReferenceCode.head,
+ timestamp,
+ messages = Seq(convertedMessage)
+ )
+ )
+ }
+ .getOrElse {
+ if (appConfig.oldAuditingEnabled) auditMessageForNoMovement(message)
+ Seq.empty
+ }
+ }
+
+ private def createMovementFromIE801(message: IE801Message, timestamp: Instant): Future[Movement] = {
+ val consignorId: String =
+ message.consignorId.getOrElse(
+ throw new Exception(s"No Consignor on IE801: ${message.messageIdentifier}")
+ )
+ Seq(
+ Some(convertMessage(consignorId, message, timestamp, shouldNotify = true)),
+ message.consigneeId.map(convertMessage(_, message, timestamp, shouldNotify = true))
+ ).flatten.sequence.map { messages =>
+ Movement(
+ movementIdGenerator.generateId,
+ None,
+ message.localReferenceNumber,
+ consignorId,
+ message.consigneeId,
+ administrativeReferenceCode = message.administrativeReferenceCode.head,
+ timestamp,
+ messages = messages
+ )
+ }
+ }
+
+ private def findByArc(movements: Seq[Movement], message: IEMessage): OptionT[Future, Seq[Movement]] = {
+
+ val matchedMovements = message.administrativeReferenceCode.flatten.flatMap { arc =>
+ movements.find(_.administrativeReferenceCode.contains(arc))
+ }
+
+ if (matchedMovements.isEmpty) OptionT.none else OptionT.pure(matchedMovements)
+ }
+
+ private def findByArcInMessage(message: IEMessage): OptionT[Future, Seq[Movement]] =
+ message.administrativeReferenceCode.flatten.traverse { arc =>
+ OptionT(movementRepository.getByArc(arc))
+ .filter { movement =>
+ message match {
+ case ie801: IE801Message =>
+ val consignorId: String =
+ ie801.consignorId.getOrElse(
+ throw new Exception(s"No Consignor on IE801: ${ie801.messageIdentifier}")
+ )
+ movement.consignorId == consignorId &&
+ movement.localReferenceNumber == ie801.localReferenceNumber
+
+ case _ =>
+ true
+ }
+ }
+ }
+
+ private def findByConsignorLrnInMessage(message: IEMessage): OptionT[Future, Seq[Movement]] =
+ message match {
+ case ie801: IE801Message =>
+ val consignorId: String = message.consignorId.getOrElse(
+ throw new Exception(s"No Consignor on IE801: ${message.messageIdentifier}")
+ )
+ OptionT.liftF(movementRepository.getMovementByLRNAndERNIn(ie801.localReferenceNumber, List(consignorId)))
+
+ case _ =>
+ OptionT.none
+ }
+
+ private def findByLrn(movements: Seq[Movement], message: IEMessage): OptionT[Future, Seq[Movement]] =
+ OptionT.fromOption(
+ movements
+ .find(movement => message.lrnEquals(movement.localReferenceNumber))
+ .map(Seq(_))
+ )
+
+ private def convertMessage(
+ recipient: String,
+ input: IEMessage,
+ timestamp: Instant,
+ shouldNotify: Boolean
+ ): Future[Message] = {
+
+ def createMessage(boxIds: Set[String]): Message = {
+ val encodedMessage = emcsUtils.encode(input.toXml.toString)
+ messageSizes.update(encodedMessage.length)
+ Message(
+ encodedMessage = encodedMessage,
+ messageType = input.messageType,
+ messageId = input.messageIdentifier,
+ recipient = recipient,
+ boxesToNotify = boxIds,
+ createdOn = timestamp
+ )
+ }
+
+ if (shouldNotify) {
+ boxIdRepository.getBoxIds(recipient).map(createMessage)
+ } else {
+ Future.successful(createMessage(Set.empty))
+ }
+ }
+ private def createEnrichedError[A](
+ e: Throwable,
+ ern: String,
+ movements: Seq[Movement],
+ movement: Movement
+ ): Future[A] =
+ e match {
+ case e: MongoCommandException if e.getErrorCode == 11000 =>
+ movementRepository
+ .getMovementByLRNAndERNIn(movement.localReferenceNumber, List(movement.consignorId))
+ .flatMap { movementByLrn =>
+ val movementMessage =
+ s"id: ${movement._id}, consignor: ${movement.consignorId}, lrn: ${movement.localReferenceNumber}, consignee: ${movement.consigneeId}, arc: ${movement.administrativeReferenceCode}, messages: ${movement.messages
+ .map(_.messageType)}, currentTime: ${Instant.now()})"
+ val movementByLrnMessage = movementByLrn.headOption
+ .map(m =>
+ s"Some(id: ${m._id}, consignor: ${m.consignorId}, lrn: ${m.localReferenceNumber}, consignee: ${m.consigneeId}, arc: ${m.administrativeReferenceCode}, exists in initially retrieved movements: ${movements
+ .exists(_._id == m._id)}, lastUpdated: ${m.lastUpdated}, latestMessageUpdate: ${m.messages
+ .maxByOption(_.createdOn)
+ .map(_.createdOn)}, messages: ${m.messages.map(_.messageType)})"
+ )
+ .getOrElse("None")
+ movement.administrativeReferenceCode
+ .flatTraverse(movementRepository.getByArc)
+ .map { movementByArc =>
+ movementByArc
+ .map(m =>
+ s"Some(id: ${m._id}, consignor: ${m.consignorId}, lrn: ${m.localReferenceNumber}, consignee: ${m.consigneeId}, arc: ${m.administrativeReferenceCode}, lastUpdated: ${m.lastUpdated}, latestMessage: ${m.messages
+ .maxByOption(_.createdOn)
+ .map(_.createdOn)}, messages: ${m.messages.map(_.messageType)})"
+ )
+ .getOrElse("None")
+ }
+ .flatMap { movementByArcMessage =>
+ val message =
+ s"Failed to save movement because of duplicate key violation: \n\nMovement - $movementMessage \n\nExisting movement by LRN - $movementByLrnMessage \n\nExisting movement by ARC - $movementByArcMessage"
+ Future.failed(EnrichedError(message, e))
+ }
+ }
+ case _: BsonMaximumSizeExceededException =>
+ val message =
+ s"ern: $ern, movementId: ${movement._id}, arc: ${movement.administrativeReferenceCode}, numberOfMessages: ${movement.messages.size}, inner: ${e.getMessage}"
+ Future.failed(EnrichedError(message, e))
+ case _ =>
+ val message = s"ern: $ern, movementId: ${movement._id}, inner: ${e.getMessage}"
+ Future.failed(EnrichedError(message, e))
+ }
}
object MessageService {
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MessageServiceV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MessageServiceV1.scala
deleted file mode 100644
index ccb21b1c6..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MessageServiceV1.scala
+++ /dev/null
@@ -1,584 +0,0 @@
-/*
- * Copyright 2025 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.services
-
-import cats.data.OptionT
-import cats.syntax.all._
-import com.codahale.metrics.MetricRegistry
-import org.apache.pekko.Done
-import org.bson.BsonMaximumSizeExceededException
-import org.mongodb.scala.MongoCommandException
-import play.api.{Configuration, Logging}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.config.AppConfig
-import uk.gov.hmrc.excisemovementcontrolsystemapi.connectors.{MessageConnector, TraderMovementConnector}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Message, Movement, MovementIdGenerator}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.{BoxIdRepository, ErnRetrievalRepository, MovementRepository}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.services.MessageService.{EnrichedError, UpdateOutcome}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.{DateTimeService, EmcsUtils}
-import uk.gov.hmrc.http.HeaderCarrier
-import uk.gov.hmrc.mongo.lock.{LockService, MongoLockRepository}
-
-import java.time.Instant
-import java.util.UUID
-import javax.inject.{Inject, Singleton}
-import scala.concurrent.duration.FiniteDuration
-import scala.concurrent.{ExecutionContext, Future}
-import scala.util.control.NonFatal
-
-@Singleton
-class MessageServiceV1 @Inject() (
- configuration: Configuration,
- movementRepository: MovementRepository,
- ernRetrievalRepository: ErnRetrievalRepository,
- boxIdRepository: BoxIdRepository,
- messageConnector: MessageConnector,
- traderMovementConnector: TraderMovementConnector,
- dateTimeService: DateTimeService,
- emcsUtils: EmcsUtils,
- auditService: AuditService,
- mongoLockRepository: MongoLockRepository,
- metricRegistry: MetricRegistry,
- movementService: MovementService,
- movementIdGenerator: MovementIdGenerator,
- appConfig: AppConfig
-)(implicit executionContext: ExecutionContext)
- extends Logging
- with MessageService {
-
- private val messageSizes = metricRegistry.histogram("message-size")
- private val messageCount = metricRegistry.histogram("message-count")
- private val totalMessageSize = metricRegistry.histogram("total-message-size")
-
- private val throttleCutoff: FiniteDuration =
- configuration.get[FiniteDuration]("microservice.services.eis.throttle-cutoff")
-
- def updateAllMessages(erns: Set[String])(implicit hc: HeaderCarrier): Future[Done] =
- erns.toSeq
- .traverse { ern =>
- ernRetrievalRepository.getLastRetrieved(ern).flatMap { lastRetrieved =>
- updateMessages(ern, lastRetrieved)
- .map(_ => Done)
- .recover({ case NonFatal(error) =>
- logger.warn(s"[MessageService]: Failed to update messages", error)
- Done
- })
- }
- }
- .as(Done)
-
- def updateMessages(ern: String, lastRetrieved: Option[Instant], jobId: Option[String] = None)(implicit
- hc: HeaderCarrier
- ): Future[UpdateOutcome] = {
- val lockService = LockService(mongoLockRepository, ern, throttleCutoff)
- lockService
- .withLock {
- val now = dateTimeService.timestamp()
- if (shouldProcessNewMessages(lastRetrieved, now)) {
- for {
- _ <- processNewMessages(ern, jobId)
- _ <- ernRetrievalRepository.setLastRetrieved(ern, now)
- } yield UpdateOutcome.Updated
- } else {
- Future.successful(UpdateOutcome.NotUpdatedThrottled)
- }
- }
- .map(_.getOrElse(UpdateOutcome.Locked))
- }
-
- private def shouldProcessNewMessages(maybeLastRetrieved: Option[Instant], now: Instant): Boolean = {
- val cutoffTime = now.minus(throttleCutoff.length, throttleCutoff.unit.toChronoUnit)
- //noinspection MapGetOrElseBoolean
- maybeLastRetrieved.map(_.isBefore(cutoffTime)).getOrElse(true)
- }
-
- private def processNewMessages(ern: String, jobId: Option[String])(implicit hc: HeaderCarrier): Future[Done] = {
- logger.info(s"[MessageService]: Processing new messages")
- val batchId = UUID.randomUUID().toString
-
- for {
- response <- messageConnector.getNewMessages(ern, batchId, jobId)
- _ <- updateMovements(ern, response.messages, jobId, Some(batchId))
- _ <- acknowledgeAndContinue(response, ern, batchId, jobId)
- } yield Done
- }
-
- private def acknowledgeAndContinue(
- response: GetMessagesResponse,
- ern: String,
- batchId: String,
- jobId: Option[String]
- )(implicit
- hc: HeaderCarrier
- ): Future[Done] =
- if (response.messageCount == 0) {
- Future.successful(Done)
- } else {
- messageConnector
- .acknowledgeMessages(ern, batchId, jobId)
- .flatMap { ackRes =>
- auditService.messageAcknowledged(ern, batchId, jobId, ackRes.recordsAffected)
- if (response.messageCount > response.messages.size) {
- processNewMessages(ern, jobId)
- } else {
- Future.successful(Done)
- }
- }
- .recoverWith { case ex =>
- logger.warn(s"[MessageService]: Unexpected error: ${ex.getMessage}")
- auditService.messageNotAcknowledged(ern, batchId, jobId, ex.getMessage)
- Future.failed(ex)
- }
- }
-
- private def updateMovements(
- ern: String,
- messages: Seq[IEMessage],
- jobId: Option[String],
- batchId: Option[String]
- )(implicit
- hc: HeaderCarrier
- ): Future[Done] = {
- logger.info(s"[MessageService]: Updating movements")
- if (messages.nonEmpty) {
- val administrativeReferenceCodes: Seq[String] = messages.flatMap(_.administrativeReferenceCode).flatten
- val localReferenceNumbers: Seq[String] = messages.flatMap(_.optionalLocalReferenceNumber)
-
- movementRepository
- .getAllBy(ern, localReferenceNumbers, administrativeReferenceCodes)
- .flatMap { movements: Seq[Movement] =>
- messages
- .foldLeft(Future.successful(Seq.empty[Movement])) { (accumulated, message) =>
- for {
- accumulatedMovements <- accumulated
- updatedMovements <- updateOrCreateMovements(
- ern,
- movements,
- accumulatedMovements,
- message,
- shouldNotify = true,
- dateTimeService.timestamp()
- )
- } yield (updatedMovements ++ accumulatedMovements)
- .distinctBy { movement =>
- (movement.localReferenceNumber, movement.consignorId, movement.administrativeReferenceCode)
- }
- }
- .flatMap {
- _.traverse { movement =>
- messageCount.update(movement.messages.length)
- totalMessageSize.update(movement.messages.map(_.encodedMessage.length).sum)
- movementService.saveMovement(movement, jobId, batchId).recoverWith { case NonFatal(e) =>
- createEnrichedError(e, ern, movements, movement)
- }
- }
- }
- }
- .as(Done)
- } else {
- Future.successful(Done)
- }
- }
-
- private def updateOrCreateMovements(
- ern: String,
- movements: Seq[Movement],
- updatedMovements: Seq[Movement],
- message: IEMessage,
- shouldNotify: Boolean,
- timestamp: Instant
- )(implicit hc: HeaderCarrier): Future[Seq[Movement]] =
- findMovementsForMessage(movements, updatedMovements, message).flatMap { matchedMovements =>
- if (matchedMovements.nonEmpty) {
- matchedMovements.traverse { movement =>
- updateMovement(movement, ern, message, shouldNotify = shouldNotify, timestamp)
- }
- } else {
- createMovements(ern, message, movements, updatedMovements, timestamp)
- .map(movement => (movement +: updatedMovements.map(Some(_))).flatten)
- }
- }
-
- private def updateMovement(
- movement: Movement,
- recipient: String,
- message: IEMessage,
- shouldNotify: Boolean,
- timestamp: Instant
- ): Future[Movement] =
- if (
- movement.messages.exists(m =>
- m.messageId == message.messageIdentifier
- && m.recipient.equalsIgnoreCase(recipient)
- )
- ) {
- Future.successful(movement)
- } else {
- getUpdatedMessages(recipient, movement, message, timestamp, shouldNotify).map { updatedMessages =>
- movement.copy(
- messages = updatedMessages,
- administrativeReferenceCode = getArc(movement, message),
- consigneeId = getConsignee(movement, message),
- lastUpdated = List(timestamp, movement.lastUpdated).max
- )
- }
- }
-
- private def getUpdatedMessages(
- recipient: String,
- movement: Movement,
- message: IEMessage,
- timestamp: Instant,
- shouldNotify: Boolean
- ): Future[Seq[Message]] =
- message match {
- case ie801: IE801MessageV1 =>
- val consignorId: String =
- ie801.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE801: ${ie801.messageIdentifier}")
- )
- Seq(
- Some(convertMessage(consignorId, ie801, timestamp, shouldNotify)),
- ie801.consigneeId.map(convertMessage(_, ie801, timestamp, shouldNotify))
- ).flatten.sequence.map { messages =>
- val newMessages = messages.filterNot { m1 =>
- movement.messages.exists { m2 =>
- m1.messageId == m2.messageId &&
- m1.recipient == m2.recipient
- }
- }
- movement.messages ++ newMessages
- }
-
- case _ =>
- convertMessage(recipient, message, timestamp, shouldNotify).map(movement.messages :+ _)
- }
-
- private def findMovementsForMessage(
- movements: Seq[Movement],
- updatedMovements: Seq[Movement],
- message: IEMessage
- ): Future[Seq[Movement]] =
- (findByArc(updatedMovements, message) orElse
- findByLrn(updatedMovements, message) orElse
- findByArc(movements, message) orElse
- findByLrn(movements, message) orElse
- findByArcInMessage(message) orElse
- findByConsignorLrnInMessage(message)).getOrElse(Seq.empty)
-
- private def getConsignee(movement: Movement, message: IEMessage): Option[String] =
- message match {
- case ie801: IE801MessageV1 => ie801.consigneeId
- case ie813: IE813MessageV1 => ie813.consigneeId orElse movement.consigneeId
- case _ => movement.consigneeId
- }
-
- private def getArc(movement: Movement, message: IEMessage): Option[String] =
- message match {
- case ie801: IE801MessageV1 =>
- movement.administrativeReferenceCode orElse ie801.administrativeReferenceCode.flatten.headOption
- case _ => movement.administrativeReferenceCode
- }
-
- private def createMovements(
- ern: String,
- message: IEMessage,
- movements: Seq[Movement],
- updatedMovements: Seq[Movement],
- timestamp: Instant
- )(implicit
- hc: HeaderCarrier
- ): Future[Seq[Movement]] =
- message match {
- case ie704: IE704MessageV1 if ie704.localReferenceNumber.isDefined =>
- createMovementFromIE704(ern, ie704, timestamp)
- case ie801: IE801MessageV1 =>
- createMovementFromIE801(ie801, timestamp).map(Seq(_))
- case _ =>
- createMovementsFromTraderMovement(ern, message, movements, updatedMovements, timestamp)
- }
-
- private def createMovementsFromTraderMovement(
- ern: String,
- message: IEMessage,
- movements: Seq[Movement],
- updatedMovements: Seq[Movement],
- timestamp: Instant
- )(implicit
- hc: HeaderCarrier
- ): Future[Seq[Movement]] =
- message.administrativeReferenceCode.flatten.headOption
- .map { arc =>
- traderMovementConnector.getMovementMessages(ern, arc).flatMap { messages =>
- buildMovementFromTraderMovement(messages, message, ern, movements, updatedMovements, timestamp)
- }
- }
- .getOrElse {
- // Auditing here because we only want to audit on the message we've picked up rather than the messages from `getMovementMessages`
- if (appConfig.oldAuditingEnabled) auditMessageForNoMovement(message)
- Future.successful(Seq.empty)
- }
-
- private def buildMovementFromTraderMovement(
- messages: Seq[IEMessage],
- originatingMessage: IEMessage,
- originatingErn: String,
- movements: Seq[Movement],
- updatedMovements: Seq[Movement],
- timestamp: Instant
- )(implicit
- hc: HeaderCarrier
- ): Future[Seq[Movement]] =
- messages
- .collectFirst { case ie801: IE801MessageV1 =>
- findMovementsForMessage(movements, updatedMovements, ie801).flatMap { movements =>
- if (movements.nonEmpty) {
- movements.traverse { movement =>
- val consignorId: String =
- ie801.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE801: ${ie801.messageIdentifier}")
- )
- updateMovement(movement, consignorId, ie801, shouldNotify = false, timestamp).flatMap { updatedMovement =>
- ie801.consigneeId
- .map { consigneeId =>
- updateMovement(updatedMovement, consigneeId, ie801, shouldNotify = false, timestamp)
- }
- .getOrElse(Future.successful(updatedMovement))
- .flatMap { updatedMovement =>
- updateMovement(
- updatedMovement,
- originatingErn,
- originatingMessage,
- shouldNotify = true,
- timestamp
- )
- }
- }
- }
- } else {
-
- // For a new movement from trader-movement call, add the IE801 for the consignor and consignee
- // also add the originating message all at once
- val consignorId: String =
- ie801.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE801: ${ie801.messageIdentifier}")
- )
- Seq(
- Some(convertMessage(consignorId, ie801, timestamp, shouldNotify = false)),
- ie801.consigneeId.map(convertMessage(_, ie801, timestamp, shouldNotify = false)),
- Some(convertMessage(originatingErn, originatingMessage, timestamp, shouldNotify = true))
- ).flatten.sequence.map { messagesToAdd =>
- Seq(
- Movement(
- movementIdGenerator.generateId,
- None,
- ie801.localReferenceNumber,
- consignorId,
- ie801.consigneeId,
- administrativeReferenceCode = ie801.administrativeReferenceCode.head,
- timestamp,
- messages = messagesToAdd
- )
- )
- }
- }
- }
- }
- .getOrElse {
- if (appConfig.oldAuditingEnabled) auditMessageForNoMovement(originatingMessage)
- Future.successful(Seq.empty)
- }
-
- private def auditMessageForNoMovement(message: IEMessage)(implicit
- hc: HeaderCarrier
- ): Unit = {
- val errorMessage =
- s"An ${message.messageType} message has been retrieved with no movement, unable to create movement"
- auditService.auditMessage(message, errorMessage)
- logger.error(errorMessage)
- }
-
- private def createMovementFromIE704(consignor: String, message: IE704MessageV1, timestamp: Instant)(implicit
- hc: HeaderCarrier
- ): Future[Seq[Movement]] =
- convertMessage(consignor, message, timestamp, shouldNotify = true).map { convertedMessage =>
- message.localReferenceNumber
- .map { lrn =>
- Seq(
- Movement(
- movementIdGenerator.generateId,
- None,
- lrn,
- consignor,
- None,
- administrativeReferenceCode = message.administrativeReferenceCode.head,
- timestamp,
- messages = Seq(convertedMessage)
- )
- )
- }
- .getOrElse {
- if (appConfig.oldAuditingEnabled) auditMessageForNoMovement(message)
- Seq.empty
- }
- }
-
- private def createMovementFromIE801(message: IE801MessageV1, timestamp: Instant): Future[Movement] = {
- val consignorId: String =
- message.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE801: ${message.messageIdentifier}")
- )
- Seq(
- Some(convertMessage(consignorId, message, timestamp, shouldNotify = true)),
- message.consigneeId.map(convertMessage(_, message, timestamp, shouldNotify = true))
- ).flatten.sequence.map { messages =>
- Movement(
- movementIdGenerator.generateId,
- None,
- message.localReferenceNumber,
- consignorId,
- message.consigneeId,
- administrativeReferenceCode = message.administrativeReferenceCode.head,
- timestamp,
- messages = messages
- )
- }
- }
-
- private def findByArc(movements: Seq[Movement], message: IEMessage): OptionT[Future, Seq[Movement]] = {
-
- val matchedMovements = message.administrativeReferenceCode.flatten.flatMap { arc =>
- movements.find(_.administrativeReferenceCode.contains(arc))
- }
-
- if (matchedMovements.isEmpty) OptionT.none else OptionT.pure(matchedMovements)
- }
-
- private def findByArcInMessage(message: IEMessage): OptionT[Future, Seq[Movement]] =
- message.administrativeReferenceCode.flatten.traverse { arc =>
- OptionT(movementRepository.getByArc(arc))
- .filter { movement =>
- message match {
- case ie801: IE801MessageV1 =>
- val consignorId: String =
- ie801.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE801: ${ie801.messageIdentifier}")
- )
- movement.consignorId == consignorId &&
- movement.localReferenceNumber == ie801.localReferenceNumber
-
- case _ =>
- true
- }
- }
- }
-
- private def findByConsignorLrnInMessage(message: IEMessage): OptionT[Future, Seq[Movement]] =
- message match {
- case ie801: IE801MessageV1 =>
- val consignorId: String = message.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE801: ${message.messageIdentifier}")
- )
- OptionT.liftF(movementRepository.getMovementByLRNAndERNIn(ie801.localReferenceNumber, List(consignorId)))
-
- case _ =>
- OptionT.none
- }
-
- private def findByLrn(movements: Seq[Movement], message: IEMessage): OptionT[Future, Seq[Movement]] =
- OptionT.fromOption(
- movements
- .find(movement => message.lrnEquals(movement.localReferenceNumber))
- .map(Seq(_))
- )
-
- private def convertMessage(
- recipient: String,
- input: IEMessage,
- timestamp: Instant,
- shouldNotify: Boolean
- ): Future[Message] = {
-
- def createMessage(boxIds: Set[String]): Message = {
- val encodedMessage = emcsUtils.encode(input.toXml.toString)
- messageSizes.update(encodedMessage.length)
- Message(
- encodedMessage = encodedMessage,
- messageType = input.messageType,
- messageId = input.messageIdentifier,
- recipient = recipient,
- boxesToNotify = boxIds,
- createdOn = timestamp
- )
- }
-
- if (shouldNotify) {
- boxIdRepository.getBoxIds(recipient).map(createMessage)
- } else {
- Future.successful(createMessage(Set.empty))
- }
- }
-
- private def createEnrichedError[A](
- e: Throwable,
- ern: String,
- movements: Seq[Movement],
- movement: Movement
- ): Future[A] =
- e match {
- case e: MongoCommandException if e.getErrorCode == 11000 =>
- movementRepository
- .getMovementByLRNAndERNIn(movement.localReferenceNumber, List(movement.consignorId))
- .flatMap { movementByLrn =>
- val movementMessage =
- s"id: ${movement._id}, consignor: ${movement.consignorId}, lrn: ${movement.localReferenceNumber}, consignee: ${movement.consigneeId}, arc: ${movement.administrativeReferenceCode}, messages: ${movement.messages
- .map(_.messageType)}, currentTime: ${Instant.now()})"
- val movementByLrnMessage = movementByLrn.headOption
- .map(m =>
- s"Some(id: ${m._id}, consignor: ${m.consignorId}, lrn: ${m.localReferenceNumber}, consignee: ${m.consigneeId}, arc: ${m.administrativeReferenceCode}, exists in initially retrieved movements: ${movements
- .exists(_._id == m._id)}, lastUpdated: ${m.lastUpdated}, latestMessageUpdate: ${m.messages
- .maxByOption(_.createdOn)
- .map(_.createdOn)}, messages: ${m.messages.map(_.messageType)})"
- )
- .getOrElse("None")
- movement.administrativeReferenceCode
- .flatTraverse(movementRepository.getByArc)
- .map { movementByArc =>
- movementByArc
- .map(m =>
- s"Some(id: ${m._id}, consignor: ${m.consignorId}, lrn: ${m.localReferenceNumber}, consignee: ${m.consigneeId}, arc: ${m.administrativeReferenceCode}, lastUpdated: ${m.lastUpdated}, latestMessage: ${m.messages
- .maxByOption(_.createdOn)
- .map(_.createdOn)}, messages: ${m.messages.map(_.messageType)})"
- )
- .getOrElse("None")
- }
- .flatMap { movementByArcMessage =>
- val message =
- s"Failed to save movement because of duplicate key violation: \n\nMovement - $movementMessage \n\nExisting movement by LRN - $movementByLrnMessage \n\nExisting movement by ARC - $movementByArcMessage"
- Future.failed(EnrichedError(message, e))
- }
- }
- case _: BsonMaximumSizeExceededException =>
- val message =
- s"ern: $ern, movementId: ${movement._id}, arc: ${movement.administrativeReferenceCode}, numberOfMessages: ${movement.messages.size}, inner: ${e.getMessage}"
- Future.failed(EnrichedError(message, e))
- case _ =>
- val message = s"ern: $ern, movementId: ${movement._id}, inner: ${e.getMessage}"
- Future.failed(EnrichedError(message, e))
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MessageServiceV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MessageServiceV2.scala
deleted file mode 100644
index 76fd32e9e..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MessageServiceV2.scala
+++ /dev/null
@@ -1,584 +0,0 @@
-/*
- * Copyright 2025 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.services
-
-import cats.data.OptionT
-import cats.syntax.all._
-import com.codahale.metrics.MetricRegistry
-import org.apache.pekko.Done
-import org.bson.BsonMaximumSizeExceededException
-import org.mongodb.scala.MongoCommandException
-import play.api.{Configuration, Logging}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.config.AppConfig
-import uk.gov.hmrc.excisemovementcontrolsystemapi.connectors.{MessageConnector, TraderMovementConnector}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Message, Movement, MovementIdGenerator}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.{BoxIdRepository, ErnRetrievalRepository, MovementRepository}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.services.MessageService.{EnrichedError, UpdateOutcome}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.{DateTimeService, EmcsUtils}
-import uk.gov.hmrc.http.HeaderCarrier
-import uk.gov.hmrc.mongo.lock.{LockService, MongoLockRepository}
-
-import java.time.Instant
-import java.util.UUID
-import javax.inject.{Inject, Singleton}
-import scala.concurrent.duration.FiniteDuration
-import scala.concurrent.{ExecutionContext, Future}
-import scala.util.control.NonFatal
-
-@Singleton
-class MessageServiceV2 @Inject() (
- configuration: Configuration,
- movementRepository: MovementRepository,
- ernRetrievalRepository: ErnRetrievalRepository,
- boxIdRepository: BoxIdRepository,
- messageConnector: MessageConnector,
- traderMovementConnector: TraderMovementConnector,
- dateTimeService: DateTimeService,
- emcsUtils: EmcsUtils,
- auditService: AuditService,
- mongoLockRepository: MongoLockRepository,
- metricRegistry: MetricRegistry,
- movementService: MovementService,
- movementIdGenerator: MovementIdGenerator,
- appConfig: AppConfig
-)(implicit executionContext: ExecutionContext)
- extends Logging
- with MessageService {
-
- private val messageSizes = metricRegistry.histogram("message-size")
- private val messageCount = metricRegistry.histogram("message-count")
- private val totalMessageSize = metricRegistry.histogram("total-message-size")
-
- private val throttleCutoff: FiniteDuration =
- configuration.get[FiniteDuration]("microservice.services.eis.throttle-cutoff")
-
- def updateAllMessages(erns: Set[String])(implicit hc: HeaderCarrier): Future[Done] =
- erns.toSeq
- .traverse { ern =>
- ernRetrievalRepository.getLastRetrieved(ern).flatMap { lastRetrieved =>
- updateMessages(ern, lastRetrieved)
- .map(_ => Done)
- .recover({ case NonFatal(error) =>
- logger.warn(s"[MessageService]: Failed to update messages", error)
- Done
- })
- }
- }
- .as(Done)
-
- def updateMessages(ern: String, lastRetrieved: Option[Instant], jobId: Option[String] = None)(implicit
- hc: HeaderCarrier
- ): Future[UpdateOutcome] = {
- val lockService = LockService(mongoLockRepository, ern, throttleCutoff)
- lockService
- .withLock {
- val now = dateTimeService.timestamp()
- if (shouldProcessNewMessages(lastRetrieved, now)) {
- for {
- _ <- processNewMessages(ern, jobId)
- _ <- ernRetrievalRepository.setLastRetrieved(ern, now)
- } yield UpdateOutcome.Updated
- } else {
- Future.successful(UpdateOutcome.NotUpdatedThrottled)
- }
- }
- .map(_.getOrElse(UpdateOutcome.Locked))
- }
-
- private def shouldProcessNewMessages(maybeLastRetrieved: Option[Instant], now: Instant): Boolean = {
- val cutoffTime = now.minus(throttleCutoff.length, throttleCutoff.unit.toChronoUnit)
- //noinspection MapGetOrElseBoolean
- maybeLastRetrieved.map(_.isBefore(cutoffTime)).getOrElse(true)
- }
-
- private def processNewMessages(ern: String, jobId: Option[String])(implicit hc: HeaderCarrier): Future[Done] = {
- logger.info(s"[MessageService]: Processing new messages")
- val batchId = UUID.randomUUID().toString
-
- for {
- response <- messageConnector.getNewMessages(ern, batchId, jobId)
- _ <- updateMovements(ern, response.messages, jobId, Some(batchId))
- _ <- acknowledgeAndContinue(response, ern, batchId, jobId)
- } yield Done
- }
-
- private def acknowledgeAndContinue(
- response: GetMessagesResponse,
- ern: String,
- batchId: String,
- jobId: Option[String]
- )(implicit
- hc: HeaderCarrier
- ): Future[Done] =
- if (response.messageCount == 0) {
- Future.successful(Done)
- } else {
- messageConnector
- .acknowledgeMessages(ern, batchId, jobId)
- .flatMap { ackRes =>
- auditService.messageAcknowledged(ern, batchId, jobId, ackRes.recordsAffected)
- if (response.messageCount > response.messages.size) {
- processNewMessages(ern, jobId)
- } else {
- Future.successful(Done)
- }
- }
- .recoverWith { case ex =>
- logger.warn(s"[MessageService]: Unexpected error: ${ex.getMessage}")
- auditService.messageNotAcknowledged(ern, batchId, jobId, ex.getMessage)
- Future.failed(ex)
- }
- }
-
- private def updateMovements(
- ern: String,
- messages: Seq[IEMessage],
- jobId: Option[String],
- batchId: Option[String]
- )(implicit
- hc: HeaderCarrier
- ): Future[Done] = {
- logger.info(s"[MessageService]: Updating movements")
- if (messages.nonEmpty) {
- val administrativeReferenceCodes: Seq[String] = messages.flatMap(_.administrativeReferenceCode).flatten
- val localReferenceNumbers: Seq[String] = messages.flatMap(_.optionalLocalReferenceNumber)
-
- movementRepository
- .getAllBy(ern, localReferenceNumbers, administrativeReferenceCodes)
- .flatMap { movements: Seq[Movement] =>
- messages
- .foldLeft(Future.successful(Seq.empty[Movement])) { (accumulated, message) =>
- for {
- accumulatedMovements <- accumulated
- updatedMovements <- updateOrCreateMovements(
- ern,
- movements,
- accumulatedMovements,
- message,
- shouldNotify = true,
- dateTimeService.timestamp()
- )
- } yield (updatedMovements ++ accumulatedMovements)
- .distinctBy { movement =>
- (movement.localReferenceNumber, movement.consignorId, movement.administrativeReferenceCode)
- }
- }
- .flatMap {
- _.traverse { movement =>
- messageCount.update(movement.messages.length)
- totalMessageSize.update(movement.messages.map(_.encodedMessage.length).sum)
- movementService.saveMovement(movement, jobId, batchId).recoverWith { case NonFatal(e) =>
- createEnrichedError(e, ern, movements, movement)
- }
- }
- }
- }
- .as(Done)
- } else {
- Future.successful(Done)
- }
- }
-
- private def updateOrCreateMovements(
- ern: String,
- movements: Seq[Movement],
- updatedMovements: Seq[Movement],
- message: IEMessage,
- shouldNotify: Boolean,
- timestamp: Instant
- )(implicit hc: HeaderCarrier): Future[Seq[Movement]] =
- findMovementsForMessage(movements, updatedMovements, message).flatMap { matchedMovements =>
- if (matchedMovements.nonEmpty) {
- matchedMovements.traverse { movement =>
- updateMovement(movement, ern, message, shouldNotify = shouldNotify, timestamp)
- }
- } else {
- createMovements(ern, message, movements, updatedMovements, timestamp)
- .map(movement => (movement +: updatedMovements.map(Some(_))).flatten)
- }
- }
-
- private def updateMovement(
- movement: Movement,
- recipient: String,
- message: IEMessage,
- shouldNotify: Boolean,
- timestamp: Instant
- ): Future[Movement] =
- if (
- movement.messages.exists(m =>
- m.messageId == message.messageIdentifier
- && m.recipient.equalsIgnoreCase(recipient)
- )
- ) {
- Future.successful(movement)
- } else {
- getUpdatedMessages(recipient, movement, message, timestamp, shouldNotify).map { updatedMessages =>
- movement.copy(
- messages = updatedMessages,
- administrativeReferenceCode = getArc(movement, message),
- consigneeId = getConsignee(movement, message),
- lastUpdated = List(timestamp, movement.lastUpdated).max
- )
- }
- }
-
- private def getUpdatedMessages(
- recipient: String,
- movement: Movement,
- message: IEMessage,
- timestamp: Instant,
- shouldNotify: Boolean
- ): Future[Seq[Message]] =
- message match {
- case ie801: IE801MessageV2 =>
- val consignorId: String =
- ie801.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE801: ${ie801.messageIdentifier}")
- )
- Seq(
- Some(convertMessage(consignorId, ie801, timestamp, shouldNotify)),
- ie801.consigneeId.map(convertMessage(_, ie801, timestamp, shouldNotify))
- ).flatten.sequence.map { messages =>
- val newMessages = messages.filterNot { m1 =>
- movement.messages.exists { m2 =>
- m1.messageId == m2.messageId &&
- m1.recipient == m2.recipient
- }
- }
- movement.messages ++ newMessages
- }
-
- case _ =>
- convertMessage(recipient, message, timestamp, shouldNotify).map(movement.messages :+ _)
- }
-
- private def findMovementsForMessage(
- movements: Seq[Movement],
- updatedMovements: Seq[Movement],
- message: IEMessage
- ): Future[Seq[Movement]] =
- (findByArc(updatedMovements, message) orElse
- findByLrn(updatedMovements, message) orElse
- findByArc(movements, message) orElse
- findByLrn(movements, message) orElse
- findByArcInMessage(message) orElse
- findByConsignorLrnInMessage(message)).getOrElse(Seq.empty)
-
- private def getConsignee(movement: Movement, message: IEMessage): Option[String] =
- message match {
- case ie801: IE801MessageV2 => ie801.consigneeId
- case ie813: IE813MessageV2 => ie813.consigneeId orElse movement.consigneeId
- case _ => movement.consigneeId
- }
-
- private def getArc(movement: Movement, message: IEMessage): Option[String] =
- message match {
- case ie801: IE801MessageV2 =>
- movement.administrativeReferenceCode orElse ie801.administrativeReferenceCode.flatten.headOption
- case _ => movement.administrativeReferenceCode
- }
-
- private def createMovements(
- ern: String,
- message: IEMessage,
- movements: Seq[Movement],
- updatedMovements: Seq[Movement],
- timestamp: Instant
- )(implicit
- hc: HeaderCarrier
- ): Future[Seq[Movement]] =
- message match {
- case ie704: IE704MessageV2 if ie704.localReferenceNumber.isDefined =>
- createMovementFromIE704(ern, ie704, timestamp)
- case ie801: IE801MessageV2 =>
- createMovementFromIE801(ie801, timestamp).map(Seq(_))
- case _ =>
- createMovementsFromTraderMovement(ern, message, movements, updatedMovements, timestamp)
- }
-
- private def createMovementsFromTraderMovement(
- ern: String,
- message: IEMessage,
- movements: Seq[Movement],
- updatedMovements: Seq[Movement],
- timestamp: Instant
- )(implicit
- hc: HeaderCarrier
- ): Future[Seq[Movement]] =
- message.administrativeReferenceCode.flatten.headOption
- .map { arc =>
- traderMovementConnector.getMovementMessages(ern, arc).flatMap { messages =>
- buildMovementFromTraderMovement(messages, message, ern, movements, updatedMovements, timestamp)
- }
- }
- .getOrElse {
- // Auditing here because we only want to audit on the message we've picked up rather than the messages from `getMovementMessages`
- if (appConfig.oldAuditingEnabled) auditMessageForNoMovement(message)
- Future.successful(Seq.empty)
- }
-
- private def buildMovementFromTraderMovement(
- messages: Seq[IEMessage],
- originatingMessage: IEMessage,
- originatingErn: String,
- movements: Seq[Movement],
- updatedMovements: Seq[Movement],
- timestamp: Instant
- )(implicit
- hc: HeaderCarrier
- ): Future[Seq[Movement]] =
- messages
- .collectFirst { case ie801: IE801MessageV2 =>
- findMovementsForMessage(movements, updatedMovements, ie801).flatMap { movements =>
- if (movements.nonEmpty) {
- movements.traverse { movement =>
- val consignorId: String =
- ie801.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE801: ${ie801.messageIdentifier}")
- )
- updateMovement(movement, consignorId, ie801, shouldNotify = false, timestamp).flatMap { updatedMovement =>
- ie801.consigneeId
- .map { consigneeId =>
- updateMovement(updatedMovement, consigneeId, ie801, shouldNotify = false, timestamp)
- }
- .getOrElse(Future.successful(updatedMovement))
- .flatMap { updatedMovement =>
- updateMovement(
- updatedMovement,
- originatingErn,
- originatingMessage,
- shouldNotify = true,
- timestamp
- )
- }
- }
- }
- } else {
-
- // For a new movement from trader-movement call, add the IE801 for the consignor and consignee
- // also add the originating message all at once
- val consignorId: String =
- ie801.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE801: ${ie801.messageIdentifier}")
- )
- Seq(
- Some(convertMessage(consignorId, ie801, timestamp, shouldNotify = false)),
- ie801.consigneeId.map(convertMessage(_, ie801, timestamp, shouldNotify = false)),
- Some(convertMessage(originatingErn, originatingMessage, timestamp, shouldNotify = true))
- ).flatten.sequence.map { messagesToAdd =>
- Seq(
- Movement(
- movementIdGenerator.generateId,
- None,
- ie801.localReferenceNumber,
- consignorId,
- ie801.consigneeId,
- administrativeReferenceCode = ie801.administrativeReferenceCode.head,
- timestamp,
- messages = messagesToAdd
- )
- )
- }
- }
- }
- }
- .getOrElse {
- if (appConfig.oldAuditingEnabled) auditMessageForNoMovement(originatingMessage)
- Future.successful(Seq.empty)
- }
-
- private def auditMessageForNoMovement(message: IEMessage)(implicit
- hc: HeaderCarrier
- ): Unit = {
- val errorMessage =
- s"An ${message.messageType} message has been retrieved with no movement, unable to create movement"
- auditService.auditMessage(message, errorMessage)
- logger.error(errorMessage)
- }
-
- private def createMovementFromIE704(consignor: String, message: IE704MessageV2, timestamp: Instant)(implicit
- hc: HeaderCarrier
- ): Future[Seq[Movement]] =
- convertMessage(consignor, message, timestamp, shouldNotify = true).map { convertedMessage =>
- message.localReferenceNumber
- .map { lrn =>
- Seq(
- Movement(
- movementIdGenerator.generateId,
- None,
- lrn,
- consignor,
- None,
- administrativeReferenceCode = message.administrativeReferenceCode.head,
- timestamp,
- messages = Seq(convertedMessage)
- )
- )
- }
- .getOrElse {
- if (appConfig.oldAuditingEnabled) auditMessageForNoMovement(message)
- Seq.empty
- }
- }
-
- private def createMovementFromIE801(message: IE801MessageV2, timestamp: Instant): Future[Movement] = {
- val consignorId: String =
- message.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE801: ${message.messageIdentifier}")
- )
- Seq(
- Some(convertMessage(consignorId, message, timestamp, shouldNotify = true)),
- message.consigneeId.map(convertMessage(_, message, timestamp, shouldNotify = true))
- ).flatten.sequence.map { messages =>
- Movement(
- movementIdGenerator.generateId,
- None,
- message.localReferenceNumber,
- consignorId,
- message.consigneeId,
- administrativeReferenceCode = message.administrativeReferenceCode.head,
- timestamp,
- messages = messages
- )
- }
- }
-
- private def findByArc(movements: Seq[Movement], message: IEMessage): OptionT[Future, Seq[Movement]] = {
-
- val matchedMovements = message.administrativeReferenceCode.flatten.flatMap { arc =>
- movements.find(_.administrativeReferenceCode.contains(arc))
- }
-
- if (matchedMovements.isEmpty) OptionT.none else OptionT.pure(matchedMovements)
- }
-
- private def findByArcInMessage(message: IEMessage): OptionT[Future, Seq[Movement]] =
- message.administrativeReferenceCode.flatten.traverse { arc =>
- OptionT(movementRepository.getByArc(arc))
- .filter { movement =>
- message match {
- case ie801: IE801MessageV2 =>
- val consignorId: String =
- ie801.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE801: ${ie801.messageIdentifier}")
- )
- movement.consignorId == consignorId &&
- movement.localReferenceNumber == ie801.localReferenceNumber
-
- case _ =>
- true
- }
- }
- }
-
- private def findByConsignorLrnInMessage(message: IEMessage): OptionT[Future, Seq[Movement]] =
- message match {
- case ie801: IE801MessageV2 =>
- val consignorId: String = message.consignorId.getOrElse(
- throw new Exception(s"No Consignor on IE801: ${message.messageIdentifier}")
- )
- OptionT.liftF(movementRepository.getMovementByLRNAndERNIn(ie801.localReferenceNumber, List(consignorId)))
-
- case _ =>
- OptionT.none
- }
-
- private def findByLrn(movements: Seq[Movement], message: IEMessage): OptionT[Future, Seq[Movement]] =
- OptionT.fromOption(
- movements
- .find(movement => message.lrnEquals(movement.localReferenceNumber))
- .map(Seq(_))
- )
-
- private def convertMessage(
- recipient: String,
- input: IEMessage,
- timestamp: Instant,
- shouldNotify: Boolean
- ): Future[Message] = {
-
- def createMessage(boxIds: Set[String]): Message = {
- val encodedMessage = emcsUtils.encode(input.toXml.toString)
- messageSizes.update(encodedMessage.length)
- Message(
- encodedMessage = encodedMessage,
- messageType = input.messageType,
- messageId = input.messageIdentifier,
- recipient = recipient,
- boxesToNotify = boxIds,
- createdOn = timestamp
- )
- }
-
- if (shouldNotify) {
- boxIdRepository.getBoxIds(recipient).map(createMessage)
- } else {
- Future.successful(createMessage(Set.empty))
- }
- }
-
- private def createEnrichedError[A](
- e: Throwable,
- ern: String,
- movements: Seq[Movement],
- movement: Movement
- ): Future[A] =
- e match {
- case e: MongoCommandException if e.getErrorCode == 11000 =>
- movementRepository
- .getMovementByLRNAndERNIn(movement.localReferenceNumber, List(movement.consignorId))
- .flatMap { movementByLrn =>
- val movementMessage =
- s"id: ${movement._id}, consignor: ${movement.consignorId}, lrn: ${movement.localReferenceNumber}, consignee: ${movement.consigneeId}, arc: ${movement.administrativeReferenceCode}, messages: ${movement.messages
- .map(_.messageType)}, currentTime: ${Instant.now()})"
- val movementByLrnMessage = movementByLrn.headOption
- .map(m =>
- s"Some(id: ${m._id}, consignor: ${m.consignorId}, lrn: ${m.localReferenceNumber}, consignee: ${m.consigneeId}, arc: ${m.administrativeReferenceCode}, exists in initially retrieved movements: ${movements
- .exists(_._id == m._id)}, lastUpdated: ${m.lastUpdated}, latestMessageUpdate: ${m.messages
- .maxByOption(_.createdOn)
- .map(_.createdOn)}, messages: ${m.messages.map(_.messageType)})"
- )
- .getOrElse("None")
- movement.administrativeReferenceCode
- .flatTraverse(movementRepository.getByArc)
- .map { movementByArc =>
- movementByArc
- .map(m =>
- s"Some(id: ${m._id}, consignor: ${m.consignorId}, lrn: ${m.localReferenceNumber}, consignee: ${m.consigneeId}, arc: ${m.administrativeReferenceCode}, lastUpdated: ${m.lastUpdated}, latestMessage: ${m.messages
- .maxByOption(_.createdOn)
- .map(_.createdOn)}, messages: ${m.messages.map(_.messageType)})"
- )
- .getOrElse("None")
- }
- .flatMap { movementByArcMessage =>
- val message =
- s"Failed to save movement because of duplicate key violation: \n\nMovement - $movementMessage \n\nExisting movement by LRN - $movementByLrnMessage \n\nExisting movement by ARC - $movementByArcMessage"
- Future.failed(EnrichedError(message, e))
- }
- }
- case _: BsonMaximumSizeExceededException =>
- val message =
- s"ern: $ern, movementId: ${movement._id}, arc: ${movement.administrativeReferenceCode}, numberOfMessages: ${movement.messages.size}, inner: ${e.getMessage}"
- Future.failed(EnrichedError(message, e))
- case _ =>
- val message = s"ern: $ern, movementId: ${movement._id}, inner: ${e.getMessage}"
- Future.failed(EnrichedError(message, e))
- }
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/TransformService.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/TransformService.scala
deleted file mode 100644
index 2df8574c0..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/services/TransformService.scala
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * Copyright 2026 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.services
-
-import generated.v2._
-
-import javax.inject.{Inject, Singleton}
-import scala.concurrent.ExecutionContext
-import cats.data.EitherT
-import org.xml.sax.{ErrorHandler, SAXParseException}
-
-import java.io.StringReader
-import javax.xml.XMLConstants
-import javax.xml.transform.stream.StreamSource
-import javax.xml.validation.{Schema, SchemaFactory}
-import scala.concurrent.Future
-import scala.util.control.NonFatal
-import cats.implicits._
-import play.api.libs.json.{Json, OFormat}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.config.AppConfig
-
-import java.util.Base64
-import java.nio.charset.StandardCharsets
-import java.util.concurrent.ConcurrentHashMap
-import scala.xml.{Elem, NodeSeq}
-
-@Singleton
-class TransformService @Inject() (appConfig: AppConfig)(implicit ec: ExecutionContext) {
- val xsdPathsV1 = Map(
- "IE704" -> "/v1/ie704uk.xsd",
- "IE801" -> "/v1/ie801.xsd",
- "IE802" -> "/v1/ie802.xsd",
- "IE803" -> "/v1/ie803.xsd",
- "IE807" -> "/v1/ie807.xsd",
- "IE810" -> "/v1/ie810.xsd",
- "IE813" -> "/v1/ie813.xsd",
- "IE818" -> "/v1/ie818.xsd",
- "IE819" -> "/v1/ie819.xsd",
- "IE829" -> "/v1/ie829.xsd",
- "IE837" -> "/v1/ie837.xsd",
- "IE839" -> "/v1/ie839.xsd",
- "IE840" -> "/v1/ie840.xsd",
- "IE871" -> "/v1/ie871.xsd",
- "IE881" -> "/v1/ie881.xsd",
- "IE905" -> "/v1/ie905.xsd"
- )
-
- val xsdPathsV2 = Map(
- "IE704" -> "/v2/ie704uk.xsd",
- "IE801" -> "/v2/ie801.xsd",
- "IE802" -> "/v2/ie802.xsd",
- "IE803" -> "/v2/ie803.xsd",
- "IE807" -> "/v2/ie807.xsd",
- "IE810" -> "/v2/ie810.xsd",
- "IE813" -> "/v2/ie813.xsd",
- "IE818" -> "/v2/ie818.xsd",
- "IE819" -> "/v2/ie819.xsd",
- "IE829" -> "/v2/ie829.xsd",
- "IE837" -> "/v2/ie837.xsd",
- "IE839" -> "/v2/ie839.xsd",
- "IE840" -> "/v2/ie840.xsd",
- "IE871" -> "/v2/ie871.xsd",
- "IE881" -> "/v2/ie881.xsd",
- "IE905" -> "/v2/ie905.xsd"
- )
-
- private val schemaMapV1 = new ConcurrentHashMap[String, Schema]()
- private val schemaMapV2 = new ConcurrentHashMap[String, Schema]()
-
- def transform(
- messageType: String,
- base64EncodedMessage: String
- ): Future[Either[TransformationError, String]] = {
- val result = for {
- decodedMessage <- decodeBase64(base64EncodedMessage)
- _ <- if (appConfig.runV1Validation) validateSchema(messageType, decodedMessage, isOldSchema = true)
- else EitherT.pure[Future, TransformationError](())
- updatedXML <- rewriteNamespace(decodedMessage)
- messageWithIE801Check <- if (messageType == "IE801") convertImportSadToCustomDeclarationHelper(updatedXML)
- else EitherT.fromEither[Future](Right(updatedXML))
- messageWithIE829Check <- if (messageType == "IE829")
- exportDeclarationTransformation(scala.xml.XML.loadString(messageWithIE801Check))
- else EitherT.fromEither[Future](Right(messageWithIE801Check))
- _ <- validateFormat(messageType, messageWithIE829Check)
- _ <- validateSchema(messageType, messageWithIE829Check, isOldSchema = false)
- } yield messageWithIE829Check
-
- result.value.map {
- case Left(e) => Left(e)
- case Right(a) => Right(base64Encode(a))
- }
-
- }
- private def validateFormat(messageType: String, message: String): EitherT[Future, TransformationError, Unit] =
- EitherT.fromEither {
- try messageType match {
- case "IE704" => scalaxb.fromXML[IE704Type](scala.xml.XML.loadString(message)); Right(())
- case "IE801" => scalaxb.fromXML[IE801Type](scala.xml.XML.loadString(message)); Right(())
- case "IE802" => scalaxb.fromXML[IE802Type](scala.xml.XML.loadString(message)); Right(())
- case "IE803" => scalaxb.fromXML[IE803Type](scala.xml.XML.loadString(message)); Right(())
- case "IE807" => scalaxb.fromXML[IE807Type](scala.xml.XML.loadString(message)); Right(())
- case "IE810" => scalaxb.fromXML[IE810Type](scala.xml.XML.loadString(message)); Right(())
- case "IE813" => scalaxb.fromXML[IE813Type](scala.xml.XML.loadString(message)); Right(())
- case "IE818" => scalaxb.fromXML[IE818Type](scala.xml.XML.loadString(message)); Right(())
- case "IE819" => scalaxb.fromXML[IE819Type](scala.xml.XML.loadString(message)); Right(())
- case "IE829" => scalaxb.fromXML[IE829Type](scala.xml.XML.loadString(message)); Right(())
- case "IE837" => scalaxb.fromXML[IE837Type](scala.xml.XML.loadString(message)); Right(())
- case "IE839" => scalaxb.fromXML[IE839Type](scala.xml.XML.loadString(message)); Right(())
- case "IE840" => scalaxb.fromXML[IE840Type](scala.xml.XML.loadString(message)); Right(())
- case "IE871" => scalaxb.fromXML[IE871Type](scala.xml.XML.loadString(message)); Right(())
- case "IE881" => scalaxb.fromXML[IE881Type](scala.xml.XML.loadString(message)); Right(())
- case "IE905" => scalaxb.fromXML[IE905Type](scala.xml.XML.loadString(message)); Right(())
- case _ => Left(MessageDoesNotExistError)
- } catch {
- case NonFatal(e) => Left(FormatValidationError(e.toString))
- }
-
- }
-
- private def validateSchema(
- messageType: String,
- message: String,
- isOldSchema: Boolean
- ): EitherT[Future, TransformationError, Unit] = {
- var exceptions = List[String]()
- EitherT {
- Future {
- val schema =
- if (isOldSchema) fetchSchema(schemaMapV1, xsdPathsV1, messageType)
- else
- fetchSchema(schemaMapV2, xsdPathsV2, messageType)
-
- val validator = schema.newValidator()
- validator.setErrorHandler(new ErrorHandler() {
- @Override
- def warning(exception: SAXParseException): Unit =
- exceptions = exception.getMessage :: exceptions
-
- @Override
- def fatalError(exception: SAXParseException): Unit =
- exceptions = exception.getMessage :: exceptions
-
- @Override
- def error(exception: SAXParseException): Unit =
- exceptions = exception.getMessage :: exceptions
- })
- validator.validate(new StreamSource(new StringReader(message)))
-
- if (exceptions.nonEmpty) {
- Left(schemaError(isOldSchema, exceptions))
-
- } else {
- Right(())
- }
- }.recover { case e =>
- Left(schemaError(isOldSchema, exceptions, Some(e.getMessage)))
- }
- }
- }
-
- private def fetchSchema(
- schemaMap: ConcurrentHashMap[String, Schema],
- xsdPaths: Map[String, String],
- messageType: String
- ) =
- schemaMap.computeIfAbsent(
- messageType,
- messageType => {
- val schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
- val url = getClass.getResource(xsdPaths(messageType))
- val src = new StreamSource(url.openStream())
- src.setSystemId(url.toExternalForm)
- schemaFactory.newSchema(src)
- }
- )
-
- private def decodeBase64(base64EncodedMessage: String): EitherT[Future, TransformationError, String] =
- EitherT.fromEither {
- try Right(new String(Base64.getDecoder.decode(base64EncodedMessage), "UTF-8"))
- catch {
- case NonFatal(e) => Left(Base64DecodingError(e.getMessage))
- }
- }
-
- private def rewriteNamespace(decodedMessage: String): EitherT[Future, TransformationError, String] =
- EitherT.fromEither[Future] {
- try {
- val namespaceRegex = "\"(urn:publicid:-:EC:DGTAXUD:EMCS:[^\"]+?):V3\\.13\"".r
- Right(namespaceRegex.replaceAllIn(decodedMessage, "\"$1:V3.23\""))
- } catch {
- case e: Exception => Left(RewriteNamespaceError(e.toString))
- }
-
- }
-
- private def schemaError(isOldSchema: Boolean, exceptions: List[String], errMessage: Option[String] = None) =
- if (isOldSchema) {
- OldSchemaValidationError(errMessage, exceptions = exceptions)
- } else {
- SchemaValidationError(errMessage, exceptions)
- }
- private def convertImportSadToCustomDeclarationHelper(
- updatedXML: String
- ): EitherT[Future, TransformationError, String] =
- EitherT.fromEither[Future] {
- try Right(convertImportSadToCustomDeclaration(scala.xml.XML.loadString(updatedXML)).toString())
- catch {
- case e: Exception => Left(ImportSadConversionError(e.toString))
- }
- }
-
- private def convertImportSadToCustomDeclaration(n: scala.xml.Node): scala.xml.Node =
- n match {
-
- case e: scala.xml.Elem =>
- val newLabel = e.label match {
- case "ImportSad" => "ImportCustomsDeclaration"
- case "ImportSadNumber" => "ImportCustomsDeclarationNumber"
- case label => label
- }
-
- e.copy(label = newLabel, child = e.child.map(convertImportSadToCustomDeclaration))
-
- case other => other
- }
-
- private def exportDeclarationTransformation(xml: scala.xml.Node): EitherT[Future, TransformationError, String] =
- EitherT.fromEither[Future] {
- val exportDeclarationElement = xml \\ "ExportDeclarationAcceptanceOrGoodsReleasedForExport"
- if (exportDeclarationElement.map(_.text).toSet.size > 1) Left(ExportDeclarationMultipleDifferentValuesError)
- else {
-
- exportDeclarationElement.headOption
- .map { exportDeclaration =>
- def removeExportDeclaration(n: scala.xml.Node): NodeSeq = {
- //get export save it append it to
- val res = n match {
- case e: scala.xml.Elem if e.label == "ExportDeclarationAcceptanceOrGoodsReleasedForExport" =>
- NodeSeq.Empty
- case e: scala.xml.Elem => e.copy(child = e.child.flatMap(removeExportDeclaration))
- case other => other
- }
- res
- }
-
- def appendToExportDeclarationAcceptanceRelease(xml: scala.xml.Node): NodeSeq =
- //keep, delete, put aside - message only
- //catch if head is empty
- xml match {
- case e: scala.xml.Elem if e.label == "ExportDeclarationAcceptanceRelease" =>
- e.copy(child = e.child ++ exportDeclaration)
- case e: Elem =>
- e.copy(child = e.child.flatMap(appendToExportDeclarationAcceptanceRelease))
- case other => other
-
- }
-
- try Right(appendToExportDeclarationAcceptanceRelease(removeExportDeclaration(xml).head).toString())
- catch {
- case e: Exception => Left(ExportDeclarationTransformError(e.toString))
- }
- }
- .getOrElse(
- Left(
- ExportDeclarationNotFoundTransformError(
- "Could not locate ExportDeclarationAcceptanceOrGoodsReleasedForExport in xml"
- )
- )
- )
- }
- }
-
- private def base64Encode(string: String): String =
- Base64.getEncoder.encodeToString(string.getBytes(StandardCharsets.UTF_8))
-}
-
-sealed trait TransformationError
-
-case class Base64DecodingError(error: String) extends TransformationError
-case class FormatValidationError(error: String) extends TransformationError
-case class SchemaValidationError(error: Option[String] = None, exceptions: List[String]) extends TransformationError
-case class OldSchemaValidationError(error: Option[String] = None, exceptions: List[String]) extends TransformationError
-case object MessageDoesNotExistError extends TransformationError
-
-case class RewriteNamespaceError(error: String) extends TransformationError
-case class ImportSadConversionError(error: String) extends TransformationError
-
-case class ExportDeclarationNotFoundTransformError(error: String) extends TransformationError
-case class ExportDeclarationTransformError(error: String) extends TransformationError
-case object ExportDeclarationMultipleDifferentValuesError extends TransformationError
-
-object TransformationError {
- implicit lazy val transformError: OFormat[TransformationError] = Json.format
- implicit lazy val base64DecodingError: OFormat[Base64DecodingError] = Json.format
- implicit lazy val oldSchemaValidationError: OFormat[OldSchemaValidationError] = Json.format
- implicit lazy val formatValidationError: OFormat[FormatValidationError] = Json.format
- implicit lazy val schemaValidationError: OFormat[SchemaValidationError] = Json.format
- implicit lazy val messageDoesNotExistError: OFormat[MessageDoesNotExistError.type] = Json.format
- implicit lazy val rewriteNamespaceError: OFormat[RewriteNamespaceError] = Json.format
- implicit lazy val importSadConversionError: OFormat[ImportSadConversionError] = Json.format
- implicit lazy val exportDeclarationNotFoundTransformError: OFormat[ExportDeclarationNotFoundTransformError] =
- Json.format
- implicit lazy val exportDeclarationTransformError: OFormat[ExportDeclarationTransformError] = Json.format
- implicit lazy val exportDeclarationMultipleDifferentValuesError
- : OFormat[ExportDeclarationMultipleDifferentValuesError.type] = Json.format
-
-}
-
-case class EnhancedTransformationError(error: TransformationError, messageType: String, messageID: String)
-
-object EnhancedTransformationError {
- implicit lazy val format: OFormat[EnhancedTransformationError] = Json.format
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/utils/NrsEventIdMapper.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/utils/NrsEventIdMapper.scala
index 15a5b409f..f19d24980 100644
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/utils/NrsEventIdMapper.scala
+++ b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/utils/NrsEventIdMapper.scala
@@ -16,9 +16,20 @@
package uk.gov.hmrc.excisemovementcontrolsystemapi.utils
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{IE810Message, IE813Message, IE815Message, IE818Message, IE819Message, IE837Message, IE871Message, IEMessage}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.nrs.NrsMetadata
-trait NrsEventIdMapper {
- def mapMessageToEventId(message: IEMessage): String
+class NrsEventIdMapper {
+ def mapMessageToEventId(message: IEMessage): String =
+ message match {
+ case _: IE815Message => NrsMetadata.EmcsCreateMovementNotableEventId
+ case _: IE810Message => NrsMetadata.EmccCancelMovement
+ case _: IE813Message => NrsMetadata.EmcsChangeDestinationNotableEventId
+ case _: IE818Message => NrsMetadata.EmcsReportOfReceiptNotableEvent
+ case _: IE819Message => NrsMetadata.EmcsSubmitAlertOrRejectionNotableEventId
+ case _: IE837Message => NrsMetadata.EmcsExplainADelayNotableEventId
+ case _: IE871Message => NrsMetadata.EmcsExplainAShortageNotableEventId
+ case _ => throw new RuntimeException(s"[NrsEventClientMapper] - Unsupported message: ${message.messageType}")
+ }
}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/utils/NrsEventIdMapperV1.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/utils/NrsEventIdMapperV1.scala
deleted file mode 100644
index 77fd7cdb1..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/utils/NrsEventIdMapperV1.scala
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.utils
-
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.nrs.NrsMetadata
-
-class NrsEventIdMapperV1 extends NrsEventIdMapper {
- def mapMessageToEventId(message: IEMessage): String =
- message match {
- case _: IE815MessageV1 => NrsMetadata.EmcsCreateMovementNotableEventId
- case _: IE810MessageV1 => NrsMetadata.EmccCancelMovement
- case _: IE813MessageV1 => NrsMetadata.EmcsChangeDestinationNotableEventId
- case _: IE818MessageV1 => NrsMetadata.EmcsReportOfReceiptNotableEvent
- case _: IE819MessageV1 => NrsMetadata.EmcsSubmitAlertOrRejectionNotableEventId
- case _: IE837MessageV1 => NrsMetadata.EmcsExplainADelayNotableEventId
- case _: IE871MessageV1 => NrsMetadata.EmcsExplainAShortageNotableEventId
- case _ => throw new RuntimeException(s"[NrsEventClientMapper] - Unsupported message: ${message.messageType}")
- }
-
-}
diff --git a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/utils/NrsEventIdMapperV2.scala b/app/uk/gov/hmrc/excisemovementcontrolsystemapi/utils/NrsEventIdMapperV2.scala
deleted file mode 100644
index ae06e5f98..000000000
--- a/app/uk/gov/hmrc/excisemovementcontrolsystemapi/utils/NrsEventIdMapperV2.scala
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.utils
-
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.nrs.NrsMetadata
-
-class NrsEventIdMapperV2 extends NrsEventIdMapper {
- def mapMessageToEventId(message: IEMessage): String =
- message match {
- case _: IE815MessageV2 => NrsMetadata.EmcsCreateMovementNotableEventId
- case _: IE810MessageV2 => NrsMetadata.EmccCancelMovement
- case _: IE813MessageV2 => NrsMetadata.EmcsChangeDestinationNotableEventId
- case _: IE818MessageV2 => NrsMetadata.EmcsReportOfReceiptNotableEvent
- case _: IE819MessageV2 => NrsMetadata.EmcsSubmitAlertOrRejectionNotableEventId
- case _: IE837MessageV2 => NrsMetadata.EmcsExplainADelayNotableEventId
- case _: IE871MessageV2 => NrsMetadata.EmcsExplainAShortageNotableEventId
- case _ => throw new RuntimeException(s"[NrsEventClientMapper] - Unsupported message: ${message.messageType}")
- }
-
-}
diff --git a/app/xsd/v2/MovementForTraderData.xsd b/app/xsd/MovementForTraderData.xsd
similarity index 100%
rename from app/xsd/v2/MovementForTraderData.xsd
rename to app/xsd/MovementForTraderData.xsd
diff --git a/app/xsd/v2/NewMessagesData.xsd b/app/xsd/NewMessagesData.xsd
similarity index 100%
rename from app/xsd/v2/NewMessagesData.xsd
rename to app/xsd/NewMessagesData.xsd
diff --git a/app/xsd/v1/control-1.1.xsd b/app/xsd/control-1.1.xsd
similarity index 100%
rename from app/xsd/v1/control-1.1.xsd
rename to app/xsd/control-1.1.xsd
diff --git a/app/xsd/v2/doc.xsd b/app/xsd/doc.xsd
similarity index 100%
rename from app/xsd/v2/doc.xsd
rename to app/xsd/doc.xsd
diff --git a/app/xsd/v2/emcsukcodes.xsd b/app/xsd/emcsukcodes.xsd
similarity index 100%
rename from app/xsd/v2/emcsukcodes.xsd
rename to app/xsd/emcsukcodes.xsd
diff --git a/app/xsd/v2/ie704uk.xsd b/app/xsd/ie704uk.xsd
similarity index 100%
rename from app/xsd/v2/ie704uk.xsd
rename to app/xsd/ie704uk.xsd
diff --git a/app/xsd/v2/ie717.xsd b/app/xsd/ie717.xsd
similarity index 100%
rename from app/xsd/v2/ie717.xsd
rename to app/xsd/ie717.xsd
diff --git a/app/xsd/v2/ie801.xsd b/app/xsd/ie801.xsd
similarity index 100%
rename from app/xsd/v2/ie801.xsd
rename to app/xsd/ie801.xsd
diff --git a/app/xsd/v2/ie802.xsd b/app/xsd/ie802.xsd
similarity index 100%
rename from app/xsd/v2/ie802.xsd
rename to app/xsd/ie802.xsd
diff --git a/app/xsd/v2/ie803.xsd b/app/xsd/ie803.xsd
similarity index 100%
rename from app/xsd/v2/ie803.xsd
rename to app/xsd/ie803.xsd
diff --git a/app/xsd/v2/ie807.xsd b/app/xsd/ie807.xsd
similarity index 100%
rename from app/xsd/v2/ie807.xsd
rename to app/xsd/ie807.xsd
diff --git a/app/xsd/v2/ie810.xsd b/app/xsd/ie810.xsd
similarity index 100%
rename from app/xsd/v2/ie810.xsd
rename to app/xsd/ie810.xsd
diff --git a/app/xsd/v2/ie813.xsd b/app/xsd/ie813.xsd
similarity index 100%
rename from app/xsd/v2/ie813.xsd
rename to app/xsd/ie813.xsd
diff --git a/app/xsd/v2/ie815.xsd b/app/xsd/ie815.xsd
similarity index 100%
rename from app/xsd/v2/ie815.xsd
rename to app/xsd/ie815.xsd
diff --git a/app/xsd/v2/ie818.xsd b/app/xsd/ie818.xsd
similarity index 100%
rename from app/xsd/v2/ie818.xsd
rename to app/xsd/ie818.xsd
diff --git a/app/xsd/v2/ie819.xsd b/app/xsd/ie819.xsd
similarity index 100%
rename from app/xsd/v2/ie819.xsd
rename to app/xsd/ie819.xsd
diff --git a/app/xsd/v2/ie825.xsd b/app/xsd/ie825.xsd
similarity index 100%
rename from app/xsd/v2/ie825.xsd
rename to app/xsd/ie825.xsd
diff --git a/app/xsd/v2/ie829.xsd b/app/xsd/ie829.xsd
similarity index 100%
rename from app/xsd/v2/ie829.xsd
rename to app/xsd/ie829.xsd
diff --git a/app/xsd/v2/ie837.xsd b/app/xsd/ie837.xsd
similarity index 100%
rename from app/xsd/v2/ie837.xsd
rename to app/xsd/ie837.xsd
diff --git a/app/xsd/v2/ie839.xsd b/app/xsd/ie839.xsd
similarity index 100%
rename from app/xsd/v2/ie839.xsd
rename to app/xsd/ie839.xsd
diff --git a/app/xsd/v2/ie840.xsd b/app/xsd/ie840.xsd
similarity index 100%
rename from app/xsd/v2/ie840.xsd
rename to app/xsd/ie840.xsd
diff --git a/app/xsd/v2/ie871.xsd b/app/xsd/ie871.xsd
similarity index 100%
rename from app/xsd/v2/ie871.xsd
rename to app/xsd/ie871.xsd
diff --git a/app/xsd/v2/ie880.xsd b/app/xsd/ie880.xsd
similarity index 100%
rename from app/xsd/v2/ie880.xsd
rename to app/xsd/ie880.xsd
diff --git a/app/xsd/v2/ie881.xsd b/app/xsd/ie881.xsd
similarity index 100%
rename from app/xsd/v2/ie881.xsd
rename to app/xsd/ie881.xsd
diff --git a/app/xsd/v2/ie905.xsd b/app/xsd/ie905.xsd
similarity index 100%
rename from app/xsd/v2/ie905.xsd
rename to app/xsd/ie905.xsd
diff --git a/app/xsd/v2/ie934.xsd b/app/xsd/ie934.xsd
similarity index 100%
rename from app/xsd/v2/ie934.xsd
rename to app/xsd/ie934.xsd
diff --git a/app/xsd/v2/tcl.xsd b/app/xsd/tcl.xsd
similarity index 100%
rename from app/xsd/v2/tcl.xsd
rename to app/xsd/tcl.xsd
diff --git a/app/xsd/v2/tms.xsd b/app/xsd/tms.xsd
similarity index 100%
rename from app/xsd/v2/tms.xsd
rename to app/xsd/tms.xsd
diff --git a/app/xsd/v2/types.xsd b/app/xsd/types.xsd
similarity index 100%
rename from app/xsd/v2/types.xsd
rename to app/xsd/types.xsd
diff --git a/app/xsd/v1/MovementForTraderData.xsd b/app/xsd/v1/MovementForTraderData.xsd
deleted file mode 100644
index 9bc806875..000000000
--- a/app/xsd/v1/MovementForTraderData.xsd
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/xsd/v1/NewMessagesData.xsd b/app/xsd/v1/NewMessagesData.xsd
deleted file mode 100644
index 6c049c730..000000000
--- a/app/xsd/v1/NewMessagesData.xsd
+++ /dev/null
@@ -1,78 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Response to getNewMessages operation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/xsd/v1/doc.xsd b/app/xsd/v1/doc.xsd
deleted file mode 100644
index af49fb911..000000000
--- a/app/xsd/v1/doc.xsd
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/emcsukcodes.xsd b/app/xsd/v1/emcsukcodes.xsd
deleted file mode 100644
index f6afa17b7..000000000
--- a/app/xsd/v1/emcsukcodes.xsd
+++ /dev/null
@@ -1,707 +0,0 @@
-
-
-
-
-
-
-
-
-
- HMCRC Functional Error Codes
-
-
-
-
- Incorrect (code) value. Value of an element in a message is outside the predefined domain or not part of the applicable code list.
-
-
-
-
- Duplicate LRN The LRN is already known and is therefore not unique according to the specified rules
-
-
-
-
- Invalid or missing Consignor on SEED
-
-
-
-
- Invalid or missing Place of Dispatch on SEED
-
-
-
-
- Invalid or missing Consignee on SEED
-
-
-
-
- Invalid or missing Place of Delivery on SEED
-
-
-
-
- For Temporary Registered Consignee the EPC and product amounts exceed the allowed amounts on SEED
-
-
-
-
- The link between the nature of goods on the draft movement and those allowed for the consignor as held on SEED is missing or invalid
-
-
-
-
- The link between the nature of goods on the movement and those allowed for the consignee as held on SEED is missing or invalid
-
-
-
-
- The link between the nature of goods on the movement and those allowed for the Tax Warehouse as Place of Delivery as held on SEED is missing or invalid
-
-
-
-
- The link between the Consignor and EU 15/6 Products (Energy Products) as held on SEED is missing or invalid
-
-
-
-
- The link between the Consignee and Place of Delivery as held on SEED is missing or invalid
-
-
-
-
- The link between the Consignee and the TCA for a related Temporary Registered Consignee Trader Id as held on SEED is Pending
-
-
-
-
- The link between the Consignee and the TCA for a related Temporary Registered Consignee Trader Id as held on SEED is Already Used
-
-
-
-
- The link between the Consignee and the TCA for a related Temporary Registered Consignee Trader Id as held on SEED is Withdrawn
-
-
-
-
- The link between the Consignee and the TCA for a related Temporary Registered Consignee Trader Id as held on SEED is Cancelled
-
-
-
-
- The link between the Consignee and the TCA for a related Temporary Registered Consignee Trader Id as held on SEED is Expired
-
-
-
-
- The link between the Temporary Registered Consignees TCA number and the TRC Trader(Excise) Id as held on SEED is missing or invalid or the TRC is in the UK
-
-
-
-
- Direct Delivery is not allowed for this Consignee
-
-
-
-
- The Consignor is not authorised to trade with the quoted TCA as found on SEED
-
-
-
-
- TRC Product Codes Invalid
-
-
-
-
- Consignor is a Registered Consignor but Origin is not Import
-
-
-
-
- Registered Consignor sending to a Registered Consignee in the UK
-
-
-
-
- Origin of movement is Import but Consignor is not of type Registered Consignor
-
-
-
-
- Invalid Customs Office for Export Movement
-
-
-
-
- The Delivery Place Customs Office are not on the list of Customs offices
-
-
-
-
- The Competent Authority Dispatch Office is not on the list of Excise offices
-
-
-
-
- Excise Product Codes Invalid
-
-
-
-
- CN Codes Invalid
-
-
-
-
- Invalid Language Codes for Trader Id
-
-
-
-
- Invalid Language Codes for Fiscal Mark
-
-
-
-
- Invalid Language Codes for Designation of Origin
-
-
-
-
- Invalid Language Codes for Commercial description
-
-
-
-
- Invalid Language Codes for Brand Name of Products
-
-
-
-
- Invalid Language Codes for Seal Information
-
-
-
-
- Invalid Language Codes for Other/Complementary Information
-
-
-
-
- Invalid Member State Code
-
-
-
-
- Invalid Packages Code
-
-
-
-
- Invalid Kind of packages
-
-
-
-
- Invalid Transport Mode Code
-
-
-
-
- Invalid Transport Unit Codes
-
-
-
-
- Invalid Wine-Growing Zone
-
-
-
-
- Invalid Wine-Operation Code
-
-
-
-
- Invalid Alcohol Strength for Wine and Spirits
-
-
-
-
- Invalid Degree Plato for Beer
-
-
-
-
- Invalid Density for Energy Products
-
-
-
-
- Invalid Number of Packages for a countable flag
-
-
-
-
- Invalid Country Code
-
-
-
-
- Invalid Mix of Product and CN Codes
-
-
-
-
- Reserved code
-
-
-
-
- Invalid Customs Office of Import
-
-
-
-
- Maximum Journey Time Exceeded
-
-
-
-
- No Destination Change Detected
-
-
-
-
- Movement status invalid for CoD
-
-
-
-
- Consignee role invalid
-
-
-
-
- Place of Delivery Type invalid
-
-
-
-
- Consignor Role Invalid
-
-
-
-
- Place of Dispatch Type invalid
-
-
-
-
- Invalid Language Codes for Transport Arranger
-
-
-
-
- Invalid Language Codes for New Transport Trader
-
-
-
-
- Consignor does not use or manage Place of Dispatch
-
-
-
-
- Delivery Place Trader group should not be present
-
-
-
-
- Delivery Place Trader group is required
-
-
-
-
- Destination Office group should not be present
-
-
-
-
- Destination Office group is required
-
-
-
-
- Consignee Trader ID should not be present
-
-
-
-
- Consignee Trader ID is required
-
-
-
-
- Delivery Place Trader ID should not be present
-
-
-
-
- Delivery Place Trader ID is required
-
-
-
-
- Delivery Place Trader Name should not be present
-
-
-
-
- Delivery Place Trader Name is required
-
-
-
-
- Delivery Place Trader Street Name/Postcode/City should not be present
-
-
-
-
- Delivery Place Trader Street Name/Postcode/City is required
-
-
-
-
- Invalid Unsatisfactory Reason Code
-
-
-
-
- The Body Record Unique Reference entered must be unique and must match a value on the movement. Please amend your entry.
-
-
-
-
- Consignee Excise id on the IE818 does not match the Consignee Excise id on the Movement
-
-
-
-
- Place of delivery ID on the IE818 does not match the place of delivery ID on the Movement
-
-
-
-
- Date of Arrival of Excise Products on the IE818 must not be earlier than Date of Dispatch on the Movement
-
-
-
-
- Excise Product Code on IE818 does not match that on the movement for this Body Item
-
-
-
-
- Quantity of Observed Shortage or Excess exceeds Current Quantity on the Movement
-
-
-
-
- Refused Quantity is invalid
-
-
-
-
- Explanation Code does not match with any value held on Code List 51
-
-
-
-
- Complementary Information LNG field must be set to ‘en’
-
-
-
-
- Submitter ID should indicate that message is from a “GB” Consignee
-
-
-
-
- Submitter ID does not match Consignee ID on the Movement
-
-
-
-
- Message Role does not match with any value held on Code List 73
-
-
-
-
- Where the Explanation Code is Other the Complementary Information cannot be blank
-
-
-
-
- Submitter ID does not match Consignor ID on the Movement
-
-
-
-
- Submitter of the Cancel does not match Consignor on the Movement
-
-
-
-
- Unknown arc - the arc of the received message is not known
-
-
-
-
- The Date of Dispatch must not be in the past
-
-
-
-
- Message out of sequence - the message can not be processed because the receiver is not in a proper state
-
-
-
-
- Cancellation Reason Code does not match with any value held on Code List 43
-
-
-
-
- Movement status invalid for cancellation
-
-
-
-
- Cancellation is not allowed where the Movement is an Import Type ie. where the Origin Type Code is 2
-
-
-
-
- Submitter of this message does not match the Consignor ID on the movement
-
-
-
-
- Submitter of this message does not match the Consignee ID on the movement
-
-
-
-
- Movement status invalid for Report of Receipt
-
-
-
-
- SEED Unavailable Failure
-
-
-
-
- The Dispatch Import Office is not on the list of Customs Offices
-
-
-
-
- Nature of goods not allowed for splitting
-
-
-
-
- More than one new split eAD has empty destination data
-
-
-
-
- Products added on split movement
-
-
-
-
- Apart from quantities the lines on the split movements are not exactly equal to those on the original movement or partially refused where this is the case. Or the totals of quantities are not equal.
-
-
-
-
- Intra UK movement not allowed to be split or created as a result of a split
-
-
-
-
- Unknown destination (Destination Type Code (DTC) = 8) on split movement where the original movement did not have a DTC of 8
-
-
-
-
- Split movement attempted for new destination of Exempted Organisation with a DTC of 5
-
-
-
-
- 2 downstream movements have the same ‘Consignee Trader ID’ and ‘Place of delivery Trader ID'
-
-
-
-
- Kinds of Package field has been changed on downstream movement
-
-
-
-
- Item number changed where the content of an item on the upstream movement has been assigned to one or more downstream movements
-
-
-
-
- Transport mode not Sea or Inland Waterway on original movement
-
-
-
-
- Consignee from original movement not on a split where this is required
-
-
-
-
- Invalid Consignee Details on message
-
-
-
-
- Movement status invalid for Alert/Reject Message
-
-
-
-
- Consignee on the Alert/Reject (IE819) does not match Consignee on the movement
-
-
-
-
- Movement status invalid for Split Movement
-
-
-
-
- The New Consignee Trader information must not be present where the destination of the split is unknown
-
-
-
-
- The New Consignee Trader information must be present unless the destination of the split is unknown
-
-
-
-
- Version of the Movement status invalid for Explanation for Shortage or Excess Message
-
-
-
-
- Consignor Trader Excise Number does not match Consignor ID on the Movement
-
-
-
-
- Consignee Trader ID does not match Consignee ID on the Version of the Movement
-
-
-
-
- Invalid Dispatch Import Office
-
-
-
-
- Excise Product Code on IE871 does not match that on the movement for this Body Item
-
-
-
-
- The link between the nature of goods on the draft movement and those allowed for the Tax Warehouse as Place of Dispatch as held on SEED is missing or invalid
-
-
-
-
- Movement cannot be cancelled because it has been split
-
-
-
-
- The movement does not have ‘Deferred Indicator’ set
-
-
-
-
- The Date of Dispatch must not be in the future
-
-
-
-
- Alert or Rejection of E-AD Reason Code does not match with any value held on Code List 22
-
-
-
-
- Rule 28: Either street name, street number, postcode or city must have changed for the delivery place.
-
-
-
-
- The submitting Trader must be an Authorised Warehouse Keeper or 'Registered Consignor'
-
-
-
-
- Rule 216: transport mode must be either 1(sea transport) or 7 (Fixed transport intallations) if guarantor type code = 5.
-
-
-
-
- Rule 215: guarantor type code 5 can only be used for an energy product
-
-
-
-
- Rule 18: EORI can only be entered when the destination type code relates to an export.
-
-
-
-
-
-
- This message cannot be processed as the destination type is invalid ? only ?Destination - Tax warehouse? or ?Destination ? Export? are permitted
-
-
-
-
-
-
- This message cannot be processed as the Consignee is located in a Member State of the European Union.
-
-
-
-
-
-
- This message cannot be processed as the Customs Office Place of Delivery is located in a Member State of the European Union
-
-
-
-
-
- A GB Trader cannot 1) raise movements to EU destinations 2) raise exports with a non-GB export office 3) use anything other than NDEA.GB in 'Message Sender' 4) raise movements other than to a Warehouse or Rest of World Export. Also, a NI Trader cannot 1) raise an export with a GB export office 2) use anything other than NDEA.XI in 'Message Sender'.
-
-
-
-
-
diff --git a/app/xsd/v1/ie704uk.xsd b/app/xsd/v1/ie704uk.xsd
deleted file mode 100644
index 85abbcb74..000000000
--- a/app/xsd/v1/ie704uk.xsd
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie717.xsd b/app/xsd/v1/ie717.xsd
deleted file mode 100644
index f57274107..000000000
--- a/app/xsd/v1/ie717.xsd
+++ /dev/null
@@ -1,337 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie801.xsd b/app/xsd/v1/ie801.xsd
deleted file mode 100644
index dd2a09736..000000000
--- a/app/xsd/v1/ie801.xsd
+++ /dev/null
@@ -1,449 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie802.xsd b/app/xsd/v1/ie802.xsd
deleted file mode 100644
index f1c1a5ffe..000000000
--- a/app/xsd/v1/ie802.xsd
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie803.xsd b/app/xsd/v1/ie803.xsd
deleted file mode 100644
index dcba8789b..000000000
--- a/app/xsd/v1/ie803.xsd
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie807.xsd b/app/xsd/v1/ie807.xsd
deleted file mode 100644
index 56e8024c2..000000000
--- a/app/xsd/v1/ie807.xsd
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie810.xsd b/app/xsd/v1/ie810.xsd
deleted file mode 100644
index ff5c13c35..000000000
--- a/app/xsd/v1/ie810.xsd
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie813.xsd b/app/xsd/v1/ie813.xsd
deleted file mode 100644
index e73a68bc7..000000000
--- a/app/xsd/v1/ie813.xsd
+++ /dev/null
@@ -1,202 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie815.xsd b/app/xsd/v1/ie815.xsd
deleted file mode 100644
index 00596210b..000000000
--- a/app/xsd/v1/ie815.xsd
+++ /dev/null
@@ -1,438 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie818.xsd b/app/xsd/v1/ie818.xsd
deleted file mode 100644
index 487f8189b..000000000
--- a/app/xsd/v1/ie818.xsd
+++ /dev/null
@@ -1,134 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie819.xsd b/app/xsd/v1/ie819.xsd
deleted file mode 100644
index 34b6ad60b..000000000
--- a/app/xsd/v1/ie819.xsd
+++ /dev/null
@@ -1,107 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie825.xsd b/app/xsd/v1/ie825.xsd
deleted file mode 100644
index c1dc3e23b..000000000
--- a/app/xsd/v1/ie825.xsd
+++ /dev/null
@@ -1,241 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie829.xsd b/app/xsd/v1/ie829.xsd
deleted file mode 100644
index 02ec752e4..000000000
--- a/app/xsd/v1/ie829.xsd
+++ /dev/null
@@ -1,95 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie837.xsd b/app/xsd/v1/ie837.xsd
deleted file mode 100644
index 428b1383c..000000000
--- a/app/xsd/v1/ie837.xsd
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie839.xsd b/app/xsd/v1/ie839.xsd
deleted file mode 100644
index 18538b769..000000000
--- a/app/xsd/v1/ie839.xsd
+++ /dev/null
@@ -1,174 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie840.xsd b/app/xsd/v1/ie840.xsd
deleted file mode 100644
index cce58d159..000000000
--- a/app/xsd/v1/ie840.xsd
+++ /dev/null
@@ -1,320 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie871.xsd b/app/xsd/v1/ie871.xsd
deleted file mode 100644
index 962b1a7d2..000000000
--- a/app/xsd/v1/ie871.xsd
+++ /dev/null
@@ -1,123 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie880.xsd b/app/xsd/v1/ie880.xsd
deleted file mode 100644
index dbfe0776e..000000000
--- a/app/xsd/v1/ie880.xsd
+++ /dev/null
@@ -1,99 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie881.xsd b/app/xsd/v1/ie881.xsd
deleted file mode 100644
index 34246dc48..000000000
--- a/app/xsd/v1/ie881.xsd
+++ /dev/null
@@ -1,112 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie905.xsd b/app/xsd/v1/ie905.xsd
deleted file mode 100644
index 1f4960887..000000000
--- a/app/xsd/v1/ie905.xsd
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/ie934.xsd b/app/xsd/v1/ie934.xsd
deleted file mode 100644
index 0a1b83fd6..000000000
--- a/app/xsd/v1/ie934.xsd
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/tcl.xsd b/app/xsd/v1/tcl.xsd
deleted file mode 100644
index 94e3d288b..000000000
--- a/app/xsd/v1/tcl.xsd
+++ /dev/null
@@ -1,2699 +0,0 @@
-
-
-
-
-
-
-
- Common Request Type
-
-
-
-
- (reserved)
-
-
-
-
- Request for reference data
-
-
-
-
- (reserved)
-
-
-
-
- (reserved)
-
-
-
-
- Request for re-synchronisation of the register of economic operators
-
-
-
-
- Request for retrieval of a list of e-ADs/e-SADs
-
-
-
-
- Request for SEED statistics
-
-
-
-
- Request for retrieval of a list of e-ADs
-
-
-
-
- Request for retrieval of a list of e-SADs
-
-
-
-
-
-
-
-
-
- Request Message Name
-
-
-
-
- For complete structure
-
-
-
-
- Common list of codes
-
-
-
-
- Common system parameters
-
-
-
-
-
-
-
-
-
- Primary Criterion Type Code
-
-
-
-
- ARC
-
-
-
-
- City of guarantor
-
-
-
-
- (reserved)
-
-
-
-
- City of place of delivery
-
-
-
-
- City of tax warehouse of dispatch
-
-
-
-
- City of transporter
-
-
-
-
- CN code of product
-
-
-
-
- Date of invoice
-
-
-
-
- Excise number of consignee
-
-
-
-
- Excise number of consignor
-
-
-
-
- Excise number of guarantor
-
-
-
-
- Brand name of product
-
-
-
-
- (reserved)
-
-
-
-
- (reserved)
-
-
-
-
- Excise number of the tax warehouse of destination
-
-
-
-
- Excise number of the tax warehouse of dispatch
-
-
-
-
- (reserved)
-
-
-
-
- Excise product code
-
-
-
-
- Journey time
-
-
-
-
- Member State of destination
-
-
-
-
- Member State of dispatch
-
-
-
-
- Name of consignee
-
-
-
-
- Categories of goods of the movement
-
-
-
-
- Name of consignor
-
-
-
-
- Name of guarantor
-
-
-
-
- (reserved)
-
-
-
-
- Name of place of delivery
-
-
-
-
- Name of tax warehouse of dispatch
-
-
-
-
- Name of transporter
-
-
-
-
- Number of invoice
-
-
-
-
- Postal code of consignee
-
-
-
-
- Postal code of consignor
-
-
-
-
- Postal code of guarantor
-
-
-
-
- (reserved)
-
-
-
-
- (reserved)
-
-
-
-
- Postal code of place of delivery
-
-
-
-
- Postal code of tax warehouse of dispatch
-
-
-
-
- Postal code of transporter
-
-
-
-
- Quantity of goods (in an e-AD/e-SAD body)
-
-
-
-
- Local Reference Number, being a serial number, assigned by the consignor
-
-
-
-
- Type of transport
-
-
-
-
- (reserved)
-
-
-
-
- (reserved)
-
-
-
-
- VAT number of the consignee
-
-
-
-
- (reserved)
-
-
-
-
- (reserved)
-
-
-
-
- VAT number of the transporter
-
-
-
-
- Change of destination (sequence number >= 2)
-
-
-
-
- (reserved)
-
-
-
-
- (reserved)
-
-
-
-
- City of consignee
-
-
-
-
- City of consignor
-
-
-
-
-
-
-
-
-
- Statistics Type
-
-
-
-
- Active/Inactive and Deleted economic operators
-
-
-
-
- Pending expirations
-
-
-
-
- Economic operators by type and tax warehouses
-
-
-
-
- Excise activity
-
-
-
-
- Changes to excise authorisations
-
-
-
-
-
-
-
-
-
- Common Request Rejection Reason
-
-
-
-
- Other
-
-
-
-
- Incorrect (code) value
-
-
-
-
- Not supported in this position
-
-
-
-
- No e-AD(s)/e-SAD(s) retrieved matching selection criteria
-
-
-
-
- Duplicate detected
-
-
-
-
- Reference data not available
-
-
-
-
- Excise Office List not available
-
-
-
-
- SEED data not available
-
-
-
-
- Unknown requested data
-
-
-
-
- Increment number out of range
-
-
-
-
-
-
-
-
-
- Requested List of Codes (external)
-
-
-
-
- Units of measure
-
-
-
-
- Reasons for unsatisfactory receipt or control report
-
-
-
-
- Reasons for interruption
-
-
-
-
- (reserved)
-
-
-
-
- Transport modes
-
-
-
-
- Transport units
-
-
-
-
- Wine-growing zones
-
-
-
-
- Wine operation codes
-
-
-
-
- Excise products categories
-
-
-
-
- Excise product
-
-
-
-
- CN codes
-
-
-
-
- Events types
-
-
-
-
- Correspondences CN code - Excise product
-
-
-
-
- Cancellation reasons
-
-
-
-
- Alert or rejection of e-AD/e-SAD reasons
-
-
-
-
- Delay explanations
-
-
-
-
- (reserved)
-
-
-
-
- Event submitting persons
-
-
-
-
- National Administration - Degree Plato
-
-
-
-
- Evidence types
-
-
-
-
- (reserved)
-
-
-
-
- (reserved)
-
-
-
-
- Language codes
-
-
-
-
- National Administrations
-
-
-
-
- Country codes
-
-
-
-
- Packaging codes
-
-
-
-
-
-
-
-
-
- Global Conclusion Of Receipt
-
-
-
-
- Receipt accepted and satisfactory
-
-
-
-
- Receipt accepted although unsatisfactory
-
-
-
-
- Exit accepted and satisfactory
-
-
-
-
- Exit accepted with minor discrepancies detected
-
-
-
-
- Exit refused
-
-
-
-
- Receipt refused
-
-
-
-
- Receipt partially refused
-
-
-
-
-
-
-
-
-
- Customs Rejection Reason Code
-
-
-
-
- Import data not found
-
-
-
-
- The content of the e-AD does not match with import data
-
-
-
-
- (reserved)
-
-
-
-
- Negative Cross-check result
-
-
-
-
- Unsatisfactory Control Result at OoExp
-
-
-
-
-
-
-
-
-
- SEED Message Type
-
-
-
-
- Update of economic operators (Notification of changes to SEED)
-
-
-
-
- Dissemination of updates of economic operators
-
-
-
-
- Retrieval of economic operators
-
-
-
-
- Extraction of economic operators
-
-
-
-
-
-
-
-
-
- Modification Type
-
-
-
-
- Create
-
-
-
-
- Delete
-
-
-
-
- Invalidate
-
-
-
-
- Update
-
-
-
-
-
-
-
-
-
- Requested List of Codes (full)
-
-
-
-
- Units of measure
-
-
-
-
- Reasons for unsatisfactory receipt or control report
-
-
-
-
- Reasons for interruption
-
-
-
-
- (reserved)
-
-
-
-
- Transport modes
-
-
-
-
- Transport units
-
-
-
-
- Wine-growing zones
-
-
-
-
- Wine operation codes
-
-
-
-
- Excise products categories
-
-
-
-
- Excise product
-
-
-
-
- CN codes
-
-
-
-
- Events types
-
-
-
-
- Correspondences CN code - Excise product
-
-
-
-
- Cancellation reasons
-
-
-
-
- Alert or rejection of e-AD/e-SAD reasons
-
-
-
-
- Delay explanations
-
-
-
-
- (reserved)
-
-
-
-
- Event submitting persons
-
-
-
-
- Refusal reasons
-
-
-
-
- Reasons for delayed result
-
-
-
-
- Request action
-
-
-
-
- Request reasons
-
-
-
-
- Evidence types
-
-
-
-
- (reserved)
-
-
-
-
- (reserved)
-
-
-
-
- (reserved)
-
-
-
-
- (reserved)
-
-
-
-
- Administrative cooperation action not possible reasons
-
-
-
-
- (reserved)
-
-
-
-
- Type of document
-
-
-
-
- (reserved)
-
-
-
-
- (reserved)
-
-
-
-
- Manual Closure Request Reasons
-
-
-
-
- (reserved)
-
-
-
-
- Manual Closure Rejection Reasons
-
-
-
-
- National Administration - Degree Plato
-
-
-
-
- (reserved)
-
-
-
-
- Language codes
-
-
-
-
- National Administrations
-
-
-
-
- Country codes
-
-
-
-
- Packaging codes
-
-
-
-
-
-
-
-
-
- Flag
-
-
-
-
- No or False
-
-
-
-
- Yes or True
-
-
-
-
-
-
-
-
-
- Guarantor Type Code
-
-
-
-
- Guarantor not required (qualifying UK to UK movements)
-
-
-
-
- Consignor
-
-
-
-
- Joint guarantee of the consignor and of the transporter
-
-
-
-
- Joint guarantee of the consignor, of the transporter and of the owner of the Excise products
-
-
-
-
- Joint guarantee of the consignor, of the transporter, of the owner of the Excise products and of the consignee
-
-
-
-
- Joint guarantee of the consignor, of the transporter and of the consignee
-
-
-
-
- Joint guarantee of the consignor and of the owner of the Excise products
-
-
-
-
- Joint guarantee of the consignor, of the owner of the Excise products and of the consignee
-
-
-
-
- Joint guarantee of the consignor and of the consignee
-
-
-
-
- Transporter
-
-
-
-
- Joint guarantee of the transporter and of the owner of the Excise products
-
-
-
-
- Joint guarantee of the transporter, of the owner of the Excise products and of the consignee
-
-
-
-
- Joint guarantee of the transporter and of the consignee
-
-
-
-
- Owner of the Excise products
-
-
-
-
- Joint guarantee of the owner of the Excise products and of the consignee
-
-
-
-
- Consignee
-
-
-
-
- No guarantee is provided according to Article 17.2 and 17.5(b) of Directive 2020/262
-
-
-
-
-
-
-
-
-
- Origin Type Code
-
-
-
-
- Origin - Tax warehouse
-
-
-
-
- Origin - Import
-
-
-
-
- Origin – Duty Paid
-
-
-
-
-
-
-
-
-
- Destination Type Code
-
-
-
-
- Destination - Tax warehouse
-
-
-
-
- Destination – Temporary Certified Consignee
-
-
-
-
- Destination-Return to the place of dispatch of the Consignor
-
-
-
-
- Destination - Registered consignee
-
-
-
-
- Destination - Temporary registered consignee
-
-
-
-
- Destination - Direct delivery
-
-
-
-
- Destination - Exempted consignee
-
-
-
-
- Destination - Export
-
-
-
-
- (reserved)
-
-
-
-
- Unknown destination (consignee unknown)
-
-
-
-
- Destination – Certified Consignee
-
-
-
-
-
-
-
-
-
- Category of Wine Product
-
-
-
-
- Wine without PDO/PGI
-
-
-
-
- Varietal wine without PDO/PGI
-
-
-
-
- Wine with PDO or PGI
-
-
-
-
- Imported wine
-
-
-
-
- Other
-
-
-
-
-
-
-
-
-
- Notification Type
-
-
-
-
- Change of destination
-
-
-
-
- Splitting
-
-
-
-
-
-
-
-
-
- Indicator of Shortage or Excess
-
-
-
-
- Excess
-
-
-
-
- Shortage
-
-
-
-
-
-
-
-
-
- Reminder Message Type
-
-
-
-
- Reminder message at expiry of time to change destination
-
-
-
-
- Reminder message at expiry of time to send the report of receipt/export
-
-
-
-
- Reminder message at expiry of time to give destination information (Article 22 of Directive 2020/262)
-
-
-
-
-
-
-
-
-
- Functional Error Codes
-
-
-
-
- Other
-
-
-
-
- Incorrect (code) value
-
-
-
-
- Not supported in this position
-
-
-
-
- Duplicate detected
-
-
-
-
- Unknown ARC
-
-
-
-
- Duplicate LRN
-
-
-
-
- Message out of sequence
-
-
-
-
- Invalid ARC
-
-
-
-
- Invalid Follow Up Correlation ID/ MV Correlation ID
-
-
-
-
- Unknown Follow Up Correlation ID / MV Correlation ID
-
-
-
-
-
-
-
-
-
- Status Type
-
-
-
-
- Accepted
-
-
-
-
- Cancelled
-
-
-
-
- Delivered
-
-
-
-
- Diverted
-
-
-
-
- Rejected
-
-
-
-
- Replaced
-
-
-
-
- e-AD/e-SAD Manually Closed
-
-
-
-
- Refused
-
-
-
-
- None
-
-
-
-
- Partially Refused
-
-
-
-
- Exporting
-
-
-
-
- Accepted for Export
-
-
-
-
- Stopped
-
-
-
-
- Accepted Export Declaration
-
-
-
-
- e-AD Request Accepted for Export
-
-
-
-
-
-
-
-
-
- Technical Message Type
-
-
-
-
- CONTROL REPORT
-
-
-
-
- E-AD/E-SAD
-
-
-
-
- REMINDER MESSAGE FOR EXCISE MOVEMENT
-
-
-
-
- NOTIFICATION OF DIVERTED E-AD
-
-
-
-
- INTERRUPTION OF MOVEMENT
-
-
-
-
- CANCELLATION OF EAD
-
-
-
-
- CHANGE OF DESTINATION
-
-
-
-
- ACCEPTED OR (PARTIALLY) REFUSED REPORT OF RECEIPT/EXPORT
-
-
-
-
- ALERT OR REJECTION OF AN E-AD/E-SAD
-
-
-
-
- NOTIFICATION OF ACCEPTED EXPORT
-
-
-
-
- EXPORT DECLARATION INVALIDATION NOTIFICATION TO MSA OF DISPATCH/CONSIGNOR
-
-
-
-
- EXPLANATION ON DELAY FOR DELIVERY
-
-
-
-
- REJECTION OF E-AD FOR EXPORT
-
-
-
-
- EVENT REPORT
-
-
-
-
- EXPLANATION ON REASON FOR SHORTAGE
-
-
-
-
- MANUAL CLOSURE REQUEST
-
-
-
-
- MANUAL CLOSURE RESPONSE
-
-
-
-
- STATUS RESPONSE
-
-
-
-
-
-
-
-
-
- Submitter Type
-
-
-
-
- Consignor
-
-
-
-
- Consignee
-
-
-
-
-
-
-
-
-
- Reason to refuse update of economic operators
-
-
-
-
- Other
-
-
-
-
- Temporary authorisation already exists (creation)
-
-
-
-
- Trader Authorisation not found (Update / Deletion)
-
-
-
-
- Incorrect (code) value
-
-
-
-
- Not supported in this position
-
-
-
-
- Tax warehouse not found (Update / Deletion)
-
-
-
-
- Temporary authorisation not found (Update / Deletion)
-
-
-
-
- Duplicate detected
-
-
-
-
- Inconsistency between Excise number and Excise office
-
-
-
-
- Only a warehouse keeper may be allowed to use a tax warehouse
-
-
-
-
- Invalid Reference of Tax Warehouse (R204 violation)
-
-
-
-
- Missing Authorised Warehouse Keeper referencing Tax Warehouse (R205 violation)
-
-
-
-
- <Trader Excise Number> is missing (Cond157 violation)
-
-
-
-
- Invalid value for <Excise Product Code> (Rule212 violation)
-
-
-
-
- The National Administration of the Temporary Authorisation and the declared Consignor is the same (R233 violation)
-
-
-
-
- Trader Authorisation already exists (creation)
-
-
-
-
- Tax warehouse already exists (creation)
-
-
-
-
-
-
-
-
-
- Requested Message Type
-
-
-
-
- E-AD/E-SAD
-
-
-
-
- NOTIFICATION OF DIVERTED E-AD
-
-
-
-
- INTERRUPTION OF MOVEMENT
-
-
-
-
- CANCELLATION OF AN E-AD
-
-
-
-
- CHANGE OF DESTINATION
-
-
-
-
- ACCEPTED OR (PARTIALLY) REFUSED REPORT OF RECEIPT/EXPORT
-
-
-
-
- ALERT OR REJECTION OF AN E-AD/E-SAD
-
-
-
-
- NOTIFICATION OF ACCEPTED EXPORT
-
-
-
-
- EXPORT DECLARATION INVALIDATION NOTIFICATION
-
-
-
-
- REJECTION OF E-AD FOR EXPORT
-
-
-
-
- MANUAL CLOSURE RESPONSE
-
-
-
-
- STATUS RESPONSE
-
-
-
-
- NONE
-
-
-
-
-
-
-
-
-
- Operator Type Code
-
-
-
-
- Authorised warehouse keeper
-
-
-
-
- Registered consignee
-
-
-
-
- Registered consignor
-
-
-
-
- Certified Consignor
-
-
-
-
- Certified Consignee
-
-
-
-
-
-
-
-
-
- Operator Role Code
-
-
-
-
- Allowed to practice direct delivery
-
-
-
-
- Allowed to leave empty the destination fields according to Article 22 of Directive 2020/262
-
-
-
-
-
-
-
-
-
- Transport Arrangement
-
-
-
-
- Consignor
-
-
-
-
- Consignee
-
-
-
-
- Owner of goods
-
-
-
-
- Other
-
-
-
-
-
-
-
-
-
- Submission Type
-
-
-
-
- Standard submission
-
-
-
-
- (reserved)
-
-
-
-
- Submission for Duty Paid B2B
-
-
-
-
-
-
-
-
-
- Diagnosis Code
-
-
-
-
- (reserved)
-
-
-
-
- Body Record Unique Reference does not exist in the e-AD
-
-
-
-
- No corresponding GOODS ITEM in the export declaration
-
-
-
-
- Weight/mass do not match
-
-
-
-
- The destination type code of the e-AD is not export
-
-
-
-
- CN codes do not match
-
-
-
-
-
-
-
-
-
- Message Role Code
-
-
-
-
- Explanation on delay for sending the report of receipt/export
-
-
-
-
- Explanation on delay for giving destination
-
-
-
-
-
-
-
-
-
- Status Request Message Type
-
-
-
-
- Status Synchronisation Request
-
-
-
-
- Movement History Request
-
-
-
-
-
-
-
-
-
- Changed Destination Type Code
-
-
-
-
- Destination - Tax warehouse
-
-
-
-
- Destination – Temporary Certified Consignee
-
-
-
-
- Destination-Return to the place of dispatch of the Consignor
-
-
-
-
- Destination - Registered consignee
-
-
-
-
- Destination - Temporary registered consignee
-
-
-
-
- Destination - Direct delivery
-
-
-
-
- (reserved)
-
-
-
-
- Destination - Export
-
-
-
-
- (reserved)
-
-
-
-
- (reserved)
-
-
-
-
- Destination – Certified Consignee
-
-
-
-
-
-
-
-
-
- Finding at Destination
-
-
-
-
- Other finding
-
-
-
-
- reserved
-
-
-
-
- Excess detected
-
-
-
-
- Wrong EPC
-
-
-
-
- Wrong destination type code
-
-
-
-
- Differences confirmed
-
-
-
-
- Manual closing recommended
-
-
-
-
- Interruption recommended
-
-
-
-
- Irregularities Found
-
-
-
-
- Consignment in order
-
-
-
-
- Consignment has not reached destination
-
-
-
-
- Consignment arrived late
-
-
-
-
- Shortage detected
-
-
-
-
- Excise products not in order
-
-
-
-
- Consignment not entered in stock records
-
-
-
-
- Trader could not be contacted
-
-
-
-
- Missing trader
-
-
-
-
-
-
-
-
-
- Control Type
-
-
-
-
- Physical control
-
-
-
-
- Documentary control
-
-
-
-
-
-
-
-
-
- Reason for Control
-
-
-
-
- Other reason
-
-
-
-
- Control started at random
-
-
-
-
- Event signalled
-
-
-
-
- Request for assistance received
-
-
-
-
- Request from another office
-
-
-
-
- Alert received
-
-
-
-
-
-
-
-
-
- Global Control Conclusion
-
-
-
-
- Satisfactory
-
-
-
-
- Minor discrepancies found
-
-
-
-
- Interruption recommended
-
-
-
-
- Intention to make claim under Article 9 of Council Directive 2020/262
-
-
-
-
- Allowable loss detected, in relation to Article 6 of Council Directive 2020/262
-
-
-
-
-
-
-
-
-
- Performed Control Action
-
-
-
-
- Other control action
-
-
-
-
- Verified counted packs
-
-
-
-
- Control of records
-
-
-
-
- Compare documents presented with e-AD/e-SAD
-
-
-
-
- Unloaded
-
-
-
-
- Opened packs
-
-
-
-
- Annotated paper copy of documents
-
-
-
-
- Counting
-
-
-
-
- Sampling
-
-
-
-
- Administrative control
-
-
-
-
- Goods weighted/measured
-
-
-
-
- Random check
-
-
-
-
-
-
-
-
-
- Report Message Type
-
-
-
-
- Initial submission
-
-
-
-
- Validated document
-
-
-
-
-
-
-
-
-
- Answer Message Type
-
-
-
-
- Administrative Cooperation answer message
-
-
-
-
- (reserved)
-
-
-
-
-
-
-
-
-
- Business Process Code
-
-
-
-
- All Functionality
-
-
-
-
- EMCS - Central Circuit – External Domain Functionality
-
-
-
-
- EMCS - Central Circuit – Common Domain Functionality
-
-
-
-
- EMCS - Follow-up and Collaboration Functionality
-
-
-
-
- National SEED Functionality
-
-
-
-
-
-
-
-
-
- Unavailability Schedule Message Type
-
-
-
-
- Notification to common domain Central Services
-
-
-
-
- Notification to national domains
-
-
-
-
-
-
-
-
-
- System Unavailability Type
-
-
-
-
- Non-Implemented
-
-
-
-
- Scheduled
-
-
-
-
- Unscheduled
-
-
-
-
-
-
-
-
-
- ACO Request Type
-
-
-
-
- Administrative cooperation
-
-
-
-
- (reserved)
-
-
-
-
-
-
-
-
-
- ACO Reminder Message Type
-
-
-
-
- Administrative cooperation results reminder message
-
-
-
-
- (reserved)
-
-
-
-
-
-
-
-
-
- Semester
-
-
-
-
- First semester
-
-
-
-
- Second semester
-
-
-
-
-
-
-
-
-
- Quarter
-
-
-
-
- First quarter
-
-
-
-
- Second quarter
-
-
-
-
- Third quarter
-
-
-
-
- Fourth quarter
-
-
-
-
-
-
-
-
-
- Month
-
-
-
-
- January
-
-
-
-
- October
-
-
-
-
- November
-
-
-
-
- December
-
-
-
-
- February
-
-
-
-
- March
-
-
-
-
- April
-
-
-
-
- May
-
-
-
-
- June
-
-
-
-
- July
-
-
-
-
- August
-
-
-
-
- September
-
-
-
-
-
-
-
-
-
- Splitting Destination Type Code
-
-
-
-
- Destination - Tax warehouse
-
-
-
-
- Destination - Registered consignee
-
-
-
-
- Destination - Temporary registered consignee
-
-
-
-
- Destination - Direct delivery
-
-
-
-
- (reserved)
-
-
-
-
- Destination - Export
-
-
-
-
- (reserved)
-
-
-
-
- Unknown destination (consignee unknown)
-
-
-
-
-
-
-
-
-
- Control Report Message Type
-
-
-
-
- Validated document
-
-
-
-
-
-
-
-
-
- MV Request Type
-
-
-
-
- Check flow
-
-
-
-
- Goods in Individual Operation
-
-
-
-
-
-
-
-
-
- Result Code
-
-
-
-
- Confirmed
-
-
-
-
- Not confirmed
-
-
-
-
- Not checked
-
-
-
-
-
-
-
-
-
- Feedback Requested or Provided
-
-
-
-
- No feedback requested
-
-
-
-
- Feedback requested
-
-
-
-
- Feedback provided
-
-
-
-
-
-
-
-
-
- Trader Person Type
-
-
-
-
- Consignor
-
-
-
-
- Consignee
-
-
-
-
- Tax representative
-
-
-
-
- Vendor
-
-
-
-
- Liable person
-
-
-
-
- Customer private individual
-
-
-
-
-
-
-
-
-
- Other Accompanying Document Type
-
-
-
-
- Other
-
-
-
-
- (reserved)
-
-
-
-
-
-
-
-
-
- Temporary Operator Type Code
-
-
-
-
- Temporary Registered Consignee
-
-
-
-
- Temporary Certified Consignor
-
-
-
-
- Temporary Certified Consignee
-
-
-
-
-
-
diff --git a/app/xsd/v1/tms.xsd b/app/xsd/v1/tms.xsd
deleted file mode 100644
index ac21006fb..000000000
--- a/app/xsd/v1/tms.xsd
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v1/types.xsd b/app/xsd/v1/types.xsd
deleted file mode 100644
index ea054d2d5..000000000
--- a/app/xsd/v1/types.xsd
+++ /dev/null
@@ -1,2673 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- The date is in the Common Era (minus sign in years is not permitted) and time zone although not included UTC is implied
-
-
-
-
-
-
-
-
-
-
- The date is in the Common Era (minus sign in years is not permitted)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- The format of Journey Time or of Maximum Journey Time is expressed in hours or in days,
- with the format Pdd, where:
- - "P" is a letter in ("H" = Hours or "D" = Day)
- - "dd" is a two digits number
- If P is "H" then the number is less or equal to 24
- If P is "D" then the number is less or equal to 45
-
- The maximum 45 days period for the journey time is derived from the maximum limit of the TIM_EAD timer defined in Appendix H.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- The time zone although not included UTC is implied
-
-
-
-
-
-
-
-
-
-
- The format of Time To ... or Maximum Duration of ... is expressed in days,
- months or years, with the format P999, where:
- - "P" is a letter in ("D" = Day, "M" = Month or "Y" = Year)
- - "999" is a three digits number
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/xsd/v2/control-1.1.xsd b/app/xsd/v2/control-1.1.xsd
deleted file mode 100644
index fbae4a5c0..000000000
--- a/app/xsd/v2/control-1.1.xsd
+++ /dev/null
@@ -1,179 +0,0 @@
-
-
-
-
-
-
-
-
-
- Uniquely identifies the message, within the Source / Identity scope. Duplicate checking is performed on MessageId, Source and Identity
-
-
-
-
-
-
-
-
-
-
- Identifies the Source (client) making the request
-
-
-
-
- Optional sub-Source used to identify multiple clients from a single Source
-
-
-
-
- Optional identifier
-
-
-
-
- Optional id used to correlate a request with a response, typically in an asynchronous scenario
-
-
-
-
- Optional Business key, used by EU Gateway to throttle and order messages
-
-
-
-
- Optional descriptor used to route asynchronous messages
-
-
-
-
- Optional category to indicate the desired Quality of Service for asynchronous message handling
-
-
-
-
- Optional destination for asynchronous message delivery
-
-
-
-
- Optional priority which can be specified for the request (0-9)
-
-
-
-
-
-
-
-
-
-
-
-
-
- Where a virus has been cleansed from the payload this is a reference to the Anti-Virus log entry holding the details of the virus
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- List of parameters required for the operation call
-
-
-
-
- List of expected return data for the operation call
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- List of result data for the operation call
-
-
-
-
- List of errors for the operation call
-
-
-
-
-
-
-
-
-
-
-
- Contains either result data or error data
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/build.sbt b/build.sbt
index c59a09b81..660d6c4ea 100755
--- a/build.sbt
+++ b/build.sbt
@@ -5,46 +5,8 @@ import uk.gov.hmrc.DefaultBuildSettings
ThisBuild / majorVersion := 0
ThisBuild / scalaVersion := "2.13.16"
-lazy val generatedV1 = (project in file("generated-v1"))
- .enablePlugins(ScalaxbPlugin)
- .settings(
- scalaVersion := "2.13.16",
- libraryDependencies ++= Seq(
- "org.scala-lang.modules" %% "scala-xml" % "2.2.0",
- "org.scala-lang.modules" %% "scala-parser-combinators" % "1.1.2",
- "javax.xml.bind" % "jaxb-api" % "2.3.1",
-
-
- ),
- Compile / scalaxb / scalaxbXsdSource := new File("app/xsd/v1"),
- Compile / scalaxb / scalaxbDispatchVersion := "1.1.3",
- Compile / scalaxb / scalaxbGenerateRuntime := true,
- Compile / scalaxb / scalaxbPackageName := "generated.v1",
-
-
- )
-
-lazy val generatedV2 = (project in file("generated-v2"))
- .enablePlugins(ScalaxbPlugin)
- .dependsOn(generatedV1)
- .settings(
- scalaVersion := "2.13.16",
- libraryDependencies ++= Seq(
- "org.scala-lang.modules" %% "scala-xml" % "2.2.0",
- "org.scala-lang.modules" %% "scala-parser-combinators" % "1.1.2",
- "javax.xml.bind" % "jaxb-api" % "2.3.1",
-
-
- ),
- Compile / scalaxb / scalaxbXsdSource := new File("app/xsd/v2"),
- Compile / scalaxb / scalaxbDispatchVersion := "1.1.3",
- Compile / scalaxb / scalaxbGenerateRuntime := true,
- Compile / scalaxb / scalaxbPackageName := "generated.v2",
- )
-
lazy val microservice = Project("excise-movement-control-system-api", file("."))
- .dependsOn(generatedV1,generatedV2)
- .enablePlugins(play.sbt.PlayScala, SbtDistributablesPlugin)
+ .enablePlugins(play.sbt.PlayScala, SbtDistributablesPlugin, ScalaxbPlugin)
.settings(
PlayKeys.playDefaultPort := 10250,
libraryDependencies ++= AppDependencies.compile ++ AppDependencies.test,
@@ -52,6 +14,9 @@ lazy val microservice = Project("excise-movement-control-system-api", file("."))
// https://www.scala-lang.org/2021/01/12/configuring-and-suppressing-warnings.html
// suppress warnings in generated routes files
scalacOptions += "-Wconf:src=routes/.*:s,src=src_managed/.*:s",
+ // scalaxb
+ Compile / scalaxb / scalaxbGenerateDispatchClient := false,
+ Compile / scalaxb / scalaxbPackageName := "generated"
)
.settings(
Test / parallelExecution := true
@@ -59,10 +24,7 @@ lazy val microservice = Project("excise-movement-control-system-api", file("."))
.settings(scoverageSettings *)
.settings(scalafmtOnCompile := true)
.settings(
- Compile / unmanagedResourceDirectories += baseDirectory.value / "resources",
- Compile / unmanagedResourceDirectories += baseDirectory.value / "app" / "xsd",
- Test / unmanagedResourceDirectories += baseDirectory.value / "app" / "xsd",
-
+ Compile / unmanagedResourceDirectories += baseDirectory.value / "resources"
)
.disablePlugins(JUnitXmlReportPlugin) //Required to prevent https://github.com/scalatest/scalatest/issues/1427
@@ -84,7 +46,7 @@ lazy val scoverageSettings: Seq[Setting[?]] = Seq(
"generated\\..*",
"scalaxb\\..*"
).mkString(";"),
- ScoverageKeys.coverageMinimumStmtTotal := 70,
+ ScoverageKeys.coverageMinimumStmtTotal := 90,
ScoverageKeys.coverageFailOnMinimum := true,
ScoverageKeys.coverageHighlighting := true
)
diff --git a/conf/app.routes b/conf/app.routes
index 90500fe82..b1e90469c 100755
--- a/conf/app.routes
+++ b/conf/app.routes
@@ -19,7 +19,6 @@ POST /admin/notifications/subscribe uk.gov.hmrc.exci
DELETE /admin/erns uk.gov.hmrc.excisemovementcontrolsystemapi.controllers.RemoveErnsAdminController.removeErns()
GET /admin/movements/:movementId/details uk.gov.hmrc.excisemovementcontrolsystemapi.controllers.AdminDetailsController.getMovementDetails(movementId: String)
-GET /admin/transform-log/:movementId/details uk.gov.hmrc.excisemovementcontrolsystemapi.controllers.AdminDetailsController.getTransformLogDetails(movementId: String)
GET /admin/:ern/summary uk.gov.hmrc.excisemovementcontrolsystemapi.controllers.RemoveErnsAdminController.findAllReferencesToErn(ern: String)
diff --git a/conf/application.conf b/conf/application.conf
index 115b9af6a..065c3d3b8 100755
--- a/conf/application.conf
+++ b/conf/application.conf
@@ -68,17 +68,9 @@ play.http.router = prod.Routes
mongodb {
uri = "mongodb://localhost:27017/excise-movement-control-system-api"
movement {
- collectionName = "movements"
TTL = 30 days
}
- movementV2 {
- TTL = 30 days
- }
-
- transformLog {
- TTL = 30 days
- }
movementArchive {
TTL = 40 days
}
@@ -134,9 +126,6 @@ featureFlags {
processingAuditingEnabled = true
oldAuditingEnabled = false
protectionFilterEnabled = true
- latestFunctionalSpecEnabled = false
- transformJobEnabled = false
- runV1Validation = false
pollingNewMessagesEnabled = true
}
diff --git a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/EISSubmissionConnectorSpec.scala b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/EISSubmissionConnectorSpec.scala
index 83de8e470..44c1450e6 100644
--- a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/EISSubmissionConnectorSpec.scala
+++ b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/EISSubmissionConnectorSpec.scala
@@ -30,7 +30,7 @@ import play.api.test.FakeRequest
import uk.gov.hmrc.excisemovementcontrolsystemapi.data.TestXml
import uk.gov.hmrc.excisemovementcontrolsystemapi.factories.IEMessageFactory
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.eis.EISSubmissionResponse
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.IE815MessageV1
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IE815Message
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.preValidateTrader.request._
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.preValidateTrader.response.{ExciseTraderResponse, ExciseTraderValidationETDSResponse, ExciseTraderValidationResponse, PreValidateTraderEISResponse}
import uk.gov.hmrc.excisemovementcontrolsystemapi.services.HttpHeader
@@ -74,7 +74,7 @@ class EISSubmissionConnectorSpec
)
//If this succeeds the wiremock has acted as a matcher
- connector.submitMessage(IE815MessageV1.createFromXml(IE815), "xmlAsString", ern)(hc).futureValue.isRight mustBe true
+ connector.submitMessage(IE815Message.createFromXml(IE815), "xmlAsString", ern)(hc).futureValue.isRight mustBe true
}
"forward a new correlation id if not exists" in {
val correlationId = "abcdefg"
@@ -93,7 +93,7 @@ class EISSubmissionConnectorSpec
//This should fail as the headers don't match
val result = connector
- .submitMessage(IE815MessageV1.createFromXml(IE815), "xmlAsString", ern)(HeaderCarrier())
+ .submitMessage(IE815Message.createFromXml(IE815), "xmlAsString", ern)(HeaderCarrier())
.futureValue
.isLeft mustBe true
@@ -109,7 +109,7 @@ class EISSubmissionConnectorSpec
//This should succeed as the headers now don't match correlationId
val result2 = connector
- .submitMessage(IE815MessageV1.createFromXml(IE815), "xmlAsString", ern)(HeaderCarrier())
+ .submitMessage(IE815Message.createFromXml(IE815), "xmlAsString", ern)(HeaderCarrier())
.futureValue
.isRight mustBe true
diff --git a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/MessageConnectorSpec.scala b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/MessageConnectorSpec.scala
index 0db145ceb..a1cc8bdf6 100644
--- a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/MessageConnectorSpec.scala
+++ b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/MessageConnectorSpec.scala
@@ -18,7 +18,7 @@ package uk.gov.hmrc.excisemovementcontrolsystemapi.connectors
import com.github.tomakehurst.wiremock.client.WireMock._
import com.github.tomakehurst.wiremock.http.Fault
-import generated.v1.NewMessagesDataResponse
+import generated.NewMessagesDataResponse
import org.mockito.ArgumentMatchersSugar.{any, eqTo}
import org.mockito.{Mockito, MockitoSugar}
import org.scalatest.BeforeAndAfterEach
@@ -206,7 +206,7 @@ class MessageConnectorSpec
val newMessagesDataResponse =
scalaxb.fromXML[NewMessagesDataResponse](scala.xml.XML.loadString(newMessageXmlWithIE704.toString))
- val IE704MessageV1 = messageFactory.createIEMessage(Left(newMessagesDataResponse.Messages.messagesoption.head))
+ val ie704Message = messageFactory.createIEMessage(newMessagesDataResponse.Messages.messagesoption.head)
val response = EISConsumptionResponse(
dateTime = timestamp,
@@ -228,7 +228,7 @@ class MessageConnectorSpec
val batchId = UUID.randomUUID().toString
val result = connector.getNewMessages(ern, batchId, None)(hc).futureValue
- result.messages mustBe Seq(IE704MessageV1)
+ result.messages mustBe Seq(ie704Message)
result.messageCount mustBe 1
}
@@ -236,7 +236,7 @@ class MessageConnectorSpec
"must emit MessageProcessingSuccess when able to process the incoming messages" in {
val newMessagesDataResponse =
scalaxb.fromXML[NewMessagesDataResponse](scala.xml.XML.loadString(newMessageXmlWithIE704.toString))
- val IE704MessageV1 = messageFactory.createIEMessage(Left(newMessagesDataResponse.Messages.messagesoption.head))
+ val ie704Message = messageFactory.createIEMessage(newMessagesDataResponse.Messages.messagesoption.head)
val response = EISConsumptionResponse(
dateTime = timestamp,
@@ -255,7 +255,7 @@ class MessageConnectorSpec
)
)
- val getMessagesResponse = GetMessagesResponse(Seq(IE704MessageV1), 1)
+ val getMessagesResponse = GetMessagesResponse(Seq(ie704Message), 1)
val batchId = UUID.randomUUID().toString
connector.getNewMessages(ern, batchId, None)(hc).futureValue
@@ -288,8 +288,8 @@ class MessageConnectorSpec
val newMessagesDataResponse =
scalaxb.fromXML[NewMessagesDataResponse](scala.xml.XML.loadString(newMessageWith818And802.toString))
- val IE818MessageV1 = messageFactory.createIEMessage(Left(newMessagesDataResponse.Messages.messagesoption.head))
- val IE802MessageV1 = messageFactory.createIEMessage(Left(newMessagesDataResponse.Messages.messagesoption(1)))
+ val ie818Message = messageFactory.createIEMessage(newMessagesDataResponse.Messages.messagesoption.head)
+ val ie802Message = messageFactory.createIEMessage(newMessagesDataResponse.Messages.messagesoption(1))
val response = EISConsumptionResponse(
dateTime = timestamp,
@@ -311,8 +311,8 @@ class MessageConnectorSpec
val batchId = UUID.randomUUID().toString
connector.getNewMessages(ern, batchId, None)(hc).futureValue
- verify(auditService).auditMessage(IE818MessageV1)(hc)
- verify(auditService).auditMessage(IE802MessageV1)(hc)
+ verify(auditService).auditMessage(ie818Message)(hc)
+ verify(auditService).auditMessage(ie802Message)(hc)
}
"must fail when the server responds with an unexpected status" in {
diff --git a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/TraderMovementConnectorSpec.scala b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/TraderMovementConnectorSpec.scala
index a56b08e7c..4b3c92eef 100644
--- a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/TraderMovementConnectorSpec.scala
+++ b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/TraderMovementConnectorSpec.scala
@@ -33,7 +33,7 @@ import play.api.test.FakeRequest
import uk.gov.hmrc.excisemovementcontrolsystemapi.data.{MessageParams, NewMessagesXml, TraderMovementXmlGenerator, XmlMessageGeneratorFactory}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes.{IE801, IE818}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.eis.EISConsumptionResponse
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.{IE801MessageV1, IE818MessageV1}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{IE801Message, IE818Message}
import uk.gov.hmrc.excisemovementcontrolsystemapi.services.{AuditService, HttpHeader}
import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.DateTimeService
import uk.gov.hmrc.http.HeaderCarrier
@@ -128,8 +128,8 @@ class TraderMovementConnectorSpec
)
val traderMovementXml = xmlGenerator.generate(ern, Seq(ie801Params, ie818Params))
- val ie801MessageV1 = IE801MessageV1.createFromXml(XmlMessageGeneratorFactory.generate(ern, ie801Params))
- val ie818MessageV1 = IE818MessageV1.createFromXml(XmlMessageGeneratorFactory.generate(ern, ie818Params))
+ val ie801Message = IE801Message.createFromXml(XmlMessageGeneratorFactory.generate(ern, ie801Params))
+ val ie818Message = IE818Message.createFromXml(XmlMessageGeneratorFactory.generate(ern, ie818Params))
val response = EISConsumptionResponse(
dateTime = timestamp,
@@ -150,7 +150,7 @@ class TraderMovementConnectorSpec
val result = connector.getMovementMessages(ern, arc)(hc).futureValue
- result mustBe Seq(ie801MessageV1, ie818MessageV1)
+ result mustBe Seq(ie801Message, ie818Message)
}
"must fail when the server responds with an unexpected status" in {
diff --git a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/models/AuditEventFactorySpec.scala b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/models/AuditEventFactorySpec.scala
index c5c8c86ad..5fcaea6d0 100644
--- a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/models/AuditEventFactorySpec.scala
+++ b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/models/AuditEventFactorySpec.scala
@@ -22,12 +22,11 @@ import org.scalatest.matchers.must.Matchers
import play.api.mvc.AnyContent
import play.api.test.FakeRequest
import uk.gov.hmrc.excisemovementcontrolsystemapi.data.TestXml
-import uk.gov.hmrc.excisemovementcontrolsystemapi.factories.{IEMessageFactory, IEMessageFactoryV1}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.factories.IEMessageFactory
import uk.gov.hmrc.excisemovementcontrolsystemapi.filters.MovementFilter
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.{MessageAuditInfo, _}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auth.{EnrolmentRequest, ParsedXmlRequest}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1._
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Message, Movement}
import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.EmcsUtils
import uk.gov.hmrc.excisemovementcontrolsystemapi.writes.testObjects._
@@ -42,27 +41,27 @@ class AuditEventFactorySpec extends AnyFreeSpec with Matchers with Auditing with
implicit val hc: HeaderCarrier = HeaderCarrier()
- "IE704MessageV1" - TestType(IE704TestMessageType, IE704MessageV1.createFromXml(IE704))
- "IE801MessageV1" - TestType(IE801TestMessageType, IE801MessageV1.createFromXml(IE801))
- "IE802MessageV1" - TestType(IE802TestMessageType, IE802MessageV1.createFromXml(IE802))
- "IE803MessageV1" - TestType(IE803TestMessageType, IE803MessageV1.createFromXml(IE803))
- "IE807MessageV1" - TestType(IE807TestMessageType, IE807MessageV1.createFromXml(IE807))
- "IE810MessageV1" - TestType(IE810TestMessageType, IE810MessageV1.createFromXml(IE810))
- "IE813MessageV1" - TestType(IE813TestMessageType, IE813MessageV1.createFromXml(IE813))
- "IE815MessageV1" - TestType(IE815TestMessageType, IE815MessageV1.createFromXml(IE815))
- "IE818MessageV1" - TestType(IE818TestMessageType, IE818MessageV1.createFromXml(IE818))
- "IE819MessageV1" - TestType(IE819TestMessageType, IE819MessageV1.createFromXml(IE819))
- "IE829MessageV1" - TestType(IE829TestMessageType, IE829MessageV1.createFromXml(IE829))
- "IE837MessageV1" - TestType(IE837TestMessageType, IE837MessageV1.createFromXml(IE837WithConsignor))
- "IE839MessageV1" - TestType(IE839TestMessageType, IE839MessageV1.createFromXml(IE839))
- "IE840MessageV1" - TestType(IE840TestMessageType, IE840MessageV1.createFromXml(IE840))
- "IE871MessageV1" - TestType(IE871TestMessageType, IE871MessageV1.createFromXml(IE871WithConsignor))
- "IE881MessageV1" - TestType(IE881TestMessageType, IE881MessageV1.createFromXml(IE881))
- "IE905MessageV1" - TestType(IE905TestMessageType, IE905MessageV1.createFromXml(IE905))
+ "IE704Message" - TestType(IE704TestMessageType, IE704Message.createFromXml(IE704))
+ "IE801Message" - TestType(IE801TestMessageType, IE801Message.createFromXml(IE801))
+ "IE802Message" - TestType(IE802TestMessageType, IE802Message.createFromXml(IE802))
+ "IE803Message" - TestType(IE803TestMessageType, IE803Message.createFromXml(IE803))
+ "IE807Message" - TestType(IE807TestMessageType, IE807Message.createFromXml(IE807))
+ "IE810Message" - TestType(IE810TestMessageType, IE810Message.createFromXml(IE810))
+ "IE813Message" - TestType(IE813TestMessageType, IE813Message.createFromXml(IE813))
+ "IE815Message" - TestType(IE815TestMessageType, IE815Message.createFromXml(IE815))
+ "IE818Message" - TestType(IE818TestMessageType, IE818Message.createFromXml(IE818))
+ "IE819Message" - TestType(IE819TestMessageType, IE819Message.createFromXml(IE819))
+ "IE829Message" - TestType(IE829TestMessageType, IE829Message.createFromXml(IE829))
+ "IE837Message" - TestType(IE837TestMessageType, IE837Message.createFromXml(IE837WithConsignor))
+ "IE839Message" - TestType(IE839TestMessageType, IE839Message.createFromXml(IE839))
+ "IE840Message" - TestType(IE840TestMessageType, IE840Message.createFromXml(IE840))
+ "IE871Message" - TestType(IE871TestMessageType, IE871Message.createFromXml(IE871WithConsignor))
+ "IE881Message" - TestType(IE881TestMessageType, IE881Message.createFromXml(IE881))
+ "IE905Message" - TestType(IE905TestMessageType, IE905Message.createFromXml(IE905))
val emcsUtils = new EmcsUtils
- val ieMessageFactory = new IEMessageFactoryV1
- val service = new AuditEventFactoryV1(emcsUtils, ieMessageFactory)
+ val ieMessageFactory = new IEMessageFactory
+ val service = new AuditEventFactory(emcsUtils, ieMessageFactory)
private val fakeRequest = FakeRequest("GET", "/foo")
case class TestType(testObject: TestMessageType, message: IEMessage) {
@@ -99,7 +98,7 @@ class AuditEventFactorySpec extends AnyFreeSpec with Matchers with Auditing with
"createMessageSubmittedNoMovement creates message submitted details object" in {
val testCorrelationid = UUID.randomUUID()
- val message = IE815MessageV1.createFromXml(IE815)
+ val message = IE815Message.createFromXml(IE815)
val userDetails = UserDetails("gatewayID", "groupid")
val erns = Set("ern1")
val parsedXmlRequest = ParsedXmlRequest[NodeSeq](
@@ -299,8 +298,8 @@ class AuditEventFactorySpec extends AnyFreeSpec with Matchers with Auditing with
"createMessageProcessingSuccessAuditInfo creates MessageProcessingSuccessAuditInfo object" in {
val ern = "testErn"
- val firstMessage801 = IE801MessageV1.createFromXml(IE801)
- val secondMessage801 = IE801MessageV1.createFromXml(IE801)
+ val firstMessage801 = IE801Message.createFromXml(IE801)
+ val secondMessage801 = IE801Message.createFromXml(IE801)
val batchId = UUID.randomUUID().toString
val jobId = UUID.randomUUID().toString
diff --git a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/repository/TransformationRepositorySpec.scala b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/repository/TransformationRepositorySpec.scala
deleted file mode 100644
index 352839895..000000000
--- a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/repository/TransformationRepositorySpec.scala
+++ /dev/null
@@ -1,1050 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.repository
-
-import org.apache.pekko.Done
-import org.mockito.MockitoSugar.when
-import org.mongodb.scala.model.Filters
-import org.scalactic.source.Position
-import org.scalatest.{BeforeAndAfterAll, BeforeAndAfterEach}
-import org.scalatest.concurrent.IntegrationPatience
-import org.scalatestplus.mockito.MockitoSugar.mock
-import org.scalatestplus.play.PlaySpec
-import org.scalatestplus.play.guice.GuiceOneAppPerSuite
-import org.slf4j.MDC
-import play.api.Application
-import play.api.inject.bind
-import play.api.inject.guice.GuiceApplicationBuilder
-import uk.gov.hmrc.excisemovementcontrolsystemapi.filters.MovementFilter
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.MovementRepository.MessageNotification
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Message, Movement}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.DateTimeService
-import uk.gov.hmrc.mongo.MongoComponent
-import uk.gov.hmrc.mongo.test.{CleanMongoCollectionSupport, DefaultPlayMongoRepositorySupport}
-
-import java.time._
-import java.time.temporal.ChronoUnit
-import java.util.UUID
-import scala.concurrent.{ExecutionContext, Future}
-
-class TransformationRepositorySpec
- extends PlaySpec
- with CleanMongoCollectionSupport
- with DefaultPlayMongoRepositorySupport[Movement]
- with IntegrationPatience
- with BeforeAndAfterEach
- with BeforeAndAfterAll
- with GuiceOneAppPerSuite {
-
- private lazy val dateTimeService = mock[DateTimeService]
- private lazy val timestamp = Instant.now.truncatedTo(ChronoUnit.MILLIS)
-
- override def fakeApplication(): Application = GuiceApplicationBuilder()
- .overrides(
- bind[MongoComponent].toInstance(mongoComponent),
- bind[DateTimeService].toInstance(dateTimeService)
- )
- .build()
-
- override protected lazy val repository: TransformationRepository = app.injector.instanceOf[TransformationRepository]
-
- override def beforeEach(): Unit = {
- super.beforeEach()
- when(dateTimeService.timestamp()).thenReturn(timestamp)
- }
-
- "upsertMovement" should {
-
- val uuid = UUID.randomUUID()
- val movement = Movement(uuid.toString, Some("boxId"), "123", "345", Some("789"), None, timestamp, Seq.empty)
-
- "return insert a movement" in {
- val result = repository.saveMovement(movement).futureValue
-
- val insertedRecord = find(
- Filters.and(
- Filters.equal("consignorId", "345"),
- Filters.equal("localReferenceNumber", "123")
- )
- ).futureValue.headOption.value
-
- result mustBe Done
- insertedRecord mustBe movement
- }
- }
-
- "saveMovements" should {
-
- val uuid = UUID.randomUUID()
- val uuid2 = UUID.randomUUID()
- val movement = Movement(uuid.toString, Some("boxId"), "lrn1", "345", Some("789"), None, timestamp, Seq.empty)
- val movement2 = Movement(uuid2.toString, Some("boxId"), "lrn2", "789", Some("789"), None, timestamp, Seq.empty)
-
- "return insert a movement" in {
- repository.saveMovements(List(movement, movement2)).futureValue
-
- find(
- Filters.equal("localReferenceNumber", "lrn1")
- ).futureValue.headOption.value mustBe movement
-
- find(
- Filters.equal("localReferenceNumber", "lrn2")
- ).futureValue.headOption.value mustBe movement2
- }
- }
-
- "save" should {
-
- val movement =
- Movement(UUID.randomUUID().toString, Some("boxId"), "123", "345", Some("789"), None, timestamp, Seq.empty)
-
- "insert a movement if one does not exist" in {
-
- repository.saveMovement(movement).futureValue
-
- val records = find(Filters.empty()).futureValue
- records must contain only movement
- }
-
- "update a movement if one already exists" in {
-
- repository.saveMovement(movement).futureValue
-
- val updatedMovement = movement.copy(consigneeId = Some("678"))
- repository.saveMovement(updatedMovement).futureValue
-
- val records = find(Filters.empty()).futureValue
- records must contain only updatedMovement
- }
-
- "fail to insert a new movement if it has the same consignorId/lrn as another movement" in {
-
- repository.saveMovement(movement).futureValue
-
- val newMovement = movement.copy(_id = UUID.randomUUID().toString)
- repository.saveMovement(newMovement).failed.futureValue
-
- val records = find(Filters.empty()).futureValue
- records must contain only movement
- }
-
- mustPreserveMdc(repository.saveMovement(movement))
- }
-
- "getMovementById" should {
- "return the matching movement when it is there" in {
- val movementId1 = "49491927-aaa1-4835-b405-dd6e7fa3aaf0"
- val movementId2 = "8b43eb3b-3856-4f0c-b1ab-80355f70f6aa"
- val movement1 = Movement(movementId1, Some("boxId"), "lrn", "ern1", None, Some("arc1"), timestamp, Seq.empty)
- val movement2 = Movement(movementId2, Some("boxId"), "lrn", "ern2", None, Some("arc2"), timestamp, Seq.empty)
- insertMovement(movement1)
- insertMovement(movement2)
-
- val result = repository.getMovementById(movementId1).futureValue
- result mustBe Some(movement1)
- }
-
- "return None when no movement for given id" in {
- val movementId1 = "49491927-aaa1-4835-b405-dd6e7fa3aaf0"
- val movement1 = Movement(movementId1, Some("boxId"), "lrn", "ern1", None, Some("arc1"), timestamp, Seq.empty)
- insertMovement(movement1)
-
- val result = repository.getMovementById("23432343-2342342").futureValue
-
- result mustBe None
- }
-
- mustPreserveMdc(repository.getMovementById("someId"))
- }
-
- "getMovementByLRNAndERNIn" should {
- val lrn = "123"
- val consignorId = "Abc"
- val consigneeId = "def"
- val movement = Movement(Some("boxId"), lrn, consignorId, Some(consigneeId), None, lastUpdated = timestamp)
-
- "return movement with valid lrn and consignorId combination" in {
- insertMovement(movement)
- val result = repository.getMovementByLRNAndERNIn(lrn, List(consignorId)).futureValue
-
- result mustBe Seq(movement)
- }
-
- "return movement with valid lrn and consigneeId combination" in {
- insertMovement(movement)
- val result = repository.getMovementByLRNAndERNIn(lrn, List(consigneeId)).futureValue
-
- result mustBe Seq(movement)
- }
-
- "return movement with valid lrn and list of consignor and consignee Ids combination" in {
- insertMovement(movement)
- val result = repository.getMovementByLRNAndERNIn(lrn, List(consignorId, consigneeId)).futureValue
-
- result mustBe Seq(movement)
- }
-
- "return movement with valid lrn and only one valid ern combination in the list of erns" in {
- insertMovement(movement)
- val result = repository.getMovementByLRNAndERNIn(lrn, List(consignorId, "hhh", "222", "mmm")).futureValue
-
- result mustBe Seq(movement)
- }
-
- "return one movement with valid lrn and ern combination when multiple movements are available" in {
- insertMovement(movement)
- insertMovement(Movement(Some("boxId"), "Test3333", consignorId, Some(consigneeId), None))
- val result = repository.getMovementByLRNAndERNIn(lrn, List(consignorId)).futureValue
-
- result mustBe Seq(movement)
- }
-
- "return empty list with invalid lrn and ern combination" in {
- insertMovement(movement)
- val result = repository.getMovementByLRNAndERNIn("1111", List(consignorId)).futureValue
-
- result mustBe Seq.empty
- }
-
- mustPreserveMdc(repository.getMovementByLRNAndERNIn("someLrn", List("some ern")))
- }
-
- "findDraftMovement" should {
- val lrn = "123"
- val consignorId = "Abc"
- val consigneeId = "def"
- val otherConsignee = "ghi"
- val arc = "arc1"
- val movement = Movement(Some("boxId"), lrn, consignorId, Some(consigneeId), None, lastUpdated = timestamp)
- val movementDiffConsignee = movement.copy(consigneeId = Some(otherConsignee))
- val movementWithArc = movement.copy(administrativeReferenceCode = Some(arc))
- "return None if no matching movement" in {
- val result = repository.findDraftMovement(movement).futureValue
-
- result mustBe None
- }
- "return None if matching movement but already has ARC" in {
- insertMovement(movementWithArc)
- val result = repository.findDraftMovement(movement).futureValue
-
- result mustBe None
- }
- "do not include consigneeId when trying to see if a draft movement exists (this matches the duplication checking logic in Core)" in {
- insertMovement(movementDiffConsignee)
- val result = repository.findDraftMovement(movement).futureValue
-
- result mustBe Some(movementDiffConsignee)
- }
- "return the existing movement matching the consignor, consignee and LRN with no ARC" in {
- insertMovement(movement)
-
- val result = repository.findDraftMovement(movement).futureValue
-
- result mustBe Some(movement)
- }
- mustPreserveMdc(repository.findDraftMovement(movement))
- }
-
- "getByArc" should {
- val lrn = "123"
- val consignorId = "Abc"
- val consigneeId = "def"
- val arc = "arc1"
- val movement = Movement(Some("boxId"), lrn, consignorId, Some(consigneeId), Some(arc), lastUpdated = timestamp)
- "return None if no matching movement" in {
- val result = repository.getByArc(arc).futureValue
-
- result mustBe None
- }
- "return the existing movement matching the ARC" in {
- insertMovement(movement)
-
- val result = repository.getByArc(arc).futureValue
-
- result mustBe Some(movement)
- }
- mustPreserveMdc(repository.getByArc(arc))
- }
-
- "getMovementByErn" should {
- "return a list of movement" when {
- "ern match the consignorId " in {
- val expectedMovement1 = Movement(Some("boxId"), "1", "ern1", None, Some("arc1"), lastUpdated = timestamp)
- val expectedMovement2 = Movement(Some("boxId"), "1", "ern2", None, Some("arc2"), lastUpdated = timestamp)
- val expectedMovement3 = Movement(Some("boxId"), "2", "ern1", None, Some("arc3"), lastUpdated = timestamp)
- val expectedMovement4 = Movement(Some("boxId"), "3", "ern4", None, Some("arc4"), lastUpdated = timestamp)
- insertMovement(expectedMovement1)
- insertMovement(expectedMovement2)
- insertMovement(expectedMovement3)
- insertMovement(expectedMovement4)
-
- val result = repository.getMovementByERN(Seq("ern1", "ern2")).futureValue
-
- result.sortBy(_.localReferenceNumber) mustBe Seq(expectedMovement1, expectedMovement2, expectedMovement3)
- }
-
- "ern match consignorId and consigneeId" in {
- val expectedMovement1 =
- Movement(Some("boxId"), "1", "consignorId1", Some("ern1"), Some("arc1"), lastUpdated = timestamp)
- val expectedMovement2 =
- Movement(Some("boxId"), "2", "ern1", Some("ern2"), Some("arc2"), lastUpdated = timestamp)
- val expectedMovement3 =
- Movement(Some("boxId"), "3", "consignorId1", Some("ern1"), Some("arc3"), lastUpdated = timestamp)
- val expectedMovement4 = Movement(Some("boxId"), "4", "ern4", None, Some("arc4"), lastUpdated = timestamp)
- insertMovement(expectedMovement1)
- insertMovement(expectedMovement2)
- insertMovement(expectedMovement3)
- insertMovement(expectedMovement4)
-
- val result = repository.getMovementByERN(Seq("ern1")).futureValue
-
- result.sortBy(_.localReferenceNumber) mustBe Seq(
- expectedMovement1,
- expectedMovement2,
- expectedMovement3
- )
- }
- "lrn from filter matches record from database" in {
- val expectedMovement1 =
- Movement(Some("boxId"), "1", "consignorId1", Some("ern1"), Some("arc1"), lastUpdated = timestamp)
- val expectedMovement2 =
- Movement(Some("boxId"), "2", "ern1", Some("ern2"), Some("arc2"), lastUpdated = timestamp)
- val expectedMovement3 =
- Movement(Some("boxId"), "3", "consignorId1", Some("ern1"), Some("arc3"), lastUpdated = timestamp)
- val expectedMovement4 = Movement(Some("boxId"), "4", "ern4", None, Some("arc4"), lastUpdated = timestamp)
- insertMovement(expectedMovement1)
- insertMovement(expectedMovement2)
- insertMovement(expectedMovement3)
- insertMovement(expectedMovement4)
-
- val result =
- repository.getMovementByERN(Seq("ern1"), MovementFilter.emptyFilter.copy(lrn = Some("1"))).futureValue
-
- result mustBe Seq(
- expectedMovement1
- )
-
- }
- "ern from filter matches record from database" when {
- val allErns = Seq("consignor", "consignee", "recipient")
- "ern is consignor" in {
- val consignorMovement =
- Movement(Some("boxId"), "1", "consignor", Some("ern1"), Some("arc1"), lastUpdated = timestamp)
- insertMovement(consignorMovement)
- val result =
- repository.getMovementByERN(allErns, MovementFilter.emptyFilter.copy(ern = Some("consignor"))).futureValue
- result mustBe Seq(
- consignorMovement
- )
- }
- "ern is consignee" in {
- val consigneeMovement =
- Movement(Some("boxId"), "2", "ern1", Some("consignee"), Some("arc2"), lastUpdated = timestamp)
- insertMovement(consigneeMovement)
- val result =
- repository.getMovementByERN(allErns, MovementFilter.emptyFilter.copy(ern = Some("consignee"))).futureValue
- result mustBe Seq(
- consigneeMovement
- )
- }
- "ern is message recipient" in {
- val recipientMovement =
- Movement(
- Some("boxId"),
- "3",
- "consignorId1",
- Some("ern1"),
- Some("arc3"),
- lastUpdated = timestamp,
- messages = Seq(Message("encoded", "IE801", "Id", "recipient", Set.empty, timestamp))
- )
- insertMovement(recipientMovement)
- val result =
- repository.getMovementByERN(allErns, MovementFilter.emptyFilter.copy(ern = Some("recipient"))).futureValue
- result mustBe Seq(
- recipientMovement
- )
- }
- }
-
- "arc from filter matches record from database" in {
- val expectedMovement1 =
- Movement(Some("boxId"), "1", "consignorId1", Some("ern1"), Some("arc1"), lastUpdated = timestamp)
- val expectedMovement2 =
- Movement(Some("boxId"), "2", "ern1", Some("ern2"), Some("arc2"), lastUpdated = timestamp)
- val expectedMovement3 =
- Movement(Some("boxId"), "3", "consignorId1", Some("ern1"), Some("arc3"), lastUpdated = timestamp)
- val expectedMovement4 = Movement(Some("boxId"), "4", "ern4", None, Some("arc4"), lastUpdated = timestamp)
- insertMovement(expectedMovement1)
- insertMovement(expectedMovement2)
- insertMovement(expectedMovement3)
- insertMovement(expectedMovement4)
-
- val result =
- repository.getMovementByERN(Seq("ern1"), MovementFilter.emptyFilter.copy(arc = Some("arc1"))).futureValue
-
- result mustBe Seq(
- expectedMovement1
- )
-
- }
-
- "updatedSince from filter matches record from database" in {
- val expectedMovement1 =
- Movement(
- Some("boxId"),
- "1",
- "ern1",
- Some("ern1"),
- Some("arc1"),
- lastUpdated = timestamp.minus(5, ChronoUnit.MINUTES)
- )
- val expectedMovement2 =
- Movement(Some("boxId"), "2", "ern1", Some("ern2"), Some("arc2"), lastUpdated = timestamp)
- val expectedMovement3 =
- Movement(
- Some("boxId"),
- "3",
- "ern1",
- Some("ern1"),
- Some("arc3"),
- lastUpdated = timestamp.plus(5, ChronoUnit.MINUTES)
- )
- val expectedMovement4 =
- Movement(Some("boxId"), "4", "ern4", None, Some("arc4"), lastUpdated = timestamp)
- insertMovement(expectedMovement1)
- insertMovement(expectedMovement2)
- insertMovement(expectedMovement3)
- insertMovement(expectedMovement4)
-
- val filterTimestamp = timestamp
-
- val result =
- repository
- .getMovementByERN(Seq("ern1"), MovementFilter.emptyFilter.copy(updatedSince = Some(filterTimestamp)))
- .futureValue
-
- result.sortBy(_.localReferenceNumber) mustBe Seq(
- expectedMovement2,
- expectedMovement3
- )
-
- }
- }
-
- "arc and lrn from filter matches record from database" in {
- val expectedMovement1 =
- Movement(Some("boxId"), "1", "ern1", Some("ern1"), Some("arc1"), lastUpdated = timestamp)
- val expectedMovement2 =
- Movement(Some("boxId"), "2", "ern1", Some("ern2"), Some("arc1"), lastUpdated = timestamp)
- val expectedMovement3 =
- Movement(Some("boxId"), "3", "ern1", Some("ern1"), Some("arc2"), lastUpdated = timestamp)
- val expectedMovement4 = Movement(Some("boxId"), "4", "ern4", None, Some("arc4"), lastUpdated = timestamp)
- insertMovement(expectedMovement1)
- insertMovement(expectedMovement2)
- insertMovement(expectedMovement3)
- insertMovement(expectedMovement4)
-
- val result =
- repository
- .getMovementByERN(Seq("ern1"), MovementFilter.emptyFilter.copy(arc = Some("arc1"), lrn = Some("2")))
- .futureValue
-
- result mustBe Seq(
- expectedMovement2
- )
-
- }
-
- "arc and ern from filter matches record from database" in {
- val expectedMovement1 =
- Movement(Some("boxId"), "1", "ern1", Some("ern1"), Some("arc1"), lastUpdated = timestamp)
- val expectedMovement2 =
- Movement(
- Some("boxId"),
- "2",
- "ern1",
- Some("ern2"),
- Some("arc1"),
- lastUpdated = timestamp
- )
- val expectedMovement3 =
- Movement(Some("boxId"), "3", "ern2", Some("ern1"), Some("arc3"), lastUpdated = timestamp)
- val expectedMovement4 =
- Movement(Some("boxId"), "4", "ern4", None, Some("arc4"), lastUpdated = timestamp)
- insertMovement(expectedMovement1)
- insertMovement(expectedMovement2)
- insertMovement(expectedMovement3)
- insertMovement(expectedMovement4)
-
- val result =
- repository
- .getMovementByERN(
- Seq("ern1", "ern2"),
- MovementFilter.emptyFilter.copy(arc = Some("arc1"), ern = Some("ern1"))
- )
- .futureValue
-
- result.sortBy(_.localReferenceNumber) mustBe Seq(
- expectedMovement1,
- expectedMovement2
- )
-
- }
-
- "lrn and ern from filter matches record from database" in {
- val expectedMovement1 =
- Movement(Some("boxId"), "1", "ern1", Some("ern1"), Some("arc1"), lastUpdated = timestamp)
- val expectedMovement2 =
- Movement(
- Some("boxId"),
- "2",
- "ern1",
- Some("ern2"),
- Some("arc1"),
- lastUpdated = timestamp
- )
- val expectedMovement3 =
- Movement(Some("boxId"), "3", "ern2", Some("ern1"), Some("arc3"), lastUpdated = timestamp)
- val expectedMovement4 =
- Movement(Some("boxId"), "4", "ern4", None, Some("arc4"), lastUpdated = timestamp)
- insertMovement(expectedMovement1)
- insertMovement(expectedMovement2)
- insertMovement(expectedMovement3)
- insertMovement(expectedMovement4)
-
- val result =
- repository
- .getMovementByERN(
- Seq("ern1", "ern2"),
- MovementFilter.emptyFilter.copy(lrn = Some("1"), ern = Some("ern1"))
- )
- .futureValue
-
- result.sortBy(_.localReferenceNumber) mustBe Seq(expectedMovement1)
-
- }
-
- "return a movement" when {
- "the movement doesn't contain the ERN in consignee or consignor, but a message on the movement does" in {
- val messages = Seq(Message("blah", "IE801", "MessageId", "Recipient", Set.empty, timestamp))
- val expectedMovement1 = Movement(
- Some("boxId"),
- "1",
- "consignor",
- Some("consignee"),
- Some("arc1"),
- lastUpdated = timestamp,
- messages = messages
- )
- insertMovement(expectedMovement1)
-
- val result = repository.getMovementByERN(Seq("Recipient")).futureValue
-
- result mustBe Seq(expectedMovement1)
- }
- }
-
- "return an empty list" in {
- val expectedMovement1 =
- Movement(Some("boxId"), "lrn", "consignorId1", Some("ern1"), Some("arc1"), lastUpdated = timestamp)
- val expectedMovement2 =
- Movement(Some("boxId"), "lrn", "consignorId2", Some("ern2"), Some("arc2"), lastUpdated = timestamp)
- val expectedMovement3 =
- Movement(Some("boxId"), "lrn1", "consignorId1", Some("ern1"), Some("arc3"), lastUpdated = timestamp)
- insertMovement(expectedMovement1)
- insertMovement(expectedMovement2)
- insertMovement(expectedMovement3)
-
- val result = repository.getMovementByERN(Seq("ern3")).futureValue
-
- result mustBe Seq.empty
- }
-
- mustPreserveMdc(repository.getMovementByERN(Seq("some ern")))
- }
-
- "getAllBy" should {
-
- "get all records for a consignorId" in {
- val movementLrn1 = Movement(Some("boxId"), "1", "345", Some("789"), None, timestamp)
- val movementLrn2 = Movement(Some("boxId"), "2", "897", Some("456"), None, timestamp)
- val movementLrn6 = Movement(Some("boxId"), "6", "345", Some("523"), None, timestamp)
-
- insertMovement(movementLrn1)
- insertMovement(movementLrn2)
- insertMovement(movementLrn6)
-
- val result = repository.getAllBy("345", Seq.empty, Seq.empty).futureValue
-
- result mustBe Seq(movementLrn1, movementLrn6)
- }
-
- "get all records for a consignee" in {
- val movementLrn1 = Movement(Some("boxId"), "1", "345", Some("789"), None, timestamp)
- val movementLrn2 = Movement(Some("boxId"), "2", "897", Some("456"), None, timestamp)
- val movementLrn6 = Movement(Some("boxId"), "6", "345", Some("523"), None, timestamp)
- val movementLrn1Consignor564 = Movement(Some("boxId"), "1", "564", Some("456"), None, timestamp)
- insertMovement(movementLrn1)
- insertMovement(movementLrn2)
- insertMovement(movementLrn6)
- insertMovement(movementLrn1Consignor564)
-
- val result = repository.getAllBy("456", Seq.empty, Seq.empty).futureValue
-
- result mustBe Seq(movementLrn2, movementLrn1Consignor564)
- }
-
- "get all records for recipient" in {
- val message = Message("any, message", MessageTypes.IE801.value, "messageId", "456", Set.empty, timestamp)
- val movementLrn1 = Movement(Some("boxId"), "1", "345", Some("789"), None, timestamp, messages = Seq(message))
- insertMovement(movementLrn1)
-
- val result = repository.getAllBy("456", Seq.empty, Seq.empty).futureValue
-
- result mustBe Seq(movementLrn1)
- }
-
- "return an empty list if there are no matching records" in {
- insertMovement(Movement(Some("boxId"), "1", "345", Some("789"), None))
- insertMovement(Movement(Some("boxId"), "2", "897", Some("456"), None))
- insertMovement(Movement(Some("boxId"), "6", "345", Some("523"), None))
-
- val result = repository.getAllBy("896", Seq.empty, Seq.empty).futureValue
-
- result mustBe Seq.empty
- }
-
- "respond with error when there would be too many movements" in {
-
- val movements = 1 to 27
-
- movements.map{
- index =>
- val consignorId = "345"
- val consigneeId = s"345{${index.toString}}"
-
- insertMovement(Movement(Some("boxId"), index.toString, consignorId, Some(consigneeId), None))
- }
-
- val exception = intercept[Exception] {
- repository.getAllBy("345", Seq.empty, Seq.empty).futureValue
- }
-
- exception.getCause.getMessage mustEqual "Protection filter responded with an error for ERN: 345"
- }
-
- "don't respond with error when there are not too many movements" in {
-
- insertMovement(Movement(Some("boxId"), "1", "345", Some("789"), None))
- insertMovement(Movement(Some("boxId"), "2", "345", Some("456"), None))
- insertMovement(Movement(Some("boxId"), "3", "345", Some("523"), None))
-
- val result = repository.getAllBy("345", Seq.empty, Seq.empty).futureValue
-
- result.length mustBe 3
- }
-
- "use getFilteredMovementByErn" when {
- "the user has movements with LRNs in the range of the filtered threshold" in {
-
- val movements = 1 to 21
- movements.map{
- index =>
- val consignorId = "888"
- val consigneeId = s"345{${index.toString}}"
-
- insertMovement(Movement(Some("boxId"), index.toString, consignorId, Some(consigneeId), None))
- }
-
- insertMovement(Movement(Some("boxId"), "1", "878", Some("345"), None)) // should not retrieve this one
-
- val result = repository.getAllBy("888", movements.map(_.toString), Seq.empty).futureValue
-
- result.length mustBe 21
- }
- }
-
- "use getFilteredMovementByErn" when {
- "the user has movements with ARCs in the range of the filtered threshold" in {
- val testArc = "12345"
- val movements = 1 to 19 //below threshold to add None for some of the arcs manually
- movements.map{
- index =>
- val consignorId = "888"
- val consigneeId = s"345{${index.toString}}"
-
- insertMovement(Movement(Some("boxId"), index.toString, consignorId, Some(consigneeId), Some(testArc)))
- }
- insertMovement(Movement(Some("boxId"), "22", "888", Some("789"), None))
- insertMovement(Movement(Some("boxId"), "23", "888", Some("523"), None))
- insertMovement(Movement(Some("boxId"), "24", "888", Some("523"), None))
-
- val result = repository.getAllBy("888", Seq(), Seq(testArc)).futureValue
-
- result.length mustBe 19
- }
- }
-
- "use getFilteredMovementByErn" when {
- "the user has movements with LRNs and ARCs in the range of the filtered threshold" in {
- val testArc = "12345"
- val movements = 1 to 19
- movements.map{
- index =>
- val consignorId = "888"
- val consigneeId = s"345{${index.toString}}"
-
- insertMovement(Movement(Some("boxId"), index.toString, consignorId, Some(consigneeId), None))
- }
- insertMovement(Movement(Some("boxId"), "21", "888", Some("789"), None))
- insertMovement(Movement(Some("boxId"), "22", "888", Some("523"), None))
- insertMovement(Movement(Some("boxId"), "23", "888", Some("523"), Some(testArc)))
-
- val result = repository.getAllBy("888", Seq("2","3"), Seq(testArc)).futureValue
-
- result.length mustBe 3
- }
- }
-
- mustPreserveMdc(repository.getAllBy("ern", Seq.empty, Seq.empty))
- }
-
- "getErnsAndLastReceived" should {
-
- "return a map of all of the ERNs that have received messages along with the latest time we received a message for them" in {
-
- val message1 =
- Message("encodedMessage", "type", "messageId", "recipient1", Set.empty, timestamp.minus(1, ChronoUnit.DAYS))
- val message2 = Message("encodedMessage", "type2", "messageId2", "recipient2", Set.empty, timestamp)
- val movement = Movement(
- UUID.randomUUID().toString,
- None,
- "123",
- "consignorId",
- Some("789"),
- None,
- timestamp.truncatedTo(ChronoUnit.MILLIS),
- Seq(message1, message2)
- )
-
- val message3 = Message("encodedMessage", "type", "messageId3", "recipient3", Set.empty, timestamp)
- val message4 = Message("encodedMessage", "type", "messageId4", "recipient1", Set.empty, timestamp)
- val movement2 = Movement(
- UUID.randomUUID().toString,
- None,
- "124",
- "consignorId",
- Some("789"),
- None,
- timestamp.truncatedTo(ChronoUnit.MILLIS),
- Seq(message3, message4)
- )
-
- repository.collection.insertMany(Seq(movement, movement2)).toFuture().futureValue
-
- val expected = Map(
- "recipient1" -> timestamp,
- "recipient2" -> timestamp,
- "recipient3" -> timestamp
- )
-
- repository.getErnsAndLastReceived.futureValue mustEqual expected
- }
-
- "must return an empty map when there are no movements" in {
-
- repository.getErnsAndLastReceived.futureValue mustEqual Map.empty
- }
-
- mustPreserveMdc(repository.getErnsAndLastReceived)
- }
-
- "getMessageNotifications" should {
-
- "return a list of MessageNotifications" in {
-
- val message1 =
- Message("encodedMessage", "type", "messageId", "recipient1", Set.empty, timestamp.minus(1, ChronoUnit.DAYS))
- val message2 = Message("encodedMessage", "type2", "messageId2", "recipient2", Set("boxId1"), timestamp)
- val movement = Movement(
- UUID.randomUUID().toString,
- None,
- "123",
- "consignorId",
- Some("789"),
- None,
- timestamp.truncatedTo(ChronoUnit.MILLIS),
- Seq(message1, message2)
- )
-
- val message3 = Message("encodedMessage", "type", "messageId3", "recipient3", Set("boxId1", "boxId2"), timestamp)
- val message4 = Message("encodedMessage", "type", "messageId4", "recipient1", Set.empty, timestamp)
- val movement2 = Movement(
- UUID.randomUUID().toString,
- None,
- "124",
- "consignorId",
- None,
- Some("arc"),
- timestamp.truncatedTo(ChronoUnit.MILLIS),
- Seq(message3, message4)
- )
-
- val message5 = Message("encodedMessage", "type", "messageId4", "recipient1", Set.empty, timestamp)
- val movement3 = Movement(
- UUID.randomUUID().toString,
- None,
- "125",
- "consignorId",
- None,
- Some("arc"),
- timestamp.truncatedTo(ChronoUnit.MILLIS),
- Seq(message5)
- )
-
- val movement4 = Movement(
- UUID.randomUUID().toString,
- None,
- "126",
- "consignorId",
- None,
- Some("arc"),
- timestamp.truncatedTo(ChronoUnit.MILLIS),
- Seq.empty
- )
-
- repository.collection.insertMany(Seq(movement, movement2, movement3, movement4)).toFuture().futureValue
-
- val expected = List(
- MessageNotification(
- movementId = movement._id,
- messageId = "messageId2",
- messageType = "type2",
- consignor = "consignorId",
- consignee = Some("789"),
- arc = None,
- recipient = "recipient2",
- boxId = "boxId1"
- ),
- MessageNotification(
- movementId = movement2._id,
- messageId = "messageId3",
- messageType = "type",
- consignor = "consignorId",
- consignee = None,
- arc = Some("arc"),
- recipient = "recipient3",
- boxId = "boxId1"
- ),
- MessageNotification(
- movementId = movement2._id,
- messageId = "messageId3",
- messageType = "type",
- consignor = "consignorId",
- consignee = None,
- arc = Some("arc"),
- recipient = "recipient3",
- boxId = "boxId2"
- )
- )
-
- val result = repository.getPendingMessageNotifications.futureValue
-
- result must contain theSameElementsAs expected
- }
-
- mustPreserveMdc(repository.getPendingMessageNotifications)
- }
-
- "confirmNotification" should {
-
- "update the relevant message to remove the relevant boxId from the list of boxesToNotify" in {
-
- val message1 = Message(
- "encodedMessage",
- "type",
- "messageId",
- "recipient1",
- Set("boxId1", "boxId2"),
- timestamp.minus(1, ChronoUnit.DAYS)
- )
- val message2 = Message("encodedMessage", "type2", "messageId2", "recipient2", Set("boxId1", "boxId2"), timestamp)
- val movement = Movement(
- UUID.randomUUID().toString,
- None,
- "123",
- "consignorId",
- Some("789"),
- None,
- timestamp.truncatedTo(ChronoUnit.MILLIS),
- Seq(message1, message2)
- )
-
- val message3 = Message("encodedMessage", "type", "messageId", "recipient3", Set("boxId1", "boxId2"), timestamp)
- val message4 = Message("encodedMessage", "type", "messageId4", "recipient1", Set("boxId1", "boxId2"), timestamp)
- val movement2 = Movement(
- UUID.randomUUID().toString,
- None,
- "124",
- "consignorId",
- None,
- Some("arc"),
- timestamp.truncatedTo(ChronoUnit.MILLIS),
- Seq(message3, message4)
- )
-
- repository.collection.insertMany(Seq(movement, movement2)).toFuture().futureValue
-
- val updatedMessage = message1.copy(boxesToNotify = Set("boxId2"))
- val updatedMovement = movement.copy(messages = Seq(updatedMessage, message2))
- val expectedMovements = Seq(updatedMovement, movement2)
-
- repository.confirmNotification(movement._id, message1.messageId, "boxId1").futureValue
-
- repository.collection.find().toFuture().futureValue must contain theSameElementsAs expectedMovements
- }
-
- "must not fail if there is no matching movement" in {
- repository.confirmNotification("movementId", "messageId", "boxId").futureValue
- }
-
- "must not fail if there is no matching message" in {
-
- val message1 = Message(
- "encodedMessage",
- "type",
- "messageId",
- "recipient1",
- Set("boxId1", "boxId2"),
- timestamp.minus(1, ChronoUnit.DAYS)
- )
- val message2 = Message("encodedMessage", "type2", "messageId2", "recipient2", Set("boxId1", "boxId2"), timestamp)
- val movement = Movement(
- UUID.randomUUID().toString,
- None,
- "123",
- "consignorId",
- Some("789"),
- None,
- timestamp.truncatedTo(ChronoUnit.MILLIS),
- Seq(message1, message2)
- )
-
- repository.collection.insertOne(movement)
-
- repository.confirmNotification(movement._id, "foo", "boxId").futureValue
- }
-
- "must not fail if there is no matching boxId" in {
-
- val message1 = Message(
- "encodedMessage",
- "type",
- "messageId",
- "recipient1",
- Set("boxId1", "boxId2"),
- timestamp.minus(1, ChronoUnit.DAYS)
- )
- val message2 = Message("encodedMessage", "type2", "messageId2", "recipient2", Set("boxId1", "boxId2"), timestamp)
- val movement = Movement(
- UUID.randomUUID().toString,
- None,
- "123",
- "consignorId",
- Some("789"),
- None,
- timestamp.truncatedTo(ChronoUnit.MILLIS),
- Seq(message1, message2)
- )
-
- repository.collection.insertOne(movement)
-
- repository.confirmNotification(movement._id, message1.messageId, "bar").futureValue
- }
-
- mustPreserveMdc(repository.confirmNotification("movementId", "messageId", "boxId"))
- }
-
- "addBoxIdToMessages" should {
-
- "add the given boxId to the list of boxIds to notify for all messages for the given recipient" in {
-
- val message1 = Message(
- "encodedMessage",
- "type",
- "messageId",
- "recipient1",
- Set("boxId1", "boxId2"),
- timestamp.minus(1, ChronoUnit.DAYS)
- )
- val message2 = Message("encodedMessage", "type2", "messageId2", "recipient2", Set("boxId1", "boxId2"), timestamp)
- val movement = Movement(
- UUID.randomUUID().toString,
- None,
- "123",
- "consignorId",
- Some("789"),
- None,
- timestamp.truncatedTo(ChronoUnit.MILLIS),
- Seq(message1, message2)
- )
-
- val message3 = Message("encodedMessage", "type", "messageId", "recipient3", Set("boxId1", "boxId2"), timestamp)
- val message4 =
- Message("encodedMessage", "type", "messageId4", "recipient1", Set("boxId1", "boxId2", "boxId3"), timestamp)
- val movement2 = Movement(
- UUID.randomUUID().toString,
- None,
- "124",
- "consignorId",
- None,
- Some("arc"),
- timestamp.truncatedTo(ChronoUnit.MILLIS),
- Seq(message3, message4)
- )
-
- repository.collection.insertMany(Seq(movement, movement2)).toFuture().futureValue
-
- val updatedMessage1 = message1.copy(boxesToNotify = Set("boxId1", "boxId2", "boxId3"))
- val updatedMovement1 = movement.copy(messages = Seq(updatedMessage1, message2))
- val expectedMovements = Seq(updatedMovement1, movement2)
-
- repository.addBoxIdToMessages("recipient1", "boxId3").futureValue
-
- repository.collection.find().toFuture().futureValue must contain theSameElementsAs expectedMovements
- }
-
- mustPreserveMdc(repository.addBoxIdToMessages("recipient1", "boxId3"))
- }
-
- private def insertMovement(movement: Movement) =
- insert(movement).futureValue
-
- private def mustPreserveMdc[A](f: => Future[A])(implicit pos: Position): Unit =
- "must preserve MDC" in {
-
- val ec = app.injector.instanceOf[ExecutionContext]
-
- MDC.put("test", "foo")
-
- f.map { _ =>
- MDC.get("test") mustEqual "foo"
- }(ec).futureValue
- }
-}
diff --git a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MessageServiceItSpec.scala b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MessageServiceItSpec.scala
index 7d96f497c..2a05ee70d 100644
--- a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MessageServiceItSpec.scala
+++ b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MessageServiceItSpec.scala
@@ -31,8 +31,7 @@ import uk.gov.hmrc.excisemovementcontrolsystemapi.connectors.{MessageConnector,
import uk.gov.hmrc.excisemovementcontrolsystemapi.data.{MessageParams, XmlMessageGeneratorFactory}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageReceiptSuccessResponse
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes.{IE704, IE801, IE818}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.GetMessagesResponse
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.{IE704MessageV1, IE801MessageV1, IE818MessageV1}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{GetMessagesResponse, IE704Message, IE801Message, IE818Message}
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Message, Movement, MovementIdGenerator}
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.{ErnRetrievalRepository, MovementRepository}
import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.{DateTimeService, EmcsUtils}
@@ -108,7 +107,7 @@ class MessageServiceItSpec
val ie704 =
XmlMessageGeneratorFactory.generate(ern, MessageParams(IE704, "XI000001", localReferenceNumber = Some(lrn)))
- val messages = Seq(IE704MessageV1.createFromXml(ie704))
+ val messages = Seq(IE704Message.createFromXml(ie704))
val expectedMovement = Movement(
newId,
@@ -157,7 +156,7 @@ class MessageServiceItSpec
val ie704 =
XmlMessageGeneratorFactory.generate(ern, MessageParams(IE704, "XI000001", localReferenceNumber = Some(lrn)))
- val messages = Seq(IE704MessageV1.createFromXml(ie704))
+ val messages = Seq(IE704Message.createFromXml(ie704))
val promise = Promise[Done]()
@@ -187,7 +186,7 @@ class MessageServiceItSpec
val ie704 =
XmlMessageGeneratorFactory.generate(ern, MessageParams(IE704, "XI000001", localReferenceNumber = Some(lrn)))
- val messages = Seq(IE704MessageV1.createFromXml(ie704))
+ val messages = Seq(IE704Message.createFromXml(ie704))
val timeout = app.configuration.get[Duration]("microservice.services.eis.throttle-cutoff")
@@ -234,7 +233,7 @@ class MessageServiceItSpec
administrativeReferenceCode = Some(arc)
)
)
- val messages = Seq(IE801MessageV1.createFromXml(ie801), IE818MessageV1.createFromXml(ie818))
+ val messages = Seq(IE801Message.createFromXml(ie801), IE818Message.createFromXml(ie818))
val initialMovement = Movement(
None,
@@ -293,7 +292,7 @@ class MessageServiceItSpec
administrativeReferenceCode = Some(arc)
)
)
- val messages = Seq(IE801MessageV1.createFromXml(ie801))
+ val messages = Seq(IE801Message.createFromXml(ie801))
val initialMovement = Movement(
None,
diff --git a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/GeneratedJsonWritersSpec.scala b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/GeneratedJsonWritersSpec.scala
index d714f8dc5..93fb820f2 100644
--- a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/GeneratedJsonWritersSpec.scala
+++ b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/GeneratedJsonWritersSpec.scala
@@ -16,34 +16,33 @@
package uk.gov.hmrc.excisemovementcontrolsystemapi.writes
-import generated.v1.{IE704Type, IE801Type, IE802Type, IE803Type, IE807Type, IE810Type, IE813Type, IE815Type, IE818Type, IE819Type, IE829Type, IE837Type, IE839Type, IE840Type, IE871Type, IE881Type, IE905Type, XMLProtocol}
+import generated.{IE704Type, IE801Type, IE802Type, IE803Type, IE807Type, IE810Type, IE813Type, IE815Type, IE818Type, IE819Type, IE829Type, IE837Type, IE839Type, IE840Type, IE871Type, IE881Type, IE905Type, XMLProtocol}
import org.scalatest.freespec.AnyFreeSpec
import org.scalatest.matchers.must.Matchers
import uk.gov.hmrc.excisemovementcontrolsystemapi.data.TestXml
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.MessageTypeFormats.GeneratedJsonWriters
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
import uk.gov.hmrc.excisemovementcontrolsystemapi.writes.testObjects._
-class GeneratedJsonWritersSpec extends AnyFreeSpec with GeneratedJsonWritersV1 with Matchers with TestXml {
-
- "IE704MessageV1" - new TestType[IE704Type](IE704TestMessageType, IE704MessageV1.createFromXml(IE704))
- "IE801MessageV1" - new TestType[IE801Type](IE801TestMessageType, IE801MessageV1.createFromXml(IE801))
- "IE802MessageV1" - new TestType[IE802Type](IE802TestMessageType, IE802MessageV1.createFromXml(IE802))
- "IE803MessageV1" - new TestType[IE803Type](IE803TestMessageType, IE803MessageV1.createFromXml(IE803))
- "IE807MessageV1" - new TestType[IE807Type](IE807TestMessageType, IE807MessageV1.createFromXml(IE807))
- "IE810MessageV1" - new TestType[IE810Type](IE810TestMessageType, IE810MessageV1.createFromXml(IE810))
- "IE813MessageV1" - new TestType[IE813Type](IE813TestMessageType, IE813MessageV1.createFromXml(IE813))
- "IE815MessageV1" - new TestType[IE815Type](IE815TestMessageType, IE815MessageV1.createFromXml(IE815))
- "IE818MessageV1" - new TestType[IE818Type](IE818TestMessageType, IE818MessageV1.createFromXml(IE818))
- "IE819MessageV1" - new TestType[IE819Type](IE819TestMessageType, IE819MessageV1.createFromXml(IE819))
- "IE829MessageV1" - new TestType[IE829Type](IE829TestMessageType, IE829MessageV1.createFromXml(IE829))
- "IE837MessageV1" - new TestType[IE837Type](IE837TestMessageType, IE837MessageV1.createFromXml(IE837WithConsignor))
- "IE839MessageV1" - new TestType[IE839Type](IE839TestMessageType, IE839MessageV1.createFromXml(IE839))
- "IE840MessageV1" - new TestType[IE840Type](IE840TestMessageType, IE840MessageV1.createFromXml(IE840))
- "IE871MessageV1" - new TestType[IE871Type](IE871TestMessageType, IE871MessageV1.createFromXml(IE871WithConsignor))
- "IE881MessageV1" - new TestType[IE881Type](IE881TestMessageType, IE881MessageV1.createFromXml(IE881))
- "IE905MessageV1" - new TestType[IE905Type](IE905TestMessageType, IE905MessageV1.createFromXml(IE905))
+class GeneratedJsonWritersSpec extends AnyFreeSpec with GeneratedJsonWriters with Matchers with TestXml {
+
+ "IE704Message" - new TestType[IE704Type](IE704TestMessageType, IE704Message.createFromXml(IE704))
+ "IE801Message" - new TestType[IE801Type](IE801TestMessageType, IE801Message.createFromXml(IE801))
+ "IE802Message" - new TestType[IE802Type](IE802TestMessageType, IE802Message.createFromXml(IE802))
+ "IE803Message" - new TestType[IE803Type](IE803TestMessageType, IE803Message.createFromXml(IE803))
+ "IE807Message" - new TestType[IE807Type](IE807TestMessageType, IE807Message.createFromXml(IE807))
+ "IE810Message" - new TestType[IE810Type](IE810TestMessageType, IE810Message.createFromXml(IE810))
+ "IE813Message" - new TestType[IE813Type](IE813TestMessageType, IE813Message.createFromXml(IE813))
+ "IE815Message" - new TestType[IE815Type](IE815TestMessageType, IE815Message.createFromXml(IE815))
+ "IE818Message" - new TestType[IE818Type](IE818TestMessageType, IE818Message.createFromXml(IE818))
+ "IE819Message" - new TestType[IE819Type](IE819TestMessageType, IE819Message.createFromXml(IE819))
+ "IE829Message" - new TestType[IE829Type](IE829TestMessageType, IE829Message.createFromXml(IE829))
+ "IE837Message" - new TestType[IE837Type](IE837TestMessageType, IE837Message.createFromXml(IE837WithConsignor))
+ "IE839Message" - new TestType[IE839Type](IE839TestMessageType, IE839Message.createFromXml(IE839))
+ "IE840Message" - new TestType[IE840Type](IE840TestMessageType, IE840Message.createFromXml(IE840))
+ "IE871Message" - new TestType[IE871Type](IE871TestMessageType, IE871Message.createFromXml(IE871WithConsignor))
+ "IE881Message" - new TestType[IE881Type](IE881TestMessageType, IE881Message.createFromXml(IE881))
+ "IE905Message" - new TestType[IE905Type](IE905TestMessageType, IE905Message.createFromXml(IE905))
case class TestType[T](testObject: TestMessageType, message: IEMessage) extends XMLProtocol {
diff --git a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/GeneratedJsonWritersV1Spec.scala b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/GeneratedJsonWritersV1Spec.scala
deleted file mode 100644
index b29bf51cb..000000000
--- a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/GeneratedJsonWritersV1Spec.scala
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2025 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.writes
-
-import generated.v1.{IE704Type, IE801Type, IE802Type, IE803Type, IE807Type, IE810Type, IE813Type, IE815Type, IE818Type, IE819Type, IE829Type, IE837Type, IE839Type, IE840Type, IE871Type, IE881Type, IE905Type, XMLProtocol}
-import org.scalatest.freespec.AnyFreeSpec
-import org.scalatest.matchers.must.Matchers
-import uk.gov.hmrc.excisemovementcontrolsystemapi.data.TestXml
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.MessageTypeFormats.GeneratedJsonWritersV1
-import uk.gov.hmrc.excisemovementcontrolsystemapi.writes.testObjects._
-
-class GeneratedJsonWritersV1Spec extends AnyFreeSpec with GeneratedJsonWritersV1 with Matchers with TestXml {
-
- "IE704MessageV1" - new TestType[IE704Type](IE704TestMessageType, IE704MessageV1.createFromXml(IE704))
- "IE801MessageV1" - new TestType[IE801Type](IE801TestMessageType, IE801MessageV1.createFromXml(IE801))
- "IE802MessageV1" - new TestType[IE802Type](IE802TestMessageType, IE802MessageV1.createFromXml(IE802))
- "IE803MessageV1" - new TestType[IE803Type](IE803TestMessageType, IE803MessageV1.createFromXml(IE803))
- "IE807MessageV1" - new TestType[IE807Type](IE807TestMessageType, IE807MessageV1.createFromXml(IE807))
- "IE810MessageV1" - new TestType[IE810Type](IE810TestMessageType, IE810MessageV1.createFromXml(IE810))
- "IE813MessageV1" - new TestType[IE813Type](IE813TestMessageType, IE813MessageV1.createFromXml(IE813))
- "IE815MessageV1" - new TestType[IE815Type](IE815TestMessageType, IE815MessageV1.createFromXml(IE815))
- "IE818MessageV1" - new TestType[IE818Type](IE818TestMessageType, IE818MessageV1.createFromXml(IE818))
- "IE819MessageV1" - new TestType[IE819Type](IE819TestMessageType, IE819MessageV1.createFromXml(IE819))
- "IE829MessageV1" - new TestType[IE829Type](IE829TestMessageType, IE829MessageV1.createFromXml(IE829))
- "IE837MessageV1" - new TestType[IE837Type](IE837TestMessageType, IE837MessageV1.createFromXml(IE837WithConsignor))
- "IE839MessageV1" - new TestType[IE839Type](IE839TestMessageType, IE839MessageV1.createFromXml(IE839))
- "IE840MessageV1" - new TestType[IE840Type](IE840TestMessageType, IE840MessageV1.createFromXml(IE840))
- "IE871MessageV1" - new TestType[IE871Type](IE871TestMessageType, IE871MessageV1.createFromXml(IE871WithConsignor))
- "IE881MessageV1" - new TestType[IE881Type](IE881TestMessageType, IE881MessageV1.createFromXml(IE881))
- "IE905MessageV1" - new TestType[IE905Type](IE905TestMessageType, IE905MessageV1.createFromXml(IE905))
-
- case class TestType[T](testObject: TestMessageType, message: IEMessage) extends XMLProtocol {
-
- "successfully converts model to Json" in {
- message.toJson mustBe testObject.json1
- }
-
- }
-
-}
diff --git a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/testObjects/IE801TestMessageType.scala b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/testObjects/IE801TestMessageType.scala
index 0ce5fccce..9c9d84905 100644
--- a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/testObjects/IE801TestMessageType.scala
+++ b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/testObjects/IE801TestMessageType.scala
@@ -20,14 +20,14 @@ import play.api.libs.json.{JsValue, Json}
object IE801TestMessageType extends TestMessageType {
override def json1: JsValue = Json.parse(
- "{\"Header\":{\"MessageSender\":\"token\",\"MessageRecipient\":\"token\",\"DateOfPreparation\":\"2008-09-29\",\"TimeOfPreparation\":\"00:18:33\",\"MessageIdentifier\":\"token\",\"CorrelationIdentifier\":\"PORTAL6de1b822562c43fb9220d236e487c920\"},\"Body\":{\"EADESADContainer\":{\"ConsigneeTrader\":{\"Traderid\":\"token\",\"TraderName\":\"token\",\"StreetName\":\"token\",\"StreetNumber\":\"token\",\"Postcode\":\"token\",\"City\":\"token\",\"EoriNumber\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"ExciseMovement\":{\"AdministrativeReferenceCode\":\"tokentokentokentokent\",\"DateAndTimeOfValidationOfEadEsad\":\"2006-08-19T18:27:14+01:00\"},\"ConsignorTrader\":{\"TraderExciseNumber\":\"tokentokentok\",\"TraderName\":\"token\",\"StreetName\":\"token\",\"StreetNumber\":\"token\",\"Postcode\":\"token\",\"City\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"PlaceOfDispatchTrader\":{\"ReferenceOfTaxWarehouse\":\"tokentokentok\",\"TraderName\":\"token\",\"StreetName\":\"token\",\"StreetNumber\":\"token\",\"Postcode\":\"token\",\"City\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"DispatchImportOffice\":{\"ReferenceNumber\":\"tokentok\"},\"ComplementConsigneeTrader\":{\"MemberStateCode\":\"to\",\"SerialNumberOfCertificateOfExemption\":\"token\"},\"DeliveryPlaceTrader\":{\"Traderid\":\"token\",\"TraderName\":\"token\",\"StreetName\":\"token\",\"StreetNumber\":\"token\",\"Postcode\":\"token\",\"City\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"DeliveryPlaceCustomsOffice\":{\"ReferenceNumber\":\"tokentok\"},\"CompetentAuthorityDispatchOffice\":{\"ReferenceNumber\":\"tokentok\"},\"TransportArrangerTrader\":{\"VatNumber\":\"token\",\"TraderName\":\"token\",\"StreetName\":\"token\",\"StreetNumber\":\"token\",\"Postcode\":\"token\",\"City\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"FirstTransporterTrader\":{\"VatNumber\":\"token\",\"TraderName\":\"token\",\"StreetName\":\"token\",\"StreetNumber\":\"token\",\"Postcode\":\"token\",\"City\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"DocumentCertificate\":[{\"DocumentType\":\"toke\",\"DocumentReference\":\"token\",\"DocumentDescription\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"ReferenceOfDocument\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}}}],\"EadEsad\":{\"LocalReferenceNumber\":\"token\",\"InvoiceNumber\":\"token\",\"InvoiceDate\":\"2009-05-16\",\"OriginTypeCode\":\"2\",\"DateOfDispatch\":\"2002-11-05Z\",\"TimeOfDispatch\":\"16:46:32+01:00\",\"UpstreamArc\":\"tokentokentokentokent\",\"ImportSad\":[{\"ImportSadNumber\":\"token\"}]},\"HeaderEadEsad\":{\"SequenceNumber\":\"to\",\"DateAndTimeOfUpdateValidation\":\"2016-02-20T14:56:29Z\",\"DestinationTypeCode\":\"7\",\"JourneyTime\":\"tok\",\"TransportArrangement\":\"1\"},\"TransportMode\":{\"TransportModeCode\":\"to\",\"ComplementaryInformation\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}}},\"MovementGuarantee\":{\"GuarantorTypeCode\":\"234\",\"GuarantorTrader\":[{\"TraderExciseNumber\":\"tokentokentok\",\"TraderName\":\"token\",\"StreetName\":\"token\",\"StreetNumber\":\"token\",\"City\":\"token\",\"Postcode\":\"token\",\"VatNumber\":\"token\",\"attributes\":{\"@language\":\"to\"}}]},\"BodyEadEsad\":[{\"BodyRecordUniqueReference\":\"tok\",\"ExciseProductCode\":\"toke\",\"CnCode\":\"tokentok\",\"Quantity\":1000,\"GrossMass\":1000,\"NetMass\":1000,\"AlcoholicStrengthByVolumeInPercentage\":1000,\"DegreePlato\":1000,\"FiscalMark\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"FiscalMarkUsedFlag\":\"0\",\"DesignationOfOrigin\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"SizeOfProducer\":\"token\",\"Density\":1000,\"CommercialDescription\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"BrandNameOfProducts\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"MaturationPeriodOrAgeOfProducts\":{\"value\":\"token\",\"attributes\":{}},\"PackageValue\":[{\"KindOfPackages\":\"to\",\"NumberOfPackages\":\"token\",\"ShippingMarks\":\"token\",\"CommercialSealIdentification\":\"token\",\"SealInformation\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}}}],\"WineProduct\":{\"WineProductCategory\":\"4\",\"WineGrowingZoneCode\":\"to\",\"ThirdCountryOfOrigin\":\"to\",\"OtherInformation\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"WineOperation\":[{\"WineOperationCode\":\"to\"}]}}],\"TransportDetails\":[{\"TransportUnitCode\":\"to\",\"IdentityOfTransportUnits\":\"token\",\"CommercialSealIdentification\":\"token\",\"ComplementaryInformation\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"SealInformation\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}}}]}}}"
+ "{\"Header\":{\"MessageSender\":\"token\",\"MessageRecipient\":\"token\",\"DateOfPreparation\":\"2008-09-29\",\"TimeOfPreparation\":\"00:18:33\",\"MessageIdentifier\":\"token\",\"CorrelationIdentifier\":\"PORTAL6de1b822562c43fb9220d236e487c920\"},\"Body\":{\"EADESADContainer\":{\"ConsigneeTrader\":{\"Traderid\":\"token\",\"TraderName\":\"token\",\"StreetName\":\"token\",\"StreetNumber\":\"token\",\"Postcode\":\"token\",\"City\":\"token\",\"EoriNumber\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"ExciseMovement\":{\"AdministrativeReferenceCode\":\"tokentokentokentokent\",\"DateAndTimeOfValidationOfEadEsad\":\"2006-08-19T18:27:14+01:00\"},\"ConsignorTrader\":{\"TraderExciseNumber\":\"tokentokentok\",\"TraderName\":\"token\",\"StreetName\":\"token\",\"StreetNumber\":\"token\",\"Postcode\":\"token\",\"City\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"PlaceOfDispatchTrader\":{\"ReferenceOfTaxWarehouse\":\"tokentokentok\",\"TraderName\":\"token\",\"StreetName\":\"token\",\"StreetNumber\":\"token\",\"Postcode\":\"token\",\"City\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"DispatchImportOffice\":{\"ReferenceNumber\":\"tokentok\"},\"ComplementConsigneeTrader\":{\"MemberStateCode\":\"to\",\"SerialNumberOfCertificateOfExemption\":\"token\"},\"DeliveryPlaceTrader\":{\"Traderid\":\"token\",\"TraderName\":\"token\",\"StreetName\":\"token\",\"StreetNumber\":\"token\",\"Postcode\":\"token\",\"City\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"DeliveryPlaceCustomsOffice\":{\"ReferenceNumber\":\"tokentok\"},\"CompetentAuthorityDispatchOffice\":{\"ReferenceNumber\":\"tokentok\"},\"TransportArrangerTrader\":{\"VatNumber\":\"token\",\"TraderName\":\"token\",\"StreetName\":\"token\",\"StreetNumber\":\"token\",\"Postcode\":\"token\",\"City\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"FirstTransporterTrader\":{\"VatNumber\":\"token\",\"TraderName\":\"token\",\"StreetName\":\"token\",\"StreetNumber\":\"token\",\"Postcode\":\"token\",\"City\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"DocumentCertificate\":[{\"DocumentType\":\"toke\",\"DocumentReference\":\"token\",\"DocumentDescription\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"ReferenceOfDocument\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}}}],\"EadEsad\":{\"LocalReferenceNumber\":\"token\",\"InvoiceNumber\":\"token\",\"InvoiceDate\":\"2009-05-16\",\"OriginTypeCode\":\"2\",\"DateOfDispatch\":\"2002-11-05Z\",\"TimeOfDispatch\":\"16:46:32+01:00\",\"UpstreamArc\":\"tokentokentokentokent\",\"ImportCustomsDeclaration\":[{\"ImportCustomsDeclarationNumber\":\"token\"}]},\"HeaderEadEsad\":{\"SequenceNumber\":\"to\",\"DateAndTimeOfUpdateValidation\":\"2016-02-20T14:56:29Z\",\"DestinationTypeCode\":\"7\",\"JourneyTime\":\"tok\",\"TransportArrangement\":\"1\"},\"TransportMode\":{\"TransportModeCode\":\"to\",\"ComplementaryInformation\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}}},\"MovementGuarantee\":{\"GuarantorTypeCode\":\"234\",\"GuarantorTrader\":[{\"TraderExciseNumber\":\"tokentokentok\",\"TraderName\":\"token\",\"StreetName\":\"token\",\"StreetNumber\":\"token\",\"City\":\"token\",\"Postcode\":\"token\",\"VatNumber\":\"token\",\"attributes\":{\"@language\":\"to\"}}]},\"BodyEadEsad\":[{\"BodyRecordUniqueReference\":\"tok\",\"ExciseProductCode\":\"toke\",\"CnCode\":\"tokentok\",\"Quantity\":1000,\"GrossMass\":1000,\"NetMass\":1000,\"AlcoholicStrengthByVolumeInPercentage\":1000,\"DegreePlato\":1000,\"FiscalMark\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"FiscalMarkUsedFlag\":\"0\",\"DesignationOfOrigin\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"SizeOfProducer\":\"token\",\"Density\":1000,\"CommercialDescription\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"BrandNameOfProducts\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"MaturationPeriodOrAgeOfProducts\":{\"value\":\"token\",\"attributes\":{}},\"PackageValue\":[{\"KindOfPackages\":\"to\",\"NumberOfPackages\":\"token\",\"ShippingMarks\":\"token\",\"CommercialSealIdentification\":\"token\",\"SealInformation\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}}}],\"WineProduct\":{\"WineProductCategory\":\"4\",\"WineGrowingZoneCode\":\"to\",\"ThirdCountryOfOrigin\":\"to\",\"OtherInformation\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"WineOperation\":[{\"WineOperationCode\":\"to\"}]}}],\"TransportDetails\":[{\"TransportUnitCode\":\"to\",\"IdentityOfTransportUnits\":\"token\",\"CommercialSealIdentification\":\"token\",\"ComplementaryInformation\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}},\"SealInformation\":{\"value\":\"token\",\"attributes\":{\"@language\":\"to\"}}}]}}}"
)
override def auditEvent: JsValue = Json.parse(
- """{"messageCode":"IE801","content":{"Header":{"MessageSender":"token","MessageRecipient":"token","DateOfPreparation":"2008-09-29","TimeOfPreparation":"00:18:33","MessageIdentifier":"token","CorrelationIdentifier":"PORTAL6de1b822562c43fb9220d236e487c920"},"Body":{"EADESADContainer":{"ConsigneeTrader":{"Traderid":"token","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","EoriNumber":"token","attributes":{"@language":"to"}},"ExciseMovement":{"AdministrativeReferenceCode":"tokentokentokentokent","DateAndTimeOfValidationOfEadEsad":"2006-08-19T18:27:14+01:00"},"ConsignorTrader":{"TraderExciseNumber":"tokentokentok","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"PlaceOfDispatchTrader":{"ReferenceOfTaxWarehouse":"tokentokentok","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"DispatchImportOffice":{"ReferenceNumber":"tokentok"},"ComplementConsigneeTrader":{"MemberStateCode":"to","SerialNumberOfCertificateOfExemption":"token"},"DeliveryPlaceTrader":{"Traderid":"token","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"DeliveryPlaceCustomsOffice":{"ReferenceNumber":"tokentok"},"CompetentAuthorityDispatchOffice":{"ReferenceNumber":"tokentok"},"TransportArrangerTrader":{"VatNumber":"token","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"FirstTransporterTrader":{"VatNumber":"token","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"DocumentCertificate":[{"DocumentType":"toke","DocumentReference":"token","DocumentDescription":{"value":"token","attributes":{"@language":"to"}},"ReferenceOfDocument":{"value":"token","attributes":{"@language":"to"}}}],"EadEsad":{"LocalReferenceNumber":"token","InvoiceNumber":"token","InvoiceDate":"2009-05-16","OriginTypeCode":"2","DateOfDispatch":"2002-11-05Z","TimeOfDispatch":"16:46:32+01:00","UpstreamArc":"tokentokentokentokent","ImportSad":[{"ImportSadNumber":"token"}]},"HeaderEadEsad":{"SequenceNumber":"to","DateAndTimeOfUpdateValidation":"2016-02-20T14:56:29Z","DestinationTypeCode":"7","JourneyTime":"tok","TransportArrangement":"1"},"TransportMode":{"TransportModeCode":"to","ComplementaryInformation":{"value":"token","attributes":{"@language":"to"}}},"MovementGuarantee":{"GuarantorTypeCode":"234","GuarantorTrader":[{"TraderExciseNumber":"tokentokentok","TraderName":"token","StreetName":"token","StreetNumber":"token","City":"token","Postcode":"token","VatNumber":"token","attributes":{"@language":"to"}}]},"BodyEadEsad":[{"BodyRecordUniqueReference":"tok","ExciseProductCode":"toke","CnCode":"tokentok","Quantity":1000,"GrossMass":1000,"NetMass":1000,"AlcoholicStrengthByVolumeInPercentage":1000,"DegreePlato":1000,"FiscalMark":{"value":"token","attributes":{"@language":"to"}},"FiscalMarkUsedFlag":"0","DesignationOfOrigin":{"value":"token","attributes":{"@language":"to"}},"SizeOfProducer":"token","Density":1000,"CommercialDescription":{"value":"token","attributes":{"@language":"to"}},"BrandNameOfProducts":{"value":"token","attributes":{"@language":"to"}},"MaturationPeriodOrAgeOfProducts":{"value":"token","attributes":{}},"PackageValue":[{"KindOfPackages":"to","NumberOfPackages":"token","ShippingMarks":"token","CommercialSealIdentification":"token","SealInformation":{"value":"token","attributes":{"@language":"to"}}}],"WineProduct":{"WineProductCategory":"4","WineGrowingZoneCode":"to","ThirdCountryOfOrigin":"to","OtherInformation":{"value":"token","attributes":{"@language":"to"}},"WineOperation":[{"WineOperationCode":"to"}]}}],"TransportDetails":[{"TransportUnitCode":"to","IdentityOfTransportUnits":"token","CommercialSealIdentification":"token","ComplementaryInformation":{"value":"token","attributes":{"@language":"to"}},"SealInformation":{"value":"token","attributes":{"@language":"to"}}}]}}},"outcome":{"status":"SUCCESS"}}"""
+ """{"messageCode":"IE801","content":{"Header":{"MessageSender":"token","MessageRecipient":"token","DateOfPreparation":"2008-09-29","TimeOfPreparation":"00:18:33","MessageIdentifier":"token","CorrelationIdentifier":"PORTAL6de1b822562c43fb9220d236e487c920"},"Body":{"EADESADContainer":{"ConsigneeTrader":{"Traderid":"token","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","EoriNumber":"token","attributes":{"@language":"to"}},"ExciseMovement":{"AdministrativeReferenceCode":"tokentokentokentokent","DateAndTimeOfValidationOfEadEsad":"2006-08-19T18:27:14+01:00"},"ConsignorTrader":{"TraderExciseNumber":"tokentokentok","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"PlaceOfDispatchTrader":{"ReferenceOfTaxWarehouse":"tokentokentok","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"DispatchImportOffice":{"ReferenceNumber":"tokentok"},"ComplementConsigneeTrader":{"MemberStateCode":"to","SerialNumberOfCertificateOfExemption":"token"},"DeliveryPlaceTrader":{"Traderid":"token","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"DeliveryPlaceCustomsOffice":{"ReferenceNumber":"tokentok"},"CompetentAuthorityDispatchOffice":{"ReferenceNumber":"tokentok"},"TransportArrangerTrader":{"VatNumber":"token","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"FirstTransporterTrader":{"VatNumber":"token","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"DocumentCertificate":[{"DocumentType":"toke","DocumentReference":"token","DocumentDescription":{"value":"token","attributes":{"@language":"to"}},"ReferenceOfDocument":{"value":"token","attributes":{"@language":"to"}}}],"EadEsad":{"LocalReferenceNumber":"token","InvoiceNumber":"token","InvoiceDate":"2009-05-16","OriginTypeCode":"2","DateOfDispatch":"2002-11-05Z","TimeOfDispatch":"16:46:32+01:00","UpstreamArc":"tokentokentokentokent","ImportCustomsDeclaration":[{"ImportCustomsDeclarationNumber":"token"}]},"HeaderEadEsad":{"SequenceNumber":"to","DateAndTimeOfUpdateValidation":"2016-02-20T14:56:29Z","DestinationTypeCode":"7","JourneyTime":"tok","TransportArrangement":"1"},"TransportMode":{"TransportModeCode":"to","ComplementaryInformation":{"value":"token","attributes":{"@language":"to"}}},"MovementGuarantee":{"GuarantorTypeCode":"234","GuarantorTrader":[{"TraderExciseNumber":"tokentokentok","TraderName":"token","StreetName":"token","StreetNumber":"token","City":"token","Postcode":"token","VatNumber":"token","attributes":{"@language":"to"}}]},"BodyEadEsad":[{"BodyRecordUniqueReference":"tok","ExciseProductCode":"toke","CnCode":"tokentok","Quantity":1000,"GrossMass":1000,"NetMass":1000,"AlcoholicStrengthByVolumeInPercentage":1000,"DegreePlato":1000,"FiscalMark":{"value":"token","attributes":{"@language":"to"}},"FiscalMarkUsedFlag":"0","DesignationOfOrigin":{"value":"token","attributes":{"@language":"to"}},"SizeOfProducer":"token","Density":1000,"CommercialDescription":{"value":"token","attributes":{"@language":"to"}},"BrandNameOfProducts":{"value":"token","attributes":{"@language":"to"}},"MaturationPeriodOrAgeOfProducts":{"value":"token","attributes":{}},"PackageValue":[{"KindOfPackages":"to","NumberOfPackages":"token","ShippingMarks":"token","CommercialSealIdentification":"token","SealInformation":{"value":"token","attributes":{"@language":"to"}}}],"WineProduct":{"WineProductCategory":"4","WineGrowingZoneCode":"to","ThirdCountryOfOrigin":"to","OtherInformation":{"value":"token","attributes":{"@language":"to"}},"WineOperation":[{"WineOperationCode":"to"}]}}],"TransportDetails":[{"TransportUnitCode":"to","IdentityOfTransportUnits":"token","CommercialSealIdentification":"token","ComplementaryInformation":{"value":"token","attributes":{"@language":"to"}},"SealInformation":{"value":"token","attributes":{"@language":"to"}}}]}}},"outcome":{"status":"SUCCESS"}}"""
)
override def auditFailure(failureReason: String): JsValue = Json.parse(
- s"""{"messageCode":"IE801","content":{"Header":{"MessageSender":"token","MessageRecipient":"token","DateOfPreparation":"2008-09-29","TimeOfPreparation":"00:18:33","MessageIdentifier":"token","CorrelationIdentifier":"PORTAL6de1b822562c43fb9220d236e487c920"},"Body":{"EADESADContainer":{"ConsigneeTrader":{"Traderid":"token","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","EoriNumber":"token","attributes":{"@language":"to"}},"ExciseMovement":{"AdministrativeReferenceCode":"tokentokentokentokent","DateAndTimeOfValidationOfEadEsad":"2006-08-19T18:27:14+01:00"},"ConsignorTrader":{"TraderExciseNumber":"tokentokentok","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"PlaceOfDispatchTrader":{"ReferenceOfTaxWarehouse":"tokentokentok","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"DispatchImportOffice":{"ReferenceNumber":"tokentok"},"ComplementConsigneeTrader":{"MemberStateCode":"to","SerialNumberOfCertificateOfExemption":"token"},"DeliveryPlaceTrader":{"Traderid":"token","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"DeliveryPlaceCustomsOffice":{"ReferenceNumber":"tokentok"},"CompetentAuthorityDispatchOffice":{"ReferenceNumber":"tokentok"},"TransportArrangerTrader":{"VatNumber":"token","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"FirstTransporterTrader":{"VatNumber":"token","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"DocumentCertificate":[{"DocumentType":"toke","DocumentReference":"token","DocumentDescription":{"value":"token","attributes":{"@language":"to"}},"ReferenceOfDocument":{"value":"token","attributes":{"@language":"to"}}}],"EadEsad":{"LocalReferenceNumber":"token","InvoiceNumber":"token","InvoiceDate":"2009-05-16","OriginTypeCode":"2","DateOfDispatch":"2002-11-05Z","TimeOfDispatch":"16:46:32+01:00","UpstreamArc":"tokentokentokentokent","ImportSad":[{"ImportSadNumber":"token"}]},"HeaderEadEsad":{"SequenceNumber":"to","DateAndTimeOfUpdateValidation":"2016-02-20T14:56:29Z","DestinationTypeCode":"7","JourneyTime":"tok","TransportArrangement":"1"},"TransportMode":{"TransportModeCode":"to","ComplementaryInformation":{"value":"token","attributes":{"@language":"to"}}},"MovementGuarantee":{"GuarantorTypeCode":"234","GuarantorTrader":[{"TraderExciseNumber":"tokentokentok","TraderName":"token","StreetName":"token","StreetNumber":"token","City":"token","Postcode":"token","VatNumber":"token","attributes":{"@language":"to"}}]},"BodyEadEsad":[{"BodyRecordUniqueReference":"tok","ExciseProductCode":"toke","CnCode":"tokentok","Quantity":1000,"GrossMass":1000,"NetMass":1000,"AlcoholicStrengthByVolumeInPercentage":1000,"DegreePlato":1000,"FiscalMark":{"value":"token","attributes":{"@language":"to"}},"FiscalMarkUsedFlag":"0","DesignationOfOrigin":{"value":"token","attributes":{"@language":"to"}},"SizeOfProducer":"token","Density":1000,"CommercialDescription":{"value":"token","attributes":{"@language":"to"}},"BrandNameOfProducts":{"value":"token","attributes":{"@language":"to"}},"MaturationPeriodOrAgeOfProducts":{"value":"token","attributes":{}},"PackageValue":[{"KindOfPackages":"to","NumberOfPackages":"token","ShippingMarks":"token","CommercialSealIdentification":"token","SealInformation":{"value":"token","attributes":{"@language":"to"}}}],"WineProduct":{"WineProductCategory":"4","WineGrowingZoneCode":"to","ThirdCountryOfOrigin":"to","OtherInformation":{"value":"token","attributes":{"@language":"to"}},"WineOperation":[{"WineOperationCode":"to"}]}}],"TransportDetails":[{"TransportUnitCode":"to","IdentityOfTransportUnits":"token","CommercialSealIdentification":"token","ComplementaryInformation":{"value":"token","attributes":{"@language":"to"}},"SealInformation":{"value":"token","attributes":{"@language":"to"}}}]}}},"outcome":{"status":"FAILURE","failureReason":"$failureReason"}}"""
+ s"""{"messageCode":"IE801","content":{"Header":{"MessageSender":"token","MessageRecipient":"token","DateOfPreparation":"2008-09-29","TimeOfPreparation":"00:18:33","MessageIdentifier":"token","CorrelationIdentifier":"PORTAL6de1b822562c43fb9220d236e487c920"},"Body":{"EADESADContainer":{"ConsigneeTrader":{"Traderid":"token","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","EoriNumber":"token","attributes":{"@language":"to"}},"ExciseMovement":{"AdministrativeReferenceCode":"tokentokentokentokent","DateAndTimeOfValidationOfEadEsad":"2006-08-19T18:27:14+01:00"},"ConsignorTrader":{"TraderExciseNumber":"tokentokentok","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"PlaceOfDispatchTrader":{"ReferenceOfTaxWarehouse":"tokentokentok","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"DispatchImportOffice":{"ReferenceNumber":"tokentok"},"ComplementConsigneeTrader":{"MemberStateCode":"to","SerialNumberOfCertificateOfExemption":"token"},"DeliveryPlaceTrader":{"Traderid":"token","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"DeliveryPlaceCustomsOffice":{"ReferenceNumber":"tokentok"},"CompetentAuthorityDispatchOffice":{"ReferenceNumber":"tokentok"},"TransportArrangerTrader":{"VatNumber":"token","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"FirstTransporterTrader":{"VatNumber":"token","TraderName":"token","StreetName":"token","StreetNumber":"token","Postcode":"token","City":"token","attributes":{"@language":"to"}},"DocumentCertificate":[{"DocumentType":"toke","DocumentReference":"token","DocumentDescription":{"value":"token","attributes":{"@language":"to"}},"ReferenceOfDocument":{"value":"token","attributes":{"@language":"to"}}}],"EadEsad":{"LocalReferenceNumber":"token","InvoiceNumber":"token","InvoiceDate":"2009-05-16","OriginTypeCode":"2","DateOfDispatch":"2002-11-05Z","TimeOfDispatch":"16:46:32+01:00","UpstreamArc":"tokentokentokentokent","ImportCustomsDeclaration":[{"ImportCustomsDeclarationNumber":"token"}]},"HeaderEadEsad":{"SequenceNumber":"to","DateAndTimeOfUpdateValidation":"2016-02-20T14:56:29Z","DestinationTypeCode":"7","JourneyTime":"tok","TransportArrangement":"1"},"TransportMode":{"TransportModeCode":"to","ComplementaryInformation":{"value":"token","attributes":{"@language":"to"}}},"MovementGuarantee":{"GuarantorTypeCode":"234","GuarantorTrader":[{"TraderExciseNumber":"tokentokentok","TraderName":"token","StreetName":"token","StreetNumber":"token","City":"token","Postcode":"token","VatNumber":"token","attributes":{"@language":"to"}}]},"BodyEadEsad":[{"BodyRecordUniqueReference":"tok","ExciseProductCode":"toke","CnCode":"tokentok","Quantity":1000,"GrossMass":1000,"NetMass":1000,"AlcoholicStrengthByVolumeInPercentage":1000,"DegreePlato":1000,"FiscalMark":{"value":"token","attributes":{"@language":"to"}},"FiscalMarkUsedFlag":"0","DesignationOfOrigin":{"value":"token","attributes":{"@language":"to"}},"SizeOfProducer":"token","Density":1000,"CommercialDescription":{"value":"token","attributes":{"@language":"to"}},"BrandNameOfProducts":{"value":"token","attributes":{"@language":"to"}},"MaturationPeriodOrAgeOfProducts":{"value":"token","attributes":{}},"PackageValue":[{"KindOfPackages":"to","NumberOfPackages":"token","ShippingMarks":"token","CommercialSealIdentification":"token","SealInformation":{"value":"token","attributes":{"@language":"to"}}}],"WineProduct":{"WineProductCategory":"4","WineGrowingZoneCode":"to","ThirdCountryOfOrigin":"to","OtherInformation":{"value":"token","attributes":{"@language":"to"}},"WineOperation":[{"WineOperationCode":"to"}]}}],"TransportDetails":[{"TransportUnitCode":"to","IdentityOfTransportUnits":"token","CommercialSealIdentification":"token","ComplementaryInformation":{"value":"token","attributes":{"@language":"to"}},"SealInformation":{"value":"token","attributes":{"@language":"to"}}}]}}},"outcome":{"status":"FAILURE","failureReason":"$failureReason"}}"""
)
}
diff --git a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/testObjects/IE815TestMessageType.scala b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/testObjects/IE815TestMessageType.scala
index 52059bae6..7ac77e282 100644
--- a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/testObjects/IE815TestMessageType.scala
+++ b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/testObjects/IE815TestMessageType.scala
@@ -19,9 +19,9 @@ import play.api.libs.json.{JsValue, Json}
object IE815TestMessageType extends TestMessageType {
- override def json1: JsValue = Json.parse("{\"Header\":{\"MessageSender\":\"NDEA.GB\",\"MessageRecipient\":\"NDEA.GB\",\"DateOfPreparation\":\"2023-09-09\",\"TimeOfPreparation\":\"03:22:47\",\"MessageIdentifier\":\"6de1b822562c43fb9220d236e487c920\",\"CorrelationIdentifier\":\"PORTAL6de1b822562c43fb9220d236e487c920\"},\"Body\":{\"SubmittedDraftOfEADESAD\":{\"AttributesValue\":{\"SubmissionMessageType\":\"1\"},\"ConsigneeTrader\":{\"Traderid\":\"GBWKQOZ8OVLYR\",\"TraderName\":\"WFlgUjfC\",\"StreetName\":\"xoL0NsNyDi\",\"StreetNumber\":\"67\",\"Postcode\":\"A1 1AA\",\"City\":\"l8WSaHS9\",\"attributes\":{\"@language\":\"en\"}},\"ConsignorTrader\":{\"TraderExciseNumber\":\"GBWK002281023\",\"TraderName\":\"DIAGEO PLC\",\"StreetName\":\"msfvZUL1Oe\",\"StreetNumber\":\"25\",\"Postcode\":\"A1 1AA\",\"City\":\"QDHwPa61\",\"attributes\":{\"@language\":\"en\"}},\"PlaceOfDispatchTrader\":{\"ReferenceOfTaxWarehouse\":\"GB00DO459DMNX\",\"TraderName\":\"2z0waekA\",\"StreetName\":\"MhO1XtDIVr\",\"StreetNumber\":\"25\",\"Postcode\":\"A1 1AA\",\"City\":\"zPCc6skm\",\"attributes\":{\"@language\":\"en\"}},\"DeliveryPlaceTrader\":{\"Traderid\":\"GB00AIP67RAO3\",\"TraderName\":\"BJpWdv2N\",\"StreetName\":\"C24vvUqCw6\",\"StreetNumber\":\"43\",\"Postcode\":\"A1 1AA\",\"City\":\"A9ZlElxP\",\"attributes\":{\"@language\":\"en\"}},\"CompetentAuthorityDispatchOffice\":{\"ReferenceNumber\":\"GB004098\"},\"FirstTransporterTrader\":{\"VatNumber\":\"123798354\",\"TraderName\":\"Mr Delivery place trader 4\",\"StreetName\":\"Delplace Avenue\",\"StreetNumber\":\"05\",\"Postcode\":\"FR5 4RN\",\"City\":\"Delville\",\"attributes\":{\"@language\":\"en\"}},\"DocumentCertificate\":[{\"DocumentType\":\"9\",\"DocumentReference\":\"DPdQsYktZEJEESpc7b32Ig0U6B34XmHmfZU\"}],\"HeaderEadEsad\":{\"DestinationTypeCode\":\"1\",\"JourneyTime\":\"D07\",\"TransportArrangement\":\"1\"},\"TransportMode\":{\"TransportModeCode\":\"3\"},\"MovementGuarantee\":{\"GuarantorTypeCode\":\"1\",\"GuarantorTrader\":[]},\"BodyEadEsad\":[{\"BodyRecordUniqueReference\":\"1\",\"ExciseProductCode\":\"B000\",\"CnCode\":\"22030001\",\"Quantity\":2000,\"GrossMass\":20000,\"NetMass\":19999,\"AlcoholicStrengthByVolumeInPercentage\":0.5,\"FiscalMarkUsedFlag\":\"0\",\"PackageValue\":[{\"KindOfPackages\":\"BA\",\"NumberOfPackages\":\"2\"}]}],\"EadEsadDraft\":{\"LocalReferenceNumber\":\"LRNQA20230909022221\",\"InvoiceNumber\":\"Test123\",\"InvoiceDate\":\"2023-09-09\",\"OriginTypeCode\":\"1\",\"DateOfDispatch\":\"2023-09-09\",\"TimeOfDispatch\":\"12:00:00\",\"ImportSad\":[]},\"TransportDetails\":[{\"TransportUnitCode\":\"1\",\"IdentityOfTransportUnits\":\"100\"}]}}}")
+ override def json1: JsValue = Json.parse("{\"Header\":{\"MessageSender\":\"NDEA.GB\",\"MessageRecipient\":\"NDEA.GB\",\"DateOfPreparation\":\"2023-09-09\",\"TimeOfPreparation\":\"03:22:47\",\"MessageIdentifier\":\"6de1b822562c43fb9220d236e487c920\",\"CorrelationIdentifier\":\"PORTAL6de1b822562c43fb9220d236e487c920\"},\"Body\":{\"SubmittedDraftOfEADESAD\":{\"AttributesValue\":{\"SubmissionMessageType\":\"1\"},\"ConsigneeTrader\":{\"Traderid\":\"GBWKQOZ8OVLYR\",\"TraderName\":\"WFlgUjfC\",\"StreetName\":\"xoL0NsNyDi\",\"StreetNumber\":\"67\",\"Postcode\":\"A1 1AA\",\"City\":\"l8WSaHS9\",\"attributes\":{\"@language\":\"en\"}},\"ConsignorTrader\":{\"TraderExciseNumber\":\"GBWK002281023\",\"TraderName\":\"DIAGEO PLC\",\"StreetName\":\"msfvZUL1Oe\",\"StreetNumber\":\"25\",\"Postcode\":\"A1 1AA\",\"City\":\"QDHwPa61\",\"attributes\":{\"@language\":\"en\"}},\"PlaceOfDispatchTrader\":{\"ReferenceOfTaxWarehouse\":\"GB00DO459DMNX\",\"TraderName\":\"2z0waekA\",\"StreetName\":\"MhO1XtDIVr\",\"StreetNumber\":\"25\",\"Postcode\":\"A1 1AA\",\"City\":\"zPCc6skm\",\"attributes\":{\"@language\":\"en\"}},\"DeliveryPlaceTrader\":{\"Traderid\":\"GB00AIP67RAO3\",\"TraderName\":\"BJpWdv2N\",\"StreetName\":\"C24vvUqCw6\",\"StreetNumber\":\"43\",\"Postcode\":\"A1 1AA\",\"City\":\"A9ZlElxP\",\"attributes\":{\"@language\":\"en\"}},\"CompetentAuthorityDispatchOffice\":{\"ReferenceNumber\":\"GB004098\"},\"FirstTransporterTrader\":{\"VatNumber\":\"123798354\",\"TraderName\":\"Mr Delivery place trader 4\",\"StreetName\":\"Delplace Avenue\",\"StreetNumber\":\"05\",\"Postcode\":\"FR5 4RN\",\"City\":\"Delville\",\"attributes\":{\"@language\":\"en\"}},\"DocumentCertificate\":[{\"DocumentType\":\"9\",\"DocumentReference\":\"DPdQsYktZEJEESpc7b32Ig0U6B34XmHmfZU\"}],\"HeaderEadEsad\":{\"DestinationTypeCode\":\"1\",\"JourneyTime\":\"D07\",\"TransportArrangement\":\"1\"},\"TransportMode\":{\"TransportModeCode\":\"3\"},\"MovementGuarantee\":{\"GuarantorTypeCode\":\"1\",\"GuarantorTrader\":[]},\"BodyEadEsad\":[{\"BodyRecordUniqueReference\":\"1\",\"ExciseProductCode\":\"B000\",\"CnCode\":\"22030001\",\"Quantity\":2000,\"GrossMass\":20000,\"NetMass\":19999,\"AlcoholicStrengthByVolumeInPercentage\":0.5,\"FiscalMarkUsedFlag\":\"0\",\"PackageValue\":[{\"KindOfPackages\":\"BA\",\"NumberOfPackages\":\"2\"}]}],\"EadEsadDraft\":{\"LocalReferenceNumber\":\"LRNQA20230909022221\",\"InvoiceNumber\":\"Test123\",\"InvoiceDate\":\"2023-09-09\",\"OriginTypeCode\":\"1\",\"DateOfDispatch\":\"2023-09-09\",\"TimeOfDispatch\":\"12:00:00\",\"ImportCustomsDeclaration\":[]},\"TransportDetails\":[{\"TransportUnitCode\":\"1\",\"IdentityOfTransportUnits\":\"100\"}]}}}")
- override def auditEvent: JsValue = Json.parse("""{"messageCode":"IE815","content":{"Header":{"MessageSender":"NDEA.GB","MessageRecipient":"NDEA.GB","DateOfPreparation":"2023-09-09","TimeOfPreparation":"03:22:47","MessageIdentifier":"6de1b822562c43fb9220d236e487c920","CorrelationIdentifier":"PORTAL6de1b822562c43fb9220d236e487c920"},"Body":{"SubmittedDraftOfEADESAD":{"AttributesValue":{"SubmissionMessageType":"1"},"ConsigneeTrader":{"Traderid":"GBWKQOZ8OVLYR","TraderName":"WFlgUjfC","StreetName":"xoL0NsNyDi","StreetNumber":"67","Postcode":"A1 1AA","City":"l8WSaHS9","attributes":{"@language":"en"}},"ConsignorTrader":{"TraderExciseNumber":"GBWK002281023","TraderName":"DIAGEO PLC","StreetName":"msfvZUL1Oe","StreetNumber":"25","Postcode":"A1 1AA","City":"QDHwPa61","attributes":{"@language":"en"}},"PlaceOfDispatchTrader":{"ReferenceOfTaxWarehouse":"GB00DO459DMNX","TraderName":"2z0waekA","StreetName":"MhO1XtDIVr","StreetNumber":"25","Postcode":"A1 1AA","City":"zPCc6skm","attributes":{"@language":"en"}},"DeliveryPlaceTrader":{"Traderid":"GB00AIP67RAO3","TraderName":"BJpWdv2N","StreetName":"C24vvUqCw6","StreetNumber":"43","Postcode":"A1 1AA","City":"A9ZlElxP","attributes":{"@language":"en"}},"CompetentAuthorityDispatchOffice":{"ReferenceNumber":"GB004098"},"FirstTransporterTrader":{"VatNumber":"123798354","TraderName":"Mr Delivery place trader 4","StreetName":"Delplace Avenue","StreetNumber":"05","Postcode":"FR5 4RN","City":"Delville","attributes":{"@language":"en"}},"DocumentCertificate":[{"DocumentType":"9","DocumentReference":"DPdQsYktZEJEESpc7b32Ig0U6B34XmHmfZU"}],"HeaderEadEsad":{"DestinationTypeCode":"1","JourneyTime":"D07","TransportArrangement":"1"},"TransportMode":{"TransportModeCode":"3"},"MovementGuarantee":{"GuarantorTypeCode":"1","GuarantorTrader":[]},"BodyEadEsad":[{"BodyRecordUniqueReference":"1","ExciseProductCode":"B000","CnCode":"22030001","Quantity":2000,"GrossMass":20000,"NetMass":19999,"AlcoholicStrengthByVolumeInPercentage":0.5,"FiscalMarkUsedFlag":"0","PackageValue":[{"KindOfPackages":"BA","NumberOfPackages":"2"}]}],"EadEsadDraft":{"LocalReferenceNumber":"LRNQA20230909022221","InvoiceNumber":"Test123","InvoiceDate":"2023-09-09","OriginTypeCode":"1","DateOfDispatch":"2023-09-09","TimeOfDispatch":"12:00:00","ImportSad":[]},"TransportDetails":[{"TransportUnitCode":"1","IdentityOfTransportUnits":"100"}]}}},"outcome":{"status":"SUCCESS"}}""")
+ override def auditEvent: JsValue = Json.parse("""{"messageCode":"IE815","content":{"Header":{"MessageSender":"NDEA.GB","MessageRecipient":"NDEA.GB","DateOfPreparation":"2023-09-09","TimeOfPreparation":"03:22:47","MessageIdentifier":"6de1b822562c43fb9220d236e487c920","CorrelationIdentifier":"PORTAL6de1b822562c43fb9220d236e487c920"},"Body":{"SubmittedDraftOfEADESAD":{"AttributesValue":{"SubmissionMessageType":"1"},"ConsigneeTrader":{"Traderid":"GBWKQOZ8OVLYR","TraderName":"WFlgUjfC","StreetName":"xoL0NsNyDi","StreetNumber":"67","Postcode":"A1 1AA","City":"l8WSaHS9","attributes":{"@language":"en"}},"ConsignorTrader":{"TraderExciseNumber":"GBWK002281023","TraderName":"DIAGEO PLC","StreetName":"msfvZUL1Oe","StreetNumber":"25","Postcode":"A1 1AA","City":"QDHwPa61","attributes":{"@language":"en"}},"PlaceOfDispatchTrader":{"ReferenceOfTaxWarehouse":"GB00DO459DMNX","TraderName":"2z0waekA","StreetName":"MhO1XtDIVr","StreetNumber":"25","Postcode":"A1 1AA","City":"zPCc6skm","attributes":{"@language":"en"}},"DeliveryPlaceTrader":{"Traderid":"GB00AIP67RAO3","TraderName":"BJpWdv2N","StreetName":"C24vvUqCw6","StreetNumber":"43","Postcode":"A1 1AA","City":"A9ZlElxP","attributes":{"@language":"en"}},"CompetentAuthorityDispatchOffice":{"ReferenceNumber":"GB004098"},"FirstTransporterTrader":{"VatNumber":"123798354","TraderName":"Mr Delivery place trader 4","StreetName":"Delplace Avenue","StreetNumber":"05","Postcode":"FR5 4RN","City":"Delville","attributes":{"@language":"en"}},"DocumentCertificate":[{"DocumentType":"9","DocumentReference":"DPdQsYktZEJEESpc7b32Ig0U6B34XmHmfZU"}],"HeaderEadEsad":{"DestinationTypeCode":"1","JourneyTime":"D07","TransportArrangement":"1"},"TransportMode":{"TransportModeCode":"3"},"MovementGuarantee":{"GuarantorTypeCode":"1","GuarantorTrader":[]},"BodyEadEsad":[{"BodyRecordUniqueReference":"1","ExciseProductCode":"B000","CnCode":"22030001","Quantity":2000,"GrossMass":20000,"NetMass":19999,"AlcoholicStrengthByVolumeInPercentage":0.5,"FiscalMarkUsedFlag":"0","PackageValue":[{"KindOfPackages":"BA","NumberOfPackages":"2"}]}],"EadEsadDraft":{"LocalReferenceNumber":"LRNQA20230909022221","InvoiceNumber":"Test123","InvoiceDate":"2023-09-09","OriginTypeCode":"1","DateOfDispatch":"2023-09-09","TimeOfDispatch":"12:00:00","ImportCustomsDeclaration":[]},"TransportDetails":[{"TransportUnitCode":"1","IdentityOfTransportUnits":"100"}]}}},"outcome":{"status":"SUCCESS"}}""")
- override def auditFailure(failureReason: String): JsValue = Json.parse(s"""{"messageCode":"IE815","content":{"Header":{"MessageSender":"NDEA.GB","MessageRecipient":"NDEA.GB","DateOfPreparation":"2023-09-09","TimeOfPreparation":"03:22:47","MessageIdentifier":"6de1b822562c43fb9220d236e487c920","CorrelationIdentifier":"PORTAL6de1b822562c43fb9220d236e487c920"},"Body":{"SubmittedDraftOfEADESAD":{"AttributesValue":{"SubmissionMessageType":"1"},"ConsigneeTrader":{"Traderid":"GBWKQOZ8OVLYR","TraderName":"WFlgUjfC","StreetName":"xoL0NsNyDi","StreetNumber":"67","Postcode":"A1 1AA","City":"l8WSaHS9","attributes":{"@language":"en"}},"ConsignorTrader":{"TraderExciseNumber":"GBWK002281023","TraderName":"DIAGEO PLC","StreetName":"msfvZUL1Oe","StreetNumber":"25","Postcode":"A1 1AA","City":"QDHwPa61","attributes":{"@language":"en"}},"PlaceOfDispatchTrader":{"ReferenceOfTaxWarehouse":"GB00DO459DMNX","TraderName":"2z0waekA","StreetName":"MhO1XtDIVr","StreetNumber":"25","Postcode":"A1 1AA","City":"zPCc6skm","attributes":{"@language":"en"}},"DeliveryPlaceTrader":{"Traderid":"GB00AIP67RAO3","TraderName":"BJpWdv2N","StreetName":"C24vvUqCw6","StreetNumber":"43","Postcode":"A1 1AA","City":"A9ZlElxP","attributes":{"@language":"en"}},"CompetentAuthorityDispatchOffice":{"ReferenceNumber":"GB004098"},"FirstTransporterTrader":{"VatNumber":"123798354","TraderName":"Mr Delivery place trader 4","StreetName":"Delplace Avenue","StreetNumber":"05","Postcode":"FR5 4RN","City":"Delville","attributes":{"@language":"en"}},"DocumentCertificate":[{"DocumentType":"9","DocumentReference":"DPdQsYktZEJEESpc7b32Ig0U6B34XmHmfZU"}],"HeaderEadEsad":{"DestinationTypeCode":"1","JourneyTime":"D07","TransportArrangement":"1"},"TransportMode":{"TransportModeCode":"3"},"MovementGuarantee":{"GuarantorTypeCode":"1","GuarantorTrader":[]},"BodyEadEsad":[{"BodyRecordUniqueReference":"1","ExciseProductCode":"B000","CnCode":"22030001","Quantity":2000,"GrossMass":20000,"NetMass":19999,"AlcoholicStrengthByVolumeInPercentage":0.5,"FiscalMarkUsedFlag":"0","PackageValue":[{"KindOfPackages":"BA","NumberOfPackages":"2"}]}],"EadEsadDraft":{"LocalReferenceNumber":"LRNQA20230909022221","InvoiceNumber":"Test123","InvoiceDate":"2023-09-09","OriginTypeCode":"1","DateOfDispatch":"2023-09-09","TimeOfDispatch":"12:00:00","ImportSad":[]},"TransportDetails":[{"TransportUnitCode":"1","IdentityOfTransportUnits":"100"}]}}},"outcome":{"status":"FAILURE","failureReason":"$failureReason"}}""")
+ override def auditFailure(failureReason: String): JsValue = Json.parse(s"""{"messageCode":"IE815","content":{"Header":{"MessageSender":"NDEA.GB","MessageRecipient":"NDEA.GB","DateOfPreparation":"2023-09-09","TimeOfPreparation":"03:22:47","MessageIdentifier":"6de1b822562c43fb9220d236e487c920","CorrelationIdentifier":"PORTAL6de1b822562c43fb9220d236e487c920"},"Body":{"SubmittedDraftOfEADESAD":{"AttributesValue":{"SubmissionMessageType":"1"},"ConsigneeTrader":{"Traderid":"GBWKQOZ8OVLYR","TraderName":"WFlgUjfC","StreetName":"xoL0NsNyDi","StreetNumber":"67","Postcode":"A1 1AA","City":"l8WSaHS9","attributes":{"@language":"en"}},"ConsignorTrader":{"TraderExciseNumber":"GBWK002281023","TraderName":"DIAGEO PLC","StreetName":"msfvZUL1Oe","StreetNumber":"25","Postcode":"A1 1AA","City":"QDHwPa61","attributes":{"@language":"en"}},"PlaceOfDispatchTrader":{"ReferenceOfTaxWarehouse":"GB00DO459DMNX","TraderName":"2z0waekA","StreetName":"MhO1XtDIVr","StreetNumber":"25","Postcode":"A1 1AA","City":"zPCc6skm","attributes":{"@language":"en"}},"DeliveryPlaceTrader":{"Traderid":"GB00AIP67RAO3","TraderName":"BJpWdv2N","StreetName":"C24vvUqCw6","StreetNumber":"43","Postcode":"A1 1AA","City":"A9ZlElxP","attributes":{"@language":"en"}},"CompetentAuthorityDispatchOffice":{"ReferenceNumber":"GB004098"},"FirstTransporterTrader":{"VatNumber":"123798354","TraderName":"Mr Delivery place trader 4","StreetName":"Delplace Avenue","StreetNumber":"05","Postcode":"FR5 4RN","City":"Delville","attributes":{"@language":"en"}},"DocumentCertificate":[{"DocumentType":"9","DocumentReference":"DPdQsYktZEJEESpc7b32Ig0U6B34XmHmfZU"}],"HeaderEadEsad":{"DestinationTypeCode":"1","JourneyTime":"D07","TransportArrangement":"1"},"TransportMode":{"TransportModeCode":"3"},"MovementGuarantee":{"GuarantorTypeCode":"1","GuarantorTrader":[]},"BodyEadEsad":[{"BodyRecordUniqueReference":"1","ExciseProductCode":"B000","CnCode":"22030001","Quantity":2000,"GrossMass":20000,"NetMass":19999,"AlcoholicStrengthByVolumeInPercentage":0.5,"FiscalMarkUsedFlag":"0","PackageValue":[{"KindOfPackages":"BA","NumberOfPackages":"2"}]}],"EadEsadDraft":{"LocalReferenceNumber":"LRNQA20230909022221","InvoiceNumber":"Test123","InvoiceDate":"2023-09-09","OriginTypeCode":"1","DateOfDispatch":"2023-09-09","TimeOfDispatch":"12:00:00","ImportCustomsDeclaration":[]},"TransportDetails":[{"TransportUnitCode":"1","IdentityOfTransportUnits":"100"}]}}},"outcome":{"status":"FAILURE","failureReason":"$failureReason"}}""")
}
diff --git a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/testObjects/IE829TestMessageType.scala b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/testObjects/IE829TestMessageType.scala
index 4832b5736..114eebbb3 100644
--- a/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/testObjects/IE829TestMessageType.scala
+++ b/it/test/uk/gov/hmrc/excisemovementcontrolsystemapi/writes/testObjects/IE829TestMessageType.scala
@@ -41,12 +41,10 @@ object IE829TestMessageType extends TestMessageType {
| "ExciseMovementEad": [
| {
| "AdministrativeReferenceCode": "23XI00000000000056339",
- | "ExportDeclarationAcceptanceOrGoodsReleasedForExport": "1",
| "SequenceNumber": "1"
| },
| {
| "AdministrativeReferenceCode": "23XI00000000000056340",
- | "ExportDeclarationAcceptanceOrGoodsReleasedForExport": "1",
| "SequenceNumber": "1"
| }
| ],
@@ -55,7 +53,8 @@ object IE829TestMessageType extends TestMessageType {
| "DateOfRelease": "2002-11-05Z",
| "DocumentReferenceNumber": "token",
| "IdentificationOfSenderCustomsOfficer": "token",
- | "ReferenceNumberOfSenderCustomsOffice": "tokentok"
+ | "ReferenceNumberOfSenderCustomsOffice": "tokentok",
+ | "ExportDeclarationAcceptanceOrGoodsReleasedForExport": "1"
| },
| "ExportPlaceCustomsOffice": {
| "ReferenceNumber": "tokentok"
@@ -105,13 +104,11 @@ object IE829TestMessageType extends TestMessageType {
| "ExciseMovementEad": [
| {
| "AdministrativeReferenceCode": "23XI00000000000056339",
- | "SequenceNumber": "1",
- | "ExportDeclarationAcceptanceOrGoodsReleasedForExport": "1"
+ | "SequenceNumber": "1"
| },
| {
| "AdministrativeReferenceCode": "23XI00000000000056340",
- | "SequenceNumber": "1",
- | "ExportDeclarationAcceptanceOrGoodsReleasedForExport": "1"
+ | "SequenceNumber": "1"
| }
| ],
| "ExportPlaceCustomsOffice": {
@@ -122,7 +119,8 @@ object IE829TestMessageType extends TestMessageType {
| "IdentificationOfSenderCustomsOfficer": "token",
| "DateOfAcceptance": "2013-05-22+01:00",
| "DateOfRelease": "2002-11-05Z",
- | "DocumentReferenceNumber": "token"
+ | "DocumentReferenceNumber": "token",
+ | "ExportDeclarationAcceptanceOrGoodsReleasedForExport": "1"
| }
| }
| }
@@ -164,13 +162,11 @@ object IE829TestMessageType extends TestMessageType {
| "ExciseMovementEad": [
| {
| "AdministrativeReferenceCode": "23XI00000000000056339",
- | "SequenceNumber": "1",
- | "ExportDeclarationAcceptanceOrGoodsReleasedForExport": "1"
+ | "SequenceNumber": "1"
| },
| {
| "AdministrativeReferenceCode": "23XI00000000000056340",
- | "SequenceNumber": "1",
- | "ExportDeclarationAcceptanceOrGoodsReleasedForExport": "1"
+ | "SequenceNumber": "1"
| }
| ],
| "ExportPlaceCustomsOffice": {
@@ -181,7 +177,8 @@ object IE829TestMessageType extends TestMessageType {
| "IdentificationOfSenderCustomsOfficer": "token",
| "DateOfAcceptance": "2013-05-22+01:00",
| "DateOfRelease": "2002-11-05Z",
- | "DocumentReferenceNumber": "token"
+ | "DocumentReferenceNumber": "token",
+ | "ExportDeclarationAcceptanceOrGoodsReleasedForExport": "1"
| }
| }
| }
diff --git a/project/CodeCoverageSettings.scala b/project/CodeCoverageSettings.scala
index 8da2ba2e5..7bcaf0714 100755
--- a/project/CodeCoverageSettings.scala
+++ b/project/CodeCoverageSettings.scala
@@ -17,7 +17,7 @@ object CodeCoverageSettings {
val settings: Seq[Setting[_]] = Seq(
ScoverageKeys.coverageExcludedPackages := excludedPackages.mkString(";"),
- ScoverageKeys.coverageMinimumStmtTotal := 70,
+ ScoverageKeys.coverageMinimumStmtTotal := 90,
ScoverageKeys.coverageFailOnMinimum := true,
ScoverageKeys.coverageHighlighting := true
)
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/EISSubmissionConnectorSpec.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/EISSubmissionConnectorSpec.scala
index 754198012..69bc64b16 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/EISSubmissionConnectorSpec.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/connectors/EISSubmissionConnectorSpec.scala
@@ -34,7 +34,6 @@ import uk.gov.hmrc.excisemovementcontrolsystemapi.fixture.{EISHeaderTestSupport,
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.EISErrorResponseDetails
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.eis.{EISErrorResponse, EISSubmissionResponse}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1._
import uk.gov.hmrc.excisemovementcontrolsystemapi.services.HttpHeader
import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.{DateTimeService, EmcsUtils}
import uk.gov.hmrc.http.client.{HttpClientV2, RequestBuilder}
@@ -88,7 +87,7 @@ class EISSubmissionConnectorSpec
private val timerContext = mock[Timer.Context]
- private val IE815MessageV1 = mock[IE815MessageV1]
+ private val ie815Message = mock[IE815Message]
private val submissionBearerToken = "submissionBearerToken"
private val ern = "123"
@@ -116,10 +115,10 @@ class EISSubmissionConnectorSpec
when(appConfig.emcsReceiverMessageUrl).thenReturn("http://localhost:8080/eis/path")
when(appConfig.submissionBearerToken).thenReturn(submissionBearerToken)
when(metrics.timer(any).time()) thenReturn timerContext
- when(IE815MessageV1.messageType).thenReturn("IE815")
- when(IE815MessageV1.consignorId).thenReturn(Some(ern))
+ when(ie815Message.messageType).thenReturn("IE815")
+ when(ie815Message.consignorId).thenReturn(Some(ern))
when(emcsUtils.encode(any)).thenReturn("encode-message")
- when(IE815MessageV1.messageIdentifier).thenReturn("DummyIdentifier")
+ when(ie815Message.messageIdentifier).thenReturn("DummyIdentifier")
}
@@ -131,13 +130,13 @@ class EISSubmissionConnectorSpec
}
"get URL from appConfig" in {
- submitExciseMovementWithParams(xml, IE815MessageV1, ern)
+ submitExciseMovementWithParams(xml, ie815Message, ern)
verify(appConfig).emcsReceiverMessageUrl
}
"wrap the xml in the control document" in {
- submitExciseMovementWithParams(xml, IE815MessageV1, ern)
+ submitExciseMovementWithParams(xml, ie815Message, ern)
val captor = ArgCaptor[String]
verify(emcsUtils).encode(captor.capture)
@@ -234,7 +233,7 @@ class EISSubmissionConnectorSpec
}
private def submitExciseMovementForIE815: Future[Either[EISErrorResponseDetails, EISSubmissionResponse]] =
- submitExciseMovementWithParams(xml, IE815MessageV1, ern)
+ submitExciseMovementWithParams(xml, ie815Message, ern)
private def submitExciseMovementWithParams(
xml: NodeSeq,
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/AdminDetailsControllerSpec.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/AdminDetailsControllerSpec.scala
index 95b818f03..dc58af260 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/AdminDetailsControllerSpec.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/AdminDetailsControllerSpec.scala
@@ -29,8 +29,8 @@ import play.api.libs.json.Json
import play.api.mvc.Result
import play.api.test.Helpers._
import play.api.test.{FakeRequest, Helpers}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.{MovementRepository, TransformLogRepository}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Message, Movement, TransformLog}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.MovementRepository
+import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Message, Movement}
import uk.gov.hmrc.internalauth.client._
import uk.gov.hmrc.internalauth.client.test.{BackendAuthComponentsStub, StubBehaviour}
@@ -39,9 +39,8 @@ import scala.concurrent.{ExecutionContext, Future}
class AdminDetailsControllerSpec extends PlaySpec with GuiceOneAppPerSuite with BeforeAndAfterEach {
- private val mockStubBehaviour = mock[StubBehaviour]
- private val mockMovementRepository = mock[MovementRepository]
- private val mockTransformLogRepository = mock[TransformLogRepository]
+ private val mockStubBehaviour = mock[StubBehaviour]
+ private val mockMovementRepository = mock[MovementRepository]
val backendAuthComponentsStub: BackendAuthComponents =
BackendAuthComponentsStub(mockStubBehaviour)(Helpers.stubControllerComponents(), ExecutionContext.global)
@@ -50,8 +49,7 @@ class AdminDetailsControllerSpec extends PlaySpec with GuiceOneAppPerSuite with
new GuiceApplicationBuilder()
.overrides(
bind[BackendAuthComponents].toInstance(backendAuthComponentsStub),
- bind[MovementRepository].toInstance(mockMovementRepository),
- bind[TransformLogRepository].toInstance(mockTransformLogRepository)
+ bind[MovementRepository].toInstance(mockMovementRepository)
)
.build()
@@ -118,55 +116,4 @@ class AdminDetailsControllerSpec extends PlaySpec with GuiceOneAppPerSuite with
}
}
- "getTransformLogDetails" must {
- "return OK with a json payload of transform log details as expected for an existing id" in {
- val testErn = "apples"
- val timestamp = Instant.now()
-
- val transformLog = TransformLog(
- "testId",
- isTransformSuccess = true,
- Nil,
- timestamp,
- timestamp,
- 2
- )
-
- when(mockStubBehaviour.stubAuth(Some(expectedPredicate), Retrieval.EmptyRetrieval))
- .thenReturn(Future.successful(()))
-
- when(mockTransformLogRepository.findLog(any[String]))
- .thenReturn(Future.successful(Some(transformLog)))
-
- val expectedResult = transformLog
-
- val fakeRequest =
- FakeRequest(routes.AdminDetailsController.getTransformLogDetails("testId"))
- .withHeaders("Authorization" -> "Token some-token")
-
- val result: Future[Result] = route(app, fakeRequest).value
-
- contentAsJson(result) mustBe Json.toJson(expectedResult)
- status(result) mustBe OK
- }
-
- "return NotFound transform log for the movementntId" in {
-
- when(mockStubBehaviour.stubAuth(Some(expectedPredicate), Retrieval.EmptyRetrieval))
- .thenReturn(Future.successful(()))
-
- when(mockTransformLogRepository.findLog(any[String]))
- .thenReturn(Future.successful(None))
-
- val fakeRequest =
- FakeRequest(routes.AdminDetailsController.getTransformLogDetails("testId"))
- .withHeaders("Authorization" -> "Token some-token")
-
- val result: Future[Result] = route(app, fakeRequest).value
-
- contentAsString(result) mustBe s"No Transform Log Found with id: testId"
- status(result) mustBe NOT_FOUND
- }
- }
-
}
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/DraftExciseMovementControllerSpec.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/DraftExciseMovementControllerSpec.scala
index b4924c6bc..0f9af8bb5 100755
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/DraftExciseMovementControllerSpec.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/DraftExciseMovementControllerSpec.scala
@@ -35,8 +35,7 @@ import uk.gov.hmrc.excisemovementcontrolsystemapi.data.TestXml
import uk.gov.hmrc.excisemovementcontrolsystemapi.fixture.{FakeAuthentication, FakeXmlParsers}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auth.ParsedXmlRequest
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.eis.EISSubmissionResponse
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.{IE815MessageV1, IE818MessageV1}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{IE815Message, IE818Message, IEMessage}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.validation.{MessageIdentifierIsUnauthorised, MessageValidation}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.{EISErrorResponseDetails, MessageTypes}
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.Movement
@@ -63,7 +62,7 @@ class DraftExciseMovementControllerSpec
private val movementService = mock[MovementService]
private val cc = stubControllerComponents()
private val request = createRequestWithClientId
- private val mockIeMessage = mock[IE815MessageV1]
+ private val mockIeMessage = mock[IE815Message]
private val boxIdRepository = mock[BoxIdRepository]
private val ernSubmissionRepository = mock[ErnSubmissionRepository]
private val notificationService = mock[PushNotificationService]
@@ -93,7 +92,7 @@ class DraftExciseMovementControllerSpec
when(notificationService.getBoxId(any, any)(any))
.thenReturn(Future.successful(Right(defaultBoxId)))
- when(messageValidation.validateDraftMovement(any, any[IE815MessageV1])).thenReturn(Right(consignorId))
+ when(messageValidation.validateDraftMovement(any, any)).thenReturn(Right(consignorId))
when(dateTimeService.timestamp()).thenReturn(timestamp)
when(mockIeMessage.consigneeId).thenReturn(Some("789"))
@@ -211,10 +210,7 @@ class DraftExciseMovementControllerSpec
//old auditing:
verify(auditService, times(1)).auditMessage(any, any)(any)
//new auditing:
- verify(auditService, times(1))
- .messageSubmittedNoMovement(any[IE815MessageV1], any, eqTo(Some("correlationId")), any)(
- any
- )
+ verify(auditService, times(1)).messageSubmittedNoMovement(any, any, eqTo(Some("correlationId")), any)(any)
}
@@ -227,10 +223,7 @@ class DraftExciseMovementControllerSpec
//old auditing:
verify(auditService, times(1)).auditMessage(any, any)(any)
//new auditing:
- verify(auditService, times(1))
- .messageSubmittedNoMovement(any[IE815MessageV1], any, eqTo(Some("correlationId")), any)(
- any
- )
+ verify(auditService, times(1)).messageSubmittedNoMovement(any, any, eqTo(Some("correlationId")), any)(any)
}
"adds the boxId to the BoxIdRepository for consignor" in {
@@ -264,8 +257,7 @@ class DraftExciseMovementControllerSpec
"The Consignor is not authorised to submit this message for the movement"
)
- when(messageValidation.validateDraftMovement(any, any[IE815MessageV1]))
- .thenReturn(Left(TestMessageIdentifierIsUnauthorised))
+ when(messageValidation.validateDraftMovement(any, any)).thenReturn(Left(TestMessageIdentifierIsUnauthorised))
when(messageValidation.convertErrorToResponse(eqTo(TestMessageIdentifierIsUnauthorised), eqTo(timestamp)))
.thenReturn(Forbidden(Json.toJson(expectedError)))
@@ -353,13 +345,13 @@ class DraftExciseMovementControllerSpec
private def createWithWrongMessageType = {
- val mockIE818MessageV1 = mock[IE818MessageV1]
+ val mockIe818Message = mock[IE818Message]
- when(mockIE818MessageV1.messageType).thenReturn(MessageTypes.IE818.value)
+ when(mockIe818Message.messageType).thenReturn(MessageTypes.IE818.value)
- new DraftExciseMovementControllerV1(
+ new DraftExciseMovementController(
FakeSuccessAuthentication(Set(ern)),
- FakeSuccessXMLParser(mockIE818MessageV1),
+ FakeSuccessXMLParser(mockIe818Message),
movementService,
submissionMessageService,
notificationService,
@@ -374,7 +366,7 @@ class DraftExciseMovementControllerSpec
}
private def createWithAuthActionFailure =
- new DraftExciseMovementControllerV1(
+ new DraftExciseMovementController(
FakeFailingAuthentication,
FakeSuccessXMLParser(mockIeMessage),
movementService,
@@ -390,7 +382,7 @@ class DraftExciseMovementControllerSpec
)
private def createWithFailingXmlParserAction =
- new DraftExciseMovementControllerV1(
+ new DraftExciseMovementController(
FakeSuccessAuthentication(Set(ern)),
FakeFailureXMLParser,
movementService,
@@ -406,7 +398,7 @@ class DraftExciseMovementControllerSpec
)
private def createWithSuccessfulAuth =
- new DraftExciseMovementControllerV1(
+ new DraftExciseMovementController(
FakeSuccessAuthentication(Set(ern)),
FakeSuccessXMLParser(mockIeMessage),
movementService,
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/DraftExciseMovementControllerV2Spec.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/DraftExciseMovementControllerV2Spec.scala
deleted file mode 100755
index bdb89a516..000000000
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/DraftExciseMovementControllerV2Spec.scala
+++ /dev/null
@@ -1,449 +0,0 @@
-/*
- * Copyright 2025 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.controllers
-
-import cats.data.EitherT
-import org.apache.pekko.Done
-import org.mockito.ArgumentMatchersSugar.{any, eqTo}
-import org.mockito.MockitoSugar.{reset, times, verify, verifyZeroInteractions, when}
-import org.mockito.captor.ArgCaptor
-import org.scalatest.{BeforeAndAfterEach, EitherValues}
-import org.scalatestplus.mockito.MockitoSugar.mock
-import org.scalatestplus.play.PlaySpec
-import play.api.http.HeaderNames
-import play.api.libs.json.Json
-import play.api.mvc.Results.{BadRequest, Forbidden, InternalServerError}
-import play.api.test.Helpers._
-import play.api.test.{FakeHeaders, FakeRequest}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.config.AppConfig
-import uk.gov.hmrc.excisemovementcontrolsystemapi.controllers.actions.CorrelationIdAction
-import uk.gov.hmrc.excisemovementcontrolsystemapi.data.TestXml
-import uk.gov.hmrc.excisemovementcontrolsystemapi.fixture.{FakeAuthentication, FakeXmlParsers}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auth.ParsedXmlRequest
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.eis.EISSubmissionResponse
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2.{IE815MessageV2, IE818MessageV2}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.validation.{MessageIdentifierIsUnauthorised, MessageValidation}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.{EISErrorResponseDetails, MessageTypes}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.Movement
-import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.{BoxIdRepository, ErnSubmissionRepository}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.services._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.DateTimeService
-
-import java.time.Instant
-import scala.concurrent.{ExecutionContext, Future}
-import scala.xml.Elem
-
-class DraftExciseMovementControllerV2Spec
- extends PlaySpec
- with FakeAuthentication
- with FakeXmlParsers
- with TestXml
- with BeforeAndAfterEach
- with EitherValues {
-
- implicit val ec: ExecutionContext = ExecutionContext.Implicits.global
-
- private val submissionMessageService = mock[SubmissionMessageService]
- private val correlationIdAction = new CorrelationIdAction()
- private val movementService = mock[MovementService]
- private val cc = stubControllerComponents()
- private val request = createRequestWithClientId
- private val mockIeMessage = mock[IE815MessageV2]
- private val boxIdRepository = mock[BoxIdRepository]
- private val ernSubmissionRepository = mock[ErnSubmissionRepository]
- private val notificationService = mock[PushNotificationService]
- private val messageValidation = mock[MessageValidation]
- private val dateTimeService = mock[DateTimeService]
- private val auditService = mock[AuditService]
- private val appConfig = mock[AppConfig]
- private val consignorId = "456"
- private val timestamp = Instant.parse("2024-05-06T15:30:15.12345612Z")
- private val defaultBoxId = "boxId"
- private val clientBoxId = "clientBoxId"
-
- override def beforeEach(): Unit = {
- super.beforeEach()
- reset(
- submissionMessageService,
- movementService,
- submissionMessageService,
- notificationService,
- auditService,
- boxIdRepository,
- ernSubmissionRepository
- )
-
- when(submissionMessageService.submit(any, any)(any))
- .thenReturn(Future.successful(Right(EISSubmissionResponse("ok", "success", "123"))))
- when(notificationService.getBoxId(any, any)(any))
- .thenReturn(Future.successful(Right(defaultBoxId)))
-
- when(messageValidation.validateDraftMovement(any, any[IE815MessageV2])).thenReturn(Right(consignorId))
- when(dateTimeService.timestamp()).thenReturn(timestamp)
-
- when(mockIeMessage.consigneeId).thenReturn(Some("789"))
- when(mockIeMessage.consignorId).thenReturn(Some(consignorId))
- when(mockIeMessage.localReferenceNumber).thenReturn("123")
- when(mockIeMessage.correlationId).thenReturn(Some("correlationId"))
-
- when(appConfig.pushNotificationsEnabled).thenReturn(true)
- when(dateTimeService.timestamp()).thenReturn(timestamp)
- when(auditService.auditMessage(any[IEMessage])(any)).thenReturn(EitherT.fromEither(Right(())))
- when(ernSubmissionRepository.save(any)).thenReturn(Future.successful(Done))
- }
-
- def createTestError(status: Int) = EISErrorResponseDetails(status, timestamp, "", "", "", None)
-
- "submit" should {
-
- "return 202" when {
-
- "push pull notifications feature flag is enabled" in {
- when(movementService.getDraftMovementOrSaveNew(any)(any))
- .thenReturn(
- Future.successful(Right(Movement(Some(defaultBoxId), "123", consignorId, Some("789"), None, Instant.now)))
- )
-
- val result = createWithSuccessfulAuth.submit(request)
-
- status(result) mustBe ACCEPTED
-
- withClue("submit the message") {
- val captor = ArgCaptor[ParsedXmlRequest[_]]
- verify(submissionMessageService).submit(captor.capture, any)(any)
- captor.value.ieMessage mustBe mockIeMessage
- }
-
- withClue("should get the box id") {
- verify(notificationService).getBoxId(eqTo("clientId"), eqTo(None))(any)
- }
-
- withClue("should save the new movement") {
- val captor = ArgCaptor[Movement]
- verify(movementService).getDraftMovementOrSaveNew(captor.capture)(any)
- val newMovement = captor.value
- newMovement.localReferenceNumber mustBe "123"
- newMovement.consignorId mustBe consignorId
- newMovement.consigneeId mustBe Some("789")
- newMovement.administrativeReferenceCode mustBe None
- newMovement.messages mustBe Seq.empty
- newMovement.boxId mustBe Some(defaultBoxId)
- }
- }
-
- "push pull notifications feature flag is disabled" in {
- when(appConfig.pushNotificationsEnabled).thenReturn(false)
-
- when(movementService.getDraftMovementOrSaveNew(any)(any))
- .thenReturn(
- Future.successful(Right(Movement(Some(defaultBoxId), "123", consignorId, Some("789"), None, Instant.now)))
- )
-
- val result = createWithSuccessfulAuth.submit(request)
-
- status(result) mustBe ACCEPTED
-
- withClue("should not access the notification service") {
- verify(notificationService, times(0)).getBoxId(any, any)(any)
- }
-
- withClue("should save the new movement with no box id") {
- val captor = ArgCaptor[Movement]
- verify(movementService).getDraftMovementOrSaveNew(captor.capture)(any)
- val newMovement = captor.value
- newMovement.boxId mustBe None
- }
-
- }
- }
-
- "pass the Client Box id to notification service when is present" in {
- when(movementService.getDraftMovementOrSaveNew(any)(any))
- .thenReturn(
- Future.successful(Right(Movement(Some(defaultBoxId), "123", consignorId, Some("789"), None, Instant.now)))
- )
-
- val result = createWithSuccessfulAuth.submit(createRequestWithClientBoxId)
-
- status(result) mustBe ACCEPTED
- verify(notificationService).getBoxId(eqTo("clientId"), eqTo(Some(clientBoxId)))(any)
- }
-
- "sends expected audit events" in {
- when(movementService.getDraftMovementOrSaveNew(any)(any))
- .thenReturn(
- Future.successful(Right(Movement(Some(defaultBoxId), "123", consignorId, Some("789"), None, Instant.now)))
- )
- when(appConfig.oldAuditingEnabled).thenReturn(true)
- when(auditService.auditMessage(any[IEMessage])(any)).thenReturn(EitherT.fromEither(Right(())))
-
- await(createWithSuccessfulAuth.submit(request))
-
- //old auditing:
- verify(auditService, times(1)).auditMessage(any[IEMessage])(any)
- //new auditing:
- verify(auditService, times(1)).messageSubmitted(any, any, eqTo(Some("correlationId")), any)(any)
-
- }
-
- "sends failed audits when a message isn't submitted" in {
- when(submissionMessageService.submit(any, any)(any))
- .thenReturn(Future.successful(Left(createTestError(BAD_REQUEST))))
- when(appConfig.oldAuditingEnabled).thenReturn(true)
-
- await(createWithSuccessfulAuth.submit(request))
-
- //old auditing:
- verify(auditService, times(1)).auditMessage(any, any)(any)
- //new auditing:
- verify(auditService, times(1))
- .messageSubmittedNoMovement(any[IE815MessageV2], any, eqTo(Some("correlationId")), any)(
- any
- )
-
- }
-
- "sends failure audits when a message submits but doesn't save" in {
- when(movementService.getDraftMovementOrSaveNew(any)(any)).thenReturn(Future.successful(Left(BadRequest(""))))
- when(appConfig.oldAuditingEnabled).thenReturn(true)
-
- await(createWithSuccessfulAuth.submit(request))
-
- //old auditing:
- verify(auditService, times(1)).auditMessage(any, any)(any)
- //new auditing:
- verify(auditService, times(1))
- .messageSubmittedNoMovement(any[IE815MessageV2], any, eqTo(Some("correlationId")), any)(
- any
- )
- }
-
- "adds the boxId to the BoxIdRepository for consignor" in {
- when(movementService.getDraftMovementOrSaveNew(any)(any))
- .thenReturn(Future.successful(Right(Movement(Some(defaultBoxId), "lrn", consignorId, None))))
-
- await(createWithSuccessfulAuth.submit(request))
-
- verify(boxIdRepository).save(consignorId, defaultBoxId)
- }
-
- "return an error" when {
-
- "message is wrong type" in {
- val result = createWithWrongMessageType.submit(request)
-
- status(result) mustBe BAD_REQUEST
- contentAsJson(result) mustBe expectedJsonResponse(
- "Invalid message type",
- "Message type IE818 cannot be sent to the draft excise movement endpoint"
- )
-
- }
-
- "not authorised to send message" in {
- case object TestMessageIdentifierIsUnauthorised
- extends MessageIdentifierIsUnauthorised(MessageValidation.consignor)
-
- val expectedError = expectedJsonResponse(
- "Message cannot be sent",
- "The Consignor is not authorised to submit this message for the movement"
- )
-
- when(messageValidation.validateDraftMovement(any, any[IE815MessageV2]))
- .thenReturn(Left(TestMessageIdentifierIsUnauthorised))
- when(messageValidation.convertErrorToResponse(eqTo(TestMessageIdentifierIsUnauthorised), eqTo(timestamp)))
- .thenReturn(Forbidden(Json.toJson(expectedError)))
-
- val result = createWithSuccessfulAuth.submit(request)
-
- status(result) mustBe FORBIDDEN
- contentAsJson(result) mustBe expectedError
-
- }
-
- "get box id returns an error" in {
- when(notificationService.getBoxId(any, any)(any))
- .thenReturn(Future.successful(Left(BadRequest("error"))))
-
- val result = createWithSuccessfulAuth.submit(request)
-
- status(result) mustBe BAD_REQUEST
-
- withClue("should not submit the message") {
- verifyZeroInteractions(submissionMessageService)
- }
- }
-
- "clientId is not available" in {
- val result = createWithSuccessfulAuth.submit(createRequestWithoutClientId)
-
- status(result) mustBe BAD_REQUEST
- }
-
- "cannot submit a message" in {
- when(submissionMessageService.submit(any, any)(any))
- .thenReturn(Future.successful(Left(createTestError(NOT_FOUND))))
-
- val result = createWithSuccessfulAuth.submit(request)
-
- status(result) mustBe NOT_FOUND
- }
-
- "message xml cannot be parsed" in {
- val result = createWithFailingXmlParserAction.submit(request)
-
- status(result) mustBe BAD_REQUEST
- }
-
- "authentication fails" in {
- val result = createWithAuthActionFailure.submit(request)
-
- status(result) mustBe FORBIDDEN
- }
-
- "cannot save the movement" in {
- when(movementService.getDraftMovementOrSaveNew(any)(any))
- .thenReturn(Future.successful(Left(InternalServerError("error"))))
-
- val result = createWithSuccessfulAuth.submit(request)
-
- status(result) mustBe INTERNAL_SERVER_ERROR
- }
-
- "XML is not a IE815 message" in {
- when(movementService.getDraftMovementOrSaveNew(any)(any))
- .thenReturn(
- Future.successful(Right(Movement(Some(defaultBoxId), "123", "456", Some("789"), None, Instant.now)))
- )
-
- val result = createWithWrongMessageType.submit(request)
-
- status(result) mustBe BAD_REQUEST
- contentAsJson(result) mustBe expectedJsonResponse(
- "Invalid message type",
- "Message type IE818 cannot be sent to the draft excise movement endpoint"
- )
- }
- }
- }
-
- private def expectedJsonResponse(message: String, debugMessage: String) =
- Json.parse(s"""
- |{
- | "dateTime":"2024-05-06T15:30:15.123Z",
- | "message":"$message",
- | "debugMessage": "$debugMessage"
- |}
- |""".stripMargin)
-
- private def createWithWrongMessageType = {
-
- val mockIE818MessageV2 = mock[IE818MessageV2]
-
- when(mockIE818MessageV2.messageType).thenReturn(MessageTypes.IE818.value)
-
- new DraftExciseMovementControllerV2(
- FakeSuccessAuthentication(Set(ern)),
- FakeSuccessXMLParser(mockIE818MessageV2),
- movementService,
- submissionMessageService,
- notificationService,
- messageValidation,
- dateTimeService,
- auditService,
- boxIdRepository,
- appConfig,
- cc,
- correlationIdAction
- )
- }
-
- private def createWithAuthActionFailure =
- new DraftExciseMovementControllerV2(
- FakeFailingAuthentication,
- FakeSuccessXMLParser(mockIeMessage),
- movementService,
- submissionMessageService,
- notificationService,
- messageValidation,
- dateTimeService,
- auditService,
- boxIdRepository,
- appConfig,
- cc,
- correlationIdAction
- )
-
- private def createWithFailingXmlParserAction =
- new DraftExciseMovementControllerV2(
- FakeSuccessAuthentication(Set(ern)),
- FakeFailureXMLParser,
- movementService,
- submissionMessageService,
- notificationService,
- messageValidation,
- dateTimeService,
- auditService,
- boxIdRepository,
- appConfig,
- cc,
- correlationIdAction
- )
-
- private def createWithSuccessfulAuth =
- new DraftExciseMovementControllerV2(
- FakeSuccessAuthentication(Set(ern)),
- FakeSuccessXMLParser(mockIeMessage),
- movementService,
- submissionMessageService,
- notificationService,
- messageValidation,
- dateTimeService,
- auditService,
- boxIdRepository,
- appConfig,
- cc,
- correlationIdAction
- )
-
- private def createRequestWithClientId: FakeRequest[Elem] =
- createRequest(
- Seq(
- HeaderNames.CONTENT_TYPE -> "application/xml",
- "X-Client-Id" -> "clientId",
- HttpHeader.xCorrelationId -> "testCorrelationId"
- )
- )
-
- private def createRequestWithClientBoxId: FakeRequest[Elem] =
- createRequest(
- Seq(
- HeaderNames.CONTENT_TYPE -> "application/xml",
- "X-Client-Id" -> "clientId",
- "X-Callback-Box-Id" -> clientBoxId
- )
- )
-
- private def createRequestWithoutClientId: FakeRequest[Elem] =
- createRequest(Seq(HeaderNames.CONTENT_TYPE -> "application/xml"))
-
- private def createRequest(headers: Seq[(String, String)], body: Elem = IE815): FakeRequest[Elem] =
- FakeRequest()
- .withHeaders(FakeHeaders(headers))
- .withBody(body)
-}
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/GetMessagesControllerSpec.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/GetMessagesControllerSpec.scala
index 2e2cbbbe6..7064d6540 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/GetMessagesControllerSpec.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/GetMessagesControllerSpec.scala
@@ -34,8 +34,7 @@ import uk.gov.hmrc.excisemovementcontrolsystemapi.data.TestXml
import uk.gov.hmrc.excisemovementcontrolsystemapi.factories.IEMessageFactory
import uk.gov.hmrc.excisemovementcontrolsystemapi.fixture.{ErrorResponseSupport, FakeAuthentication}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auth.EnrolmentRequest
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{Consignee, Consignor}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.IE801MessageV1
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{Consignee, Consignor, IE801Message}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.validation.MovementIdValidation
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Message, Movement}
import uk.gov.hmrc.excisemovementcontrolsystemapi.services.{AuditService, MessageService, MovementService}
@@ -81,7 +80,7 @@ class GetMessagesControllerSpec
when(dateTimeService.timestamp()).thenReturn(timeStamp)
when(messageService.updateAllMessages(any)(any)).thenReturn(Future.successful(Done))
- when(messageFactory.createFromXml(any, any)).thenReturn(IE801MessageV1.createFromXml(IE801))
+ when(messageFactory.createFromXml(any, any)).thenReturn(IE801Message.createFromXml(IE801))
}
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/SubmitMessageControllerSpec.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/SubmitMessageControllerSpec.scala
index 9215d37cb..df78f21d1 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/SubmitMessageControllerSpec.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/controllers/SubmitMessageControllerSpec.scala
@@ -34,8 +34,7 @@ import uk.gov.hmrc.excisemovementcontrolsystemapi.fixture.{ErrorResponseSupport,
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.EISErrorResponseDetails
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auth.{EnrolmentRequest, ParsedXmlRequest}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.eis.EISSubmissionResponse
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.IE815MessageV1
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{IE815Message, IEMessage}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.validation._
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.Movement
import uk.gov.hmrc.excisemovementcontrolsystemapi.services._
@@ -73,7 +72,7 @@ class SubmitMessageControllerSpec
val parsedXmlRequest: ParsedXmlRequest[NodeSeq] = ParsedXmlRequest(
EnrolmentRequest(FakeRequest().withBody(IE801), Set(ern), fakeUserDetails),
- IE815MessageV1.createFromXml(IE815),
+ IE815Message.createFromXml(IE815),
Set(ern),
fakeUserDetails
)
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/NewMessagesXml.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/NewMessagesXml.scala
index 51398cbde..be3c9ce36 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/NewMessagesXml.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/NewMessagesXml.scala
@@ -22,8 +22,8 @@ trait NewMessagesXml {
def newMessageWithIE801(messageCount: Int = 1): Elem =
+ xmlns:urn1="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE801:V3.23"
+ xmlns:urn="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:TMS:V3.23">
@@ -155,9 +155,9 @@ trait NewMessagesXml {
tokentokentokentokent
-
- token
-
+
+ token
+
to
@@ -268,7 +268,7 @@ trait NewMessagesXml {
lazy val newMessageXmlWithIE704: Elem =
+ xmlns:urn="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:TMS:V3.23">
@@ -309,8 +309,8 @@ trait NewMessagesXml {
lazy val newMessageWith2IE801sXml: Elem =
+ xmlns:urn="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE801:V3.23"
+ xmlns:urn1="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:TMS:V3.23">
@@ -442,9 +442,9 @@ trait NewMessagesXml {
tokentokentokentokent
-
- token
-
+
+ token
+
to
@@ -678,9 +678,9 @@ trait NewMessagesXml {
tokentokentokentokent
-
- token
-
+
+ token
+
to
@@ -790,9 +790,9 @@ trait NewMessagesXml {
lazy val newMessageWith818And802: Elem =
+ xmlns:urn="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:TMS:V3.23"
+ xmlns:urn1="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE818:V3.23"
+ xmlns:urn2="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE802:V3.23">
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/SchedulingTestData.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/SchedulingTestData.scala
index b1e4689dc..14bd30eec 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/SchedulingTestData.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/SchedulingTestData.scala
@@ -19,11 +19,11 @@ package uk.gov.hmrc.excisemovementcontrolsystemapi.data
object SchedulingTestData {
lazy val ie704 =
- """tokentoken2008-09-2900:18:33messageId-4tokentokentokentokentokenttotoken4518tokentokentoken"""
+ """tokentoken2008-09-2900:18:33messageId-4tokentokentokentokentokenttotoken4518tokentokentoken"""
lazy val ie801 =
- """tokentoken2018-11-0102:02:49+01:00messageId-1tokentokentokentokentokentokentokentokentokentokentokentokent2002-11-05T08:01:03tokentokentoktokentokentokentokentokentokentokentoktokentokentokentokentokentokentoktotokentokentokentokentokentokentokentokentoktokentoktokentokentokentokentokentokentokentokentokentokentokentokentoketokentokentokentokentoken2002-06-24+01:0032012-01-0709:44:59tokentokentokentokenttokento2013-06-17T18:14:5810tok4totoken12tokentokentoktokentokentokentokentokentokentoktoketokentok1000.000000000001000.0000000000001000.0000000000001000.001000.00token1tokentoken1000.00tokentokentokentotokentokentokentoken2tototokentototokentokentokentoken"""
+ """tokentoken2018-11-0102:02:49+01:00messageId-1tokentokentokentokentokentokentokentokentokentokentokentokent2002-11-05T08:01:03tokentokentoktokentokentokentokentokentokentokentoktokentokentokentokentokentokentoktotokentokentokentokentokentokentokentokentoktokentoktokentokentokentokentokentokentokentokentokentokentokentokentoketokentokentokentokentoken2002-06-24+01:0032012-01-0709:44:59tokentokentokentokenttokento2013-06-17T18:14:5810tok4totoken12tokentokentoktokentokentokentokentokentokentoktoketokentok1000.000000000001000.0000000000001000.0000000000001000.001000.00token1tokentoken1000.00tokentokentokentotokentokentokentoken2tototokentototokentokentokentoken"""
lazy val ie818 =
- """tokentoken2008-09-2900:18:33messageId-2token2006-08-19T18:27:14+01:00tokentokentokentokentokentokentokentokentokentokentokenttotokentokentokentokentokentokentokentok2009-05-163tokentokE1000.00000000000toke1000.00000000000totoken"""
+ """tokentoken2008-09-2900:18:33messageId-2token2006-08-19T18:27:14+01:00tokentokentokentokentokentokentokentokentokentokentokenttotokentokentokentokentokentokentokentok2009-05-163tokentokE1000.00000000000toke1000.00000000000totoken"""
lazy val ie802 =
- """tokentoken2015-08-2423:07:00+01:00messageId-3token2000-04-21T01:36:55+01:00token2017-04-19T15:38:57+01:001tokentokentokentokentto"""
+ """tokentoken2015-08-2423:07:00+01:00messageId-3token2000-04-21T01:36:55+01:00token2017-04-19T15:38:57+01:001tokentokentokentokentto"""
}
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/TestXml.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/TestXml.scala
index 9914e3105..a5bcec1d9 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/TestXml.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/TestXml.scala
@@ -22,7 +22,7 @@ import scala.xml.Elem
trait TestXml {
- lazy val IE704: Elem =
NDEA.XI
@@ -57,7 +57,7 @@ trait TestXml {
- lazy val IE704NoLocalReferenceNumber: Elem =
NDEA.XI
@@ -90,7 +90,7 @@ trait TestXml {
- lazy val IE704NoNamespace: Elem =
NDEA.XI
@@ -125,7 +125,7 @@ trait TestXml {
- lazy val IE704NoArc: Elem =
NDEA.XI
@@ -151,7 +151,7 @@ trait TestXml {
- lazy val IE704WithoutCorrelationId: Elem =
NDEA.XI
@@ -186,8 +186,8 @@ trait TestXml {
lazy val IE801: Elem =
+ xmlns:urn="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE801:V3.23"
+ xmlns:urn1="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:TMS:V3.23">
token
token
@@ -278,9 +278,9 @@ trait TestXml {
2002-11-05+00:00
16:46:32+01:00
tokentokentokentokent
-
- token
-
+
+ token
+
to
@@ -352,8 +352,8 @@ trait TestXml {
lazy val IE801NoNamespace: Elem =
+ xmlns:urn="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE801:V3.23"
+ xmlns:urn1="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:TMS:V3.23">
token
token
@@ -444,9 +444,9 @@ trait TestXml {
2002-11-05+00:00
16:46:32+01:00
tokentokentokentokent
-
- token
-
+
+ token
+
to
@@ -518,8 +518,8 @@ trait TestXml {
lazy val IE801WithoutCorrelationId: Elem =
+ xmlns:urn="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE801:V3.23"
+ xmlns:urn1="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:TMS:V3.23">
token
token
@@ -609,9 +609,9 @@ trait TestXml {
2002-11-05+00:00
16:46:32+01:00
tokentokentokentokent
-
- token
-
+
+ token
+
to
@@ -681,8 +681,8 @@ trait TestXml {
- lazy val IE802: Elem =
+ lazy val IE802: Elem =
CSMISE.EC
CSMISE.EC
@@ -709,8 +709,8 @@ trait TestXml {
- lazy val IE802WithoutCorrelationId: Elem =
+ lazy val IE802WithoutCorrelationId: Elem =
CSMISE.EC
CSMISE.EC
@@ -735,8 +735,8 @@ trait TestXml {
- lazy val IE802NoNamespace: Elem =
+ lazy val IE802NoNamespace: Elem =
CSMISE.EC
CSMISE.EC
@@ -763,8 +763,8 @@ trait TestXml {
- lazy val IE803: Elem =
+ lazy val IE803: Elem =
NDEA.GB
NDEA.XI
@@ -785,8 +785,8 @@ trait TestXml {
- lazy val IE803WithoutCorrelationId: Elem =
+ lazy val IE803WithoutCorrelationId: Elem =
NDEA.GB
NDEA.XI
@@ -806,8 +806,8 @@ trait TestXml {
- lazy val IE803NoNamespace: Elem =
+ lazy val IE803NoNamespace: Elem =
NDEA.GB
NDEA.XI
@@ -828,8 +828,8 @@ trait TestXml {
- lazy val IE807: Elem =
+ lazy val IE807: Elem =
NDEA.GB
NDEA.XI
@@ -861,8 +861,8 @@ trait TestXml {
- lazy val IE807WithoutCorrelationId: Elem =
+ lazy val IE807WithoutCorrelationId: Elem =
NDEA.GB
NDEA.XI
@@ -893,8 +893,8 @@ trait TestXml {
- lazy val IE807NoNamespace: Elem =
+ lazy val IE807NoNamespace: Elem =
NDEA.GB
NDEA.XI
@@ -926,8 +926,8 @@ trait TestXml {
- lazy val IE810: Elem =
@@ -954,8 +954,8 @@ trait TestXml {
- lazy val IE810WithoutCorrelationId: Elem =
@@ -981,8 +981,8 @@ trait TestXml {
- lazy val IE810NoNamespace: Elem =
@@ -1009,8 +1009,8 @@ trait TestXml {
- lazy val IE813: Elem =
@@ -1072,8 +1072,8 @@ trait TestXml {
- lazy val IE813WithoutCorrelationId: Elem =
@@ -1134,8 +1134,8 @@ trait TestXml {
- lazy val IE813NoNamespace: Elem =
@@ -1202,8 +1202,8 @@ trait TestXml {
lazy val IE815WithNoConsignor: Elem = IE815Template("")
val testCorrelationId = "PORTAL6de1b822562c43fb9220d236e487c920"
private def IE815Template(consignor: String): Elem =
-
@@ -1309,8 +1309,8 @@ trait TestXml {
private def IE815TemplateWithoutCorrelationId(consignor: String): Elem =
-
@@ -1414,8 +1414,8 @@ trait TestXml {
- lazy val IE818: Elem =
@@ -1471,8 +1471,8 @@ trait TestXml {
- lazy val IE818WithoutCorrelationId: Elem =
@@ -1527,8 +1527,8 @@ trait TestXml {
- lazy val IE818NoNamespace: Elem =
@@ -1585,8 +1585,8 @@ trait TestXml {
lazy val IE819: Elem =
-
@@ -1631,8 +1631,8 @@ trait TestXml {
lazy val IE819WithoutCorrelationId: Elem =
-
@@ -1676,8 +1676,8 @@ trait TestXml {
lazy val IE819NoNamespace: Elem =
-
@@ -1722,8 +1722,8 @@ trait TestXml {
lazy val IE829: Elem =
+ xmlns:urn="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE829:V3.23"
+ xmlns:urn1="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:TMS:V3.23">
NDEA.XI
NDEA.AT
@@ -1750,12 +1750,10 @@ trait TestXml {
23XI00000000000056339
1
- 1
23XI00000000000056340
1
- 1
tokentok
@@ -1766,14 +1764,15 @@ trait TestXml {
2013-05-22+01:00
2002-11-05+00:00
token
+ 1
lazy val IE829WithoutCorrelationId: Elem =
+ xmlns:urn="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE829:V3.23"
+ xmlns:urn1="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:TMS:V3.23">
NDEA.XI
NDEA.AT
@@ -1798,12 +1797,10 @@ trait TestXml {
23XI00000000000056339
1
- 1
23XI00000000000056340
1
- 1
tokentok
@@ -1814,14 +1811,15 @@ trait TestXml {
2013-05-22+01:00
2002-11-05+00:00
token
+ 1
lazy val IE829NoNamespace: Elem =
+ xmlns:urn="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE829:V3.23"
+ xmlns:urn1="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:TMS:V3.23">
NDEA.XI
NDEA.AT
@@ -1848,12 +1846,10 @@ trait TestXml {
23XI00000000000056339
1
- 1
23XI00000000000056340
1
- 1
tokentok
@@ -1864,14 +1860,15 @@ trait TestXml {
2013-05-22+01:00
2002-11-05+00:00
token
+ 1
lazy val IE837WithConsignor: Elem = ie837Template(Consignor, "GBWK240176600")
- lazy val IE837WithoutCorrelationId: Elem =
@@ -1900,8 +1897,8 @@ trait TestXml {
- lazy val IE837WithConsignorNoNamespace: Elem =
@@ -1937,8 +1934,8 @@ trait TestXml {
val submitterTypeAsInt = if (submitterType == Consignor) 1 else 2
-
@@ -1970,8 +1967,8 @@ trait TestXml {
}
lazy val IE839: Elem =
+ xmlns:urn="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE839:V3.23"
+ xmlns:urn1="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:TMS:V3.23">
NDEA.XI
NDEA.FR
@@ -2037,8 +2034,8 @@ trait TestXml {
lazy val IE839NoLocalReferenceNumber: Elem =
+ xmlns:urn="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE839:V3.23"
+ xmlns:urn1="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:TMS:V3.23">
NDEA.XI
NDEA.FR
@@ -2100,8 +2097,8 @@ trait TestXml {
lazy val IE839WithoutCorrelationId: Elem =
+ xmlns:urn="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE839:V3.23"
+ xmlns:urn1="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:TMS:V3.23">
NDEA.XI
NDEA.FR
@@ -2166,8 +2163,8 @@ trait TestXml {
lazy val IE839NoNamespace: Elem =
+ xmlns:urn="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE839:V3.23"
+ xmlns:urn1="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:TMS:V3.23">
NDEA.XI
NDEA.FR
@@ -2233,8 +2230,8 @@ trait TestXml {
lazy val IE839MultipleArcs: Elem =
+ xmlns:urn="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE839:V3.23"
+ xmlns:urn1="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:TMS:V3.23">
NDEA.XI
NDEA.FR
@@ -2307,8 +2304,8 @@ trait TestXml {
- lazy val IE840: Elem =
+ lazy val IE840: Elem =
NDEA.XI
NDEA.GB
@@ -2432,8 +2429,8 @@ trait TestXml {
- lazy val IE840WithoutCorrelationId: Elem =
+ lazy val IE840WithoutCorrelationId: Elem =
NDEA.XI
NDEA.GB
@@ -2556,8 +2553,8 @@ trait TestXml {
- lazy val IE840NoNamespace: Elem =
+ lazy val IE840NoNamespace: Elem =
NDEA.XI
NDEA.GB
@@ -2683,8 +2680,8 @@ trait TestXml {
lazy val IE871WithConsignor: Elem = ie871ForConsignor(Consignor)
- lazy val IE871WithoutCorrelationId: Elem =
@@ -2719,8 +2716,8 @@ trait TestXml {
- lazy val IE871WithConsignorNoNamespace: Elem =
@@ -2759,8 +2756,8 @@ trait TestXml {
val submitterTypeAsInt = if (submitterType == Consignor) 1 else 2
-
@@ -2803,8 +2800,8 @@ trait TestXml {
val submitterTypeAsInt = if (submitterType == Consignor) 1 else 2
-
@@ -2843,8 +2840,8 @@ trait TestXml {
}
lazy val IE881: Elem =
-
+
NDEA.GB
NDEA.XI
@@ -2890,8 +2887,8 @@ trait TestXml {
lazy val IE881WithoutCorrelationId: Elem =
-
+
NDEA.GB
NDEA.XI
@@ -2936,8 +2933,8 @@ trait TestXml {
lazy val IE881NoNamespace: Elem =
-
+
NDEA.GB
NDEA.XI
@@ -2982,8 +2979,8 @@ trait TestXml {
- lazy val IE905: Elem =
+ lazy val IE905: Elem =
NDEA.GB
NDEA.XI
@@ -3004,8 +3001,8 @@ trait TestXml {
- lazy val IE905WithoutCorrelationId: Elem =
+ lazy val IE905WithoutCorrelationId: Elem =
NDEA.GB
NDEA.XI
@@ -3025,8 +3022,8 @@ trait TestXml {
- lazy val IE905NoNamespace: Elem =
+ lazy val IE905NoNamespace: Elem =
NDEA.GB
NDEA.XI
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/TraderMovementXmlGenerator.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/TraderMovementXmlGenerator.scala
index 79fe00be1..a24b79394 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/TraderMovementXmlGenerator.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/TraderMovementXmlGenerator.scala
@@ -26,8 +26,8 @@ class TraderMovementXmlGenerator(
def generate(ern: String, messageParams: Seq[MessageParams]): NodeSeq =
+ xmlns:ie934="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE934:V3.23"
+ xmlns:tms="urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:TMS:V3.23">
NDEA.XI
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/XmlMessageGenerator.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/XmlMessageGenerator.scala
index 6aa743f98..2e4bdc46b 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/XmlMessageGenerator.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/data/XmlMessageGenerator.scala
@@ -65,7 +65,7 @@ object MessageParams {
private case object IE704XmlMessageGenerator extends XmlMessageGenerator {
override def generate(ern: String, params: MessageParams): NodeSeq =
-
NDEA.XI
@@ -102,8 +102,8 @@ private case object IE704XmlMessageGenerator extends XmlMessageGenerator {
private case object IE801XmlMessageGenerator extends XmlMessageGenerator {
override def generate(ern: String, params: MessageParams): NodeSeq =
-
+
NDEA.XI
NDEA.AT
@@ -203,8 +203,8 @@ private case object IE801XmlMessageGenerator extends XmlMessageGenerator {
private case object IE802XmlMessageGenerator extends XmlMessageGenerator {
override def generate(ern: String, params: MessageParams): NodeSeq =
-
+
CSMISE.EC
CSMISE.EC
@@ -232,8 +232,8 @@ private case object IE802XmlMessageGenerator extends XmlMessageGenerator {
private case object IE803XmlMessageGenerator extends XmlMessageGenerator {
override def generate(ern: String, params: MessageParams): NodeSeq =
-
+
NDEA.GB
NDEA.XI
@@ -257,8 +257,8 @@ private case object IE803XmlMessageGenerator extends XmlMessageGenerator {
private case object IE807XmlMessageGenerator extends XmlMessageGenerator {
override def generate(ern: String, params: MessageParams): NodeSeq =
-
+
NDEA.GB
NDEA.XI
@@ -293,8 +293,8 @@ private case object IE807XmlMessageGenerator extends XmlMessageGenerator {
private case object IE810XmlMessageGenerator extends XmlMessageGenerator {
override def generate(ern: String, params: MessageParams): NodeSeq =
-
+
NDEA.XI
NDEA.XI
@@ -322,8 +322,8 @@ private case object IE810XmlMessageGenerator extends XmlMessageGenerator {
private case object IE813XmlMessageGenerator extends XmlMessageGenerator {
override def generate(ern: String, params: MessageParams): NodeSeq =
-
+
NDEA.XI
NDEA.XI
@@ -412,8 +412,8 @@ private case object IE813XmlMessageGenerator extends XmlMessageGenerator {
private case object IE818XmlMessageGenerator extends XmlMessageGenerator {
override def generate(ern: String, params: MessageParams): NodeSeq =
-
+
NDEA.XI
NDEA.XI
@@ -474,8 +474,8 @@ private case object IE818XmlMessageGenerator extends XmlMessageGenerator {
private case object IE819XmlMessageGenerator extends XmlMessageGenerator {
override def generate(ern: String, params: MessageParams): NodeSeq =
-
+
NDEA.XI
NDEA.XI
@@ -520,8 +520,8 @@ private case object IE819XmlMessageGenerator extends XmlMessageGenerator {
private case object IE829XmlMessageGenerator extends XmlMessageGenerator {
override def generate(ern: String, params: MessageParams): NodeSeq =
-
+
NDEA.XI
NDEA.AT
@@ -546,12 +546,10 @@ private case object IE829XmlMessageGenerator extends XmlMessageGenerator {
23XI00000000000056339
1
- 0
23XI00000000000056340
1
- 0
AT633734
@@ -561,6 +559,7 @@ private case object IE829XmlMessageGenerator extends XmlMessageGenerator {
84884
2023-06-26
123123vmnfhsdf3AT
+ 0
@@ -569,8 +568,8 @@ private case object IE829XmlMessageGenerator extends XmlMessageGenerator {
private case object IE837XmlMessageGenerator extends XmlMessageGenerator {
override def generate(ern: String, params: MessageParams): NodeSeq =
-
+
NDEA.GB
NDEA.EU
@@ -600,8 +599,8 @@ private case object IE837XmlMessageGenerator extends XmlMessageGenerator {
private case object IE839XmlMessageGenerator extends XmlMessageGenerator {
override def generate(ern: String, params: MessageParams): NodeSeq =
-
+
NDEA.XI
NDEA.FR
@@ -656,8 +655,8 @@ private case object IE839XmlMessageGenerator extends XmlMessageGenerator {
private case object IE840XmlMessageGenerator extends XmlMessageGenerator {
override def generate(ern: String, params: MessageParams): NodeSeq = {
-
+
NDEA.XI
NDEA.GB
@@ -785,8 +784,8 @@ private case object IE840XmlMessageGenerator extends XmlMessageGenerator {
private case object IE871XmlMessageGenerator extends XmlMessageGenerator {
override def generate(ern: String, params: MessageParams): NodeSeq =
-
+
NDEA.XI
NDEA.XI
@@ -839,8 +838,8 @@ private case object IE871XmlMessageGenerator extends XmlMessageGenerator {
private case object IE881XmlMessageGenerator extends XmlMessageGenerator {
override def generate(ern: String, params: MessageParams): NodeSeq =
-
+
NDEA.GB
NDEA.XI
@@ -888,8 +887,8 @@ private case object IE881XmlMessageGenerator extends XmlMessageGenerator {
private case object IE905XmlMessageGenerator extends XmlMessageGenerator {
override def generate(ern: String, params: MessageParams): NodeSeq =
-
+
NDEA.GB
NDEA.XI
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/factories/IEMessageFactorySpec.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/factories/IEMessageFactorySpec.scala
index 8ff717e8e..0b9eee435 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/factories/IEMessageFactorySpec.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/factories/IEMessageFactorySpec.scala
@@ -16,7 +16,7 @@
package uk.gov.hmrc.excisemovementcontrolsystemapi.factories
-import generated.v1.MessagesOption
+import generated.MessagesOption
import org.mockito.MockitoSugar.{reset, when}
import org.scalatest.BeforeAndAfterEach
import org.scalatestplus.mockito.MockitoSugar.mock
@@ -25,12 +25,11 @@ import scalaxb.DataRecord
import uk.gov.hmrc.excisemovementcontrolsystemapi.data.TestXml
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1._
class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach {
private val message = mock[DataRecord[MessagesOption]]
- private val sut = IEMessageFactoryV1()
+ private val sut = IEMessageFactory()
override def beforeEach(): Unit = {
super.beforeEach()
@@ -45,76 +44,76 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
"cannot handle message type" in {
when(message.key).thenReturn(Some("Anything"))
intercept[IEMessageFactoryException] {
- sut.createIEMessage(Left(message))
+ sut.createIEMessage(message)
}.getMessage mustBe s"Could not create Message object. Unsupported message: Anything"
}
"messageType is empty" in {
when(message.key).thenReturn(None)
intercept[IEMessageFactoryException] {
- sut.createIEMessage(Left(message))
+ sut.createIEMessage(message)
}.getMessage mustBe "Could not create Message object. Message type is empty"
}
}
- "return an instance of IE704MessageV1" in {
+ "return an instance of IE704Message" in {
when(message.key).thenReturn(Some("IE704"))
- sut.createIEMessage(Left(message)).isInstanceOf[IE704MessageV1] mustBe true
+ sut.createIEMessage(message).isInstanceOf[IE704Message] mustBe true
}
- "return an instance of IE801MessageV1" in {
+ "return an instance of IE801Message" in {
when(message.key).thenReturn(Some("IE801"))
- sut.createIEMessage(Left(message)).isInstanceOf[IE801MessageV1] mustBe true
+ sut.createIEMessage(message).isInstanceOf[IE801Message] mustBe true
}
- "return an instance of IE802MessageV1" in {
+ "return an instance of IE802Message" in {
when(message.key).thenReturn(Some("IE802"))
- sut.createIEMessage(Left(message)).isInstanceOf[IE802MessageV1] mustBe true
+ sut.createIEMessage(message).isInstanceOf[IE802Message] mustBe true
}
- "return an instance of IE803MessageV1" in {
+ "return an instance of IE803Message" in {
when(message.key).thenReturn(Some("IE803"))
- sut.createIEMessage(Left(message)).isInstanceOf[IE803MessageV1] mustBe true
+ sut.createIEMessage(message).isInstanceOf[IE803Message] mustBe true
}
- "return an instance of IE807MessageV1" in {
+ "return an instance of IE807Message" in {
when(message.key).thenReturn(Some("IE807"))
- sut.createIEMessage(Left(message)).isInstanceOf[IE807MessageV1] mustBe true
+ sut.createIEMessage(message).isInstanceOf[IE807Message] mustBe true
}
- "return an instance of IE810MessageV1" in {
+ "return an instance of IE810Message" in {
when(message.key).thenReturn(Some("IE810"))
- sut.createIEMessage(Left(message)).isInstanceOf[IE810MessageV1] mustBe true
+ sut.createIEMessage(message).isInstanceOf[IE810Message] mustBe true
}
- "return an instance of IE813MessageV1" in {
+ "return an instance of IE813Message" in {
when(message.key).thenReturn(Some("IE813"))
- sut.createIEMessage(Left(message)).isInstanceOf[IE813MessageV1] mustBe true
+ sut.createIEMessage(message).isInstanceOf[IE813Message] mustBe true
}
- "return an instance of IE818MessageV1" in {
+ "return an instance of IE818Message" in {
when(message.key).thenReturn(Some("IE818"))
- sut.createIEMessage(Left(message)).isInstanceOf[IE818MessageV1] mustBe true
+ sut.createIEMessage(message).isInstanceOf[IE818Message] mustBe true
}
- "return an instance of IE819MessageV1" in {
+ "return an instance of IE819Message" in {
when(message.key).thenReturn(Some("IE819"))
- sut.createIEMessage(Left(message)).isInstanceOf[IE819MessageV1] mustBe true
+ sut.createIEMessage(message).isInstanceOf[IE819Message] mustBe true
}
- "return an instance of IE837MessageV1" in {
+ "return an instance of IE837Message" in {
when(message.key).thenReturn(Some("IE837"))
- sut.createIEMessage(Left(message)).isInstanceOf[IE837MessageV1] mustBe true
+ sut.createIEMessage(message).isInstanceOf[IE837Message] mustBe true
}
- "return an instance of IE840MessageV1" in {
+ "return an instance of IE840Message" in {
when(message.key).thenReturn(Some("IE840"))
- sut.createIEMessage(Left(message)).isInstanceOf[IE840MessageV1] mustBe true
+ sut.createIEMessage(message).isInstanceOf[IE840Message] mustBe true
}
- "return an instance of IE871MessageV1" in {
+ "return an instance of IE871Message" in {
when(message.key).thenReturn(Some("IE871"))
- sut.createIEMessage(Left(message)).isInstanceOf[IE871MessageV1] mustBe true
+ sut.createIEMessage(message).isInstanceOf[IE871Message] mustBe true
}
}
@@ -129,8 +128,8 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
}
}
- "return an instance of IE704MessageV1" in {
- val result = sut.createFromXml("IE704", IE704).asInstanceOf[IE704MessageV1]
+ "return an instance of IE704Message" in {
+ val result = sut.createFromXml("IE704", IE704).asInstanceOf[IE704Message]
result.consigneeId mustBe None
result.administrativeReferenceCode mustBe Seq(Some("23XI00000000000000012"))
result.messageIdentifier mustBe "XI000001"
@@ -139,13 +138,13 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
result.lrnEquals("diffLrn") mustBe false
}
- "return an instance of IE704MessageV1 when no arc" in {
- val result = sut.createFromXml("IE704", IE704NoArc).asInstanceOf[IE704MessageV1]
+ "return an instance of IE704Message when no arc" in {
+ val result = sut.createFromXml("IE704", IE704NoArc).asInstanceOf[IE704Message]
result.administrativeReferenceCode mustBe Seq(None)
}
- "return an instance of IE801MessageV1" in {
- val result = sut.createFromXml("IE801", IE801).asInstanceOf[IE801MessageV1]
+ "return an instance of IE801Message" in {
+ val result = sut.createFromXml("IE801", IE801).asInstanceOf[IE801Message]
result.consignorId mustBe Some("tokentokentok")
result.consigneeId mustBe Some("token")
result.administrativeReferenceCode mustBe Seq(Some("tokentokentokentokent"))
@@ -155,8 +154,8 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
result.lrnEquals("token") mustBe true
}
- "return an instance of IE802MessageV1" in {
- val result = sut.createFromXml("IE802", IE802).asInstanceOf[IE802MessageV1]
+ "return an instance of IE802Message" in {
+ val result = sut.createFromXml("IE802", IE802).asInstanceOf[IE802Message]
result.consigneeId mustBe None
result.administrativeReferenceCode mustBe Seq(Some("23XI00000000000000090"))
result.messageIdentifier mustBe "X00004"
@@ -164,8 +163,8 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
result.lrnEquals("anyLrn") mustBe false
}
- "return an instance of IE803MessageV1" in {
- val result = sut.createFromXml("IE803", IE803).asInstanceOf[IE803MessageV1]
+ "return an instance of IE803Message" in {
+ val result = sut.createFromXml("IE803", IE803).asInstanceOf[IE803Message]
result.consigneeId mustBe None
result.administrativeReferenceCode mustBe Seq(Some("23XI00000000000056333"))
result.messageIdentifier mustBe "GB002312688"
@@ -173,8 +172,8 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
result.lrnEquals("anyLrn") mustBe false
}
- "return an instance of IE807MessageV1" in {
- val result = sut.createFromXml("IE807", IE807).asInstanceOf[IE807MessageV1]
+ "return an instance of IE807Message" in {
+ val result = sut.createFromXml("IE807", IE807).asInstanceOf[IE807Message]
result.consigneeId mustBe None
result.administrativeReferenceCode mustBe Seq(Some("23XI00000000000000331"))
result.messageIdentifier mustBe "GB0023121"
@@ -182,8 +181,8 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
result.lrnEquals("anyLrn") mustBe false
}
- "return an instance of IE810MessageV1" in {
- val result = sut.createFromXml("IE810", IE810).asInstanceOf[IE810MessageV1]
+ "return an instance of IE810Message" in {
+ val result = sut.createFromXml("IE810", IE810).asInstanceOf[IE810Message]
result.consignorId mustBe None
result.consigneeId mustBe None
result.administrativeReferenceCode mustBe Seq(Some("23GB00000000000377161"))
@@ -193,8 +192,8 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
result.lrnEquals("anyLrn") mustBe false
}
- "return an instance of IE813MessageV1" in {
- val result = sut.createFromXml("IE813", IE813).asInstanceOf[IE813MessageV1]
+ "return an instance of IE813Message" in {
+ val result = sut.createFromXml("IE813", IE813).asInstanceOf[IE813Message]
result.consignorId mustBe None
result.consigneeId mustBe Some("GBWK240176600")
result.administrativeReferenceCode mustBe Seq(Some("23GB00000000000378126"))
@@ -203,8 +202,8 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
result.lrnEquals("anyLrn") mustBe false
}
- "return an instance of IE815MessageV1" in {
- val result = sut.createFromXml("IE815", IE815).asInstanceOf[IE815MessageV1]
+ "return an instance of IE815Message" in {
+ val result = sut.createFromXml("IE815", IE815).asInstanceOf[IE815Message]
result.consignorId mustBe Some("GBWK002281023")
result.consigneeId mustBe Some("GBWKQOZ8OVLYR")
result.administrativeReferenceCode mustBe Seq(None)
@@ -215,8 +214,8 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
result.lrnEquals("otherLrn") mustBe false
}
- "return an instance of IE818MessageV1" in {
- val result = sut.createFromXml("IE818", IE818).asInstanceOf[IE818MessageV1]
+ "return an instance of IE818Message" in {
+ val result = sut.createFromXml("IE818", IE818).asInstanceOf[IE818Message]
result.consignorId mustBe None
result.consigneeId mustBe Some("GBWK002281023")
result.administrativeReferenceCode mustBe Seq(Some("23GB00000000000378553"))
@@ -225,8 +224,8 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
result.lrnEquals("anyLrn") mustBe false
}
- "return an instance of IE819MessageV1" in {
- val result = sut.createFromXml("IE819", IE819).asInstanceOf[IE819MessageV1]
+ "return an instance of IE819Message" in {
+ val result = sut.createFromXml("IE819", IE819).asInstanceOf[IE819Message]
result.consignorId mustBe None
result.consigneeId mustBe Some("GBWK002281023")
result.administrativeReferenceCode mustBe Seq(Some("23GB00000000000378574"))
@@ -235,8 +234,8 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
result.lrnEquals("anyLrn") mustBe false
}
- "return an instance of IE829MessageV1" in {
- val result = sut.createFromXml("IE829", IE829).asInstanceOf[IE829MessageV1]
+ "return an instance of IE829Message" in {
+ val result = sut.createFromXml("IE829", IE829).asInstanceOf[IE829Message]
result.consigneeId mustBe Some("AT00000612157")
result.administrativeReferenceCode mustBe Seq(Some("23XI00000000000056339"), Some("23XI00000000000056340"))
result.messageIdentifier mustBe "XI004321B"
@@ -244,8 +243,8 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
result.lrnEquals("anyLrn") mustBe false
}
- "return an instance of IE837MessageV1 with Consignor" in {
- val result = sut.createFromXml("IE837", IE837WithConsignor).asInstanceOf[IE837MessageV1]
+ "return an instance of IE837Message with Consignor" in {
+ val result = sut.createFromXml("IE837", IE837WithConsignor).asInstanceOf[IE837Message]
result.submitter mustBe Consignor
result.consignorId mustBe Some("GBWK240176600")
result.consigneeId mustBe None
@@ -255,16 +254,16 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
result.lrnEquals("anyLrn") mustBe false
}
- "return an instance of IE837MessageV1 with Consignee" in {
- val result = sut.createFromXml("IE837", IE837WithConsignee).asInstanceOf[IE837MessageV1]
+ "return an instance of IE837Message with Consignee" in {
+ val result = sut.createFromXml("IE837", IE837WithConsignee).asInstanceOf[IE837Message]
result.submitter mustBe Consignee
result.consignorId mustBe None
result.consigneeId mustBe Some("GBWK002281023")
result.administrativeReferenceCode mustBe Seq(Some("16GB00000000000192223"))
}
- "return an instance of IE839MessageV1" in {
- val result = sut.createFromXml("IE839", IE839).asInstanceOf[IE839MessageV1]
+ "return an instance of IE839Message" in {
+ val result = sut.createFromXml("IE839", IE839).asInstanceOf[IE839Message]
result.consigneeId mustBe Some("AT00000612158")
result.administrativeReferenceCode mustBe Seq(Some("23XI00000000000056341"))
result.messageIdentifier mustBe "XI004322"
@@ -272,8 +271,8 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
result.lrnEquals("anyLrn") mustBe false
}
- "return an instance of IE839MessageV1 with multiple ARCs" in {
- val result = sut.createFromXml("IE839", IE839MultipleArcs).asInstanceOf[IE839MessageV1]
+ "return an instance of IE839Message with multiple ARCs" in {
+ val result = sut.createFromXml("IE839", IE839MultipleArcs).asInstanceOf[IE839Message]
result.administrativeReferenceCode mustBe Seq(
Some("23XI00000000000056341"),
Some("23XI00000000000056342"),
@@ -281,8 +280,8 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
)
}
- "return an instance of IE840MessageV1" in {
- val result = sut.createFromXml("IE840", IE840).asInstanceOf[IE840MessageV1]
+ "return an instance of IE840Message" in {
+ val result = sut.createFromXml("IE840", IE840).asInstanceOf[IE840Message]
result.consigneeId mustBe None
result.administrativeReferenceCode mustBe Seq(Some("23XI00000000000000333"))
result.messageIdentifier mustBe "XI0003265"
@@ -290,8 +289,8 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
result.lrnEquals("anyLrn") mustBe false
}
- "return an instance of IE871MessageV1 with Consignor" in {
- val result = sut.createFromXml("IE871", IE871WithConsignor).asInstanceOf[IE871MessageV1]
+ "return an instance of IE871Message with Consignor" in {
+ val result = sut.createFromXml("IE871", IE871WithConsignor).asInstanceOf[IE871Message]
result.submitter mustBe Consignor
result.consignorId mustBe Some("GBWK240176600")
result.consigneeId mustBe None
@@ -302,15 +301,15 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
result.lrnEquals("anyLrn") mustBe false
}
- "return an instance of IE871MessageV1 with Consignee" in {
- val result = sut.createFromXml("IE871", IE871WithConsignee).asInstanceOf[IE871MessageV1]
+ "return an instance of IE871Message with Consignee" in {
+ val result = sut.createFromXml("IE871", IE871WithConsignee).asInstanceOf[IE871Message]
result.submitter mustBe Consignee
result.consignorId mustBe None
result.consigneeId mustBe Some("GBWK002281023")
}
- "return an instance of IE881MessageV1" in {
- val result = sut.createFromXml("IE881", IE881).asInstanceOf[IE881MessageV1]
+ "return an instance of IE881Message" in {
+ val result = sut.createFromXml("IE881", IE881).asInstanceOf[IE881Message]
result.consigneeId mustBe None
result.administrativeReferenceCode mustBe Seq(Some("23XI00000000000056349"))
result.messageIdentifier mustBe "XI00432M"
@@ -318,8 +317,8 @@ class IEMessageFactorySpec extends PlaySpec with TestXml with BeforeAndAfterEach
result.lrnEquals("anyLrn") mustBe false
}
- "return an instance of IE905MessageV1" in {
- val result = sut.createFromXml("IE905", IE905).asInstanceOf[IE905MessageV1]
+ "return an instance of IE905Message" in {
+ val result = sut.createFromXml("IE905", IE905).asInstanceOf[IE905Message]
result.consigneeId mustBe None
result.administrativeReferenceCode mustBe Seq(Some("23XI00000000000056349"))
result.messageIdentifier mustBe "XI00432RR"
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IEMessageSpec.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IEMessageSpec.scala
index 981492524..fa9cd0751 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IEMessageSpec.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/models/messages/IEMessageSpec.scala
@@ -16,10 +16,9 @@
package uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages
-import generated.v1.{Number1Value31, Number2Value30}
+import generated.{Number1Value30, Number1Value31, Number2Value29, Number2Value30}
import org.scalatestplus.play.PlaySpec
import uk.gov.hmrc.excisemovementcontrolsystemapi.data.TestXml
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1._
class IEMessageSpec extends PlaySpec with TestXml {
@@ -28,13 +27,13 @@ class IEMessageSpec extends PlaySpec with TestXml {
"convertSubmitterType" should {
"return Consignor" when {
"submitter type is consignor" in {
- testClass.convertSubmitterTypeV1(Number1Value31) mustBe Consignor
+ testClass.convertSubmitterType(Number1Value30) mustBe Consignor
}
}
"return Consignee" when {
"submitter type is consignee" in {
- testClass.convertSubmitterTypeV1(Number2Value30) mustBe Consignee
+ testClass.convertSubmitterType(Number2Value29) mustBe Consignee
}
}
}
@@ -42,199 +41,199 @@ class IEMessageSpec extends PlaySpec with TestXml {
"each message" should {
"have the correct starting tag " when {
"using createFromXml (704) with namespace prefix" in {
- val result = IE704MessageV1.createFromXml(IE704)
+ val result = IE704Message.createFromXml(IE704)
result.key mustBe Some("IE704")
result.namespace mustBe Some("http://www.govtalk.gov.uk/taxation/InternationalTrade/Excise/ie704uk/3")
}
"using createFromXml (704) without namespace prefix" in {
- val result = IE704MessageV1.createFromXml(IE704NoNamespace)
+ val result = IE704Message.createFromXml(IE704NoNamespace)
result.key mustBe Some("IE704")
result.namespace mustBe None
}
"using createFromXml (801) with namespace prefix" in {
- val result = IE801MessageV1.createFromXml(IE801)
+ val result = IE801Message.createFromXml(IE801)
result.key mustBe Some("IE801")
- result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE801:V3.13")
+ result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE801:V3.23")
}
"using createFromXml (801) without namespace prefix" in {
- val result = IE801MessageV1.createFromXml(IE801NoNamespace)
+ val result = IE801Message.createFromXml(IE801NoNamespace)
result.key mustBe Some("IE801")
result.namespace mustBe None
}
"using createFromXml (802) with namespace prefix" in {
- val result = IE802MessageV1.createFromXml(IE802)
+ val result = IE802Message.createFromXml(IE802)
result.key mustBe Some("IE802")
- result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE802:V3.13")
+ result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE802:V3.23")
}
"using createFromXml (802) without namespace prefix" in {
- val result = IE802MessageV1.createFromXml(IE802NoNamespace)
+ val result = IE802Message.createFromXml(IE802NoNamespace)
result.key mustBe Some("IE802")
result.namespace mustBe None
}
"using createFromXml (803) with namespace prefix" in {
- val result = IE803MessageV1.createFromXml(IE803)
+ val result = IE803Message.createFromXml(IE803)
result.key mustBe Some("IE803")
- result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE803:V3.13")
+ result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE803:V3.23")
}
"using createFromXml (803) without namespace prefix" in {
- val result = IE803MessageV1.createFromXml(IE803NoNamespace)
+ val result = IE803Message.createFromXml(IE803NoNamespace)
result.key mustBe Some("IE803")
result.namespace mustBe None
}
"using createFromXml (807) with namespace prefix" in {
- val result = IE807MessageV1.createFromXml(IE807)
+ val result = IE807Message.createFromXml(IE807)
result.key mustBe Some("IE807")
- result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE807:V3.13")
+ result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE807:V3.23")
}
"using createFromXml (807) without namespace prefix" in {
- val result = IE807MessageV1.createFromXml(IE807NoNamespace)
+ val result = IE807Message.createFromXml(IE807NoNamespace)
result.key mustBe Some("IE807")
result.namespace mustBe None
}
"using createFromXml (810) with namespace prefix" in {
- val result = IE810MessageV1.createFromXml(IE810)
+ val result = IE810Message.createFromXml(IE810)
result.key mustBe Some("IE810")
- result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE810:V3.13")
+ result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE810:V3.23")
}
"using createFromXml (810) without namespace prefix" in {
- val result = IE810MessageV1.createFromXml(IE810NoNamespace)
+ val result = IE810Message.createFromXml(IE810NoNamespace)
result.key mustBe Some("IE810")
result.namespace mustBe Some("http://www.hmrc.gov.uk/ChRIS/Service/Control")
}
"using createFromXml (813) with namespace prefix" in {
- val result = IE813MessageV1.createFromXml(IE813)
+ val result = IE813Message.createFromXml(IE813)
result.key mustBe Some("IE813")
- result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE813:V3.13")
+ result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE813:V3.23")
}
"using createFromXml (813) without namespace prefix" in {
- val result = IE813MessageV1.createFromXml(IE813NoNamespace)
+ val result = IE813Message.createFromXml(IE813NoNamespace)
result.key mustBe Some("IE813")
result.namespace mustBe Some("http://www.hmrc.gov.uk/ChRIS/Service/Control")
}
//This message behaves differently to the others
"using createFromXml (815)" in {
- val result = IE815MessageV1.createFromXml(IE815)
+ val result = IE815Message.createFromXml(IE815)
result.toXml.head.label mustBe "IE815"
}
"using createFromXml (818) with namespace prefix" in {
- val result = IE818MessageV1.createFromXml(IE818)
+ val result = IE818Message.createFromXml(IE818)
result.key mustBe Some("IE818")
- result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE818:V3.13")
+ result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE818:V3.23")
}
"using createFromXml (818) without namespace prefix" in {
- val result = IE818MessageV1.createFromXml(IE818NoNamespace)
+ val result = IE818Message.createFromXml(IE818NoNamespace)
result.key mustBe Some("IE818")
result.namespace mustBe Some("http://www.hmrc.gov.uk/ChRIS/Service/Control")
}
"using createFromXml (819) with namespace prefix" in {
- val result = IE819MessageV1.createFromXml(IE819)
+ val result = IE819Message.createFromXml(IE819)
result.key mustBe Some("IE819")
- result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE819:V3.13")
+ result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE819:V3.23")
}
"using createFromXml (819) without namespace prefix" in {
- val result = IE819MessageV1.createFromXml(IE819NoNamespace)
+ val result = IE819Message.createFromXml(IE819NoNamespace)
result.key mustBe Some("IE819")
result.namespace mustBe Some("http://www.hmrc.gov.uk/ChRIS/Service/Control")
}
"using createFromXml (829) with namespace prefix" in {
- val result = IE829MessageV1.createFromXml(IE829)
+ val result = IE829Message.createFromXml(IE829)
result.key mustBe Some("IE829")
- result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE829:V3.13")
+ result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE829:V3.23")
}
"using createFromXml (829) without namespace prefix" in {
- val result = IE829MessageV1.createFromXml(IE829NoNamespace)
+ val result = IE829Message.createFromXml(IE829NoNamespace)
result.key mustBe Some("IE829")
result.namespace mustBe None
}
"using createFromXml (837) with namespace prefix" in {
- val result = IE837MessageV1.createFromXml(IE837WithConsignor)
+ val result = IE837Message.createFromXml(IE837WithConsignor)
result.key mustBe Some("IE837")
- result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE837:V3.13")
+ result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE837:V3.23")
}
"using createFromXml (837) without namespace prefix" in {
- val result = IE837MessageV1.createFromXml(IE837WithConsignorNoNamespace)
+ val result = IE837Message.createFromXml(IE837WithConsignorNoNamespace)
result.key mustBe Some("IE837")
result.namespace mustBe Some("http://www.hmrc.gov.uk/ChRIS/Service/Control")
}
"using createFromXml (839) with namespace prefix" in {
- val result = IE839MessageV1.createFromXml(IE839)
+ val result = IE839Message.createFromXml(IE839)
result.key mustBe Some("IE839")
- result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE839:V3.13")
+ result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE839:V3.23")
}
"using createFromXml (839) without namespace prefix" in {
- val result = IE839MessageV1.createFromXml(IE839NoNamespace)
+ val result = IE839Message.createFromXml(IE839NoNamespace)
result.key mustBe Some("IE839")
result.namespace mustBe None
}
"using createFromXml (840) with namespace prefix" in {
- val result = IE840MessageV1.createFromXml(IE840)
+ val result = IE840Message.createFromXml(IE840)
result.key mustBe Some("IE840")
- result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE840:V3.13")
+ result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE840:V3.23")
}
"using createFromXml (840) without namespace prefix" in {
- val result = IE840MessageV1.createFromXml(IE840NoNamespace)
+ val result = IE840Message.createFromXml(IE840NoNamespace)
result.key mustBe Some("IE840")
result.namespace mustBe None
}
"using createFromXml (871) with namespace prefix" in {
- val result = IE871MessageV1.createFromXml(IE871WithConsignor)
+ val result = IE871Message.createFromXml(IE871WithConsignor)
result.key mustBe Some("IE871")
- result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE871:V3.13")
+ result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE871:V3.23")
}
"using createFromXml (871) without namespace prefix" in {
- val result = IE871MessageV1.createFromXml(IE871WithConsignorNoNamespace)
+ val result = IE871Message.createFromXml(IE871WithConsignorNoNamespace)
result.key mustBe Some("IE871")
result.namespace mustBe Some("http://www.hmrc.gov.uk/ChRIS/Service/Control")
}
"using createFromXml (881) with namespace prefix" in {
- val result = IE881MessageV1.createFromXml(IE881)
+ val result = IE881Message.createFromXml(IE881)
result.key mustBe Some("IE881")
- result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE881:V3.13")
+ result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE881:V3.23")
}
"using createFromXml (881) without namespace prefix" in {
- val result = IE881MessageV1.createFromXml(IE881NoNamespace)
+ val result = IE881Message.createFromXml(IE881NoNamespace)
result.key mustBe Some("IE881")
result.namespace mustBe None
}
"using createFromXml (905) with namespace prefix" in {
- val result = IE905MessageV1.createFromXml(IE905)
+ val result = IE905Message.createFromXml(IE905)
result.key mustBe Some("IE905")
- result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE905:V3.13")
+ result.namespace mustBe Some("urn:publicid:-:EC:DGTAXUD:EMCS:PHASE4:IE905:V3.23")
}
"using createFromXml (905) without namespace prefix" in {
- val result = IE905MessageV1.createFromXml(IE905NoNamespace)
+ val result = IE905Message.createFromXml(IE905NoNamespace)
result.key mustBe Some("IE905")
result.namespace mustBe None
}
@@ -243,294 +242,294 @@ class IEMessageSpec extends PlaySpec with TestXml {
}
"IE704" should {
"return Some(correlationId) when populated" in {
- val result = IE704MessageV1.createFromXml(IE704)
+ val result = IE704Message.createFromXml(IE704)
result.correlationId mustBe Some(testCorrelationId)
}
"return None when correlationId is not populated" in {
- val result = IE704MessageV1.createFromXml(IE704WithoutCorrelationId)
+ val result = IE704Message.createFromXml(IE704WithoutCorrelationId)
result.correlationId mustBe None
}
"return Some(localReferenceNumber) when populated" in {
- val result = IE704MessageV1.createFromXml(IE704)
+ val result = IE704Message.createFromXml(IE704)
result.localReferenceNumber mustBe Some("lrnie8158976912")
}
"return None when it's not populated" in {
- val result = IE704MessageV1.createFromXml(IE704NoLocalReferenceNumber)
+ val result = IE704Message.createFromXml(IE704NoLocalReferenceNumber)
result.localReferenceNumber mustBe None
}
}
"IE801" should {
"return Some(correlationId) when populated" in {
- val result = IE801MessageV1.createFromXml(IE801)
+ val result = IE801Message.createFromXml(IE801)
result.correlationId mustBe Some(testCorrelationId)
}
"return None when correlationId is not populated" in {
- val result = IE801MessageV1.createFromXml(IE801WithoutCorrelationId)
+ val result = IE801Message.createFromXml(IE801WithoutCorrelationId)
result.correlationId mustBe None
}
"always return Some(localReferenceNumber)" in {
- val result = IE801MessageV1.createFromXml(IE801)
+ val result = IE801Message.createFromXml(IE801)
result.optionalLocalReferenceNumber mustBe Some("token")
}
}
"IE802" should {
"return Some(correlationId) when populated" in {
- val result = IE802MessageV1.createFromXml(IE802)
+ val result = IE802Message.createFromXml(IE802)
result.correlationId mustBe Some(testCorrelationId)
}
"return None when correlationId is not populated " in {
- val result = IE802MessageV1.createFromXml(IE802WithoutCorrelationId)
+ val result = IE802Message.createFromXml(IE802WithoutCorrelationId)
result.correlationId mustBe None
}
"always return None for optionalLocalReferenceNumber" in {
- val result = IE802MessageV1.createFromXml(IE802)
+ val result = IE802Message.createFromXml(IE802)
result.optionalLocalReferenceNumber mustBe None
}
}
"IE803" should {
"return Some(correlationId) when populated" in {
- val result = IE803MessageV1.createFromXml(IE803)
+ val result = IE803Message.createFromXml(IE803)
result.correlationId mustBe Some(testCorrelationId)
}
"return None when correlationId is not populated" in {
- val result = IE803MessageV1.createFromXml(IE803WithoutCorrelationId)
+ val result = IE803Message.createFromXml(IE803WithoutCorrelationId)
result.correlationId mustBe None
}
"always return None for optionalLocalReferenceNumber" in {
- val result = IE803MessageV1.createFromXml(IE803)
+ val result = IE803Message.createFromXml(IE803)
result.optionalLocalReferenceNumber mustBe None
}
}
"IE807" should {
"return Some(correlationId) when populated" in {
- val result = IE807MessageV1.createFromXml(IE807)
+ val result = IE807Message.createFromXml(IE807)
result.correlationId mustBe Some(testCorrelationId)
}
"return None when correlationId is not populated" in {
- val result = IE807MessageV1.createFromXml(IE807WithoutCorrelationId)
+ val result = IE807Message.createFromXml(IE807WithoutCorrelationId)
result.correlationId mustBe None
}
"always return None for optionalLocalReferenceNumber" in {
- val result = IE807MessageV1.createFromXml(IE807)
+ val result = IE807Message.createFromXml(IE807)
result.optionalLocalReferenceNumber mustBe None
}
}
"IE810" should {
"return Some(correlationId) when populated" in {
- val result = IE810MessageV1.createFromXml(IE810)
+ val result = IE810Message.createFromXml(IE810)
result.correlationId mustBe Some(testCorrelationId)
}
"return None when correlationId is not populated" in {
- val result = IE810MessageV1.createFromXml(IE810WithoutCorrelationId)
+ val result = IE810Message.createFromXml(IE810WithoutCorrelationId)
result.correlationId mustBe None
}
"always return None for optionalLocalReferenceNumber" in {
- val result = IE810MessageV1.createFromXml(IE810)
+ val result = IE810Message.createFromXml(IE810)
result.optionalLocalReferenceNumber mustBe None
}
}
"IE813" should {
"return Some(correlationId) when populated" in {
- val result = IE813MessageV1.createFromXml(IE813)
+ val result = IE813Message.createFromXml(IE813)
result.correlationId mustBe Some(testCorrelationId)
}
"return None when correlationId is not populated" in {
- val result = IE813MessageV1.createFromXml(IE813WithoutCorrelationId)
+ val result = IE813Message.createFromXml(IE813WithoutCorrelationId)
result.correlationId mustBe None
}
"always return None for optionalLocalReferenceNumber" in {
- val result = IE813MessageV1.createFromXml(IE813)
+ val result = IE813Message.createFromXml(IE813)
result.optionalLocalReferenceNumber mustBe None
}
}
"IE815" should {
"return Some(correlationId) when populated" in {
- val result = IE815MessageV1.createFromXml(IE815)
+ val result = IE815Message.createFromXml(IE815)
result.correlationId mustBe Some(testCorrelationId)
}
"return None when correlationId is not populated" in {
- val result = IE815MessageV1.createFromXml(IE815WithoutCorrelationId)
+ val result = IE815Message.createFromXml(IE815WithoutCorrelationId)
result.correlationId mustBe None
}
"always return Some(localReferenceNumber)" in {
- val result = IE815MessageV1.createFromXml(IE815)
+ val result = IE815Message.createFromXml(IE815)
result.optionalLocalReferenceNumber mustBe Some("LRNQA20230909022221")
}
}
"IE818" should {
"return Some(correlationId) when populated" in {
- val result = IE818MessageV1.createFromXml(IE818)
+ val result = IE818Message.createFromXml(IE818)
result.correlationId mustBe Some(testCorrelationId)
}
"return None when correlationId is not populated" in {
- val result = IE818MessageV1.createFromXml(IE818WithoutCorrelationId)
+ val result = IE818Message.createFromXml(IE818WithoutCorrelationId)
result.correlationId mustBe None
}
"always return None for optionalLocalReferenceNumber" in {
- val result = IE818MessageV1.createFromXml(IE818)
+ val result = IE818Message.createFromXml(IE818)
result.optionalLocalReferenceNumber mustBe None
}
}
"IE819" should {
"return Some(correlationId) when populated" in {
- val result = IE819MessageV1.createFromXml(IE819)
+ val result = IE819Message.createFromXml(IE819)
result.correlationId mustBe Some(testCorrelationId)
}
"return None when correlationId is not populated" in {
- val result = IE819MessageV1.createFromXml(IE819WithoutCorrelationId)
+ val result = IE819Message.createFromXml(IE819WithoutCorrelationId)
result.correlationId mustBe None
}
"always return None for optionalLocalReferenceNumber" in {
- val result = IE819MessageV1.createFromXml(IE819)
+ val result = IE819Message.createFromXml(IE819)
result.optionalLocalReferenceNumber mustBe None
}
}
"IE829" should {
"return Some(correlationId) when populated" in {
- val result = IE829MessageV1.createFromXml(IE829)
+ val result = IE829Message.createFromXml(IE829)
result.correlationId mustBe Some(testCorrelationId)
}
"return None when correlationId is not populated" in {
- val result = IE829MessageV1.createFromXml(IE829WithoutCorrelationId)
+ val result = IE829Message.createFromXml(IE829WithoutCorrelationId)
result.correlationId mustBe None
}
"always return None for optionalLocalReferenceNumber" in {
- val result = IE829MessageV1.createFromXml(IE829)
+ val result = IE829Message.createFromXml(IE829)
result.optionalLocalReferenceNumber mustBe None
}
}
"IE837" should {
"return Some(correlationId) when populated" in {
- val result = IE837MessageV1.createFromXml(IE837WithConsignor)
+ val result = IE837Message.createFromXml(IE837WithConsignor)
result.correlationId mustBe Some(testCorrelationId)
}
"return None when correlationId is not populated" in {
- val result = IE837MessageV1.createFromXml(IE837WithoutCorrelationId)
+ val result = IE837Message.createFromXml(IE837WithoutCorrelationId)
result.correlationId mustBe None
}
"always return None for optionalLocalReferenceNumber" in {
- val result = IE837MessageV1.createFromXml(IE837WithConsignor)
+ val result = IE837Message.createFromXml(IE837WithConsignor)
result.optionalLocalReferenceNumber mustBe None
}
}
"IE839" should {
"return Some(correlationId) when populated" in {
- val result = IE839MessageV1.createFromXml(IE839)
+ val result = IE839Message.createFromXml(IE839)
result.correlationId mustBe Some(testCorrelationId)
}
"return None when correlationId is not populated" in {
- val result = IE839MessageV1.createFromXml(IE839WithoutCorrelationId)
+ val result = IE839Message.createFromXml(IE839WithoutCorrelationId)
result.correlationId mustBe None
}
"return Some(localReferenceNumber) when populated" in {
- val result = IE839MessageV1.createFromXml(IE839)
+ val result = IE839Message.createFromXml(IE839)
result.optionalLocalReferenceNumber mustBe Some("lrnie8155755329")
}
"return None when it's not populated" in {
- val result = IE839MessageV1.createFromXml(IE839NoLocalReferenceNumber)
+ val result = IE839Message.createFromXml(IE839NoLocalReferenceNumber)
result.optionalLocalReferenceNumber mustBe None
}
}
"IE840" should {
"return Some(correlationId) when populated" in {
- val result = IE840MessageV1.createFromXml(IE840)
+ val result = IE840Message.createFromXml(IE840)
result.correlationId mustBe Some(testCorrelationId)
}
"return None when correlationId is not populated" in {
- val result = IE840MessageV1.createFromXml(IE840WithoutCorrelationId)
+ val result = IE840Message.createFromXml(IE840WithoutCorrelationId)
result.correlationId mustBe None
}
"always return None for optionalLocalReferenceNumber" in {
- val result = IE840MessageV1.createFromXml(IE840)
+ val result = IE840Message.createFromXml(IE840)
result.optionalLocalReferenceNumber mustBe None
}
}
"IE871" should {
"return Some(correlationId) when populated" in {
- val result = IE871MessageV1.createFromXml(IE871WithConsignor)
+ val result = IE871Message.createFromXml(IE871WithConsignor)
result.correlationId mustBe Some(testCorrelationId)
}
"return None when correlationId is not populated" in {
- val result = IE871MessageV1.createFromXml(IE871WithoutCorrelationId)
+ val result = IE871Message.createFromXml(IE871WithoutCorrelationId)
result.correlationId mustBe None
}
"always return None for optionalLocalReferenceNumber" in {
- val result = IE871MessageV1.createFromXml(IE871WithConsignor)
+ val result = IE871Message.createFromXml(IE871WithConsignor)
result.optionalLocalReferenceNumber mustBe None
}
}
"IE881" should {
"return Some(correlationId) when populated" in {
- val result = IE881MessageV1.createFromXml(IE881)
+ val result = IE881Message.createFromXml(IE881)
result.correlationId mustBe Some(testCorrelationId)
}
"return None when correlationId is not populated" in {
- val result = IE881MessageV1.createFromXml(IE881WithoutCorrelationId)
+ val result = IE881Message.createFromXml(IE881WithoutCorrelationId)
result.correlationId mustBe None
}
"always return None for optionalLocalReferenceNumber" in {
- val result = IE881MessageV1.createFromXml(IE881)
+ val result = IE881Message.createFromXml(IE881)
result.optionalLocalReferenceNumber mustBe None
}
}
"IE905" should {
"return Some(correlationId) when populated" in {
- val result = IE905MessageV1.createFromXml(IE905)
+ val result = IE905Message.createFromXml(IE905)
result.correlationId mustBe Some(testCorrelationId)
}
"return None when correlationId is not populated" in {
- val result = IE905MessageV1.createFromXml(IE905WithoutCorrelationId)
+ val result = IE905Message.createFromXml(IE905WithoutCorrelationId)
result.correlationId mustBe None
}
"always return None for optionalLocalReferenceNumber" in {
- val result = IE905MessageV1.createFromXml(IE905)
+ val result = IE905Message.createFromXml(IE905)
result.optionalLocalReferenceNumber mustBe None
}
}
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/models/validation/MessageValidationSpec.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/models/validation/MessageValidationSpec.scala
index 6bc364544..f72468021 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/models/validation/MessageValidationSpec.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/models/validation/MessageValidationSpec.scala
@@ -24,7 +24,6 @@ import play.api.libs.json.Json
import play.api.mvc.Results.{BadRequest, Forbidden}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.ErrorResponse
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1._
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.Movement
import java.time.Instant
@@ -33,11 +32,11 @@ class MessageValidationSpec extends PlaySpec with EitherValues {
private val authorisedErns = Set("123", "456")
private val movement = mock[Movement]
- private val messageValidation = MessageValidationV1()
+ private val messageValidation = MessageValidation()
private val timestamp = Instant.now()
"validateDraftMovement" should {
- val ie815 = mock[IE815MessageV1]
+ val ie815 = mock[IE815Message]
"return consignor id" when {
"the consignor id is authorised" in {
@@ -61,7 +60,7 @@ class MessageValidationSpec extends PlaySpec with EitherValues {
"validateSubmittedMessage" when {
"an IE810 message" should {
- val ie810 = mock[IE810MessageV1]
+ val ie810 = mock[IE810Message]
"return movement consignor id" when {
"the consignor id is authorised and message ARC matches movement ARC" in {
@@ -97,7 +96,7 @@ class MessageValidationSpec extends PlaySpec with EitherValues {
}
"an IE813 message" should {
- val ie813 = mock[IE813MessageV1]
+ val ie813 = mock[IE813Message]
"return movement consignor id" when {
"the consignor id is authorised and message ARC matches movement ARC" in {
@@ -134,7 +133,7 @@ class MessageValidationSpec extends PlaySpec with EitherValues {
}
"an IE818 message" should {
- val ie818 = mock[IE818MessageV1]
+ val ie818 = mock[IE818Message]
"return movement consignee id" when {
"the consignee id is authorised and message consignee matches the movement consignee and message ARC matches movement ARC" in {
@@ -195,7 +194,7 @@ class MessageValidationSpec extends PlaySpec with EitherValues {
}
"an IE819 message" should {
- val ie819 = mock[IE819MessageV1]
+ val ie819 = mock[IE819Message]
"return movement consignee id" when {
"the consignee id is authorised and message consignee matches the movement consignee and message ARC matches movement ARC" in {
@@ -256,7 +255,7 @@ class MessageValidationSpec extends PlaySpec with EitherValues {
}
"an IE837 message" should {
- val ie837 = mock[IE837MessageV1]
+ val ie837 = mock[IE837Message]
"return movement consignor id" when {
"the consignor is being used and the consignor id is authorised and message consignor matches the movement consignor and message ARC matches movement ARC" in {
@@ -405,7 +404,7 @@ class MessageValidationSpec extends PlaySpec with EitherValues {
}
"an IE871 message" should {
- val ie871 = mock[IE871MessageV1]
+ val ie871 = mock[IE871Message]
"return movement consignor id" when {
"the consignor is being used and the consignor id is authorised and message consignor matches the movement consignor and message ARC matches movement ARC" in {
@@ -556,7 +555,7 @@ class MessageValidationSpec extends PlaySpec with EitherValues {
"return invalid message type" when {
"message type is not supported by the SubmitMessage endpoint" in {
- val ie801 = mock[IE801MessageV1]
+ val ie801 = mock[IE801Message]
when(ie801.messageType).thenReturn("IE801")
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/scheduling/PollingNewMessagesJobSpec.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/scheduling/PollingNewMessagesJobSpec.scala
index 583c67738..c7b158ab6 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/scheduling/PollingNewMessagesJobSpec.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/scheduling/PollingNewMessagesJobSpec.scala
@@ -70,7 +70,7 @@ class PollingNewMessagesJobSpec
"scheduler.pollingNewMessagesJob.fastPollingCutoff" -> "15 minutes",
"scheduler.pollingNewMessagesJob.slowPollingInterval" -> "30 minutes",
"scheduler.pollingNewMessagesJob.numberOfInstances" -> "1337",
- "featureFlags.pollingNewMessagesEnabled" -> false
+ "featureFlags.pollingNewMessagesEnabled" -> false
)
.build()
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/AuditServiceSpec.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/AuditServiceSpec.scala
index a6d4647a7..ceaaab3d8 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/AuditServiceSpec.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/AuditServiceSpec.scala
@@ -28,13 +28,12 @@ import play.api.test.Helpers.{await, defaultAwaitTimeout}
import play.api.test.{FakeHeaders, FakeRequest}
import uk.gov.hmrc.excisemovementcontrolsystemapi.config.AppConfig
import uk.gov.hmrc.excisemovementcontrolsystemapi.data.TestXml
-import uk.gov.hmrc.excisemovementcontrolsystemapi.factories.{IEMessageFactory, IEMessageFactoryV1}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.factories.IEMessageFactory
import uk.gov.hmrc.excisemovementcontrolsystemapi.filters.MovementFilter
import uk.gov.hmrc.excisemovementcontrolsystemapi.fixture.FakeXmlParsers
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing._
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auth.{EnrolmentRequest, ParsedXmlRequest}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1._
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Message, Movement}
import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.EmcsUtils
import uk.gov.hmrc.http.HeaderCarrier
@@ -53,8 +52,8 @@ class AuditServiceSpec extends PlaySpec with TestXml with BeforeAndAfterEach wit
val auditConnector: AuditConnector = mock[AuditConnector]
val appConfig: AppConfig = mock[AppConfig]
val utils = new EmcsUtils
- val ieMessageFactory = new IEMessageFactoryV1
- val factory: AuditEventFactory = new AuditEventFactoryV1(utils, ieMessageFactory)
+ val ieMessageFactory = new IEMessageFactory
+ val factory: AuditEventFactory = new AuditEventFactory(utils, new IEMessageFactory)
val testMovement: Movement = Movement("id", None, "lrn", "consignorId", None, None, Instant.now, Seq.empty[Message])
val testErns: Set[String] = Set("123", "456")
@@ -68,7 +67,7 @@ class AuditServiceSpec extends PlaySpec with TestXml with BeforeAndAfterEach wit
testErns,
UserDetails("", "")
),
- IE815MessageV1.createFromXml(body),
+ IE815Message.createFromXml(body),
testErns,
UserDetails("", "")
)
@@ -93,22 +92,22 @@ class AuditServiceSpec extends PlaySpec with TestXml with BeforeAndAfterEach wit
when(auditConnector.sendExtendedEvent(any)(any, any))
.thenReturn(Future.successful(AuditResult.Failure("test", None)))
- val service = new AuditServiceV1(auditConnector, appConfig, factory)
- val result = service.auditMessage(IE815MessageV1.createFromXml(IE815))
+ val service = new AuditService(auditConnector, appConfig, factory)
+ val result = service.auditMessage(IE815Message.createFromXml(IE815))
await(result.value) equals Right(())
}
"return Right(())) on success" in {
- val service = new AuditServiceV1(auditConnector, appConfig, factory)
- val result = service.auditMessage(IE815MessageV1.createFromXml(IE815))
+ val service = new AuditService(auditConnector, appConfig, factory)
+ val result = service.auditMessage(IE815Message.createFromXml(IE815))
await(result.value) equals Right(())
}
}
- val service = new AuditServiceV1(auditConnector, appConfig, factory)
+ val service = new AuditService(auditConnector, appConfig, factory)
"messageSubmittedNoMovement" should {
@@ -116,7 +115,7 @@ class AuditServiceSpec extends PlaySpec with TestXml with BeforeAndAfterEach wit
"post an event if newAuditing feature switch is true" in {
- val message = IE815MessageV1.createFromXml(IE815)
+ val message = IE815Message.createFromXml(IE815)
val expectedMessageSubmittedDetails = MessageSubmittedDetails(
"IE815",
@@ -145,7 +144,7 @@ class AuditServiceSpec extends PlaySpec with TestXml with BeforeAndAfterEach wit
when(appConfig.newAuditingEnabled).thenReturn(false)
service.messageSubmittedNoMovement(
- IE815MessageV1.createFromXml(IE815),
+ IE815Message.createFromXml(IE815),
submittedToCore = true,
Some("correlationId"),
request
@@ -169,12 +168,12 @@ class AuditServiceSpec extends PlaySpec with TestXml with BeforeAndAfterEach wit
testErns,
UserDetails("", "")
),
- IE704MessageV1.createFromXml(IE704),
+ IE704Message.createFromXml(IE704),
testErns,
UserDetails("", "")
)
- val message = IE704MessageV1.createFromXml(IE704)
+ val message = IE704Message.createFromXml(IE704)
val movementId = "4bf36235-4816-464a-b3f3-71dbd3a30095"
val movement = Movement(
@@ -377,7 +376,7 @@ class AuditServiceSpec extends PlaySpec with TestXml with BeforeAndAfterEach wit
Some(jobId)
)
- val getMessagesResponse = GetMessagesResponse(Seq(IE801MessageV1.createFromXml(IE801)), 10)
+ val getMessagesResponse = GetMessagesResponse(Seq(IE801Message.createFromXml(IE801)), 10)
service.messageProcessingSuccess(ern, getMessagesResponse, batchId, Some(jobId))
verify(auditConnector, times(1))
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MessageServiceSpec.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MessageServiceSpec.scala
index 19ca74ed6..14ac82d8a 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MessageServiceSpec.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MessageServiceSpec.scala
@@ -45,7 +45,6 @@ import uk.gov.hmrc.excisemovementcontrolsystemapi.data.XmlMessageGeneratorFactor
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageReceiptSuccessResponse
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.MessageTypes._
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1._
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.BoxIdRepository
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.ErnRetrievalRepository
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.MovementRepository
@@ -158,7 +157,7 @@ class MessageServiceSpec
messages = Seq(Message(utils.encode(ie801.toString()), "IE801", "GB00001", ern, Set.empty, now)),
lastUpdated = updateOrCreateTimestamp.minus(1, ChronoUnit.DAYS)
)
- val messages = Seq(IE704MessageV1.createFromXml(ie704))
+ val messages = Seq(IE704Message.createFromXml(ie704))
when(movementRepository.getAllBy(any, any, any)).thenReturn(Future.successful(Seq(movement)))
when(movementRepository.saveMovement(any)).thenReturn(Future.successful(Done))
@@ -205,7 +204,7 @@ class MessageServiceSpec
)
val acknowledgementResponse = MessageReceiptSuccessResponse(now, ern, 1)
- val messages = Seq(IE704MessageV1.createFromXml(ie704))
+ val messages = Seq(IE704Message.createFromXml(ie704))
when(movementRepository.getAllBy(any, any, any)).thenReturn(Future.successful(Seq(movement)))
when(movementRepository.saveMovement(any)).thenReturn(Future.successful(Done))
@@ -268,7 +267,7 @@ class MessageServiceSpec
ern,
MessageParams(IE704, "XI000001", localReferenceNumber = Some("lrnie8158976912"))
)
- val messages = Seq(IE704MessageV1.createFromXml(ie704))
+ val messages = Seq(IE704Message.createFromXml(ie704))
val expectedMessages =
Seq(
Message(
@@ -321,7 +320,7 @@ class MessageServiceSpec
ern,
MessageParams(IE704, "XI000001", localReferenceNumber = Some("lrnie8158976912"))
)
- val messages = Seq(IE704MessageV1.createFromXml(ie704))
+ val messages = Seq(IE704Message.createFromXml(ie704))
val expectedMessages =
Seq(
Message(
@@ -382,7 +381,7 @@ class MessageServiceSpec
Some("lrn1")
)
)
- val messages = Seq(IE801MessageV1.createFromXml(ie801), IE818MessageV1.createFromXml(ie818))
+ val messages = Seq(IE801Message.createFromXml(ie801), IE818Message.createFromXml(ie818))
val arcMovement = Movement(
None,
"lrn1",
@@ -492,7 +491,7 @@ class MessageServiceSpec
)
val acknowledgementResponse = MessageReceiptSuccessResponse(now, ern, 1)
- val messages = Seq(IE704MessageV1.createFromXml(ie704))
+ val messages = Seq(IE704Message.createFromXml(ie704))
val expectedMessages = movement.messages ++ Seq(
Message(
utils.encode(messages.head.toXml.toString()),
@@ -546,7 +545,7 @@ class MessageServiceSpec
val arc2 = "23XI00000000000056340"
val movement1 = Movement(None, "???", "???", None, Some(arc1), movement1Timestamp, Seq.empty)
val movement2 = Movement(None, "???", "???", None, Some(arc2), movement2Timestamp, Seq.empty)
- val message = IE829MessageV1.createFromXml(ie829)
+ val message = IE829Message.createFromXml(ie829)
val expectedMessage1 =
Seq(
@@ -612,7 +611,7 @@ class MessageServiceSpec
ern,
MessageParams(IE704, "XI000001", localReferenceNumber = Some("lrnie8158976912"))
)
- val messages = Seq(IE704MessageV1.createFromXml(ie704))
+ val messages = Seq(IE704Message.createFromXml(ie704))
val expectedMovement = Movement(
newId,
None,
@@ -670,7 +669,7 @@ class MessageServiceSpec
Some("lrnie8158976912")
)
)
- val messages = Seq(IE801MessageV1.createFromXml(ie801))
+ val messages = Seq(IE801Message.createFromXml(ie801))
val expectedMovement = Movement(
newId,
None,
@@ -739,7 +738,7 @@ class MessageServiceSpec
Some("lrnie8158976912")
)
)
- val messages = Seq(IE801MessageV1.createFromXml(ie801))
+ val messages = Seq(IE801Message.createFromXml(ie801))
val expectedMovement = Movement(
newId,
None,
@@ -809,14 +808,14 @@ class MessageServiceSpec
Some("lrnie8158976912")
)
)
- val ie801MessageV1 = IE801MessageV1.createFromXml(ie801Xml)
+ val ie801Message = IE801Message.createFromXml(ie801Xml)
val ie818Xml = XmlMessageGeneratorFactory.generate(
consignor,
MessageParams(IE818, "GB00002", Some(consignee), Some("23XI00000000000000012"))
)
- val ie818MessageV1 = IE818MessageV1.createFromXml(ie818Xml)
- val messages = Seq(ie818MessageV1)
- val traderMovementMessages = Seq(ie801MessageV1, ie818MessageV1)
+ val ie818Message = IE818Message.createFromXml(ie818Xml)
+ val messages = Seq(ie818Message)
+ val traderMovementMessages = Seq(ie801Message, ie818Message)
val expectedMovement = Movement(
newId,
None,
@@ -827,7 +826,7 @@ class MessageServiceSpec
updateOrCreateTimestamp,
messages = Seq(
Message(
- utils.encode(ie801MessageV1.toXml.toString()),
+ utils.encode(ie801Message.toXml.toString()),
"IE801",
"GB00001",
consignor,
@@ -835,7 +834,7 @@ class MessageServiceSpec
updateOrCreateTimestamp
),
Message(
- utils.encode(ie801MessageV1.toXml.toString()),
+ utils.encode(ie801Message.toXml.toString()),
"IE801",
"GB00001",
consignee,
@@ -843,7 +842,7 @@ class MessageServiceSpec
updateOrCreateTimestamp
),
Message(
- utils.encode(ie818MessageV1.toXml.toString()),
+ utils.encode(ie818Message.toXml.toString()),
"IE818",
"GB00002",
consignor,
@@ -890,7 +889,7 @@ class MessageServiceSpec
ern,
MessageParams(IE818, "GB00001", Some("testConsignee"), Some("23XI00000000000000012"))
)
- val messages = Seq(IE818MessageV1.createFromXml(ie818))
+ val messages = Seq(IE818Message.createFromXml(ie818))
when(auditService.auditMessage(any, any)(any)).thenReturn(EitherT.pure(()))
when(movementRepository.getAllBy(any, any, any)).thenReturn(Future.successful(Seq.empty))
@@ -928,7 +927,7 @@ class MessageServiceSpec
ern,
MessageParams(IE704, "XI000001", administrativeReferenceCode = Some("23XI00000000000000012"))
)
- val messages = Seq(IE704MessageV1.createFromXml(ie704))
+ val messages = Seq(IE704Message.createFromXml(ie704))
when(auditService.auditMessage(any, any)(any)).thenReturn(EitherT.pure(()))
when(movementRepository.getAllBy(any, any, any)).thenReturn(Future.successful(Seq.empty))
@@ -981,7 +980,7 @@ class MessageServiceSpec
consignor,
MessageParams(IE802, "GB0002", administrativeReferenceCode = Some("23XI00000000000000012"))
)
- val messages = Seq(IE801MessageV1.createFromXml(ie801), IE802MessageV1.createFromXml(ie802))
+ val messages = Seq(IE801Message.createFromXml(ie801), IE802Message.createFromXml(ie802))
val expectedMovement = Movement(
newId,
None,
@@ -1061,7 +1060,7 @@ class MessageServiceSpec
consignor,
MessageParams(IE704, "XI000001", localReferenceNumber = Some("lrnie8158976912"))
)
- val firstMessage = IE704MessageV1.createFromXml(ie704)
+ val firstMessage = IE704Message.createFromXml(ie704)
val firstExpectedMessage =
Message(
utils.encode(firstMessage.toXml.toString()),
@@ -1076,7 +1075,7 @@ class MessageServiceSpec
consignor,
MessageParams(IE704, "XI000002", localReferenceNumber = Some("lrnie8158976912"))
)
- val secondMessage = IE704MessageV1.createFromXml(ie7042)
+ val secondMessage = IE704Message.createFromXml(ie7042)
val secondExpectedMessage =
Message(
utils.encode(secondMessage.toXml.toString()),
@@ -1097,7 +1096,7 @@ class MessageServiceSpec
Some("lrnie8158976912")
)
)
- val thirdMessage = IE801MessageV1.createFromXml(ie801)
+ val thirdMessage = IE801Message.createFromXml(ie801)
val thirdExpectedMessage =
Message(
utils.encode(thirdMessage.toXml.toString()),
@@ -1190,9 +1189,9 @@ class MessageServiceSpec
MessageParams(IE801, "message3", Some(consignee), Some("arc3"), Some("lrn3"))
)
val messages = Seq(
- IE801MessageV1.createFromXml(ie801_1),
- IE801MessageV1.createFromXml(ie801_2),
- IE801MessageV1.createFromXml(ie801_3)
+ IE801Message.createFromXml(ie801_1),
+ IE801Message.createFromXml(ie801_2),
+ IE801Message.createFromXml(ie801_3)
)
val expectedMovement1 = movement1.copy(
administrativeReferenceCode = Some("arc1"),
@@ -1369,7 +1368,7 @@ class MessageServiceSpec
Some("lrnie8158976912")
)
)
- val messages = Seq(IE801MessageV1.createFromXml(ie801))
+ val messages = Seq(IE801Message.createFromXml(ie801))
val expectedMessages =
Seq(
Message(
@@ -1438,7 +1437,7 @@ class MessageServiceSpec
consignor,
MessageParams(IE801, "GB00001", Some(newConsignee), Some("23XI00000000000000012"), Some("lrnie8158976912"))
)
- val messages = Seq(IE801MessageV1.createFromXml(ie801))
+ val messages = Seq(IE801Message.createFromXml(ie801))
val expectedMessages =
Seq(
Message(
@@ -1501,7 +1500,7 @@ class MessageServiceSpec
ern,
MessageParams(IE813, "GB00001", Some(newConsignee), Some("23XI00000000000000012"), Some("lrnie8158976912"))
)
- val messages = Seq(IE813MessageV1.createFromXml(ie813))
+ val messages = Seq(IE813Message.createFromXml(ie813))
val expectedMessages =
Seq(
Message(
@@ -1544,7 +1543,7 @@ class MessageServiceSpec
consignor,
MessageParams(IE801, "GB00001", Some(consignee), Some("23XI00000000000000012"), Some("lrnie8158976912"))
)
- val messages = Seq(IE801MessageV1.createFromXml(ie801))
+ val messages = Seq(IE801Message.createFromXml(ie801))
val expectedMessages =
Seq(
Message(
@@ -1605,7 +1604,7 @@ class MessageServiceSpec
ern,
MessageParams(IE813, "GB00001", Some("testConsignee"), Some("23XI00000000000000012"), Some("lrnie8158976912"))
)
- val messages = Seq(IE813MessageV1.createFromXml(ie813))
+ val messages = Seq(IE813Message.createFromXml(ie813))
val expectedMessages =
Seq(
Message(
@@ -1657,7 +1656,7 @@ class MessageServiceSpec
consignor,
MessageParams(IE801, "GB00001", Some("testConsignee"), Some("23XI00000000000000012"), Some("lrnie8158976912"))
)
- val messages = Seq(IE801MessageV1.createFromXml(ie801))
+ val messages = Seq(IE801Message.createFromXml(ie801))
val expectedMessages =
Seq(
Message(
@@ -1726,7 +1725,7 @@ class MessageServiceSpec
Some("lrnie8158976912")
)
)
- val messages = Seq(IE801MessageV1.createFromXml(ie801), IE801MessageV1.createFromXml(ie801))
+ val messages = Seq(IE801Message.createFromXml(ie801), IE801Message.createFromXml(ie801))
val expectedMessages =
Seq(
Message(
@@ -1783,7 +1782,7 @@ class MessageServiceSpec
Some("lrnie8158976912")
)
)
- val messages = Seq(IE801MessageV1.createFromXml(ie801))
+ val messages = Seq(IE801Message.createFromXml(ie801))
val existingMessages =
Seq(Message(utils.encode(messages.head.toXml.toString()), "IE801", "GB00001", ern, Set.empty, now))
val movement = Movement(
@@ -1840,7 +1839,7 @@ class MessageServiceSpec
)
)
- val messages = Seq(IE801MessageV1.createFromXml(ie801), IE801MessageV1.createFromXml(ie801Consignee))
+ val messages = Seq(IE801Message.createFromXml(ie801), IE801Message.createFromXml(ie801Consignee))
val existingMessages =
Seq(
@@ -1910,7 +1909,7 @@ class MessageServiceSpec
)
val new801WithSubstringLrn = Seq(
- IE801MessageV1.createFromXml(
+ IE801Message.createFromXml(
XmlMessageGeneratorFactory.generate(
ern,
MessageParams(
@@ -1994,7 +1993,7 @@ class MessageServiceSpec
val acknowledgementResponse = MessageReceiptSuccessResponse(now, "ern1", 1)
val ern1NewMessages = Seq(
- IE704MessageV1.createFromXml(
+ IE704Message.createFromXml(
XmlMessageGeneratorFactory
.generate("ern1", MessageParams(IE704, "messageId1", localReferenceNumber = Some("lrn1")))
)
@@ -2009,7 +2008,7 @@ class MessageServiceSpec
)
)
val ern2NewMessages = Seq(
- IE704MessageV1.createFromXml(
+ IE704Message.createFromXml(
XmlMessageGeneratorFactory
.generate("ern2", MessageParams(IE704, "messageId2", localReferenceNumber = Some("lrn2")))
)
@@ -2052,7 +2051,7 @@ class MessageServiceSpec
val acknowledgementResponse = MessageReceiptSuccessResponse(now, "ern1", 1)
val ern1NewMessages = Seq(
- IE704MessageV1.createFromXml(
+ IE704Message.createFromXml(
XmlMessageGeneratorFactory
.generate("ern1", MessageParams(IE704, "messageId1", localReferenceNumber = Some("lrn1")))
)
@@ -2067,7 +2066,7 @@ class MessageServiceSpec
)
)
val ern2NewMessages = Seq(
- IE704MessageV1.createFromXml(
+ IE704Message.createFromXml(
XmlMessageGeneratorFactory
.generate("ern2", MessageParams(IE704, "messageId2", localReferenceNumber = Some("lrn2")))
)
@@ -2114,18 +2113,18 @@ class MessageServiceSpec
val message2Timestamp = message1Timestamp.plus(1, ChronoUnit.SECONDS)
val message3Timestamp = message2Timestamp.plus(1, ChronoUnit.SECONDS)
val message4Timestamp = message3Timestamp.plus(1, ChronoUnit.SECONDS)
- val message1 = IE801MessageV1.createFromXml(
+ val message1 = IE801Message.createFromXml(
XmlMessageGeneratorFactory
.generate("ern1", MessageParams(IE801, "XI0000021a", Some("AT00000602078"), Some("arc"), Some("lrn1")))
)
- val message2 = IE819MessageV1.createFromXml(
+ val message2 = IE819Message.createFromXml(
XmlMessageGeneratorFactory.generate("ern1", MessageParams(IE819, "X00008a", Some("token"), Some("arc")))
)
- val message3 = IE807MessageV1.createFromXml(
+ val message3 = IE807Message.createFromXml(
XmlMessageGeneratorFactory
.generate("ern1", MessageParams(IE807, "XI0000021b", Some("AT00000602078"), Some("arc"), Some("lrn1")))
)
- val message4 = IE840MessageV1.createFromXml(
+ val message4 = IE840Message.createFromXml(
XmlMessageGeneratorFactory.generate("ern1", MessageParams(IE840, "X00008b", Some("token"), Some("arc")))
)
@@ -2233,21 +2232,21 @@ class MessageServiceSpec
val message3Timestamp = message2Timestamp.plus(1, ChronoUnit.SECONDS)
val message4Timestamp = message3Timestamp.plus(1, ChronoUnit.SECONDS)
val message5Timestamp = message4Timestamp.plus(1, ChronoUnit.SECONDS)
- val message1 = IE801MessageV1.createFromXml(
+ val message1 = IE801Message.createFromXml(
XmlMessageGeneratorFactory
.generate("ern1", MessageParams(IE801, "XI0000021a", Some("AT00000602078"), Some("arc"), Some("lrn1")))
)
- val message2 = IE819MessageV1.createFromXml(
+ val message2 = IE819Message.createFromXml(
XmlMessageGeneratorFactory.generate("ern1", MessageParams(IE819, "X00008a", Some("token"), Some("arc")))
)
- val message3 = IE807MessageV1.createFromXml(
+ val message3 = IE807Message.createFromXml(
XmlMessageGeneratorFactory
.generate("ern1", MessageParams(IE807, "XI0000021b", Some("AT00000602078"), Some("arc"), Some("lrn1")))
)
- val message4 = IE840MessageV1.createFromXml(
+ val message4 = IE840Message.createFromXml(
XmlMessageGeneratorFactory.generate("ern1", MessageParams(IE840, "X00008b", Some("token"), Some("arc")))
)
- val message5 = IE801MessageV1.createFromXml(
+ val message5 = IE801Message.createFromXml(
XmlMessageGeneratorFactory
.generate("ern1", MessageParams(IE801, "XI0000099", Some("AT00000602078"), Some("arc2"), Some("lrn2")))
)
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MovementServiceSpec.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MovementServiceSpec.scala
index 9a2bee68c..2c4fa3deb 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MovementServiceSpec.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/MovementServiceSpec.scala
@@ -31,8 +31,7 @@ import play.api.mvc.Results.{BadRequest, InternalServerError}
import play.api.test.Helpers.{await, defaultAwaitTimeout}
import uk.gov.hmrc.excisemovementcontrolsystemapi.data.{MessageParams, TestXml, XmlMessageGeneratorFactory}
import uk.gov.hmrc.excisemovementcontrolsystemapi.filters.{MovementFilter, TraderType}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.IE704MessageV1
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{IE704Message, IEMessage}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.{ErrorResponse, MessageTypes}
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.MovementRepository
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.{Message, Movement}
@@ -73,7 +72,7 @@ class MovementServiceSpec extends PlaySpec with EitherValues with BeforeAndAfter
"ern",
MessageParams(MessageTypes.IE704, "XI000001", localReferenceNumber = Some("lrnie8158976912"))
)
- private val ieMessage = IE704MessageV1.createFromXml(ie704)
+ private val ieMessage = IE704Message.createFromXml(ie704)
private val exampleMessage = Message(
utils.encode(ieMessage.toXml.toString()),
"IE704",
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/NrsServiceSpec.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/NrsServiceSpec.scala
index f6deae862..2ccccfe22 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/NrsServiceSpec.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/NrsServiceSpec.scala
@@ -36,13 +36,12 @@ import uk.gov.hmrc.excisemovementcontrolsystemapi.connectors.NrsConnector.Unexpe
import uk.gov.hmrc.excisemovementcontrolsystemapi.fixture.NrsTestData
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.UserDetails
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auth.{EnrolmentRequest, ParsedXmlRequest}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IEMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.IE815MessageV1
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.{IE815Message, IEMessage}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.nrs._
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.NRSWorkItemRepository
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.model.NrsSubmissionWorkItem
import uk.gov.hmrc.excisemovementcontrolsystemapi.services.NrsService.NonRepudiationIdentityRetrievals
-import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.{DateTimeService, EmcsUtils, NrsEventIdMapper, NrsEventIdMapperV1}
+import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.{DateTimeService, EmcsUtils, NrsEventIdMapper}
import uk.gov.hmrc.http.{Authorization, HeaderCarrier}
import uk.gov.hmrc.mongo.TimestampSupport
import uk.gov.hmrc.mongo.lock.MongoLockRepository
@@ -86,14 +85,14 @@ class NrsServiceSpec
mockNrsWorkItemRepository,
mockDateTimeService,
new EmcsUtils,
- new NrsEventIdMapperV1,
+ new NrsEventIdMapper,
mockLockRepository,
mockTimeStampSupport,
testActorSystem,
config
)
- private val message = mock[IE815MessageV1]
+ private val message = mock[IE815Message]
override def beforeEach(): Unit = {
super.beforeEach()
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/SubmissionMessageServiceSpec.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/SubmissionMessageServiceSpec.scala
index a22728d61..1a6e0a6bb 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/SubmissionMessageServiceSpec.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/SubmissionMessageServiceSpec.scala
@@ -33,7 +33,7 @@ import uk.gov.hmrc.excisemovementcontrolsystemapi.models.EISErrorResponseDetails
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auditing.UserDetails
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.auth.{EnrolmentRequest, ParsedXmlRequest}
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.eis.EISSubmissionResponse
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1.IE815MessageV1
+import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.IE815Message
import uk.gov.hmrc.excisemovementcontrolsystemapi.repository.ErnSubmissionRepository
import uk.gov.hmrc.http.HeaderCarrier
import uk.gov.hmrc.play.http.HeaderCarrierConverter
@@ -59,7 +59,7 @@ class SubmissionMessageServiceSpec extends PlaySpec with ScalaFutures with Eithe
mockAppconfig
)
- private val message = mock[IE815MessageV1]
+ private val message = mock[IE815Message]
private val xmlBody = "test"
val fakeRequest: FakeRequest[String] = FakeRequest()
.withBody(xmlBody)
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/TransformServiceSpec.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/TransformServiceSpec.scala
deleted file mode 100644
index f8cc9bf74..000000000
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/services/TransformServiceSpec.scala
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- * Copyright 2025 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.services
-
-import org.apache.pekko.Done
-import org.mockito.ArgumentMatchersSugar.{any, eqTo}
-import org.mockito.MockitoSugar.{reset, verify, verifyZeroInteractions, when}
-import org.scalatest.concurrent.ScalaFutures
-import org.scalatest.{BeforeAndAfterEach, EitherValues}
-import org.scalatestplus.mockito.MockitoSugar.mock
-import org.scalatestplus.play.PlaySpec
-import play.api.libs.json.Json
-import play.api.mvc.Results.{BadRequest, InternalServerError}
-import play.api.test.Helpers.{await, defaultAwaitTimeout}
-import uk.gov.hmrc.excisemovementcontrolsystemapi.config.AppConfig
-import uk.gov.hmrc.excisemovementcontrolsystemapi.connectors.PushNotificationConnector
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.notification.Notification
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.notification.NotificationResponse._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.utils.DateTimeService
-import uk.gov.hmrc.http.HeaderCarrier
-
-import java.time.Instant
-import java.util.Base64
-import scala.Right
-import scala.concurrent.{ExecutionContext, Future}
-
-class TransformServiceSpec extends PlaySpec with EitherValues with BeforeAndAfterEach with ScalaFutures {
-
- implicit private val hc: HeaderCarrier = HeaderCarrier()
- implicit private val ex: ExecutionContext = ExecutionContext.global
-
- private val appConfig = mock[AppConfig]
- private val timestamp = Instant.parse("2024-10-01T12:32:32.12345678Z")
- private val sut = new TransformService(appConfig)
-
- // All EMCS namespaces use V3.13
- // ImportSad and ImportSadNumber elements are used
- val inputIE801Message =
- """
- |
- | NDEA.XI
- | NDEA.AT
- | 2023-06-22
- | 12:37:08.755
- | XI000003
- | PORTAL6de1b822562c43fb9220d236e487c920
- |
- |
- |
- |
- | GBWKQOZ80VLYR
- | AFOR KALE LTD
- | The Street
- | AT123
- | The City
- |
- |
- | 23XI00000000000000021
- | 2023-06-22T11:37:10.345739396
- |
- |
- |
- | GBWKQOZ99VLYR
- | Clarkys Eagles
- | Happy Street
- | BT1 1BG
- | The City
- |
- |
- | XI00000467014
- |
- |
- | GB00000602078
- | METEST BOND STTSTGE
- | WHITETEST ROAD METEST CITY ESTATE
- | BN2 4KX
- | STTEST,KENT
- |
- |
- | GB004098
- |
- |
- | lrnie8154968571
- | INVOICE001
- | 2018-04-04
- | 1
- | 2021-12-02
- | 22:37:00
- |
- | 12345678
- |
- |
- |
- | 1
- | 2023-06-22T11:37:10.345801029
- | 1
- | D01
- | 1
- |
- |
- | 1
- |
- |
- | 1
- |
- |
- | 1
- | E410
- | 27101231
- | 100.000
- | 100.00
- | 90.00
- | 10.00
- |
- | BH
- | 2
- | Shipping comment
- |
- |
- | BH
- | 2
- | Shipping comment 2
- |
- |
- |
- | 1
- | Transformers robots in disguise
- |
- |
- | 2
- | MACHINES
- |
- |
- | 3
- | MORE MACHINES
- |
- |
- |
- |""".stripMargin
-
- // All EMCS namespaces use V3.23
- // ImportCustomsDeclaration and ImportCustomsDeclarationNumber elements are used
- val outputIE801Message =
- """
- |
- | NDEA.XI
- | NDEA.AT
- | 2023-06-22
- | 12:37:08.755
- | XI000003
- | PORTAL6de1b822562c43fb9220d236e487c920
- |
- |
- |
- |
- | GBWKQOZ80VLYR
- | AFOR KALE LTD
- | The Street
- | AT123
- | The City
- |
- |
- | 23XI00000000000000021
- | 2023-06-22T11:37:10.345739396
- |
- |
- |
- | GBWKQOZ99VLYR
- | Clarkys Eagles
- | Happy Street
- | BT1 1BG
- | The City
- |
- |
- | XI00000467014
- |
- |
- | GB00000602078
- | METEST BOND STTSTGE
- | WHITETEST ROAD METEST CITY ESTATE
- | BN2 4KX
- | STTEST,KENT
- |
- |
- | GB004098
- |
- |
- | lrnie8154968571
- | INVOICE001
- | 2018-04-04
- | 1
- | 2021-12-02
- | 22:37:00
- |
- | 12345678
- |
- |
- |
- | 1
- | 2023-06-22T11:37:10.345801029
- | 1
- | D01
- | 1
- |
- |
- | 1
- |
- |
- | 1
- |
- |
- | 1
- | E410
- | 27101231
- | 100.000
- | 100.00
- | 90.00
- | 10.00
- |
- | BH
- | 2
- | Shipping comment
- |
- |
- | BH
- | 2
- | Shipping comment 2
- |
- |
- |
- | 1
- | Transformers robots in disguise
- |
- |
- | 2
- | MACHINES
- |
- |
- | 3
- | MORE MACHINES
- |
- |
- |
- |""".stripMargin
-
- // All EMCS namespaces use V3.13
- // ExportDeclarationAcceptanceOrGoodsReleasedForExport appears within ExciseMovementEad
- val inputIE829Message =
- """
- |
- | NDEA.XI
- | NDEA.AT
- | 2023-06-26
- | 09:15:33
- | XI000003
- | 6dddas342231ff3a67888bbcedec3435
- |
- |
- |
- |
- | 2024-06-26T09:14:54
- |
- |
- | GBWKQOZ80VLYR
- | Whale Oil Lamps Co.
- | The Street
- | MC232
- | Happy Town
- | 7
- |
- |
- | 23XI00000000000056339
- | 1
- | 0
- |
- |
- | 23XI00000000000056340
- | 1
- | 0
- |
- |
- | AT633734
- |
- |
- | AT324234
- | 84884
- | 2023-06-26
- | 123123vmnfhsdf3AT
- |
- |
- |
- |""".stripMargin
-
- // All EMCS namespaces use V3.23
- // ExportDeclarationAcceptanceOrGoodsReleasedForExport is moved into ExportDeclarationAcceptanceRelease
- val outputIE829Message =
- """
- |
- | NDEA.XI
- | NDEA.AT
- | 2023-06-26
- | 09:15:33
- | XI000003
- | 6dddas342231ff3a67888bbcedec3435
- |
- |
- |
- |
- | 2024-06-26T09:14:54
- |
- |
- | GBWKQOZ80VLYR
- | Whale Oil Lamps Co.
- | The Street
- | MC232
- | Happy Town
- | 7
- |
- |
- | 23XI00000000000056339
- | 1
- |
- |
- |
- | 23XI00000000000056340
- | 1
- |
- |
- |
- | AT633734
- |
- |
- | AT324234
- | 84884
- | 2023-06-26
- | 123123vmnfhsdf3AT
- | 0
- |
- |
- |""".stripMargin
-
- "transformation" should {
-
- "return no errors when transforming IE801" in {
- val messageType = "IE801"
-
- val encodedMessage = Base64.getEncoder.encodeToString(inputIE801Message.getBytes("UTF-8"))
- val result = await(sut.transform(messageType, encodedMessage))
-
- new String(Base64.getDecoder.decode(result.value), "UTF-8") mustBe outputIE801Message
- }
-
- "return no errors when transforming IE829" in {
- val messageType = "IE829"
-
- val encodedMessage = Base64.getEncoder.encodeToString(inputIE829Message.getBytes("UTF-8"))
- val result = await(sut.transform(messageType, encodedMessage))
-
- new String(Base64.getDecoder.decode(result.value), "UTF-8") mustBe outputIE829Message
- }
- }
-
-}
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/utils/NrsEventIdMapperSpec.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/utils/NrsEventIdMapperSpec.scala
index a2b8c04ae..17be05bf3 100644
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/utils/NrsEventIdMapperSpec.scala
+++ b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/utils/NrsEventIdMapperSpec.scala
@@ -20,39 +20,38 @@ import org.scalatestplus.mockito.MockitoSugar.mock
import org.scalatestplus.play.PlaySpec
import uk.gov.hmrc.excisemovementcontrolsystemapi.fixture.UnsupportedTestMessage
import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages._
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v1._
class NrsEventIdMapperSpec extends PlaySpec {
- val sut = new NrsEventIdMapperV1()
+ val sut = new NrsEventIdMapper()
"mapMessageToEventClient" should {
"map IE815 to emcs-create-a-movement-api" in {
- sut.mapMessageToEventId(mock[IE815MessageV1]) mustBe "emcs-create-a-movement-api"
+ sut.mapMessageToEventId(mock[IE815Message]) mustBe "emcs-create-a-movement-api"
}
"map IE810 to emcs-cancel-a-movement-api" in {
- sut.mapMessageToEventId(mock[IE810MessageV1]) mustBe "emcs-cancel-a-movement-api"
+ sut.mapMessageToEventId(mock[IE810Message]) mustBe "emcs-cancel-a-movement-api"
}
"map IE813 to emcs-change-a-destination-api" in {
- sut.mapMessageToEventId(mock[IE813MessageV1]) mustBe "emcs-change-a-destination-api"
+ sut.mapMessageToEventId(mock[IE813Message]) mustBe "emcs-change-a-destination-api"
}
"map IE818 to emcs-report-a-receipt-api" in {
- sut.mapMessageToEventId(mock[IE818MessageV1]) mustBe "emcs-report-a-receipt-api"
+ sut.mapMessageToEventId(mock[IE818Message]) mustBe "emcs-report-a-receipt-api"
}
"map IE819 to emcs-submit-alert-or-rejection-api" in {
- sut.mapMessageToEventId(mock[IE819MessageV1]) mustBe "emcs-submit-alert-or-rejection-api"
+ sut.mapMessageToEventId(mock[IE819Message]) mustBe "emcs-submit-alert-or-rejection-api"
}
"map IE837 to emcs-explain-a-delay-api" in {
- sut.mapMessageToEventId(mock[IE837MessageV1]) mustBe "emcs-explain-a-delay-api"
+ sut.mapMessageToEventId(mock[IE837Message]) mustBe "emcs-explain-a-delay-api"
}
"map IE871 to emcs-explain-a-shortage-api" in {
- sut.mapMessageToEventId(mock[IE871MessageV1]) mustBe "emcs-explain-a-shortage-api"
+ sut.mapMessageToEventId(mock[IE871Message]) mustBe "emcs-explain-a-shortage-api"
}
"return an error if cannot match a message to aan event client id" in {
diff --git a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/utils/NrsEventIdMapperV2Spec.scala b/test/uk/gov/hmrc/excisemovementcontrolsystemapi/utils/NrsEventIdMapperV2Spec.scala
deleted file mode 100644
index d7457abc9..000000000
--- a/test/uk/gov/hmrc/excisemovementcontrolsystemapi/utils/NrsEventIdMapperV2Spec.scala
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2023 HM Revenue & Customs
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package uk.gov.hmrc.excisemovementcontrolsystemapi.utils
-
-import org.scalatestplus.mockito.MockitoSugar.mock
-import org.scalatestplus.play.PlaySpec
-import uk.gov.hmrc.excisemovementcontrolsystemapi.fixture.UnsupportedTestMessage
-import uk.gov.hmrc.excisemovementcontrolsystemapi.models.messages.v2._
-
-class NrsEventIdMapperV2Spec extends PlaySpec {
-
- val sut = new NrsEventIdMapperV2()
-
- "mapMessageToEventClient" should {
- "map IE815 to emcs-create-a-movement-api" in {
- sut.mapMessageToEventId(mock[IE815MessageV2]) mustBe "emcs-create-a-movement-api"
- }
-
- "map IE810 to emcs-cancel-a-movement-api" in {
- sut.mapMessageToEventId(mock[IE810MessageV2]) mustBe "emcs-cancel-a-movement-api"
- }
-
- "map IE813 to emcs-change-a-destination-api" in {
- sut.mapMessageToEventId(mock[IE813MessageV2]) mustBe "emcs-change-a-destination-api"
- }
-
- "map IE818 to emcs-report-a-receipt-api" in {
- sut.mapMessageToEventId(mock[IE818MessageV2]) mustBe "emcs-report-a-receipt-api"
- }
-
- "map IE819 to emcs-submit-alert-or-rejection-api" in {
- sut.mapMessageToEventId(mock[IE819MessageV2]) mustBe "emcs-submit-alert-or-rejection-api"
- }
-
- "map IE837 to emcs-explain-a-delay-api" in {
- sut.mapMessageToEventId(mock[IE837MessageV2]) mustBe "emcs-explain-a-delay-api"
- }
-
- "map IE871 to emcs-explain-a-shortage-api" in {
- sut.mapMessageToEventId(mock[IE871MessageV2]) mustBe "emcs-explain-a-shortage-api"
- }
-
- "return an error if cannot match a message to aan event client id" in {
-
- the[RuntimeException] thrownBy
- sut.mapMessageToEventId(UnsupportedTestMessage) must
- have message "[NrsEventClientMapper] - Unsupported message: any-type"
- }
- }
-
-}