diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..70e3dd5
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,66 @@
+# User properties #
+**/src/main/resources/application-i*.yml
+
+**/src/main/resources/rebel-remote.xml
+**/src/main/resources/rebel.xml
+
+# Compiled class file #
+*.class
+target/
+.factorypath
+.ipynb_checkpoints/
+.apt_generated/
+.apt_generated_tests/
+
+# Log file #
+*.log
+
+# Frontend
+**/src-frontend/node/
+**/src-frontend/node_modules/
+**/src-frontend/mix-manifest.json
+
+# BlueJ files #
+*.ctxt
+
+# Mobile Tools for Java (J2ME) #
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# Eclipse Files #
+.eclipse/
+.project
+.settings/
+.classpath
+.metadata/
+
+# IntelliJ Files #
+.idea/
+*.iml
+*.iws
+
+# OsX Files #
+.DS_Store
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml #
+hs_err_pid*
+
+# Misc #
+*.vpp.bak*
+*.vpp.lck*
+~\$*.pptx
+*.sh
+bin/
+pom.xml.versionsBackup
+
+
+/.run/
+
diff --git a/e-rights-back-office/pom.xml b/e-rights-back-office/pom.xml
new file mode 100644
index 0000000..47d3ee2
--- /dev/null
+++ b/e-rights-back-office/pom.xml
@@ -0,0 +1,458 @@
+
+
+
+ 4.0.0
+
+ eu.europa.eeas
+ e-rights
+ 5.0.1
+ ../pom.xml
+
+
+ e-rights-back-office
+ ${e-rights.version}
+ war
+
+ e-RIGHTS - Back Office
+ EEAS' e-RIGHTS - Back Office
+
+
+
+ eu.europa.eeas
+ e-rights-common
+ ${e-rights.version}
+
+
+
+
+
+ eu.europa.eeas
+ ananke-core-starter-scheduler
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.apache.tomcat.embed
+ tomcat-embed-jasper
+ provided
+
+
+ eu.europa.ec.digit.iam.ecas.client
+ ecas-tomcat-8.0
+ provided
+
+
+ org.apache.logging.log4j
+ log4j-1.2-api
+ provided
+
+
+ org.apache.activemq
+ activemq-core
+ 5.7.0
+ provided
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+ provided
+
+
+ org.springframework.security
+ spring-security-test
+ test
+
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+
+ org.springframework.boot
+ spring-boot-starter-cache
+
+
+ javax.cache
+ cache-api
+
+
+ org.ehcache
+ ehcache
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ com.oracle.weblogic
+ wlthint3client
+
+
+
+
+ com.google.crypto.tink
+ tink
+ 1.6.1
+ runtime
+
+
+
+ net.serenity-bdd
+ serenity-core
+ ${serenity.version}
+ test
+
+
+ net.serenity-bdd
+ serenity-cucumber
+ ${serenity.version}
+ test
+
+
+ net.serenity-bdd
+ serenity-screenplay
+ ${serenity.version}
+ test
+
+
+ net.serenity-bdd
+ serenity-screenplay-webdriver
+ ${serenity.version}
+ test
+
+
+ net.serenity-bdd
+ serenity-ensure
+ ${serenity.version}
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ 5.8.2
+ test
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ 5.8.2
+ test
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ ${project.artifactId}
+
+
+
+ maven-surefire-plugin
+
+ false
+
+ **/*Spec.java
+ **/*Test.java
+ **/*UT.java
+ **/*IT.java
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ e-rights-back-office
+
+
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+
+ it.ninjatech
+ swagger-codegen-maven-plugin
+
+
+ e-rights-back-office
+
+ generate-api
+ generate-model
+
+
+ e-rights-back-office
+ ${project.build.directory}/generated-sources
+ eu.europa.eeas.erights.backoffice.api.http.rest.api.internal
+ eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal
+ RestApi
+ TransferObject
+
+ ${urlPrefix}${basedir}/src/main/resources/swagger/internal/e-rights-back-office.yml
+ ${urlPrefix}${basedir}/src/main/resources/swagger/internal/e-rights-back-office-abac.yml
+ ${urlPrefix}${basedir}/src/main/resources/swagger/internal/e-rights-back-office-summa.yml
+
+
+
+
+
+
+
+ javax.money.CurrencyUnit
+ org.javamoney.moneta.Money
+
+ eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.CityTransferObject
+ eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.CountryTransferObject
+ eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.MovementFileTransferObject
+ eu.europa.eeas.erights.common.tools.statemachine.MovementFileState
+ eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.MovementTypeTransferObject
+ eu.europa.eeas.erights.common.tools.notification.NotificationTemplateCode
+ eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.VJobTransferObject
+ eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.VPersonTransferObject
+ eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.VReportMovementFileTransferObject
+ eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.VAllowancesTransferObject
+ eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.MovementContextTransferObject
+ eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.FunctionCodeTransferObject
+ eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.StatutoryLinkCodeTransferObject
+ eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.InstitutionCodeTransferObject
+ eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.PersonnelTypeTransferObject
+ eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.IataAirportTransferObject
+ eu.europa.eeas.erights.common.tools.statemachine.TravelAllowanceState
+ eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.PostingAllowanceTransferObject
+ eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.VReportPostingAllowanceTransferObject
+
+ eu.europa.eeas.ananke.tools.edms.connector.service.model.enums.Status
+ eu.europa.eeas.ananke.core.api.transferobject.AbstractTransferObject
+ eu.europa.eeas.ananke.core.audit.provider.api.transferobject.AbstractAuditableTransferObject
+ eu.europa.eeas.erights.web.p2phub.client.transferobject.BusinessPartnerResponseTransferObject
+ eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.AllowanceRequestInternalTransferObject
+ eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.OrderResponseInternalTransferObject
+ eu.europa.eeas.erights.web.p2phub.client.transferobject.OrderStatusResponseTransferObject
+ eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.SummaFundSourceTransferObject
+ eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.RequestTransferObject
+
+
+
+
+
+
+
+
+
+ org.openapitools
+ openapi-generator-maven-plugin
+ 7.6.0
+
+
+ p2p-hub-client
+
+ generate
+
+
+ RestApi
+ TransferObject
+ e-rights-back-office/src/main/resources/swagger/clients/p2p-hub.json
+ java
+
+ false
+ false
+ false
+ false
+ ${project.basedir}/src/main/resources/openapi-templates
+
+
+ false
+ false
+ true
+
+
+
+ false
+ false
+ false
+ src/main/java
+ eu.europa.eeas.erights.web.p2phub.client
+ eu.europa.eeas.erights.web.p2phub.client.transferobject
+ java8-localdatetime
+ false
+ true
+ false
+ resttemplate
+ false
+ false
+ true
+ jackson
+ camelCase
+ camelCase
+
+
+ camelCase
+
+ AbstractTransferObject
+ AbstractTransferObject
+ eu.europa.eeas.ananke.core.api.transferobject
+
+
+ modelPropertyNaming=camelCase
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-enforcer-plugin
+ 3.0.0
+
+
+ enforce-versions
+
+ enforce
+
+
+
+
+
+ org.apache.logging.log4j:*:2.0.0
+
+
+ org.apache.logging.log4j:*:2.16.0
+
+
+
+
+
+
+
+
+ org.zeroturnaround
+ jrebel-maven-plugin
+ 1.1.10
+
+
+ generate-rebel-xml
+ process-resources
+
+ generate
+
+
+
+
+
+ org.codehaus.mojo
+ build-helper-maven-plugin
+ 3.5.0
+
+
+ add-test-source
+ generate-test-sources
+
+ add-test-source
+
+
+
+ ${project.build.directory}/target/generated-sources/src/test
+ ${project.build.directory}/target/generated-sources/src/test/java
+ ${project.build.directory}/generated-sources/src/test
+ ${project.build.directory}/generated-sources/src/test/java
+
+
+
+
+
+
+
+
+
+ add-webapp-as-resource
+
+ true
+
+
+
+
+ src/main/resources
+ true
+
+ **/*.properties
+ **/*.yml
+ **/*.yaml
+ **/*.xml
+
+
+
+ src/main/resources
+ false
+
+ certs/**
+ **/*.p12
+ **/*.pfx
+ **/*.jks
+
+
+
+ src/main/webapp
+ true
+
+
+
+
+
+
+
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/AbacController.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/AbacController.java
new file mode 100644
index 0000000..4ff3151
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/AbacController.java
@@ -0,0 +1,196 @@
+package eu.europa.eeas.erights.backoffice.api.http.mvc.controller;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mvc.AbstractMvcController;
+import eu.europa.eeas.ananke.core.base.exception.AuthorizationRuntimeException;
+import eu.europa.eeas.erights.backoffice.service.model.RequestPaymentAbacInfoModel;
+import eu.europa.eeas.erights.backoffice.service.provider.abac.AbacBankAccountServiceProvider;
+import eu.europa.eeas.erights.common.boot.configuration.ERightsBeanNames;
+import eu.europa.eeas.erights.common.exceptionhandling.ERightsExceptionCode;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import eu.europa.eeas.erights.common.security.PostingAllowancePermission;
+import eu.europa.eeas.erights.common.security.PostingAllowanceSecurityChecker;
+import eu.europa.eeas.erights.common.service.data.provider.entitlement.request.RequestJpaServiceProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import static eu.europa.eeas.erights.common.security.PostingAllowancePermission.ACCOMMODATION_PAYMENT_PAY;
+import static java.lang.Long.valueOf;
+
+@Controller
+@RequestMapping("/abac")
+public class AbacController extends AbstractMvcController {
+
+ public static final String WELCOME = "welcome";
+
+ public static final String YOU_ARE_NOT_AUTHORIZED_TO_CONSULT_THE_REQUEST = "You are not authorized to consult the request: ";
+
+ @Autowired
+ @Qualifier(ERightsBeanNames.MOVEMENT_FILE_SECURITY_CHECKER)
+ private MovementFileSecurityChecker securityChecker;
+
+ @Autowired
+ @Qualifier(ERightsBeanNames.POSTING_ALLOWANCE_SECURITY_CHECKER)
+ private PostingAllowanceSecurityChecker postingAllowanceSecurityChecker;
+
+ @Autowired
+ private RequestJpaServiceProvider requestJpaServiceProvider;
+
+
+
+ @Autowired
+ private AbacBankAccountServiceProvider abacBankAccountServiceProvider;
+
+ @GetMapping(path = "/abac-payments-details.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String abacPaymentDetailsRem(@RequestParam(required = true) String requestId, @RequestParam(required = true) String requestType, @RequestParam(required = true) String movementFileId, Model model) {
+
+ // TODO This condition does not cause problems but does no make sense. It's not "TUD", its "TudRequest"
+ // Might be related to RIGD-1877
+ if ((!requestType.equals("TUD") && securityChecker.canPayRemRequestAbac(requestJpaServiceProvider.getMovementFileId(valueOf(requestId)))) ||
+ (requestType.equals("TUD") && securityChecker.canPayTudRequestAbac(requestJpaServiceProvider.getMovementFileId(valueOf(requestId))))) {
+
+ model.addAttribute("requestId", requestId);
+ model.addAttribute("requestType", requestType);
+ model.addAttribute("movementFileId", movementFileId);
+
+ return "abac-payments/abac.details.form";
+ }
+ throw new AuthorizationRuntimeException(ERightsExceptionCode.ER008, YOU_ARE_NOT_AUTHORIZED_TO_CONSULT_THE_REQUEST + requestId);
+
+ }
+
+ @GetMapping(path = "/abac-payments-details-accommodation.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String abacPaymentDetailsAccommodation(@RequestParam(required = true) String postingAllowanceId, @RequestParam(required = true) String requestType, Model model) {
+ if (requestType.equals("AccommodationPayment") && postingAllowanceSecurityChecker.hasOrganisationIndependentAuthority(ACCOMMODATION_PAYMENT_PAY)) {
+
+ model.addAttribute("postingAllowanceId", postingAllowanceId);
+ model.addAttribute("requestType", requestType);
+
+ return "abac-payments/abac.details.accommodation";
+ }
+ throw new AuthorizationRuntimeException(ERightsExceptionCode.ER008, YOU_ARE_NOT_AUTHORIZED_TO_CONSULT_THE_REQUEST + postingAllowanceId);
+
+ }
+
+ @GetMapping(path = "/send-to-abac.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String sendToAbac(@RequestParam(required = true) Long requestId, @RequestParam(required = true) String requestType, @RequestParam(required = true) String movementFileId, Model model) {
+
+ // TODO This condition does not cause problems but does no make sense. It's not "TUD", its "TudRequest"
+ // Might be related to RIGD-1877
+
+ if ((!requestType.equals("TUD") && securityChecker.canPayRemRequestAbac(requestJpaServiceProvider.getMovementFileId(valueOf(requestId)))) ||
+ (requestType.equals("TUD") && securityChecker.canPayTudRequestAbac(requestJpaServiceProvider.getMovementFileId(valueOf(requestId))))) {
+ RequestPaymentAbacInfoModel requestPaymentAbacInfoModel = new RequestPaymentAbacInfoModel();
+
+
+ return "abac-payments/abac.details.form";
+ }
+ throw new AuthorizationRuntimeException(ERightsExceptionCode.ER008, YOU_ARE_NOT_AUTHORIZED_TO_CONSULT_THE_REQUEST + requestId);
+ }
+
+ @GetMapping(path = "/response-from-abac.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String responseFromAbac(@RequestParam(required = true) Long requestId, @RequestParam(required = true) String requestType, @RequestParam(required = true) String movementFileId, Model model) throws InterruptedException {
+
+ if ((!requestType.equals("TUD") && securityChecker.canPayRemRequestAbac(requestJpaServiceProvider.getMovementFileId(requestId))) ||
+ (requestType.equals("TUD") && securityChecker.canPayTudRequestAbac(requestJpaServiceProvider.getMovementFileId(requestId)))) {
+
+ model.addAttribute("requestId", requestId);
+ model.addAttribute("isBackOffice", true);
+
+ Thread.sleep(10000);
+
+ switch (requestType) {
+ case "ClearingRequest":
+ // in common
+ return "e-rights-common:request/edit.clr.rem.request";
+ case "AdvanceRequest":
+ // not in common
+ return "request/edit.adv.rem.request";
+ case "TotalRemRequest":
+ // in common
+ return "e-rights-common:request/edit.total.rem.request";
+ case "TudRequest":
+ // not in common
+ return "request/edit.tud.request";
+ case "TopUpRequest":
+ // not in common
+ return "e-rights-common:request/edit.topup.request";
+ default:
+ break;
+ }
+ }
+ throw new AuthorizationRuntimeException(ERightsExceptionCode.ER008, YOU_ARE_NOT_AUTHORIZED_TO_CONSULT_THE_REQUEST + requestId);
+ }
+
+ @GetMapping(path = "/abac-info.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CONSULT_ENTITLEMENTS)
+ public String abacInfo(@RequestParam(required = true) String requestId, @RequestParam(required = true) String requestType, @RequestParam(required = true) String movementFileId, Model model) {
+ model.addAttribute("requestId", requestId);
+ model.addAttribute("requestType", requestType);
+ model.addAttribute("movementFileId", movementFileId);
+
+ return "abac-payments/abac.info";
+ }
+
+
+
+ @GetMapping(path = "/refresh-all-bank-accounts.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CONSULT_ENTITLEMENTS)
+ public String refreshAllBankAccountsNup(){
+
+
+
+ return WELCOME;
+ }
+
+ @GetMapping(path = "/refresh-all-bank-accounts-per-id.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CONSULT_ENTITLEMENTS)
+ public String refreshAllBankAccountsPerId(){
+
+ return WELCOME;
+ }
+
+ @GetMapping(path = "/refresh-bank.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CONSULT_ENTITLEMENTS)
+ public String refreshPerIdBankAccountsNup(@RequestParam(required = true) Long perId){
+
+
+
+ return WELCOME;
+ }
+
+ @GetMapping(path = "/refresh-bank-per-id.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CONSULT_ENTITLEMENTS)
+ public String refreshPerIdBankAccountsPerId(@RequestParam(required = true) Long perId){
+
+
+
+ return WELCOME;
+ }
+
+
+ @GetMapping(path = "/continueWithAbacProcess.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CONSULT_ENTITLEMENTS)
+ public String refreshAbacStatus(@RequestParam(required = true) Long requestId){
+
+ return WELCOME;
+ }
+
+ @GetMapping(path = "/continueWithAbacProcessUUID.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CONSULT_ENTITLEMENTS)
+ public String refreshAbacStatus(@RequestParam(required = true) String uuid){
+// Thread thread = new Thread(() -> this.abacItemServiceProvider.restartAbacProcessUuid(uuid));
+// thread.start();
+ return WELCOME;
+ }
+}
+
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/ListControllerBackOffice.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/ListControllerBackOffice.java
new file mode 100644
index 0000000..bc47fb3
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/ListControllerBackOffice.java
@@ -0,0 +1,46 @@
+package eu.europa.eeas.erights.backoffice.api.http.mvc.controller;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mvc.AbstractMvcController;
+import eu.europa.eeas.ananke.tools.web.breadcrumbs.annotation.Breadcrumb;
+import eu.europa.eeas.ananke.tools.web.breadcrumbs.annotation.CascadingBreadcrumb;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequestMapping("/list")
+public class ListControllerBackOffice extends AbstractMvcController {
+
+ @GetMapping(path = {"/movement-files.do"})
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.list.movement_files"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_LIST)
+ public String listMovementFiles() {
+
+ return "e-rights-common:list/list.file";
+ }
+
+ @GetMapping(path = "/allowances.do")
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.requests.view"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String listRequest(Model model) {
+ model.addAttribute("isBackOffice", true);
+
+ return "reports/allowances";
+
+ }
+
+
+ @GetMapping(path = "/posting-allowances.do")
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.list.posting_allowances"))
+ public String listPostingAllowances(Model model) {
+
+ model.addAttribute("isBackOffice", true);
+ model.addAttribute("isShowYearDropDown", true);
+ return "reports/posting.allowances";
+
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/MovementDocsControllerBackOffice.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/MovementDocsControllerBackOffice.java
new file mode 100644
index 0000000..45f25ed
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/MovementDocsControllerBackOffice.java
@@ -0,0 +1,38 @@
+package eu.europa.eeas.erights.backoffice.api.http.mvc.controller;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mvc.AbstractMvcController;
+import eu.europa.eeas.ananke.tools.web.breadcrumbs.annotation.Breadcrumb;
+import eu.europa.eeas.ananke.tools.web.breadcrumbs.annotation.CascadingBreadcrumb;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * Created by tapiafo on 15/03/2021; e-rights.
+ *
+
+ *
+ * @author Fernando Tapia.
+ *
+ */
+@Controller
+@RequestMapping("/movement-docs")
+public class MovementDocsControllerBackOffice extends AbstractMvcController {
+
+ /**
+ * Edit information Setion for staff member
+ *
+ * @param model s
+ * @return s
+ */
+ @GetMapping(path = "/edit.do")
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.movement-docs.edit"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_MANGE_GUIDELINES)
+ public String editMovementFileCommon(Model model) {
+
+ return "movement-docs/edit";
+ }
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/MovementFileControllerBackOffice.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/MovementFileControllerBackOffice.java
new file mode 100644
index 0000000..a6ba3e4
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/MovementFileControllerBackOffice.java
@@ -0,0 +1,153 @@
+package eu.europa.eeas.erights.backoffice.api.http.mvc.controller;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mvc.AbstractMvcController;
+import eu.europa.eeas.ananke.core.base.exception.AuthorizationRuntimeException;
+import eu.europa.eeas.ananke.tools.web.breadcrumbs.annotation.Breadcrumb;
+import eu.europa.eeas.ananke.tools.web.breadcrumbs.annotation.CascadingBreadcrumb;
+import eu.europa.eeas.erights.backoffice.tools.MovementFileFieldNames;
+import eu.europa.eeas.erights.common.boot.configuration.ERightsBeanNames;
+import eu.europa.eeas.erights.common.boot.configuration.data.ERightsRootConfiguration;
+import eu.europa.eeas.erights.common.exceptionhandling.ERightsExceptionCode;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import eu.europa.eeas.erights.common.service.provider.ProceduresForMovementFileServiceProvider;
+import org.apache.http.client.utils.URIBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+import org.springframework.web.servlet.view.RedirectView;
+
+/**
+ * Created by iliessu on 19/11/2019; e-rights.
+ *
+ *
+ * TODO : comment class !
+ *
+ *
+ * @author Silviu Ilie.
+ *
+ */
+@Controller
+@RequestMapping("/movement-files")
+public class MovementFileControllerBackOffice extends AbstractMvcController {
+
+ @Autowired
+ private ProceduresForMovementFileServiceProvider proceduresForMovementFileServiceProvider;
+
+ @Autowired
+ private ERightsRootConfiguration eRightsRootConfiguration;
+
+ @Autowired
+ @Qualifier(ERightsBeanNames.MOVEMENT_FILE_SECURITY_CHECKER)
+ private MovementFileSecurityChecker securityChecker;
+
+ @GetMapping(path = "/create-details.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CREATE)
+ public String createMovementFileDetails(Model model, @RequestParam(required = false, defaultValue = "0") Long jobId,
+ @RequestParam(required = false, defaultValue = "0") Long perId, @RequestParam(required = false, defaultValue = "0") Long jobIdTo) {
+
+ model.addAttribute(MovementFileFieldNames.JOB_ID, jobId);
+ model.addAttribute(MovementFileFieldNames.PERSON_ID, perId);
+
+ return "movement-file/file.details";
+ }
+
+
+ @GetMapping(path = "/create-details-no-job.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CREATE)
+ public String createMovementFileDetailsNoJob(Model model, @RequestParam(required = false, defaultValue = "0") Long jobId,
+ @RequestParam(required = false, defaultValue = "0") Long perId,
+ @RequestParam(required = false, defaultValue = "0") Long jobIdTo,
+ @RequestParam(required = false) String movementContext) {
+
+ model.addAttribute(MovementFileFieldNames.JOB_ID, jobId);
+ model.addAttribute(MovementFileFieldNames.PERSON_ID, perId);
+ model.addAttribute(MovementFileFieldNames.MOVEMENT_CONTEXT, movementContext);
+ return "movement-file/file.details-no-job";
+ }
+
+ @GetMapping(path = "/create-job-holder.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CREATE)
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.movement_files.add_new"))
+ public String createMovementFileJobHolder(Model model) {
+
+ return "movement-file/file.job-holder";
+ }
+
+ @GetMapping(path = "/create-future-assignment.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CREATE)
+ public String createMovementFileFutureAssignment(Model model, @RequestParam(required = false, defaultValue = "0") Long jobId) {
+
+ model.addAttribute(MovementFileFieldNames.JOB_ID, jobId);
+
+ return "movement-file/file.future-assignment";
+ }
+
+ @GetMapping(path = "/staff-member-data.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CREATE)
+ public String staffMemberData(@RequestParam(required = false, defaultValue = "0") Long perId, Model model) {
+
+ model.addAttribute(MovementFileFieldNames.PERSON_ID, perId);
+
+ return "movement-file/file.staff-member-data";
+ }
+
+ @GetMapping(path = "/summary.do")
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.movement_files.view"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CREATE)
+ public String summaryMovementFile(Model model) {
+
+ return "movement-file/file.summary";
+ }
+
+ @GetMapping(path = "/view.do")
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.movement_files.view"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String editMovementFileCommon(@RequestParam(required = true) String id, @RequestParam(required = false, defaultValue = "false") Boolean fromWizard, Model model) {
+ if (this.securityChecker.canView(Long.valueOf(id))) {
+ model.addAttribute("fileId", id);
+ model.addAttribute("fromWizard", fromWizard);
+
+ return "e-rights-common:movement-file/edit/file";
+ }
+
+ throw new AuthorizationRuntimeException(ERightsExceptionCode.ER008);
+ }
+
+ @GetMapping("/goToFrontOffice.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public RedirectView redirectWithUsingRedirectView(RedirectAttributes attributes, @RequestParam String id, @RequestParam String path, @RequestParam String goToTab) {
+ //Generate URL for movement file
+ String frontOfficeUrl = eRightsRootConfiguration.getHostName();
+ if (eRightsRootConfiguration.getFrontOfficeHostName() != null) {
+ frontOfficeUrl = eRightsRootConfiguration.getFrontOfficeHostName();
+ }
+
+ URIBuilder builder = new URIBuilder()
+ .setScheme(eRightsRootConfiguration.getProtocol())
+ .setHost(frontOfficeUrl)
+ .setPath(path);
+
+ attributes.addAttribute("id", id);
+ attributes.addAttribute("gototab", goToTab);
+ return new RedirectView(builder.toString());
+ }
+
+ //TODO Delete after running first time
+ @GetMapping(path = "/deleteMovemntFiles.do")
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.movement_files.view"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String updateVolumeAndKg(@RequestParam Long movementFileId) {
+ proceduresForMovementFileServiceProvider.removeMovementFiles(movementFileId);
+ return null;
+
+ }
+
+
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/PostingAllowanceControllerBackOffice.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/PostingAllowanceControllerBackOffice.java
new file mode 100644
index 0000000..ddab744
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/PostingAllowanceControllerBackOffice.java
@@ -0,0 +1,92 @@
+package eu.europa.eeas.erights.backoffice.api.http.mvc.controller;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mvc.AbstractMvcController;
+import eu.europa.eeas.ananke.core.base.exception.AuthorizationRuntimeException;
+import eu.europa.eeas.ananke.tools.web.breadcrumbs.annotation.Breadcrumb;
+import eu.europa.eeas.ananke.tools.web.breadcrumbs.annotation.CascadingBreadcrumb;
+import eu.europa.eeas.erights.common.boot.configuration.ERightsBeanNames;
+import eu.europa.eeas.erights.common.exceptionhandling.ERightsExceptionCode;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import eu.europa.eeas.erights.common.security.PostingAllowanceSecurityChecker;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * Created by tapiafo on 15/03/2021; e-rights.
+ *
+ *
+ * TODO : comment class !
+ *
+ *
+ * @author Fernando Tapia.
+ *
+ */
+@Controller
+@RequestMapping("/posting-allowances")
+public class PostingAllowanceControllerBackOffice extends AbstractMvcController {
+
+ @Autowired
+ @Qualifier(ERightsBeanNames.POSTING_ALLOWANCE_SECURITY_CHECKER)
+ private PostingAllowanceSecurityChecker postingAllowanceSecurityChecker;
+
+
+ @GetMapping(path = "/view-tar.do")
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.posting_allowances.view"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String editTarRequestBackOffice(@RequestParam(required = true) String postingAllowanceId, Model model) {
+ model.addAttribute("postingAllowanceId", postingAllowanceId);
+ model.addAttribute("isBackOffice", true);
+
+ return "e-rights-common:posting-allowance/view.tar";
+ }
+
+ @GetMapping(path = "/regularization-view-tar.do")
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.posting_allowances.view"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String editTarRegularizationRequestBackOffice(@RequestParam(required = true) String postingAllowanceId, Model model) {
+ model.addAttribute("postingAllowanceId", postingAllowanceId);
+ model.addAttribute("isBackOffice", true);
+ return "e-rights-common:posting-allowance/regularization-view.tar";
+ }
+
+ @GetMapping(path = "/accommodation-declaration-view.do")
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.posting_allowances.view"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String editAccommodationDeclarationBackOffice(
+ @RequestParam(required = true) String postingAllowanceId, Model model) {
+ if(Boolean.TRUE.equals(postingAllowanceSecurityChecker.canViewAccommodationDeclaration(Long.valueOf(postingAllowanceId)))){
+ model.addAttribute("postingAllowanceId", postingAllowanceId);
+ model.addAttribute("isBackOffice", true);
+ return "e-rights-common:posting-allowance/accommodation-declaration-view";
+ }
+ throw new AuthorizationRuntimeException(ERightsExceptionCode.ER008);
+ }
+
+ @GetMapping(path = "/accommodation-declaration-create.do")
+ @PreAuthorize(PostingAllowanceSecurityChecker.CAN_CREATE_ACCOMMODATION_DECLARATION)
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.accommodation_declarations.add_new"))
+ public String createAccDeclarationJobHolder(Model model) {
+
+ return "accommodation/declaration.job-holder";
+ }
+
+ @GetMapping(path = "/accommodation-payment-view.do")
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.posting_allowances.view"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String editAccommodationPaymentBackOffice(
+ @RequestParam(required = true) String postingAllowanceId, Model model) {
+ if(Boolean.TRUE.equals(postingAllowanceSecurityChecker.canViewAccommodationDeclaration(Long.valueOf(postingAllowanceId)))){
+ model.addAttribute("postingAllowanceId", postingAllowanceId);
+ model.addAttribute("isBackOffice", true);
+ return "e-rights-common:posting-allowance/accommodation-payment-view";
+ }
+ throw new AuthorizationRuntimeException(ERightsExceptionCode.ER008);
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/ReportingBackOffice.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/ReportingBackOffice.java
new file mode 100644
index 0000000..9be2a05
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/ReportingBackOffice.java
@@ -0,0 +1,49 @@
+package eu.europa.eeas.erights.backoffice.api.http.mvc.controller;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mvc.AbstractMvcController;
+import eu.europa.eeas.ananke.tools.web.breadcrumbs.annotation.Breadcrumb;
+import eu.europa.eeas.ananke.tools.web.breadcrumbs.annotation.CascadingBreadcrumb;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequestMapping("/reports")
+public class ReportingBackOffice extends AbstractMvcController {
+
+ @GetMapping(path = {"/empty-rates-entitlements.do"})
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.reports.empty_rates_entitlements"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_VIEW_REPORTS)
+ public String listMovementFiles() {
+
+ return "reports/empty.rates.entitlements";
+ }
+
+ @GetMapping(path = {"/entitlement-max-default.do"})
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.reports.empty_rates_entitlements"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_VIEW_REPORTS)
+ public String entitlementMaxDefault() {
+
+ return "reports/entitlement.max.default";
+ }
+
+
+ @GetMapping(path = {"/iata-routes-calculation.do"})
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.reports.empty_rates_entitlements"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CALCULATE_ROUTE_PRICE)
+ public String iataRoutesCalculation() {
+
+ return "admin/iata-routes-calculation";
+ }
+
+ @GetMapping(path = {"/it-admin.do"})
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.admin.it_support"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_ADMIN_IT_SUPPORT)
+ public String itAdmin() {
+
+ return "admin/it-admin";
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/RequestsControllerBackOffice.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/RequestsControllerBackOffice.java
new file mode 100644
index 0000000..32eb06c
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/RequestsControllerBackOffice.java
@@ -0,0 +1,148 @@
+package eu.europa.eeas.erights.backoffice.api.http.mvc.controller;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mvc.AbstractMvcController;
+import eu.europa.eeas.ananke.core.base.exception.AuthorizationRuntimeException;
+import eu.europa.eeas.ananke.tools.web.breadcrumbs.annotation.Breadcrumb;
+import eu.europa.eeas.ananke.tools.web.breadcrumbs.annotation.CascadingBreadcrumb;
+import eu.europa.eeas.erights.common.boot.configuration.ERightsBeanNames;
+import eu.europa.eeas.erights.common.exceptionhandling.ERightsExceptionCode;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import eu.europa.eeas.erights.common.service.data.provider.entitlement.request.RequestJpaServiceProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * Created by tapiafo on 15/03/2021; e-rights.
+ *
+ *
+ * TODO : comment class !
+ *
+ *
+ * @author Fernando Tapia.
+ *
+ */
+@Controller
+@RequestMapping("/requests")
+public class RequestsControllerBackOffice extends AbstractMvcController {
+
+ @Autowired
+ @Qualifier(ERightsBeanNames.MOVEMENT_FILE_SECURITY_CHECKER)
+ private MovementFileSecurityChecker securityChecker;
+
+ @Autowired
+ private RequestJpaServiceProvider requestJpaServiceProvider;
+
+ @GetMapping(path = "/view-tud.do")
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.requests.view"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String editTudRequestBackOffice(@RequestParam(required = true) String requestId, Model model) {
+ if (securityChecker.canView(requestJpaServiceProvider.getMovementFileId(Long.valueOf(requestId))) &&
+ securityChecker.canConsultEntitlements(requestJpaServiceProvider.getMovementFileId(Long.valueOf(requestId)))) {
+ model.addAttribute("requestId", requestId);
+
+ return "request/edit.tud.request";
+ }
+ throw new AuthorizationRuntimeException(ERightsExceptionCode.ER008, "You are not authorized to consult the TUD request: " + requestId);
+ }
+
+ @GetMapping(path = "/view-adv-rem.do")
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.requests.view"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String editAdvanceRequestBackOffice(@RequestParam(required = true) String requestId, Model model) {
+
+ if (securityChecker.canView(requestJpaServiceProvider.getMovementFileId(Long.valueOf(requestId))) &&
+ securityChecker.canConsultEntitlements(requestJpaServiceProvider.getMovementFileId(Long.valueOf(requestId)))) {
+ model.addAttribute("requestId", requestId);
+
+ return "request/edit.adv.rem.request";
+ }
+
+ throw new AuthorizationRuntimeException(ERightsExceptionCode.ER008, "You are not authorized to consult the Advance request: " + requestId);
+
+ }
+
+ @GetMapping(path = "/view-total-rem.do")
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.requests.view"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String editTotalRemRequestBackOffice(@RequestParam(required = true) String requestId, Model model) {
+ if (securityChecker.canView(requestJpaServiceProvider.getMovementFileId(Long.valueOf(requestId)))) {
+ model.addAttribute("requestId", requestId);
+ model.addAttribute("isBackOffice", true);
+ return "e-rights-common:request/edit.total.rem.request";
+ }
+ throw new AuthorizationRuntimeException(ERightsExceptionCode.ER008, "You are not authorized to consult the Total REM request: " + requestId);
+ }
+
+ @GetMapping(path = "/view-clr-rem.do")
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.requests.view"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String editClrRemRequestBackOffice(@RequestParam(required = true) String requestId, Model model) {
+ if (securityChecker.canView(requestJpaServiceProvider.getMovementFileId(Long.valueOf(requestId)))) {
+ model.addAttribute("requestId", requestId);
+ model.addAttribute("isBackOffice", true);
+ return "e-rights-common:request/edit.clr.rem.request";
+ }
+ throw new AuthorizationRuntimeException(ERightsExceptionCode.ER008, "You are not authorized to consult the Clearing request: " + requestId);
+ }
+
+ @GetMapping(path = "/view-installation.do")
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.requests.view"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String viewInstallationBackOffice(@RequestParam(required = true) String requestId, Model model) {
+ if (securityChecker.canView(requestJpaServiceProvider.getMovementFileId(Long.valueOf(requestId)))) {
+ model.addAttribute("requestId", requestId);
+ model.addAttribute("isBackOffice", true);
+ return "e-rights-common:request/edit.install.request";
+ }
+ throw new AuthorizationRuntimeException(ERightsExceptionCode.ER008, "You are not authorized to consult the Installation request: " + requestId);
+ }
+
+ @GetMapping(path = "/view-topup.do")
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.requests.view"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String viewTopupBackOffice(
+ // We'll use one of the two:
+ // If 'requestId' is used, it means that the Topup request already exists
+ // If 'parentRequestId' are 'parentRequestType' are used, it means that the Topup request is being created
+ @RequestParam(required = false) String requestId,
+ @RequestParam(required = false) String parentRequestId,
+ @RequestParam(required = false) String parentRequestType,
+ Model model) {
+ if (canView(requestId, parentRequestId)) {
+ model.addAttribute("requestId", requestId);
+ model.addAttribute("parentRequestId", parentRequestId);
+ model.addAttribute("parentRequestType", parentRequestType);
+ model.addAttribute("isBackOffice", true);
+ return "e-rights-common:request/edit.topup.request";
+ }
+ throw new AuthorizationRuntimeException(ERightsExceptionCode.ER008, "You are not authorized to consult the TopUp request: " + requestId);
+ }
+
+ private Boolean canView(String requestId, String parentRequestId) {
+ if (requestId != null) {
+ return securityChecker.canView(requestJpaServiceProvider.getMovementFileId(Long.valueOf(requestId)));
+ } else if (parentRequestId != null) {
+ return securityChecker.canView(requestJpaServiceProvider.getMovementFileId(Long.valueOf(parentRequestId)));
+ }
+ return false;
+ }
+
+ @GetMapping(path = "/view-resettlement.do")
+ @CascadingBreadcrumb(label = @Breadcrumb.Label(key = "e_rights.breadcrumbs.requests.view"))
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String viewResettlementBackOffice(@RequestParam(required = true) String requestId, Model model) {
+ if (securityChecker.canView(requestJpaServiceProvider.getMovementFileId(Long.valueOf(requestId)))) {
+ model.addAttribute("requestId", requestId);
+ model.addAttribute("isBackOffice", true);
+ return "e-rights-common:request/edit.resettlement.request";
+ }
+ throw new AuthorizationRuntimeException(ERightsExceptionCode.ER008, "You are not authorized to consult the Resettlement request: " + requestId);
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/SummaController.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/SummaController.java
new file mode 100644
index 0000000..e35601c
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/mvc/controller/SummaController.java
@@ -0,0 +1,158 @@
+package eu.europa.eeas.erights.backoffice.api.http.mvc.controller;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mvc.AbstractMvcController;
+import eu.europa.eeas.ananke.core.base.exception.AuthorizationRuntimeException;
+import eu.europa.eeas.erights.backoffice.service.provider.abac.AbacBankAccountServiceProvider;
+import eu.europa.eeas.erights.common.boot.configuration.ERightsBeanNames;
+import eu.europa.eeas.erights.common.exceptionhandling.ERightsExceptionCode;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import eu.europa.eeas.erights.common.service.data.provider.entitlement.request.RequestJpaServiceProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import static java.lang.Long.valueOf;
+
+@Controller
+@RequestMapping("/summa")
+public class SummaController extends AbstractMvcController {
+
+ public static final String WELCOME = "welcome";
+
+ public static final String YOU_ARE_NOT_AUTHORIZED_TO_CONSULT_THE_REQUEST = "You are not authorized to consult the request: ";
+
+ @Autowired
+ @Qualifier(ERightsBeanNames.MOVEMENT_FILE_SECURITY_CHECKER)
+ private MovementFileSecurityChecker securityChecker;
+
+ @Autowired
+ private RequestJpaServiceProvider requestJpaServiceProvider;
+
+
+
+ @Autowired
+ private AbacBankAccountServiceProvider abacBankAccountServiceProvider;
+
+ @GetMapping(path = "/p2p-payments-details.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String summaPaymentDetailsRem(@RequestParam(required = true) String requestId, @RequestParam(required = true) String requestType, @RequestParam(required = true) String movementFileId, Model model) {
+
+ // TODO This condition does not cause problems but does no make sense. It's not "TUD", its "TudRequest"
+ // Might be related to RIGD-1877
+ if ((!requestType.equals("TUD") && securityChecker.canPayRemRequestAbac(requestJpaServiceProvider.getMovementFileId(valueOf(requestId)))) ||
+ (requestType.equals("TUD") && securityChecker.canPayTudRequestAbac(requestJpaServiceProvider.getMovementFileId(valueOf(requestId))))) {
+
+ model.addAttribute("requestId", requestId);
+ model.addAttribute("requestType", requestType);
+ model.addAttribute("movementFileId", movementFileId);
+
+ return "abac-payments/abac.details.form";
+ }
+ throw new AuthorizationRuntimeException(ERightsExceptionCode.ER008, YOU_ARE_NOT_AUTHORIZED_TO_CONSULT_THE_REQUEST + requestId);
+
+ }
+
+
+ @GetMapping(path = "/response-from-p2p.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public String responseFromAbac(@RequestParam(required = true) Long requestId, @RequestParam(required = true) String requestType, @RequestParam(required = true) String movementFileId, Model model) throws InterruptedException {
+
+ if ((!requestType.equals("TUD") && securityChecker.canPayRemRequestAbac(requestJpaServiceProvider.getMovementFileId(requestId))) ||
+ (requestType.equals("TUD") && securityChecker.canPayTudRequestAbac(requestJpaServiceProvider.getMovementFileId(requestId)))) {
+
+ model.addAttribute("requestId", requestId);
+ model.addAttribute("isBackOffice", true);
+
+ Thread.sleep(10000);
+
+ switch (requestType) {
+ case "ClearingRequest":
+ // in common
+ return "e-rights-common:request/edit.clr.rem.request";
+ case "AdvanceRequest":
+ // not in common
+ return "request/edit.adv.rem.request";
+ case "TotalRemRequest":
+ // in common
+ return "e-rights-common:request/edit.total.rem.request";
+ case "TudRequest":
+ // not in common
+ return "request/edit.tud.request";
+ case "TopUpRequest":
+ // not in common
+ return "e-rights-common:request/edit.topup.request";
+ default:
+ break;
+ }
+ }
+ throw new AuthorizationRuntimeException(ERightsExceptionCode.ER008, YOU_ARE_NOT_AUTHORIZED_TO_CONSULT_THE_REQUEST + requestId);
+ }
+
+ @GetMapping(path = "/abac-info.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CONSULT_ENTITLEMENTS)
+ public String abacInfo(@RequestParam(required = true) String requestId, @RequestParam(required = true) String requestType, @RequestParam(required = true) String movementFileId, Model model) {
+ model.addAttribute("requestId", requestId);
+ model.addAttribute("requestType", requestType);
+ model.addAttribute("movementFileId", movementFileId);
+
+ return "abac-payments/abac.info";
+ }
+
+
+
+ @GetMapping(path = "/refresh-all-bank-accounts.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CONSULT_ENTITLEMENTS)
+ public String refreshAllBankAccountsNup(){
+
+
+
+ return WELCOME;
+ }
+
+ @GetMapping(path = "/refresh-all-bank-accounts-per-id.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CONSULT_ENTITLEMENTS)
+ public String refreshAllBankAccountsPerId(){
+
+ return WELCOME;
+ }
+
+ @GetMapping(path = "/refresh-bank.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CONSULT_ENTITLEMENTS)
+ public String refreshPerIdBankAccountsNup(@RequestParam(required = true) Long perId){
+
+
+
+ return WELCOME;
+ }
+
+ @GetMapping(path = "/refresh-bank-per-id.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CONSULT_ENTITLEMENTS)
+ public String refreshPerIdBankAccountsPerId(@RequestParam(required = true) Long perId){
+
+
+
+ return WELCOME;
+ }
+
+
+ @GetMapping(path = "/continueWithAbacProcess.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CONSULT_ENTITLEMENTS)
+ public String refreshAbacStatus(@RequestParam(required = true) Long requestId){
+
+ return WELCOME;
+ }
+
+ @GetMapping(path = "/continueWithAbacProcessUUID.do")
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CONSULT_ENTITLEMENTS)
+ public String refreshAbacStatus(@RequestParam(required = true) String uuid){
+// Thread thread = new Thread(() -> this.abacItemServiceProvider.restartAbacProcessUuid(uuid));
+// thread.start();
+ return WELCOME;
+ }
+}
+
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/AbacInfoRestController.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/AbacInfoRestController.java
new file mode 100644
index 0000000..e9c43c0
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/AbacInfoRestController.java
@@ -0,0 +1,156 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.controller.internal;
+
+import eu.europa.eeas.ananke.core.api.provider.http.rest.AbstractRestController;
+import eu.europa.eeas.ananke.core.base.user.AbstractUserHandler;
+import eu.europa.eeas.ananke.core.service.provider.data.DataServiceProviderRegistry;
+import eu.europa.eeas.erights.backoffice.api.http.rest.api.internal.AbacInfoRestApi;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.*;
+import eu.europa.eeas.erights.backoffice.service.data.provider.*;
+import eu.europa.eeas.erights.backoffice.service.model.*;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+import static java.util.Objects.nonNull;
+
+/**
+ * Rest controller to retrieve Abac info about Budget Lines, Budgdel delegations, etc.
+ *
+ * @author idominju
+ */
+@RestController
+public class AbacInfoRestController extends AbstractRestController implements AbacInfoRestApi {
+
+ @Autowired
+ private DataServiceProviderRegistry dataServiceProviderRegistry;
+
+
+ @Autowired
+ private AbstractUserHandler> userHandler;
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity> findBudgetLineInfos(@NotNull @Valid String budgetPosition,
+ @Valid String delegation, @Valid Integer exerciseId) {
+
+ BudgetLineInfoJpaServiceProvider budgetInfoProvider = (BudgetLineInfoJpaServiceProvider) this.dataServiceProviderRegistry.getDataServiceProviderFor(BudgetLineInfoModel.class);
+
+ List modelList = budgetInfoProvider.findByBudgetPositionAndDelegationAndExerciseId(
+ budgetPosition, delegation, exerciseId);
+
+ return ResponseEntity.ok(getBeanMapper().mapAsList(modelList, BudgetLineInfoTransferObject.class));
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity> findDelegationCodes(@NotNull @Valid Integer exerciseId) {
+
+ DelegationCodesJpaServiceProvider provider = (DelegationCodesJpaServiceProvider) this.dataServiceProviderRegistry.getDataServiceProviderFor(DelegationCodesModel.class);
+
+ List modelList = provider.findByOrgExerciseId(exerciseId);
+
+ return ResponseEntity.ok(getBeanMapper().mapAsList(modelList, DelegationCodesTransferObject.class));
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity findAbacInfoPersonById(Long personId) {
+
+ PersonAbacCriteriaInfoJpaServiceProvider provider = (PersonAbacCriteriaInfoJpaServiceProvider) this.dataServiceProviderRegistry.getDataServiceProviderFor(
+ PersonAbacInfoModel.class);
+
+ List personAbacInfoModels = provider.findPersonAbacInfoByPersonId(
+ personId);
+ if (CollectionUtils.isEmpty(personAbacInfoModels)) {
+ return ResponseEntity.noContent().build();
+ } else if (personAbacInfoModels.size() > 1) {
+ return ResponseEntity.status(HttpStatus.CONFLICT).build();
+ }
+ PersonAbacInfoModel personAbacInfoModel = personAbacInfoModels.get(0);
+ return nonNull(personAbacInfoModel.getCriteriaCode()) ?
+ ResponseEntity.ok(
+ getBeanMapper().map(personAbacInfoModel, PersonAbacInfoTransferObject.class))
+ : ResponseEntity.noContent().build();
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity> findBudgetLineForErights(String movementContext) {
+ BudgetLineSubpostJpaServiceProvider provider = (BudgetLineSubpostJpaServiceProvider) this.dataServiceProviderRegistry.getDataServiceProviderFor(BudgetLineSubpostModel.class);
+
+ List listOfBudgetLines = provider.findBudgetLineForErights(movementContext);
+ return ResponseEntity.ok(listOfBudgetLines);
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity> findBudgetLineSubposts(
+ @Valid String budgetPositionBudgdel,
+ @Valid String budgetPositionErights,
+ @Valid String requestType,
+ @Valid String lstCd,
+ @Valid String subpostType,
+ @Valid Integer personnelTypeId) {
+
+ BudgetLineSubpostJpaServiceProvider provider = (BudgetLineSubpostJpaServiceProvider) this.dataServiceProviderRegistry.getDataServiceProviderFor(BudgetLineSubpostModel.class);
+
+ List modelList = provider.findBudgetLineSubpostsUsingOptionalFilters(budgetPositionBudgdel,
+ budgetPositionErights, requestType, lstCd, subpostType, personnelTypeId);
+
+ return ResponseEntity.ok(getBeanMapper().mapAsList(modelList, BudgetLineSubpostTransferObject.class));
+ }
+
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity> findRequestSubposts(@Valid Long requestId, @Valid Long requestPaymentAbacInfoId) {
+
+ RequestSubpostJpaServiceProvider provider = (RequestSubpostJpaServiceProvider) this.dataServiceProviderRegistry.getDataServiceProviderFor(RequestSubpostModel.class);
+ List modelList = null;
+ if (requestPaymentAbacInfoId == null) {
+ modelList = provider.findRequestSubpostByRequestPaymentAbacInfoId(requestPaymentAbacInfoId);
+ } else {
+ modelList = provider.findRequestSubpostByRequestId(requestId);
+ }
+
+ return ResponseEntity.ok(getBeanMapper().mapAsList(modelList, RequestSubpostTransferObject.class));
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity findRequestPersonAbacInfoByRequestId(Long requestId) {
+
+ RequestPaymentAbacInfoJpaServiceProvider provider = (RequestPaymentAbacInfoJpaServiceProvider) this.dataServiceProviderRegistry.getDataServiceProviderFor(RequestPaymentAbacInfoModel.class);
+
+ RequestPaymentAbacInfoModel modelList = provider.findRequestPaymentAbacInfoByRequestId(requestId);
+
+ return ResponseEntity.ok(getBeanMapper().map(modelList, RequestPaymentAbacInfoTransferObject.class));
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity createAbacEntitiesForRequest(@Valid RequestPaymentAbacInfoTransferObject data) {
+ Long result;
+
+ //Create
+ data.setAgentName(userHandler.getUser().getUid().toUpperCase());
+ RequestPaymentAbacInfoJpaServiceProvider service = (RequestPaymentAbacInfoJpaServiceProvider) this.dataServiceProviderRegistry.getDataServiceProviderFor(RequestPaymentAbacInfoModel.class);
+ RequestPaymentAbacInfoModel requestPaymentAbacInfoModel = service.create(getBeanMapper().map(data, RequestPaymentAbacInfoModel.class));
+ result = requestPaymentAbacInfoModel.getId();
+
+ //Send to ABAC
+// Thread thread = new Thread(() -> abacInvoiceServiceProvider.create(requestPaymentAbacInfoModel));
+// thread.start();
+
+ return ResponseEntity.ok(result);
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/AbacRestController.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/AbacRestController.java
new file mode 100644
index 0000000..ed1c1d2
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/AbacRestController.java
@@ -0,0 +1,85 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.controller.internal;
+
+import eu.europa.eeas.ananke.core.api.provider.http.rest.AbstractRestController;
+import eu.europa.eeas.erights.backoffice.api.http.rest.api.internal.AbacRestApi;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.AbacCommunicationTransferObject;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.AbacItemTransferObject;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.RequestAbacPaymentReferenceTransferObject;
+import eu.europa.eeas.erights.backoffice.service.provider.abac.AbacItemServiceProvider;
+import eu.europa.eeas.erights.common.data.jpa.dto.AbacCommunicationDTO;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import eu.europa.eeas.erights.common.service.data.provider.entitlement.request.RequestJpaServiceProvider;
+import eu.europa.eeas.erights.common.service.model.AbacItemModel;
+import eu.europa.eeas.erights.common.service.model.entitlement.request.RequestModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+public class AbacRestController extends AbstractRestController implements AbacRestApi {
+
+ public static final Logger logger = LoggerFactory.getLogger(AbacRestController.class);
+
+ @Autowired
+ private RequestJpaServiceProvider requestJpaServiceProvider;
+
+ @Autowired
+ private AbacItemServiceProvider abacItemServiceProvider;
+
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity> getAbacCommunicationItems(Long requestId) {
+ List modelList = abacItemServiceProvider.getAbacCommunicationItemsByRequestId(requestId);
+ return ResponseEntity.ok(getBeanMapper().mapAsList(modelList, AbacCommunicationTransferObject.class));
+
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity> getAbacItems(Long requestId) {
+ List modelList = abacItemServiceProvider.getItemsByRequestId(requestId);
+ return ResponseEntity.ok(getBeanMapper().mapAsList(modelList, AbacItemTransferObject.class));
+
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity updatePaymentReference(Long requestId, RequestAbacPaymentReferenceTransferObject requestAbacPaymentReference) {
+//
+ return null;
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity updateWorkFlow(Long requestId) {
+
+ logger.info("Updating workflow for request ID: {} ...", requestId);
+
+ RequestModel requestModel = requestJpaServiceProvider.read(requestId);
+ String abacPaymentOrderId = requestModel.getPaymentOrder();
+
+ logger.info("Updating workflow: abacPaymentOrder = {}", abacPaymentOrderId);
+
+
+ logger.info("Updating workflow: abacPaymentOrder is NULL. Returning OK with empty body.");
+
+ return ResponseEntity.ok("");
+ }
+
+ @Override
+ public ResponseEntity validatePaymentOrder(String abacId) {
+ // return ResponseEntity.ok(abacPaymentOrderServiceProvider.isPaymentOrderValid(abacId));
+ return null;
+ }
+
+ @Override
+ public ResponseEntity updateAccommodationPaymentWorkFlow(Long postingAllowanceId) {
+ return null;
+ }
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/AllowancesFilterRestController.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/AllowancesFilterRestController.java
new file mode 100644
index 0000000..143261a
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/AllowancesFilterRestController.java
@@ -0,0 +1,112 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.controller.internal;
+
+import eu.europa.eeas.ananke.core.api.provider.http.rest.AbstractRestController;
+import eu.europa.eeas.ananke.core.service.provider.data.DataServiceProviderRegistry;
+import eu.europa.eeas.erights.backoffice.api.http.rest.api.internal.AllowancesFilterRestApi;
+import eu.europa.eeas.erights.common.tools.allowances.AllowancePage;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.InlineResponse200TransferObject;
+import eu.europa.eeas.erights.backoffice.service.provider.SessionDataCollectorServiceProvider;
+import eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.VAllowancesTransferObject;
+import eu.europa.eeas.erights.common.service.data.provider.VAllowanceJpaServiceProvider;
+import eu.europa.eeas.erights.common.service.model.VAllowanceModel;
+import eu.europa.eeas.erights.common.tools.utils.KendoParamConverter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+public class AllowancesFilterRestController extends AbstractRestController implements AllowancesFilterRestApi {
+
+ @Autowired
+ public SessionDataCollectorServiceProvider sessionCollectorService;
+
+ @Autowired
+ private DataServiceProviderRegistry dataServiceProviderRegistry;
+
+
+
+
+ @Override
+ public ResponseEntity getAllowancesBackOfficeFiltered(
+ String additionalQueryParams) {
+
+ // 1ï¸âƒ£ Get all real query parameters sent by Kendo
+ Map params = extractAllQueryParams();
+
+ // 2ï¸âƒ£ Extract pagination
+ int page = params.containsKey("page") ? Integer.parseInt(params.get("page")) : 1;
+ int pageSize = params.containsKey("pageSize") ? Integer.parseInt(params.get("pageSize")) : 25;
+
+ // 3ï¸âƒ£ Convert Kendo nested params → JSON
+ String sortJson = KendoParamConverter.extractSortJson(params);
+ String filterJson = KendoParamConverter.extractFilterJson(params);
+
+ VAllowanceJpaServiceProvider service =
+ (VAllowanceJpaServiceProvider) this.dataServiceProviderRegistry
+ .getDataServiceProviderFor(VAllowanceModel.class);
+
+ // 4ï¸âƒ£ Query backend
+ AllowancePage pageResult =
+ service.getAllowancesBackOfficeFiltered(page, pageSize, sortJson, filterJson);
+
+ // 5ï¸âƒ£ Convert entity results to DTOs
+ List dtoList =
+ getBeanMapper().mapAsList(pageResult.getData(), VAllowancesTransferObject.class);
+
+ // 6ï¸âƒ£ Build the Kendo response object
+ InlineResponse200TransferObject response =
+ new InlineResponse200TransferObject()
+ .data(dtoList)
+ .total((int) pageResult.getTotal());
+
+ return ResponseEntity.ok(response);
+ }
+
+ private Map extractAllQueryParams() {
+ HttpServletRequest request =
+ ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
+ .getRequest();
+
+ Map map = new HashMap<>();
+
+ request.getParameterMap().forEach((key, values) -> {
+ if (values != null && values.length > 0) {
+ map.put(key, values[0]);
+ }
+ });
+
+ return map;
+ }
+
+ private Map parseQueryParams(String query) throws UnsupportedEncodingException {
+ Map map = new HashMap<>();
+
+ if (query == null || query.isEmpty()) {
+ return map;
+ }
+
+ String[] pairs = query.split("&");
+ for (String pair : pairs) {
+ int idx = pair.indexOf('=');
+ if (idx > -1) {
+ String key = URLDecoder.decode(pair.substring(0, idx), "UTF-8");
+ String value = URLDecoder.decode(pair.substring(idx + 1), "UTF-8");
+ map.put(key, value);
+ }
+ }
+
+ return map;
+ }
+
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/AllowancesRestController.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/AllowancesRestController.java
new file mode 100644
index 0000000..df3616e
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/AllowancesRestController.java
@@ -0,0 +1,60 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.controller.internal;
+
+import eu.europa.eeas.ananke.core.api.provider.http.rest.AbstractRestController;
+import eu.europa.eeas.ananke.core.service.provider.data.DataServiceProviderRegistry;
+import eu.europa.eeas.erights.backoffice.api.http.rest.api.internal.AllowancesRestApi;
+import eu.europa.eeas.erights.backoffice.service.provider.SessionDataCollectorServiceProvider;
+import eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.VAllowancesTransferObject;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import eu.europa.eeas.erights.common.service.data.provider.VAllowanceJpaServiceProvider;
+import eu.europa.eeas.erights.common.service.model.VAllowanceModel;
+import eu.europa.eeas.erights.common.service.model.allowances.TravelAllowanceModel;
+import eu.europa.eeas.erights.common.service.provider.allowances.TravelAllowanceServiceProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+public class AllowancesRestController extends AbstractRestController implements AllowancesRestApi {
+
+ @Autowired
+ public SessionDataCollectorServiceProvider sessionCollectorService;
+
+ @Autowired
+ private DataServiceProviderRegistry dataServiceProviderRegistry;
+
+
+ @Override
+ public ResponseEntity createAllAsDraftNumberRequest(Integer numberRequests) {
+
+
+ TravelAllowanceServiceProvider service = (TravelAllowanceServiceProvider) this.dataServiceProviderRegistry.getDataServiceProviderFor(
+ TravelAllowanceModel.class);
+ Long allTravelAllowances = service.createAllTravelAllowances(numberRequests);
+ return ResponseEntity.ok(allTravelAllowances);
+ }
+
+ @Override
+ public ResponseEntity> createTravelAllowanceAsDraft(Long personId) {
+
+ TravelAllowanceServiceProvider service = (TravelAllowanceServiceProvider) this.dataServiceProviderRegistry.getDataServiceProviderFor(
+ TravelAllowanceModel.class);
+ List createdResourceIds = service.createTravelAllowanceFromVNewTravelPostingAllowance(personId);
+ return ResponseEntity.ok(createdResourceIds);
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_CONSULT_ENTITLEMENTS)
+ public ResponseEntity> getAllowancesBackOffice() {
+ VAllowanceJpaServiceProvider service = (VAllowanceJpaServiceProvider) this.dataServiceProviderRegistry.getDataServiceProviderFor(
+ VAllowanceModel.class);
+ List transferObject = getBeanMapper().mapAsList(service.getAllowancesBackOffice(), VAllowancesTransferObject.class);
+ return ResponseEntity.ok(transferObject);
+ }
+
+
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/AuditMovementFilesRestController.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/AuditMovementFilesRestController.java
new file mode 100644
index 0000000..88da710
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/AuditMovementFilesRestController.java
@@ -0,0 +1,54 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.controller.internal;
+
+import eu.europa.eeas.ananke.core.api.provider.http.rest.AbstractRestController;
+import eu.europa.eeas.ananke.core.service.provider.data.DataServiceProviderRegistry;
+import eu.europa.eeas.erights.backoffice.api.http.rest.api.internal.AuditMovementFilesRestApi;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.AuditMovementFileTransferObject;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import eu.europa.eeas.erights.common.service.data.provider.AuditMovementFileJpaServiceProvider;
+import eu.europa.eeas.erights.common.service.model.AuditMovementFileModel;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+public class AuditMovementFilesRestController extends AbstractRestController implements AuditMovementFilesRestApi {
+
+ @Autowired
+ private DataServiceProviderRegistry dataServiceProviderRegistry;
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity> getAuditMovementFiles() {
+ ResponseEntity> result;
+
+ AuditMovementFileJpaServiceProvider reportMovementFileProvider = (AuditMovementFileJpaServiceProvider) this.dataServiceProviderRegistry
+ .getDataServiceProviderFor(AuditMovementFileModel.class);
+ List models = reportMovementFileProvider.getActiveMovementFiles();
+ List transferObjects = getBeanMapper().mapAsList(models, AuditMovementFileTransferObject.class);
+ result = ResponseEntity.ok(transferObjects);
+ return result;
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity> getAuditMovementFilesByFileId(Long id) {
+ return null;
+ }
+
+ public ResponseEntity> getAuditMovementFilesByFileId(String fileId) {
+ ResponseEntity> result;
+
+ AuditMovementFileJpaServiceProvider auditMovementFileProvider = (AuditMovementFileJpaServiceProvider) this.dataServiceProviderRegistry
+ .getDataServiceProviderFor(AuditMovementFileModel.class);
+ List auditMovementFileModel = auditMovementFileProvider.getAuditMovementFilesByFileID(fileId);
+ List transferObjects = getBeanMapper().mapAsList(auditMovementFileModel, AuditMovementFileTransferObject.class);
+ result = ResponseEntity.ok(transferObjects);
+
+ return result;
+ }
+
+}
\ No newline at end of file
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/EntitlementMaxDefaultController.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/EntitlementMaxDefaultController.java
new file mode 100644
index 0000000..7db3e1f
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/EntitlementMaxDefaultController.java
@@ -0,0 +1,35 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.controller.internal;
+
+import eu.europa.eeas.ananke.core.api.provider.http.rest.AbstractRestController;
+import eu.europa.eeas.erights.backoffice.api.http.rest.api.internal.EntitlementsMaxDefaultRestApi;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.EntitlementMaxDefaultTransferObject;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import eu.europa.eeas.erights.common.service.data.provider.entitlement.EntitlementMaxDefaultJpaServiceProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class EntitlementMaxDefaultController extends AbstractRestController implements EntitlementsMaxDefaultRestApi {
+
+ @Autowired
+ private final EntitlementMaxDefaultJpaServiceProvider entitlementMaxDefaultJpaServiceProvider;
+
+ public EntitlementMaxDefaultController(EntitlementMaxDefaultJpaServiceProvider entitlementMaxDefaultJpaServiceProvider) {
+ this.entitlementMaxDefaultJpaServiceProvider = entitlementMaxDefaultJpaServiceProvider;
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity newEntitlementMaxDefault(EntitlementMaxDefaultTransferObject entitlementMaxDefault) {
+ entitlementMaxDefaultJpaServiceProvider.newEntitlementMaxDefault(entitlementMaxDefault.getYear(),
+ entitlementMaxDefault.getAmount(),
+ entitlementMaxDefault.getCountryFrom(),
+ entitlementMaxDefault.getCountryTo(),
+ entitlementMaxDefault.getRateType());
+ return ResponseEntity.status(HttpStatus.OK).build();
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/JobsRestController.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/JobsRestController.java
new file mode 100644
index 0000000..c9b1405
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/JobsRestController.java
@@ -0,0 +1,48 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.controller.internal;
+
+import eu.europa.eeas.ananke.core.api.provider.http.rest.AbstractRestController;
+import eu.europa.eeas.ananke.core.base.exception.ResourceNotFoundRuntimeException;
+import eu.europa.eeas.ananke.core.service.provider.data.DataServiceProviderRegistry;
+import eu.europa.eeas.erights.backoffice.api.http.rest.api.internal.JobsRestApi;
+import eu.europa.eeas.erights.backoffice.exceptionhandling.ERightsBackOfficeExceptionCode;
+import eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.VJobTransferObject;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import eu.europa.eeas.erights.common.service.data.provider.PostingTravelAllowanceTransitionService;
+import eu.europa.eeas.erights.common.service.data.provider.VJobJpaServiceProvider;
+import eu.europa.eeas.erights.common.service.model.VJobModel;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class JobsRestController extends AbstractRestController implements JobsRestApi {
+
+ @Autowired
+ private DataServiceProviderRegistry dataServiceProviderRegistry;
+
+ @Autowired
+ private PostingTravelAllowanceTransitionService postingTravelAllowanceTransitionService;
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity getJob(Long jobId) {
+ VJobJpaServiceProvider jobJpaServiceProvider = (VJobJpaServiceProvider) this.dataServiceProviderRegistry
+ .getDataServiceProviderFor(VJobModel.class);
+ VJobModel jobModel = jobJpaServiceProvider.get(jobId);
+ if (jobModel == null) {
+ throw new ResourceNotFoundRuntimeException(ERightsBackOfficeExceptionCode.ERBO001, jobId.toString());
+ }
+
+ return ResponseEntity.ok(getBeanMapper().map(jobModel, VJobTransferObject.class));
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity postingTravelAllowanceTransitionJob() {
+ //postingTravelAllowanceTransitionService.execute();
+ return null;
+ }
+
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/MovementFilesRestController.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/MovementFilesRestController.java
new file mode 100644
index 0000000..314955c
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/MovementFilesRestController.java
@@ -0,0 +1,103 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.controller.internal;
+
+import eu.europa.eeas.ananke.core.api.provider.http.rest.AbstractRestController;
+import eu.europa.eeas.ananke.core.service.provider.data.DataServiceProviderRegistry;
+import eu.europa.eeas.erights.backoffice.api.http.rest.api.internal.MovementFilesRestApi;
+import eu.europa.eeas.erights.backoffice.service.provider.SessionDataCollectorServiceProvider;
+import eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.MovementFileTransferObject;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import eu.europa.eeas.erights.common.service.data.provider.MovementFileJpaServiceProvider;
+import eu.europa.eeas.erights.common.service.model.MovementFileModel;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+
+@RestController("BackOfficeMovementFilesRestController")
+public class MovementFilesRestController extends AbstractRestController implements MovementFilesRestApi {
+
+ @Autowired
+ public SessionDataCollectorServiceProvider sessionCollectorService;
+
+ @Autowired
+ private DataServiceProviderRegistry dataServiceProviderRegistry;
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity createMovementFile(@Valid MovementFileTransferObject data) {
+ Long result;
+
+ MovementFileJpaServiceProvider service = (MovementFileJpaServiceProvider) this.dataServiceProviderRegistry.getDataServiceProviderFor(MovementFileModel.class);
+ MovementFileModel movementFile = service.create(getBeanMapper().map(data, MovementFileModel.class));
+ result = movementFile.getId();
+
+ return ResponseEntity.ok(result);
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity delete(Long id) {
+ MovementFileJpaServiceProvider movementFileProvider = (MovementFileJpaServiceProvider) this.dataServiceProviderRegistry
+ .getDataServiceProviderFor(MovementFileModel.class);
+ movementFileProvider.deleteMovementFile(id);
+ return ResponseEntity.ok().build();
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity createAsDraft(@Valid MovementFileTransferObject data) {
+ MovementFileJpaServiceProvider service = (MovementFileJpaServiceProvider) this.dataServiceProviderRegistry.getDataServiceProviderFor(MovementFileModel.class);
+ Long id = service.createDraft(getBeanMapper().map(data, MovementFileModel.class));
+ sessionCollectorService.clearDataFromSession();
+ return ResponseEntity.ok(id);
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity updateDraft(@Valid MovementFileTransferObject data) {
+ MovementFileJpaServiceProvider service = (MovementFileJpaServiceProvider) this.dataServiceProviderRegistry.getDataServiceProviderFor(MovementFileModel.class);
+ Long id = service.updateDraft(getBeanMapper().map(data, MovementFileModel.class));
+ sessionCollectorService.clearDataFromSession();
+ return ResponseEntity.ok(id);
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity createAsPending(@Valid MovementFileTransferObject data) {
+ MovementFileJpaServiceProvider service = (MovementFileJpaServiceProvider) this.dataServiceProviderRegistry.getDataServiceProviderFor(MovementFileModel.class);
+ Long id = service.createPending(getBeanMapper().map(data, MovementFileModel.class));
+ sessionCollectorService.clearDataFromSession();
+ return ResponseEntity.ok(id);
+ }
+
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity draftToPending(@Valid MovementFileTransferObject data) {
+ MovementFileJpaServiceProvider service = (MovementFileJpaServiceProvider) this.dataServiceProviderRegistry.getDataServiceProviderFor(MovementFileModel.class);
+ Long id = service.draftToPending((getBeanMapper().map(data, MovementFileModel.class)));
+ sessionCollectorService.clearDataFromSession();
+ return ResponseEntity.ok(id);
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity getMovementFile(Long id) {
+ ResponseEntity result;
+
+ MovementFileJpaServiceProvider movementFileProvider = (MovementFileJpaServiceProvider) this.dataServiceProviderRegistry
+ .getDataServiceProviderFor(MovementFileModel.class);
+ MovementFileModel movementFileModel = movementFileProvider.get(id);
+ result = ResponseEntity.ok(getBeanMapper().map(movementFileModel, MovementFileTransferObject.class));
+
+ return result;
+ }
+
+
+
+
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/P2pHubRestController.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/P2pHubRestController.java
new file mode 100644
index 0000000..e463f90
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/P2pHubRestController.java
@@ -0,0 +1,211 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.controller.internal;
+
+import eu.europa.eeas.ananke.core.api.provider.http.rest.AbstractRestController;
+import eu.europa.eeas.ananke.core.service.provider.data.DataServiceProviderRegistry;
+import eu.europa.eeas.erights.backoffice.api.http.rest.api.internal.SummaRestApi;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.AllowanceRequestInternalTransferObject;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.OrderResponseInternalTransferObject;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.SummaFundSourceTransferObject;
+import eu.europa.eeas.erights.backoffice.boot.configuration.p2phub.P2pHubRestClientConfiguration;
+import eu.europa.eeas.erights.backoffice.service.data.provider.AllowancePaymentJpaServiceProvider;
+import eu.europa.eeas.erights.backoffice.service.data.provider.SummaFundSourceJpaServiceProvider;
+import eu.europa.eeas.erights.backoffice.service.data.provider.p2phub.OrderResponseJpaServiceProvider;
+import eu.europa.eeas.erights.backoffice.service.model.SummaFundSourceModel;
+import eu.europa.eeas.erights.backoffice.service.model.p2phub.AllowancePaymentModel;
+import eu.europa.eeas.erights.backoffice.service.model.p2phub.OrderResponseModel;
+import eu.europa.eeas.erights.backoffice.service.provider.p2p.AllowanceOrderConsumerServiceProvider;
+import eu.europa.eeas.erights.backoffice.service.provider.p2p.AuthTokenProviderServiceProvider;
+import eu.europa.eeas.erights.backoffice.service.provider.p2p.BusinessPartnerConsumerServiceProvider;
+import eu.europa.eeas.erights.backoffice.service.provider.p2p.P2pOrderUpdaterServiceProvider;
+import eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.RequestTransferObject;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import eu.europa.eeas.erights.common.service.data.provider.AppParameterJpaServiceProvider;
+import eu.europa.eeas.erights.common.service.model.entitlement.request.RequestModel;
+import eu.europa.eeas.erights.common.tools.app.AppParamType;
+import eu.europa.eeas.erights.web.p2phub.client.transferobject.BusinessPartnerResponseTransferObject;
+import eu.europa.eeas.erights.web.p2phub.client.transferobject.OrderStatusResponseTransferObject;
+import org.apache.coyote.Request;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Objects;
+
+@RestController
+public class P2pHubRestController extends AbstractRestController implements SummaRestApi {
+
+
+ public static final Logger logger = LoggerFactory.getLogger(P2pHubRestController.class);
+
+ private final DataServiceProviderRegistry dataServiceProviderRegistry;
+
+ private final BusinessPartnerConsumerServiceProvider businessPartnerConsumerServiceProvider;
+ private final AllowanceOrderConsumerServiceProvider allowanceOrderConsumerServiceProvider;
+ private final AllowancePaymentJpaServiceProvider allowancePaymentJpaServiceProvider;
+ private final OrderResponseJpaServiceProvider orderResponseJpaServiceProvider ;
+ private final AppParameterJpaServiceProvider appParameterService;
+ private final AuthTokenProviderServiceProvider authTokenProviderServiceProvider;
+ private final P2pOrderUpdaterServiceProvider p2pOrderUpdaterServiceProvider;
+
+
+ public P2pHubRestController(DataServiceProviderRegistry dataServiceProviderRegistry, BusinessPartnerConsumerServiceProvider businessPartnerConsumerServiceProvider, AllowancePaymentJpaServiceProvider allowancePaymentJpaServiceProvider, AppParameterJpaServiceProvider appParameterService, AuthTokenProviderServiceProvider authTokenProviderServiceProvider, AllowanceOrderConsumerServiceProvider allowanceOrderConsumerServiceProvider, OrderResponseJpaServiceProvider orderResponseJpaServiceProvider, P2pOrderUpdaterServiceProvider p2pOrderUpdaterServiceProvider) {
+ this.dataServiceProviderRegistry = dataServiceProviderRegistry;
+
+ this.businessPartnerConsumerServiceProvider = businessPartnerConsumerServiceProvider;
+ this.allowancePaymentJpaServiceProvider = allowancePaymentJpaServiceProvider;
+ this.appParameterService = appParameterService;
+ this.authTokenProviderServiceProvider = authTokenProviderServiceProvider;
+ this.allowanceOrderConsumerServiceProvider = allowanceOrderConsumerServiceProvider;
+ this.orderResponseJpaServiceProvider = orderResponseJpaServiceProvider;
+ this.p2pOrderUpdaterServiceProvider = p2pOrderUpdaterServiceProvider;
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity> getFundSources() {
+ ResponseEntity> result = null;
+
+ SummaFundSourceJpaServiceProvider service = (SummaFundSourceJpaServiceProvider) this.dataServiceProviderRegistry.getDataServiceProviderFor(SummaFundSourceModel.class);
+ List summaFundSource = service.findAll();
+ result = ResponseEntity.ok(getBeanMapper().mapAsList(summaFundSource, SummaFundSourceTransferObject.class));
+
+ return result;
+ }
+
+
+ @Override
+ public ResponseEntity getBusinessPartnerFromSumma(Long perid) {
+
+ BusinessPartnerResponseTransferObject BusinessPartnerResponseTransferObject = businessPartnerConsumerServiceProvider.getBusinessPartnerResponseTransferObjectByPerId(perid);
+ return ResponseEntity.ok(BusinessPartnerResponseTransferObject);
+
+ }
+
+
+
+ @Override
+ public ResponseEntity refreshFromSummaPerIdBankAccountsPerId(String perId) {
+
+ if (perId == null || perId.trim().isEmpty()) {
+ return ResponseEntity.badRequest().body("Invalid perId");
+ }
+
+ String[] parts = perId.split(",");
+
+ for (String part : parts) {
+ String trimmed = part.trim();
+ if (trimmed.isEmpty()) {
+ continue;
+ }
+
+ try {
+ Long id = Long.valueOf(trimmed);
+ this.businessPartnerConsumerServiceProvider
+ .saveOrUpdateBankAccountsFromSummaByPerId(id);
+ } catch (NumberFormatException ex) {
+ return ResponseEntity.badRequest()
+ .body("Invalid perId value: " + trimmed);
+ }
+ }
+
+ return ResponseEntity.ok("OK");
+ }
+
+
+
+ @Override
+ public ResponseEntity refreshAllBankAccountsFromSumma() {
+ this.businessPartnerConsumerServiceProvider.saveOrUpdateBankAccountsForAllMovementFilesBankAccountsFromSumma();
+ return ResponseEntity.ok(null);
+ }
+
+ @Override
+ public ResponseEntity refreshAllOldBankAccountsFromSumma() {
+ this.businessPartnerConsumerServiceProvider.saveOrUpdateOldBankAccountsForAllMovementFilesBankAccountsFromSumma();
+ return ResponseEntity.ok(null);
+ }
+
+
+ @Override
+ public ResponseEntity getPopToken() {
+ return ResponseEntity.ok(authTokenProviderServiceProvider.getSystemPoPToken());
+ }
+
+ @Override
+ public ResponseEntity createSummaPayment(AllowanceRequestInternalTransferObject allowanceRequest) {
+
+ ResponseEntity responseEntity = allowanceOrderConsumerServiceProvider.submitAllowanceCreation(allowanceRequest);
+ return responseEntity;
+
+ }
+
+ @Override
+ public ResponseEntity> getAllowanceRequestByRequestId(Long requestId) {
+ List allowancePaymentModel = this.allowancePaymentJpaServiceProvider.getAllowancePaymentModelByRequestId(requestId);
+
+ return ResponseEntity.ok(getBeanMapper().mapAsList(allowancePaymentModel, AllowanceRequestInternalTransferObject.class));
+
+ }
+
+ @Override
+ public ResponseEntity getAllowanceRequestEmptyByRequestId(Long requestId) {
+ ResponseEntity responseEntity = null;
+ String clientId = this.appParameterService.getAppParametersByTypeAndKey(AppParamType.SUMMA, "CLIENT_ID").get(0).getValue();
+ AllowancePaymentModel allowancePaymentModel = this.allowancePaymentJpaServiceProvider.createAllowancePaymentModel(requestId);
+ //allowancePaymentModel.getHeader().set
+ responseEntity = ResponseEntity.ok(getBeanMapper().map(allowancePaymentModel, AllowanceRequestInternalTransferObject.class));
+ return responseEntity;
+
+ }
+
+ @Override
+ public ResponseEntity> getOrderResponseInternalByRequestId(Long requestId) {
+ List orderResponseModels = this.orderResponseJpaServiceProvider.findAllByRequestId(requestId);
+
+ return ResponseEntity.ok(getBeanMapper().mapAsList(orderResponseModels, OrderResponseInternalTransferObject.class));
+
+ }
+
+
+ @Override
+ public ResponseEntity getOrderIdStatus(Long orderId) {
+ OrderStatusResponseTransferObject orderStatusResponseTransferObject = this.allowanceOrderConsumerServiceProvider.getOrderStatus(orderId);
+ return ResponseEntity.ok(orderStatusResponseTransferObject);
+ }
+
+ @Override
+ public ResponseEntity refreshAllowanceP2pOrderStatus(Long requestId) {
+ RequestModel requestModel = p2pOrderUpdaterServiceProvider.updateRequestP2pOrderStatusById(requestId);
+ return ResponseEntity.ok(getBeanMapper().map(requestModel, RequestTransferObject.class));
+ }
+
+ @Override
+ public ResponseEntity validateOrder(Long orderId) {
+ try {
+ OrderStatusResponseTransferObject orderStatus =
+ allowanceOrderConsumerServiceProvider.getOrderStatus(orderId);
+
+ // If no response returned → invalid
+ if (orderStatus == null) {
+ logger.warn("No status returned for order {}", orderId);
+ return ResponseEntity.ok(false);
+ }
+
+ // Compare String orderId from response with Long input
+
+ if (Objects.equals(orderId, Long.valueOf(orderStatus.getOrderId()))) {
+ return ResponseEntity.ok(true);
+ } else {
+ logger.warn("Order ID mismatch. Expected {}, got {}", orderId, orderStatus.getOrderId());
+ return ResponseEntity.ok(false);
+ }
+
+ } catch (Exception ex) {
+ logger.error("Error validating order {}: {}", orderId, ex.getMessage());
+ return ResponseEntity.ok(false);
+ }
+ }
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/PersonsRestController.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/PersonsRestController.java
new file mode 100644
index 0000000..f8df193
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/PersonsRestController.java
@@ -0,0 +1,51 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.controller.internal;
+
+import eu.europa.eeas.ananke.core.api.provider.http.rest.AbstractRestController;
+import eu.europa.eeas.ananke.core.service.provider.data.DataServiceProviderRegistry;
+import eu.europa.eeas.erights.backoffice.api.http.rest.api.internal.PersonsRestApi;
+import eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.VPersonTransferObject;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import eu.europa.eeas.erights.common.service.data.provider.VPersonJpaServiceProvider;
+import eu.europa.eeas.erights.common.service.model.VPersonModel;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@RestController
+public class PersonsRestController extends AbstractRestController implements PersonsRestApi {
+
+ @Autowired
+ private DataServiceProviderRegistry dataServiceProviderRegistry;
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity> getPersons(@Valid Long perId, @Valid String firstName, @Valid String lastName,
+ @Valid String orgName) {
+ ResponseEntity> result = null;
+
+ VPersonJpaServiceProvider service = (VPersonJpaServiceProvider) this.dataServiceProviderRegistry
+ .getDataServiceProviderFor(VPersonModel.class);
+ List persons = service.findPersonsBy(perId, firstName, lastName, orgName);
+ result = ResponseEntity.ok(getBeanMapper().mapAsList(persons, VPersonTransferObject.class));
+
+ return result;
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity getPerson(Long perId) {
+ ResponseEntity result = null;
+
+ VPersonJpaServiceProvider service = (VPersonJpaServiceProvider) this.dataServiceProviderRegistry
+ .getDataServiceProviderFor(VPersonModel.class);
+ VPersonModel person = service.findById(perId);
+ result = ResponseEntity.ok(getBeanMapper().map(person, VPersonTransferObject.class));
+
+ return result;
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/PlaceOriginAirportRestController.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/PlaceOriginAirportRestController.java
new file mode 100644
index 0000000..2da1349
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/PlaceOriginAirportRestController.java
@@ -0,0 +1,58 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.controller.internal;
+
+import eu.europa.eeas.ananke.core.api.provider.http.rest.AbstractRestController;
+import eu.europa.eeas.erights.backoffice.api.http.rest.api.internal.PlaceOriginAirportRestApi;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.PlaceOriginAirportTransferObject;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import eu.europa.eeas.erights.common.service.data.provider.PlaceOriginAirportJpaServiceProvider;
+import eu.europa.eeas.erights.common.service.model.PlaceOriginAirportModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class PlaceOriginAirportRestController extends AbstractRestController implements PlaceOriginAirportRestApi {
+
+ public static final Logger logger = LoggerFactory.getLogger(PlaceOriginAirportRestController.class);
+
+ @Autowired
+ private PlaceOriginAirportJpaServiceProvider placeOriginAirportJpaServiceProvider;
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity placeOriginAirportByCityNameAndCountryCode(String cityName, String countryCode) {
+ PlaceOriginAirportModel placeOriginAirportModel = placeOriginAirportJpaServiceProvider.findIataCodeByCityNameAndCountryCode(cityName, countryCode);
+ if(countryCode == null){
+ return ResponseEntity.noContent().build();
+ }
+ return ResponseEntity.ok(getBeanMapper().map(placeOriginAirportModel, PlaceOriginAirportTransferObject.class));
+
+
+ }
+
+ @Override
+ public ResponseEntity savePlaceOriginAirportByCityNameAndCountryCode(PlaceOriginAirportTransferObject placeOriginAirport) {
+ PlaceOriginAirportModel placeOriginAirportModel = getBeanMapper().map(placeOriginAirport, PlaceOriginAirportModel.class);
+ if(!placeOriginAirportJpaServiceProvider.checkIfPlaceOriginExists(placeOriginAirportModel)){
+ placeOriginAirportModel=placeOriginAirportJpaServiceProvider.create(placeOriginAirportModel);
+ return ResponseEntity.ok(getBeanMapper().map(placeOriginAirportJpaServiceProvider.read(placeOriginAirportModel.getId()), PlaceOriginAirportTransferObject.class));
+ }else{
+ return ResponseEntity
+ .status(HttpStatus.CONFLICT)
+ .body(placeOriginAirport);
+ }
+
+
+
+
+
+ }
+
+
+
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/ReportRestController.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/ReportRestController.java
new file mode 100644
index 0000000..f0f54af
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/ReportRestController.java
@@ -0,0 +1,64 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.controller.internal;
+
+import eu.europa.eeas.ananke.core.api.provider.http.rest.AbstractRestController;
+import eu.europa.eeas.ananke.core.service.provider.data.DataServiceProviderRegistry;
+import eu.europa.eeas.erights.backoffice.api.http.rest.api.internal.ReportRestApi;
+import eu.europa.eeas.erights.backoffice.api.http.rest.api.internal.VReportPostingAllowancesRestApi;
+import eu.europa.eeas.erights.backoffice.service.data.provider.VReportMovementFileJpaServiceProvider;
+import eu.europa.eeas.erights.backoffice.service.data.provider.allowance.VReportPostingAllowanceServiceProvider;
+import eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.VReportMovementFileTransferObject;
+import eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.VReportPostingAllowanceTransferObject;
+import eu.europa.eeas.erights.common.boot.configuration.ERightsBeanNames;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import eu.europa.eeas.erights.common.security.PostingAllowanceSecurityChecker;
+import eu.europa.eeas.erights.common.service.model.VReportMovementFileModel;
+import eu.europa.eeas.erights.common.service.model.allowances.VReportPostingAllowanceModel;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+public class ReportRestController extends AbstractRestController implements ReportRestApi, VReportPostingAllowancesRestApi {
+
+ private final DataServiceProviderRegistry dataServiceProviderRegistry;
+ private final VReportPostingAllowanceServiceProvider vReportPostingAllowanceServiceProvider;
+
+ @Autowired
+ @Qualifier(ERightsBeanNames.POSTING_ALLOWANCE_SECURITY_CHECKER)
+ private PostingAllowanceSecurityChecker postingAllowanceSecurityChecker;
+
+ public ReportRestController(DataServiceProviderRegistry dataServiceProviderRegistry,
+ VReportPostingAllowanceServiceProvider vReportPostingAllowanceServiceProvider) {
+ this.dataServiceProviderRegistry = dataServiceProviderRegistry;
+ this.vReportPostingAllowanceServiceProvider = vReportPostingAllowanceServiceProvider;
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity> getReportMovementFiles() {
+ ResponseEntity> result;
+
+ VReportMovementFileJpaServiceProvider reportMovementFileProvider = (VReportMovementFileJpaServiceProvider) this.dataServiceProviderRegistry
+ .getDataServiceProviderFor(VReportMovementFileModel.class);
+ List models = reportMovementFileProvider.getAllMovementFiles();
+ List transferObjects = getBeanMapper().mapAsList(models, VReportMovementFileTransferObject.class);
+ result = ResponseEntity.ok(transferObjects);
+ return result;
+ }
+
+ @Override
+ public ResponseEntity> getVReportPostingAllowances(Long personId, Integer year) {
+
+ if (postingAllowanceSecurityChecker.hasOrganisationIndependentListAuthority()
+ || postingAllowanceSecurityChecker.hasOrganisationsWithListAuthority()) {
+ List reportPostingAllowanceModels = vReportPostingAllowanceServiceProvider.getVReportPostingAllowances(personId, year);
+ return ResponseEntity.ok(getBeanMapper().mapAsList(reportPostingAllowanceModels, VReportPostingAllowanceTransferObject.class));
+ }
+ return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
+ }
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/SessionRestController.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/SessionRestController.java
new file mode 100644
index 0000000..2e88808
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/controller/internal/SessionRestController.java
@@ -0,0 +1,82 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.controller.internal;
+
+import eu.europa.eeas.ananke.core.api.provider.http.rest.AbstractRestController;
+import eu.europa.eeas.erights.backoffice.api.http.rest.api.internal.SessionRestApi;
+import eu.europa.eeas.erights.backoffice.service.provider.SessionDataCollectorServiceProvider;
+import eu.europa.eeas.erights.common.api.http.rest.transferobject.internal.MovementFileTransferObject;
+import eu.europa.eeas.erights.common.security.MovementFileSecurityChecker;
+import eu.europa.eeas.erights.common.service.data.provider.MovementFileJpaServiceProvider;
+import eu.europa.eeas.erights.common.service.model.MovementFileModel;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+import static org.springframework.http.HttpStatus.OK;
+
+@RestController
+@RequestMapping("/internal/api")
+public class SessionRestController extends AbstractRestController implements SessionRestApi {
+
+ @Autowired
+ public SessionDataCollectorServiceProvider sessionDataCollectorServiceProvider;
+
+ @Autowired
+ public MovementFileJpaServiceProvider movementFileJpaServiceProvider;
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity saveMovementFileData(@Valid MovementFileTransferObject movementFileTransferObject) {
+ ResponseEntity result;
+
+ MovementFileModel movementFileModel = getBeanMapper().map(movementFileTransferObject, MovementFileModel.class);
+ MovementFileModel model = sessionDataCollectorServiceProvider.saveDataInSession(movementFileModel);
+
+ Long id = movementFileJpaServiceProvider.saveOrUpdate(model);
+
+ // Set id when creating, so the client receives it:
+ if (id != null && model.getId() == null) {
+ model.setId(id);
+ }
+
+ sessionDataCollectorServiceProvider.clearDataFromSession();
+ result = ResponseEntity.ok(getBeanMapper().map(model, MovementFileTransferObject.class));
+ return result;
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity saveMovementFileDataInSession(@Valid MovementFileTransferObject movementFileTransferObject) {
+ ResponseEntity result;
+
+ MovementFileModel movementFileModel = getBeanMapper().map(movementFileTransferObject, MovementFileModel.class);
+
+ MovementFileModel model = sessionDataCollectorServiceProvider.saveDataInSession(movementFileModel);
+ result = ResponseEntity.ok(getBeanMapper().map(model, MovementFileTransferObject.class));
+ return result;
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity deleteMovementFileFromSession() {
+ sessionDataCollectorServiceProvider.clearDataFromSession();
+ return new ResponseEntity<>(OK);
+ }
+
+ @Override
+ @PreAuthorize(MovementFileSecurityChecker.CAN_ACCESS_BACK_OFFICE)
+ public ResponseEntity getMovementFileDataFromSession() {
+ ResponseEntity result;
+ MovementFileModel model = sessionDataCollectorServiceProvider.getMovementFileDataFromSession();
+ result = ResponseEntity.ok(getBeanMapper().map(model, MovementFileTransferObject.class));
+ return result;
+ }
+
+
+
+
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/AbacCommunicationTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/AbacCommunicationTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..4aade67
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/AbacCommunicationTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,42 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.AbacCommunicationTransferObject;
+import eu.europa.eeas.erights.backoffice.service.model.BudgetLineInfoModel;
+import eu.europa.eeas.erights.common.data.jpa.dto.AbacCommunicationDTO;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Simple map builder for {@link BudgetLineInfoModel}
+ *
+ * @author idominju
+ */
+public class AbacCommunicationTransferObjectToModelClassMapBuilder extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE = TypeFactory.valueOf(AbacCommunicationTransferObject.class);
+
+ private static final Type B_TYPE = TypeFactory.valueOf(AbacCommunicationDTO.class);
+
+ public AbacCommunicationTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+ @Override
+ protected void buildMap(ClassMapBuilder classMapBuilder) {
+ classMapBuilder.byDefault();
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/AbacItemTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/AbacItemTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..363841f
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/AbacItemTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,42 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.AbacItemTransferObject;
+import eu.europa.eeas.erights.backoffice.service.model.BudgetLineInfoModel;
+import eu.europa.eeas.erights.common.service.model.AbacItemModel;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Simple map builder for {@link BudgetLineInfoModel}
+ *
+ * @author idominju
+ */
+public class AbacItemTransferObjectToModelClassMapBuilder extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE = TypeFactory.valueOf(AbacItemTransferObject.class);
+
+ private static final Type B_TYPE = TypeFactory.valueOf(AbacItemModel.class);
+
+ public AbacItemTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+ @Override
+ protected void buildMap(ClassMapBuilder classMapBuilder) {
+ classMapBuilder.byDefault();
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/BudgetLineInfoTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/BudgetLineInfoTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..ad858ab
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/BudgetLineInfoTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,41 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.BudgetLineInfoTransferObject;
+import eu.europa.eeas.erights.backoffice.service.model.BudgetLineInfoModel;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Simple map builder for {@link BudgetLineInfoModel}
+ *
+ * @author idominju
+ */
+public class BudgetLineInfoTransferObjectToModelClassMapBuilder extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE = TypeFactory.valueOf(BudgetLineInfoTransferObject.class);
+
+ private static final Type B_TYPE = TypeFactory.valueOf(BudgetLineInfoModel.class);
+
+ public BudgetLineInfoTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+ @Override
+ protected void buildMap(ClassMapBuilder classMapBuilder) {
+ classMapBuilder.byDefault();
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/BudgetLineSubpostTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/BudgetLineSubpostTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..b87922f
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/BudgetLineSubpostTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,41 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.BudgetLineSubpostTransferObject;
+import eu.europa.eeas.erights.backoffice.service.model.BudgetLineSubpostModel;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Simple map builder for {@link BudgetLineSubpostModel}
+ *
+ * @author idominju
+ */
+public class BudgetLineSubpostTransferObjectToModelClassMapBuilder extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE = TypeFactory.valueOf(BudgetLineSubpostTransferObject.class);
+
+ private static final Type B_TYPE = TypeFactory.valueOf(BudgetLineSubpostModel.class);
+
+ public BudgetLineSubpostTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+ @Override
+ protected void buildMap(ClassMapBuilder classMapBuilder) {
+ classMapBuilder.byDefault();
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/BusinessPartnerBankAccountTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/BusinessPartnerBankAccountTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..644daaf
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/BusinessPartnerBankAccountTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,52 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.service.model.p2phub.BusinessPartnerBankAccountModel;
+import eu.europa.eeas.erights.web.p2phub.client.transferobject.BusinessPartnerBankAccountTransferObject;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Map builder for {@link BusinessPartnerBankAccountModel}.
+ */
+public class BusinessPartnerBankAccountTransferObjectToModelClassMapBuilder
+ extends AbstractTransferObjectToModelClassMapBuilder<
+ BusinessPartnerBankAccountTransferObject,
+ BusinessPartnerBankAccountModel> {
+
+ private static final Type A_TYPE =
+ TypeFactory.valueOf(BusinessPartnerBankAccountTransferObject.class);
+
+ private static final Type B_TYPE =
+ TypeFactory.valueOf(BusinessPartnerBankAccountModel.class);
+
+ public BusinessPartnerBankAccountTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+ @Override
+ protected void buildMap(
+ ClassMapBuilder classMapBuilder) {
+
+ // If your Extended TO delegates with same accessor names, this will work.
+ // Otherwise, add explicit field mappings below.
+ classMapBuilder.byDefault();
+
+ // Examples if names differ:
+ // classMapBuilder.field("iban", "iban");
+ // classMapBuilder.field("bic", "bic");
+ // classMapBuilder.field("accountHolderName", "holderName");
+ }
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/BusinessPartnerInternalTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/BusinessPartnerInternalTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..d927620
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/BusinessPartnerInternalTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,106 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder;
+
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.BusinessPartnerInternalTransferObject;
+import eu.europa.eeas.erights.backoffice.service.model.p2phub.BusinessPartnerBankAccountModel;
+import eu.europa.eeas.erights.backoffice.service.model.p2phub.BusinessPartnerModel;
+
+import ma.glasnost.orika.CustomMapper;
+import ma.glasnost.orika.MappingContext;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Simple map builder for {@link BusinessPartnerModel}
+ *
+ * @author tapiafo
+ */
+public class BusinessPartnerInternalTransferObjectToModelClassMapBuilder extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE = TypeFactory.valueOf(BusinessPartnerInternalTransferObject.class);
+
+ private static final Type B_TYPE = TypeFactory.valueOf(BusinessPartnerModel.class);
+
+ public BusinessPartnerInternalTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+ @Override
+ protected void buildMap(ClassMapBuilder classMapBuilder) {
+ classMapBuilder
+ .byDefault()
+ .customize(new CustomMapper() {
+ @Override
+ public void mapAtoB(BusinessPartnerInternalTransferObject src,
+ BusinessPartnerModel dst,
+ MappingContext context) {
+ // Default mapping first
+ super.mapAtoB(src, dst, context);
+
+ if (dst.getBankAccounts() == null || dst.getBankAccounts().isEmpty()) {
+ return;
+ }
+
+ // -------- perId from MappingContext (your existing logic) --------
+ Long perId = null;
+ if (context != null) {
+ Object perIdObj = context.getProperty("perId");
+ if (perIdObj instanceof Number) {
+ perId = ((Number) perIdObj).longValue();
+ } else if (perIdObj != null) {
+ try {
+ perId = Long.valueOf(perIdObj.toString());
+ } catch (NumberFormatException ignored) {}
+ }
+ }
+
+ if (perId != null) {
+ // optional top-level perId
+ try {
+ dst.setPerId(perId);
+ } catch (NoSuchMethodError | UnsupportedOperationException ignored) {
+ // ignore if top-level setter doesn't exist
+ }
+ // propagate to bank accounts
+ for (BusinessPartnerBankAccountModel m : dst.getBankAccounts()) {
+ if (m != null) {
+ m.setPerId(perId);
+ }
+ }
+ }
+
+ // -------- businessPartnerIdByExtSystem → bankAccount.lef --------
+ // This value may be absent in the payload; handle null safely.
+ Object extIdObj = src.getBusinessPartnerIdByExtSystem(); // may be null
+ if (extIdObj != null) {
+ // Assuming bankAccount.lef is a String; if it's numeric, parse accordingly.
+ String extId = extIdObj.toString().trim();
+ if (!extId.isEmpty()) {
+ for (BusinessPartnerBankAccountModel m : dst.getBankAccounts()) {
+ if (m != null) {
+ m.setLef(extId);
+ // If lef is Long, use:
+ // try { m.setLef(Long.valueOf(extId)); } catch (NumberFormatException ignored) {}
+ }
+ }
+ }
+ }
+ }
+ });
+ }
+
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/DelegationCodesTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/DelegationCodesTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..40ab1d3
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/DelegationCodesTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,41 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.DelegationCodesTransferObject;
+import eu.europa.eeas.erights.backoffice.service.model.DelegationCodesModel;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Simple map builder for {@link DelegationCodesModel}
+ *
+ * @author idominju
+ */
+public class DelegationCodesTransferObjectToModelClassMapBuilder extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE = TypeFactory.valueOf(DelegationCodesTransferObject.class);
+
+ private static final Type B_TYPE = TypeFactory.valueOf(DelegationCodesModel.class);
+
+ public DelegationCodesTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+ @Override
+ protected void buildMap(ClassMapBuilder classMapBuilder) {
+ classMapBuilder.byDefault();
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/MovementFileDetailTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/MovementFileDetailTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..fcf2fb3
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/MovementFileDetailTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,36 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.MovementFileDetailTransferObject;
+import eu.europa.eeas.erights.common.service.model.MovementFileDetailModel;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+public class MovementFileDetailTransferObjectToModelClassMapBuilder extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE = TypeFactory.valueOf(MovementFileDetailTransferObject.class);
+
+ private static final Type B_TYPE = TypeFactory.valueOf(MovementFileDetailModel.class);
+
+ public MovementFileDetailTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+ @Override
+ protected void buildMap(ClassMapBuilder builder) {
+ builder.byDefault();
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/PersonAbacInfoTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/PersonAbacInfoTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..226d8ce
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/PersonAbacInfoTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,41 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.PersonAbacInfoTransferObject;
+import eu.europa.eeas.erights.backoffice.service.model.PersonAbacInfoModel;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Simple map builder for {@link PersonAbacInfoModel}
+ *
+ * @author idominju
+ */
+public class PersonAbacInfoTransferObjectToModelClassMapBuilder extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE = TypeFactory.valueOf(PersonAbacInfoTransferObject.class);
+
+ private static final Type B_TYPE = TypeFactory.valueOf(PersonAbacInfoModel.class);
+
+ public PersonAbacInfoTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+ @Override
+ protected void buildMap(ClassMapBuilder classMapBuilder) {
+ classMapBuilder.byDefault();
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/PlaceOriginAirportTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/PlaceOriginAirportTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..0195b7c
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/PlaceOriginAirportTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,36 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.PlaceOriginAirportTransferObject;
+import eu.europa.eeas.erights.common.service.model.PlaceOriginAirportModel;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+public class PlaceOriginAirportTransferObjectToModelClassMapBuilder extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE = TypeFactory.valueOf(PlaceOriginAirportTransferObject.class);
+
+ private static final Type B_TYPE = TypeFactory.valueOf(PlaceOriginAirportModel.class);
+
+ public PlaceOriginAirportTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+ @Override
+ protected void buildMap(ClassMapBuilder builder) {
+ builder.byDefault();
+ }
+
+}
\ No newline at end of file
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/RequestPaymentAbacInfoTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/RequestPaymentAbacInfoTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..7b12a63
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/RequestPaymentAbacInfoTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,43 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.RequestPaymentAbacInfoTransferObject;
+import eu.europa.eeas.erights.backoffice.service.model.RequestPaymentAbacInfoModel;
+import eu.europa.eeas.erights.backoffice.service.model.RequestSubpostModel;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Simple map builder for {@link RequestSubpostModel}
+ *
+ * @author idominju
+ */
+public class RequestPaymentAbacInfoTransferObjectToModelClassMapBuilder extends AbstractTransferObjectToModelClassMapBuilder<
+ RequestPaymentAbacInfoTransferObject, RequestPaymentAbacInfoModel> {
+
+ private static final Type A_TYPE = TypeFactory.valueOf(RequestPaymentAbacInfoTransferObject.class);
+
+ private static final Type B_TYPE = TypeFactory.valueOf(RequestPaymentAbacInfoModel.class);
+
+ public RequestPaymentAbacInfoTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+ @Override
+ protected void buildMap(ClassMapBuilder classMapBuilder) {
+ classMapBuilder.byDefault();
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/RequestSubpostTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/RequestSubpostTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..0defd13
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/RequestSubpostTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,41 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.RequestSubpostTransferObject;
+import eu.europa.eeas.erights.backoffice.service.model.RequestSubpostModel;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Simple map builder for {@link RequestSubpostModel}
+ *
+ * @author idominju
+ */
+public class RequestSubpostTransferObjectToModelClassMapBuilder extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE = TypeFactory.valueOf(RequestSubpostTransferObject.class);
+
+ private static final Type B_TYPE = TypeFactory.valueOf(RequestSubpostModel.class);
+
+ public RequestSubpostTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+ @Override
+ protected void buildMap(ClassMapBuilder classMapBuilder) {
+ classMapBuilder.byDefault();
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/SummaFundSourceTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/SummaFundSourceTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..7659268
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/SummaFundSourceTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,42 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder;
+
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.internal.SummaFundSourceTransferObject;
+import eu.europa.eeas.erights.backoffice.service.model.SummaFundSourceModel;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Simple map builder for {@link SummaFundSourceModel}
+ *
+ * @author idominju
+ */
+public class SummaFundSourceTransferObjectToModelClassMapBuilder extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE = TypeFactory.valueOf(SummaFundSourceTransferObject.class);
+
+ private static final Type B_TYPE = TypeFactory.valueOf(SummaFundSourceModel.class);
+
+ public SummaFundSourceTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+ @Override
+ protected void buildMap(ClassMapBuilder classMapBuilder) {
+ classMapBuilder.byDefault();
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/AllowanceRequestInternalTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/AllowanceRequestInternalTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..e06d1f1
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/AllowanceRequestInternalTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,47 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder.p2phub;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.AllowanceRequestInternalTransferObject;
+import eu.europa.eeas.erights.backoffice.service.model.p2phub.AllowancePaymentModel;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Simple map builder for {@link AllowancePaymentModel}
+ */
+public class AllowanceRequestInternalTransferObjectToModelClassMapBuilder
+ extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE =
+ TypeFactory.valueOf(AllowanceRequestInternalTransferObject.class);
+
+ private static final Type B_TYPE =
+ TypeFactory.valueOf(AllowancePaymentModel.class);
+
+ public AllowanceRequestInternalTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+
+
+ @Override
+ protected void buildMap(ClassMapBuilder classMapBuilder) {
+ // If field names match (runId, batchId, hrRequestId, payMethodEnum, value), this is enough.
+ classMapBuilder.byDefault();
+
+ // If the enum or any field names differ, add explicit mappings here, e.g.:
+ // classMapBuilder.field("payMethod", "payMethodEnum");
+ }
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/BusinessPartnerIdentificationTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/BusinessPartnerIdentificationTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..c44c515
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/BusinessPartnerIdentificationTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,47 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder.p2phub;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.service.model.p2phub.BusinessPartnerIdentificationModel;
+import eu.europa.eeas.erights.web.p2phub.client.transferobject.BusinessPartnerIdentificationTransferObject;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Simple map builder for {@link BusinessPartnerIdentificationModel}
+ */
+public class BusinessPartnerIdentificationTransferObjectToModelClassMapBuilder
+ extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE =
+ TypeFactory.valueOf(BusinessPartnerIdentificationTransferObject.class);
+
+ private static final Type B_TYPE =
+ TypeFactory.valueOf(BusinessPartnerIdentificationModel.class);
+
+ public BusinessPartnerIdentificationTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+
+
+ @Override
+ protected void buildMap(ClassMapBuilder classMapBuilder) {
+ // If field names match (runId, batchId, hrRequestId, payMethodEnum, value), this is enough.
+ classMapBuilder.byDefault();
+
+ // If the enum or any field names differ, add explicit mappings here, e.g.:
+ // classMapBuilder.field("payMethod", "payMethodEnum");
+ }
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/DetailsAllowanceRequestTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/DetailsAllowanceRequestTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..504bd76
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/DetailsAllowanceRequestTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,47 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder.p2phub;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.service.model.p2phub.AllowanceDetailModel;
+import eu.europa.eeas.erights.web.p2phub.client.transferobject.AllowanceDetailTransferObject;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Simple map builder for {@link AllowanceDetailModel}
+ */
+public class DetailsAllowanceRequestTransferObjectToModelClassMapBuilder
+ extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE =
+ TypeFactory.valueOf(AllowanceDetailTransferObject.class);
+
+ private static final Type B_TYPE =
+ TypeFactory.valueOf(AllowanceDetailModel.class);
+
+ public DetailsAllowanceRequestTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+
+
+ @Override
+ protected void buildMap(ClassMapBuilder classMapBuilder) {
+ // If field names match (runId, batchId, hrRequestId, payMethodEnum, value), this is enough.
+ classMapBuilder.byDefault();
+
+ // If the enum or any field names differ, add explicit mappings here, e.g.:
+ // classMapBuilder.field("payMethod", "payMethodEnum");
+ }
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/HeaderAllowanceRequestTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/HeaderAllowanceRequestTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..aa7a322
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/HeaderAllowanceRequestTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,47 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder.p2phub;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.service.model.p2phub.AllowanceHeaderModel;
+import eu.europa.eeas.erights.web.p2phub.client.transferobject.AllowanceHeaderTransferObject;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Simple map builder for {@link AllowanceHeaderModel}
+ */
+public class HeaderAllowanceRequestTransferObjectToModelClassMapBuilder
+ extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE =
+ TypeFactory.valueOf(AllowanceHeaderTransferObject.class);
+
+ private static final Type B_TYPE =
+ TypeFactory.valueOf(AllowanceHeaderModel.class);
+
+ public HeaderAllowanceRequestTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+
+
+ @Override
+ protected void buildMap(ClassMapBuilder classMapBuilder) {
+ // If field names match (runId, batchId, hrRequestId, payMethodEnum, value), this is enough.
+ classMapBuilder.byDefault();
+
+ // If the enum or any field names differ, add explicit mappings here, e.g.:
+ // classMapBuilder.field("payMethod", "payMethodEnum");
+ }
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/OrderErrorResponseTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/OrderErrorResponseTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..435a78a
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/OrderErrorResponseTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,47 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder.p2phub;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.service.model.p2phub.OrderErrorResponseModel;
+import eu.europa.eeas.erights.web.p2phub.client.transferobject.OrderErrorResponseTransferObject;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Simple map builder for {@link OrderErrorResponseModel}
+ */
+public class OrderErrorResponseTransferObjectToModelClassMapBuilder
+ extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE =
+ TypeFactory.valueOf(OrderErrorResponseTransferObject.class);
+
+ private static final Type B_TYPE =
+ TypeFactory.valueOf(OrderErrorResponseModel.class);
+
+ public OrderErrorResponseTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+
+
+ @Override
+ protected void buildMap(ClassMapBuilder classMapBuilder) {
+ // If field names match (runId, batchId, hrRequestId, payMethodEnum, value), this is enough.
+ classMapBuilder.byDefault();
+
+ // If the enum or any field names differ, add explicit mappings here, e.g.:
+ // classMapBuilder.field("payMethod", "payMethodEnum");
+ }
+}
\ No newline at end of file
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/OrderResponseInternalTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/OrderResponseInternalTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..0660512
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/OrderResponseInternalTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,48 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder.p2phub;
+
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+
+
+import eu.europa.eeas.erights.backoffice.api.http.rest.transferobject.OrderResponseInternalTransferObject;
+import eu.europa.eeas.erights.backoffice.service.model.p2phub.OrderResponseModel;
+import ma.glasnost.orika.CustomMapper;
+import ma.glasnost.orika.MappingContext;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Simple map builder for {@link OrderResponseModel}
+ *
+ * @author tapiafo
+ */
+public class OrderResponseInternalTransferObjectToModelClassMapBuilder extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE = TypeFactory.valueOf(OrderResponseInternalTransferObject.class);
+
+ private static final Type B_TYPE = TypeFactory.valueOf(OrderResponseModel.class);
+
+ public OrderResponseInternalTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+ @Override
+ protected void buildMap(ClassMapBuilder classMapBuilder) {
+ classMapBuilder
+ .byDefault();
+ }
+
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/OrderStatusResponseTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/OrderStatusResponseTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..a128a69
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/OrderStatusResponseTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,62 @@
+
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder.p2phub;
+
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.api.http.rest.mapping.custommapper.OrderStatusResponseTransferObjectToModelCustomMapper;
+import eu.europa.eeas.erights.web.p2phub.client.transferobject.OrderStatusResponseTransferObject;
+import eu.europa.eeas.erights.backoffice.service.model.p2phub.OrderStatusResponseModel;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Simple map builder for {@link OrderStatusResponseModel}
+ *
+ * @author tapiafo
+ */
+public class OrderStatusResponseTransferObjectToModelClassMapBuilder extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE = TypeFactory.valueOf(OrderStatusResponseTransferObject.class);
+
+ private static final Type B_TYPE = TypeFactory.valueOf(OrderStatusResponseModel.class);
+
+ public OrderStatusResponseTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+
+ @Override
+ protected void buildMap(
+ ClassMapBuilder classMapBuilder) {
+
+ classMapBuilder
+ // Excluded field
+ .fieldMap("lastModificationDate", "lastModificationDate")
+ .exclude()
+ .add()
+
+ // Explicit mapping for different field names
+ .field("paymentReference", "paymentDirectiveReference")
+
+ // Custom mapper
+ .customize(new OrderStatusResponseTransferObjectToModelCustomMapper())
+
+ // Map remaining same-name fields automatically
+ .byDefault();
+ }
+
+
+}
+
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/SupplierTransferObjectToModelClassMapBuilder.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/SupplierTransferObjectToModelClassMapBuilder.java
new file mode 100644
index 0000000..dd676c7
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/classmapbuilder/p2phub/SupplierTransferObjectToModelClassMapBuilder.java
@@ -0,0 +1,47 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.classmapbuilder.p2phub;
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.service.model.p2phub.SupplierModel;
+import eu.europa.eeas.erights.web.p2phub.client.transferobject.SupplierTransferObject;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Simple map builder for {@link SupplierModel}
+ */
+public class SupplierTransferObjectToModelClassMapBuilder
+ extends AbstractTransferObjectToModelClassMapBuilder {
+
+ private static final Type A_TYPE =
+ TypeFactory.valueOf(SupplierTransferObject.class);
+
+ private static final Type B_TYPE =
+ TypeFactory.valueOf(SupplierModel.class);
+
+ public SupplierTransferObjectToModelClassMapBuilder(ApplicationContext applicationContext) {
+ super(applicationContext);
+ }
+
+ @Override
+ protected Type getAType() {
+ return A_TYPE;
+ }
+
+ @Override
+ protected Type getBType() {
+ return B_TYPE;
+ }
+
+
+
+ @Override
+ protected void buildMap(ClassMapBuilder classMapBuilder) {
+ // If field names match (runId, batchId, hrRequestId, payMethodEnum, value), this is enough.
+ classMapBuilder.byDefault();
+
+ // If the enum or any field names differ, add explicit mappings here, e.g.:
+ // classMapBuilder.field("payMethod", "payMethodEnum");
+ }
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/custommapper/BusinessPartnerTransferObjectToModelCustomMapper.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/custommapper/BusinessPartnerTransferObjectToModelCustomMapper.java
new file mode 100644
index 0000000..0d4a183
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/custommapper/BusinessPartnerTransferObjectToModelCustomMapper.java
@@ -0,0 +1,29 @@
+//package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.custommapper;
+//
+//
+//import eu.europa.eeas.erights.common.service.model.declaration.PersonBankInfoModel;
+//import eu.europa.eeas.erights.common.service.model.document.MovementDocModel;
+//import eu.europa.eeas.erights.common.service.model.document.MovementDocSectionModel;
+//import eu.europa.eeas.erights.web.p2phub.client.transferobject.BusinessPartnerResponseTransferObject;
+//import ma.glasnost.orika.CustomMapper;
+//import ma.glasnost.orika.MappingContext;
+//import ma.glasnost.orika.metadata.ClassMapBuilder;
+//import ma.glasnost.orika.metadata.Type;
+//import ma.glasnost.orika.metadata.TypeFactory;
+//import org.springframework.context.ApplicationContext;
+//
+//public class BusinessPartnerResponseTransferObjectToModelCustomMapper extends CustomMapper {
+//
+//// @Override
+//// public void mapAtoB(BusinessPartnerResponseTransferObject transferObject, MovementDocModel model, MappingContext context) {
+//// MovementDocSectionModel movementDocSection = new MovementDocSectionModel();
+//// movementDocSection.setId(transferObject.getMovementDocSectionId());
+////
+//// model.setMovementDocSection(movementDocSection);
+//// }
+////
+//// @Override
+//// public void mapBtoA(MovementDocModel model, BusinessPartnerResponseTransferObject transferObject, MappingContext context) {
+//// transferObject.setMovementDocSectionId(model.getMovementDocSection().getId());
+//// }
+//}
\ No newline at end of file
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/custommapper/OrderStatusResponseTransferObjectToModelCustomMapper.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/custommapper/OrderStatusResponseTransferObjectToModelCustomMapper.java
new file mode 100644
index 0000000..9d161af
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/mapping/custommapper/OrderStatusResponseTransferObjectToModelCustomMapper.java
@@ -0,0 +1,54 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.mapping.custommapper;
+
+
+import eu.europa.eeas.ananke.core.api.provider.http.mapping.bean.AbstractTransferObjectToModelClassMapBuilder;
+import eu.europa.eeas.erights.backoffice.service.model.p2phub.OrderStatusResponseModel;
+import eu.europa.eeas.erights.web.p2phub.client.transferobject.OrderStatusResponseTransferObject;
+import ma.glasnost.orika.CustomMapper;
+import ma.glasnost.orika.MappingContext;
+import ma.glasnost.orika.metadata.ClassMapBuilder;
+import ma.glasnost.orika.metadata.Type;
+import ma.glasnost.orika.metadata.TypeFactory;
+import org.springframework.context.ApplicationContext;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * Simple map builder for {@link OrderStatusResponseModel}
+ *
+ * @author tapiafo
+ */
+public class OrderStatusResponseTransferObjectToModelCustomMapper extends CustomMapper {
+
+ private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
+
+ @Override
+ public void mapAtoB(OrderStatusResponseTransferObject a,
+ OrderStatusResponseModel b,
+ MappingContext context) {
+
+ String dateStr = a.getLastModificationDate();
+
+ if (dateStr == null || dateStr.trim().isEmpty()) {
+ // default to sysdate
+ b.setLastModificationDate(LocalDateTime.now());
+ } else {
+ LocalDateTime ldt = LocalDateTime.parse(dateStr, FORMATTER);
+ b.setLastModificationDate(ldt);
+ }
+ }
+
+
+ @Override
+ public void mapBtoA(OrderStatusResponseModel b,
+ OrderStatusResponseTransferObject a,
+ MappingContext context) {
+
+ if (b.getLastModificationDate() != null) {
+ String formatted = b.getLastModificationDate().format(FORMATTER);
+ a.setLastModificationDate(formatted);
+ }
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/transferobject/AllowanceRequestInternalTransferObject.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/transferobject/AllowanceRequestInternalTransferObject.java
new file mode 100644
index 0000000..9c00595
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/transferobject/AllowanceRequestInternalTransferObject.java
@@ -0,0 +1,24 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.transferobject;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import eu.europa.eeas.erights.web.p2phub.client.transferobject.AllowanceRequestTransferObject;
+import eu.europa.eeas.erights.web.p2phub.client.transferobject.OrderResponseTransferObject;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.Valid;
+
+@Setter
+@Getter
+public class AllowanceRequestInternalTransferObject extends AllowanceRequestTransferObject {
+
+
+ private Long id;
+
+ private Long requestId;
+
+ private Long perId;
+
+ @Valid
+ private OrderResponseTransferObject order;
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/transferobject/BusinessPartnerInternalTransferObject.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/transferobject/BusinessPartnerInternalTransferObject.java
new file mode 100644
index 0000000..a9c7041
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/transferobject/BusinessPartnerInternalTransferObject.java
@@ -0,0 +1,21 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.transferobject;
+
+import eu.europa.eeas.erights.web.p2phub.client.transferobject.BusinessPartnerResponseTransferObject;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.beans.BeanUtils;
+
+@Setter
+@Getter
+public class BusinessPartnerInternalTransferObject extends BusinessPartnerResponseTransferObject {
+
+ private Long id;
+
+ private Long perId;
+
+ public BusinessPartnerInternalTransferObject(BusinessPartnerResponseTransferObject response) {
+ // Copy all fields from parent using BeanUtils
+ BeanUtils.copyProperties(response, this);
+ // id and perId remain null
+ }
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/transferobject/OrderResponseInternalTransferObject.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/transferobject/OrderResponseInternalTransferObject.java
new file mode 100644
index 0000000..b367090
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/api/http/rest/transferobject/OrderResponseInternalTransferObject.java
@@ -0,0 +1,41 @@
+package eu.europa.eeas.erights.backoffice.api.http.rest.transferobject;
+
+
+import eu.europa.eeas.erights.web.p2phub.client.transferobject.OrderResponseTransferObject;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.Valid;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Setter
+@Getter
+public class OrderResponseInternalTransferObject extends OrderResponseTransferObject {
+
+
+ private Long id;
+
+ private Long requestId;
+
+ private Long perId;
+
+ private String message;
+
+ private String errorCode;
+
+ private String errorText;
+
+ private LocalDateTime responseDateTime;
+
+ private String orderComment;
+
+ private String orderStatus;
+
+ private String paymentDirectiveReference;
+
+ private String jsonSent;
+
+ @Valid
+ private OrderResponseTransferObject order;
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/ERightsBackOffice.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/ERightsBackOffice.java
new file mode 100644
index 0000000..941f1c3
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/ERightsBackOffice.java
@@ -0,0 +1,11 @@
+package eu.europa.eeas.erights.backoffice.boot;
+
+import eu.europa.eeas.ananke.core.base.boot.AnankeStarter;
+
+public class ERightsBackOffice extends AnankeStarter {
+
+ public static void main(String[] args) throws Exception {
+ start(new ERightsBackOffice(), args);
+ }
+
+}
\ No newline at end of file
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/CacheConfiguration.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/CacheConfiguration.java
new file mode 100644
index 0000000..6ffb634
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/CacheConfiguration.java
@@ -0,0 +1,14 @@
+package eu.europa.eeas.erights.backoffice.boot.configuration;
+
+
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author ienaccat
+ */
+@Configuration
+@EnableCaching
+public class CacheConfiguration {
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/ERightsBackOfficeBeanNames.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/ERightsBackOfficeBeanNames.java
new file mode 100644
index 0000000..5175d57
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/ERightsBackOfficeBeanNames.java
@@ -0,0 +1,53 @@
+package eu.europa.eeas.erights.backoffice.boot.configuration;
+
+public final class ERightsBackOfficeBeanNames {
+ /**
+ * PREFIX.
+ */
+ private static final String PREFIX = "ERightsBackOffice";
+
+ public static final String EMAIL_NOTIFICATIONS_UPDATER_JOB = PREFIX + "EmailNotificationsUpdaterJob";
+
+ public static final String EMAIL_NOTIFICATIONS_UPDATER_TRIGGER = PREFIX + "EmailNotificationUpdaterTrigger";
+
+ public static final String NIGHTLY_UPDATER_JOB = PREFIX + "NightlyUpdaterJob";
+
+ public static final String NIGHTLY_UPDATER_TRIGGER = PREFIX + "NightlyUpdaterTrigger";
+
+ public static final String NIGHTLY_BANK_UPDATER_JOB = PREFIX + "NightlyBankUpdaterJob";
+
+ public static final String NIGHTLY_BANK_UPDATER_TRIGGER = PREFIX + "NightlyBankUpdaterTrigger";
+
+ public static final String CLEARING_EMAIL_NOTIFICATIONS_JOB = PREFIX + "ClearingRequestEmailNotificationJob";
+
+ public static final String CLEARING_EMAIL_NOTIFICATIONS_TRIGGER = PREFIX + "ClearingRequestEmailNotificationTrigger";
+
+ public static final String INSTALLATION_UPDATER_JOB = PREFIX + "InstallationUpdaterJob";
+
+ public static final String INSTALLATION_UPDATER_TRIGGER = PREFIX + "InstallationUpdaterTrigger";
+
+ public static final String P2P_ORDER_UPDATER_JOB = PREFIX + "P2POrderUpdaterJob";
+ public static final String P2P_ORDER_UPDATER_TRIGGER = PREFIX + "P2POrderUpdaterTrigger";
+
+ public static final String RATE_MISSING_UPDATER_JOB = PREFIX + "RateMissingUpdaterJob";
+ public static final String RATE_MISSING_UPDATER_TRIGGER = PREFIX + "RateMissingUpdaterTrigger";
+
+ public static final String TUD_FARE_UPDATER_JOB = PREFIX + "TudFareUpdaterJob";
+ public static final String TUD_FARE_UPDATER_TRIGGER = PREFIX + "TudFareUpdaterTrigger";
+
+ public static final String POSTING_TRAVEL_ALLOWANCE_TRINSITION_JOB = PREFIX + "PostingTravelAllowanceTransitionJob";
+ public static final String POSTING_TRAVEL_ALLOWANCE_TRINSITION_TRIGGER = PREFIX + "PostingTravelAllowanceTransitionTrigger";
+
+ public static final String TRAVEL_ALLOWANCE_CREATION_JOB = PREFIX + "TravelAllowanceCreationJob";
+ public static final String TRAVEL_ALLOWANCE_CREATION_TRIGGER = PREFIX + "TravelAllowanceCreationTrigger";
+
+ public static final String ACCOMMODATION_BANK_ACCOUNTS_SYNC_JOB = PREFIX + "AccommodationBankAccountsSyncJob";
+ public static final String ACCOMMODATION_BANK_ACCOUNTS_SYNC_TRIGGER = PREFIX + "AccommodationBankAccountsSyncTrigger";
+
+ public static final String ACCOMMODATION_CREATE_PAYMENT_JOB = PREFIX + "AccommodationCreatePaymentJob";
+ public static final String ACCOMMODATION_CREATE_PAYMENT_TRIGGER = PREFIX + "AccommodationCreatePaymentTrigger";
+
+ private ERightsBackOfficeBeanNames() {
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/ERightsBackOfficeBootAutoConfiguration.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/ERightsBackOfficeBootAutoConfiguration.java
new file mode 100644
index 0000000..8d91df1
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/ERightsBackOfficeBootAutoConfiguration.java
@@ -0,0 +1,44 @@
+package eu.europa.eeas.erights.backoffice.boot.configuration;
+
+import eu.europa.eeas.ananke.core.audit.provider.data.jpa.support.AnankeCoreAuditProviderDataJpaRepositoryFactoryBean;
+import eu.europa.eeas.ananke.core.data.provider.jpa.AnankeCoreDataProviderJpaBeanNames;
+import eu.europa.eeas.erights.backoffice.api.http.mvc.controller.MovementFileControllerBackOffice;
+import eu.europa.eeas.erights.backoffice.api.http.rest.controller.internal.AuditMovementFilesRestController;
+import eu.europa.eeas.erights.backoffice.boot.statemachine.configurations.AbacItemStateMachineConfiguration;
+import eu.europa.eeas.erights.backoffice.boot.statemachine.configurations.AbacRequestMachineConfiguration;
+import eu.europa.eeas.erights.backoffice.data.jpa.repository.VBudgetLineJpaRepository;
+import eu.europa.eeas.erights.backoffice.service.data.provider.VReportMovementFileJpaServiceProvider;
+import eu.europa.eeas.erights.backoffice.service.provider.MenuServiceProvider;
+import eu.europa.eeas.erights.common.boot.configuration.ERightsBootAutoConfiguration;
+import eu.europa.eeas.erights.common.boot.configuration.skyscanner.SkyscannerWSConfiguration;
+import eu.europa.eeas.erights.common.service.data.provider.LocationJpaServiceProvider;
+import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+@Configuration
+@ImportAutoConfiguration({
+ AbacItemStateMachineConfiguration.class,
+ AbacRequestMachineConfiguration.class,
+ ERightsBootAutoConfiguration.class,
+ QuartzJobConfiguration.class,
+ SkyscannerWSConfiguration.class,
+ CacheConfiguration.class})
+@EnableJpaRepositories(entityManagerFactoryRef = AnankeCoreDataProviderJpaBeanNames.ENTITY_MANAGER_FACTORY,
+ transactionManagerRef = AnankeCoreDataProviderJpaBeanNames.TRANSACTION_MANAGER,
+ repositoryFactoryBeanClass = AnankeCoreAuditProviderDataJpaRepositoryFactoryBean.class,
+ basePackageClasses = {
+ VBudgetLineJpaRepository.class
+ })
+@ComponentScan(basePackageClasses = {
+ MovementFileControllerBackOffice.class,
+ AuditMovementFilesRestController.class,
+ MenuServiceProvider.class,
+ VReportMovementFileJpaServiceProvider.class,
+ LocationJpaServiceProvider.class
+
+})
+public class ERightsBackOfficeBootAutoConfiguration {
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/QuartzJobConfiguration.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/QuartzJobConfiguration.java
new file mode 100644
index 0000000..e5ea2e5
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/QuartzJobConfiguration.java
@@ -0,0 +1,332 @@
+package eu.europa.eeas.erights.backoffice.boot.configuration;
+
+import eu.europa.eeas.ananke.core.base.Profiles;
+import eu.europa.eeas.ananke.core.base.context.AnankeContext;
+import eu.europa.eeas.erights.backoffice.service.provider.allowances.AccommodationBankAccountsSyncService;
+import eu.europa.eeas.erights.backoffice.service.provider.allowances.PostingAllowancesAppParamsServiceHelper;
+import eu.europa.eeas.erights.backoffice.tools.scheduler.AccommodationBankAccountsSyncJob;
+import eu.europa.eeas.erights.backoffice.tools.scheduler.AccommodationCreatePaymentJob;
+import eu.europa.eeas.erights.backoffice.tools.scheduler.BankAccountUpdaterJob;
+import eu.europa.eeas.erights.backoffice.tools.scheduler.ClearingRequestEmailNotificationJob;
+import eu.europa.eeas.erights.backoffice.tools.scheduler.EmailNotificationsUpdaterJob;
+import eu.europa.eeas.erights.backoffice.tools.scheduler.InstallationRequestUpdaterJob;
+import eu.europa.eeas.erights.backoffice.tools.scheduler.NightlyUpdaterJob;
+import eu.europa.eeas.erights.backoffice.tools.scheduler.PostingTravelAllowanceTransitionJob;
+import eu.europa.eeas.erights.backoffice.tools.scheduler.RateMissingUpdaterJob;
+import eu.europa.eeas.erights.backoffice.tools.scheduler.TravelAllowanceCreationJob;
+import eu.europa.eeas.erights.backoffice.tools.scheduler.TudFareUpdaterJob;
+import org.quartz.CronScheduleBuilder;
+import org.quartz.JobBuilder;
+import org.quartz.JobDetail;
+import org.quartz.Trigger;
+import org.quartz.TriggerBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import eu.europa.eeas.erights.backoffice.tools.scheduler.P2pOrderUpdaterJob;
+
+@Configuration
+public class QuartzJobConfiguration {
+
+ public static final String EVERY_DAY_3H_AM = "0 0 3 * * ? *";
+
+ public static final String EVERY_2DAYS_3H_30MIN_AM = "0 30 3 1/2 * ? *";
+
+ public static final String EVERY_DAY_4H_AM = "0 0 4 * * ? *";
+
+ public static final String EVERY_DAY_4H_30M_AM = "0 30 4 * * ?";
+
+ public static final String EVERY_DAY_5H_30M_AM = "0 30 5 * * ?";
+
+ public static final String EVERY_DAY_5H_AM = "0 0 5 * * ?";
+
+ public static final String EVERY_3_HOURS = "0 0 0/3 1/1 * ? *";
+
+ public static final String EVERY_1_HOURS = "0 0 0/1 1/1 * ? *";
+
+ public static final String EVERY_2_HOURS = "0 0 0/2 1/1 * ? *";
+
+ public static final String EVERY_5_HOURS = "0 0 0/5 1/1 * ? *";
+
+ public static final String EVERY_8_HOURS = "0 0 0/8 1/1 * ? *";
+
+ public static final String EVERY_4_HOURS = "0 0 0/4 1/1 * ? *";
+
+ //FOR TEST
+ public static final String EVERY_3_HOURS_10MIN = "0 10 0/3 1/1 * ? *";
+
+ public static final String EVERY_5_MIN = "0 0/5 * * * ?";
+
+
+ public static final String EVERY_20_MIN = "0 0/20 * * * ?";
+
+ public static final String EVERY_12_MIN = "0 0/12 * * * ?";
+
+ public static final String EVERY_10_MIN = "0 0/10 * * * ?";
+
+ public static final String EVERY_15_MIN = "0 0/15 * * * ?";
+
+ public static final String EVERY_1_MIN = "0 0/1 * * * ?";
+
+ public static final String EVERY_30_MIN = "0 0/30 * * * ?";
+
+ @Autowired
+ private AnankeContext anankeContext;
+
+ @Autowired
+ private PostingAllowancesAppParamsServiceHelper postingAllowancesAppParamsServiceHelper;
+
+ @Bean(ERightsBackOfficeBeanNames.NIGHTLY_UPDATER_JOB)
+ public JobDetail nightlyJobDetails() {
+ return JobBuilder.newJob(NightlyUpdaterJob.class).withIdentity(ERightsBackOfficeBeanNames.NIGHTLY_UPDATER_JOB).storeDurably().build();
+ }
+
+ @Bean(ERightsBackOfficeBeanNames.NIGHTLY_UPDATER_TRIGGER)
+ public Trigger nightlyJobTrigger(@Qualifier(ERightsBackOfficeBeanNames.NIGHTLY_UPDATER_JOB) JobDetail nightlyJobDetails) {
+ String frequencyToRunJob = EVERY_DAY_4H_30M_AM;
+ if (!(anankeContext.getProfiles().contains(Profiles.PRODUCTION) || anankeContext.getProfiles().contains(Profiles.ACCEPTANCE))) { //EASREFN is refresh around 2 we should use EVERY_DAY_5H_AM in PRD , if not we will send
+ frequencyToRunJob = EVERY_2DAYS_3H_30MIN_AM;
+ }
+
+ return TriggerBuilder.newTrigger().forJob(nightlyJobDetails)
+ .withIdentity(ERightsBackOfficeBeanNames.NIGHTLY_UPDATER_TRIGGER)
+ .withSchedule(CronScheduleBuilder.cronSchedule(frequencyToRunJob).withMisfireHandlingInstructionFireAndProceed())
+ .build();
+ }
+
+ @Bean(ERightsBackOfficeBeanNames.EMAIL_NOTIFICATIONS_UPDATER_JOB)
+ public JobDetail emailNotificationsJobDetails() {
+ return JobBuilder.newJob(EmailNotificationsUpdaterJob.class).withIdentity(ERightsBackOfficeBeanNames.EMAIL_NOTIFICATIONS_UPDATER_JOB).storeDurably().build();
+ }
+
+ @Bean(ERightsBackOfficeBeanNames.EMAIL_NOTIFICATIONS_UPDATER_TRIGGER)
+ public Trigger emailNotificationJobTrigger(@Qualifier(ERightsBackOfficeBeanNames.EMAIL_NOTIFICATIONS_UPDATER_JOB) JobDetail emailNotificationsJobDetails) {
+
+ String frequencyToRunJob = EVERY_4_HOURS;
+ if (anankeContext.getProfiles().contains(Profiles.TEST)) {
+ frequencyToRunJob = EVERY_DAY_3H_AM;
+ } else if (anankeContext.getProfiles().contains(Profiles.STANDALONE) || anankeContext.getProfiles().contains(Profiles.DEVELOPMENT)) {
+ frequencyToRunJob = EVERY_DAY_3H_AM;
+ } else if (anankeContext.getProfiles().contains(Profiles.PRODUCTION) || anankeContext.getProfiles().contains(Profiles.ACCEPTANCE)) {
+ frequencyToRunJob = EVERY_4_HOURS;
+ }
+ return TriggerBuilder.newTrigger().forJob(emailNotificationsJobDetails)
+ .withIdentity(ERightsBackOfficeBeanNames.EMAIL_NOTIFICATIONS_UPDATER_TRIGGER)
+ .withSchedule(CronScheduleBuilder.cronSchedule(frequencyToRunJob).withMisfireHandlingInstructionFireAndProceed())
+ .build();
+ }
+
+ @Bean(ERightsBackOfficeBeanNames.NIGHTLY_BANK_UPDATER_JOB)
+ public JobDetail nightlyBankAccountUpdaterJobDetails() {
+ return JobBuilder.newJob(BankAccountUpdaterJob.class).withIdentity(ERightsBackOfficeBeanNames.NIGHTLY_BANK_UPDATER_JOB).storeDurably().build();
+ }
+
+ @Bean(ERightsBackOfficeBeanNames.NIGHTLY_BANK_UPDATER_TRIGGER)
+ public Trigger nightlyBankAccountUpdaterJobTrigger(@Qualifier(ERightsBackOfficeBeanNames.NIGHTLY_BANK_UPDATER_JOB) JobDetail nightlyBankAccountUpdaterJobDetails) {
+ String frequencyToRunJob = EVERY_2DAYS_3H_30MIN_AM;
+ if (anankeContext.getProfiles().contains(Profiles.PRODUCTION) || anankeContext.getProfiles().contains(Profiles.ACCEPTANCE)) {
+ frequencyToRunJob = EVERY_2DAYS_3H_30MIN_AM ;
+ }
+
+
+ return TriggerBuilder.newTrigger().forJob(nightlyBankAccountUpdaterJobDetails)
+ .withIdentity(ERightsBackOfficeBeanNames.NIGHTLY_BANK_UPDATER_TRIGGER)
+ .withSchedule(CronScheduleBuilder.cronSchedule(frequencyToRunJob).withMisfireHandlingInstructionFireAndProceed())
+ .build();
+ }
+
+ @Bean(ERightsBackOfficeBeanNames.CLEARING_EMAIL_NOTIFICATIONS_JOB)
+ public JobDetail clearingEmailNotificationsJobDetails() {
+ return JobBuilder.newJob(ClearingRequestEmailNotificationJob.class).withIdentity(ERightsBackOfficeBeanNames.CLEARING_EMAIL_NOTIFICATIONS_JOB).storeDurably().build();
+ }
+
+ @Bean(ERightsBackOfficeBeanNames.CLEARING_EMAIL_NOTIFICATIONS_TRIGGER)
+ public Trigger clearingEmailNotificationsJobTrigger(@Qualifier(ERightsBackOfficeBeanNames.CLEARING_EMAIL_NOTIFICATIONS_JOB) JobDetail job) {
+ return TriggerBuilder.newTrigger().forJob(job)
+ .withIdentity(ERightsBackOfficeBeanNames.CLEARING_EMAIL_NOTIFICATIONS_TRIGGER)
+ .withSchedule(CronScheduleBuilder.cronSchedule(EVERY_DAY_3H_AM).withMisfireHandlingInstructionFireAndProceed())
+ .build();
+ }
+
+ @Bean(ERightsBackOfficeBeanNames.INSTALLATION_UPDATER_JOB)
+ public JobDetail installationUpdaterJobDetails() {
+ return JobBuilder.newJob(InstallationRequestUpdaterJob.class).withIdentity(ERightsBackOfficeBeanNames.INSTALLATION_UPDATER_JOB).storeDurably().build();
+ }
+
+ @Bean(ERightsBackOfficeBeanNames.INSTALLATION_UPDATER_TRIGGER)
+ public Trigger installationUpdaterJobTrigger(@Qualifier(ERightsBackOfficeBeanNames.INSTALLATION_UPDATER_JOB) JobDetail job) {
+ //As comref is updating from sysper once a day we will run this once a day.If we change the frequency, we need to check the email notification.If we run this more than once a day, we will send several reminders
+ String frequencyToRunJob = EVERY_2DAYS_3H_30MIN_AM;
+ if (anankeContext.getProfiles().contains(Profiles.PRODUCTION) || anankeContext.getProfiles().contains(Profiles.ACCEPTANCE)) {
+ frequencyToRunJob = EVERY_DAY_5H_AM;
+ }
+
+ return TriggerBuilder.newTrigger().forJob(job)
+ .withIdentity(ERightsBackOfficeBeanNames.INSTALLATION_UPDATER_TRIGGER)
+ .withSchedule(CronScheduleBuilder.cronSchedule(frequencyToRunJob).withMisfireHandlingInstructionFireAndProceed())
+ .build();
+ }
+
+ @Bean(ERightsBackOfficeBeanNames.P2P_ORDER_UPDATER_JOB)
+ public JobDetail p2pOrderUpdaterJobDetails() {
+ return JobBuilder.newJob(P2pOrderUpdaterJob.class).withIdentity(ERightsBackOfficeBeanNames.P2P_ORDER_UPDATER_JOB).storeDurably().build();
+ }
+
+ @Bean(ERightsBackOfficeBeanNames.P2P_ORDER_UPDATER_TRIGGER)
+ public Trigger p2pOrderUpdaterJobTrigger(@Qualifier(ERightsBackOfficeBeanNames.P2P_ORDER_UPDATER_JOB) JobDetail job) {
+ String frequencyToRunJob = EVERY_5_MIN;
+ if (anankeContext.getProfiles().contains(Profiles.TEST)) {
+ frequencyToRunJob = EVERY_15_MIN;
+ } else if (anankeContext.getProfiles().contains(Profiles.STANDALONE) || anankeContext.getProfiles().contains(Profiles.DEVELOPMENT)) {
+ frequencyToRunJob = EVERY_2DAYS_3H_30MIN_AM;
+ } else if (anankeContext.getProfiles().contains(Profiles.PRODUCTION) || anankeContext.getProfiles().contains(Profiles.ACCEPTANCE)) {
+ frequencyToRunJob = EVERY_15_MIN;
+ }
+ return TriggerBuilder.newTrigger().forJob(job)
+ .withIdentity(ERightsBackOfficeBeanNames.P2P_ORDER_UPDATER_TRIGGER)
+ .withSchedule(CronScheduleBuilder.cronSchedule(frequencyToRunJob).withMisfireHandlingInstructionFireAndProceed())
+ .build();
+ }
+
+
+
+ @Bean(ERightsBackOfficeBeanNames.RATE_MISSING_UPDATER_JOB)
+ public JobDetail rateMissingUpdaterJobDetails() {
+ return JobBuilder.newJob(RateMissingUpdaterJob.class).withIdentity(ERightsBackOfficeBeanNames.RATE_MISSING_UPDATER_JOB).storeDurably().build();
+ }
+
+ @Bean(ERightsBackOfficeBeanNames.RATE_MISSING_UPDATER_TRIGGER)
+ public Trigger rateMissingUpdaterJobTrigger(@Qualifier(ERightsBackOfficeBeanNames.RATE_MISSING_UPDATER_JOB) JobDetail job) {
+ String frequencyToRunJob = EVERY_12_MIN;
+ if (anankeContext.getProfiles().contains(Profiles.TEST)) {
+ frequencyToRunJob = EVERY_DAY_3H_AM;
+ } else if (anankeContext.getProfiles().contains(Profiles.STANDALONE) || anankeContext.getProfiles().contains(Profiles.DEVELOPMENT)) {
+ frequencyToRunJob = EVERY_DAY_3H_AM;
+ } else if (anankeContext.getProfiles().contains(Profiles.PRODUCTION) || anankeContext.getProfiles().contains(Profiles.ACCEPTANCE)) {
+ frequencyToRunJob = EVERY_3_HOURS;
+ }
+ return TriggerBuilder.newTrigger().forJob(job)
+ .withIdentity(ERightsBackOfficeBeanNames.RATE_MISSING_UPDATER_TRIGGER)
+ .withSchedule(CronScheduleBuilder.cronSchedule(frequencyToRunJob).withMisfireHandlingInstructionFireAndProceed())
+ .build();
+ }
+
+
+ @Bean(ERightsBackOfficeBeanNames.TUD_FARE_UPDATER_JOB)
+ public JobDetail tudFareUpdaterJobDetails() {
+ return JobBuilder.newJob(TudFareUpdaterJob.class).withIdentity(ERightsBackOfficeBeanNames.TUD_FARE_UPDATER_JOB).storeDurably().build();
+ }
+
+ @Bean(ERightsBackOfficeBeanNames.TUD_FARE_UPDATER_TRIGGER)
+ public Trigger tudFareUpdaterJobTrigger(@Qualifier(ERightsBackOfficeBeanNames.TUD_FARE_UPDATER_JOB) JobDetail job) {
+ String frequencyToRunJob = EVERY_DAY_4H_30M_AM;
+ if (anankeContext.getProfiles().contains(Profiles.TEST)) {
+ frequencyToRunJob = EVERY_DAY_4H_30M_AM;
+ } else if (anankeContext.getProfiles().contains(Profiles.STANDALONE) || anankeContext.getProfiles().contains(Profiles.DEVELOPMENT)) {
+ frequencyToRunJob = EVERY_DAY_4H_30M_AM;
+ } else if (anankeContext.getProfiles().contains(Profiles.PRODUCTION) || anankeContext.getProfiles().contains(Profiles.ACCEPTANCE)) {
+ frequencyToRunJob = EVERY_10_MIN;
+ }
+ return TriggerBuilder.newTrigger().forJob(job)
+ .withIdentity(ERightsBackOfficeBeanNames.TUD_FARE_UPDATER_TRIGGER)
+ .withSchedule(CronScheduleBuilder.cronSchedule(frequencyToRunJob).withMisfireHandlingInstructionFireAndProceed())
+ .build();
+ }
+
+
+ @Bean(ERightsBackOfficeBeanNames.POSTING_TRAVEL_ALLOWANCE_TRINSITION_JOB)
+ public JobDetail postingTravelAllowanceTransitionJobDetails() {
+ return JobBuilder.newJob(PostingTravelAllowanceTransitionJob.class).withIdentity(ERightsBackOfficeBeanNames.POSTING_TRAVEL_ALLOWANCE_TRINSITION_JOB).storeDurably().build();
+ }
+
+ @Bean(ERightsBackOfficeBeanNames.POSTING_TRAVEL_ALLOWANCE_TRINSITION_TRIGGER)
+ public Trigger postingTravelAllowanceTransitionJobTrigger(@Qualifier(ERightsBackOfficeBeanNames.POSTING_TRAVEL_ALLOWANCE_TRINSITION_JOB) JobDetail job) {
+ String frequencyToRunJob = EVERY_DAY_5H_30M_AM;
+ if (anankeContext.getProfiles().contains(Profiles.PRODUCTION) || anankeContext.getProfiles().contains(Profiles.ACCEPTANCE)) {
+ frequencyToRunJob = EVERY_1_HOURS;
+ }
+ return TriggerBuilder.newTrigger().forJob(job)
+ .withIdentity(ERightsBackOfficeBeanNames.POSTING_TRAVEL_ALLOWANCE_TRINSITION_TRIGGER)
+ .withSchedule(CronScheduleBuilder.cronSchedule(frequencyToRunJob).withMisfireHandlingInstructionFireAndProceed())
+ .build();
+ }
+
+
+ @Bean(ERightsBackOfficeBeanNames.TRAVEL_ALLOWANCE_CREATION_JOB)
+ public JobDetail travelAllowanceCreationJobDetails() {
+
+ return JobBuilder.newJob(TravelAllowanceCreationJob.class)
+ .withIdentity(ERightsBackOfficeBeanNames.TRAVEL_ALLOWANCE_CREATION_JOB)
+ .storeDurably()
+ .build();
+ }
+
+
+ @Bean(ERightsBackOfficeBeanNames.TRAVEL_ALLOWANCE_CREATION_TRIGGER)
+ public Trigger travelAllowanceCreationJobTrigger(@Qualifier(ERightsBackOfficeBeanNames.TRAVEL_ALLOWANCE_CREATION_JOB) JobDetail job) {
+
+ return TriggerBuilder.newTrigger()
+ .forJob(job)
+ .withIdentity(ERightsBackOfficeBeanNames.TRAVEL_ALLOWANCE_CREATION_TRIGGER)
+ .withSchedule(CronScheduleBuilder.cronSchedule(EVERY_DAY_3H_AM)
+ .withMisfireHandlingInstructionFireAndProceed())
+ .build();
+ }
+
+
+ @Bean(ERightsBackOfficeBeanNames.ACCOMMODATION_BANK_ACCOUNTS_SYNC_JOB)
+ public JobDetail accommodationBankAccountsSyncJobDetails() {
+
+ return JobBuilder.newJob(AccommodationBankAccountsSyncJob.class)
+ .withIdentity(ERightsBackOfficeBeanNames.ACCOMMODATION_BANK_ACCOUNTS_SYNC_JOB)
+ .storeDurably()
+ .build();
+ }
+
+
+ @Bean(ERightsBackOfficeBeanNames.ACCOMMODATION_BANK_ACCOUNTS_SYNC_TRIGGER)
+ public Trigger accommodationBankAccountsSyncJobTrigger(@Qualifier(ERightsBackOfficeBeanNames.ACCOMMODATION_BANK_ACCOUNTS_SYNC_JOB) JobDetail job) {
+ String cronExpression = EVERY_10_MIN;
+ int cronjobFrequencyMin =
+ postingAllowancesAppParamsServiceHelper.getAppParameterInteger(AccommodationBankAccountsSyncService.SYNC_DELAY);
+ if (20 == cronjobFrequencyMin) {
+ cronExpression = EVERY_20_MIN;
+ } else if (30 == cronjobFrequencyMin) {
+ cronExpression = EVERY_30_MIN;
+ } else if (60 == cronjobFrequencyMin) {
+ cronExpression = EVERY_1_HOURS;
+ }
+
+ return TriggerBuilder.newTrigger()
+ .forJob(job)
+ .withIdentity(ERightsBackOfficeBeanNames.ACCOMMODATION_BANK_ACCOUNTS_SYNC_TRIGGER)
+ .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)
+ .withMisfireHandlingInstructionFireAndProceed())
+ .build();
+ }
+
+ @Bean(ERightsBackOfficeBeanNames.ACCOMMODATION_CREATE_PAYMENT_JOB)
+ public JobDetail accommodationCreatePaymentJobDetails() {
+
+ return JobBuilder.newJob(AccommodationCreatePaymentJob.class)
+ .withIdentity(ERightsBackOfficeBeanNames.ACCOMMODATION_CREATE_PAYMENT_JOB)
+ .storeDurably()
+ .build();
+ }
+
+ @Bean(ERightsBackOfficeBeanNames.ACCOMMODATION_CREATE_PAYMENT_TRIGGER)
+ public Trigger accommodationCreatePaymentJobTrigger(@Qualifier(ERightsBackOfficeBeanNames.ACCOMMODATION_CREATE_PAYMENT_JOB) JobDetail job) {
+
+
+ return TriggerBuilder.newTrigger()
+ .forJob(job)
+ .withIdentity(ERightsBackOfficeBeanNames.ACCOMMODATION_CREATE_PAYMENT_TRIGGER)
+ .withSchedule(CronScheduleBuilder.cronSchedule(EVERY_DAY_4H_AM)
+ .withMisfireHandlingInstructionFireAndProceed())
+ .build();
+ }
+
+}
+
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/p2phub/P2PHubHttpConfig.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/p2phub/P2PHubHttpConfig.java
new file mode 100644
index 0000000..a93fe92
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/p2phub/P2PHubHttpConfig.java
@@ -0,0 +1,18 @@
+package eu.europa.eeas.erights.backoffice.boot.configuration.p2phub;
+
+import eu.europa.eeas.erights.backoffice.web.p2phub.auth.P2PHubSslFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ResourceLoader;
+
+@Configuration
+public class P2PHubHttpConfig {
+
+
+ @Bean
+ public P2PHubSslFactory p2pHubSslFactory(
+ ResourceLoader resourceLoader,
+ P2pHubRestClientConfiguration props) {
+ return new P2PHubSslFactory(resourceLoader, props);
+ }
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/p2phub/P2pHubApiClientConfig.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/p2phub/P2pHubApiClientConfig.java
new file mode 100644
index 0000000..6aae34d
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/p2phub/P2pHubApiClientConfig.java
@@ -0,0 +1,77 @@
+package eu.europa.eeas.erights.backoffice.boot.configuration.p2phub;
+
+
+import eu.europa.eeas.erights.backoffice.boot.configuration.security.AuthorizationHeaderInterceptor;
+import eu.europa.eeas.erights.web.p2phub.ApiClient;
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.ssl.SSLContexts;
+import org.apache.http.ssl.TrustStrategy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.web.client.RestTemplate;
+
+import javax.net.ssl.SSLContext;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.X509Certificate;
+
+@Configuration
+public class P2pHubApiClientConfig {
+
+ /**
+ * Insecure HTTP client (trusts all) — only for DEV.
+ * Keep this in a dev-only profile if possible.
+ */
+ private final P2pHubRestClientConfiguration p2pConfig;
+ private final AuthorizationHeaderInterceptor authInterceptor;
+
+ @Autowired
+ public P2pHubApiClientConfig(P2pHubRestClientConfiguration p2pConfig,
+ AuthorizationHeaderInterceptor authInterceptor) {
+ this.p2pConfig = p2pConfig;
+ this.authInterceptor = authInterceptor;
+ }
+
+ @Bean
+ public ApiClient summaApiClient() {
+ if (p2pConfig.isSecureConnection()) {
+ return createSecureApiClient();
+ } else {
+ return createInsecureApiClient();
+ }
+ }
+
+ private ApiClient createSecureApiClient() {
+ RestTemplate restTemplate = new RestTemplate();
+ restTemplate.getInterceptors().add(authInterceptor);
+ return new ApiClient(restTemplate);
+ }
+
+ private ApiClient createInsecureApiClient() {
+ try {
+ TrustStrategy trustAll = (X509Certificate[] chain, String authType) -> true;
+ SSLContext sslContext = SSLContexts.custom()
+ .loadTrustMaterial(null, trustAll)
+ .build();
+
+ CloseableHttpClient httpClient = HttpClients.custom()
+ .setSSLContext(sslContext)
+ .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
+ .build();
+
+ RestTemplate insecureRestTemplate =
+ new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpClient));
+ insecureRestTemplate.getInterceptors().add(authInterceptor);
+
+ return new ApiClient(insecureRestTemplate);
+ } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
+ throw new IllegalStateException("Failed to create insecure ApiClient", e);
+ }
+ }
+}
+
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/p2phub/P2pHubBusinessValuesConfiguration.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/p2phub/P2pHubBusinessValuesConfiguration.java
new file mode 100644
index 0000000..bfb26a4
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/p2phub/P2pHubBusinessValuesConfiguration.java
@@ -0,0 +1,23 @@
+package eu.europa.eeas.erights.backoffice.boot.configuration.p2phub;
+
+import eu.europa.eeas.ananke.core.starter.base.configuration.RootConfiguration;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.validation.annotation.Validated;
+
+@EnableConfigurationProperties(P2pHubBusinessValuesConfiguration.class)
+@ConfigurationProperties(P2pHubBusinessValuesConfiguration.PREFIX)
+@Validated
+@Configuration
+/*
+* Class that holds the static values that are pushed to ABAC HUB, subject to rare changes.
+* */
+public class P2pHubBusinessValuesConfiguration implements RootConfiguration {
+
+ public static final String PREFIX = "p2p-hub-business-values";
+
+// @NotNull
+// private String euloginOidcJwkKid;
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/p2phub/P2pHubRestClientConfiguration.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/p2phub/P2pHubRestClientConfiguration.java
new file mode 100644
index 0000000..2bfa1bc
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/p2phub/P2pHubRestClientConfiguration.java
@@ -0,0 +1,60 @@
+package eu.europa.eeas.erights.backoffice.boot.configuration.p2phub;
+
+import eu.europa.eeas.ananke.core.starter.base.configuration.RootConfiguration;
+import eu.europa.eeas.ananke.core.starter.base.support.EncryptedConfigurationProperty;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.annotation.Validated;
+
+import javax.validation.constraints.NotNull;
+
+@Getter
+@Setter
+@Validated
+@Component
+@ConfigurationProperties(P2pHubRestClientConfiguration.PREFIX)
+public class P2pHubRestClientConfiguration implements RootConfiguration {
+
+ public static final String PREFIX = "p2p-hub";
+
+ @NotNull
+ private EncryptedConfigurationProperty euloginOidcJwkKid;
+
+ @NotNull
+ private EncryptedConfigurationProperty euloginOidcPrivateKey;
+
+ @NotNull
+ private EncryptedConfigurationProperty euloginOidcClientId;
+
+ @NotNull
+ private String euloginOidcTokenEndpoint;
+
+ @NotNull
+ private EncryptedConfigurationProperty restClientId;
+
+ @NotNull
+ private String url;
+
+ @NotNull
+ private boolean secureConnection = true;
+
+ @NotNull
+ private boolean mtlsEnabled = false;
+
+
+ private String keyStore ;
+
+
+ private String keyStorePassword ;
+
+
+ private String keyStoreType ;
+
+
+ private String keyAlias ;
+
+
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/security/AuthorizationHeaderInterceptor.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/security/AuthorizationHeaderInterceptor.java
new file mode 100644
index 0000000..16b7020
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/security/AuthorizationHeaderInterceptor.java
@@ -0,0 +1,35 @@
+package eu.europa.eeas.erights.backoffice.boot.configuration.security;
+
+import eu.europa.eeas.erights.backoffice.service.provider.p2p.AuthTokenProviderServiceProvider;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpRequest;
+import org.springframework.http.client.ClientHttpRequestExecution;
+import org.springframework.http.client.ClientHttpRequestInterceptor;
+import org.springframework.http.client.ClientHttpResponse;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+
+/**
+ * Adds "Authorization: Bearer " to every outgoing request.
+ * Token is fetched per request to avoid stale tokens.
+ */
+@Component
+public class AuthorizationHeaderInterceptor implements ClientHttpRequestInterceptor {
+
+ private final AuthTokenProviderServiceProvider authTokenProviderServiceProvider;
+
+ public AuthorizationHeaderInterceptor(AuthTokenProviderServiceProvider authTokenProviderServiceProvider) {
+ this.authTokenProviderServiceProvider = authTokenProviderServiceProvider;
+ }
+
+ @Override
+ public ClientHttpResponse intercept(
+ HttpRequest request, byte[] body, ClientHttpRequestExecution execution
+ ) throws IOException {
+ String token = authTokenProviderServiceProvider.getSystemPoPToken();
+ request.getHeaders().set(HttpHeaders.AUTHORIZATION, "Bearer " + token);
+ return execution.execute(request, body);
+ }
+}
+
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/security/CoopHeaderFilter.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/security/CoopHeaderFilter.java
new file mode 100644
index 0000000..041338d
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/configuration/security/CoopHeaderFilter.java
@@ -0,0 +1,20 @@
+package eu.europa.eeas.erights.backoffice.boot.configuration.security;
+
+
+import org.springframework.stereotype.Component;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Component
+public class CoopHeaderFilter implements Filter {
+
+ @Override
+ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
+ throws IOException, ServletException {
+ HttpServletResponse response = (HttpServletResponse) res;
+ response.setHeader("Cross-Origin-Opener-Policy", "unsafe-none");
+ chain.doFilter(req, res);
+ }
+}
\ No newline at end of file
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/statemachine/configurations/AbacItemStateMachineConfiguration.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/statemachine/configurations/AbacItemStateMachineConfiguration.java
new file mode 100644
index 0000000..3aeaa5f
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/statemachine/configurations/AbacItemStateMachineConfiguration.java
@@ -0,0 +1,33 @@
+package eu.europa.eeas.erights.backoffice.boot.statemachine.configurations;
+
+import eu.europa.eeas.erights.common.tools.statemachine.AbacItemEvent;
+import eu.europa.eeas.erights.common.tools.statemachine.AbacItemState;
+import org.springframework.statemachine.config.EnableStateMachineFactory;
+import org.springframework.statemachine.config.StateMachineConfigurerAdapter;
+import org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
+import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;
+
+import java.util.EnumSet;
+
+//@Configuration
+@EnableStateMachineFactory(name = "abacOperationStateMachineFactory")
+public class AbacItemStateMachineConfiguration extends StateMachineConfigurerAdapter {
+
+ @Override
+ public void configure(StateMachineStateConfigurer states) throws Exception {
+ states.withStates().initial(AbacItemState.REQUESTED)
+ .states(EnumSet.allOf(AbacItemState.class))
+ .end(AbacItemState.SUCCESS)
+ .end(AbacItemState.FAILED);
+ }
+
+ @Override
+ public void configure(StateMachineTransitionConfigurer transitions) throws Exception {
+ transitions.withExternal().source(AbacItemState.REQUESTED).target(AbacItemState.REQUESTED).event(AbacItemEvent.REQUEST)
+ .and()
+ .withExternal().source(AbacItemState.REQUESTED).target(AbacItemState.SUCCESS).event(AbacItemEvent.SUCCESS)
+ .and()
+ .withExternal().source(AbacItemState.REQUESTED).target(AbacItemState.FAILED).event(AbacItemEvent.FAIL);
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/statemachine/configurations/AbacRequestMachineConfiguration.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/statemachine/configurations/AbacRequestMachineConfiguration.java
new file mode 100644
index 0000000..994edbe
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/boot/statemachine/configurations/AbacRequestMachineConfiguration.java
@@ -0,0 +1,64 @@
+package eu.europa.eeas.erights.backoffice.boot.statemachine.configurations;
+
+import eu.europa.eeas.erights.common.tools.statemachine.AbacRequestEvent;
+import eu.europa.eeas.erights.common.tools.statemachine.AbacRequestState;
+import org.springframework.statemachine.config.EnableStateMachineFactory;
+import org.springframework.statemachine.config.StateMachineConfigurerAdapter;
+import org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
+import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;
+
+import java.util.EnumSet;
+
+//@Configuration
+@EnableStateMachineFactory(name = "abacRequestStateMachineFactory")
+public class AbacRequestMachineConfiguration extends StateMachineConfigurerAdapter {
+
+ @Override
+ public void configure(StateMachineStateConfigurer states) throws Exception {
+ states.withStates().initial(AbacRequestState.INVOICE_REQUESTED)
+ .states(EnumSet.allOf(AbacRequestState.class))
+ .end(AbacRequestState.PAYMENT_ORDER_CREATED)
+ .end(AbacRequestState.MANUAL_PAYMENT)
+ .end(AbacRequestState.FAILED);
+ }
+
+ @Override
+ public void configure(StateMachineTransitionConfigurer transitions) throws Exception {
+ appendInvoiceTransitions(transitions);
+ appendInvoiceSecondVisaTransitions(transitions);
+ appendPaymentRequestTransitions(transitions);
+ appendPaymentOrderTransitions(transitions);
+ }
+
+ private void appendInvoiceTransitions(StateMachineTransitionConfigurer transitions) throws Exception {
+ transitions.withExternal().source(AbacRequestState.NEW).target(AbacRequestState.INVOICE_REQUESTED).event(AbacRequestEvent.REQUEST_INVOICE)
+ .and()
+ .withExternal().source(AbacRequestState.INVOICE_REQUESTED).target(AbacRequestState.INVOICE_CREATED).event(AbacRequestEvent.SUCCESS)
+ .and()
+ .withExternal().source(AbacRequestState.INVOICE_REQUESTED).target(AbacRequestState.FAILED).event(AbacRequestEvent.FAIL)
+ .and()
+ .withExternal().source(AbacRequestState.INVOICE_CREATED).target(AbacRequestState.INVOICE_SECOND_VISA_REQUESTED).event(AbacRequestEvent.REQUEST_SECOND_INVOICE_VISA);
+ }
+
+ private void appendInvoiceSecondVisaTransitions(StateMachineTransitionConfigurer transitions) throws Exception {
+ transitions.withExternal().source(AbacRequestState.INVOICE_SECOND_VISA_REQUESTED).target(AbacRequestState.INVOICE_SECOND_VISA_CREATED).event(AbacRequestEvent.SUCCESS)
+ .and()
+ .withExternal().source(AbacRequestState.INVOICE_SECOND_VISA_REQUESTED).target(AbacRequestState.FAILED).event(AbacRequestEvent.FAIL)
+ .and()
+ .withExternal().source(AbacRequestState.INVOICE_SECOND_VISA_CREATED).target(AbacRequestState.PAYMENT_REQUEST_REQUESTED).event(AbacRequestEvent.REQUEST_PAYMENT_REQUEST);
+ }
+
+ private void appendPaymentRequestTransitions(StateMachineTransitionConfigurer transitions) throws Exception {
+ transitions.withExternal().source(AbacRequestState.PAYMENT_REQUEST_REQUESTED).target(AbacRequestState.PAYMENT_REQUEST_CREATED).event(AbacRequestEvent.SUCCESS)
+ .and()
+ .withExternal().source(AbacRequestState.PAYMENT_REQUEST_REQUESTED).target(AbacRequestState.FAILED).event(AbacRequestEvent.FAIL)
+ .and()
+ .withExternal().source(AbacRequestState.PAYMENT_REQUEST_CREATED).target(AbacRequestState.PAYMENT_ORDER_REQUESTED).event(AbacRequestEvent.REQUEST_PAYMENT_ORDER);
+ }
+
+ private void appendPaymentOrderTransitions(StateMachineTransitionConfigurer transitions) throws Exception {
+ transitions.withExternal().source(AbacRequestState.PAYMENT_ORDER_REQUESTED).target(AbacRequestState.PAYMENT_ORDER_CREATED).event(AbacRequestEvent.SUCCESS)
+ .and()
+ .withExternal().source(AbacRequestState.PAYMENT_ORDER_REQUESTED).target(AbacRequestState.FAILED).event(AbacRequestEvent.FAIL);
+ }
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/BudgetLineInfoId.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/BudgetLineInfoId.java
new file mode 100644
index 0000000..e9d5448
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/BudgetLineInfoId.java
@@ -0,0 +1,61 @@
+package eu.europa.eeas.erights.backoffice.data.jpa.entity;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import java.io.Serializable;
+import java.math.BigInteger;
+import java.util.Objects;
+
+/**
+ * Complex ID because "ID" is not unique in table "MV_BUDGET_LINE_DATA"
+ *
+ * @author idominju
+ */
+@Embeddable
+public class BudgetLineInfoId implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Column(name = "ID")
+ private BigInteger id;
+
+ @Column(name = "FUND_SOURCE")
+ private String fundSource;
+
+ public BigInteger getId() {
+ return id;
+ }
+
+ public void setId(BigInteger id) {
+ this.id = id;
+ }
+
+ public String getFundSource() {
+ return fundSource;
+ }
+
+ public void setFundSource(String fundSource) {
+ this.fundSource = fundSource;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(fundSource, id);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ BudgetLineInfoId other = (BudgetLineInfoId) obj;
+ return Objects.equals(fundSource, other.fundSource) && Objects.equals(id, other.id);
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/BudgetLineInfoJpaEntity.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/BudgetLineInfoJpaEntity.java
new file mode 100644
index 0000000..17d460d
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/BudgetLineInfoJpaEntity.java
@@ -0,0 +1,230 @@
+package eu.europa.eeas.erights.backoffice.data.jpa.entity;
+
+import eu.europa.eeas.ananke.core.data.provider.jpa.entity.AbstractJpaEntity;
+import org.hibernate.annotations.Immutable;
+import org.hibernate.annotations.Parameter;
+import org.hibernate.annotations.Type;
+import org.javamoney.moneta.Money;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.time.LocalDateTime;
+
+/**
+ * @author idominju
+ */
+@Entity
+@Immutable
+@Table(name = BudgetLineInfoJpaEntity.TABLE_NAME)
+public class BudgetLineInfoJpaEntity extends AbstractJpaEntity {
+
+ public static final String TABLE_NAME = "MV_BUDGET_LINE_DATA";
+
+ public static final String MONEY_AMOUNT = "org.jadira.usertype.moneyandcurrency.moneta.PersistentMoneyAmount";
+
+ public static final String MONETARY_UNIT = "EUR";
+
+ public static final String CURRENCY_CODE_PARAMETER = "currencyCode";
+
+ public static final long serialVersionUID = 1L;
+
+ @Id
+ @Column(name = "BUDGET_LINE_DATA_ID")
+ private String budgetLineInfoId;
+
+ @Column(name = "PARENT_LOCAL_KEY")
+ private String parentLocalKey;
+
+ @Column(name = "BUDGET_LINE")
+ private String budgetLine;
+
+ @Column(name = "MAIN_ACCOUNT")
+ private String mainAccount;
+
+ @Column(name = "BUDGET_POSITION")
+ private String budgetPosition;
+
+ @Column(name = "DELEGATION")
+ private String delegation;
+
+ @Column(name = "LVL_CODE")
+ private String lvlCode;
+
+ @Column(name = "LVL_NAME")
+ private String lvlName;
+
+ @Column(name = "COMMITMENT_ID")
+ private String commitmentId;
+
+ @Column(name = "COMMITMENT_HEADER_ID")
+ private String commitmentHeaderId;
+
+ @Column(name = "EXERCISE_ID")
+ private Integer exerciseId;
+
+ @Column(name = "FUND_SOURCE_GROUP")
+ private String fundSourceGroup;
+
+ @Column(name = "FUND_SOURCE")
+ private String fundSource;
+
+ @Column(name = "PAYMENT_CREDITS_AVAILABLE_EUR")
+ @Type(type = MONEY_AMOUNT, parameters = {@Parameter(name = CURRENCY_CODE_PARAMETER, value = MONETARY_UNIT)})
+ private Money paymentCreditsAvailableEur;
+
+ @Column(name = "RAL")
+ @Type(type = MONEY_AMOUNT, parameters = {@Parameter(name = CURRENCY_CODE_PARAMETER, value = MONETARY_UNIT)})
+ private Money ral;
+
+ @Column(name = "TOTAL_COMMITMENTS_EUR")
+ @Type(type = MONEY_AMOUNT, parameters = {@Parameter(name = CURRENCY_CODE_PARAMETER, value = MONETARY_UNIT)})
+ private Money totalCommitmentsEur;
+
+ @Column(name = "SYNC_COMMITMENTS_DATE")
+ private LocalDateTime syncCommitmentsDate;
+ /**
+ * Methods
+ */
+ @Override
+ public String getId() {
+ return null;
+ }
+
+ public String getBudgetLineInfoId() {
+ return budgetLineInfoId;
+ }
+
+ public void setBudgetLineInfoId(String budgetLineInfoId) {
+ this.budgetLineInfoId = budgetLineInfoId;
+ }
+
+ public String getParentLocalKey() {
+ return parentLocalKey;
+ }
+
+ public void setParentLocalKey(String parentLocalKey) {
+ this.parentLocalKey = parentLocalKey;
+ }
+
+ public String getBudgetLine() {
+ return budgetLine;
+ }
+
+ public void setBudgetLine(String budgetLine) {
+ this.budgetLine = budgetLine;
+ }
+
+ public String getMainAccount() {
+ return mainAccount;
+ }
+
+ public void setMainAccount(String mainAccount) {
+ this.mainAccount = mainAccount;
+ }
+
+ public String getBudgetPosition() {
+ return budgetPosition;
+ }
+
+ public void setBudgetPosition(String budgetPosition) {
+ this.budgetPosition = budgetPosition;
+ }
+
+ public String getDelegation() {
+ return delegation;
+ }
+
+ public void setDelegation(String delegation) {
+ this.delegation = delegation;
+ }
+
+ public String getLvlCode() {
+ return lvlCode;
+ }
+
+ public void setLvlCode(String lvlCode) {
+ this.lvlCode = lvlCode;
+ }
+
+ public String getLvlName() {
+ return lvlName;
+ }
+
+ public void setLvlName(String lvlName) {
+ this.lvlName = lvlName;
+ }
+
+ public String getCommitmentId() {
+ return commitmentId;
+ }
+
+ public void setCommitmentId(String commitmentId) {
+ this.commitmentId = commitmentId;
+ }
+
+ public Integer getExerciseId() {
+ return exerciseId;
+ }
+
+ public void setExerciseId(Integer exerciseId) {
+ this.exerciseId = exerciseId;
+ }
+
+ public String getFundSourceGroup() {
+ return fundSourceGroup;
+ }
+
+ public void setFundSourceGroup(String fundSourceGroup) {
+ this.fundSourceGroup = fundSourceGroup;
+ }
+
+ public Money getPaymentCreditsAvailableEur() {
+ return paymentCreditsAvailableEur;
+ }
+
+ public void setPaymentCreditsAvailableEur(Money paymentCreditsAvailableEur) {
+ this.paymentCreditsAvailableEur = paymentCreditsAvailableEur;
+ }
+
+ public Money getRal() {
+ return ral;
+ }
+
+ public void setRal(Money ral) {
+ this.ral = ral;
+ }
+
+ public Money getTotalCommitmentsEur() {
+ return totalCommitmentsEur;
+ }
+
+ public void setTotalCommitmentsEur(Money totalCommitmentsEur) {
+ this.totalCommitmentsEur = totalCommitmentsEur;
+ }
+
+ public String getFundSource() {
+ return fundSource;
+ }
+
+ public void setFundSource(String fundSource) {
+ this.fundSource = fundSource;
+ }
+
+ public String getCommitmentHeaderId() {
+ return commitmentHeaderId;
+ }
+
+ public void setCommitmentHeaderId(String commitmentHeaderId) {
+ this.commitmentHeaderId = commitmentHeaderId;
+ }
+
+ public LocalDateTime getSyncCommitmentsDate() {
+ return syncCommitmentsDate;
+ }
+
+ public void setSyncCommitmentsDate(LocalDateTime syncCommitmentsDate) {
+ this.syncCommitmentsDate = syncCommitmentsDate;
+ }
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/BudgetLineSubpostJpaEntity.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/BudgetLineSubpostJpaEntity.java
new file mode 100644
index 0000000..3e48b49
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/BudgetLineSubpostJpaEntity.java
@@ -0,0 +1,93 @@
+package eu.europa.eeas.erights.backoffice.data.jpa.entity;
+
+import eu.europa.eeas.ananke.core.data.provider.jpa.entity.AbstractJpaEntity;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.annotations.Immutable;
+import org.hibernate.annotations.Type;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * @author idominju
+ */
+@Entity
+@Immutable
+@Setter
+@Getter
+@Table(name = BudgetLineSubpostJpaEntity.TABLE_NAME)
+public class BudgetLineSubpostJpaEntity extends AbstractJpaEntity {
+
+ public static final String TABLE_NAME = "BUDGET_LINES_SUBPOSTS_MAPPING";
+
+ public static final long serialVersionUID = 1L;
+
+ @Id
+ @Column(name = "BUDGET_LINES_SUBPOSTS_MAPPING_ID")
+ private Long budgetLinesSubpostsMappingId;
+
+ @Column(name = "BUDGET_LINES")
+ private String budgetLines;
+
+ @Column(name = "BUDGET_POSITION_BUDGDEL")
+ private String budgetPositionBudgdel;
+
+ @Column(name = "BUDGET_POSITION_ERIGHTS")
+ private String budgetPositionErights;
+
+ @Column(name = "FUND_SOURCE")
+ private String fundSource;
+
+ @Column(name = "SUMMA_FUND_SOURCE_ID")
+ private Long summaFundSourceId;
+
+
+
+ @Column(name = "REQUEST_TYPE")
+ private String requestType;
+
+ @Column(name = "STATUTORY_LINK")
+ private String statutoryLink;
+
+ @Column(name = "SUBPOST_CODE")
+ private String subpostCode;
+
+ @Column(name = "SUBPOST_DESCRIPTION")
+ private String subpostDescription;
+
+ @Column(name = "PERSONNEL_TYPE_ID")
+ private Integer personnelTypeId;
+
+ @Column(name = "LST_CD")
+ private String lstCd;
+
+ @Column(name = "SUBPOST_TYPE")
+ private String subpostType;
+
+ @Column(name = "MOVEMENT_CONTEXT")
+ private String movementContext;
+
+ @Column(name = "COMMITMENT_LVL_4")
+ private String commitmentLvl4;
+
+ @Column(name = "BUDGET_PERIODS")
+ private String budgetPeriods;
+
+ @Column(name = "EARMARKED_FUND")
+ private String earmarkedFund;
+
+ @Type(type = "yes_no")
+ @Column(name = "DEFAULT_EARMARKED_FUND")
+ private Boolean defaultEarmarkedFund;
+
+
+ @Override
+ public String getId() {
+ return budgetLinesSubpostsMappingId != null
+ ? String.valueOf(budgetLinesSubpostsMappingId)
+ : null;
+ }
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/DelegationCodesJpaEntity.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/DelegationCodesJpaEntity.java
new file mode 100644
index 0000000..97f5e6e
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/DelegationCodesJpaEntity.java
@@ -0,0 +1,84 @@
+package eu.europa.eeas.erights.backoffice.data.jpa.entity;
+
+import eu.europa.eeas.ananke.core.data.provider.jpa.entity.AbstractJpaEntity;
+import org.hibernate.annotations.Immutable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * @author idominju
+ */
+@Entity
+@Immutable
+@Table(name = DelegationCodesJpaEntity.TABLE_NAME)
+public class DelegationCodesJpaEntity extends AbstractJpaEntity {
+
+ public static final String TABLE_NAME = "V_DELEGATION_CODES";
+
+ public static final long serialVersionUID = 1L;
+
+ @Id
+ @Column(name = "ORG_ID")
+ private Long orgId;
+
+ @Column(name = "ORG_CODE")
+ private String orgCode;
+
+ @Column(name = "APPLICATION_VIEW")
+ private String applicationView;
+
+ @Column(name = "ORG_EXERCISE_ID")
+ private Integer orgExerciseId;
+
+ @Column(name = "NAME")
+ private String name;
+
+ @Override
+ public Long getId() {
+ return getOrgId();
+ }
+
+ public Long getOrgId() {
+ return orgId;
+ }
+
+ public void setOrgId(Long orgId) {
+ this.orgId = orgId;
+ }
+
+ public String getOrgCode() {
+ return orgCode;
+ }
+
+ public void setOrgCode(String orgCode) {
+ this.orgCode = orgCode;
+ }
+
+ public String getApplicationView() {
+ return applicationView;
+ }
+
+ public void setApplicationView(String applicationView) {
+ this.applicationView = applicationView;
+ }
+
+ public Integer getOrgExerciseId() {
+ return orgExerciseId;
+ }
+
+ public void setOrgExerciseId(Integer orgExerciseId) {
+ this.orgExerciseId = orgExerciseId;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/PersonAbacCriteriaInfoJpaEntity.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/PersonAbacCriteriaInfoJpaEntity.java
new file mode 100644
index 0000000..f54ead5
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/PersonAbacCriteriaInfoJpaEntity.java
@@ -0,0 +1,44 @@
+package eu.europa.eeas.erights.backoffice.data.jpa.entity;
+
+import eu.europa.eeas.ananke.core.data.provider.jpa.entity.AbstractJpaEntity;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.annotations.Immutable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * @author idominju
+ * @author ienaccat
+ */
+@Entity
+@Immutable
+@Table(name = PersonAbacCriteriaInfoJpaEntity.TABLE_NAME)
+@Getter
+@Setter
+public class PersonAbacCriteriaInfoJpaEntity extends AbstractJpaEntity {
+
+ public static final String TABLE_NAME = "MV_RGH_ANALYTICAL_POSTING_CRITERIA";
+
+ public static final long serialVersionUID = 1L;
+
+ @Id
+ @Column(name = "PER_ID")
+ private Long personId;
+
+ @Column(name = "CRITERIA_TYPE")
+ private String criteriaType;
+
+ @Column(name = "CRITERIA_CODE")
+ private String criteriaCode;
+
+ @Override
+ public Long getId() {
+ return getPersonId();
+ }
+
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/PersonAbacNupInfoJpaEntity.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/PersonAbacNupInfoJpaEntity.java
new file mode 100644
index 0000000..5b021f9
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/PersonAbacNupInfoJpaEntity.java
@@ -0,0 +1,39 @@
+package eu.europa.eeas.erights.backoffice.data.jpa.entity;
+
+import eu.europa.eeas.ananke.core.data.provider.jpa.entity.AbstractJpaEntity;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.annotations.Immutable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * @author ienaccat
+ */
+@Entity
+@Immutable
+@Table(name = PersonAbacNupInfoJpaEntity.TABLE_NAME)
+@Getter
+@Setter
+public class PersonAbacNupInfoJpaEntity extends AbstractJpaEntity {
+
+ public static final String TABLE_NAME = "MV_NUP";
+
+ public static final long serialVersionUID = 1L;
+
+ @Id
+ @Column(name = "PER_ID")
+ private Long personId;
+
+ @Column(name = "NUP")
+ private String nup;
+
+ @Override
+ public Long getId() {
+ return getPersonId();
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/RequestPaymentAbacInfoJpaEntity.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/RequestPaymentAbacInfoJpaEntity.java
new file mode 100644
index 0000000..e738f39
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/RequestPaymentAbacInfoJpaEntity.java
@@ -0,0 +1,313 @@
+package eu.europa.eeas.erights.backoffice.data.jpa.entity;
+
+import eu.europa.eeas.ananke.core.audit.provider.data.jpa.entity.AbstractAuditableJpaEntity;
+import org.hibernate.annotations.Type;
+
+import javax.persistence.*;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
+
+import static javax.persistence.GenerationType.SEQUENCE;
+
+@Entity
+
+@Table(name = RequestPaymentAbacInfoJpaEntity.TABLE_NAME)
+public class RequestPaymentAbacInfoJpaEntity extends AbstractAuditableJpaEntity {
+
+ public static final String TABLE_NAME = "REQUEST_PAYMENT_ABAC_INFO";
+
+ public static final String SEQUENCE_NAME = "SEQ_" + TABLE_NAME;
+
+ public static final long serialVersionUID = 1L;
+
+ @Id
+ @Column(name = "REQUEST_PAYMENT_ABAC_INFO_ID")
+ @GeneratedValue(strategy = SEQUENCE, generator = "SEQ_GENERATOR")
+ @SequenceGenerator(name = "SEQ_GENERATOR", sequenceName = SEQUENCE_NAME, allocationSize = 1)
+ private Long id;
+
+ @Column(name = "REQUEST_ID")
+ private Long requestId;
+
+ @Column(name = "ANALYTICAL_CODE")
+ private String analyticalCode;
+
+ @Column(name = "BUDGET_LINE")
+ private String budgetLine;
+
+ @Column(name = "BUDGET_POSITION")
+ private String budgetPosition;
+
+ @Column(name = "COMMITMENT_ID")
+ private String commitmentId;
+
+ @Column(name = "COMMITMENT_HEADER_ID")
+ private String commitmentHeaderId;
+
+ @Column(name = "EXERCISE_ID")
+ private String exerciseId;
+
+ @Column(name = "FUND_SOURCE_GROUP")
+ private String fundSourceGroup;
+
+ @Column(name = "FUND_SOURCE")
+ private String fundSource;
+
+ @Column(name = "DELEGATION")
+ private String delegation;
+
+ @Column(name = "LVL_CODE")
+ private String lvlCode;
+
+ @Column(name = "LVL_NAME")
+ private String lvlName;
+
+ @Column(name = "MAIN_ACCOUNT")
+ private String mainAccount;
+
+ @Column(name = "PARENT_LOCAL_KEY")
+ private String parentLocalKey;
+
+ @Column(name = "PAYMENT_CREDITS_AVAILABLE_EUR")
+ private Double paymentCreditsAvailableEur;
+
+ @Column(name = "RAL")
+ private Double ral;
+
+ @Column(name = "TOTAL_COMMITMENTS_EUR")
+ private Double totalCommitmentsEur;
+
+ @Column(name = "WORKFLOW")
+ private String workflow;
+
+ @Column(name = "LOCAL_DELEGATION_CODE")
+ private String localDelegationCode;
+
+ @OneToMany(mappedBy = "requestPaymentAbacInfo", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
+ private List requestSubpostList = new LinkedList<>();
+
+ @Type(type = "uuid-binary")
+ @Column(name = "ABAC_COMM_ID", length = 16, unique = true)
+ private UUID abacCommunicationId;
+
+ @Column(name = "AGENT_NAME")
+ private String agentName;
+
+ @Column(name = "RESPONSIBLE_ORGANIZATION")
+ private String responsibleOrganization;
+
+ @Column(name = "RESPONSIBLE_ORGANIZATION_TYPE")
+ private String responsibleOrganizationType;
+
+ @Override
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(Long requestId) {
+ this.requestId = requestId;
+ }
+
+ public String getAnalyticalCode() {
+ return analyticalCode;
+ }
+
+ public void setAnalyticalCode(String analyticalCode) {
+ this.analyticalCode = analyticalCode;
+ }
+
+ public String getBudgetLine() {
+ return budgetLine;
+ }
+
+ public void setBudgetLine(String budgetLine) {
+ this.budgetLine = budgetLine;
+ }
+
+ public String getBudgetPosition() {
+ return budgetPosition;
+ }
+
+ public void setBudgetPosition(String budgetPosition) {
+ this.budgetPosition = budgetPosition;
+ }
+
+ public String getCommitmentId() {
+ return commitmentId;
+ }
+
+ public void setCommitmentId(String commitmentId) {
+ this.commitmentId = commitmentId;
+ }
+
+ public String getExerciseId() {
+ return exerciseId;
+ }
+
+ public void setExerciseId(String exerciseId) {
+ this.exerciseId = exerciseId;
+ }
+
+ public String getFundSourceGroup() {
+ return fundSourceGroup;
+ }
+
+ public void setFundSourceGroup(String fundSourceGroup) {
+ this.fundSourceGroup = fundSourceGroup;
+ }
+
+ public String getFundSource() {
+ return fundSource;
+ }
+
+ public void setFundSource(String fundSource) {
+ this.fundSource = fundSource;
+ }
+
+ public String getDelegation() {
+ return delegation;
+ }
+
+ public void setDelegation(String delegation) {
+ this.delegation = delegation;
+ }
+
+ public String getLvlCode() {
+ return lvlCode;
+ }
+
+ public void setLvlCode(String lvlCode) {
+ this.lvlCode = lvlCode;
+ }
+
+ public String getLvlName() {
+ return lvlName;
+ }
+
+ public void setLvlName(String lvlName) {
+ this.lvlName = lvlName;
+ }
+
+ public String getMainAccount() {
+ return mainAccount;
+ }
+
+ public void setMainAccount(String mainAccount) {
+ this.mainAccount = mainAccount;
+ }
+
+ public String getParentLocalKey() {
+ return parentLocalKey;
+ }
+
+ public void setParentLocalKey(String parentLocalKey) {
+ this.parentLocalKey = parentLocalKey;
+ }
+
+ public Double getPaymentCreditsAvailableEur() {
+ return paymentCreditsAvailableEur;
+ }
+
+ public void setPaymentCreditsAvailableEur(Double paymentCreditsAvailableEur) {
+ this.paymentCreditsAvailableEur = paymentCreditsAvailableEur;
+ }
+
+ public Double getRal() {
+ return ral;
+ }
+
+ public void setRal(Double ral) {
+ this.ral = ral;
+ }
+
+ public Double getTotalCommitmentsEur() {
+ return totalCommitmentsEur;
+ }
+
+ public void setTotalCommitmentsEur(Double totalCommitmentsEur) {
+ this.totalCommitmentsEur = totalCommitmentsEur;
+ }
+
+ public String getWorkflow() {
+ return workflow;
+ }
+
+ public void setWorkflow(String workflow) {
+ this.workflow = workflow;
+ }
+
+ public String getLocalDelegationCode() {
+ return localDelegationCode;
+ }
+
+ public void setLocalDelegationCode(String localDelegationCode) {
+ this.localDelegationCode = localDelegationCode;
+ }
+
+ public List getRequestSubpostList() {
+ return requestSubpostList;
+ }
+
+ /**
+ * Please don't delete this and generate again is the mechanism to update the attachment with the latest ones
+ *
+ * @param requestSubpostList list of requestSubposts
+ */
+ public void setRequestSubpostList(List requestSubpostList) {
+ if (requestSubpostList != null) {
+ this.requestSubpostList.clear();
+ this.requestSubpostList.addAll(requestSubpostList);
+ for (RequestSubpostJpaEntity requestSubpost : this.requestSubpostList)
+ requestSubpost.setRequestPaymentAbacInfo(this);
+ }
+ }
+
+ public UUID getAbacCommunicationId() {
+ return abacCommunicationId;
+ }
+
+ public void setAbacCommunicationId(UUID abacCommunicationId) {
+ this.abacCommunicationId = abacCommunicationId;
+ }
+
+ public String getAgentName() {
+ return agentName;
+ }
+
+ public void setAgentName(String agentName) {
+ this.agentName = agentName;
+ }
+
+ public String getCommitmentHeaderId() {
+ return commitmentHeaderId;
+ }
+
+ public void setCommitmentHeaderId(String commitmentHeaderId) {
+ this.commitmentHeaderId = commitmentHeaderId;
+ }
+
+ public String getResponsibleOrganization() {
+ return responsibleOrganization;
+ }
+
+ public void setResponsibleOrganization(String responsibleOrganization) {
+ this.responsibleOrganization = responsibleOrganization;
+ }
+
+ public String getResponsibleOrganizationType() {
+ return responsibleOrganizationType;
+ }
+
+ public void setResponsibleOrganizationType(String responsibleOrganizationType) {
+ this.responsibleOrganizationType = responsibleOrganizationType;
+ }
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/RequestSubpostJpaEntity.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/RequestSubpostJpaEntity.java
new file mode 100644
index 0000000..74c504d
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/RequestSubpostJpaEntity.java
@@ -0,0 +1,145 @@
+package eu.europa.eeas.erights.backoffice.data.jpa.entity;
+
+import eu.europa.eeas.ananke.core.data.provider.jpa.TypeDefinition;
+import eu.europa.eeas.ananke.core.data.provider.jpa.entity.AbstractJpaEntity;
+import org.hibernate.annotations.Columns;
+import org.hibernate.annotations.Type;
+import org.javamoney.moneta.Money;
+
+import javax.persistence.*;
+
+import static javax.persistence.GenerationType.SEQUENCE;
+
+@Entity
+
+@Table(name = RequestSubpostJpaEntity.TABLE_NAME)
+public class RequestSubpostJpaEntity extends AbstractJpaEntity {
+
+ public static final String TABLE_NAME = "REQUEST_SUBPOSTS";
+
+ public static final String SEQUENCE_NAME = "SEQ_" + TABLE_NAME;
+
+ public static final long serialVersionUID = 1L;
+
+ @Id
+ @Column(name = "REQUEST_SUBPOSTS_ID")
+ @GeneratedValue(strategy = SEQUENCE, generator = "SEQ_GENERATOR")
+ @SequenceGenerator(name = "SEQ_GENERATOR", sequenceName = SEQUENCE_NAME, allocationSize = 1)
+ private Long requestSubpostsId;
+
+ @Column(name = "BUDGET_LINES_SUBPOSTS_MAPPING_ID")
+ private Long budgetLinesSubpostsMappingId;
+
+ @Column(name = "SUBPOST_CODE")
+ private String subpostCode;
+
+ @Column(name = "SUBPOST_TYPE")
+ private String subpostType;
+
+ @Column(name = "SUBPOST_DESCRIPTION")
+ private String subpostDescription;
+
+ @Columns(columns = {@Column(name = "AMOUNT_CURRENCY"),
+ @Column(name = "AMOUNT")
+ })
+ @Type(type = TypeDefinition.MONEY)
+ private Money amount;
+
+ @Column(name = "REQUEST_ID")
+ private Long requestId;
+
+ @JoinColumn(name = "REQUEST_PAYMENT_ABAC_INFO_ID", nullable = false)
+ @ManyToOne(fetch = FetchType.LAZY)
+ private RequestPaymentAbacInfoJpaEntity requestPaymentAbacInfo;
+
+ @Column(name = "COMMITMENT_LVL_4")
+ private String commitmentLvl4;
+
+ @Column(name = "EARMARKED_FUND")
+ private String earmarkedFund;
+
+ @Override
+ public String getId() {
+ return null;
+ }
+
+ public Long getRequestSubpostsId() {
+ return requestSubpostsId;
+ }
+
+ public void setRequestSubpostsId(Long requestSubpostsId) {
+ this.requestSubpostsId = requestSubpostsId;
+ }
+
+ public Long getBudgetLinesSubpostsMappingId() {
+ return budgetLinesSubpostsMappingId;
+ }
+
+ public void setBudgetLinesSubpostsMappingId(Long budgetLinesSubpostsMappingId) {
+ this.budgetLinesSubpostsMappingId = budgetLinesSubpostsMappingId;
+ }
+
+ public String getSubpostCode() {
+ return subpostCode;
+ }
+
+ public void setSubpostCode(String subpostCode) {
+ this.subpostCode = subpostCode;
+ }
+
+ public String getSubpostType() {
+ return subpostType;
+ }
+
+ public void setSubpostType(String subpostType) {
+ this.subpostType = subpostType;
+ }
+
+ public String getSubpostDescription() {
+ return subpostDescription;
+ }
+
+ public void setSubpostDescription(String subpostDescription) {
+ this.subpostDescription = subpostDescription;
+ }
+
+ public Money getAmount() {
+ return amount;
+ }
+
+ public void setAmount(Money amount) {
+ this.amount = amount;
+ }
+
+ public Long getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(Long requestId) {
+ this.requestId = requestId;
+ }
+
+ public RequestPaymentAbacInfoJpaEntity getRequestPaymentAbacInfo() {
+ return requestPaymentAbacInfo;
+ }
+
+ public void setRequestPaymentAbacInfo(RequestPaymentAbacInfoJpaEntity requestPaymentAbacInfo) {
+ this.requestPaymentAbacInfo = requestPaymentAbacInfo;
+ }
+
+ public String getCommitmentLvl4() {
+ return commitmentLvl4;
+ }
+
+ public void setCommitmentLvl4(String commitmentLvl4) {
+ this.commitmentLvl4 = commitmentLvl4;
+ }
+
+ public String getEarmarkedFund() {
+ return earmarkedFund;
+ }
+
+ public void setEarmarkedFund(String earmarkedFund) {
+ this.earmarkedFund = earmarkedFund;
+ }
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/StateMachineCurrentStatesEntity.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/StateMachineCurrentStatesEntity.java
new file mode 100644
index 0000000..fd06f55
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/StateMachineCurrentStatesEntity.java
@@ -0,0 +1,79 @@
+package eu.europa.eeas.erights.backoffice.data.jpa.entity;
+
+import eu.europa.eeas.ananke.core.data.provider.jpa.entity.AbstractJpaEntity;
+import eu.europa.eeas.erights.common.tools.statemachine.RequestEvent;
+import eu.europa.eeas.erights.common.tools.statemachine.RequestState;
+import org.hibernate.annotations.Type;
+
+import javax.persistence.*;
+import java.time.LocalDateTime;
+import java.util.UUID;
+
+/**
+ * Reimbursement Claim Entity.
+ *
+ * @author igianpan
+ *
+ */
+@Entity
+@Table(name = StateMachineCurrentStatesEntity.TABLE_NAME)
+public class StateMachineCurrentStatesEntity extends AbstractJpaEntity {
+
+ public static final String TABLE_NAME = "ANK_SM_CURRENT_STATES";
+
+ private static final long serialVersionUID = 1L;
+
+ @Id
+ @Column(name = "ID", length = 16)
+ @Type(type = "uuid-binary")
+ private UUID id;
+
+ @Column(name = "EVENT")
+ @Enumerated(EnumType.STRING)
+ private RequestEvent event;
+
+ @Column(name = "ARRIVAL_STATE")
+ @Enumerated(EnumType.STRING)
+ private RequestState arrivalState;
+
+ @Column(name = "SAVED_BY")
+ private Long savedByUserId;
+
+ @Column(name = "SAVED_AT")
+ private LocalDateTime savedAt;
+
+
+ @Override
+ public UUID getId() {
+ return id;
+ }
+
+ public void setId(UUID id) {
+ this.id = id;
+ }
+
+ public RequestEvent getEvent() {
+ return event;
+ }
+
+ public void setEvent(
+ RequestEvent event) {
+ this.event = event;
+ }
+
+ public Long getSavedByUserId() {
+ return savedByUserId;
+ }
+
+ public void setSavedByUserId(Long savedByUserId) {
+ this.savedByUserId = savedByUserId;
+ }
+
+ public LocalDateTime getSavedAt() {
+ return savedAt;
+ }
+
+ public void setSavedAt(LocalDateTime savedAt) {
+ this.savedAt = savedAt;
+ }
+}
\ No newline at end of file
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/StateMachinePreviousStatesEntity.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/StateMachinePreviousStatesEntity.java
new file mode 100644
index 0000000..54cb6b5
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/StateMachinePreviousStatesEntity.java
@@ -0,0 +1,76 @@
+package eu.europa.eeas.erights.backoffice.data.jpa.entity;
+
+import eu.europa.eeas.ananke.core.data.provider.jpa.entity.AbstractJpaEntity;
+import eu.europa.eeas.erights.common.tools.statemachine.RequestEvent;
+import org.hibernate.annotations.Type;
+
+import javax.persistence.*;
+import java.util.UUID;
+
+import static javax.persistence.GenerationType.SEQUENCE;
+
+/**
+ * Reimbursement Claim Entity.
+ *
+ * @author itadephe
+ *
+ */
+@Entity
+@Table(name = StateMachinePreviousStatesEntity.TABLE_NAME)
+public class StateMachinePreviousStatesEntity extends AbstractJpaEntity {
+
+ public static final String TABLE_NAME = "ANK_SM_PREVIOUS_STATES";
+ public static final String SEQUENCE_NAME = "SEQ_" + TABLE_NAME;
+
+ private static final long serialVersionUID = 1L;
+
+ @Id
+ @SequenceGenerator(name = "SEQ_GENERATOR", sequenceName = SEQUENCE_NAME, allocationSize = 1)
+ @GeneratedValue(strategy = SEQUENCE, generator = "SEQ_GENERATOR")
+ private Long id;
+
+ @Column(name = "CURRENT_STATE_ID", length = 16)
+ @Type(type = "uuid-binary")
+ private UUID smId;
+
+ @Column(name = "EVENT")
+ @Enumerated(EnumType.STRING)
+ private RequestEvent event;
+
+ @Column(name = "SAVED_BY")
+ private Long savedByUserId;
+
+ @Override
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public UUID getSmId() {
+ return smId;
+ }
+
+ public void setSmId(UUID smId) {
+ this.smId = smId;
+ }
+
+ public RequestEvent getEvent() {
+ return event;
+ }
+
+ public void setEvent(
+ RequestEvent event) {
+ this.event = event;
+ }
+
+ public Long getSavedByUserId() {
+ return savedByUserId;
+ }
+
+ public void setSavedByUserId(Long savedByUserId) {
+ this.savedByUserId = savedByUserId;
+ }
+}
\ No newline at end of file
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/SummaFundSourceJpaEntity.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/SummaFundSourceJpaEntity.java
new file mode 100644
index 0000000..3e3efd8
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/SummaFundSourceJpaEntity.java
@@ -0,0 +1,52 @@
+package eu.europa.eeas.erights.backoffice.data.jpa.entity;
+
+import eu.europa.eeas.ananke.core.data.provider.jpa.entity.AbstractJpaEntity;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = SummaFundSourceJpaEntity.TABLE_NAME)
+public class SummaFundSourceJpaEntity extends AbstractJpaEntity {
+ public static final String TABLE_NAME = "SUMMA_FUND_SOURCE";
+ public static final String SEQUENCE_NAME = "SEQ_" + TABLE_NAME;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GENERATOR")
+ @SequenceGenerator(name = "SEQ_GENERATOR", sequenceName = SEQUENCE_NAME, allocationSize = 1)
+ @Column(name = "ID")
+ private Long id;
+
+ @Column(name = "ABAC_CODE")
+ private String abacCode;
+
+ @Column(name = "SUMMA_CODE")
+ private String summaCode;
+
+ @Column(name = "DESCRIPTION")
+ private String description;
+
+ @Column(name = "BUDGET_REGIME")
+ private String budgetRegime;
+
+ // Getters only (since @Immutable)
+ public Long getId() {
+ return id;
+ }
+
+ public String getAbacCode() {
+ return abacCode;
+ }
+
+ public String getSummaCode() {
+ return summaCode;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String getBudgetRegime() {
+ return budgetRegime;
+ }
+}
+
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/VBudgetLineJpaEntity.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/VBudgetLineJpaEntity.java
new file mode 100644
index 0000000..54e4479
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/VBudgetLineJpaEntity.java
@@ -0,0 +1,35 @@
+package eu.europa.eeas.erights.backoffice.data.jpa.entity;
+
+import eu.europa.eeas.ananke.core.data.provider.jpa.entity.AbstractJpaEntity;
+import org.hibernate.annotations.Immutable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Immutable
+@Table(name = VBudgetLineJpaEntity.TABLE_NAME)
+public class VBudgetLineJpaEntity extends AbstractJpaEntity {
+
+ public static final String TABLE_NAME = "V_BUDGET_LINES";
+
+ public static final long serialVersionUID = 1L;
+
+ @Id
+ @Column(name = "BUDGET_LINE")
+ private String budgetLine;
+
+ //JOB_ID
+
+ @Override
+ public String getId() {
+ return this.budgetLine;
+ }
+
+ public void setId(String budgetLine) {
+ this.budgetLine = budgetLine;
+ }
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/p2phub/AllowanceDetailJpaEntity.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/p2phub/AllowanceDetailJpaEntity.java
new file mode 100644
index 0000000..dc3a60b
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/p2phub/AllowanceDetailJpaEntity.java
@@ -0,0 +1,61 @@
+package eu.europa.eeas.erights.backoffice.data.jpa.entity.p2phub;
+
+
+import eu.europa.eeas.ananke.core.audit.provider.data.jpa.entity.AbstractAuditableJpaEntity;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.envers.Audited;
+
+import javax.persistence.*;
+
+@Audited
+@Getter
+@Setter
+@Entity
+@Table(name = AllowanceDetailJpaEntity.TABLE_NAME)
+public class AllowanceDetailJpaEntity extends AbstractAuditableJpaEntity {
+
+ public static final String TABLE_NAME = "DETAILS_ALLOWANCE_PAYMENT";
+ public static final String SEQUENCE_NAME = "SEQ_" + TABLE_NAME;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GENERATOR")
+ @SequenceGenerator(name = "SEQ_GENERATOR", sequenceName = SEQUENCE_NAME, allocationSize = 1)
+ @Column(name = "ID")
+ private Long id;
+
+ @Column(name = "REQUEST_DET_ID")
+ private String requestDetId;
+
+ @Column(name = "BP_ID")
+ private String bpId;
+
+ @Column(name = "BANK_ACCOUNT")
+ private String bankAccount;
+
+ @Column(name = "REQUEST_HED_TITLE")
+ private String requestHedTitle;
+
+ @Column(name = "QUANTITY")
+ private String quantity;
+
+ @Column(name = "NET_AMOUNT_LCY")
+ private Float netAmountLcy;
+
+ @Column(name = "CURRENCY_CD_HED")
+ private String currencyCdHed;
+
+ @Column(name = "BUDGET_LINE_HED")
+ private String budgetLineHed;
+
+ @Column(name = "GL_ACCOUNT_HED")
+ private String glAccountHed;
+
+ @Column(name = "EMAIL_NOTIF")
+ private String emailNotif;
+
+ @ManyToOne(optional = false, fetch = FetchType.LAZY)
+ @JoinColumn(name = "ALLOWANCE_PAYMENT_ID", nullable = false,
+ foreignKey = @ForeignKey(name = "FK_DAP_AP"))
+ private AllowancePaymentJpaEntity allowancePayment;
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/p2phub/AllowanceHeaderJpaEntity.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/p2phub/AllowanceHeaderJpaEntity.java
new file mode 100644
index 0000000..4b1f66b
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/p2phub/AllowanceHeaderJpaEntity.java
@@ -0,0 +1,45 @@
+package eu.europa.eeas.erights.backoffice.data.jpa.entity;
+
+import eu.europa.eeas.ananke.core.audit.provider.data.jpa.entity.AbstractAuditableJpaEntity;
+
+import eu.europa.eeas.erights.backoffice.tools.p2phub.PayMethodEnum;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.envers.Audited;
+
+import javax.persistence.*;
+
+@Audited
+@Getter
+@Setter
+@Entity
+@Table(name = AllowanceHeaderJpaEntity.TABLE_NAME)
+public class AllowanceHeaderJpaEntity extends AbstractAuditableJpaEntity {
+
+ public static final String TABLE_NAME = "HEADER_ALLOWANCE_PAYMENT";
+ public static final String SEQUENCE_NAME = "SEQ_" + TABLE_NAME;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GENERATOR")
+ @SequenceGenerator(name = "SEQ_GENERATOR", sequenceName = SEQUENCE_NAME, allocationSize = 1)
+ @Column(name = "ID")
+ private Long id;
+
+ @Column(name = "RUN_ID")
+ private String runId;
+
+ @Column(name = "BATCH_ID")
+ private String batchId;
+
+ @Column(name = "HR_REQUEST_ID")
+ private String hrRequestId;
+
+ @Enumerated(EnumType.STRING)
+ @Column(name = "PAY_METHOD")
+ private PayMethodEnum payMethodEnum;
+
+ @Column(name = "VALUE")
+ private String value;
+
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/p2phub/AllowancePaymentJpaEntity.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/p2phub/AllowancePaymentJpaEntity.java
new file mode 100644
index 0000000..ab37fd5
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/p2phub/AllowancePaymentJpaEntity.java
@@ -0,0 +1,69 @@
+package eu.europa.eeas.erights.backoffice.data.jpa.entity.p2phub;
+
+import eu.europa.eeas.ananke.core.audit.provider.data.jpa.entity.AbstractAuditableJpaEntity;
+import eu.europa.eeas.erights.backoffice.data.jpa.entity.AllowanceHeaderJpaEntity;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.envers.Audited;
+import org.hibernate.envers.NotAudited;
+
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.List;
+
+@Audited
+@Getter
+@Setter
+@Entity
+@Table(name = AllowancePaymentJpaEntity.TABLE_NAME)
+public class AllowancePaymentJpaEntity extends AbstractAuditableJpaEntity {
+
+ public static final String TABLE_NAME = "ALLOWANCE_PAYMENT";
+ public static final String SEQUENCE_NAME = "SEQ_" + TABLE_NAME;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GENERATOR")
+ @SequenceGenerator(name = "SEQ_GENERATOR", sequenceName = SEQUENCE_NAME, allocationSize = 1)
+ @Column(name = "ID")
+ private Long id;
+
+ @Column(name = "REQUEST_ID")
+ private Long requestId;
+
+ @Column(name = "PER_ID")
+ private Long perId;
+
+ @NotAudited
+ @OneToMany(mappedBy = "allowancePayment", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
+ private List orderResponses = new ArrayList<>();
+
+
+ @OneToOne(optional = false, fetch = FetchType.LAZY)
+ @JoinColumn(name = "HEADER_ID", nullable = false,
+ foreignKey = @ForeignKey(name = "FK_AP_HEADER"))
+ private AllowanceHeaderJpaEntity header;
+
+ @OneToMany(mappedBy = "allowancePayment", cascade = CascadeType.ALL, orphanRemoval = true)
+ private List details = new ArrayList<>();
+
+ // Helper methods
+ public void addDetail(AllowanceDetailJpaEntity detail) {
+ details.add(detail);
+ detail.setAllowancePayment(this);
+ }
+
+ public void removeDetail(AllowanceDetailJpaEntity detail) {
+ details.remove(detail);
+ detail.setAllowancePayment(null);
+ }
+
+ public void addOrderResponse(OrderResponseJpaEntity orderResponse) {
+ orderResponses.add(orderResponse);
+ orderResponse.setAllowancePayment(this);
+ }
+
+ public void removeOrderResponse(OrderResponseJpaEntity orderResponse) {
+ orderResponses.remove(orderResponse);
+ orderResponse.setAllowancePayment(null);
+ }
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/p2phub/OrderErrorResponseJpaEntity.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/p2phub/OrderErrorResponseJpaEntity.java
new file mode 100644
index 0000000..c060b62
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/p2phub/OrderErrorResponseJpaEntity.java
@@ -0,0 +1,52 @@
+package eu.europa.eeas.erights.backoffice.data.jpa.entity.p2phub;
+
+import eu.europa.eeas.ananke.core.audit.provider.data.jpa.entity.AbstractAuditableJpaEntity;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.envers.Audited;
+
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.List;
+
+
+@Getter
+@Setter
+@Entity
+@Table(name = OrderErrorResponseJpaEntity.TABLE_NAME)
+public class OrderErrorResponseJpaEntity extends AbstractAuditableJpaEntity {
+
+
+ public static final String TABLE_NAME = "ORDER_ERROR_RESPONSE";
+ public static final String SEQUENCE_NAME = "SEQ_" + TABLE_NAME;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GENERATOR")
+ @SequenceGenerator(name = "SEQ_GENERATOR", sequenceName = SEQUENCE_NAME, allocationSize = 1)
+ @Column(name = "ID")
+ private Long id;
+
+ @Column(name = "ORDER_ID")
+ private Integer orderId;
+
+ @Column(name = "MESSAGE")
+ private String message;
+
+ @Column(name = "REQUEST_ID")
+ private Long requestId;
+
+ @Column(name = "PER_ID")
+ private Long perId;
+
+ @Column(name = "ERROR_CODE")
+ private String errorCode;
+
+ @Column(name = "ERROR_TEXT")
+ private String errorText;
+
+ @Column(name = "JSON_SENT")
+ private String jsonSent;
+
+
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/p2phub/OrderResponseJpaEntity.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/p2phub/OrderResponseJpaEntity.java
new file mode 100644
index 0000000..a138a0d
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/p2phub/OrderResponseJpaEntity.java
@@ -0,0 +1,72 @@
+package eu.europa.eeas.erights.backoffice.data.jpa.entity.p2phub;
+
+import eu.europa.eeas.ananke.core.audit.provider.data.jpa.entity.AbstractAuditableJpaEntity;
+import eu.europa.eeas.ananke.core.data.provider.jpa.entity.AbstractJpaEntity;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.envers.AuditOverride;
+import org.hibernate.envers.Audited;
+
+
+import javax.persistence.*;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+
+@Getter
+@Setter
+@Entity
+@Table(name = OrderResponseJpaEntity.TABLE_NAME)
+public class OrderResponseJpaEntity extends AbstractAuditableJpaEntity {
+
+
+ public static final String TABLE_NAME = "ORDER_RESPONSE";
+ public static final String SEQUENCE_NAME = "SEQ_" + TABLE_NAME;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GENERATOR")
+ @SequenceGenerator(name = "SEQ_GENERATOR", sequenceName = SEQUENCE_NAME, allocationSize = 1)
+ @Column(name = "ID")
+ private Long id;
+
+ @Column(name = "ORDER_ID")
+ private Integer orderId;
+
+ @Column(name = "MESSAGE")
+ private String message;
+
+ @Column(name = "REQUEST_ID")
+ private Long requestId;
+
+ @Column(name = "PER_ID")
+ private Long perId;
+
+ @Column(name = "ORDER_STATUS")
+ private String orderStatus;
+
+ @Column(name = "ORDER_COMMENT")
+ private String orderComment;
+
+ @Column(name = "LAST_MODIFICATION_DATE") // DATE
+ private LocalDateTime lastModificationDate;
+
+ @Column(name = "PAYMENT_DIRECTIVE_REFERENCE")
+ private String paymentDirectiveReference;
+
+ @Column(name = "JSON_SENT")
+ private String jsonSent;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "ALLOWANCE_PAYMENT_ID", nullable = false,
+ foreignKey = @ForeignKey(name = "FK_ORDER_RESPONSE_ALLOWANCE_PAYMENT"))
+ private AllowancePaymentJpaEntity allowancePayment;
+
+
+ // One OrderResponse can have many statuses
+ @OneToMany(mappedBy = "orderResponse", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
+ private List orderStatuses = new ArrayList<>();
+
+
+}
diff --git a/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/p2phub/OrderStatusResponseJpaEntity.java b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/p2phub/OrderStatusResponseJpaEntity.java
new file mode 100644
index 0000000..274ca92
--- /dev/null
+++ b/e-rights-back-office/src/main/java/eu/europa/eeas/erights/backoffice/data/jpa/entity/p2phub/OrderStatusResponseJpaEntity.java
@@ -0,0 +1,50 @@
+package eu.europa.eeas.erights.backoffice.data.jpa.entity.p2phub;
+
+import eu.europa.eeas.ananke.core.data.provider.jpa.entity.AbstractJpaEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.*;
+import java.time.LocalDateTime;
+
+
+@Getter
+@Setter
+@Entity
+@Table(name = OrderStatusResponseJpaEntity.TABLE_NAME)
+public class OrderStatusResponseJpaEntity extends AbstractJpaEntity