From 86b38e2d037fbb5b1da9ed4e9e05f0c6762f771c Mon Sep 17 00:00:00 2001
From: davisilva <84607533+Megueutu@users.noreply.github.com>
Date: Sat, 29 Aug 2026 19:15:00 -0300
Subject: [PATCH 1/8] Feat/cloudnary n i18n (#32)
* feat:
add photo management with Cloudinary integration
- Created UserPhoto entity and corresponding repository.
- Introduced PhotoType enum for categorizing photo types.
- Developed services for managing company, local unit, model, and user photos, including upload and delete functionalities.
- Implemented CloudinaryService for handling file uploads and deletions.
- Added response DTOs for various photo types.
- Enhanced EnergyBillService to support photo attachment and removal.
- Updated CompanyService and LocalUnitService to include photo repository checks during deletions.
- Configured application properties for Cloudinary settings and increased file upload limits.
* Merge branch 'feat/cloudnaryPhotos' of https://github.com/Solierrr/api-core
* chore: updating gitignore for sonarqube cloud
* feat: add panel type and translation status enums
* refactor: replace model dimension field with width, length and panel type
* feat: add slug field to company and technician
* feat: add automatic multi-language translation for offers via google translate
* chore: add google translate api key env var
* fix: add missing openapi interfaces for photo controllers
* fix: harden google translate response parsing against null and malformed responses
* fix: corrige build e quality gate do CI (SonarCloud)
- adiciona metodos attachPhoto/removePhoto faltantes na interface EnergyBillOpenApi, corrigindo erro de compilacao
- restaura dependencia h2 (removida por engano ao mesclar cloudinary-http5), corrigindo falha nos testes
- agrupa alternancia no regex de EDGE_HYPHENS em SlugUtil para eliminar ambiguidade de precedencia (S5850)
- reduz limite de upload multipart de 10MB para 8MB para atender ao rating de seguranca do SonarCloud (S5693)
---------
Co-authored-by: ArthurMachado2501
---
.env.example | 3 +-
.gitignore | 217 +++++++++---------
pom.xml | 10 +
.../persistence/config/AsyncConfig.java | 9 +
.../persistence/config/CloudinaryConfig.java | 22 ++
.../config/CloudinaryProperties.java | 52 +++++
.../config/GoogleTranslateConfig.java | 18 ++
.../config/GoogleTranslateProperties.java | 22 ++
.../controller/CompanyPhotoController.java | 51 ++++
.../controller/EnergyBillController.java | 18 ++
.../controller/LocalUnitPhotoController.java | 51 ++++
.../controller/ModelPhotoController.java | 51 ++++
.../controller/UserPhotoController.java | 51 ++++
.../persistence/domain/entity/Company.java | 3 +
.../domain/entity/CompanyPhoto.java | 38 +++
.../persistence/domain/entity/EnergyBill.java | 6 +
.../domain/entity/LocalUnitPhoto.java | 33 +++
.../persistence/domain/entity/Model.java | 12 +-
.../persistence/domain/entity/ModelPhoto.java | 33 +++
.../persistence/domain/entity/Offer.java | 22 ++
.../domain/entity/OfferTranslation.java | 35 +++
.../persistence/domain/entity/Technician.java | 3 +
.../persistence/domain/entity/UserPhoto.java | 38 +++
.../persistence/domain/enums/PanelType.java | 7 +
.../persistence/domain/enums/PhotoType.java | 6 +
.../domain/enums/TranslationStatus.java | 7 +
.../dto/request/ModelRequestDTO.java | 12 +-
.../dto/request/OfferRequestDTO.java | 18 ++
.../dto/response/CompanyPhotoResponseDTO.java | 20 ++
.../dto/response/CompanyResponseDTO.java | 1 +
.../dto/response/EnergyBillResponseDTO.java | 1 +
.../response/LocalUnitPhotoResponseDTO.java | 18 ++
.../dto/response/ModelPhotoResponseDTO.java | 18 ++
.../dto/response/ModelResponseDTO.java | 5 +-
.../dto/response/OfferResponseDTO.java | 8 +
.../response/OfferTranslationResponseDTO.java | 15 ++
.../dto/response/TechnicianResponseDTO.java | 1 +
.../dto/response/UserPhotoResponseDTO.java | 20 ++
.../exception/StorageException.java | 16 ++
.../openapi/CompanyPhotoOpenApi.java | 42 ++++
.../openapi/EnergyBillOpenApi.java | 18 ++
.../openapi/LocalUnitPhotoOpenApi.java | 41 ++++
.../openapi/ModelPhotoOpenApi.java | 41 ++++
.../persistence/openapi/UserPhotoOpenApi.java | 42 ++++
.../repository/CompanyPhotoRepository.java | 19 ++
.../repository/CompanyRepository.java | 4 +
.../repository/LocalUnitPhotoRepository.java | 18 ++
.../repository/ModelPhotoRepository.java | 18 ++
.../repository/OfferRepository.java | 2 +
.../OfferTranslationRepository.java | 17 ++
.../repository/TechnicianRepository.java | 5 +
.../repository/UserPhotoRepository.java | 19 ++
.../rbac/RbacAuthorizationService.java | 15 ++
.../service/CloudinaryService.java | 108 +++++++++
.../service/CompanyPhotoService.java | 113 +++++++++
.../persistence/service/CompanyService.java | 23 +-
.../service/EnergyBillService.java | 75 +++++-
.../service/GoogleTranslateService.java | 100 ++++++++
.../persistence/service/InventoryService.java | 4 +-
.../service/LocalUnitPhotoService.java | 104 +++++++++
.../persistence/service/LocalUnitService.java | 9 +-
.../service/ModelPhotoService.java | 96 ++++++++
.../persistence/service/ModelService.java | 31 ++-
.../persistence/service/OfferService.java | 85 ++++++-
.../service/OfferTranslationService.java | 106 +++++++++
.../service/ProposalItemService.java | 4 +-
.../service/TechnicianService.java | 14 ++
.../persistence/service/UserPhotoService.java | 111 +++++++++
.../persistence/service/UserService.java | 7 +
.../solaria/persistence/util/SlugUtil.java | 29 +++
.../persistence/util/SupportedLocales.java | 43 ++++
...itional-spring-configuration-metadata.json | 5 +
src/main/resources/application.properties | 10 +
73 files changed, 2214 insertions(+), 135 deletions(-)
create mode 100644 src/main/java/com/solaria/persistence/config/AsyncConfig.java
create mode 100644 src/main/java/com/solaria/persistence/config/CloudinaryConfig.java
create mode 100644 src/main/java/com/solaria/persistence/config/CloudinaryProperties.java
create mode 100644 src/main/java/com/solaria/persistence/config/GoogleTranslateConfig.java
create mode 100644 src/main/java/com/solaria/persistence/config/GoogleTranslateProperties.java
create mode 100644 src/main/java/com/solaria/persistence/controller/CompanyPhotoController.java
create mode 100644 src/main/java/com/solaria/persistence/controller/LocalUnitPhotoController.java
create mode 100644 src/main/java/com/solaria/persistence/controller/ModelPhotoController.java
create mode 100644 src/main/java/com/solaria/persistence/controller/UserPhotoController.java
create mode 100644 src/main/java/com/solaria/persistence/domain/entity/CompanyPhoto.java
create mode 100644 src/main/java/com/solaria/persistence/domain/entity/LocalUnitPhoto.java
create mode 100644 src/main/java/com/solaria/persistence/domain/entity/ModelPhoto.java
create mode 100644 src/main/java/com/solaria/persistence/domain/entity/OfferTranslation.java
create mode 100644 src/main/java/com/solaria/persistence/domain/entity/UserPhoto.java
create mode 100644 src/main/java/com/solaria/persistence/domain/enums/PanelType.java
create mode 100644 src/main/java/com/solaria/persistence/domain/enums/PhotoType.java
create mode 100644 src/main/java/com/solaria/persistence/domain/enums/TranslationStatus.java
create mode 100644 src/main/java/com/solaria/persistence/dto/response/CompanyPhotoResponseDTO.java
create mode 100644 src/main/java/com/solaria/persistence/dto/response/LocalUnitPhotoResponseDTO.java
create mode 100644 src/main/java/com/solaria/persistence/dto/response/ModelPhotoResponseDTO.java
create mode 100644 src/main/java/com/solaria/persistence/dto/response/OfferTranslationResponseDTO.java
create mode 100644 src/main/java/com/solaria/persistence/dto/response/UserPhotoResponseDTO.java
create mode 100644 src/main/java/com/solaria/persistence/exception/StorageException.java
create mode 100644 src/main/java/com/solaria/persistence/openapi/CompanyPhotoOpenApi.java
create mode 100644 src/main/java/com/solaria/persistence/openapi/LocalUnitPhotoOpenApi.java
create mode 100644 src/main/java/com/solaria/persistence/openapi/ModelPhotoOpenApi.java
create mode 100644 src/main/java/com/solaria/persistence/openapi/UserPhotoOpenApi.java
create mode 100644 src/main/java/com/solaria/persistence/repository/CompanyPhotoRepository.java
create mode 100644 src/main/java/com/solaria/persistence/repository/LocalUnitPhotoRepository.java
create mode 100644 src/main/java/com/solaria/persistence/repository/ModelPhotoRepository.java
create mode 100644 src/main/java/com/solaria/persistence/repository/OfferTranslationRepository.java
create mode 100644 src/main/java/com/solaria/persistence/repository/UserPhotoRepository.java
create mode 100644 src/main/java/com/solaria/persistence/service/CloudinaryService.java
create mode 100644 src/main/java/com/solaria/persistence/service/CompanyPhotoService.java
create mode 100644 src/main/java/com/solaria/persistence/service/GoogleTranslateService.java
create mode 100644 src/main/java/com/solaria/persistence/service/LocalUnitPhotoService.java
create mode 100644 src/main/java/com/solaria/persistence/service/ModelPhotoService.java
create mode 100644 src/main/java/com/solaria/persistence/service/OfferTranslationService.java
create mode 100644 src/main/java/com/solaria/persistence/service/UserPhotoService.java
create mode 100644 src/main/java/com/solaria/persistence/util/SlugUtil.java
create mode 100644 src/main/java/com/solaria/persistence/util/SupportedLocales.java
diff --git a/.env.example b/.env.example
index 660ed5e..cdd548d 100644
--- a/.env.example
+++ b/.env.example
@@ -1 +1,2 @@
-REDIS_URL=rediss://default:SENHA@SEU-HOST-UPSTASH:6379
\ No newline at end of file
+REDIS_URL=rediss://default:SENHA@SEU-HOST-UPSTASH:6379
+GOOGLE_TRANSLATE_API_KEY=SUA-CHAVE-DA-GOOGLE-TRANSLATE-API
diff --git a/.gitignore b/.gitignore
index e80ad9a..3f32aa9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,107 +1,110 @@
-# Environment variables / secrets
-.env
-.env.*
-!.env.example
-
-# VS Code
-.vscode/
-!.vscode/settings.json
-!.vscode/extensions.json
-
-# JetBrains
-.idea/
-*.iml
-*.iws
-*.ipr
-
-# Eclipse
-.classpath
-.project
-.settings/
-.factorypath
-
-# NetBeans
-/nbproject/private/
-/nbbuild/
-/dist/
-/.nb-gradle/
-
-# Visual Studio
-.vs/
-*.user
-*.userosscache
-*.suo
-*.userprefs
-
-# Visual Studio Code / Cursor
-.cursor/
-
-# Claude Code
-.claude/
-
-# Fleet
-.fleet/
-
-# Sublime Text
-*.sublime-workspace
-*.sublime-project
-
-# Vim
-*.swp
-*.swo
-*~
-
-# Emacs
-*~
-\#*\#
-
-# macOS
-.DS_Store
-
-# Windows
-Thumbs.db
-Desktop.ini
-
-# Linux
-.directory
-
-# Compiled class files / packages
-*.class
-*.jar
-*.war
-*.nar
-*.ear
-
-# Maven
-target/
-pom.xml.tag
-pom.xml.releaseBackup
-pom.xml.versionsBackup
-pom.xml.next
-release.properties
-dependency-reduced-pom.xml
-buildNumber.properties
-.mvn/wrapper/maven-wrapper.jar
-.mvn/timing.properties
-
-# Gradle
-.gradle/
-!gradle/wrapper/gradle-wrapper.jar
-!gradle/wrapper/gradle-wrapper.properties
-
-# Kotlin
-.kotlin/
-
-# Logs / crash dumps
-*.log
-hs_err_pid*
-replay_pid*
-
-# HELP.md (gerado pelo Spring Initializr)
-HELP.md
-
-# Project-specific: keep generated sources tracked under src/main and src/test
-!**/src/main/**/target/
-!**/src/test/**/target/
-!**/src/main/**/build/
-!**/src/test/**/build/
+# Environment variables / secrets
+.env
+.env.*
+!.env.example
+
+# VS Code
+.vscode/
+!.vscode/settings.json
+!.vscode/extensions.json
+
+# JetBrains
+.idea/
+*.iml
+*.iws
+*.ipr
+
+# Eclipse
+.classpath
+.project
+.settings/
+.factorypath
+
+# NetBeans
+/nbproject/private/
+/nbbuild/
+/dist/
+/.nb-gradle/
+
+# Visual Studio
+.vs/
+*.user
+*.userosscache
+*.suo
+*.userprefs
+
+# Visual Studio Code / Cursor
+.cursor/
+
+# SonarQube
+.sonar/
+
+# Claude Code
+.claude/
+
+# Fleet
+.fleet/
+
+# Sublime Text
+*.sublime-workspace
+*.sublime-project
+
+# Vim
+*.swp
+*.swo
+*~
+
+# Emacs
+*~
+\#*\#
+
+# macOS
+.DS_Store
+
+# Windows
+Thumbs.db
+Desktop.ini
+
+# Linux
+.directory
+
+# Compiled class files / packages
+*.class
+*.jar
+*.war
+*.nar
+*.ear
+
+# Maven
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/wrapper/maven-wrapper.jar
+.mvn/timing.properties
+
+# Gradle
+.gradle/
+!gradle/wrapper/gradle-wrapper.jar
+!gradle/wrapper/gradle-wrapper.properties
+
+# Kotlin
+.kotlin/
+
+# Logs / crash dumps
+*.log
+hs_err_pid*
+replay_pid*
+
+# HELP.md (gerado pelo Spring Initializr)
+HELP.md
+
+# Project-specific: keep generated sources tracked under src/main and src/test
+!**/src/main/**/target/
+!**/src/test/**/target/
+!**/src/main/**/build/
+!**/src/test/**/build/
diff --git a/pom.xml b/pom.xml
index e4de2a1..43ef4c0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -34,6 +34,11 @@
org.springframework.boot
spring-boot-starter-data-jpa
+
+ org.postgresql
+ postgresql
+ runtime
+
org.springframework.boot
spring-boot-starter-web
@@ -90,6 +95,11 @@
org.springframework.boot
spring-boot-starter-data-redis
+
+ com.cloudinary
+ cloudinary-http5
+ 2.3.0
+
com.h2database
h2
diff --git a/src/main/java/com/solaria/persistence/config/AsyncConfig.java b/src/main/java/com/solaria/persistence/config/AsyncConfig.java
new file mode 100644
index 0000000..bb99e72
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/config/AsyncConfig.java
@@ -0,0 +1,9 @@
+package com.solaria.persistence.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+@Configuration
+@EnableAsync
+public class AsyncConfig {
+}
diff --git a/src/main/java/com/solaria/persistence/config/CloudinaryConfig.java b/src/main/java/com/solaria/persistence/config/CloudinaryConfig.java
new file mode 100644
index 0000000..d25dd93
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/config/CloudinaryConfig.java
@@ -0,0 +1,22 @@
+package com.solaria.persistence.config;
+
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.cloudinary.Cloudinary;
+import com.cloudinary.utils.ObjectUtils;
+
+@Configuration
+@EnableConfigurationProperties(CloudinaryProperties.class)
+public class CloudinaryConfig {
+
+ @Bean
+ public Cloudinary cloudinary(CloudinaryProperties properties) {
+ return new Cloudinary(ObjectUtils.asMap(
+ "cloud_name", properties.getCloudName(),
+ "api_key", properties.getApiKey(),
+ "api_secret", properties.getApiSecret(),
+ "secure", true));
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/config/CloudinaryProperties.java b/src/main/java/com/solaria/persistence/config/CloudinaryProperties.java
new file mode 100644
index 0000000..ff5cb44
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/config/CloudinaryProperties.java
@@ -0,0 +1,52 @@
+package com.solaria.persistence.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * Credenciais e configuração de organização de pastas do Cloudinary.
+ */
+
+// Habilita essa classe com as variaveis em application.properties com prefixo cloudinary
+@ConfigurationProperties(prefix = "cloudinary")
+public class CloudinaryProperties {
+
+ private String cloudName;
+
+ private String apiKey;
+
+ private String apiSecret;
+
+ private String folderPrefix = "solier";
+
+ public String getCloudName() {
+ return cloudName;
+ }
+
+ public void setCloudName(String cloudName) {
+ this.cloudName = cloudName;
+ }
+
+ public String getApiKey() {
+ return apiKey;
+ }
+
+ public void setApiKey(String apiKey) {
+ this.apiKey = apiKey;
+ }
+
+ public String getApiSecret() {
+ return apiSecret;
+ }
+
+ public void setApiSecret(String apiSecret) {
+ this.apiSecret = apiSecret;
+ }
+
+ public String getFolderPrefix() {
+ return folderPrefix;
+ }
+
+ public void setFolderPrefix(String folderPrefix) {
+ this.folderPrefix = folderPrefix;
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/config/GoogleTranslateConfig.java b/src/main/java/com/solaria/persistence/config/GoogleTranslateConfig.java
new file mode 100644
index 0000000..268b9f9
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/config/GoogleTranslateConfig.java
@@ -0,0 +1,18 @@
+package com.solaria.persistence.config;
+
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestClient;
+
+@Configuration
+@EnableConfigurationProperties(GoogleTranslateProperties.class)
+public class GoogleTranslateConfig {
+
+ @Bean
+ public RestClient googleTranslateRestClient() {
+ return RestClient.builder()
+ .baseUrl("https://translation.googleapis.com/language/translate/v2")
+ .build();
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/config/GoogleTranslateProperties.java b/src/main/java/com/solaria/persistence/config/GoogleTranslateProperties.java
new file mode 100644
index 0000000..ae3e279
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/config/GoogleTranslateProperties.java
@@ -0,0 +1,22 @@
+package com.solaria.persistence.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * Credenciais da Google Cloud Translation API (v2).
+ */
+
+// Habilita essa classe com as variaveis em application.properties com prefixo google-translate
+@ConfigurationProperties(prefix = "google-translate")
+public class GoogleTranslateProperties {
+
+ private String apiKey;
+
+ public String getApiKey() {
+ return apiKey;
+ }
+
+ public void setApiKey(String apiKey) {
+ this.apiKey = apiKey;
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/controller/CompanyPhotoController.java b/src/main/java/com/solaria/persistence/controller/CompanyPhotoController.java
new file mode 100644
index 0000000..44800f2
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/controller/CompanyPhotoController.java
@@ -0,0 +1,51 @@
+package com.solaria.persistence.controller;
+
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.solaria.persistence.domain.enums.PhotoType;
+import com.solaria.persistence.dto.response.CompanyPhotoResponseDTO;
+import com.solaria.persistence.openapi.CompanyPhotoOpenApi;
+import com.solaria.persistence.service.CompanyPhotoService;
+
+import lombok.RequiredArgsConstructor;
+
+@RestController
+@RequestMapping("/api/company-photos")
+@RequiredArgsConstructor
+public class CompanyPhotoController implements CompanyPhotoOpenApi {
+
+ private final CompanyPhotoService companyPhotoService;
+
+ @Override
+ @PutMapping(value = "/company/{companyId}/type/{type}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ public ResponseEntity upload(@PathVariable UUID companyId,
+ @PathVariable PhotoType type,
+ @RequestParam("file") MultipartFile file) {
+ return ResponseEntity.ok(companyPhotoService.upload(companyId, type, file));
+ }
+
+ @Override
+ @DeleteMapping("/company/{companyId}/type/{type}")
+ public ResponseEntity delete(@PathVariable UUID companyId, @PathVariable PhotoType type) {
+ companyPhotoService.delete(companyId, type);
+ return ResponseEntity.noContent().build();
+ }
+
+ @Override
+ @GetMapping("/company/{companyId}")
+ public ResponseEntity> findByCompany(@PathVariable UUID companyId) {
+ return ResponseEntity.ok(companyPhotoService.findByCompany(companyId));
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/controller/EnergyBillController.java b/src/main/java/com/solaria/persistence/controller/EnergyBillController.java
index f6fe35a..3415e7e 100644
--- a/src/main/java/com/solaria/persistence/controller/EnergyBillController.java
+++ b/src/main/java/com/solaria/persistence/controller/EnergyBillController.java
@@ -4,14 +4,18 @@
import java.util.List;
import java.util.UUID;
+import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
import com.solaria.persistence.dto.request.EnergyBillRequestDTO;
import com.solaria.persistence.dto.response.EnergyBillResponseDTO;
@@ -53,4 +57,18 @@ public ResponseEntity findById(@PathVariable UUID id, @Pa
public ResponseEntity> findByLocalUnit(@PathVariable UUID localUnitId) {
return ResponseEntity.ok(energyBillService.findByLocalUnit(localUnitId));
}
+
+ @Override
+ @PutMapping(value = "/{id}/photo", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ public ResponseEntity attachPhoto(@PathVariable UUID id,
+ @RequestParam("file") MultipartFile file) {
+ return ResponseEntity.ok(energyBillService.attachPhoto(id, file));
+ }
+
+ @Override
+ @DeleteMapping("/{id}/photo")
+ public ResponseEntity removePhoto(@PathVariable UUID id) {
+ energyBillService.removePhoto(id);
+ return ResponseEntity.noContent().build();
+ }
}
diff --git a/src/main/java/com/solaria/persistence/controller/LocalUnitPhotoController.java b/src/main/java/com/solaria/persistence/controller/LocalUnitPhotoController.java
new file mode 100644
index 0000000..89e85e8
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/controller/LocalUnitPhotoController.java
@@ -0,0 +1,51 @@
+package com.solaria.persistence.controller;
+
+import java.net.URI;
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.solaria.persistence.dto.response.LocalUnitPhotoResponseDTO;
+import com.solaria.persistence.openapi.LocalUnitPhotoOpenApi;
+import com.solaria.persistence.service.LocalUnitPhotoService;
+
+import lombok.RequiredArgsConstructor;
+
+@RestController
+@RequestMapping("/api/local-unit-photos")
+@RequiredArgsConstructor
+public class LocalUnitPhotoController implements LocalUnitPhotoOpenApi {
+
+ private final LocalUnitPhotoService localUnitPhotoService;
+
+ @Override
+ @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ public ResponseEntity upload(@RequestParam("localUnitId") UUID localUnitId,
+ @RequestParam("file") MultipartFile file) {
+ LocalUnitPhotoResponseDTO response = localUnitPhotoService.upload(localUnitId, file);
+ return ResponseEntity.created(URI.create("/api/local-unit-photos/" + response.getId())).body(response);
+ }
+
+ @Override
+ @DeleteMapping("/{id}")
+ public ResponseEntity delete(@PathVariable UUID id) {
+ localUnitPhotoService.delete(id);
+ return ResponseEntity.noContent().build();
+ }
+
+ @Override
+ @GetMapping("/local-unit/{localUnitId}")
+ public ResponseEntity> findByLocalUnit(@PathVariable UUID localUnitId) {
+ return ResponseEntity.ok(localUnitPhotoService.findByLocalUnit(localUnitId));
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/controller/ModelPhotoController.java b/src/main/java/com/solaria/persistence/controller/ModelPhotoController.java
new file mode 100644
index 0000000..c2a3bc2
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/controller/ModelPhotoController.java
@@ -0,0 +1,51 @@
+package com.solaria.persistence.controller;
+
+import java.net.URI;
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.solaria.persistence.dto.response.ModelPhotoResponseDTO;
+import com.solaria.persistence.openapi.ModelPhotoOpenApi;
+import com.solaria.persistence.service.ModelPhotoService;
+
+import lombok.RequiredArgsConstructor;
+
+@RestController
+@RequestMapping("/api/model-photos")
+@RequiredArgsConstructor
+public class ModelPhotoController implements ModelPhotoOpenApi {
+
+ private final ModelPhotoService modelPhotoService;
+
+ @Override
+ @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ public ResponseEntity upload(@RequestParam("modelId") UUID modelId,
+ @RequestParam("file") MultipartFile file) {
+ ModelPhotoResponseDTO response = modelPhotoService.upload(modelId, file);
+ return ResponseEntity.created(URI.create("/api/model-photos/" + response.getId())).body(response);
+ }
+
+ @Override
+ @DeleteMapping("/{id}")
+ public ResponseEntity delete(@PathVariable UUID id) {
+ modelPhotoService.delete(id);
+ return ResponseEntity.noContent().build();
+ }
+
+ @Override
+ @GetMapping("/model/{modelId}")
+ public ResponseEntity> findByModel(@PathVariable UUID modelId) {
+ return ResponseEntity.ok(modelPhotoService.findByModel(modelId));
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/controller/UserPhotoController.java b/src/main/java/com/solaria/persistence/controller/UserPhotoController.java
new file mode 100644
index 0000000..ddbc14a
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/controller/UserPhotoController.java
@@ -0,0 +1,51 @@
+package com.solaria.persistence.controller;
+
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.solaria.persistence.domain.enums.PhotoType;
+import com.solaria.persistence.dto.response.UserPhotoResponseDTO;
+import com.solaria.persistence.openapi.UserPhotoOpenApi;
+import com.solaria.persistence.service.UserPhotoService;
+
+import lombok.RequiredArgsConstructor;
+
+@RestController
+@RequestMapping("/api/user-photos")
+@RequiredArgsConstructor
+public class UserPhotoController implements UserPhotoOpenApi {
+
+ private final UserPhotoService userPhotoService;
+
+ @Override
+ @PutMapping(value = "/user/{userId}/type/{type}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ public ResponseEntity upload(@PathVariable UUID userId,
+ @PathVariable PhotoType type,
+ @RequestParam("file") MultipartFile file) {
+ return ResponseEntity.ok(userPhotoService.upload(userId, type, file));
+ }
+
+ @Override
+ @DeleteMapping("/user/{userId}/type/{type}")
+ public ResponseEntity delete(@PathVariable UUID userId, @PathVariable PhotoType type) {
+ userPhotoService.delete(userId, type);
+ return ResponseEntity.noContent().build();
+ }
+
+ @Override
+ @GetMapping("/user/{userId}")
+ public ResponseEntity> findByUser(@PathVariable UUID userId) {
+ return ResponseEntity.ok(userPhotoService.findByUser(userId));
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Company.java b/src/main/java/com/solaria/persistence/domain/entity/Company.java
index 5f600a5..f7477d7 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Company.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/Company.java
@@ -42,4 +42,7 @@ public class Company {
@Column(name = "corporate_name", length = 120, nullable = false)
private String corporateName;
+
+ @Column(name = "slug", length = 160, nullable = false, unique = true)
+ private String slug;
}
diff --git a/src/main/java/com/solaria/persistence/domain/entity/CompanyPhoto.java b/src/main/java/com/solaria/persistence/domain/entity/CompanyPhoto.java
new file mode 100644
index 0000000..25e4a56
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/domain/entity/CompanyPhoto.java
@@ -0,0 +1,38 @@
+package com.solaria.persistence.domain.entity;
+
+import com.solaria.persistence.domain.enums.PhotoType;
+import jakarta.persistence.*;
+import lombok.*;
+
+import java.time.OffsetDateTime;
+import java.util.UUID;
+
+@Entity
+@Table(name = "company_photo")
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class CompanyPhoto {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.UUID)
+ private UUID id;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_company", nullable = false)
+ private Company company;
+
+ @Enumerated(EnumType.STRING)
+ @Column(name = "type", nullable = false)
+ private PhotoType type;
+
+ @Column(name = "url", nullable = false)
+ private String url;
+
+ @Column(name = "public_id", nullable = false)
+ private String publicId;
+
+ @Column(name = "created_at", nullable = false)
+ private OffsetDateTime createdAt;
+}
diff --git a/src/main/java/com/solaria/persistence/domain/entity/EnergyBill.java b/src/main/java/com/solaria/persistence/domain/entity/EnergyBill.java
index 9390074..7a135eb 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/EnergyBill.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/EnergyBill.java
@@ -27,4 +27,10 @@ public class EnergyBill {
@Column(name = "price", nullable = false)
private BigDecimal price;
+
+ @Column(name = "photo_url")
+ private String photoUrl;
+
+ @Column(name = "photo_public_id")
+ private String photoPublicId;
}
diff --git a/src/main/java/com/solaria/persistence/domain/entity/LocalUnitPhoto.java b/src/main/java/com/solaria/persistence/domain/entity/LocalUnitPhoto.java
new file mode 100644
index 0000000..6c5f446
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/domain/entity/LocalUnitPhoto.java
@@ -0,0 +1,33 @@
+package com.solaria.persistence.domain.entity;
+
+import jakarta.persistence.*;
+import lombok.*;
+
+import java.time.OffsetDateTime;
+import java.util.UUID;
+
+@Entity
+@Table(name = "local_unit_photo")
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class LocalUnitPhoto {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.UUID)
+ private UUID id;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_local_unit", nullable = false)
+ private LocalUnit localUnit;
+
+ @Column(name = "url", nullable = false)
+ private String url;
+
+ @Column(name = "public_id", nullable = false)
+ private String publicId;
+
+ @Column(name = "created_at", nullable = false)
+ private OffsetDateTime createdAt;
+}
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Model.java b/src/main/java/com/solaria/persistence/domain/entity/Model.java
index 4916345..020a6fc 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Model.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/Model.java
@@ -1,6 +1,7 @@
package com.solaria.persistence.domain.entity;
import com.solaria.persistence.domain.enums.ModelStatus;
+import com.solaria.persistence.domain.enums.PanelType;
import jakarta.persistence.*;
import lombok.*;
@@ -25,14 +26,21 @@ public class Model {
@Column(name = "model", nullable = false)
private String model;
+ @Enumerated(EnumType.STRING)
+ @Column(name = "type", nullable = false)
+ private PanelType type;
+
@Column(name = "power_wp", nullable = false)
private BigDecimal powerWp;
@Column(name = "efficiency", nullable = false)
private BigDecimal efficiency;
- @Column(name = "dimension", nullable = false)
- private BigDecimal dimension;
+ @Column(name = "width", nullable = false)
+ private BigDecimal width;
+
+ @Column(name = "length", nullable = false)
+ private BigDecimal length;
@Column(name = "weight", nullable = false)
private BigDecimal weight;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/ModelPhoto.java b/src/main/java/com/solaria/persistence/domain/entity/ModelPhoto.java
new file mode 100644
index 0000000..d65ae07
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/domain/entity/ModelPhoto.java
@@ -0,0 +1,33 @@
+package com.solaria.persistence.domain.entity;
+
+import jakarta.persistence.*;
+import lombok.*;
+
+import java.time.OffsetDateTime;
+import java.util.UUID;
+
+@Entity
+@Table(name = "model_photo")
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ModelPhoto {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.UUID)
+ private UUID id;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_model", nullable = false)
+ private Model model;
+
+ @Column(name = "url", nullable = false)
+ private String url;
+
+ @Column(name = "public_id", nullable = false)
+ private String publicId;
+
+ @Column(name = "created_at", nullable = false)
+ private OffsetDateTime createdAt;
+}
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Offer.java b/src/main/java/com/solaria/persistence/domain/entity/Offer.java
index d0a8dbb..ca8fcdf 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Offer.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/Offer.java
@@ -1,10 +1,13 @@
package com.solaria.persistence.domain.entity;
+import com.solaria.persistence.domain.enums.TranslationStatus;
import jakarta.persistence.*;
import lombok.*;
+import org.hibernate.annotations.ColumnDefault;
import java.math.BigDecimal;
import java.time.OffsetDateTime;
+import java.util.List;
import java.util.UUID;
@Entity
@@ -35,4 +38,23 @@ public class Offer {
@Column(name = "expiration_date")
private OffsetDateTime expirationDate;
+
+ @Column(name = "slug", length = 160, nullable = false, unique = true)
+ private String slug;
+
+ @Column(name = "discount_percentage")
+ private BigDecimal discountPercentage;
+
+ @ElementCollection
+ @CollectionTable(name = "offer_service_region", joinColumns = @JoinColumn(name = "fk_offer"))
+ @Column(name = "region", length = 120)
+ private List serviceRegions;
+
+ @Column(name = "source_locale", length = 10)
+ private String sourceLocale;
+
+ @Enumerated(EnumType.STRING)
+ @Column(name = "translation_status", nullable = false)
+ @ColumnDefault("'PENDING'")
+ private TranslationStatus translationStatus = TranslationStatus.PENDING;
}
diff --git a/src/main/java/com/solaria/persistence/domain/entity/OfferTranslation.java b/src/main/java/com/solaria/persistence/domain/entity/OfferTranslation.java
new file mode 100644
index 0000000..0ddcf2e
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/domain/entity/OfferTranslation.java
@@ -0,0 +1,35 @@
+package com.solaria.persistence.domain.entity;
+
+import jakarta.persistence.*;
+import lombok.*;
+
+import java.util.UUID;
+
+@Entity
+@Table(name = "offer_translation", uniqueConstraints = @UniqueConstraint(columnNames = {"fk_offer", "locale"}))
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class OfferTranslation {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.UUID)
+ private UUID id;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_offer", nullable = false)
+ private Offer offer;
+
+ @Column(name = "locale", length = 10, nullable = false)
+ private String locale;
+
+ @Column(name = "title", length = 160, nullable = false)
+ private String title;
+
+ @Column(name = "description", columnDefinition = "text", nullable = false)
+ private String description;
+
+ @Column(name = "details", columnDefinition = "text")
+ private String details;
+}
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Technician.java b/src/main/java/com/solaria/persistence/domain/entity/Technician.java
index 04a44bc..954c837 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Technician.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/Technician.java
@@ -23,4 +23,7 @@ public class Technician {
@Column(name = "crea", nullable = false)
private String crea;
+
+ @Column(name = "slug", length = 160, nullable = false, unique = true)
+ private String slug;
}
diff --git a/src/main/java/com/solaria/persistence/domain/entity/UserPhoto.java b/src/main/java/com/solaria/persistence/domain/entity/UserPhoto.java
new file mode 100644
index 0000000..4e775e5
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/domain/entity/UserPhoto.java
@@ -0,0 +1,38 @@
+package com.solaria.persistence.domain.entity;
+
+import com.solaria.persistence.domain.enums.PhotoType;
+import jakarta.persistence.*;
+import lombok.*;
+
+import java.time.OffsetDateTime;
+import java.util.UUID;
+
+@Entity
+@Table(name = "user_photo")
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserPhoto {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.UUID)
+ private UUID id;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "fk_user", nullable = false)
+ private User user;
+
+ @Enumerated(EnumType.STRING)
+ @Column(name = "type", nullable = false)
+ private PhotoType type;
+
+ @Column(name = "url", nullable = false)
+ private String url;
+
+ @Column(name = "public_id", nullable = false)
+ private String publicId;
+
+ @Column(name = "created_at", nullable = false)
+ private OffsetDateTime createdAt;
+}
diff --git a/src/main/java/com/solaria/persistence/domain/enums/PanelType.java b/src/main/java/com/solaria/persistence/domain/enums/PanelType.java
new file mode 100644
index 0000000..1c456f7
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/domain/enums/PanelType.java
@@ -0,0 +1,7 @@
+package com.solaria.persistence.domain.enums;
+
+public enum PanelType {
+ MONOCRYSTALLINE,
+ POLYCRYSTALLINE,
+ THIN_FILM
+}
diff --git a/src/main/java/com/solaria/persistence/domain/enums/PhotoType.java b/src/main/java/com/solaria/persistence/domain/enums/PhotoType.java
new file mode 100644
index 0000000..3452b92
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/domain/enums/PhotoType.java
@@ -0,0 +1,6 @@
+package com.solaria.persistence.domain.enums;
+
+public enum PhotoType {
+ PROFILE,
+ BANNER
+}
diff --git a/src/main/java/com/solaria/persistence/domain/enums/TranslationStatus.java b/src/main/java/com/solaria/persistence/domain/enums/TranslationStatus.java
new file mode 100644
index 0000000..260d940
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/domain/enums/TranslationStatus.java
@@ -0,0 +1,7 @@
+package com.solaria.persistence.domain.enums;
+
+public enum TranslationStatus {
+ PENDING,
+ COMPLETED,
+ FAILED
+}
diff --git a/src/main/java/com/solaria/persistence/dto/request/ModelRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/ModelRequestDTO.java
index 4d0df40..a70bae7 100644
--- a/src/main/java/com/solaria/persistence/dto/request/ModelRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/ModelRequestDTO.java
@@ -1,5 +1,7 @@
package com.solaria.persistence.dto.request;
+import com.solaria.persistence.domain.enums.PanelType;
+
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
@@ -17,14 +19,20 @@ public class ModelRequestDTO {
@NotBlank(message = "Modelo é obrigatório")
private String model;
+ @NotNull(message = "Tipo da placa é obrigatório")
+ private PanelType type;
+
@NotNull(message = "Potência (Wp) é obrigatória")
private BigDecimal powerWp;
@NotNull(message = "Eficiência é obrigatória")
private BigDecimal efficiency;
- @NotNull(message = "Dimensão é obrigatória")
- private BigDecimal dimension;
+ @NotNull(message = "Largura é obrigatória")
+ private BigDecimal width;
+
+ @NotNull(message = "Comprimento é obrigatório")
+ private BigDecimal length;
@NotNull(message = "Peso é obrigatório")
private BigDecimal weight;
diff --git a/src/main/java/com/solaria/persistence/dto/request/OfferRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/OfferRequestDTO.java
index 41f0f88..ae7d487 100644
--- a/src/main/java/com/solaria/persistence/dto/request/OfferRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/OfferRequestDTO.java
@@ -1,5 +1,8 @@
package com.solaria.persistence.dto.request;
+import jakarta.validation.constraints.DecimalMax;
+import jakarta.validation.constraints.DecimalMin;
+import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import jakarta.validation.constraints.PositiveOrZero;
@@ -8,6 +11,7 @@
import java.math.BigDecimal;
import java.time.OffsetDateTime;
+import java.util.List;
import java.util.UUID;
@Setter
@@ -20,6 +24,14 @@ public class OfferRequestDTO {
@NotNull(message = "ID do Modelo é obrigatório")
private UUID modelId;
+ @NotBlank(message = "Título é obrigatório")
+ private String title;
+
+ @NotBlank(message = "Descrição é obrigatória")
+ private String description;
+
+ private String details;
+
@NotNull(message = "Preço unitário é obrigatório")
@Positive(message = "Preço unitário deve ser maior que zero")
private BigDecimal unitPrice;
@@ -30,4 +42,10 @@ public class OfferRequestDTO {
private OffsetDateTime expirationDate;
+ @DecimalMin(value = "0", message = "Percentual de desconto não pode ser negativo")
+ @DecimalMax(value = "100", message = "Percentual de desconto não pode ser maior que 100")
+ private BigDecimal discountPercentage;
+
+ private List serviceRegions;
+
}
diff --git a/src/main/java/com/solaria/persistence/dto/response/CompanyPhotoResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/CompanyPhotoResponseDTO.java
new file mode 100644
index 0000000..cd18491
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/dto/response/CompanyPhotoResponseDTO.java
@@ -0,0 +1,20 @@
+package com.solaria.persistence.dto.response;
+
+import com.solaria.persistence.domain.enums.PhotoType;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.OffsetDateTime;
+import java.util.UUID;
+
+@Getter
+@Setter
+public class CompanyPhotoResponseDTO {
+
+ private UUID id;
+ private UUID companyId;
+ private PhotoType type;
+ private String url;
+ private OffsetDateTime createdAt;
+
+}
diff --git a/src/main/java/com/solaria/persistence/dto/response/CompanyResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/CompanyResponseDTO.java
index caee705..24e2edd 100644
--- a/src/main/java/com/solaria/persistence/dto/response/CompanyResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/CompanyResponseDTO.java
@@ -15,6 +15,7 @@ public class CompanyResponseDTO {
private String cnpj;
private String tradeName;
private String corporateName;
+ private String slug;
private AddressResponseDTO address;
private BusinessContactResponseDTO businessContact;
diff --git a/src/main/java/com/solaria/persistence/dto/response/EnergyBillResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/EnergyBillResponseDTO.java
index e953c71..f1ca229 100644
--- a/src/main/java/com/solaria/persistence/dto/response/EnergyBillResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/EnergyBillResponseDTO.java
@@ -14,5 +14,6 @@ public class EnergyBillResponseDTO {
private UUID localUnitId;
private BigDecimal consumption;
private BigDecimal price;
+ private String photoUrl;
}
diff --git a/src/main/java/com/solaria/persistence/dto/response/LocalUnitPhotoResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/LocalUnitPhotoResponseDTO.java
new file mode 100644
index 0000000..fbe7eca
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/dto/response/LocalUnitPhotoResponseDTO.java
@@ -0,0 +1,18 @@
+package com.solaria.persistence.dto.response;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.OffsetDateTime;
+import java.util.UUID;
+
+@Getter
+@Setter
+public class LocalUnitPhotoResponseDTO {
+
+ private UUID id;
+ private UUID localUnitId;
+ private String url;
+ private OffsetDateTime createdAt;
+
+}
diff --git a/src/main/java/com/solaria/persistence/dto/response/ModelPhotoResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/ModelPhotoResponseDTO.java
new file mode 100644
index 0000000..aa04df6
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/dto/response/ModelPhotoResponseDTO.java
@@ -0,0 +1,18 @@
+package com.solaria.persistence.dto.response;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.OffsetDateTime;
+import java.util.UUID;
+
+@Getter
+@Setter
+public class ModelPhotoResponseDTO {
+
+ private UUID id;
+ private UUID modelId;
+ private String url;
+ private OffsetDateTime createdAt;
+
+}
diff --git a/src/main/java/com/solaria/persistence/dto/response/ModelResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/ModelResponseDTO.java
index 8f892f2..86f5e67 100644
--- a/src/main/java/com/solaria/persistence/dto/response/ModelResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/ModelResponseDTO.java
@@ -1,6 +1,7 @@
package com.solaria.persistence.dto.response;
import com.solaria.persistence.domain.enums.ModelStatus;
+import com.solaria.persistence.domain.enums.PanelType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
@@ -20,9 +21,11 @@ public class ModelResponseDTO {
private UUID id;
private String brand;
private String model;
+ private PanelType type;
private BigDecimal powerWp;
private BigDecimal efficiency;
- private BigDecimal dimension;
+ private BigDecimal width;
+ private BigDecimal length;
private BigDecimal weight;
private ModelStatus status;
diff --git a/src/main/java/com/solaria/persistence/dto/response/OfferResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/OfferResponseDTO.java
index 6078358..61d57c3 100644
--- a/src/main/java/com/solaria/persistence/dto/response/OfferResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/OfferResponseDTO.java
@@ -1,10 +1,12 @@
package com.solaria.persistence.dto.response;
+import com.solaria.persistence.domain.enums.TranslationStatus;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.time.OffsetDateTime;
+import java.util.List;
import java.util.UUID;
@Getter
@@ -14,8 +16,14 @@ public class OfferResponseDTO {
private UUID id;
private UUID supplierId;
private ModelResponseDTO model;
+ private String slug;
private BigDecimal unitPrice;
private Integer availability;
private OffsetDateTime expirationDate;
+ private BigDecimal discountPercentage;
+ private List serviceRegions;
+ private String sourceLocale;
+ private TranslationStatus translationStatus;
+ private List translations;
}
diff --git a/src/main/java/com/solaria/persistence/dto/response/OfferTranslationResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/OfferTranslationResponseDTO.java
new file mode 100644
index 0000000..7dce953
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/dto/response/OfferTranslationResponseDTO.java
@@ -0,0 +1,15 @@
+package com.solaria.persistence.dto.response;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class OfferTranslationResponseDTO {
+
+ private String locale;
+ private String title;
+ private String description;
+ private String details;
+
+}
diff --git a/src/main/java/com/solaria/persistence/dto/response/TechnicianResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/TechnicianResponseDTO.java
index 097391c..89e108c 100644
--- a/src/main/java/com/solaria/persistence/dto/response/TechnicianResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/TechnicianResponseDTO.java
@@ -11,6 +11,7 @@ public class TechnicianResponseDTO {
private UUID id;
private String crea;
+ private String slug;
private PersonResponseDTO person;
}
diff --git a/src/main/java/com/solaria/persistence/dto/response/UserPhotoResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/UserPhotoResponseDTO.java
new file mode 100644
index 0000000..1f1eb16
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/dto/response/UserPhotoResponseDTO.java
@@ -0,0 +1,20 @@
+package com.solaria.persistence.dto.response;
+
+import com.solaria.persistence.domain.enums.PhotoType;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.OffsetDateTime;
+import java.util.UUID;
+
+@Getter
+@Setter
+public class UserPhotoResponseDTO {
+
+ private UUID id;
+ private UUID userId;
+ private PhotoType type;
+ private String url;
+ private OffsetDateTime createdAt;
+
+}
diff --git a/src/main/java/com/solaria/persistence/exception/StorageException.java b/src/main/java/com/solaria/persistence/exception/StorageException.java
new file mode 100644
index 0000000..59540fe
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/exception/StorageException.java
@@ -0,0 +1,16 @@
+package com.solaria.persistence.exception;
+
+import java.util.Map;
+
+import org.springframework.http.HttpStatus;
+
+public class StorageException extends BusinessException {
+
+ public StorageException(String message) {
+ super(message, HttpStatus.BAD_GATEWAY, "STORAGE_ERROR");
+ }
+
+ public StorageException(String message, Map properties) {
+ super(message, HttpStatus.BAD_GATEWAY, "STORAGE_ERROR", properties);
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/openapi/CompanyPhotoOpenApi.java b/src/main/java/com/solaria/persistence/openapi/CompanyPhotoOpenApi.java
new file mode 100644
index 0000000..c9d1b9a
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/openapi/CompanyPhotoOpenApi.java
@@ -0,0 +1,42 @@
+package com.solaria.persistence.openapi;
+
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.solaria.persistence.domain.enums.PhotoType;
+import com.solaria.persistence.dto.response.CompanyPhotoResponseDTO;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+@Tag(name = "Company Photos", description = "Gerenciamento das fotos (perfil/banner) de uma empresa, armazenadas no Cloudinary.")
+public interface CompanyPhotoOpenApi {
+
+ @Operation(
+ summary = "Envia (ou substitui) a foto de um tipo para a empresa",
+ description = "Faz upload da imagem para o Cloudinary e associa à empresa e ao tipo informado (PROFILE/BANNER)."
+ )
+ @ApiResponses({
+ @ApiResponse(responseCode = "200", description = "Foto enviada com sucesso"),
+ @ApiResponse(responseCode = "404", description = "Empresa não encontrada")
+ })
+ ResponseEntity upload(UUID companyId, PhotoType type, MultipartFile file);
+
+ @Operation(summary = "Remove a foto de um tipo da empresa")
+ @ApiResponses({
+ @ApiResponse(responseCode = "204", description = "Foto removida com sucesso"),
+ @ApiResponse(responseCode = "404", description = "Foto não encontrada")
+ })
+ ResponseEntity delete(UUID companyId, PhotoType type);
+
+ @Operation(summary = "Lista as fotos cadastradas para a empresa")
+ @ApiResponses({
+ @ApiResponse(responseCode = "200", description = "Lista de fotos retornada com sucesso")
+ })
+ ResponseEntity> findByCompany(UUID companyId);
+}
diff --git a/src/main/java/com/solaria/persistence/openapi/EnergyBillOpenApi.java b/src/main/java/com/solaria/persistence/openapi/EnergyBillOpenApi.java
index 722e583..e5f74af 100644
--- a/src/main/java/com/solaria/persistence/openapi/EnergyBillOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/EnergyBillOpenApi.java
@@ -4,6 +4,7 @@
import java.util.UUID;
import org.springframework.http.ResponseEntity;
+import org.springframework.web.multipart.MultipartFile;
import com.solaria.persistence.dto.request.EnergyBillRequestDTO;
import com.solaria.persistence.dto.response.EnergyBillResponseDTO;
@@ -49,4 +50,21 @@ public interface EnergyBillOpenApi {
@ApiResponse(responseCode = "200", description = "Listagem retornada com sucesso")
})
ResponseEntity> findByLocalUnit(UUID localUnitId);
+
+ @Operation(
+ summary = "Anexa (ou substitui) a foto da conta de energia",
+ description = "Faz upload da imagem para o Cloudinary e associa à conta de energia informada."
+ )
+ @ApiResponses({
+ @ApiResponse(responseCode = "200", description = "Foto anexada com sucesso"),
+ @ApiResponse(responseCode = "404", description = "Conta de energia não encontrada")
+ })
+ ResponseEntity attachPhoto(UUID id, MultipartFile file);
+
+ @Operation(summary = "Remove a foto da conta de energia")
+ @ApiResponses({
+ @ApiResponse(responseCode = "204", description = "Foto removida com sucesso"),
+ @ApiResponse(responseCode = "404", description = "Conta de energia não encontrada")
+ })
+ ResponseEntity removePhoto(UUID id);
}
diff --git a/src/main/java/com/solaria/persistence/openapi/LocalUnitPhotoOpenApi.java b/src/main/java/com/solaria/persistence/openapi/LocalUnitPhotoOpenApi.java
new file mode 100644
index 0000000..e706772
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/openapi/LocalUnitPhotoOpenApi.java
@@ -0,0 +1,41 @@
+package com.solaria.persistence.openapi;
+
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.solaria.persistence.dto.response.LocalUnitPhotoResponseDTO;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+@Tag(name = "Local Unit Photos", description = "Gerenciamento das fotos de uma unidade local, armazenadas no Cloudinary.")
+public interface LocalUnitPhotoOpenApi {
+
+ @Operation(
+ summary = "Envia uma nova foto para a unidade local",
+ description = "Faz upload da imagem para o Cloudinary e associa à unidade local informada."
+ )
+ @ApiResponses({
+ @ApiResponse(responseCode = "201", description = "Foto criada com sucesso"),
+ @ApiResponse(responseCode = "404", description = "Unidade local não encontrada")
+ })
+ ResponseEntity upload(UUID localUnitId, MultipartFile file);
+
+ @Operation(summary = "Remove uma foto da unidade local")
+ @ApiResponses({
+ @ApiResponse(responseCode = "204", description = "Foto removida com sucesso"),
+ @ApiResponse(responseCode = "404", description = "Foto não encontrada")
+ })
+ ResponseEntity delete(UUID id);
+
+ @Operation(summary = "Lista as fotos cadastradas para a unidade local")
+ @ApiResponses({
+ @ApiResponse(responseCode = "200", description = "Lista de fotos retornada com sucesso")
+ })
+ ResponseEntity> findByLocalUnit(UUID localUnitId);
+}
diff --git a/src/main/java/com/solaria/persistence/openapi/ModelPhotoOpenApi.java b/src/main/java/com/solaria/persistence/openapi/ModelPhotoOpenApi.java
new file mode 100644
index 0000000..f121fde
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/openapi/ModelPhotoOpenApi.java
@@ -0,0 +1,41 @@
+package com.solaria.persistence.openapi;
+
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.solaria.persistence.dto.response.ModelPhotoResponseDTO;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+@Tag(name = "Model Photos", description = "Gerenciamento das fotos de um modelo de placa solar, armazenadas no Cloudinary.")
+public interface ModelPhotoOpenApi {
+
+ @Operation(
+ summary = "Envia uma nova foto para o modelo",
+ description = "Faz upload da imagem para o Cloudinary e associa ao modelo informado."
+ )
+ @ApiResponses({
+ @ApiResponse(responseCode = "201", description = "Foto criada com sucesso"),
+ @ApiResponse(responseCode = "404", description = "Modelo não encontrado")
+ })
+ ResponseEntity upload(UUID modelId, MultipartFile file);
+
+ @Operation(summary = "Remove uma foto do modelo")
+ @ApiResponses({
+ @ApiResponse(responseCode = "204", description = "Foto removida com sucesso"),
+ @ApiResponse(responseCode = "404", description = "Foto não encontrada")
+ })
+ ResponseEntity delete(UUID id);
+
+ @Operation(summary = "Lista as fotos cadastradas para o modelo")
+ @ApiResponses({
+ @ApiResponse(responseCode = "200", description = "Lista de fotos retornada com sucesso")
+ })
+ ResponseEntity> findByModel(UUID modelId);
+}
diff --git a/src/main/java/com/solaria/persistence/openapi/UserPhotoOpenApi.java b/src/main/java/com/solaria/persistence/openapi/UserPhotoOpenApi.java
new file mode 100644
index 0000000..65d958c
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/openapi/UserPhotoOpenApi.java
@@ -0,0 +1,42 @@
+package com.solaria.persistence.openapi;
+
+import java.util.List;
+import java.util.UUID;
+
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.solaria.persistence.domain.enums.PhotoType;
+import com.solaria.persistence.dto.response.UserPhotoResponseDTO;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+@Tag(name = "User Photos", description = "Gerenciamento das fotos (perfil/banner) de um usuário, armazenadas no Cloudinary.")
+public interface UserPhotoOpenApi {
+
+ @Operation(
+ summary = "Envia (ou substitui) a foto de um tipo para o usuário",
+ description = "Faz upload da imagem para o Cloudinary e associa ao usuário e ao tipo informado (PROFILE/BANNER)."
+ )
+ @ApiResponses({
+ @ApiResponse(responseCode = "200", description = "Foto enviada com sucesso"),
+ @ApiResponse(responseCode = "404", description = "Usuário não encontrado")
+ })
+ ResponseEntity upload(UUID userId, PhotoType type, MultipartFile file);
+
+ @Operation(summary = "Remove a foto de um tipo do usuário")
+ @ApiResponses({
+ @ApiResponse(responseCode = "204", description = "Foto removida com sucesso"),
+ @ApiResponse(responseCode = "404", description = "Foto não encontrada")
+ })
+ ResponseEntity delete(UUID userId, PhotoType type);
+
+ @Operation(summary = "Lista as fotos cadastradas para o usuário")
+ @ApiResponses({
+ @ApiResponse(responseCode = "200", description = "Lista de fotos retornada com sucesso")
+ })
+ ResponseEntity> findByUser(UUID userId);
+}
diff --git a/src/main/java/com/solaria/persistence/repository/CompanyPhotoRepository.java b/src/main/java/com/solaria/persistence/repository/CompanyPhotoRepository.java
new file mode 100644
index 0000000..7fdf0cb
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/repository/CompanyPhotoRepository.java
@@ -0,0 +1,19 @@
+package com.solaria.persistence.repository;
+
+import com.solaria.persistence.domain.entity.CompanyPhoto;
+import com.solaria.persistence.domain.enums.PhotoType;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+
+public interface CompanyPhotoRepository extends JpaRepository {
+
+ List findByCompanyIdOrderByTypeAsc(UUID companyId);
+
+ Optional findByCompanyIdAndType(UUID companyId, PhotoType type);
+
+ boolean existsByCompanyId(UUID companyId);
+}
diff --git a/src/main/java/com/solaria/persistence/repository/CompanyRepository.java b/src/main/java/com/solaria/persistence/repository/CompanyRepository.java
index ac43c45..70a19ac 100644
--- a/src/main/java/com/solaria/persistence/repository/CompanyRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/CompanyRepository.java
@@ -19,6 +19,10 @@ public interface CompanyRepository extends JpaRepository {
boolean existsByBusinessContactId(UUID businessContactId);
+ boolean existsBySlug(String slug);
+
+ Optional findBySlug(String slug);
+
@Override
@EntityGraph(attributePaths = {"address", "businessContact"})
List findAll();
diff --git a/src/main/java/com/solaria/persistence/repository/LocalUnitPhotoRepository.java b/src/main/java/com/solaria/persistence/repository/LocalUnitPhotoRepository.java
new file mode 100644
index 0000000..3232f91
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/repository/LocalUnitPhotoRepository.java
@@ -0,0 +1,18 @@
+package com.solaria.persistence.repository;
+
+import com.solaria.persistence.domain.entity.LocalUnitPhoto;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+
+public interface LocalUnitPhotoRepository extends JpaRepository {
+
+ List findByLocalUnitIdOrderByCreatedAtDesc(UUID localUnitId);
+
+ Optional findByIdAndLocalUnitId(UUID id, UUID localUnitId);
+
+ boolean existsByLocalUnitId(UUID localUnitId);
+}
diff --git a/src/main/java/com/solaria/persistence/repository/ModelPhotoRepository.java b/src/main/java/com/solaria/persistence/repository/ModelPhotoRepository.java
new file mode 100644
index 0000000..842bfea
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/repository/ModelPhotoRepository.java
@@ -0,0 +1,18 @@
+package com.solaria.persistence.repository;
+
+import com.solaria.persistence.domain.entity.ModelPhoto;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+
+public interface ModelPhotoRepository extends JpaRepository {
+
+ List findByModelIdOrderByCreatedAtDesc(UUID modelId);
+
+ Optional findByIdAndModelId(UUID id, UUID modelId);
+
+ boolean existsByModelId(UUID modelId);
+}
diff --git a/src/main/java/com/solaria/persistence/repository/OfferRepository.java b/src/main/java/com/solaria/persistence/repository/OfferRepository.java
index 844353a..ca7db10 100644
--- a/src/main/java/com/solaria/persistence/repository/OfferRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/OfferRepository.java
@@ -19,5 +19,7 @@ public interface OfferRepository extends JpaRepository {
boolean existsByModelId(UUID modelId);
+ boolean existsBySlug(String slug);
+
List findByExpirationDateIsNullOrExpirationDateAfter(OffsetDateTime now);
}
diff --git a/src/main/java/com/solaria/persistence/repository/OfferTranslationRepository.java b/src/main/java/com/solaria/persistence/repository/OfferTranslationRepository.java
new file mode 100644
index 0000000..3270c10
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/repository/OfferTranslationRepository.java
@@ -0,0 +1,17 @@
+package com.solaria.persistence.repository;
+
+import com.solaria.persistence.domain.entity.OfferTranslation;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+public interface OfferTranslationRepository extends JpaRepository {
+
+ List findByOfferId(UUID offerId);
+
+ Optional findByOfferIdAndLocale(UUID offerId, String locale);
+
+ boolean existsByOfferIdAndLocale(UUID offerId, String locale);
+}
diff --git a/src/main/java/com/solaria/persistence/repository/TechnicianRepository.java b/src/main/java/com/solaria/persistence/repository/TechnicianRepository.java
index 09dbd93..84b54fb 100644
--- a/src/main/java/com/solaria/persistence/repository/TechnicianRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/TechnicianRepository.java
@@ -3,9 +3,14 @@
import com.solaria.persistence.domain.entity.Technician;
import org.springframework.data.jpa.repository.JpaRepository;
+import java.util.Optional;
import java.util.UUID;
public interface TechnicianRepository extends JpaRepository {
boolean existsByPersonId(UUID personId);
+
+ boolean existsBySlug(String slug);
+
+ Optional findBySlug(String slug);
}
diff --git a/src/main/java/com/solaria/persistence/repository/UserPhotoRepository.java b/src/main/java/com/solaria/persistence/repository/UserPhotoRepository.java
new file mode 100644
index 0000000..ac22237
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/repository/UserPhotoRepository.java
@@ -0,0 +1,19 @@
+package com.solaria.persistence.repository;
+
+import com.solaria.persistence.domain.entity.UserPhoto;
+import com.solaria.persistence.domain.enums.PhotoType;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+
+public interface UserPhotoRepository extends JpaRepository {
+
+ List findByUserIdOrderByTypeAsc(UUID userId);
+
+ Optional findByUserIdAndType(UUID userId, PhotoType type);
+
+ boolean existsByUserId(UUID userId);
+}
diff --git a/src/main/java/com/solaria/persistence/security/rbac/RbacAuthorizationService.java b/src/main/java/com/solaria/persistence/security/rbac/RbacAuthorizationService.java
index 25abce6..64c79ad 100644
--- a/src/main/java/com/solaria/persistence/security/rbac/RbacAuthorizationService.java
+++ b/src/main/java/com/solaria/persistence/security/rbac/RbacAuthorizationService.java
@@ -8,6 +8,7 @@
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
import com.solaria.persistence.domain.entity.Position;
import com.solaria.persistence.domain.entity.User;
@@ -51,6 +52,7 @@ public RbacAuthorizationService(UserRepository userRepository,
}
// Lógica de RBAC
+ @Transactional(readOnly = true)
public void requireEndpointAccess(String endpointIdentifier) {
if (BOOTSTRAP_ALWAYS_OPEN.contains(endpointIdentifier)) {
return;
@@ -64,6 +66,7 @@ public void requireEndpointAccess(String endpointIdentifier) {
}
// Checagem de permissão do usuário / ADMIN ignora isso por ter acesso a todos os Endpoints
+ @Transactional(readOnly = true)
public boolean hasEndpointAccess(String endpointIdentifier) {
return resolveUserCompany()
.map(uc -> isAdmin(uc.getPosition())
@@ -72,6 +75,7 @@ public boolean hasEndpointAccess(String endpointIdentifier) {
}
// checagem de empresa pertencente ao usuário
+ @Transactional(readOnly = true)
public void requireOwnCompany(UUID companyId) {
boolean sameCompany = resolveUserCompany()
.map(uc -> uc.getCompany().getId().equals(companyId))
@@ -81,10 +85,21 @@ public void requireOwnCompany(UUID companyId) {
}
}
+ @Transactional(readOnly = true)
public boolean currentUserHasNoCompanyLink() {
return resolveUserCompany().isEmpty();
}
+
+ // checagem de usuário dono da entity -> apenas o próprio usuario pode alterar seus dados(admin não faz bypass)
+ @Transactional(readOnly = true)
+ public void requireOwnUser(UUID userId) {
+ boolean isSelf = currentUser().map(user -> user.getId().equals(userId)).orElse(false);
+ if (!isSelf) {
+ throw new UnauthorizedAccessException("O objeto da operação não foi encontrado.");
+ }
+ }
+
private Optional resolveUserCompany() {
return currentUser().flatMap(user -> userCompanyRepository.findByUserId(user.getId()));
}
diff --git a/src/main/java/com/solaria/persistence/service/CloudinaryService.java b/src/main/java/com/solaria/persistence/service/CloudinaryService.java
new file mode 100644
index 0000000..1b38515
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/service/CloudinaryService.java
@@ -0,0 +1,108 @@
+package com.solaria.persistence.service;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.Set;
+
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.cloudinary.Cloudinary;
+import com.cloudinary.utils.ObjectUtils;
+import com.solaria.persistence.exception.InvalidFieldException;
+import com.solaria.persistence.exception.StorageException;
+
+/**
+ * Classe centralizadora que fala diretamente com o SDK do Cloudinary.
+ */
+@Service
+public class CloudinaryService {
+
+ private final Cloudinary cloudinary;
+
+ public CloudinaryService(Cloudinary cloudinary) {
+ this.cloudinary = cloudinary;
+ }
+
+ // dto simples -> representa o resultado do upload
+ public record UploadResult(String url, String publicId) {
+ }
+
+ /**
+ * publicId != null + overwrite=true: upsert determinístico (usado por foto de
+ * perfil/banner
+ * de usuário/empresa e pela foto única de conta de energia -- o próprio
+ * Cloudinary substitui
+ * o asset atomicamente, sem precisar de um destroy() separado do asset antigo).
+ * publicId == null: Cloudinary gera um id novo (usado por unidade local/model,
+ * fotos avulsas).
+ */
+ public UploadResult upload(
+ MultipartFile file, // arquivo enviado via http
+ String folder, // pasta do cloudnary
+ String publicId, // identificador do asset no cloudnary
+ boolean overwrite, // decide se o arquivo pode ter sobrescrita
+ Set allowedContentTypes, // conjunto de arquivos permitidos(.jpg / .png)
+ long maxBytes) // tamanho maxímo de arquivo permitido
+ {
+
+
+ // validação (vazio/tipo/tamanho) antes de chamar o SDK do cloudnary
+ validate(file, allowedContentTypes, maxBytes);
+
+ // map das configs do cloudnary
+ Map options = ObjectUtils.asMap(
+ "folder", folder,
+ "resource_type", "auto",
+ "overwrite", overwrite,
+ "invalidate", overwrite);
+
+ // adiciona publicId para fotos novas / fotos alteradas permanecem com publicId antigo
+ if (publicId != null) {
+ options.put("public_id", publicId);
+ }
+
+ try {
+ // comunicação com cloudnary-> retorna um map com o resultado do upload / upload síncrono
+ Map, ?> result = cloudinary // sdk que conversa com o cloudnary
+ .uploader()
+ .upload(
+ file.getBytes(), // converte o arquivo para byte -> sdk recebe dados nesse formato
+ options // configs do cloudnary
+ );
+
+ // secure_url -> url pública do asset | public_id -> id interno -> usado em delete/sobrescrita
+ return new UploadResult((String) result.get("secure_url"), (String) result.get("public_id"));
+
+ } catch (IOException e) {
+ // qualquer exception vira storageException e retornado como 502
+ throw new StorageException("Falha ao enviar arquivo para o Cloudinary");
+ }
+ }
+
+ public void delete(String publicId) {
+ if (publicId == null || publicId.isBlank()) {
+ return;
+ }
+ try {
+ cloudinary.uploader().destroy(publicId, ObjectUtils.asMap("invalidate", true));
+ } catch (IOException e) {
+ throw new StorageException("Falha ao remover arquivo do Cloudinary");
+ }
+ }
+
+ // método auxiliar de validação
+ private void validate(MultipartFile file, Set allowedContentTypes, long maxBytes) {
+ if (file == null || file.isEmpty()) {
+ throw new InvalidFieldException("Arquivo enviado está vazio");
+ }
+ if (file.getSize() > maxBytes) {
+ throw new InvalidFieldException("Arquivo excede o tamanho máximo permitido: " + maxBytes + " bytes");
+ }
+
+ // cada classe service decide os tipos de arquivo permitidos
+ if (!allowedContentTypes.contains(file.getContentType())) {
+ throw new InvalidFieldException("Tipo de arquivo não permitido: " + file.getContentType());
+ }
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/service/CompanyPhotoService.java b/src/main/java/com/solaria/persistence/service/CompanyPhotoService.java
new file mode 100644
index 0000000..17e31b1
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/service/CompanyPhotoService.java
@@ -0,0 +1,113 @@
+package com.solaria.persistence.service;
+
+import java.time.OffsetDateTime;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.solaria.persistence.config.CloudinaryProperties;
+import com.solaria.persistence.domain.entity.Company;
+import com.solaria.persistence.domain.entity.CompanyPhoto;
+import com.solaria.persistence.domain.enums.PhotoType;
+import com.solaria.persistence.dto.response.CompanyPhotoResponseDTO;
+import com.solaria.persistence.exception.ResourceNotFoundException;
+import com.solaria.persistence.repository.CompanyPhotoRepository;
+import com.solaria.persistence.repository.CompanyRepository;
+import com.solaria.persistence.security.rbac.RbacAuthorizationService;
+import com.solaria.persistence.service.CloudinaryService.UploadResult;
+
+@Service
+public class CompanyPhotoService {
+
+ private static final Set ALLOWED_CONTENT_TYPES = Set.of("image/jpeg", "image/png", "image/webp");
+ private static final long MAX_BYTES = 5L * 1024 * 1024;
+
+ private final CompanyPhotoRepository companyPhotoRepository;
+ private final CompanyRepository companyRepository;
+ private final CloudinaryService cloudinaryService;
+ private final CloudinaryProperties cloudinaryProperties;
+ private final RbacAuthorizationService rbac;
+
+ public CompanyPhotoService(CompanyPhotoRepository companyPhotoRepository,
+ CompanyRepository companyRepository,
+ CloudinaryService cloudinaryService,
+ CloudinaryProperties cloudinaryProperties,
+ RbacAuthorizationService rbac) {
+ this.companyPhotoRepository = companyPhotoRepository;
+ this.companyRepository = companyRepository;
+ this.cloudinaryService = cloudinaryService;
+ this.cloudinaryProperties = cloudinaryProperties;
+ this.rbac = rbac;
+ }
+
+ @Transactional
+ public CompanyPhotoResponseDTO upload(UUID companyId, PhotoType type, MultipartFile file) {
+ rbac.requireOwnCompany(companyId);
+
+ Company company = companyRepository.findById(companyId)
+ .orElseThrow(() -> new ResourceNotFoundException("Empresa não encontrada com ID: " + companyId));
+
+
+ UploadResult result = cloudinaryService.upload(file, folder(companyId), publicId(companyId, type), true,
+ ALLOWED_CONTENT_TYPES, MAX_BYTES);
+
+ CompanyPhoto photo = companyPhotoRepository.findByCompanyIdAndType(companyId, type)
+ .orElseGet(CompanyPhoto::new);
+ photo.setCompany(company);
+ photo.setType(type);
+ photo.setUrl(result.url());
+ photo.setPublicId(result.publicId());
+ if (photo.getCreatedAt() == null) {
+ photo.setCreatedAt(OffsetDateTime.now());
+ }
+
+ // se a foto por algum motivo não salva no BD, deleta ela no cloudnary
+ try {
+ return toResponse(companyPhotoRepository.save(photo));
+ } catch (RuntimeException e) {
+ cloudinaryService.delete(result.publicId());
+ throw e;
+ }
+ }
+
+ @Transactional
+ public void delete(UUID companyId, PhotoType type) {
+ rbac.requireOwnCompany(companyId);
+
+ CompanyPhoto photo = companyPhotoRepository.findByCompanyIdAndType(companyId, type)
+ .orElseThrow(() -> new ResourceNotFoundException(
+ "Foto não encontrada para a empresa " + companyId + " e tipo " + type));
+
+ cloudinaryService.delete(photo.getPublicId());
+ companyPhotoRepository.delete(photo);
+ }
+
+ @Transactional(readOnly = true)
+ public List findByCompany(UUID companyId) {
+ return companyPhotoRepository.findByCompanyIdOrderByTypeAsc(companyId).stream()
+ .map(this::toResponse)
+ .toList();
+ }
+
+ private String folder(UUID companyId) {
+ return cloudinaryProperties.getFolderPrefix() + "/empresas/" + companyId;
+ }
+
+ private String publicId(UUID companyId, PhotoType type) {
+ return folder(companyId) + "/" + type.name().toLowerCase();
+ }
+
+ private CompanyPhotoResponseDTO toResponse(CompanyPhoto photo) {
+ CompanyPhotoResponseDTO response = new CompanyPhotoResponseDTO();
+ response.setId(photo.getId());
+ response.setCompanyId(photo.getCompany().getId());
+ response.setType(photo.getType());
+ response.setUrl(photo.getUrl());
+ response.setCreatedAt(photo.getCreatedAt());
+ return response;
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/service/CompanyService.java b/src/main/java/com/solaria/persistence/service/CompanyService.java
index de7ef93..06b0450 100644
--- a/src/main/java/com/solaria/persistence/service/CompanyService.java
+++ b/src/main/java/com/solaria/persistence/service/CompanyService.java
@@ -21,12 +21,14 @@
import com.solaria.persistence.exception.ResourceNotFoundException;
import com.solaria.persistence.repository.AddressRepository;
import com.solaria.persistence.repository.BusinessContactRepository;
+import com.solaria.persistence.repository.CompanyPhotoRepository;
import com.solaria.persistence.repository.CompanyPositionsRepository;
import com.solaria.persistence.repository.CompanyRepository;
import com.solaria.persistence.repository.RequesterRepository;
import com.solaria.persistence.repository.SupplierRepository;
import com.solaria.persistence.repository.TechnicianAffiliationRepository;
import com.solaria.persistence.repository.UserCompanyRepository;
+import com.solaria.persistence.util.SlugUtil;
@Service
public class CompanyService {
@@ -39,6 +41,7 @@ public class CompanyService {
private final RequesterRepository requesterRepository;
private final TechnicianAffiliationRepository technicianAffiliationRepository;
private final CompanyPositionsRepository companyPositionsRepository;
+ private final CompanyPhotoRepository companyPhotoRepository;
public CompanyService(CompanyRepository companyRepository,
AddressRepository addressRepository,
@@ -47,7 +50,8 @@ public CompanyService(CompanyRepository companyRepository,
SupplierRepository supplierRepository,
RequesterRepository requesterRepository,
TechnicianAffiliationRepository technicianAffiliationRepository,
- CompanyPositionsRepository companyPositionsRepository) {
+ CompanyPositionsRepository companyPositionsRepository,
+ CompanyPhotoRepository companyPhotoRepository) {
this.companyRepository = companyRepository;
this.addressRepository = addressRepository;
this.businessContactRepository = businessContactRepository;
@@ -56,6 +60,7 @@ public CompanyService(CompanyRepository companyRepository,
this.requesterRepository = requesterRepository;
this.technicianAffiliationRepository = technicianAffiliationRepository;
this.companyPositionsRepository = companyPositionsRepository;
+ this.companyPhotoRepository = companyPhotoRepository;
}
@Transactional
@@ -76,6 +81,7 @@ public CompanyResponseDTO save(CompanyRequestDTO dto) {
company.setCnpj(cnpj);
company.setTradeName(dto.getTradeName());
company.setCorporateName(dto.getCorporateName());
+ company.setSlug(generateUniqueSlug(dto.getTradeName()));
return toResponse(companyRepository.save(company));
}
@@ -159,7 +165,8 @@ public void deleteById(UUID id) {
|| supplierRepository.existsByCompanyId(id)
|| requesterRepository.existsByCompanyId(id)
|| technicianAffiliationRepository.existsByCompanyId(id)
- || companyPositionsRepository.existsByCompanyId(id)) {
+ || companyPositionsRepository.existsByCompanyId(id)
+ || companyPhotoRepository.existsByCompanyId(id)) {
throw new ResourceInUseException(
"Empresa não pode ser excluída: possui vínculo(s) associado(s)");
}
@@ -212,6 +219,17 @@ private BusinessContact resolveBusinessContact(UUID businessContactId) {
"Contato Empresarial não encontrado com ID: " + businessContactId));
}
+ private String generateUniqueSlug(String tradeName) {
+ String base = SlugUtil.slugify(tradeName);
+ String candidate = base;
+ int suffix = 2;
+ while (companyRepository.existsBySlug(candidate)) {
+ candidate = base + "-" + suffix;
+ suffix++;
+ }
+ return candidate;
+ }
+
private CompanyResponseDTO toResponse(Company company) {
CompanyResponseDTO dto = new CompanyResponseDTO();
dto.setId(company.getId());
@@ -219,6 +237,7 @@ private CompanyResponseDTO toResponse(Company company) {
dto.setCnpj(company.getCnpj());
dto.setTradeName(company.getTradeName());
dto.setCorporateName(company.getCorporateName());
+ dto.setSlug(company.getSlug());
dto.setAddress(toAddressResponse(company.getAddress()));
dto.setBusinessContact(toBusinessContactResponse(company.getBusinessContact()));
return dto;
diff --git a/src/main/java/com/solaria/persistence/service/EnergyBillService.java b/src/main/java/com/solaria/persistence/service/EnergyBillService.java
index 42bcd41..76b949a 100644
--- a/src/main/java/com/solaria/persistence/service/EnergyBillService.java
+++ b/src/main/java/com/solaria/persistence/service/EnergyBillService.java
@@ -2,13 +2,14 @@
import java.math.BigDecimal;
import java.util.List;
+import java.util.Set;
import java.util.UUID;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
-import tools.jackson.databind.ObjectMapper;
-
+import com.solaria.persistence.config.CloudinaryProperties;
import com.solaria.persistence.domain.entity.EnergyBill;
import com.solaria.persistence.domain.entity.LocalUnit;
import com.solaria.persistence.dto.request.EnergyBillRequestDTO;
@@ -17,23 +18,38 @@
import com.solaria.persistence.exception.ResourceNotFoundException;
import com.solaria.persistence.repository.EnergyBillRepository;
import com.solaria.persistence.repository.LocalUnitRepository;
+import com.solaria.persistence.security.rbac.RbacAuthorizationService;
+import com.solaria.persistence.service.CloudinaryService.UploadResult;
+import tools.jackson.databind.ObjectMapper;
@Service
public class EnergyBillService {
private static final BigDecimal ZERO = BigDecimal.ZERO;
+ private static final Set ALLOWED_PHOTO_CONTENT_TYPES = Set.of("image/jpeg", "image/png", "application/pdf");
+ private static final long MAX_PHOTO_BYTES = 10L * 1024 * 1024;
+
private final EnergyBillRepository energyBillRepository;
private final LocalUnitRepository localUnitRepository;
private final ObjectMapper objectMapper;
+ private final CloudinaryService cloudinaryService;
+ private final CloudinaryProperties cloudinaryProperties;
+ private final RbacAuthorizationService rbac;
public EnergyBillService(EnergyBillRepository energyBillRepository,
- LocalUnitRepository localUnitRepository,
- ObjectMapper objectMapper) {
+ LocalUnitRepository localUnitRepository,
+ ObjectMapper objectMapper,
+ CloudinaryService cloudinaryService,
+ CloudinaryProperties cloudinaryProperties,
+ RbacAuthorizationService rbac) {
this.energyBillRepository = energyBillRepository;
this.localUnitRepository = localUnitRepository;
this.objectMapper = objectMapper;
+ this.cloudinaryService = cloudinaryService;
+ this.cloudinaryProperties = cloudinaryProperties;
+ this.rbac = rbac;
}
@Transactional
@@ -105,6 +121,57 @@ public List findByLocalUnit(UUID localUnitId) {
.toList();
}
+ @Transactional
+ public EnergyBillResponseDTO attachPhoto(UUID id, MultipartFile file) {
+ EnergyBill energyBill = energyBillRepository.findById(id)
+ .orElseThrow(() -> new ResourceNotFoundException(
+ "Conta de Energia não encontrada com ID: " + id));
+
+ requireOwnCompany(energyBill);
+
+ String folder = folder(id);
+ String publicId = folder + "/photo";
+ UploadResult result = cloudinaryService.upload(file, folder, publicId, true,
+ ALLOWED_PHOTO_CONTENT_TYPES, MAX_PHOTO_BYTES);
+
+ energyBill.setPhotoUrl(result.url());
+ energyBill.setPhotoPublicId(result.publicId());
+
+ // se por algum motivo, não conseguir salvar no BD, remove o asset do cloudnary
+ try {
+ return toResponse(energyBillRepository.save(energyBill));
+ } catch (RuntimeException e) {
+ cloudinaryService.delete(result.publicId());
+ throw e;
+ }
+ }
+
+ @Transactional
+ public void removePhoto(UUID id) {
+ EnergyBill energyBill = energyBillRepository.findById(id)
+ .orElseThrow(() -> new ResourceNotFoundException(
+ "Conta de Energia não encontrada com ID: " + id));
+
+ requireOwnCompany(energyBill);
+
+ if (energyBill.getPhotoPublicId() == null) {
+ throw new ResourceNotFoundException("Conta de Energia não possui foto: " + id);
+ }
+
+ cloudinaryService.delete(energyBill.getPhotoPublicId());
+ energyBill.setPhotoUrl(null);
+ energyBill.setPhotoPublicId(null);
+ energyBillRepository.save(energyBill);
+ }
+
+ private String folder(UUID companyId) {
+ return cloudinaryProperties.getFolderPrefix() + "/empresas/" + companyId;
+ }
+
+ private void requireOwnCompany(EnergyBill energyBill) {
+ rbac.requireOwnCompany(energyBill.getLocalUnit().getRequester().getCompany().getId());
+ }
+
private EnergyBillResponseDTO toResponse(EnergyBill energyBill) {
EnergyBillResponseDTO response = objectMapper.convertValue(energyBill, EnergyBillResponseDTO.class);
response.setLocalUnitId(energyBill.getLocalUnit().getId());
diff --git a/src/main/java/com/solaria/persistence/service/GoogleTranslateService.java b/src/main/java/com/solaria/persistence/service/GoogleTranslateService.java
new file mode 100644
index 0000000..541c262
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/service/GoogleTranslateService.java
@@ -0,0 +1,100 @@
+package com.solaria.persistence.service;
+
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestClient;
+
+import com.solaria.persistence.config.GoogleTranslateProperties;
+import com.solaria.persistence.exception.BusinessRuleException;
+
+/**
+ * Cliente fino da Google Cloud Translation API (v2): detecção de idioma e tradução de texto.
+ * Usado pelo OfferTranslationService para preencher as traduções de uma oferta em background.
+ */
+@Service
+public class GoogleTranslateService {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(GoogleTranslateService.class);
+
+ private final RestClient googleTranslateRestClient;
+ private final GoogleTranslateProperties properties;
+
+ public GoogleTranslateService(RestClient googleTranslateRestClient, GoogleTranslateProperties properties) {
+ this.googleTranslateRestClient = googleTranslateRestClient;
+ this.properties = properties;
+ }
+
+ /**
+ * Detecta o idioma de um texto. Retorna o código curto ISO-639-1 (ex.: "pt", "en", "es").
+ */
+ @SuppressWarnings("unchecked")
+ public String detectLanguage(String text) {
+ try {
+ Map response = googleTranslateRestClient.post()
+ .uri(uriBuilder -> uriBuilder.path("/detect").queryParam("key", properties.getApiKey()).build())
+ .body(Map.of("q", text))
+ .retrieve()
+ .body(Map.class);
+
+ Map data = response == null ? null : (Map) response.get("data");
+ List>> detections = data == null
+ ? null : (List>>) data.get("detections");
+
+ if (detections == null || detections.isEmpty() || detections.get(0).isEmpty()) {
+ throw new BusinessRuleException("Google Translate não retornou uma detecção de idioma válida");
+ }
+
+ String language = (String) detections.get(0).get(0).get("language");
+ if (language == null || language.isBlank()) {
+ throw new BusinessRuleException("Google Translate não retornou uma detecção de idioma válida");
+ }
+ return language;
+ } catch (BusinessRuleException ex) {
+ throw ex;
+ } catch (RuntimeException ex) {
+ LOGGER.error("Falha ao detectar idioma via Google Translate", ex);
+ throw new BusinessRuleException("Não foi possível detectar o idioma do texto informado");
+ }
+ }
+
+ /**
+ * Traduz uma lista de textos (mantendo a ordem) de sourceShortCode para targetShortCode.
+ * Os códigos são curtos (ISO-639-1), ex.: "pt", "en", "es".
+ */
+ @SuppressWarnings("unchecked")
+ public List translate(List texts, String sourceShortCode, String targetShortCode) {
+ try {
+ Map body = Map.of(
+ "q", texts,
+ "source", sourceShortCode,
+ "target", targetShortCode,
+ "format", "text");
+
+ Map response = googleTranslateRestClient.post()
+ .uri(uriBuilder -> uriBuilder.queryParam("key", properties.getApiKey()).build())
+ .body(body)
+ .retrieve()
+ .body(Map.class);
+
+ Map data = response == null ? null : (Map) response.get("data");
+ List> translations = data == null
+ ? null : (List>) data.get("translations");
+
+ if (translations == null || translations.size() != texts.size()) {
+ throw new BusinessRuleException(
+ "Google Translate não retornou o número esperado de traduções");
+ }
+
+ return translations.stream().map(t -> (String) t.get("translatedText")).toList();
+ } catch (BusinessRuleException ex) {
+ throw ex;
+ } catch (RuntimeException ex) {
+ LOGGER.error("Falha ao traduzir texto via Google Translate ({} -> {})", sourceShortCode, targetShortCode, ex);
+ throw new BusinessRuleException("Não foi possível traduzir o conteúdo informado");
+ }
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/service/InventoryService.java b/src/main/java/com/solaria/persistence/service/InventoryService.java
index 08f4cd3..5ab63ff 100644
--- a/src/main/java/com/solaria/persistence/service/InventoryService.java
+++ b/src/main/java/com/solaria/persistence/service/InventoryService.java
@@ -151,9 +151,11 @@ private ModelResponseDTO toModelResponse(Model model) {
.id(model.getId())
.brand(model.getBrand())
.model(model.getModel())
+ .type(model.getType())
.powerWp(model.getPowerWp())
.efficiency(model.getEfficiency())
- .dimension(model.getDimension())
+ .width(model.getWidth())
+ .length(model.getLength())
.weight(model.getWeight())
.status(model.getStatus())
.build();
diff --git a/src/main/java/com/solaria/persistence/service/LocalUnitPhotoService.java b/src/main/java/com/solaria/persistence/service/LocalUnitPhotoService.java
new file mode 100644
index 0000000..9c791e7
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/service/LocalUnitPhotoService.java
@@ -0,0 +1,104 @@
+package com.solaria.persistence.service;
+
+import java.time.OffsetDateTime;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.solaria.persistence.config.CloudinaryProperties;
+import com.solaria.persistence.domain.entity.LocalUnit;
+import com.solaria.persistence.domain.entity.LocalUnitPhoto;
+import com.solaria.persistence.dto.response.LocalUnitPhotoResponseDTO;
+import com.solaria.persistence.exception.ResourceNotFoundException;
+import com.solaria.persistence.repository.LocalUnitPhotoRepository;
+import com.solaria.persistence.repository.LocalUnitRepository;
+import com.solaria.persistence.security.rbac.RbacAuthorizationService;
+import com.solaria.persistence.service.CloudinaryService.UploadResult;
+
+@Service
+public class LocalUnitPhotoService {
+
+ private static final Set ALLOWED_CONTENT_TYPES = Set.of("image/jpeg", "image/png", "image/webp");
+ private static final long MAX_BYTES = 8L * 1024 * 1024;
+
+ private final LocalUnitPhotoRepository localUnitPhotoRepository;
+ private final LocalUnitRepository localUnitRepository;
+ private final CloudinaryService cloudinaryService;
+ private final CloudinaryProperties cloudinaryProperties;
+ private final RbacAuthorizationService rbac;
+
+ public LocalUnitPhotoService(LocalUnitPhotoRepository localUnitPhotoRepository,
+ LocalUnitRepository localUnitRepository,
+ CloudinaryService cloudinaryService,
+ CloudinaryProperties cloudinaryProperties,
+ RbacAuthorizationService rbac) {
+ this.localUnitPhotoRepository = localUnitPhotoRepository;
+ this.localUnitRepository = localUnitRepository;
+ this.cloudinaryService = cloudinaryService;
+ this.cloudinaryProperties = cloudinaryProperties;
+ this.rbac = rbac;
+ }
+
+ @Transactional
+ public LocalUnitPhotoResponseDTO upload(UUID localUnitId, MultipartFile file) {
+ LocalUnit localUnit = localUnitRepository.findById(localUnitId)
+ .orElseThrow(() -> new ResourceNotFoundException(
+ "Unidade Local não encontrada com ID: " + localUnitId));
+
+ rbac.requireOwnCompany(localUnit.getRequester().getCompany().getId());
+
+
+ UploadResult result = cloudinaryService.upload(file, folder(localUnitId), null, false,
+ ALLOWED_CONTENT_TYPES, MAX_BYTES);
+
+ LocalUnitPhoto photo = new LocalUnitPhoto();
+ photo.setLocalUnit(localUnit);
+ photo.setUrl(result.url());
+ photo.setPublicId(result.publicId());
+ photo.setCreatedAt(OffsetDateTime.now());
+
+ // em caso de falha do BD, remove o asset do cloudnary
+ try {
+ return toResponse(localUnitPhotoRepository.save(photo));
+ } catch (RuntimeException e) {
+ cloudinaryService.delete(result.publicId());
+ throw e;
+ }
+ }
+
+ @Transactional
+ public void delete(UUID id) {
+ LocalUnitPhoto photo = localUnitPhotoRepository.findById(id)
+ .orElseThrow(() -> new ResourceNotFoundException("Foto não encontrada com ID: " + id));
+
+ rbac.requireOwnCompany(photo.getLocalUnit().getRequester().getCompany().getId());
+
+
+ cloudinaryService.delete(photo.getPublicId());
+ localUnitPhotoRepository.delete(photo);
+ }
+
+ @Transactional(readOnly = true)
+ public List findByLocalUnit(UUID localUnitId) {
+ return localUnitPhotoRepository.findByLocalUnitIdOrderByCreatedAtDesc(localUnitId).stream()
+ .map(this::toResponse)
+ .toList();
+ }
+
+ private String folder(UUID localUnitId) {
+ return cloudinaryProperties.getFolderPrefix() + "/unidades-locais/" + localUnitId;
+ }
+
+ private LocalUnitPhotoResponseDTO toResponse(LocalUnitPhoto photo) {
+ LocalUnitPhotoResponseDTO response = new LocalUnitPhotoResponseDTO();
+ response.setId(photo.getId());
+ response.setLocalUnitId(photo.getLocalUnit().getId());
+ response.setUrl(photo.getUrl());
+ response.setCreatedAt(photo.getCreatedAt());
+ return response;
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/service/LocalUnitService.java b/src/main/java/com/solaria/persistence/service/LocalUnitService.java
index 1ab32bd..c5d7a6e 100644
--- a/src/main/java/com/solaria/persistence/service/LocalUnitService.java
+++ b/src/main/java/com/solaria/persistence/service/LocalUnitService.java
@@ -17,6 +17,7 @@
import com.solaria.persistence.exception.ResourceNotFoundException;
import com.solaria.persistence.repository.AddressRepository;
import com.solaria.persistence.repository.EnergyBillRepository;
+import com.solaria.persistence.repository.LocalUnitPhotoRepository;
import com.solaria.persistence.repository.LocalUnitRepository;
import com.solaria.persistence.repository.ProposalUnitRepository;
import com.solaria.persistence.repository.RequesterRepository;
@@ -32,19 +33,22 @@ public class LocalUnitService {
private final UnitSpecificationsRepository unitSpecificationsRepository;
private final EnergyBillRepository energyBillRepository;
private final ProposalUnitRepository proposalUnitRepository;
+ private final LocalUnitPhotoRepository localUnitPhotoRepository;
public LocalUnitService(LocalUnitRepository localUnitRepository,
RequesterRepository requesterRepository,
AddressRepository addressRepository,
UnitSpecificationsRepository unitSpecificationsRepository,
EnergyBillRepository energyBillRepository,
- ProposalUnitRepository proposalUnitRepository) {
+ ProposalUnitRepository proposalUnitRepository,
+ LocalUnitPhotoRepository localUnitPhotoRepository) {
this.localUnitRepository = localUnitRepository;
this.requesterRepository = requesterRepository;
this.addressRepository = addressRepository;
this.unitSpecificationsRepository = unitSpecificationsRepository;
this.energyBillRepository = energyBillRepository;
this.proposalUnitRepository = proposalUnitRepository;
+ this.localUnitPhotoRepository = localUnitPhotoRepository;
}
@Transactional
@@ -100,7 +104,8 @@ public void deleteById(UUID id) {
}
if (unitSpecificationsRepository.existsByLocalUnitId(id)
|| energyBillRepository.existsByLocalUnitId(id)
- || proposalUnitRepository.existsByLocalUnitId(id)) {
+ || proposalUnitRepository.existsByLocalUnitId(id)
+ || localUnitPhotoRepository.existsByLocalUnitId(id)) {
throw new ResourceInUseException(
"Unidade Local não pode ser excluída: possui histórico/dependente(s) vinculado(s)");
}
diff --git a/src/main/java/com/solaria/persistence/service/ModelPhotoService.java b/src/main/java/com/solaria/persistence/service/ModelPhotoService.java
new file mode 100644
index 0000000..b4bfa27
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/service/ModelPhotoService.java
@@ -0,0 +1,96 @@
+package com.solaria.persistence.service;
+
+import java.time.OffsetDateTime;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.solaria.persistence.config.CloudinaryProperties;
+import com.solaria.persistence.domain.entity.Model;
+import com.solaria.persistence.domain.entity.ModelPhoto;
+import com.solaria.persistence.dto.response.ModelPhotoResponseDTO;
+import com.solaria.persistence.exception.ResourceNotFoundException;
+import com.solaria.persistence.repository.ModelPhotoRepository;
+import com.solaria.persistence.repository.ModelRepository;
+import com.solaria.persistence.service.CloudinaryService.UploadResult;
+
+@Service
+public class ModelPhotoService {
+
+ private static final Set ALLOWED_CONTENT_TYPES = Set.of("image/jpeg", "image/png", "image/webp");
+ private static final long MAX_BYTES = 8L * 1024 * 1024;
+
+ private final ModelPhotoRepository modelPhotoRepository;
+ private final ModelRepository modelRepository;
+ private final CloudinaryService cloudinaryService;
+ private final CloudinaryProperties cloudinaryProperties;
+
+ public ModelPhotoService(ModelPhotoRepository modelPhotoRepository,
+ ModelRepository modelRepository,
+ CloudinaryService cloudinaryService,
+ CloudinaryProperties cloudinaryProperties) {
+ this.modelPhotoRepository = modelPhotoRepository;
+ this.modelRepository = modelRepository;
+ this.cloudinaryService = cloudinaryService;
+ this.cloudinaryProperties = cloudinaryProperties;
+ }
+
+
+ @Transactional
+ public ModelPhotoResponseDTO upload(UUID modelId, MultipartFile file) {
+ Model model = modelRepository.findById(modelId)
+ .orElseThrow(() -> new ResourceNotFoundException("Modelo não encontrado(a) com ID: " + modelId));
+
+
+ UploadResult result = cloudinaryService.upload(file, folder(modelId), null, false,
+ ALLOWED_CONTENT_TYPES, MAX_BYTES);
+
+ ModelPhoto photo = new ModelPhoto();
+ photo.setModel(model);
+ photo.setUrl(result.url());
+ photo.setPublicId(result.publicId());
+ photo.setCreatedAt(OffsetDateTime.now());
+
+ // em caso de falha do BD, remove o asset do cloudnary
+ try {
+ return toResponse(modelPhotoRepository.save(photo));
+ } catch (RuntimeException e) {
+
+ cloudinaryService.delete(result.publicId());
+ throw e;
+ }
+ }
+
+ @Transactional
+ public void delete(UUID id) {
+ ModelPhoto photo = modelPhotoRepository.findById(id)
+ .orElseThrow(() -> new ResourceNotFoundException("Foto não encontrada com ID: " + id));
+
+ cloudinaryService.delete(photo.getPublicId());
+ modelPhotoRepository.delete(photo);
+ }
+
+ @Transactional(readOnly = true)
+ public List findByModel(UUID modelId) {
+ return modelPhotoRepository.findByModelIdOrderByCreatedAtDesc(modelId).stream()
+ .map(this::toResponse)
+ .toList();
+ }
+
+ private String folder(UUID modelId) {
+ return cloudinaryProperties.getFolderPrefix() + "/placas-solares/" + modelId;
+ }
+
+ private ModelPhotoResponseDTO toResponse(ModelPhoto photo) {
+ ModelPhotoResponseDTO response = new ModelPhotoResponseDTO();
+ response.setId(photo.getId());
+ response.setModelId(photo.getModel().getId());
+ response.setUrl(photo.getUrl());
+ response.setCreatedAt(photo.getCreatedAt());
+ return response;
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/service/ModelService.java b/src/main/java/com/solaria/persistence/service/ModelService.java
index dfa3e7f..285776f 100644
--- a/src/main/java/com/solaria/persistence/service/ModelService.java
+++ b/src/main/java/com/solaria/persistence/service/ModelService.java
@@ -18,6 +18,7 @@
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
import com.solaria.persistence.repository.InventoryRepository;
+import com.solaria.persistence.repository.ModelPhotoRepository;
import com.solaria.persistence.repository.ModelRepository;
import com.solaria.persistence.repository.OfferRepository;
@@ -27,28 +28,33 @@ public class ModelService {
private final ModelRepository modelRepository;
private final InventoryRepository inventoryRepository;
private final OfferRepository offerRepository;
+ private final ModelPhotoRepository modelPhotoRepository;
private final ObjectMapper objectMapper;
public ModelService(ModelRepository modelRepository,
InventoryRepository inventoryRepository,
OfferRepository offerRepository,
+ ModelPhotoRepository modelPhotoRepository,
ObjectMapper objectMapper) {
this.modelRepository = modelRepository;
this.inventoryRepository = inventoryRepository;
this.offerRepository = offerRepository;
+ this.modelPhotoRepository = modelPhotoRepository;
this.objectMapper = objectMapper;
}
@Transactional
public ModelResponseDTO save(ModelRequestDTO dto) {
- validateNumericFields(dto.getPowerWp(), dto.getEfficiency(), dto.getDimension(), dto.getWeight());
+ validateNumericFields(dto.getPowerWp(), dto.getEfficiency(), dto.getWidth(), dto.getLength(), dto.getWeight());
Model model = new Model();
model.setBrand(dto.getBrand());
model.setModel(dto.getModel());
+ model.setType(dto.getType());
model.setPowerWp(dto.getPowerWp());
model.setEfficiency(dto.getEfficiency());
- model.setDimension(dto.getDimension());
+ model.setWidth(dto.getWidth());
+ model.setLength(dto.getLength());
model.setWeight(dto.getWeight());
return toResponse(modelRepository.save(model));
@@ -64,13 +70,15 @@ public ModelResponseDTO update(UUID id, ModelRequestDTO dto) {
+ " não permite edição (somente UNDER_ANALYSIS)");
}
- validateNumericFields(dto.getPowerWp(), dto.getEfficiency(), dto.getDimension(), dto.getWeight());
+ validateNumericFields(dto.getPowerWp(), dto.getEfficiency(), dto.getWidth(), dto.getLength(), dto.getWeight());
model.setBrand(dto.getBrand());
model.setModel(dto.getModel());
+ model.setType(dto.getType());
model.setPowerWp(dto.getPowerWp());
model.setEfficiency(dto.getEfficiency());
- model.setDimension(dto.getDimension());
+ model.setWidth(dto.getWidth());
+ model.setLength(dto.getLength());
model.setWeight(dto.getWeight());
return toResponse(modelRepository.save(model));
@@ -112,8 +120,10 @@ public void deleteById(UUID id) {
throw new ResourceNotFoundException("Modelo com id:" + id + " não encontrado(a) para exclusão");
}
- if (inventoryRepository.existsByModelId(id) || offerRepository.existsByModelId(id)) {
- throw new ResourceInUseException("Modelo não pode ser excluído(a): possui estoque/oferta vinculado(s)");
+ if (inventoryRepository.existsByModelId(id) || offerRepository.existsByModelId(id)
+ || modelPhotoRepository.existsByModelId(id)) {
+ throw new ResourceInUseException(
+ "Modelo não pode ser excluído(a): possui estoque/oferta/foto vinculado(s)");
}
modelRepository.deleteById(id);
@@ -136,15 +146,18 @@ public List findByStatus(ModelStatus status) {
return modelRepository.findByStatus(status).stream().map(this::toResponse).toList();
}
- private void validateNumericFields(BigDecimal powerWp, BigDecimal efficiency, BigDecimal dimension, BigDecimal weight) {
+ private void validateNumericFields(BigDecimal powerWp, BigDecimal efficiency, BigDecimal width, BigDecimal length, BigDecimal weight) {
if (powerWp.compareTo(BigDecimal.ZERO) <= 0) {
throw new InvalidFieldException("Potência (Wp) inválida: " + powerWp);
}
if (efficiency.compareTo(BigDecimal.ZERO) <= 0) {
throw new InvalidFieldException("Eficiência inválida: " + efficiency);
}
- if (dimension.compareTo(BigDecimal.ZERO) <= 0) {
- throw new InvalidFieldException("Dimensão inválida: " + dimension);
+ if (width.compareTo(BigDecimal.ZERO) <= 0) {
+ throw new InvalidFieldException("Largura inválida: " + width);
+ }
+ if (length.compareTo(BigDecimal.ZERO) <= 0) {
+ throw new InvalidFieldException("Comprimento inválido: " + length);
}
if (weight.compareTo(BigDecimal.ZERO) <= 0) {
throw new InvalidFieldException("Peso inválido: " + weight);
diff --git a/src/main/java/com/solaria/persistence/service/OfferService.java b/src/main/java/com/solaria/persistence/service/OfferService.java
index 6ed600d..0ed40e7 100644
--- a/src/main/java/com/solaria/persistence/service/OfferService.java
+++ b/src/main/java/com/solaria/persistence/service/OfferService.java
@@ -7,23 +7,30 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.TransactionSynchronization;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
import com.solaria.persistence.domain.entity.Model;
import com.solaria.persistence.domain.entity.Offer;
+import com.solaria.persistence.domain.entity.OfferTranslation;
import com.solaria.persistence.domain.entity.Supplier;
import com.solaria.persistence.domain.enums.ModelStatus;
import com.solaria.persistence.domain.enums.SupplierStatus;
+import com.solaria.persistence.domain.enums.TranslationStatus;
import com.solaria.persistence.dto.request.OfferRequestDTO;
import com.solaria.persistence.dto.response.ModelResponseDTO;
import com.solaria.persistence.dto.response.OfferResponseDTO;
+import com.solaria.persistence.dto.response.OfferTranslationResponseDTO;
import com.solaria.persistence.exception.BusinessRuleException;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
import com.solaria.persistence.repository.ModelRepository;
import com.solaria.persistence.repository.OfferRepository;
+import com.solaria.persistence.repository.OfferTranslationRepository;
import com.solaria.persistence.repository.ProposalItemRepository;
import com.solaria.persistence.repository.SupplierRepository;
+import com.solaria.persistence.util.SlugUtil;
@Service
public class OfferService {
@@ -33,17 +40,23 @@ public class OfferService {
private final ModelRepository modelRepository;
private final ProposalItemRepository proposalItemRepository;
private final SubscriptionService subscriptionService;
+ private final OfferTranslationRepository offerTranslationRepository;
+ private final OfferTranslationService offerTranslationService;
public OfferService(OfferRepository offerRepository,
SupplierRepository supplierRepository,
ModelRepository modelRepository,
ProposalItemRepository proposalItemRepository,
- SubscriptionService subscriptionService) {
+ SubscriptionService subscriptionService,
+ OfferTranslationRepository offerTranslationRepository,
+ OfferTranslationService offerTranslationService) {
this.offerRepository = offerRepository;
this.supplierRepository = supplierRepository;
this.modelRepository = modelRepository;
this.proposalItemRepository = proposalItemRepository;
this.subscriptionService = subscriptionService;
+ this.offerTranslationRepository = offerTranslationRepository;
+ this.offerTranslationService = offerTranslationService;
}
@Transactional
@@ -74,8 +87,24 @@ public OfferResponseDTO save(OfferRequestDTO dto) {
offer.setUnitPrice(dto.getUnitPrice());
offer.setAvailability(dto.getAvailability());
offer.setExpirationDate(dto.getExpirationDate());
+ offer.setDiscountPercentage(dto.getDiscountPercentage());
+ offer.setServiceRegions(dto.getServiceRegions());
+ offer.setSlug(generateUniqueSlug(model));
+ offer.setTranslationStatus(TranslationStatus.PENDING);
- return toResponse(offerRepository.save(offer));
+ Offer savedOffer = offerRepository.save(offer);
+
+ OfferTranslation pendingTranslation = new OfferTranslation();
+ pendingTranslation.setOffer(savedOffer);
+ pendingTranslation.setLocale(OfferTranslationService.PENDING_LOCALE);
+ pendingTranslation.setTitle(dto.getTitle());
+ pendingTranslation.setDescription(dto.getDescription());
+ pendingTranslation.setDetails(dto.getDetails());
+ offerTranslationRepository.save(pendingTranslation);
+
+ triggerAsyncTranslationAfterCommit(savedOffer.getId());
+
+ return toResponse(savedOffer);
}
@Transactional
@@ -102,6 +131,8 @@ public OfferResponseDTO update(UUID id, OfferRequestDTO dto) {
offer.setUnitPrice(dto.getUnitPrice());
offer.setAvailability(dto.getAvailability());
offer.setExpirationDate(dto.getExpirationDate());
+ offer.setDiscountPercentage(dto.getDiscountPercentage());
+ offer.setServiceRegions(dto.getServiceRegions());
return toResponse(offerRepository.save(offer));
}
@@ -177,17 +208,63 @@ private void validateSupplierAndSubscriptionGates(Supplier supplier) {
}
}
+ private String generateUniqueSlug(Model model) {
+ String base = SlugUtil.slugify(model.getBrand() + " " + model.getModel());
+ String candidate = base;
+ int suffix = 2;
+ while (offerRepository.existsBySlug(candidate)) {
+ candidate = base + "-" + suffix;
+ suffix++;
+ }
+ return candidate;
+ }
+
+ /**
+ * Dispara a tradução em background somente após o commit da transação atual, garantindo
+ * que a oferta e a tradução "pendente" já estejam visíveis para a thread assíncrona.
+ */
+ private void triggerAsyncTranslationAfterCommit(UUID offerId) {
+ if (!TransactionSynchronizationManager.isSynchronizationActive()) {
+ offerTranslationService.translateOffer(offerId);
+ return;
+ }
+ TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+ @Override
+ public void afterCommit() {
+ offerTranslationService.translateOffer(offerId);
+ }
+ });
+ }
+
private OfferResponseDTO toResponse(Offer offer) {
OfferResponseDTO response = new OfferResponseDTO();
response.setId(offer.getId());
response.setSupplierId(offer.getSupplier().getId());
response.setModel(toModelResponse(offer.getModel()));
+ response.setSlug(offer.getSlug());
response.setUnitPrice(offer.getUnitPrice());
response.setAvailability(offer.getAvailability());
response.setExpirationDate(offer.getExpirationDate());
+ response.setDiscountPercentage(offer.getDiscountPercentage());
+ response.setServiceRegions(offer.getServiceRegions());
+ response.setSourceLocale(offer.getSourceLocale());
+ response.setTranslationStatus(offer.getTranslationStatus());
+ response.setTranslations(offerTranslationRepository.findByOfferId(offer.getId()).stream()
+ .filter(translation -> !OfferTranslationService.PENDING_LOCALE.equals(translation.getLocale()))
+ .map(this::toTranslationResponse)
+ .toList());
return response;
}
+ private OfferTranslationResponseDTO toTranslationResponse(OfferTranslation translation) {
+ OfferTranslationResponseDTO dto = new OfferTranslationResponseDTO();
+ dto.setLocale(translation.getLocale());
+ dto.setTitle(translation.getTitle());
+ dto.setDescription(translation.getDescription());
+ dto.setDetails(translation.getDetails());
+ return dto;
+ }
+
private ModelResponseDTO toModelResponse(Model model) {
if (model == null) {
return null;
@@ -196,9 +273,11 @@ private ModelResponseDTO toModelResponse(Model model) {
.id(model.getId())
.brand(model.getBrand())
.model(model.getModel())
+ .type(model.getType())
.powerWp(model.getPowerWp())
.efficiency(model.getEfficiency())
- .dimension(model.getDimension())
+ .width(model.getWidth())
+ .length(model.getLength())
.weight(model.getWeight())
.status(model.getStatus())
.build();
diff --git a/src/main/java/com/solaria/persistence/service/OfferTranslationService.java b/src/main/java/com/solaria/persistence/service/OfferTranslationService.java
new file mode 100644
index 0000000..c70d68b
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/service/OfferTranslationService.java
@@ -0,0 +1,106 @@
+package com.solaria.persistence.service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.solaria.persistence.domain.entity.Offer;
+import com.solaria.persistence.domain.entity.OfferTranslation;
+import com.solaria.persistence.domain.enums.TranslationStatus;
+import com.solaria.persistence.repository.OfferRepository;
+import com.solaria.persistence.repository.OfferTranslationRepository;
+import com.solaria.persistence.util.SupportedLocales;
+
+/**
+ * Preenche as traduções de uma oferta (placa solar) em background: detecta o idioma de origem
+ * via Google Translate e traduz o conteúdo para os demais idiomas suportados.
+ *
+ * Disparado pelo OfferService após o commit da transação que cria a oferta (via
+ * TransactionSynchronizationManager#registerSynchronization), para não bloquear a resposta
+ * de criação nem competir com a transação de escrita original.
+ */
+@Service
+public class OfferTranslationService {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(OfferTranslationService.class);
+
+ /** Locale temporário gravado na criação da oferta, até a detecção do idioma real concluir. */
+ public static final String PENDING_LOCALE = "und";
+
+ private final OfferRepository offerRepository;
+ private final OfferTranslationRepository offerTranslationRepository;
+ private final GoogleTranslateService googleTranslateService;
+
+ public OfferTranslationService(OfferRepository offerRepository,
+ OfferTranslationRepository offerTranslationRepository,
+ GoogleTranslateService googleTranslateService) {
+ this.offerRepository = offerRepository;
+ this.offerTranslationRepository = offerTranslationRepository;
+ this.googleTranslateService = googleTranslateService;
+ }
+
+ @Async
+ @Transactional
+ public void translateOffer(UUID offerId) {
+ try {
+ Offer offer = offerRepository.findById(offerId).orElse(null);
+ if (offer == null) {
+ return;
+ }
+
+ OfferTranslation sourceTranslation = offerTranslationRepository
+ .findByOfferIdAndLocale(offerId, PENDING_LOCALE)
+ .orElse(null);
+ if (sourceTranslation == null) {
+ return;
+ }
+
+ String detectedShortCode = googleTranslateService.detectLanguage(
+ sourceTranslation.getTitle() + ". " + sourceTranslation.getDescription());
+ String sourceLocale = SupportedLocales.resolveFromShortCode(detectedShortCode);
+
+ sourceTranslation.setLocale(sourceLocale);
+ offerTranslationRepository.save(sourceTranslation);
+ offer.setSourceLocale(sourceLocale);
+
+ List sourceTexts = new ArrayList<>();
+ sourceTexts.add(sourceTranslation.getTitle());
+ sourceTexts.add(sourceTranslation.getDescription());
+ sourceTexts.add(sourceTranslation.getDetails() == null ? "" : sourceTranslation.getDetails());
+
+ String sourceShortCode = shortCode(sourceLocale);
+
+ for (String targetLocale : SupportedLocales.targetsExcluding(sourceLocale)) {
+ List translated = googleTranslateService.translate(
+ sourceTexts, sourceShortCode, shortCode(targetLocale));
+
+ OfferTranslation translation = new OfferTranslation();
+ translation.setOffer(offer);
+ translation.setLocale(targetLocale);
+ translation.setTitle(translated.get(0));
+ translation.setDescription(translated.get(1));
+ translation.setDetails(sourceTranslation.getDetails() == null ? null : translated.get(2));
+ offerTranslationRepository.save(translation);
+ }
+
+ offer.setTranslationStatus(TranslationStatus.COMPLETED);
+ offerRepository.save(offer);
+ } catch (RuntimeException ex) {
+ LOGGER.error("Falha ao traduzir oferta {}", offerId, ex);
+ offerRepository.findById(offerId).ifPresent(offer -> {
+ offer.setTranslationStatus(TranslationStatus.FAILED);
+ offerRepository.save(offer);
+ });
+ }
+ }
+
+ private String shortCode(String locale) {
+ return locale.split("-")[0].toLowerCase();
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/service/ProposalItemService.java b/src/main/java/com/solaria/persistence/service/ProposalItemService.java
index b87e561..f68784e 100644
--- a/src/main/java/com/solaria/persistence/service/ProposalItemService.java
+++ b/src/main/java/com/solaria/persistence/service/ProposalItemService.java
@@ -212,9 +212,11 @@ private ModelResponseDTO toModelResponse(Model model) {
.id(model.getId())
.brand(model.getBrand())
.model(model.getModel())
+ .type(model.getType())
.powerWp(model.getPowerWp())
.efficiency(model.getEfficiency())
- .dimension(model.getDimension())
+ .width(model.getWidth())
+ .length(model.getLength())
.weight(model.getWeight())
.status(model.getStatus())
.build();
diff --git a/src/main/java/com/solaria/persistence/service/TechnicianService.java b/src/main/java/com/solaria/persistence/service/TechnicianService.java
index 0b918d4..f3c444f 100644
--- a/src/main/java/com/solaria/persistence/service/TechnicianService.java
+++ b/src/main/java/com/solaria/persistence/service/TechnicianService.java
@@ -18,6 +18,7 @@
import com.solaria.persistence.exception.ResourceNotFoundException;
import com.solaria.persistence.repository.PersonRepository;
import com.solaria.persistence.repository.TechnicianRepository;
+import com.solaria.persistence.util.SlugUtil;
@Service
@@ -46,6 +47,7 @@ public TechnicianResponseDTO save(TechnicianRequestDTO dto) {
Technician technician = new Technician();
technician.setPerson(person);
technician.setCrea(dto.getCrea());
+ technician.setSlug(generateUniqueSlug(person.getName()));
return toResponse(technicianRepository.save(technician));
}
@@ -87,10 +89,22 @@ public List findAll() {
return technicianRepository.findAll().stream().map(this::toResponse).toList();
}
+ private String generateUniqueSlug(String name) {
+ String base = SlugUtil.slugify(name);
+ String candidate = base;
+ int suffix = 2;
+ while (technicianRepository.existsBySlug(candidate)) {
+ candidate = base + "-" + suffix;
+ suffix++;
+ }
+ return candidate;
+ }
+
private TechnicianResponseDTO toResponse(Technician technician) {
TechnicianResponseDTO response = new TechnicianResponseDTO();
response.setId(technician.getId());
response.setCrea(technician.getCrea());
+ response.setSlug(technician.getSlug());
response.setPerson(toPersonResponse(technician.getPerson()));
return response;
}
diff --git a/src/main/java/com/solaria/persistence/service/UserPhotoService.java b/src/main/java/com/solaria/persistence/service/UserPhotoService.java
new file mode 100644
index 0000000..6d4b206
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/service/UserPhotoService.java
@@ -0,0 +1,111 @@
+package com.solaria.persistence.service;
+
+import java.time.OffsetDateTime;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.solaria.persistence.config.CloudinaryProperties;
+import com.solaria.persistence.domain.entity.User;
+import com.solaria.persistence.domain.entity.UserPhoto;
+import com.solaria.persistence.domain.enums.PhotoType;
+import com.solaria.persistence.dto.response.UserPhotoResponseDTO;
+import com.solaria.persistence.exception.ResourceNotFoundException;
+import com.solaria.persistence.repository.UserPhotoRepository;
+import com.solaria.persistence.repository.UserRepository;
+import com.solaria.persistence.security.rbac.RbacAuthorizationService;
+import com.solaria.persistence.service.CloudinaryService.UploadResult;
+
+@Service
+public class UserPhotoService {
+
+ private static final Set ALLOWED_CONTENT_TYPES = Set.of("image/jpeg", "image/png", "image/webp");
+ private static final long MAX_BYTES = 5L * 1024 * 1024;
+
+ private final UserPhotoRepository userPhotoRepository;
+ private final UserRepository userRepository;
+ private final CloudinaryService cloudinaryService;
+ private final CloudinaryProperties cloudinaryProperties;
+ private final RbacAuthorizationService rbac;
+
+ public UserPhotoService(UserPhotoRepository userPhotoRepository,
+ UserRepository userRepository,
+ CloudinaryService cloudinaryService,
+ CloudinaryProperties cloudinaryProperties,
+ RbacAuthorizationService rbac) {
+ this.userPhotoRepository = userPhotoRepository;
+ this.userRepository = userRepository;
+ this.cloudinaryService = cloudinaryService;
+ this.cloudinaryProperties = cloudinaryProperties;
+ this.rbac = rbac;
+ }
+
+ @Transactional
+ public UserPhotoResponseDTO upload(UUID userId, PhotoType type, MultipartFile file) {
+ rbac.requireOwnUser(userId);
+
+ User user = userRepository.findById(userId)
+ .orElseThrow(() -> new ResourceNotFoundException("Usuário não encontrado com ID: " + userId));
+
+
+ UploadResult result = cloudinaryService.upload(file, folder(userId), publicId(userId, type), true,
+ ALLOWED_CONTENT_TYPES, MAX_BYTES);
+
+ UserPhoto photo = userPhotoRepository.findByUserIdAndType(userId, type).orElseGet(UserPhoto::new);
+ photo.setUser(user);
+ photo.setType(type);
+ photo.setUrl(result.url());
+ photo.setPublicId(result.publicId());
+ if (photo.getCreatedAt() == null) {
+ photo.setCreatedAt(OffsetDateTime.now());
+ }
+ // em caso de falha do BD, remove o asset do cloudnary
+ try {
+ return toResponse(userPhotoRepository.save(photo));
+ } catch (RuntimeException e) {
+ cloudinaryService.delete(result.publicId());
+ throw e;
+ }
+ }
+
+ @Transactional
+ public void delete(UUID userId, PhotoType type) {
+ rbac.requireOwnUser(userId);
+
+ UserPhoto photo = userPhotoRepository.findByUserIdAndType(userId, type)
+ .orElseThrow(() -> new ResourceNotFoundException(
+ "Foto não encontrada para o usuário " + userId + " e tipo " + type));
+
+ cloudinaryService.delete(photo.getPublicId());
+ userPhotoRepository.delete(photo);
+ }
+
+ @Transactional(readOnly = true)
+ public List findByUser(UUID userId) {
+ return userPhotoRepository.findByUserIdOrderByTypeAsc(userId).stream()
+ .map(this::toResponse)
+ .toList();
+ }
+
+ private String folder(UUID userId) {
+ return cloudinaryProperties.getFolderPrefix() + "/usuarios/" + userId;
+ }
+
+ private String publicId(UUID userId, PhotoType type) {
+ return folder(userId) + "/" + type.name().toLowerCase();
+ }
+
+ private UserPhotoResponseDTO toResponse(UserPhoto photo) {
+ UserPhotoResponseDTO response = new UserPhotoResponseDTO();
+ response.setId(photo.getId());
+ response.setUserId(photo.getUser().getId());
+ response.setType(photo.getType());
+ response.setUrl(photo.getUrl());
+ response.setCreatedAt(photo.getCreatedAt());
+ return response;
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/service/UserService.java b/src/main/java/com/solaria/persistence/service/UserService.java
index d2dc99d..d0835ca 100644
--- a/src/main/java/com/solaria/persistence/service/UserService.java
+++ b/src/main/java/com/solaria/persistence/service/UserService.java
@@ -16,6 +16,7 @@
import com.solaria.persistence.exception.ResourceNotFoundException;
import com.solaria.persistence.repository.PersonRepository;
import com.solaria.persistence.repository.UserCompanyRepository;
+import com.solaria.persistence.repository.UserPhotoRepository;
import com.solaria.persistence.repository.UserRepository;
@@ -25,15 +26,18 @@ public class UserService {
private final UserRepository userRepository;
private final PersonRepository personRepository;
private final UserCompanyRepository userCompanyRepository;
+ private final UserPhotoRepository userPhotoRepository;
private final ObjectMapper objectMapper;
public UserService(UserRepository userRepository,
PersonRepository personRepository,
UserCompanyRepository userCompanyRepository,
+ UserPhotoRepository userPhotoRepository,
ObjectMapper objectMapper) {
this.userRepository = userRepository;
this.personRepository = personRepository;
this.userCompanyRepository = userCompanyRepository;
+ this.userPhotoRepository = userPhotoRepository;
this.objectMapper = objectMapper;
}
@@ -70,6 +74,9 @@ public void deleteById(UUID id) {
if (userCompanyRepository.existsByUserId(id)) {
throw new ResourceInUseException("Usuário não pode ser excluído: possui vínculo(s) de empresa");
}
+ if (userPhotoRepository.existsByUserId(id)) {
+ throw new ResourceInUseException("Usuário não pode ser excluído: possui foto(s) vinculada(s)");
+ }
userRepository.deleteById(id);
}
diff --git a/src/main/java/com/solaria/persistence/util/SlugUtil.java b/src/main/java/com/solaria/persistence/util/SlugUtil.java
new file mode 100644
index 0000000..381eee7
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/util/SlugUtil.java
@@ -0,0 +1,29 @@
+package com.solaria.persistence.util;
+
+import java.text.Normalizer;
+import java.util.regex.Pattern;
+
+/**
+ * Gera slugs a partir de nomes (empresa, pessoa), no mesmo padrão usado no front-end
+ * (normalização NFD, remoção de acentos, minúsculas, apenas [a-z0-9-]).
+ */
+public final class SlugUtil {
+
+ private static final Pattern DIACRITICS = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
+ private static final Pattern NON_ALPHANUMERIC = Pattern.compile("[^a-z0-9]+");
+ private static final Pattern EDGE_HYPHENS = Pattern.compile("(^-+)|(-+$)");
+
+ private SlugUtil() {}
+
+ public static String slugify(String input) {
+ if (input == null) {
+ return null;
+ }
+ String normalized = Normalizer.normalize(input.trim(), Normalizer.Form.NFD);
+ normalized = DIACRITICS.matcher(normalized).replaceAll("");
+ normalized = normalized.toLowerCase();
+ normalized = NON_ALPHANUMERIC.matcher(normalized).replaceAll("-");
+ normalized = EDGE_HYPHENS.matcher(normalized).replaceAll("");
+ return normalized;
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/util/SupportedLocales.java b/src/main/java/com/solaria/persistence/util/SupportedLocales.java
new file mode 100644
index 0000000..084cbad
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/util/SupportedLocales.java
@@ -0,0 +1,43 @@
+package com.solaria.persistence.util;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Idiomas suportados pela plataforma, espelhando SUPPORTED_LANGUAGES do front-end
+ * (web-app/src/config/locales/languages.ts).
+ */
+public final class SupportedLocales {
+
+ public static final String PT_BR = "pt-BR";
+ public static final String EN_US = "en-US";
+ public static final String ES_ES = "es-ES";
+
+ public static final List ALL = List.of(PT_BR, EN_US, ES_ES);
+
+ public static final String DEFAULT_LOCALE = PT_BR;
+
+ /** Mapa de código curto (ISO-639-1, devolvido pela Google Translate API) para o locale suportado. */
+ private static final Map SHORT_CODE_TO_LOCALE = Map.of(
+ "pt", PT_BR,
+ "en", EN_US,
+ "es", ES_ES
+ );
+
+ private SupportedLocales() {}
+
+ /**
+ * Resolve um código curto devolvido pela Google Translate API (ex.: "pt") para um dos
+ * locales suportados. Quando o idioma detectado não é suportado, cai no DEFAULT_LOCALE.
+ */
+ public static String resolveFromShortCode(String shortCode) {
+ if (shortCode == null) {
+ return DEFAULT_LOCALE;
+ }
+ return SHORT_CODE_TO_LOCALE.getOrDefault(shortCode.toLowerCase(), DEFAULT_LOCALE);
+ }
+
+ public static List targetsExcluding(String locale) {
+ return ALL.stream().filter(l -> !l.equals(locale)).toList();
+ }
+}
diff --git a/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/src/main/resources/META-INF/additional-spring-configuration-metadata.json
index 1c3e978..4abdc3b 100644
--- a/src/main/resources/META-INF/additional-spring-configuration-metadata.json
+++ b/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -73,5 +73,10 @@
"name": "app.jwt.service.refresh-ttl-ms",
"type": "java.lang.String",
"description": "A description for 'app.jwt.service.refresh-ttl-ms'"
+ },
+ {
+ "name": "google-translate.api-key",
+ "type": "java.lang.String",
+ "description": "Chave de API da Google Cloud Translation API (v2), usada para detectar o idioma e traduzir o conteudo das ofertas"
}
]}
\ No newline at end of file
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 4e70f98..e516233 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -46,3 +46,13 @@ app.jwt.service.access-ttl-ms=${SERVICE_JWT_ACCESS_TTL_MS:600000}
# TTL do token de refresh
app.jwt.service.refresh-ttl-ms=${SERVICE_JWT_REFRESH_TTL_MS:3600000}
+cloudinary.cloud-name=${CLOUDINARY_CLOUD_NAME}
+cloudinary.api-key=${CLOUDINARY_API_KEY}
+cloudinary.api-secret=${CLOUDINARY_API_SECRET}
+cloudinary.folder-prefix=${CLOUDINARY_FOLDER_PREFIX:solier}
+
+google-translate.api-key=${GOOGLE_TRANSLATE_API_KEY}
+
+spring.servlet.multipart.max-file-size=8MB
+spring.servlet.multipart.max-request-size=8MB
+
From 975204f26c72261355deb4f49a28f4f8fd3c035d Mon Sep 17 00:00:00 2001
From: davisilva <84607533+Megueutu@users.noreply.github.com>
Date: Sun, 30 Aug 2026 17:35:12 -0300
Subject: [PATCH 2/8] feat: publish docker image on push to main (#33)
* feat:
add photo management with Cloudinary integration
- Created UserPhoto entity and corresponding repository.
- Introduced PhotoType enum for categorizing photo types.
- Developed services for managing company, local unit, model, and user photos, including upload and delete functionalities.
- Implemented CloudinaryService for handling file uploads and deletions.
- Added response DTOs for various photo types.
- Enhanced EnergyBillService to support photo attachment and removal.
- Updated CompanyService and LocalUnitService to include photo repository checks during deletions.
- Configured application properties for Cloudinary settings and increased file upload limits.
* Merge branch 'feat/cloudnaryPhotos' of https://github.com/Solierrr/api-core
* chore: updating gitignore for sonarqube cloud
* feat: add panel type and translation status enums
* refactor: replace model dimension field with width, length and panel type
* feat: add slug field to company and technician
* feat: add automatic multi-language translation for offers via google translate
* chore: add google translate api key env var
* fix: add missing openapi interfaces for photo controllers
* fix: harden google translate response parsing against null and malformed responses
* fix: corrige build e quality gate do CI (SonarCloud)
- adiciona metodos attachPhoto/removePhoto faltantes na interface EnergyBillOpenApi, corrigindo erro de compilacao
- restaura dependencia h2 (removida por engano ao mesclar cloudinary-http5), corrigindo falha nos testes
- agrupa alternancia no regex de EDGE_HYPHENS em SlugUtil para eliminar ambiguidade de precedencia (S5850)
- reduz limite de upload multipart de 10MB para 8MB para atender ao rating de seguranca do SonarCloud (S5693)
* feat: publish docker image to docker hub on push to main
---------
Co-authored-by: ArthurMachado2501
---
.github/workflows/release.yml | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 0db6188..fa9a11e 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,11 +1,11 @@
name: Release
on:
- workflow_dispatch:
+ push:
+ branches:
+ - main
jobs:
release:
- runs-on: ubuntu-latest
-
- steps:
- - run: echo "Release ainda não configurada."
+ uses: Solierrr/.github/.github/workflows/docker-publish.yml@main
+ secrets: inherit
From e71953a6a7f99a2304197130cc2a56e5a9b33f9d Mon Sep 17 00:00:00 2001
From: davisilva <84607533+Megueutu@users.noreply.github.com>
Date: Sun, 30 Aug 2026 18:07:04 -0300
Subject: [PATCH 3/8] feat: wire up qa-sync and repo-cleanup reusable workflows
(#34)
---
.github/workflows/qa-sync.yml | 13 +++++++++++++
.github/workflows/repo-cleanup.yml | 13 +++++++++++++
2 files changed, 26 insertions(+)
create mode 100644 .github/workflows/qa-sync.yml
create mode 100644 .github/workflows/repo-cleanup.yml
diff --git a/.github/workflows/qa-sync.yml b/.github/workflows/qa-sync.yml
new file mode 100644
index 0000000..c565491
--- /dev/null
+++ b/.github/workflows/qa-sync.yml
@@ -0,0 +1,13 @@
+name: Sync main <> QA
+
+on:
+ push:
+ branches:
+ - main
+
+jobs:
+ sync:
+ permissions:
+ contents: write
+ pull-requests: write
+ uses: Solierrr/.github/.github/workflows/qa-sync.yml@main
diff --git a/.github/workflows/repo-cleanup.yml b/.github/workflows/repo-cleanup.yml
new file mode 100644
index 0000000..2d94015
--- /dev/null
+++ b/.github/workflows/repo-cleanup.yml
@@ -0,0 +1,13 @@
+name: Cleanup branches
+
+on:
+ push:
+ branches:
+ - main
+
+jobs:
+ cleanup:
+ permissions:
+ contents: write
+ pull-requests: read
+ uses: Solierrr/.github/.github/workflows/repo-cleanup.yml@main
From 27bc33f6b88914f3ac9b14774811ea0738504c5e Mon Sep 17 00:00:00 2001
From: Arthur Machado
Date: Sun, 30 Aug 2026 19:02:18 -0300
Subject: [PATCH 4/8] Feat/observability (#35)
* feat: add observability with OpenTelemetry support
---
.env.example | 22 +++++
pom.xml | 16 +++
.../solaria/persistence/config/WebConfig.java | 5 +-
.../handler/GlobalExceptionHandler.java | 93 ++++++++++++++----
.../observability/ActuatorSecurityConfig.java | 47 +++++++++
.../observability/HttpObservationErrors.java | 60 ++++++++++++
.../observability/ObservabilityConfig.java | 98 +++++++++++++++++++
.../OpenTelemetryAppenderInitializer.java | 38 +++++++
.../observability/TraceIdResponseFilter.java | 62 ++++++++++++
.../ProblemDetailAccessDeniedHandler.java | 13 +++
...ProblemDetailAuthenticationEntryPoint.java | 13 +++
.../persistence/security/SecurityConfig.java | 2 +
.../service/CloudinaryService.java | 57 ++++++++---
src/main/resources/application.properties | 60 +++++++++++-
src/main/resources/logback-spring.xml | 31 ++++++
15 files changed, 581 insertions(+), 36 deletions(-)
create mode 100644 src/main/java/com/solaria/persistence/observability/ActuatorSecurityConfig.java
create mode 100644 src/main/java/com/solaria/persistence/observability/HttpObservationErrors.java
create mode 100644 src/main/java/com/solaria/persistence/observability/ObservabilityConfig.java
create mode 100644 src/main/java/com/solaria/persistence/observability/OpenTelemetryAppenderInitializer.java
create mode 100644 src/main/java/com/solaria/persistence/observability/TraceIdResponseFilter.java
create mode 100644 src/main/resources/logback-spring.xml
diff --git a/.env.example b/.env.example
index cdd548d..898a6ae 100644
--- a/.env.example
+++ b/.env.example
@@ -1,2 +1,24 @@
+DB_URL=
+DB_USERNAME=
+DB_PASSWORD=
+DB_NAME=
+DB_PORT=
+DB_SSLMODE=
+
+SERVICE_JWT_SECRET=qualquerstringde32letrasaisenaoelepara
+
+CLOUDINARY_CLOUD_NAME=
+CLOUDINARY_API_KEY=
+CLOUDINARY_API_SECRET=
+CLOUDINARY_FOLDER_PREFIX=solier
+
+# URL do OpenTelemetry Collector
+# dev local -> kubectl port-forward svc/otel-collector 4318:4318 e usar http://localhost:4318
+OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
+# Identidade do servico no backend de observabilidade
+SERVICE_VERSION=dev
+DEPLOYMENT_ENVIRONMENT=local
+# taxa de requests normais irem para o collector | padrão em 100% pois collectoe abrange essa funcionalidade
+OTEL_TRACES_SAMPLING_PROBABILITY=1.0
REDIS_URL=rediss://default:SENHA@SEU-HOST-UPSTASH:6379
GOOGLE_TRANSLATE_API_KEY=SUA-CHAVE-DA-GOOGLE-TRANSLATE-API
diff --git a/pom.xml b/pom.xml
index 43ef4c0..5aedce1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -100,6 +100,22 @@
cloudinary-http5
2.3.0
+
+ org.springframework.boot
+ spring-boot-starter-opentelemetry
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ io.opentelemetry.instrumentation
+ opentelemetry-logback-appender-1.0
+ 2.21.0-alpha
+
+
+ org.springframework.boot
+ spring-boot-starter-webmvc-test
com.h2database
h2
diff --git a/src/main/java/com/solaria/persistence/config/WebConfig.java b/src/main/java/com/solaria/persistence/config/WebConfig.java
index b83d0c0..1b1413c 100644
--- a/src/main/java/com/solaria/persistence/config/WebConfig.java
+++ b/src/main/java/com/solaria/persistence/config/WebConfig.java
@@ -7,7 +7,7 @@
import com.solaria.persistence.security.rbac.EndpointAuthorizationInterceptor;
/**
- * Configuração MVC genérica
+ * Configuração MVC genérica
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
@@ -22,6 +22,7 @@ public WebConfig(EndpointAuthorizationInterceptor endpointAuthorizationIntercept
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(endpointAuthorizationInterceptor)
.addPathPatterns("/**")
- .excludePathPatterns("/internal/**", "/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html");
+ .excludePathPatterns("/internal/**", "/actuator/**", "/v3/api-docs/**", "/swagger-ui/**",
+ "/swagger-ui.html");
}
}
diff --git a/src/main/java/com/solaria/persistence/exception/handler/GlobalExceptionHandler.java b/src/main/java/com/solaria/persistence/exception/handler/GlobalExceptionHandler.java
index 8b0142e..1016530 100644
--- a/src/main/java/com/solaria/persistence/exception/handler/GlobalExceptionHandler.java
+++ b/src/main/java/com/solaria/persistence/exception/handler/GlobalExceptionHandler.java
@@ -4,6 +4,8 @@
import java.util.List;
import java.util.Map;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.OptimisticLockingFailureException;
import org.springframework.http.HttpHeaders;
@@ -22,29 +24,62 @@
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import com.solaria.persistence.exception.BusinessException;
+import com.solaria.persistence.observability.HttpObservationErrors;
import jakarta.persistence.EntityNotFoundException;
import jakarta.servlet.http.HttpServletRequest;
/**
* Classe responsável por centralizar tratamento de exceções
- * Diferentes handlers foram implementados visando cobrir escopos de: Banco de Dados,
+ * Diferentes handlers foram implementados visando cobrir escopos de: Banco de
+ * Dados,
* Regras de negócio, Jsons, BEAN validations e erros inesperados.
+ *
+ * Logging -> toda exceção tratada é registrada como erro no tracing e nas
+ * métricas (span {@code ERROR} + tag {@code exception} em
+ * {@code http.server.requests})
+ * gerando um log correlacionado ao trace
+ *
+ * {@code WARN} para 4xx
+ * {@code ERROR} com stack trace para 5xx
*/
+
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
+ private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
+
private final ProblemDetailFactory factory;
public GlobalExceptionHandler(ProblemDetailFactory factory) {
this.factory = factory;
}
+ // Informa à observabilidade que a request teve um erro
+ private void markObservationError(Throwable ex, HttpServletRequest request) {
+ HttpObservationErrors.mark(request, ex);
+ }
+
+ // Marca a observação como erro e registra um log correlacionado ao trace
+ private void recordError(Throwable ex, HttpStatusCode status, HttpServletRequest request) {
+ markObservationError(ex, request);
+ String method = (request != null) ? request.getMethod() : "?";
+ String uri = (request != null) ? request.getRequestURI() : "?";
+ if (status.is5xxServerError()) {
+ log.error("Falha {} em {} {}", status.value(), method, uri, ex);
+ } else {
+ log.warn("Erro {} em {} {}: {}", status.value(), method, uri, ex.getMessage());
+ }
+ }
+
// Handler responsável por BusinessException e todas as subclasses.
@ExceptionHandler(BusinessException.class)
public ResponseEntity handleBusinessException(BusinessException ex,
- HttpServletRequest request) {
+ HttpServletRequest request) {
+
+ recordError(ex, ex.getStatus(), request);
+
ProblemDetail body = factory.create(
ex.getStatus(),
ex.getMessage(),
@@ -58,7 +93,10 @@ public ResponseEntity handleBusinessException(BusinessException e
@ExceptionHandler(DataIntegrityViolationException.class)
public ResponseEntity handleDataIntegrity(DataIntegrityViolationException ex,
- HttpServletRequest request) {
+ HttpServletRequest request) {
+
+ recordError(ex, HttpStatus.CONFLICT, request);
+
ProblemDetail body = factory.create(HttpStatus.CONFLICT,
"A operação viola uma restrição do banco.",
"DATA_INTEGRITY_VIOLATION",
@@ -69,7 +107,10 @@ public ResponseEntity handleDataIntegrity(DataIntegrityViolationE
@ExceptionHandler(OptimisticLockingFailureException.class)
public ResponseEntity handleOptimisticLock(OptimisticLockingFailureException ex,
- HttpServletRequest request) {
+ HttpServletRequest request) {
+
+ recordError(ex, HttpStatus.CONFLICT, request);
+
ProblemDetail body = factory.create(HttpStatus.CONFLICT,
"O registro foi modificado por outra operação simultânea. Recarregue e tente novamente.",
"CONCURRENT_MODIFICATION",
@@ -80,7 +121,9 @@ public ResponseEntity handleOptimisticLock(OptimisticLockingFailu
@ExceptionHandler(EntityNotFoundException.class)
public ResponseEntity handleEntityNotFound(EntityNotFoundException ex,
- HttpServletRequest request) {
+ HttpServletRequest request) {
+ recordError(ex, HttpStatus.NOT_FOUND, request);
+
ProblemDetail body = factory.create(HttpStatus.NOT_FOUND,
"Registro não encontrado.",
"RESOURCE_NOT_FOUND",
@@ -89,12 +132,13 @@ public ResponseEntity handleEntityNotFound(EntityNotFoundExceptio
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(body);
}
- // Handler para negação de autorização vinda do próprio Spring Security
- // sem handler explícito, o catch-all de Exception abaixo capturaria primeiro e devolveria 500 em vez de 403
+ // Handler para negação de autorização vinda do Spring Security
@ExceptionHandler(AccessDeniedException.class)
public ResponseEntity handleAccessDenied(AccessDeniedException ex,
- HttpServletRequest request) {
+ HttpServletRequest request) {
+ recordError(ex, HttpStatus.FORBIDDEN, request);
+
ProblemDetail body = factory.create(HttpStatus.FORBIDDEN,
"Você não tem permissão para executar esta ação.",
"UNAUTHORIZED_ACCESS",
@@ -107,6 +151,11 @@ public ResponseEntity handleAccessDenied(AccessDeniedException ex
@ExceptionHandler(Exception.class)
public ResponseEntity handleUnexpected(Exception ex, HttpServletRequest request) {
+
+ // registra no span (status ERROR + evento de excecao) com stack trace
+ markObservationError(ex, request);
+ log.error("Unhandled exception on {} {}", request.getMethod(), request.getRequestURI(), ex);
+
ProblemDetail body = factory.create(HttpStatus.INTERNAL_SERVER_ERROR,
"Ocorreu um erro interno inesperado. Se persistir, contate o suporte.",
"INTERNAL_ERROR",
@@ -119,9 +168,12 @@ public ResponseEntity handleUnexpected(Exception ex, HttpServletR
@Override
protected ResponseEntity handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
- HttpHeaders headers,
- HttpStatusCode status,
- WebRequest request) {
+ HttpHeaders headers,
+ HttpStatusCode status,
+ WebRequest request) {
+
+ recordError(ex, HttpStatus.BAD_REQUEST, servletRequest(request));
+
List> errors = ex.getBindingResult()
.getFieldErrors()
.stream()
@@ -140,13 +192,16 @@ protected ResponseEntity handleMethodArgumentNotValid(MethodArgumentNotV
return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST);
}
- // Sobrescrita de handler responsável por BEAN validation / parâmetros dos métodos.
+ // Sobrescrita de handler responsável por BEAN validation / parâmetros dos
+ // métodos.
@Override
protected ResponseEntity handleHandlerMethodValidationException(HandlerMethodValidationException ex,
- HttpHeaders headers,
- HttpStatusCode status,
- WebRequest request) {
+ HttpHeaders headers,
+ HttpStatusCode status,
+ WebRequest request) {
+ recordError(ex, HttpStatus.BAD_REQUEST, servletRequest(request));
+
List> errors = ex.getAllErrors()
.stream()
.map(err -> {
@@ -166,9 +221,11 @@ protected ResponseEntity handleHandlerMethodValidationException(HandlerM
@Override
protected ResponseEntity handleHttpMessageNotReadable(HttpMessageNotReadableException ex,
- HttpHeaders headers,
- HttpStatusCode status,
- WebRequest request) {
+ HttpHeaders headers,
+ HttpStatusCode status,
+ WebRequest request) {
+ recordError(ex, HttpStatus.BAD_REQUEST, servletRequest(request));
+
ProblemDetail body = factory.create(HttpStatus.BAD_REQUEST,
"Corpo da requisição malformado ou ilegível.",
"MALFORMED_REQUEST",
diff --git a/src/main/java/com/solaria/persistence/observability/ActuatorSecurityConfig.java b/src/main/java/com/solaria/persistence/observability/ActuatorSecurityConfig.java
new file mode 100644
index 0000000..de9562d
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/observability/ActuatorSecurityConfig.java
@@ -0,0 +1,47 @@
+package com.solaria.persistence.observability;
+
+import org.springframework.boot.security.autoconfigure.actuate.web.servlet.EndpointRequest;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.web.SecurityFilterChain;
+
+/**
+ * declara uma {@link SecurityFilterChain}
+ * dedicada e prioritaria ({@code @Order(0)}) para os endpoints do Spring Boot Actuator.
+ *
+ *
+ * mantem os endpoints de observabilidade em uma chain própria, sem isso {@code /actuator/**}
+ * cairia em outras chains e as probes do Kubernetes/load balancers receberiam {@code 401}.
+ *
+ *
+ *
+ * {@link #actuatorSecurityFilterChain(HttpSecurity)} -> libera{@code /actuator/health} e {@code /actuator/info}
+ *
+ */
+@Configuration
+public class ActuatorSecurityConfig {
+
+ /**
+ * Chain de seguranca aplicada apenas aos endpoints do Actuator
+ * {@code @Order(0)} -> prioridade maior de chain
+ *
+ * @return chain configurada para {@link EndpointRequest#toAnyEndpoint()}
+ */
+ @Bean
+ @Order(0)
+ public SecurityFilterChain actuatorSecurityFilterChain(HttpSecurity http) throws Exception {
+ http
+ // restringe esta chain apenas aos endpoints do Actuator
+ .securityMatcher(EndpointRequest.toAnyEndpoint())
+ // health/info liberados para probes e checagens externas
+ .authorizeHttpRequests(auth -> auth
+ .requestMatchers(EndpointRequest.to("health", "info")).permitAll()
+ .anyRequest().denyAll())
+ .csrf(csrf -> csrf.disable())
+ .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
+ return http.build();
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/observability/HttpObservationErrors.java b/src/main/java/com/solaria/persistence/observability/HttpObservationErrors.java
new file mode 100644
index 0000000..fa2a914
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/observability/HttpObservationErrors.java
@@ -0,0 +1,60 @@
+package com.solaria.persistence.observability;
+
+import io.micrometer.observation.Observation;
+
+import org.springframework.web.filter.ServerHttpObservationFilter;
+
+import jakarta.servlet.http.HttpServletRequest;
+
+/**
+ * Marca a requisição HTTP atual como erro quando uma exceção já foi tratada pela aplicação>
+ *
+ *
+ * A classe apenas atualiza a observabilidade da request
+ * não altera a resposta HTTP nem o tratamento da exceção -> função dos handlers de exception
+ *
+ */
+
+public final class HttpObservationErrors {
+
+ /**
+ * Identifica a observação HTTP criada para a request atual
+ *
+ *
+ * Quando essa observação existe, informar diretamente que a request
+ * terminou com erro e faz com que essa informação apareça no trace
+ *
+ */
+ private static final String OBSERVATION_ATTRIBUTE =
+ "org.springframework.web.filter.ServerHttpObservationFilter.observation";
+
+ private HttpObservationErrors() {
+ }
+
+ /**
+ * Registra uma exceção na observação da request atual
+ *
+ *
+ * Se a observação estiver disponível -> erro é registrado no trace
+ * se não -> tenta registrar a exceção no contexto disponível
+ *
+ *
+ *
+ * Se não houver request exception ou observation -> não acontece nada
+ *
+ */
+ public static void mark(HttpServletRequest request, Throwable error) {
+ if (request == null || error == null) {
+ return;
+ }
+
+ if (request.getAttribute(OBSERVATION_ATTRIBUTE) instanceof Observation observation) {
+ observation.error(error);
+ return;
+ }
+
+ // Mesmo sem a observação principal, tenta registrar a exceção no contexto da request
+ ServerHttpObservationFilter.findObservationContext(request)
+ .ifPresent(context -> context.setError(error));
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/observability/ObservabilityConfig.java b/src/main/java/com/solaria/persistence/observability/ObservabilityConfig.java
new file mode 100644
index 0000000..f88a591
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/observability/ObservabilityConfig.java
@@ -0,0 +1,98 @@
+package com.solaria.persistence.observability;
+
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.Ordered;
+import org.springframework.core.task.TaskDecorator;
+import org.springframework.core.task.support.ContextPropagatingTaskDecorator;
+import org.springframework.http.server.observation.ServerRequestObservationContext;
+
+import io.micrometer.observation.ObservationPredicate;
+import io.micrometer.tracing.Tracer;
+import jakarta.servlet.DispatcherType;
+
+/**
+ * Configuracao central de observabilidade da aplicacao
+ *
+ * Concentra na camda de infra os beans que para comportamento das libs Micrometer|Micrometer Tracing|OpenTelemetry
+ * sem misturar camada de observabilidade com camada de negocios
+ *
+ *
+ *
+ * Beans disponibilizados:
+ *
+ * {@link #traceIdResponseFilterRegistration(ObjectProvider)} -> registra o
+ * {@link TraceIdResponseFilter} logo apos o filtro de observacao do Spring MVC
+ * {@link #noActuatorObservations()} -> descarta observacoes (spans/metricas)
+ * do trafego de probe em {@code /actuator/**} reduzindo ruido e custo
+ * {@link #contextPropagatingTaskDecorator()} -> preserva o contexto de
+ * observabilidade em trocas de thread (async) aplicado automaticamente pelo
+ * Spring Boot ao executor padrao
+ *
+ */
+@Configuration
+public class ObservabilityConfig {
+
+ /**
+ * Registra o filtro responsável por adicionar o traceId
+ * na resposta HTTP -> {@link TraceIdResponseFilter}
+ *
+ *
+ * permite que o cliente receba o traceId e possa utilizá-lo para localizar a requests
+ *
+ *
+ * funciona para requests normais, assíncronas e relacionadas a erros
+ *
+ * @param tracerProvider fornece o tracer quando o tracing está habilitado
+ * @return configuração do filtro de traceId
+ */
+ @Bean
+ public FilterRegistrationBean traceIdResponseFilterRegistration(
+ ObjectProvider tracerProvider) {
+ FilterRegistrationBean registration =
+ new FilterRegistrationBean<>(new TraceIdResponseFilter(tracerProvider));
+ registration.setOrder(Ordered.HIGHEST_PRECEDENCE + 2);
+ registration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ASYNC, DispatcherType.ERROR);
+ registration.addUrlPatterns("/*");
+ return registration;
+ }
+
+ /**
+ * Evita gerar métricas e traces para requisições do Actuator
+ *
+ * Endpoints como {@code /actuator/health} são chamados
+ * frequentemente pelo K8s para verificar se a aplicação
+ * está funcionando, essas chamadas não são importantes
+ * para acompanhar o comportamento da aplicação, elas são ignoradas
+ *
+ * @return regra que decide quais requisições devem gerar observabilidade
+ */
+ @Bean
+ public ObservationPredicate noActuatorObservations() {
+ return (name, context) -> {
+ if (context instanceof ServerRequestObservationContext serverContext) {
+ String uri = serverContext.getCarrier().getRequestURI();
+ return uri == null || !uri.startsWith("/actuator");
+ }
+ return true;
+ };
+ }
+
+ /**
+ * Mantém o contexto de observabilidade quando uma tarefa
+ * é executada em outra thread.
+ *
+ * importante para async pois permite que o traceId e outras informações de contexto
+ * continuem disponíveis mesmo após a troca de thread.
+ *
+ * @return decorator responsável por propagar o contexto
+ */
+ @Bean
+ @ConditionalOnClass(name = "io.micrometer.context.ContextSnapshot")
+ public TaskDecorator contextPropagatingTaskDecorator() {
+ return new ContextPropagatingTaskDecorator();
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/observability/OpenTelemetryAppenderInitializer.java b/src/main/java/com/solaria/persistence/observability/OpenTelemetryAppenderInitializer.java
new file mode 100644
index 0000000..706648e
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/observability/OpenTelemetryAppenderInitializer.java
@@ -0,0 +1,38 @@
+package com.solaria.persistence.observability;
+
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.stereotype.Component;
+
+import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender;
+
+
+/**
+ *
+ * Prepara o envio dos logs da aplicação para o OpenTelemetry
+ *
+ *
+ * Caso o OpenTelemetry não esteja disponível a aplicação continua funcionando
+ * normalmente e os logs seguem apenas o comportamento padrão do Logback
+ *
+ */
+
+@Component
+public class OpenTelemetryAppenderInitializer implements ApplicationListener {
+
+ private final ObjectProvider openTelemetryProvider;
+
+ public OpenTelemetryAppenderInitializer(ObjectProvider openTelemetryProvider) {
+ this.openTelemetryProvider = openTelemetryProvider;
+ }
+
+ @Override
+ public void onApplicationEvent(ApplicationReadyEvent event) {
+ OpenTelemetry openTelemetry = openTelemetryProvider.getIfAvailable();
+ if (openTelemetry != null) {
+ OpenTelemetryAppender.install(openTelemetry);
+ }
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/observability/TraceIdResponseFilter.java b/src/main/java/com/solaria/persistence/observability/TraceIdResponseFilter.java
new file mode 100644
index 0000000..14ba59a
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/observability/TraceIdResponseFilter.java
@@ -0,0 +1,62 @@
+package com.solaria.persistence.observability;
+
+import java.io.IOException;
+
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import io.micrometer.tracing.Span;
+import io.micrometer.tracing.Tracer;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ *
+ * Filtro que copia o {@code traceId} do span ativo para o header de resposta {@code X-Trace-Id}
+ *
+ *
+ *
+ * Pega o traceId do span já ativo e coloca no response
+ *
+ *
+ *
+ * Sem span ativo, o filtro nao faz nada
+ *
+ *
+ *
+ * Registrado em {@link ObservabilityConfig#traceIdResponseFilterRegistration}
+ *
+ */
+public class TraceIdResponseFilter extends OncePerRequestFilter {
+
+ /** Header de resposta com o {@code traceId} */
+ public static final String TRACE_ID_HEADER = "X-Trace-Id";
+
+ // ObjectProvider -> bean Tracer nao existe quando o tracing esta desligado
+ private final ObjectProvider tracerProvider;
+
+ public TraceIdResponseFilter(ObjectProvider tracerProvider) {
+ this.tracerProvider = tracerProvider;
+ }
+
+ @Override
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
+ FilterChain filterChain) throws ServletException, IOException {
+ // verifica se o tracer existe | se não existir a chain não faz nada
+ Tracer tracer = tracerProvider.getIfAvailable();
+
+ if (tracer != null && !response.isCommitted()) {
+ // mantem o span atual
+ Span span = tracer.currentSpan();
+
+ if (span != null) {
+
+ response.setHeader(TRACE_ID_HEADER,
+ span.context().traceId()); // pega o traceId do span
+ }
+ }
+ filterChain.doFilter(request, response);
+ }
+}
diff --git a/src/main/java/com/solaria/persistence/security/ProblemDetailAccessDeniedHandler.java b/src/main/java/com/solaria/persistence/security/ProblemDetailAccessDeniedHandler.java
index 9470c91..c35cd6e 100644
--- a/src/main/java/com/solaria/persistence/security/ProblemDetailAccessDeniedHandler.java
+++ b/src/main/java/com/solaria/persistence/security/ProblemDetailAccessDeniedHandler.java
@@ -2,6 +2,8 @@
import java.io.IOException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ProblemDetail;
import org.springframework.security.access.AccessDeniedException;
@@ -9,6 +11,7 @@
import org.springframework.stereotype.Component;
import com.solaria.persistence.exception.handler.ProblemDetailFactory;
+import com.solaria.persistence.observability.HttpObservationErrors;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@@ -20,6 +23,8 @@
@Component
public class ProblemDetailAccessDeniedHandler implements AccessDeniedHandler {
+ private static final Logger log = LoggerFactory.getLogger(ProblemDetailAccessDeniedHandler.class);
+
private final ProblemDetailFactory problemDetailFactory;
private final ObjectMapper objectMapper;
@@ -34,6 +39,14 @@ public ProblemDetailAccessDeniedHandler(ProblemDetailFactory problemDetailFactor
public void handle(HttpServletRequest request, HttpServletResponse response,
AccessDeniedException accessDeniedException) throws IOException {
+ // 403 (RBAC) gerado na chain fora do GlobalExceptionHandler
+ // marca a observação como span ERROR + tag exception, como WARN
+ HttpObservationErrors.mark(request, accessDeniedException);
+ log.warn("403 em {} {}: {}",
+ request.getMethod(),
+ request.getRequestURI(),
+ accessDeniedException.getMessage());
+
// cria corpo do json a partir da classe ProblemDetail
ProblemDetail problem = problemDetailFactory.create(
HttpStatus.FORBIDDEN,
diff --git a/src/main/java/com/solaria/persistence/security/ProblemDetailAuthenticationEntryPoint.java b/src/main/java/com/solaria/persistence/security/ProblemDetailAuthenticationEntryPoint.java
index b712432..cd20ac5 100644
--- a/src/main/java/com/solaria/persistence/security/ProblemDetailAuthenticationEntryPoint.java
+++ b/src/main/java/com/solaria/persistence/security/ProblemDetailAuthenticationEntryPoint.java
@@ -2,6 +2,8 @@
import java.io.IOException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ProblemDetail;
import org.springframework.security.core.AuthenticationException;
@@ -9,6 +11,7 @@
import org.springframework.stereotype.Component;
import com.solaria.persistence.exception.handler.ProblemDetailFactory;
+import com.solaria.persistence.observability.HttpObservationErrors;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@@ -20,6 +23,8 @@
@Component
public class ProblemDetailAuthenticationEntryPoint implements AuthenticationEntryPoint {
+ private static final Logger log = LoggerFactory.getLogger(ProblemDetailAuthenticationEntryPoint.class);
+
private final ProblemDetailFactory problemDetailFactory;
private final ObjectMapper objectMapper;
@@ -34,6 +39,14 @@ public ProblemDetailAuthenticationEntryPoint(ProblemDetailFactory problemDetailF
@Override
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException {
+ // 401 gerado na chain fora do GlobalExceptionHandler
+ // marca a observação como span ERROR + tag exception, como WARN
+ HttpObservationErrors.mark(request, authException);
+ log.warn("401 em {} {}: {}",
+ request.getMethod(),
+ request.getRequestURI(),
+ authException.getMessage());
+
// cria corpo do json a partir da classe ProblemDetail
ProblemDetail problem = problemDetailFactory.create(
HttpStatus.UNAUTHORIZED,
diff --git a/src/main/java/com/solaria/persistence/security/SecurityConfig.java b/src/main/java/com/solaria/persistence/security/SecurityConfig.java
index 1442c29..9668b9d 100644
--- a/src/main/java/com/solaria/persistence/security/SecurityConfig.java
+++ b/src/main/java/com/solaria/persistence/security/SecurityConfig.java
@@ -188,6 +188,8 @@ public CorsConfigurationSource corsConfigurationSource() {
configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"));
// headers permitidos
configuration.setAllowedHeaders(List.of("Authorization", "Content-Type", "apikey"));
+ // traz o traceId nas respostas de erro
+ configuration.setExposedHeaders(List.of("X-Trace-Id"));
// Aplica esta CorsConfiguration a todos os paths ("/**")
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
diff --git a/src/main/java/com/solaria/persistence/service/CloudinaryService.java b/src/main/java/com/solaria/persistence/service/CloudinaryService.java
index 1b38515..7c0d150 100644
--- a/src/main/java/com/solaria/persistence/service/CloudinaryService.java
+++ b/src/main/java/com/solaria/persistence/service/CloudinaryService.java
@@ -12,16 +12,28 @@
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.StorageException;
+import io.micrometer.observation.Observation;
+import io.micrometer.observation.ObservationRegistry;
+
/**
* Classe centralizadora que fala diretamente com o SDK do Cloudinary.
+ *
+ *
+ * As chamadas ao SDK sao envolvidas em uma {@link Observation} para render um
+ * span filho com latencia/erro dessa dependencia externa no trace da
+ * requisicao.
+ *
*/
@Service
public class CloudinaryService {
private final Cloudinary cloudinary;
+ // registry usado para criar o span das chamadas ao Cloudinary
+ private final ObservationRegistry observationRegistry;
- public CloudinaryService(Cloudinary cloudinary) {
+ public CloudinaryService(Cloudinary cloudinary, ObservationRegistry observationRegistry) {
this.cloudinary = cloudinary;
+ this.observationRegistry = observationRegistry;
}
// dto simples -> representa o resultado do upload
@@ -46,7 +58,6 @@ public UploadResult upload(
long maxBytes) // tamanho maxímo de arquivo permitido
{
-
// validação (vazio/tipo/tamanho) antes de chamar o SDK do cloudnary
validate(file, allowedContentTypes, maxBytes);
@@ -62,21 +73,30 @@ public UploadResult upload(
options.put("public_id", publicId);
}
- try {
- // comunicação com cloudnary-> retorna um map com o resultado do upload / upload síncrono
- Map, ?> result = cloudinary // sdk que conversa com o cloudnary
- .uploader()
- .upload(
- file.getBytes(), // converte o arquivo para byte -> sdk recebe dados nesse formato
- options // configs do cloudnary
- );
+
+ // comunicação com cloudnary + observation(logging)-> retorna um map com o resultado do upload / upload síncrono
+ Observation observation = Observation.createNotStarted("cloudinary.upload", observationRegistry)
+ .lowCardinalityKeyValue("cloudinary.folder", folder) // pasta do cloudinary para traces
+ .start();
+
+ try (Observation.Scope ignored = observation.openScope()) {
+ // comunicação com cloudnary-> retorna um map com o resultado do upload
+
+ Map, ?> result = cloudinary // sdk que conversa com o cloudnary
+ .uploader()
+ .upload(
+ file.getBytes(), // converte o arquivo para byte -> sdk recebe dados nesse formato
+ options // configs do cloudnary
+ );
// secure_url -> url pública do asset | public_id -> id interno -> usado em delete/sobrescrita
return new UploadResult((String) result.get("secure_url"), (String) result.get("public_id"));
-
} catch (IOException e) {
// qualquer exception vira storageException e retornado como 502
+ observation.error(e);
throw new StorageException("Falha ao enviar arquivo para o Cloudinary");
+ } finally {
+ observation.stop();
}
}
@@ -84,10 +104,21 @@ public void delete(String publicId) {
if (publicId == null || publicId.isBlank()) {
return;
}
- try {
- cloudinary.uploader().destroy(publicId, ObjectUtils.asMap("invalidate", true));
+
+ // destroy sincrono, envolvido numa Observation -> span Sem tags de id
+ Observation observation = Observation.createNotStarted("cloudinary.delete", observationRegistry).start();
+ try (Observation.Scope ignored = observation.openScope()) {
+
+ cloudinary.uploader()
+ .destroy(publicId,
+ ObjectUtils.asMap("invalidate", true)
+ );
+
} catch (IOException e) {
+ observation.error(e);
throw new StorageException("Falha ao remover arquivo do Cloudinary");
+ } finally {
+ observation.stop();
}
}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index e516233..d48ab53 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -46,13 +46,67 @@ app.jwt.service.access-ttl-ms=${SERVICE_JWT_ACCESS_TTL_MS:600000}
# TTL do token de refresh
app.jwt.service.refresh-ttl-ms=${SERVICE_JWT_REFRESH_TTL_MS:3600000}
+# variaveis da URL -> montada dessa forma -> *cloudinary://:@*
cloudinary.cloud-name=${CLOUDINARY_CLOUD_NAME}
cloudinary.api-key=${CLOUDINARY_API_KEY}
cloudinary.api-secret=${CLOUDINARY_API_SECRET}
cloudinary.folder-prefix=${CLOUDINARY_FOLDER_PREFIX:solier}
+cloudinary.timeout-seconds=${CLOUDINARY_TIMEOUT_SECONDS:10}
-google-translate.api-key=${GOOGLE_TRANSLATE_API_KEY}
+spring.servlet.multipart.max-file-size=10MB
+spring.servlet.multipart.max-request-size=10MB
+
+# Observabilidade (Actuator + Micrometer + Micrometer Tracing + OpenTelemetry SDK)
+# aplicacao exporta OTLP para o Collector
+
+# identidade da aplicação no backend de observabilidade
+management.opentelemetry.resource-attributes.service.name=${spring.application.name}
+management.opentelemetry.resource-attributes.service.version=${SERVICE_VERSION:dev}
+management.opentelemetry.resource-attributes.deployment.environment=${DEPLOYMENT_ENVIRONMENT:local}
+
+# endpoints OTLP (apontam para o collector)
+management.otlp.metrics.export.url=${OTEL_EXPORTER_OTLP_ENDPOINT:http://localhost:4318}/v1/metrics
+management.opentelemetry.tracing.export.otlp.endpoint=${OTEL_EXPORTER_OTLP_ENDPOINT:http://localhost:4318}/v1/traces
+management.opentelemetry.logging.export.otlp.endpoint=${OTEL_EXPORTER_OTLP_ENDPOINT:http://localhost:4318}/v1/logs
+
+# % de traces enviados | padrão de 100% porque collector decide se envia ou descarta trace
+management.tracing.sampling.probability=${OTEL_TRACES_SAMPLING_PROBABILITY:1.0}
+
+# restringindo actuactor para /health e /info
+management.endpoints.web.exposure.include=health,info
+management.endpoints.access.default=none
+management.endpoint.health.access=read-only
+management.endpoint.info.access=read-only
+
+# integração com probres do k8s no Actuator ( /actuator/health/[liveness|readiness] )
+management.endpoint.health.probes.enabled=true
+
+# Verifica a saúde interna do Spring -> Se falhar o K8s reinicia o container
+management.endpoint.health.group.liveness.include=livenessState
-spring.servlet.multipart.max-file-size=8MB
-spring.servlet.multipart.max-request-size=8MB
+# Verifica o Spring + Banco de Dados -> Se falhar o K8s remove o pod do load balancer sem reiniciar
+management.endpoint.health.group.readiness.include=readinessState,db
+
+# Oculta detalhes na resposta do /health (segurança+performance)
+management.endpoint.health.show-details=never
+management.endpoint.health.show-components=never
+management.health.redis.enabled=false
+
+# Habilita histogramas para calcular percentis (p50, p95, p99) no Grafana
+management.metrics.distribution.percentiles-histogram.http.server.requests=true
+
+# medição de faixas de tempo para analise de distribuição de requests por tempo de latência no grafana
+management.metrics.distribution.slo.http.server.requests=50ms,100ms,200ms,300ms,500ms,1s,2s,5s
+
+# Valor mínimo considerado pelo histograma
+management.metrics.distribution.minimum-expected-value.http.server.requests=5ms
+# Valor máximo considerado pelo histograma
+management.metrics.distribution.maximum-expected-value.http.server.requests=10s
+
+# conteudo do endpoint /actuator/info
+management.info.env.enabled=false
+management.info.java.enabled=true
+management.info.os.enabled=true
+
+google-translate.api-key=${GOOGLE_TRANSLATE_API_KEY}
diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..398ebee
--- /dev/null
+++ b/src/main/resources/logback-spring.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+ false
+ false
+ false
+ true
+ *
+
+
+
+
+
+
+
+
From d6fa6645c1e8b4f6ca1217088b6694e725bfa80e Mon Sep 17 00:00:00 2001
From: davisilva <84607533+Megueutu@users.noreply.github.com>
Date: Sun, 30 Aug 2026 22:37:36 -0300
Subject: [PATCH 5/8] refactor: organize source packages by business domain
(#37)
* refactor: organize source packages by business domain
* fix: correct malformed dependency closing tag in pom.xml
---
pom.xml | 1 +
.../{ => auth}/ServiceAuthController.java | 8 ++---
.../{ => catalog}/InventoryController.java | 12 +++----
.../{ => catalog}/ModelController.java | 12 +++----
.../{ => catalog}/ModelPhotoController.java | 8 ++---
.../{ => catalog}/OfferController.java | 10 +++---
.../{ => catalog}/SupplierController.java | 14 ++++----
.../{ => common}/InternalPingController.java | 2 +-
.../BusinessContactController.java | 10 +++---
.../{ => company}/ChargeController.java | 12 +++----
.../{ => company}/CompanyController.java | 14 ++++----
.../{ => company}/CompanyPhotoController.java | 10 +++---
.../{ => company}/CompanyPlansController.java | 10 +++---
.../CompanyPositionsController.java | 10 +++---
.../{ => company}/SubscriptionController.java | 10 +++---
.../{ => execution}/RequesterController.java | 10 +++---
.../ServiceContractController.java | 10 +++---
.../ServiceExecutorController.java | 12 +++----
.../TechnicalProjectController.java | 10 +++---
.../TechnicalServiceController.java | 16 ++++-----
.../InternalUserProvisioningController.java | 8 ++---
.../{ => identity}/PermissionController.java | 10 +++---
.../{ => identity}/PersonController.java | 10 +++---
.../{ => identity}/PositionController.java | 10 +++---
.../PositionPermissionController.java | 10 +++---
.../{ => identity}/UserCompanyController.java | 12 +++----
.../{ => identity}/UserController.java | 10 +++---
.../{ => identity}/UserPhotoController.java | 10 +++---
.../CertificationController.java | 10 +++---
.../CertificationRecordController.java | 10 +++---
.../ProfessionController.java | 10 +++---
.../ProfessionalRegistrationController.java | 10 +++---
.../ProfessionalReviewController.java | 10 +++---
.../{ => professional}/ShiftController.java | 10 +++---
.../TechnicalCourseController.java | 10 +++---
.../TechnicianAffiliationController.java | 16 ++++-----
.../TechnicianController.java | 10 +++---
.../{ => proposal}/ProposalController.java | 12 +++----
.../ProposalItemController.java | 10 +++---
.../ProposalUnitController.java | 10 +++---
.../{ => shared}/AddressController.java | 10 +++---
.../{ => shared}/ContactController.java | 10 +++---
.../{ => shared}/FluxLogController.java | 10 +++---
.../GeolocalizationController.java | 10 +++---
.../{ => unit}/EnergyBillController.java | 10 +++---
.../{ => unit}/LocalUnitController.java | 12 +++----
.../{ => unit}/LocalUnitPhotoController.java | 8 ++---
.../UnitSpecificationsController.java | 10 +++---
.../entity/{ => catalog}/Inventory.java | 2 +-
.../domain/entity/{ => catalog}/Model.java | 6 ++--
.../entity/{ => catalog}/ModelPhoto.java | 2 +-
.../domain/entity/{ => catalog}/Offer.java | 4 +--
.../{ => catalog}/OfferTranslation.java | 2 +-
.../domain/entity/{ => catalog}/Supplier.java | 5 +--
.../entity/{ => company}/BusinessContact.java | 2 +-
.../domain/entity/{ => company}/Charge.java | 6 ++--
.../domain/entity/{ => company}/Company.java | 5 +--
.../entity/{ => company}/CompanyPhoto.java | 4 +--
.../entity/{ => company}/CompanyPlans.java | 4 +--
.../{ => company}/CompanyPositions.java | 3 +-
.../entity/{ => company}/Subscription.java | 5 +--
.../entity/{ => execution}/Requester.java | 3 +-
.../{ => execution}/ServiceContract.java | 2 +-
.../{ => execution}/ServiceExecutor.java | 3 +-
.../{ => execution}/TechnicalProject.java | 5 +--
.../{ => execution}/TechnicalService.java | 4 +--
.../entity/{ => identity}/Permission.java | 2 +-
.../domain/entity/{ => identity}/Person.java | 3 +-
.../entity/{ => identity}/Position.java | 2 +-
.../{ => identity}/PositionPermission.java | 2 +-
.../domain/entity/{ => identity}/User.java | 2 +-
.../entity/{ => identity}/UserCompany.java | 3 +-
.../entity/{ => identity}/UserPhoto.java | 4 +--
.../{ => professional}/Certification.java | 2 +-
.../CertificationRecord.java | 2 +-
.../entity/{ => professional}/Profession.java | 2 +-
.../ProfessionalRegistration.java | 2 +-
.../ProfessionalReview.java | 4 ++-
.../entity/{ => professional}/Shift.java | 4 +--
.../{ => professional}/TechnicalCourse.java | 3 +-
.../entity/{ => professional}/Technician.java | 3 +-
.../TechnicianAffiliation.java | 5 +--
.../entity/{ => proposal}/Proposal.java | 5 +--
.../entity/{ => proposal}/ProposalItem.java | 3 +-
.../entity/{ => proposal}/ProposalUnit.java | 3 +-
.../domain/entity/{ => shared}/Address.java | 2 +-
.../domain/entity/{ => shared}/Contact.java | 2 +-
.../domain/entity/{ => shared}/FluxLog.java | 3 +-
.../entity/{ => shared}/Geolocalization.java | 2 +-
.../domain/entity/{ => unit}/EnergyBill.java | 2 +-
.../domain/entity/{ => unit}/LocalUnit.java | 6 ++--
.../entity/{ => unit}/LocalUnitPhoto.java | 2 +-
.../entity/{ => unit}/UnitSpecifications.java | 2 +-
.../persistence/domain/enums/PhotoType.java | 6 ----
.../enums/{ => catalog}/ModelStatus.java | 2 +-
.../domain/enums/{ => catalog}/PanelType.java | 2 +-
.../enums/{ => catalog}/SupplierStatus.java | 2 +-
.../{ => catalog}/TranslationStatus.java | 2 +-
.../enums/{ => company}/BillingStatus.java | 2 +-
.../enums/{ => company}/CompanyStatus.java | 2 +-
.../enums/{ => company}/PaymentMethod.java | 2 +-
.../domain/enums/{ => company}/PlanCycle.java | 2 +-
.../{ => company}/SubscriptionStatus.java | 2 +-
.../enums/{ => execution}/ServiceStatus.java | 2 +-
.../enums/{ => professional}/DayWeek.java | 2 +-
.../TechnicalAffiliationType.java | 2 +-
.../enums/{ => proposal}/ProposalStatus.java | 2 +-
.../domain/enums/shared/PhotoType.java | 6 ++++
.../domain/enums/{ => unit}/LocationType.java | 2 +-
.../{ => catalog}/UpdateQuantityDTO.java | 2 +-
.../UpdateBusinessContactIdDTO.java | 2 +-
.../UpdateCompanyAddressIdDTO.java | 2 +-
.../{ => execution}/ServiceAcceptanceDTO.java | 2 +-
.../{ => execution}/ServiceScheduleDTO.java | 2 +-
.../{ => execution}/UpdateFunctionDTO.java | 2 +-
.../{ => execution}/UpdatePurposeDTO.java | 2 +-
.../{ => identity}/UpdatePositionDTO.java | 2 +-
.../{ => professional}/UpdateActiveDTO.java | 2 +-
.../{ => professional}/UpdateTypeDTO.java | 4 +--
.../patch/{ => proposal}/UpdateNotesDTO.java | 2 +-
.../UpdateLocalUnitAddressIdDTO.java | 2 +-
.../ServiceTokenMintRequestDTO.java | 2 +-
.../ServiceTokenRefreshRequestDTO.java | 2 +-
.../{ => catalog}/InventoryRequestDTO.java | 2 +-
.../{ => catalog}/ModelRequestDTO.java | 4 +--
.../{ => catalog}/OfferRequestDTO.java | 2 +-
.../{ => catalog}/SupplierRequestDTO.java | 2 +-
.../SupplierSearchFilterDTO.java | 2 +-
.../BusinessContactRequestDTO.java | 2 +-
.../{ => company}/ChargeRequestDTO.java | 4 +--
.../{ => company}/CompanyPlansRequestDTO.java | 4 +--
.../CompanyPositionsRequestDTO.java | 2 +-
.../{ => company}/CompanyRequestDTO.java | 2 +-
.../{ => company}/SubscriptionRequestDTO.java | 2 +-
.../{ => execution}/RequesterRequestDTO.java | 2 +-
.../ServiceContractRequestDTO.java | 2 +-
.../ServiceExecutorRequestDTO.java | 2 +-
.../TechnicalProjectRequestDTO.java | 4 +--
.../TechnicalServiceRequestDTO.java | 2 +-
.../InternalUserProvisionRequestDTO.java | 2 +-
.../{ => identity}/PermissionRequestDTO.java | 2 +-
.../{ => identity}/PersonRequestDTO.java | 2 +-
.../PositionPermissionRequestDTO.java | 2 +-
.../{ => identity}/PositionRequestDTO.java | 2 +-
.../{ => identity}/UserCompanyRequestDTO.java | 2 +-
.../{ => identity}/UserRequestDTO.java | 2 +-
.../CertificationRecordRequestDTO.java | 2 +-
.../CertificationRequestDTO.java | 2 +-
.../ProfessionRequestDTO.java | 2 +-
.../ProfessionalRegistrationRequestDTO.java | 2 +-
.../ProfessionalReviewRequestDTO.java | 2 +-
.../{ => professional}/ShiftRequestDTO.java | 4 +--
.../TechnicalCourseRequestDTO.java | 2 +-
.../TechnicianAffiliationRequestDTO.java | 4 +--
.../TechnicianRequestDTO.java | 2 +-
.../ProposalItemRequestDTO.java | 2 +-
.../{ => proposal}/ProposalRequestDTO.java | 2 +-
.../ProposalUnitRequestDTO.java | 2 +-
.../{ => shared}/AddressRequestDTO.java | 2 +-
.../{ => shared}/ContactRequestDTO.java | 2 +-
.../{ => shared}/FluxLogRequestDTO.java | 2 +-
.../GeolocalizationRequestDTO.java | 2 +-
.../{ => unit}/EnergyBillRequestDTO.java | 2 +-
.../{ => unit}/LocalUnitRequestDTO.java | 4 +--
.../UnitSpecificationsRequestDTO.java | 2 +-
.../{ => auth}/ServiceTokenResponseDTO.java | 2 +-
.../{ => catalog}/InventoryResponseDTO.java | 2 +-
.../{ => catalog}/ModelPhotoResponseDTO.java | 2 +-
.../{ => catalog}/ModelResponseDTO.java | 6 ++--
.../{ => catalog}/OfferResponseDTO.java | 4 +--
.../OfferTranslationResponseDTO.java | 2 +-
.../{ => catalog}/SupplierResponseDTO.java | 5 +--
.../SupplierSearchResponseDTO.java | 2 +-
.../BusinessContactResponseDTO.java | 2 +-
.../{ => company}/ChargeResponseDTO.java | 6 ++--
.../CompanyPhotoResponseDTO.java | 4 +--
.../CompanyPlansResponseDTO.java | 4 +--
.../CompanyPositionsResponseDTO.java | 3 +-
.../{ => company}/CompanyResponseDTO.java | 5 +--
.../SubscriptionResponseDTO.java | 4 +--
.../{ => execution}/RequesterResponseDTO.java | 3 +-
.../ServiceContractResponseDTO.java | 2 +-
.../ServiceExecutorResponseDTO.java | 3 +-
.../TechnicalProjectResponseDTO.java | 4 +--
.../TechnicalServiceResponseDTO.java | 4 +--
.../InternalUserProvisionResponseDTO.java | 2 +-
.../{ => identity}/PermissionResponseDTO.java | 2 +-
.../{ => identity}/PersonResponseDTO.java | 3 +-
.../PositionPermissionResponseDTO.java | 2 +-
.../{ => identity}/PositionResponseDTO.java | 2 +-
.../UserCompanyResponseDTO.java | 2 +-
.../{ => identity}/UserPhotoResponseDTO.java | 4 +--
.../{ => identity}/UserResponseDTO.java | 2 +-
.../CertificationRecordResponseDTO.java | 2 +-
.../CertificationResponseDTO.java | 2 +-
.../ProfessionResponseDTO.java | 2 +-
.../ProfessionalRegistrationResponseDTO.java | 2 +-
.../ProfessionalReviewResponseDTO.java | 2 +-
.../{ => professional}/ShiftResponseDTO.java | 4 +--
.../TechnicalCourseResponseDTO.java | 2 +-
.../TechnicianAffiliationResponseDTO.java | 4 +--
.../TechnicianResponseDTO.java | 3 +-
.../ProposalItemResponseDTO.java | 3 +-
.../{ => proposal}/ProposalResponseDTO.java | 4 +--
.../ProposalUnitResponseDTO.java | 3 +-
.../{ => shared}/AddressResponseDTO.java | 2 +-
.../{ => shared}/ContactResponseDTO.java | 2 +-
.../{ => shared}/FluxLogResponseDTO.java | 2 +-
.../GeolocalizationResponseDTO.java | 2 +-
.../{ => unit}/EnergyBillResponseDTO.java | 2 +-
.../{ => unit}/LocalUnitPhotoResponseDTO.java | 2 +-
.../{ => unit}/LocalUnitResponseDTO.java | 5 +--
.../UnitSpecificationsResponseDTO.java | 2 +-
.../{ => catalog}/InventoryOpenApi.java | 8 ++---
.../openapi/{ => catalog}/ModelOpenApi.java | 8 ++---
.../{ => catalog}/ModelPhotoOpenApi.java | 4 +--
.../openapi/{ => catalog}/OfferOpenApi.java | 6 ++--
.../{ => catalog}/SupplierOpenApi.java | 10 +++---
.../{ => company}/BusinessContactOpenApi.java | 6 ++--
.../openapi/{ => company}/ChargeOpenApi.java | 8 ++---
.../openapi/{ => company}/CompanyOpenApi.java | 10 +++---
.../{ => company}/CompanyPhotoOpenApi.java | 6 ++--
.../{ => company}/CompanyPlansOpenApi.java | 6 ++--
.../CompanyPositionsOpenApi.java | 6 ++--
.../{ => company}/SubscriptionOpenApi.java | 6 ++--
.../{ => execution}/RequesterOpenApi.java | 6 ++--
.../ServiceContractOpenApi.java | 6 ++--
.../ServiceExecutorOpenApi.java | 8 ++---
.../TechnicalProjectOpenApi.java | 6 ++--
.../TechnicalServiceOpenApi.java | 12 +++----
.../{ => identity}/PermissionOpenApi.java | 6 ++--
.../openapi/{ => identity}/PersonOpenApi.java | 6 ++--
.../{ => identity}/PositionOpenApi.java | 6 ++--
.../PositionPermissionOpenApi.java | 6 ++--
.../{ => identity}/UserCompanyOpenApi.java | 8 ++---
.../openapi/{ => identity}/UserOpenApi.java | 6 ++--
.../{ => identity}/UserPhotoOpenApi.java | 6 ++--
.../CertificationOpenApi.java | 6 ++--
.../CertificationRecordOpenApi.java | 6 ++--
.../{ => professional}/ProfessionOpenApi.java | 6 ++--
.../ProfessionalRegistrationOpenApi.java | 6 ++--
.../ProfessionalReviewOpenApi.java | 6 ++--
.../{ => professional}/ShiftOpenApi.java | 6 ++--
.../TechnicalCourseOpenApi.java | 6 ++--
.../TechnicianAffiliationOpenApi.java | 10 +++---
.../{ => professional}/TechnicianOpenApi.java | 6 ++--
.../{ => proposal}/ProposalItemOpenApi.java | 6 ++--
.../{ => proposal}/ProposalOpenApi.java | 8 ++---
.../{ => proposal}/ProposalUnitOpenApi.java | 6 ++--
.../openapi/{ => shared}/AddressOpenApi.java | 6 ++--
.../openapi/{ => shared}/ContactOpenApi.java | 6 ++--
.../openapi/{ => shared}/FluxLogOpenApi.java | 6 ++--
.../{ => shared}/GeolocalizationOpenApi.java | 6 ++--
.../openapi/{ => unit}/EnergyBillOpenApi.java | 6 ++--
.../openapi/{ => unit}/LocalUnitOpenApi.java | 8 ++---
.../{ => unit}/LocalUnitPhotoOpenApi.java | 4 +--
.../{ => unit}/UnitSpecificationsOpenApi.java | 6 ++--
.../{ => catalog}/InventoryRepository.java | 4 +--
.../{ => catalog}/ModelPhotoRepository.java | 4 +--
.../{ => catalog}/ModelRepository.java | 6 ++--
.../{ => catalog}/OfferRepository.java | 4 +--
.../OfferTranslationRepository.java | 4 +--
.../{ => catalog}/SupplierRepository.java | 4 +--
.../BusinessContactRepository.java | 4 +--
.../{ => company}/ChargeRepository.java | 4 +--
.../{ => company}/CompanyPhotoRepository.java | 6 ++--
.../{ => company}/CompanyPlansRepository.java | 4 +--
.../CompanyPositionsRepository.java | 4 +--
.../{ => company}/CompanyRepository.java | 4 +--
.../{ => company}/SubscriptionRepository.java | 6 ++--
.../{ => execution}/RequesterRepository.java | 4 +--
.../ServiceContractRepository.java | 4 +--
.../ServiceExecutorRepository.java | 4 +--
.../TechnicalProjectRepository.java | 4 +--
.../TechnicalServiceRepository.java | 6 ++--
.../{ => identity}/PermissionRepository.java | 4 +--
.../{ => identity}/PersonRepository.java | 4 +--
.../PositionPermissionRepository.java | 4 +--
.../{ => identity}/PositionRepository.java | 4 +--
.../{ => identity}/UserCompanyRepository.java | 4 +--
.../{ => identity}/UserPhotoRepository.java | 6 ++--
.../{ => identity}/UserRepository.java | 4 +--
.../CertificationRecordRepository.java | 4 +--
.../CertificationRepository.java | 4 +--
.../ProfessionRepository.java | 4 +--
.../ProfessionalRegistrationRepository.java | 4 +--
.../ProfessionalReviewRepository.java | 4 +--
.../{ => professional}/ShiftRepository.java | 4 +--
.../TechnicalCourseRepository.java | 4 +--
.../TechnicianAffiliationRepository.java | 4 +--
.../TechnicianRepository.java | 4 +--
.../ProposalItemRepository.java | 4 +--
.../{ => proposal}/ProposalRepository.java | 4 +--
.../ProposalUnitRepository.java | 4 +--
.../{ => shared}/AddressRepository.java | 4 +--
.../{ => shared}/ContactRepository.java | 4 +--
.../{ => shared}/FluxLogRepository.java | 4 +--
.../GeolocalizationRepository.java | 4 +--
.../{ => catalog}/SupplierSpecification.java | 10 +++---
.../{ => unit}/EnergyBillRepository.java | 4 +--
.../{ => unit}/LocalUnitPhotoRepository.java | 4 +--
.../{ => unit}/LocalUnitRepository.java | 4 +--
.../UnitSpecificationsRepository.java | 4 +--
.../rbac/RbacAuthorizationService.java | 12 +++----
.../{ => catalog}/GoogleTranslateService.java | 2 +-
.../{ => catalog}/InventoryService.java | 23 ++++++------
.../{ => catalog}/ModelPhotoService.java | 15 ++++----
.../service/{ => catalog}/ModelService.java | 18 +++++-----
.../service/{ => catalog}/OfferService.java | 35 +++++++++---------
.../OfferTranslationService.java | 12 +++----
.../{ => catalog}/SupplierCacheService.java | 6 ++--
.../{ => catalog}/SupplierService.java | 36 +++++++++----------
.../{ => company}/BusinessContactService.java | 12 +++----
.../service/{ => company}/ChargeService.java | 18 +++++-----
.../{ => company}/CompanyPhotoService.java | 17 ++++-----
.../{ => company}/CompanyPlansService.java | 12 +++----
.../CompanyPositionsService.java | 22 ++++++------
.../service/{ => company}/CompanyService.java | 36 +++++++++----------
.../{ => company}/SubscriptionService.java | 22 ++++++------
.../{ => execution}/RequesterService.java | 32 ++++++++---------
.../ServiceContractService.java | 16 ++++-----
.../ServiceExecutorService.java | 22 ++++++------
.../TechnicalProjectService.java | 22 ++++++------
.../TechnicalServiceService.java | 18 +++++-----
.../InternalUserProvisioningService.java | 8 ++---
.../{ => identity}/PermissionService.java | 12 +++----
.../service/{ => identity}/PersonService.java | 22 ++++++------
.../PositionPermissionService.java | 20 +++++------
.../{ => identity}/PositionService.java | 16 ++++-----
.../{ => identity}/UserCompanyService.java | 26 +++++++-------
.../{ => identity}/UserPhotoService.java | 17 ++++-----
.../service/{ => identity}/UserService.java | 16 ++++-----
.../CertificationRecordService.java | 18 +++++-----
.../CertificationService.java | 12 +++----
.../{ => professional}/ProfessionService.java | 12 +++----
.../ProfessionalRegistrationService.java | 20 +++++------
.../ProfessionalReviewService.java | 26 +++++++-------
.../{ => professional}/ShiftService.java | 14 ++++----
.../TechnicalCourseService.java | 14 ++++----
.../TechnicianAffiliationService.java | 20 +++++------
.../{ => professional}/TechnicianService.java | 20 +++++------
.../{ => proposal}/ProposalItemService.java | 24 ++++++-------
.../{ => proposal}/ProposalService.java | 28 +++++++--------
.../{ => proposal}/ProposalUnitService.java | 26 +++++++-------
.../service/{ => shared}/AddressService.java | 16 ++++-----
.../service/{ => shared}/AuditService.java | 2 +-
.../{ => shared}/CloudinaryService.java | 2 +-
.../service/{ => shared}/ContactService.java | 12 +++----
.../service/{ => shared}/FluxLogService.java | 14 ++++----
.../{ => shared}/GeolocalizationService.java | 14 ++++----
.../service/{ => unit}/EnergyBillService.java | 17 ++++-----
.../{ => unit}/LocalUnitPhotoService.java | 15 ++++----
.../service/{ => unit}/LocalUnitService.java | 28 +++++++--------
.../{ => unit}/UnitSpecificationsService.java | 14 ++++----
.../persistence/util/CacheKeyGenerator.java | 2 +-
355 files changed, 1193 insertions(+), 1155 deletions(-)
rename src/main/java/com/solaria/persistence/controller/{ => auth}/ServiceAuthController.java (91%)
rename src/main/java/com/solaria/persistence/controller/{ => catalog}/InventoryController.java (86%)
rename src/main/java/com/solaria/persistence/controller/{ => catalog}/ModelController.java (87%)
rename src/main/java/com/solaria/persistence/controller/{ => catalog}/ModelPhotoController.java (87%)
rename src/main/java/com/solaria/persistence/controller/{ => catalog}/OfferController.java (88%)
rename src/main/java/com/solaria/persistence/controller/{ => catalog}/SupplierController.java (83%)
rename src/main/java/com/solaria/persistence/controller/{ => common}/InternalPingController.java (89%)
rename src/main/java/com/solaria/persistence/controller/{ => company}/BusinessContactController.java (86%)
rename src/main/java/com/solaria/persistence/controller/{ => company}/ChargeController.java (88%)
rename src/main/java/com/solaria/persistence/controller/{ => company}/CompanyController.java (87%)
rename src/main/java/com/solaria/persistence/controller/{ => company}/CompanyPhotoController.java (85%)
rename src/main/java/com/solaria/persistence/controller/{ => company}/CompanyPlansController.java (86%)
rename src/main/java/com/solaria/persistence/controller/{ => company}/CompanyPositionsController.java (84%)
rename src/main/java/com/solaria/persistence/controller/{ => company}/SubscriptionController.java (88%)
rename src/main/java/com/solaria/persistence/controller/{ => execution}/RequesterController.java (84%)
rename src/main/java/com/solaria/persistence/controller/{ => execution}/ServiceContractController.java (86%)
rename src/main/java/com/solaria/persistence/controller/{ => execution}/ServiceExecutorController.java (82%)
rename src/main/java/com/solaria/persistence/controller/{ => execution}/TechnicalProjectController.java (87%)
rename src/main/java/com/solaria/persistence/controller/{ => execution}/TechnicalServiceController.java (85%)
rename src/main/java/com/solaria/persistence/controller/{ => identity}/InternalUserProvisioningController.java (79%)
rename src/main/java/com/solaria/persistence/controller/{ => identity}/PermissionController.java (85%)
rename src/main/java/com/solaria/persistence/controller/{ => identity}/PersonController.java (85%)
rename src/main/java/com/solaria/persistence/controller/{ => identity}/PositionController.java (86%)
rename src/main/java/com/solaria/persistence/controller/{ => identity}/PositionPermissionController.java (82%)
rename src/main/java/com/solaria/persistence/controller/{ => identity}/UserCompanyController.java (85%)
rename src/main/java/com/solaria/persistence/controller/{ => identity}/UserController.java (85%)
rename src/main/java/com/solaria/persistence/controller/{ => identity}/UserPhotoController.java (85%)
rename src/main/java/com/solaria/persistence/controller/{ => professional}/CertificationController.java (85%)
rename src/main/java/com/solaria/persistence/controller/{ => professional}/CertificationRecordController.java (85%)
rename src/main/java/com/solaria/persistence/controller/{ => professional}/ProfessionController.java (85%)
rename src/main/java/com/solaria/persistence/controller/{ => professional}/ProfessionalRegistrationController.java (85%)
rename src/main/java/com/solaria/persistence/controller/{ => professional}/ProfessionalReviewController.java (83%)
rename src/main/java/com/solaria/persistence/controller/{ => professional}/ShiftController.java (85%)
rename src/main/java/com/solaria/persistence/controller/{ => professional}/TechnicalCourseController.java (85%)
rename src/main/java/com/solaria/persistence/controller/{ => professional}/TechnicianAffiliationController.java (83%)
rename src/main/java/com/solaria/persistence/controller/{ => professional}/TechnicianController.java (85%)
rename src/main/java/com/solaria/persistence/controller/{ => proposal}/ProposalController.java (89%)
rename src/main/java/com/solaria/persistence/controller/{ => proposal}/ProposalItemController.java (86%)
rename src/main/java/com/solaria/persistence/controller/{ => proposal}/ProposalUnitController.java (86%)
rename src/main/java/com/solaria/persistence/controller/{ => shared}/AddressController.java (86%)
rename src/main/java/com/solaria/persistence/controller/{ => shared}/ContactController.java (86%)
rename src/main/java/com/solaria/persistence/controller/{ => shared}/FluxLogController.java (80%)
rename src/main/java/com/solaria/persistence/controller/{ => shared}/GeolocalizationController.java (86%)
rename src/main/java/com/solaria/persistence/controller/{ => unit}/EnergyBillController.java (89%)
rename src/main/java/com/solaria/persistence/controller/{ => unit}/LocalUnitController.java (88%)
rename src/main/java/com/solaria/persistence/controller/{ => unit}/LocalUnitPhotoController.java (87%)
rename src/main/java/com/solaria/persistence/controller/{ => unit}/UnitSpecificationsController.java (82%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => catalog}/Inventory.java (94%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => catalog}/Model.java (85%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => catalog}/ModelPhoto.java (92%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => catalog}/Offer.java (92%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => catalog}/OfferTranslation.java (93%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => catalog}/Supplier.java (76%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => company}/BusinessContact.java (90%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => company}/Charge.java (84%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => company}/Company.java (85%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => company}/CompanyPhoto.java (86%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => company}/CompanyPlans.java (82%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => company}/CompanyPositions.java (88%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => company}/Subscription.java (83%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => execution}/Requester.java (80%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => execution}/ServiceContract.java (93%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => execution}/ServiceExecutor.java (88%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => execution}/TechnicalProject.java (81%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => execution}/TechnicalService.java (89%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => identity}/Permission.java (91%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => identity}/Person.java (86%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => identity}/Position.java (93%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => identity}/PositionPermission.java (94%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => identity}/User.java (89%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => identity}/UserCompany.java (89%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => identity}/UserPhoto.java (86%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => professional}/Certification.java (91%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => professional}/CertificationRecord.java (90%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => professional}/Profession.java (89%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => professional}/ProfessionalRegistration.java (92%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => professional}/ProfessionalReview.java (86%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => professional}/Shift.java (85%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => professional}/TechnicalCourse.java (83%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => professional}/Technician.java (82%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => professional}/TechnicianAffiliation.java (78%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => proposal}/Proposal.java (82%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => proposal}/ProposalItem.java (87%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => proposal}/ProposalUnit.java (85%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => shared}/Address.java (93%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => shared}/Contact.java (88%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => shared}/FluxLog.java (83%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => shared}/Geolocalization.java (95%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => unit}/EnergyBill.java (93%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => unit}/LocalUnit.java (74%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => unit}/LocalUnitPhoto.java (92%)
rename src/main/java/com/solaria/persistence/domain/entity/{ => unit}/UnitSpecifications.java (92%)
delete mode 100644 src/main/java/com/solaria/persistence/domain/enums/PhotoType.java
rename src/main/java/com/solaria/persistence/domain/enums/{ => catalog}/ModelStatus.java (58%)
rename src/main/java/com/solaria/persistence/domain/enums/{ => catalog}/PanelType.java (60%)
rename src/main/java/com/solaria/persistence/domain/enums/{ => catalog}/SupplierStatus.java (58%)
rename src/main/java/com/solaria/persistence/domain/enums/{ => catalog}/TranslationStatus.java (57%)
rename src/main/java/com/solaria/persistence/domain/enums/{ => company}/BillingStatus.java (60%)
rename src/main/java/com/solaria/persistence/domain/enums/{ => company}/CompanyStatus.java (59%)
rename src/main/java/com/solaria/persistence/domain/enums/{ => company}/PaymentMethod.java (60%)
rename src/main/java/com/solaria/persistence/domain/enums/{ => company}/PlanCycle.java (55%)
rename src/main/java/com/solaria/persistence/domain/enums/{ => company}/SubscriptionStatus.java (57%)
rename src/main/java/com/solaria/persistence/domain/enums/{ => execution}/ServiceStatus.java (60%)
rename src/main/java/com/solaria/persistence/domain/enums/{ => professional}/DayWeek.java (66%)
rename src/main/java/com/solaria/persistence/domain/enums/{ => professional}/TechnicalAffiliationType.java (59%)
rename src/main/java/com/solaria/persistence/domain/enums/{ => proposal}/ProposalStatus.java (68%)
create mode 100644 src/main/java/com/solaria/persistence/domain/enums/shared/PhotoType.java
rename src/main/java/com/solaria/persistence/domain/enums/{ => unit}/LocationType.java (56%)
rename src/main/java/com/solaria/persistence/dto/patch/{ => catalog}/UpdateQuantityDTO.java (87%)
rename src/main/java/com/solaria/persistence/dto/patch/{ => company}/UpdateBusinessContactIdDTO.java (84%)
rename src/main/java/com/solaria/persistence/dto/patch/{ => company}/UpdateCompanyAddressIdDTO.java (83%)
rename src/main/java/com/solaria/persistence/dto/patch/{ => execution}/ServiceAcceptanceDTO.java (83%)
rename src/main/java/com/solaria/persistence/dto/patch/{ => execution}/ServiceScheduleDTO.java (84%)
rename src/main/java/com/solaria/persistence/dto/patch/{ => execution}/UpdateFunctionDTO.java (82%)
rename src/main/java/com/solaria/persistence/dto/patch/{ => execution}/UpdatePurposeDTO.java (81%)
rename src/main/java/com/solaria/persistence/dto/patch/{ => identity}/UpdatePositionDTO.java (82%)
rename src/main/java/com/solaria/persistence/dto/patch/{ => professional}/UpdateActiveDTO.java (79%)
rename src/main/java/com/solaria/persistence/dto/patch/{ => professional}/UpdateTypeDTO.java (64%)
rename src/main/java/com/solaria/persistence/dto/patch/{ => proposal}/UpdateNotesDTO.java (82%)
rename src/main/java/com/solaria/persistence/dto/patch/{ => unit}/UpdateLocalUnitAddressIdDTO.java (84%)
rename src/main/java/com/solaria/persistence/dto/request/{ => auth}/ServiceTokenMintRequestDTO.java (83%)
rename src/main/java/com/solaria/persistence/dto/request/{ => auth}/ServiceTokenRefreshRequestDTO.java (83%)
rename src/main/java/com/solaria/persistence/dto/request/{ => catalog}/InventoryRequestDTO.java (91%)
rename src/main/java/com/solaria/persistence/dto/request/{ => catalog}/ModelRequestDTO.java (88%)
rename src/main/java/com/solaria/persistence/dto/request/{ => catalog}/OfferRequestDTO.java (96%)
rename src/main/java/com/solaria/persistence/dto/request/{ => catalog}/SupplierRequestDTO.java (84%)
rename src/main/java/com/solaria/persistence/dto/request/{ => catalog}/SupplierSearchFilterDTO.java (94%)
rename src/main/java/com/solaria/persistence/dto/request/{ => company}/BusinessContactRequestDTO.java (93%)
rename src/main/java/com/solaria/persistence/dto/request/{ => company}/ChargeRequestDTO.java (87%)
rename src/main/java/com/solaria/persistence/dto/request/{ => company}/CompanyPlansRequestDTO.java (80%)
rename src/main/java/com/solaria/persistence/dto/request/{ => company}/CompanyPositionsRequestDTO.java (86%)
rename src/main/java/com/solaria/persistence/dto/request/{ => company}/CompanyRequestDTO.java (93%)
rename src/main/java/com/solaria/persistence/dto/request/{ => company}/SubscriptionRequestDTO.java (89%)
rename src/main/java/com/solaria/persistence/dto/request/{ => execution}/RequesterRequestDTO.java (84%)
rename src/main/java/com/solaria/persistence/dto/request/{ => execution}/ServiceContractRequestDTO.java (91%)
rename src/main/java/com/solaria/persistence/dto/request/{ => execution}/ServiceExecutorRequestDTO.java (90%)
rename src/main/java/com/solaria/persistence/dto/request/{ => execution}/TechnicalProjectRequestDTO.java (74%)
rename src/main/java/com/solaria/persistence/dto/request/{ => execution}/TechnicalServiceRequestDTO.java (90%)
rename src/main/java/com/solaria/persistence/dto/request/{ => identity}/InternalUserProvisionRequestDTO.java (86%)
rename src/main/java/com/solaria/persistence/dto/request/{ => identity}/PermissionRequestDTO.java (90%)
rename src/main/java/com/solaria/persistence/dto/request/{ => identity}/PersonRequestDTO.java (94%)
rename src/main/java/com/solaria/persistence/dto/request/{ => identity}/PositionPermissionRequestDTO.java (86%)
rename src/main/java/com/solaria/persistence/dto/request/{ => identity}/PositionRequestDTO.java (87%)
rename src/main/java/com/solaria/persistence/dto/request/{ => identity}/UserCompanyRequestDTO.java (88%)
rename src/main/java/com/solaria/persistence/dto/request/{ => identity}/UserRequestDTO.java (89%)
rename src/main/java/com/solaria/persistence/dto/request/{ => professional}/CertificationRecordRequestDTO.java (78%)
rename src/main/java/com/solaria/persistence/dto/request/{ => professional}/CertificationRequestDTO.java (85%)
rename src/main/java/com/solaria/persistence/dto/request/{ => professional}/ProfessionRequestDTO.java (80%)
rename src/main/java/com/solaria/persistence/dto/request/{ => professional}/ProfessionalRegistrationRequestDTO.java (87%)
rename src/main/java/com/solaria/persistence/dto/request/{ => professional}/ProfessionalReviewRequestDTO.java (94%)
rename src/main/java/com/solaria/persistence/dto/request/{ => professional}/ShiftRequestDTO.java (82%)
rename src/main/java/com/solaria/persistence/dto/request/{ => professional}/TechnicalCourseRequestDTO.java (84%)
rename src/main/java/com/solaria/persistence/dto/request/{ => professional}/TechnicianAffiliationRequestDTO.java (74%)
rename src/main/java/com/solaria/persistence/dto/request/{ => professional}/TechnicianRequestDTO.java (86%)
rename src/main/java/com/solaria/persistence/dto/request/{ => proposal}/ProposalItemRequestDTO.java (94%)
rename src/main/java/com/solaria/persistence/dto/request/{ => proposal}/ProposalRequestDTO.java (84%)
rename src/main/java/com/solaria/persistence/dto/request/{ => proposal}/ProposalUnitRequestDTO.java (91%)
rename src/main/java/com/solaria/persistence/dto/request/{ => shared}/AddressRequestDTO.java (93%)
rename src/main/java/com/solaria/persistence/dto/request/{ => shared}/ContactRequestDTO.java (90%)
rename src/main/java/com/solaria/persistence/dto/request/{ => shared}/FluxLogRequestDTO.java (87%)
rename src/main/java/com/solaria/persistence/dto/request/{ => shared}/GeolocalizationRequestDTO.java (94%)
rename src/main/java/com/solaria/persistence/dto/request/{ => unit}/EnergyBillRequestDTO.java (93%)
rename src/main/java/com/solaria/persistence/dto/request/{ => unit}/LocalUnitRequestDTO.java (79%)
rename src/main/java/com/solaria/persistence/dto/request/{ => unit}/UnitSpecificationsRequestDTO.java (87%)
rename src/main/java/com/solaria/persistence/dto/response/{ => auth}/ServiceTokenResponseDTO.java (87%)
rename src/main/java/com/solaria/persistence/dto/response/{ => catalog}/InventoryResponseDTO.java (81%)
rename src/main/java/com/solaria/persistence/dto/response/{ => catalog}/ModelPhotoResponseDTO.java (83%)
rename src/main/java/com/solaria/persistence/dto/response/{ => catalog}/ModelResponseDTO.java (76%)
rename src/main/java/com/solaria/persistence/dto/response/{ => catalog}/OfferResponseDTO.java (83%)
rename src/main/java/com/solaria/persistence/dto/response/{ => catalog}/OfferTranslationResponseDTO.java (80%)
rename src/main/java/com/solaria/persistence/dto/response/{ => catalog}/SupplierResponseDTO.java (56%)
rename src/main/java/com/solaria/persistence/dto/response/{ => catalog}/SupplierSearchResponseDTO.java (86%)
rename src/main/java/com/solaria/persistence/dto/response/{ => company}/BusinessContactResponseDTO.java (81%)
rename src/main/java/com/solaria/persistence/dto/response/{ => company}/ChargeResponseDTO.java (70%)
rename src/main/java/com/solaria/persistence/dto/response/{ => company}/CompanyPhotoResponseDTO.java (72%)
rename src/main/java/com/solaria/persistence/dto/response/{ => company}/CompanyPlansResponseDTO.java (69%)
rename src/main/java/com/solaria/persistence/dto/response/{ => company}/CompanyPositionsResponseDTO.java (63%)
rename src/main/java/com/solaria/persistence/dto/response/{ => company}/CompanyResponseDTO.java (66%)
rename src/main/java/com/solaria/persistence/dto/response/{ => company}/SubscriptionResponseDTO.java (76%)
rename src/main/java/com/solaria/persistence/dto/response/{ => execution}/RequesterResponseDTO.java (63%)
rename src/main/java/com/solaria/persistence/dto/response/{ => execution}/ServiceContractResponseDTO.java (86%)
rename src/main/java/com/solaria/persistence/dto/response/{ => execution}/ServiceExecutorResponseDTO.java (65%)
rename src/main/java/com/solaria/persistence/dto/response/{ => execution}/TechnicalProjectResponseDTO.java (75%)
rename src/main/java/com/solaria/persistence/dto/response/{ => execution}/TechnicalServiceResponseDTO.java (78%)
rename src/main/java/com/solaria/persistence/dto/response/{ => identity}/InternalUserProvisionResponseDTO.java (86%)
rename src/main/java/com/solaria/persistence/dto/response/{ => identity}/PermissionResponseDTO.java (81%)
rename src/main/java/com/solaria/persistence/dto/response/{ => identity}/PersonResponseDTO.java (71%)
rename src/main/java/com/solaria/persistence/dto/response/{ => identity}/PositionPermissionResponseDTO.java (80%)
rename src/main/java/com/solaria/persistence/dto/response/{ => identity}/PositionResponseDTO.java (78%)
rename src/main/java/com/solaria/persistence/dto/response/{ => identity}/UserCompanyResponseDTO.java (81%)
rename src/main/java/com/solaria/persistence/dto/response/{ => identity}/UserPhotoResponseDTO.java (71%)
rename src/main/java/com/solaria/persistence/dto/response/{ => identity}/UserResponseDTO.java (80%)
rename src/main/java/com/solaria/persistence/dto/response/{ => professional}/CertificationRecordResponseDTO.java (80%)
rename src/main/java/com/solaria/persistence/dto/response/{ => professional}/CertificationResponseDTO.java (83%)
rename src/main/java/com/solaria/persistence/dto/response/{ => professional}/ProfessionResponseDTO.java (78%)
rename src/main/java/com/solaria/persistence/dto/response/{ => professional}/ProfessionalRegistrationResponseDTO.java (85%)
rename src/main/java/com/solaria/persistence/dto/response/{ => professional}/ProfessionalReviewResponseDTO.java (88%)
rename src/main/java/com/solaria/persistence/dto/response/{ => professional}/ShiftResponseDTO.java (71%)
rename src/main/java/com/solaria/persistence/dto/response/{ => professional}/TechnicalCourseResponseDTO.java (81%)
rename src/main/java/com/solaria/persistence/dto/response/{ => professional}/TechnicianAffiliationResponseDTO.java (67%)
rename src/main/java/com/solaria/persistence/dto/response/{ => professional}/TechnicianResponseDTO.java (64%)
rename src/main/java/com/solaria/persistence/dto/response/{ => proposal}/ProposalItemResponseDTO.java (73%)
rename src/main/java/com/solaria/persistence/dto/response/{ => proposal}/ProposalResponseDTO.java (76%)
rename src/main/java/com/solaria/persistence/dto/response/{ => proposal}/ProposalUnitResponseDTO.java (69%)
rename src/main/java/com/solaria/persistence/dto/response/{ => shared}/AddressResponseDTO.java (89%)
rename src/main/java/com/solaria/persistence/dto/response/{ => shared}/ContactResponseDTO.java (78%)
rename src/main/java/com/solaria/persistence/dto/response/{ => shared}/FluxLogResponseDTO.java (83%)
rename src/main/java/com/solaria/persistence/dto/response/{ => shared}/GeolocalizationResponseDTO.java (84%)
rename src/main/java/com/solaria/persistence/dto/response/{ => unit}/EnergyBillResponseDTO.java (85%)
rename src/main/java/com/solaria/persistence/dto/response/{ => unit}/LocalUnitPhotoResponseDTO.java (84%)
rename src/main/java/com/solaria/persistence/dto/response/{ => unit}/LocalUnitResponseDTO.java (60%)
rename src/main/java/com/solaria/persistence/dto/response/{ => unit}/UnitSpecificationsResponseDTO.java (86%)
rename src/main/java/com/solaria/persistence/openapi/{ => catalog}/InventoryOpenApi.java (91%)
rename src/main/java/com/solaria/persistence/openapi/{ => catalog}/ModelOpenApi.java (93%)
rename src/main/java/com/solaria/persistence/openapi/{ => catalog}/ModelPhotoOpenApi.java (92%)
rename src/main/java/com/solaria/persistence/openapi/{ => catalog}/OfferOpenApi.java (94%)
rename src/main/java/com/solaria/persistence/openapi/{ => catalog}/SupplierOpenApi.java (91%)
rename src/main/java/com/solaria/persistence/openapi/{ => company}/BusinessContactOpenApi.java (92%)
rename src/main/java/com/solaria/persistence/openapi/{ => company}/ChargeOpenApi.java (94%)
rename src/main/java/com/solaria/persistence/openapi/{ => company}/CompanyOpenApi.java (93%)
rename src/main/java/com/solaria/persistence/openapi/{ => company}/CompanyPhotoOpenApi.java (89%)
rename src/main/java/com/solaria/persistence/openapi/{ => company}/CompanyPlansOpenApi.java (92%)
rename src/main/java/com/solaria/persistence/openapi/{ => company}/CompanyPositionsOpenApi.java (91%)
rename src/main/java/com/solaria/persistence/openapi/{ => company}/SubscriptionOpenApi.java (95%)
rename src/main/java/com/solaria/persistence/openapi/{ => execution}/RequesterOpenApi.java (91%)
rename src/main/java/com/solaria/persistence/openapi/{ => execution}/ServiceContractOpenApi.java (93%)
rename src/main/java/com/solaria/persistence/openapi/{ => execution}/ServiceExecutorOpenApi.java (89%)
rename src/main/java/com/solaria/persistence/openapi/{ => execution}/TechnicalProjectOpenApi.java (93%)
rename src/main/java/com/solaria/persistence/openapi/{ => execution}/TechnicalServiceOpenApi.java (91%)
rename src/main/java/com/solaria/persistence/openapi/{ => identity}/PermissionOpenApi.java (93%)
rename src/main/java/com/solaria/persistence/openapi/{ => identity}/PersonOpenApi.java (93%)
rename src/main/java/com/solaria/persistence/openapi/{ => identity}/PositionOpenApi.java (92%)
rename src/main/java/com/solaria/persistence/openapi/{ => identity}/PositionPermissionOpenApi.java (89%)
rename src/main/java/com/solaria/persistence/openapi/{ => identity}/UserCompanyOpenApi.java (92%)
rename src/main/java/com/solaria/persistence/openapi/{ => identity}/UserOpenApi.java (92%)
rename src/main/java/com/solaria/persistence/openapi/{ => identity}/UserPhotoOpenApi.java (89%)
rename src/main/java/com/solaria/persistence/openapi/{ => professional}/CertificationOpenApi.java (91%)
rename src/main/java/com/solaria/persistence/openapi/{ => professional}/CertificationRecordOpenApi.java (92%)
rename src/main/java/com/solaria/persistence/openapi/{ => professional}/ProfessionOpenApi.java (91%)
rename src/main/java/com/solaria/persistence/openapi/{ => professional}/ProfessionalRegistrationOpenApi.java (91%)
rename src/main/java/com/solaria/persistence/openapi/{ => professional}/ProfessionalReviewOpenApi.java (90%)
rename src/main/java/com/solaria/persistence/openapi/{ => professional}/ShiftOpenApi.java (92%)
rename src/main/java/com/solaria/persistence/openapi/{ => professional}/TechnicalCourseOpenApi.java (92%)
rename src/main/java/com/solaria/persistence/openapi/{ => professional}/TechnicianAffiliationOpenApi.java (90%)
rename src/main/java/com/solaria/persistence/openapi/{ => professional}/TechnicianOpenApi.java (91%)
rename src/main/java/com/solaria/persistence/openapi/{ => proposal}/ProposalItemOpenApi.java (93%)
rename src/main/java/com/solaria/persistence/openapi/{ => proposal}/ProposalOpenApi.java (96%)
rename src/main/java/com/solaria/persistence/openapi/{ => proposal}/ProposalUnitOpenApi.java (93%)
rename src/main/java/com/solaria/persistence/openapi/{ => shared}/AddressOpenApi.java (93%)
rename src/main/java/com/solaria/persistence/openapi/{ => shared}/ContactOpenApi.java (92%)
rename src/main/java/com/solaria/persistence/openapi/{ => shared}/FluxLogOpenApi.java (87%)
rename src/main/java/com/solaria/persistence/openapi/{ => shared}/GeolocalizationOpenApi.java (92%)
rename src/main/java/com/solaria/persistence/openapi/{ => unit}/EnergyBillOpenApi.java (94%)
rename src/main/java/com/solaria/persistence/openapi/{ => unit}/LocalUnitOpenApi.java (93%)
rename src/main/java/com/solaria/persistence/openapi/{ => unit}/LocalUnitPhotoOpenApi.java (93%)
rename src/main/java/com/solaria/persistence/openapi/{ => unit}/UnitSpecificationsOpenApi.java (90%)
rename src/main/java/com/solaria/persistence/repository/{ => catalog}/InventoryRepository.java (90%)
rename src/main/java/com/solaria/persistence/repository/{ => catalog}/ModelPhotoRepository.java (77%)
rename src/main/java/com/solaria/persistence/repository/{ => catalog}/ModelRepository.java (57%)
rename src/main/java/com/solaria/persistence/repository/{ => catalog}/OfferRepository.java (84%)
rename src/main/java/com/solaria/persistence/repository/{ => catalog}/OfferTranslationRepository.java (78%)
rename src/main/java/com/solaria/persistence/repository/{ => catalog}/SupplierRepository.java (81%)
rename src/main/java/com/solaria/persistence/repository/{ => company}/BusinessContactRepository.java (59%)
rename src/main/java/com/solaria/persistence/repository/{ => company}/ChargeRepository.java (79%)
rename src/main/java/com/solaria/persistence/repository/{ => company}/CompanyPhotoRepository.java (70%)
rename src/main/java/com/solaria/persistence/repository/{ => company}/CompanyPlansRepository.java (59%)
rename src/main/java/com/solaria/persistence/repository/{ => company}/CompanyPositionsRepository.java (81%)
rename src/main/java/com/solaria/persistence/repository/{ => company}/CompanyRepository.java (85%)
rename src/main/java/com/solaria/persistence/repository/{ => company}/SubscriptionRepository.java (87%)
rename src/main/java/com/solaria/persistence/repository/{ => execution}/RequesterRepository.java (76%)
rename src/main/java/com/solaria/persistence/repository/{ => execution}/ServiceContractRepository.java (77%)
rename src/main/java/com/solaria/persistence/repository/{ => execution}/ServiceExecutorRepository.java (80%)
rename src/main/java/com/solaria/persistence/repository/{ => execution}/TechnicalProjectRepository.java (80%)
rename src/main/java/com/solaria/persistence/repository/{ => execution}/TechnicalServiceRepository.java (77%)
rename src/main/java/com/solaria/persistence/repository/{ => identity}/PermissionRepository.java (72%)
rename src/main/java/com/solaria/persistence/repository/{ => identity}/PersonRepository.java (75%)
rename src/main/java/com/solaria/persistence/repository/{ => identity}/PositionPermissionRepository.java (81%)
rename src/main/java/com/solaria/persistence/repository/{ => identity}/PositionRepository.java (58%)
rename src/main/java/com/solaria/persistence/repository/{ => identity}/UserCompanyRepository.java (83%)
rename src/main/java/com/solaria/persistence/repository/{ => identity}/UserPhotoRepository.java (68%)
rename src/main/java/com/solaria/persistence/repository/{ => identity}/UserRepository.java (85%)
rename src/main/java/com/solaria/persistence/repository/{ => professional}/CertificationRecordRepository.java (76%)
rename src/main/java/com/solaria/persistence/repository/{ => professional}/CertificationRepository.java (57%)
rename src/main/java/com/solaria/persistence/repository/{ => professional}/ProfessionRepository.java (57%)
rename src/main/java/com/solaria/persistence/repository/{ => professional}/ProfessionalRegistrationRepository.java (71%)
rename src/main/java/com/solaria/persistence/repository/{ => professional}/ProfessionalReviewRepository.java (75%)
rename src/main/java/com/solaria/persistence/repository/{ => professional}/ShiftRepository.java (66%)
rename src/main/java/com/solaria/persistence/repository/{ => professional}/TechnicalCourseRepository.java (73%)
rename src/main/java/com/solaria/persistence/repository/{ => professional}/TechnicianAffiliationRepository.java (80%)
rename src/main/java/com/solaria/persistence/repository/{ => professional}/TechnicianRepository.java (72%)
rename src/main/java/com/solaria/persistence/repository/{ => proposal}/ProposalItemRepository.java (86%)
rename src/main/java/com/solaria/persistence/repository/{ => proposal}/ProposalRepository.java (80%)
rename src/main/java/com/solaria/persistence/repository/{ => proposal}/ProposalUnitRepository.java (86%)
rename src/main/java/com/solaria/persistence/repository/{ => shared}/AddressRepository.java (59%)
rename src/main/java/com/solaria/persistence/repository/{ => shared}/ContactRepository.java (59%)
rename src/main/java/com/solaria/persistence/repository/{ => shared}/FluxLogRepository.java (69%)
rename src/main/java/com/solaria/persistence/repository/{ => shared}/GeolocalizationRepository.java (72%)
rename src/main/java/com/solaria/persistence/repository/specification/{ => catalog}/SupplierSpecification.java (91%)
rename src/main/java/com/solaria/persistence/repository/{ => unit}/EnergyBillRepository.java (79%)
rename src/main/java/com/solaria/persistence/repository/{ => unit}/LocalUnitPhotoRepository.java (79%)
rename src/main/java/com/solaria/persistence/repository/{ => unit}/LocalUnitRepository.java (82%)
rename src/main/java/com/solaria/persistence/repository/{ => unit}/UnitSpecificationsRepository.java (79%)
rename src/main/java/com/solaria/persistence/service/{ => catalog}/GoogleTranslateService.java (98%)
rename src/main/java/com/solaria/persistence/service/{ => catalog}/InventoryService.java (88%)
rename src/main/java/com/solaria/persistence/service/{ => catalog}/ModelPhotoService.java (86%)
rename src/main/java/com/solaria/persistence/service/{ => catalog}/ModelService.java (91%)
rename src/main/java/com/solaria/persistence/service/{ => catalog}/OfferService.java (90%)
rename src/main/java/com/solaria/persistence/service/{ => catalog}/OfferTranslationService.java (91%)
rename src/main/java/com/solaria/persistence/service/{ => catalog}/SupplierCacheService.java (95%)
rename src/main/java/com/solaria/persistence/service/{ => catalog}/SupplierService.java (87%)
rename src/main/java/com/solaria/persistence/service/{ => company}/BusinessContactService.java (88%)
rename src/main/java/com/solaria/persistence/service/{ => company}/ChargeService.java (91%)
rename src/main/java/com/solaria/persistence/service/{ => company}/CompanyPhotoService.java (87%)
rename src/main/java/com/solaria/persistence/service/{ => company}/CompanyPlansService.java (88%)
rename src/main/java/com/solaria/persistence/service/{ => company}/CompanyPositionsService.java (86%)
rename src/main/java/com/solaria/persistence/service/{ => company}/CompanyService.java (89%)
rename src/main/java/com/solaria/persistence/service/{ => company}/SubscriptionService.java (90%)
rename src/main/java/com/solaria/persistence/service/{ => execution}/RequesterService.java (85%)
rename src/main/java/com/solaria/persistence/service/{ => execution}/ServiceContractService.java (90%)
rename src/main/java/com/solaria/persistence/service/{ => execution}/ServiceExecutorService.java (86%)
rename src/main/java/com/solaria/persistence/service/{ => execution}/TechnicalProjectService.java (88%)
rename src/main/java/com/solaria/persistence/service/{ => execution}/TechnicalServiceService.java (92%)
rename src/main/java/com/solaria/persistence/service/{ => identity}/InternalUserProvisioningService.java (88%)
rename src/main/java/com/solaria/persistence/service/{ => identity}/PermissionService.java (88%)
rename src/main/java/com/solaria/persistence/service/{ => identity}/PersonService.java (88%)
rename src/main/java/com/solaria/persistence/service/{ => identity}/PositionPermissionService.java (83%)
rename src/main/java/com/solaria/persistence/service/{ => identity}/PositionService.java (86%)
rename src/main/java/com/solaria/persistence/service/{ => identity}/UserCompanyService.java (89%)
rename src/main/java/com/solaria/persistence/service/{ => identity}/UserPhotoService.java (87%)
rename src/main/java/com/solaria/persistence/service/{ => identity}/UserService.java (87%)
rename src/main/java/com/solaria/persistence/service/{ => professional}/CertificationRecordService.java (86%)
rename src/main/java/com/solaria/persistence/service/{ => professional}/CertificationService.java (87%)
rename src/main/java/com/solaria/persistence/service/{ => professional}/ProfessionService.java (86%)
rename src/main/java/com/solaria/persistence/service/{ => professional}/ProfessionalRegistrationService.java (87%)
rename src/main/java/com/solaria/persistence/service/{ => professional}/ProfessionalReviewService.java (85%)
rename src/main/java/com/solaria/persistence/service/{ => professional}/ShiftService.java (87%)
rename src/main/java/com/solaria/persistence/service/{ => professional}/TechnicalCourseService.java (88%)
rename src/main/java/com/solaria/persistence/service/{ => professional}/TechnicianAffiliationService.java (87%)
rename src/main/java/com/solaria/persistence/service/{ => professional}/TechnicianService.java (86%)
rename src/main/java/com/solaria/persistence/service/{ => proposal}/ProposalItemService.java (91%)
rename src/main/java/com/solaria/persistence/service/{ => proposal}/ProposalService.java (92%)
rename src/main/java/com/solaria/persistence/service/{ => proposal}/ProposalUnitService.java (90%)
rename src/main/java/com/solaria/persistence/service/{ => shared}/AddressService.java (87%)
rename src/main/java/com/solaria/persistence/service/{ => shared}/AuditService.java (92%)
rename src/main/java/com/solaria/persistence/service/{ => shared}/CloudinaryService.java (99%)
rename src/main/java/com/solaria/persistence/service/{ => shared}/ContactService.java (87%)
rename src/main/java/com/solaria/persistence/service/{ => shared}/FluxLogService.java (80%)
rename src/main/java/com/solaria/persistence/service/{ => shared}/GeolocalizationService.java (92%)
rename src/main/java/com/solaria/persistence/service/{ => unit}/EnergyBillService.java (92%)
rename src/main/java/com/solaria/persistence/service/{ => unit}/LocalUnitPhotoService.java (88%)
rename src/main/java/com/solaria/persistence/service/{ => unit}/LocalUnitService.java (88%)
rename src/main/java/com/solaria/persistence/service/{ => unit}/UnitSpecificationsService.java (86%)
diff --git a/pom.xml b/pom.xml
index 5aedce1..4f4b9d4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -116,6 +116,7 @@
org.springframework.boot
spring-boot-starter-webmvc-test
+
com.h2database
h2
diff --git a/src/main/java/com/solaria/persistence/controller/ServiceAuthController.java b/src/main/java/com/solaria/persistence/controller/auth/ServiceAuthController.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/controller/ServiceAuthController.java
rename to src/main/java/com/solaria/persistence/controller/auth/ServiceAuthController.java
index 6c5dcff..589ae37 100644
--- a/src/main/java/com/solaria/persistence/controller/ServiceAuthController.java
+++ b/src/main/java/com/solaria/persistence/controller/auth/ServiceAuthController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.auth;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
@@ -9,9 +9,9 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.ServiceTokenMintRequestDTO;
-import com.solaria.persistence.dto.request.ServiceTokenRefreshRequestDTO;
-import com.solaria.persistence.dto.response.ServiceTokenResponseDTO;
+import com.solaria.persistence.dto.request.auth.ServiceTokenMintRequestDTO;
+import com.solaria.persistence.dto.request.auth.ServiceTokenRefreshRequestDTO;
+import com.solaria.persistence.dto.response.auth.ServiceTokenResponseDTO;
import com.solaria.persistence.exception.ServiceAuthException;
import com.solaria.persistence.security.service.ServiceTokenProperties;
import com.solaria.persistence.security.service.ServiceTokenProvider;
diff --git a/src/main/java/com/solaria/persistence/controller/InventoryController.java b/src/main/java/com/solaria/persistence/controller/catalog/InventoryController.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/controller/InventoryController.java
rename to src/main/java/com/solaria/persistence/controller/catalog/InventoryController.java
index cbd47e4..0748834 100644
--- a/src/main/java/com/solaria/persistence/controller/InventoryController.java
+++ b/src/main/java/com/solaria/persistence/controller/catalog/InventoryController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.catalog;
import java.net.URI;
import java.util.List;
@@ -14,11 +14,11 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.patch.UpdateQuantityDTO;
-import com.solaria.persistence.dto.request.InventoryRequestDTO;
-import com.solaria.persistence.dto.response.InventoryResponseDTO;
-import com.solaria.persistence.openapi.InventoryOpenApi;
-import com.solaria.persistence.service.InventoryService;
+import com.solaria.persistence.dto.patch.catalog.UpdateQuantityDTO;
+import com.solaria.persistence.dto.request.catalog.InventoryRequestDTO;
+import com.solaria.persistence.dto.response.catalog.InventoryResponseDTO;
+import com.solaria.persistence.openapi.catalog.InventoryOpenApi;
+import com.solaria.persistence.service.catalog.InventoryService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/ModelController.java b/src/main/java/com/solaria/persistence/controller/catalog/ModelController.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/controller/ModelController.java
rename to src/main/java/com/solaria/persistence/controller/catalog/ModelController.java
index 1d7db12..2a04cc9 100644
--- a/src/main/java/com/solaria/persistence/controller/ModelController.java
+++ b/src/main/java/com/solaria/persistence/controller/catalog/ModelController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.catalog;
import java.net.URI;
import java.util.List;
@@ -14,11 +14,11 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.domain.enums.ModelStatus;
-import com.solaria.persistence.dto.request.ModelRequestDTO;
-import com.solaria.persistence.dto.response.ModelResponseDTO;
-import com.solaria.persistence.openapi.ModelOpenApi;
-import com.solaria.persistence.service.ModelService;
+import com.solaria.persistence.domain.enums.catalog.ModelStatus;
+import com.solaria.persistence.dto.request.catalog.ModelRequestDTO;
+import com.solaria.persistence.dto.response.catalog.ModelResponseDTO;
+import com.solaria.persistence.openapi.catalog.ModelOpenApi;
+import com.solaria.persistence.service.catalog.ModelService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/ModelPhotoController.java b/src/main/java/com/solaria/persistence/controller/catalog/ModelPhotoController.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/controller/ModelPhotoController.java
rename to src/main/java/com/solaria/persistence/controller/catalog/ModelPhotoController.java
index c2a3bc2..442ed03 100644
--- a/src/main/java/com/solaria/persistence/controller/ModelPhotoController.java
+++ b/src/main/java/com/solaria/persistence/controller/catalog/ModelPhotoController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.catalog;
import java.net.URI;
import java.util.List;
@@ -15,9 +15,9 @@
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
-import com.solaria.persistence.dto.response.ModelPhotoResponseDTO;
-import com.solaria.persistence.openapi.ModelPhotoOpenApi;
-import com.solaria.persistence.service.ModelPhotoService;
+import com.solaria.persistence.dto.response.catalog.ModelPhotoResponseDTO;
+import com.solaria.persistence.openapi.catalog.ModelPhotoOpenApi;
+import com.solaria.persistence.service.catalog.ModelPhotoService;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/OfferController.java b/src/main/java/com/solaria/persistence/controller/catalog/OfferController.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/controller/OfferController.java
rename to src/main/java/com/solaria/persistence/controller/catalog/OfferController.java
index ffe1b7e..9311dd6 100644
--- a/src/main/java/com/solaria/persistence/controller/OfferController.java
+++ b/src/main/java/com/solaria/persistence/controller/catalog/OfferController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.catalog;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.OfferRequestDTO;
-import com.solaria.persistence.dto.response.OfferResponseDTO;
-import com.solaria.persistence.openapi.OfferOpenApi;
-import com.solaria.persistence.service.OfferService;
+import com.solaria.persistence.dto.request.catalog.OfferRequestDTO;
+import com.solaria.persistence.dto.response.catalog.OfferResponseDTO;
+import com.solaria.persistence.openapi.catalog.OfferOpenApi;
+import com.solaria.persistence.service.catalog.OfferService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/SupplierController.java b/src/main/java/com/solaria/persistence/controller/catalog/SupplierController.java
similarity index 83%
rename from src/main/java/com/solaria/persistence/controller/SupplierController.java
rename to src/main/java/com/solaria/persistence/controller/catalog/SupplierController.java
index e4a0eb2..f358c46 100644
--- a/src/main/java/com/solaria/persistence/controller/SupplierController.java
+++ b/src/main/java/com/solaria/persistence/controller/catalog/SupplierController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.catalog;
import java.net.URI;
import java.util.List;
@@ -12,12 +12,12 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.SupplierRequestDTO;
-import com.solaria.persistence.dto.request.SupplierSearchFilterDTO;
-import com.solaria.persistence.dto.response.SupplierResponseDTO;
-import com.solaria.persistence.dto.response.SupplierSearchResponseDTO;
-import com.solaria.persistence.openapi.SupplierOpenApi;
-import com.solaria.persistence.service.SupplierService;
+import com.solaria.persistence.dto.request.catalog.SupplierRequestDTO;
+import com.solaria.persistence.dto.request.catalog.SupplierSearchFilterDTO;
+import com.solaria.persistence.dto.response.catalog.SupplierResponseDTO;
+import com.solaria.persistence.dto.response.catalog.SupplierSearchResponseDTO;
+import com.solaria.persistence.openapi.catalog.SupplierOpenApi;
+import com.solaria.persistence.service.catalog.SupplierService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/InternalPingController.java b/src/main/java/com/solaria/persistence/controller/common/InternalPingController.java
similarity index 89%
rename from src/main/java/com/solaria/persistence/controller/InternalPingController.java
rename to src/main/java/com/solaria/persistence/controller/common/InternalPingController.java
index 4601b58..15d6abd 100644
--- a/src/main/java/com/solaria/persistence/controller/InternalPingController.java
+++ b/src/main/java/com/solaria/persistence/controller/common/InternalPingController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.common;
import java.util.Map;
diff --git a/src/main/java/com/solaria/persistence/controller/BusinessContactController.java b/src/main/java/com/solaria/persistence/controller/company/BusinessContactController.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/controller/BusinessContactController.java
rename to src/main/java/com/solaria/persistence/controller/company/BusinessContactController.java
index e1da4fb..6aac7ef 100644
--- a/src/main/java/com/solaria/persistence/controller/BusinessContactController.java
+++ b/src/main/java/com/solaria/persistence/controller/company/BusinessContactController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.company;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.BusinessContactRequestDTO;
-import com.solaria.persistence.dto.response.BusinessContactResponseDTO;
-import com.solaria.persistence.openapi.BusinessContactOpenApi;
-import com.solaria.persistence.service.BusinessContactService;
+import com.solaria.persistence.dto.request.company.BusinessContactRequestDTO;
+import com.solaria.persistence.dto.response.company.BusinessContactResponseDTO;
+import com.solaria.persistence.openapi.company.BusinessContactOpenApi;
+import com.solaria.persistence.service.company.BusinessContactService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/ChargeController.java b/src/main/java/com/solaria/persistence/controller/company/ChargeController.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/controller/ChargeController.java
rename to src/main/java/com/solaria/persistence/controller/company/ChargeController.java
index 9320672..8684651 100644
--- a/src/main/java/com/solaria/persistence/controller/ChargeController.java
+++ b/src/main/java/com/solaria/persistence/controller/company/ChargeController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.company;
import java.net.URI;
import java.time.LocalDate;
@@ -15,11 +15,11 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.domain.enums.PaymentMethod;
-import com.solaria.persistence.dto.request.ChargeRequestDTO;
-import com.solaria.persistence.dto.response.ChargeResponseDTO;
-import com.solaria.persistence.openapi.ChargeOpenApi;
-import com.solaria.persistence.service.ChargeService;
+import com.solaria.persistence.domain.enums.company.PaymentMethod;
+import com.solaria.persistence.dto.request.company.ChargeRequestDTO;
+import com.solaria.persistence.dto.response.company.ChargeResponseDTO;
+import com.solaria.persistence.openapi.company.ChargeOpenApi;
+import com.solaria.persistence.service.company.ChargeService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/CompanyController.java b/src/main/java/com/solaria/persistence/controller/company/CompanyController.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/controller/CompanyController.java
rename to src/main/java/com/solaria/persistence/controller/company/CompanyController.java
index c331017..56b92a8 100644
--- a/src/main/java/com/solaria/persistence/controller/CompanyController.java
+++ b/src/main/java/com/solaria/persistence/controller/company/CompanyController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.company;
import java.net.URI;
import java.util.List;
@@ -15,12 +15,12 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.patch.UpdateBusinessContactIdDTO;
-import com.solaria.persistence.dto.patch.UpdateCompanyAddressIdDTO;
-import com.solaria.persistence.dto.request.CompanyRequestDTO;
-import com.solaria.persistence.dto.response.CompanyResponseDTO;
-import com.solaria.persistence.openapi.CompanyOpenApi;
-import com.solaria.persistence.service.CompanyService;
+import com.solaria.persistence.dto.patch.company.UpdateBusinessContactIdDTO;
+import com.solaria.persistence.dto.patch.company.UpdateCompanyAddressIdDTO;
+import com.solaria.persistence.dto.request.company.CompanyRequestDTO;
+import com.solaria.persistence.dto.response.company.CompanyResponseDTO;
+import com.solaria.persistence.openapi.company.CompanyOpenApi;
+import com.solaria.persistence.service.company.CompanyService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/CompanyPhotoController.java b/src/main/java/com/solaria/persistence/controller/company/CompanyPhotoController.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/controller/CompanyPhotoController.java
rename to src/main/java/com/solaria/persistence/controller/company/CompanyPhotoController.java
index 44800f2..05d097f 100644
--- a/src/main/java/com/solaria/persistence/controller/CompanyPhotoController.java
+++ b/src/main/java/com/solaria/persistence/controller/company/CompanyPhotoController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.company;
import java.util.List;
import java.util.UUID;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
-import com.solaria.persistence.domain.enums.PhotoType;
-import com.solaria.persistence.dto.response.CompanyPhotoResponseDTO;
-import com.solaria.persistence.openapi.CompanyPhotoOpenApi;
-import com.solaria.persistence.service.CompanyPhotoService;
+import com.solaria.persistence.domain.enums.shared.PhotoType;
+import com.solaria.persistence.dto.response.company.CompanyPhotoResponseDTO;
+import com.solaria.persistence.openapi.company.CompanyPhotoOpenApi;
+import com.solaria.persistence.service.company.CompanyPhotoService;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/CompanyPlansController.java b/src/main/java/com/solaria/persistence/controller/company/CompanyPlansController.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/controller/CompanyPlansController.java
rename to src/main/java/com/solaria/persistence/controller/company/CompanyPlansController.java
index 781a6a3..17219d9 100644
--- a/src/main/java/com/solaria/persistence/controller/CompanyPlansController.java
+++ b/src/main/java/com/solaria/persistence/controller/company/CompanyPlansController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.company;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.CompanyPlansRequestDTO;
-import com.solaria.persistence.dto.response.CompanyPlansResponseDTO;
-import com.solaria.persistence.openapi.CompanyPlansOpenApi;
-import com.solaria.persistence.service.CompanyPlansService;
+import com.solaria.persistence.dto.request.company.CompanyPlansRequestDTO;
+import com.solaria.persistence.dto.response.company.CompanyPlansResponseDTO;
+import com.solaria.persistence.openapi.company.CompanyPlansOpenApi;
+import com.solaria.persistence.service.company.CompanyPlansService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/CompanyPositionsController.java b/src/main/java/com/solaria/persistence/controller/company/CompanyPositionsController.java
similarity index 84%
rename from src/main/java/com/solaria/persistence/controller/CompanyPositionsController.java
rename to src/main/java/com/solaria/persistence/controller/company/CompanyPositionsController.java
index 7525e68..676e624 100644
--- a/src/main/java/com/solaria/persistence/controller/CompanyPositionsController.java
+++ b/src/main/java/com/solaria/persistence/controller/company/CompanyPositionsController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.company;
import java.net.URI;
import java.util.List;
@@ -13,10 +13,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.CompanyPositionsRequestDTO;
-import com.solaria.persistence.dto.response.CompanyPositionsResponseDTO;
-import com.solaria.persistence.openapi.CompanyPositionsOpenApi;
-import com.solaria.persistence.service.CompanyPositionsService;
+import com.solaria.persistence.dto.request.company.CompanyPositionsRequestDTO;
+import com.solaria.persistence.dto.response.company.CompanyPositionsResponseDTO;
+import com.solaria.persistence.openapi.company.CompanyPositionsOpenApi;
+import com.solaria.persistence.service.company.CompanyPositionsService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/SubscriptionController.java b/src/main/java/com/solaria/persistence/controller/company/SubscriptionController.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/controller/SubscriptionController.java
rename to src/main/java/com/solaria/persistence/controller/company/SubscriptionController.java
index fa94ece..33d6572 100644
--- a/src/main/java/com/solaria/persistence/controller/SubscriptionController.java
+++ b/src/main/java/com/solaria/persistence/controller/company/SubscriptionController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.company;
import java.net.URI;
import java.util.List;
@@ -12,10 +12,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.SubscriptionRequestDTO;
-import com.solaria.persistence.dto.response.SubscriptionResponseDTO;
-import com.solaria.persistence.openapi.SubscriptionOpenApi;
-import com.solaria.persistence.service.SubscriptionService;
+import com.solaria.persistence.dto.request.company.SubscriptionRequestDTO;
+import com.solaria.persistence.dto.response.company.SubscriptionResponseDTO;
+import com.solaria.persistence.openapi.company.SubscriptionOpenApi;
+import com.solaria.persistence.service.company.SubscriptionService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/RequesterController.java b/src/main/java/com/solaria/persistence/controller/execution/RequesterController.java
similarity index 84%
rename from src/main/java/com/solaria/persistence/controller/RequesterController.java
rename to src/main/java/com/solaria/persistence/controller/execution/RequesterController.java
index 59403cb..439ad7e 100644
--- a/src/main/java/com/solaria/persistence/controller/RequesterController.java
+++ b/src/main/java/com/solaria/persistence/controller/execution/RequesterController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.execution;
import java.net.URI;
import java.util.List;
@@ -13,10 +13,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.RequesterRequestDTO;
-import com.solaria.persistence.dto.response.RequesterResponseDTO;
-import com.solaria.persistence.openapi.RequesterOpenApi;
-import com.solaria.persistence.service.RequesterService;
+import com.solaria.persistence.dto.request.execution.RequesterRequestDTO;
+import com.solaria.persistence.dto.response.execution.RequesterResponseDTO;
+import com.solaria.persistence.openapi.execution.RequesterOpenApi;
+import com.solaria.persistence.service.execution.RequesterService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/ServiceContractController.java b/src/main/java/com/solaria/persistence/controller/execution/ServiceContractController.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/controller/ServiceContractController.java
rename to src/main/java/com/solaria/persistence/controller/execution/ServiceContractController.java
index 9047364..3244190 100644
--- a/src/main/java/com/solaria/persistence/controller/ServiceContractController.java
+++ b/src/main/java/com/solaria/persistence/controller/execution/ServiceContractController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.execution;
import java.net.URI;
import java.util.UUID;
@@ -13,10 +13,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.ServiceContractRequestDTO;
-import com.solaria.persistence.dto.response.ServiceContractResponseDTO;
-import com.solaria.persistence.openapi.ServiceContractOpenApi;
-import com.solaria.persistence.service.ServiceContractService;
+import com.solaria.persistence.dto.request.execution.ServiceContractRequestDTO;
+import com.solaria.persistence.dto.response.execution.ServiceContractResponseDTO;
+import com.solaria.persistence.openapi.execution.ServiceContractOpenApi;
+import com.solaria.persistence.service.execution.ServiceContractService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/ServiceExecutorController.java b/src/main/java/com/solaria/persistence/controller/execution/ServiceExecutorController.java
similarity index 82%
rename from src/main/java/com/solaria/persistence/controller/ServiceExecutorController.java
rename to src/main/java/com/solaria/persistence/controller/execution/ServiceExecutorController.java
index 849df07..ac574a3 100644
--- a/src/main/java/com/solaria/persistence/controller/ServiceExecutorController.java
+++ b/src/main/java/com/solaria/persistence/controller/execution/ServiceExecutorController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.execution;
import java.util.List;
import java.util.UUID;
@@ -13,11 +13,11 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.patch.UpdateFunctionDTO;
-import com.solaria.persistence.dto.request.ServiceExecutorRequestDTO;
-import com.solaria.persistence.dto.response.ServiceExecutorResponseDTO;
-import com.solaria.persistence.openapi.ServiceExecutorOpenApi;
-import com.solaria.persistence.service.ServiceExecutorService;
+import com.solaria.persistence.dto.patch.execution.UpdateFunctionDTO;
+import com.solaria.persistence.dto.request.execution.ServiceExecutorRequestDTO;
+import com.solaria.persistence.dto.response.execution.ServiceExecutorResponseDTO;
+import com.solaria.persistence.openapi.execution.ServiceExecutorOpenApi;
+import com.solaria.persistence.service.execution.ServiceExecutorService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/TechnicalProjectController.java b/src/main/java/com/solaria/persistence/controller/execution/TechnicalProjectController.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/controller/TechnicalProjectController.java
rename to src/main/java/com/solaria/persistence/controller/execution/TechnicalProjectController.java
index 66b44aa..82b0dbe 100644
--- a/src/main/java/com/solaria/persistence/controller/TechnicalProjectController.java
+++ b/src/main/java/com/solaria/persistence/controller/execution/TechnicalProjectController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.execution;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.TechnicalProjectRequestDTO;
-import com.solaria.persistence.dto.response.TechnicalProjectResponseDTO;
-import com.solaria.persistence.openapi.TechnicalProjectOpenApi;
-import com.solaria.persistence.service.TechnicalProjectService;
+import com.solaria.persistence.dto.request.execution.TechnicalProjectRequestDTO;
+import com.solaria.persistence.dto.response.execution.TechnicalProjectResponseDTO;
+import com.solaria.persistence.openapi.execution.TechnicalProjectOpenApi;
+import com.solaria.persistence.service.execution.TechnicalProjectService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/TechnicalServiceController.java b/src/main/java/com/solaria/persistence/controller/execution/TechnicalServiceController.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/controller/TechnicalServiceController.java
rename to src/main/java/com/solaria/persistence/controller/execution/TechnicalServiceController.java
index bffaabe..02164fb 100644
--- a/src/main/java/com/solaria/persistence/controller/TechnicalServiceController.java
+++ b/src/main/java/com/solaria/persistence/controller/execution/TechnicalServiceController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.execution;
import java.net.URI;
import java.util.List;
@@ -13,13 +13,13 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.patch.ServiceAcceptanceDTO;
-import com.solaria.persistence.dto.patch.ServiceScheduleDTO;
-import com.solaria.persistence.dto.patch.UpdatePurposeDTO;
-import com.solaria.persistence.dto.request.TechnicalServiceRequestDTO;
-import com.solaria.persistence.dto.response.TechnicalServiceResponseDTO;
-import com.solaria.persistence.openapi.TechnicalServiceOpenApi;
-import com.solaria.persistence.service.TechnicalServiceService;
+import com.solaria.persistence.dto.patch.execution.ServiceAcceptanceDTO;
+import com.solaria.persistence.dto.patch.execution.ServiceScheduleDTO;
+import com.solaria.persistence.dto.patch.execution.UpdatePurposeDTO;
+import com.solaria.persistence.dto.request.execution.TechnicalServiceRequestDTO;
+import com.solaria.persistence.dto.response.execution.TechnicalServiceResponseDTO;
+import com.solaria.persistence.openapi.execution.TechnicalServiceOpenApi;
+import com.solaria.persistence.service.execution.TechnicalServiceService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/InternalUserProvisioningController.java b/src/main/java/com/solaria/persistence/controller/identity/InternalUserProvisioningController.java
similarity index 79%
rename from src/main/java/com/solaria/persistence/controller/InternalUserProvisioningController.java
rename to src/main/java/com/solaria/persistence/controller/identity/InternalUserProvisioningController.java
index 574d647..c4453aa 100644
--- a/src/main/java/com/solaria/persistence/controller/InternalUserProvisioningController.java
+++ b/src/main/java/com/solaria/persistence/controller/identity/InternalUserProvisioningController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.identity;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
@@ -6,9 +6,9 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.InternalUserProvisionRequestDTO;
-import com.solaria.persistence.dto.response.InternalUserProvisionResponseDTO;
-import com.solaria.persistence.service.InternalUserProvisioningService;
+import com.solaria.persistence.dto.request.identity.InternalUserProvisionRequestDTO;
+import com.solaria.persistence.dto.response.identity.InternalUserProvisionResponseDTO;
+import com.solaria.persistence.service.identity.InternalUserProvisioningService;
import jakarta.validation.Valid;
diff --git a/src/main/java/com/solaria/persistence/controller/PermissionController.java b/src/main/java/com/solaria/persistence/controller/identity/PermissionController.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/controller/PermissionController.java
rename to src/main/java/com/solaria/persistence/controller/identity/PermissionController.java
index 1ad25ed..af43a99 100644
--- a/src/main/java/com/solaria/persistence/controller/PermissionController.java
+++ b/src/main/java/com/solaria/persistence/controller/identity/PermissionController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.identity;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.PermissionRequestDTO;
-import com.solaria.persistence.dto.response.PermissionResponseDTO;
-import com.solaria.persistence.openapi.PermissionOpenApi;
-import com.solaria.persistence.service.PermissionService;
+import com.solaria.persistence.dto.request.identity.PermissionRequestDTO;
+import com.solaria.persistence.dto.response.identity.PermissionResponseDTO;
+import com.solaria.persistence.openapi.identity.PermissionOpenApi;
+import com.solaria.persistence.service.identity.PermissionService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/PersonController.java b/src/main/java/com/solaria/persistence/controller/identity/PersonController.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/controller/PersonController.java
rename to src/main/java/com/solaria/persistence/controller/identity/PersonController.java
index b530bb9..94611e4 100644
--- a/src/main/java/com/solaria/persistence/controller/PersonController.java
+++ b/src/main/java/com/solaria/persistence/controller/identity/PersonController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.identity;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.PersonRequestDTO;
-import com.solaria.persistence.dto.response.PersonResponseDTO;
-import com.solaria.persistence.openapi.PersonOpenApi;
-import com.solaria.persistence.service.PersonService;
+import com.solaria.persistence.dto.request.identity.PersonRequestDTO;
+import com.solaria.persistence.dto.response.identity.PersonResponseDTO;
+import com.solaria.persistence.openapi.identity.PersonOpenApi;
+import com.solaria.persistence.service.identity.PersonService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/PositionController.java b/src/main/java/com/solaria/persistence/controller/identity/PositionController.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/controller/PositionController.java
rename to src/main/java/com/solaria/persistence/controller/identity/PositionController.java
index 94bcdb3..404b87f 100644
--- a/src/main/java/com/solaria/persistence/controller/PositionController.java
+++ b/src/main/java/com/solaria/persistence/controller/identity/PositionController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.identity;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.PositionRequestDTO;
-import com.solaria.persistence.dto.response.PositionResponseDTO;
-import com.solaria.persistence.openapi.PositionOpenApi;
-import com.solaria.persistence.service.PositionService;
+import com.solaria.persistence.dto.request.identity.PositionRequestDTO;
+import com.solaria.persistence.dto.response.identity.PositionResponseDTO;
+import com.solaria.persistence.openapi.identity.PositionOpenApi;
+import com.solaria.persistence.service.identity.PositionService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/PositionPermissionController.java b/src/main/java/com/solaria/persistence/controller/identity/PositionPermissionController.java
similarity index 82%
rename from src/main/java/com/solaria/persistence/controller/PositionPermissionController.java
rename to src/main/java/com/solaria/persistence/controller/identity/PositionPermissionController.java
index 787ee1e..392a54f 100644
--- a/src/main/java/com/solaria/persistence/controller/PositionPermissionController.java
+++ b/src/main/java/com/solaria/persistence/controller/identity/PositionPermissionController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.identity;
import java.net.URI;
import java.util.List;
@@ -13,10 +13,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.PositionPermissionRequestDTO;
-import com.solaria.persistence.dto.response.PositionPermissionResponseDTO;
-import com.solaria.persistence.openapi.PositionPermissionOpenApi;
-import com.solaria.persistence.service.PositionPermissionService;
+import com.solaria.persistence.dto.request.identity.PositionPermissionRequestDTO;
+import com.solaria.persistence.dto.response.identity.PositionPermissionResponseDTO;
+import com.solaria.persistence.openapi.identity.PositionPermissionOpenApi;
+import com.solaria.persistence.service.identity.PositionPermissionService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/UserCompanyController.java b/src/main/java/com/solaria/persistence/controller/identity/UserCompanyController.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/controller/UserCompanyController.java
rename to src/main/java/com/solaria/persistence/controller/identity/UserCompanyController.java
index 30e6779..a0b7c18 100644
--- a/src/main/java/com/solaria/persistence/controller/UserCompanyController.java
+++ b/src/main/java/com/solaria/persistence/controller/identity/UserCompanyController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.identity;
import java.net.URI;
import java.util.List;
@@ -14,11 +14,11 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.patch.UpdatePositionDTO;
-import com.solaria.persistence.dto.request.UserCompanyRequestDTO;
-import com.solaria.persistence.dto.response.UserCompanyResponseDTO;
-import com.solaria.persistence.openapi.UserCompanyOpenApi;
-import com.solaria.persistence.service.UserCompanyService;
+import com.solaria.persistence.dto.patch.identity.UpdatePositionDTO;
+import com.solaria.persistence.dto.request.identity.UserCompanyRequestDTO;
+import com.solaria.persistence.dto.response.identity.UserCompanyResponseDTO;
+import com.solaria.persistence.openapi.identity.UserCompanyOpenApi;
+import com.solaria.persistence.service.identity.UserCompanyService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/UserController.java b/src/main/java/com/solaria/persistence/controller/identity/UserController.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/controller/UserController.java
rename to src/main/java/com/solaria/persistence/controller/identity/UserController.java
index a4723aa..3abfee7 100644
--- a/src/main/java/com/solaria/persistence/controller/UserController.java
+++ b/src/main/java/com/solaria/persistence/controller/identity/UserController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.identity;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.UserRequestDTO;
-import com.solaria.persistence.dto.response.UserResponseDTO;
-import com.solaria.persistence.openapi.UserOpenApi;
-import com.solaria.persistence.service.UserService;
+import com.solaria.persistence.dto.request.identity.UserRequestDTO;
+import com.solaria.persistence.dto.response.identity.UserResponseDTO;
+import com.solaria.persistence.openapi.identity.UserOpenApi;
+import com.solaria.persistence.service.identity.UserService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/UserPhotoController.java b/src/main/java/com/solaria/persistence/controller/identity/UserPhotoController.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/controller/UserPhotoController.java
rename to src/main/java/com/solaria/persistence/controller/identity/UserPhotoController.java
index ddbc14a..63dca16 100644
--- a/src/main/java/com/solaria/persistence/controller/UserPhotoController.java
+++ b/src/main/java/com/solaria/persistence/controller/identity/UserPhotoController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.identity;
import java.util.List;
import java.util.UUID;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
-import com.solaria.persistence.domain.enums.PhotoType;
-import com.solaria.persistence.dto.response.UserPhotoResponseDTO;
-import com.solaria.persistence.openapi.UserPhotoOpenApi;
-import com.solaria.persistence.service.UserPhotoService;
+import com.solaria.persistence.domain.enums.shared.PhotoType;
+import com.solaria.persistence.dto.response.identity.UserPhotoResponseDTO;
+import com.solaria.persistence.openapi.identity.UserPhotoOpenApi;
+import com.solaria.persistence.service.identity.UserPhotoService;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/CertificationController.java b/src/main/java/com/solaria/persistence/controller/professional/CertificationController.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/controller/CertificationController.java
rename to src/main/java/com/solaria/persistence/controller/professional/CertificationController.java
index 4ec653e..d8a7682 100644
--- a/src/main/java/com/solaria/persistence/controller/CertificationController.java
+++ b/src/main/java/com/solaria/persistence/controller/professional/CertificationController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.professional;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.CertificationRequestDTO;
-import com.solaria.persistence.dto.response.CertificationResponseDTO;
-import com.solaria.persistence.openapi.CertificationOpenApi;
-import com.solaria.persistence.service.CertificationService;
+import com.solaria.persistence.dto.request.professional.CertificationRequestDTO;
+import com.solaria.persistence.dto.response.professional.CertificationResponseDTO;
+import com.solaria.persistence.openapi.professional.CertificationOpenApi;
+import com.solaria.persistence.service.professional.CertificationService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/CertificationRecordController.java b/src/main/java/com/solaria/persistence/controller/professional/CertificationRecordController.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/controller/CertificationRecordController.java
rename to src/main/java/com/solaria/persistence/controller/professional/CertificationRecordController.java
index 6f2d1ac..d33834a 100644
--- a/src/main/java/com/solaria/persistence/controller/CertificationRecordController.java
+++ b/src/main/java/com/solaria/persistence/controller/professional/CertificationRecordController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.professional;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.CertificationRecordRequestDTO;
-import com.solaria.persistence.dto.response.CertificationRecordResponseDTO;
-import com.solaria.persistence.openapi.CertificationRecordOpenApi;
-import com.solaria.persistence.service.CertificationRecordService;
+import com.solaria.persistence.dto.request.professional.CertificationRecordRequestDTO;
+import com.solaria.persistence.dto.response.professional.CertificationRecordResponseDTO;
+import com.solaria.persistence.openapi.professional.CertificationRecordOpenApi;
+import com.solaria.persistence.service.professional.CertificationRecordService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/ProfessionController.java b/src/main/java/com/solaria/persistence/controller/professional/ProfessionController.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/controller/ProfessionController.java
rename to src/main/java/com/solaria/persistence/controller/professional/ProfessionController.java
index 42bcb11..e4b7cea 100644
--- a/src/main/java/com/solaria/persistence/controller/ProfessionController.java
+++ b/src/main/java/com/solaria/persistence/controller/professional/ProfessionController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.professional;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.ProfessionRequestDTO;
-import com.solaria.persistence.dto.response.ProfessionResponseDTO;
-import com.solaria.persistence.openapi.ProfessionOpenApi;
-import com.solaria.persistence.service.ProfessionService;
+import com.solaria.persistence.dto.request.professional.ProfessionRequestDTO;
+import com.solaria.persistence.dto.response.professional.ProfessionResponseDTO;
+import com.solaria.persistence.openapi.professional.ProfessionOpenApi;
+import com.solaria.persistence.service.professional.ProfessionService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/ProfessionalRegistrationController.java b/src/main/java/com/solaria/persistence/controller/professional/ProfessionalRegistrationController.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/controller/ProfessionalRegistrationController.java
rename to src/main/java/com/solaria/persistence/controller/professional/ProfessionalRegistrationController.java
index d0b6017..b605317 100644
--- a/src/main/java/com/solaria/persistence/controller/ProfessionalRegistrationController.java
+++ b/src/main/java/com/solaria/persistence/controller/professional/ProfessionalRegistrationController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.professional;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.ProfessionalRegistrationRequestDTO;
-import com.solaria.persistence.dto.response.ProfessionalRegistrationResponseDTO;
-import com.solaria.persistence.openapi.ProfessionalRegistrationOpenApi;
-import com.solaria.persistence.service.ProfessionalRegistrationService;
+import com.solaria.persistence.dto.request.professional.ProfessionalRegistrationRequestDTO;
+import com.solaria.persistence.dto.response.professional.ProfessionalRegistrationResponseDTO;
+import com.solaria.persistence.openapi.professional.ProfessionalRegistrationOpenApi;
+import com.solaria.persistence.service.professional.ProfessionalRegistrationService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/ProfessionalReviewController.java b/src/main/java/com/solaria/persistence/controller/professional/ProfessionalReviewController.java
similarity index 83%
rename from src/main/java/com/solaria/persistence/controller/ProfessionalReviewController.java
rename to src/main/java/com/solaria/persistence/controller/professional/ProfessionalReviewController.java
index 7db52f1..0bed03b 100644
--- a/src/main/java/com/solaria/persistence/controller/ProfessionalReviewController.java
+++ b/src/main/java/com/solaria/persistence/controller/professional/ProfessionalReviewController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.professional;
import java.net.URI;
import java.util.List;
@@ -13,10 +13,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.ProfessionalReviewRequestDTO;
-import com.solaria.persistence.dto.response.ProfessionalReviewResponseDTO;
-import com.solaria.persistence.openapi.ProfessionalReviewOpenApi;
-import com.solaria.persistence.service.ProfessionalReviewService;
+import com.solaria.persistence.dto.request.professional.ProfessionalReviewRequestDTO;
+import com.solaria.persistence.dto.response.professional.ProfessionalReviewResponseDTO;
+import com.solaria.persistence.openapi.professional.ProfessionalReviewOpenApi;
+import com.solaria.persistence.service.professional.ProfessionalReviewService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/ShiftController.java b/src/main/java/com/solaria/persistence/controller/professional/ShiftController.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/controller/ShiftController.java
rename to src/main/java/com/solaria/persistence/controller/professional/ShiftController.java
index e90d09d..0671fd0 100644
--- a/src/main/java/com/solaria/persistence/controller/ShiftController.java
+++ b/src/main/java/com/solaria/persistence/controller/professional/ShiftController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.professional;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.ShiftRequestDTO;
-import com.solaria.persistence.dto.response.ShiftResponseDTO;
-import com.solaria.persistence.openapi.ShiftOpenApi;
-import com.solaria.persistence.service.ShiftService;
+import com.solaria.persistence.dto.request.professional.ShiftRequestDTO;
+import com.solaria.persistence.dto.response.professional.ShiftResponseDTO;
+import com.solaria.persistence.openapi.professional.ShiftOpenApi;
+import com.solaria.persistence.service.professional.ShiftService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/TechnicalCourseController.java b/src/main/java/com/solaria/persistence/controller/professional/TechnicalCourseController.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/controller/TechnicalCourseController.java
rename to src/main/java/com/solaria/persistence/controller/professional/TechnicalCourseController.java
index 04b13dd..a9172f1 100644
--- a/src/main/java/com/solaria/persistence/controller/TechnicalCourseController.java
+++ b/src/main/java/com/solaria/persistence/controller/professional/TechnicalCourseController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.professional;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.TechnicalCourseRequestDTO;
-import com.solaria.persistence.dto.response.TechnicalCourseResponseDTO;
-import com.solaria.persistence.openapi.TechnicalCourseOpenApi;
-import com.solaria.persistence.service.TechnicalCourseService;
+import com.solaria.persistence.dto.request.professional.TechnicalCourseRequestDTO;
+import com.solaria.persistence.dto.response.professional.TechnicalCourseResponseDTO;
+import com.solaria.persistence.openapi.professional.TechnicalCourseOpenApi;
+import com.solaria.persistence.service.professional.TechnicalCourseService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/TechnicianAffiliationController.java b/src/main/java/com/solaria/persistence/controller/professional/TechnicianAffiliationController.java
similarity index 83%
rename from src/main/java/com/solaria/persistence/controller/TechnicianAffiliationController.java
rename to src/main/java/com/solaria/persistence/controller/professional/TechnicianAffiliationController.java
index dc91ce1..89d7e99 100644
--- a/src/main/java/com/solaria/persistence/controller/TechnicianAffiliationController.java
+++ b/src/main/java/com/solaria/persistence/controller/professional/TechnicianAffiliationController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.professional;
import java.net.URI;
import java.util.List;
@@ -13,18 +13,18 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.patch.UpdateActiveDTO;
-import com.solaria.persistence.dto.patch.UpdateTypeDTO;
-import com.solaria.persistence.dto.request.TechnicianAffiliationRequestDTO;
-import com.solaria.persistence.dto.response.TechnicianAffiliationResponseDTO;
-import com.solaria.persistence.openapi.TechnicianAffiliationOpenApi;
-import com.solaria.persistence.service.TechnicianAffiliationService;
+import com.solaria.persistence.dto.patch.professional.UpdateActiveDTO;
+import com.solaria.persistence.dto.patch.professional.UpdateTypeDTO;
+import com.solaria.persistence.dto.request.professional.TechnicianAffiliationRequestDTO;
+import com.solaria.persistence.dto.response.professional.TechnicianAffiliationResponseDTO;
+import com.solaria.persistence.openapi.professional.TechnicianAffiliationOpenApi;
+import com.solaria.persistence.service.professional.TechnicianAffiliationService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
/**
- * controller REST (borda pura) para {@link com.solaria.persistence.domain.entity.TechnicianAffiliation}
+ * controller REST (borda pura) para {@link com.solaria.persistence.domain.entity.professional.TechnicianAffiliation}
* (RN-14). Delega para {@link TechnicianAffiliationService}.
*/
@RestController
diff --git a/src/main/java/com/solaria/persistence/controller/TechnicianController.java b/src/main/java/com/solaria/persistence/controller/professional/TechnicianController.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/controller/TechnicianController.java
rename to src/main/java/com/solaria/persistence/controller/professional/TechnicianController.java
index 6738bda..6410268 100644
--- a/src/main/java/com/solaria/persistence/controller/TechnicianController.java
+++ b/src/main/java/com/solaria/persistence/controller/professional/TechnicianController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.professional;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.TechnicianRequestDTO;
-import com.solaria.persistence.dto.response.TechnicianResponseDTO;
-import com.solaria.persistence.openapi.TechnicianOpenApi;
-import com.solaria.persistence.service.TechnicianService;
+import com.solaria.persistence.dto.request.professional.TechnicianRequestDTO;
+import com.solaria.persistence.dto.response.professional.TechnicianResponseDTO;
+import com.solaria.persistence.openapi.professional.TechnicianOpenApi;
+import com.solaria.persistence.service.professional.TechnicianService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/ProposalController.java b/src/main/java/com/solaria/persistence/controller/proposal/ProposalController.java
similarity index 89%
rename from src/main/java/com/solaria/persistence/controller/ProposalController.java
rename to src/main/java/com/solaria/persistence/controller/proposal/ProposalController.java
index 63099c7..e2f90b9 100644
--- a/src/main/java/com/solaria/persistence/controller/ProposalController.java
+++ b/src/main/java/com/solaria/persistence/controller/proposal/ProposalController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.proposal;
import java.net.URI;
import java.util.List;
@@ -13,11 +13,11 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.patch.UpdateNotesDTO;
-import com.solaria.persistence.dto.request.ProposalRequestDTO;
-import com.solaria.persistence.dto.response.ProposalResponseDTO;
-import com.solaria.persistence.openapi.ProposalOpenApi;
-import com.solaria.persistence.service.ProposalService;
+import com.solaria.persistence.dto.patch.proposal.UpdateNotesDTO;
+import com.solaria.persistence.dto.request.proposal.ProposalRequestDTO;
+import com.solaria.persistence.dto.response.proposal.ProposalResponseDTO;
+import com.solaria.persistence.openapi.proposal.ProposalOpenApi;
+import com.solaria.persistence.service.proposal.ProposalService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/ProposalItemController.java b/src/main/java/com/solaria/persistence/controller/proposal/ProposalItemController.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/controller/ProposalItemController.java
rename to src/main/java/com/solaria/persistence/controller/proposal/ProposalItemController.java
index 9066711..7c77645 100644
--- a/src/main/java/com/solaria/persistence/controller/ProposalItemController.java
+++ b/src/main/java/com/solaria/persistence/controller/proposal/ProposalItemController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.proposal;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.ProposalItemRequestDTO;
-import com.solaria.persistence.dto.response.ProposalItemResponseDTO;
-import com.solaria.persistence.openapi.ProposalItemOpenApi;
-import com.solaria.persistence.service.ProposalItemService;
+import com.solaria.persistence.dto.request.proposal.ProposalItemRequestDTO;
+import com.solaria.persistence.dto.response.proposal.ProposalItemResponseDTO;
+import com.solaria.persistence.openapi.proposal.ProposalItemOpenApi;
+import com.solaria.persistence.service.proposal.ProposalItemService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/ProposalUnitController.java b/src/main/java/com/solaria/persistence/controller/proposal/ProposalUnitController.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/controller/ProposalUnitController.java
rename to src/main/java/com/solaria/persistence/controller/proposal/ProposalUnitController.java
index 69e94f8..c6f2a47 100644
--- a/src/main/java/com/solaria/persistence/controller/ProposalUnitController.java
+++ b/src/main/java/com/solaria/persistence/controller/proposal/ProposalUnitController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.proposal;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.ProposalUnitRequestDTO;
-import com.solaria.persistence.dto.response.ProposalUnitResponseDTO;
-import com.solaria.persistence.openapi.ProposalUnitOpenApi;
-import com.solaria.persistence.service.ProposalUnitService;
+import com.solaria.persistence.dto.request.proposal.ProposalUnitRequestDTO;
+import com.solaria.persistence.dto.response.proposal.ProposalUnitResponseDTO;
+import com.solaria.persistence.openapi.proposal.ProposalUnitOpenApi;
+import com.solaria.persistence.service.proposal.ProposalUnitService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/AddressController.java b/src/main/java/com/solaria/persistence/controller/shared/AddressController.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/controller/AddressController.java
rename to src/main/java/com/solaria/persistence/controller/shared/AddressController.java
index 41021d6..dea1e83 100644
--- a/src/main/java/com/solaria/persistence/controller/AddressController.java
+++ b/src/main/java/com/solaria/persistence/controller/shared/AddressController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.shared;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.AddressRequestDTO;
-import com.solaria.persistence.dto.response.AddressResponseDTO;
-import com.solaria.persistence.openapi.AddressOpenApi;
-import com.solaria.persistence.service.AddressService;
+import com.solaria.persistence.dto.request.shared.AddressRequestDTO;
+import com.solaria.persistence.dto.response.shared.AddressResponseDTO;
+import com.solaria.persistence.openapi.shared.AddressOpenApi;
+import com.solaria.persistence.service.shared.AddressService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/ContactController.java b/src/main/java/com/solaria/persistence/controller/shared/ContactController.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/controller/ContactController.java
rename to src/main/java/com/solaria/persistence/controller/shared/ContactController.java
index fc70a35..80e0f10 100644
--- a/src/main/java/com/solaria/persistence/controller/ContactController.java
+++ b/src/main/java/com/solaria/persistence/controller/shared/ContactController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.shared;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.ContactRequestDTO;
-import com.solaria.persistence.dto.response.ContactResponseDTO;
-import com.solaria.persistence.openapi.ContactOpenApi;
-import com.solaria.persistence.service.ContactService;
+import com.solaria.persistence.dto.request.shared.ContactRequestDTO;
+import com.solaria.persistence.dto.response.shared.ContactResponseDTO;
+import com.solaria.persistence.openapi.shared.ContactOpenApi;
+import com.solaria.persistence.service.shared.ContactService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/FluxLogController.java b/src/main/java/com/solaria/persistence/controller/shared/FluxLogController.java
similarity index 80%
rename from src/main/java/com/solaria/persistence/controller/FluxLogController.java
rename to src/main/java/com/solaria/persistence/controller/shared/FluxLogController.java
index 292536e..3e570ce 100644
--- a/src/main/java/com/solaria/persistence/controller/FluxLogController.java
+++ b/src/main/java/com/solaria/persistence/controller/shared/FluxLogController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.shared;
import java.net.URI;
import java.util.List;
@@ -12,10 +12,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.FluxLogRequestDTO;
-import com.solaria.persistence.dto.response.FluxLogResponseDTO;
-import com.solaria.persistence.openapi.FluxLogOpenApi;
-import com.solaria.persistence.service.FluxLogService;
+import com.solaria.persistence.dto.request.shared.FluxLogRequestDTO;
+import com.solaria.persistence.dto.response.shared.FluxLogResponseDTO;
+import com.solaria.persistence.openapi.shared.FluxLogOpenApi;
+import com.solaria.persistence.service.shared.FluxLogService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/GeolocalizationController.java b/src/main/java/com/solaria/persistence/controller/shared/GeolocalizationController.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/controller/GeolocalizationController.java
rename to src/main/java/com/solaria/persistence/controller/shared/GeolocalizationController.java
index d5a11ee..4bce2e0 100644
--- a/src/main/java/com/solaria/persistence/controller/GeolocalizationController.java
+++ b/src/main/java/com/solaria/persistence/controller/shared/GeolocalizationController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.shared;
import java.net.URI;
import java.util.List;
@@ -14,10 +14,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.GeolocalizationRequestDTO;
-import com.solaria.persistence.dto.response.GeolocalizationResponseDTO;
-import com.solaria.persistence.openapi.GeolocalizationOpenApi;
-import com.solaria.persistence.service.GeolocalizationService;
+import com.solaria.persistence.dto.request.shared.GeolocalizationRequestDTO;
+import com.solaria.persistence.dto.response.shared.GeolocalizationResponseDTO;
+import com.solaria.persistence.openapi.shared.GeolocalizationOpenApi;
+import com.solaria.persistence.service.shared.GeolocalizationService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/EnergyBillController.java b/src/main/java/com/solaria/persistence/controller/unit/EnergyBillController.java
similarity index 89%
rename from src/main/java/com/solaria/persistence/controller/EnergyBillController.java
rename to src/main/java/com/solaria/persistence/controller/unit/EnergyBillController.java
index 3415e7e..f7723ca 100644
--- a/src/main/java/com/solaria/persistence/controller/EnergyBillController.java
+++ b/src/main/java/com/solaria/persistence/controller/unit/EnergyBillController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.unit;
import java.net.URI;
import java.util.List;
@@ -17,10 +17,10 @@
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
-import com.solaria.persistence.dto.request.EnergyBillRequestDTO;
-import com.solaria.persistence.dto.response.EnergyBillResponseDTO;
-import com.solaria.persistence.openapi.EnergyBillOpenApi;
-import com.solaria.persistence.service.EnergyBillService;
+import com.solaria.persistence.dto.request.unit.EnergyBillRequestDTO;
+import com.solaria.persistence.dto.response.unit.EnergyBillResponseDTO;
+import com.solaria.persistence.openapi.unit.EnergyBillOpenApi;
+import com.solaria.persistence.service.unit.EnergyBillService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/LocalUnitController.java b/src/main/java/com/solaria/persistence/controller/unit/LocalUnitController.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/controller/LocalUnitController.java
rename to src/main/java/com/solaria/persistence/controller/unit/LocalUnitController.java
index 26ff459..b9abe1f 100644
--- a/src/main/java/com/solaria/persistence/controller/LocalUnitController.java
+++ b/src/main/java/com/solaria/persistence/controller/unit/LocalUnitController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.unit;
import java.net.URI;
import java.util.List;
@@ -15,11 +15,11 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.patch.UpdateLocalUnitAddressIdDTO;
-import com.solaria.persistence.dto.request.LocalUnitRequestDTO;
-import com.solaria.persistence.dto.response.LocalUnitResponseDTO;
-import com.solaria.persistence.openapi.LocalUnitOpenApi;
-import com.solaria.persistence.service.LocalUnitService;
+import com.solaria.persistence.dto.patch.unit.UpdateLocalUnitAddressIdDTO;
+import com.solaria.persistence.dto.request.unit.LocalUnitRequestDTO;
+import com.solaria.persistence.dto.response.unit.LocalUnitResponseDTO;
+import com.solaria.persistence.openapi.unit.LocalUnitOpenApi;
+import com.solaria.persistence.service.unit.LocalUnitService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/LocalUnitPhotoController.java b/src/main/java/com/solaria/persistence/controller/unit/LocalUnitPhotoController.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/controller/LocalUnitPhotoController.java
rename to src/main/java/com/solaria/persistence/controller/unit/LocalUnitPhotoController.java
index 89e85e8..e449218 100644
--- a/src/main/java/com/solaria/persistence/controller/LocalUnitPhotoController.java
+++ b/src/main/java/com/solaria/persistence/controller/unit/LocalUnitPhotoController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.unit;
import java.net.URI;
import java.util.List;
@@ -15,9 +15,9 @@
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
-import com.solaria.persistence.dto.response.LocalUnitPhotoResponseDTO;
-import com.solaria.persistence.openapi.LocalUnitPhotoOpenApi;
-import com.solaria.persistence.service.LocalUnitPhotoService;
+import com.solaria.persistence.dto.response.unit.LocalUnitPhotoResponseDTO;
+import com.solaria.persistence.openapi.unit.LocalUnitPhotoOpenApi;
+import com.solaria.persistence.service.unit.LocalUnitPhotoService;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/controller/UnitSpecificationsController.java b/src/main/java/com/solaria/persistence/controller/unit/UnitSpecificationsController.java
similarity index 82%
rename from src/main/java/com/solaria/persistence/controller/UnitSpecificationsController.java
rename to src/main/java/com/solaria/persistence/controller/unit/UnitSpecificationsController.java
index 19db40e..f47d85f 100644
--- a/src/main/java/com/solaria/persistence/controller/UnitSpecificationsController.java
+++ b/src/main/java/com/solaria/persistence/controller/unit/UnitSpecificationsController.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.controller;
+package com.solaria.persistence.controller.unit;
import java.net.URI;
import java.util.List;
@@ -12,10 +12,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.solaria.persistence.dto.request.UnitSpecificationsRequestDTO;
-import com.solaria.persistence.dto.response.UnitSpecificationsResponseDTO;
-import com.solaria.persistence.openapi.UnitSpecificationsOpenApi;
-import com.solaria.persistence.service.UnitSpecificationsService;
+import com.solaria.persistence.dto.request.unit.UnitSpecificationsRequestDTO;
+import com.solaria.persistence.dto.response.unit.UnitSpecificationsResponseDTO;
+import com.solaria.persistence.openapi.unit.UnitSpecificationsOpenApi;
+import com.solaria.persistence.service.unit.UnitSpecificationsService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Inventory.java b/src/main/java/com/solaria/persistence/domain/entity/catalog/Inventory.java
similarity index 94%
rename from src/main/java/com/solaria/persistence/domain/entity/Inventory.java
rename to src/main/java/com/solaria/persistence/domain/entity/catalog/Inventory.java
index 30361f6..67bf6b9 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Inventory.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/catalog/Inventory.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.catalog;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Model.java b/src/main/java/com/solaria/persistence/domain/entity/catalog/Model.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/domain/entity/Model.java
rename to src/main/java/com/solaria/persistence/domain/entity/catalog/Model.java
index 020a6fc..eb3231d 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Model.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/catalog/Model.java
@@ -1,7 +1,7 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.catalog;
-import com.solaria.persistence.domain.enums.ModelStatus;
-import com.solaria.persistence.domain.enums.PanelType;
+import com.solaria.persistence.domain.enums.catalog.ModelStatus;
+import com.solaria.persistence.domain.enums.catalog.PanelType;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/ModelPhoto.java b/src/main/java/com/solaria/persistence/domain/entity/catalog/ModelPhoto.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/domain/entity/ModelPhoto.java
rename to src/main/java/com/solaria/persistence/domain/entity/catalog/ModelPhoto.java
index d65ae07..91f7179 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/ModelPhoto.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/catalog/ModelPhoto.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.catalog;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Offer.java b/src/main/java/com/solaria/persistence/domain/entity/catalog/Offer.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/domain/entity/Offer.java
rename to src/main/java/com/solaria/persistence/domain/entity/catalog/Offer.java
index ca8fcdf..f6c1cb3 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Offer.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/catalog/Offer.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.catalog;
-import com.solaria.persistence.domain.enums.TranslationStatus;
+import com.solaria.persistence.domain.enums.catalog.TranslationStatus;
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.ColumnDefault;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/OfferTranslation.java b/src/main/java/com/solaria/persistence/domain/entity/catalog/OfferTranslation.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/domain/entity/OfferTranslation.java
rename to src/main/java/com/solaria/persistence/domain/entity/catalog/OfferTranslation.java
index 0ddcf2e..e42dfb5 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/OfferTranslation.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/catalog/OfferTranslation.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.catalog;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Supplier.java b/src/main/java/com/solaria/persistence/domain/entity/catalog/Supplier.java
similarity index 76%
rename from src/main/java/com/solaria/persistence/domain/entity/Supplier.java
rename to src/main/java/com/solaria/persistence/domain/entity/catalog/Supplier.java
index 734d1f3..608c215 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Supplier.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/catalog/Supplier.java
@@ -1,10 +1,11 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.catalog;
-import com.solaria.persistence.domain.enums.SupplierStatus;
+import com.solaria.persistence.domain.enums.catalog.SupplierStatus;
import jakarta.persistence.*;
import lombok.*;
import java.util.UUID;
+import com.solaria.persistence.domain.entity.company.Company;
@Entity
diff --git a/src/main/java/com/solaria/persistence/domain/entity/BusinessContact.java b/src/main/java/com/solaria/persistence/domain/entity/company/BusinessContact.java
similarity index 90%
rename from src/main/java/com/solaria/persistence/domain/entity/BusinessContact.java
rename to src/main/java/com/solaria/persistence/domain/entity/company/BusinessContact.java
index 8ff1bf4..9b30397 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/BusinessContact.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/company/BusinessContact.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.company;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Charge.java b/src/main/java/com/solaria/persistence/domain/entity/company/Charge.java
similarity index 84%
rename from src/main/java/com/solaria/persistence/domain/entity/Charge.java
rename to src/main/java/com/solaria/persistence/domain/entity/company/Charge.java
index dd23474..01e594b 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Charge.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/company/Charge.java
@@ -1,7 +1,7 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.company;
-import com.solaria.persistence.domain.enums.BillingStatus;
-import com.solaria.persistence.domain.enums.PaymentMethod;
+import com.solaria.persistence.domain.enums.company.BillingStatus;
+import com.solaria.persistence.domain.enums.company.PaymentMethod;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Company.java b/src/main/java/com/solaria/persistence/domain/entity/company/Company.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/domain/entity/Company.java
rename to src/main/java/com/solaria/persistence/domain/entity/company/Company.java
index f7477d7..f717c8b 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Company.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/company/Company.java
@@ -1,11 +1,12 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.company;
-import com.solaria.persistence.domain.enums.CompanyStatus;
+import com.solaria.persistence.domain.enums.company.CompanyStatus;
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.ColumnDefault;
import java.util.UUID;
+import com.solaria.persistence.domain.entity.shared.Address;
@Entity
@Table(name = "company")
diff --git a/src/main/java/com/solaria/persistence/domain/entity/CompanyPhoto.java b/src/main/java/com/solaria/persistence/domain/entity/company/CompanyPhoto.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/domain/entity/CompanyPhoto.java
rename to src/main/java/com/solaria/persistence/domain/entity/company/CompanyPhoto.java
index 25e4a56..0bbd4e8 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/CompanyPhoto.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/company/CompanyPhoto.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.company;
-import com.solaria.persistence.domain.enums.PhotoType;
+import com.solaria.persistence.domain.enums.shared.PhotoType;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/CompanyPlans.java b/src/main/java/com/solaria/persistence/domain/entity/company/CompanyPlans.java
similarity index 82%
rename from src/main/java/com/solaria/persistence/domain/entity/CompanyPlans.java
rename to src/main/java/com/solaria/persistence/domain/entity/company/CompanyPlans.java
index 1992bfe..270e51b 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/CompanyPlans.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/company/CompanyPlans.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.company;
-import com.solaria.persistence.domain.enums.PlanCycle;
+import com.solaria.persistence.domain.enums.company.PlanCycle;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/CompanyPositions.java b/src/main/java/com/solaria/persistence/domain/entity/company/CompanyPositions.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/domain/entity/CompanyPositions.java
rename to src/main/java/com/solaria/persistence/domain/entity/company/CompanyPositions.java
index 06ab1ee..bc0f4b1 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/CompanyPositions.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/company/CompanyPositions.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.company;
import java.util.UUID;
@@ -14,6 +14,7 @@
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
+import com.solaria.persistence.domain.entity.identity.Position;
@Entity
@Table(name = "company_positions")
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Subscription.java b/src/main/java/com/solaria/persistence/domain/entity/company/Subscription.java
similarity index 83%
rename from src/main/java/com/solaria/persistence/domain/entity/Subscription.java
rename to src/main/java/com/solaria/persistence/domain/entity/company/Subscription.java
index b5bca67..752ee4b 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Subscription.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/company/Subscription.java
@@ -1,11 +1,12 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.company;
-import com.solaria.persistence.domain.enums.SubscriptionStatus;
+import com.solaria.persistence.domain.enums.company.SubscriptionStatus;
import jakarta.persistence.*;
import lombok.*;
import java.time.OffsetDateTime;
import java.util.UUID;
+import com.solaria.persistence.domain.entity.catalog.Supplier;
@Entity
@Table(name = "subscription")
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Requester.java b/src/main/java/com/solaria/persistence/domain/entity/execution/Requester.java
similarity index 80%
rename from src/main/java/com/solaria/persistence/domain/entity/Requester.java
rename to src/main/java/com/solaria/persistence/domain/entity/execution/Requester.java
index 41ae771..1c8a182 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Requester.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/execution/Requester.java
@@ -1,9 +1,10 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.execution;
import jakarta.persistence.*;
import lombok.*;
import java.util.UUID;
+import com.solaria.persistence.domain.entity.company.Company;
@Entity
diff --git a/src/main/java/com/solaria/persistence/domain/entity/ServiceContract.java b/src/main/java/com/solaria/persistence/domain/entity/execution/ServiceContract.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/domain/entity/ServiceContract.java
rename to src/main/java/com/solaria/persistence/domain/entity/execution/ServiceContract.java
index 82cbd28..0c056d1 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/ServiceContract.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/execution/ServiceContract.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.execution;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/ServiceExecutor.java b/src/main/java/com/solaria/persistence/domain/entity/execution/ServiceExecutor.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/domain/entity/ServiceExecutor.java
rename to src/main/java/com/solaria/persistence/domain/entity/execution/ServiceExecutor.java
index 1a1e0e3..a452fec 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/ServiceExecutor.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/execution/ServiceExecutor.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.execution;
import java.util.UUID;
@@ -15,6 +15,7 @@
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
+import com.solaria.persistence.domain.entity.professional.TechnicianAffiliation;
@Entity
@Table(name = "service_executor")
diff --git a/src/main/java/com/solaria/persistence/domain/entity/TechnicalProject.java b/src/main/java/com/solaria/persistence/domain/entity/execution/TechnicalProject.java
similarity index 81%
rename from src/main/java/com/solaria/persistence/domain/entity/TechnicalProject.java
rename to src/main/java/com/solaria/persistence/domain/entity/execution/TechnicalProject.java
index c433900..24dd291 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/TechnicalProject.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/execution/TechnicalProject.java
@@ -1,12 +1,13 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.execution;
-import com.solaria.persistence.domain.enums.ServiceStatus;
+import com.solaria.persistence.domain.enums.execution.ServiceStatus;
import jakarta.persistence.*;
import lombok.*;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.util.UUID;
+import com.solaria.persistence.domain.entity.unit.LocalUnit;
@Entity
diff --git a/src/main/java/com/solaria/persistence/domain/entity/TechnicalService.java b/src/main/java/com/solaria/persistence/domain/entity/execution/TechnicalService.java
similarity index 89%
rename from src/main/java/com/solaria/persistence/domain/entity/TechnicalService.java
rename to src/main/java/com/solaria/persistence/domain/entity/execution/TechnicalService.java
index 056dc6d..42d791a 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/TechnicalService.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/execution/TechnicalService.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.execution;
-import com.solaria.persistence.domain.enums.ServiceStatus;
+import com.solaria.persistence.domain.enums.execution.ServiceStatus;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Permission.java b/src/main/java/com/solaria/persistence/domain/entity/identity/Permission.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/domain/entity/Permission.java
rename to src/main/java/com/solaria/persistence/domain/entity/identity/Permission.java
index 5a753d5..6d78045 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Permission.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/identity/Permission.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.identity;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Person.java b/src/main/java/com/solaria/persistence/domain/entity/identity/Person.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/domain/entity/Person.java
rename to src/main/java/com/solaria/persistence/domain/entity/identity/Person.java
index 08782d1..8c96c7f 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Person.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/identity/Person.java
@@ -1,10 +1,11 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.identity;
import jakarta.persistence.*;
import lombok.*;
import java.time.LocalDate;
import java.util.UUID;
+import com.solaria.persistence.domain.entity.shared.Contact;
@Entity
@Table(name = "person")
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Position.java b/src/main/java/com/solaria/persistence/domain/entity/identity/Position.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/domain/entity/Position.java
rename to src/main/java/com/solaria/persistence/domain/entity/identity/Position.java
index 2c27de6..5f5dc69 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Position.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/identity/Position.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.identity;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/PositionPermission.java b/src/main/java/com/solaria/persistence/domain/entity/identity/PositionPermission.java
similarity index 94%
rename from src/main/java/com/solaria/persistence/domain/entity/PositionPermission.java
rename to src/main/java/com/solaria/persistence/domain/entity/identity/PositionPermission.java
index 46d961f..2e66400 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/PositionPermission.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/identity/PositionPermission.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.identity;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/User.java b/src/main/java/com/solaria/persistence/domain/entity/identity/User.java
similarity index 89%
rename from src/main/java/com/solaria/persistence/domain/entity/User.java
rename to src/main/java/com/solaria/persistence/domain/entity/identity/User.java
index 3d716b5..79d2d0c 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/User.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/identity/User.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.identity;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/UserCompany.java b/src/main/java/com/solaria/persistence/domain/entity/identity/UserCompany.java
similarity index 89%
rename from src/main/java/com/solaria/persistence/domain/entity/UserCompany.java
rename to src/main/java/com/solaria/persistence/domain/entity/identity/UserCompany.java
index 510362e..1d3beb7 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/UserCompany.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/identity/UserCompany.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.identity;
import java.util.UUID;
@@ -14,6 +14,7 @@
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
+import com.solaria.persistence.domain.entity.company.Company;
@Entity
@Table(name = "user_company")
diff --git a/src/main/java/com/solaria/persistence/domain/entity/UserPhoto.java b/src/main/java/com/solaria/persistence/domain/entity/identity/UserPhoto.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/domain/entity/UserPhoto.java
rename to src/main/java/com/solaria/persistence/domain/entity/identity/UserPhoto.java
index 4e775e5..31e2e3b 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/UserPhoto.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/identity/UserPhoto.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.identity;
-import com.solaria.persistence.domain.enums.PhotoType;
+import com.solaria.persistence.domain.enums.shared.PhotoType;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Certification.java b/src/main/java/com/solaria/persistence/domain/entity/professional/Certification.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/domain/entity/Certification.java
rename to src/main/java/com/solaria/persistence/domain/entity/professional/Certification.java
index e5e0c44..5a2a9a6 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Certification.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/professional/Certification.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.professional;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/CertificationRecord.java b/src/main/java/com/solaria/persistence/domain/entity/professional/CertificationRecord.java
similarity index 90%
rename from src/main/java/com/solaria/persistence/domain/entity/CertificationRecord.java
rename to src/main/java/com/solaria/persistence/domain/entity/professional/CertificationRecord.java
index 28c2c7f..4894a32 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/CertificationRecord.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/professional/CertificationRecord.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.professional;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Profession.java b/src/main/java/com/solaria/persistence/domain/entity/professional/Profession.java
similarity index 89%
rename from src/main/java/com/solaria/persistence/domain/entity/Profession.java
rename to src/main/java/com/solaria/persistence/domain/entity/professional/Profession.java
index b144554..68bc4b0 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Profession.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/professional/Profession.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.professional;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/ProfessionalRegistration.java b/src/main/java/com/solaria/persistence/domain/entity/professional/ProfessionalRegistration.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/domain/entity/ProfessionalRegistration.java
rename to src/main/java/com/solaria/persistence/domain/entity/professional/ProfessionalRegistration.java
index ca19c50..dc81d09 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/ProfessionalRegistration.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/professional/ProfessionalRegistration.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.professional;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/ProfessionalReview.java b/src/main/java/com/solaria/persistence/domain/entity/professional/ProfessionalReview.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/domain/entity/ProfessionalReview.java
rename to src/main/java/com/solaria/persistence/domain/entity/professional/ProfessionalReview.java
index 192d23e..f4d1b67 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/ProfessionalReview.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/professional/ProfessionalReview.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.professional;
import jakarta.persistence.*;
import lombok.*;
@@ -6,6 +6,8 @@
import java.math.BigDecimal;
import java.time.OffsetDateTime;
import java.util.UUID;
+import com.solaria.persistence.domain.entity.identity.User;
+import com.solaria.persistence.domain.entity.execution.TechnicalService;
@Entity
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Shift.java b/src/main/java/com/solaria/persistence/domain/entity/professional/Shift.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/domain/entity/Shift.java
rename to src/main/java/com/solaria/persistence/domain/entity/professional/Shift.java
index 9f932e3..62bb876 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Shift.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/professional/Shift.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.professional;
-import com.solaria.persistence.domain.enums.DayWeek;
+import com.solaria.persistence.domain.enums.professional.DayWeek;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/TechnicalCourse.java b/src/main/java/com/solaria/persistence/domain/entity/professional/TechnicalCourse.java
similarity index 83%
rename from src/main/java/com/solaria/persistence/domain/entity/TechnicalCourse.java
rename to src/main/java/com/solaria/persistence/domain/entity/professional/TechnicalCourse.java
index 79b87ef..3fb19fa 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/TechnicalCourse.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/professional/TechnicalCourse.java
@@ -1,9 +1,10 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.professional;
import jakarta.persistence.*;
import lombok.*;
import java.util.UUID;
+import com.solaria.persistence.domain.entity.company.Company;
@Entity
@Table(name = "technical_course")
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Technician.java b/src/main/java/com/solaria/persistence/domain/entity/professional/Technician.java
similarity index 82%
rename from src/main/java/com/solaria/persistence/domain/entity/Technician.java
rename to src/main/java/com/solaria/persistence/domain/entity/professional/Technician.java
index 954c837..149114d 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Technician.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/professional/Technician.java
@@ -1,9 +1,10 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.professional;
import jakarta.persistence.*;
import lombok.*;
import java.util.UUID;
+import com.solaria.persistence.domain.entity.identity.Person;
@Entity
@Table(name = "technician")
diff --git a/src/main/java/com/solaria/persistence/domain/entity/TechnicianAffiliation.java b/src/main/java/com/solaria/persistence/domain/entity/professional/TechnicianAffiliation.java
similarity index 78%
rename from src/main/java/com/solaria/persistence/domain/entity/TechnicianAffiliation.java
rename to src/main/java/com/solaria/persistence/domain/entity/professional/TechnicianAffiliation.java
index d715b9e..f8f60dd 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/TechnicianAffiliation.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/professional/TechnicianAffiliation.java
@@ -1,10 +1,11 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.professional;
-import com.solaria.persistence.domain.enums.TechnicalAffiliationType;
+import com.solaria.persistence.domain.enums.professional.TechnicalAffiliationType;
import jakarta.persistence.*;
import lombok.*;
import java.util.UUID;
+import com.solaria.persistence.domain.entity.company.Company;
@Entity
@Table(name = "technician_affiliation")
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Proposal.java b/src/main/java/com/solaria/persistence/domain/entity/proposal/Proposal.java
similarity index 82%
rename from src/main/java/com/solaria/persistence/domain/entity/Proposal.java
rename to src/main/java/com/solaria/persistence/domain/entity/proposal/Proposal.java
index 2c4b587..c167391 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Proposal.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/proposal/Proposal.java
@@ -1,12 +1,13 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.proposal;
-import com.solaria.persistence.domain.enums.ProposalStatus;
+import com.solaria.persistence.domain.enums.proposal.ProposalStatus;
import jakarta.persistence.*;
import lombok.*;
import java.math.BigDecimal;
import java.time.OffsetDateTime;
import java.util.UUID;
+import com.solaria.persistence.domain.entity.execution.Requester;
@Entity
diff --git a/src/main/java/com/solaria/persistence/domain/entity/ProposalItem.java b/src/main/java/com/solaria/persistence/domain/entity/proposal/ProposalItem.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/domain/entity/ProposalItem.java
rename to src/main/java/com/solaria/persistence/domain/entity/proposal/ProposalItem.java
index ea992cf..fcea831 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/ProposalItem.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/proposal/ProposalItem.java
@@ -1,10 +1,11 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.proposal;
import jakarta.persistence.*;
import lombok.*;
import java.math.BigDecimal;
import java.util.UUID;
+import com.solaria.persistence.domain.entity.catalog.Offer;
@Entity
@Table(name = "proposal_item")
diff --git a/src/main/java/com/solaria/persistence/domain/entity/ProposalUnit.java b/src/main/java/com/solaria/persistence/domain/entity/proposal/ProposalUnit.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/domain/entity/ProposalUnit.java
rename to src/main/java/com/solaria/persistence/domain/entity/proposal/ProposalUnit.java
index ec6c33b..3d7e8d8 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/ProposalUnit.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/proposal/ProposalUnit.java
@@ -1,9 +1,10 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.proposal;
import jakarta.persistence.*;
import lombok.*;
import java.util.UUID;
+import com.solaria.persistence.domain.entity.unit.LocalUnit;
@Entity
@Table(name = "proposal_unit")
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Address.java b/src/main/java/com/solaria/persistence/domain/entity/shared/Address.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/domain/entity/Address.java
rename to src/main/java/com/solaria/persistence/domain/entity/shared/Address.java
index 6f99176..b273e62 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Address.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/shared/Address.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.shared;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Contact.java b/src/main/java/com/solaria/persistence/domain/entity/shared/Contact.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/domain/entity/Contact.java
rename to src/main/java/com/solaria/persistence/domain/entity/shared/Contact.java
index 7376f03..47b7424 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Contact.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/shared/Contact.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.shared;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/FluxLog.java b/src/main/java/com/solaria/persistence/domain/entity/shared/FluxLog.java
similarity index 83%
rename from src/main/java/com/solaria/persistence/domain/entity/FluxLog.java
rename to src/main/java/com/solaria/persistence/domain/entity/shared/FluxLog.java
index d7e7f51..7a77edc 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/FluxLog.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/shared/FluxLog.java
@@ -1,10 +1,11 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.shared;
import jakarta.persistence.*;
import lombok.*;
import java.time.OffsetDateTime;
import java.util.UUID;
+import com.solaria.persistence.domain.entity.identity.User;
@Entity
@Table(name = "flux_log")
diff --git a/src/main/java/com/solaria/persistence/domain/entity/Geolocalization.java b/src/main/java/com/solaria/persistence/domain/entity/shared/Geolocalization.java
similarity index 95%
rename from src/main/java/com/solaria/persistence/domain/entity/Geolocalization.java
rename to src/main/java/com/solaria/persistence/domain/entity/shared/Geolocalization.java
index ded9a0b..18cfdb9 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/Geolocalization.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/shared/Geolocalization.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.shared;
import java.math.BigDecimal;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/EnergyBill.java b/src/main/java/com/solaria/persistence/domain/entity/unit/EnergyBill.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/domain/entity/EnergyBill.java
rename to src/main/java/com/solaria/persistence/domain/entity/unit/EnergyBill.java
index 7a135eb..9592438 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/EnergyBill.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/unit/EnergyBill.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.unit;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/LocalUnit.java b/src/main/java/com/solaria/persistence/domain/entity/unit/LocalUnit.java
similarity index 74%
rename from src/main/java/com/solaria/persistence/domain/entity/LocalUnit.java
rename to src/main/java/com/solaria/persistence/domain/entity/unit/LocalUnit.java
index 05ff1d3..acbfb49 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/LocalUnit.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/unit/LocalUnit.java
@@ -1,10 +1,12 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.unit;
-import com.solaria.persistence.domain.enums.LocationType;
+import com.solaria.persistence.domain.enums.unit.LocationType;
import jakarta.persistence.*;
import lombok.*;
import java.util.UUID;
+import com.solaria.persistence.domain.entity.execution.Requester;
+import com.solaria.persistence.domain.entity.shared.Address;
@Entity
@Table(name = "local_unit")
diff --git a/src/main/java/com/solaria/persistence/domain/entity/LocalUnitPhoto.java b/src/main/java/com/solaria/persistence/domain/entity/unit/LocalUnitPhoto.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/domain/entity/LocalUnitPhoto.java
rename to src/main/java/com/solaria/persistence/domain/entity/unit/LocalUnitPhoto.java
index 6c5f446..31a0114 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/LocalUnitPhoto.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/unit/LocalUnitPhoto.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.unit;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/entity/UnitSpecifications.java b/src/main/java/com/solaria/persistence/domain/entity/unit/UnitSpecifications.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/domain/entity/UnitSpecifications.java
rename to src/main/java/com/solaria/persistence/domain/entity/unit/UnitSpecifications.java
index 4a66107..d17de4f 100644
--- a/src/main/java/com/solaria/persistence/domain/entity/UnitSpecifications.java
+++ b/src/main/java/com/solaria/persistence/domain/entity/unit/UnitSpecifications.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.entity;
+package com.solaria.persistence.domain.entity.unit;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/solaria/persistence/domain/enums/PhotoType.java b/src/main/java/com/solaria/persistence/domain/enums/PhotoType.java
deleted file mode 100644
index 3452b92..0000000
--- a/src/main/java/com/solaria/persistence/domain/enums/PhotoType.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.solaria.persistence.domain.enums;
-
-public enum PhotoType {
- PROFILE,
- BANNER
-}
diff --git a/src/main/java/com/solaria/persistence/domain/enums/ModelStatus.java b/src/main/java/com/solaria/persistence/domain/enums/catalog/ModelStatus.java
similarity index 58%
rename from src/main/java/com/solaria/persistence/domain/enums/ModelStatus.java
rename to src/main/java/com/solaria/persistence/domain/enums/catalog/ModelStatus.java
index 383855c..29c03b4 100644
--- a/src/main/java/com/solaria/persistence/domain/enums/ModelStatus.java
+++ b/src/main/java/com/solaria/persistence/domain/enums/catalog/ModelStatus.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.enums;
+package com.solaria.persistence.domain.enums.catalog;
public enum ModelStatus {
APPROVED,
diff --git a/src/main/java/com/solaria/persistence/domain/enums/PanelType.java b/src/main/java/com/solaria/persistence/domain/enums/catalog/PanelType.java
similarity index 60%
rename from src/main/java/com/solaria/persistence/domain/enums/PanelType.java
rename to src/main/java/com/solaria/persistence/domain/enums/catalog/PanelType.java
index 1c456f7..4de954c 100644
--- a/src/main/java/com/solaria/persistence/domain/enums/PanelType.java
+++ b/src/main/java/com/solaria/persistence/domain/enums/catalog/PanelType.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.enums;
+package com.solaria.persistence.domain.enums.catalog;
public enum PanelType {
MONOCRYSTALLINE,
diff --git a/src/main/java/com/solaria/persistence/domain/enums/SupplierStatus.java b/src/main/java/com/solaria/persistence/domain/enums/catalog/SupplierStatus.java
similarity index 58%
rename from src/main/java/com/solaria/persistence/domain/enums/SupplierStatus.java
rename to src/main/java/com/solaria/persistence/domain/enums/catalog/SupplierStatus.java
index 4fdc9d9..f5cef20 100644
--- a/src/main/java/com/solaria/persistence/domain/enums/SupplierStatus.java
+++ b/src/main/java/com/solaria/persistence/domain/enums/catalog/SupplierStatus.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.enums;
+package com.solaria.persistence.domain.enums.catalog;
public enum SupplierStatus {
ACTIVE,
diff --git a/src/main/java/com/solaria/persistence/domain/enums/TranslationStatus.java b/src/main/java/com/solaria/persistence/domain/enums/catalog/TranslationStatus.java
similarity index 57%
rename from src/main/java/com/solaria/persistence/domain/enums/TranslationStatus.java
rename to src/main/java/com/solaria/persistence/domain/enums/catalog/TranslationStatus.java
index 260d940..6f0ce68 100644
--- a/src/main/java/com/solaria/persistence/domain/enums/TranslationStatus.java
+++ b/src/main/java/com/solaria/persistence/domain/enums/catalog/TranslationStatus.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.enums;
+package com.solaria.persistence.domain.enums.catalog;
public enum TranslationStatus {
PENDING,
diff --git a/src/main/java/com/solaria/persistence/domain/enums/BillingStatus.java b/src/main/java/com/solaria/persistence/domain/enums/company/BillingStatus.java
similarity index 60%
rename from src/main/java/com/solaria/persistence/domain/enums/BillingStatus.java
rename to src/main/java/com/solaria/persistence/domain/enums/company/BillingStatus.java
index 99fd8d4..faea138 100644
--- a/src/main/java/com/solaria/persistence/domain/enums/BillingStatus.java
+++ b/src/main/java/com/solaria/persistence/domain/enums/company/BillingStatus.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.enums;
+package com.solaria.persistence.domain.enums.company;
public enum BillingStatus {
PENDING,
diff --git a/src/main/java/com/solaria/persistence/domain/enums/CompanyStatus.java b/src/main/java/com/solaria/persistence/domain/enums/company/CompanyStatus.java
similarity index 59%
rename from src/main/java/com/solaria/persistence/domain/enums/CompanyStatus.java
rename to src/main/java/com/solaria/persistence/domain/enums/company/CompanyStatus.java
index 4d0a85f..c7e2a48 100644
--- a/src/main/java/com/solaria/persistence/domain/enums/CompanyStatus.java
+++ b/src/main/java/com/solaria/persistence/domain/enums/company/CompanyStatus.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.enums;
+package com.solaria.persistence.domain.enums.company;
public enum CompanyStatus {
diff --git a/src/main/java/com/solaria/persistence/domain/enums/PaymentMethod.java b/src/main/java/com/solaria/persistence/domain/enums/company/PaymentMethod.java
similarity index 60%
rename from src/main/java/com/solaria/persistence/domain/enums/PaymentMethod.java
rename to src/main/java/com/solaria/persistence/domain/enums/company/PaymentMethod.java
index 8155968..35c7d3d 100644
--- a/src/main/java/com/solaria/persistence/domain/enums/PaymentMethod.java
+++ b/src/main/java/com/solaria/persistence/domain/enums/company/PaymentMethod.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.enums;
+package com.solaria.persistence.domain.enums.company;
public enum PaymentMethod {
PIX,
diff --git a/src/main/java/com/solaria/persistence/domain/enums/PlanCycle.java b/src/main/java/com/solaria/persistence/domain/enums/company/PlanCycle.java
similarity index 55%
rename from src/main/java/com/solaria/persistence/domain/enums/PlanCycle.java
rename to src/main/java/com/solaria/persistence/domain/enums/company/PlanCycle.java
index d2ca7db..81add9b 100644
--- a/src/main/java/com/solaria/persistence/domain/enums/PlanCycle.java
+++ b/src/main/java/com/solaria/persistence/domain/enums/company/PlanCycle.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.enums;
+package com.solaria.persistence.domain.enums.company;
public enum PlanCycle {
MONTHLY,
diff --git a/src/main/java/com/solaria/persistence/domain/enums/SubscriptionStatus.java b/src/main/java/com/solaria/persistence/domain/enums/company/SubscriptionStatus.java
similarity index 57%
rename from src/main/java/com/solaria/persistence/domain/enums/SubscriptionStatus.java
rename to src/main/java/com/solaria/persistence/domain/enums/company/SubscriptionStatus.java
index 868833a..d0d9273 100644
--- a/src/main/java/com/solaria/persistence/domain/enums/SubscriptionStatus.java
+++ b/src/main/java/com/solaria/persistence/domain/enums/company/SubscriptionStatus.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.enums;
+package com.solaria.persistence.domain.enums.company;
public enum SubscriptionStatus {
PAID,
diff --git a/src/main/java/com/solaria/persistence/domain/enums/ServiceStatus.java b/src/main/java/com/solaria/persistence/domain/enums/execution/ServiceStatus.java
similarity index 60%
rename from src/main/java/com/solaria/persistence/domain/enums/ServiceStatus.java
rename to src/main/java/com/solaria/persistence/domain/enums/execution/ServiceStatus.java
index 081425c..4a6ec2f 100644
--- a/src/main/java/com/solaria/persistence/domain/enums/ServiceStatus.java
+++ b/src/main/java/com/solaria/persistence/domain/enums/execution/ServiceStatus.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.enums;
+package com.solaria.persistence.domain.enums.execution;
public enum ServiceStatus {
OPEN,
diff --git a/src/main/java/com/solaria/persistence/domain/enums/DayWeek.java b/src/main/java/com/solaria/persistence/domain/enums/professional/DayWeek.java
similarity index 66%
rename from src/main/java/com/solaria/persistence/domain/enums/DayWeek.java
rename to src/main/java/com/solaria/persistence/domain/enums/professional/DayWeek.java
index cc8122b..2bc1fd0 100644
--- a/src/main/java/com/solaria/persistence/domain/enums/DayWeek.java
+++ b/src/main/java/com/solaria/persistence/domain/enums/professional/DayWeek.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.enums;
+package com.solaria.persistence.domain.enums.professional;
public enum DayWeek {
MONDAY,
diff --git a/src/main/java/com/solaria/persistence/domain/enums/TechnicalAffiliationType.java b/src/main/java/com/solaria/persistence/domain/enums/professional/TechnicalAffiliationType.java
similarity index 59%
rename from src/main/java/com/solaria/persistence/domain/enums/TechnicalAffiliationType.java
rename to src/main/java/com/solaria/persistence/domain/enums/professional/TechnicalAffiliationType.java
index 050e1ea..000dbc4 100644
--- a/src/main/java/com/solaria/persistence/domain/enums/TechnicalAffiliationType.java
+++ b/src/main/java/com/solaria/persistence/domain/enums/professional/TechnicalAffiliationType.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.enums;
+package com.solaria.persistence.domain.enums.professional;
public enum TechnicalAffiliationType {
INDEPENDENT,
diff --git a/src/main/java/com/solaria/persistence/domain/enums/ProposalStatus.java b/src/main/java/com/solaria/persistence/domain/enums/proposal/ProposalStatus.java
similarity index 68%
rename from src/main/java/com/solaria/persistence/domain/enums/ProposalStatus.java
rename to src/main/java/com/solaria/persistence/domain/enums/proposal/ProposalStatus.java
index 9519dcd..71e1650 100644
--- a/src/main/java/com/solaria/persistence/domain/enums/ProposalStatus.java
+++ b/src/main/java/com/solaria/persistence/domain/enums/proposal/ProposalStatus.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.enums;
+package com.solaria.persistence.domain.enums.proposal;
public enum ProposalStatus {
AWAITING_SUPPLIER,
diff --git a/src/main/java/com/solaria/persistence/domain/enums/shared/PhotoType.java b/src/main/java/com/solaria/persistence/domain/enums/shared/PhotoType.java
new file mode 100644
index 0000000..08199bf
--- /dev/null
+++ b/src/main/java/com/solaria/persistence/domain/enums/shared/PhotoType.java
@@ -0,0 +1,6 @@
+package com.solaria.persistence.domain.enums.shared;
+
+public enum PhotoType {
+ PROFILE,
+ BANNER
+}
diff --git a/src/main/java/com/solaria/persistence/domain/enums/LocationType.java b/src/main/java/com/solaria/persistence/domain/enums/unit/LocationType.java
similarity index 56%
rename from src/main/java/com/solaria/persistence/domain/enums/LocationType.java
rename to src/main/java/com/solaria/persistence/domain/enums/unit/LocationType.java
index ad3ba60..ad1ccd4 100644
--- a/src/main/java/com/solaria/persistence/domain/enums/LocationType.java
+++ b/src/main/java/com/solaria/persistence/domain/enums/unit/LocationType.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.domain.enums;
+package com.solaria.persistence.domain.enums.unit;
public enum LocationType {
BUILDING,
diff --git a/src/main/java/com/solaria/persistence/dto/patch/UpdateQuantityDTO.java b/src/main/java/com/solaria/persistence/dto/patch/catalog/UpdateQuantityDTO.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/dto/patch/UpdateQuantityDTO.java
rename to src/main/java/com/solaria/persistence/dto/patch/catalog/UpdateQuantityDTO.java
index f376950..839d0c6 100644
--- a/src/main/java/com/solaria/persistence/dto/patch/UpdateQuantityDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/patch/catalog/UpdateQuantityDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.patch;
+package com.solaria.persistence.dto.patch.catalog;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.PositiveOrZero;
diff --git a/src/main/java/com/solaria/persistence/dto/patch/UpdateBusinessContactIdDTO.java b/src/main/java/com/solaria/persistence/dto/patch/company/UpdateBusinessContactIdDTO.java
similarity index 84%
rename from src/main/java/com/solaria/persistence/dto/patch/UpdateBusinessContactIdDTO.java
rename to src/main/java/com/solaria/persistence/dto/patch/company/UpdateBusinessContactIdDTO.java
index b6a7410..e035384 100644
--- a/src/main/java/com/solaria/persistence/dto/patch/UpdateBusinessContactIdDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/patch/company/UpdateBusinessContactIdDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.patch;
+package com.solaria.persistence.dto.patch.company;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/patch/UpdateCompanyAddressIdDTO.java b/src/main/java/com/solaria/persistence/dto/patch/company/UpdateCompanyAddressIdDTO.java
similarity index 83%
rename from src/main/java/com/solaria/persistence/dto/patch/UpdateCompanyAddressIdDTO.java
rename to src/main/java/com/solaria/persistence/dto/patch/company/UpdateCompanyAddressIdDTO.java
index 3060069..8210432 100644
--- a/src/main/java/com/solaria/persistence/dto/patch/UpdateCompanyAddressIdDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/patch/company/UpdateCompanyAddressIdDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.patch;
+package com.solaria.persistence.dto.patch.company;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/patch/ServiceAcceptanceDTO.java b/src/main/java/com/solaria/persistence/dto/patch/execution/ServiceAcceptanceDTO.java
similarity index 83%
rename from src/main/java/com/solaria/persistence/dto/patch/ServiceAcceptanceDTO.java
rename to src/main/java/com/solaria/persistence/dto/patch/execution/ServiceAcceptanceDTO.java
index f39db8c..d7c246f 100644
--- a/src/main/java/com/solaria/persistence/dto/patch/ServiceAcceptanceDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/patch/execution/ServiceAcceptanceDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.patch;
+package com.solaria.persistence.dto.patch.execution;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/patch/ServiceScheduleDTO.java b/src/main/java/com/solaria/persistence/dto/patch/execution/ServiceScheduleDTO.java
similarity index 84%
rename from src/main/java/com/solaria/persistence/dto/patch/ServiceScheduleDTO.java
rename to src/main/java/com/solaria/persistence/dto/patch/execution/ServiceScheduleDTO.java
index 1879672..717ae8a 100644
--- a/src/main/java/com/solaria/persistence/dto/patch/ServiceScheduleDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/patch/execution/ServiceScheduleDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.patch;
+package com.solaria.persistence.dto.patch.execution;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/patch/UpdateFunctionDTO.java b/src/main/java/com/solaria/persistence/dto/patch/execution/UpdateFunctionDTO.java
similarity index 82%
rename from src/main/java/com/solaria/persistence/dto/patch/UpdateFunctionDTO.java
rename to src/main/java/com/solaria/persistence/dto/patch/execution/UpdateFunctionDTO.java
index a73bd35..17308d1 100644
--- a/src/main/java/com/solaria/persistence/dto/patch/UpdateFunctionDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/patch/execution/UpdateFunctionDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.patch;
+package com.solaria.persistence.dto.patch.execution;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/patch/UpdatePurposeDTO.java b/src/main/java/com/solaria/persistence/dto/patch/execution/UpdatePurposeDTO.java
similarity index 81%
rename from src/main/java/com/solaria/persistence/dto/patch/UpdatePurposeDTO.java
rename to src/main/java/com/solaria/persistence/dto/patch/execution/UpdatePurposeDTO.java
index 2a70ac3..4831b82 100644
--- a/src/main/java/com/solaria/persistence/dto/patch/UpdatePurposeDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/patch/execution/UpdatePurposeDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.patch;
+package com.solaria.persistence.dto.patch.execution;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/patch/UpdatePositionDTO.java b/src/main/java/com/solaria/persistence/dto/patch/identity/UpdatePositionDTO.java
similarity index 82%
rename from src/main/java/com/solaria/persistence/dto/patch/UpdatePositionDTO.java
rename to src/main/java/com/solaria/persistence/dto/patch/identity/UpdatePositionDTO.java
index 0fa19ae..acaa8f2 100644
--- a/src/main/java/com/solaria/persistence/dto/patch/UpdatePositionDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/patch/identity/UpdatePositionDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.patch;
+package com.solaria.persistence.dto.patch.identity;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/patch/UpdateActiveDTO.java b/src/main/java/com/solaria/persistence/dto/patch/professional/UpdateActiveDTO.java
similarity index 79%
rename from src/main/java/com/solaria/persistence/dto/patch/UpdateActiveDTO.java
rename to src/main/java/com/solaria/persistence/dto/patch/professional/UpdateActiveDTO.java
index 5c4a76c..ed6a070 100644
--- a/src/main/java/com/solaria/persistence/dto/patch/UpdateActiveDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/patch/professional/UpdateActiveDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.patch;
+package com.solaria.persistence.dto.patch.professional;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/patch/UpdateTypeDTO.java b/src/main/java/com/solaria/persistence/dto/patch/professional/UpdateTypeDTO.java
similarity index 64%
rename from src/main/java/com/solaria/persistence/dto/patch/UpdateTypeDTO.java
rename to src/main/java/com/solaria/persistence/dto/patch/professional/UpdateTypeDTO.java
index 306ca84..d0f0634 100644
--- a/src/main/java/com/solaria/persistence/dto/patch/UpdateTypeDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/patch/professional/UpdateTypeDTO.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.dto.patch;
+package com.solaria.persistence.dto.patch.professional;
-import com.solaria.persistence.domain.enums.TechnicalAffiliationType;
+import com.solaria.persistence.domain.enums.professional.TechnicalAffiliationType;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/patch/UpdateNotesDTO.java b/src/main/java/com/solaria/persistence/dto/patch/proposal/UpdateNotesDTO.java
similarity index 82%
rename from src/main/java/com/solaria/persistence/dto/patch/UpdateNotesDTO.java
rename to src/main/java/com/solaria/persistence/dto/patch/proposal/UpdateNotesDTO.java
index d4c9981..151b61f 100644
--- a/src/main/java/com/solaria/persistence/dto/patch/UpdateNotesDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/patch/proposal/UpdateNotesDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.patch;
+package com.solaria.persistence.dto.patch.proposal;
import jakarta.validation.constraints.Size;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/patch/UpdateLocalUnitAddressIdDTO.java b/src/main/java/com/solaria/persistence/dto/patch/unit/UpdateLocalUnitAddressIdDTO.java
similarity index 84%
rename from src/main/java/com/solaria/persistence/dto/patch/UpdateLocalUnitAddressIdDTO.java
rename to src/main/java/com/solaria/persistence/dto/patch/unit/UpdateLocalUnitAddressIdDTO.java
index 2757443..a9dc590 100644
--- a/src/main/java/com/solaria/persistence/dto/patch/UpdateLocalUnitAddressIdDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/patch/unit/UpdateLocalUnitAddressIdDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.patch;
+package com.solaria.persistence.dto.patch.unit;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/request/ServiceTokenMintRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/auth/ServiceTokenMintRequestDTO.java
similarity index 83%
rename from src/main/java/com/solaria/persistence/dto/request/ServiceTokenMintRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/auth/ServiceTokenMintRequestDTO.java
index 74e93c9..159d5c5 100644
--- a/src/main/java/com/solaria/persistence/dto/request/ServiceTokenMintRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/auth/ServiceTokenMintRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.auth;
import jakarta.validation.constraints.NotBlank;
diff --git a/src/main/java/com/solaria/persistence/dto/request/ServiceTokenRefreshRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/auth/ServiceTokenRefreshRequestDTO.java
similarity index 83%
rename from src/main/java/com/solaria/persistence/dto/request/ServiceTokenRefreshRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/auth/ServiceTokenRefreshRequestDTO.java
index 224e22b..a8c1ad5 100644
--- a/src/main/java/com/solaria/persistence/dto/request/ServiceTokenRefreshRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/auth/ServiceTokenRefreshRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.auth;
import jakarta.validation.constraints.NotBlank;
diff --git a/src/main/java/com/solaria/persistence/dto/request/InventoryRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/catalog/InventoryRequestDTO.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/dto/request/InventoryRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/catalog/InventoryRequestDTO.java
index d3f5f3d..363da6c 100644
--- a/src/main/java/com/solaria/persistence/dto/request/InventoryRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/catalog/InventoryRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.catalog;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.PositiveOrZero;
diff --git a/src/main/java/com/solaria/persistence/dto/request/ModelRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/catalog/ModelRequestDTO.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/dto/request/ModelRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/catalog/ModelRequestDTO.java
index a70bae7..b5e2c49 100644
--- a/src/main/java/com/solaria/persistence/dto/request/ModelRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/catalog/ModelRequestDTO.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.catalog;
-import com.solaria.persistence.domain.enums.PanelType;
+import com.solaria.persistence.domain.enums.catalog.PanelType;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
diff --git a/src/main/java/com/solaria/persistence/dto/request/OfferRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/catalog/OfferRequestDTO.java
similarity index 96%
rename from src/main/java/com/solaria/persistence/dto/request/OfferRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/catalog/OfferRequestDTO.java
index ae7d487..dd76819 100644
--- a/src/main/java/com/solaria/persistence/dto/request/OfferRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/catalog/OfferRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.catalog;
import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin;
diff --git a/src/main/java/com/solaria/persistence/dto/request/SupplierRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/catalog/SupplierRequestDTO.java
similarity index 84%
rename from src/main/java/com/solaria/persistence/dto/request/SupplierRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/catalog/SupplierRequestDTO.java
index 31bfeac..58faad5 100644
--- a/src/main/java/com/solaria/persistence/dto/request/SupplierRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/catalog/SupplierRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.catalog;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/request/SupplierSearchFilterDTO.java b/src/main/java/com/solaria/persistence/dto/request/catalog/SupplierSearchFilterDTO.java
similarity index 94%
rename from src/main/java/com/solaria/persistence/dto/request/SupplierSearchFilterDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/catalog/SupplierSearchFilterDTO.java
index b651437..30f2ba7 100644
--- a/src/main/java/com/solaria/persistence/dto/request/SupplierSearchFilterDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/catalog/SupplierSearchFilterDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.catalog;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.NotNull;
diff --git a/src/main/java/com/solaria/persistence/dto/request/BusinessContactRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/company/BusinessContactRequestDTO.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/dto/request/BusinessContactRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/company/BusinessContactRequestDTO.java
index 61ba2a1..3b4dfb2 100644
--- a/src/main/java/com/solaria/persistence/dto/request/BusinessContactRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/company/BusinessContactRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.company;
import com.solaria.persistence.util.RegexValidator;
diff --git a/src/main/java/com/solaria/persistence/dto/request/ChargeRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/company/ChargeRequestDTO.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/dto/request/ChargeRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/company/ChargeRequestDTO.java
index 6041d41..74b1872 100644
--- a/src/main/java/com/solaria/persistence/dto/request/ChargeRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/company/ChargeRequestDTO.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.company;
-import com.solaria.persistence.domain.enums.PaymentMethod;
+import com.solaria.persistence.domain.enums.company.PaymentMethod;
import jakarta.validation.constraints.FutureOrPresent;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
diff --git a/src/main/java/com/solaria/persistence/dto/request/CompanyPlansRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/company/CompanyPlansRequestDTO.java
similarity index 80%
rename from src/main/java/com/solaria/persistence/dto/request/CompanyPlansRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/company/CompanyPlansRequestDTO.java
index 418ae46..42e9da7 100644
--- a/src/main/java/com/solaria/persistence/dto/request/CompanyPlansRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/company/CompanyPlansRequestDTO.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.company;
-import com.solaria.persistence.domain.enums.PlanCycle;
+import com.solaria.persistence.domain.enums.company.PlanCycle;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/request/CompanyPositionsRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/company/CompanyPositionsRequestDTO.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/dto/request/CompanyPositionsRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/company/CompanyPositionsRequestDTO.java
index a46620c..3b35c9b 100644
--- a/src/main/java/com/solaria/persistence/dto/request/CompanyPositionsRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/company/CompanyPositionsRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.company;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/dto/request/CompanyRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/company/CompanyRequestDTO.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/dto/request/CompanyRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/company/CompanyRequestDTO.java
index c684742..e0e119c 100644
--- a/src/main/java/com/solaria/persistence/dto/request/CompanyRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/company/CompanyRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.company;
import com.solaria.persistence.util.RegexValidator;
diff --git a/src/main/java/com/solaria/persistence/dto/request/SubscriptionRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/company/SubscriptionRequestDTO.java
similarity index 89%
rename from src/main/java/com/solaria/persistence/dto/request/SubscriptionRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/company/SubscriptionRequestDTO.java
index 779f077..3c799f0 100644
--- a/src/main/java/com/solaria/persistence/dto/request/SubscriptionRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/company/SubscriptionRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.company;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/request/RequesterRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/execution/RequesterRequestDTO.java
similarity index 84%
rename from src/main/java/com/solaria/persistence/dto/request/RequesterRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/execution/RequesterRequestDTO.java
index 6f97b42..11d0370 100644
--- a/src/main/java/com/solaria/persistence/dto/request/RequesterRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/execution/RequesterRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.execution;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/request/ServiceContractRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/execution/ServiceContractRequestDTO.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/dto/request/ServiceContractRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/execution/ServiceContractRequestDTO.java
index 4df3853..562303c 100644
--- a/src/main/java/com/solaria/persistence/dto/request/ServiceContractRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/execution/ServiceContractRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.execution;
import jakarta.validation.constraints.FutureOrPresent;
import jakarta.validation.constraints.NotNull;
diff --git a/src/main/java/com/solaria/persistence/dto/request/ServiceExecutorRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/execution/ServiceExecutorRequestDTO.java
similarity index 90%
rename from src/main/java/com/solaria/persistence/dto/request/ServiceExecutorRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/execution/ServiceExecutorRequestDTO.java
index 162ea3f..fce216a 100644
--- a/src/main/java/com/solaria/persistence/dto/request/ServiceExecutorRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/execution/ServiceExecutorRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.execution;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/dto/request/TechnicalProjectRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/execution/TechnicalProjectRequestDTO.java
similarity index 74%
rename from src/main/java/com/solaria/persistence/dto/request/TechnicalProjectRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/execution/TechnicalProjectRequestDTO.java
index a71d111..a3a969c 100644
--- a/src/main/java/com/solaria/persistence/dto/request/TechnicalProjectRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/execution/TechnicalProjectRequestDTO.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.execution;
-import com.solaria.persistence.domain.enums.ServiceStatus;
+import com.solaria.persistence.domain.enums.execution.ServiceStatus;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/request/TechnicalServiceRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/execution/TechnicalServiceRequestDTO.java
similarity index 90%
rename from src/main/java/com/solaria/persistence/dto/request/TechnicalServiceRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/execution/TechnicalServiceRequestDTO.java
index e60a29a..65db348 100644
--- a/src/main/java/com/solaria/persistence/dto/request/TechnicalServiceRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/execution/TechnicalServiceRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.execution;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
diff --git a/src/main/java/com/solaria/persistence/dto/request/InternalUserProvisionRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/identity/InternalUserProvisionRequestDTO.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/dto/request/InternalUserProvisionRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/identity/InternalUserProvisionRequestDTO.java
index a45e550..2de7c05 100644
--- a/src/main/java/com/solaria/persistence/dto/request/InternalUserProvisionRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/identity/InternalUserProvisionRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.identity;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/dto/request/PermissionRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/identity/PermissionRequestDTO.java
similarity index 90%
rename from src/main/java/com/solaria/persistence/dto/request/PermissionRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/identity/PermissionRequestDTO.java
index 4262b25..9b23d85 100644
--- a/src/main/java/com/solaria/persistence/dto/request/PermissionRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/identity/PermissionRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.identity;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
diff --git a/src/main/java/com/solaria/persistence/dto/request/PersonRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/identity/PersonRequestDTO.java
similarity index 94%
rename from src/main/java/com/solaria/persistence/dto/request/PersonRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/identity/PersonRequestDTO.java
index 028daff..4c3f207 100644
--- a/src/main/java/com/solaria/persistence/dto/request/PersonRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/identity/PersonRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.identity;
import com.solaria.persistence.util.RegexValidator;
diff --git a/src/main/java/com/solaria/persistence/dto/request/PositionPermissionRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/identity/PositionPermissionRequestDTO.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/dto/request/PositionPermissionRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/identity/PositionPermissionRequestDTO.java
index 53fb5be..9851ac7 100644
--- a/src/main/java/com/solaria/persistence/dto/request/PositionPermissionRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/identity/PositionPermissionRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.identity;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/dto/request/PositionRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/identity/PositionRequestDTO.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/dto/request/PositionRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/identity/PositionRequestDTO.java
index 65fcba4..01e7813 100644
--- a/src/main/java/com/solaria/persistence/dto/request/PositionRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/identity/PositionRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.identity;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
diff --git a/src/main/java/com/solaria/persistence/dto/request/UserCompanyRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/identity/UserCompanyRequestDTO.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/dto/request/UserCompanyRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/identity/UserCompanyRequestDTO.java
index 9c865e5..895eec9 100644
--- a/src/main/java/com/solaria/persistence/dto/request/UserCompanyRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/identity/UserCompanyRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.identity;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/dto/request/UserRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/identity/UserRequestDTO.java
similarity index 89%
rename from src/main/java/com/solaria/persistence/dto/request/UserRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/identity/UserRequestDTO.java
index 5bee4c6..76f3cde 100644
--- a/src/main/java/com/solaria/persistence/dto/request/UserRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/identity/UserRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.identity;
import com.solaria.persistence.util.RegexValidator;
diff --git a/src/main/java/com/solaria/persistence/dto/request/CertificationRecordRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/professional/CertificationRecordRequestDTO.java
similarity index 78%
rename from src/main/java/com/solaria/persistence/dto/request/CertificationRecordRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/professional/CertificationRecordRequestDTO.java
index f15789f..66a6871 100644
--- a/src/main/java/com/solaria/persistence/dto/request/CertificationRecordRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/professional/CertificationRecordRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.professional;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/request/CertificationRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/professional/CertificationRequestDTO.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/dto/request/CertificationRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/professional/CertificationRequestDTO.java
index 7cd973f..0b5fd38 100644
--- a/src/main/java/com/solaria/persistence/dto/request/CertificationRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/professional/CertificationRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.professional;
import jakarta.validation.constraints.Size;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/request/ProfessionRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/professional/ProfessionRequestDTO.java
similarity index 80%
rename from src/main/java/com/solaria/persistence/dto/request/ProfessionRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/professional/ProfessionRequestDTO.java
index 228c3cd..7f9d5f4 100644
--- a/src/main/java/com/solaria/persistence/dto/request/ProfessionRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/professional/ProfessionRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.professional;
import jakarta.validation.constraints.Size;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/request/ProfessionalRegistrationRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/professional/ProfessionalRegistrationRequestDTO.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/dto/request/ProfessionalRegistrationRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/professional/ProfessionalRegistrationRequestDTO.java
index 79b0f44..c42ea53 100644
--- a/src/main/java/com/solaria/persistence/dto/request/ProfessionalRegistrationRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/professional/ProfessionalRegistrationRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.professional;
import jakarta.validation.constraints.Size;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/request/ProfessionalReviewRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/professional/ProfessionalReviewRequestDTO.java
similarity index 94%
rename from src/main/java/com/solaria/persistence/dto/request/ProfessionalReviewRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/professional/ProfessionalReviewRequestDTO.java
index 46f9424..66fa237 100644
--- a/src/main/java/com/solaria/persistence/dto/request/ProfessionalReviewRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/professional/ProfessionalReviewRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.professional;
import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin;
diff --git a/src/main/java/com/solaria/persistence/dto/request/ShiftRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/professional/ShiftRequestDTO.java
similarity index 82%
rename from src/main/java/com/solaria/persistence/dto/request/ShiftRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/professional/ShiftRequestDTO.java
index d8423e7..2137727 100644
--- a/src/main/java/com/solaria/persistence/dto/request/ShiftRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/professional/ShiftRequestDTO.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.professional;
-import com.solaria.persistence.domain.enums.DayWeek;
+import com.solaria.persistence.domain.enums.professional.DayWeek;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/request/TechnicalCourseRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/professional/TechnicalCourseRequestDTO.java
similarity index 84%
rename from src/main/java/com/solaria/persistence/dto/request/TechnicalCourseRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/professional/TechnicalCourseRequestDTO.java
index e90d5d9..5630e64 100644
--- a/src/main/java/com/solaria/persistence/dto/request/TechnicalCourseRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/professional/TechnicalCourseRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.professional;
import jakarta.validation.constraints.Size;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/request/TechnicianAffiliationRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/professional/TechnicianAffiliationRequestDTO.java
similarity index 74%
rename from src/main/java/com/solaria/persistence/dto/request/TechnicianAffiliationRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/professional/TechnicianAffiliationRequestDTO.java
index 505748a..1217dda 100644
--- a/src/main/java/com/solaria/persistence/dto/request/TechnicianAffiliationRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/professional/TechnicianAffiliationRequestDTO.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.professional;
-import com.solaria.persistence.domain.enums.TechnicalAffiliationType;
+import com.solaria.persistence.domain.enums.professional.TechnicalAffiliationType;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/request/TechnicianRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/professional/TechnicianRequestDTO.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/dto/request/TechnicianRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/professional/TechnicianRequestDTO.java
index d0ad3ee..7dbc476 100644
--- a/src/main/java/com/solaria/persistence/dto/request/TechnicianRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/professional/TechnicianRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.professional;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
diff --git a/src/main/java/com/solaria/persistence/dto/request/ProposalItemRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/proposal/ProposalItemRequestDTO.java
similarity index 94%
rename from src/main/java/com/solaria/persistence/dto/request/ProposalItemRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/proposal/ProposalItemRequestDTO.java
index d3dd449..9914a94 100644
--- a/src/main/java/com/solaria/persistence/dto/request/ProposalItemRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/proposal/ProposalItemRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.proposal;
import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.NotNull;
diff --git a/src/main/java/com/solaria/persistence/dto/request/ProposalRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/proposal/ProposalRequestDTO.java
similarity index 84%
rename from src/main/java/com/solaria/persistence/dto/request/ProposalRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/proposal/ProposalRequestDTO.java
index 6e78f46..6a6ff14 100644
--- a/src/main/java/com/solaria/persistence/dto/request/ProposalRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/proposal/ProposalRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.proposal;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/request/ProposalUnitRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/proposal/ProposalUnitRequestDTO.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/dto/request/ProposalUnitRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/proposal/ProposalUnitRequestDTO.java
index 635b41f..880a5f3 100644
--- a/src/main/java/com/solaria/persistence/dto/request/ProposalUnitRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/proposal/ProposalUnitRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.proposal;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
diff --git a/src/main/java/com/solaria/persistence/dto/request/AddressRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/shared/AddressRequestDTO.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/dto/request/AddressRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/shared/AddressRequestDTO.java
index aea6d64..e765f33 100644
--- a/src/main/java/com/solaria/persistence/dto/request/AddressRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/shared/AddressRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.shared;
import com.solaria.persistence.util.RegexValidator;
diff --git a/src/main/java/com/solaria/persistence/dto/request/ContactRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/shared/ContactRequestDTO.java
similarity index 90%
rename from src/main/java/com/solaria/persistence/dto/request/ContactRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/shared/ContactRequestDTO.java
index 6a6dbb5..9987e07 100644
--- a/src/main/java/com/solaria/persistence/dto/request/ContactRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/shared/ContactRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.shared;
import com.solaria.persistence.util.RegexValidator;
diff --git a/src/main/java/com/solaria/persistence/dto/request/FluxLogRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/shared/FluxLogRequestDTO.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/dto/request/FluxLogRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/shared/FluxLogRequestDTO.java
index e90792a..f052419 100644
--- a/src/main/java/com/solaria/persistence/dto/request/FluxLogRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/shared/FluxLogRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.shared;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
diff --git a/src/main/java/com/solaria/persistence/dto/request/GeolocalizationRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/shared/GeolocalizationRequestDTO.java
similarity index 94%
rename from src/main/java/com/solaria/persistence/dto/request/GeolocalizationRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/shared/GeolocalizationRequestDTO.java
index 6391b2d..ffea240 100644
--- a/src/main/java/com/solaria/persistence/dto/request/GeolocalizationRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/shared/GeolocalizationRequestDTO.java
@@ -1,5 +1,5 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.shared;
import java.math.BigDecimal;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/dto/request/EnergyBillRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/unit/EnergyBillRequestDTO.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/dto/request/EnergyBillRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/unit/EnergyBillRequestDTO.java
index ce92b0f..0be008a 100644
--- a/src/main/java/com/solaria/persistence/dto/request/EnergyBillRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/unit/EnergyBillRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.unit;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
diff --git a/src/main/java/com/solaria/persistence/dto/request/LocalUnitRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/unit/LocalUnitRequestDTO.java
similarity index 79%
rename from src/main/java/com/solaria/persistence/dto/request/LocalUnitRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/unit/LocalUnitRequestDTO.java
index abcbd42..c73e140 100644
--- a/src/main/java/com/solaria/persistence/dto/request/LocalUnitRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/unit/LocalUnitRequestDTO.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.unit;
-import com.solaria.persistence.domain.enums.LocationType;
+import com.solaria.persistence.domain.enums.unit.LocationType;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/request/UnitSpecificationsRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/unit/UnitSpecificationsRequestDTO.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/dto/request/UnitSpecificationsRequestDTO.java
rename to src/main/java/com/solaria/persistence/dto/request/unit/UnitSpecificationsRequestDTO.java
index cb2ccf1..ac2e586 100644
--- a/src/main/java/com/solaria/persistence/dto/request/UnitSpecificationsRequestDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/request/unit/UnitSpecificationsRequestDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.request;
+package com.solaria.persistence.dto.request.unit;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/ServiceTokenResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/auth/ServiceTokenResponseDTO.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/dto/response/ServiceTokenResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/auth/ServiceTokenResponseDTO.java
index ef247e5..12aba61 100644
--- a/src/main/java/com/solaria/persistence/dto/response/ServiceTokenResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/auth/ServiceTokenResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.auth;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/src/main/java/com/solaria/persistence/dto/response/InventoryResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/catalog/InventoryResponseDTO.java
similarity index 81%
rename from src/main/java/com/solaria/persistence/dto/response/InventoryResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/catalog/InventoryResponseDTO.java
index 04317ae..3b22cd1 100644
--- a/src/main/java/com/solaria/persistence/dto/response/InventoryResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/catalog/InventoryResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.catalog;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/ModelPhotoResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/catalog/ModelPhotoResponseDTO.java
similarity index 83%
rename from src/main/java/com/solaria/persistence/dto/response/ModelPhotoResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/catalog/ModelPhotoResponseDTO.java
index aa04df6..6fb3f04 100644
--- a/src/main/java/com/solaria/persistence/dto/response/ModelPhotoResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/catalog/ModelPhotoResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.catalog;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/ModelResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/catalog/ModelResponseDTO.java
similarity index 76%
rename from src/main/java/com/solaria/persistence/dto/response/ModelResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/catalog/ModelResponseDTO.java
index 86f5e67..e8291ac 100644
--- a/src/main/java/com/solaria/persistence/dto/response/ModelResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/catalog/ModelResponseDTO.java
@@ -1,7 +1,7 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.catalog;
-import com.solaria.persistence.domain.enums.ModelStatus;
-import com.solaria.persistence.domain.enums.PanelType;
+import com.solaria.persistence.domain.enums.catalog.ModelStatus;
+import com.solaria.persistence.domain.enums.catalog.PanelType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/OfferResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/catalog/OfferResponseDTO.java
similarity index 83%
rename from src/main/java/com/solaria/persistence/dto/response/OfferResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/catalog/OfferResponseDTO.java
index 61d57c3..f089637 100644
--- a/src/main/java/com/solaria/persistence/dto/response/OfferResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/catalog/OfferResponseDTO.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.catalog;
-import com.solaria.persistence.domain.enums.TranslationStatus;
+import com.solaria.persistence.domain.enums.catalog.TranslationStatus;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/OfferTranslationResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/catalog/OfferTranslationResponseDTO.java
similarity index 80%
rename from src/main/java/com/solaria/persistence/dto/response/OfferTranslationResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/catalog/OfferTranslationResponseDTO.java
index 7dce953..57b2c6e 100644
--- a/src/main/java/com/solaria/persistence/dto/response/OfferTranslationResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/catalog/OfferTranslationResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.catalog;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/SupplierResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/catalog/SupplierResponseDTO.java
similarity index 56%
rename from src/main/java/com/solaria/persistence/dto/response/SupplierResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/catalog/SupplierResponseDTO.java
index 4ff1b19..a746680 100644
--- a/src/main/java/com/solaria/persistence/dto/response/SupplierResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/catalog/SupplierResponseDTO.java
@@ -1,10 +1,11 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.catalog;
-import com.solaria.persistence.domain.enums.SupplierStatus;
+import com.solaria.persistence.domain.enums.catalog.SupplierStatus;
import lombok.Getter;
import lombok.Setter;
import java.util.UUID;
+import com.solaria.persistence.dto.response.company.CompanyResponseDTO;
@Getter
@Setter
diff --git a/src/main/java/com/solaria/persistence/dto/response/SupplierSearchResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/catalog/SupplierSearchResponseDTO.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/dto/response/SupplierSearchResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/catalog/SupplierSearchResponseDTO.java
index a7aa46e..3808a96 100644
--- a/src/main/java/com/solaria/persistence/dto/response/SupplierSearchResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/catalog/SupplierSearchResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.catalog;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/BusinessContactResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/company/BusinessContactResponseDTO.java
similarity index 81%
rename from src/main/java/com/solaria/persistence/dto/response/BusinessContactResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/company/BusinessContactResponseDTO.java
index 001fec5..4aa7de5 100644
--- a/src/main/java/com/solaria/persistence/dto/response/BusinessContactResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/company/BusinessContactResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.company;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/ChargeResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/company/ChargeResponseDTO.java
similarity index 70%
rename from src/main/java/com/solaria/persistence/dto/response/ChargeResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/company/ChargeResponseDTO.java
index d92a3a3..f344568 100644
--- a/src/main/java/com/solaria/persistence/dto/response/ChargeResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/company/ChargeResponseDTO.java
@@ -1,7 +1,7 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.company;
-import com.solaria.persistence.domain.enums.BillingStatus;
-import com.solaria.persistence.domain.enums.PaymentMethod;
+import com.solaria.persistence.domain.enums.company.BillingStatus;
+import com.solaria.persistence.domain.enums.company.PaymentMethod;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/CompanyPhotoResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/company/CompanyPhotoResponseDTO.java
similarity index 72%
rename from src/main/java/com/solaria/persistence/dto/response/CompanyPhotoResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/company/CompanyPhotoResponseDTO.java
index cd18491..7cebe48 100644
--- a/src/main/java/com/solaria/persistence/dto/response/CompanyPhotoResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/company/CompanyPhotoResponseDTO.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.company;
-import com.solaria.persistence.domain.enums.PhotoType;
+import com.solaria.persistence.domain.enums.shared.PhotoType;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/CompanyPlansResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/company/CompanyPlansResponseDTO.java
similarity index 69%
rename from src/main/java/com/solaria/persistence/dto/response/CompanyPlansResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/company/CompanyPlansResponseDTO.java
index 7e478b4..7ab9462 100644
--- a/src/main/java/com/solaria/persistence/dto/response/CompanyPlansResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/company/CompanyPlansResponseDTO.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.company;
-import com.solaria.persistence.domain.enums.PlanCycle;
+import com.solaria.persistence.domain.enums.company.PlanCycle;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/CompanyPositionsResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/company/CompanyPositionsResponseDTO.java
similarity index 63%
rename from src/main/java/com/solaria/persistence/dto/response/CompanyPositionsResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/company/CompanyPositionsResponseDTO.java
index 2a162a8..36a5b31 100644
--- a/src/main/java/com/solaria/persistence/dto/response/CompanyPositionsResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/company/CompanyPositionsResponseDTO.java
@@ -1,9 +1,10 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.company;
import java.util.UUID;
import lombok.Getter;
import lombok.Setter;
+import com.solaria.persistence.dto.response.identity.PositionResponseDTO;
@Getter
@Setter
diff --git a/src/main/java/com/solaria/persistence/dto/response/CompanyResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/company/CompanyResponseDTO.java
similarity index 66%
rename from src/main/java/com/solaria/persistence/dto/response/CompanyResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/company/CompanyResponseDTO.java
index 24e2edd..d4a3c7b 100644
--- a/src/main/java/com/solaria/persistence/dto/response/CompanyResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/company/CompanyResponseDTO.java
@@ -1,10 +1,11 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.company;
-import com.solaria.persistence.domain.enums.CompanyStatus;
+import com.solaria.persistence.domain.enums.company.CompanyStatus;
import lombok.Getter;
import lombok.Setter;
import java.util.UUID;
+import com.solaria.persistence.dto.response.shared.AddressResponseDTO;
@Getter
@Setter
diff --git a/src/main/java/com/solaria/persistence/dto/response/SubscriptionResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/company/SubscriptionResponseDTO.java
similarity index 76%
rename from src/main/java/com/solaria/persistence/dto/response/SubscriptionResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/company/SubscriptionResponseDTO.java
index 1d642c2..e2ec56b 100644
--- a/src/main/java/com/solaria/persistence/dto/response/SubscriptionResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/company/SubscriptionResponseDTO.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.company;
-import com.solaria.persistence.domain.enums.SubscriptionStatus;
+import com.solaria.persistence.domain.enums.company.SubscriptionStatus;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/RequesterResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/execution/RequesterResponseDTO.java
similarity index 63%
rename from src/main/java/com/solaria/persistence/dto/response/RequesterResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/execution/RequesterResponseDTO.java
index 141178c..3a2a51b 100644
--- a/src/main/java/com/solaria/persistence/dto/response/RequesterResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/execution/RequesterResponseDTO.java
@@ -1,9 +1,10 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.execution;
import lombok.Getter;
import lombok.Setter;
import java.util.UUID;
+import com.solaria.persistence.dto.response.company.CompanyResponseDTO;
@Getter
@Setter
diff --git a/src/main/java/com/solaria/persistence/dto/response/ServiceContractResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/execution/ServiceContractResponseDTO.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/dto/response/ServiceContractResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/execution/ServiceContractResponseDTO.java
index 395d170..3eafcd5 100644
--- a/src/main/java/com/solaria/persistence/dto/response/ServiceContractResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/execution/ServiceContractResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.execution;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/ServiceExecutorResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/execution/ServiceExecutorResponseDTO.java
similarity index 65%
rename from src/main/java/com/solaria/persistence/dto/response/ServiceExecutorResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/execution/ServiceExecutorResponseDTO.java
index 6279aba..d9a4163 100644
--- a/src/main/java/com/solaria/persistence/dto/response/ServiceExecutorResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/execution/ServiceExecutorResponseDTO.java
@@ -1,9 +1,10 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.execution;
import java.util.UUID;
import lombok.Getter;
import lombok.Setter;
+import com.solaria.persistence.dto.response.professional.TechnicianAffiliationResponseDTO;
@Setter
@Getter
diff --git a/src/main/java/com/solaria/persistence/dto/response/TechnicalProjectResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/execution/TechnicalProjectResponseDTO.java
similarity index 75%
rename from src/main/java/com/solaria/persistence/dto/response/TechnicalProjectResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/execution/TechnicalProjectResponseDTO.java
index f1cc1ce..4ef72d7 100644
--- a/src/main/java/com/solaria/persistence/dto/response/TechnicalProjectResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/execution/TechnicalProjectResponseDTO.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.execution;
-import com.solaria.persistence.domain.enums.ServiceStatus;
+import com.solaria.persistence.domain.enums.execution.ServiceStatus;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/TechnicalServiceResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/execution/TechnicalServiceResponseDTO.java
similarity index 78%
rename from src/main/java/com/solaria/persistence/dto/response/TechnicalServiceResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/execution/TechnicalServiceResponseDTO.java
index 33b812f..001162f 100644
--- a/src/main/java/com/solaria/persistence/dto/response/TechnicalServiceResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/execution/TechnicalServiceResponseDTO.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.execution;
-import com.solaria.persistence.domain.enums.ServiceStatus;
+import com.solaria.persistence.domain.enums.execution.ServiceStatus;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/InternalUserProvisionResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/identity/InternalUserProvisionResponseDTO.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/dto/response/InternalUserProvisionResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/identity/InternalUserProvisionResponseDTO.java
index 7a3e269..543eac2 100644
--- a/src/main/java/com/solaria/persistence/dto/response/InternalUserProvisionResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/identity/InternalUserProvisionResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.identity;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/dto/response/PermissionResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/identity/PermissionResponseDTO.java
similarity index 81%
rename from src/main/java/com/solaria/persistence/dto/response/PermissionResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/identity/PermissionResponseDTO.java
index 0b6157d..a4cbf25 100644
--- a/src/main/java/com/solaria/persistence/dto/response/PermissionResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/identity/PermissionResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.identity;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/PersonResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/identity/PersonResponseDTO.java
similarity index 71%
rename from src/main/java/com/solaria/persistence/dto/response/PersonResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/identity/PersonResponseDTO.java
index 1776b8e..afc9d4b 100644
--- a/src/main/java/com/solaria/persistence/dto/response/PersonResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/identity/PersonResponseDTO.java
@@ -1,10 +1,11 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.identity;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDate;
import java.util.UUID;
+import com.solaria.persistence.dto.response.shared.ContactResponseDTO;
@Setter
@Getter
diff --git a/src/main/java/com/solaria/persistence/dto/response/PositionPermissionResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/identity/PositionPermissionResponseDTO.java
similarity index 80%
rename from src/main/java/com/solaria/persistence/dto/response/PositionPermissionResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/identity/PositionPermissionResponseDTO.java
index 5c9a376..c56a6be 100644
--- a/src/main/java/com/solaria/persistence/dto/response/PositionPermissionResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/identity/PositionPermissionResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.identity;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/dto/response/PositionResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/identity/PositionResponseDTO.java
similarity index 78%
rename from src/main/java/com/solaria/persistence/dto/response/PositionResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/identity/PositionResponseDTO.java
index 9710802..6d6e713 100644
--- a/src/main/java/com/solaria/persistence/dto/response/PositionResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/identity/PositionResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.identity;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/dto/response/UserCompanyResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/identity/UserCompanyResponseDTO.java
similarity index 81%
rename from src/main/java/com/solaria/persistence/dto/response/UserCompanyResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/identity/UserCompanyResponseDTO.java
index 60a7ae5..6956cae 100644
--- a/src/main/java/com/solaria/persistence/dto/response/UserCompanyResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/identity/UserCompanyResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.identity;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/dto/response/UserPhotoResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/identity/UserPhotoResponseDTO.java
similarity index 71%
rename from src/main/java/com/solaria/persistence/dto/response/UserPhotoResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/identity/UserPhotoResponseDTO.java
index 1f1eb16..4c443a0 100644
--- a/src/main/java/com/solaria/persistence/dto/response/UserPhotoResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/identity/UserPhotoResponseDTO.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.identity;
-import com.solaria.persistence.domain.enums.PhotoType;
+import com.solaria.persistence.domain.enums.shared.PhotoType;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/UserResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/identity/UserResponseDTO.java
similarity index 80%
rename from src/main/java/com/solaria/persistence/dto/response/UserResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/identity/UserResponseDTO.java
index 398898c..8a639b5 100644
--- a/src/main/java/com/solaria/persistence/dto/response/UserResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/identity/UserResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.identity;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/CertificationRecordResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/professional/CertificationRecordResponseDTO.java
similarity index 80%
rename from src/main/java/com/solaria/persistence/dto/response/CertificationRecordResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/professional/CertificationRecordResponseDTO.java
index eae870a..f7025e2 100644
--- a/src/main/java/com/solaria/persistence/dto/response/CertificationRecordResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/professional/CertificationRecordResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.professional;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/dto/response/CertificationResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/professional/CertificationResponseDTO.java
similarity index 83%
rename from src/main/java/com/solaria/persistence/dto/response/CertificationResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/professional/CertificationResponseDTO.java
index 609b3cd..9390176 100644
--- a/src/main/java/com/solaria/persistence/dto/response/CertificationResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/professional/CertificationResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.professional;
import java.time.LocalDateTime;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/dto/response/ProfessionResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/professional/ProfessionResponseDTO.java
similarity index 78%
rename from src/main/java/com/solaria/persistence/dto/response/ProfessionResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/professional/ProfessionResponseDTO.java
index 17140e2..2b1934a 100644
--- a/src/main/java/com/solaria/persistence/dto/response/ProfessionResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/professional/ProfessionResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.professional;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/dto/response/ProfessionalRegistrationResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/professional/ProfessionalRegistrationResponseDTO.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/dto/response/ProfessionalRegistrationResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/professional/ProfessionalRegistrationResponseDTO.java
index fa929ac..b16c080 100644
--- a/src/main/java/com/solaria/persistence/dto/response/ProfessionalRegistrationResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/professional/ProfessionalRegistrationResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.professional;
import java.time.LocalDateTime;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/dto/response/ProfessionalReviewResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/professional/ProfessionalReviewResponseDTO.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/dto/response/ProfessionalReviewResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/professional/ProfessionalReviewResponseDTO.java
index 0900172..faecade 100644
--- a/src/main/java/com/solaria/persistence/dto/response/ProfessionalReviewResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/professional/ProfessionalReviewResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.professional;
import lombok.Builder;
import lombok.Getter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/ShiftResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/professional/ShiftResponseDTO.java
similarity index 71%
rename from src/main/java/com/solaria/persistence/dto/response/ShiftResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/professional/ShiftResponseDTO.java
index 8868f24..e854cd9 100644
--- a/src/main/java/com/solaria/persistence/dto/response/ShiftResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/professional/ShiftResponseDTO.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.professional;
-import com.solaria.persistence.domain.enums.DayWeek;
+import com.solaria.persistence.domain.enums.professional.DayWeek;
import java.time.LocalDateTime;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/dto/response/TechnicalCourseResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/professional/TechnicalCourseResponseDTO.java
similarity index 81%
rename from src/main/java/com/solaria/persistence/dto/response/TechnicalCourseResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/professional/TechnicalCourseResponseDTO.java
index a71b324..5f9948d 100644
--- a/src/main/java/com/solaria/persistence/dto/response/TechnicalCourseResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/professional/TechnicalCourseResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.professional;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/dto/response/TechnicianAffiliationResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/professional/TechnicianAffiliationResponseDTO.java
similarity index 67%
rename from src/main/java/com/solaria/persistence/dto/response/TechnicianAffiliationResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/professional/TechnicianAffiliationResponseDTO.java
index 0709d3d..bc68aac 100644
--- a/src/main/java/com/solaria/persistence/dto/response/TechnicianAffiliationResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/professional/TechnicianAffiliationResponseDTO.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.professional;
-import com.solaria.persistence.domain.enums.TechnicalAffiliationType;
+import com.solaria.persistence.domain.enums.professional.TechnicalAffiliationType;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/TechnicianResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/professional/TechnicianResponseDTO.java
similarity index 64%
rename from src/main/java/com/solaria/persistence/dto/response/TechnicianResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/professional/TechnicianResponseDTO.java
index 89e108c..83ff3c8 100644
--- a/src/main/java/com/solaria/persistence/dto/response/TechnicianResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/professional/TechnicianResponseDTO.java
@@ -1,9 +1,10 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.professional;
import lombok.Getter;
import lombok.Setter;
import java.util.UUID;
+import com.solaria.persistence.dto.response.identity.PersonResponseDTO;
@Getter
@Setter
diff --git a/src/main/java/com/solaria/persistence/dto/response/ProposalItemResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/proposal/ProposalItemResponseDTO.java
similarity index 73%
rename from src/main/java/com/solaria/persistence/dto/response/ProposalItemResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/proposal/ProposalItemResponseDTO.java
index 87bcddb..3fb4055 100644
--- a/src/main/java/com/solaria/persistence/dto/response/ProposalItemResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/proposal/ProposalItemResponseDTO.java
@@ -1,10 +1,11 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.proposal;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.util.UUID;
+import com.solaria.persistence.dto.response.catalog.OfferResponseDTO;
@Getter
@Setter
diff --git a/src/main/java/com/solaria/persistence/dto/response/ProposalResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/proposal/ProposalResponseDTO.java
similarity index 76%
rename from src/main/java/com/solaria/persistence/dto/response/ProposalResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/proposal/ProposalResponseDTO.java
index 3d18e90..0eae030 100644
--- a/src/main/java/com/solaria/persistence/dto/response/ProposalResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/proposal/ProposalResponseDTO.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.proposal;
-import com.solaria.persistence.domain.enums.ProposalStatus;
+import com.solaria.persistence.domain.enums.proposal.ProposalStatus;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/ProposalUnitResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/proposal/ProposalUnitResponseDTO.java
similarity index 69%
rename from src/main/java/com/solaria/persistence/dto/response/ProposalUnitResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/proposal/ProposalUnitResponseDTO.java
index 533873a..c3728e4 100644
--- a/src/main/java/com/solaria/persistence/dto/response/ProposalUnitResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/proposal/ProposalUnitResponseDTO.java
@@ -1,9 +1,10 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.proposal;
import lombok.Getter;
import lombok.Setter;
import java.util.UUID;
+import com.solaria.persistence.dto.response.unit.LocalUnitResponseDTO;
@Setter
@Getter
diff --git a/src/main/java/com/solaria/persistence/dto/response/AddressResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/shared/AddressResponseDTO.java
similarity index 89%
rename from src/main/java/com/solaria/persistence/dto/response/AddressResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/shared/AddressResponseDTO.java
index 8980a14..b87ee76 100644
--- a/src/main/java/com/solaria/persistence/dto/response/AddressResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/shared/AddressResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.shared;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/src/main/java/com/solaria/persistence/dto/response/ContactResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/shared/ContactResponseDTO.java
similarity index 78%
rename from src/main/java/com/solaria/persistence/dto/response/ContactResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/shared/ContactResponseDTO.java
index b43f27c..91a337a 100644
--- a/src/main/java/com/solaria/persistence/dto/response/ContactResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/shared/ContactResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.shared;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/FluxLogResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/shared/FluxLogResponseDTO.java
similarity index 83%
rename from src/main/java/com/solaria/persistence/dto/response/FluxLogResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/shared/FluxLogResponseDTO.java
index daac31e..5b1140a 100644
--- a/src/main/java/com/solaria/persistence/dto/response/FluxLogResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/shared/FluxLogResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.shared;
import java.time.OffsetDateTime;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/dto/response/GeolocalizationResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/shared/GeolocalizationResponseDTO.java
similarity index 84%
rename from src/main/java/com/solaria/persistence/dto/response/GeolocalizationResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/shared/GeolocalizationResponseDTO.java
index e289b25..cbd4e9c 100644
--- a/src/main/java/com/solaria/persistence/dto/response/GeolocalizationResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/shared/GeolocalizationResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.shared;
import java.math.BigDecimal;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/dto/response/EnergyBillResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/unit/EnergyBillResponseDTO.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/dto/response/EnergyBillResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/unit/EnergyBillResponseDTO.java
index f1ca229..7cc25eb 100644
--- a/src/main/java/com/solaria/persistence/dto/response/EnergyBillResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/unit/EnergyBillResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.unit;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/LocalUnitPhotoResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/unit/LocalUnitPhotoResponseDTO.java
similarity index 84%
rename from src/main/java/com/solaria/persistence/dto/response/LocalUnitPhotoResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/unit/LocalUnitPhotoResponseDTO.java
index fbe7eca..aaf92f5 100644
--- a/src/main/java/com/solaria/persistence/dto/response/LocalUnitPhotoResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/unit/LocalUnitPhotoResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.unit;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/dto/response/LocalUnitResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/unit/LocalUnitResponseDTO.java
similarity index 60%
rename from src/main/java/com/solaria/persistence/dto/response/LocalUnitResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/unit/LocalUnitResponseDTO.java
index cbb6324..70c1019 100644
--- a/src/main/java/com/solaria/persistence/dto/response/LocalUnitResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/unit/LocalUnitResponseDTO.java
@@ -1,10 +1,11 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.unit;
-import com.solaria.persistence.domain.enums.LocationType;
+import com.solaria.persistence.domain.enums.unit.LocationType;
import lombok.Getter;
import lombok.Setter;
import java.util.UUID;
+import com.solaria.persistence.dto.response.shared.AddressResponseDTO;
@Getter
@Setter
diff --git a/src/main/java/com/solaria/persistence/dto/response/UnitSpecificationsResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/unit/UnitSpecificationsResponseDTO.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/dto/response/UnitSpecificationsResponseDTO.java
rename to src/main/java/com/solaria/persistence/dto/response/unit/UnitSpecificationsResponseDTO.java
index 13f923d..f6bd9c6 100644
--- a/src/main/java/com/solaria/persistence/dto/response/UnitSpecificationsResponseDTO.java
+++ b/src/main/java/com/solaria/persistence/dto/response/unit/UnitSpecificationsResponseDTO.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.dto.response;
+package com.solaria.persistence.dto.response.unit;
import lombok.Getter;
import lombok.Setter;
diff --git a/src/main/java/com/solaria/persistence/openapi/InventoryOpenApi.java b/src/main/java/com/solaria/persistence/openapi/catalog/InventoryOpenApi.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/openapi/InventoryOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/catalog/InventoryOpenApi.java
index a630dff..70d4485 100644
--- a/src/main/java/com/solaria/persistence/openapi/InventoryOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/catalog/InventoryOpenApi.java
@@ -1,13 +1,13 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.catalog;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.patch.UpdateQuantityDTO;
-import com.solaria.persistence.dto.request.InventoryRequestDTO;
-import com.solaria.persistence.dto.response.InventoryResponseDTO;
+import com.solaria.persistence.dto.patch.catalog.UpdateQuantityDTO;
+import com.solaria.persistence.dto.request.catalog.InventoryRequestDTO;
+import com.solaria.persistence.dto.response.catalog.InventoryResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/ModelOpenApi.java b/src/main/java/com/solaria/persistence/openapi/catalog/ModelOpenApi.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/openapi/ModelOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/catalog/ModelOpenApi.java
index 2fb2680..f367ed4 100644
--- a/src/main/java/com/solaria/persistence/openapi/ModelOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/catalog/ModelOpenApi.java
@@ -1,13 +1,13 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.catalog;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.domain.enums.ModelStatus;
-import com.solaria.persistence.dto.request.ModelRequestDTO;
-import com.solaria.persistence.dto.response.ModelResponseDTO;
+import com.solaria.persistence.domain.enums.catalog.ModelStatus;
+import com.solaria.persistence.dto.request.catalog.ModelRequestDTO;
+import com.solaria.persistence.dto.response.catalog.ModelResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/ModelPhotoOpenApi.java b/src/main/java/com/solaria/persistence/openapi/catalog/ModelPhotoOpenApi.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/openapi/ModelPhotoOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/catalog/ModelPhotoOpenApi.java
index f121fde..72f5c42 100644
--- a/src/main/java/com/solaria/persistence/openapi/ModelPhotoOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/catalog/ModelPhotoOpenApi.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.catalog;
import java.util.List;
import java.util.UUID;
@@ -6,7 +6,7 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;
-import com.solaria.persistence.dto.response.ModelPhotoResponseDTO;
+import com.solaria.persistence.dto.response.catalog.ModelPhotoResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/OfferOpenApi.java b/src/main/java/com/solaria/persistence/openapi/catalog/OfferOpenApi.java
similarity index 94%
rename from src/main/java/com/solaria/persistence/openapi/OfferOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/catalog/OfferOpenApi.java
index 024dd90..2b5fbce 100644
--- a/src/main/java/com/solaria/persistence/openapi/OfferOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/catalog/OfferOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.catalog;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.OfferRequestDTO;
-import com.solaria.persistence.dto.response.OfferResponseDTO;
+import com.solaria.persistence.dto.request.catalog.OfferRequestDTO;
+import com.solaria.persistence.dto.response.catalog.OfferResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/SupplierOpenApi.java b/src/main/java/com/solaria/persistence/openapi/catalog/SupplierOpenApi.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/openapi/SupplierOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/catalog/SupplierOpenApi.java
index 94cac0a..6843797 100644
--- a/src/main/java/com/solaria/persistence/openapi/SupplierOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/catalog/SupplierOpenApi.java
@@ -1,14 +1,14 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.catalog;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.SupplierRequestDTO;
-import com.solaria.persistence.dto.request.SupplierSearchFilterDTO;
-import com.solaria.persistence.dto.response.SupplierResponseDTO;
-import com.solaria.persistence.dto.response.SupplierSearchResponseDTO;
+import com.solaria.persistence.dto.request.catalog.SupplierRequestDTO;
+import com.solaria.persistence.dto.request.catalog.SupplierSearchFilterDTO;
+import com.solaria.persistence.dto.response.catalog.SupplierResponseDTO;
+import com.solaria.persistence.dto.response.catalog.SupplierSearchResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/BusinessContactOpenApi.java b/src/main/java/com/solaria/persistence/openapi/company/BusinessContactOpenApi.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/openapi/BusinessContactOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/company/BusinessContactOpenApi.java
index 5728abc..1c61fa6 100644
--- a/src/main/java/com/solaria/persistence/openapi/BusinessContactOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/company/BusinessContactOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.company;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.BusinessContactRequestDTO;
-import com.solaria.persistence.dto.response.BusinessContactResponseDTO;
+import com.solaria.persistence.dto.request.company.BusinessContactRequestDTO;
+import com.solaria.persistence.dto.response.company.BusinessContactResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/ChargeOpenApi.java b/src/main/java/com/solaria/persistence/openapi/company/ChargeOpenApi.java
similarity index 94%
rename from src/main/java/com/solaria/persistence/openapi/ChargeOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/company/ChargeOpenApi.java
index 134c84e..0861b32 100644
--- a/src/main/java/com/solaria/persistence/openapi/ChargeOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/company/ChargeOpenApi.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.company;
import java.time.LocalDate;
import java.util.List;
@@ -6,9 +6,9 @@
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.domain.enums.PaymentMethod;
-import com.solaria.persistence.dto.request.ChargeRequestDTO;
-import com.solaria.persistence.dto.response.ChargeResponseDTO;
+import com.solaria.persistence.domain.enums.company.PaymentMethod;
+import com.solaria.persistence.dto.request.company.ChargeRequestDTO;
+import com.solaria.persistence.dto.response.company.ChargeResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/CompanyOpenApi.java b/src/main/java/com/solaria/persistence/openapi/company/CompanyOpenApi.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/openapi/CompanyOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/company/CompanyOpenApi.java
index f4da34a..87ed3f7 100644
--- a/src/main/java/com/solaria/persistence/openapi/CompanyOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/company/CompanyOpenApi.java
@@ -1,14 +1,14 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.company;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.patch.UpdateBusinessContactIdDTO;
-import com.solaria.persistence.dto.patch.UpdateCompanyAddressIdDTO;
-import com.solaria.persistence.dto.request.CompanyRequestDTO;
-import com.solaria.persistence.dto.response.CompanyResponseDTO;
+import com.solaria.persistence.dto.patch.company.UpdateBusinessContactIdDTO;
+import com.solaria.persistence.dto.patch.company.UpdateCompanyAddressIdDTO;
+import com.solaria.persistence.dto.request.company.CompanyRequestDTO;
+import com.solaria.persistence.dto.response.company.CompanyResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/CompanyPhotoOpenApi.java b/src/main/java/com/solaria/persistence/openapi/company/CompanyPhotoOpenApi.java
similarity index 89%
rename from src/main/java/com/solaria/persistence/openapi/CompanyPhotoOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/company/CompanyPhotoOpenApi.java
index c9d1b9a..5333cf5 100644
--- a/src/main/java/com/solaria/persistence/openapi/CompanyPhotoOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/company/CompanyPhotoOpenApi.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.company;
import java.util.List;
import java.util.UUID;
@@ -6,8 +6,8 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;
-import com.solaria.persistence.domain.enums.PhotoType;
-import com.solaria.persistence.dto.response.CompanyPhotoResponseDTO;
+import com.solaria.persistence.domain.enums.shared.PhotoType;
+import com.solaria.persistence.dto.response.company.CompanyPhotoResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/CompanyPlansOpenApi.java b/src/main/java/com/solaria/persistence/openapi/company/CompanyPlansOpenApi.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/openapi/CompanyPlansOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/company/CompanyPlansOpenApi.java
index 4f39688..f411e1c 100644
--- a/src/main/java/com/solaria/persistence/openapi/CompanyPlansOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/company/CompanyPlansOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.company;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.CompanyPlansRequestDTO;
-import com.solaria.persistence.dto.response.CompanyPlansResponseDTO;
+import com.solaria.persistence.dto.request.company.CompanyPlansRequestDTO;
+import com.solaria.persistence.dto.response.company.CompanyPlansResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/CompanyPositionsOpenApi.java b/src/main/java/com/solaria/persistence/openapi/company/CompanyPositionsOpenApi.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/openapi/CompanyPositionsOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/company/CompanyPositionsOpenApi.java
index 051e6da..6e50291 100644
--- a/src/main/java/com/solaria/persistence/openapi/CompanyPositionsOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/company/CompanyPositionsOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.company;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.CompanyPositionsRequestDTO;
-import com.solaria.persistence.dto.response.CompanyPositionsResponseDTO;
+import com.solaria.persistence.dto.request.company.CompanyPositionsRequestDTO;
+import com.solaria.persistence.dto.response.company.CompanyPositionsResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/SubscriptionOpenApi.java b/src/main/java/com/solaria/persistence/openapi/company/SubscriptionOpenApi.java
similarity index 95%
rename from src/main/java/com/solaria/persistence/openapi/SubscriptionOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/company/SubscriptionOpenApi.java
index 5ba4793..a36bb29 100644
--- a/src/main/java/com/solaria/persistence/openapi/SubscriptionOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/company/SubscriptionOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.company;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.SubscriptionRequestDTO;
-import com.solaria.persistence.dto.response.SubscriptionResponseDTO;
+import com.solaria.persistence.dto.request.company.SubscriptionRequestDTO;
+import com.solaria.persistence.dto.response.company.SubscriptionResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/RequesterOpenApi.java b/src/main/java/com/solaria/persistence/openapi/execution/RequesterOpenApi.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/openapi/RequesterOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/execution/RequesterOpenApi.java
index c5fb806..08ce999 100644
--- a/src/main/java/com/solaria/persistence/openapi/RequesterOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/execution/RequesterOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.execution;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.RequesterRequestDTO;
-import com.solaria.persistence.dto.response.RequesterResponseDTO;
+import com.solaria.persistence.dto.request.execution.RequesterRequestDTO;
+import com.solaria.persistence.dto.response.execution.RequesterResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/ServiceContractOpenApi.java b/src/main/java/com/solaria/persistence/openapi/execution/ServiceContractOpenApi.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/openapi/ServiceContractOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/execution/ServiceContractOpenApi.java
index 50412cb..e45db24 100644
--- a/src/main/java/com/solaria/persistence/openapi/ServiceContractOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/execution/ServiceContractOpenApi.java
@@ -1,11 +1,11 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.execution;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.ServiceContractRequestDTO;
-import com.solaria.persistence.dto.response.ServiceContractResponseDTO;
+import com.solaria.persistence.dto.request.execution.ServiceContractRequestDTO;
+import com.solaria.persistence.dto.response.execution.ServiceContractResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/ServiceExecutorOpenApi.java b/src/main/java/com/solaria/persistence/openapi/execution/ServiceExecutorOpenApi.java
similarity index 89%
rename from src/main/java/com/solaria/persistence/openapi/ServiceExecutorOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/execution/ServiceExecutorOpenApi.java
index 74b9376..57daf1c 100644
--- a/src/main/java/com/solaria/persistence/openapi/ServiceExecutorOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/execution/ServiceExecutorOpenApi.java
@@ -1,13 +1,13 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.execution;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.patch.UpdateFunctionDTO;
-import com.solaria.persistence.dto.request.ServiceExecutorRequestDTO;
-import com.solaria.persistence.dto.response.ServiceExecutorResponseDTO;
+import com.solaria.persistence.dto.patch.execution.UpdateFunctionDTO;
+import com.solaria.persistence.dto.request.execution.ServiceExecutorRequestDTO;
+import com.solaria.persistence.dto.response.execution.ServiceExecutorResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/TechnicalProjectOpenApi.java b/src/main/java/com/solaria/persistence/openapi/execution/TechnicalProjectOpenApi.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/openapi/TechnicalProjectOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/execution/TechnicalProjectOpenApi.java
index f7928b9..aeae3cc 100644
--- a/src/main/java/com/solaria/persistence/openapi/TechnicalProjectOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/execution/TechnicalProjectOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.execution;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.TechnicalProjectRequestDTO;
-import com.solaria.persistence.dto.response.TechnicalProjectResponseDTO;
+import com.solaria.persistence.dto.request.execution.TechnicalProjectRequestDTO;
+import com.solaria.persistence.dto.response.execution.TechnicalProjectResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/TechnicalServiceOpenApi.java b/src/main/java/com/solaria/persistence/openapi/execution/TechnicalServiceOpenApi.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/openapi/TechnicalServiceOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/execution/TechnicalServiceOpenApi.java
index 6f59f21..f2c8245 100644
--- a/src/main/java/com/solaria/persistence/openapi/TechnicalServiceOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/execution/TechnicalServiceOpenApi.java
@@ -1,15 +1,15 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.execution;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.patch.ServiceAcceptanceDTO;
-import com.solaria.persistence.dto.patch.ServiceScheduleDTO;
-import com.solaria.persistence.dto.patch.UpdatePurposeDTO;
-import com.solaria.persistence.dto.request.TechnicalServiceRequestDTO;
-import com.solaria.persistence.dto.response.TechnicalServiceResponseDTO;
+import com.solaria.persistence.dto.patch.execution.ServiceAcceptanceDTO;
+import com.solaria.persistence.dto.patch.execution.ServiceScheduleDTO;
+import com.solaria.persistence.dto.patch.execution.UpdatePurposeDTO;
+import com.solaria.persistence.dto.request.execution.TechnicalServiceRequestDTO;
+import com.solaria.persistence.dto.response.execution.TechnicalServiceResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/PermissionOpenApi.java b/src/main/java/com/solaria/persistence/openapi/identity/PermissionOpenApi.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/openapi/PermissionOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/identity/PermissionOpenApi.java
index 254bc52..0cd8edc 100644
--- a/src/main/java/com/solaria/persistence/openapi/PermissionOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/identity/PermissionOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.identity;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.PermissionRequestDTO;
-import com.solaria.persistence.dto.response.PermissionResponseDTO;
+import com.solaria.persistence.dto.request.identity.PermissionRequestDTO;
+import com.solaria.persistence.dto.response.identity.PermissionResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/PersonOpenApi.java b/src/main/java/com/solaria/persistence/openapi/identity/PersonOpenApi.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/openapi/PersonOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/identity/PersonOpenApi.java
index c3afa48..3de091e 100644
--- a/src/main/java/com/solaria/persistence/openapi/PersonOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/identity/PersonOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.identity;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.PersonRequestDTO;
-import com.solaria.persistence.dto.response.PersonResponseDTO;
+import com.solaria.persistence.dto.request.identity.PersonRequestDTO;
+import com.solaria.persistence.dto.response.identity.PersonResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/PositionOpenApi.java b/src/main/java/com/solaria/persistence/openapi/identity/PositionOpenApi.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/openapi/PositionOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/identity/PositionOpenApi.java
index 4d625d5..ab20057 100644
--- a/src/main/java/com/solaria/persistence/openapi/PositionOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/identity/PositionOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.identity;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.PositionRequestDTO;
-import com.solaria.persistence.dto.response.PositionResponseDTO;
+import com.solaria.persistence.dto.request.identity.PositionRequestDTO;
+import com.solaria.persistence.dto.response.identity.PositionResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/PositionPermissionOpenApi.java b/src/main/java/com/solaria/persistence/openapi/identity/PositionPermissionOpenApi.java
similarity index 89%
rename from src/main/java/com/solaria/persistence/openapi/PositionPermissionOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/identity/PositionPermissionOpenApi.java
index 3b5392b..076aaa5 100644
--- a/src/main/java/com/solaria/persistence/openapi/PositionPermissionOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/identity/PositionPermissionOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.identity;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.PositionPermissionRequestDTO;
-import com.solaria.persistence.dto.response.PositionPermissionResponseDTO;
+import com.solaria.persistence.dto.request.identity.PositionPermissionRequestDTO;
+import com.solaria.persistence.dto.response.identity.PositionPermissionResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/UserCompanyOpenApi.java b/src/main/java/com/solaria/persistence/openapi/identity/UserCompanyOpenApi.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/openapi/UserCompanyOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/identity/UserCompanyOpenApi.java
index 5b543e2..88cf225 100644
--- a/src/main/java/com/solaria/persistence/openapi/UserCompanyOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/identity/UserCompanyOpenApi.java
@@ -1,13 +1,13 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.identity;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.patch.UpdatePositionDTO;
-import com.solaria.persistence.dto.request.UserCompanyRequestDTO;
-import com.solaria.persistence.dto.response.UserCompanyResponseDTO;
+import com.solaria.persistence.dto.patch.identity.UpdatePositionDTO;
+import com.solaria.persistence.dto.request.identity.UserCompanyRequestDTO;
+import com.solaria.persistence.dto.response.identity.UserCompanyResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/UserOpenApi.java b/src/main/java/com/solaria/persistence/openapi/identity/UserOpenApi.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/openapi/UserOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/identity/UserOpenApi.java
index 655d91c..838836f 100644
--- a/src/main/java/com/solaria/persistence/openapi/UserOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/identity/UserOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.identity;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.UserRequestDTO;
-import com.solaria.persistence.dto.response.UserResponseDTO;
+import com.solaria.persistence.dto.request.identity.UserRequestDTO;
+import com.solaria.persistence.dto.response.identity.UserResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/UserPhotoOpenApi.java b/src/main/java/com/solaria/persistence/openapi/identity/UserPhotoOpenApi.java
similarity index 89%
rename from src/main/java/com/solaria/persistence/openapi/UserPhotoOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/identity/UserPhotoOpenApi.java
index 65d958c..ec5e355 100644
--- a/src/main/java/com/solaria/persistence/openapi/UserPhotoOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/identity/UserPhotoOpenApi.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.identity;
import java.util.List;
import java.util.UUID;
@@ -6,8 +6,8 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;
-import com.solaria.persistence.domain.enums.PhotoType;
-import com.solaria.persistence.dto.response.UserPhotoResponseDTO;
+import com.solaria.persistence.domain.enums.shared.PhotoType;
+import com.solaria.persistence.dto.response.identity.UserPhotoResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/CertificationOpenApi.java b/src/main/java/com/solaria/persistence/openapi/professional/CertificationOpenApi.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/openapi/CertificationOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/professional/CertificationOpenApi.java
index d7adbcf..724d262 100644
--- a/src/main/java/com/solaria/persistence/openapi/CertificationOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/professional/CertificationOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.professional;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.CertificationRequestDTO;
-import com.solaria.persistence.dto.response.CertificationResponseDTO;
+import com.solaria.persistence.dto.request.professional.CertificationRequestDTO;
+import com.solaria.persistence.dto.response.professional.CertificationResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/CertificationRecordOpenApi.java b/src/main/java/com/solaria/persistence/openapi/professional/CertificationRecordOpenApi.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/openapi/CertificationRecordOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/professional/CertificationRecordOpenApi.java
index ba6a94c..5db358f 100644
--- a/src/main/java/com/solaria/persistence/openapi/CertificationRecordOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/professional/CertificationRecordOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.professional;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.CertificationRecordRequestDTO;
-import com.solaria.persistence.dto.response.CertificationRecordResponseDTO;
+import com.solaria.persistence.dto.request.professional.CertificationRecordRequestDTO;
+import com.solaria.persistence.dto.response.professional.CertificationRecordResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/ProfessionOpenApi.java b/src/main/java/com/solaria/persistence/openapi/professional/ProfessionOpenApi.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/openapi/ProfessionOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/professional/ProfessionOpenApi.java
index 6705933..e4ce0bd 100644
--- a/src/main/java/com/solaria/persistence/openapi/ProfessionOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/professional/ProfessionOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.professional;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.ProfessionRequestDTO;
-import com.solaria.persistence.dto.response.ProfessionResponseDTO;
+import com.solaria.persistence.dto.request.professional.ProfessionRequestDTO;
+import com.solaria.persistence.dto.response.professional.ProfessionResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/ProfessionalRegistrationOpenApi.java b/src/main/java/com/solaria/persistence/openapi/professional/ProfessionalRegistrationOpenApi.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/openapi/ProfessionalRegistrationOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/professional/ProfessionalRegistrationOpenApi.java
index ad026c9..91475d1 100644
--- a/src/main/java/com/solaria/persistence/openapi/ProfessionalRegistrationOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/professional/ProfessionalRegistrationOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.professional;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.ProfessionalRegistrationRequestDTO;
-import com.solaria.persistence.dto.response.ProfessionalRegistrationResponseDTO;
+import com.solaria.persistence.dto.request.professional.ProfessionalRegistrationRequestDTO;
+import com.solaria.persistence.dto.response.professional.ProfessionalRegistrationResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/ProfessionalReviewOpenApi.java b/src/main/java/com/solaria/persistence/openapi/professional/ProfessionalReviewOpenApi.java
similarity index 90%
rename from src/main/java/com/solaria/persistence/openapi/ProfessionalReviewOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/professional/ProfessionalReviewOpenApi.java
index 87190ab..df97458 100644
--- a/src/main/java/com/solaria/persistence/openapi/ProfessionalReviewOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/professional/ProfessionalReviewOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.professional;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.ProfessionalReviewRequestDTO;
-import com.solaria.persistence.dto.response.ProfessionalReviewResponseDTO;
+import com.solaria.persistence.dto.request.professional.ProfessionalReviewRequestDTO;
+import com.solaria.persistence.dto.response.professional.ProfessionalReviewResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/ShiftOpenApi.java b/src/main/java/com/solaria/persistence/openapi/professional/ShiftOpenApi.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/openapi/ShiftOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/professional/ShiftOpenApi.java
index 133af62..a6eb08d 100644
--- a/src/main/java/com/solaria/persistence/openapi/ShiftOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/professional/ShiftOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.professional;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.ShiftRequestDTO;
-import com.solaria.persistence.dto.response.ShiftResponseDTO;
+import com.solaria.persistence.dto.request.professional.ShiftRequestDTO;
+import com.solaria.persistence.dto.response.professional.ShiftResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/TechnicalCourseOpenApi.java b/src/main/java/com/solaria/persistence/openapi/professional/TechnicalCourseOpenApi.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/openapi/TechnicalCourseOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/professional/TechnicalCourseOpenApi.java
index 5976117..29974a5 100644
--- a/src/main/java/com/solaria/persistence/openapi/TechnicalCourseOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/professional/TechnicalCourseOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.professional;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.TechnicalCourseRequestDTO;
-import com.solaria.persistence.dto.response.TechnicalCourseResponseDTO;
+import com.solaria.persistence.dto.request.professional.TechnicalCourseRequestDTO;
+import com.solaria.persistence.dto.response.professional.TechnicalCourseResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/TechnicianAffiliationOpenApi.java b/src/main/java/com/solaria/persistence/openapi/professional/TechnicianAffiliationOpenApi.java
similarity index 90%
rename from src/main/java/com/solaria/persistence/openapi/TechnicianAffiliationOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/professional/TechnicianAffiliationOpenApi.java
index c81388f..b081d64 100644
--- a/src/main/java/com/solaria/persistence/openapi/TechnicianAffiliationOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/professional/TechnicianAffiliationOpenApi.java
@@ -1,14 +1,14 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.professional;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.patch.UpdateActiveDTO;
-import com.solaria.persistence.dto.patch.UpdateTypeDTO;
-import com.solaria.persistence.dto.request.TechnicianAffiliationRequestDTO;
-import com.solaria.persistence.dto.response.TechnicianAffiliationResponseDTO;
+import com.solaria.persistence.dto.patch.professional.UpdateActiveDTO;
+import com.solaria.persistence.dto.patch.professional.UpdateTypeDTO;
+import com.solaria.persistence.dto.request.professional.TechnicianAffiliationRequestDTO;
+import com.solaria.persistence.dto.response.professional.TechnicianAffiliationResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/TechnicianOpenApi.java b/src/main/java/com/solaria/persistence/openapi/professional/TechnicianOpenApi.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/openapi/TechnicianOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/professional/TechnicianOpenApi.java
index 4e92508..501b258 100644
--- a/src/main/java/com/solaria/persistence/openapi/TechnicianOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/professional/TechnicianOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.professional;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.TechnicianRequestDTO;
-import com.solaria.persistence.dto.response.TechnicianResponseDTO;
+import com.solaria.persistence.dto.request.professional.TechnicianRequestDTO;
+import com.solaria.persistence.dto.response.professional.TechnicianResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/ProposalItemOpenApi.java b/src/main/java/com/solaria/persistence/openapi/proposal/ProposalItemOpenApi.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/openapi/ProposalItemOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/proposal/ProposalItemOpenApi.java
index 243a22d..6ef7e3a 100644
--- a/src/main/java/com/solaria/persistence/openapi/ProposalItemOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/proposal/ProposalItemOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.proposal;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.ProposalItemRequestDTO;
-import com.solaria.persistence.dto.response.ProposalItemResponseDTO;
+import com.solaria.persistence.dto.request.proposal.ProposalItemRequestDTO;
+import com.solaria.persistence.dto.response.proposal.ProposalItemResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/ProposalOpenApi.java b/src/main/java/com/solaria/persistence/openapi/proposal/ProposalOpenApi.java
similarity index 96%
rename from src/main/java/com/solaria/persistence/openapi/ProposalOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/proposal/ProposalOpenApi.java
index dd60a30..8d6508f 100644
--- a/src/main/java/com/solaria/persistence/openapi/ProposalOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/proposal/ProposalOpenApi.java
@@ -1,13 +1,13 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.proposal;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.patch.UpdateNotesDTO;
-import com.solaria.persistence.dto.request.ProposalRequestDTO;
-import com.solaria.persistence.dto.response.ProposalResponseDTO;
+import com.solaria.persistence.dto.patch.proposal.UpdateNotesDTO;
+import com.solaria.persistence.dto.request.proposal.ProposalRequestDTO;
+import com.solaria.persistence.dto.response.proposal.ProposalResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/ProposalUnitOpenApi.java b/src/main/java/com/solaria/persistence/openapi/proposal/ProposalUnitOpenApi.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/openapi/ProposalUnitOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/proposal/ProposalUnitOpenApi.java
index f0e3cc1..081b0da 100644
--- a/src/main/java/com/solaria/persistence/openapi/ProposalUnitOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/proposal/ProposalUnitOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.proposal;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.ProposalUnitRequestDTO;
-import com.solaria.persistence.dto.response.ProposalUnitResponseDTO;
+import com.solaria.persistence.dto.request.proposal.ProposalUnitRequestDTO;
+import com.solaria.persistence.dto.response.proposal.ProposalUnitResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/AddressOpenApi.java b/src/main/java/com/solaria/persistence/openapi/shared/AddressOpenApi.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/openapi/AddressOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/shared/AddressOpenApi.java
index 81dbd89..9f50204 100644
--- a/src/main/java/com/solaria/persistence/openapi/AddressOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/shared/AddressOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.shared;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.AddressRequestDTO;
-import com.solaria.persistence.dto.response.AddressResponseDTO;
+import com.solaria.persistence.dto.request.shared.AddressRequestDTO;
+import com.solaria.persistence.dto.response.shared.AddressResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/ContactOpenApi.java b/src/main/java/com/solaria/persistence/openapi/shared/ContactOpenApi.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/openapi/ContactOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/shared/ContactOpenApi.java
index a92543c..f9db8ea 100644
--- a/src/main/java/com/solaria/persistence/openapi/ContactOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/shared/ContactOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.shared;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.ContactRequestDTO;
-import com.solaria.persistence.dto.response.ContactResponseDTO;
+import com.solaria.persistence.dto.request.shared.ContactRequestDTO;
+import com.solaria.persistence.dto.response.shared.ContactResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/FluxLogOpenApi.java b/src/main/java/com/solaria/persistence/openapi/shared/FluxLogOpenApi.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/openapi/FluxLogOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/shared/FluxLogOpenApi.java
index 37a5a4b..5923889 100644
--- a/src/main/java/com/solaria/persistence/openapi/FluxLogOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/shared/FluxLogOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.shared;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.FluxLogRequestDTO;
-import com.solaria.persistence.dto.response.FluxLogResponseDTO;
+import com.solaria.persistence.dto.request.shared.FluxLogRequestDTO;
+import com.solaria.persistence.dto.response.shared.FluxLogResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/GeolocalizationOpenApi.java b/src/main/java/com/solaria/persistence/openapi/shared/GeolocalizationOpenApi.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/openapi/GeolocalizationOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/shared/GeolocalizationOpenApi.java
index 8b29f2f..33ab5fb 100644
--- a/src/main/java/com/solaria/persistence/openapi/GeolocalizationOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/shared/GeolocalizationOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.shared;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.GeolocalizationRequestDTO;
-import com.solaria.persistence.dto.response.GeolocalizationResponseDTO;
+import com.solaria.persistence.dto.request.shared.GeolocalizationRequestDTO;
+import com.solaria.persistence.dto.response.shared.GeolocalizationResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/EnergyBillOpenApi.java b/src/main/java/com/solaria/persistence/openapi/unit/EnergyBillOpenApi.java
similarity index 94%
rename from src/main/java/com/solaria/persistence/openapi/EnergyBillOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/unit/EnergyBillOpenApi.java
index e5f74af..861631d 100644
--- a/src/main/java/com/solaria/persistence/openapi/EnergyBillOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/unit/EnergyBillOpenApi.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.unit;
import java.util.List;
import java.util.UUID;
@@ -6,8 +6,8 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;
-import com.solaria.persistence.dto.request.EnergyBillRequestDTO;
-import com.solaria.persistence.dto.response.EnergyBillResponseDTO;
+import com.solaria.persistence.dto.request.unit.EnergyBillRequestDTO;
+import com.solaria.persistence.dto.response.unit.EnergyBillResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/LocalUnitOpenApi.java b/src/main/java/com/solaria/persistence/openapi/unit/LocalUnitOpenApi.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/openapi/LocalUnitOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/unit/LocalUnitOpenApi.java
index da2531b..bc71636 100644
--- a/src/main/java/com/solaria/persistence/openapi/LocalUnitOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/unit/LocalUnitOpenApi.java
@@ -1,13 +1,13 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.unit;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.patch.UpdateLocalUnitAddressIdDTO;
-import com.solaria.persistence.dto.request.LocalUnitRequestDTO;
-import com.solaria.persistence.dto.response.LocalUnitResponseDTO;
+import com.solaria.persistence.dto.patch.unit.UpdateLocalUnitAddressIdDTO;
+import com.solaria.persistence.dto.request.unit.LocalUnitRequestDTO;
+import com.solaria.persistence.dto.response.unit.LocalUnitResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/LocalUnitPhotoOpenApi.java b/src/main/java/com/solaria/persistence/openapi/unit/LocalUnitPhotoOpenApi.java
similarity index 93%
rename from src/main/java/com/solaria/persistence/openapi/LocalUnitPhotoOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/unit/LocalUnitPhotoOpenApi.java
index e706772..69a22e8 100644
--- a/src/main/java/com/solaria/persistence/openapi/LocalUnitPhotoOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/unit/LocalUnitPhotoOpenApi.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.unit;
import java.util.List;
import java.util.UUID;
@@ -6,7 +6,7 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;
-import com.solaria.persistence.dto.response.LocalUnitPhotoResponseDTO;
+import com.solaria.persistence.dto.response.unit.LocalUnitPhotoResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/openapi/UnitSpecificationsOpenApi.java b/src/main/java/com/solaria/persistence/openapi/unit/UnitSpecificationsOpenApi.java
similarity index 90%
rename from src/main/java/com/solaria/persistence/openapi/UnitSpecificationsOpenApi.java
rename to src/main/java/com/solaria/persistence/openapi/unit/UnitSpecificationsOpenApi.java
index bc8b163..4a7808b 100644
--- a/src/main/java/com/solaria/persistence/openapi/UnitSpecificationsOpenApi.java
+++ b/src/main/java/com/solaria/persistence/openapi/unit/UnitSpecificationsOpenApi.java
@@ -1,12 +1,12 @@
-package com.solaria.persistence.openapi;
+package com.solaria.persistence.openapi.unit;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
-import com.solaria.persistence.dto.request.UnitSpecificationsRequestDTO;
-import com.solaria.persistence.dto.response.UnitSpecificationsResponseDTO;
+import com.solaria.persistence.dto.request.unit.UnitSpecificationsRequestDTO;
+import com.solaria.persistence.dto.response.unit.UnitSpecificationsResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
diff --git a/src/main/java/com/solaria/persistence/repository/InventoryRepository.java b/src/main/java/com/solaria/persistence/repository/catalog/InventoryRepository.java
similarity index 90%
rename from src/main/java/com/solaria/persistence/repository/InventoryRepository.java
rename to src/main/java/com/solaria/persistence/repository/catalog/InventoryRepository.java
index 1f3defa..88b4278 100644
--- a/src/main/java/com/solaria/persistence/repository/InventoryRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/catalog/InventoryRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.catalog;
-import com.solaria.persistence.domain.entity.Inventory;
+import com.solaria.persistence.domain.entity.catalog.Inventory;
import jakarta.persistence.LockModeType;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Lock;
diff --git a/src/main/java/com/solaria/persistence/repository/ModelPhotoRepository.java b/src/main/java/com/solaria/persistence/repository/catalog/ModelPhotoRepository.java
similarity index 77%
rename from src/main/java/com/solaria/persistence/repository/ModelPhotoRepository.java
rename to src/main/java/com/solaria/persistence/repository/catalog/ModelPhotoRepository.java
index 842bfea..a9ba195 100644
--- a/src/main/java/com/solaria/persistence/repository/ModelPhotoRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/catalog/ModelPhotoRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.catalog;
-import com.solaria.persistence.domain.entity.ModelPhoto;
+import com.solaria.persistence.domain.entity.catalog.ModelPhoto;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/ModelRepository.java b/src/main/java/com/solaria/persistence/repository/catalog/ModelRepository.java
similarity index 57%
rename from src/main/java/com/solaria/persistence/repository/ModelRepository.java
rename to src/main/java/com/solaria/persistence/repository/catalog/ModelRepository.java
index fd0b62b..cfc6e5a 100644
--- a/src/main/java/com/solaria/persistence/repository/ModelRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/catalog/ModelRepository.java
@@ -1,7 +1,7 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.catalog;
-import com.solaria.persistence.domain.entity.Model;
-import com.solaria.persistence.domain.enums.ModelStatus;
+import com.solaria.persistence.domain.entity.catalog.Model;
+import com.solaria.persistence.domain.enums.catalog.ModelStatus;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/OfferRepository.java b/src/main/java/com/solaria/persistence/repository/catalog/OfferRepository.java
similarity index 84%
rename from src/main/java/com/solaria/persistence/repository/OfferRepository.java
rename to src/main/java/com/solaria/persistence/repository/catalog/OfferRepository.java
index ca7db10..eeb5e85 100644
--- a/src/main/java/com/solaria/persistence/repository/OfferRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/catalog/OfferRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.catalog;
-import com.solaria.persistence.domain.entity.Offer;
+import com.solaria.persistence.domain.entity.catalog.Offer;
import org.springframework.data.jpa.repository.JpaRepository;
import java.time.OffsetDateTime;
diff --git a/src/main/java/com/solaria/persistence/repository/OfferTranslationRepository.java b/src/main/java/com/solaria/persistence/repository/catalog/OfferTranslationRepository.java
similarity index 78%
rename from src/main/java/com/solaria/persistence/repository/OfferTranslationRepository.java
rename to src/main/java/com/solaria/persistence/repository/catalog/OfferTranslationRepository.java
index 3270c10..9ce1465 100644
--- a/src/main/java/com/solaria/persistence/repository/OfferTranslationRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/catalog/OfferTranslationRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.catalog;
-import com.solaria.persistence.domain.entity.OfferTranslation;
+import com.solaria.persistence.domain.entity.catalog.OfferTranslation;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/SupplierRepository.java b/src/main/java/com/solaria/persistence/repository/catalog/SupplierRepository.java
similarity index 81%
rename from src/main/java/com/solaria/persistence/repository/SupplierRepository.java
rename to src/main/java/com/solaria/persistence/repository/catalog/SupplierRepository.java
index e8ed130..bc9cb04 100644
--- a/src/main/java/com/solaria/persistence/repository/SupplierRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/catalog/SupplierRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.catalog;
-import com.solaria.persistence.domain.entity.Supplier;
+import com.solaria.persistence.domain.entity.catalog.Supplier;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
diff --git a/src/main/java/com/solaria/persistence/repository/BusinessContactRepository.java b/src/main/java/com/solaria/persistence/repository/company/BusinessContactRepository.java
similarity index 59%
rename from src/main/java/com/solaria/persistence/repository/BusinessContactRepository.java
rename to src/main/java/com/solaria/persistence/repository/company/BusinessContactRepository.java
index cfe4f55..9b1f2ff 100644
--- a/src/main/java/com/solaria/persistence/repository/BusinessContactRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/company/BusinessContactRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.company;
-import com.solaria.persistence.domain.entity.BusinessContact;
+import com.solaria.persistence.domain.entity.company.BusinessContact;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/repository/ChargeRepository.java b/src/main/java/com/solaria/persistence/repository/company/ChargeRepository.java
similarity index 79%
rename from src/main/java/com/solaria/persistence/repository/ChargeRepository.java
rename to src/main/java/com/solaria/persistence/repository/company/ChargeRepository.java
index e6948d9..da4609b 100644
--- a/src/main/java/com/solaria/persistence/repository/ChargeRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/company/ChargeRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.company;
-import com.solaria.persistence.domain.entity.Charge;
+import com.solaria.persistence.domain.entity.company.Charge;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/CompanyPhotoRepository.java b/src/main/java/com/solaria/persistence/repository/company/CompanyPhotoRepository.java
similarity index 70%
rename from src/main/java/com/solaria/persistence/repository/CompanyPhotoRepository.java
rename to src/main/java/com/solaria/persistence/repository/company/CompanyPhotoRepository.java
index 7fdf0cb..e06ca6b 100644
--- a/src/main/java/com/solaria/persistence/repository/CompanyPhotoRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/company/CompanyPhotoRepository.java
@@ -1,7 +1,7 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.company;
-import com.solaria.persistence.domain.entity.CompanyPhoto;
-import com.solaria.persistence.domain.enums.PhotoType;
+import com.solaria.persistence.domain.entity.company.CompanyPhoto;
+import com.solaria.persistence.domain.enums.shared.PhotoType;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/CompanyPlansRepository.java b/src/main/java/com/solaria/persistence/repository/company/CompanyPlansRepository.java
similarity index 59%
rename from src/main/java/com/solaria/persistence/repository/CompanyPlansRepository.java
rename to src/main/java/com/solaria/persistence/repository/company/CompanyPlansRepository.java
index 2fd2fe2..665038f 100644
--- a/src/main/java/com/solaria/persistence/repository/CompanyPlansRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/company/CompanyPlansRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.company;
-import com.solaria.persistence.domain.entity.CompanyPlans;
+import com.solaria.persistence.domain.entity.company.CompanyPlans;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/repository/CompanyPositionsRepository.java b/src/main/java/com/solaria/persistence/repository/company/CompanyPositionsRepository.java
similarity index 81%
rename from src/main/java/com/solaria/persistence/repository/CompanyPositionsRepository.java
rename to src/main/java/com/solaria/persistence/repository/company/CompanyPositionsRepository.java
index 9c280fd..8e4ee23 100644
--- a/src/main/java/com/solaria/persistence/repository/CompanyPositionsRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/company/CompanyPositionsRepository.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.company;
import java.util.List;
import java.util.Optional;
@@ -6,7 +6,7 @@
import org.springframework.data.jpa.repository.JpaRepository;
-import com.solaria.persistence.domain.entity.CompanyPositions;
+import com.solaria.persistence.domain.entity.company.CompanyPositions;
public interface CompanyPositionsRepository extends JpaRepository {
diff --git a/src/main/java/com/solaria/persistence/repository/CompanyRepository.java b/src/main/java/com/solaria/persistence/repository/company/CompanyRepository.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/repository/CompanyRepository.java
rename to src/main/java/com/solaria/persistence/repository/company/CompanyRepository.java
index 70a19ac..bd45b5a 100644
--- a/src/main/java/com/solaria/persistence/repository/CompanyRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/company/CompanyRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.company;
-import com.solaria.persistence.domain.entity.Company;
+import com.solaria.persistence.domain.entity.company.Company;
import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.data.jpa.repository.JpaRepository;
diff --git a/src/main/java/com/solaria/persistence/repository/SubscriptionRepository.java b/src/main/java/com/solaria/persistence/repository/company/SubscriptionRepository.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/repository/SubscriptionRepository.java
rename to src/main/java/com/solaria/persistence/repository/company/SubscriptionRepository.java
index d74c75d..b8a7c7c 100644
--- a/src/main/java/com/solaria/persistence/repository/SubscriptionRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/company/SubscriptionRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.company;
-import com.solaria.persistence.domain.entity.Subscription;
+import com.solaria.persistence.domain.entity.company.Subscription;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
@@ -32,7 +32,7 @@ void callGenerateSubscriptionCharge(@Param("subscriptionId") UUID subscriptionId
boolean existsByPlanId(UUID planId);
@org.springframework.data.jpa.repository.Query("SELECT CASE WHEN COUNT(s) > 0 THEN true ELSE false END " +
- "FROM Subscription s WHERE s.supplier.id = :supplierId AND s.status = com.solaria.persistence.domain.enums.SubscriptionStatus.PAID " +
+ "FROM Subscription s WHERE s.supplier.id = :supplierId AND s.status = com.solaria.persistence.domain.enums.company.SubscriptionStatus.PAID " +
"AND (s.endDate IS NULL OR s.endDate > :now)")
boolean hasActiveSubscription(@Param("supplierId") UUID supplierId, @Param("now") OffsetDateTime now);
}
diff --git a/src/main/java/com/solaria/persistence/repository/RequesterRepository.java b/src/main/java/com/solaria/persistence/repository/execution/RequesterRepository.java
similarity index 76%
rename from src/main/java/com/solaria/persistence/repository/RequesterRepository.java
rename to src/main/java/com/solaria/persistence/repository/execution/RequesterRepository.java
index e39e613..4f3a892 100644
--- a/src/main/java/com/solaria/persistence/repository/RequesterRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/execution/RequesterRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.execution;
-import com.solaria.persistence.domain.entity.Requester;
+import com.solaria.persistence.domain.entity.execution.Requester;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/ServiceContractRepository.java b/src/main/java/com/solaria/persistence/repository/execution/ServiceContractRepository.java
similarity index 77%
rename from src/main/java/com/solaria/persistence/repository/ServiceContractRepository.java
rename to src/main/java/com/solaria/persistence/repository/execution/ServiceContractRepository.java
index 36ab47c..f9a609d 100644
--- a/src/main/java/com/solaria/persistence/repository/ServiceContractRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/execution/ServiceContractRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.execution;
-import com.solaria.persistence.domain.entity.ServiceContract;
+import com.solaria.persistence.domain.entity.execution.ServiceContract;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
diff --git a/src/main/java/com/solaria/persistence/repository/ServiceExecutorRepository.java b/src/main/java/com/solaria/persistence/repository/execution/ServiceExecutorRepository.java
similarity index 80%
rename from src/main/java/com/solaria/persistence/repository/ServiceExecutorRepository.java
rename to src/main/java/com/solaria/persistence/repository/execution/ServiceExecutorRepository.java
index e6de5ca..f28a093 100644
--- a/src/main/java/com/solaria/persistence/repository/ServiceExecutorRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/execution/ServiceExecutorRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.execution;
-import com.solaria.persistence.domain.entity.ServiceExecutor;
+import com.solaria.persistence.domain.entity.execution.ServiceExecutor;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/TechnicalProjectRepository.java b/src/main/java/com/solaria/persistence/repository/execution/TechnicalProjectRepository.java
similarity index 80%
rename from src/main/java/com/solaria/persistence/repository/TechnicalProjectRepository.java
rename to src/main/java/com/solaria/persistence/repository/execution/TechnicalProjectRepository.java
index f0fd666..2086beb 100644
--- a/src/main/java/com/solaria/persistence/repository/TechnicalProjectRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/execution/TechnicalProjectRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.execution;
-import com.solaria.persistence.domain.entity.TechnicalProject;
+import com.solaria.persistence.domain.entity.execution.TechnicalProject;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/TechnicalServiceRepository.java b/src/main/java/com/solaria/persistence/repository/execution/TechnicalServiceRepository.java
similarity index 77%
rename from src/main/java/com/solaria/persistence/repository/TechnicalServiceRepository.java
rename to src/main/java/com/solaria/persistence/repository/execution/TechnicalServiceRepository.java
index 5a41db7..f6aea79 100644
--- a/src/main/java/com/solaria/persistence/repository/TechnicalServiceRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/execution/TechnicalServiceRepository.java
@@ -1,7 +1,7 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.execution;
-import com.solaria.persistence.domain.entity.TechnicalService;
-import com.solaria.persistence.domain.enums.ServiceStatus;
+import com.solaria.persistence.domain.entity.execution.TechnicalService;
+import com.solaria.persistence.domain.enums.execution.ServiceStatus;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/PermissionRepository.java b/src/main/java/com/solaria/persistence/repository/identity/PermissionRepository.java
similarity index 72%
rename from src/main/java/com/solaria/persistence/repository/PermissionRepository.java
rename to src/main/java/com/solaria/persistence/repository/identity/PermissionRepository.java
index 0b9e385..1204ef6 100644
--- a/src/main/java/com/solaria/persistence/repository/PermissionRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/identity/PermissionRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.identity;
-import com.solaria.persistence.domain.entity.Permission;
+import com.solaria.persistence.domain.entity.identity.Permission;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/repository/PersonRepository.java b/src/main/java/com/solaria/persistence/repository/identity/PersonRepository.java
similarity index 75%
rename from src/main/java/com/solaria/persistence/repository/PersonRepository.java
rename to src/main/java/com/solaria/persistence/repository/identity/PersonRepository.java
index b9fb04e..6ea8094 100644
--- a/src/main/java/com/solaria/persistence/repository/PersonRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/identity/PersonRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.identity;
-import com.solaria.persistence.domain.entity.Person;
+import com.solaria.persistence.domain.entity.identity.Person;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/repository/PositionPermissionRepository.java b/src/main/java/com/solaria/persistence/repository/identity/PositionPermissionRepository.java
similarity index 81%
rename from src/main/java/com/solaria/persistence/repository/PositionPermissionRepository.java
rename to src/main/java/com/solaria/persistence/repository/identity/PositionPermissionRepository.java
index 36ada02..2e4add2 100644
--- a/src/main/java/com/solaria/persistence/repository/PositionPermissionRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/identity/PositionPermissionRepository.java
@@ -1,11 +1,11 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.identity;
import java.util.List;
import java.util.UUID;
import org.springframework.data.jpa.repository.JpaRepository;
-import com.solaria.persistence.domain.entity.PositionPermission;
+import com.solaria.persistence.domain.entity.identity.PositionPermission;
public interface PositionPermissionRepository extends JpaRepository {
diff --git a/src/main/java/com/solaria/persistence/repository/PositionRepository.java b/src/main/java/com/solaria/persistence/repository/identity/PositionRepository.java
similarity index 58%
rename from src/main/java/com/solaria/persistence/repository/PositionRepository.java
rename to src/main/java/com/solaria/persistence/repository/identity/PositionRepository.java
index b73782b..c7f5044 100644
--- a/src/main/java/com/solaria/persistence/repository/PositionRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/identity/PositionRepository.java
@@ -1,10 +1,10 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.identity;
import java.util.UUID;
import org.springframework.data.jpa.repository.JpaRepository;
-import com.solaria.persistence.domain.entity.Position;
+import com.solaria.persistence.domain.entity.identity.Position;
public interface PositionRepository extends JpaRepository {
diff --git a/src/main/java/com/solaria/persistence/repository/UserCompanyRepository.java b/src/main/java/com/solaria/persistence/repository/identity/UserCompanyRepository.java
similarity index 83%
rename from src/main/java/com/solaria/persistence/repository/UserCompanyRepository.java
rename to src/main/java/com/solaria/persistence/repository/identity/UserCompanyRepository.java
index 233bc44..921932c 100644
--- a/src/main/java/com/solaria/persistence/repository/UserCompanyRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/identity/UserCompanyRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.identity;
-import com.solaria.persistence.domain.entity.UserCompany;
+import com.solaria.persistence.domain.entity.identity.UserCompany;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/UserPhotoRepository.java b/src/main/java/com/solaria/persistence/repository/identity/UserPhotoRepository.java
similarity index 68%
rename from src/main/java/com/solaria/persistence/repository/UserPhotoRepository.java
rename to src/main/java/com/solaria/persistence/repository/identity/UserPhotoRepository.java
index ac22237..47f59c4 100644
--- a/src/main/java/com/solaria/persistence/repository/UserPhotoRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/identity/UserPhotoRepository.java
@@ -1,7 +1,7 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.identity;
-import com.solaria.persistence.domain.entity.UserPhoto;
-import com.solaria.persistence.domain.enums.PhotoType;
+import com.solaria.persistence.domain.entity.identity.UserPhoto;
+import com.solaria.persistence.domain.enums.shared.PhotoType;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/UserRepository.java b/src/main/java/com/solaria/persistence/repository/identity/UserRepository.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/repository/UserRepository.java
rename to src/main/java/com/solaria/persistence/repository/identity/UserRepository.java
index 00f2052..5e40a19 100644
--- a/src/main/java/com/solaria/persistence/repository/UserRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/identity/UserRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.identity;
-import com.solaria.persistence.domain.entity.User;
+import com.solaria.persistence.domain.entity.identity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
diff --git a/src/main/java/com/solaria/persistence/repository/CertificationRecordRepository.java b/src/main/java/com/solaria/persistence/repository/professional/CertificationRecordRepository.java
similarity index 76%
rename from src/main/java/com/solaria/persistence/repository/CertificationRecordRepository.java
rename to src/main/java/com/solaria/persistence/repository/professional/CertificationRecordRepository.java
index 49a082b..e04766a 100644
--- a/src/main/java/com/solaria/persistence/repository/CertificationRecordRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/professional/CertificationRecordRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.professional;
-import com.solaria.persistence.domain.entity.CertificationRecord;
+import com.solaria.persistence.domain.entity.professional.CertificationRecord;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/CertificationRepository.java b/src/main/java/com/solaria/persistence/repository/professional/CertificationRepository.java
similarity index 57%
rename from src/main/java/com/solaria/persistence/repository/CertificationRepository.java
rename to src/main/java/com/solaria/persistence/repository/professional/CertificationRepository.java
index bf6fded..353ec17 100644
--- a/src/main/java/com/solaria/persistence/repository/CertificationRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/professional/CertificationRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.professional;
-import com.solaria.persistence.domain.entity.Certification;
+import com.solaria.persistence.domain.entity.professional.Certification;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/repository/ProfessionRepository.java b/src/main/java/com/solaria/persistence/repository/professional/ProfessionRepository.java
similarity index 57%
rename from src/main/java/com/solaria/persistence/repository/ProfessionRepository.java
rename to src/main/java/com/solaria/persistence/repository/professional/ProfessionRepository.java
index 52668a2..c2f99a8 100644
--- a/src/main/java/com/solaria/persistence/repository/ProfessionRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/professional/ProfessionRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.professional;
-import com.solaria.persistence.domain.entity.Profession;
+import com.solaria.persistence.domain.entity.professional.Profession;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/repository/ProfessionalRegistrationRepository.java b/src/main/java/com/solaria/persistence/repository/professional/ProfessionalRegistrationRepository.java
similarity index 71%
rename from src/main/java/com/solaria/persistence/repository/ProfessionalRegistrationRepository.java
rename to src/main/java/com/solaria/persistence/repository/professional/ProfessionalRegistrationRepository.java
index 6100e08..20270f4 100644
--- a/src/main/java/com/solaria/persistence/repository/ProfessionalRegistrationRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/professional/ProfessionalRegistrationRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.professional;
-import com.solaria.persistence.domain.entity.ProfessionalRegistration;
+import com.solaria.persistence.domain.entity.professional.ProfessionalRegistration;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/ProfessionalReviewRepository.java b/src/main/java/com/solaria/persistence/repository/professional/ProfessionalReviewRepository.java
similarity index 75%
rename from src/main/java/com/solaria/persistence/repository/ProfessionalReviewRepository.java
rename to src/main/java/com/solaria/persistence/repository/professional/ProfessionalReviewRepository.java
index c9776ba..413e70f 100644
--- a/src/main/java/com/solaria/persistence/repository/ProfessionalReviewRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/professional/ProfessionalReviewRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.professional;
-import com.solaria.persistence.domain.entity.ProfessionalReview;
+import com.solaria.persistence.domain.entity.professional.ProfessionalReview;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/ShiftRepository.java b/src/main/java/com/solaria/persistence/repository/professional/ShiftRepository.java
similarity index 66%
rename from src/main/java/com/solaria/persistence/repository/ShiftRepository.java
rename to src/main/java/com/solaria/persistence/repository/professional/ShiftRepository.java
index 91809a8..ca5ef6a 100644
--- a/src/main/java/com/solaria/persistence/repository/ShiftRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/professional/ShiftRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.professional;
-import com.solaria.persistence.domain.entity.Shift;
+import com.solaria.persistence.domain.entity.professional.Shift;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/TechnicalCourseRepository.java b/src/main/java/com/solaria/persistence/repository/professional/TechnicalCourseRepository.java
similarity index 73%
rename from src/main/java/com/solaria/persistence/repository/TechnicalCourseRepository.java
rename to src/main/java/com/solaria/persistence/repository/professional/TechnicalCourseRepository.java
index 2ffcc0a..895847e 100644
--- a/src/main/java/com/solaria/persistence/repository/TechnicalCourseRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/professional/TechnicalCourseRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.professional;
-import com.solaria.persistence.domain.entity.TechnicalCourse;
+import com.solaria.persistence.domain.entity.professional.TechnicalCourse;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/TechnicianAffiliationRepository.java b/src/main/java/com/solaria/persistence/repository/professional/TechnicianAffiliationRepository.java
similarity index 80%
rename from src/main/java/com/solaria/persistence/repository/TechnicianAffiliationRepository.java
rename to src/main/java/com/solaria/persistence/repository/professional/TechnicianAffiliationRepository.java
index 3db7242..0d696f3 100644
--- a/src/main/java/com/solaria/persistence/repository/TechnicianAffiliationRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/professional/TechnicianAffiliationRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.professional;
-import com.solaria.persistence.domain.entity.TechnicianAffiliation;
+import com.solaria.persistence.domain.entity.professional.TechnicianAffiliation;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/TechnicianRepository.java b/src/main/java/com/solaria/persistence/repository/professional/TechnicianRepository.java
similarity index 72%
rename from src/main/java/com/solaria/persistence/repository/TechnicianRepository.java
rename to src/main/java/com/solaria/persistence/repository/professional/TechnicianRepository.java
index 84b54fb..81f4f52 100644
--- a/src/main/java/com/solaria/persistence/repository/TechnicianRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/professional/TechnicianRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.professional;
-import com.solaria.persistence.domain.entity.Technician;
+import com.solaria.persistence.domain.entity.professional.Technician;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
diff --git a/src/main/java/com/solaria/persistence/repository/ProposalItemRepository.java b/src/main/java/com/solaria/persistence/repository/proposal/ProposalItemRepository.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/repository/ProposalItemRepository.java
rename to src/main/java/com/solaria/persistence/repository/proposal/ProposalItemRepository.java
index 8458aad..e0af121 100644
--- a/src/main/java/com/solaria/persistence/repository/ProposalItemRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/proposal/ProposalItemRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.proposal;
-import com.solaria.persistence.domain.entity.ProposalItem;
+import com.solaria.persistence.domain.entity.proposal.ProposalItem;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
diff --git a/src/main/java/com/solaria/persistence/repository/ProposalRepository.java b/src/main/java/com/solaria/persistence/repository/proposal/ProposalRepository.java
similarity index 80%
rename from src/main/java/com/solaria/persistence/repository/ProposalRepository.java
rename to src/main/java/com/solaria/persistence/repository/proposal/ProposalRepository.java
index 056b9b9..77280bb 100644
--- a/src/main/java/com/solaria/persistence/repository/ProposalRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/proposal/ProposalRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.proposal;
-import com.solaria.persistence.domain.entity.Proposal;
+import com.solaria.persistence.domain.entity.proposal.Proposal;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/ProposalUnitRepository.java b/src/main/java/com/solaria/persistence/repository/proposal/ProposalUnitRepository.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/repository/ProposalUnitRepository.java
rename to src/main/java/com/solaria/persistence/repository/proposal/ProposalUnitRepository.java
index 63a2cf7..fc66cca 100644
--- a/src/main/java/com/solaria/persistence/repository/ProposalUnitRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/proposal/ProposalUnitRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.proposal;
-import com.solaria.persistence.domain.entity.ProposalUnit;
+import com.solaria.persistence.domain.entity.proposal.ProposalUnit;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;
diff --git a/src/main/java/com/solaria/persistence/repository/AddressRepository.java b/src/main/java/com/solaria/persistence/repository/shared/AddressRepository.java
similarity index 59%
rename from src/main/java/com/solaria/persistence/repository/AddressRepository.java
rename to src/main/java/com/solaria/persistence/repository/shared/AddressRepository.java
index bc93b67..79e4ccc 100644
--- a/src/main/java/com/solaria/persistence/repository/AddressRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/shared/AddressRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.shared;
-import com.solaria.persistence.domain.entity.Address;
+import com.solaria.persistence.domain.entity.shared.Address;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/repository/ContactRepository.java b/src/main/java/com/solaria/persistence/repository/shared/ContactRepository.java
similarity index 59%
rename from src/main/java/com/solaria/persistence/repository/ContactRepository.java
rename to src/main/java/com/solaria/persistence/repository/shared/ContactRepository.java
index 1db5488..b899ea2 100644
--- a/src/main/java/com/solaria/persistence/repository/ContactRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/shared/ContactRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.shared;
-import com.solaria.persistence.domain.entity.Contact;
+import com.solaria.persistence.domain.entity.shared.Contact;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.UUID;
diff --git a/src/main/java/com/solaria/persistence/repository/FluxLogRepository.java b/src/main/java/com/solaria/persistence/repository/shared/FluxLogRepository.java
similarity index 69%
rename from src/main/java/com/solaria/persistence/repository/FluxLogRepository.java
rename to src/main/java/com/solaria/persistence/repository/shared/FluxLogRepository.java
index f5c1f4c..392884f 100644
--- a/src/main/java/com/solaria/persistence/repository/FluxLogRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/shared/FluxLogRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.shared;
-import com.solaria.persistence.domain.entity.FluxLog;
+import com.solaria.persistence.domain.entity.shared.FluxLog;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/GeolocalizationRepository.java b/src/main/java/com/solaria/persistence/repository/shared/GeolocalizationRepository.java
similarity index 72%
rename from src/main/java/com/solaria/persistence/repository/GeolocalizationRepository.java
rename to src/main/java/com/solaria/persistence/repository/shared/GeolocalizationRepository.java
index 5331674..8019232 100644
--- a/src/main/java/com/solaria/persistence/repository/GeolocalizationRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/shared/GeolocalizationRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.shared;
-import com.solaria.persistence.domain.entity.Geolocalization;
+import com.solaria.persistence.domain.entity.shared.Geolocalization;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/specification/SupplierSpecification.java b/src/main/java/com/solaria/persistence/repository/specification/catalog/SupplierSpecification.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/repository/specification/SupplierSpecification.java
rename to src/main/java/com/solaria/persistence/repository/specification/catalog/SupplierSpecification.java
index c6d8303..f839745 100644
--- a/src/main/java/com/solaria/persistence/repository/specification/SupplierSpecification.java
+++ b/src/main/java/com/solaria/persistence/repository/specification/catalog/SupplierSpecification.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.repository.specification;
+package com.solaria.persistence.repository.specification.catalog;
import java.util.ArrayList;
import java.util.List;
@@ -6,10 +6,10 @@
import org.springframework.data.jpa.domain.Specification;
-import com.solaria.persistence.domain.entity.Address;
-import com.solaria.persistence.domain.entity.Company;
-import com.solaria.persistence.domain.entity.Supplier;
-import com.solaria.persistence.dto.request.SupplierSearchFilterDTO;
+import com.solaria.persistence.domain.entity.shared.Address;
+import com.solaria.persistence.domain.entity.company.Company;
+import com.solaria.persistence.domain.entity.catalog.Supplier;
+import com.solaria.persistence.dto.request.catalog.SupplierSearchFilterDTO;
import jakarta.persistence.criteria.Join;
import jakarta.persistence.criteria.JoinType;
diff --git a/src/main/java/com/solaria/persistence/repository/EnergyBillRepository.java b/src/main/java/com/solaria/persistence/repository/unit/EnergyBillRepository.java
similarity index 79%
rename from src/main/java/com/solaria/persistence/repository/EnergyBillRepository.java
rename to src/main/java/com/solaria/persistence/repository/unit/EnergyBillRepository.java
index cffe7bd..505042e 100644
--- a/src/main/java/com/solaria/persistence/repository/EnergyBillRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/unit/EnergyBillRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.unit;
-import com.solaria.persistence.domain.entity.EnergyBill;
+import com.solaria.persistence.domain.entity.unit.EnergyBill;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/LocalUnitPhotoRepository.java b/src/main/java/com/solaria/persistence/repository/unit/LocalUnitPhotoRepository.java
similarity index 79%
rename from src/main/java/com/solaria/persistence/repository/LocalUnitPhotoRepository.java
rename to src/main/java/com/solaria/persistence/repository/unit/LocalUnitPhotoRepository.java
index 3232f91..9f6fcc8 100644
--- a/src/main/java/com/solaria/persistence/repository/LocalUnitPhotoRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/unit/LocalUnitPhotoRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.unit;
-import com.solaria.persistence.domain.entity.LocalUnitPhoto;
+import com.solaria.persistence.domain.entity.unit.LocalUnitPhoto;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/LocalUnitRepository.java b/src/main/java/com/solaria/persistence/repository/unit/LocalUnitRepository.java
similarity index 82%
rename from src/main/java/com/solaria/persistence/repository/LocalUnitRepository.java
rename to src/main/java/com/solaria/persistence/repository/unit/LocalUnitRepository.java
index 8d7ab3b..273e980 100644
--- a/src/main/java/com/solaria/persistence/repository/LocalUnitRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/unit/LocalUnitRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.unit;
-import com.solaria.persistence.domain.entity.LocalUnit;
+import com.solaria.persistence.domain.entity.unit.LocalUnit;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/repository/UnitSpecificationsRepository.java b/src/main/java/com/solaria/persistence/repository/unit/UnitSpecificationsRepository.java
similarity index 79%
rename from src/main/java/com/solaria/persistence/repository/UnitSpecificationsRepository.java
rename to src/main/java/com/solaria/persistence/repository/unit/UnitSpecificationsRepository.java
index 3353e9a..a8112ac 100644
--- a/src/main/java/com/solaria/persistence/repository/UnitSpecificationsRepository.java
+++ b/src/main/java/com/solaria/persistence/repository/unit/UnitSpecificationsRepository.java
@@ -1,6 +1,6 @@
-package com.solaria.persistence.repository;
+package com.solaria.persistence.repository.unit;
-import com.solaria.persistence.domain.entity.UnitSpecifications;
+import com.solaria.persistence.domain.entity.unit.UnitSpecifications;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/solaria/persistence/security/rbac/RbacAuthorizationService.java b/src/main/java/com/solaria/persistence/security/rbac/RbacAuthorizationService.java
index 64c79ad..c03e291 100644
--- a/src/main/java/com/solaria/persistence/security/rbac/RbacAuthorizationService.java
+++ b/src/main/java/com/solaria/persistence/security/rbac/RbacAuthorizationService.java
@@ -10,13 +10,13 @@
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.Position;
-import com.solaria.persistence.domain.entity.User;
-import com.solaria.persistence.domain.entity.UserCompany;
+import com.solaria.persistence.domain.entity.identity.Position;
+import com.solaria.persistence.domain.entity.identity.User;
+import com.solaria.persistence.domain.entity.identity.UserCompany;
import com.solaria.persistence.exception.UnauthorizedAccessException;
-import com.solaria.persistence.repository.PositionPermissionRepository;
-import com.solaria.persistence.repository.UserCompanyRepository;
-import com.solaria.persistence.repository.UserRepository;
+import com.solaria.persistence.repository.identity.PositionPermissionRepository;
+import com.solaria.persistence.repository.identity.UserCompanyRepository;
+import com.solaria.persistence.repository.identity.UserRepository;
/**
* Resolve a autorização do usuário, em 2 camadas:
diff --git a/src/main/java/com/solaria/persistence/service/GoogleTranslateService.java b/src/main/java/com/solaria/persistence/service/catalog/GoogleTranslateService.java
similarity index 98%
rename from src/main/java/com/solaria/persistence/service/GoogleTranslateService.java
rename to src/main/java/com/solaria/persistence/service/catalog/GoogleTranslateService.java
index 541c262..68d6d16 100644
--- a/src/main/java/com/solaria/persistence/service/GoogleTranslateService.java
+++ b/src/main/java/com/solaria/persistence/service/catalog/GoogleTranslateService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.catalog;
import java.util.List;
import java.util.Map;
diff --git a/src/main/java/com/solaria/persistence/service/InventoryService.java b/src/main/java/com/solaria/persistence/service/catalog/InventoryService.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/service/InventoryService.java
rename to src/main/java/com/solaria/persistence/service/catalog/InventoryService.java
index 5ab63ff..25d8772 100644
--- a/src/main/java/com/solaria/persistence/service/InventoryService.java
+++ b/src/main/java/com/solaria/persistence/service/catalog/InventoryService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.catalog;
import java.util.List;
import java.util.UUID;
@@ -6,20 +6,21 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.Inventory;
-import com.solaria.persistence.domain.entity.Model;
-import com.solaria.persistence.domain.entity.Supplier;
-import com.solaria.persistence.domain.enums.SupplierStatus;
-import com.solaria.persistence.dto.request.InventoryRequestDTO;
-import com.solaria.persistence.dto.response.InventoryResponseDTO;
-import com.solaria.persistence.dto.response.ModelResponseDTO;
+import com.solaria.persistence.domain.entity.catalog.Inventory;
+import com.solaria.persistence.domain.entity.catalog.Model;
+import com.solaria.persistence.domain.entity.catalog.Supplier;
+import com.solaria.persistence.domain.enums.catalog.SupplierStatus;
+import com.solaria.persistence.dto.request.catalog.InventoryRequestDTO;
+import com.solaria.persistence.dto.response.catalog.InventoryResponseDTO;
+import com.solaria.persistence.dto.response.catalog.ModelResponseDTO;
import com.solaria.persistence.exception.BusinessRuleException;
import com.solaria.persistence.exception.DuplicateResourceException;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.InventoryRepository;
-import com.solaria.persistence.repository.ModelRepository;
-import com.solaria.persistence.repository.SupplierRepository;
+import com.solaria.persistence.repository.catalog.InventoryRepository;
+import com.solaria.persistence.repository.catalog.ModelRepository;
+import com.solaria.persistence.repository.catalog.SupplierRepository;
+import com.solaria.persistence.service.company.SubscriptionService;
@Service
public class InventoryService {
diff --git a/src/main/java/com/solaria/persistence/service/ModelPhotoService.java b/src/main/java/com/solaria/persistence/service/catalog/ModelPhotoService.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/service/ModelPhotoService.java
rename to src/main/java/com/solaria/persistence/service/catalog/ModelPhotoService.java
index b4bfa27..a123326 100644
--- a/src/main/java/com/solaria/persistence/service/ModelPhotoService.java
+++ b/src/main/java/com/solaria/persistence/service/catalog/ModelPhotoService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.catalog;
import java.time.OffsetDateTime;
import java.util.List;
@@ -10,13 +10,14 @@
import org.springframework.web.multipart.MultipartFile;
import com.solaria.persistence.config.CloudinaryProperties;
-import com.solaria.persistence.domain.entity.Model;
-import com.solaria.persistence.domain.entity.ModelPhoto;
-import com.solaria.persistence.dto.response.ModelPhotoResponseDTO;
+import com.solaria.persistence.domain.entity.catalog.Model;
+import com.solaria.persistence.domain.entity.catalog.ModelPhoto;
+import com.solaria.persistence.dto.response.catalog.ModelPhotoResponseDTO;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.ModelPhotoRepository;
-import com.solaria.persistence.repository.ModelRepository;
-import com.solaria.persistence.service.CloudinaryService.UploadResult;
+import com.solaria.persistence.repository.catalog.ModelPhotoRepository;
+import com.solaria.persistence.repository.catalog.ModelRepository;
+import com.solaria.persistence.service.shared.CloudinaryService.UploadResult;
+import com.solaria.persistence.service.shared.CloudinaryService;
@Service
public class ModelPhotoService {
diff --git a/src/main/java/com/solaria/persistence/service/ModelService.java b/src/main/java/com/solaria/persistence/service/catalog/ModelService.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/service/ModelService.java
rename to src/main/java/com/solaria/persistence/service/catalog/ModelService.java
index 285776f..48d9596 100644
--- a/src/main/java/com/solaria/persistence/service/ModelService.java
+++ b/src/main/java/com/solaria/persistence/service/catalog/ModelService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.catalog;
import java.math.BigDecimal;
import java.util.List;
@@ -9,18 +9,18 @@
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.domain.entity.Model;
-import com.solaria.persistence.domain.enums.ModelStatus;
-import com.solaria.persistence.dto.request.ModelRequestDTO;
-import com.solaria.persistence.dto.response.ModelResponseDTO;
+import com.solaria.persistence.domain.entity.catalog.Model;
+import com.solaria.persistence.domain.enums.catalog.ModelStatus;
+import com.solaria.persistence.dto.request.catalog.ModelRequestDTO;
+import com.solaria.persistence.dto.response.catalog.ModelResponseDTO;
import com.solaria.persistence.exception.BusinessRuleException;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.InventoryRepository;
-import com.solaria.persistence.repository.ModelPhotoRepository;
-import com.solaria.persistence.repository.ModelRepository;
-import com.solaria.persistence.repository.OfferRepository;
+import com.solaria.persistence.repository.catalog.InventoryRepository;
+import com.solaria.persistence.repository.catalog.ModelPhotoRepository;
+import com.solaria.persistence.repository.catalog.ModelRepository;
+import com.solaria.persistence.repository.catalog.OfferRepository;
@Service
public class ModelService {
diff --git a/src/main/java/com/solaria/persistence/service/OfferService.java b/src/main/java/com/solaria/persistence/service/catalog/OfferService.java
similarity index 90%
rename from src/main/java/com/solaria/persistence/service/OfferService.java
rename to src/main/java/com/solaria/persistence/service/catalog/OfferService.java
index 0ed40e7..fa7f6dd 100644
--- a/src/main/java/com/solaria/persistence/service/OfferService.java
+++ b/src/main/java/com/solaria/persistence/service/catalog/OfferService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.catalog;
import java.math.BigDecimal;
import java.time.OffsetDateTime;
@@ -10,27 +10,28 @@
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
-import com.solaria.persistence.domain.entity.Model;
-import com.solaria.persistence.domain.entity.Offer;
-import com.solaria.persistence.domain.entity.OfferTranslation;
-import com.solaria.persistence.domain.entity.Supplier;
-import com.solaria.persistence.domain.enums.ModelStatus;
-import com.solaria.persistence.domain.enums.SupplierStatus;
-import com.solaria.persistence.domain.enums.TranslationStatus;
-import com.solaria.persistence.dto.request.OfferRequestDTO;
-import com.solaria.persistence.dto.response.ModelResponseDTO;
-import com.solaria.persistence.dto.response.OfferResponseDTO;
-import com.solaria.persistence.dto.response.OfferTranslationResponseDTO;
+import com.solaria.persistence.domain.entity.catalog.Model;
+import com.solaria.persistence.domain.entity.catalog.Offer;
+import com.solaria.persistence.domain.entity.catalog.OfferTranslation;
+import com.solaria.persistence.domain.entity.catalog.Supplier;
+import com.solaria.persistence.domain.enums.catalog.ModelStatus;
+import com.solaria.persistence.domain.enums.catalog.SupplierStatus;
+import com.solaria.persistence.domain.enums.catalog.TranslationStatus;
+import com.solaria.persistence.dto.request.catalog.OfferRequestDTO;
+import com.solaria.persistence.dto.response.catalog.ModelResponseDTO;
+import com.solaria.persistence.dto.response.catalog.OfferResponseDTO;
+import com.solaria.persistence.dto.response.catalog.OfferTranslationResponseDTO;
import com.solaria.persistence.exception.BusinessRuleException;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.ModelRepository;
-import com.solaria.persistence.repository.OfferRepository;
-import com.solaria.persistence.repository.OfferTranslationRepository;
-import com.solaria.persistence.repository.ProposalItemRepository;
-import com.solaria.persistence.repository.SupplierRepository;
+import com.solaria.persistence.repository.catalog.ModelRepository;
+import com.solaria.persistence.repository.catalog.OfferRepository;
+import com.solaria.persistence.repository.catalog.OfferTranslationRepository;
+import com.solaria.persistence.repository.proposal.ProposalItemRepository;
+import com.solaria.persistence.repository.catalog.SupplierRepository;
import com.solaria.persistence.util.SlugUtil;
+import com.solaria.persistence.service.company.SubscriptionService;
@Service
public class OfferService {
diff --git a/src/main/java/com/solaria/persistence/service/OfferTranslationService.java b/src/main/java/com/solaria/persistence/service/catalog/OfferTranslationService.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/service/OfferTranslationService.java
rename to src/main/java/com/solaria/persistence/service/catalog/OfferTranslationService.java
index c70d68b..cbe2081 100644
--- a/src/main/java/com/solaria/persistence/service/OfferTranslationService.java
+++ b/src/main/java/com/solaria/persistence/service/catalog/OfferTranslationService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.catalog;
import java.util.ArrayList;
import java.util.List;
@@ -10,11 +10,11 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.Offer;
-import com.solaria.persistence.domain.entity.OfferTranslation;
-import com.solaria.persistence.domain.enums.TranslationStatus;
-import com.solaria.persistence.repository.OfferRepository;
-import com.solaria.persistence.repository.OfferTranslationRepository;
+import com.solaria.persistence.domain.entity.catalog.Offer;
+import com.solaria.persistence.domain.entity.catalog.OfferTranslation;
+import com.solaria.persistence.domain.enums.catalog.TranslationStatus;
+import com.solaria.persistence.repository.catalog.OfferRepository;
+import com.solaria.persistence.repository.catalog.OfferTranslationRepository;
import com.solaria.persistence.util.SupportedLocales;
/**
diff --git a/src/main/java/com/solaria/persistence/service/SupplierCacheService.java b/src/main/java/com/solaria/persistence/service/catalog/SupplierCacheService.java
similarity index 95%
rename from src/main/java/com/solaria/persistence/service/SupplierCacheService.java
rename to src/main/java/com/solaria/persistence/service/catalog/SupplierCacheService.java
index b756dc9..9e78cd6 100644
--- a/src/main/java/com/solaria/persistence/service/SupplierCacheService.java
+++ b/src/main/java/com/solaria/persistence/service/catalog/SupplierCacheService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.catalog;
import java.time.Duration;
import java.util.Optional;
@@ -11,8 +11,8 @@
import org.springframework.stereotype.Service;
import com.solaria.persistence.config.RedisProperties;
-import com.solaria.persistence.dto.request.SupplierSearchFilterDTO;
-import com.solaria.persistence.dto.response.SupplierSearchResponseDTO;
+import com.solaria.persistence.dto.request.catalog.SupplierSearchFilterDTO;
+import com.solaria.persistence.dto.response.catalog.SupplierSearchResponseDTO;
import com.solaria.persistence.util.CacheKeyGenerator;
@Service
diff --git a/src/main/java/com/solaria/persistence/service/SupplierService.java b/src/main/java/com/solaria/persistence/service/catalog/SupplierService.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/service/SupplierService.java
rename to src/main/java/com/solaria/persistence/service/catalog/SupplierService.java
index 8486d53..7f74022 100644
--- a/src/main/java/com/solaria/persistence/service/SupplierService.java
+++ b/src/main/java/com/solaria/persistence/service/catalog/SupplierService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.catalog;
import java.util.List;
import java.util.Map;
@@ -12,26 +12,26 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.dto.request.SupplierSearchFilterDTO;
-import com.solaria.persistence.dto.response.AddressResponseDTO;
-import com.solaria.persistence.dto.response.BusinessContactResponseDTO;
-import com.solaria.persistence.dto.response.CompanyResponseDTO;
-import com.solaria.persistence.dto.request.SupplierRequestDTO;
-import com.solaria.persistence.dto.response.SupplierResponseDTO;
-import com.solaria.persistence.dto.response.SupplierSearchResponseDTO;
-import com.solaria.persistence.domain.entity.Address;
-import com.solaria.persistence.domain.entity.BusinessContact;
-import com.solaria.persistence.domain.entity.Company;
-import com.solaria.persistence.domain.entity.Supplier;
-import com.solaria.persistence.domain.enums.CompanyStatus;
-import com.solaria.persistence.domain.enums.SupplierStatus;
+import com.solaria.persistence.dto.request.catalog.SupplierSearchFilterDTO;
+import com.solaria.persistence.dto.response.shared.AddressResponseDTO;
+import com.solaria.persistence.dto.response.company.BusinessContactResponseDTO;
+import com.solaria.persistence.dto.response.company.CompanyResponseDTO;
+import com.solaria.persistence.dto.request.catalog.SupplierRequestDTO;
+import com.solaria.persistence.dto.response.catalog.SupplierResponseDTO;
+import com.solaria.persistence.dto.response.catalog.SupplierSearchResponseDTO;
+import com.solaria.persistence.domain.entity.shared.Address;
+import com.solaria.persistence.domain.entity.company.BusinessContact;
+import com.solaria.persistence.domain.entity.company.Company;
+import com.solaria.persistence.domain.entity.catalog.Supplier;
+import com.solaria.persistence.domain.enums.company.CompanyStatus;
+import com.solaria.persistence.domain.enums.catalog.SupplierStatus;
import com.solaria.persistence.exception.BusinessRuleException;
import com.solaria.persistence.exception.DuplicateResourceException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.CompanyRepository;
-import com.solaria.persistence.repository.RequesterRepository;
-import com.solaria.persistence.repository.SupplierRepository;
-import com.solaria.persistence.repository.specification.SupplierSpecification;
+import com.solaria.persistence.repository.company.CompanyRepository;
+import com.solaria.persistence.repository.execution.RequesterRepository;
+import com.solaria.persistence.repository.catalog.SupplierRepository;
+import com.solaria.persistence.repository.specification.catalog.SupplierSpecification;
import com.solaria.persistence.security.rbac.RbacAuthorizationService;
diff --git a/src/main/java/com/solaria/persistence/service/BusinessContactService.java b/src/main/java/com/solaria/persistence/service/company/BusinessContactService.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/service/BusinessContactService.java
rename to src/main/java/com/solaria/persistence/service/company/BusinessContactService.java
index f94c95e..72557c0 100644
--- a/src/main/java/com/solaria/persistence/service/BusinessContactService.java
+++ b/src/main/java/com/solaria/persistence/service/company/BusinessContactService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.company;
import java.util.List;
import java.util.UUID;
@@ -8,13 +8,13 @@
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.domain.entity.BusinessContact;
-import com.solaria.persistence.dto.request.BusinessContactRequestDTO;
-import com.solaria.persistence.dto.response.BusinessContactResponseDTO;
+import com.solaria.persistence.domain.entity.company.BusinessContact;
+import com.solaria.persistence.dto.request.company.BusinessContactRequestDTO;
+import com.solaria.persistence.dto.response.company.BusinessContactResponseDTO;
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.BusinessContactRepository;
-import com.solaria.persistence.repository.CompanyRepository;
+import com.solaria.persistence.repository.company.BusinessContactRepository;
+import com.solaria.persistence.repository.company.CompanyRepository;
@Service
public class BusinessContactService {
diff --git a/src/main/java/com/solaria/persistence/service/ChargeService.java b/src/main/java/com/solaria/persistence/service/company/ChargeService.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/service/ChargeService.java
rename to src/main/java/com/solaria/persistence/service/company/ChargeService.java
index 27d8f14..69dfcdc 100644
--- a/src/main/java/com/solaria/persistence/service/ChargeService.java
+++ b/src/main/java/com/solaria/persistence/service/company/ChargeService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.company;
import java.math.BigDecimal;
import java.time.LocalDate;
@@ -10,17 +10,17 @@
import org.springframework.transaction.annotation.Transactional;
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.dto.request.ChargeRequestDTO;
-import com.solaria.persistence.dto.response.ChargeResponseDTO;
-import com.solaria.persistence.domain.entity.Charge;
-import com.solaria.persistence.domain.entity.Subscription;
-import com.solaria.persistence.domain.enums.BillingStatus;
-import com.solaria.persistence.domain.enums.PaymentMethod;
+import com.solaria.persistence.dto.request.company.ChargeRequestDTO;
+import com.solaria.persistence.dto.response.company.ChargeResponseDTO;
+import com.solaria.persistence.domain.entity.company.Charge;
+import com.solaria.persistence.domain.entity.company.Subscription;
+import com.solaria.persistence.domain.enums.company.BillingStatus;
+import com.solaria.persistence.domain.enums.company.PaymentMethod;
import com.solaria.persistence.exception.BusinessRuleException;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.ChargeRepository;
-import com.solaria.persistence.repository.SubscriptionRepository;
+import com.solaria.persistence.repository.company.ChargeRepository;
+import com.solaria.persistence.repository.company.SubscriptionRepository;
import com.solaria.persistence.security.rbac.RbacAuthorizationService;
@Service
diff --git a/src/main/java/com/solaria/persistence/service/CompanyPhotoService.java b/src/main/java/com/solaria/persistence/service/company/CompanyPhotoService.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/service/CompanyPhotoService.java
rename to src/main/java/com/solaria/persistence/service/company/CompanyPhotoService.java
index 17e31b1..2ddf550 100644
--- a/src/main/java/com/solaria/persistence/service/CompanyPhotoService.java
+++ b/src/main/java/com/solaria/persistence/service/company/CompanyPhotoService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.company;
import java.time.OffsetDateTime;
import java.util.List;
@@ -10,15 +10,16 @@
import org.springframework.web.multipart.MultipartFile;
import com.solaria.persistence.config.CloudinaryProperties;
-import com.solaria.persistence.domain.entity.Company;
-import com.solaria.persistence.domain.entity.CompanyPhoto;
-import com.solaria.persistence.domain.enums.PhotoType;
-import com.solaria.persistence.dto.response.CompanyPhotoResponseDTO;
+import com.solaria.persistence.domain.entity.company.Company;
+import com.solaria.persistence.domain.entity.company.CompanyPhoto;
+import com.solaria.persistence.domain.enums.shared.PhotoType;
+import com.solaria.persistence.dto.response.company.CompanyPhotoResponseDTO;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.CompanyPhotoRepository;
-import com.solaria.persistence.repository.CompanyRepository;
+import com.solaria.persistence.repository.company.CompanyPhotoRepository;
+import com.solaria.persistence.repository.company.CompanyRepository;
import com.solaria.persistence.security.rbac.RbacAuthorizationService;
-import com.solaria.persistence.service.CloudinaryService.UploadResult;
+import com.solaria.persistence.service.shared.CloudinaryService.UploadResult;
+import com.solaria.persistence.service.shared.CloudinaryService;
@Service
public class CompanyPhotoService {
diff --git a/src/main/java/com/solaria/persistence/service/CompanyPlansService.java b/src/main/java/com/solaria/persistence/service/company/CompanyPlansService.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/service/CompanyPlansService.java
rename to src/main/java/com/solaria/persistence/service/company/CompanyPlansService.java
index e943be2..c5b9d25 100644
--- a/src/main/java/com/solaria/persistence/service/CompanyPlansService.java
+++ b/src/main/java/com/solaria/persistence/service/company/CompanyPlansService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.company;
import java.math.BigDecimal;
import java.util.List;
@@ -9,14 +9,14 @@
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.domain.entity.CompanyPlans;
-import com.solaria.persistence.dto.request.CompanyPlansRequestDTO;
-import com.solaria.persistence.dto.response.CompanyPlansResponseDTO;
+import com.solaria.persistence.domain.entity.company.CompanyPlans;
+import com.solaria.persistence.dto.request.company.CompanyPlansRequestDTO;
+import com.solaria.persistence.dto.response.company.CompanyPlansResponseDTO;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.CompanyPlansRepository;
-import com.solaria.persistence.repository.SubscriptionRepository;
+import com.solaria.persistence.repository.company.CompanyPlansRepository;
+import com.solaria.persistence.repository.company.SubscriptionRepository;
@Service
public class CompanyPlansService {
diff --git a/src/main/java/com/solaria/persistence/service/CompanyPositionsService.java b/src/main/java/com/solaria/persistence/service/company/CompanyPositionsService.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/service/CompanyPositionsService.java
rename to src/main/java/com/solaria/persistence/service/company/CompanyPositionsService.java
index cea3e48..2596ebf 100644
--- a/src/main/java/com/solaria/persistence/service/CompanyPositionsService.java
+++ b/src/main/java/com/solaria/persistence/service/company/CompanyPositionsService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.company;
import java.util.List;
import java.util.UUID;
@@ -7,19 +7,19 @@
import org.springframework.transaction.annotation.Transactional;
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.dto.request.CompanyPositionsRequestDTO;
-import com.solaria.persistence.dto.response.CompanyPositionsResponseDTO;
-import com.solaria.persistence.dto.response.PositionResponseDTO;
-import com.solaria.persistence.domain.entity.Company;
-import com.solaria.persistence.domain.entity.CompanyPositions;
-import com.solaria.persistence.domain.entity.Position;
+import com.solaria.persistence.dto.request.company.CompanyPositionsRequestDTO;
+import com.solaria.persistence.dto.response.company.CompanyPositionsResponseDTO;
+import com.solaria.persistence.dto.response.identity.PositionResponseDTO;
+import com.solaria.persistence.domain.entity.company.Company;
+import com.solaria.persistence.domain.entity.company.CompanyPositions;
+import com.solaria.persistence.domain.entity.identity.Position;
import com.solaria.persistence.exception.DuplicateResourceException;
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.CompanyPositionsRepository;
-import com.solaria.persistence.repository.CompanyRepository;
-import com.solaria.persistence.repository.PositionRepository;
-import com.solaria.persistence.repository.UserCompanyRepository;
+import com.solaria.persistence.repository.company.CompanyPositionsRepository;
+import com.solaria.persistence.repository.company.CompanyRepository;
+import com.solaria.persistence.repository.identity.PositionRepository;
+import com.solaria.persistence.repository.identity.UserCompanyRepository;
import com.solaria.persistence.security.rbac.RbacAuthorizationService;
@Service
diff --git a/src/main/java/com/solaria/persistence/service/CompanyService.java b/src/main/java/com/solaria/persistence/service/company/CompanyService.java
similarity index 89%
rename from src/main/java/com/solaria/persistence/service/CompanyService.java
rename to src/main/java/com/solaria/persistence/service/company/CompanyService.java
index 06b0450..7fa963c 100644
--- a/src/main/java/com/solaria/persistence/service/CompanyService.java
+++ b/src/main/java/com/solaria/persistence/service/company/CompanyService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.company;
import java.util.List;
import java.util.UUID;
@@ -6,28 +6,28 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.Address;
-import com.solaria.persistence.domain.entity.BusinessContact;
-import com.solaria.persistence.domain.entity.Company;
-import com.solaria.persistence.domain.enums.CompanyStatus;
-import com.solaria.persistence.dto.request.CompanyRequestDTO;
-import com.solaria.persistence.dto.response.AddressResponseDTO;
-import com.solaria.persistence.dto.response.BusinessContactResponseDTO;
-import com.solaria.persistence.dto.response.CompanyResponseDTO;
+import com.solaria.persistence.domain.entity.shared.Address;
+import com.solaria.persistence.domain.entity.company.BusinessContact;
+import com.solaria.persistence.domain.entity.company.Company;
+import com.solaria.persistence.domain.enums.company.CompanyStatus;
+import com.solaria.persistence.dto.request.company.CompanyRequestDTO;
+import com.solaria.persistence.dto.response.shared.AddressResponseDTO;
+import com.solaria.persistence.dto.response.company.BusinessContactResponseDTO;
+import com.solaria.persistence.dto.response.company.CompanyResponseDTO;
import com.solaria.persistence.exception.BusinessRuleException;
import com.solaria.persistence.exception.DuplicateResourceException;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.AddressRepository;
-import com.solaria.persistence.repository.BusinessContactRepository;
-import com.solaria.persistence.repository.CompanyPhotoRepository;
-import com.solaria.persistence.repository.CompanyPositionsRepository;
-import com.solaria.persistence.repository.CompanyRepository;
-import com.solaria.persistence.repository.RequesterRepository;
-import com.solaria.persistence.repository.SupplierRepository;
-import com.solaria.persistence.repository.TechnicianAffiliationRepository;
-import com.solaria.persistence.repository.UserCompanyRepository;
+import com.solaria.persistence.repository.shared.AddressRepository;
+import com.solaria.persistence.repository.company.BusinessContactRepository;
+import com.solaria.persistence.repository.company.CompanyPhotoRepository;
+import com.solaria.persistence.repository.company.CompanyPositionsRepository;
+import com.solaria.persistence.repository.company.CompanyRepository;
+import com.solaria.persistence.repository.execution.RequesterRepository;
+import com.solaria.persistence.repository.catalog.SupplierRepository;
+import com.solaria.persistence.repository.professional.TechnicianAffiliationRepository;
+import com.solaria.persistence.repository.identity.UserCompanyRepository;
import com.solaria.persistence.util.SlugUtil;
@Service
diff --git a/src/main/java/com/solaria/persistence/service/SubscriptionService.java b/src/main/java/com/solaria/persistence/service/company/SubscriptionService.java
similarity index 90%
rename from src/main/java/com/solaria/persistence/service/SubscriptionService.java
rename to src/main/java/com/solaria/persistence/service/company/SubscriptionService.java
index 727b13a..effda8e 100644
--- a/src/main/java/com/solaria/persistence/service/SubscriptionService.java
+++ b/src/main/java/com/solaria/persistence/service/company/SubscriptionService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.company;
import java.time.OffsetDateTime;
import java.util.List;
@@ -9,19 +9,19 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.dto.response.CompanyPlansResponseDTO;
-import com.solaria.persistence.dto.request.SubscriptionRequestDTO;
-import com.solaria.persistence.dto.response.SubscriptionResponseDTO;
-import com.solaria.persistence.domain.entity.CompanyPlans;
-import com.solaria.persistence.domain.entity.Subscription;
-import com.solaria.persistence.domain.entity.Supplier;
-import com.solaria.persistence.domain.enums.SubscriptionStatus;
+import com.solaria.persistence.dto.response.company.CompanyPlansResponseDTO;
+import com.solaria.persistence.dto.request.company.SubscriptionRequestDTO;
+import com.solaria.persistence.dto.response.company.SubscriptionResponseDTO;
+import com.solaria.persistence.domain.entity.company.CompanyPlans;
+import com.solaria.persistence.domain.entity.company.Subscription;
+import com.solaria.persistence.domain.entity.catalog.Supplier;
+import com.solaria.persistence.domain.enums.company.SubscriptionStatus;
import com.solaria.persistence.exception.BusinessRuleException;
import com.solaria.persistence.exception.DuplicateResourceException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.CompanyPlansRepository;
-import com.solaria.persistence.repository.SubscriptionRepository;
-import com.solaria.persistence.repository.SupplierRepository;
+import com.solaria.persistence.repository.company.CompanyPlansRepository;
+import com.solaria.persistence.repository.company.SubscriptionRepository;
+import com.solaria.persistence.repository.catalog.SupplierRepository;
import com.solaria.persistence.security.rbac.RbacAuthorizationService;
@Service
diff --git a/src/main/java/com/solaria/persistence/service/RequesterService.java b/src/main/java/com/solaria/persistence/service/execution/RequesterService.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/service/RequesterService.java
rename to src/main/java/com/solaria/persistence/service/execution/RequesterService.java
index 82d637a..35ab7e2 100644
--- a/src/main/java/com/solaria/persistence/service/RequesterService.java
+++ b/src/main/java/com/solaria/persistence/service/execution/RequesterService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.execution;
import java.util.List;
import java.util.UUID;
@@ -6,25 +6,25 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.Address;
-import com.solaria.persistence.domain.entity.BusinessContact;
-import com.solaria.persistence.domain.entity.Company;
-import com.solaria.persistence.domain.entity.Requester;
-import com.solaria.persistence.domain.enums.CompanyStatus;
-import com.solaria.persistence.dto.request.RequesterRequestDTO;
-import com.solaria.persistence.dto.response.AddressResponseDTO;
-import com.solaria.persistence.dto.response.BusinessContactResponseDTO;
-import com.solaria.persistence.dto.response.CompanyResponseDTO;
-import com.solaria.persistence.dto.response.RequesterResponseDTO;
+import com.solaria.persistence.domain.entity.shared.Address;
+import com.solaria.persistence.domain.entity.company.BusinessContact;
+import com.solaria.persistence.domain.entity.company.Company;
+import com.solaria.persistence.domain.entity.execution.Requester;
+import com.solaria.persistence.domain.enums.company.CompanyStatus;
+import com.solaria.persistence.dto.request.execution.RequesterRequestDTO;
+import com.solaria.persistence.dto.response.shared.AddressResponseDTO;
+import com.solaria.persistence.dto.response.company.BusinessContactResponseDTO;
+import com.solaria.persistence.dto.response.company.CompanyResponseDTO;
+import com.solaria.persistence.dto.response.execution.RequesterResponseDTO;
import com.solaria.persistence.exception.BusinessRuleException;
import com.solaria.persistence.exception.DuplicateResourceException;
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.CompanyRepository;
-import com.solaria.persistence.repository.ProposalRepository;
-import com.solaria.persistence.repository.RequesterRepository;
-import com.solaria.persistence.repository.SupplierRepository;
-import com.solaria.persistence.repository.TechnicalProjectRepository;
+import com.solaria.persistence.repository.company.CompanyRepository;
+import com.solaria.persistence.repository.proposal.ProposalRepository;
+import com.solaria.persistence.repository.execution.RequesterRepository;
+import com.solaria.persistence.repository.catalog.SupplierRepository;
+import com.solaria.persistence.repository.execution.TechnicalProjectRepository;
@Service
public class RequesterService {
diff --git a/src/main/java/com/solaria/persistence/service/ServiceContractService.java b/src/main/java/com/solaria/persistence/service/execution/ServiceContractService.java
similarity index 90%
rename from src/main/java/com/solaria/persistence/service/ServiceContractService.java
rename to src/main/java/com/solaria/persistence/service/execution/ServiceContractService.java
index 37cb4d3..145372f 100644
--- a/src/main/java/com/solaria/persistence/service/ServiceContractService.java
+++ b/src/main/java/com/solaria/persistence/service/execution/ServiceContractService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.execution;
import java.time.LocalDate;
import java.util.UUID;
@@ -7,17 +7,17 @@
import org.springframework.transaction.annotation.Transactional;
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.dto.request.ServiceContractRequestDTO;
-import com.solaria.persistence.dto.response.ServiceContractResponseDTO;
-import com.solaria.persistence.domain.entity.ServiceContract;
-import com.solaria.persistence.domain.entity.TechnicalService;
-import com.solaria.persistence.domain.enums.ServiceStatus;
+import com.solaria.persistence.dto.request.execution.ServiceContractRequestDTO;
+import com.solaria.persistence.dto.response.execution.ServiceContractResponseDTO;
+import com.solaria.persistence.domain.entity.execution.ServiceContract;
+import com.solaria.persistence.domain.entity.execution.TechnicalService;
+import com.solaria.persistence.domain.enums.execution.ServiceStatus;
import com.solaria.persistence.exception.BusinessRuleException;
import com.solaria.persistence.exception.DuplicateResourceException;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.ServiceContractRepository;
-import com.solaria.persistence.repository.TechnicalServiceRepository;
+import com.solaria.persistence.repository.execution.ServiceContractRepository;
+import com.solaria.persistence.repository.execution.TechnicalServiceRepository;
import com.solaria.persistence.security.rbac.RbacAuthorizationService;
diff --git a/src/main/java/com/solaria/persistence/service/ServiceExecutorService.java b/src/main/java/com/solaria/persistence/service/execution/ServiceExecutorService.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/service/ServiceExecutorService.java
rename to src/main/java/com/solaria/persistence/service/execution/ServiceExecutorService.java
index 4f0b0e9..f777846 100644
--- a/src/main/java/com/solaria/persistence/service/ServiceExecutorService.java
+++ b/src/main/java/com/solaria/persistence/service/execution/ServiceExecutorService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.execution;
import java.util.List;
import java.util.UUID;
@@ -8,20 +8,20 @@
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.domain.entity.ServiceExecutor;
-import com.solaria.persistence.domain.entity.TechnicalService;
-import com.solaria.persistence.domain.entity.TechnicianAffiliation;
-import com.solaria.persistence.domain.enums.ServiceStatus;
-import com.solaria.persistence.dto.request.ServiceExecutorRequestDTO;
-import com.solaria.persistence.dto.response.ServiceExecutorResponseDTO;
-import com.solaria.persistence.dto.response.TechnicianAffiliationResponseDTO;
+import com.solaria.persistence.domain.entity.execution.ServiceExecutor;
+import com.solaria.persistence.domain.entity.execution.TechnicalService;
+import com.solaria.persistence.domain.entity.professional.TechnicianAffiliation;
+import com.solaria.persistence.domain.enums.execution.ServiceStatus;
+import com.solaria.persistence.dto.request.execution.ServiceExecutorRequestDTO;
+import com.solaria.persistence.dto.response.execution.ServiceExecutorResponseDTO;
+import com.solaria.persistence.dto.response.professional.TechnicianAffiliationResponseDTO;
import com.solaria.persistence.exception.BusinessRuleException;
import com.solaria.persistence.exception.DuplicateResourceException;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.ServiceExecutorRepository;
-import com.solaria.persistence.repository.TechnicalServiceRepository;
-import com.solaria.persistence.repository.TechnicianAffiliationRepository;
+import com.solaria.persistence.repository.execution.ServiceExecutorRepository;
+import com.solaria.persistence.repository.execution.TechnicalServiceRepository;
+import com.solaria.persistence.repository.professional.TechnicianAffiliationRepository;
@Service
diff --git a/src/main/java/com/solaria/persistence/service/TechnicalProjectService.java b/src/main/java/com/solaria/persistence/service/execution/TechnicalProjectService.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/service/TechnicalProjectService.java
rename to src/main/java/com/solaria/persistence/service/execution/TechnicalProjectService.java
index a6420c0..d0d61ba 100644
--- a/src/main/java/com/solaria/persistence/service/TechnicalProjectService.java
+++ b/src/main/java/com/solaria/persistence/service/execution/TechnicalProjectService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.execution;
import java.util.List;
import java.util.UUID;
@@ -6,18 +6,18 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.LocalUnit;
-import com.solaria.persistence.domain.entity.Requester;
-import com.solaria.persistence.domain.entity.TechnicalProject;
-import com.solaria.persistence.domain.enums.ServiceStatus;
-import com.solaria.persistence.dto.request.TechnicalProjectRequestDTO;
-import com.solaria.persistence.dto.response.TechnicalProjectResponseDTO;
+import com.solaria.persistence.domain.entity.unit.LocalUnit;
+import com.solaria.persistence.domain.entity.execution.Requester;
+import com.solaria.persistence.domain.entity.execution.TechnicalProject;
+import com.solaria.persistence.domain.enums.execution.ServiceStatus;
+import com.solaria.persistence.dto.request.execution.TechnicalProjectRequestDTO;
+import com.solaria.persistence.dto.response.execution.TechnicalProjectResponseDTO;
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.LocalUnitRepository;
-import com.solaria.persistence.repository.RequesterRepository;
-import com.solaria.persistence.repository.TechnicalProjectRepository;
-import com.solaria.persistence.repository.TechnicalServiceRepository;
+import com.solaria.persistence.repository.unit.LocalUnitRepository;
+import com.solaria.persistence.repository.execution.RequesterRepository;
+import com.solaria.persistence.repository.execution.TechnicalProjectRepository;
+import com.solaria.persistence.repository.execution.TechnicalServiceRepository;
@Service
public class TechnicalProjectService {
diff --git a/src/main/java/com/solaria/persistence/service/TechnicalServiceService.java b/src/main/java/com/solaria/persistence/service/execution/TechnicalServiceService.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/service/TechnicalServiceService.java
rename to src/main/java/com/solaria/persistence/service/execution/TechnicalServiceService.java
index 3c513e4..6e0074f 100644
--- a/src/main/java/com/solaria/persistence/service/TechnicalServiceService.java
+++ b/src/main/java/com/solaria/persistence/service/execution/TechnicalServiceService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.execution;
import java.time.OffsetDateTime;
import java.util.List;
@@ -8,16 +8,16 @@
import org.springframework.transaction.annotation.Transactional;
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.dto.request.TechnicalServiceRequestDTO;
-import com.solaria.persistence.dto.response.TechnicalServiceResponseDTO;
-import com.solaria.persistence.domain.entity.TechnicalProject;
-import com.solaria.persistence.domain.entity.TechnicalService;
-import com.solaria.persistence.domain.enums.ServiceStatus;
+import com.solaria.persistence.dto.request.execution.TechnicalServiceRequestDTO;
+import com.solaria.persistence.dto.response.execution.TechnicalServiceResponseDTO;
+import com.solaria.persistence.domain.entity.execution.TechnicalProject;
+import com.solaria.persistence.domain.entity.execution.TechnicalService;
+import com.solaria.persistence.domain.enums.execution.ServiceStatus;
import com.solaria.persistence.exception.BusinessRuleException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.ServiceExecutorRepository;
-import com.solaria.persistence.repository.TechnicalProjectRepository;
-import com.solaria.persistence.repository.TechnicalServiceRepository;
+import com.solaria.persistence.repository.execution.ServiceExecutorRepository;
+import com.solaria.persistence.repository.execution.TechnicalProjectRepository;
+import com.solaria.persistence.repository.execution.TechnicalServiceRepository;
import com.solaria.persistence.security.rbac.RbacAuthorizationService;
@Service
diff --git a/src/main/java/com/solaria/persistence/service/InternalUserProvisioningService.java b/src/main/java/com/solaria/persistence/service/identity/InternalUserProvisioningService.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/service/InternalUserProvisioningService.java
rename to src/main/java/com/solaria/persistence/service/identity/InternalUserProvisioningService.java
index 17506e6..ee28716 100644
--- a/src/main/java/com/solaria/persistence/service/InternalUserProvisioningService.java
+++ b/src/main/java/com/solaria/persistence/service/identity/InternalUserProvisioningService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.identity;
import java.util.Optional;
import java.util.UUID;
@@ -7,9 +7,9 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.User;
-import com.solaria.persistence.dto.response.InternalUserProvisionResponseDTO;
-import com.solaria.persistence.repository.UserRepository;
+import com.solaria.persistence.domain.entity.identity.User;
+import com.solaria.persistence.dto.response.identity.InternalUserProvisionResponseDTO;
+import com.solaria.persistence.repository.identity.UserRepository;
// classe service dedicada a eventos de registro de Users vindos de api-auth (M2M)
// separado de UserService pois fluxo prexisa ser idempotente; entrega de eventos em fila
diff --git a/src/main/java/com/solaria/persistence/service/PermissionService.java b/src/main/java/com/solaria/persistence/service/identity/PermissionService.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/service/PermissionService.java
rename to src/main/java/com/solaria/persistence/service/identity/PermissionService.java
index ce163a3..ef365b9 100644
--- a/src/main/java/com/solaria/persistence/service/PermissionService.java
+++ b/src/main/java/com/solaria/persistence/service/identity/PermissionService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.identity;
import java.util.List;
import java.util.UUID;
@@ -7,13 +7,13 @@
import org.springframework.transaction.annotation.Transactional;
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.dto.request.PermissionRequestDTO;
-import com.solaria.persistence.dto.response.PermissionResponseDTO;
-import com.solaria.persistence.domain.entity.Permission;
+import com.solaria.persistence.dto.request.identity.PermissionRequestDTO;
+import com.solaria.persistence.dto.response.identity.PermissionResponseDTO;
+import com.solaria.persistence.domain.entity.identity.Permission;
import com.solaria.persistence.exception.DuplicateResourceException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.PermissionRepository;
-import com.solaria.persistence.repository.PositionPermissionRepository;
+import com.solaria.persistence.repository.identity.PermissionRepository;
+import com.solaria.persistence.repository.identity.PositionPermissionRepository;
@Service
public class PermissionService {
diff --git a/src/main/java/com/solaria/persistence/service/PersonService.java b/src/main/java/com/solaria/persistence/service/identity/PersonService.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/service/PersonService.java
rename to src/main/java/com/solaria/persistence/service/identity/PersonService.java
index cbd937d..46f0b00 100644
--- a/src/main/java/com/solaria/persistence/service/PersonService.java
+++ b/src/main/java/com/solaria/persistence/service/identity/PersonService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.identity;
import java.time.LocalDate;
import java.util.List;
@@ -7,20 +7,20 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.Contact;
-import com.solaria.persistence.domain.entity.Person;
-import com.solaria.persistence.domain.entity.User;
-import com.solaria.persistence.dto.request.PersonRequestDTO;
-import com.solaria.persistence.dto.response.ContactResponseDTO;
-import com.solaria.persistence.dto.response.PersonResponseDTO;
+import com.solaria.persistence.domain.entity.shared.Contact;
+import com.solaria.persistence.domain.entity.identity.Person;
+import com.solaria.persistence.domain.entity.identity.User;
+import com.solaria.persistence.dto.request.identity.PersonRequestDTO;
+import com.solaria.persistence.dto.response.shared.ContactResponseDTO;
+import com.solaria.persistence.dto.response.identity.PersonResponseDTO;
import com.solaria.persistence.exception.DuplicateResourceException;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.ContactRepository;
-import com.solaria.persistence.repository.PersonRepository;
-import com.solaria.persistence.repository.TechnicianRepository;
-import com.solaria.persistence.repository.UserRepository;
+import com.solaria.persistence.repository.shared.ContactRepository;
+import com.solaria.persistence.repository.identity.PersonRepository;
+import com.solaria.persistence.repository.professional.TechnicianRepository;
+import com.solaria.persistence.repository.identity.UserRepository;
@Service
public class PersonService {
diff --git a/src/main/java/com/solaria/persistence/service/PositionPermissionService.java b/src/main/java/com/solaria/persistence/service/identity/PositionPermissionService.java
similarity index 83%
rename from src/main/java/com/solaria/persistence/service/PositionPermissionService.java
rename to src/main/java/com/solaria/persistence/service/identity/PositionPermissionService.java
index b809cf7..45a1039 100644
--- a/src/main/java/com/solaria/persistence/service/PositionPermissionService.java
+++ b/src/main/java/com/solaria/persistence/service/identity/PositionPermissionService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.identity;
import java.util.List;
import java.util.UUID;
@@ -6,18 +6,18 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.dto.response.PermissionResponseDTO;
-import com.solaria.persistence.dto.request.PositionPermissionRequestDTO;
-import com.solaria.persistence.dto.response.PositionPermissionResponseDTO;
-import com.solaria.persistence.domain.entity.Permission;
-import com.solaria.persistence.domain.entity.Position;
-import com.solaria.persistence.domain.entity.PositionPermission;
+import com.solaria.persistence.dto.response.identity.PermissionResponseDTO;
+import com.solaria.persistence.dto.request.identity.PositionPermissionRequestDTO;
+import com.solaria.persistence.dto.response.identity.PositionPermissionResponseDTO;
+import com.solaria.persistence.domain.entity.identity.Permission;
+import com.solaria.persistence.domain.entity.identity.Position;
+import com.solaria.persistence.domain.entity.identity.PositionPermission;
import com.solaria.persistence.exception.DuplicateResourceException;
import com.solaria.persistence.exception.ResourceNotFoundException;
import com.solaria.persistence.exception.UnauthorizedAccessException;
-import com.solaria.persistence.repository.PermissionRepository;
-import com.solaria.persistence.repository.PositionPermissionRepository;
-import com.solaria.persistence.repository.PositionRepository;
+import com.solaria.persistence.repository.identity.PermissionRepository;
+import com.solaria.persistence.repository.identity.PositionPermissionRepository;
+import com.solaria.persistence.repository.identity.PositionRepository;
@Service
diff --git a/src/main/java/com/solaria/persistence/service/PositionService.java b/src/main/java/com/solaria/persistence/service/identity/PositionService.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/service/PositionService.java
rename to src/main/java/com/solaria/persistence/service/identity/PositionService.java
index d3f1f29..aeef835 100644
--- a/src/main/java/com/solaria/persistence/service/PositionService.java
+++ b/src/main/java/com/solaria/persistence/service/identity/PositionService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.identity;
import java.util.List;
import java.util.UUID;
@@ -7,16 +7,16 @@
import org.springframework.transaction.annotation.Transactional;
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.dto.request.PositionRequestDTO;
-import com.solaria.persistence.dto.response.PositionResponseDTO;
-import com.solaria.persistence.domain.entity.Position;
+import com.solaria.persistence.dto.request.identity.PositionRequestDTO;
+import com.solaria.persistence.dto.response.identity.PositionResponseDTO;
+import com.solaria.persistence.domain.entity.identity.Position;
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
import com.solaria.persistence.exception.UnauthorizedAccessException;
-import com.solaria.persistence.repository.CompanyPositionsRepository;
-import com.solaria.persistence.repository.PositionPermissionRepository;
-import com.solaria.persistence.repository.PositionRepository;
-import com.solaria.persistence.repository.UserCompanyRepository;
+import com.solaria.persistence.repository.company.CompanyPositionsRepository;
+import com.solaria.persistence.repository.identity.PositionPermissionRepository;
+import com.solaria.persistence.repository.identity.PositionRepository;
+import com.solaria.persistence.repository.identity.UserCompanyRepository;
@Service
diff --git a/src/main/java/com/solaria/persistence/service/UserCompanyService.java b/src/main/java/com/solaria/persistence/service/identity/UserCompanyService.java
similarity index 89%
rename from src/main/java/com/solaria/persistence/service/UserCompanyService.java
rename to src/main/java/com/solaria/persistence/service/identity/UserCompanyService.java
index d61df46..5ec1711 100644
--- a/src/main/java/com/solaria/persistence/service/UserCompanyService.java
+++ b/src/main/java/com/solaria/persistence/service/identity/UserCompanyService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.identity;
import java.util.List;
import java.util.UUID;
@@ -7,22 +7,22 @@
import org.springframework.transaction.annotation.Transactional;
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.dto.response.PositionResponseDTO;
-import com.solaria.persistence.dto.request.UserCompanyRequestDTO;
-import com.solaria.persistence.dto.response.UserCompanyResponseDTO;
-import com.solaria.persistence.domain.entity.Company;
-import com.solaria.persistence.domain.entity.Position;
-import com.solaria.persistence.domain.entity.User;
-import com.solaria.persistence.domain.entity.UserCompany;
+import com.solaria.persistence.dto.response.identity.PositionResponseDTO;
+import com.solaria.persistence.dto.request.identity.UserCompanyRequestDTO;
+import com.solaria.persistence.dto.response.identity.UserCompanyResponseDTO;
+import com.solaria.persistence.domain.entity.company.Company;
+import com.solaria.persistence.domain.entity.identity.Position;
+import com.solaria.persistence.domain.entity.identity.User;
+import com.solaria.persistence.domain.entity.identity.UserCompany;
import com.solaria.persistence.exception.DuplicateResourceException;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceNotFoundException;
import com.solaria.persistence.exception.UnauthorizedAccessException;
-import com.solaria.persistence.repository.CompanyPositionsRepository;
-import com.solaria.persistence.repository.CompanyRepository;
-import com.solaria.persistence.repository.PositionRepository;
-import com.solaria.persistence.repository.UserCompanyRepository;
-import com.solaria.persistence.repository.UserRepository;
+import com.solaria.persistence.repository.company.CompanyPositionsRepository;
+import com.solaria.persistence.repository.company.CompanyRepository;
+import com.solaria.persistence.repository.identity.PositionRepository;
+import com.solaria.persistence.repository.identity.UserCompanyRepository;
+import com.solaria.persistence.repository.identity.UserRepository;
import com.solaria.persistence.security.rbac.RbacAuthorizationService;
diff --git a/src/main/java/com/solaria/persistence/service/UserPhotoService.java b/src/main/java/com/solaria/persistence/service/identity/UserPhotoService.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/service/UserPhotoService.java
rename to src/main/java/com/solaria/persistence/service/identity/UserPhotoService.java
index 6d4b206..4c3d64d 100644
--- a/src/main/java/com/solaria/persistence/service/UserPhotoService.java
+++ b/src/main/java/com/solaria/persistence/service/identity/UserPhotoService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.identity;
import java.time.OffsetDateTime;
import java.util.List;
@@ -10,15 +10,16 @@
import org.springframework.web.multipart.MultipartFile;
import com.solaria.persistence.config.CloudinaryProperties;
-import com.solaria.persistence.domain.entity.User;
-import com.solaria.persistence.domain.entity.UserPhoto;
-import com.solaria.persistence.domain.enums.PhotoType;
-import com.solaria.persistence.dto.response.UserPhotoResponseDTO;
+import com.solaria.persistence.domain.entity.identity.User;
+import com.solaria.persistence.domain.entity.identity.UserPhoto;
+import com.solaria.persistence.domain.enums.shared.PhotoType;
+import com.solaria.persistence.dto.response.identity.UserPhotoResponseDTO;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.UserPhotoRepository;
-import com.solaria.persistence.repository.UserRepository;
+import com.solaria.persistence.repository.identity.UserPhotoRepository;
+import com.solaria.persistence.repository.identity.UserRepository;
import com.solaria.persistence.security.rbac.RbacAuthorizationService;
-import com.solaria.persistence.service.CloudinaryService.UploadResult;
+import com.solaria.persistence.service.shared.CloudinaryService.UploadResult;
+import com.solaria.persistence.service.shared.CloudinaryService;
@Service
public class UserPhotoService {
diff --git a/src/main/java/com/solaria/persistence/service/UserService.java b/src/main/java/com/solaria/persistence/service/identity/UserService.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/service/UserService.java
rename to src/main/java/com/solaria/persistence/service/identity/UserService.java
index d0835ca..649b97a 100644
--- a/src/main/java/com/solaria/persistence/service/UserService.java
+++ b/src/main/java/com/solaria/persistence/service/identity/UserService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.identity;
import java.util.List;
import java.util.UUID;
@@ -8,16 +8,16 @@
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.domain.entity.User;
-import com.solaria.persistence.dto.request.UserRequestDTO;
-import com.solaria.persistence.dto.response.UserResponseDTO;
+import com.solaria.persistence.domain.entity.identity.User;
+import com.solaria.persistence.dto.request.identity.UserRequestDTO;
+import com.solaria.persistence.dto.response.identity.UserResponseDTO;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.PersonRepository;
-import com.solaria.persistence.repository.UserCompanyRepository;
-import com.solaria.persistence.repository.UserPhotoRepository;
-import com.solaria.persistence.repository.UserRepository;
+import com.solaria.persistence.repository.identity.PersonRepository;
+import com.solaria.persistence.repository.identity.UserCompanyRepository;
+import com.solaria.persistence.repository.identity.UserPhotoRepository;
+import com.solaria.persistence.repository.identity.UserRepository;
@Service
diff --git a/src/main/java/com/solaria/persistence/service/CertificationRecordService.java b/src/main/java/com/solaria/persistence/service/professional/CertificationRecordService.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/service/CertificationRecordService.java
rename to src/main/java/com/solaria/persistence/service/professional/CertificationRecordService.java
index a712915..7688c9c 100644
--- a/src/main/java/com/solaria/persistence/service/CertificationRecordService.java
+++ b/src/main/java/com/solaria/persistence/service/professional/CertificationRecordService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.professional;
import java.util.List;
import java.util.UUID;
@@ -6,15 +6,15 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.Certification;
-import com.solaria.persistence.domain.entity.CertificationRecord;
-import com.solaria.persistence.domain.entity.ProfessionalRegistration;
-import com.solaria.persistence.dto.request.CertificationRecordRequestDTO;
-import com.solaria.persistence.dto.response.CertificationRecordResponseDTO;
+import com.solaria.persistence.domain.entity.professional.Certification;
+import com.solaria.persistence.domain.entity.professional.CertificationRecord;
+import com.solaria.persistence.domain.entity.professional.ProfessionalRegistration;
+import com.solaria.persistence.dto.request.professional.CertificationRecordRequestDTO;
+import com.solaria.persistence.dto.response.professional.CertificationRecordResponseDTO;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.CertificationRecordRepository;
-import com.solaria.persistence.repository.CertificationRepository;
-import com.solaria.persistence.repository.ProfessionalRegistrationRepository;
+import com.solaria.persistence.repository.professional.CertificationRecordRepository;
+import com.solaria.persistence.repository.professional.CertificationRepository;
+import com.solaria.persistence.repository.professional.ProfessionalRegistrationRepository;
@Service
diff --git a/src/main/java/com/solaria/persistence/service/CertificationService.java b/src/main/java/com/solaria/persistence/service/professional/CertificationService.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/service/CertificationService.java
rename to src/main/java/com/solaria/persistence/service/professional/CertificationService.java
index f0df2e8..684232d 100644
--- a/src/main/java/com/solaria/persistence/service/CertificationService.java
+++ b/src/main/java/com/solaria/persistence/service/professional/CertificationService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.professional;
import java.util.List;
import java.util.UUID;
@@ -8,13 +8,13 @@
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.domain.entity.Certification;
-import com.solaria.persistence.dto.request.CertificationRequestDTO;
-import com.solaria.persistence.dto.response.CertificationResponseDTO;
+import com.solaria.persistence.domain.entity.professional.Certification;
+import com.solaria.persistence.dto.request.professional.CertificationRequestDTO;
+import com.solaria.persistence.dto.response.professional.CertificationResponseDTO;
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.CertificationRecordRepository;
-import com.solaria.persistence.repository.CertificationRepository;
+import com.solaria.persistence.repository.professional.CertificationRecordRepository;
+import com.solaria.persistence.repository.professional.CertificationRepository;
@Service
public class CertificationService {
diff --git a/src/main/java/com/solaria/persistence/service/ProfessionService.java b/src/main/java/com/solaria/persistence/service/professional/ProfessionService.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/service/ProfessionService.java
rename to src/main/java/com/solaria/persistence/service/professional/ProfessionService.java
index 49a7a06..f267656 100644
--- a/src/main/java/com/solaria/persistence/service/ProfessionService.java
+++ b/src/main/java/com/solaria/persistence/service/professional/ProfessionService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.professional;
import java.util.List;
import java.util.UUID;
@@ -8,13 +8,13 @@
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.domain.entity.Profession;
-import com.solaria.persistence.dto.request.ProfessionRequestDTO;
-import com.solaria.persistence.dto.response.ProfessionResponseDTO;
+import com.solaria.persistence.domain.entity.professional.Profession;
+import com.solaria.persistence.dto.request.professional.ProfessionRequestDTO;
+import com.solaria.persistence.dto.response.professional.ProfessionResponseDTO;
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.ProfessionRepository;
-import com.solaria.persistence.repository.ProfessionalRegistrationRepository;
+import com.solaria.persistence.repository.professional.ProfessionRepository;
+import com.solaria.persistence.repository.professional.ProfessionalRegistrationRepository;
@Service
public class ProfessionService {
diff --git a/src/main/java/com/solaria/persistence/service/ProfessionalRegistrationService.java b/src/main/java/com/solaria/persistence/service/professional/ProfessionalRegistrationService.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/service/ProfessionalRegistrationService.java
rename to src/main/java/com/solaria/persistence/service/professional/ProfessionalRegistrationService.java
index 636be98..b088c49 100644
--- a/src/main/java/com/solaria/persistence/service/ProfessionalRegistrationService.java
+++ b/src/main/java/com/solaria/persistence/service/professional/ProfessionalRegistrationService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.professional;
import java.util.List;
import java.util.UUID;
@@ -6,17 +6,17 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.ProfessionalRegistration;
-import com.solaria.persistence.domain.entity.Profession;
-import com.solaria.persistence.domain.entity.Technician;
-import com.solaria.persistence.dto.request.ProfessionalRegistrationRequestDTO;
-import com.solaria.persistence.dto.response.ProfessionalRegistrationResponseDTO;
+import com.solaria.persistence.domain.entity.professional.ProfessionalRegistration;
+import com.solaria.persistence.domain.entity.professional.Profession;
+import com.solaria.persistence.domain.entity.professional.Technician;
+import com.solaria.persistence.dto.request.professional.ProfessionalRegistrationRequestDTO;
+import com.solaria.persistence.dto.response.professional.ProfessionalRegistrationResponseDTO;
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.CertificationRecordRepository;
-import com.solaria.persistence.repository.ProfessionRepository;
-import com.solaria.persistence.repository.ProfessionalRegistrationRepository;
-import com.solaria.persistence.repository.TechnicianRepository;
+import com.solaria.persistence.repository.professional.CertificationRecordRepository;
+import com.solaria.persistence.repository.professional.ProfessionRepository;
+import com.solaria.persistence.repository.professional.ProfessionalRegistrationRepository;
+import com.solaria.persistence.repository.professional.TechnicianRepository;
@Service
diff --git a/src/main/java/com/solaria/persistence/service/ProfessionalReviewService.java b/src/main/java/com/solaria/persistence/service/professional/ProfessionalReviewService.java
similarity index 85%
rename from src/main/java/com/solaria/persistence/service/ProfessionalReviewService.java
rename to src/main/java/com/solaria/persistence/service/professional/ProfessionalReviewService.java
index 7ce9933..8b1b426 100644
--- a/src/main/java/com/solaria/persistence/service/ProfessionalReviewService.java
+++ b/src/main/java/com/solaria/persistence/service/professional/ProfessionalReviewService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.professional;
import java.math.BigDecimal;
import java.time.OffsetDateTime;
@@ -8,22 +8,22 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.ProfessionalReview;
-import com.solaria.persistence.domain.entity.Technician;
-import com.solaria.persistence.domain.entity.TechnicalService;
-import com.solaria.persistence.domain.entity.User;
-import com.solaria.persistence.domain.enums.ServiceStatus;
-import com.solaria.persistence.dto.request.ProfessionalReviewRequestDTO;
-import com.solaria.persistence.dto.response.ProfessionalReviewResponseDTO;
+import com.solaria.persistence.domain.entity.professional.ProfessionalReview;
+import com.solaria.persistence.domain.entity.professional.Technician;
+import com.solaria.persistence.domain.entity.execution.TechnicalService;
+import com.solaria.persistence.domain.entity.identity.User;
+import com.solaria.persistence.domain.enums.execution.ServiceStatus;
+import com.solaria.persistence.dto.request.professional.ProfessionalReviewRequestDTO;
+import com.solaria.persistence.dto.response.professional.ProfessionalReviewResponseDTO;
import com.solaria.persistence.exception.BusinessRuleException;
import com.solaria.persistence.exception.DuplicateResourceException;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.ProfessionalReviewRepository;
-import com.solaria.persistence.repository.ServiceExecutorRepository;
-import com.solaria.persistence.repository.TechnicalServiceRepository;
-import com.solaria.persistence.repository.TechnicianRepository;
-import com.solaria.persistence.repository.UserRepository;
+import com.solaria.persistence.repository.professional.ProfessionalReviewRepository;
+import com.solaria.persistence.repository.execution.ServiceExecutorRepository;
+import com.solaria.persistence.repository.execution.TechnicalServiceRepository;
+import com.solaria.persistence.repository.professional.TechnicianRepository;
+import com.solaria.persistence.repository.identity.UserRepository;
@Service
public class ProfessionalReviewService {
diff --git a/src/main/java/com/solaria/persistence/service/ShiftService.java b/src/main/java/com/solaria/persistence/service/professional/ShiftService.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/service/ShiftService.java
rename to src/main/java/com/solaria/persistence/service/professional/ShiftService.java
index c793265..3531d4d 100644
--- a/src/main/java/com/solaria/persistence/service/ShiftService.java
+++ b/src/main/java/com/solaria/persistence/service/professional/ShiftService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.professional;
import java.util.List;
import java.util.UUID;
@@ -6,14 +6,14 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.Shift;
-import com.solaria.persistence.domain.entity.Technician;
-import com.solaria.persistence.dto.request.ShiftRequestDTO;
-import com.solaria.persistence.dto.response.ShiftResponseDTO;
+import com.solaria.persistence.domain.entity.professional.Shift;
+import com.solaria.persistence.domain.entity.professional.Technician;
+import com.solaria.persistence.dto.request.professional.ShiftRequestDTO;
+import com.solaria.persistence.dto.response.professional.ShiftResponseDTO;
import com.solaria.persistence.exception.BusinessRuleException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.ShiftRepository;
-import com.solaria.persistence.repository.TechnicianRepository;
+import com.solaria.persistence.repository.professional.ShiftRepository;
+import com.solaria.persistence.repository.professional.TechnicianRepository;
@Service
public class ShiftService {
diff --git a/src/main/java/com/solaria/persistence/service/TechnicalCourseService.java b/src/main/java/com/solaria/persistence/service/professional/TechnicalCourseService.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/service/TechnicalCourseService.java
rename to src/main/java/com/solaria/persistence/service/professional/TechnicalCourseService.java
index 17d9411..ee55968 100644
--- a/src/main/java/com/solaria/persistence/service/TechnicalCourseService.java
+++ b/src/main/java/com/solaria/persistence/service/professional/TechnicalCourseService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.professional;
import java.util.List;
import java.util.UUID;
@@ -6,13 +6,13 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.Company;
-import com.solaria.persistence.domain.entity.TechnicalCourse;
-import com.solaria.persistence.dto.request.TechnicalCourseRequestDTO;
-import com.solaria.persistence.dto.response.TechnicalCourseResponseDTO;
+import com.solaria.persistence.domain.entity.company.Company;
+import com.solaria.persistence.domain.entity.professional.TechnicalCourse;
+import com.solaria.persistence.dto.request.professional.TechnicalCourseRequestDTO;
+import com.solaria.persistence.dto.response.professional.TechnicalCourseResponseDTO;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.CompanyRepository;
-import com.solaria.persistence.repository.TechnicalCourseRepository;
+import com.solaria.persistence.repository.company.CompanyRepository;
+import com.solaria.persistence.repository.professional.TechnicalCourseRepository;
@Service
public class TechnicalCourseService {
diff --git a/src/main/java/com/solaria/persistence/service/TechnicianAffiliationService.java b/src/main/java/com/solaria/persistence/service/professional/TechnicianAffiliationService.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/service/TechnicianAffiliationService.java
rename to src/main/java/com/solaria/persistence/service/professional/TechnicianAffiliationService.java
index d85b046..a334096 100644
--- a/src/main/java/com/solaria/persistence/service/TechnicianAffiliationService.java
+++ b/src/main/java/com/solaria/persistence/service/professional/TechnicianAffiliationService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.professional;
import java.util.List;
import java.util.UUID;
@@ -8,17 +8,17 @@
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.domain.entity.Company;
-import com.solaria.persistence.domain.entity.Technician;
-import com.solaria.persistence.domain.entity.TechnicianAffiliation;
-import com.solaria.persistence.domain.enums.TechnicalAffiliationType;
-import com.solaria.persistence.dto.request.TechnicianAffiliationRequestDTO;
-import com.solaria.persistence.dto.response.TechnicianAffiliationResponseDTO;
+import com.solaria.persistence.domain.entity.company.Company;
+import com.solaria.persistence.domain.entity.professional.Technician;
+import com.solaria.persistence.domain.entity.professional.TechnicianAffiliation;
+import com.solaria.persistence.domain.enums.professional.TechnicalAffiliationType;
+import com.solaria.persistence.dto.request.professional.TechnicianAffiliationRequestDTO;
+import com.solaria.persistence.dto.response.professional.TechnicianAffiliationResponseDTO;
import com.solaria.persistence.exception.DuplicateResourceException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.CompanyRepository;
-import com.solaria.persistence.repository.TechnicianAffiliationRepository;
-import com.solaria.persistence.repository.TechnicianRepository;
+import com.solaria.persistence.repository.company.CompanyRepository;
+import com.solaria.persistence.repository.professional.TechnicianAffiliationRepository;
+import com.solaria.persistence.repository.professional.TechnicianRepository;
@Service
public class TechnicianAffiliationService {
diff --git a/src/main/java/com/solaria/persistence/service/TechnicianService.java b/src/main/java/com/solaria/persistence/service/professional/TechnicianService.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/service/TechnicianService.java
rename to src/main/java/com/solaria/persistence/service/professional/TechnicianService.java
index f3c444f..c7d3f26 100644
--- a/src/main/java/com/solaria/persistence/service/TechnicianService.java
+++ b/src/main/java/com/solaria/persistence/service/professional/TechnicianService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.professional;
import java.util.List;
import java.util.UUID;
@@ -6,18 +6,18 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.Contact;
-import com.solaria.persistence.domain.entity.Person;
-import com.solaria.persistence.domain.entity.Technician;
-import com.solaria.persistence.dto.request.TechnicianRequestDTO;
-import com.solaria.persistence.dto.response.ContactResponseDTO;
-import com.solaria.persistence.dto.response.PersonResponseDTO;
-import com.solaria.persistence.dto.response.TechnicianResponseDTO;
+import com.solaria.persistence.domain.entity.shared.Contact;
+import com.solaria.persistence.domain.entity.identity.Person;
+import com.solaria.persistence.domain.entity.professional.Technician;
+import com.solaria.persistence.dto.request.professional.TechnicianRequestDTO;
+import com.solaria.persistence.dto.response.shared.ContactResponseDTO;
+import com.solaria.persistence.dto.response.identity.PersonResponseDTO;
+import com.solaria.persistence.dto.response.professional.TechnicianResponseDTO;
import com.solaria.persistence.exception.DuplicateResourceException;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.PersonRepository;
-import com.solaria.persistence.repository.TechnicianRepository;
+import com.solaria.persistence.repository.identity.PersonRepository;
+import com.solaria.persistence.repository.professional.TechnicianRepository;
import com.solaria.persistence.util.SlugUtil;
diff --git a/src/main/java/com/solaria/persistence/service/ProposalItemService.java b/src/main/java/com/solaria/persistence/service/proposal/ProposalItemService.java
similarity index 91%
rename from src/main/java/com/solaria/persistence/service/ProposalItemService.java
rename to src/main/java/com/solaria/persistence/service/proposal/ProposalItemService.java
index f68784e..5c83c55 100644
--- a/src/main/java/com/solaria/persistence/service/ProposalItemService.java
+++ b/src/main/java/com/solaria/persistence/service/proposal/ProposalItemService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.proposal;
import java.math.BigDecimal;
import java.time.OffsetDateTime;
@@ -8,21 +8,21 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.Model;
-import com.solaria.persistence.domain.entity.Offer;
-import com.solaria.persistence.domain.entity.Proposal;
-import com.solaria.persistence.domain.entity.ProposalItem;
-import com.solaria.persistence.dto.request.ProposalItemRequestDTO;
-import com.solaria.persistence.dto.response.ModelResponseDTO;
-import com.solaria.persistence.dto.response.OfferResponseDTO;
-import com.solaria.persistence.dto.response.ProposalItemResponseDTO;
+import com.solaria.persistence.domain.entity.catalog.Model;
+import com.solaria.persistence.domain.entity.catalog.Offer;
+import com.solaria.persistence.domain.entity.proposal.Proposal;
+import com.solaria.persistence.domain.entity.proposal.ProposalItem;
+import com.solaria.persistence.dto.request.proposal.ProposalItemRequestDTO;
+import com.solaria.persistence.dto.response.catalog.ModelResponseDTO;
+import com.solaria.persistence.dto.response.catalog.OfferResponseDTO;
+import com.solaria.persistence.dto.response.proposal.ProposalItemResponseDTO;
import com.solaria.persistence.exception.BusinessRuleException;
import com.solaria.persistence.exception.DuplicateResourceException;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.OfferRepository;
-import com.solaria.persistence.repository.ProposalItemRepository;
-import com.solaria.persistence.repository.ProposalRepository;
+import com.solaria.persistence.repository.catalog.OfferRepository;
+import com.solaria.persistence.repository.proposal.ProposalItemRepository;
+import com.solaria.persistence.repository.proposal.ProposalRepository;
@Service
public class ProposalItemService {
diff --git a/src/main/java/com/solaria/persistence/service/ProposalService.java b/src/main/java/com/solaria/persistence/service/proposal/ProposalService.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/service/ProposalService.java
rename to src/main/java/com/solaria/persistence/service/proposal/ProposalService.java
index bfcfbdd..7a58608 100644
--- a/src/main/java/com/solaria/persistence/service/ProposalService.java
+++ b/src/main/java/com/solaria/persistence/service/proposal/ProposalService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.proposal;
import java.math.BigDecimal;
import java.math.RoundingMode;
@@ -10,21 +10,21 @@
import org.springframework.transaction.annotation.Transactional;
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.dto.request.ProposalRequestDTO;
-import com.solaria.persistence.dto.response.ProposalResponseDTO;
-import com.solaria.persistence.domain.entity.Inventory;
-import com.solaria.persistence.domain.entity.Offer;
-import com.solaria.persistence.domain.entity.Proposal;
-import com.solaria.persistence.domain.entity.ProposalItem;
-import com.solaria.persistence.domain.entity.Requester;
-import com.solaria.persistence.domain.enums.ProposalStatus;
+import com.solaria.persistence.dto.request.proposal.ProposalRequestDTO;
+import com.solaria.persistence.dto.response.proposal.ProposalResponseDTO;
+import com.solaria.persistence.domain.entity.catalog.Inventory;
+import com.solaria.persistence.domain.entity.catalog.Offer;
+import com.solaria.persistence.domain.entity.proposal.Proposal;
+import com.solaria.persistence.domain.entity.proposal.ProposalItem;
+import com.solaria.persistence.domain.entity.execution.Requester;
+import com.solaria.persistence.domain.enums.proposal.ProposalStatus;
import com.solaria.persistence.exception.BusinessRuleException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.InventoryRepository;
-import com.solaria.persistence.repository.OfferRepository;
-import com.solaria.persistence.repository.ProposalItemRepository;
-import com.solaria.persistence.repository.ProposalRepository;
-import com.solaria.persistence.repository.RequesterRepository;
+import com.solaria.persistence.repository.catalog.InventoryRepository;
+import com.solaria.persistence.repository.catalog.OfferRepository;
+import com.solaria.persistence.repository.proposal.ProposalItemRepository;
+import com.solaria.persistence.repository.proposal.ProposalRepository;
+import com.solaria.persistence.repository.execution.RequesterRepository;
import com.solaria.persistence.security.rbac.RbacAuthorizationService;
@Service
diff --git a/src/main/java/com/solaria/persistence/service/ProposalUnitService.java b/src/main/java/com/solaria/persistence/service/proposal/ProposalUnitService.java
similarity index 90%
rename from src/main/java/com/solaria/persistence/service/ProposalUnitService.java
rename to src/main/java/com/solaria/persistence/service/proposal/ProposalUnitService.java
index 1ed8fb0..41f8fb5 100644
--- a/src/main/java/com/solaria/persistence/service/ProposalUnitService.java
+++ b/src/main/java/com/solaria/persistence/service/proposal/ProposalUnitService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.proposal;
import java.util.List;
import java.util.UUID;
@@ -6,22 +6,22 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.Address;
-import com.solaria.persistence.domain.entity.LocalUnit;
-import com.solaria.persistence.domain.entity.ProposalItem;
-import com.solaria.persistence.domain.entity.ProposalUnit;
-import com.solaria.persistence.domain.enums.ProposalStatus;
-import com.solaria.persistence.dto.request.ProposalUnitRequestDTO;
-import com.solaria.persistence.dto.response.AddressResponseDTO;
-import com.solaria.persistence.dto.response.LocalUnitResponseDTO;
-import com.solaria.persistence.dto.response.ProposalUnitResponseDTO;
+import com.solaria.persistence.domain.entity.shared.Address;
+import com.solaria.persistence.domain.entity.unit.LocalUnit;
+import com.solaria.persistence.domain.entity.proposal.ProposalItem;
+import com.solaria.persistence.domain.entity.proposal.ProposalUnit;
+import com.solaria.persistence.domain.enums.proposal.ProposalStatus;
+import com.solaria.persistence.dto.request.proposal.ProposalUnitRequestDTO;
+import com.solaria.persistence.dto.response.shared.AddressResponseDTO;
+import com.solaria.persistence.dto.response.unit.LocalUnitResponseDTO;
+import com.solaria.persistence.dto.response.proposal.ProposalUnitResponseDTO;
import com.solaria.persistence.exception.BusinessRuleException;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceNotFoundException;
import com.solaria.persistence.exception.UnauthorizedAccessException;
-import com.solaria.persistence.repository.LocalUnitRepository;
-import com.solaria.persistence.repository.ProposalItemRepository;
-import com.solaria.persistence.repository.ProposalUnitRepository;
+import com.solaria.persistence.repository.unit.LocalUnitRepository;
+import com.solaria.persistence.repository.proposal.ProposalItemRepository;
+import com.solaria.persistence.repository.proposal.ProposalUnitRepository;
@Service
public class ProposalUnitService {
diff --git a/src/main/java/com/solaria/persistence/service/AddressService.java b/src/main/java/com/solaria/persistence/service/shared/AddressService.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/service/AddressService.java
rename to src/main/java/com/solaria/persistence/service/shared/AddressService.java
index ac08327..17a5c77 100644
--- a/src/main/java/com/solaria/persistence/service/AddressService.java
+++ b/src/main/java/com/solaria/persistence/service/shared/AddressService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.shared;
import java.util.List;
import java.util.UUID;
@@ -6,15 +6,15 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.Address;
-import com.solaria.persistence.dto.request.AddressRequestDTO;
-import com.solaria.persistence.dto.response.AddressResponseDTO;
+import com.solaria.persistence.domain.entity.shared.Address;
+import com.solaria.persistence.dto.request.shared.AddressRequestDTO;
+import com.solaria.persistence.dto.response.shared.AddressResponseDTO;
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.AddressRepository;
-import com.solaria.persistence.repository.CompanyRepository;
-import com.solaria.persistence.repository.GeolocalizationRepository;
-import com.solaria.persistence.repository.LocalUnitRepository;
+import com.solaria.persistence.repository.shared.AddressRepository;
+import com.solaria.persistence.repository.company.CompanyRepository;
+import com.solaria.persistence.repository.shared.GeolocalizationRepository;
+import com.solaria.persistence.repository.unit.LocalUnitRepository;
import tools.jackson.databind.ObjectMapper;
diff --git a/src/main/java/com/solaria/persistence/service/AuditService.java b/src/main/java/com/solaria/persistence/service/shared/AuditService.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/service/AuditService.java
rename to src/main/java/com/solaria/persistence/service/shared/AuditService.java
index 349c2ed..d9d8945 100644
--- a/src/main/java/com/solaria/persistence/service/AuditService.java
+++ b/src/main/java/com/solaria/persistence/service/shared/AuditService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.shared;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
diff --git a/src/main/java/com/solaria/persistence/service/CloudinaryService.java b/src/main/java/com/solaria/persistence/service/shared/CloudinaryService.java
similarity index 99%
rename from src/main/java/com/solaria/persistence/service/CloudinaryService.java
rename to src/main/java/com/solaria/persistence/service/shared/CloudinaryService.java
index 7c0d150..bf5e7b4 100644
--- a/src/main/java/com/solaria/persistence/service/CloudinaryService.java
+++ b/src/main/java/com/solaria/persistence/service/shared/CloudinaryService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.shared;
import java.io.IOException;
import java.util.Map;
diff --git a/src/main/java/com/solaria/persistence/service/ContactService.java b/src/main/java/com/solaria/persistence/service/shared/ContactService.java
similarity index 87%
rename from src/main/java/com/solaria/persistence/service/ContactService.java
rename to src/main/java/com/solaria/persistence/service/shared/ContactService.java
index 809897d..f040af6 100644
--- a/src/main/java/com/solaria/persistence/service/ContactService.java
+++ b/src/main/java/com/solaria/persistence/service/shared/ContactService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.shared;
import java.util.List;
import java.util.UUID;
@@ -8,13 +8,13 @@
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.domain.entity.Contact;
-import com.solaria.persistence.dto.request.ContactRequestDTO;
-import com.solaria.persistence.dto.response.ContactResponseDTO;
+import com.solaria.persistence.domain.entity.shared.Contact;
+import com.solaria.persistence.dto.request.shared.ContactRequestDTO;
+import com.solaria.persistence.dto.response.shared.ContactResponseDTO;
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.ContactRepository;
-import com.solaria.persistence.repository.PersonRepository;
+import com.solaria.persistence.repository.shared.ContactRepository;
+import com.solaria.persistence.repository.identity.PersonRepository;
@Service
public class ContactService {
diff --git a/src/main/java/com/solaria/persistence/service/FluxLogService.java b/src/main/java/com/solaria/persistence/service/shared/FluxLogService.java
similarity index 80%
rename from src/main/java/com/solaria/persistence/service/FluxLogService.java
rename to src/main/java/com/solaria/persistence/service/shared/FluxLogService.java
index 671e617..ebb28f8 100644
--- a/src/main/java/com/solaria/persistence/service/FluxLogService.java
+++ b/src/main/java/com/solaria/persistence/service/shared/FluxLogService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.shared;
import java.time.OffsetDateTime;
import java.util.List;
@@ -7,13 +7,13 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.FluxLog;
-import com.solaria.persistence.domain.entity.User;
-import com.solaria.persistence.dto.request.FluxLogRequestDTO;
-import com.solaria.persistence.dto.response.FluxLogResponseDTO;
+import com.solaria.persistence.domain.entity.shared.FluxLog;
+import com.solaria.persistence.domain.entity.identity.User;
+import com.solaria.persistence.dto.request.shared.FluxLogRequestDTO;
+import com.solaria.persistence.dto.response.shared.FluxLogResponseDTO;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.FluxLogRepository;
-import com.solaria.persistence.repository.UserRepository;
+import com.solaria.persistence.repository.shared.FluxLogRepository;
+import com.solaria.persistence.repository.identity.UserRepository;
@Service
diff --git a/src/main/java/com/solaria/persistence/service/GeolocalizationService.java b/src/main/java/com/solaria/persistence/service/shared/GeolocalizationService.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/service/GeolocalizationService.java
rename to src/main/java/com/solaria/persistence/service/shared/GeolocalizationService.java
index 607df98..bcc38de 100644
--- a/src/main/java/com/solaria/persistence/service/GeolocalizationService.java
+++ b/src/main/java/com/solaria/persistence/service/shared/GeolocalizationService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.shared;
import java.math.BigDecimal;
import java.util.List;
@@ -9,15 +9,15 @@
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.domain.entity.Address;
-import com.solaria.persistence.domain.entity.Geolocalization;
-import com.solaria.persistence.dto.request.GeolocalizationRequestDTO;
-import com.solaria.persistence.dto.response.GeolocalizationResponseDTO;
+import com.solaria.persistence.domain.entity.shared.Address;
+import com.solaria.persistence.domain.entity.shared.Geolocalization;
+import com.solaria.persistence.dto.request.shared.GeolocalizationRequestDTO;
+import com.solaria.persistence.dto.response.shared.GeolocalizationResponseDTO;
import com.solaria.persistence.exception.DuplicateResourceException;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.AddressRepository;
-import com.solaria.persistence.repository.GeolocalizationRepository;
+import com.solaria.persistence.repository.shared.AddressRepository;
+import com.solaria.persistence.repository.shared.GeolocalizationRepository;
@Service
public class GeolocalizationService {
diff --git a/src/main/java/com/solaria/persistence/service/EnergyBillService.java b/src/main/java/com/solaria/persistence/service/unit/EnergyBillService.java
similarity index 92%
rename from src/main/java/com/solaria/persistence/service/EnergyBillService.java
rename to src/main/java/com/solaria/persistence/service/unit/EnergyBillService.java
index 76b949a..ec686b7 100644
--- a/src/main/java/com/solaria/persistence/service/EnergyBillService.java
+++ b/src/main/java/com/solaria/persistence/service/unit/EnergyBillService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.unit;
import java.math.BigDecimal;
import java.util.List;
@@ -10,18 +10,19 @@
import org.springframework.web.multipart.MultipartFile;
import com.solaria.persistence.config.CloudinaryProperties;
-import com.solaria.persistence.domain.entity.EnergyBill;
-import com.solaria.persistence.domain.entity.LocalUnit;
-import com.solaria.persistence.dto.request.EnergyBillRequestDTO;
-import com.solaria.persistence.dto.response.EnergyBillResponseDTO;
+import com.solaria.persistence.domain.entity.unit.EnergyBill;
+import com.solaria.persistence.domain.entity.unit.LocalUnit;
+import com.solaria.persistence.dto.request.unit.EnergyBillRequestDTO;
+import com.solaria.persistence.dto.response.unit.EnergyBillResponseDTO;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.EnergyBillRepository;
-import com.solaria.persistence.repository.LocalUnitRepository;
+import com.solaria.persistence.repository.unit.EnergyBillRepository;
+import com.solaria.persistence.repository.unit.LocalUnitRepository;
import com.solaria.persistence.security.rbac.RbacAuthorizationService;
-import com.solaria.persistence.service.CloudinaryService.UploadResult;
+import com.solaria.persistence.service.shared.CloudinaryService.UploadResult;
import tools.jackson.databind.ObjectMapper;
+import com.solaria.persistence.service.shared.CloudinaryService;
@Service
public class EnergyBillService {
diff --git a/src/main/java/com/solaria/persistence/service/LocalUnitPhotoService.java b/src/main/java/com/solaria/persistence/service/unit/LocalUnitPhotoService.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/service/LocalUnitPhotoService.java
rename to src/main/java/com/solaria/persistence/service/unit/LocalUnitPhotoService.java
index 9c791e7..128251c 100644
--- a/src/main/java/com/solaria/persistence/service/LocalUnitPhotoService.java
+++ b/src/main/java/com/solaria/persistence/service/unit/LocalUnitPhotoService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.unit;
import java.time.OffsetDateTime;
import java.util.List;
@@ -10,14 +10,15 @@
import org.springframework.web.multipart.MultipartFile;
import com.solaria.persistence.config.CloudinaryProperties;
-import com.solaria.persistence.domain.entity.LocalUnit;
-import com.solaria.persistence.domain.entity.LocalUnitPhoto;
-import com.solaria.persistence.dto.response.LocalUnitPhotoResponseDTO;
+import com.solaria.persistence.domain.entity.unit.LocalUnit;
+import com.solaria.persistence.domain.entity.unit.LocalUnitPhoto;
+import com.solaria.persistence.dto.response.unit.LocalUnitPhotoResponseDTO;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.LocalUnitPhotoRepository;
-import com.solaria.persistence.repository.LocalUnitRepository;
+import com.solaria.persistence.repository.unit.LocalUnitPhotoRepository;
+import com.solaria.persistence.repository.unit.LocalUnitRepository;
import com.solaria.persistence.security.rbac.RbacAuthorizationService;
-import com.solaria.persistence.service.CloudinaryService.UploadResult;
+import com.solaria.persistence.service.shared.CloudinaryService.UploadResult;
+import com.solaria.persistence.service.shared.CloudinaryService;
@Service
public class LocalUnitPhotoService {
diff --git a/src/main/java/com/solaria/persistence/service/LocalUnitService.java b/src/main/java/com/solaria/persistence/service/unit/LocalUnitService.java
similarity index 88%
rename from src/main/java/com/solaria/persistence/service/LocalUnitService.java
rename to src/main/java/com/solaria/persistence/service/unit/LocalUnitService.java
index c5d7a6e..d1018e9 100644
--- a/src/main/java/com/solaria/persistence/service/LocalUnitService.java
+++ b/src/main/java/com/solaria/persistence/service/unit/LocalUnitService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.unit;
import java.util.List;
import java.util.UUID;
@@ -6,22 +6,22 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.solaria.persistence.domain.entity.Address;
-import com.solaria.persistence.domain.entity.LocalUnit;
-import com.solaria.persistence.domain.entity.Requester;
-import com.solaria.persistence.dto.request.LocalUnitRequestDTO;
-import com.solaria.persistence.dto.response.AddressResponseDTO;
-import com.solaria.persistence.dto.response.LocalUnitResponseDTO;
+import com.solaria.persistence.domain.entity.shared.Address;
+import com.solaria.persistence.domain.entity.unit.LocalUnit;
+import com.solaria.persistence.domain.entity.execution.Requester;
+import com.solaria.persistence.dto.request.unit.LocalUnitRequestDTO;
+import com.solaria.persistence.dto.response.shared.AddressResponseDTO;
+import com.solaria.persistence.dto.response.unit.LocalUnitResponseDTO;
import com.solaria.persistence.exception.InvalidFieldException;
import com.solaria.persistence.exception.ResourceInUseException;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.AddressRepository;
-import com.solaria.persistence.repository.EnergyBillRepository;
-import com.solaria.persistence.repository.LocalUnitPhotoRepository;
-import com.solaria.persistence.repository.LocalUnitRepository;
-import com.solaria.persistence.repository.ProposalUnitRepository;
-import com.solaria.persistence.repository.RequesterRepository;
-import com.solaria.persistence.repository.UnitSpecificationsRepository;
+import com.solaria.persistence.repository.shared.AddressRepository;
+import com.solaria.persistence.repository.unit.EnergyBillRepository;
+import com.solaria.persistence.repository.unit.LocalUnitPhotoRepository;
+import com.solaria.persistence.repository.unit.LocalUnitRepository;
+import com.solaria.persistence.repository.proposal.ProposalUnitRepository;
+import com.solaria.persistence.repository.execution.RequesterRepository;
+import com.solaria.persistence.repository.unit.UnitSpecificationsRepository;
@Service
diff --git a/src/main/java/com/solaria/persistence/service/UnitSpecificationsService.java b/src/main/java/com/solaria/persistence/service/unit/UnitSpecificationsService.java
similarity index 86%
rename from src/main/java/com/solaria/persistence/service/UnitSpecificationsService.java
rename to src/main/java/com/solaria/persistence/service/unit/UnitSpecificationsService.java
index 4b98c11..eccde6f 100644
--- a/src/main/java/com/solaria/persistence/service/UnitSpecificationsService.java
+++ b/src/main/java/com/solaria/persistence/service/unit/UnitSpecificationsService.java
@@ -1,4 +1,4 @@
-package com.solaria.persistence.service;
+package com.solaria.persistence.service.unit;
import java.time.OffsetDateTime;
import java.util.List;
@@ -9,13 +9,13 @@
import tools.jackson.databind.ObjectMapper;
-import com.solaria.persistence.domain.entity.LocalUnit;
-import com.solaria.persistence.domain.entity.UnitSpecifications;
-import com.solaria.persistence.dto.request.UnitSpecificationsRequestDTO;
-import com.solaria.persistence.dto.response.UnitSpecificationsResponseDTO;
+import com.solaria.persistence.domain.entity.unit.LocalUnit;
+import com.solaria.persistence.domain.entity.unit.UnitSpecifications;
+import com.solaria.persistence.dto.request.unit.UnitSpecificationsRequestDTO;
+import com.solaria.persistence.dto.response.unit.UnitSpecificationsResponseDTO;
import com.solaria.persistence.exception.ResourceNotFoundException;
-import com.solaria.persistence.repository.LocalUnitRepository;
-import com.solaria.persistence.repository.UnitSpecificationsRepository;
+import com.solaria.persistence.repository.unit.LocalUnitRepository;
+import com.solaria.persistence.repository.unit.UnitSpecificationsRepository;
@Service
public class UnitSpecificationsService {
diff --git a/src/main/java/com/solaria/persistence/util/CacheKeyGenerator.java b/src/main/java/com/solaria/persistence/util/CacheKeyGenerator.java
index a40a06f..bb0fa28 100644
--- a/src/main/java/com/solaria/persistence/util/CacheKeyGenerator.java
+++ b/src/main/java/com/solaria/persistence/util/CacheKeyGenerator.java
@@ -2,7 +2,7 @@
import org.springframework.stereotype.Component;
import com.solaria.persistence.config.RedisProperties;
-import com.solaria.persistence.dto.request.SupplierSearchFilterDTO;
+import com.solaria.persistence.dto.request.catalog.SupplierSearchFilterDTO;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
From b5e59b573bb5d3f1476464aca411bde64613aa31 Mon Sep 17 00:00:00 2001
From: Arthur Machado
Date: Mon, 31 Aug 2026 21:32:07 -0300
Subject: [PATCH 6/8] refactor: (#38)
remove M2M security components and related configurations
---
.env.example | 2 -
pom.xml | 17 ---
.../auth/ServiceAuthController.java | 76 -----------
.../common/InternalPingController.java | 18 ---
.../auth/ServiceTokenMintRequestDTO.java | 15 ---
.../auth/ServiceTokenRefreshRequestDTO.java | 16 ---
.../auth/ServiceTokenResponseDTO.java | 22 ----
.../exception/ServiceAuthException.java | 16 ---
.../persistence/security/SecurityConfig.java | 45 ++-----
.../service/ServiceTokenAuthFilter.java | 67 ----------
.../service/ServiceTokenProperties.java | 81 ------------
.../service/ServiceTokenProvider.java | 119 ------------------
...itional-spring-configuration-metadata.json | 25 ----
src/main/resources/application.properties | 10 --
src/test/resources/application.properties | 6 -
15 files changed, 9 insertions(+), 526 deletions(-)
delete mode 100644 src/main/java/com/solaria/persistence/controller/auth/ServiceAuthController.java
delete mode 100644 src/main/java/com/solaria/persistence/controller/common/InternalPingController.java
delete mode 100644 src/main/java/com/solaria/persistence/dto/request/auth/ServiceTokenMintRequestDTO.java
delete mode 100644 src/main/java/com/solaria/persistence/dto/request/auth/ServiceTokenRefreshRequestDTO.java
delete mode 100644 src/main/java/com/solaria/persistence/dto/response/auth/ServiceTokenResponseDTO.java
delete mode 100644 src/main/java/com/solaria/persistence/exception/ServiceAuthException.java
delete mode 100644 src/main/java/com/solaria/persistence/security/service/ServiceTokenAuthFilter.java
delete mode 100644 src/main/java/com/solaria/persistence/security/service/ServiceTokenProperties.java
delete mode 100644 src/main/java/com/solaria/persistence/security/service/ServiceTokenProvider.java
diff --git a/.env.example b/.env.example
index 898a6ae..b6665c2 100644
--- a/.env.example
+++ b/.env.example
@@ -5,8 +5,6 @@ DB_NAME=
DB_PORT=
DB_SSLMODE=
-SERVICE_JWT_SECRET=qualquerstringde32letrasaisenaoelepara
-
CLOUDINARY_CLOUD_NAME=
CLOUDINARY_API_KEY=
CLOUDINARY_API_SECRET=
diff --git a/pom.xml b/pom.xml
index 4f4b9d4..5ba4181 100644
--- a/pom.xml
+++ b/pom.xml
@@ -59,23 +59,6 @@
org.springframework.security
spring-security-oauth2-jose
-
- io.jsonwebtoken
- jjwt-api
- 0.11.5
-
-
- io.jsonwebtoken
- jjwt-impl
- 0.11.5
- runtime
-
-
- io.jsonwebtoken
- jjwt-jackson
- 0.11.5
- runtime
-
org.springdoc
springdoc-openapi-starter-webmvc-ui
diff --git a/src/main/java/com/solaria/persistence/controller/auth/ServiceAuthController.java b/src/main/java/com/solaria/persistence/controller/auth/ServiceAuthController.java
deleted file mode 100644
index 589ae37..0000000
--- a/src/main/java/com/solaria/persistence/controller/auth/ServiceAuthController.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.solaria.persistence.controller.auth;
-
-import java.nio.charset.StandardCharsets;
-import java.security.MessageDigest;
-
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import com.solaria.persistence.dto.request.auth.ServiceTokenMintRequestDTO;
-import com.solaria.persistence.dto.request.auth.ServiceTokenRefreshRequestDTO;
-import com.solaria.persistence.dto.response.auth.ServiceTokenResponseDTO;
-import com.solaria.persistence.exception.ServiceAuthException;
-import com.solaria.persistence.security.service.ServiceTokenProperties;
-import com.solaria.persistence.security.service.ServiceTokenProvider;
-
-import jakarta.validation.Valid;
-
-/**
- * Controller para autentificação M2M(APIs)
- */
-@RestController
-@RequestMapping("/internal/service-tokens")
-public class ServiceAuthController {
-
- // classe emissora/validadora de token -> usada para mint(emição) e refresh(renovação)
- private final ServiceTokenProvider serviceTokenProvider;
-
- // classe com as propriedades do token
- private final ServiceTokenProperties serviceTokenProperties;
-
- public ServiceAuthController(ServiceTokenProvider serviceTokenProvider,
- ServiceTokenProperties serviceTokenProperties) {
- this.serviceTokenProvider = serviceTokenProvider;
- this.serviceTokenProperties = serviceTokenProperties;
- }
-
-
- // Emite um novo par de access+refresh token, fazendo a autentificação com clientSecret
- @PostMapping
- public ResponseEntity mint(@Valid @RequestBody ServiceTokenMintRequestDTO dto) {
- // Lança ServiceAuthException (-> 401) se o secret não bater;
- validateClientSecret(dto.getClientSecret());
- return ResponseEntity.ok(buildResponse(
- serviceTokenProvider.mintAccessToken(),
- serviceTokenProvider.mintRefreshToken()));
- }
-
- // Troca um refresh token por um acess token, devolvendo o refresh usado e o novo acess token
- @PostMapping("/refresh")
- public ResponseEntity refresh(@Valid @RequestBody ServiceTokenRefreshRequestDTO dto) {
- serviceTokenProvider.parseAndValidate(dto.getRefreshToken(), ServiceTokenProvider.TOKEN_TYPE_REFRESH);
- return ResponseEntity.ok(buildResponse(
- serviceTokenProvider.mintAccessToken(),
- dto.getRefreshToken()));
- }
-
- private void validateClientSecret(String providedSecret) {
- byte[] provided = (providedSecret == null ? "" : providedSecret).getBytes(StandardCharsets.UTF_8);
- byte[] expected = serviceTokenProperties.getClientSecret().getBytes(StandardCharsets.UTF_8);
- if (!MessageDigest.isEqual(provided, expected)) {
- throw new ServiceAuthException("clientSecret inválido.");
- }
- }
-
- private ServiceTokenResponseDTO buildResponse(String accessToken, String refreshToken) {
- return ServiceTokenResponseDTO.builder()
- .accessToken(accessToken)
- .refreshToken(refreshToken)
- .tokenType("Bearer")
- .expiresIn(serviceTokenProperties.getAccessTtl().toSeconds())
- .build();
- }
-}
diff --git a/src/main/java/com/solaria/persistence/controller/common/InternalPingController.java b/src/main/java/com/solaria/persistence/controller/common/InternalPingController.java
deleted file mode 100644
index 15d6abd..0000000
--- a/src/main/java/com/solaria/persistence/controller/common/InternalPingController.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.solaria.persistence.controller.common;
-
-import java.util.Map;
-
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * Endpoint para testar se auth funcionou, tem apenas um return por ser apenas uma checagem rápida
- */
-@RestController
-public class InternalPingController {
-
- @GetMapping("/internal/ping")
- public Map ping() {
- return Map.of("status", "ok");
- }
-}
diff --git a/src/main/java/com/solaria/persistence/dto/request/auth/ServiceTokenMintRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/auth/ServiceTokenMintRequestDTO.java
deleted file mode 100644
index 159d5c5..0000000
--- a/src/main/java/com/solaria/persistence/dto/request/auth/ServiceTokenMintRequestDTO.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.solaria.persistence.dto.request.auth;
-
-
-import jakarta.validation.constraints.NotBlank;
-
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-public class ServiceTokenMintRequestDTO {
-
- @NotBlank(message = "clientSecret é obrigatório")
- private String clientSecret;
-}
diff --git a/src/main/java/com/solaria/persistence/dto/request/auth/ServiceTokenRefreshRequestDTO.java b/src/main/java/com/solaria/persistence/dto/request/auth/ServiceTokenRefreshRequestDTO.java
deleted file mode 100644
index a8c1ad5..0000000
--- a/src/main/java/com/solaria/persistence/dto/request/auth/ServiceTokenRefreshRequestDTO.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.solaria.persistence.dto.request.auth;
-
-import jakarta.validation.constraints.NotBlank;
-
-import lombok.Getter;
-import lombok.Setter;
-
-
-@Getter
-@Setter
-public class ServiceTokenRefreshRequestDTO {
-
-
- @NotBlank(message = "refreshToken é obrigatório")
- private String refreshToken;
-}
diff --git a/src/main/java/com/solaria/persistence/dto/response/auth/ServiceTokenResponseDTO.java b/src/main/java/com/solaria/persistence/dto/response/auth/ServiceTokenResponseDTO.java
deleted file mode 100644
index 12aba61..0000000
--- a/src/main/java/com/solaria/persistence/dto/response/auth/ServiceTokenResponseDTO.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.solaria.persistence.dto.response.auth;
-
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Getter;
-
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-
-@Setter
-@Getter
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class ServiceTokenResponseDTO {
-
- private String accessToken;
- private String refreshToken;
- private String tokenType;
- private long expiresIn;
-}
diff --git a/src/main/java/com/solaria/persistence/exception/ServiceAuthException.java b/src/main/java/com/solaria/persistence/exception/ServiceAuthException.java
deleted file mode 100644
index 81deb74..0000000
--- a/src/main/java/com/solaria/persistence/exception/ServiceAuthException.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.solaria.persistence.exception;
-
-import java.util.Map;
-
-import org.springframework.http.HttpStatus;
-
-public class ServiceAuthException extends BusinessException {
-
- public ServiceAuthException(String message) {
- super(message, HttpStatus.UNAUTHORIZED, "SERVICE_AUTH_FAILED");
- }
-
- public ServiceAuthException(String message, Map properties) {
- super(message, HttpStatus.UNAUTHORIZED, "SERVICE_AUTH_FAILED", properties);
- }
-}
diff --git a/src/main/java/com/solaria/persistence/security/SecurityConfig.java b/src/main/java/com/solaria/persistence/security/SecurityConfig.java
index 9668b9d..ccf8efd 100644
--- a/src/main/java/com/solaria/persistence/security/SecurityConfig.java
+++ b/src/main/java/com/solaria/persistence/security/SecurityConfig.java
@@ -8,7 +8,6 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
-import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
@@ -18,26 +17,19 @@
import org.springframework.security.oauth2.jwt.JwtValidators;
import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
import org.springframework.security.web.SecurityFilterChain;
-import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
-import com.solaria.persistence.security.service.ServiceTokenAuthFilter;
-import com.solaria.persistence.security.service.ServiceTokenProperties;
-import com.solaria.persistence.security.service.ServiceTokenProvider;
-
/**
* Duas SecurityFilterChain, estruturalmente independentes e segregadas
* por @Order
*
- * @Order(1): rotas -> internal/**; token/jwt de serviço M2M(API->API);
- * HS256/JJWT;
- * segredo compartilhado (SERVICE_JWT_SECRET), sem JWKS.
+ * @Order(1): rotas -> /internal/**; rotas internas de rede;
+ * nunca expostas via Kong; alcançáveis apenas dentro do cluster
*
* @Order(2): rotas -> sem delimitador; JWT de usuário emitido pelo api-auth;
- * resource server RS256/JWKS; validado via NimbusJwtDecoder.withJwkSetUri(...);
- * sem segredo compartilhado.
+ * resource server RS256/JWKS; validado via NimbusJwtDecoder.withJwkSetUri(...).
*/
// Registra esta classe como fonte de beans de configuração do Spring.
@@ -53,14 +45,12 @@
@EnableMethodSecurity
// Liga as classes com @ConfigurationProperties como Beans
-@EnableConfigurationProperties({ JwtProperties.class, ServiceTokenProperties.class })
+@EnableConfigurationProperties(JwtProperties.class)
public class SecurityConfig {
private final JwtProperties jwtProperties;
- private final ServiceTokenProvider serviceTokenProvider;
-
- // Handlers 401/403 compartilhados pelas duas chains
+ // Handlers 401/403 usados pela chain @Order(2)
private final ProblemDetailAuthenticationEntryPoint problemDetailAuthenticationEntryPoint;
private final ProblemDetailAccessDeniedHandler problemDetailAccessDeniedHandler;
@@ -69,11 +59,9 @@ public class SecurityConfig {
private String allowedOrigins;
public SecurityConfig(JwtProperties jwtProperties,
- ServiceTokenProvider serviceTokenProvider,
ProblemDetailAuthenticationEntryPoint problemDetailAuthenticationEntryPoint,
ProblemDetailAccessDeniedHandler problemDetailAccessDeniedHandler) {
this.jwtProperties = jwtProperties;
- this.serviceTokenProvider = serviceTokenProvider;
this.problemDetailAuthenticationEntryPoint = problemDetailAuthenticationEntryPoint;
this.problemDetailAccessDeniedHandler = problemDetailAccessDeniedHandler;
}
@@ -87,29 +75,14 @@ public SecurityFilterChain internalSecurityFilterChain(HttpSecurity http) throws
http
// Restringe essa chain apenas para /internal/**
.securityMatcher("/internal/**")
- // CSRF desabilitado
+ // CSRF desabilitado
.csrf(csrf -> csrf.disable())
- // HttpSession não é usado/criado. toda request se autentica sozinha pelo header
+ // HttpSession não é usado/criado
.sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
// CorsConfigurationSource é a mesma para as duas chains
.cors(cors -> cors.configurationSource(corsConfigurationSource()))
- // adiciona filtro de token antes de qualquer verificação de autorização
- .addFilterBefore(new ServiceTokenAuthFilter(serviceTokenProvider),
- UsernamePasswordAuthenticationFilter.class)
- .authorizeHttpRequests(auth -> auth
- // Fora do filtro de Bearer token
- // mint autentica via clientSecret no corpo;
- // refresh autentica via posse de um refresh token válido;
- .requestMatchers(HttpMethod.POST,
- "/internal/service-tokens",
- "/internal/service-tokens/refresh")
- .permitAll()
- // Todo o resto de /internal/** exige autenticação
- .anyRequest().authenticated())
- // Garante que exceptions usem o formato de ProblemDetail
- .exceptionHandling(e -> e
- .authenticationEntryPoint(problemDetailAuthenticationEntryPoint)
- .accessDeniedHandler(problemDetailAccessDeniedHandler));
+ // Rotas internas -> sem autenticação de aplicação
+ .authorizeHttpRequests(auth -> auth.anyRequest().permitAll());
// Constrói e devolve a SecurityFilterChain configurada acima como o bean deste
// método
return http.build();
diff --git a/src/main/java/com/solaria/persistence/security/service/ServiceTokenAuthFilter.java b/src/main/java/com/solaria/persistence/security/service/ServiceTokenAuthFilter.java
deleted file mode 100644
index 7749a04..0000000
--- a/src/main/java/com/solaria/persistence/security/service/ServiceTokenAuthFilter.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.solaria.persistence.security.service;
-
-import java.io.IOException;
-import java.util.List;
-
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken;
-
-import org.springframework.web.filter.OncePerRequestFilter;
-
-import com.solaria.persistence.exception.ServiceAuthException;
-
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-
-/**
- * Classe responsavel por validar e extrair o token de serviço
- * Sem @component para não ser instanciada com filtro global(serve apenas rotas /internal/**)
- */
-public class ServiceTokenAuthFilter extends OncePerRequestFilter {
-
- private static final String AUTHORIZATION_HEADER = "Authorization";
- private static final String BEARER_PREFIX = "Bearer ";
-
- // única classe que sabe emitir/validar o token de serviço.
- private final ServiceTokenProvider serviceTokenProvider;
-
- public ServiceTokenAuthFilter(ServiceTokenProvider serviceTokenProvider) {
- this.serviceTokenProvider = serviceTokenProvider;
- }
-
- @Override
- protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
- FilterChain filterChain) throws ServletException, IOException {
- String header = request.getHeader(AUTHORIZATION_HEADER);
- // verifica se existe um header authorization e se é bearer
- if (header != null && header.startsWith(BEARER_PREFIX)) {
- // remove "Bearer ", sobrando apenas o jwt
- String token = header.substring(BEARER_PREFIX.length());
- try {
- // Validação de assinatura, issuer e expiração por ServiceTokenProvider;
- // TOKEN_TYPE_ACCESS garante que apenas access tokens são válidados
- serviceTokenProvider.parseAndValidate(token, ServiceTokenProvider.TOKEN_TYPE_ACCESS);
-
- // Token validado -> constroi uma authentication já verificada com a auhtority ROLE_SERVICE
- // Authority única para M2M
- Authentication authentication = new PreAuthenticatedAuthenticationToken(
- "internal-client", null,
- List.of(new SimpleGrantedAuthority("ROLE_SERVICE")));
-
- // Seta a authtentication para a request atual
- SecurityContextHolder.getContext().setAuthentication(authentication);
-
- } catch (ServiceAuthException ex) {
- // em caso de erro, remove qualquer authentication da trhead
- SecurityContextHolder.clearContext();
- }
- }
-
- // dispacha request para o próximo filtro
- filterChain.doFilter(request, response);
- }
-}
diff --git a/src/main/java/com/solaria/persistence/security/service/ServiceTokenProperties.java b/src/main/java/com/solaria/persistence/security/service/ServiceTokenProperties.java
deleted file mode 100644
index 2216829..0000000
--- a/src/main/java/com/solaria/persistence/security/service/ServiceTokenProperties.java
+++ /dev/null
@@ -1,81 +0,0 @@
-
-package com.solaria.persistence.security.service;
-
-import java.time.Duration;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-/**
- * Propriedades do token de serviço (HMAC-SHA256), relacionamento M2M (/internal/**)
- */
-
-// Habilita essa classe com as variaveis em application.properties com prefixo app.jwt.service
-@ConfigurationProperties(prefix = "app.jwt.service")
-public class ServiceTokenProperties {
-
- // Secret HMAC (SERVICE_JWT_SECRET) usado para assinar/validar os tokens de serviço
- private String secret;
-
- // Secret comparado no mint (SERVICE_CLIENT_SECRET)
- private String clientSecret;
-
- // Issuer gravado nos tokens de serviço emitidos por esse fluxo
- private String issuer;
-
- // TTL do access token de serviço
- private long accessTtlMs;
-
- // TTL do refresh token de serviço
- private long refreshTtlMs;
-
- public String getSecret() {
- return secret;
- }
-
- public void setSecret(String secret) {
- this.secret = secret;
- }
-
- public String getClientSecret() {
- return clientSecret;
- }
-
- public void setClientSecret(String clientSecret) {
- this.clientSecret = clientSecret;
- }
-
- public String getIssuer() {
- return issuer;
- }
-
- public void setIssuer(String issuer) {
- this.issuer = issuer;
- }
-
- public long getAccessTtlMs() {
- return accessTtlMs;
- }
-
- public void setAccessTtlMs(long accessTtlMs) {
- this.accessTtlMs = accessTtlMs;
- }
-
- public long getRefreshTtlMs() {
- return refreshTtlMs;
- }
-
- public void setRefreshTtlMs(long refreshTtlMs) {
- this.refreshTtlMs = refreshTtlMs;
- }
-
-
- // Getter derivado, converte long para milisegundos
- public Duration getAccessTtl() {
- return Duration.ofMillis(accessTtlMs);
- }
-
- // Getter derivado, converte long para milisegundos
- public Duration getRefreshTtl() {
- return Duration.ofMillis(refreshTtlMs);
- }
-}
diff --git a/src/main/java/com/solaria/persistence/security/service/ServiceTokenProvider.java b/src/main/java/com/solaria/persistence/security/service/ServiceTokenProvider.java
deleted file mode 100644
index 4ad5fdf..0000000
--- a/src/main/java/com/solaria/persistence/security/service/ServiceTokenProvider.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package com.solaria.persistence.security.service;
-
-import java.nio.charset.StandardCharsets;
-
-import java.security.Key;
-
-import java.time.Duration;
-import java.time.Instant;
-
-import java.util.Date;
-import java.util.UUID;
-
-import javax.crypto.spec.SecretKeySpec;
-
-import org.springframework.stereotype.Component;
-
-import com.solaria.persistence.exception.ServiceAuthException;
-
-import io.jsonwebtoken.Claims;
-import io.jsonwebtoken.JwtException;
-import io.jsonwebtoken.Jwts;
-import io.jsonwebtoken.SignatureAlgorithm;
-
-/**
- * Emite e valida o token de serviço M2M (API para API) via JJWT + HMAC-SHA256
- * Usa JJWT em vez de Nimbus (Impede que um token M2M seja válidado como
- * accesses/refresh token)
- * Segredo e issuer são próprios deste fluxo M2M (/internal/**)
- */
-@Component
-public class ServiceTokenProvider {
-
- public static final String TOKEN_TYPE_ACCESS = "service_access";
- public static final String TOKEN_TYPE_REFRESH = "service_refresh";
-
- private static final String CLAIM_TOKEN_TYPE = "token_type";
- private static final String SUBJECT = "internal-client";
- private static final int MIN_SECRET_BYTES = 32;
-
- private final ServiceTokenProperties properties;
- private final Key signingKey;
-
- public ServiceTokenProvider(ServiceTokenProperties properties) {
- this.properties = properties;
- this.signingKey = buildSigningKey(properties.getSecret());
- }
-
- // Método responsável por validar a secret e criar uma chave criptográfica para
- // uso com algoritmo HMAC-SHA256/HS256 com os bytes da mesma
- private static Key buildSigningKey(String secret) {
-
- // Verificação de secret
- if (secret == null || secret.isBlank()) {
- throw new IllegalStateException(
- "Secret precisa estar definido para o token de serviço M2M.");
- }
-
- // transforma secret em bytes
- byte[] secretBytes = secret.getBytes(StandardCharsets.UTF_8);
-
- // Verificação de tamanho da secret
- if (secretBytes.length < MIN_SECRET_BYTES) {
- throw new IllegalStateException(
- "Secret precisa ter pelo menos " + MIN_SECRET_BYTES + "bytes;");
- }
-
- // Cria uma chave criptográfica para uso com algoritmo HMAC-SHA256/HS256 usando
- // os bytes do secret
- return new SecretKeySpec(secretBytes, SignatureAlgorithm.HS256.getJcaName());
- }
-
- // retorna um accesses token
- public String mintAccessToken() {
- return mint(TOKEN_TYPE_ACCESS, properties.getAccessTtl());
- }
-
- // retorna um refrsh token
- public String mintRefreshToken() {
- return mint(TOKEN_TYPE_REFRESH, properties.getRefreshTtl());
- }
-
- // cria um acesses/refrsh token
- private String mint(String tokenType, Duration ttl) {
- Instant now = Instant.now(); // instante da criação do token
- return Jwts.builder()
- .setId(UUID.randomUUID().toString()) // gera um UUID único para o token
- .setIssuer(properties.getIssuer()) // define quem emitiu o token
- .setSubject(SUBJECT) // define "descrição/assunto" do token
- .claim(CLAIM_TOKEN_TYPE, tokenType) // claim personalizado, define o tipo do token accesses/refresh
- .setIssuedAt(Date.from(now)) // define o instante de criação do token
- .setExpiration(Date.from(now.plus(ttl))) // define instante de expiração do token
- .signWith(signingKey, SignatureAlgorithm.HS256) // assina o token com a secret + algoritmo HMAC-SHA256/HS256
- .compact(); // transforma o token em um jwt
- }
-
- // validação do token
- public Claims parseAndValidate(String token, String expectedTokenType) {
- Claims claims; // representa os dados dentro do payload
- try {
- // Cria um parser configurado para validar o JWT
- claims = Jwts.parserBuilder()
- .setSigningKey(signingKey) // define a chave usada para valiadar a assinatura
- .requireIssuer(properties.getIssuer()) // exige um emissor especifico para o token
- .build() // constrói o parser com essas configurações
- .parseClaimsJws(token) // valida o jwt
- .getBody(); // retorna o paylaod do token
- } catch (JwtException | IllegalArgumentException ex) {
- throw new ServiceAuthException("Token de serviço inválido: " + ex.getMessage());
- }
-
- // verificação do tipo de token esperado e recebido
- String actualTokenType = claims.get(CLAIM_TOKEN_TYPE, String.class);
- if (!expectedTokenType.equals(actualTokenType)) {
- throw new ServiceAuthException(
- "Tipo de token de serviço inesperado (esperado: " + expectedTokenType+ ", recebido: " + actualTokenType + ").");
- }
- return claims;
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/src/main/resources/META-INF/additional-spring-configuration-metadata.json
index 4abdc3b..1b86ea3 100644
--- a/src/main/resources/META-INF/additional-spring-configuration-metadata.json
+++ b/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -49,31 +49,6 @@
"type": "java.lang.String",
"description": "A description for 'app.jwt.issuer'"
},
- {
- "name": "app.jwt.service.secret",
- "type": "java.lang.String",
- "description": "A description for 'app.jwt.service.secret'"
- },
- {
- "name": "app.jwt.service.client-secret",
- "type": "java.lang.String",
- "description": "A description for 'app.jwt.service.client-secret'"
- },
- {
- "name": "app.jwt.service.issuer",
- "type": "java.lang.String",
- "description": "A description for 'app.jwt.service.issuer'"
- },
- {
- "name": "app.jwt.service.access-ttl-ms",
- "type": "java.lang.String",
- "description": "A description for 'app.jwt.service.access-ttl-ms'"
- },
- {
- "name": "app.jwt.service.refresh-ttl-ms",
- "type": "java.lang.String",
- "description": "A description for 'app.jwt.service.refresh-ttl-ms'"
- },
{
"name": "google-translate.api-key",
"type": "java.lang.String",
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index d48ab53..e1b1204 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -35,16 +35,6 @@ app.cors.allowed-origins=http://localhost:3000,http://localhost:5173
app.jwt.jwk-set-uri=${JWT_JWK_SET_URI:http://localhost:8081/.well-known/jwks.json}
# claim de emissor do jwt do usuário
app.jwt.issuer=solaria-auth
-# secret do token de serviço M2M, precisa ter >= 32 bytes
-app.jwt.service.secret=${SERVICE_JWT_SECRET}
-# segredo compartilhado, comparado com clientSecret em POST /internal/service-tokens -> define quem pode emitir um token novo
-app.jwt.service.client-secret=${SERVICE_CLIENT_SECRET}
-# Emissor próprio do token de serviço
-app.jwt.service.issuer=${SERVICE_JWT_ISSUER:solaria-persistence-internal}
-# TTL do token de access
-app.jwt.service.access-ttl-ms=${SERVICE_JWT_ACCESS_TTL_MS:600000}
-# TTL do token de refresh
-app.jwt.service.refresh-ttl-ms=${SERVICE_JWT_REFRESH_TTL_MS:3600000}
# variaveis da URL -> montada dessa forma -> *cloudinary://:@*
cloudinary.cloud-name=${CLOUDINARY_CLOUD_NAME}
diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties
index 8435d6c..f87e97d 100644
--- a/src/test/resources/application.properties
+++ b/src/test/resources/application.properties
@@ -10,9 +10,3 @@ app.cors.allowed-origins=http://localhost:3000,http://localhost:5173
app.jwt.jwk-set-uri=http://localhost:8081/.well-known/jwks.json
app.jwt.issuer=solaria-auth
-
-app.jwt.service.secret=test-service-jwt-secret-must-be-at-least-32-bytes-long
-app.jwt.service.client-secret=test-service-client-secret-value
-app.jwt.service.issuer=solaria-persistence-internal
-app.jwt.service.access-ttl-ms=600000
-app.jwt.service.refresh-ttl-ms=3600000
From 528d4ac4762621e2e31a82288ade94d9769f2824 Mon Sep 17 00:00:00 2001
From: davisilva <84607533+Megueutu@users.noreply.github.com>
Date: Tue, 1 Sep 2026 09:01:59 -0300
Subject: [PATCH 7/8] docs: add openapi annotations to internal user
provisioning controller (#39)
---
.../identity/InternalUserProvisioningController.java | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/solaria/persistence/controller/identity/InternalUserProvisioningController.java b/src/main/java/com/solaria/persistence/controller/identity/InternalUserProvisioningController.java
index c4453aa..04de9ef 100644
--- a/src/main/java/com/solaria/persistence/controller/identity/InternalUserProvisioningController.java
+++ b/src/main/java/com/solaria/persistence/controller/identity/InternalUserProvisioningController.java
@@ -10,12 +10,15 @@
import com.solaria.persistence.dto.response.identity.InternalUserProvisionResponseDTO;
import com.solaria.persistence.service.identity.InternalUserProvisioningService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
// Controller M2M chamado por api-auth (via service token) para garantir que um User com o authId
// do evento USER_REGISTERED exista em dbsolier
@RestController
@RequestMapping("/internal/users")
+@Tag(name = "Provisionamento Interno de Usuários", description = "Endpoint M2M usado pelo api-auth")
public class InternalUserProvisioningController {
private final InternalUserProvisioningService provisioningService;
@@ -24,9 +27,10 @@ public InternalUserProvisioningController(InternalUserProvisioningService provis
this.provisioningService = provisioningService;
}
- // Cria/confirma User com o authId recebido -> sempre responde 200
- // idempotencia da operação garantida por authId
+ // Cria/confirma User com o authId recebido -> sempre responde 200
+ // idempotencia da operação garantida por authId
@PostMapping
+ @Operation(summary = "Provisiona ou confirma um usuário a partir do authId")
public ResponseEntity provision(
@Valid @RequestBody InternalUserProvisionRequestDTO dto) {
return ResponseEntity.ok(provisioningService.provision(dto.getAuthId()));
From 8a20e41bafa776f3d6cf2f489fff9f99a7133606 Mon Sep 17 00:00:00 2001
From: davisilva <84607533+Megueutu@users.noreply.github.com>
Date: Tue, 1 Sep 2026 10:45:57 -0300
Subject: [PATCH 8/8] chore: rename artifact and app name from persistence to
core (#40)
---
pom.xml | 4 ++--
src/main/resources/application.properties | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/pom.xml b/pom.xml
index 5ba4181..2dab789 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,9 +9,9 @@
com.solaria
- persistence
+ core
0.0.1-SNAPSHOT
- persistence
+ core
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index e1b1204..4ff2b19 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,4 +1,4 @@
-spring.application.name=persistence
+spring.application.name=core
spring.config.import=optional:file:.env[.properties]