+ * This repository uses Spring's JdbcTemplate for database access and provides
+ * CRUD-style operations for apps, along with synchronization of app-to-group
+ * relations.
+ */
+@Repository
+public class AppRepository {
+
+
+ private final JdbcTemplate jdbcTemplate;
+ private final GroupRepository groupRepository;
+
+ /**
+ * Creates a new AppRepository.
+ *
+ * @param jdbcTemplate Spring JdbcTemplate used for executing SQL queries
+ * @param groupRepository Repository used to resolve group identifiers
+ */
+ public AppRepository(JdbcTemplate jdbcTemplate, GroupRepository groupRepository) {
+ this.jdbcTemplate = jdbcTemplate;
+ this.groupRepository = groupRepository;
+ }
+
+ /**
+ * Lists all apps.
+ *
+ * @return list of all App records
+ */
+ @Transactional
+ public List
diff --git a/src/main/java/de/avatic/lcc/service/calculation/ChangeMaterialService.java b/src/main/java/de/avatic/lcc/service/calculation/ChangeMaterialService.java
index 7f5e7b3..ab85e32 100644
--- a/src/main/java/de/avatic/lcc/service/calculation/ChangeMaterialService.java
+++ b/src/main/java/de/avatic/lcc/service/calculation/ChangeMaterialService.java
@@ -2,10 +2,10 @@ package de.avatic.lcc.service.calculation;
import de.avatic.lcc.dto.calculation.edit.PremiseDetailDTO;
import de.avatic.lcc.dto.calculation.edit.SetDataDTO;
-import de.avatic.lcc.model.packaging.PackagingDimension;
-import de.avatic.lcc.model.premises.Premise;
-import de.avatic.lcc.model.properties.PackagingProperty;
-import de.avatic.lcc.model.properties.PackagingPropertyMappingId;
+import de.avatic.lcc.model.db.packaging.PackagingDimension;
+import de.avatic.lcc.model.db.premises.Premise;
+import de.avatic.lcc.model.db.properties.PackagingProperty;
+import de.avatic.lcc.model.db.properties.PackagingPropertyMappingId;
import de.avatic.lcc.repositories.MaterialRepository;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.packaging.PackagingDimensionRepository;
diff --git a/src/main/java/de/avatic/lcc/service/calculation/ChangeSupplierService.java b/src/main/java/de/avatic/lcc/service/calculation/ChangeSupplierService.java
index a97ff06..1389b2a 100644
--- a/src/main/java/de/avatic/lcc/service/calculation/ChangeSupplierService.java
+++ b/src/main/java/de/avatic/lcc/service/calculation/ChangeSupplierService.java
@@ -2,12 +2,12 @@ package de.avatic.lcc.service.calculation;
import de.avatic.lcc.dto.calculation.edit.PremiseDetailDTO;
import de.avatic.lcc.dto.calculation.edit.SetDataDTO;
-import de.avatic.lcc.model.nodes.Node;
-import de.avatic.lcc.model.packaging.PackagingDimension;
-import de.avatic.lcc.model.premises.Premise;
-import de.avatic.lcc.model.premises.route.Destination;
-import de.avatic.lcc.model.properties.PackagingProperty;
-import de.avatic.lcc.model.properties.PackagingPropertyMappingId;
+import de.avatic.lcc.model.db.nodes.Node;
+import de.avatic.lcc.model.db.packaging.PackagingDimension;
+import de.avatic.lcc.model.db.premises.Premise;
+import de.avatic.lcc.model.db.premises.route.Destination;
+import de.avatic.lcc.model.db.properties.PackagingProperty;
+import de.avatic.lcc.model.db.properties.PackagingPropertyMappingId;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.packaging.PackagingDimensionRepository;
import de.avatic.lcc.repositories.packaging.PackagingPropertiesRepository;
diff --git a/src/main/java/de/avatic/lcc/service/calculation/DistanceService.java b/src/main/java/de/avatic/lcc/service/calculation/DistanceService.java
index b2e418e..a83314d 100644
--- a/src/main/java/de/avatic/lcc/service/calculation/DistanceService.java
+++ b/src/main/java/de/avatic/lcc/service/calculation/DistanceService.java
@@ -1,9 +1,9 @@
package de.avatic.lcc.service.calculation;
-import de.avatic.lcc.model.country.DetourIndex;
-import de.avatic.lcc.model.country.IsoCode;
-import de.avatic.lcc.model.nodes.Location;
-import de.avatic.lcc.model.nodes.Node;
+import de.avatic.lcc.model.db.country.DetourIndex;
+import de.avatic.lcc.model.db.country.IsoCode;
+import de.avatic.lcc.model.db.nodes.Location;
+import de.avatic.lcc.model.db.nodes.Node;
import de.avatic.lcc.repositories.DistanceMatrixRepository;
import de.avatic.lcc.repositories.country.CountryRepository;
import org.springframework.stereotype.Service;
diff --git a/src/main/java/de/avatic/lcc/service/calculation/PremiseCreationService.java b/src/main/java/de/avatic/lcc/service/calculation/PremiseCreationService.java
index e8b8c4d..67c57e7 100644
--- a/src/main/java/de/avatic/lcc/service/calculation/PremiseCreationService.java
+++ b/src/main/java/de/avatic/lcc/service/calculation/PremiseCreationService.java
@@ -1,11 +1,11 @@
package de.avatic.lcc.service.calculation;
import de.avatic.lcc.dto.calculation.edit.PremiseDetailDTO;
-import de.avatic.lcc.model.packaging.PackagingDimension;
-import de.avatic.lcc.model.premises.Premise;
-import de.avatic.lcc.model.premises.PremiseState;
-import de.avatic.lcc.model.properties.PackagingProperty;
-import de.avatic.lcc.model.properties.PackagingPropertyMappingId;
+import de.avatic.lcc.model.db.packaging.PackagingDimension;
+import de.avatic.lcc.model.db.premises.Premise;
+import de.avatic.lcc.model.db.premises.PremiseState;
+import de.avatic.lcc.model.db.properties.PackagingProperty;
+import de.avatic.lcc.model.db.properties.PackagingPropertyMappingId;
import de.avatic.lcc.repositories.MaterialRepository;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.packaging.PackagingDimensionRepository;
diff --git a/src/main/java/de/avatic/lcc/service/calculation/PremiseSearchStringAnalyzerService.java b/src/main/java/de/avatic/lcc/service/calculation/PremiseSearchStringAnalyzerService.java
index 2dab252..d0392fd 100644
--- a/src/main/java/de/avatic/lcc/service/calculation/PremiseSearchStringAnalyzerService.java
+++ b/src/main/java/de/avatic/lcc/service/calculation/PremiseSearchStringAnalyzerService.java
@@ -1,7 +1,7 @@
package de.avatic.lcc.service.calculation;
import de.avatic.lcc.dto.calculation.create.PremiseSearchResultDTO;
-import de.avatic.lcc.model.materials.Material;
+import de.avatic.lcc.model.db.materials.Material;
import de.avatic.lcc.repositories.MaterialRepository;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.premise.PremiseRepository;
diff --git a/src/main/java/de/avatic/lcc/service/calculation/RoutingService.java b/src/main/java/de/avatic/lcc/service/calculation/RoutingService.java
index bd95c54..2d227e3 100644
--- a/src/main/java/de/avatic/lcc/service/calculation/RoutingService.java
+++ b/src/main/java/de/avatic/lcc/service/calculation/RoutingService.java
@@ -2,11 +2,11 @@ package de.avatic.lcc.service.calculation;
import de.avatic.lcc.dto.generic.RateType;
import de.avatic.lcc.dto.generic.TransportType;
-import de.avatic.lcc.model.nodes.Node;
-import de.avatic.lcc.model.premises.route.*;
-import de.avatic.lcc.model.properties.SystemPropertyMappingId;
-import de.avatic.lcc.model.rates.ContainerRate;
-import de.avatic.lcc.model.rates.MatrixRate;
+import de.avatic.lcc.model.db.nodes.Node;
+import de.avatic.lcc.model.db.premises.route.*;
+import de.avatic.lcc.model.db.properties.SystemPropertyMappingId;
+import de.avatic.lcc.model.db.rates.ContainerRate;
+import de.avatic.lcc.model.db.rates.MatrixRate;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.properties.PropertyRepository;
import de.avatic.lcc.repositories.rates.ContainerRateRepository;
diff --git a/src/main/java/de/avatic/lcc/service/calculation/execution/CalculationExecutionService.java b/src/main/java/de/avatic/lcc/service/calculation/execution/CalculationExecutionService.java
index a62df72..e1240d1 100644
--- a/src/main/java/de/avatic/lcc/service/calculation/execution/CalculationExecutionService.java
+++ b/src/main/java/de/avatic/lcc/service/calculation/execution/CalculationExecutionService.java
@@ -1,20 +1,18 @@
package de.avatic.lcc.service.calculation.execution;
-import de.avatic.lcc.calculationmodel.*;
import de.avatic.lcc.dto.generic.ContainerType;
import de.avatic.lcc.dto.generic.RateType;
-import de.avatic.lcc.model.calculations.*;
-import de.avatic.lcc.model.error.SysError;
-import de.avatic.lcc.model.error.SysErrorType;
-import de.avatic.lcc.model.packaging.LoadCarrierType;
-import de.avatic.lcc.model.packaging.PackagingDimension;
-import de.avatic.lcc.model.premises.Premise;
-import de.avatic.lcc.model.premises.route.Destination;
-import de.avatic.lcc.model.premises.route.RouteSection;
-import de.avatic.lcc.model.properties.SystemPropertyMappingId;
-import de.avatic.lcc.repositories.calculation.CalculationJobDestinationRepository;
+import de.avatic.lcc.model.calculation.*;
+import de.avatic.lcc.model.db.calculations.*;
+import de.avatic.lcc.model.db.error.SysError;
+import de.avatic.lcc.model.db.error.SysErrorType;
+import de.avatic.lcc.model.db.packaging.LoadCarrierType;
+import de.avatic.lcc.model.db.packaging.PackagingDimension;
+import de.avatic.lcc.model.db.premises.Premise;
+import de.avatic.lcc.model.db.premises.route.Destination;
+import de.avatic.lcc.model.db.premises.route.RouteSection;
+import de.avatic.lcc.model.db.properties.SystemPropertyMappingId;
import de.avatic.lcc.repositories.calculation.CalculationJobRepository;
-import de.avatic.lcc.repositories.calculation.CalculationJobRouteSectionRepository;
import de.avatic.lcc.repositories.error.SysErrorRepository;
import de.avatic.lcc.repositories.premise.DestinationRepository;
import de.avatic.lcc.repositories.premise.PremiseRepository;
@@ -27,7 +25,6 @@ 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 java.math.BigDecimal;
import java.math.RoundingMode;
diff --git a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/AirfreightCalculationService.java b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/AirfreightCalculationService.java
index d20cfde..d9cd0f5 100644
--- a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/AirfreightCalculationService.java
+++ b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/AirfreightCalculationService.java
@@ -1,13 +1,13 @@
package de.avatic.lcc.service.calculation.execution.steps;
-import de.avatic.lcc.calculationmodel.AirfreightResult;
-import de.avatic.lcc.model.packaging.PackagingDimension;
-import de.avatic.lcc.model.premises.Premise;
-import de.avatic.lcc.model.premises.route.Destination;
-import de.avatic.lcc.model.properties.CountryPropertyMappingId;
-import de.avatic.lcc.model.properties.SystemPropertyMappingId;
-import de.avatic.lcc.model.utils.DimensionUnit;
-import de.avatic.lcc.model.utils.WeightUnit;
+import de.avatic.lcc.model.calculation.AirfreightResult;
+import de.avatic.lcc.model.db.packaging.PackagingDimension;
+import de.avatic.lcc.model.db.premises.Premise;
+import de.avatic.lcc.model.db.premises.route.Destination;
+import de.avatic.lcc.model.db.properties.CountryPropertyMappingId;
+import de.avatic.lcc.model.db.properties.SystemPropertyMappingId;
+import de.avatic.lcc.model.db.utils.DimensionUnit;
+import de.avatic.lcc.model.db.utils.WeightUnit;
import de.avatic.lcc.repositories.country.CountryPropertyRepository;
import de.avatic.lcc.repositories.properties.PropertyRepository;
import org.springframework.stereotype.Service;
diff --git a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/ChangeRiskFactorCalculationService.java b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/ChangeRiskFactorCalculationService.java
index e36541b..4fff82d 100644
--- a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/ChangeRiskFactorCalculationService.java
+++ b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/ChangeRiskFactorCalculationService.java
@@ -1,9 +1,9 @@
package de.avatic.lcc.service.calculation.execution.steps;
-import de.avatic.lcc.calculationmodel.ChangeRiskFactorCalculationResult;
+import de.avatic.lcc.model.calculation.ChangeRiskFactorCalculationResult;
import de.avatic.lcc.dto.generic.TransportType;
-import de.avatic.lcc.model.properties.SystemPropertyMappingId;
-import de.avatic.lcc.model.rates.ContainerRate;
+import de.avatic.lcc.model.db.properties.SystemPropertyMappingId;
+import de.avatic.lcc.model.db.rates.ContainerRate;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.properties.PropertyRepository;
import de.avatic.lcc.repositories.rates.ContainerRateRepository;
diff --git a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/ContainerCalculationService.java b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/ContainerCalculationService.java
index f841ca6..f297e0c 100644
--- a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/ContainerCalculationService.java
+++ b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/ContainerCalculationService.java
@@ -1,11 +1,11 @@
package de.avatic.lcc.service.calculation.execution.steps;
-import de.avatic.lcc.calculationmodel.ContainerCalculationResult;
+import de.avatic.lcc.model.calculation.ContainerCalculationResult;
import de.avatic.lcc.dto.generic.ContainerType;
import de.avatic.lcc.dto.generic.PalletType;
-import de.avatic.lcc.model.packaging.PackagingDimension;
-import de.avatic.lcc.model.properties.SystemPropertyMappingId;
-import de.avatic.lcc.model.utils.WeightUnit;
+import de.avatic.lcc.model.db.packaging.PackagingDimension;
+import de.avatic.lcc.model.db.properties.SystemPropertyMappingId;
+import de.avatic.lcc.model.db.utils.WeightUnit;
import de.avatic.lcc.repositories.properties.PropertyRepository;
import org.jetbrains.annotations.Debug.Renderer;
import org.springframework.stereotype.Service;
diff --git a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/CustomCostCalculationService.java b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/CustomCostCalculationService.java
index 53ca223..e310232 100644
--- a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/CustomCostCalculationService.java
+++ b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/CustomCostCalculationService.java
@@ -1,14 +1,14 @@
package de.avatic.lcc.service.calculation.execution.steps;
-import de.avatic.lcc.calculationmodel.ContainerCalculationResult;
-import de.avatic.lcc.calculationmodel.CustomResult;
-import de.avatic.lcc.calculationmodel.SectionInfo;
+import de.avatic.lcc.model.calculation.ContainerCalculationResult;
+import de.avatic.lcc.model.calculation.CustomResult;
+import de.avatic.lcc.model.calculation.SectionInfo;
import de.avatic.lcc.dto.generic.RateType;
-import de.avatic.lcc.model.premises.Premise;
-import de.avatic.lcc.model.premises.route.Destination;
-import de.avatic.lcc.model.properties.CountryPropertyMappingId;
-import de.avatic.lcc.model.properties.CustomUnionType;
-import de.avatic.lcc.model.properties.SystemPropertyMappingId;
+import de.avatic.lcc.model.db.premises.Premise;
+import de.avatic.lcc.model.db.premises.route.Destination;
+import de.avatic.lcc.model.db.properties.CountryPropertyMappingId;
+import de.avatic.lcc.model.db.properties.CustomUnionType;
+import de.avatic.lcc.model.db.properties.SystemPropertyMappingId;
import de.avatic.lcc.repositories.country.CountryPropertyRepository;
import de.avatic.lcc.repositories.premise.RouteNodeRepository;
import de.avatic.lcc.repositories.properties.PropertyRepository;
diff --git a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/HandlingCostCalculationService.java b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/HandlingCostCalculationService.java
index c44e856..40c2b4b 100644
--- a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/HandlingCostCalculationService.java
+++ b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/HandlingCostCalculationService.java
@@ -1,12 +1,12 @@
package de.avatic.lcc.service.calculation.execution.steps;
-import de.avatic.lcc.calculationmodel.HandlingResult;
-import de.avatic.lcc.model.packaging.LoadCarrierType;
-import de.avatic.lcc.model.packaging.PackagingDimension;
-import de.avatic.lcc.model.premises.Premise;
-import de.avatic.lcc.model.premises.route.Destination;
-import de.avatic.lcc.model.properties.CountryPropertyMappingId;
-import de.avatic.lcc.model.properties.SystemPropertyMappingId;
+import de.avatic.lcc.model.calculation.HandlingResult;
+import de.avatic.lcc.model.db.packaging.LoadCarrierType;
+import de.avatic.lcc.model.db.packaging.PackagingDimension;
+import de.avatic.lcc.model.db.premises.Premise;
+import de.avatic.lcc.model.db.premises.route.Destination;
+import de.avatic.lcc.model.db.properties.CountryPropertyMappingId;
+import de.avatic.lcc.model.db.properties.SystemPropertyMappingId;
import de.avatic.lcc.repositories.country.CountryPropertyRepository;
import de.avatic.lcc.repositories.properties.PropertyRepository;
import org.springframework.stereotype.Service;
diff --git a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/InventoryCostCalculationService.java b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/InventoryCostCalculationService.java
index 89180e3..d9b0658 100644
--- a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/InventoryCostCalculationService.java
+++ b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/InventoryCostCalculationService.java
@@ -1,12 +1,12 @@
package de.avatic.lcc.service.calculation.execution.steps;
-import de.avatic.lcc.calculationmodel.InventoryCostResult;
-import de.avatic.lcc.model.packaging.PackagingDimension;
-import de.avatic.lcc.model.premises.Premise;
-import de.avatic.lcc.model.premises.route.Destination;
-import de.avatic.lcc.model.properties.CountryPropertyMappingId;
-import de.avatic.lcc.model.properties.SystemPropertyMappingId;
-import de.avatic.lcc.model.utils.DimensionUnit;
+import de.avatic.lcc.model.calculation.InventoryCostResult;
+import de.avatic.lcc.model.db.packaging.PackagingDimension;
+import de.avatic.lcc.model.db.premises.Premise;
+import de.avatic.lcc.model.db.premises.route.Destination;
+import de.avatic.lcc.model.db.properties.CountryPropertyMappingId;
+import de.avatic.lcc.model.db.properties.SystemPropertyMappingId;
+import de.avatic.lcc.model.db.utils.DimensionUnit;
import de.avatic.lcc.repositories.country.CountryPropertyRepository;
import de.avatic.lcc.repositories.properties.PropertyRepository;
import org.springframework.stereotype.Service;
diff --git a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/PremiseToHuService.java b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/PremiseToHuService.java
index 23f058d..97badee 100644
--- a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/PremiseToHuService.java
+++ b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/PremiseToHuService.java
@@ -1,8 +1,8 @@
package de.avatic.lcc.service.calculation.execution.steps;
-import de.avatic.lcc.model.packaging.PackagingDimension;
-import de.avatic.lcc.model.packaging.PackagingType;
-import de.avatic.lcc.model.premises.Premise;
+import de.avatic.lcc.model.db.packaging.PackagingDimension;
+import de.avatic.lcc.model.db.packaging.PackagingType;
+import de.avatic.lcc.model.db.premises.Premise;
import org.springframework.stereotype.Service;
@Service
diff --git a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/RouteSectionCostCalculationService.java b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/RouteSectionCostCalculationService.java
index 786575e..2182034 100644
--- a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/RouteSectionCostCalculationService.java
+++ b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/RouteSectionCostCalculationService.java
@@ -1,21 +1,21 @@
package de.avatic.lcc.service.calculation.execution.steps;
-import de.avatic.lcc.calculationmodel.ContainerCalculationResult;
+import de.avatic.lcc.model.calculation.ContainerCalculationResult;
import de.avatic.lcc.dto.generic.ContainerType;
import de.avatic.lcc.dto.generic.RateType;
import de.avatic.lcc.dto.generic.TransportType;
-import de.avatic.lcc.model.calculations.CalculationJobRouteSection;
-import de.avatic.lcc.model.nodes.Location;
-import de.avatic.lcc.model.nodes.Node;
-import de.avatic.lcc.model.premises.Premise;
-import de.avatic.lcc.model.premises.route.Destination;
-import de.avatic.lcc.model.premises.route.RouteNode;
-import de.avatic.lcc.model.premises.route.RouteSection;
-import de.avatic.lcc.model.properties.SystemPropertyMappingId;
-import de.avatic.lcc.model.rates.ContainerRate;
-import de.avatic.lcc.model.rates.MatrixRate;
-import de.avatic.lcc.model.utils.DimensionUnit;
-import de.avatic.lcc.model.utils.WeightUnit;
+import de.avatic.lcc.model.db.calculations.CalculationJobRouteSection;
+import de.avatic.lcc.model.db.nodes.Location;
+import de.avatic.lcc.model.db.nodes.Node;
+import de.avatic.lcc.model.db.premises.Premise;
+import de.avatic.lcc.model.db.premises.route.Destination;
+import de.avatic.lcc.model.db.premises.route.RouteNode;
+import de.avatic.lcc.model.db.premises.route.RouteSection;
+import de.avatic.lcc.model.db.properties.SystemPropertyMappingId;
+import de.avatic.lcc.model.db.rates.ContainerRate;
+import de.avatic.lcc.model.db.rates.MatrixRate;
+import de.avatic.lcc.model.db.utils.DimensionUnit;
+import de.avatic.lcc.model.db.utils.WeightUnit;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.premise.RouteNodeRepository;
import de.avatic.lcc.repositories.properties.PropertyRepository;
diff --git a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/ShippingFrequencyCalculationService.java b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/ShippingFrequencyCalculationService.java
index 8c5bee5..04687f4 100644
--- a/src/main/java/de/avatic/lcc/service/calculation/execution/steps/ShippingFrequencyCalculationService.java
+++ b/src/main/java/de/avatic/lcc/service/calculation/execution/steps/ShippingFrequencyCalculationService.java
@@ -1,6 +1,6 @@
package de.avatic.lcc.service.calculation.execution.steps;
-import de.avatic.lcc.model.properties.SystemPropertyMappingId;
+import de.avatic.lcc.model.db.properties.SystemPropertyMappingId;
import de.avatic.lcc.repositories.properties.PropertyRepository;
import org.springframework.stereotype.Service;
diff --git a/src/main/java/de/avatic/lcc/service/configuration/RateApprovalService.java b/src/main/java/de/avatic/lcc/service/configuration/RateApprovalService.java
index c581f71..d49595b 100644
--- a/src/main/java/de/avatic/lcc/service/configuration/RateApprovalService.java
+++ b/src/main/java/de/avatic/lcc/service/configuration/RateApprovalService.java
@@ -1,8 +1,8 @@
package de.avatic.lcc.service.configuration;
import de.avatic.lcc.dto.configuration.rates.StagedRatesDTO;
-import de.avatic.lcc.model.properties.SystemPropertyMappingId;
-import de.avatic.lcc.model.rates.ValidityPeriod;
+import de.avatic.lcc.model.db.properties.SystemPropertyMappingId;
+import de.avatic.lcc.model.db.rates.ValidityPeriod;
import de.avatic.lcc.repositories.rates.ContainerRateRepository;
import de.avatic.lcc.repositories.rates.MatrixRateRepository;
import de.avatic.lcc.repositories.rates.ValidityPeriodRepository;
diff --git a/src/main/java/de/avatic/lcc/service/excelMapper/ContainerRateExcelMapper.java b/src/main/java/de/avatic/lcc/service/excelMapper/ContainerRateExcelMapper.java
index 4c2124d..57afb87 100644
--- a/src/main/java/de/avatic/lcc/service/excelMapper/ContainerRateExcelMapper.java
+++ b/src/main/java/de/avatic/lcc/service/excelMapper/ContainerRateExcelMapper.java
@@ -4,7 +4,7 @@ import de.avatic.lcc.dto.generic.TransportType;
import de.avatic.lcc.model.bulk.HiddenTableType;
import de.avatic.lcc.model.bulk.header.ContainerRateHeader;
import de.avatic.lcc.model.bulk.header.HiddenNodeHeader;
-import de.avatic.lcc.model.rates.ContainerRate;
+import de.avatic.lcc.model.db.rates.ContainerRate;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.rates.ContainerRateRepository;
import de.avatic.lcc.service.bulk.helper.ConstraintGenerator;
diff --git a/src/main/java/de/avatic/lcc/service/excelMapper/HiddenCountryExcelMapper.java b/src/main/java/de/avatic/lcc/service/excelMapper/HiddenCountryExcelMapper.java
index 85e4d20..8430705 100644
--- a/src/main/java/de/avatic/lcc/service/excelMapper/HiddenCountryExcelMapper.java
+++ b/src/main/java/de/avatic/lcc/service/excelMapper/HiddenCountryExcelMapper.java
@@ -1,7 +1,7 @@
package de.avatic.lcc.service.excelMapper;
import de.avatic.lcc.model.bulk.header.HiddenCountryHeader;
-import de.avatic.lcc.model.country.Country;
+import de.avatic.lcc.model.db.country.Country;
import de.avatic.lcc.repositories.country.CountryRepository;
import de.avatic.lcc.service.bulk.helper.HeaderGenerator;
import org.apache.poi.ss.usermodel.CellStyle;
diff --git a/src/main/java/de/avatic/lcc/service/excelMapper/HiddenNodeExcelMapper.java b/src/main/java/de/avatic/lcc/service/excelMapper/HiddenNodeExcelMapper.java
index f4c42ad..a4a70ef 100644
--- a/src/main/java/de/avatic/lcc/service/excelMapper/HiddenNodeExcelMapper.java
+++ b/src/main/java/de/avatic/lcc/service/excelMapper/HiddenNodeExcelMapper.java
@@ -1,7 +1,7 @@
package de.avatic.lcc.service.excelMapper;
import de.avatic.lcc.model.bulk.header.HiddenNodeHeader;
-import de.avatic.lcc.model.nodes.Node;
+import de.avatic.lcc.model.db.nodes.Node;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.service.bulk.helper.HeaderGenerator;
import org.apache.poi.ss.usermodel.CellStyle;
diff --git a/src/main/java/de/avatic/lcc/service/excelMapper/MaterialExcelMapper.java b/src/main/java/de/avatic/lcc/service/excelMapper/MaterialExcelMapper.java
index 22b1b92..4614132 100644
--- a/src/main/java/de/avatic/lcc/service/excelMapper/MaterialExcelMapper.java
+++ b/src/main/java/de/avatic/lcc/service/excelMapper/MaterialExcelMapper.java
@@ -3,9 +3,7 @@ package de.avatic.lcc.service.excelMapper;
import de.avatic.lcc.model.bulk.BulkInstruction;
import de.avatic.lcc.model.bulk.BulkInstructionType;
import de.avatic.lcc.model.bulk.header.MaterialHeader;
-import de.avatic.lcc.model.bulk.header.MatrixRateHeader;
-import de.avatic.lcc.model.bulk.header.NodeHeader;
-import de.avatic.lcc.model.materials.Material;
+import de.avatic.lcc.model.db.materials.Material;
import de.avatic.lcc.repositories.MaterialRepository;
import de.avatic.lcc.service.bulk.helper.ConstraintGenerator;
import de.avatic.lcc.service.bulk.helper.HeaderGenerator;
diff --git a/src/main/java/de/avatic/lcc/service/excelMapper/MatrixRateExcelMapper.java b/src/main/java/de/avatic/lcc/service/excelMapper/MatrixRateExcelMapper.java
index cb9d014..f01ff7b 100644
--- a/src/main/java/de/avatic/lcc/service/excelMapper/MatrixRateExcelMapper.java
+++ b/src/main/java/de/avatic/lcc/service/excelMapper/MatrixRateExcelMapper.java
@@ -1,11 +1,10 @@
package de.avatic.lcc.service.excelMapper;
import de.avatic.lcc.model.bulk.HiddenTableType;
-import de.avatic.lcc.model.bulk.header.ContainerRateHeader;
import de.avatic.lcc.model.bulk.header.HiddenCountryHeader;
import de.avatic.lcc.model.bulk.header.MatrixRateHeader;
-import de.avatic.lcc.model.country.IsoCode;
-import de.avatic.lcc.model.rates.MatrixRate;
+import de.avatic.lcc.model.db.country.IsoCode;
+import de.avatic.lcc.model.db.rates.MatrixRate;
import de.avatic.lcc.repositories.country.CountryRepository;
import de.avatic.lcc.repositories.rates.MatrixRateRepository;
import de.avatic.lcc.service.bulk.helper.ConstraintGenerator;
diff --git a/src/main/java/de/avatic/lcc/service/excelMapper/NodeExcelMapper.java b/src/main/java/de/avatic/lcc/service/excelMapper/NodeExcelMapper.java
index 7f6f99d..5e2122c 100644
--- a/src/main/java/de/avatic/lcc/service/excelMapper/NodeExcelMapper.java
+++ b/src/main/java/de/avatic/lcc/service/excelMapper/NodeExcelMapper.java
@@ -1,15 +1,14 @@
package de.avatic.lcc.service.excelMapper;
-import de.avatic.lcc.excelmodel.ExcelNode;
+import de.avatic.lcc.model.excel.ExcelNode;
import de.avatic.lcc.model.bulk.BulkInstruction;
import de.avatic.lcc.model.bulk.BulkInstructionType;
import de.avatic.lcc.model.bulk.HiddenTableType;
import de.avatic.lcc.model.bulk.header.HiddenCountryHeader;
import de.avatic.lcc.model.bulk.header.NodeHeader;
-import de.avatic.lcc.model.bulk.header.PackagingHeader;
-import de.avatic.lcc.model.country.Country;
-import de.avatic.lcc.model.country.IsoCode;
-import de.avatic.lcc.model.nodes.Node;
+import de.avatic.lcc.model.db.country.Country;
+import de.avatic.lcc.model.db.country.IsoCode;
+import de.avatic.lcc.model.db.nodes.Node;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.country.CountryRepository;
import de.avatic.lcc.service.bulk.helper.ConstraintGenerator;
diff --git a/src/main/java/de/avatic/lcc/service/excelMapper/PackagingExcelMapper.java b/src/main/java/de/avatic/lcc/service/excelMapper/PackagingExcelMapper.java
index e2d3ad3..cd1e0ec 100644
--- a/src/main/java/de/avatic/lcc/service/excelMapper/PackagingExcelMapper.java
+++ b/src/main/java/de/avatic/lcc/service/excelMapper/PackagingExcelMapper.java
@@ -1,18 +1,17 @@
package de.avatic.lcc.service.excelMapper;
-import de.avatic.lcc.excelmodel.ExcelPackaging;
+import de.avatic.lcc.model.excel.ExcelPackaging;
import de.avatic.lcc.model.bulk.BulkInstruction;
import de.avatic.lcc.model.bulk.BulkInstructionType;
import de.avatic.lcc.model.bulk.HiddenTableType;
import de.avatic.lcc.model.bulk.header.HiddenNodeHeader;
-import de.avatic.lcc.model.bulk.header.MaterialHeader;
import de.avatic.lcc.model.bulk.header.PackagingHeader;
-import de.avatic.lcc.model.packaging.Packaging;
-import de.avatic.lcc.model.packaging.PackagingDimension;
-import de.avatic.lcc.model.properties.PropertyType;
-import de.avatic.lcc.model.utils.DimensionUnit;
-import de.avatic.lcc.model.utils.WeightUnit;
+import de.avatic.lcc.model.db.packaging.Packaging;
+import de.avatic.lcc.model.db.packaging.PackagingDimension;
+import de.avatic.lcc.model.db.properties.PropertyType;
+import de.avatic.lcc.model.db.utils.DimensionUnit;
+import de.avatic.lcc.model.db.utils.WeightUnit;
import de.avatic.lcc.repositories.MaterialRepository;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.packaging.PackagingDimensionRepository;
diff --git a/src/main/java/de/avatic/lcc/service/precalculation/PostCalculationCheckService.java b/src/main/java/de/avatic/lcc/service/precalculation/PostCalculationCheckService.java
index a32633f..d1de294 100644
--- a/src/main/java/de/avatic/lcc/service/precalculation/PostCalculationCheckService.java
+++ b/src/main/java/de/avatic/lcc/service/precalculation/PostCalculationCheckService.java
@@ -1,6 +1,6 @@
package de.avatic.lcc.service.precalculation;
-import de.avatic.lcc.model.calculations.CalculationResult;
+import de.avatic.lcc.model.db.calculations.CalculationResult;
import org.springframework.stereotype.Service;
@Service
diff --git a/src/main/java/de/avatic/lcc/service/precalculation/PreCalculationCheckService.java b/src/main/java/de/avatic/lcc/service/precalculation/PreCalculationCheckService.java
index a0e1a99..72b67aa 100644
--- a/src/main/java/de/avatic/lcc/service/precalculation/PreCalculationCheckService.java
+++ b/src/main/java/de/avatic/lcc/service/precalculation/PreCalculationCheckService.java
@@ -2,16 +2,16 @@ package de.avatic.lcc.service.precalculation;
import de.avatic.lcc.dto.generic.ContainerType;
import de.avatic.lcc.dto.generic.RateType;
-import de.avatic.lcc.model.nodes.Node;
-import de.avatic.lcc.model.premises.Premise;
-import de.avatic.lcc.model.premises.route.Destination;
-import de.avatic.lcc.model.premises.route.Route;
-import de.avatic.lcc.model.premises.route.RouteSection;
-import de.avatic.lcc.model.properties.PropertySet;
-import de.avatic.lcc.model.properties.SystemPropertyMappingId;
-import de.avatic.lcc.model.rates.ValidityPeriod;
-import de.avatic.lcc.model.rates.ValidityPeriodState;
-import de.avatic.lcc.model.utils.WeightUnit;
+import de.avatic.lcc.model.db.nodes.Node;
+import de.avatic.lcc.model.db.premises.Premise;
+import de.avatic.lcc.model.db.premises.route.Destination;
+import de.avatic.lcc.model.db.premises.route.Route;
+import de.avatic.lcc.model.db.premises.route.RouteSection;
+import de.avatic.lcc.model.db.properties.PropertySet;
+import de.avatic.lcc.model.db.properties.SystemPropertyMappingId;
+import de.avatic.lcc.model.db.rates.ValidityPeriod;
+import de.avatic.lcc.model.db.rates.ValidityPeriodState;
+import de.avatic.lcc.model.db.utils.WeightUnit;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.premise.*;
import de.avatic.lcc.repositories.properties.PropertySetRepository;
diff --git a/src/main/java/de/avatic/lcc/service/transformer/apps/AppTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/apps/AppTransformer.java
new file mode 100644
index 0000000..767d83e
--- /dev/null
+++ b/src/main/java/de/avatic/lcc/service/transformer/apps/AppTransformer.java
@@ -0,0 +1,41 @@
+package de.avatic.lcc.service.transformer.apps;
+
+import de.avatic.lcc.dto.users.AppDTO;
+import de.avatic.lcc.model.db.users.App;
+import de.avatic.lcc.model.db.users.Group;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AppTransformer {
+
+
+ public AppDTO toAppDTO(App entity) {
+ AppDTO dto = new AppDTO();
+
+ dto.setId(entity.getId());
+ dto.setName(entity.getName());
+ dto.setClientSecret(entity.getClientSecret());
+ dto.setClientId(entity.getClientId());
+ dto.setGroups(entity.getGroups().stream().map(Group::getName).toList());
+
+ return dto;
+ }
+
+ public App toAppEntity(AppDTO dto) {
+ App entity = new App();
+
+ entity.setId(dto.getId());
+ entity.setName(dto.getName());
+ entity.setClientSecret(dto.getClientSecret());
+ entity.setClientId(dto.getClientId());
+ entity.setGroups(dto.getGroups().stream().map(this::fromGroupDTO).toList());
+
+ return entity;
+ }
+
+ private Group fromGroupDTO(String name) {
+ var group = new Group();
+ group.setName(name);
+ return group;
+ }
+}
diff --git a/src/main/java/de/avatic/lcc/service/transformer/error/SysErrorTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/error/SysErrorTransformer.java
index b43186d..5b5be70 100644
--- a/src/main/java/de/avatic/lcc/service/transformer/error/SysErrorTransformer.java
+++ b/src/main/java/de/avatic/lcc/service/transformer/error/SysErrorTransformer.java
@@ -3,9 +3,9 @@ package de.avatic.lcc.service.transformer.error;
import de.avatic.lcc.dto.error.ErrorLogDTO;
import de.avatic.lcc.dto.error.ErrorLogTraceItemDto;
import de.avatic.lcc.dto.error.FrontendErrorDTO;
-import de.avatic.lcc.model.error.SysError;
-import de.avatic.lcc.model.error.SysErrorTraceItem;
-import de.avatic.lcc.model.error.SysErrorType;
+import de.avatic.lcc.model.db.error.SysError;
+import de.avatic.lcc.model.db.error.SysErrorTraceItem;
+import de.avatic.lcc.model.db.error.SysErrorType;
import de.avatic.lcc.service.users.AuthorizationService;
import org.springframework.stereotype.Service;
diff --git a/src/main/java/de/avatic/lcc/service/transformer/generic/CountryTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/generic/CountryTransformer.java
index 51d58a3..b4129fb 100644
--- a/src/main/java/de/avatic/lcc/service/transformer/generic/CountryTransformer.java
+++ b/src/main/java/de/avatic/lcc/service/transformer/generic/CountryTransformer.java
@@ -1,7 +1,7 @@
package de.avatic.lcc.service.transformer.generic;
import de.avatic.lcc.dto.generic.CountryDTO;
-import de.avatic.lcc.model.country.Country;
+import de.avatic.lcc.model.db.country.Country;
import org.springframework.stereotype.Service;
@Service
diff --git a/src/main/java/de/avatic/lcc/service/transformer/generic/DimensionTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/generic/DimensionTransformer.java
index 6857395..02f69e4 100644
--- a/src/main/java/de/avatic/lcc/service/transformer/generic/DimensionTransformer.java
+++ b/src/main/java/de/avatic/lcc/service/transformer/generic/DimensionTransformer.java
@@ -1,12 +1,12 @@
package de.avatic.lcc.service.transformer.generic;
import de.avatic.lcc.dto.generic.DimensionDTO;
-import de.avatic.lcc.excelmodel.ExcelPackaging;
-import de.avatic.lcc.model.packaging.PackagingDimension;
-import de.avatic.lcc.model.packaging.PackagingType;
-import de.avatic.lcc.model.premises.Premise;
-import de.avatic.lcc.model.utils.DimensionUnit;
-import de.avatic.lcc.model.utils.WeightUnit;
+import de.avatic.lcc.model.excel.ExcelPackaging;
+import de.avatic.lcc.model.db.packaging.PackagingDimension;
+import de.avatic.lcc.model.db.packaging.PackagingType;
+import de.avatic.lcc.model.db.premises.Premise;
+import de.avatic.lcc.model.db.utils.DimensionUnit;
+import de.avatic.lcc.model.db.utils.WeightUnit;
import de.avatic.lcc.util.exception.badrequest.InvalidArgumentException;
import org.springframework.stereotype.Service;
diff --git a/src/main/java/de/avatic/lcc/service/transformer/generic/LocationTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/generic/LocationTransformer.java
index 336bbfc..3291192 100644
--- a/src/main/java/de/avatic/lcc/service/transformer/generic/LocationTransformer.java
+++ b/src/main/java/de/avatic/lcc/service/transformer/generic/LocationTransformer.java
@@ -1,9 +1,9 @@
package de.avatic.lcc.service.transformer.generic;
import de.avatic.lcc.dto.generic.LocationDTO;
-import de.avatic.lcc.model.nodes.Location;
-import de.avatic.lcc.model.nodes.Node;
-import de.avatic.lcc.model.premises.route.RouteNode;
+import de.avatic.lcc.model.db.nodes.Location;
+import de.avatic.lcc.model.db.nodes.Node;
+import de.avatic.lcc.model.db.premises.route.RouteNode;
import org.springframework.stereotype.Service;
@Service
diff --git a/src/main/java/de/avatic/lcc/service/transformer/generic/MaterialTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/generic/MaterialTransformer.java
index 809f3b7..e2d9796 100644
--- a/src/main/java/de/avatic/lcc/service/transformer/generic/MaterialTransformer.java
+++ b/src/main/java/de/avatic/lcc/service/transformer/generic/MaterialTransformer.java
@@ -1,7 +1,7 @@
package de.avatic.lcc.service.transformer.generic;
import de.avatic.lcc.dto.generic.MaterialDTO;
-import de.avatic.lcc.model.materials.Material;
+import de.avatic.lcc.model.db.materials.Material;
import org.springframework.stereotype.Service;
@Service
diff --git a/src/main/java/de/avatic/lcc/service/transformer/generic/NodeTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/generic/NodeTransformer.java
index eec5e08..fd71497 100644
--- a/src/main/java/de/avatic/lcc/service/transformer/generic/NodeTransformer.java
+++ b/src/main/java/de/avatic/lcc/service/transformer/generic/NodeTransformer.java
@@ -2,11 +2,11 @@ package de.avatic.lcc.service.transformer.generic;
import de.avatic.lcc.dto.generic.NodeDTO;
import de.avatic.lcc.dto.generic.NodeType;
-import de.avatic.lcc.excelmodel.ExcelNode;
-import de.avatic.lcc.model.country.Country;
-import de.avatic.lcc.model.country.IsoCode;
-import de.avatic.lcc.model.nodes.Node;
-import de.avatic.lcc.model.premises.route.RouteNode;
+import de.avatic.lcc.model.excel.ExcelNode;
+import de.avatic.lcc.model.db.country.Country;
+import de.avatic.lcc.model.db.country.IsoCode;
+import de.avatic.lcc.model.db.nodes.Node;
+import de.avatic.lcc.model.db.premises.route.RouteNode;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.country.CountryRepository;
import de.avatic.lcc.util.exception.internalerror.ExcelValidationError;
diff --git a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailPackagingPropertyTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailPackagingPropertyTransformer.java
index f9c2d94..698499e 100644
--- a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailPackagingPropertyTransformer.java
+++ b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailPackagingPropertyTransformer.java
@@ -2,7 +2,7 @@ package de.avatic.lcc.service.transformer.material;
import de.avatic.lcc.dto.generic.PropertyDTO;
-import de.avatic.lcc.model.properties.PackagingProperty;
+import de.avatic.lcc.model.db.properties.PackagingProperty;
import org.springframework.stereotype.Service;
/**
diff --git a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailPackagingTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailPackagingTransformer.java
index 42c79a0..51aa607 100644
--- a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailPackagingTransformer.java
+++ b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailPackagingTransformer.java
@@ -1,23 +1,20 @@
package de.avatic.lcc.service.transformer.material;
import de.avatic.lcc.dto.configuration.material.view.MaterialDetailPackagingDTO;
-import de.avatic.lcc.model.nodes.Node;
-import de.avatic.lcc.model.packaging.Packaging;
-import de.avatic.lcc.model.packaging.PackagingDimension;
-import de.avatic.lcc.model.properties.PackagingProperty;
+import de.avatic.lcc.model.db.nodes.Node;
+import de.avatic.lcc.model.db.packaging.Packaging;
+import de.avatic.lcc.model.db.packaging.PackagingDimension;
+import de.avatic.lcc.model.db.properties.PackagingProperty;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.packaging.PackagingDimensionRepository;
import de.avatic.lcc.repositories.packaging.PackagingPropertiesRepository;
import de.avatic.lcc.service.transformer.generic.DimensionTransformer;
import de.avatic.lcc.service.transformer.generic.NodeTransformer;
-import org.springframework.data.mapping.model.Property;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
-import static java.util.stream.Collectors.toList;
-
/**
* Transformer service to convert {@link Packaging} entities into {@link MaterialDetailPackagingDTO} objects.
* This service includes logic for mapping associated supplier, dimensions, and properties.
diff --git a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailTransformer.java
index 3cec5d9..4d0e1c4 100644
--- a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailTransformer.java
+++ b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialDetailTransformer.java
@@ -2,7 +2,7 @@ package de.avatic.lcc.service.transformer.material;
import de.avatic.lcc.dto.configuration.material.view.MaterialDetailDTO;
import de.avatic.lcc.dto.configuration.material.view.MaterialDetailPackagingDTO;
-import de.avatic.lcc.model.materials.Material;
+import de.avatic.lcc.model.db.materials.Material;
import de.avatic.lcc.repositories.packaging.PackagingRepository;
import org.springframework.stereotype.Service;
diff --git a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialUpdateDTOTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialUpdateDTOTransformer.java
index e5658c9..f6a70dd 100644
--- a/src/main/java/de/avatic/lcc/service/transformer/material/MaterialUpdateDTOTransformer.java
+++ b/src/main/java/de/avatic/lcc/service/transformer/material/MaterialUpdateDTOTransformer.java
@@ -1,7 +1,7 @@
package de.avatic.lcc.service.transformer.material;
import de.avatic.lcc.dto.configuration.material.update.MaterialUpdateDTO;
-import de.avatic.lcc.model.materials.Material;
+import de.avatic.lcc.model.db.materials.Material;
import org.springframework.stereotype.Service;
@Deprecated
diff --git a/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeDetailTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeDetailTransformer.java
index e44eb6d..325a320 100644
--- a/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeDetailTransformer.java
+++ b/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeDetailTransformer.java
@@ -3,7 +3,7 @@ package de.avatic.lcc.service.transformer.nodes;
import de.avatic.lcc.dto.configuration.nodes.view.NodeDetailDTO;
import de.avatic.lcc.dto.generic.NodeDTO;
import de.avatic.lcc.dto.generic.NodeType;
-import de.avatic.lcc.model.nodes.Node;
+import de.avatic.lcc.model.db.nodes.Node;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.country.CountryRepository;
import de.avatic.lcc.service.transformer.generic.CountryTransformer;
diff --git a/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeUpdateDTOTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeUpdateDTOTransformer.java
index ec38806..b2ac5c7 100644
--- a/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeUpdateDTOTransformer.java
+++ b/src/main/java/de/avatic/lcc/service/transformer/nodes/NodeUpdateDTOTransformer.java
@@ -1,15 +1,10 @@
package de.avatic.lcc.service.transformer.nodes;
import de.avatic.lcc.dto.configuration.nodes.update.NodeUpdateDTO;
-import de.avatic.lcc.dto.generic.NodeType;
-import de.avatic.lcc.model.nodes.Node;
-import de.avatic.lcc.repositories.country.CountryRepository;
+import de.avatic.lcc.model.db.nodes.Node;
import org.apache.commons.lang3.NotImplementedException;
import org.springframework.stereotype.Service;
-import java.math.BigDecimal;
-import java.util.ArrayList;
-
@Service
public class NodeUpdateDTOTransformer {
diff --git a/src/main/java/de/avatic/lcc/service/transformer/premise/DestinationTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/premise/DestinationTransformer.java
index 25e5ccb..d3dd1be 100644
--- a/src/main/java/de/avatic/lcc/service/transformer/premise/DestinationTransformer.java
+++ b/src/main/java/de/avatic/lcc/service/transformer/premise/DestinationTransformer.java
@@ -1,7 +1,7 @@
package de.avatic.lcc.service.transformer.premise;
import de.avatic.lcc.dto.calculation.DestinationDTO;
-import de.avatic.lcc.model.premises.route.Destination;
+import de.avatic.lcc.model.db.premises.route.Destination;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.premise.RouteRepository;
import de.avatic.lcc.service.transformer.generic.NodeTransformer;
diff --git a/src/main/java/de/avatic/lcc/service/transformer/premise/PremiseTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/premise/PremiseTransformer.java
index 1db79c2..37cfef8 100644
--- a/src/main/java/de/avatic/lcc/service/transformer/premise/PremiseTransformer.java
+++ b/src/main/java/de/avatic/lcc/service/transformer/premise/PremiseTransformer.java
@@ -6,8 +6,8 @@ import de.avatic.lcc.dto.calculation.edit.PremiseDetailDTO;
import de.avatic.lcc.dto.generic.LocationDTO;
import de.avatic.lcc.dto.generic.NodeDTO;
import de.avatic.lcc.dto.generic.NodeType;
-import de.avatic.lcc.model.premises.Premise;
-import de.avatic.lcc.model.premises.PremiseListEntry;
+import de.avatic.lcc.model.db.premises.Premise;
+import de.avatic.lcc.model.db.premises.PremiseListEntry;
import de.avatic.lcc.repositories.MaterialRepository;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.country.CountryRepository;
diff --git a/src/main/java/de/avatic/lcc/service/transformer/premise/RouteTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/premise/RouteTransformer.java
index 117f77d..dd49ce7 100644
--- a/src/main/java/de/avatic/lcc/service/transformer/premise/RouteTransformer.java
+++ b/src/main/java/de/avatic/lcc/service/transformer/premise/RouteTransformer.java
@@ -2,13 +2,13 @@ package de.avatic.lcc.service.transformer.premise;
import de.avatic.lcc.dto.calculation.RouteDTO;
import de.avatic.lcc.dto.generic.TransportType;
-import de.avatic.lcc.model.premises.route.RouteNode;
-import de.avatic.lcc.model.premises.route.RouteSection;
+import de.avatic.lcc.model.db.premises.route.RouteNode;
+import de.avatic.lcc.model.db.premises.route.RouteSection;
import de.avatic.lcc.repositories.premise.RouteNodeRepository;
import de.avatic.lcc.repositories.premise.RouteSectionRepository;
import de.avatic.lcc.service.transformer.generic.NodeTransformer;
import org.springframework.stereotype.Service;
-import de.avatic.lcc.model.premises.route.Route;
+import de.avatic.lcc.model.db.premises.route.Route;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/main/java/de/avatic/lcc/service/transformer/rates/ValidityPeriodTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/rates/ValidityPeriodTransformer.java
index c565230..a1f37cd 100644
--- a/src/main/java/de/avatic/lcc/service/transformer/rates/ValidityPeriodTransformer.java
+++ b/src/main/java/de/avatic/lcc/service/transformer/rates/ValidityPeriodTransformer.java
@@ -1,8 +1,8 @@
package de.avatic.lcc.service.transformer.rates;
import de.avatic.lcc.dto.generic.ValidityPeriodDTO;
-import de.avatic.lcc.model.properties.PropertySet;
-import de.avatic.lcc.model.rates.ValidityPeriod;
+import de.avatic.lcc.model.db.properties.PropertySet;
+import de.avatic.lcc.model.db.rates.ValidityPeriod;
import org.springframework.stereotype.Service;
@Service
diff --git a/src/main/java/de/avatic/lcc/service/transformer/report/ReportTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/report/ReportTransformer.java
index 5c48931..3450b83 100644
--- a/src/main/java/de/avatic/lcc/service/transformer/report/ReportTransformer.java
+++ b/src/main/java/de/avatic/lcc/service/transformer/report/ReportTransformer.java
@@ -6,12 +6,12 @@ import de.avatic.lcc.dto.report.ReportDTO;
import de.avatic.lcc.dto.report.ReportDestinationDTO;
import de.avatic.lcc.dto.report.ReportEntryDTO;
import de.avatic.lcc.dto.report.ReportSectionDTO;
-import de.avatic.lcc.model.calculations.CalculationJob;
-import de.avatic.lcc.model.calculations.CalculationJobDestination;
-import de.avatic.lcc.model.calculations.CalculationJobRouteSection;
-import de.avatic.lcc.model.nodes.Node;
-import de.avatic.lcc.model.premises.Premise;
-import de.avatic.lcc.model.properties.SystemPropertyMappingId;
+import de.avatic.lcc.model.db.calculations.CalculationJob;
+import de.avatic.lcc.model.db.calculations.CalculationJobDestination;
+import de.avatic.lcc.model.db.calculations.CalculationJobRouteSection;
+import de.avatic.lcc.model.db.nodes.Node;
+import de.avatic.lcc.model.db.premises.Premise;
+import de.avatic.lcc.model.db.properties.SystemPropertyMappingId;
import de.avatic.lcc.repositories.MaterialRepository;
import de.avatic.lcc.repositories.NodeRepository;
import de.avatic.lcc.repositories.calculation.CalculationJobDestinationRepository;
diff --git a/src/main/java/de/avatic/lcc/service/transformer/users/UserTransformer.java b/src/main/java/de/avatic/lcc/service/transformer/users/UserTransformer.java
index 14b56ab..7a3e1d3 100644
--- a/src/main/java/de/avatic/lcc/service/transformer/users/UserTransformer.java
+++ b/src/main/java/de/avatic/lcc/service/transformer/users/UserTransformer.java
@@ -1,8 +1,8 @@
package de.avatic.lcc.service.transformer.users;
import de.avatic.lcc.dto.users.UserDTO;
-import de.avatic.lcc.model.users.Group;
-import de.avatic.lcc.model.users.User;
+import de.avatic.lcc.model.db.users.Group;
+import de.avatic.lcc.model.db.users.User;
import org.springframework.stereotype.Service;
@Service
diff --git a/src/main/java/de/avatic/lcc/service/users/AuthorizationService.java b/src/main/java/de/avatic/lcc/service/users/AuthorizationService.java
index f858398..5a0e429 100644
--- a/src/main/java/de/avatic/lcc/service/users/AuthorizationService.java
+++ b/src/main/java/de/avatic/lcc/service/users/AuthorizationService.java
@@ -2,7 +2,6 @@ package de.avatic.lcc.service.users;
import de.avatic.lcc.config.LccOidcUser;
import de.avatic.lcc.dto.users.UserDTO;
-import de.avatic.lcc.model.users.User;
import de.avatic.lcc.repositories.users.UserRepository;
import de.avatic.lcc.service.transformer.users.UserTransformer;
import de.avatic.lcc.util.exception.base.ForbiddenException;
diff --git a/src/main/java/de/avatic/lcc/service/users/GroupService.java b/src/main/java/de/avatic/lcc/service/users/GroupService.java
index c468362..3e740cf 100644
--- a/src/main/java/de/avatic/lcc/service/users/GroupService.java
+++ b/src/main/java/de/avatic/lcc/service/users/GroupService.java
@@ -1,15 +1,12 @@
package de.avatic.lcc.service.users;
import de.avatic.lcc.dto.users.GroupDTO;
-import de.avatic.lcc.dto.users.UserDTO;
-import de.avatic.lcc.model.users.Group;
+import de.avatic.lcc.model.db.users.Group;
import de.avatic.lcc.repositories.pagination.SearchQueryPagination;
import de.avatic.lcc.repositories.pagination.SearchQueryResult;
import de.avatic.lcc.repositories.users.GroupRepository;
import org.springframework.stereotype.Service;
-import java.util.List;
-
/**
* Service class for managing group-related operations such as updating groups
* and retrieving group data.
diff --git a/src/main/java/de/avatic/lcc/util/exception/badrequest/PropertyValidationException.java b/src/main/java/de/avatic/lcc/util/exception/badrequest/PropertyValidationException.java
index f0aa620..233452f 100644
--- a/src/main/java/de/avatic/lcc/util/exception/badrequest/PropertyValidationException.java
+++ b/src/main/java/de/avatic/lcc/util/exception/badrequest/PropertyValidationException.java
@@ -1,6 +1,5 @@
package de.avatic.lcc.util.exception.badrequest;
-import de.avatic.lcc.model.properties.PropertyDataType;
import de.avatic.lcc.util.exception.base.BadRequestException;
public class PropertyValidationException extends BadRequestException {
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 3a4c4d4..a56307b 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -7,6 +7,7 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.sql.init.mode=never
lcc.bulk.sheet_password=secretSheet?!
lcc.allowed_cors=${ALLOWED_CORS_DOMAIN}
+lcc.base.url=${LCC_BASE_URL}
azure.maps.client.id=${AZURE_MAPS_CLIENT_ID}
azure.maps.subscription.key=${AZURE_MAPS_SUBSCRIPTION_KEY}
spring.servlet.multipart.max-file-size=30MB
@@ -16,3 +17,4 @@ spring.cloud.azure.active-directory.profile.tenant-id=${AZURE_TENANT_ID}
spring.cloud.azure.active-directory.credential.client-id=${AZURE_CLIENT_ID}
spring.cloud.azure.active-directory.credential.client-secret=${AZURE_CLIENT_SECRET}
spring.cloud.azure.active-directory.authorization-clients.graph.scopes=openid,profile,email,https://graph.microsoft.com/User.Read
+jwt.secret=${JWT_SECRET}
diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql
index ad8dbab..4e5e76c 100644
--- a/src/main/resources/schema.sql
+++ b/src/main/resources/schema.sql
@@ -115,10 +115,9 @@ CREATE TABLE IF NOT EXISTS `sys_group`
-- Junction table for user-group assignments
CREATE TABLE IF NOT EXISTS `sys_user_group_mapping`
(
- `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`user_id` INT NOT NULL,
`group_id` INT NOT NULL,
- UNIQUE INDEX `idx_user_group` (`user_id`, `group_id`),
+ PRIMARY KEY (`user_id`, `group_id`),
FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`id`),
FOREIGN KEY (`group_id`) REFERENCES `sys_group` (`id`)
) COMMENT 'Links users with their associated groups';
@@ -138,6 +137,26 @@ CREATE TABLE IF NOT EXISTS `sys_user_node`
FOREIGN KEY (`country_id`) REFERENCES `country` (`id`)
) COMMENT 'Contains user generated logistic nodes';
+-- Main table for user information
+CREATE TABLE IF NOT EXISTS `sys_app`
+(
+ `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ client_id VARCHAR(255) NOT NULL UNIQUE,
+ client_secret VARCHAR(255) NOT NULL, -- BCrypt gehashed
+ name VARCHAR(255) NOT NULL
+) COMMENT 'Stores basic information about external applications';
+
+
+-- Junction table for user-group assignments
+CREATE TABLE IF NOT EXISTS `sys_app_group_mapping`
+(
+ `app_id` INT NOT NULL,
+ `group_id` INT NOT NULL,
+ PRIMARY KEY (`app_id`, `group_id`),
+ FOREIGN KEY (`app_id`) REFERENCES `sys_app` (`id`),
+ FOREIGN KEY (`group_id`) REFERENCES `sys_group` (`id`)
+) COMMENT 'Links app with their associated groups';
+
-- logistic nodes
CREATE TABLE IF NOT EXISTS node
@@ -388,10 +407,10 @@ CREATE TABLE IF NOT EXISTS premise
CREATE TABLE IF NOT EXISTS premise_destination
(
- id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
- premise_id INT NOT NULL,
+ id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ premise_id INT NOT NULL,
annual_amount INT UNSIGNED COMMENT 'annual amount in single pieces',
- destination_node_id INT NOT NULL,
+ destination_node_id INT NOT NULL,
is_d2d BOOLEAN DEFAULT FALSE,
rate_d2d DECIMAL(15, 2) DEFAULT NULL CHECK (rate_d2d >= 0),
lead_time_d2d INT UNSIGNED DEFAULT NULL CHECK (lead_time_d2d >= 0),
@@ -400,7 +419,7 @@ CREATE TABLE IF NOT EXISTS premise_destination
disposal_cost DECIMAL(15, 2) DEFAULT NULL CHECK (disposal_cost >= 0),
geo_lat DECIMAL(8, 4) CHECK (geo_lat BETWEEN -90 AND 90),
geo_lng DECIMAL(8, 4) CHECK (geo_lng BETWEEN -180 AND 180),
- country_id INT NOT NULL,
+ country_id INT NOT NULL,
FOREIGN KEY (premise_id) REFERENCES premise (id),
FOREIGN KEY (country_id) REFERENCES country (id),
FOREIGN KEY (destination_node_id) REFERENCES node (id),
@@ -597,16 +616,16 @@ CREATE TABLE IF NOT EXISTS bulk_operation
CREATE TABLE IF NOT EXISTS sys_error
(
- id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
- user_id INT DEFAULT NULL,
- title VARCHAR(255) NOT NULL,
- code VARCHAR(255) NOT NULL,
+ id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ user_id INT DEFAULT NULL,
+ title VARCHAR(255) NOT NULL,
+ code VARCHAR(255) NOT NULL,
message VARCHAR(1024) NOT NULL,
pinia TEXT,
- calculation_job_id INT DEFAULT NULL,
- bulk_operation_id INT DEFAULT NULL,
- type CHAR(16) NOT NULL DEFAULT 'BACKEND',
- created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ calculation_job_id INT DEFAULT NULL,
+ bulk_operation_id INT DEFAULT NULL,
+ type CHAR(16) NOT NULL DEFAULT 'BACKEND',
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES sys_user (id),
FOREIGN KEY (calculation_job_id) REFERENCES calculation_job (id),
FOREIGN KEY (bulk_operation_id) REFERENCES bulk_operation (id),
@@ -617,13 +636,13 @@ CREATE TABLE IF NOT EXISTS sys_error
CREATE TABLE IF NOT EXISTS sys_error_trace_item
(
- id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
- error_id INT NOT NULL,
+ id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ error_id INT NOT NULL,
line INT,
- file VARCHAR(255) NOT NULL,
- method VARCHAR(255) NOT NULL,
+ file VARCHAR(255) NOT NULL,
+ method VARCHAR(255) NOT NULL,
fullPath VARCHAR(1024) NOT NULL,
- created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (error_id) REFERENCES sys_error (id)
);
diff --git a/src/test/java/de/avatic/lcc/controller/calculation/PremiseControllerIntegrationTest.java b/src/test/java/de/avatic/lcc/controller/calculation/PremiseControllerIntegrationTest.java
index e992a24..a374f13 100644
--- a/src/test/java/de/avatic/lcc/controller/calculation/PremiseControllerIntegrationTest.java
+++ b/src/test/java/de/avatic/lcc/controller/calculation/PremiseControllerIntegrationTest.java
@@ -7,9 +7,9 @@ import de.avatic.lcc.dto.calculation.edit.masterData.MaterialUpdateDTO;
import de.avatic.lcc.dto.calculation.edit.masterData.PackagingUpdateDTO;
import de.avatic.lcc.dto.calculation.edit.masterData.PriceUpdateDTO;
import de.avatic.lcc.dto.generic.DimensionDTO;
-import de.avatic.lcc.model.premises.Premise;
-import de.avatic.lcc.model.utils.DimensionUnit;
-import de.avatic.lcc.model.utils.WeightUnit;
+import de.avatic.lcc.model.db.premises.Premise;
+import de.avatic.lcc.model.db.utils.DimensionUnit;
+import de.avatic.lcc.model.db.utils.WeightUnit;
import org.assertj.core.api.InstanceOfAssertFactories;
import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/src/test/java/de/avatic/lcc/controller/calculation/PremiseControllerTestData.java b/src/test/java/de/avatic/lcc/controller/calculation/PremiseControllerTestData.java
index 017408d..ff27667 100644
--- a/src/test/java/de/avatic/lcc/controller/calculation/PremiseControllerTestData.java
+++ b/src/test/java/de/avatic/lcc/controller/calculation/PremiseControllerTestData.java
@@ -2,7 +2,7 @@ package de.avatic.lcc.controller.calculation;
import de.avatic.lcc.dto.generic.RateType;
import de.avatic.lcc.dto.generic.TransportType;
-import de.avatic.lcc.model.nodes.Node;
+import de.avatic.lcc.model.db.nodes.Node;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
diff --git a/src/test/java/de/avatic/lcc/controller/calculation/PremiseTestsHelper.java b/src/test/java/de/avatic/lcc/controller/calculation/PremiseTestsHelper.java
index a0b1ddf..36fa3eb 100644
--- a/src/test/java/de/avatic/lcc/controller/calculation/PremiseTestsHelper.java
+++ b/src/test/java/de/avatic/lcc/controller/calculation/PremiseTestsHelper.java
@@ -1,12 +1,12 @@
package de.avatic.lcc.controller.calculation;
-import de.avatic.lcc.model.nodes.Location;
-import de.avatic.lcc.model.premises.Premise;
-import de.avatic.lcc.model.premises.PremiseState;
-import de.avatic.lcc.model.premises.route.Destination;
-import de.avatic.lcc.model.premises.route.Route;
-import de.avatic.lcc.model.utils.DimensionUnit;
-import de.avatic.lcc.model.utils.WeightUnit;
+import de.avatic.lcc.model.db.nodes.Location;
+import de.avatic.lcc.model.db.premises.Premise;
+import de.avatic.lcc.model.db.premises.PremiseState;
+import de.avatic.lcc.model.db.premises.route.Destination;
+import de.avatic.lcc.model.db.premises.route.Route;
+import de.avatic.lcc.model.db.utils.DimensionUnit;
+import de.avatic.lcc.model.db.utils.WeightUnit;
import org.springframework.boot.test.context.TestComponent;
import org.springframework.jdbc.core.JdbcTemplate;
diff --git a/src/test/java/de/avatic/lcc/controller/configuration/RateControllerIntegrationTest.java b/src/test/java/de/avatic/lcc/controller/configuration/RateControllerIntegrationTest.java
index 7bb1ab7..11257d5 100644
--- a/src/test/java/de/avatic/lcc/controller/configuration/RateControllerIntegrationTest.java
+++ b/src/test/java/de/avatic/lcc/controller/configuration/RateControllerIntegrationTest.java
@@ -4,7 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import de.avatic.lcc.dto.configuration.matrixrates.MatrixRateDTO;
import de.avatic.lcc.dto.configuration.rates.ContainerRateDTO;
import de.avatic.lcc.dto.generic.ValidityPeriodDTO;
-import de.avatic.lcc.model.rates.ValidityPeriodState;
+import de.avatic.lcc.model.db.rates.ValidityPeriodState;
import org.assertj.core.api.InstanceOfAssertFactories;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
diff --git a/src/test/resources/master_data/users.sql b/src/test/resources/master_data/users.sql
index 2a1b8da..824a1a6 100644
--- a/src/test/resources/master_data/users.sql
+++ b/src/test/resources/master_data/users.sql
@@ -20,6 +20,11 @@ VALUES ('packaging', 'Login, generate reports, edit packaging data');
INSERT INTO sys_group(group_name, group_description)
VALUES ('super',
'Login, generate reports, do calculations, edit freight rates, edit packaging data');
+INSERT INTO sys_group(group_name, group_description)
+VALUES ('service', 'Register API Tokens');
+INSERT INTO sys_group(group_name, group_description)
+VALUES ('right-management',
+ 'Add/Remove users, groups, etc.');
INSERT INTO sys_user_group_mapping (user_id, group_id)
VALUES ((SELECT id FROM sys_group WHERE group_name = 'super'),