Initial Project Commit

This commit is contained in:
Orlando M Guerreiro 2025-05-22 19:23:40 +01:00
commit a6dea9c888
2148 changed files with 173870 additions and 0 deletions

788
resilient-mono.jh Normal file
View file

@ -0,0 +1,788 @@
/*
* Resilient JHipster JDL file definition.
* DON'T use infinite-scroll. The infinite-scroll paginate option
* has some kind of error, and makes it IMPOSSIBLE to login into the
* APP.
*/
// POST generation metadata
// This metadata set the order of fields. And the only ones visible. All others, will be hidden
// @@ List:: < A list of properties for the list view. Ex: code;name;description >
// @@ Update:: < A list of properties for the Update/Create form. Ex: code;name;description >
// @@ View:: < A list of properties for the Detail form. Ex: code;name;description >
// The properties in this list, will be EDITABLE only when in CREATE mode. Readonly otherwise
// @@ READONLY:: < A list of properties for the Detail form. Ex: code;name;description >
// @@ IMAGE:: <Tells the post-generator to customize HTML of this type of fields>
/**
* Monolith app
*
* Resilient core functions microservice.
*/
application {
config {
baseName resilient
packageName com.oguerreiro.resilient
applicationType monolith
authenticationType session
devDatabaseType mysql
prodDatabaseType mysql
clientFramework angularX
buildTool maven
cacheProvider ehcache
enableHibernateCache true
enableTranslation true
languages [pt-pt, en]
nativeLanguage pt-pt
serverPort 8081
}
entities *
}
/**
* **************************************************
* Core - Entities & Relations
* **************************************************
*/
/**
* Organization Nature enum
* This identifies the nature of the organization entry level.
*/
enum OrganizationNature {
/**
* Represents an organizational level (company; department; university; ...)
* Rules : An Organization always starts with and entry level ORGANIZATION.
* Parent's allowed: none; ORGANIZATION; LEVEL
*/
ORGANIZATION,
/**
* Represents a human. With or without a login to the APP.
* Rules : Must have a parent Organization entry
* Parent's allowed: any
*/
PERSON,
/**
* Represents physical building.
* Rules : Must have a parent Organization entry
* Parent's allowed: ORGANIZATION; LEVEL
*/
FACILITY,
/**
* Generic. Its a organizer, creating a level without any system meaning
* Rules : Must have a parent Organization entry
* Parent's allowed: any
*/
LEVEL
}
/**
* Organization Type
* The organization type is a setup that defines the usage of the Organization level and other configurations.
*/
@dto(mapstruct)
entity OrganizationType {
// @@ List:: icon;name;description
// @@ Update:: code;name;description;nature;icon;metadataProperties
// @@ View:: code;name;description;nature;icon;metadataProperties
// @@ READONLY:: code;nature
// @@ IMAGE:: icon
/** User defined code. Must be unique in the OrganizationType */
code String required minlength(3) unique
/** The name of the type. Must be unique in the system */
name String required minlength(3) unique
/** A more complete description of the type. Whats the meaning of this type? */
description String required minlength(3)
/** The nature of the type */
nature OrganizationNature required
/** Icon image associated with this organization type. Will be used in user interface. */
icon ImageBlob
/**
* Record version for concurrency control.
*/
version Integer
}
/**
* Organization
* Hierarchical organigram of the organization.
*/
@dto(mapstruct)
entity Organization {
// @@ List:: organizationType;code;name;parent
// @@ Update:: parent;organizationType;code;name;image;inputInventory;outputInventory;user
// @@ View:: parent;organizationType;code;name;image;inputInventory;outputInventory;user
// @@ READONLY:: parent;organizationType;code
//References:
/*
* Applies only to OrganizationType.OrganizationNature.PERSON.
* Associates a PERSON with a login User. It's NOT mandatory that all PERSON have a system user
*/
//to User(user)
//to Organization(parent)
//to OrganizationType(organizationType)
/** User defined code. Must be unique in the Organization */
code String required minlength(3) unique
/** The name of the Organization entry. Allows duplicate name's, but NOT duplicate code's. */
name String required minlength(3)
/* Optional image associated with this hierarchical level. NOT the same as OrganizationType.icon.
* The Organization.imagem is not an icon and its intended to be specific of the entry it self
*/
image ImageBlob
/*
* Applies only to OrganizationType.OrganizationNature.ORGANIZATION.
* Means that this level is allowed to have inventory data input. Data can be inserted into table InputData associated to this Organization
*/
inputInventory Boolean
/*
* Applies only to OrganizationType.OrganizationNature.ORGANIZATION.
* Means that this level will be evaluated for inventory output variables.
*/
outputInventory Boolean
/**
* Record version for concurrency control.
*/
version Integer
}
// Metadata is a structure for any info associated with other entity domains.
// It's general information that can be used, for example, in formulas.
/**
* Metadata type enum
* The property type
*/
enum MetadataType {
STRING,
BOOLEAN,
INTEGER,
DECIMAL,
DATE
}
/**
* Metadata Property
* Configuration of a metadata property. Defines its type and a description of its usage.
*/
@dto(mapstruct)
entity MetadataProperty {
// @@ List:: code;name;description;mandatory
// @@ Update:: code;name;description;metadataTye;mandatory;pattern
// @@ View:: code;name;description;metadataTye;mandatory;pattern
// @@ READONLY:: code;metadataType
code String required minlength(3) unique
name String required
description String
mandatory Boolean
metadataType MetadataType required
/** Regex pattern for validation (optional). Only applies when the value is not empty. */
pattern String
/**
* Record version for concurrency control.
*/
version Integer
}
/**
* Metadata Value
* The value of a metadata property.
*/
@dto(mapstruct)
entity MetadataValue {
/** Functional relational key to MetadataProperty */
metadataPropertyCode String required
/**
* The target domain key that this MetadataValue belongs. Its a class name or a key provided by the consumer. <br>
* Used with targetDomainId to create as unique relation with the target domain
* @see targetDomainId
*/
targetDomainKey String required
/**
* The target domain Id that this MetadataValue belongs. <br>
* Used with targetDomainKey to create as unique relation with the target domain
* @see targetDomainKey
*/
targetDomainId Long required
/**
* The value of the MetadataProperty, persisted as a string. <br>
*/
value String
/**
* Record version for concurrency control.
*/
version Integer
}
relationship OneToMany {
Organization{child(name)} to Organization{parent(name)}
OrganizationType to Organization{organizationType(name)}
}
relationship OneToOne {
/* Relation to builtInEntity User, must have the name "user", any other, JHipster generates TC with error */
Organization{user(login)} to User with builtInEntity
}
relationship ManyToMany {
// NOTE: For this to work, the OrganizationTypeMapper.toDtoMetadataPropertyName(MetadataProperty metadataProperty)
// Must have an additional mapping for the version property : @Mapping(target = "version", source = "version")
OrganizationType{metadataProperties(name)} to MetadataProperty{organizationType(name)}
}
/**
* **************************************************
* Inventory - Entities & Relations
* **************************************************
*/
/**
* Variable InputMode enum
* Defines how the input values for the variable are inserted.
*/
enum InputMode {
/** Values are inserted by DataFile only. User can always change the value manually, but they can't delete it or insert it */
DATAFILE,
/** Values are inserted Manually. In this mode, only a human can insert and change the variable values. If a file or integration attempts to insert it, an error will be thrown */
MANUAL,
/** Values are inserted by Integration files. Very similar to the option DATAFILE */
INTEGRATION,
/** The variable can be inserted by any of the modes */
ANY
}
/**
* Unit Variable Type
* The type of data this unit represents
*/
enum UnitValueType {
/** Decimal value */
DECIMAL,
/** boolean value */
BOOLEAN
}
/**
* UnitType
* Type of measure unit types. Convertions can only be done within Unit's of the same UnitType
*/
@dto(mapstruct)
entity UnitType {
// @@ List:: name;description;valueType
// @@ Update:: name;description;valueType
// @@ View:: name;description;valueType
name String required unique
description String required
valueType UnitValueType required
/**
* Record version for concurrency control.
*/
version Integer
}
/**
* Unit
*/
@dto(mapstruct)
entity Unit {
// @@ List:: unitType;symbol;name;description
// @@ Update:: unitType;code;symbol;name;description;convertionRate
// @@ View:: unitType;code;symbol;name;description;convertionRate
// @@ Readonly:: unitType;code
/** Required code to use in integrations */
code String required unique
/** Math symbol that is usually used as sufix for this unit. Eg. 'm3' for square metters.*/
symbol String required
/** Math name for this unit. Eg. 'Square metters'.*/
name String required
description String
/**
* The convertion rate (CR), relative to the base unit.
* This values awnsers the question: When the base unit is 1 (one), whats the value of this unit measure ?
* Ex: How many Ml (miligrams) 1Kg has? 1000
* The formula to convert between any value unit the scale is:
* <Value>*CR(target unit)/CR(source unit)
*/
convertionRate BigDecimal required
/**
* Record version for concurrency control.
*/
version Integer
}
/**
* Unit Converter
*/
@dto(mapstruct)
entity UnitConverter {
// @@ List:: fromUnit;toUnit;name;description
// @@ Update:: fromUnit;toUnit;name;description;convertionFormula
// @@ View:: fromUnit;toUnit;name;description;convertionFormula
// @@ Readonly:: fromUnit;toUnit
//References:
//to Unit(fromUnit)
//to Unit(toUnit)
name String required
description String required
/**
* The convertion formula to convert the fromUnit into the toUnit.
*/
convertionFormula String required
/**
* Record version for concurrency control.
*/
version Integer
}
// Standard GEE Variable definition schema
// VariableScope
// (1-n) VariableCategory
// (1-n) Variable
// ---------------------------------------------------
/**
* Variable Scope
* Example: GEE Scope 1/2/3 or General Info
*/
@dto(mapstruct)
entity VariableScope {
// @@ List:: code;name;description
// @@ Update:: code;name;description
// @@ View:: code;name;description
// @@ Readonly:: code
/**
* Unique key, user defined.
* Be aware, that this will be used to create the Variable.code
* NOTE: The field type is string, but restricted to only numbers
*/
code String required pattern(/^[0-9]*$/) unique
/** The name or title for this scope */
name String required
/** A description or usage of this scope */
description String required
/** Record version for concurrency control. */
version Integer
}
/**
* Variable Category
* Sub-division of VariableScope in Categories
*/
@dto(mapstruct)
entity VariableCategory {
// @@ List:: code;name;description
// @@ Update:: variableScope;code;name;description
// @@ View:: variableScope;code;name;description
// @@ Readonly:: variableScope;code
//References:
//to VariableScope
/**
* Unique key, user defined.
* Be aware, that this will be used to create the Variable.code
* NOTE: The field type is string, but restricted to only numbers
*/
code String required pattern(/^[0-9]*$/)
/** The name or title for this category */
name String required
/** A description or usage of this category */
description String required
/** Record version for concurrency control. */
version Integer
}
/**
* Variable Definition (GEE variable classification)
*/
@dto(mapstruct)
entity Variable {
// @@ List:: name;description;input;output
// @@ Update:: variableScope;variableCategory;code;name;baseUnit;description
// @@ View:: variableScope;variableCategory;code;name;baseUnit;description
// @@ Readonly:: variableScope;variableCategory;code
//References:
//to VariableScope
//to VariableCategory
//to Unit (baseUnit) - The unit of the variable
/**
* Unique key, composed by: <br>
* VariableScope.code + VariableCategory.code + <index>
* NOTA: User will provide the index property, and the software will create the code
* index and code are NOT changeable
*/
code String required pattern(/^[0-9]*$/) unique
/** Variable index */
variableIndex Integer required
/** The name or title for the variable */
name String required
/** The descriptions of the variable. Its meaning. Its usage. */
description String required
/** Defines this variable as input. Values will be inserted for this variable */
input Boolean required
/** Defines the way of input. See the enum for instructions. */
inputMode InputMode required
/** Defines this variable as output. This variable will be evaluated for output */
output Boolean required
/** The formula to calculate the output valut of the variable. Mandatory when output==TRUE */
outputFormula String
/** Record version for concurrency control. */
version Integer
}
filter Variable
/**
* Variable allowed input units. Also defines the converters needed if the
*/
@dto(mapstruct)
entity VariableUnits {
// @@ List:: variable;unit
// @@ Update:: variable;unit
// @@ View:: variable;unit
// @@ Readonly:: variable;unit
//References:
//to Variable
//to Unit (unit) - The allowed unit for input
/** Record version for concurrency control. */
version Integer
}
/**
* Variable Class
* A sub-variable classification. Example: Variable=FUEL CONSUMPTIOM; CLASS=GASOLINE; OR ELECTRICAL; ETC...
*/
@dto(mapstruct)
entity VariableClass {
// @@ List:: variable;code;name
// @@ Update:: variable;code;name
// @@ View:: variable;code;name
// @@ Readonly:: variable;code
//References:
//to Variable
/** Code of the class. Must be unique within the Variavle */
code String required
/** Human name of the class. Must be unique within the Variable, because it will be used as key for the Excel integration data. */
name String required
/** Record version for concurrency control. */
version Integer
}
// Period schema
// Period (1-n) PeriodVersion
// ---------------------------------------------------
/**
* Period status enum
*/
enum PeriodStatus {
OPEN,
REOPEN,
CLOSED
}
/**
* Data Source enum
*/
enum DataSourceType {
MANUAL,
FILE,
AUTO,
/** Special case, where a InputData value from an Organization is distributed to other Organization's */
DISTRIB
}
/**
* Upload file type enum
*/
enum UploadType {
/** Custom Excel file template, for variable input upload */
INVENTORY,
/** Exported file from the accounting software */
ACCOUNTING
}
/**
* Upload file status enum
*/
enum UploadStatus {
UPLOADED,
PROCESSING,
PROCESSED,
ERROR
}
/**
* Period
*/
@dto(mapstruct)
entity Period (period) {
// @@ List:: name;description;beginDate;endDate;state
// @@ Update:: name;description;beginDate;endDate;state
// @@ View:: name;description;beginDate;endDate;state
//References:
//?
/** Name of the period */
name String required
/** Description for the period */
description String
/** Period start date */
beginDate LocalDate required
/** Period end date */
endDate LocalDate required
/** State of the Period */
state PeriodStatus required
/** The creation date (insert). When the data was inserted into the system. */
creationDate Instant required
/** The actual username logged into the system, that inserted the data. NOT a reference to the user, but the login username. */
creationUsername String required
/** Record version for concurrency control. */
version Integer
}
/**
* Period versions
* Always have at least one version.
*/
@dto(mapstruct)
entity PeriodVersion {
//References:
//to Period
/** Name of the version */
name String required
/** Description for the version */
description String
/** Period version (sequencial) */
periodVersion Integer required
/** State of the Period */
state PeriodStatus required
/** The creation date (insert). When the data was inserted into the system. */
creationDate Instant required
/** The actual username logged into the system, that inserted the data. NOT a reference to the user, but the login username. */
creationUsername String required
/** Record version for concurrency control. */
version Integer
}
/**
* Input data Values
* The values inserted from:
* - Each Organic Unit
* - Variable
* - PeriodVersion
*/
@dto(mapstruct)
entity InputData {
//References:
//to Variable - The Variable that this data reports
//to Period - The period that this data belongs
//to PeriodVersion - The period version active, when the data was inserted
//to Unit (sourceUnit) - The Unit that the data was inserted. Must be one of the allowed input units for the variable
//to Unit (unit) - The Unit of the variableValue. Its the unit configured in Variable.baseUnit
//to Organization (owner) - The owner of the data. The Organization responsable for generating this data (that consumed this value)
//to InputData (inputData) - In case of InputData.source==DataSourceType.DISTRIB, this points to the parent owner InputData
//to InputDataUpload - In case of InputData.source==DataSourceType.FILE, this points to the InputDataUpload file that contains this data
/** The value of the data in the source Unit. This might be different from the Variable baseUnit. @see variableValue and variableUnit */
sourceValue BigDecimal required
/** The value of the data converted to the variable baseUnit. */
variableValue BigDecimal required
/**
* The value that the InputData.owner is accounted for.
* In case a variableValue is distributed to other Organization's (InputData.source==DataSources.DISTRIB)
* , this will have the value to consider when calculating the final inventory value for the variable
*/
imputedValue BigDecimal required
/** What was the source of this data ? */
sourceType DataSourceType required
/**
* The date that this data relates to.
* Eg. energy consumptium happens every month, this should be the date of invoice
* [optional]
*/
dataDate LocalDate
/** Last change date */
changeDate Instant required
/** The actual username logged into the system, that last changed the data */
changeUsername String required
/** Where this data originates from? Where were the data collected ? */
dataSource String
/** Who collected the data ? */
dataUser String
/** Comments added by the user */
dataComments String
/** The creation date (insert). When the data was inserted into the system. */
creationDate Instant required
/** The actual username logged into the system, that inserted the data. NOT a reference to the user, but the login username. */
creationUsername String required
/** Record version for concurrency control. */
version Integer
}
/**
* Input data upload file
* Users can upload an Excel file with InputData that will automatically insert values in the table InputData
*/
@dto(mapstruct)
entity InputDataUpload {
// @@ List:: title;type;state
// @@ Update:: title;type;dataFile;comments;state
// @@ View:: title;type;dataFile;comments:state
//References:
//to Period - The period that this data belongs
//to PeriodVersion - The period version active, when the data was inserted
//to Organization (owner) - The owner of the data. The Organization responsable for generating this data (that consumed this value)
/** A simple text with a title, for human reference and better relation */
title String required
/** An Excel file, that must match a template for input */
dataFile Blob required
/** The name of the uploaded Excel file */
uploadFileName String
/** The generated name of the Excel file, used to save to disk */
diskFileName String
/** Type of the Upload */
type UploadType required
/** State of the Upload */
state UploadStatus required
/** Optional comments */
comments String
/** The creation date (insert). When the data was inserted into the system. */
creationDate Instant required
/** The actual username logged into the system, that inserted the data. NOT a reference to the user, but the login username. */
creationUsername String required
/** Record version for concurrency control. */
version Integer
}
/**
* Input data upload file
* Users can upload an Excel file with InputData that will automatically insert values in the table InputData
*/
@dto(mapstruct)
entity InputDataUploadLog {
//References:
//to InputDataUpload - The InputDataUpload that this log belongs
/** The log of the event. Eg. "InputDataUpload created"; "InputDataUpload replaced with new file"; "125 records inserted"; "User XPTO confirmed the file replacement." */
logMessage String required
/** The creation date (insert). When the data was inserted into the system. */
creationDate Instant required
/** The actual username logged into the system, that inserted the data. NOT a reference to the user, but the login username. */
creationUsername String required
/** Record version for concurrency control. */
version Integer
}
/**
* Output data Values
* The values calculated using the Variable.outputFormula, for all variables with Variable.output==TRUE.
*/
@dto(mapstruct)
entity OutputData {
//References:
//to Variable - The Variable that this data reports
//to Period - The period that this data belongs
//to PeriodVersion - The period version active, when the data was inserted
//to Unit (baseUnit) - The Unit of the variableValue. Its the unit configured in Variable.baseUnit
//to Organization (owner) - The owner of the data. The Organization responsable for generating this data (that consumed this value)
/** The evaluated value, calculated by Variable.outputFormula. This will probably represent an emission value. */
value BigDecimal required
/** Record version for concurrency control. */
version Integer
}
relationship OneToMany {
UnitType to Unit{unitType(name)}
Unit{fromUnit(name)} to UnitConverter{fromUnit(name)}
Unit{toUnit(name)} to UnitConverter{toUnit(name)}
Unit{baseUnit(name)} to Variable{baseUnit(name)}
VariableScope to VariableCategory{variableScope(name)}
VariableScope to Variable {variableScope(name)}
VariableCategory to Variable {variableCategory(name)}
Variable to VariableClass{variable(name)}
Period to PeriodVersion{period(name)}
//InputData references
Variable to InputData{variable(name)}
Period to InputData{period(name)}
PeriodVersion to InputData{periodVersion(name)}
Unit{sourceUnit} to InputData{sourceUnit(name)}
Unit to InputData{unit(name)}
Organization to InputData{owner(name)}
InputData to InputData{sourceInputData}
InputDataUpload to InputData{sourceInputDataUpload}
//InputDataUpload
Period to InputDataUpload{period(name)}
PeriodVersion to InputDataUpload{periodVersion(name)}
Organization to InputDataUpload{owner(name)}
//OutputData references
Variable to OutputData{variable(name)}
Period to OutputData{period(name)}
PeriodVersion to OutputData{periodVersion(name)}
Unit to OutputData{baseUnit(name)}
Organization to InputData{owner(name)}
//VariableUnits
Variable to VariableUnits{variable(name)}
Unit to VariableUnits{unit(name)}
//InputDataUploadLog
InputDataUpload to InputDataUploadLog{inputDataUpload(title)}
}
/** paginate Entry, Tag with infinite-scroll */
// paginate Organization, Metadata with pagination
service * with serviceClass