diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/component/dao/AuditDao.java b/backend/src/main/java/ru/micord/ervu/account_applications/component/dao/AuditDao.java new file mode 100644 index 00000000..c6baf9b9 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/account_applications/component/dao/AuditDao.java @@ -0,0 +1,42 @@ +package ru.micord.ervu.account_applications.component.dao; + +import java.sql.Timestamp; +import java.util.List; + +import org.jooq.DSLContext; +import org.springframework.stereotype.Repository; + + +import static ru.micord.ervu.account_applications.db_beans.public_.tables.UserApplicationList.USER_APPLICATION_LIST; +import static ru.micord.ervu.account_applications.db_beans.public_.tables.UserApplicationListAudit.USER_APPLICATION_LIST_AUDIT; + +/** + * @author Eduard Tihomirov + */ +@Repository +public class AuditDao { + + private final DSLContext dslContext; + + public AuditDao(DSLContext dslContext) { + this.dslContext = dslContext; + } + + public void insert(Long listId, String fio, String login, String status, Timestamp timestamp) { + dslContext.insertInto(USER_APPLICATION_LIST_AUDIT) + .set(USER_APPLICATION_LIST_AUDIT.USER_APPLICATION_LIST_ID, listId) + .set(USER_APPLICATION_LIST_AUDIT.FIO, fio) + .set(USER_APPLICATION_LIST_AUDIT.STATUS, status) + .set(USER_APPLICATION_LIST_AUDIT.DATE, timestamp) + .set(USER_APPLICATION_LIST_AUDIT.LOGIN, login) + .execute(); + } + + public List selectAppListIdsByTraceId(String traceId) { + return dslContext.select(USER_APPLICATION_LIST.USER_APPLICATION_LIST_ID) + .from(USER_APPLICATION_LIST) + .where(USER_APPLICATION_LIST.TRACE_ID.eq(traceId)) + .fetch(USER_APPLICATION_LIST.USER_APPLICATION_LIST_ID); + } + +} diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/component/service/AuditFormDaoImpl.java b/backend/src/main/java/ru/micord/ervu/account_applications/component/service/AuditFormDaoImpl.java new file mode 100644 index 00000000..648b3e9b --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/account_applications/component/service/AuditFormDaoImpl.java @@ -0,0 +1,51 @@ +package ru.micord.ervu.account_applications.component.service; + +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import dao.container.FormDaoImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ru.micord.ervu.account_applications.component.dao.AuditDao; +import ru.micord.ervu.account_applications.security.context.SecurityContext; +import ru.micord.ervu.account_applications.security.model.jwt.UserSession; + +import ru.cg.webbpm.modules.database.api.bean.TableFieldData; +import ru.cg.webbpm.modules.database.bean.entity_graph.EntityColumn; + +import static ru.micord.ervu.account_applications.enums.ApplicationStatus.SENT; + +/** + * @author Eduard Tihomirov + */ +@Service +public class AuditFormDaoImpl extends FormDaoImpl { + + @Autowired + private SecurityContext securityContext; + @Autowired + private AuditDao auditDao; + + @Override + public List save(Map map) { + List tableFieldData = super.save(map); + UserSession userSession = securityContext.getUserSession(); + Optional status = map.entrySet().stream() + .filter(entry -> entry.getKey().getName().equals("application_status")) + .map(entry -> entry.getValue().toString()) + .findAny(); + + Optional appListId = tableFieldData.stream() + .filter(data -> data.getField().getName().equals("user_application_list_id")) + .map(data -> (Long) data.getData()) + .findAny(); + if (status.isPresent() && appListId.isPresent() && !status.get().equals(SENT.name())) { + auditDao.insert(appListId.get(), userSession.name(), userSession.userId(), status.get(), Timestamp.valueOf( + LocalDateTime.now())); + } + return tableFieldData; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/db_beans/public_/Keys.java b/backend/src/main/java/ru/micord/ervu/account_applications/db_beans/public_/Keys.java index 34f19f5f..495c04c9 100644 --- a/backend/src/main/java/ru/micord/ervu/account_applications/db_beans/public_/Keys.java +++ b/backend/src/main/java/ru/micord/ervu/account_applications/db_beans/public_/Keys.java @@ -20,6 +20,7 @@ import ru.micord.ervu.account_applications.db_beans.public_.tables.Recruitment; import ru.micord.ervu.account_applications.db_beans.public_.tables.Shedlock; import ru.micord.ervu.account_applications.db_beans.public_.tables.UserApplicationDocument; import ru.micord.ervu.account_applications.db_beans.public_.tables.UserApplicationList; +import ru.micord.ervu.account_applications.db_beans.public_.tables.UserApplicationListAudit; import ru.micord.ervu.account_applications.db_beans.public_.tables.UserApplicationRole; import ru.micord.ervu.account_applications.db_beans.public_.tables.records.DatabasechangeloglockRecord; import ru.micord.ervu.account_applications.db_beans.public_.tables.records.JobPositionRecord; @@ -30,6 +31,7 @@ import ru.micord.ervu.account_applications.db_beans.public_.tables.records.LinkU import ru.micord.ervu.account_applications.db_beans.public_.tables.records.RecruitmentRecord; import ru.micord.ervu.account_applications.db_beans.public_.tables.records.ShedlockRecord; import ru.micord.ervu.account_applications.db_beans.public_.tables.records.UserApplicationDocumentRecord; +import ru.micord.ervu.account_applications.db_beans.public_.tables.records.UserApplicationListAuditRecord; import ru.micord.ervu.account_applications.db_beans.public_.tables.records.UserApplicationListRecord; import ru.micord.ervu.account_applications.db_beans.public_.tables.records.UserApplicationRoleRecord; @@ -60,6 +62,7 @@ public class Keys { public static final UniqueKey SHEDLOCK_PK = Internal.createUniqueKey(Shedlock.SHEDLOCK, DSL.name("shedlock_pk"), new TableField[] { Shedlock.SHEDLOCK.NAME }, true); public static final UniqueKey PK_USER_APPLICATION_DOCUMENT = Internal.createUniqueKey(UserApplicationDocument.USER_APPLICATION_DOCUMENT, DSL.name("pk_user_application_document"), new TableField[] { UserApplicationDocument.USER_APPLICATION_DOCUMENT.USER_APPLICATION_DOCUMENT_ID }, true); public static final UniqueKey PK_USER_APPLICATION_LIST = Internal.createUniqueKey(UserApplicationList.USER_APPLICATION_LIST, DSL.name("pk_user_application_list"), new TableField[] { UserApplicationList.USER_APPLICATION_LIST.USER_APPLICATION_LIST_ID }, true); + public static final UniqueKey USER_APPLICATION_LIST_AUDIT_PKEY = Internal.createUniqueKey(UserApplicationListAudit.USER_APPLICATION_LIST_AUDIT, DSL.name("user_application_list_audit_pkey"), new TableField[] { UserApplicationListAudit.USER_APPLICATION_LIST_AUDIT.ID }, true); public static final UniqueKey USER_APPLICATION_ROLE_PKEY = Internal.createUniqueKey(UserApplicationRole.USER_APPLICATION_ROLE, DSL.name("user_application_role_pkey"), new TableField[] { UserApplicationRole.USER_APPLICATION_ROLE.USER_ROLE_ID }, true); public static final UniqueKey USER_APPLICATION_ROLE_ROLE_NAME_KEY = Internal.createUniqueKey(UserApplicationRole.USER_APPLICATION_ROLE, DSL.name("user_application_role_role_name_key"), new TableField[] { UserApplicationRole.USER_APPLICATION_ROLE.ROLE_NAME }, true); diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/db_beans/public_/Public.java b/backend/src/main/java/ru/micord/ervu/account_applications/db_beans/public_/Public.java index b1952ad7..08f7a09d 100644 --- a/backend/src/main/java/ru/micord/ervu/account_applications/db_beans/public_/Public.java +++ b/backend/src/main/java/ru/micord/ervu/account_applications/db_beans/public_/Public.java @@ -24,6 +24,7 @@ import ru.micord.ervu.account_applications.db_beans.public_.tables.Recruitment; import ru.micord.ervu.account_applications.db_beans.public_.tables.Shedlock; import ru.micord.ervu.account_applications.db_beans.public_.tables.UserApplicationDocument; import ru.micord.ervu.account_applications.db_beans.public_.tables.UserApplicationList; +import ru.micord.ervu.account_applications.db_beans.public_.tables.UserApplicationListAudit; import ru.micord.ervu.account_applications.db_beans.public_.tables.UserApplicationRole; @@ -97,6 +98,11 @@ public class Public extends SchemaImpl { */ public final UserApplicationList USER_APPLICATION_LIST = UserApplicationList.USER_APPLICATION_LIST; + /** + * The table public.user_application_list_audit. + */ + public final UserApplicationListAudit USER_APPLICATION_LIST_AUDIT = UserApplicationListAudit.USER_APPLICATION_LIST_AUDIT; + /** * The table public.user_application_role. */ @@ -139,6 +145,7 @@ public class Public extends SchemaImpl { Shedlock.SHEDLOCK, UserApplicationDocument.USER_APPLICATION_DOCUMENT, UserApplicationList.USER_APPLICATION_LIST, + UserApplicationListAudit.USER_APPLICATION_LIST_AUDIT, UserApplicationRole.USER_APPLICATION_ROLE ); } diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/db_beans/public_/Tables.java b/backend/src/main/java/ru/micord/ervu/account_applications/db_beans/public_/Tables.java index b915f183..a2d0a292 100644 --- a/backend/src/main/java/ru/micord/ervu/account_applications/db_beans/public_/Tables.java +++ b/backend/src/main/java/ru/micord/ervu/account_applications/db_beans/public_/Tables.java @@ -15,6 +15,7 @@ import ru.micord.ervu.account_applications.db_beans.public_.tables.Recruitment; import ru.micord.ervu.account_applications.db_beans.public_.tables.Shedlock; import ru.micord.ervu.account_applications.db_beans.public_.tables.UserApplicationDocument; import ru.micord.ervu.account_applications.db_beans.public_.tables.UserApplicationList; +import ru.micord.ervu.account_applications.db_beans.public_.tables.UserApplicationListAudit; import ru.micord.ervu.account_applications.db_beans.public_.tables.UserApplicationRole; @@ -81,6 +82,11 @@ public class Tables { */ public static final UserApplicationList USER_APPLICATION_LIST = UserApplicationList.USER_APPLICATION_LIST; + /** + * The table public.user_application_list_audit. + */ + public static final UserApplicationListAudit USER_APPLICATION_LIST_AUDIT = UserApplicationListAudit.USER_APPLICATION_LIST_AUDIT; + /** * The table public.user_application_role. */ diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/db_beans/public_/tables/UserApplicationListAudit.java b/backend/src/main/java/ru/micord/ervu/account_applications/db_beans/public_/tables/UserApplicationListAudit.java new file mode 100644 index 00000000..0bbf8cf4 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/account_applications/db_beans/public_/tables/UserApplicationListAudit.java @@ -0,0 +1,254 @@ +/* + * This file is generated by jOOQ. + */ +package ru.micord.ervu.account_applications.db_beans.public_.tables; + + +import java.sql.Timestamp; +import java.util.Collection; +import java.util.UUID; + +import org.jooq.Condition; +import org.jooq.Field; +import org.jooq.Identity; +import org.jooq.Name; +import org.jooq.PlainSQL; +import org.jooq.QueryPart; +import org.jooq.SQL; +import org.jooq.Schema; +import org.jooq.Select; +import org.jooq.Stringly; +import org.jooq.Table; +import org.jooq.TableField; +import org.jooq.TableOptions; +import org.jooq.UniqueKey; +import org.jooq.impl.DSL; +import org.jooq.impl.SQLDataType; +import org.jooq.impl.TableImpl; + +import ru.micord.ervu.account_applications.db_beans.public_.Keys; +import ru.micord.ervu.account_applications.db_beans.public_.Public; +import ru.micord.ervu.account_applications.db_beans.public_.tables.records.UserApplicationListAuditRecord; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class UserApplicationListAudit extends TableImpl { + + private static final long serialVersionUID = 1L; + + /** + * The reference instance of public.user_application_list_audit + */ + public static final UserApplicationListAudit USER_APPLICATION_LIST_AUDIT = new UserApplicationListAudit(); + + /** + * The class holding records for this type + */ + @Override + public Class getRecordType() { + return UserApplicationListAuditRecord.class; + } + + /** + * The column public.user_application_list_audit.id. + */ + public final TableField ID = createField(DSL.name("id"), SQLDataType.UUID.nullable(false).defaultValue(DSL.field(DSL.raw("uuid_generate_v4()"), SQLDataType.UUID)), this, ""); + + /** + * The column + * public.user_application_list_audit.user_application_list_id. + */ + public final TableField USER_APPLICATION_LIST_ID = createField(DSL.name("user_application_list_id"), SQLDataType.BIGINT.nullable(false).identity(true), this, ""); + + /** + * The column public.user_application_list_audit.date. + */ + public final TableField DATE = createField(DSL.name("date"), SQLDataType.TIMESTAMP(0).defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.TIMESTAMP)), this, ""); + + /** + * The column public.user_application_list_audit.status. + */ + public final TableField STATUS = createField(DSL.name("status"), SQLDataType.VARCHAR(100), this, ""); + + /** + * The column public.user_application_list_audit.fio. + */ + public final TableField FIO = createField(DSL.name("fio"), SQLDataType.VARCHAR(1000), this, ""); + + /** + * The column public.user_application_list_audit.login. + */ + public final TableField LOGIN = createField(DSL.name("login"), SQLDataType.VARCHAR(1000), this, ""); + + private UserApplicationListAudit(Name alias, Table aliased) { + this(alias, aliased, (Field[]) null, null); + } + + private UserApplicationListAudit(Name alias, Table aliased, Field[] parameters, Condition where) { + super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); + } + + /** + * Create an aliased public.user_application_list_audit table + * reference + */ + public UserApplicationListAudit(String alias) { + this(DSL.name(alias), USER_APPLICATION_LIST_AUDIT); + } + + /** + * Create an aliased public.user_application_list_audit table + * reference + */ + public UserApplicationListAudit(Name alias) { + this(alias, USER_APPLICATION_LIST_AUDIT); + } + + /** + * Create a public.user_application_list_audit table reference + */ + public UserApplicationListAudit() { + this(DSL.name("user_application_list_audit"), null); + } + + @Override + public Schema getSchema() { + return aliased() ? null : Public.PUBLIC; + } + + @Override + public Identity getIdentity() { + return (Identity) super.getIdentity(); + } + + @Override + public UniqueKey getPrimaryKey() { + return Keys.USER_APPLICATION_LIST_AUDIT_PKEY; + } + + @Override + public UserApplicationListAudit as(String alias) { + return new UserApplicationListAudit(DSL.name(alias), this); + } + + @Override + public UserApplicationListAudit as(Name alias) { + return new UserApplicationListAudit(alias, this); + } + + @Override + public UserApplicationListAudit as(Table alias) { + return new UserApplicationListAudit(alias.getQualifiedName(), this); + } + + /** + * Rename this table + */ + @Override + public UserApplicationListAudit rename(String name) { + return new UserApplicationListAudit(DSL.name(name), null); + } + + /** + * Rename this table + */ + @Override + public UserApplicationListAudit rename(Name name) { + return new UserApplicationListAudit(name, null); + } + + /** + * Rename this table + */ + @Override + public UserApplicationListAudit rename(Table name) { + return new UserApplicationListAudit(name.getQualifiedName(), null); + } + + /** + * Create an inline derived table from this table + */ + @Override + public UserApplicationListAudit where(Condition condition) { + return new UserApplicationListAudit(getQualifiedName(), aliased() ? this : null, null, condition); + } + + /** + * Create an inline derived table from this table + */ + @Override + public UserApplicationListAudit where(Collection conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public UserApplicationListAudit where(Condition... conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public UserApplicationListAudit where(Field condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public UserApplicationListAudit where(SQL condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public UserApplicationListAudit where(@Stringly.SQL String condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public UserApplicationListAudit where(@Stringly.SQL String condition, Object... binds) { + return where(DSL.condition(condition, binds)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public UserApplicationListAudit where(@Stringly.SQL String condition, QueryPart... parts) { + return where(DSL.condition(condition, parts)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public UserApplicationListAudit whereExists(Select select) { + return where(DSL.exists(select)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public UserApplicationListAudit whereNotExists(Select select) { + return where(DSL.notExists(select)); + } +} diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/db_beans/public_/tables/records/UserApplicationListAuditRecord.java b/backend/src/main/java/ru/micord/ervu/account_applications/db_beans/public_/tables/records/UserApplicationListAuditRecord.java new file mode 100644 index 00000000..c2b9dd66 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/account_applications/db_beans/public_/tables/records/UserApplicationListAuditRecord.java @@ -0,0 +1,144 @@ +/* + * This file is generated by jOOQ. + */ +package ru.micord.ervu.account_applications.db_beans.public_.tables.records; + + +import java.sql.Timestamp; +import java.util.UUID; + +import org.jooq.Record1; +import org.jooq.impl.UpdatableRecordImpl; + +import ru.micord.ervu.account_applications.db_beans.public_.tables.UserApplicationListAudit; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class UserApplicationListAuditRecord extends UpdatableRecordImpl { + + private static final long serialVersionUID = 1L; + + /** + * Setter for public.user_application_list_audit.id. + */ + public void setId(UUID value) { + set(0, value); + } + + /** + * Getter for public.user_application_list_audit.id. + */ + public UUID getId() { + return (UUID) get(0); + } + + /** + * Setter for + * public.user_application_list_audit.user_application_list_id. + */ + public void setUserApplicationListId(Long value) { + set(1, value); + } + + /** + * Getter for + * public.user_application_list_audit.user_application_list_id. + */ + public Long getUserApplicationListId() { + return (Long) get(1); + } + + /** + * Setter for public.user_application_list_audit.date. + */ + public void setDate(Timestamp value) { + set(2, value); + } + + /** + * Getter for public.user_application_list_audit.date. + */ + public Timestamp getDate() { + return (Timestamp) get(2); + } + + /** + * Setter for public.user_application_list_audit.status. + */ + public void setStatus(String value) { + set(3, value); + } + + /** + * Getter for public.user_application_list_audit.status. + */ + public String getStatus() { + return (String) get(3); + } + + /** + * Setter for public.user_application_list_audit.fio. + */ + public void setFio(String value) { + set(4, value); + } + + /** + * Getter for public.user_application_list_audit.fio. + */ + public String getFio() { + return (String) get(4); + } + + /** + * Setter for public.user_application_list_audit.login. + */ + public void setLogin(String value) { + set(5, value); + } + + /** + * Getter for public.user_application_list_audit.login. + */ + public String getLogin() { + return (String) get(5); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + @Override + public Record1 key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached UserApplicationListAuditRecord + */ + public UserApplicationListAuditRecord() { + super(UserApplicationListAudit.USER_APPLICATION_LIST_AUDIT); + } + + /** + * Create a detached, initialised UserApplicationListAuditRecord + */ + public UserApplicationListAuditRecord(UUID id, Long userApplicationListId, Timestamp date, String status, String fio, String login) { + super(UserApplicationListAudit.USER_APPLICATION_LIST_AUDIT); + + setId(id); + setUserApplicationListId(userApplicationListId); + setDate(date); + setStatus(status); + setFio(fio); + setLogin(login); + resetChangedOnNotNull(); + } +} diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/kafka/ErvuDirectoriesListener.java b/backend/src/main/java/ru/micord/ervu/account_applications/kafka/ErvuDirectoriesListener.java index b29c5187..b61f7aed 100644 --- a/backend/src/main/java/ru/micord/ervu/account_applications/kafka/ErvuDirectoriesListener.java +++ b/backend/src/main/java/ru/micord/ervu/account_applications/kafka/ErvuDirectoriesListener.java @@ -23,4 +23,24 @@ public class ErvuDirectoriesListener { public void listenKafkaRole(String kafkaMessage) { ervuDirectoriesService.upsertKafkaRoleMessage(kafkaMessage); } +// Пока не заведены, обещают в будущих апдейтах создать +// @KafkaListener(id = "${kafka.role.updated.group.id}", topics = "${kafka.role.updated}") +// public void listenKafkaRoleUpdated(String kafkaMessage) { +// ervuDirectoriesService.upsertKafkaRoleMessage(kafkaMessage); +// } + + // @KafkaListener(id = "${kafka.role.created.group.id}", topics = "${kafka.role.created}") +// public void listenKafkaRoleUpdated(String kafkaMessage) { +// ervuDirectoriesService.upsertKafkaRoleMessage(kafkaMessage); +// } + + @KafkaListener(id = "${kafka.domain.updated.group.id}", topics = "${kafka.domain.updated}") + public void listenKafkaDomainUpdated(String kafkaMessage) { + ervuDirectoriesService.upsertKafkaDomainMessage(kafkaMessage); + } + + @KafkaListener(id = "${kafka.domain.created.group.id}", topics = "${kafka.domain.created}") + public void listenKafkaDomainCreated(String kafkaMessage) { + ervuDirectoriesService.upsertKafkaDomainMessage(kafkaMessage); + } } diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/kafka/KafkaConfig.java b/backend/src/main/java/ru/micord/ervu/account_applications/kafka/KafkaConfig.java index 42ca29b4..679ca63f 100644 --- a/backend/src/main/java/ru/micord/ervu/account_applications/kafka/KafkaConfig.java +++ b/backend/src/main/java/ru/micord/ervu/account_applications/kafka/KafkaConfig.java @@ -12,9 +12,9 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.kafka.annotation.EnableKafka; import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory; +import org.springframework.kafka.config.KafkaListenerEndpointRegistry; import org.springframework.kafka.core.ConsumerFactory; import org.springframework.kafka.core.DefaultKafkaConsumerFactory; -import org.springframework.kafka.support.serializer.JsonDeserializer; /** * @author Eduard Tihomirov @@ -40,6 +40,11 @@ public class KafkaConfig { return new DefaultKafkaConsumerFactory<>(consumerConfigs()); } + @Bean + public KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry() { + return new KafkaListenerEndpointRegistry(); + } + @Bean public Map consumerConfigs() { Map props = new HashMap<>(); diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/kafka/KafkaConsumerInitializer.java b/backend/src/main/java/ru/micord/ervu/account_applications/kafka/KafkaConsumerInitializer.java new file mode 100644 index 00000000..81e21891 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/account_applications/kafka/KafkaConsumerInitializer.java @@ -0,0 +1,40 @@ +package ru.micord.ervu.account_applications.kafka; +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.DependsOn; +import org.springframework.stereotype.Component; +import ru.micord.ervu.account_applications.service.ErvuDirectoriesService; + +/** + * @author Eduard Tihomirov + */ +@Component +@DependsOn("ervuDirectoriesListener") +public class KafkaConsumerInitializer { + @Value("${load.directories:true}") + private Boolean loadDirectories; + + private final ErvuDirectoriesService ervuDirectoriesService; + + public KafkaConsumerInitializer(ErvuDirectoriesService ervuDirectoriesService) { + this.ervuDirectoriesService = ervuDirectoriesService; + } + + @PostConstruct + public void init() { + if (loadDirectories) { + new Thread(this::runWithSleep).start(); + } + } + + private void runWithSleep() { + try { + Thread.sleep(10000); + } + catch (InterruptedException e) { + throw new RuntimeException(e); + } + ervuDirectoriesService.updateDirectories(); + } +} diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/service/ErvuDirectoriesService.java b/backend/src/main/java/ru/micord/ervu/account_applications/service/ErvuDirectoriesService.java index cfc674f0..dfa6a51e 100644 --- a/backend/src/main/java/ru/micord/ervu/account_applications/service/ErvuDirectoriesService.java +++ b/backend/src/main/java/ru/micord/ervu/account_applications/service/ErvuDirectoriesService.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; import com.fasterxml.jackson.core.JsonProcessingException; @@ -34,14 +35,16 @@ import ru.micord.ervu.account_applications.model.RoleResponse; * @author Eduard Tihomirov */ @Service -@DependsOn({"liquibase", "ervuDirectoriesListener"}) +@DependsOn("liquibase") public class ErvuDirectoriesService { private static final Logger LOGGER = LoggerFactory.getLogger( MethodHandles.lookup().lookupClass()); @Value("${idm.url}") private String idmUrl; - @Value("${ervu.collection:domain, role}") - private String ervuCollection; + @Value("${ervu.directories:domain, role}") + private String ervuDirectories; + @Value("${ervu.admin.role:gomu_supervisor, system_administrator, security_administrator, Responsible_for_internal_control}") + private String ervuAdminRole; @Autowired private RestTemplate restTemplate; @Autowired @@ -56,9 +59,9 @@ public class ErvuDirectoriesService { }) public void updateDirectories() { try { - String[] ervuCollectionArray = ervuCollection.split(","); - Arrays.stream(ervuCollectionArray).forEach(ervuCollection -> { - String targetUrl = idmUrl + "/reconcile/"+ ervuCollection + "/to/kafka/v1"; + String[] ervuDirectoriesArray = ervuDirectories.split(","); + Arrays.stream(ervuDirectoriesArray).forEach(ervuCollection -> { + String targetUrl = idmUrl + "/reconcile/"+ ervuCollection.trim() + "/to/kafka/v1"; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); String emptyJson = "{}"; @@ -163,6 +166,7 @@ public class ErvuDirectoriesService { } private void upsertRoleData(List dataList) { + String[] adminRoles = ervuAdminRole.split(","); List newRoleRecords = new ArrayList<>(); List roleRecords = new ArrayList<>(); List ids = ervuDirectoriesDaoService.getRoleIds(); @@ -183,6 +187,12 @@ public class ErvuDirectoriesService { roleRecord.setCreated(createdAt); roleRecord.setUpdated(updatedAt); roleRecord.setFinished(finishAt); + Optional adminRoleOptional = Arrays.stream(adminRoles) + .filter(role -> role.trim().equals(data.getName())) + .findAny(); + if (adminRoleOptional.isPresent()) { + roleRecord.setAdminRole(true); + } if (ids.contains(data.getId())) { roleRecords.add(roleRecord); } diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/service/ErvuDirectoriesUpdateShedulerService.java b/backend/src/main/java/ru/micord/ervu/account_applications/service/ErvuDirectoriesUpdateShedulerService.java deleted file mode 100644 index cba4eaf2..00000000 --- a/backend/src/main/java/ru/micord/ervu/account_applications/service/ErvuDirectoriesUpdateShedulerService.java +++ /dev/null @@ -1,47 +0,0 @@ -package ru.micord.ervu.account_applications.service; - -import javax.annotation.PostConstruct; - -import net.javacrumbs.shedlock.core.SchedulerLock; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; - -import static org.springframework.scheduling.config.ScheduledTaskRegistrar.CRON_DISABLED; - -/** - * @author Eduard Tihomirov - */ -@Service -public class ErvuDirectoriesUpdateShedulerService { - - @Autowired - private ErvuDirectoriesService ervuDirectoriesService; - - @Value("${directory.update.cron:0 0 */1 * * *}") - private String cronLoad; - - @PostConstruct - public void init() { - if (!cronLoad.equals(CRON_DISABLED)) { - new Thread(this::runWithSleep).start(); - } - } - - private void runWithSleep() { - try { - Thread.sleep(100000); - } - catch (InterruptedException e) { - throw new RuntimeException(e); - } - run(); - } - - @Scheduled(cron = "${directory.update.cron:0 0 */1 * * *}") - @SchedulerLock(name = "updateDirectories") - public void run() { - ervuDirectoriesService.updateDirectories(); - } -} diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/service/RoleServiceImpl.java b/backend/src/main/java/ru/micord/ervu/account_applications/service/RoleServiceImpl.java index 7632a2f8..749acc4e 100644 --- a/backend/src/main/java/ru/micord/ervu/account_applications/service/RoleServiceImpl.java +++ b/backend/src/main/java/ru/micord/ervu/account_applications/service/RoleServiceImpl.java @@ -38,8 +38,8 @@ public class RoleServiceImpl extends AbstractUserDataService { public List fetchRemovedRoleIds(String accountId, Set newRoleIds) { try { return fetchRolesByAccountId(accountId).stream() + .filter(role -> role.isErvuRole() && !newRoleIds.contains(role.getId())) .map(Role::getId) - .filter(id -> !newRoleIds.contains(id)) .toList(); } catch (Exception e) { diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/service/UserApplicationListService.java b/backend/src/main/java/ru/micord/ervu/account_applications/service/UserApplicationListService.java index d45c11aa..553d68dc 100644 --- a/backend/src/main/java/ru/micord/ervu/account_applications/service/UserApplicationListService.java +++ b/backend/src/main/java/ru/micord/ervu/account_applications/service/UserApplicationListService.java @@ -1,8 +1,19 @@ package ru.micord.ervu.account_applications.service; +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.util.List; + +import org.apache.kafka.common.protocol.types.Field; import org.springframework.stereotype.Service; +import ru.micord.ervu.account_applications.component.dao.AuditDao; import ru.micord.ervu.account_applications.dao.UserApplicationListDao; +import ru.micord.ervu.account_applications.security.context.SecurityContext; +import ru.micord.ervu.account_applications.security.model.jwt.UserSession; + +import static ru.micord.ervu.account_applications.enums.ApplicationStatus.ACCEPTED; +import static ru.micord.ervu.account_applications.enums.ApplicationStatus.AGREED; /** * @author gulnaz @@ -11,9 +22,13 @@ import ru.micord.ervu.account_applications.dao.UserApplicationListDao; public class UserApplicationListService { private final UserApplicationListDao dao; + private final AuditDao auditDao; + private final SecurityContext securityContext; - public UserApplicationListService(UserApplicationListDao dao) { + public UserApplicationListService(UserApplicationListDao dao, AuditDao auditDao, SecurityContext securityContext) { this.dao = dao; + this.auditDao = auditDao; + this.securityContext = securityContext; } public void saveTraceId(String traceId, long appNumber) { @@ -22,6 +37,7 @@ public class UserApplicationListService { public void savePassword(String traceId, String encodedPass) { dao.savePassword(traceId, encodedPass); + saveAuditStatusByTraceId(traceId, ACCEPTED.name()); } public boolean userExists(String login){ @@ -30,6 +46,7 @@ public class UserApplicationListService { public void saveAcceptedStatus(String traceId) { dao.saveAcceptedStatus(traceId); + saveAuditStatusByTraceId(traceId, ACCEPTED.name()); } public void saveAgreedStatus(long appNumber) { @@ -38,5 +55,16 @@ public class UserApplicationListService { public void saveError(String traceId, String errorMsg) { dao.saveError(traceId, errorMsg); + saveAuditStatusByTraceId(traceId, AGREED.name()); + } + + private void saveAuditStatusByTraceId(String traceId, String status) { + List appListIds = auditDao.selectAppListIdsByTraceId(traceId); + UserSession userSession = securityContext.getUserSession(); + String name = userSession.name(); + String userId = userSession.userId(); + appListIds.forEach(id -> { + auditDao.insert(id, name, userId, status, Timestamp.valueOf(LocalDateTime.now())); + }); } } diff --git a/backend/src/main/resources/config/v_1.0/20250411_SUPPORT-9099_add_audit.xml b/backend/src/main/resources/config/v_1.0/20250411_SUPPORT-9099_add_audit.xml new file mode 100644 index 00000000..dc338c7d --- /dev/null +++ b/backend/src/main/resources/config/v_1.0/20250411_SUPPORT-9099_add_audit.xml @@ -0,0 +1,28 @@ + + + + + add audit table + + CREATE TABLE IF NOT EXISTS public.user_application_list_audit ( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + user_application_list_id bigserial, + date TIMESTAMP WITHOUT TIME ZONE DEFAULT now(), + status character varying(100), + fio character varying(1000), + login character varying(1000) + ) + TABLESPACE pg_default; + + ALTER TABLE IF EXISTS public.user_application_list_audit + OWNER TO ervu_account_applications; + + GRANT ALL ON TABLE public.user_application_role TO ervu_account_applications; + + + + \ No newline at end of file diff --git a/backend/src/main/resources/config/v_1.0/20250415_SUPPORT-9099_add_pk.xml b/backend/src/main/resources/config/v_1.0/20250415_SUPPORT-9099_add_pk.xml new file mode 100644 index 00000000..5a8e847c --- /dev/null +++ b/backend/src/main/resources/config/v_1.0/20250415_SUPPORT-9099_add_pk.xml @@ -0,0 +1,15 @@ + + + + + add pk audit table + + ALTER TABLE public.user_application_list_audit ADD PRIMARY KEY (id) + + + + \ No newline at end of file diff --git a/backend/src/main/resources/config/v_1.0/changelog-1.0.xml b/backend/src/main/resources/config/v_1.0/changelog-1.0.xml index 12c4def9..8a1382e4 100644 --- a/backend/src/main/resources/config/v_1.0/changelog-1.0.xml +++ b/backend/src/main/resources/config/v_1.0/changelog-1.0.xml @@ -20,4 +20,6 @@ + + diff --git a/config/micord.env b/config/micord.env index ac1e50d3..c9d597b3 100644 --- a/config/micord.env +++ b/config/micord.env @@ -20,6 +20,8 @@ KAFKA_USER=user1 KAFKA_PASS=Blfi9d2OFG KAFKA_CONSUMER_GROUP_ID=1 KAFKA_DOMAIN_GROUP_ID=ervu-account-applications-backend-domain +KAFKA_DOMAIN_UPDATED_GROUP_ID=ervu-account-applications-backend-domain-updated +KAFKA_DOMAIN_CREATED_GROUP_ID=ervu-account-applications-backend-domain-updated KAFKA_ROLE_GROUP_ID=ervu-account-applications-backend-role IDM_URL=http://idm @@ -28,4 +30,6 @@ ERVU_HTTP_TIMEOUT=30 ERVU_PWD_SIGN_SECRET_KEY=xoL2Y3VRdQ4phXG85o6dRqcgqb4bk6ULdkJJdlRLhZM= KAFKA_ROLE_RECONCILIATION=idmv2.role.reconciliation KAFKA_DOMAIN_RECONCILIATION=idmv2.domain.reconciliation +KAFKA_DOMAIN_UPDATED=idmv2.domain.created +KAFKA_DOMAIN_CREATED=idmv2.domain.updated ERVU_ROLE_ADMIN=security_administrator \ No newline at end of file diff --git a/frontend/src/resources/css/components-autority.css b/frontend/src/resources/css/components-autority.css index 08c7356c..86cc4e50 100644 --- a/frontend/src/resources/css/components-autority.css +++ b/frontend/src/resources/css/components-autority.css @@ -300,6 +300,10 @@ .webbpm.account-applications dropdown-tree-view .bi-caret-right-fill::before { content: "\f4fd"; } +.webbpm.account-applications dropdown-tree-view :focus { + outline: none !important; + box-shadow: none !important; +} /* DropDownTree end */ .webbpm.account-applications .selectize-dropdown, diff --git a/frontend/src/resources/template/account_applications/component/field/DropdownTreeView.html b/frontend/src/resources/template/account_applications/component/field/DropdownTreeView.html index 5a07b640..f9060a91 100644 --- a/frontend/src/resources/template/account_applications/component/field/DropdownTreeView.html +++ b/frontend/src/resources/template/account_applications/component/field/DropdownTreeView.html @@ -4,7 +4,7 @@ [hidden]="!label" class="control-label"> {{label}} * -
+
{ - if (!authService.hasRole('security_administrator') || !this.sendToErvu) { + if (!this.authService.hasRole('security_administrator') || !this.sendToErvu) { return; } let kind = this.applicationKind.getValue(); @@ -79,6 +80,7 @@ export class UserManagementService extends Behavior { request = new CreateAccountRequest(); request.data = createData; request.processKey = ProcessKey.CREATE; + this.doRequest(request, formJson['appNumber']); break; case ApplicationKind.EDIT_USER_MAIN: let editPersonData = new EditPersonData(); @@ -87,6 +89,7 @@ export class UserManagementService extends Behavior { request = new EditPersonRequest(); request.data = editPersonData; request.processKey = ProcessKey.EDIT_PERSON; + this.doRequest(request, formJson['appNumber']); break; case ApplicationKind.EDIT_USER_ACCOUNT: let editAccountData = new EditAccountData(); @@ -96,6 +99,7 @@ export class UserManagementService extends Behavior { request = new EditAccountRequest(); request.data = editAccountData; request.processKey = ProcessKey.EDIT_ACCOUNT; + this.doRequest(request, formJson['appNumber']); break; case ApplicationKind.EDIT_USER_ROLES: let editRolesAccount = new EditRolesAccount(); @@ -108,12 +112,15 @@ export class UserManagementService extends Behavior { return role; }); this.rpc.getRemovedRoleIds(accountId, rolesList) - .then(list => editRolesAccount.removeRoles = list); - let editRolesData = new EditRolesData(); - editRolesData.account = editRolesAccount; - request = new EditRolesRequest(); - request.data = editRolesData; - request.processKey = ProcessKey.EDIT_ROLES; + .then(list => { + editRolesAccount.removeRoles = list; + let editRolesData = new EditRolesData(); + editRolesData.account = editRolesAccount; + request = new EditRolesRequest(); + request.data = editRolesData; + request.processKey = ProcessKey.EDIT_ROLES; + this.doRequest(request, formJson['appNumber']); + }); break; case ApplicationKind.BLOCK_USER: let deactivationData = new ChangeActivationData(); @@ -121,6 +128,7 @@ export class UserManagementService extends Behavior { request = new ChangeActivationRequest(); request.data = deactivationData; request.processKey = ProcessKey.DEACTIVATE; + this.doRequest(request, formJson['appNumber']); break; case ApplicationKind.UNBLOCK_USER: let activationData = new ChangeActivationData(); @@ -128,6 +136,7 @@ export class UserManagementService extends Behavior { request = new ChangeActivationRequest(); request.data = activationData; request.processKey = ProcessKey.ACTIVATE; + this.doRequest(request, formJson['appNumber']); break; case ApplicationKind.RESET_PASSWORD: let resetPasswordAccount = new ResetPasswordAccount(); @@ -137,12 +146,10 @@ export class UserManagementService extends Behavior { request = new ResetPasswordRequest(); request.data = resetPasswordData; request.processKey = ProcessKey.RESET_PASSWORD; + this.doRequest(request, formJson['appNumber']); break; } - - request.userId = authService.getUserId(); - this.doRequest(request, formJson['appNumber']); - } + }; } @Visible() @@ -171,6 +178,7 @@ export class UserManagementService extends Behavior { private doRequest(request: any, appNumber: number): void { const url = window.location.origin + UserManagementService.PROCESS_START_PATH; + request.userId = this.authService.getUserId(); this.httpClient.post(url, request).toPromise() .then((response: ProcessResponse) => { let code = response.code; diff --git a/frontend/src/ts/account_applications/component/field/DropdownTreeViewComponent.ts b/frontend/src/ts/account_applications/component/field/DropdownTreeViewComponent.ts index 3a1bd0d4..c71d31ae 100644 --- a/frontend/src/ts/account_applications/component/field/DropdownTreeViewComponent.ts +++ b/frontend/src/ts/account_applications/component/field/DropdownTreeViewComponent.ts @@ -8,6 +8,7 @@ import { import { AdvancedProperty, Event, + EventUtils, InputControl, LocalStorageService, NotNull, @@ -269,6 +270,15 @@ export class DropdownTreeViewComponent extends InputControl { return null; } + onKeyDown(event: KeyboardEvent): void { + const isInput = (event.target as HTMLElement).tagName === 'INPUT'; + if (EventUtils.isKeyBackspace(event) && !isInput && this.value) { + this.clearValue(); + event.stopPropagation(); + event.preventDefault(); + } + } + onChange() { super.onChange(); this.valueChangeEvent.trigger(this.value); diff --git a/frontend/src/ts/modules/app/app-routing.module.ts b/frontend/src/ts/modules/app/app-routing.module.ts index 1d008617..412b5f9a 100644 --- a/frontend/src/ts/modules/app/app-routing.module.ts +++ b/frontend/src/ts/modules/app/app-routing.module.ts @@ -5,11 +5,6 @@ import {RolesGuard} from "./guard/RolesGuard"; const appRoutes: Routes = [ - { - path: 'home', - loadChildren: 'generated-sources/page-home.module#PagehomeModule', - canActivate: [ConfirmExitGuard, RolesGuard] - }, { path: 'app_list', loadChildren: 'generated-sources/page-app_list.module#Pageapp_listModule', diff --git a/frontend/src/ts/modules/mfe/mfe-webbpm-routing.module.ts b/frontend/src/ts/modules/mfe/mfe-webbpm-routing.module.ts index 571901bc..5e522405 100644 --- a/frontend/src/ts/modules/mfe/mfe-webbpm-routing.module.ts +++ b/frontend/src/ts/modules/mfe/mfe-webbpm-routing.module.ts @@ -13,7 +13,7 @@ const webbpmRoutes: Routes = [ }, { path: '', - loadChildren: 'generated-sources/page-home.module#PagehomeModule', + loadChildren: 'generated-sources/page-app_list.module#Pageapp_listModule', canActivate: [ConfirmExitGuard, RolesGuard], pathMatch: 'full', }, diff --git a/frontend/src/ts/modules/webbpm/webbpm-routing.module.ts b/frontend/src/ts/modules/webbpm/webbpm-routing.module.ts index 1ef36662..44d2bdf6 100644 --- a/frontend/src/ts/modules/webbpm/webbpm-routing.module.ts +++ b/frontend/src/ts/modules/webbpm/webbpm-routing.module.ts @@ -13,7 +13,7 @@ const webbpmRoutes: Routes = [ }, { path: '', - loadChildren: 'generated-sources/page-home.module#PagehomeModule', + loadChildren: 'generated-sources/page-app_list.module#Pageapp_listModule', canActivate: [ConfirmExitGuard, RolesGuard], pathMatch: 'full', }, diff --git a/resources/src/main/resources/business-model/home.page b/resources/src/main/resources/business-model/home.page deleted file mode 100644 index 4c037f0e..00000000 --- a/resources/src/main/resources/business-model/home.page +++ /dev/null @@ -1,94 +0,0 @@ - - - home - - 3.192.3 - - - ru.cg.webbpm.packages.base.resources - 3.192.3 - - - - - d7d54cfb-26b5-4dba-b56f-b6247183c24d - b0d8793f-51d3-49c2-b2d4-a6b4b6d8f037 - Hbox - true - false - - - - cssClasses - - - -"btn-big-group" - - - - - - - - - - - - 9d1b5af1-0b8f-4b1b-b9a5-c2e6acf72d91 - 240c9b7b-b6a5-40c9-82f3-c54924205a32 - Vbox - true - false - false - - - - - - - c8dfe691-a84a-48da-b79e-6298d90db71d - 5efb3252-df02-47da-8e3d-dc4517b3fc9f - Список пользователей - false - true - - - - 9d1b5af1-0b8f-4b1b-b9a5-c2e6acf72d91 - e8dc240c-e610-49c9-8f0e-df53dde5eff2 - Vbox - true - false - - - - - - - c8dfe691-a84a-48da-b79e-6298d90db71d - 5ace6303-ecf8-40a2-ad53-3dc08b46c1e0 - Список заявок - false - false - false - - - - caption - -"Список заявок" - - - - navigateTo - -"/app_list" - - - - - - - - diff --git a/resources/src/main/resources/business-model/Список заявок на пользователя/Обработка заявки на добавление пользователя.page b/resources/src/main/resources/business-model/Список заявок на пользователя/Обработка заявки на добавление пользователя.page index 1a0146f8..2864e236 100644 --- a/resources/src/main/resources/business-model/Список заявок на пользователя/Обработка заявки на добавление пользователя.page +++ b/resources/src/main/resources/business-model/Список заявок на пользователя/Обработка заявки на добавление пользователя.page @@ -15,6 +15,7 @@ e776df9b-b752-4023-84f7-b9c47874f664 Hbox true + false false @@ -2375,6 +2376,10 @@ + + AuditFormDaoImpl + ru.micord.ervu.account_applications.component.service + @@ -2408,6 +2413,7 @@ eaaf9ba1-feca-4c41-9944-e321eee27a58 Hbox true + false false @@ -4765,6 +4771,202 @@ + + 16071adb-3bdf-4c33-b29b-886876016415 + 788f8661-b614-440c-b526-47e36d1d83e9 + Grid + true + false + false + + + + autoStretchColumns + + true + + + + parentControl + + {"objectId":"eeff6f45-ecc1-4055-b367-2d1249b65698","packageName":"component.field","className":"ComboBox","type":"TS"} + + + + + + + + gridService + + + + dependencyLink + + {"schema":"public","table":"user_application_list_audit","entity":"user_application_list_audit","name":"user_application_list_id"} + + + + loadDao + + + + graph + + {"conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"nodeByIndex":{"0":{"tableName":"user_application_list_audit","schemaName":"public","x":314.0,"y":225.0,"alias":"user_application_list_audit","conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"emptyEntityAction":"IGNORE_OR_DELETE"}},"nodes":[{"tableName":"user_application_list_audit","schemaName":"public","x":314.0,"y":225.0,"alias":"user_application_list_audit","conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"emptyEntityAction":"IGNORE_OR_DELETE"}],"nodeByEntityName":{"user_application_list_audit":{"tableName":"user_application_list_audit","schemaName":"public","x":314.0,"y":225.0,"alias":"user_application_list_audit","conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"emptyEntityAction":"IGNORE_OR_DELETE"}},"matrix":[[null]],"mainNodeIndex":0} + + + + + + + + + + + + + + columnSorts + + + + + + field + + {"schema":"public","table":"user_application_list_audit","entity":"user_application_list_audit","name":"date"} + + + + sortOrder + + "ASC" + + + + + + + + + + + 364c8faa-5e56-46cd-9203-d2ec6ef2dc74 + ebf72c64-fee0-4ece-9b62-bb402072332c + Дата и время + false + false + + + + + displayName + +"Дата и время" + + + + displayType + +"ONE_COLUMN" + + + + field + +{"schema":"public","table":"user_application_list_audit","entity":"user_application_list_audit","name":"date"} + + + + formatter + + + DateTimeFormatter + custom.grid.formatter + + + + + + + + 364c8faa-5e56-46cd-9203-d2ec6ef2dc74 + 4c258d4d-c044-432e-93d6-d3eb3ca19fd1 + Статус + false + false + + + + + displayName + +"Статус" + + + + displayType + +"ONE_COLUMN" + + + + field + +{"schema":"public","table":"user_application_list_audit","entity":"user_application_list_audit","name":"status"} + + + + formatter + + + EnumColumnFormatter + ru.micord.ervu.account_applications + + + + + + + + 364c8faa-5e56-46cd-9203-d2ec6ef2dc74 + 36c8e8cd-51a8-4efd-a4d6-272acf7684bf + ФИО + false + false + + + + + displayName + +"ФИО" + + + + displayType + +"ONE_COLUMN" + + + + field + +{"schema":"public","table":"user_application_list_audit","entity":"user_application_list_audit","name":"fio"} + + + + + + + d4ad6186-5d2a-4e96-b77a-22f00b8a9eaa + 40fa7d80-c06b-4b1e-8b8f-378a2eaea176 + check box (column) + false + true + + ba24d307-0b91-4299-ba82-9d0b52384ff2 ded6434a-e76d-436e-88d5-3eb87545cd9e @@ -4779,13 +4981,6 @@ true true - - 16071adb-3bdf-4c33-b29b-886876016415 - 6ee95a07-1f65-4848-afe7-b6788502fb6b - Grid - true - true - f9a38417-9ad0-412a-9b5f-bbeb450dddd6 27764b05-3a3e-4bed-b1dd-d032f990240d @@ -4819,6 +5014,7 @@ 2ee6f91b-c4a2-461d-8428-c3a6a13c9244 hidden true + false false @@ -5112,6 +5308,66 @@ + + b310f98a-69c6-4e7b-8cdb-f1ab9f9c0d94 + eeff6f45-ecc1-4055-b367-2d1249b65698 + user_application_list_id_combo + false + false + + + + label + +"user_application_list_id_combo" + + + + + + + + comboBoxService + + + + displayColumn + + {"schema":"public","table":"user_application_list","entity":"user_application_list","name":"user_application_list_id"} + + + + loadDao + + + + graph + + {"conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"nodeByIndex":{"0":{"tableName":"user_application_list","schemaName":"public","x":585.0,"y":339.0,"alias":"user_application_list","conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"emptyEntityAction":"IGNORE_OR_DELETE"}},"nodes":[{"tableName":"user_application_list","schemaName":"public","x":585.0,"y":339.0,"alias":"user_application_list","conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"emptyEntityAction":"IGNORE_OR_DELETE"}],"nodeByEntityName":{"user_application_list":{"tableName":"user_application_list","schemaName":"public","x":585.0,"y":339.0,"alias":"user_application_list","conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"emptyEntityAction":"IGNORE_OR_DELETE"}},"matrix":[[null]],"mainNodeIndex":0} + + + + + + + + + + + + + + + + + columnForSave + +{"schema":"public","table":"user_application_list","entity":"user_application_list","name":"user_application_list_id"} + + + + + 3057d447-6d17-48a8-b096-b14ea88d17e8 @@ -5125,6 +5381,7 @@ 17309155-1a83-4e58-b5f6-3fc377316819 Vbox_AC_role true + false false @@ -8486,6 +8743,7 @@ 902e5a0d-aee1-400a-a5ee-c5ca7db63017 Hbox true + false false diff --git a/resources/src/main/resources/business-model/Список заявок на пользователя/Обработка заявки на изменение пользователя.page b/resources/src/main/resources/business-model/Список заявок на пользователя/Обработка заявки на изменение пользователя.page index 7220128c..98b53552 100644 --- a/resources/src/main/resources/business-model/Список заявок на пользователя/Обработка заявки на изменение пользователя.page +++ b/resources/src/main/resources/business-model/Список заявок на пользователя/Обработка заявки на изменение пользователя.page @@ -859,6 +859,10 @@ + + AuditFormDaoImpl + ru.micord.ervu.account_applications.component.service + @@ -896,6 +900,7 @@ 317d3481-41e0-4516-94a5-93a49aac2622 Основные данные true + false false @@ -1736,19 +1741,6 @@ false - - style - - - - maxHeight - - "130px" - - - - - @@ -2595,6 +2587,7 @@ f3f030e1-226f-44cb-932f-c25eea54da6e Учетные записи true + false false @@ -2990,6 +2983,7 @@ 57f4208e-96f4-44dd-8b03-7ee84077b128 Роли true + false false @@ -3047,19 +3041,6 @@ rowModelType "CLIENT_SIDE" - - - -style - - - - maxHeight - - "130px" - - - @@ -3351,13 +3332,6 @@ true true - - 16071adb-3bdf-4c33-b29b-886876016415 - 6ee95a07-1f65-4848-afe7-b6788502fb6b - Grid - true - true - f9a38417-9ad0-412a-9b5f-bbeb450dddd6 27764b05-3a3e-4bed-b1dd-d032f990240d @@ -3391,6 +3365,7 @@ 2ee6f91b-c4a2-461d-8428-c3a6a13c9244 hidden true + false false @@ -4167,6 +4142,66 @@ + + b310f98a-69c6-4e7b-8cdb-f1ab9f9c0d94 + be74a7cb-5883-4d10-b789-1af3e2532e93 + user_application_list_id_combo + false + false + + + + label + +"user_application_list_id_combo" + + + + + + + + comboBoxService + + + + displayColumn + + {"schema":"public","table":"user_application_list","entity":"user_application_list","name":"user_application_list_id"} + + + + loadDao + + + + graph + + {"conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"nodeByIndex":{"0":{"tableName":"user_application_list","schemaName":"public","x":585.0,"y":339.0,"alias":"user_application_list","conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"emptyEntityAction":"IGNORE_OR_DELETE"}},"nodes":[{"tableName":"user_application_list","schemaName":"public","x":585.0,"y":339.0,"alias":"user_application_list","conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"emptyEntityAction":"IGNORE_OR_DELETE"}],"nodeByEntityName":{"user_application_list":{"tableName":"user_application_list","schemaName":"public","x":585.0,"y":339.0,"alias":"user_application_list","conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"emptyEntityAction":"IGNORE_OR_DELETE"}},"matrix":[[null]],"mainNodeIndex":0} + + + + + + + + + + + + + + + + + columnForSave + +{"schema":"public","table":"user_application_list","entity":"user_application_list","name":"user_application_list_id"} + + + + + 3057d447-6d17-48a8-b096-b14ea88d17e8 @@ -7529,6 +7564,230 @@ + + 76e91ef4-d2ef-4662-96ad-84c0dae0ecff + 0048a346-f6c1-4917-9662-f69b27b95399 + Editable grid + true + true + + + 16071adb-3bdf-4c33-b29b-886876016415 + 8485a38d-f225-4a13-b3ec-e5407aeb0886 + Grid + true + false + false + + + + autoStretchColumns + + true + + + + parentControl + + {"objectId":"be74a7cb-5883-4d10-b789-1af3e2532e93","packageName":"component.field","className":"ComboBox","type":"TS"} + + + + + + + + gridService + + + + dependencyLink + + {"schema":"public","table":"user_application_list_audit","entity":"user_application_list_audit","name":"user_application_list_id"} + + + + loadDao + + + + graph + + {"conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"nodeByIndex":{"0":{"tableName":"user_application_list_audit","schemaName":"public","x":314.0,"y":225.0,"alias":"user_application_list_audit","conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"emptyEntityAction":"IGNORE_OR_DELETE"}},"nodes":[{"tableName":"user_application_list_audit","schemaName":"public","x":314.0,"y":225.0,"alias":"user_application_list_audit","conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"emptyEntityAction":"IGNORE_OR_DELETE"}],"nodeByEntityName":{"user_application_list_audit":{"tableName":"user_application_list_audit","schemaName":"public","x":314.0,"y":225.0,"alias":"user_application_list_audit","conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"emptyEntityAction":"IGNORE_OR_DELETE"}},"matrix":[[null]],"mainNodeIndex":0} + + + + + + + + + + + + + + columnSorts + + + + + + field + + {"schema":"public","table":"user_application_list_audit","entity":"user_application_list_audit","name":"date"} + + + + sortOrder + + "ASC" + + + + + + + + + + + 364c8faa-5e56-46cd-9203-d2ec6ef2dc74 + d4579764-d600-4331-80f2-1a1bf7128564 + Дата и время + false + false + + + + + displayName + +"Дата и время" + + + + displayType + +"ONE_COLUMN" + + + + field + +{"schema":"public","table":"user_application_list_audit","entity":"user_application_list_audit","name":"date"} + + + + formatter + + + DateTimeFormatter + custom.grid.formatter + + + + + + + + 364c8faa-5e56-46cd-9203-d2ec6ef2dc74 + 54b8e2a3-17ca-465d-985c-5a481b9e5179 + Статус + false + false + + + + + displayName + +"Статус" + + + + displayType + +"ONE_COLUMN" + + + + field + +{"schema":"public","table":"user_application_list_audit","entity":"user_application_list_audit","name":"status"} + + + + formatter + + + EnumColumnFormatter + ru.micord.ervu.account_applications + + + + + + + + 364c8faa-5e56-46cd-9203-d2ec6ef2dc74 + fdd618d0-d8a7-4e2c-a880-879345f750e8 + ФИО + false + false + + + + + displayName + +"ФИО" + + + + displayType + +"ONE_COLUMN" + + + + field + +{"schema":"public","table":"user_application_list_audit","entity":"user_application_list_audit","name":"fio"} + + + + + + + d4ad6186-5d2a-4e96-b77a-22f00b8a9eaa + eb3b94ab-82dc-4742-9d54-fe37f83a5aaa + check box (column) + false + true + + + + c4b63ae3-f093-4b74-891b-d16e2a35644e + 69863dbf-ee75-4dcd-8878-7f8b5f299995 + Numberfield (filter) + false + true + + + 312c9663-86b4-4672-97bd-67d313585c00 + c5665a13-d2d1-4dff-8d2d-16eebeffc9a4 + Number field + false + true + + + b310f98a-69c6-4e7b-8cdb-f1ab9f9c0d94 + be74a7cb-5883-4d10-b789-1af3e2532e93 + user_application_list_id_combo + false + true + 312c9663-86b4-4672-97bd-67d313585c00 b838c4d9-b8f2-4142-96fe-240540a4802e @@ -7823,6 +8082,19 @@ true + + style + + + + margin + + "0px 0px 10px 0px" + + + + + @@ -8875,12 +9147,5 @@ - - d7d54cfb-26b5-4dba-b56f-b6247183c24d - 85ec8ffc-5684-43a5-8274-0dc08109c3e0 - Hbox_process_application - true - true - diff --git a/resources/src/main/resources/business-model/Список заявок на пользователя/Создание заявки на добавление пользователя.page b/resources/src/main/resources/business-model/Список заявок на пользователя/Создание заявки на добавление пользователя.page index 47231b1e..41db4061 100644 --- a/resources/src/main/resources/business-model/Список заявок на пользователя/Создание заявки на добавление пользователя.page +++ b/resources/src/main/resources/business-model/Список заявок на пользователя/Создание заявки на добавление пользователя.page @@ -799,6 +799,10 @@ formDao + + AuditFormDaoImpl + ru.micord.ervu.account_applications.component.service + graph diff --git a/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на активацию.page b/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на активацию.page index 379b399a..575659ef 100644 --- a/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на активацию.page +++ b/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на активацию.page @@ -4914,6 +4914,10 @@ + + AuditFormDaoImpl + ru.micord.ervu.account_applications.component.service + @@ -8866,13 +8870,6 @@ false true - - 887d2044-9e34-46a5-852c-e9ce07b42f30 - 5b8c5ac4-549d-411f-80ff-d29293638e5f - Пол - false - true - 4d981f15-5535-45f7-882b-3647b251ad05 39040b94-4780-4067-864e-64ad3d22a2a3 diff --git a/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на деактивацию.page b/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на деактивацию.page index fecfd4f9..bc307890 100644 --- a/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на деактивацию.page +++ b/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на деактивацию.page @@ -4915,6 +4915,10 @@ + + AuditFormDaoImpl + ru.micord.ervu.account_applications.component.service + @@ -8867,13 +8871,6 @@ false true - - 887d2044-9e34-46a5-852c-e9ce07b42f30 - 5b8c5ac4-549d-411f-80ff-d29293638e5f - Пол - false - true - 4d981f15-5535-45f7-882b-3647b251ad05 39040b94-4780-4067-864e-64ad3d22a2a3 diff --git a/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на изменение.page b/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на изменение.page index e36d8a25..7e37ee07 100644 --- a/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на изменение.page +++ b/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на изменение.page @@ -4866,6 +4866,10 @@ + + AuditFormDaoImpl + ru.micord.ervu.account_applications.component.service + @@ -9127,6 +9131,10 @@ + + AuditFormDaoImpl + ru.micord.ervu.account_applications.component.service + @@ -13439,6 +13447,10 @@ + + AuditFormDaoImpl + ru.micord.ervu.account_applications.component.service + diff --git a/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на сброс пароля.page b/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на сброс пароля.page index f230104b..35c2d469 100644 --- a/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на сброс пароля.page +++ b/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на сброс пароля.page @@ -4924,6 +4924,10 @@ + + AuditFormDaoImpl + ru.micord.ervu.account_applications.component.service + diff --git a/resources/src/main/resources/business-model/Список заявок на пользователя/Список заявок.page b/resources/src/main/resources/business-model/Список заявок на пользователя/Список заявок.page index e7fe8de1..979bc307 100644 --- a/resources/src/main/resources/business-model/Список заявок на пользователя/Список заявок.page +++ b/resources/src/main/resources/business-model/Список заявок на пользователя/Список заявок.page @@ -6002,44 +6002,6 @@ - - c8dfe691-a84a-48da-b79e-6298d90db71d - ed485923-da58-4370-8522-9b34be995953 - Выход - false - false - - true - - - - StaticRouteNavigationButton - modules.user-management.component - - true - true - - - caption - - "Выход" - - - - route - - "/home" - - - - visible - - true - - - - - 86f297f1-ab3d-40e0-ac2f-89cc944b7f0a