diff --git a/backend/pom.xml b/backend/pom.xml index 9c56c24b..8cc72f68 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -19,6 +19,10 @@ io.jsonwebtoken jjwt-api + + io.jsonwebtoken + jjwt-jackson + io.jsonwebtoken jjwt-impl diff --git a/backend/src/main/java/AppConfig.java b/backend/src/main/java/AppConfig.java index 5ef2e5a6..6295aaad 100644 --- a/backend/src/main/java/AppConfig.java +++ b/backend/src/main/java/AppConfig.java @@ -36,6 +36,7 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc; "gen", "ru.cg", "ru.micord", + "ervu" }, excludeFilters = { @ComponentScan.Filter(type = FilterType.REGEX, pattern = "security.WebSecurityConfig"), @ComponentScan.Filter(type = FilterType.REGEX, pattern = "ru.cg.webbpm.modules.database.impl.DatabaseConfiguration"), diff --git a/backend/src/main/java/dto/jivoprofile/JivoProfileDto.java b/backend/src/main/java/dto/jivoprofile/JivoProfileDto.java deleted file mode 100644 index c53717e8..00000000 --- a/backend/src/main/java/dto/jivoprofile/JivoProfileDto.java +++ /dev/null @@ -1,35 +0,0 @@ -package dto.jivoprofile; - -import ru.cg.webbpm.modules.webkit.annotations.Model; - -@Model -public class JivoProfileDto { - - public String username; - public String email; - public String phone; - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } -} \ No newline at end of file diff --git a/backend/src/main/java/ervu/KafkaProducerConfig.java b/backend/src/main/java/ervu/KafkaProducerConfig.java index 6b2d98c9..5daada76 100644 --- a/backend/src/main/java/ervu/KafkaProducerConfig.java +++ b/backend/src/main/java/ervu/KafkaProducerConfig.java @@ -19,25 +19,25 @@ import org.springframework.kafka.core.ProducerFactory; */ @Configuration public class KafkaProducerConfig { - @Value("${kafka.send.url}") + @Value("${av-kafka.send.url}") private String kafkaUrl; - @Value("${kafka.send.security.protocol}") + @Value("${av-kafka.send.security.protocol}") private String securityProtocol; - @Value("${kafka.send.login.module:org.apache.kafka.common.security.scram.ScramLoginModule}") + @Value("${av-kafka.send.login.module:org.apache.kafka.common.security.scram.ScramLoginModule}") private String loginModule; - @Value("${kafka.send.username}") + @Value("${av-kafka.send.username}") private String username; - @Value("${kafka.send.password}") + @Value("${av-kafka.send.password}") private String password; - @Value("${kafka.sasl.mechanism}") + @Value("${av-kafka.sasl.mechanism}") private String saslMechanism; - @Bean + @Bean("av-factory") public ProducerFactory producerFactory() { return new DefaultKafkaProducerFactory<>(producerConfigs()); } - @Bean + @Bean("av-configs") public Map producerConfigs() { Map props = new HashMap<>(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, this.kafkaUrl); @@ -52,7 +52,7 @@ public class KafkaProducerConfig { return props; } - @Bean + @Bean("av-template") public KafkaTemplate kafkaTemplate() { return new KafkaTemplate<>(producerFactory()); } diff --git a/backend/src/main/java/ervu/client/classified/EsnsiOkopfClient.java b/backend/src/main/java/ervu/client/classified/EsnsiOkopfClient.java new file mode 100644 index 00000000..7a22b36d --- /dev/null +++ b/backend/src/main/java/ervu/client/classified/EsnsiOkopfClient.java @@ -0,0 +1,63 @@ +package ervu.client.classified; + +import java.io.*; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; +import java.util.zip.ZipInputStream; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Retryable; +import org.springframework.stereotype.Component; + +/** + * @author Artyom Hackimullin + */ +@Component +public class EsnsiOkopfClient { + + private static final Logger logger = LoggerFactory.getLogger(EsnsiOkopfClient.class); + + @Value("${esnsi.okopf.url:#{null}}") + private String uri; + + @Retryable(value = {TimeoutException.class}, backoff = + @Backoff(delay = 2000)) + public String getJsonOkopFormData() { + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(uri)) + .GET() + .build(); + try { + HttpResponse response = client.send(request, + HttpResponse.BodyHandlers.ofInputStream() + ); + if (response.statusCode() >= 200 && response.statusCode() <= 202) { + return unzipFile(new ZipInputStream(response.body())); + } + logger.debug("Response unsuccessful. Json file has not be unzip."); + } + catch (IOException | InterruptedException e) { + logger.error(e.getMessage(), e); + } + return null; + } + + private String unzipFile(ZipInputStream zis) throws IOException { + if (zis.getNextEntry() != null) { + ByteArrayInputStream isr = new ByteArrayInputStream(zis.readAllBytes()); + try (BufferedReader br = new BufferedReader(new InputStreamReader(isr))) { + return br.lines().collect(Collectors.joining(System.lineSeparator())); + } + } + logger.error("Zip archive is null"); + return null; + } +} diff --git a/backend/src/main/java/ervu/client/fileupload/FileUploadWebDavClient.java b/backend/src/main/java/ervu/client/fileupload/FileUploadWebDavClient.java index 5fee8854..a296ee50 100644 --- a/backend/src/main/java/ervu/client/fileupload/FileUploadWebDavClient.java +++ b/backend/src/main/java/ervu/client/fileupload/FileUploadWebDavClient.java @@ -38,7 +38,7 @@ public class FileUploadWebDavClient { .PUT(HttpRequest.BodyPublishers.ofByteArray(multipartFile.getBytes())).build(); HttpResponse response = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString()); - logger.debug("Response starus code: {}", response.statusCode()); + logger.debug("Response status code: {}", response.statusCode()); return (response.statusCode() >= 200) && (response.statusCode() <= 202); } catch (IOException | InterruptedException e) { diff --git a/backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java b/backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java index 5ef978e2..d9e8b0c4 100644 --- a/backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java +++ b/backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java @@ -1,5 +1,8 @@ package ervu.controller; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; + import ervu.service.fileupload.EmployeeInfoFileUploadService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -18,8 +21,21 @@ public class EmployeeInfoFileUploadController { @RequestMapping(value = "/employee/document", method = RequestMethod.POST) public ResponseEntity saveEmployeeInformationFile(@RequestParam("file") MultipartFile multipartFile, - @RequestHeader("X-Employee-Info-File-Form-Type") String formType) { - if (this.fileUploadService.saveEmployeeInformationFile(multipartFile, formType)) { + @RequestHeader("X-Employee-Info-File-Form-Type") String formType, HttpServletRequest request) { + String accessToken = null; + String authToken = null; + Cookie[] cookies = request.getCookies(); + if (cookies != null) { + for (Cookie cookie : cookies) { + if (cookie.getName().equals("access_token")) { + accessToken = cookie.getValue(); + } + else if (cookie.getName().equals("auth_token")) { + authToken = cookie.getValue(); + } + } + } + if (accessToken != null && this.fileUploadService.saveEmployeeInformationFile(multipartFile, formType, accessToken, authToken)) { return ResponseEntity.ok("File successfully uploaded."); } else { diff --git a/backend/src/main/java/ervu/dao/classifier/OkopfDao.java b/backend/src/main/java/ervu/dao/classifier/OkopfDao.java new file mode 100644 index 00000000..10dc680e --- /dev/null +++ b/backend/src/main/java/ervu/dao/classifier/OkopfDao.java @@ -0,0 +1,16 @@ +package ervu.dao.classifier; + + +import java.util.List; + +import ervu.service.classifier.model.OkopfModel; + + +/** + * @author Artyom Hackimullin + */ +public interface OkopfDao { + void save(List recordModels, int version); + + String fetchTitleByLeg(String leg); +} diff --git a/backend/src/main/java/ervu/dao/classifier/OkopfDaoImpl.java b/backend/src/main/java/ervu/dao/classifier/OkopfDaoImpl.java new file mode 100644 index 00000000..2afeb795 --- /dev/null +++ b/backend/src/main/java/ervu/dao/classifier/OkopfDaoImpl.java @@ -0,0 +1,44 @@ +package ervu.dao.classifier; + +import java.util.List; + +import ervu.service.classifier.model.OkopfModel; +import org.jooq.DSLContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import static ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.Tables.OKOPF_RECORDS; + + +/** + * @author Artyom Hackimullin + */ +@Repository +public class OkopfDaoImpl implements OkopfDao { + + @Autowired + private DSLContext dsl; + + @Override + public void save(List recordModels, int version) { + var queries = recordModels.stream().map(record -> + dsl.insertInto(OKOPF_RECORDS, OKOPF_RECORDS.OKOPF_RECORDS_ID, OKOPF_RECORDS.NAME, OKOPF_RECORDS.VERSION) + .values(record.getCode(), record.getName(), version) + .onConflict(OKOPF_RECORDS.OKOPF_RECORDS_ID) + .doUpdate() + .set(OKOPF_RECORDS.NAME, record.getName()) + .set(OKOPF_RECORDS.VERSION, version) + .where(OKOPF_RECORDS.OKOPF_RECORDS_ID.eq(record.getCode())) + ).toList(); + + dsl.batch(queries).execute(); + } + + @Override + public String fetchTitleByLeg(String leg) { + return dsl.select(OKOPF_RECORDS.NAME) + .from(OKOPF_RECORDS) + .where(OKOPF_RECORDS.OKOPF_RECORDS_ID.eq(leg)) + .fetchOne(OKOPF_RECORDS.NAME); + } +} diff --git a/backend/src/main/java/ervu/service/classifier/OkopfService.java b/backend/src/main/java/ervu/service/classifier/OkopfService.java new file mode 100644 index 00000000..bc068d89 --- /dev/null +++ b/backend/src/main/java/ervu/service/classifier/OkopfService.java @@ -0,0 +1,10 @@ +package ervu.service.classifier; + +/** + * @author Artyom Hackimullin + */ +public interface OkopfService { + + String findTitleByLeg(String leg); + +} diff --git a/backend/src/main/java/ervu/service/classifier/OkopfServiceImpl.java b/backend/src/main/java/ervu/service/classifier/OkopfServiceImpl.java new file mode 100644 index 00000000..4f1308f1 --- /dev/null +++ b/backend/src/main/java/ervu/service/classifier/OkopfServiceImpl.java @@ -0,0 +1,26 @@ +package ervu.service.classifier; + +import ervu.dao.classifier.OkopfDao; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * @author Artyom Hackimullin + */ +@Service +public class OkopfServiceImpl implements OkopfService { + private final static Logger logger = LoggerFactory.getLogger(OkopfServiceImpl.class); + + @Autowired + private OkopfDao okopfDao; + + @Override + @Transactional(readOnly = true) + public String findTitleByLeg(String leg) { + logger.info("Find title by leg: " + leg); + return okopfDao.fetchTitleByLeg(leg); + } +} diff --git a/backend/src/main/java/ervu/service/classifier/model/OkopfAttributeValueModel.java b/backend/src/main/java/ervu/service/classifier/model/OkopfAttributeValueModel.java new file mode 100644 index 00000000..2d6415d4 --- /dev/null +++ b/backend/src/main/java/ervu/service/classifier/model/OkopfAttributeValueModel.java @@ -0,0 +1,27 @@ +package ervu.service.classifier.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * @author xakim + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class OkopfAttributeValueModel { + + private String value; + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "OkopfAttributeValueModel{" + + "value='" + value + '\'' + + '}'; + } +} diff --git a/backend/src/main/java/ervu/service/classifier/model/OkopfDataModel.java b/backend/src/main/java/ervu/service/classifier/model/OkopfDataModel.java new file mode 100644 index 00000000..f9cd4e6e --- /dev/null +++ b/backend/src/main/java/ervu/service/classifier/model/OkopfDataModel.java @@ -0,0 +1,33 @@ +package ervu.service.classifier.model; + +import java.io.Serializable; +import java.util.Arrays; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author xakim + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class OkopfDataModel implements Serializable { + private static final long serialVersionUID = 1L; + + @JsonProperty("records") + private OkopfDetailsModel[] details; + + public OkopfDetailsModel[] getDetails() { + return details; + } + + public void setDetails(OkopfDetailsModel[] details) { + this.details = details; + } + + @Override + public String toString() { + return "OkopfDataModel{" + + "details=" + Arrays.toString(details) + + '}'; + } +} diff --git a/backend/src/main/java/ervu/service/classifier/model/OkopfDetailsModel.java b/backend/src/main/java/ervu/service/classifier/model/OkopfDetailsModel.java new file mode 100644 index 00000000..c21ee6ad --- /dev/null +++ b/backend/src/main/java/ervu/service/classifier/model/OkopfDetailsModel.java @@ -0,0 +1,37 @@ +package ervu.service.classifier.model; + +import java.util.Arrays; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * @author xakim + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class OkopfDetailsModel { + + private OkopfAttributeValueModel[] attributeValues; + + public OkopfDetailsModel() { + } + + public OkopfDetailsModel(OkopfAttributeValueModel[] attributeValues) { + this.attributeValues = attributeValues; + } + + public OkopfAttributeValueModel[] getAttributeValues() { + return attributeValues; + } + + public void setAttributeValues( + OkopfAttributeValueModel[] attributeValues) { + this.attributeValues = attributeValues; + } + + @Override + public String toString() { + return "OkopfDataRecordsModel{" + + "attributeValues=" + Arrays.toString(attributeValues) + + '}'; + } +} diff --git a/backend/src/main/java/ervu/service/classifier/model/OkopfModel.java b/backend/src/main/java/ervu/service/classifier/model/OkopfModel.java new file mode 100644 index 00000000..fc4a849d --- /dev/null +++ b/backend/src/main/java/ervu/service/classifier/model/OkopfModel.java @@ -0,0 +1,43 @@ +package ervu.service.classifier.model; + +import java.io.Serializable; + +/** + * @author Artyom Hackimullin + */ +public class OkopfModel implements Serializable { + private static final long serialVersionUID = 1L; + + private String code; + + private String name; + + public OkopfModel(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "OkopfRecordModel{" + + "code='" + code + '\'' + + ", name='" + name + '\'' + + '}'; + } +} diff --git a/backend/src/main/java/ervu/service/classifier/model/OkopfOrgModel.java b/backend/src/main/java/ervu/service/classifier/model/OkopfOrgModel.java new file mode 100644 index 00000000..63354e96 --- /dev/null +++ b/backend/src/main/java/ervu/service/classifier/model/OkopfOrgModel.java @@ -0,0 +1,19 @@ +package ervu.service.classifier.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author xakim + */ +public class OkopfOrgModel { + @JsonProperty("data") + private OkopfDataModel data; + + public OkopfDataModel getData() { + return data; + } + + public void setData(OkopfDataModel data) { + this.data = data; + } +} diff --git a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java index 825cfcbd..4011ee3a 100644 --- a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java @@ -1,6 +1,8 @@ package ervu.service.fileupload; +import java.sql.Timestamp; import java.time.LocalDateTime; +import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.UUID; @@ -8,13 +10,21 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import ervu.client.fileupload.FileUploadWebDavClient; import ervu.service.fileupload.model.EmployeeInfoKafkaMessage; +import ervu.service.fileupload.model.FileStatus; import org.apache.kafka.clients.producer.ProducerRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import ru.micord.ervu.security.esia.model.EmployeeModel; +import ru.micord.ervu.security.esia.model.PersonModel; +import ru.micord.ervu.security.esia.service.UlDataService; +import ru.micord.ervu.security.webbpm.jwt.model.Token; +import ru.micord.ervu.security.webbpm.jwt.service.JwtTokenService; +import ru.micord.ervu.service.InteractionService; /** * @author Alexandr Shalaginov @@ -22,12 +32,16 @@ import org.springframework.web.multipart.MultipartFile; @Service public class EmployeeInfoFileUploadService { private static final Logger logger = LoggerFactory.getLogger(EmployeeInfoFileUploadService.class); + private static final String FORMAT = "dd.MM.yyyy HH:mm"; private final FileUploadWebDavClient fileWebDavUploadClient; private final EmployeeInfoKafkaMessageService employeeInfoKafkaMessageService; private final KafkaTemplate kafkaTemplate; + private final InteractionService interactionService; + private final UlDataService ulDataService; + private final JwtTokenService jwtTokenService; - @Value("${kafka.send.message.topic.name:employee-files}") + @Value("${av-kafka.send.message.topic.name:employee-files}") private String kafkaTopicName; @Value("${file.webdav.upload.url:http://localhost:5757}") private String url; @@ -38,25 +52,49 @@ public class EmployeeInfoFileUploadService { public EmployeeInfoFileUploadService( FileUploadWebDavClient fileWebDavUploadClient, - EmployeeInfoKafkaMessageService employeeInfoKafkaMessageService, KafkaTemplate kafkaTemplate) { + EmployeeInfoKafkaMessageService employeeInfoKafkaMessageService, + @Qualifier("av-template") KafkaTemplate kafkaTemplate, InteractionService interactionService, + UlDataService ulDataService, JwtTokenService jwtTokenService) { this.fileWebDavUploadClient = fileWebDavUploadClient; this.employeeInfoKafkaMessageService = employeeInfoKafkaMessageService; this.kafkaTemplate = kafkaTemplate; + this.interactionService = interactionService; + this.ulDataService = ulDataService; + this.jwtTokenService = jwtTokenService; } - public boolean saveEmployeeInformationFile(MultipartFile multipartFile, String formType) { + public boolean saveEmployeeInformationFile(MultipartFile multipartFile, String formType, + String accessToken, String authToken) { String fileUploadUrl = this.url + "/" + getNewFilename(multipartFile.getOriginalFilename()); - String departureDateTime = getDepartureDateTime(); + LocalDateTime now = LocalDateTime.now(); + String departureDateTime = now.format(DateTimeFormatter.ofPattern(FORMAT));; + String timeZone = getTimeZone(); if (this.fileWebDavUploadClient.webDavUploadFile(fileUploadUrl, username, password, multipartFile)) { + FileStatus fileStatus = new FileStatus(); + fileStatus.setStatus("Загрузка."); + fileStatus.setCode("01"); + fileStatus.setDescription("Файл принят до проверки на вирусы."); + String fileId = UUID.randomUUID().toString(); + String fileName = multipartFile.getOriginalFilename(); + EmployeeInfoFileFormType employeeInfoFileFormType = EmployeeInfoFileFormType.valueOf(formType); String jsonMessage = getJsonKafkaMessage( employeeInfoKafkaMessageService.getKafkaMessage( + fileId, fileUploadUrl, - multipartFile.getOriginalFilename(), - EmployeeInfoFileFormType.valueOf(formType), - departureDateTime + fileName, + employeeInfoFileFormType, + departureDateTime, + accessToken, authToken, timeZone, fileStatus ) ); + EmployeeModel employeeModel = ulDataService.getEmployeeModel(accessToken); + PersonModel personModel = employeeModel.getPerson(); + Token token = jwtTokenService.getToken(authToken); + String[] ids = token.getUserAccountId().split(":"); + interactionService.setStatus(fileId, fileStatus.getStatus(), fileName, employeeInfoFileFormType.getFilePatternName(), Timestamp.valueOf(now), + personModel.getLastName() + " " + personModel.getFirstName().charAt(0) + ". " + personModel.getMiddleName().charAt(0) + ".", (int) multipartFile.getSize(), + ids[1]); return sendMessage(jsonMessage); } else { @@ -100,7 +138,7 @@ public class EmployeeInfoFileUploadService { } } - private String getDepartureDateTime() { - return LocalDateTime.now().format(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm")); + private String getTimeZone() { + return ZonedDateTime.now().getOffset().toString(); } -} \ No newline at end of file +} diff --git a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoKafkaMessageService.java b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoKafkaMessageService.java index c6349421..79821779 100644 --- a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoKafkaMessageService.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoKafkaMessageService.java @@ -1,10 +1,14 @@ package ervu.service.fileupload; -import ervu.service.fileupload.model.*; -import esia.model.MillitaryRegistrationPersonModel; -import esia.model.OrganizationModel; -import esia.service.UlDataService; +import ervu.service.fileupload.model.EmployeeInfoKafkaMessage; +import ervu.service.fileupload.model.FileInfo; +import ervu.service.fileupload.model.FileStatus; +import ervu.service.fileupload.model.OrgInfo; import org.springframework.stereotype.Service; +import ru.micord.ervu.security.esia.model.OrganizationModel; +import ru.micord.ervu.security.esia.service.UlDataService; +import ru.micord.ervu.security.webbpm.jwt.model.Token; +import ru.micord.ervu.security.webbpm.jwt.service.JwtTokenService; /** * @author Alexandr Shalaginov @@ -12,64 +16,50 @@ import org.springframework.stereotype.Service; @Service public class EmployeeInfoKafkaMessageService { private final UlDataService ulDataService; + private final JwtTokenService jwtTokenService; - public EmployeeInfoKafkaMessageService(UlDataService ulDataService) { + + public EmployeeInfoKafkaMessageService(UlDataService ulDataService, JwtTokenService jwtTokenService) { this.ulDataService = ulDataService; + this.jwtTokenService = jwtTokenService; } - public EmployeeInfoKafkaMessage getKafkaMessage(String fileNameBase, String fileName, - EmployeeInfoFileFormType formType, String departureDateTime) { + public EmployeeInfoKafkaMessage getKafkaMessage(String fileId, String fileUrl, String fileName, + EmployeeInfoFileFormType formType, String departureDateTime, String accessToken, + String authToken, String timeZone, FileStatus fileStatus) { return new EmployeeInfoKafkaMessage( - getOrgInfo(), - getSenderInfo(), + getOrgInfo(accessToken, authToken), getFileInfo( - fileNameBase, + fileId, + fileUrl, fileName, formType, - departureDateTime + departureDateTime, + timeZone, + fileStatus ) ); } - private OrgInfo getOrgInfo() { - OrganizationModel organizationModel = ulDataService.getOrganizationModel(); - return new OrgInfo( - organizationModel.getShortName(), - organizationModel.getLeg(), - organizationModel.getLegName(), - organizationModel.getOgrn(), - organizationModel.getInn(), - organizationModel.getKpp() - ); - } - - private SenderInfo getSenderInfo() { - MillitaryRegistrationPersonModel personModel = ulDataService.getPersonModel(); - return new SenderInfo( - personModel.getLastName(), - personModel.getFirstName(), - personModel.getMiddleName(), - personModel.getBirthday(), - personModel.getRoleCode(), - personModel.getRoleName(), - personModel.getSnils(), - personModel.getIdERN(), - new PassportInfo( - personModel.getPassportSeries(), - personModel.getPassportNumber(), - personModel.getPassportIssueDate() - ) - ); - } - - private FileInfo getFileInfo(String fileNameBase, String fileName, - EmployeeInfoFileFormType formType, String departureDateTime) { + private FileInfo getFileInfo(String fileId, String fileUrl, String fileName, + EmployeeInfoFileFormType formType, String departureDateTime, String timeZone, + FileStatus fileStatus) { return new FileInfo( - fileNameBase, + fileId, + fileUrl, fileName, formType.getFilePatternCode(), formType.getFilePatternName(), - departureDateTime + departureDateTime, + timeZone, + fileStatus ); } + + private OrgInfo getOrgInfo(String accessToken, String authToken) { + OrganizationModel organizationModel = ulDataService.getOrganizationModel(accessToken); + Token token = jwtTokenService.getToken(authToken); + String[] ids = token.getUserAccountId().split(":"); + return new OrgInfo(organizationModel.getFullName(), ids[1], ids[0]); + } } diff --git a/backend/src/main/java/ervu/service/fileupload/model/EmployeeInfoKafkaMessage.java b/backend/src/main/java/ervu/service/fileupload/model/EmployeeInfoKafkaMessage.java index 0441a856..49d33a51 100644 --- a/backend/src/main/java/ervu/service/fileupload/model/EmployeeInfoKafkaMessage.java +++ b/backend/src/main/java/ervu/service/fileupload/model/EmployeeInfoKafkaMessage.java @@ -7,12 +7,10 @@ import java.util.Objects; */ public class EmployeeInfoKafkaMessage { private final OrgInfo orgInfo; - private final SenderInfo senderInfo; private final FileInfo fileInfo; - public EmployeeInfoKafkaMessage(OrgInfo orgInfo, SenderInfo senderInfo, FileInfo fileInfo) { + public EmployeeInfoKafkaMessage(OrgInfo orgInfo, FileInfo fileInfo) { this.orgInfo = orgInfo; - this.senderInfo = senderInfo; this.fileInfo = fileInfo; } @@ -20,10 +18,6 @@ public class EmployeeInfoKafkaMessage { return orgInfo; } - public SenderInfo getSenderInfo() { - return senderInfo; - } - public FileInfo getFileInfo() { return fileInfo; } @@ -33,21 +27,18 @@ public class EmployeeInfoKafkaMessage { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; EmployeeInfoKafkaMessage that = (EmployeeInfoKafkaMessage) o; - return Objects.equals(orgInfo, that.orgInfo) && Objects.equals(senderInfo, - that.senderInfo - ) && Objects.equals(fileInfo, that.fileInfo); + return Objects.equals(orgInfo, that.orgInfo) && Objects.equals(fileInfo, that.fileInfo); } @Override public int hashCode() { - return Objects.hash(orgInfo, senderInfo, fileInfo); + return Objects.hash(orgInfo, fileInfo); } @Override public String toString() { return "KafkaMessage{" + "orgInfo=" + orgInfo + - ", senderInfo=" + senderInfo + ", fileInfo=" + fileInfo + '}'; } diff --git a/backend/src/main/java/ervu/service/fileupload/model/FileInfo.java b/backend/src/main/java/ervu/service/fileupload/model/FileInfo.java index ea851414..91a345e2 100644 --- a/backend/src/main/java/ervu/service/fileupload/model/FileInfo.java +++ b/backend/src/main/java/ervu/service/fileupload/model/FileInfo.java @@ -6,23 +6,33 @@ import java.util.Objects; * @author Alexandr Shalaginov */ public class FileInfo { - private final String fileNameBase; + private final String fileId; + private final String fileUrl; private final String fileName; private final String filePatternCode; private final String filePatternName; private final String departureDateTime; + private final String timeZone; + private final FileStatus fileStatus; - public FileInfo(String fileNameBase, String fileName, String filePatternCode, - String filePatternName, String departureDateTime) { - this.fileNameBase = fileNameBase; + public FileInfo(String fileId, String fileUrl, String fileName, String filePatternCode, + String filePatternName, String departureDateTime, String timeZone, FileStatus fileStatus) { + this.fileId = fileId; + this.fileUrl = fileUrl; this.fileName = fileName; this.filePatternCode = filePatternCode; this.filePatternName = filePatternName; this.departureDateTime = departureDateTime; + this.timeZone = timeZone; + this.fileStatus = fileStatus; } - public String getFileNameBase() { - return fileNameBase; + public String getFileId() { + return fileId; + } + + public String getFileUrl() { + return fileUrl; } public String getFileName() { @@ -41,12 +51,22 @@ public class FileInfo { return departureDateTime; } + public String getTimeZone() { + return timeZone; + } + + public FileStatus getFileStatus() { + return fileStatus; + } + @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; FileInfo fileInfo = (FileInfo) o; - return Objects.equals(fileNameBase, fileInfo.fileNameBase) && Objects.equals( + return Objects.equals(fileId, fileInfo.fileId) && Objects.equals(fileUrl, + fileInfo.fileUrl + ) && Objects.equals( fileName, fileInfo.fileName) && Objects.equals(filePatternCode, fileInfo.filePatternCode ) && Objects.equals(filePatternName, fileInfo.filePatternName) @@ -55,7 +75,7 @@ public class FileInfo { @Override public int hashCode() { - return Objects.hash(fileNameBase, fileName, filePatternCode, filePatternName, + return Objects.hash(fileId, fileUrl, fileName, filePatternCode, filePatternName, departureDateTime ); } @@ -63,7 +83,8 @@ public class FileInfo { @Override public String toString() { return "FileInfo{" + - "fileNameBase='" + fileNameBase + '\'' + + "fileId='" + fileId + '\'' + + ", fileNameBase='" + fileUrl + '\'' + ", fileName='" + fileName + '\'' + ", filePatternCode='" + filePatternCode + '\'' + ", filePatternName='" + filePatternName + '\'' + diff --git a/backend/src/main/java/ervu/service/fileupload/model/FileStatus.java b/backend/src/main/java/ervu/service/fileupload/model/FileStatus.java new file mode 100644 index 00000000..e9a5c614 --- /dev/null +++ b/backend/src/main/java/ervu/service/fileupload/model/FileStatus.java @@ -0,0 +1,37 @@ +package ervu.service.fileupload.model; + +import java.io.Serializable; + +/** + * @author Eduard Tihomirov + */ +public class FileStatus { + + private String code; + private String status; + private String description; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/backend/src/main/java/ervu/service/fileupload/model/OrgInfo.java b/backend/src/main/java/ervu/service/fileupload/model/OrgInfo.java index 47fbf885..73f95564 100644 --- a/backend/src/main/java/ervu/service/fileupload/model/OrgInfo.java +++ b/backend/src/main/java/ervu/service/fileupload/model/OrgInfo.java @@ -7,44 +7,25 @@ import java.util.Objects; */ public class OrgInfo { private final String orgName; - private final String orgTypeCode; - private final String orgTypeName; - private final String ogrn; - private final String inn; - private final String kpp; + private final String orgId; + private final String prnOid; - public OrgInfo(String orgName, String orgTypeCode, String orgTypeName, String ogrn, String inn, - String kpp) { + public OrgInfo(String orgName, String orgId, String prnOid) { this.orgName = orgName; - this.orgTypeCode = orgTypeCode; - this.orgTypeName = orgTypeName; - this.ogrn = ogrn; - this.inn = inn; - this.kpp = kpp; + this.orgId = orgId; + this.prnOid = prnOid; } public String getOrgName() { return orgName; } - public String getOrgTypeCode() { - return orgTypeCode; + public String getOrgId() { + return orgId; } - public String getOrgTypeName() { - return orgTypeName; - } - - public String getOgrn() { - return ogrn; - } - - public String getInn() { - return inn; - } - - public String getKpp() { - return kpp; + public String getPrnOid() { + return prnOid; } @Override @@ -52,27 +33,22 @@ public class OrgInfo { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; OrgInfo orgInfo = (OrgInfo) o; - return Objects.equals(orgName, orgInfo.orgName) && Objects.equals(orgTypeCode, - orgInfo.orgTypeCode - ) && Objects.equals(orgTypeName, orgInfo.orgTypeName) && Objects.equals(ogrn, - orgInfo.ogrn - ) && Objects.equals(inn, orgInfo.inn) && Objects.equals(kpp, orgInfo.kpp); + return Objects.equals(orgName, orgInfo.orgName) && Objects.equals(orgId, + orgInfo.orgId + ) && Objects.equals(prnOid, orgInfo.prnOid); } @Override public int hashCode() { - return Objects.hash(orgName, orgTypeCode, orgTypeName, ogrn, inn, kpp); + return Objects.hash(orgName, orgId, prnOid); } @Override public String toString() { return "OrgInfo{" + "orgName='" + orgName + '\'' + - ", orgTypeCode='" + orgTypeCode + '\'' + - ", orgTypeName='" + orgTypeName + '\'' + - ", ogrn='" + ogrn + '\'' + - ", inn='" + inn + '\'' + - ", kpp='" + kpp + '\'' + + ", orgId='" + orgId + '\'' + + ", prnOid='" + prnOid + '\'' + '}'; } } diff --git a/backend/src/main/java/ervu/service/fileupload/model/PassportInfo.java b/backend/src/main/java/ervu/service/fileupload/model/PassportInfo.java deleted file mode 100644 index 24c87bf5..00000000 --- a/backend/src/main/java/ervu/service/fileupload/model/PassportInfo.java +++ /dev/null @@ -1,54 +0,0 @@ -package ervu.service.fileupload.model; - -import java.util.Objects; - -/** - * @author Alexandr Shalaginov - */ -public class PassportInfo { - private final String series; - private final String number; - private final String issueDate; - - public PassportInfo(String series, String number, String issueDate) { - this.series = series; - this.number = number; - this.issueDate = issueDate; - } - - public String getSeries() { - return series; - } - - public String getNumber() { - return number; - } - - public String getIssueDate() { - return issueDate; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - PassportInfo that = (PassportInfo) o; - return Objects.equals(series, that.series) && Objects.equals(number, - that.number - ) && Objects.equals(issueDate, that.issueDate); - } - - @Override - public int hashCode() { - return Objects.hash(series, number, issueDate); - } - - @Override - public String toString() { - return "PassportInfo{" + - "series='" + series + '\'' + - ", number='" + number + '\'' + - ", issueDate='" + issueDate + '\'' + - '}'; - } -} diff --git a/backend/src/main/java/ervu/service/fileupload/model/SenderInfo.java b/backend/src/main/java/ervu/service/fileupload/model/SenderInfo.java deleted file mode 100644 index 56f440f4..00000000 --- a/backend/src/main/java/ervu/service/fileupload/model/SenderInfo.java +++ /dev/null @@ -1,106 +0,0 @@ -package ervu.service.fileupload.model; - -import java.util.Objects; - -/** - * @author Alexandr Shalaginov - */ -public class SenderInfo { - private final String senderLastName; - private final String senderFirstName; - private final String senderMiddleName; - private final String birthDate; - private final String senderRoleCode; - private final String senderRoleName; - private final String snils; - private final String idERN; - private final PassportInfo document; - - public SenderInfo(String senderLastName, String senderFirstName, String senderMiddleName, - String birthDate, String senderRoleCode, String senderRoleName, String snils, String idERN, - PassportInfo document) { - this.senderLastName = senderLastName; - this.senderFirstName = senderFirstName; - this.senderMiddleName = senderMiddleName; - this.birthDate = birthDate; - this.senderRoleCode = senderRoleCode; - this.senderRoleName = senderRoleName; - this.snils = snils; - this.idERN = idERN; - this.document = document; - } - - public String getSenderLastName() { - return senderLastName; - } - - public String getSenderFirstName() { - return senderFirstName; - } - - public String getSenderMiddleName() { - return senderMiddleName; - } - - public String getBirthDate() { - return birthDate; - } - - public String getSenderRoleCode() { - return senderRoleCode; - } - - public String getSenderRoleName() { - return senderRoleName; - } - - public String getSnils() { - return snils; - } - - public String getIdERN() { - return idERN; - } - - public PassportInfo getDocument() { - return document; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - SenderInfo that = (SenderInfo) o; - return Objects.equals(senderLastName, that.senderLastName) && Objects.equals( - senderFirstName, that.senderFirstName) && Objects.equals(senderMiddleName, - that.senderMiddleName - ) && Objects.equals(birthDate, that.birthDate) && Objects.equals( - senderRoleCode, that.senderRoleCode) && Objects.equals(senderRoleName, - that.senderRoleName - ) && Objects.equals(snils, that.snils) && Objects.equals(idERN, that.idERN) - && Objects.equals(document, that.document); - } - - @Override - public int hashCode() { - return Objects.hash(senderLastName, senderFirstName, senderMiddleName, birthDate, - senderRoleCode, - senderRoleName, snils, idERN, document - ); - } - - @Override - public String toString() { - return "SenderInfo{" + - "senderLastName='" + senderLastName + '\'' + - ", senderFirstName='" + senderFirstName + '\'' + - ", senderMiddleName='" + senderMiddleName + '\'' + - ", birthDate='" + birthDate + '\'' + - ", senderRoleCode='" + senderRoleCode + '\'' + - ", senderRoleName='" + senderRoleName + '\'' + - ", snils='" + snils + '\'' + - ", idERN='" + idERN + '\'' + - ", document=" + document + - '}'; - } -} diff --git a/backend/src/main/java/ervu/service/scheduer/EsnsiOkopfSchedulerService.java b/backend/src/main/java/ervu/service/scheduer/EsnsiOkopfSchedulerService.java new file mode 100644 index 00000000..e2b884e0 --- /dev/null +++ b/backend/src/main/java/ervu/service/scheduer/EsnsiOkopfSchedulerService.java @@ -0,0 +1,10 @@ +package ervu.service.scheduer; + +/** + * @author Artyom Hackimullin + */ +public interface EsnsiOkopfSchedulerService { + + void load(); + +} diff --git a/backend/src/main/java/ervu/service/scheduer/EsnsiOkopfSchedulerServiceImpl.java b/backend/src/main/java/ervu/service/scheduer/EsnsiOkopfSchedulerServiceImpl.java new file mode 100644 index 00000000..94168770 --- /dev/null +++ b/backend/src/main/java/ervu/service/scheduer/EsnsiOkopfSchedulerServiceImpl.java @@ -0,0 +1,63 @@ +package ervu.service.scheduer; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import ervu.client.classified.EsnsiOkopfClient; +import ervu.dao.classifier.OkopfDao; +import ervu.service.classifier.model.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * @author Artyom Hackimullin + */ +@Service +public class EsnsiOkopfSchedulerServiceImpl implements EsnsiOkopfSchedulerService { + private static final Logger logger = LoggerFactory.getLogger( + EsnsiOkopfSchedulerServiceImpl.class); + + @Autowired + private EsnsiOkopfClient esnsiOkopfClient; + @Autowired + private OkopfDao okopfDao; + @Autowired + private ObjectMapper mapper; + + @Scheduled(cron = "${esnsi.okopf.cron:0 0 */1 * * *}") + @Transactional + public void load() { + String data = esnsiOkopfClient.getJsonOkopFormData(); + try { + logger.info("Start okopf scheduller. Load okopf file from esnsi"); + OkopfOrgModel orgModel = mapper.readValue(data, OkopfOrgModel.class); + List okopfRecords = mapToOkopfRecords(orgModel.getData()); + int currentVersion = mapper.readTree(data).findValue("version").asInt(); + logger.info("Saving okopf data in database."); + okopfDao.save(okopfRecords, currentVersion); + } + catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + private List mapToOkopfRecords(OkopfDataModel dataModel) { + Map okopfMap = new HashMap<>(); + for (OkopfDetailsModel detail : dataModel.getDetails()) { + OkopfAttributeValueModel[] attributeValues = detail.getAttributeValues(); + String key = attributeValues[0].getValue(); + String value = attributeValues[1].getValue(); + okopfMap.put(key, value); + } + return okopfMap.entrySet().stream() + .map(e -> new OkopfModel(e.getKey(), e.getValue())).collect(Collectors.toList()); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/Appeals.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/Appeals.java new file mode 100644 index 00000000..31d51688 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/Appeals.java @@ -0,0 +1,76 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.DefaultCatalog; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.MainProfile; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.ReasonsAppeal; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.ReviewRating; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.TopicAppeal; + +import java.util.Arrays; +import java.util.List; + +import org.jooq.Catalog; +import org.jooq.Table; +import org.jooq.impl.SchemaImpl; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class Appeals extends SchemaImpl { + + private static final long serialVersionUID = 1L; + + /** + * The reference instance of appeals + */ + public static final Appeals APPEALS = new Appeals(); + + /** + * Основной профиль уровень РФ + */ + public final MainProfile MAIN_PROFILE = MainProfile.MAIN_PROFILE; + + /** + * Причины обжалования уровень РФ + */ + public final ReasonsAppeal REASONS_APPEAL = ReasonsAppeal.REASONS_APPEAL; + + /** + * Рейтинг рассмотрения жалоб уровень РФ + */ + public final ReviewRating REVIEW_RATING = ReviewRating.REVIEW_RATING; + + /** + * Тема обжалования уровень РФ + */ + public final TopicAppeal TOPIC_APPEAL = TopicAppeal.TOPIC_APPEAL; + + /** + * No further instances allowed + */ + private Appeals() { + super("appeals", null); + } + + + @Override + public Catalog getCatalog() { + return DefaultCatalog.DEFAULT_CATALOG; + } + + @Override + public final List> getTables() { + return Arrays.asList( + MainProfile.MAIN_PROFILE, + ReasonsAppeal.REASONS_APPEAL, + ReviewRating.REVIEW_RATING, + TopicAppeal.TOPIC_APPEAL + ); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/Keys.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/Keys.java new file mode 100644 index 00000000..da5c2982 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/Keys.java @@ -0,0 +1,37 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.MainProfile; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.ReasonsAppeal; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.ReviewRating; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.TopicAppeal; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.records.MainProfileRecord; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.records.ReasonsAppealRecord; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.records.ReviewRatingRecord; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.records.TopicAppealRecord; + +import org.jooq.TableField; +import org.jooq.UniqueKey; +import org.jooq.impl.DSL; +import org.jooq.impl.Internal; + + +/** + * A class modelling foreign key relationships and constraints of tables in + * appeals. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class Keys { + + // ------------------------------------------------------------------------- + // UNIQUE and PRIMARY KEY definitions + // ------------------------------------------------------------------------- + + public static final UniqueKey PK_MAIN_PROFILE = Internal.createUniqueKey(MainProfile.MAIN_PROFILE, DSL.name("pk_main_profile"), new TableField[] { MainProfile.MAIN_PROFILE.ID_MAIN_PROFILE }, true); + public static final UniqueKey PK_REASONS_APPEAL = Internal.createUniqueKey(ReasonsAppeal.REASONS_APPEAL, DSL.name("pk_reasons_appeal"), new TableField[] { ReasonsAppeal.REASONS_APPEAL.ID_REASONS_APPEAL }, true); + public static final UniqueKey PK_REVIEW_RATING = Internal.createUniqueKey(ReviewRating.REVIEW_RATING, DSL.name("pk_review_rating"), new TableField[] { ReviewRating.REVIEW_RATING.ID_REVIEW_RATING }, true); + public static final UniqueKey PK_TOPIC_APPEAL = Internal.createUniqueKey(TopicAppeal.TOPIC_APPEAL, DSL.name("pk_topic_appeal"), new TableField[] { TopicAppeal.TOPIC_APPEAL.ID_TOPIC_APPEAL }, true); +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/Tables.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/Tables.java new file mode 100644 index 00000000..9978e004 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/Tables.java @@ -0,0 +1,38 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.MainProfile; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.ReasonsAppeal; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.ReviewRating; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.TopicAppeal; + + +/** + * Convenience access to all tables in appeals. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class Tables { + + /** + * Основной профиль уровень РФ + */ + public static final MainProfile MAIN_PROFILE = MainProfile.MAIN_PROFILE; + + /** + * Причины обжалования уровень РФ + */ + public static final ReasonsAppeal REASONS_APPEAL = ReasonsAppeal.REASONS_APPEAL; + + /** + * Рейтинг рассмотрения жалоб уровень РФ + */ + public static final ReviewRating REVIEW_RATING = ReviewRating.REVIEW_RATING; + + /** + * Тема обжалования уровень РФ + */ + public static final TopicAppeal TOPIC_APPEAL = TopicAppeal.TOPIC_APPEAL; +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/MainProfile.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/MainProfile.java new file mode 100644 index 00000000..9ab32e8e --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/MainProfile.java @@ -0,0 +1,261 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.Appeals; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.Keys; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.records.MainProfileRecord; + +import java.sql.Date; +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; + + +/** + * Основной профиль уровень РФ + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class MainProfile extends TableImpl { + + private static final long serialVersionUID = 1L; + + /** + * The reference instance of appeals.main_profile + */ + public static final MainProfile MAIN_PROFILE = new MainProfile(); + + /** + * The class holding records for this type + */ + @Override + public Class getRecordType() { + return MainProfileRecord.class; + } + + /** + * The column appeals.main_profile.id_main_profile. + */ + public final TableField ID_MAIN_PROFILE = createField(DSL.name("id_main_profile"), SQLDataType.BIGINT.nullable(false).identity(true), this, ""); + + /** + * The column appeals.main_profile.gender. Пол + */ + public final TableField GENDER = createField(DSL.name("gender"), SQLDataType.CLOB, this, "Пол"); + + /** + * The column appeals.main_profile.age. Возраст + */ + public final TableField AGE = createField(DSL.name("age"), SQLDataType.CLOB, this, "Возраст"); + + /** + * The column appeals.main_profile.child_min_18. Дети до 18 лет + */ + public final TableField CHILD_MIN_18 = createField(DSL.name("child_min_18"), SQLDataType.CLOB, this, "Дети до 18 лет"); + + /** + * The column appeals.main_profile.education. Образование + */ + public final TableField EDUCATION = createField(DSL.name("education"), SQLDataType.CLOB, this, "Образование"); + + /** + * The column appeals.main_profile.employment. Занятость + */ + public final TableField EMPLOYMENT = createField(DSL.name("employment"), SQLDataType.CLOB, this, "Занятость"); + + /** + * The column appeals.main_profile.recording_date. Дата записи + */ + public final TableField RECORDING_DATE = createField(DSL.name("recording_date"), SQLDataType.DATE.defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.DATE)), this, "Дата записи"); + + /** + * The column appeals.main_profile.recruitment_id. + */ + public final TableField RECRUITMENT_ID = createField(DSL.name("recruitment_id"), SQLDataType.UUID, this, ""); + + private MainProfile(Name alias, Table aliased) { + this(alias, aliased, (Field[]) null, null); + } + + private MainProfile(Name alias, Table aliased, Field[] parameters, Condition where) { + super(alias, null, aliased, parameters, DSL.comment("Основной профиль уровень РФ"), TableOptions.table(), where); + } + + /** + * Create an aliased appeals.main_profile table reference + */ + public MainProfile(String alias) { + this(DSL.name(alias), MAIN_PROFILE); + } + + /** + * Create an aliased appeals.main_profile table reference + */ + public MainProfile(Name alias) { + this(alias, MAIN_PROFILE); + } + + /** + * Create a appeals.main_profile table reference + */ + public MainProfile() { + this(DSL.name("main_profile"), null); + } + + @Override + public Schema getSchema() { + return aliased() ? null : Appeals.APPEALS; + } + + @Override + public Identity getIdentity() { + return (Identity) super.getIdentity(); + } + + @Override + public UniqueKey getPrimaryKey() { + return Keys.PK_MAIN_PROFILE; + } + + @Override + public MainProfile as(String alias) { + return new MainProfile(DSL.name(alias), this); + } + + @Override + public MainProfile as(Name alias) { + return new MainProfile(alias, this); + } + + @Override + public MainProfile as(Table alias) { + return new MainProfile(alias.getQualifiedName(), this); + } + + /** + * Rename this table + */ + @Override + public MainProfile rename(String name) { + return new MainProfile(DSL.name(name), null); + } + + /** + * Rename this table + */ + @Override + public MainProfile rename(Name name) { + return new MainProfile(name, null); + } + + /** + * Rename this table + */ + @Override + public MainProfile rename(Table name) { + return new MainProfile(name.getQualifiedName(), null); + } + + /** + * Create an inline derived table from this table + */ + @Override + public MainProfile where(Condition condition) { + return new MainProfile(getQualifiedName(), aliased() ? this : null, null, condition); + } + + /** + * Create an inline derived table from this table + */ + @Override + public MainProfile where(Collection conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public MainProfile where(Condition... conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public MainProfile where(Field condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public MainProfile where(SQL condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public MainProfile where(@Stringly.SQL String condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public MainProfile where(@Stringly.SQL String condition, Object... binds) { + return where(DSL.condition(condition, binds)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public MainProfile where(@Stringly.SQL String condition, QueryPart... parts) { + return where(DSL.condition(condition, parts)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public MainProfile whereExists(Select select) { + return where(DSL.exists(select)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public MainProfile whereNotExists(Select select) { + return where(DSL.notExists(select)); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/ReasonsAppeal.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/ReasonsAppeal.java new file mode 100644 index 00000000..62468c04 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/ReasonsAppeal.java @@ -0,0 +1,277 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.Appeals; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.Keys; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.records.ReasonsAppealRecord; + +import java.math.BigDecimal; +import java.sql.Date; +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; + + +/** + * Причины обжалования уровень РФ + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class ReasonsAppeal extends TableImpl { + + private static final long serialVersionUID = 1L; + + /** + * The reference instance of appeals.reasons_appeal + */ + public static final ReasonsAppeal REASONS_APPEAL = new ReasonsAppeal(); + + /** + * The class holding records for this type + */ + @Override + public Class getRecordType() { + return ReasonsAppealRecord.class; + } + + /** + * The column appeals.reasons_appeal.id_reasons_appeal. + */ + public final TableField ID_REASONS_APPEAL = createField(DSL.name("id_reasons_appeal"), SQLDataType.BIGINT.nullable(false).identity(true), this, ""); + + /** + * The column appeals.reasons_appeal.appeal. Обжалования + */ + public final TableField APPEAL = createField(DSL.name("appeal"), SQLDataType.NUMERIC, this, "Обжалования"); + + /** + * The column appeals.reasons_appeal.incorrect_inf. + * Некорректные сведения + */ + public final TableField INCORRECT_INF = createField(DSL.name("incorrect_inf"), SQLDataType.NUMERIC, this, "Некорректные сведения"); + + /** + * The column appeals.reasons_appeal.no_data. Нет данных + */ + public final TableField NO_DATA = createField(DSL.name("no_data"), SQLDataType.NUMERIC, this, "Нет данных"); + + /** + * The column appeals.reasons_appeal.other. Прочее + */ + public final TableField OTHER = createField(DSL.name("other"), SQLDataType.NUMERIC, this, "Прочее"); + + /** + * The column appeals.reasons_appeal.recording_date. Дата + * записи + */ + public final TableField RECORDING_DATE = createField(DSL.name("recording_date"), SQLDataType.DATE.defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.DATE)), this, "Дата записи"); + + /** + * The column appeals.reasons_appeal.incorrect_inf_percent. + * Некорректные сведения в процентах + */ + public final TableField INCORRECT_INF_PERCENT = createField(DSL.name("incorrect_inf_percent"), SQLDataType.NUMERIC, this, "Некорректные сведения в процентах"); + + /** + * The column appeals.reasons_appeal.no_data_percent. Нет + * данных в процентах + */ + public final TableField NO_DATA_PERCENT = createField(DSL.name("no_data_percent"), SQLDataType.NUMERIC, this, "Нет данных в процентах"); + + /** + * The column appeals.reasons_appeal.other_percent. Прочее в + * процентах + */ + public final TableField OTHER_PERCENT = createField(DSL.name("other_percent"), SQLDataType.NUMERIC, this, "Прочее в процентах"); + + /** + * The column appeals.reasons_appeal.recruitment_id. + */ + public final TableField RECRUITMENT_ID = createField(DSL.name("recruitment_id"), SQLDataType.UUID, this, ""); + + private ReasonsAppeal(Name alias, Table aliased) { + this(alias, aliased, (Field[]) null, null); + } + + private ReasonsAppeal(Name alias, Table aliased, Field[] parameters, Condition where) { + super(alias, null, aliased, parameters, DSL.comment("Причины обжалования уровень РФ"), TableOptions.table(), where); + } + + /** + * Create an aliased appeals.reasons_appeal table reference + */ + public ReasonsAppeal(String alias) { + this(DSL.name(alias), REASONS_APPEAL); + } + + /** + * Create an aliased appeals.reasons_appeal table reference + */ + public ReasonsAppeal(Name alias) { + this(alias, REASONS_APPEAL); + } + + /** + * Create a appeals.reasons_appeal table reference + */ + public ReasonsAppeal() { + this(DSL.name("reasons_appeal"), null); + } + + @Override + public Schema getSchema() { + return aliased() ? null : Appeals.APPEALS; + } + + @Override + public Identity getIdentity() { + return (Identity) super.getIdentity(); + } + + @Override + public UniqueKey getPrimaryKey() { + return Keys.PK_REASONS_APPEAL; + } + + @Override + public ReasonsAppeal as(String alias) { + return new ReasonsAppeal(DSL.name(alias), this); + } + + @Override + public ReasonsAppeal as(Name alias) { + return new ReasonsAppeal(alias, this); + } + + @Override + public ReasonsAppeal as(Table alias) { + return new ReasonsAppeal(alias.getQualifiedName(), this); + } + + /** + * Rename this table + */ + @Override + public ReasonsAppeal rename(String name) { + return new ReasonsAppeal(DSL.name(name), null); + } + + /** + * Rename this table + */ + @Override + public ReasonsAppeal rename(Name name) { + return new ReasonsAppeal(name, null); + } + + /** + * Rename this table + */ + @Override + public ReasonsAppeal rename(Table name) { + return new ReasonsAppeal(name.getQualifiedName(), null); + } + + /** + * Create an inline derived table from this table + */ + @Override + public ReasonsAppeal where(Condition condition) { + return new ReasonsAppeal(getQualifiedName(), aliased() ? this : null, null, condition); + } + + /** + * Create an inline derived table from this table + */ + @Override + public ReasonsAppeal where(Collection conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public ReasonsAppeal where(Condition... conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public ReasonsAppeal where(Field condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public ReasonsAppeal where(SQL condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public ReasonsAppeal where(@Stringly.SQL String condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public ReasonsAppeal where(@Stringly.SQL String condition, Object... binds) { + return where(DSL.condition(condition, binds)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public ReasonsAppeal where(@Stringly.SQL String condition, QueryPart... parts) { + return where(DSL.condition(condition, parts)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public ReasonsAppeal whereExists(Select select) { + return where(DSL.exists(select)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public ReasonsAppeal whereNotExists(Select select) { + return where(DSL.notExists(select)); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/ReviewRating.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/ReviewRating.java new file mode 100644 index 00000000..f9887da0 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/ReviewRating.java @@ -0,0 +1,254 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.Appeals; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.Keys; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.records.ReviewRatingRecord; + +import java.math.BigDecimal; +import java.sql.Date; +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; + + +/** + * Рейтинг рассмотрения жалоб уровень РФ + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class ReviewRating extends TableImpl { + + private static final long serialVersionUID = 1L; + + /** + * The reference instance of appeals.review_rating + */ + public static final ReviewRating REVIEW_RATING = new ReviewRating(); + + /** + * The class holding records for this type + */ + @Override + public Class getRecordType() { + return ReviewRatingRecord.class; + } + + /** + * The column appeals.review_rating.id_review_rating. + */ + public final TableField ID_REVIEW_RATING = createField(DSL.name("id_review_rating"), SQLDataType.BIGINT.nullable(false).identity(true), this, ""); + + /** + * The column appeals.review_rating.speed. Скорость + * рассмотрения + */ + public final TableField SPEED = createField(DSL.name("speed"), SQLDataType.NUMERIC, this, "Скорость рассмотрения"); + + /** + * The column appeals.review_rating.rating. Оценка + * удовлетворенности + */ + public final TableField RATING = createField(DSL.name("rating"), SQLDataType.NUMERIC, this, "Оценка удовлетворенности"); + + /** + * The column appeals.review_rating.recording_date. Дата записи + */ + public final TableField RECORDING_DATE = createField(DSL.name("recording_date"), SQLDataType.DATE.defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.DATE)), this, "Дата записи"); + + /** + * The column appeals.review_rating.id_region. + */ + public final TableField ID_REGION = createField(DSL.name("id_region"), SQLDataType.BIGINT, this, ""); + + /** + * The column appeals.review_rating.recruitment_id. + */ + public final TableField RECRUITMENT_ID = createField(DSL.name("recruitment_id"), SQLDataType.UUID, this, ""); + + private ReviewRating(Name alias, Table aliased) { + this(alias, aliased, (Field[]) null, null); + } + + private ReviewRating(Name alias, Table aliased, Field[] parameters, Condition where) { + super(alias, null, aliased, parameters, DSL.comment("Рейтинг рассмотрения жалоб уровень РФ"), TableOptions.table(), where); + } + + /** + * Create an aliased appeals.review_rating table reference + */ + public ReviewRating(String alias) { + this(DSL.name(alias), REVIEW_RATING); + } + + /** + * Create an aliased appeals.review_rating table reference + */ + public ReviewRating(Name alias) { + this(alias, REVIEW_RATING); + } + + /** + * Create a appeals.review_rating table reference + */ + public ReviewRating() { + this(DSL.name("review_rating"), null); + } + + @Override + public Schema getSchema() { + return aliased() ? null : Appeals.APPEALS; + } + + @Override + public Identity getIdentity() { + return (Identity) super.getIdentity(); + } + + @Override + public UniqueKey getPrimaryKey() { + return Keys.PK_REVIEW_RATING; + } + + @Override + public ReviewRating as(String alias) { + return new ReviewRating(DSL.name(alias), this); + } + + @Override + public ReviewRating as(Name alias) { + return new ReviewRating(alias, this); + } + + @Override + public ReviewRating as(Table alias) { + return new ReviewRating(alias.getQualifiedName(), this); + } + + /** + * Rename this table + */ + @Override + public ReviewRating rename(String name) { + return new ReviewRating(DSL.name(name), null); + } + + /** + * Rename this table + */ + @Override + public ReviewRating rename(Name name) { + return new ReviewRating(name, null); + } + + /** + * Rename this table + */ + @Override + public ReviewRating rename(Table name) { + return new ReviewRating(name.getQualifiedName(), null); + } + + /** + * Create an inline derived table from this table + */ + @Override + public ReviewRating where(Condition condition) { + return new ReviewRating(getQualifiedName(), aliased() ? this : null, null, condition); + } + + /** + * Create an inline derived table from this table + */ + @Override + public ReviewRating where(Collection conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public ReviewRating where(Condition... conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public ReviewRating where(Field condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public ReviewRating where(SQL condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public ReviewRating where(@Stringly.SQL String condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public ReviewRating where(@Stringly.SQL String condition, Object... binds) { + return where(DSL.condition(condition, binds)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public ReviewRating where(@Stringly.SQL String condition, QueryPart... parts) { + return where(DSL.condition(condition, parts)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public ReviewRating whereExists(Select select) { + return where(DSL.exists(select)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public ReviewRating whereNotExists(Select select) { + return where(DSL.notExists(select)); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/TopicAppeal.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/TopicAppeal.java new file mode 100644 index 00000000..f6ea6e58 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/TopicAppeal.java @@ -0,0 +1,285 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.Appeals; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.Keys; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.records.TopicAppealRecord; + +import java.math.BigDecimal; +import java.sql.Date; +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; + + +/** + * Тема обжалования уровень РФ + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class TopicAppeal extends TableImpl { + + private static final long serialVersionUID = 1L; + + /** + * The reference instance of appeals.topic_appeal + */ + public static final TopicAppeal TOPIC_APPEAL = new TopicAppeal(); + + /** + * The class holding records for this type + */ + @Override + public Class getRecordType() { + return TopicAppealRecord.class; + } + + /** + * The column appeals.topic_appeal.id_topic_appeal. + */ + public final TableField ID_TOPIC_APPEAL = createField(DSL.name("id_topic_appeal"), SQLDataType.BIGINT.nullable(false).identity(true), this, ""); + + /** + * The column appeals.topic_appeal.registration. Тема + * обжалования постановка на учет + */ + public final TableField REGISTRATION = createField(DSL.name("registration"), SQLDataType.NUMERIC, this, "Тема обжалования постановка на учет"); + + /** + * The column appeals.topic_appeal.sabpoena. Тема обжалования + * повестки + */ + public final TableField SABPOENA = createField(DSL.name("sabpoena"), SQLDataType.NUMERIC, this, "Тема обжалования повестки"); + + /** + * The column appeals.topic_appeal.appear. Тема обжалования + * явка + */ + public final TableField APPEAR = createField(DSL.name("appear"), SQLDataType.NUMERIC, this, "Тема обжалования явка"); + + /** + * The column appeals.topic_appeal.temporary_measures. Тема + * обжалования временные меры + */ + public final TableField TEMPORARY_MEASURES = createField(DSL.name("temporary_measures"), SQLDataType.NUMERIC, this, "Тема обжалования временные меры"); + + /** + * The column appeals.topic_appeal.recording_date. Дата записи + */ + public final TableField RECORDING_DATE = createField(DSL.name("recording_date"), SQLDataType.DATE.defaultValue(DSL.field(DSL.raw("now()"), SQLDataType.DATE)), this, "Дата записи"); + + /** + * The column appeals.topic_appeal.registration_percent. Тема + * обжалования постановка на учет в процентах + */ + public final TableField REGISTRATION_PERCENT = createField(DSL.name("registration_percent"), SQLDataType.NUMERIC, this, "Тема обжалования постановка на учет в процентах"); + + /** + * The column appeals.topic_appeal.sabpoena_percent. Тема + * обжалования повестки в процентах + */ + public final TableField SABPOENA_PERCENT = createField(DSL.name("sabpoena_percent"), SQLDataType.NUMERIC, this, "Тема обжалования повестки в процентах"); + + /** + * The column appeals.topic_appeal.appear_percent. Тема + * обжалования явка в процентах + */ + public final TableField APPEAR_PERCENT = createField(DSL.name("appear_percent"), SQLDataType.NUMERIC, this, "Тема обжалования явка в процентах"); + + /** + * The column appeals.topic_appeal.temporary_measures_percent. + * Тема обжалования временные меры в процентах + */ + public final TableField TEMPORARY_MEASURES_PERCENT = createField(DSL.name("temporary_measures_percent"), SQLDataType.NUMERIC, this, "Тема обжалования временные меры в процентах"); + + /** + * The column appeals.topic_appeal.recruitment_id. + */ + public final TableField RECRUITMENT_ID = createField(DSL.name("recruitment_id"), SQLDataType.UUID, this, ""); + + private TopicAppeal(Name alias, Table aliased) { + this(alias, aliased, (Field[]) null, null); + } + + private TopicAppeal(Name alias, Table aliased, Field[] parameters, Condition where) { + super(alias, null, aliased, parameters, DSL.comment("Тема обжалования уровень РФ"), TableOptions.table(), where); + } + + /** + * Create an aliased appeals.topic_appeal table reference + */ + public TopicAppeal(String alias) { + this(DSL.name(alias), TOPIC_APPEAL); + } + + /** + * Create an aliased appeals.topic_appeal table reference + */ + public TopicAppeal(Name alias) { + this(alias, TOPIC_APPEAL); + } + + /** + * Create a appeals.topic_appeal table reference + */ + public TopicAppeal() { + this(DSL.name("topic_appeal"), null); + } + + @Override + public Schema getSchema() { + return aliased() ? null : Appeals.APPEALS; + } + + @Override + public Identity getIdentity() { + return (Identity) super.getIdentity(); + } + + @Override + public UniqueKey getPrimaryKey() { + return Keys.PK_TOPIC_APPEAL; + } + + @Override + public TopicAppeal as(String alias) { + return new TopicAppeal(DSL.name(alias), this); + } + + @Override + public TopicAppeal as(Name alias) { + return new TopicAppeal(alias, this); + } + + @Override + public TopicAppeal as(Table alias) { + return new TopicAppeal(alias.getQualifiedName(), this); + } + + /** + * Rename this table + */ + @Override + public TopicAppeal rename(String name) { + return new TopicAppeal(DSL.name(name), null); + } + + /** + * Rename this table + */ + @Override + public TopicAppeal rename(Name name) { + return new TopicAppeal(name, null); + } + + /** + * Rename this table + */ + @Override + public TopicAppeal rename(Table name) { + return new TopicAppeal(name.getQualifiedName(), null); + } + + /** + * Create an inline derived table from this table + */ + @Override + public TopicAppeal where(Condition condition) { + return new TopicAppeal(getQualifiedName(), aliased() ? this : null, null, condition); + } + + /** + * Create an inline derived table from this table + */ + @Override + public TopicAppeal where(Collection conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public TopicAppeal where(Condition... conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public TopicAppeal where(Field condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public TopicAppeal where(SQL condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public TopicAppeal where(@Stringly.SQL String condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public TopicAppeal where(@Stringly.SQL String condition, Object... binds) { + return where(DSL.condition(condition, binds)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public TopicAppeal where(@Stringly.SQL String condition, QueryPart... parts) { + return where(DSL.condition(condition, parts)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public TopicAppeal whereExists(Select select) { + return where(DSL.exists(select)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public TopicAppeal whereNotExists(Select select) { + return where(DSL.notExists(select)); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/records/MainProfileRecord.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/records/MainProfileRecord.java new file mode 100644 index 00000000..6c5cf351 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/records/MainProfileRecord.java @@ -0,0 +1,172 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.records; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.MainProfile; + +import java.sql.Date; +import java.util.UUID; + +import org.jooq.Record1; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * Основной профиль уровень РФ + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class MainProfileRecord extends UpdatableRecordImpl { + + private static final long serialVersionUID = 1L; + + /** + * Setter for appeals.main_profile.id_main_profile. + */ + public void setIdMainProfile(Long value) { + set(0, value); + } + + /** + * Getter for appeals.main_profile.id_main_profile. + */ + public Long getIdMainProfile() { + return (Long) get(0); + } + + /** + * Setter for appeals.main_profile.gender. Пол + */ + public void setGender(String value) { + set(1, value); + } + + /** + * Getter for appeals.main_profile.gender. Пол + */ + public String getGender() { + return (String) get(1); + } + + /** + * Setter for appeals.main_profile.age. Возраст + */ + public void setAge(String value) { + set(2, value); + } + + /** + * Getter for appeals.main_profile.age. Возраст + */ + public String getAge() { + return (String) get(2); + } + + /** + * Setter for appeals.main_profile.child_min_18. Дети до 18 лет + */ + public void setChildMin_18(String value) { + set(3, value); + } + + /** + * Getter for appeals.main_profile.child_min_18. Дети до 18 лет + */ + public String getChildMin_18() { + return (String) get(3); + } + + /** + * Setter for appeals.main_profile.education. Образование + */ + public void setEducation(String value) { + set(4, value); + } + + /** + * Getter for appeals.main_profile.education. Образование + */ + public String getEducation() { + return (String) get(4); + } + + /** + * Setter for appeals.main_profile.employment. Занятость + */ + public void setEmployment(String value) { + set(5, value); + } + + /** + * Getter for appeals.main_profile.employment. Занятость + */ + public String getEmployment() { + return (String) get(5); + } + + /** + * Setter for appeals.main_profile.recording_date. Дата записи + */ + public void setRecordingDate(Date value) { + set(6, value); + } + + /** + * Getter for appeals.main_profile.recording_date. Дата записи + */ + public Date getRecordingDate() { + return (Date) get(6); + } + + /** + * Setter for appeals.main_profile.recruitment_id. + */ + public void setRecruitmentId(UUID value) { + set(7, value); + } + + /** + * Getter for appeals.main_profile.recruitment_id. + */ + public UUID getRecruitmentId() { + return (UUID) get(7); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + @Override + public Record1 key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached MainProfileRecord + */ + public MainProfileRecord() { + super(MainProfile.MAIN_PROFILE); + } + + /** + * Create a detached, initialised MainProfileRecord + */ + public MainProfileRecord(Long idMainProfile, String gender, String age, String childMin_18, String education, String employment, Date recordingDate, UUID recruitmentId) { + super(MainProfile.MAIN_PROFILE); + + setIdMainProfile(idMainProfile); + setGender(gender); + setAge(age); + setChildMin_18(childMin_18); + setEducation(education); + setEmployment(employment); + setRecordingDate(recordingDate); + setRecruitmentId(recruitmentId); + resetChangedOnNotNull(); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/records/ReasonsAppealRecord.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/records/ReasonsAppealRecord.java new file mode 100644 index 00000000..484adcdc --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/records/ReasonsAppealRecord.java @@ -0,0 +1,213 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.records; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.ReasonsAppeal; + +import java.math.BigDecimal; +import java.sql.Date; +import java.util.UUID; + +import org.jooq.Record1; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * Причины обжалования уровень РФ + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class ReasonsAppealRecord extends UpdatableRecordImpl { + + private static final long serialVersionUID = 1L; + + /** + * Setter for appeals.reasons_appeal.id_reasons_appeal. + */ + public void setIdReasonsAppeal(Long value) { + set(0, value); + } + + /** + * Getter for appeals.reasons_appeal.id_reasons_appeal. + */ + public Long getIdReasonsAppeal() { + return (Long) get(0); + } + + /** + * Setter for appeals.reasons_appeal.appeal. Обжалования + */ + public void setAppeal(BigDecimal value) { + set(1, value); + } + + /** + * Getter for appeals.reasons_appeal.appeal. Обжалования + */ + public BigDecimal getAppeal() { + return (BigDecimal) get(1); + } + + /** + * Setter for appeals.reasons_appeal.incorrect_inf. + * Некорректные сведения + */ + public void setIncorrectInf(BigDecimal value) { + set(2, value); + } + + /** + * Getter for appeals.reasons_appeal.incorrect_inf. + * Некорректные сведения + */ + public BigDecimal getIncorrectInf() { + return (BigDecimal) get(2); + } + + /** + * Setter for appeals.reasons_appeal.no_data. Нет данных + */ + public void setNoData(BigDecimal value) { + set(3, value); + } + + /** + * Getter for appeals.reasons_appeal.no_data. Нет данных + */ + public BigDecimal getNoData() { + return (BigDecimal) get(3); + } + + /** + * Setter for appeals.reasons_appeal.other. Прочее + */ + public void setOther(BigDecimal value) { + set(4, value); + } + + /** + * Getter for appeals.reasons_appeal.other. Прочее + */ + public BigDecimal getOther() { + return (BigDecimal) get(4); + } + + /** + * Setter for appeals.reasons_appeal.recording_date. Дата + * записи + */ + public void setRecordingDate(Date value) { + set(5, value); + } + + /** + * Getter for appeals.reasons_appeal.recording_date. Дата + * записи + */ + public Date getRecordingDate() { + return (Date) get(5); + } + + /** + * Setter for appeals.reasons_appeal.incorrect_inf_percent. + * Некорректные сведения в процентах + */ + public void setIncorrectInfPercent(BigDecimal value) { + set(6, value); + } + + /** + * Getter for appeals.reasons_appeal.incorrect_inf_percent. + * Некорректные сведения в процентах + */ + public BigDecimal getIncorrectInfPercent() { + return (BigDecimal) get(6); + } + + /** + * Setter for appeals.reasons_appeal.no_data_percent. Нет + * данных в процентах + */ + public void setNoDataPercent(BigDecimal value) { + set(7, value); + } + + /** + * Getter for appeals.reasons_appeal.no_data_percent. Нет + * данных в процентах + */ + public BigDecimal getNoDataPercent() { + return (BigDecimal) get(7); + } + + /** + * Setter for appeals.reasons_appeal.other_percent. Прочее в + * процентах + */ + public void setOtherPercent(BigDecimal value) { + set(8, value); + } + + /** + * Getter for appeals.reasons_appeal.other_percent. Прочее в + * процентах + */ + public BigDecimal getOtherPercent() { + return (BigDecimal) get(8); + } + + /** + * Setter for appeals.reasons_appeal.recruitment_id. + */ + public void setRecruitmentId(UUID value) { + set(9, value); + } + + /** + * Getter for appeals.reasons_appeal.recruitment_id. + */ + public UUID getRecruitmentId() { + return (UUID) get(9); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + @Override + public Record1 key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached ReasonsAppealRecord + */ + public ReasonsAppealRecord() { + super(ReasonsAppeal.REASONS_APPEAL); + } + + /** + * Create a detached, initialised ReasonsAppealRecord + */ + public ReasonsAppealRecord(Long idReasonsAppeal, BigDecimal appeal, BigDecimal incorrectInf, BigDecimal noData, BigDecimal other, Date recordingDate, BigDecimal incorrectInfPercent, BigDecimal noDataPercent, BigDecimal otherPercent, UUID recruitmentId) { + super(ReasonsAppeal.REASONS_APPEAL); + + setIdReasonsAppeal(idReasonsAppeal); + setAppeal(appeal); + setIncorrectInf(incorrectInf); + setNoData(noData); + setOther(other); + setRecordingDate(recordingDate); + setIncorrectInfPercent(incorrectInfPercent); + setNoDataPercent(noDataPercent); + setOtherPercent(otherPercent); + setRecruitmentId(recruitmentId); + resetChangedOnNotNull(); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/records/ReviewRatingRecord.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/records/ReviewRatingRecord.java new file mode 100644 index 00000000..c1b76662 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/records/ReviewRatingRecord.java @@ -0,0 +1,147 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.records; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.ReviewRating; + +import java.math.BigDecimal; +import java.sql.Date; +import java.util.UUID; + +import org.jooq.Record1; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * Рейтинг рассмотрения жалоб уровень РФ + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class ReviewRatingRecord extends UpdatableRecordImpl { + + private static final long serialVersionUID = 1L; + + /** + * Setter for appeals.review_rating.id_review_rating. + */ + public void setIdReviewRating(Long value) { + set(0, value); + } + + /** + * Getter for appeals.review_rating.id_review_rating. + */ + public Long getIdReviewRating() { + return (Long) get(0); + } + + /** + * Setter for appeals.review_rating.speed. Скорость + * рассмотрения + */ + public void setSpeed(BigDecimal value) { + set(1, value); + } + + /** + * Getter for appeals.review_rating.speed. Скорость + * рассмотрения + */ + public BigDecimal getSpeed() { + return (BigDecimal) get(1); + } + + /** + * Setter for appeals.review_rating.rating. Оценка + * удовлетворенности + */ + public void setRating(BigDecimal value) { + set(2, value); + } + + /** + * Getter for appeals.review_rating.rating. Оценка + * удовлетворенности + */ + public BigDecimal getRating() { + return (BigDecimal) get(2); + } + + /** + * Setter for appeals.review_rating.recording_date. Дата записи + */ + public void setRecordingDate(Date value) { + set(3, value); + } + + /** + * Getter for appeals.review_rating.recording_date. Дата записи + */ + public Date getRecordingDate() { + return (Date) get(3); + } + + /** + * Setter for appeals.review_rating.id_region. + */ + public void setIdRegion(Long value) { + set(4, value); + } + + /** + * Getter for appeals.review_rating.id_region. + */ + public Long getIdRegion() { + return (Long) get(4); + } + + /** + * Setter for appeals.review_rating.recruitment_id. + */ + public void setRecruitmentId(UUID value) { + set(5, value); + } + + /** + * Getter for appeals.review_rating.recruitment_id. + */ + public UUID getRecruitmentId() { + return (UUID) get(5); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + @Override + public Record1 key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached ReviewRatingRecord + */ + public ReviewRatingRecord() { + super(ReviewRating.REVIEW_RATING); + } + + /** + * Create a detached, initialised ReviewRatingRecord + */ + public ReviewRatingRecord(Long idReviewRating, BigDecimal speed, BigDecimal rating, Date recordingDate, Long idRegion, UUID recruitmentId) { + super(ReviewRating.REVIEW_RATING); + + setIdReviewRating(idReviewRating); + setSpeed(speed); + setRating(rating); + setRecordingDate(recordingDate); + setIdRegion(idRegion); + setRecruitmentId(recruitmentId); + resetChangedOnNotNull(); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/records/TopicAppealRecord.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/records/TopicAppealRecord.java new file mode 100644 index 00000000..72eed51d --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/appeals/tables/records/TopicAppealRecord.java @@ -0,0 +1,234 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.records; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.appeals.tables.TopicAppeal; + +import java.math.BigDecimal; +import java.sql.Date; +import java.util.UUID; + +import org.jooq.Record1; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * Тема обжалования уровень РФ + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class TopicAppealRecord extends UpdatableRecordImpl { + + private static final long serialVersionUID = 1L; + + /** + * Setter for appeals.topic_appeal.id_topic_appeal. + */ + public void setIdTopicAppeal(Long value) { + set(0, value); + } + + /** + * Getter for appeals.topic_appeal.id_topic_appeal. + */ + public Long getIdTopicAppeal() { + return (Long) get(0); + } + + /** + * Setter for appeals.topic_appeal.registration. Тема + * обжалования постановка на учет + */ + public void setRegistration(BigDecimal value) { + set(1, value); + } + + /** + * Getter for appeals.topic_appeal.registration. Тема + * обжалования постановка на учет + */ + public BigDecimal getRegistration() { + return (BigDecimal) get(1); + } + + /** + * Setter for appeals.topic_appeal.sabpoena. Тема обжалования + * повестки + */ + public void setSabpoena(BigDecimal value) { + set(2, value); + } + + /** + * Getter for appeals.topic_appeal.sabpoena. Тема обжалования + * повестки + */ + public BigDecimal getSabpoena() { + return (BigDecimal) get(2); + } + + /** + * Setter for appeals.topic_appeal.appear. Тема обжалования + * явка + */ + public void setAppear(BigDecimal value) { + set(3, value); + } + + /** + * Getter for appeals.topic_appeal.appear. Тема обжалования + * явка + */ + public BigDecimal getAppear() { + return (BigDecimal) get(3); + } + + /** + * Setter for appeals.topic_appeal.temporary_measures. Тема + * обжалования временные меры + */ + public void setTemporaryMeasures(BigDecimal value) { + set(4, value); + } + + /** + * Getter for appeals.topic_appeal.temporary_measures. Тема + * обжалования временные меры + */ + public BigDecimal getTemporaryMeasures() { + return (BigDecimal) get(4); + } + + /** + * Setter for appeals.topic_appeal.recording_date. Дата записи + */ + public void setRecordingDate(Date value) { + set(5, value); + } + + /** + * Getter for appeals.topic_appeal.recording_date. Дата записи + */ + public Date getRecordingDate() { + return (Date) get(5); + } + + /** + * Setter for appeals.topic_appeal.registration_percent. Тема + * обжалования постановка на учет в процентах + */ + public void setRegistrationPercent(BigDecimal value) { + set(6, value); + } + + /** + * Getter for appeals.topic_appeal.registration_percent. Тема + * обжалования постановка на учет в процентах + */ + public BigDecimal getRegistrationPercent() { + return (BigDecimal) get(6); + } + + /** + * Setter for appeals.topic_appeal.sabpoena_percent. Тема + * обжалования повестки в процентах + */ + public void setSabpoenaPercent(BigDecimal value) { + set(7, value); + } + + /** + * Getter for appeals.topic_appeal.sabpoena_percent. Тема + * обжалования повестки в процентах + */ + public BigDecimal getSabpoenaPercent() { + return (BigDecimal) get(7); + } + + /** + * Setter for appeals.topic_appeal.appear_percent. Тема + * обжалования явка в процентах + */ + public void setAppearPercent(BigDecimal value) { + set(8, value); + } + + /** + * Getter for appeals.topic_appeal.appear_percent. Тема + * обжалования явка в процентах + */ + public BigDecimal getAppearPercent() { + return (BigDecimal) get(8); + } + + /** + * Setter for appeals.topic_appeal.temporary_measures_percent. + * Тема обжалования временные меры в процентах + */ + public void setTemporaryMeasuresPercent(BigDecimal value) { + set(9, value); + } + + /** + * Getter for appeals.topic_appeal.temporary_measures_percent. + * Тема обжалования временные меры в процентах + */ + public BigDecimal getTemporaryMeasuresPercent() { + return (BigDecimal) get(9); + } + + /** + * Setter for appeals.topic_appeal.recruitment_id. + */ + public void setRecruitmentId(UUID value) { + set(10, value); + } + + /** + * Getter for appeals.topic_appeal.recruitment_id. + */ + public UUID getRecruitmentId() { + return (UUID) get(10); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + @Override + public Record1 key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached TopicAppealRecord + */ + public TopicAppealRecord() { + super(TopicAppeal.TOPIC_APPEAL); + } + + /** + * Create a detached, initialised TopicAppealRecord + */ + public TopicAppealRecord(Long idTopicAppeal, BigDecimal registration, BigDecimal sabpoena, BigDecimal appear, BigDecimal temporaryMeasures, Date recordingDate, BigDecimal registrationPercent, BigDecimal sabpoenaPercent, BigDecimal appearPercent, BigDecimal temporaryMeasuresPercent, UUID recruitmentId) { + super(TopicAppeal.TOPIC_APPEAL); + + setIdTopicAppeal(idTopicAppeal); + setRegistration(registration); + setSabpoena(sabpoena); + setAppear(appear); + setTemporaryMeasures(temporaryMeasures); + setRecordingDate(recordingDate); + setRegistrationPercent(registrationPercent); + setSabpoenaPercent(sabpoenaPercent); + setAppearPercent(appearPercent); + setTemporaryMeasuresPercent(temporaryMeasuresPercent); + setRecruitmentId(recruitmentId); + resetChangedOnNotNull(); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/Keys.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/Keys.java index bd83c472..2b603494 100644 --- a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/Keys.java +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/Keys.java @@ -4,9 +4,13 @@ package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.Files; import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.InteractionLog; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.OkopfRecords; import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.OrgOkved; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.records.FilesRecord; import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.records.InteractionLogRecord; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.records.OkopfRecordsRecord; import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.records.OrgOkvedRecord; import org.jooq.TableField; @@ -26,6 +30,9 @@ public class Keys { // UNIQUE and PRIMARY KEY definitions // ------------------------------------------------------------------------- + public static final UniqueKey FILES_PKEY = Internal.createUniqueKey(Files.FILES, DSL.name("files_pkey"), new TableField[] { Files.FILES.FILE_ID }, true); public static final UniqueKey INTERACTION_LOG_PKEY = Internal.createUniqueKey(InteractionLog.INTERACTION_LOG, DSL.name("interaction_log_pkey"), new TableField[] { InteractionLog.INTERACTION_LOG.ID }, true); + public static final UniqueKey OKOPF_RECORDS_NAME_KEY = Internal.createUniqueKey(OkopfRecords.OKOPF_RECORDS, DSL.name("okopf_records_name_key"), new TableField[] { OkopfRecords.OKOPF_RECORDS.NAME }, true); + public static final UniqueKey OKOPF_RECORDS_PKEY = Internal.createUniqueKey(OkopfRecords.OKOPF_RECORDS, DSL.name("okopf_records_pkey"), new TableField[] { OkopfRecords.OKOPF_RECORDS.OKOPF_RECORDS_ID }, true); public static final UniqueKey ORG_OKVED_PKEY = Internal.createUniqueKey(OrgOkved.ORG_OKVED, DSL.name("org_okved_pkey"), new TableField[] { OrgOkved.ORG_OKVED.ID }, true); } diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/Public.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/Public.java index 5da7ba83..fe090649 100644 --- a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/Public.java +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/Public.java @@ -5,7 +5,9 @@ package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_; import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.DefaultCatalog; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.Files; import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.InteractionLog; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.OkopfRecords; import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.OrgOkved; import java.util.Arrays; @@ -29,11 +31,21 @@ public class Public extends SchemaImpl { */ public static final Public PUBLIC = new Public(); + /** + * The table public.files. + */ + public final Files FILES = Files.FILES; + /** * The table public.interaction_log. */ public final InteractionLog INTERACTION_LOG = InteractionLog.INTERACTION_LOG; + /** + * The table public.okopf_records. + */ + public final OkopfRecords OKOPF_RECORDS = OkopfRecords.OKOPF_RECORDS; + /** * The table public.org_okved. */ @@ -55,7 +67,9 @@ public class Public extends SchemaImpl { @Override public final List> getTables() { return Arrays.asList( + Files.FILES, InteractionLog.INTERACTION_LOG, + OkopfRecords.OKOPF_RECORDS, OrgOkved.ORG_OKVED ); } diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/Routines.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/Routines.java new file mode 100644 index 00000000..97982c5c --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/Routines.java @@ -0,0 +1,285 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines.UuidGenerateV1; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines.UuidGenerateV1mc; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines.UuidGenerateV3; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines.UuidGenerateV4; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines.UuidGenerateV5; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines.UuidNil; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines.UuidNsDns; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines.UuidNsOid; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines.UuidNsUrl; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines.UuidNsX500; + +import java.util.UUID; + +import org.jooq.Configuration; +import org.jooq.Field; + + +/** + * Convenience access to all stored procedures and functions in public. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class Routines { + + /** + * Call public.uuid_generate_v1 + */ + public static UUID uuidGenerateV1( + Configuration configuration + ) { + UuidGenerateV1 f = new UuidGenerateV1(); + + f.execute(configuration); + return f.getReturnValue(); + } + + /** + * Get public.uuid_generate_v1 as a field. + */ + public static Field uuidGenerateV1() { + UuidGenerateV1 f = new UuidGenerateV1(); + + return f.asField(); + } + + /** + * Call public.uuid_generate_v1mc + */ + public static UUID uuidGenerateV1mc( + Configuration configuration + ) { + UuidGenerateV1mc f = new UuidGenerateV1mc(); + + f.execute(configuration); + return f.getReturnValue(); + } + + /** + * Get public.uuid_generate_v1mc as a field. + */ + public static Field uuidGenerateV1mc() { + UuidGenerateV1mc f = new UuidGenerateV1mc(); + + return f.asField(); + } + + /** + * Call public.uuid_generate_v3 + */ + public static UUID uuidGenerateV3( + Configuration configuration + , UUID namespace + , String name + ) { + UuidGenerateV3 f = new UuidGenerateV3(); + f.setNamespace(namespace); + f.setName_(name); + + f.execute(configuration); + return f.getReturnValue(); + } + + /** + * Get public.uuid_generate_v3 as a field. + */ + public static Field uuidGenerateV3( + UUID namespace + , String name + ) { + UuidGenerateV3 f = new UuidGenerateV3(); + f.setNamespace(namespace); + f.setName_(name); + + return f.asField(); + } + + /** + * Get public.uuid_generate_v3 as a field. + */ + public static Field uuidGenerateV3( + Field namespace + , Field name + ) { + UuidGenerateV3 f = new UuidGenerateV3(); + f.setNamespace(namespace); + f.setName_(name); + + return f.asField(); + } + + /** + * Call public.uuid_generate_v4 + */ + public static UUID uuidGenerateV4( + Configuration configuration + ) { + UuidGenerateV4 f = new UuidGenerateV4(); + + f.execute(configuration); + return f.getReturnValue(); + } + + /** + * Get public.uuid_generate_v4 as a field. + */ + public static Field uuidGenerateV4() { + UuidGenerateV4 f = new UuidGenerateV4(); + + return f.asField(); + } + + /** + * Call public.uuid_generate_v5 + */ + public static UUID uuidGenerateV5( + Configuration configuration + , UUID namespace + , String name + ) { + UuidGenerateV5 f = new UuidGenerateV5(); + f.setNamespace(namespace); + f.setName_(name); + + f.execute(configuration); + return f.getReturnValue(); + } + + /** + * Get public.uuid_generate_v5 as a field. + */ + public static Field uuidGenerateV5( + UUID namespace + , String name + ) { + UuidGenerateV5 f = new UuidGenerateV5(); + f.setNamespace(namespace); + f.setName_(name); + + return f.asField(); + } + + /** + * Get public.uuid_generate_v5 as a field. + */ + public static Field uuidGenerateV5( + Field namespace + , Field name + ) { + UuidGenerateV5 f = new UuidGenerateV5(); + f.setNamespace(namespace); + f.setName_(name); + + return f.asField(); + } + + /** + * Call public.uuid_nil + */ + public static UUID uuidNil( + Configuration configuration + ) { + UuidNil f = new UuidNil(); + + f.execute(configuration); + return f.getReturnValue(); + } + + /** + * Get public.uuid_nil as a field. + */ + public static Field uuidNil() { + UuidNil f = new UuidNil(); + + return f.asField(); + } + + /** + * Call public.uuid_ns_dns + */ + public static UUID uuidNsDns( + Configuration configuration + ) { + UuidNsDns f = new UuidNsDns(); + + f.execute(configuration); + return f.getReturnValue(); + } + + /** + * Get public.uuid_ns_dns as a field. + */ + public static Field uuidNsDns() { + UuidNsDns f = new UuidNsDns(); + + return f.asField(); + } + + /** + * Call public.uuid_ns_oid + */ + public static UUID uuidNsOid( + Configuration configuration + ) { + UuidNsOid f = new UuidNsOid(); + + f.execute(configuration); + return f.getReturnValue(); + } + + /** + * Get public.uuid_ns_oid as a field. + */ + public static Field uuidNsOid() { + UuidNsOid f = new UuidNsOid(); + + return f.asField(); + } + + /** + * Call public.uuid_ns_url + */ + public static UUID uuidNsUrl( + Configuration configuration + ) { + UuidNsUrl f = new UuidNsUrl(); + + f.execute(configuration); + return f.getReturnValue(); + } + + /** + * Get public.uuid_ns_url as a field. + */ + public static Field uuidNsUrl() { + UuidNsUrl f = new UuidNsUrl(); + + return f.asField(); + } + + /** + * Call public.uuid_ns_x500 + */ + public static UUID uuidNsX500( + Configuration configuration + ) { + UuidNsX500 f = new UuidNsX500(); + + f.execute(configuration); + return f.getReturnValue(); + } + + /** + * Get public.uuid_ns_x500 as a field. + */ + public static Field uuidNsX500() { + UuidNsX500 f = new UuidNsX500(); + + return f.asField(); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/Tables.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/Tables.java index 9b2926fd..0f51d8da 100644 --- a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/Tables.java +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/Tables.java @@ -4,7 +4,9 @@ package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.Files; import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.InteractionLog; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.OkopfRecords; import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.OrgOkved; @@ -14,11 +16,21 @@ import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.OrgOkved; @SuppressWarnings({ "all", "unchecked", "rawtypes" }) public class Tables { + /** + * The table public.files. + */ + public static final Files FILES = Files.FILES; + /** * The table public.interaction_log. */ public static final InteractionLog INTERACTION_LOG = InteractionLog.INTERACTION_LOG; + /** + * The table public.okopf_records. + */ + public static final OkopfRecords OKOPF_RECORDS = OkopfRecords.OKOPF_RECORDS; + /** * The table public.org_okved. */ diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidGenerateV1.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidGenerateV1.java new file mode 100644 index 00000000..ab81af12 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidGenerateV1.java @@ -0,0 +1,38 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.Public; + +import java.util.UUID; + +import org.jooq.Parameter; +import org.jooq.impl.AbstractRoutine; +import org.jooq.impl.Internal; +import org.jooq.impl.SQLDataType; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class UuidGenerateV1 extends AbstractRoutine { + + private static final long serialVersionUID = 1L; + + /** + * The parameter public.uuid_generate_v1.RETURN_VALUE. + */ + public static final Parameter RETURN_VALUE = Internal.createParameter("RETURN_VALUE", SQLDataType.UUID, false, false); + + /** + * Create a new routine call instance + */ + public UuidGenerateV1() { + super("uuid_generate_v1", Public.PUBLIC, SQLDataType.UUID); + + setReturnParameter(RETURN_VALUE); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidGenerateV1mc.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidGenerateV1mc.java new file mode 100644 index 00000000..0e38a803 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidGenerateV1mc.java @@ -0,0 +1,38 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.Public; + +import java.util.UUID; + +import org.jooq.Parameter; +import org.jooq.impl.AbstractRoutine; +import org.jooq.impl.Internal; +import org.jooq.impl.SQLDataType; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class UuidGenerateV1mc extends AbstractRoutine { + + private static final long serialVersionUID = 1L; + + /** + * The parameter public.uuid_generate_v1mc.RETURN_VALUE. + */ + public static final Parameter RETURN_VALUE = Internal.createParameter("RETURN_VALUE", SQLDataType.UUID, false, false); + + /** + * Create a new routine call instance + */ + public UuidGenerateV1mc() { + super("uuid_generate_v1mc", Public.PUBLIC, SQLDataType.UUID); + + setReturnParameter(RETURN_VALUE); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidGenerateV3.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidGenerateV3.java new file mode 100644 index 00000000..62fd1b52 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidGenerateV3.java @@ -0,0 +1,81 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.Public; + +import java.util.UUID; + +import org.jooq.Field; +import org.jooq.Parameter; +import org.jooq.impl.AbstractRoutine; +import org.jooq.impl.Internal; +import org.jooq.impl.SQLDataType; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class UuidGenerateV3 extends AbstractRoutine { + + private static final long serialVersionUID = 1L; + + /** + * The parameter public.uuid_generate_v3.RETURN_VALUE. + */ + public static final Parameter RETURN_VALUE = Internal.createParameter("RETURN_VALUE", SQLDataType.UUID, false, false); + + /** + * The parameter public.uuid_generate_v3.namespace. + */ + public static final Parameter NAMESPACE = Internal.createParameter("namespace", SQLDataType.UUID, false, false); + + /** + * The parameter public.uuid_generate_v3.name. + */ + public static final Parameter NAME = Internal.createParameter("name", SQLDataType.CLOB, false, false); + + /** + * Create a new routine call instance + */ + public UuidGenerateV3() { + super("uuid_generate_v3", Public.PUBLIC, SQLDataType.UUID); + + setReturnParameter(RETURN_VALUE); + addInParameter(NAMESPACE); + addInParameter(NAME); + } + + /** + * Set the namespace parameter IN value to the routine + */ + public void setNamespace(UUID value) { + setValue(NAMESPACE, value); + } + + /** + * Set the namespace parameter to the function to be used with + * a {@link org.jooq.Select} statement + */ + public void setNamespace(Field field) { + setField(NAMESPACE, field); + } + + /** + * Set the name parameter IN value to the routine + */ + public void setName_(String value) { + setValue(NAME, value); + } + + /** + * Set the name parameter to the function to be used with a + * {@link org.jooq.Select} statement + */ + public void setName_(Field field) { + setField(NAME, field); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidGenerateV4.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidGenerateV4.java new file mode 100644 index 00000000..c64a6de3 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidGenerateV4.java @@ -0,0 +1,38 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.Public; + +import java.util.UUID; + +import org.jooq.Parameter; +import org.jooq.impl.AbstractRoutine; +import org.jooq.impl.Internal; +import org.jooq.impl.SQLDataType; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class UuidGenerateV4 extends AbstractRoutine { + + private static final long serialVersionUID = 1L; + + /** + * The parameter public.uuid_generate_v4.RETURN_VALUE. + */ + public static final Parameter RETURN_VALUE = Internal.createParameter("RETURN_VALUE", SQLDataType.UUID, false, false); + + /** + * Create a new routine call instance + */ + public UuidGenerateV4() { + super("uuid_generate_v4", Public.PUBLIC, SQLDataType.UUID); + + setReturnParameter(RETURN_VALUE); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidGenerateV5.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidGenerateV5.java new file mode 100644 index 00000000..c55a4499 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidGenerateV5.java @@ -0,0 +1,81 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.Public; + +import java.util.UUID; + +import org.jooq.Field; +import org.jooq.Parameter; +import org.jooq.impl.AbstractRoutine; +import org.jooq.impl.Internal; +import org.jooq.impl.SQLDataType; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class UuidGenerateV5 extends AbstractRoutine { + + private static final long serialVersionUID = 1L; + + /** + * The parameter public.uuid_generate_v5.RETURN_VALUE. + */ + public static final Parameter RETURN_VALUE = Internal.createParameter("RETURN_VALUE", SQLDataType.UUID, false, false); + + /** + * The parameter public.uuid_generate_v5.namespace. + */ + public static final Parameter NAMESPACE = Internal.createParameter("namespace", SQLDataType.UUID, false, false); + + /** + * The parameter public.uuid_generate_v5.name. + */ + public static final Parameter NAME = Internal.createParameter("name", SQLDataType.CLOB, false, false); + + /** + * Create a new routine call instance + */ + public UuidGenerateV5() { + super("uuid_generate_v5", Public.PUBLIC, SQLDataType.UUID); + + setReturnParameter(RETURN_VALUE); + addInParameter(NAMESPACE); + addInParameter(NAME); + } + + /** + * Set the namespace parameter IN value to the routine + */ + public void setNamespace(UUID value) { + setValue(NAMESPACE, value); + } + + /** + * Set the namespace parameter to the function to be used with + * a {@link org.jooq.Select} statement + */ + public void setNamespace(Field field) { + setField(NAMESPACE, field); + } + + /** + * Set the name parameter IN value to the routine + */ + public void setName_(String value) { + setValue(NAME, value); + } + + /** + * Set the name parameter to the function to be used with a + * {@link org.jooq.Select} statement + */ + public void setName_(Field field) { + setField(NAME, field); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidNil.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidNil.java new file mode 100644 index 00000000..436ce4ec --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidNil.java @@ -0,0 +1,38 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.Public; + +import java.util.UUID; + +import org.jooq.Parameter; +import org.jooq.impl.AbstractRoutine; +import org.jooq.impl.Internal; +import org.jooq.impl.SQLDataType; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class UuidNil extends AbstractRoutine { + + private static final long serialVersionUID = 1L; + + /** + * The parameter public.uuid_nil.RETURN_VALUE. + */ + public static final Parameter RETURN_VALUE = Internal.createParameter("RETURN_VALUE", SQLDataType.UUID, false, false); + + /** + * Create a new routine call instance + */ + public UuidNil() { + super("uuid_nil", Public.PUBLIC, SQLDataType.UUID); + + setReturnParameter(RETURN_VALUE); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidNsDns.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidNsDns.java new file mode 100644 index 00000000..c94a3cc7 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidNsDns.java @@ -0,0 +1,38 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.Public; + +import java.util.UUID; + +import org.jooq.Parameter; +import org.jooq.impl.AbstractRoutine; +import org.jooq.impl.Internal; +import org.jooq.impl.SQLDataType; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class UuidNsDns extends AbstractRoutine { + + private static final long serialVersionUID = 1L; + + /** + * The parameter public.uuid_ns_dns.RETURN_VALUE. + */ + public static final Parameter RETURN_VALUE = Internal.createParameter("RETURN_VALUE", SQLDataType.UUID, false, false); + + /** + * Create a new routine call instance + */ + public UuidNsDns() { + super("uuid_ns_dns", Public.PUBLIC, SQLDataType.UUID); + + setReturnParameter(RETURN_VALUE); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidNsOid.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidNsOid.java new file mode 100644 index 00000000..e901b279 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidNsOid.java @@ -0,0 +1,38 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.Public; + +import java.util.UUID; + +import org.jooq.Parameter; +import org.jooq.impl.AbstractRoutine; +import org.jooq.impl.Internal; +import org.jooq.impl.SQLDataType; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class UuidNsOid extends AbstractRoutine { + + private static final long serialVersionUID = 1L; + + /** + * The parameter public.uuid_ns_oid.RETURN_VALUE. + */ + public static final Parameter RETURN_VALUE = Internal.createParameter("RETURN_VALUE", SQLDataType.UUID, false, false); + + /** + * Create a new routine call instance + */ + public UuidNsOid() { + super("uuid_ns_oid", Public.PUBLIC, SQLDataType.UUID); + + setReturnParameter(RETURN_VALUE); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidNsUrl.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidNsUrl.java new file mode 100644 index 00000000..4c2b21ef --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidNsUrl.java @@ -0,0 +1,38 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.Public; + +import java.util.UUID; + +import org.jooq.Parameter; +import org.jooq.impl.AbstractRoutine; +import org.jooq.impl.Internal; +import org.jooq.impl.SQLDataType; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class UuidNsUrl extends AbstractRoutine { + + private static final long serialVersionUID = 1L; + + /** + * The parameter public.uuid_ns_url.RETURN_VALUE. + */ + public static final Parameter RETURN_VALUE = Internal.createParameter("RETURN_VALUE", SQLDataType.UUID, false, false); + + /** + * Create a new routine call instance + */ + public UuidNsUrl() { + super("uuid_ns_url", Public.PUBLIC, SQLDataType.UUID); + + setReturnParameter(RETURN_VALUE); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidNsX500.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidNsX500.java new file mode 100644 index 00000000..7dfd358a --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/routines/UuidNsX500.java @@ -0,0 +1,38 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.routines; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.Public; + +import java.util.UUID; + +import org.jooq.Parameter; +import org.jooq.impl.AbstractRoutine; +import org.jooq.impl.Internal; +import org.jooq.impl.SQLDataType; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class UuidNsX500 extends AbstractRoutine { + + private static final long serialVersionUID = 1L; + + /** + * The parameter public.uuid_ns_x500.RETURN_VALUE. + */ + public static final Parameter RETURN_VALUE = Internal.createParameter("RETURN_VALUE", SQLDataType.UUID, false, false); + + /** + * Create a new routine call instance + */ + public UuidNsX500() { + super("uuid_ns_x500", Public.PUBLIC, SQLDataType.UUID); + + setReturnParameter(RETURN_VALUE); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/tables/Files.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/tables/Files.java new file mode 100644 index 00000000..50a0e23a --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/tables/Files.java @@ -0,0 +1,239 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.Keys; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.Public; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.records.FilesRecord; + +import java.util.Collection; + +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; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class Files extends TableImpl { + + private static final long serialVersionUID = 1L; + + /** + * The reference instance of public.files + */ + public static final Files FILES = new Files(); + + /** + * The class holding records for this type + */ + @Override + public Class getRecordType() { + return FilesRecord.class; + } + + /** + * The column public.files.file_id. + */ + public final TableField FILE_ID = createField(DSL.name("file_id"), SQLDataType.BIGINT.nullable(false).identity(true), this, ""); + + /** + * The column public.files.file. + */ + public final TableField FILE = createField(DSL.name("file"), SQLDataType.BLOB, this, ""); + + /** + * The column public.files.file_name. + */ + public final TableField FILE_NAME = createField(DSL.name("file_name"), SQLDataType.VARCHAR(10000), this, ""); + + /** + * The column public.files.interaction_log_id. + */ + public final TableField INTERACTION_LOG_ID = createField(DSL.name("interaction_log_id"), SQLDataType.BIGINT, this, ""); + + private Files(Name alias, Table aliased) { + this(alias, aliased, (Field[]) null, null); + } + + private Files(Name alias, Table aliased, Field[] parameters, Condition where) { + super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); + } + + /** + * Create an aliased public.files table reference + */ + public Files(String alias) { + this(DSL.name(alias), FILES); + } + + /** + * Create an aliased public.files table reference + */ + public Files(Name alias) { + this(alias, FILES); + } + + /** + * Create a public.files table reference + */ + public Files() { + this(DSL.name("files"), null); + } + + @Override + public Schema getSchema() { + return aliased() ? null : Public.PUBLIC; + } + + @Override + public Identity getIdentity() { + return (Identity) super.getIdentity(); + } + + @Override + public UniqueKey getPrimaryKey() { + return Keys.FILES_PKEY; + } + + @Override + public Files as(String alias) { + return new Files(DSL.name(alias), this); + } + + @Override + public Files as(Name alias) { + return new Files(alias, this); + } + + @Override + public Files as(Table alias) { + return new Files(alias.getQualifiedName(), this); + } + + /** + * Rename this table + */ + @Override + public Files rename(String name) { + return new Files(DSL.name(name), null); + } + + /** + * Rename this table + */ + @Override + public Files rename(Name name) { + return new Files(name, null); + } + + /** + * Rename this table + */ + @Override + public Files rename(Table name) { + return new Files(name.getQualifiedName(), null); + } + + /** + * Create an inline derived table from this table + */ + @Override + public Files where(Condition condition) { + return new Files(getQualifiedName(), aliased() ? this : null, null, condition); + } + + /** + * Create an inline derived table from this table + */ + @Override + public Files where(Collection conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public Files where(Condition... conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public Files where(Field condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public Files where(SQL condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public Files where(@Stringly.SQL String condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public Files where(@Stringly.SQL String condition, Object... binds) { + return where(DSL.condition(condition, binds)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public Files where(@Stringly.SQL String condition, QueryPart... parts) { + return where(DSL.condition(condition, parts)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public Files whereExists(Select select) { + return where(DSL.exists(select)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public Files whereNotExists(Select select) { + return where(DSL.notExists(select)); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/tables/InteractionLog.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/tables/InteractionLog.java index cba66658..68d8ac43 100644 --- a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/tables/InteractionLog.java +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/tables/InteractionLog.java @@ -61,11 +61,6 @@ public class InteractionLog extends TableImpl { */ public final TableField SENT_DATE = createField(DSL.name("sent_date"), SQLDataType.TIMESTAMP(0), this, ""); - /** - * The column public.interaction_log.file_name. - */ - public final TableField FILE_NAME = createField(DSL.name("file_name"), SQLDataType.CLOB, this, ""); - /** * The column public.interaction_log.form. */ @@ -91,6 +86,21 @@ public class InteractionLog extends TableImpl { */ public final TableField RECORDS_ACCEPTED = createField(DSL.name("records_accepted"), SQLDataType.INTEGER, this, ""); + /** + * The column public.interaction_log.file_name. + */ + public final TableField FILE_NAME = createField(DSL.name("file_name"), SQLDataType.CLOB, this, ""); + + /** + * The column public.interaction_log.file_id. + */ + public final TableField FILE_ID = createField(DSL.name("file_id"), SQLDataType.VARCHAR(36), this, ""); + + /** + * The column public.interaction_log.ervu_id. + */ + public final TableField ERVU_ID = createField(DSL.name("ervu_id"), SQLDataType.VARCHAR(36), this, ""); + private InteractionLog(Name alias, Table aliased) { this(alias, aliased, (Field[]) null, null); } diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/tables/OkopfRecords.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/tables/OkopfRecords.java new file mode 100644 index 00000000..67e06a92 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/tables/OkopfRecords.java @@ -0,0 +1,235 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.Keys; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.Public; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.records.OkopfRecordsRecord; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import org.jooq.Condition; +import org.jooq.Field; +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; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class OkopfRecords extends TableImpl { + + private static final long serialVersionUID = 1L; + + /** + * The reference instance of public.okopf_records + */ + public static final OkopfRecords OKOPF_RECORDS = new OkopfRecords(); + + /** + * The class holding records for this type + */ + @Override + public Class getRecordType() { + return OkopfRecordsRecord.class; + } + + /** + * The column public.okopf_records.okopf_records_id. + */ + public final TableField OKOPF_RECORDS_ID = createField(DSL.name("okopf_records_id"), SQLDataType.VARCHAR.nullable(false), this, ""); + + /** + * The column public.okopf_records.name. + */ + public final TableField NAME = createField(DSL.name("name"), SQLDataType.VARCHAR, this, ""); + + /** + * The column public.okopf_records.version. + */ + public final TableField VERSION = createField(DSL.name("version"), SQLDataType.INTEGER.nullable(false), this, ""); + + private OkopfRecords(Name alias, Table aliased) { + this(alias, aliased, (Field[]) null, null); + } + + private OkopfRecords(Name alias, Table aliased, Field[] parameters, Condition where) { + super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table(), where); + } + + /** + * Create an aliased public.okopf_records table reference + */ + public OkopfRecords(String alias) { + this(DSL.name(alias), OKOPF_RECORDS); + } + + /** + * Create an aliased public.okopf_records table reference + */ + public OkopfRecords(Name alias) { + this(alias, OKOPF_RECORDS); + } + + /** + * Create a public.okopf_records table reference + */ + public OkopfRecords() { + this(DSL.name("okopf_records"), null); + } + + @Override + public Schema getSchema() { + return aliased() ? null : Public.PUBLIC; + } + + @Override + public UniqueKey getPrimaryKey() { + return Keys.OKOPF_RECORDS_PKEY; + } + + @Override + public List> getUniqueKeys() { + return Arrays.asList(Keys.OKOPF_RECORDS_NAME_KEY); + } + + @Override + public OkopfRecords as(String alias) { + return new OkopfRecords(DSL.name(alias), this); + } + + @Override + public OkopfRecords as(Name alias) { + return new OkopfRecords(alias, this); + } + + @Override + public OkopfRecords as(Table alias) { + return new OkopfRecords(alias.getQualifiedName(), this); + } + + /** + * Rename this table + */ + @Override + public OkopfRecords rename(String name) { + return new OkopfRecords(DSL.name(name), null); + } + + /** + * Rename this table + */ + @Override + public OkopfRecords rename(Name name) { + return new OkopfRecords(name, null); + } + + /** + * Rename this table + */ + @Override + public OkopfRecords rename(Table name) { + return new OkopfRecords(name.getQualifiedName(), null); + } + + /** + * Create an inline derived table from this table + */ + @Override + public OkopfRecords where(Condition condition) { + return new OkopfRecords(getQualifiedName(), aliased() ? this : null, null, condition); + } + + /** + * Create an inline derived table from this table + */ + @Override + public OkopfRecords where(Collection conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public OkopfRecords where(Condition... conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public OkopfRecords where(Field condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public OkopfRecords where(SQL condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public OkopfRecords where(@Stringly.SQL String condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public OkopfRecords where(@Stringly.SQL String condition, Object... binds) { + return where(DSL.condition(condition, binds)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public OkopfRecords where(@Stringly.SQL String condition, QueryPart... parts) { + return where(DSL.condition(condition, parts)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public OkopfRecords whereExists(Select select) { + return where(DSL.exists(select)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public OkopfRecords whereNotExists(Select select) { + return where(DSL.notExists(select)); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/tables/records/FilesRecord.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/tables/records/FilesRecord.java new file mode 100644 index 00000000..504b1ec2 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/tables/records/FilesRecord.java @@ -0,0 +1,109 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.records; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.Files; + +import org.jooq.Record1; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class FilesRecord extends UpdatableRecordImpl { + + private static final long serialVersionUID = 1L; + + /** + * Setter for public.files.file_id. + */ + public void setFileId(Long value) { + set(0, value); + } + + /** + * Getter for public.files.file_id. + */ + public Long getFileId() { + return (Long) get(0); + } + + /** + * Setter for public.files.file. + */ + public void setFile(byte[] value) { + set(1, value); + } + + /** + * Getter for public.files.file. + */ + public byte[] getFile() { + return (byte[]) get(1); + } + + /** + * Setter for public.files.file_name. + */ + public void setFileName(String value) { + set(2, value); + } + + /** + * Getter for public.files.file_name. + */ + public String getFileName() { + return (String) get(2); + } + + /** + * Setter for public.files.interaction_log_id. + */ + public void setInteractionLogId(Long value) { + set(3, value); + } + + /** + * Getter for public.files.interaction_log_id. + */ + public Long getInteractionLogId() { + return (Long) get(3); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + @Override + public Record1 key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached FilesRecord + */ + public FilesRecord() { + super(Files.FILES); + } + + /** + * Create a detached, initialised FilesRecord + */ + public FilesRecord(Long fileId, byte[] file, String fileName, Long interactionLogId) { + super(Files.FILES); + + setFileId(fileId); + setFile(file); + setFileName(fileName); + setInteractionLogId(interactionLogId); + resetChangedOnNotNull(); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/tables/records/InteractionLogRecord.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/tables/records/InteractionLogRecord.java index b6c2f853..10553186 100644 --- a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/tables/records/InteractionLogRecord.java +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/public_/tables/records/InteractionLogRecord.java @@ -48,88 +48,116 @@ public class InteractionLogRecord extends UpdatableRecordImplpublic.interaction_log.file_name. - */ - public void setFileName(String value) { - set(2, value); - } - - /** - * Getter for public.interaction_log.file_name. - */ - public String getFileName() { - return (String) get(2); - } - /** * Setter for public.interaction_log.form. */ public void setForm(String value) { - set(3, value); + set(2, value); } /** * Getter for public.interaction_log.form. */ public String getForm() { - return (String) get(3); + return (String) get(2); } /** * Setter for public.interaction_log.sender. */ public void setSender(String value) { - set(4, value); + set(3, value); } /** * Getter for public.interaction_log.sender. */ public String getSender() { - return (String) get(4); + return (String) get(3); } /** * Setter for public.interaction_log.status. */ public void setStatus(String value) { - set(5, value); + set(4, value); } /** * Getter for public.interaction_log.status. */ public String getStatus() { - return (String) get(5); + return (String) get(4); } /** * Setter for public.interaction_log.records_sent. */ public void setRecordsSent(Integer value) { - set(6, value); + set(5, value); } /** * Getter for public.interaction_log.records_sent. */ public Integer getRecordsSent() { - return (Integer) get(6); + return (Integer) get(5); } /** * Setter for public.interaction_log.records_accepted. */ public void setRecordsAccepted(Integer value) { - set(7, value); + set(6, value); } /** * Getter for public.interaction_log.records_accepted. */ public Integer getRecordsAccepted() { - return (Integer) get(7); + return (Integer) get(6); + } + + /** + * Setter for public.interaction_log.file_name. + */ + public void setFileName(String value) { + set(7, value); + } + + /** + * Getter for public.interaction_log.file_name. + */ + public String getFileName() { + return (String) get(7); + } + + /** + * Setter for public.interaction_log.file_id. + */ + public void setFileId(String value) { + set(8, value); + } + + /** + * Getter for public.interaction_log.file_id. + */ + public String getFileId() { + return (String) get(8); + } + + /** + * Setter for public.interaction_log.ervu_id. + */ + public void setErvuId(String value) { + set(9, value); + } + + /** + * Getter for public.interaction_log.ervu_id. + */ + public String getErvuId() { + return (String) get(9); } // ------------------------------------------------------------------------- @@ -155,17 +183,19 @@ public class InteractionLogRecord extends UpdatableRecordImpl { + + private static final long serialVersionUID = 1L; + + /** + * Setter for public.okopf_records.okopf_records_id. + */ + public void setOkopfRecordsId(String value) { + set(0, value); + } + + /** + * Getter for public.okopf_records.okopf_records_id. + */ + public String getOkopfRecordsId() { + return (String) get(0); + } + + /** + * Setter for public.okopf_records.name. + */ + public void setName(String value) { + set(1, value); + } + + /** + * Getter for public.okopf_records.name. + */ + public String getName() { + return (String) get(1); + } + + /** + * Setter for public.okopf_records.version. + */ + public void setVersion(Integer value) { + set(2, value); + } + + /** + * Getter for public.okopf_records.version. + */ + public Integer getVersion() { + return (Integer) get(2); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + @Override + public Record1 key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached OkopfRecordsRecord + */ + public OkopfRecordsRecord() { + super(OkopfRecords.OKOPF_RECORDS); + } + + /** + * Create a detached, initialised OkopfRecordsRecord + */ + public OkopfRecordsRecord(String okopfRecordsId, String name, Integer version) { + super(OkopfRecords.OKOPF_RECORDS); + + setOkopfRecordsId(okopfRecordsId); + setName(name); + setVersion(version); + resetChangedOnNotNull(); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/Keys.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/Keys.java new file mode 100644 index 00000000..db51bd83 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/Keys.java @@ -0,0 +1,34 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.AppearSubppoena; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.ConsiderationComplaint; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.Recruitment; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.records.AppearSubppoenaRecord; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.records.ConsiderationComplaintRecord; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.records.RecruitmentRecord; + +import org.jooq.TableField; +import org.jooq.UniqueKey; +import org.jooq.impl.DSL; +import org.jooq.impl.Internal; + + +/** + * A class modelling foreign key relationships and constraints of tables in + * ratings. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class Keys { + + // ------------------------------------------------------------------------- + // UNIQUE and PRIMARY KEY definitions + // ------------------------------------------------------------------------- + + public static final UniqueKey PK_APPEAR_SUBPPOENA = Internal.createUniqueKey(AppearSubppoena.APPEAR_SUBPPOENA, DSL.name("pk_appear_subppoena"), new TableField[] { AppearSubppoena.APPEAR_SUBPPOENA.ID_APPEAR_SUBPPOENA }, true); + public static final UniqueKey PK_CONSIDERATION_COMPLAINT = Internal.createUniqueKey(ConsiderationComplaint.CONSIDERATION_COMPLAINT, DSL.name("pk_consideration_complaint"), new TableField[] { ConsiderationComplaint.CONSIDERATION_COMPLAINT.ID_CONSIDERATION_COMPLAINT }, true); + public static final UniqueKey PK_RECRUITMENT = Internal.createUniqueKey(Recruitment.RECRUITMENT, DSL.name("pk_recruitment"), new TableField[] { Recruitment.RECRUITMENT.ID_RECRUITMENT }, true); +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/Ratings.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/Ratings.java new file mode 100644 index 00000000..a04d3f34 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/Ratings.java @@ -0,0 +1,69 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.DefaultCatalog; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.AppearSubppoena; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.ConsiderationComplaint; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.Recruitment; + +import java.util.Arrays; +import java.util.List; + +import org.jooq.Catalog; +import org.jooq.Table; +import org.jooq.impl.SchemaImpl; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class Ratings extends SchemaImpl { + + private static final long serialVersionUID = 1L; + + /** + * The reference instance of ratings + */ + public static final Ratings RATINGS = new Ratings(); + + /** + * Явка по повестке уровень РФ + */ + public final AppearSubppoena APPEAR_SUBPPOENA = AppearSubppoena.APPEAR_SUBPPOENA; + + /** + * Рассмотрение жалоб уровень РФ + */ + public final ConsiderationComplaint CONSIDERATION_COMPLAINT = ConsiderationComplaint.CONSIDERATION_COMPLAINT; + + /** + * Призыв уровень РФ + */ + public final Recruitment RECRUITMENT = Recruitment.RECRUITMENT; + + /** + * No further instances allowed + */ + private Ratings() { + super("ratings", null); + } + + + @Override + public Catalog getCatalog() { + return DefaultCatalog.DEFAULT_CATALOG; + } + + @Override + public final List> getTables() { + return Arrays.asList( + AppearSubppoena.APPEAR_SUBPPOENA, + ConsiderationComplaint.CONSIDERATION_COMPLAINT, + Recruitment.RECRUITMENT + ); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/Tables.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/Tables.java new file mode 100644 index 00000000..91935a45 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/Tables.java @@ -0,0 +1,32 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.AppearSubppoena; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.ConsiderationComplaint; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.Recruitment; + + +/** + * Convenience access to all tables in ratings. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class Tables { + + /** + * Явка по повестке уровень РФ + */ + public static final AppearSubppoena APPEAR_SUBPPOENA = AppearSubppoena.APPEAR_SUBPPOENA; + + /** + * Рассмотрение жалоб уровень РФ + */ + public static final ConsiderationComplaint CONSIDERATION_COMPLAINT = ConsiderationComplaint.CONSIDERATION_COMPLAINT; + + /** + * Призыв уровень РФ + */ + public static final Recruitment RECRUITMENT = Recruitment.RECRUITMENT; +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/tables/AppearSubppoena.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/tables/AppearSubppoena.java new file mode 100644 index 00000000..1a22250c --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/tables/AppearSubppoena.java @@ -0,0 +1,255 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.Keys; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.Ratings; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.records.AppearSubppoenaRecord; + +import java.math.BigDecimal; +import java.sql.Date; +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; + + +/** + * Явка по повестке уровень РФ + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class AppearSubppoena extends TableImpl { + + private static final long serialVersionUID = 1L; + + /** + * The reference instance of ratings.appear_subppoena + */ + public static final AppearSubppoena APPEAR_SUBPPOENA = new AppearSubppoena(); + + /** + * The class holding records for this type + */ + @Override + public Class getRecordType() { + return AppearSubppoenaRecord.class; + } + + /** + * The column ratings.appear_subppoena.id_appear_subppoena. + */ + public final TableField ID_APPEAR_SUBPPOENA = createField(DSL.name("id_appear_subppoena"), SQLDataType.BIGINT.nullable(false).identity(true), this, ""); + + /** + * The column ratings.appear_subppoena.id_region. + */ + public final TableField ID_REGION = createField(DSL.name("id_region"), SQLDataType.INTEGER, this, ""); + + /** + * The column ratings.appear_subppoena.appear_mil_com. Явка в + * военкомат + */ + public final TableField APPEAR_MIL_COM = createField(DSL.name("appear_mil_com"), SQLDataType.NUMERIC, this, "Явка в военкомат"); + + /** + * The column ratings.appear_subppoena.recording_date. Дата + * записи + */ + public final TableField RECORDING_DATE = createField(DSL.name("recording_date"), SQLDataType.DATE, this, "Дата записи"); + + /** + * The column ratings.appear_subppoena.appear_mil_com_percent. + * Явка в военкомат в процентах + */ + public final TableField APPEAR_MIL_COM_PERCENT = createField(DSL.name("appear_mil_com_percent"), SQLDataType.NUMERIC, this, "Явка в военкомат в процентах"); + + /** + * The column ratings.appear_subppoena.recruitment_id. + */ + public final TableField RECRUITMENT_ID = createField(DSL.name("recruitment_id"), SQLDataType.UUID, this, ""); + + private AppearSubppoena(Name alias, Table aliased) { + this(alias, aliased, (Field[]) null, null); + } + + private AppearSubppoena(Name alias, Table aliased, Field[] parameters, Condition where) { + super(alias, null, aliased, parameters, DSL.comment("Явка по повестке уровень РФ"), TableOptions.table(), where); + } + + /** + * Create an aliased ratings.appear_subppoena table reference + */ + public AppearSubppoena(String alias) { + this(DSL.name(alias), APPEAR_SUBPPOENA); + } + + /** + * Create an aliased ratings.appear_subppoena table reference + */ + public AppearSubppoena(Name alias) { + this(alias, APPEAR_SUBPPOENA); + } + + /** + * Create a ratings.appear_subppoena table reference + */ + public AppearSubppoena() { + this(DSL.name("appear_subppoena"), null); + } + + @Override + public Schema getSchema() { + return aliased() ? null : Ratings.RATINGS; + } + + @Override + public Identity getIdentity() { + return (Identity) super.getIdentity(); + } + + @Override + public UniqueKey getPrimaryKey() { + return Keys.PK_APPEAR_SUBPPOENA; + } + + @Override + public AppearSubppoena as(String alias) { + return new AppearSubppoena(DSL.name(alias), this); + } + + @Override + public AppearSubppoena as(Name alias) { + return new AppearSubppoena(alias, this); + } + + @Override + public AppearSubppoena as(Table alias) { + return new AppearSubppoena(alias.getQualifiedName(), this); + } + + /** + * Rename this table + */ + @Override + public AppearSubppoena rename(String name) { + return new AppearSubppoena(DSL.name(name), null); + } + + /** + * Rename this table + */ + @Override + public AppearSubppoena rename(Name name) { + return new AppearSubppoena(name, null); + } + + /** + * Rename this table + */ + @Override + public AppearSubppoena rename(Table name) { + return new AppearSubppoena(name.getQualifiedName(), null); + } + + /** + * Create an inline derived table from this table + */ + @Override + public AppearSubppoena where(Condition condition) { + return new AppearSubppoena(getQualifiedName(), aliased() ? this : null, null, condition); + } + + /** + * Create an inline derived table from this table + */ + @Override + public AppearSubppoena where(Collection conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public AppearSubppoena where(Condition... conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public AppearSubppoena where(Field condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public AppearSubppoena where(SQL condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public AppearSubppoena where(@Stringly.SQL String condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public AppearSubppoena where(@Stringly.SQL String condition, Object... binds) { + return where(DSL.condition(condition, binds)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public AppearSubppoena where(@Stringly.SQL String condition, QueryPart... parts) { + return where(DSL.condition(condition, parts)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public AppearSubppoena whereExists(Select select) { + return where(DSL.exists(select)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public AppearSubppoena whereNotExists(Select select) { + return where(DSL.notExists(select)); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/tables/ConsiderationComplaint.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/tables/ConsiderationComplaint.java new file mode 100644 index 00000000..632f2b81 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/tables/ConsiderationComplaint.java @@ -0,0 +1,260 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.Keys; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.Ratings; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.records.ConsiderationComplaintRecord; + +import java.math.BigDecimal; +import java.sql.Date; +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; + + +/** + * Рассмотрение жалоб уровень РФ + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class ConsiderationComplaint extends TableImpl { + + private static final long serialVersionUID = 1L; + + /** + * The reference instance of ratings.consideration_complaint + */ + public static final ConsiderationComplaint CONSIDERATION_COMPLAINT = new ConsiderationComplaint(); + + /** + * The class holding records for this type + */ + @Override + public Class getRecordType() { + return ConsiderationComplaintRecord.class; + } + + /** + * The column + * ratings.consideration_complaint.id_consideration_complaint. + */ + public final TableField ID_CONSIDERATION_COMPLAINT = createField(DSL.name("id_consideration_complaint"), SQLDataType.BIGINT.nullable(false).identity(true), this, ""); + + /** + * The column ratings.consideration_complaint.id_region. + */ + public final TableField ID_REGION = createField(DSL.name("id_region"), SQLDataType.INTEGER, this, ""); + + /** + * The column + * ratings.consideration_complaint.consideration_complaint. + * Рассмотрение жалоб + */ + public final TableField CONSIDERATION_COMPLAINT_ = createField(DSL.name("consideration_complaint"), SQLDataType.NUMERIC, this, "Рассмотрение жалоб"); + + /** + * The column ratings.consideration_complaint.recording_date. + * Дата записи + */ + public final TableField RECORDING_DATE = createField(DSL.name("recording_date"), SQLDataType.DATE, this, "Дата записи"); + + /** + * The column + * ratings.consideration_complaint.consideration_complaint_percent. + * Рассмотрение жалоб в процентах + */ + public final TableField CONSIDERATION_COMPLAINT_PERCENT = createField(DSL.name("consideration_complaint_percent"), SQLDataType.NUMERIC, this, "Рассмотрение жалоб в процентах"); + + /** + * The column ratings.consideration_complaint.recruitment_id. + */ + public final TableField RECRUITMENT_ID = createField(DSL.name("recruitment_id"), SQLDataType.UUID, this, ""); + + private ConsiderationComplaint(Name alias, Table aliased) { + this(alias, aliased, (Field[]) null, null); + } + + private ConsiderationComplaint(Name alias, Table aliased, Field[] parameters, Condition where) { + super(alias, null, aliased, parameters, DSL.comment("Рассмотрение жалоб уровень РФ"), TableOptions.table(), where); + } + + /** + * Create an aliased ratings.consideration_complaint table + * reference + */ + public ConsiderationComplaint(String alias) { + this(DSL.name(alias), CONSIDERATION_COMPLAINT); + } + + /** + * Create an aliased ratings.consideration_complaint table + * reference + */ + public ConsiderationComplaint(Name alias) { + this(alias, CONSIDERATION_COMPLAINT); + } + + /** + * Create a ratings.consideration_complaint table reference + */ + public ConsiderationComplaint() { + this(DSL.name("consideration_complaint"), null); + } + + @Override + public Schema getSchema() { + return aliased() ? null : Ratings.RATINGS; + } + + @Override + public Identity getIdentity() { + return (Identity) super.getIdentity(); + } + + @Override + public UniqueKey getPrimaryKey() { + return Keys.PK_CONSIDERATION_COMPLAINT; + } + + @Override + public ConsiderationComplaint as(String alias) { + return new ConsiderationComplaint(DSL.name(alias), this); + } + + @Override + public ConsiderationComplaint as(Name alias) { + return new ConsiderationComplaint(alias, this); + } + + @Override + public ConsiderationComplaint as(Table alias) { + return new ConsiderationComplaint(alias.getQualifiedName(), this); + } + + /** + * Rename this table + */ + @Override + public ConsiderationComplaint rename(String name) { + return new ConsiderationComplaint(DSL.name(name), null); + } + + /** + * Rename this table + */ + @Override + public ConsiderationComplaint rename(Name name) { + return new ConsiderationComplaint(name, null); + } + + /** + * Rename this table + */ + @Override + public ConsiderationComplaint rename(Table name) { + return new ConsiderationComplaint(name.getQualifiedName(), null); + } + + /** + * Create an inline derived table from this table + */ + @Override + public ConsiderationComplaint where(Condition condition) { + return new ConsiderationComplaint(getQualifiedName(), aliased() ? this : null, null, condition); + } + + /** + * Create an inline derived table from this table + */ + @Override + public ConsiderationComplaint where(Collection conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public ConsiderationComplaint where(Condition... conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public ConsiderationComplaint where(Field condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public ConsiderationComplaint where(SQL condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public ConsiderationComplaint where(@Stringly.SQL String condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public ConsiderationComplaint where(@Stringly.SQL String condition, Object... binds) { + return where(DSL.condition(condition, binds)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public ConsiderationComplaint where(@Stringly.SQL String condition, QueryPart... parts) { + return where(DSL.condition(condition, parts)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public ConsiderationComplaint whereExists(Select select) { + return where(DSL.exists(select)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public ConsiderationComplaint whereNotExists(Select select) { + return where(DSL.notExists(select)); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/tables/Recruitment.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/tables/Recruitment.java new file mode 100644 index 00000000..f557c1d8 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/tables/Recruitment.java @@ -0,0 +1,259 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.Keys; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.Ratings; +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.records.RecruitmentRecord; + +import java.math.BigDecimal; +import java.sql.Date; +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; + + +/** + * Призыв уровень РФ + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class Recruitment extends TableImpl { + + private static final long serialVersionUID = 1L; + + /** + * The reference instance of ratings.recruitment + */ + public static final Recruitment RECRUITMENT = new Recruitment(); + + /** + * The class holding records for this type + */ + @Override + public Class getRecordType() { + return RecruitmentRecord.class; + } + + /** + * The column ratings.recruitment.id_recruitment. + */ + public final TableField ID_RECRUITMENT = createField(DSL.name("id_recruitment"), SQLDataType.BIGINT.nullable(false).identity(true), this, ""); + + /** + * The column ratings.recruitment.id_region. + */ + public final TableField ID_REGION = createField(DSL.name("id_region"), SQLDataType.INTEGER, this, ""); + + /** + * The column ratings.recruitment.execution. Исполнение плана + * призыва + */ + public final TableField EXECUTION = createField(DSL.name("execution"), SQLDataType.NUMERIC, this, "Исполнение плана призыва"); + + /** + * The column ratings.recruitment.spring_autumn. Осень/весна + */ + public final TableField SPRING_AUTUMN = createField(DSL.name("spring_autumn"), SQLDataType.CLOB, this, "Осень/весна"); + + /** + * The column ratings.recruitment.recording_date. Дата записи + */ + public final TableField RECORDING_DATE = createField(DSL.name("recording_date"), SQLDataType.DATE, this, "Дата записи"); + + /** + * The column ratings.recruitment.execution_percent. Исолнение + * плана призыва в процентах + */ + public final TableField EXECUTION_PERCENT = createField(DSL.name("execution_percent"), SQLDataType.NUMERIC, this, "Исолнение плана призыва в процентах"); + + /** + * The column ratings.recruitment.recruitment_id. + */ + public final TableField RECRUITMENT_ID = createField(DSL.name("recruitment_id"), SQLDataType.UUID, this, ""); + + private Recruitment(Name alias, Table aliased) { + this(alias, aliased, (Field[]) null, null); + } + + private Recruitment(Name alias, Table aliased, Field[] parameters, Condition where) { + super(alias, null, aliased, parameters, DSL.comment("Призыв уровень РФ"), TableOptions.table(), where); + } + + /** + * Create an aliased ratings.recruitment table reference + */ + public Recruitment(String alias) { + this(DSL.name(alias), RECRUITMENT); + } + + /** + * Create an aliased ratings.recruitment table reference + */ + public Recruitment(Name alias) { + this(alias, RECRUITMENT); + } + + /** + * Create a ratings.recruitment table reference + */ + public Recruitment() { + this(DSL.name("recruitment"), null); + } + + @Override + public Schema getSchema() { + return aliased() ? null : Ratings.RATINGS; + } + + @Override + public Identity getIdentity() { + return (Identity) super.getIdentity(); + } + + @Override + public UniqueKey getPrimaryKey() { + return Keys.PK_RECRUITMENT; + } + + @Override + public Recruitment as(String alias) { + return new Recruitment(DSL.name(alias), this); + } + + @Override + public Recruitment as(Name alias) { + return new Recruitment(alias, this); + } + + @Override + public Recruitment as(Table alias) { + return new Recruitment(alias.getQualifiedName(), this); + } + + /** + * Rename this table + */ + @Override + public Recruitment rename(String name) { + return new Recruitment(DSL.name(name), null); + } + + /** + * Rename this table + */ + @Override + public Recruitment rename(Name name) { + return new Recruitment(name, null); + } + + /** + * Rename this table + */ + @Override + public Recruitment rename(Table name) { + return new Recruitment(name.getQualifiedName(), null); + } + + /** + * Create an inline derived table from this table + */ + @Override + public Recruitment where(Condition condition) { + return new Recruitment(getQualifiedName(), aliased() ? this : null, null, condition); + } + + /** + * Create an inline derived table from this table + */ + @Override + public Recruitment where(Collection conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public Recruitment where(Condition... conditions) { + return where(DSL.and(conditions)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public Recruitment where(Field condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public Recruitment where(SQL condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public Recruitment where(@Stringly.SQL String condition) { + return where(DSL.condition(condition)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public Recruitment where(@Stringly.SQL String condition, Object... binds) { + return where(DSL.condition(condition, binds)); + } + + /** + * Create an inline derived table from this table + */ + @Override + @PlainSQL + public Recruitment where(@Stringly.SQL String condition, QueryPart... parts) { + return where(DSL.condition(condition, parts)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public Recruitment whereExists(Select select) { + return where(DSL.exists(select)); + } + + /** + * Create an inline derived table from this table + */ + @Override + public Recruitment whereNotExists(Select select) { + return where(DSL.notExists(select)); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/tables/records/AppearSubppoenaRecord.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/tables/records/AppearSubppoenaRecord.java new file mode 100644 index 00000000..65f9def6 --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/tables/records/AppearSubppoenaRecord.java @@ -0,0 +1,149 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.records; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.AppearSubppoena; + +import java.math.BigDecimal; +import java.sql.Date; +import java.util.UUID; + +import org.jooq.Record1; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * Явка по повестке уровень РФ + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class AppearSubppoenaRecord extends UpdatableRecordImpl { + + private static final long serialVersionUID = 1L; + + /** + * Setter for ratings.appear_subppoena.id_appear_subppoena. + */ + public void setIdAppearSubppoena(Long value) { + set(0, value); + } + + /** + * Getter for ratings.appear_subppoena.id_appear_subppoena. + */ + public Long getIdAppearSubppoena() { + return (Long) get(0); + } + + /** + * Setter for ratings.appear_subppoena.id_region. + */ + public void setIdRegion(Integer value) { + set(1, value); + } + + /** + * Getter for ratings.appear_subppoena.id_region. + */ + public Integer getIdRegion() { + return (Integer) get(1); + } + + /** + * Setter for ratings.appear_subppoena.appear_mil_com. Явка в + * военкомат + */ + public void setAppearMilCom(BigDecimal value) { + set(2, value); + } + + /** + * Getter for ratings.appear_subppoena.appear_mil_com. Явка в + * военкомат + */ + public BigDecimal getAppearMilCom() { + return (BigDecimal) get(2); + } + + /** + * Setter for ratings.appear_subppoena.recording_date. Дата + * записи + */ + public void setRecordingDate(Date value) { + set(3, value); + } + + /** + * Getter for ratings.appear_subppoena.recording_date. Дата + * записи + */ + public Date getRecordingDate() { + return (Date) get(3); + } + + /** + * Setter for ratings.appear_subppoena.appear_mil_com_percent. + * Явка в военкомат в процентах + */ + public void setAppearMilComPercent(BigDecimal value) { + set(4, value); + } + + /** + * Getter for ratings.appear_subppoena.appear_mil_com_percent. + * Явка в военкомат в процентах + */ + public BigDecimal getAppearMilComPercent() { + return (BigDecimal) get(4); + } + + /** + * Setter for ratings.appear_subppoena.recruitment_id. + */ + public void setRecruitmentId(UUID value) { + set(5, value); + } + + /** + * Getter for ratings.appear_subppoena.recruitment_id. + */ + public UUID getRecruitmentId() { + return (UUID) get(5); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + @Override + public Record1 key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached AppearSubppoenaRecord + */ + public AppearSubppoenaRecord() { + super(AppearSubppoena.APPEAR_SUBPPOENA); + } + + /** + * Create a detached, initialised AppearSubppoenaRecord + */ + public AppearSubppoenaRecord(Long idAppearSubppoena, Integer idRegion, BigDecimal appearMilCom, Date recordingDate, BigDecimal appearMilComPercent, UUID recruitmentId) { + super(AppearSubppoena.APPEAR_SUBPPOENA); + + setIdAppearSubppoena(idAppearSubppoena); + setIdRegion(idRegion); + setAppearMilCom(appearMilCom); + setRecordingDate(recordingDate); + setAppearMilComPercent(appearMilComPercent); + setRecruitmentId(recruitmentId); + resetChangedOnNotNull(); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/tables/records/ConsiderationComplaintRecord.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/tables/records/ConsiderationComplaintRecord.java new file mode 100644 index 00000000..1f12c18f --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/tables/records/ConsiderationComplaintRecord.java @@ -0,0 +1,155 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.records; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.ConsiderationComplaint; + +import java.math.BigDecimal; +import java.sql.Date; +import java.util.UUID; + +import org.jooq.Record1; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * Рассмотрение жалоб уровень РФ + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class ConsiderationComplaintRecord extends UpdatableRecordImpl { + + private static final long serialVersionUID = 1L; + + /** + * Setter for + * ratings.consideration_complaint.id_consideration_complaint. + */ + public void setIdConsiderationComplaint(Long value) { + set(0, value); + } + + /** + * Getter for + * ratings.consideration_complaint.id_consideration_complaint. + */ + public Long getIdConsiderationComplaint() { + return (Long) get(0); + } + + /** + * Setter for ratings.consideration_complaint.id_region. + */ + public void setIdRegion(Integer value) { + set(1, value); + } + + /** + * Getter for ratings.consideration_complaint.id_region. + */ + public Integer getIdRegion() { + return (Integer) get(1); + } + + /** + * Setter for + * ratings.consideration_complaint.consideration_complaint. + * Рассмотрение жалоб + */ + public void setConsiderationComplaint(BigDecimal value) { + set(2, value); + } + + /** + * Getter for + * ratings.consideration_complaint.consideration_complaint. + * Рассмотрение жалоб + */ + public BigDecimal getConsiderationComplaint() { + return (BigDecimal) get(2); + } + + /** + * Setter for ratings.consideration_complaint.recording_date. + * Дата записи + */ + public void setRecordingDate(Date value) { + set(3, value); + } + + /** + * Getter for ratings.consideration_complaint.recording_date. + * Дата записи + */ + public Date getRecordingDate() { + return (Date) get(3); + } + + /** + * Setter for + * ratings.consideration_complaint.consideration_complaint_percent. + * Рассмотрение жалоб в процентах + */ + public void setConsiderationComplaintPercent(BigDecimal value) { + set(4, value); + } + + /** + * Getter for + * ratings.consideration_complaint.consideration_complaint_percent. + * Рассмотрение жалоб в процентах + */ + public BigDecimal getConsiderationComplaintPercent() { + return (BigDecimal) get(4); + } + + /** + * Setter for ratings.consideration_complaint.recruitment_id. + */ + public void setRecruitmentId(UUID value) { + set(5, value); + } + + /** + * Getter for ratings.consideration_complaint.recruitment_id. + */ + public UUID getRecruitmentId() { + return (UUID) get(5); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + @Override + public Record1 key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached ConsiderationComplaintRecord + */ + public ConsiderationComplaintRecord() { + super(ConsiderationComplaint.CONSIDERATION_COMPLAINT); + } + + /** + * Create a detached, initialised ConsiderationComplaintRecord + */ + public ConsiderationComplaintRecord(Long idConsiderationComplaint, Integer idRegion, BigDecimal considerationComplaint, Date recordingDate, BigDecimal considerationComplaintPercent, UUID recruitmentId) { + super(ConsiderationComplaint.CONSIDERATION_COMPLAINT); + + setIdConsiderationComplaint(idConsiderationComplaint); + setIdRegion(idRegion); + setConsiderationComplaint(considerationComplaint); + setRecordingDate(recordingDate); + setConsiderationComplaintPercent(considerationComplaintPercent); + setRecruitmentId(recruitmentId); + resetChangedOnNotNull(); + } +} diff --git a/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/tables/records/RecruitmentRecord.java b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/tables/records/RecruitmentRecord.java new file mode 100644 index 00000000..299ac50b --- /dev/null +++ b/backend/src/main/java/ervu_lkrp_ul/ervu_lkrp_ul/db_beans/ratings/tables/records/RecruitmentRecord.java @@ -0,0 +1,162 @@ +/* + * This file is generated by jOOQ. + */ +package ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.records; + + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.ratings.tables.Recruitment; + +import java.math.BigDecimal; +import java.sql.Date; +import java.util.UUID; + +import org.jooq.Record1; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * Призыв уровень РФ + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class RecruitmentRecord extends UpdatableRecordImpl { + + private static final long serialVersionUID = 1L; + + /** + * Setter for ratings.recruitment.id_recruitment. + */ + public void setIdRecruitment(Long value) { + set(0, value); + } + + /** + * Getter for ratings.recruitment.id_recruitment. + */ + public Long getIdRecruitment() { + return (Long) get(0); + } + + /** + * Setter for ratings.recruitment.id_region. + */ + public void setIdRegion(Integer value) { + set(1, value); + } + + /** + * Getter for ratings.recruitment.id_region. + */ + public Integer getIdRegion() { + return (Integer) get(1); + } + + /** + * Setter for ratings.recruitment.execution. Исполнение плана + * призыва + */ + public void setExecution(BigDecimal value) { + set(2, value); + } + + /** + * Getter for ratings.recruitment.execution. Исполнение плана + * призыва + */ + public BigDecimal getExecution() { + return (BigDecimal) get(2); + } + + /** + * Setter for ratings.recruitment.spring_autumn. Осень/весна + */ + public void setSpringAutumn(String value) { + set(3, value); + } + + /** + * Getter for ratings.recruitment.spring_autumn. Осень/весна + */ + public String getSpringAutumn() { + return (String) get(3); + } + + /** + * Setter for ratings.recruitment.recording_date. Дата записи + */ + public void setRecordingDate(Date value) { + set(4, value); + } + + /** + * Getter for ratings.recruitment.recording_date. Дата записи + */ + public Date getRecordingDate() { + return (Date) get(4); + } + + /** + * Setter for ratings.recruitment.execution_percent. Исолнение + * плана призыва в процентах + */ + public void setExecutionPercent(BigDecimal value) { + set(5, value); + } + + /** + * Getter for ratings.recruitment.execution_percent. Исолнение + * плана призыва в процентах + */ + public BigDecimal getExecutionPercent() { + return (BigDecimal) get(5); + } + + /** + * Setter for ratings.recruitment.recruitment_id. + */ + public void setRecruitmentId(UUID value) { + set(6, value); + } + + /** + * Getter for ratings.recruitment.recruitment_id. + */ + public UUID getRecruitmentId() { + return (UUID) get(6); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + @Override + public Record1 key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached RecruitmentRecord + */ + public RecruitmentRecord() { + super(Recruitment.RECRUITMENT); + } + + /** + * Create a detached, initialised RecruitmentRecord + */ + public RecruitmentRecord(Long idRecruitment, Integer idRegion, BigDecimal execution, String springAutumn, Date recordingDate, BigDecimal executionPercent, UUID recruitmentId) { + super(Recruitment.RECRUITMENT); + + setIdRecruitment(idRecruitment); + setIdRegion(idRegion); + setExecution(execution); + setSpringAutumn(springAutumn); + setRecordingDate(recordingDate); + setExecutionPercent(executionPercent); + setRecruitmentId(recruitmentId); + resetChangedOnNotNull(); + } +} diff --git a/backend/src/main/java/esia/model/ChiefPersonModel.java b/backend/src/main/java/esia/model/ChiefPersonModel.java deleted file mode 100644 index b604b06c..00000000 --- a/backend/src/main/java/esia/model/ChiefPersonModel.java +++ /dev/null @@ -1,31 +0,0 @@ -package esia.model; - -import java.io.Serializable; - -/** - * @author Eduard Tihomirov - */ -public class ChiefPersonModel extends PersonModel { - - private static final long serialVersionUID = 1L; - - private String position; - - private String brhOid; - - public String getPosition() { - return position; - } - - public void setPosition(String position) { - this.position = position; - } - - public String getBrhOid() { - return brhOid; - } - - public void setBrhOid(String brhOid) { - this.brhOid = brhOid; - } -} diff --git a/backend/src/main/java/esia/model/MillitaryRegistrationPersonModel.java b/backend/src/main/java/esia/model/MillitaryRegistrationPersonModel.java deleted file mode 100644 index 875df7f3..00000000 --- a/backend/src/main/java/esia/model/MillitaryRegistrationPersonModel.java +++ /dev/null @@ -1,46 +0,0 @@ -package esia.model; - -/** - * @author Eduard Tihomirov - */ -public class MillitaryRegistrationPersonModel extends PersonModel { - private static final long serialVersionUID = 1L; - - private String email; - - private String mobileNumber; - private String roleCode; - private String roleName; - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getMobileNumber() { - return mobileNumber; - } - - public void setMobileNumber(String mobileNumber) { - this.mobileNumber = mobileNumber; - } - - public String getRoleCode() { - return roleCode; - } - - public void setRoleCode(String roleCode) { - this.roleCode = roleCode; - } - - public String getRoleName() { - return roleName; - } - - public void setRoleName(String roleName) { - this.roleName = roleName; - } -} diff --git a/backend/src/main/java/esia/model/OrganizationModel.java b/backend/src/main/java/esia/model/OrganizationModel.java deleted file mode 100644 index ae536592..00000000 --- a/backend/src/main/java/esia/model/OrganizationModel.java +++ /dev/null @@ -1,140 +0,0 @@ -package esia.model; - -import java.io.Serializable; - -/** - * @author Eduard Tihomirov - */ -public class OrganizationModel implements Serializable { - - private static final long serialVersionUID = 1L; - - private String orgOid; - - private String fullName; - - private String shortName; - - private String inn; - - private String ogrn; - - private String leg; - private String legName; - - private String kpp; - - private String ulAddress; - - private String actualAddress; - - private String zipCode; - - private String mobile; - - private String email; - - public String getOrgOid() { - return orgOid; - } - - public void setOrgOid(String orgOid) { - this.orgOid = orgOid; - } - - public String getFullName() { - return fullName; - } - - public void setFullName(String fullName) { - this.fullName = fullName; - } - - public String getShortName() { - return shortName; - } - - public void setShortName(String shortName) { - this.shortName = shortName; - } - - public String getInn() { - return inn; - } - - public void setInn(String inn) { - this.inn = inn; - } - - public String getOgrn() { - return ogrn; - } - - public void setOgrn(String ogrn) { - this.ogrn = ogrn; - } - - public String getLeg() { - return leg; - } - - public void setLeg(String leg) { - this.leg = leg; - } - - public String getKpp() { - return kpp; - } - - public void setKpp(String kpp) { - this.kpp = kpp; - } - - public String getUlAddress() { - return ulAddress; - } - - public void setUlAddress(String ulAddress) { - this.ulAddress = ulAddress; - } - - public String getActualAddress() { - return actualAddress; - } - - public void setActualAddress(String actualAddress) { - this.actualAddress = actualAddress; - } - - public String getZipCode() { - return zipCode; - } - - public void setZipCode(String zipCode) { - this.zipCode = zipCode; - } - - public String getMobile() { - return mobile; - } - - public void setMobile(String mobile) { - this.mobile = mobile; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getLegName() { - return legName; - } - - public void setLegName(String legName) { - this.legName = legName; - } -} diff --git a/backend/src/main/java/esia/model/PersonModel.java b/backend/src/main/java/esia/model/PersonModel.java deleted file mode 100644 index 455fbfcc..00000000 --- a/backend/src/main/java/esia/model/PersonModel.java +++ /dev/null @@ -1,115 +0,0 @@ -package esia.model; - -import java.io.Serializable; - -/** - * @author Eduard Tihomirov - */ -public class PersonModel implements Serializable { - - private static final long serialVersionUID = 1L; - - private String prsId; - - private String orgOid; - - private String lastName; - - private String firstName; - - private String middleName; - private String birthday; - private String snils; - private String idERN; - private String passportSeries; - private String passportNumber; - private String passportIssueDate; - - public String getPrsId() { - return prsId; - } - - public void setPrsId(String prsId) { - this.prsId = prsId; - } - - public String getOrgOid() { - return orgOid; - } - - public void setOrgOid(String orgOid) { - this.orgOid = orgOid; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getMiddleName() { - return middleName; - } - - public void setMiddleName(String middleName) { - this.middleName = middleName; - } - - public String getBirthday() { - return birthday; - } - - public void setBirthday(String birthday) { - this.birthday = birthday; - } - - public String getSnils() { - return snils; - } - - public void setSnils(String snils) { - this.snils = snils; - } - - public String getIdERN() { - return idERN; - } - - public void setIdERN(String idERN) { - this.idERN = idERN; - } - - public String getPassportSeries() { - return passportSeries; - } - - public void setPassportSeries(String passportSeries) { - this.passportSeries = passportSeries; - } - - public String getPassportNumber() { - return passportNumber; - } - - public void setPassportNumber(String passportNumber) { - this.passportNumber = passportNumber; - } - - public String getPassportIssueDate() { - return passportIssueDate; - } - - public void setPassportIssueDate(String passportIssueDate) { - this.passportIssueDate = passportIssueDate; - } -} diff --git a/backend/src/main/java/esia/service/UlDataService.java b/backend/src/main/java/esia/service/UlDataService.java deleted file mode 100644 index 4ed8f86c..00000000 --- a/backend/src/main/java/esia/service/UlDataService.java +++ /dev/null @@ -1,17 +0,0 @@ -package esia.service; - -import esia.model.ChiefPersonModel; -import esia.model.MillitaryRegistrationPersonModel; -import esia.model.OrganizationModel; - -/** - * @author Eduard Tihomirov - */ -public interface UlDataService { - - MillitaryRegistrationPersonModel getPersonModel(); - - ChiefPersonModel getChiefPersonModel(); - - OrganizationModel getOrganizationModel(); -} diff --git a/backend/src/main/java/esia/service/impl/DummyUlDataServiceImpl.java b/backend/src/main/java/esia/service/impl/DummyUlDataServiceImpl.java deleted file mode 100644 index 3aa253c0..00000000 --- a/backend/src/main/java/esia/service/impl/DummyUlDataServiceImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -package esia.service.impl; - -import esia.model.ChiefPersonModel; -import esia.model.MillitaryRegistrationPersonModel; -import esia.model.OrganizationModel; -import esia.service.UlDataService; -import org.springframework.stereotype.Service; - -/** - * @author Alexandr Shalaginov - */ -// TODO: 22.07.2024 delete this after real realisation of UlDataService -@Service -public class DummyUlDataServiceImpl implements UlDataService { - @Override - public MillitaryRegistrationPersonModel getPersonModel() { - MillitaryRegistrationPersonModel personModel = new MillitaryRegistrationPersonModel(); - personModel.setPrsId("PrsId"); - personModel.setOrgOid("OrgOid"); - personModel.setLastName("Максимов"); - personModel.setFirstName("Геннадий"); - personModel.setMiddleName("Валентинович"); - personModel.setBirthday("18.11.1966"); - personModel.setSnils("56114152149"); - personModel.setIdERN("111666898287"); - personModel.setPassportSeries("1151"); - personModel.setPassportNumber("166971"); - personModel.setPassportIssueDate("13.10.2004"); - personModel.setEmail("Email"); - personModel.setMobileNumber(""); - personModel.setRoleCode("admin_123"); - personModel.setRoleName("Администратор 123"); - return personModel; - } - - @Override - public ChiefPersonModel getChiefPersonModel() { - return new ChiefPersonModel(); - } - - @Override - public OrganizationModel getOrganizationModel() { - OrganizationModel organizationModel = new OrganizationModel(); - organizationModel.setOrgOid("OrgOid"); - organizationModel.setFullName("FullName"); - organizationModel.setShortName("Звезда"); - organizationModel.setInn("123456789012"); - organizationModel.setOgrn("1234567890123"); - organizationModel.setLeg("2"); - organizationModel.setLegName("Общество с ограниченной ответственностью"); - organizationModel.setKpp("123456789012"); - organizationModel.setUlAddress("UlAddress"); - organizationModel.setActualAddress("ActualAddress"); - organizationModel.setZipCode("ZipCode"); - organizationModel.setMobile("Mobile"); - organizationModel.setEmail("Email"); - return organizationModel; - } -} diff --git a/backend/src/main/java/ru/micord/ervu/journal/JournalDto.java b/backend/src/main/java/ru/micord/ervu/journal/JournalDto.java new file mode 100644 index 00000000..da7344fe --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/journal/JournalDto.java @@ -0,0 +1,77 @@ +package ru.micord.ervu.journal; + +import java.time.LocalDateTime; + +public class JournalDto { + + private LocalDateTime departureDateTime; + private String fileName; + private Integer filePatternCode; + private String senderFio; + private String status; + public Integer filesSentCount; + public Integer acceptedFilesCount; + + public LocalDateTime getDepartureDateTime() { + return departureDateTime; + } + + public JournalDto setDepartureDateTime(LocalDateTime departureDateTime) { + this.departureDateTime = departureDateTime; + return this; + } + + public String getFileName() { + return fileName; + } + + public JournalDto setFileName(String fileName) { + this.fileName = fileName; + return this; + } + + public Integer getFilePatternCode() { + return filePatternCode; + } + + public JournalDto setFilePatternCode(Integer filePatternCode) { + this.filePatternCode = filePatternCode; + return this; + } + + public String getSenderFio() { + return senderFio; + } + + public JournalDto setSenderFio(String senderFio) { + this.senderFio = senderFio; + return this; + } + + public String getStatus() { + return status; + } + + public JournalDto setStatus(String status) { + this.status = status; + return this; + } + + public Integer getFilesSentCount() { + return filesSentCount; + } + + public JournalDto setFilesSentCount(Integer filesSentCount) { + this.filesSentCount = filesSentCount; + return this; + } + + public Integer getAcceptedFilesCount() { + return acceptedFilesCount; + } + + public JournalDto setAcceptedFilesCount(Integer acceptedFilesCount) { + this.acceptedFilesCount = acceptedFilesCount; + return this; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/journal/JournalFileDataRequest.java b/backend/src/main/java/ru/micord/ervu/journal/JournalFileDataRequest.java new file mode 100644 index 00000000..a2e77c90 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/journal/JournalFileDataRequest.java @@ -0,0 +1,28 @@ +package ru.micord.ervu.journal; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class JournalFileDataRequest { + + @JsonProperty("orgId_ERVU") + private String orgIdErvu; // идентификатор организации в ЕРВУ + private String prnOid; // идентификатор сотрудника в ЕСИА ответственный за воинский учёт + + public String getOrgIdErvu() { + return orgIdErvu; + } + + public JournalFileDataRequest setOrgIdErvu(String orgIdErvu) { + this.orgIdErvu = orgIdErvu; + return this; + } + + public String getPrnOid() { + return prnOid; + } + + public JournalFileDataRequest setPrnOid(String prnOid) { + this.prnOid = prnOid; + return this; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/journal/JournalFileDataResponse.java b/backend/src/main/java/ru/micord/ervu/journal/JournalFileDataResponse.java new file mode 100644 index 00000000..4dd2dea7 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/journal/JournalFileDataResponse.java @@ -0,0 +1,37 @@ +package ru.micord.ervu.journal; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author ya.kuznetsova + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class JournalFileDataResponse { + + @JsonProperty("orgId_ERVU") + private String orgIdErvu; // идентификатор организации в ЕРВУ + + @JsonProperty("filesInfo") + private List filesInfo; + + public String getOrgIdErvu() { + return orgIdErvu; + } + + public JournalFileDataResponse setOrgIdErvu(String orgIdErvu) { + this.orgIdErvu = orgIdErvu; + return this; + } + + public List getFilesInfo() { + return filesInfo; + } + + public JournalFileDataResponse setFilesInfo(List filesInfo) { + this.filesInfo = filesInfo; + return this; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/journal/JournalFileInfo.java b/backend/src/main/java/ru/micord/ervu/journal/JournalFileInfo.java new file mode 100644 index 00000000..a69a23a5 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/journal/JournalFileInfo.java @@ -0,0 +1,125 @@ +package ru.micord.ervu.journal; + +import java.time.LocalDateTime; +import java.time.ZoneOffset; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import ru.micord.ervu.journal.deserializer.DepartureDateTimeDeserializer; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class JournalFileInfo { + + @JsonProperty("fileId") + private String fileId; //ИД файла полученный при создании записи о файле в реестр организаций (в ЕРВУ) + @JsonProperty("fileName") + private String fileName; // Название файла + @JsonProperty("filePatternCode") + private Integer filePatternCode; // Номер шаблона(Формы) + @JsonProperty("filePatternName") + private String filePatternName; + @JsonProperty("departureDateTime") + @JsonDeserialize(using = DepartureDateTimeDeserializer.class) + private LocalDateTime departureDateTime; // Дата-время отправки файла + @JsonProperty("timeZone") + private ZoneOffset timeZone; //Таймзона + @JsonProperty("fileStatus") + private JournalFileStatus fileStatus; + @JsonProperty("senderInfo") + private SenderInfo senderInfo; + @JsonProperty("rowsCount") + private Integer rowsCount; //Общее количество записей отправленных в файле + @JsonProperty("rowsSuccess") + private Integer rowsSuccess; //Количество записей принятых в файле + + public String getFileId() { + return fileId; + } + + public JournalFileInfo setFileId(String fileId) { + this.fileId = fileId; + return this; + } + + public String getFileName() { + return fileName; + } + + public JournalFileInfo setFileName(String fileName) { + this.fileName = fileName; + return this; + } + + public Integer getFilePatternCode() { + return filePatternCode; + } + + public JournalFileInfo setFilePatternCode(Integer filePatternCode) { + this.filePatternCode = filePatternCode; + return this; + } + + public String getFilePatternName() { + return filePatternName; + } + + public JournalFileInfo setFilePatternName(String filePatternName) { + this.filePatternName = filePatternName; + return this; + } + + public LocalDateTime getDepartureDateTime() { + return departureDateTime; + } + + public JournalFileInfo setDepartureDateTime(LocalDateTime departureDateTime) { + this.departureDateTime = departureDateTime; + return this; + } + + public ZoneOffset getTimeZone() { + return timeZone; + } + + public JournalFileInfo setTimeZone(ZoneOffset timeZone) { + this.timeZone = timeZone; + return this; + } + + public JournalFileStatus getFileStatus() { + return fileStatus; + } + + public JournalFileInfo setFileStatus(JournalFileStatus fileStatus) { + this.fileStatus = fileStatus; + return this; + } + + public SenderInfo getSenderInfo() { + return senderInfo; + } + + public JournalFileInfo setSenderInfo(SenderInfo senderInfo) { + this.senderInfo = senderInfo; + return this; + } + + public Integer getRowsCount() { + return rowsCount; + } + + public JournalFileInfo setRowsCount(Integer rowsCount) { + this.rowsCount = rowsCount; + return this; + } + + public Integer getRowsSuccess() { + return rowsSuccess; + } + + public JournalFileInfo setRowsSuccess(Integer rowsSuccess) { + this.rowsSuccess = rowsSuccess; + return this; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/journal/JournalFileStatus.java b/backend/src/main/java/ru/micord/ervu/journal/JournalFileStatus.java new file mode 100644 index 00000000..c0e0a028 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/journal/JournalFileStatus.java @@ -0,0 +1,42 @@ +package ru.micord.ervu.journal; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class JournalFileStatus { + + @JsonProperty("code") + private Integer code; + @JsonProperty("status") + private String status; + @JsonProperty("description") + private String description; + + public Integer getCode() { + return code; + } + + public JournalFileStatus setCode(Integer code) { + this.code = code; + return this; + } + + public String getStatus() { + return status; + } + + public JournalFileStatus setStatus(String status) { + this.status = status; + return this; + } + + public String getDescription() { + return description; + } + + public JournalFileStatus setDescription(String description) { + this.description = description; + return this; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/journal/SenderInfo.java b/backend/src/main/java/ru/micord/ervu/journal/SenderInfo.java new file mode 100644 index 00000000..22b80272 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/journal/SenderInfo.java @@ -0,0 +1,53 @@ +package ru.micord.ervu.journal; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class SenderInfo { + + @JsonProperty("prnOid") + private String prnOid; // идентификатор сотрудника в ЕСИА + @JsonProperty("lastName") + private String lastName; + @JsonProperty("firstName") + private String firstName; + @JsonProperty("middleName") + private String middleName; + + public String getPrnOid() { + return prnOid; + } + + public SenderInfo setPrnOid(String prnOid) { + this.prnOid = prnOid; + return this; + } + + public String getLastName() { + return lastName; + } + + public SenderInfo setLastName(String lastName) { + this.lastName = lastName; + return this; + } + + public String getFirstName() { + return firstName; + } + + public SenderInfo setFirstName(String firstName) { + this.firstName = firstName; + return this; + } + + public String getMiddleName() { + return middleName; + } + + public SenderInfo setMiddleName(String middleName) { + this.middleName = middleName; + return this; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/journal/deserializer/DepartureDateTimeDeserializer.java b/backend/src/main/java/ru/micord/ervu/journal/deserializer/DepartureDateTimeDeserializer.java new file mode 100644 index 00000000..149f720f --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/journal/deserializer/DepartureDateTimeDeserializer.java @@ -0,0 +1,19 @@ +package ru.micord.ervu.journal.deserializer; + +import java.io.IOException; +import java.time.LocalDateTime; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import ru.micord.ervu.util.DateUtil; + +public class DepartureDateTimeDeserializer extends JsonDeserializer { + + @Override + public LocalDateTime deserialize(JsonParser jsonParser, + DeserializationContext deserializationContext) throws IOException { + String dateTimeString = jsonParser.getText(); + return DateUtil.convertToLocalDateTime(dateTimeString); + } +} diff --git a/backend/src/main/java/ru/micord/ervu/journal/mapper/JournalDtoMapper.java b/backend/src/main/java/ru/micord/ervu/journal/mapper/JournalDtoMapper.java new file mode 100644 index 00000000..66d6cbea --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/journal/mapper/JournalDtoMapper.java @@ -0,0 +1,36 @@ +package ru.micord.ervu.journal.mapper; + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.records.InteractionLogRecord; +import ru.micord.ervu.journal.JournalDto; +import ru.micord.ervu.journal.JournalFileInfo; +import ru.micord.ervu.journal.SenderInfo; + +import static ru.micord.ervu.util.StringUtils.convertToFio; + +public class JournalDtoMapper { + + public static JournalDto mapToJournalDto(JournalFileInfo journalFileInfo) { + SenderInfo senderInfo = journalFileInfo.getSenderInfo(); + return new JournalDto() + .setDepartureDateTime(journalFileInfo.getDepartureDateTime()) + .setFileName(journalFileInfo.getFileName()) + .setFilePatternCode(journalFileInfo.getFilePatternCode()) + .setSenderFio(convertToFio(senderInfo.getFirstName(), senderInfo.getMiddleName(), + senderInfo.getLastName()) + ) + .setStatus(journalFileInfo.getFileStatus().getStatus()) + .setFilesSentCount(journalFileInfo.getRowsCount()) + .setAcceptedFilesCount(journalFileInfo.getRowsSuccess()); + } + + public static JournalDto mapToJournalDto(InteractionLogRecord record) { + return new JournalDto() + .setDepartureDateTime(record.getSentDate().toLocalDateTime()) + .setFileName(record.getFileName()) + .setFilePatternCode(Integer.valueOf(record.getForm().replace("№", ""))) + .setSenderFio(record.getSender()) + .setStatus(record.getStatus()) + .setFilesSentCount(record.getRecordsSent()) + .setAcceptedFilesCount(record.getRecordsAccepted()); + } +} diff --git a/backend/src/main/java/ru/micord/ervu/kafka/ReplyingKafkaConfig.java b/backend/src/main/java/ru/micord/ervu/kafka/ReplyingKafkaConfig.java new file mode 100644 index 00000000..769218d0 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/kafka/ReplyingKafkaConfig.java @@ -0,0 +1,133 @@ +package ru.micord.ervu.kafka; + +import org.apache.kafka.clients.CommonClientConfigs; +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.common.config.SaslConfigs; +import org.apache.kafka.common.serialization.StringDeserializer; +import org.apache.kafka.common.serialization.StringSerializer; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +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.core.*; +import org.springframework.kafka.listener.ConcurrentMessageListenerContainer; +import org.springframework.kafka.requestreply.ReplyingKafkaTemplate; + +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; + +@Configuration +@EnableKafka +public class ReplyingKafkaConfig { + + @Value("${ervu-kafka.bootstrap-servers}") + private String bootstrapServers; + @Value("${ervu-kafka.org-reply-topic}") + private String orgReplyTopic; + @Value("${ervu-kafka.journal-reply-topic}") + private String journalReplyTopic; + @Value("${ervu-kafka.group-id}") + private String groupId; + @Value("${ervu-kafka.reply-timeout:30}") + private long replyTimeout; + + @Value("${ervu-kafka.send.security.protocol}") + private String securityProtocol; + @Value("${ervu-kafka.send.login.module:org.apache.kafka.common.security.scram.ScramLoginModule}") + private String loginModule; + @Value("${ervu-kafka.send.username}") + private String username; + @Value("${ervu-kafka.send.password}") + private String password; + @Value("${ervu-kafka.sasl.mechanism}") + private String saslMechanism; + + @Bean("ervu") + public ProducerFactory producerFactory() { + Map configProps = new HashMap<>(); + configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + configProps.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, securityProtocol); + configProps.put(SaslConfigs.SASL_JAAS_CONFIG, loginModule + " required username=\"" + + username + "\" password=\"" + password + "\";"); + configProps.put(SaslConfigs.SASL_MECHANISM, saslMechanism); + return new DefaultKafkaProducerFactory<>(configProps); + } + + @Bean + public KafkaTemplate kafkaTemplate() { + return new KafkaTemplate<>(producerFactory()); + } + + @Bean + public ConsumerFactory consumerFactory() { + Map configProps = new HashMap<>(); + configProps.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + configProps.put(ConsumerConfig.GROUP_ID_CONFIG, groupId); + configProps.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + configProps.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); + configProps.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, securityProtocol); + configProps.put(SaslConfigs.SASL_JAAS_CONFIG, loginModule + " required username=\"" + + username + "\" password=\"" + password + "\";"); + configProps.put(SaslConfigs.SASL_MECHANISM, saslMechanism); + return new DefaultKafkaConsumerFactory<>(configProps); + } + + @Bean + public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory() { + ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>(); + factory.setConsumerFactory(consumerFactory()); + return factory; + } + + @Bean + @Qualifier("org") + public ConcurrentMessageListenerContainer replyContainer( + ConcurrentKafkaListenerContainerFactory factory) { + ConcurrentMessageListenerContainer container = factory.createContainer( + orgReplyTopic); + container.getContainerProperties().setGroupId(groupId); + return container; + } + + @Bean + @Qualifier("journal") + public ConcurrentMessageListenerContainer journalReplyContainer( + ConcurrentKafkaListenerContainerFactory factory) { + ConcurrentMessageListenerContainer container = factory.createContainer( + journalReplyTopic); + container.getContainerProperties().setGroupId(groupId); + return container; + } + + @Bean + @Qualifier("org") + public ReplyingKafkaTemplate orgReplyingKafkaTemplate( + @Qualifier("ervu") ProducerFactory pf, + @Qualifier("org") ConcurrentMessageListenerContainer container) { + return initReplyingKafkaTemplate(pf, container); + } + + @Bean + @Qualifier("journal") + public ReplyingKafkaTemplate journalReplyingKafkaTemplate( + @Qualifier("ervu") ProducerFactory pf, + @Qualifier("journal") ConcurrentMessageListenerContainer container) { + return initReplyingKafkaTemplate(pf, container); + } + + private ReplyingKafkaTemplate initReplyingKafkaTemplate( + ProducerFactory pf, + ConcurrentMessageListenerContainer container) { + ReplyingKafkaTemplate replyingKafkaTemplate = + new ReplyingKafkaTemplate<>(pf, container); + replyingKafkaTemplate.setCorrelationHeaderName("messageID"); + replyingKafkaTemplate.setDefaultReplyTimeout(Duration.ofSeconds(replyTimeout)); + return replyingKafkaTemplate; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/kafka/model/Brhs.java b/backend/src/main/java/ru/micord/ervu/kafka/model/Brhs.java new file mode 100644 index 00000000..5841b104 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/kafka/model/Brhs.java @@ -0,0 +1,76 @@ +package ru.micord.ervu.kafka.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import ru.micord.ervu.security.esia.model.AddressModel; +import ru.micord.ervu.security.esia.model.ContactModel; + +/** + * @author Eduard Tihomirov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class Brhs implements Serializable { + + private static final long serialVersionUID = 1L; + + private String brhOid; + + private String name; + + private String kpp; + + private String leg; + + private AddressModel[] addresses; + + private ContactModel[] contacts; + + public String getBrhOid() { + return brhOid; + } + + public void setBrhOid(String brhOid) { + this.brhOid = brhOid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getKpp() { + return kpp; + } + + public void setKpp(String kpp) { + this.kpp = kpp; + } + + public String getLeg() { + return leg; + } + + public void setLeg(String leg) { + this.leg = leg; + } + + public AddressModel[] getAddresses() { + return addresses; + } + + public void setAddresses(AddressModel[] addresses) { + this.addresses = addresses; + } + + public ContactModel[] getContacts() { + return contacts; + } + + public void setContacts(ContactModel[] contacts) { + this.contacts = contacts; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/kafka/model/Data.java b/backend/src/main/java/ru/micord/ervu/kafka/model/Data.java new file mode 100644 index 00000000..151f32c5 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/kafka/model/Data.java @@ -0,0 +1,31 @@ +package ru.micord.ervu.kafka.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * @author Eduard Tihomirov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class Data implements Serializable { + private static final long serialVersionUID = 1L; + private String orgId_ERVU; + private String prnOid; + + public String getOrgId_ERVU() { + return orgId_ERVU; + } + + public void setOrgId_ERVU(String orgId_ERVU) { + this.orgId_ERVU = orgId_ERVU; + } + + public String getPrnOid() { + return prnOid; + } + + public void setPrnOid(String prnOid) { + this.prnOid = prnOid; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/kafka/model/Employee.java b/backend/src/main/java/ru/micord/ervu/kafka/model/Employee.java new file mode 100644 index 00000000..78da1a2b --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/kafka/model/Employee.java @@ -0,0 +1,179 @@ +package ru.micord.ervu.kafka.model; + +import java.io.Serializable; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * @author Eduard Tihomirov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class Employee implements Serializable { + + private static final long serialVersionUID = 1L; + + private String prnOid; + + private String orgOid; + + private Boolean chief; + + private Boolean blocked; + + private String position; + + private String lastName; + + private String firstName; + + private String middleName; + + @JsonFormat(pattern = "dd.MM.yyyy") + private Date birthDate; + + private String gender; + + private String citizenship; + + private String snils; + + private String inn; + + private String birthPlace; + + //Данные не доступны при входе юр лицом + private String email; + + //Данные не доступны при входе юр лицом + private String phoneNumber; + + public String getPrnOid() { + return prnOid; + } + + public void setPrnOid(String prnOid) { + this.prnOid = prnOid; + } + + public String getOrgOid() { + return orgOid; + } + + public void setOrgOid(String orgOid) { + this.orgOid = orgOid; + } + + public Boolean getChief() { + return chief; + } + + public void setChief(Boolean chief) { + this.chief = chief; + } + + public Boolean getBlocked() { + return blocked; + } + + public void setBlocked(Boolean blocked) { + this.blocked = blocked; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getMiddleName() { + return middleName; + } + + public void setMiddleName(String middleName) { + this.middleName = middleName; + } + + public Date getBirthDate() { + return birthDate; + } + + public void setBirthDate(Date birthDate) { + this.birthDate = birthDate; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public String getCitizenship() { + return citizenship; + } + + public void setCitizenship(String citizenship) { + this.citizenship = citizenship; + } + + public String getSnils() { + return snils; + } + + public void setSnils(String snils) { + this.snils = snils; + } + + public String getInn() { + return inn; + } + + public void setInn(String inn) { + this.inn = inn; + } + + public String getBirthPlace() { + return birthPlace; + } + + public void setBirthPlace(String birthPlace) { + this.birthPlace = birthPlace; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/kafka/model/ErvuOrgResponse.java b/backend/src/main/java/ru/micord/ervu/kafka/model/ErvuOrgResponse.java new file mode 100644 index 00000000..5a3316ad --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/kafka/model/ErvuOrgResponse.java @@ -0,0 +1,41 @@ +package ru.micord.ervu.kafka.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * @author Eduard Tihomirov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class ErvuOrgResponse implements Serializable { + + private static final long serialVersionUID = 1L; + private boolean success; + private String message; + private Data[] data; + + public boolean getSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Data[] getData() { + return data; + } + + public void setData(Data[] data) { + this.data = data; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/kafka/model/OrgInfo.java b/backend/src/main/java/ru/micord/ervu/kafka/model/OrgInfo.java new file mode 100644 index 00000000..857e9513 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/kafka/model/OrgInfo.java @@ -0,0 +1,206 @@ +package ru.micord.ervu.kafka.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import ru.micord.ervu.security.esia.model.AddressModel; +import ru.micord.ervu.security.esia.model.ContactModel; + +/** + * @author Eduard Tihomirov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class OrgInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + private String orgOid; + + private String orgFullName; + + private String orgShortName; + + private String orgType; + + private String inn; + + private String ogrn; + + private String orgTypeLeg; + + private String orgTypeName; + + private String kpp; + + private AddressModel[] addresses; + + private ContactModel[] contacts; + + private Long staffCount; + + private Long branchesCount; + + private Brhs[] brhs; + + private Boolean isLiquidated; + + private Employee chiefInfo; + + private Employee senderInfo; + + private String orgAgencyTerRange; + + private String orgAgencyType; + + public String getOrgOid() { + return orgOid; + } + + public void setOrgOid(String orgOid) { + this.orgOid = orgOid; + } + + public String getOrgFullName() { + return orgFullName; + } + + public void setOrgFullName(String orgFullName) { + this.orgFullName = orgFullName; + } + + public String getOrgShortName() { + return orgShortName; + } + + public void setOrgShortName(String orgShortName) { + this.orgShortName = orgShortName; + } + + public String getInn() { + return inn; + } + + public void setInn(String inn) { + this.inn = inn; + } + + public String getOgrn() { + return ogrn; + } + + public void setOgrn(String ogrn) { + this.ogrn = ogrn; + } + + public String getOrgTypeLeg() { + return orgTypeLeg; + } + + public void setOrgTypeLeg(String orgTypeLeg) { + this.orgTypeLeg = orgTypeLeg; + } + + public String getOrgTypeName() { + return orgTypeName; + } + + public void setOrgTypeName(String orgTypeName) { + this.orgTypeName = orgTypeName; + } + + public String getKpp() { + return kpp; + } + + public void setKpp(String kpp) { + this.kpp = kpp; + } + + public String getOrgType() { + return orgType; + } + + public void setOrgType(String orgType) { + this.orgType = orgType; + } + + public Long getStaffCount() { + return staffCount; + } + + public void setStaffCount(Long staffCount) { + this.staffCount = staffCount; + } + + public Long getBranchesCount() { + return branchesCount; + } + + public void setBranchesCount(Long branchesCount) { + this.branchesCount = branchesCount; + } + + public Brhs[] getBrhs() { + return brhs; + } + + public void setBrhs(Brhs[] brhs) { + this.brhs = brhs; + } + + public Boolean getLiquidated() { + return isLiquidated; + } + + public void setLiquidated(Boolean liquidated) { + isLiquidated = liquidated; + } + + public AddressModel[] getAddresses() { + return addresses; + } + + public void setAddresses(AddressModel[] addresses) { + this.addresses = addresses; + } + + public ContactModel[] getContacts() { + return contacts; + } + + public void setContacts(ContactModel[] contacts) { + this.contacts = contacts; + } + + public Employee getChiefInfo() { + return chiefInfo; + } + + public void setChiefInfo(Employee chiefInfo) { + this.chiefInfo = chiefInfo; + } + + public Employee getSenderInfo() { + return senderInfo; + } + + public void setSenderInfo(Employee senderInfo) { + this.senderInfo = senderInfo; + } + + public String getOrgAgencyTerRange() { + return orgAgencyTerRange; + } + + public void setOrgAgencyTerRange(String orgAgencyTerRange) { + this.orgAgencyTerRange = orgAgencyTerRange; + } + + public String getOrgAgencyType() { + return orgAgencyType; + } + + public void setOrgAgencyType(String orgAgencyType) { + this.orgAgencyType = orgAgencyType; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/kafka/service/ReplyingKafkaService.java b/backend/src/main/java/ru/micord/ervu/kafka/service/ReplyingKafkaService.java new file mode 100644 index 00000000..49918e61 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/kafka/service/ReplyingKafkaService.java @@ -0,0 +1,8 @@ +package ru.micord.ervu.kafka.service; + +public interface ReplyingKafkaService { + + String sendMessageAndGetReply(String requestTopic, + String requestReplyTopic, + String requestMessage); +} diff --git a/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaServiceImpl.java b/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaServiceImpl.java new file mode 100644 index 00000000..83f3db33 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaServiceImpl.java @@ -0,0 +1,39 @@ +package ru.micord.ervu.kafka.service.impl; + +import java.util.Optional; +import java.util.concurrent.ExecutionException; + +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.header.internals.RecordHeader; +import org.springframework.kafka.requestreply.ReplyingKafkaTemplate; +import org.springframework.kafka.requestreply.RequestReplyFuture; +import org.springframework.kafka.support.KafkaHeaders; +import ru.micord.ervu.kafka.service.ReplyingKafkaService; + +/** + * @author Eduard Tihomirov + */ +public abstract class BaseReplyingKafkaServiceImpl implements ReplyingKafkaService { + + protected abstract ReplyingKafkaTemplate getReplyingKafkaTemplate(); + + public String sendMessageAndGetReply(String requestTopic, + String requestReplyTopic, + String requestMessage) { + ProducerRecord record = new ProducerRecord<>(requestTopic, requestMessage); + record.headers().add(new RecordHeader(KafkaHeaders.REPLY_TOPIC, requestReplyTopic.getBytes())); + + RequestReplyFuture replyFuture = getReplyingKafkaTemplate() + .sendAndReceive(record); + + try { + return Optional.ofNullable(replyFuture.get()) + .map(ConsumerRecord::value) + .orElseThrow(() -> new RuntimeException("Kafka return result is null.")); + } + catch (InterruptedException | ExecutionException e) { + throw new RuntimeException("Failed to get kafka response.", e); + } + } +} diff --git a/backend/src/main/java/ru/micord/ervu/kafka/service/impl/JournalReplyingKafkaServiceImpl.java b/backend/src/main/java/ru/micord/ervu/kafka/service/impl/JournalReplyingKafkaServiceImpl.java new file mode 100644 index 00000000..5f21b4dc --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/kafka/service/impl/JournalReplyingKafkaServiceImpl.java @@ -0,0 +1,20 @@ +package ru.micord.ervu.kafka.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.kafka.requestreply.ReplyingKafkaTemplate; +import org.springframework.stereotype.Service; + +@Service +@Qualifier("journal") +public class JournalReplyingKafkaServiceImpl extends BaseReplyingKafkaServiceImpl { + + @Autowired + @Qualifier("journal") + private ReplyingKafkaTemplate journalReplyingKafkaTemplate; + + @Override + protected ReplyingKafkaTemplate getReplyingKafkaTemplate() { + return journalReplyingKafkaTemplate; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/kafka/service/impl/OrgReplyingKafkaServiceImpl.java b/backend/src/main/java/ru/micord/ervu/kafka/service/impl/OrgReplyingKafkaServiceImpl.java new file mode 100644 index 00000000..6c812403 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/kafka/service/impl/OrgReplyingKafkaServiceImpl.java @@ -0,0 +1,20 @@ +package ru.micord.ervu.kafka.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.kafka.requestreply.ReplyingKafkaTemplate; +import org.springframework.stereotype.Service; + +@Service +@Qualifier("org") +public class OrgReplyingKafkaServiceImpl extends BaseReplyingKafkaServiceImpl { + + @Autowired + @Qualifier("org") + private ReplyingKafkaTemplate orgReplyingKafkaTemplate; + + @Override + protected ReplyingKafkaTemplate getReplyingKafkaTemplate() { + return orgReplyingKafkaTemplate; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/property/grid/StaticColumn.java b/backend/src/main/java/ru/micord/ervu/property/grid/StaticColumn.java new file mode 100644 index 00000000..33eca742 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/property/grid/StaticColumn.java @@ -0,0 +1,10 @@ +package ru.micord.ervu.property.grid; + +/** + * @author gulnaz + */ +public class StaticColumn { + + public String column; + public String type; +} diff --git a/backend/src/main/java/ru/micord/ervu/property/grid/StaticGridColumn.java b/backend/src/main/java/ru/micord/ervu/property/grid/StaticGridColumn.java new file mode 100644 index 00000000..28e0cde8 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/property/grid/StaticGridColumn.java @@ -0,0 +1,88 @@ +package ru.micord.ervu.property.grid; + +import java.util.Collection; +import java.util.Collections; + +import component.field.dataconvert.DataConverter; +import component.field.dataconvert.DataConverterProvider; +import component.field.persist.filter.AbstractFilterComponent; +import component.grid.model.PinnedType; +import property.grid.Column; +import property.grid.Formatter; +import utils.GridUtils; + +import ru.cg.webbpm.modules.database.bean.AggregationFunction; +import ru.cg.webbpm.modules.database.bean.entity_graph.EntityColumn; +import ru.cg.webbpm.modules.standard_annotations.editor.Visible; +import ru.cg.webbpm.modules.webkit.annotations.Exclude; +import ru.cg.webbpm.modules.webkit.annotations.Model; + +/** + * @author gulnaz + */ +@Model +public class StaticGridColumn extends AbstractFilterComponent + implements Column { + + public StaticColumn field; + public String displayName; + public String headerTooltip; + @Visible(predicate = "displayPopup != true") + public String columnTooltip; + public Integer width; + public boolean widthFixed; + public boolean autoHeight; + public boolean hidden; + public boolean sortable; + public boolean disableHiding; + public PinnedType pinned; + public boolean filter; + @Exclude + public Formatter formatter; + public AggregationFunction aggregationFunction; + @Exclude + public Formatter aggregationFormatter; + @Exclude + public Formatter exportFileFormatter; + public boolean displayPopup; + public boolean suppressHeaderMenu; + + public EntityColumn getField() { + return GridUtils.toEntityColumn(field.column); + } + + @Override + public String getDisplayName() { + return displayName; + } + + public Collection getEntityColumns() { + return Collections.singleton(getField()); + } + + public AggregationFunction getAggregationFunction() { + return this.aggregationFunction; + } + + public Formatter getFormatter() { + return this.formatter; + } + + public Formatter getAggregationFormatter() { + return this.aggregationFormatter; + } + + public Formatter getExportFormatter() { + return exportFileFormatter; + } + + public Object convertData(Object rawValue) { + if (this.dataConverter != null) { + return this.dataConverter.convertValueForSave(rawValue); + } + else { + DataConverter converter = DataConverterProvider.getDataConverter(rawValue.getClass()); + return converter.convertValueForSave(rawValue); + } + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/SecurityConfig.java b/backend/src/main/java/ru/micord/ervu/security/SecurityConfig.java index 9a4e4fb9..44a4223b 100644 --- a/backend/src/main/java/ru/micord/ervu/security/SecurityConfig.java +++ b/backend/src/main/java/ru/micord/ervu/security/SecurityConfig.java @@ -1,25 +1,62 @@ package ru.micord.ervu.security; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.Customizer; +import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import ru.micord.ervu.security.webbpm.jwt.filter.JwtAuthenticationFilter; +import ru.micord.ervu.security.webbpm.jwt.UnauthorizedEntryPoint; @Configuration @EnableWebSecurity -//@EnableAuthorizationServer -public class SecurityConfig { +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private JwtAuthenticationFilter jwtAuthenticationFilter; + + @Override + protected void configure(HttpSecurity http) throws Exception { + + httpConfigure(http); + http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); + } + + protected void httpConfigure(HttpSecurity httpSecurity) throws Exception { + String[] permitAll = {"/esia/url", "/esia/auth", "esia/refresh"}; + + httpSecurity.authorizeRequests() + .antMatchers(permitAll).permitAll() + .antMatchers("/**").authenticated() + .and() + .csrf().disable() + .exceptionHandling().authenticationEntryPoint(entryPoint()) + .and() + .sessionManagement() + .sessionCreationPolicy(SessionCreationPolicy.STATELESS); + } + + public AuthenticationEntryPoint entryPoint() { + return new UnauthorizedEntryPoint(); + } @Bean - public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } - http.csrf().disable() - .authorizeHttpRequests() - .antMatchers("/**") - .permitAll(); - - return http.build(); + @Bean + public JwtAuthenticationFilter jwtAuthenticationFilter() throws Exception { + JwtAuthenticationFilter jwtAuthenticationFilter = new JwtAuthenticationFilter("/**", + entryPoint() + ); + jwtAuthenticationFilter.setAuthenticationManager(authenticationManagerBean()); + return jwtAuthenticationFilter; } } diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/config/EsiaConfig.java b/backend/src/main/java/ru/micord/ervu/security/esia/config/EsiaConfig.java new file mode 100644 index 00000000..cd3262f5 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/config/EsiaConfig.java @@ -0,0 +1,100 @@ +package ru.micord.ervu.security.esia.config; + +import java.util.Arrays; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * @author Eduard Tihomirov + */ +@Component +public class EsiaConfig { + + @Value("${esia-scopes:#{null}}") + private String esiaScopes; + + @Value("${esia-org-scopes:#{null}}") + private String esiaOrgScopes; + + @Value("${esia-org-scope-url:#{null}}") + private String orgScopeUrl; + + @Value("${esia-uri.base-uri:#{null}}") + private String esiaBaseUri; + + @Value("${esia-client-id:#{null}}") + private String clientId; + + @Value("${esia-redirect-url:#{null}}") + private String redirectUrl; + + @Value("${sign-url:#{null}}") + private String signUrl; + + @Value("${client-cert-hash:#{null}}") + private String clientCertHash; + + @Value("${esia.request-timeout:60}") + private long requestTimeout; + + @Value("${esia.connection-timeout:30}") + private long connectionTimeout; + + @Value("${esia.logout-url:idp/ext/Logout}") + private String esiaLogoutUrl; + + @Value("${esia.code-url:aas/oauth2/v3/te}") + private String esiaCodeUrl; + + @Value("${esia.token-url:aas/oauth2/v3/te}") + private String esiaTokenUrl; + + public String getEsiaOrgScopes() { + String[] scopeItems = esiaOrgScopes.split(","); + return String.join(" ", Arrays.stream(scopeItems).map(item -> orgScopeUrl + item.trim()).toArray(String[]::new)); + } + + public String getEsiaScopes() { + String[] scopeItems = esiaScopes.split(","); + return String.join(" ", Arrays.stream(scopeItems).map(String::trim).toArray(String[]::new)); + } + + public String getClientId() { + return clientId; + } + + public String getRedirectUrl() { + return redirectUrl; + } + + public String getEsiaBaseUri() { + return esiaBaseUri; + } + + public String getSignUrl() { + return signUrl; + } + + public String getClientCertHash() {return clientCertHash;} + + public long getRequestTimeout() { + return requestTimeout; + } + + public long getConnectionTimeout() { + return connectionTimeout; + } + + public String getEsiaLogoutUrl() { + return esiaLogoutUrl; + } + + public String getEsiaCodeUrl() { + return esiaCodeUrl; + } + + public String getEsiaTokenUrl() { + return esiaTokenUrl; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/controller/EsiaController.java b/backend/src/main/java/ru/micord/ervu/security/esia/controller/EsiaController.java new file mode 100644 index 00000000..d408ff4d --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/controller/EsiaController.java @@ -0,0 +1,61 @@ +package ru.micord.ervu.security.esia.controller; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import ru.micord.ervu.security.esia.model.OrgInfoModel; +import ru.micord.ervu.security.esia.service.EsiaAuthService; +import ru.micord.ervu.security.esia.service.EsiaDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Eduard Tihomirov + */ +@RestController +public class EsiaController { + + @Autowired + private EsiaAuthService esiaAuthService; + + @Autowired + private EsiaDataService esiaDataService; + + @RequestMapping(value = "/esia/url") + public String getEsiaUrl() { + return esiaAuthService.generateAuthCodeUrl(); + } + + @RequestMapping(value = "/esia/auth", params = "code", method = RequestMethod.GET) + public boolean esiaAuth(@RequestParam("code") String code, HttpServletRequest request, HttpServletResponse response) { + return esiaAuthService.getEsiaTokensByCode(code, request, response); + } + + @RequestMapping(value = "/esia/refresh") + public void refreshToken(HttpServletRequest request, HttpServletResponse response) { + esiaAuthService.getEsiaTokensByRefreshToken(request, response); + } + + @RequestMapping(value = "/esia/org") + public OrgInfoModel getOrgInfo(HttpServletRequest request) { + return esiaDataService.getOrgInfo(request); + } + + @RequestMapping(value = "/esia/userfullname") + public String getUserFullname(HttpServletRequest request) { + return esiaDataService.getUserFullname(request); + } + + @RequestMapping(value = "/esia/orgunitname") + public String getOrgUnitName(HttpServletRequest request) { + return esiaDataService.getOrgUnitName(request); + } + + @RequestMapping(value = "/esia/logout") + public String logout(HttpServletRequest request, HttpServletResponse response) { + return esiaAuthService.logout(request, response); + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/model/AddressModel.java b/backend/src/main/java/ru/micord/ervu/security/esia/model/AddressModel.java new file mode 100644 index 00000000..c40f819c --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/model/AddressModel.java @@ -0,0 +1,134 @@ +package ru.micord.ervu.security.esia.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * @author Eduard Tihomirov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class AddressModel implements Serializable { + + private static final long serialVersionUID = 1L; + + private String type; + + private String zipCode; + + private String countryId; + + private String addressStr; + + private String region; + + private String city; + + private String street; + + private String house; + + private String building; + + private String frame; + + private String flat; + + private String fiasCode; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getZipCode() { + return zipCode; + } + + public void setZipCode(String zipCode) { + this.zipCode = zipCode; + } + + public String getCountryId() { + return countryId; + } + + public void setCountryId(String countryId) { + this.countryId = countryId; + } + + public String getAddressStr() { + return addressStr; + } + + public void setAddressStr(String addressStr) { + this.addressStr = addressStr; + } + + public String getRegion() { + return region; + } + + public void setRegion(String region) { + this.region = region; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getStreet() { + return street; + } + + public void setStreet(String street) { + this.street = street; + } + + public String getHouse() { + return house; + } + + public void setHouse(String house) { + this.house = house; + } + + public String getBuilding() { + return building; + } + + public void setBuilding(String building) { + this.building = building; + } + + public String getFrame() { + return frame; + } + + public void setFrame(String frame) { + this.frame = frame; + } + + public String getFlat() { + return flat; + } + + public void setFlat(String flat) { + this.flat = flat; + } + + public String getFiasCode() { + return fiasCode; + } + + public void setFiasCode(String fiasCode) { + this.fiasCode = fiasCode; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/model/Addresses.java b/backend/src/main/java/ru/micord/ervu/security/esia/model/Addresses.java new file mode 100644 index 00000000..4ce2d1d0 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/model/Addresses.java @@ -0,0 +1,23 @@ +package ru.micord.ervu.security.esia.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * @author Eduard Tihomirov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class Addresses implements Serializable { + private static final long serialVersionUID = 1L; + + private AddressModel[] elements; + + public AddressModel[] getElements() { + return elements; + } + + public void setElements(AddressModel[] elements) { + this.elements = elements; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/model/BrhsModel.java b/backend/src/main/java/ru/micord/ervu/security/esia/model/BrhsModel.java new file mode 100644 index 00000000..a0f9b97a --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/model/BrhsModel.java @@ -0,0 +1,73 @@ +package ru.micord.ervu.security.esia.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +/** + * @author Eduard Tihomirov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class BrhsModel implements Serializable { + + private static final long serialVersionUID = 1L; + + private String brhOid; + + private String name; + + private String kpp; + + private String leg; + + private Addresses addresses; + + private Contacts contacts; + + public String getBrhOid() { + return brhOid; + } + + public void setBrhOid(String brhOid) { + this.brhOid = brhOid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getKpp() { + return kpp; + } + + public void setKpp(String kpp) { + this.kpp = kpp; + } + + public String getLeg() { + return leg; + } + + public void setLeg(String leg) { + this.leg = leg; + } + + public Addresses getAddresses() { + return addresses; + } + + public void setAddresses(Addresses addresses) { + this.addresses = addresses; + } + + public Contacts getContacts() { + return contacts; + } + + public void setContacts(Contacts contacts) { + this.contacts = contacts; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/model/ContactModel.java b/backend/src/main/java/ru/micord/ervu/security/esia/model/ContactModel.java new file mode 100644 index 00000000..89cf82f9 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/model/ContactModel.java @@ -0,0 +1,44 @@ +package ru.micord.ervu.security.esia.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * @author Eduard Tihomirov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class ContactModel implements Serializable { + + private static final long serialVersionUID = 1L; + + private String type; + + private String value; + + private String vrfStu; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getVrfStu() { + return vrfStu; + } + + public void setVrfStu(String vrfStu) { + this.vrfStu = vrfStu; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/model/Contacts.java b/backend/src/main/java/ru/micord/ervu/security/esia/model/Contacts.java new file mode 100644 index 00000000..b05ce57d --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/model/Contacts.java @@ -0,0 +1,23 @@ +package ru.micord.ervu.security.esia.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * @author Eduard Tihomirov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class Contacts implements Serializable { + private static final long serialVersionUID = 1L; + + private ContactModel[] elements; + + public ContactModel[] getElements() { + return elements; + } + + public void setElements(ContactModel[] elements) { + this.elements = elements; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/model/EmployeeModel.java b/backend/src/main/java/ru/micord/ervu/security/esia/model/EmployeeModel.java new file mode 100644 index 00000000..7c019e6a --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/model/EmployeeModel.java @@ -0,0 +1,72 @@ +package ru.micord.ervu.security.esia.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * @author Eduard Tihomirov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class EmployeeModel implements Serializable { + + private String prnOid; + + private String orgOid; + + private Boolean chief; + + private Boolean blocked; + + private String position; + + private PersonModel person; + + public String getPrnOid() { + return prnOid; + } + + public void setPrnOid(String prnOid) { + this.prnOid = prnOid; + } + + public String getOrgOid() { + return orgOid; + } + + public void setOrgOid(String orgOid) { + this.orgOid = orgOid; + } + + public Boolean getChief() { + return chief; + } + + public void setChief(Boolean chief) { + this.chief = chief; + } + + public Boolean getBlocked() { + return blocked; + } + + public void setBlocked(Boolean blocked) { + this.blocked = blocked; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public PersonModel getPerson() { + return person; + } + + public void setPerson(PersonModel person) { + this.person = person; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/model/EsiaAccessToken.java b/backend/src/main/java/ru/micord/ervu/security/esia/model/EsiaAccessToken.java new file mode 100644 index 00000000..6c9c70f7 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/model/EsiaAccessToken.java @@ -0,0 +1,97 @@ +package ru.micord.ervu.security.esia.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author Eduard Tihomirov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class EsiaAccessToken implements Serializable { + + private static final long serialVersionUID = -8580344482588383113L; + + private Long exp; + + private String scope; + + private String iss; + + private Long nbf; + + @JsonProperty("urn:esia:sid") + private String sid; + + @JsonProperty("urn:esia:sbj_id") + private String sbj_id; + + private String client_id; + + private Long iat; + + public Long getExp() { + return exp; + } + + public void setExp(Long exp) { + this.exp = exp; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + + public String getIss() { + return iss; + } + + public void setIss(String iss) { + this.iss = iss; + } + + public Long getNbf() { + return nbf; + } + + public void setNbf(Long nbf) { + this.nbf = nbf; + } + + public String getSid() { + return sid; + } + + public void setSid(String sid) { + this.sid = sid; + } + + public String getSbj_id() { + return sbj_id; + } + + public void setSbj_id(String sbj_id) { + this.sbj_id = sbj_id; + } + + public String getClient_id() { + return client_id; + } + + public void setClient_id(String client_id) { + this.client_id = client_id; + } + + public Long getIat() { + return iat; + } + + public void setIat(Long iat) { + this.iat = iat; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/model/EsiaTokenResponse.java b/backend/src/main/java/ru/micord/ervu/security/esia/model/EsiaTokenResponse.java new file mode 100644 index 00000000..c4919c87 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/model/EsiaTokenResponse.java @@ -0,0 +1,94 @@ +package ru.micord.ervu.security.esia.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * @author Eduard Tihomirov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class EsiaTokenResponse implements Serializable { + + private static final long serialVersionUID = 7655328287602576975L; + + private String id_token; + + private String access_token; + + private String refresh_token; + + private String state; + + private String token_type; + + private Long expires_in; + + private String error; + + private String error_description; + + public String getId_token() { + return id_token; + } + + public void setId_token(String id_token) { + this.id_token = id_token; + } + + public String getAccess_token() { + return access_token; + } + + public void setAccess_token(String access_token) { + this.access_token = access_token; + } + + public String getRefresh_token() { + return refresh_token; + } + + public void setRefresh_token(String refresh_token) { + this.refresh_token = refresh_token; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getToken_type() { + return token_type; + } + + public void setToken_type(String token_type) { + this.token_type = token_type; + } + + public Long getExpires_in() { + return expires_in; + } + + public void setExpires_in(Long expires_in) { + this.expires_in = expires_in; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public String getError_description() { + return error_description; + } + + public void setError_description(String error_description) { + this.error_description = error_description; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/model/FormUrlencoded.java b/backend/src/main/java/ru/micord/ervu/security/esia/model/FormUrlencoded.java new file mode 100644 index 00000000..60b54f42 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/model/FormUrlencoded.java @@ -0,0 +1,42 @@ +package ru.micord.ervu.security.esia.model; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +/** + * Данные HTML-формы для POST с Content-Type=application/x-www-form-urlencoded. + */ +public class FormUrlencoded { + + // todo: private final Map> ... + private final Map formData = new HashMap<>(); + + /** + * Устанавливает параметр в форму. + */ + public FormUrlencoded setParameter(String name, String value) { + if (name != null) formData.put(name, value); + return this; + } + + /** + * Собирает из формы и возвращает строку в виде application/x-www-form-urlencoded. + */ + public String toFormUrlencodedString() { + final StringBuilder sb = new StringBuilder(); + formData.forEach((key, value) -> { + if (key != null) key = URLEncoder.encode(key, StandardCharsets.UTF_8); + if (value != null) value = URLEncoder.encode(value, StandardCharsets.UTF_8); + if (sb.length() > 0) sb.append("&"); + sb.append(key).append("=").append(value); + }); + return sb.toString(); + } + + @Override + public String toString() { + return toFormUrlencodedString(); + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/model/OrgInfoModel.java b/backend/src/main/java/ru/micord/ervu/security/esia/model/OrgInfoModel.java new file mode 100644 index 00000000..f3ad515d --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/model/OrgInfoModel.java @@ -0,0 +1,24 @@ +package ru.micord.ervu.security.esia.model; + +import ru.cg.webbpm.modules.webkit.annotations.Model; + +/** + * @author Eduard Tihomirov + */ +@Model +public class OrgInfoModel { + public String empFullname; + public String fullName; + public String shortName; + public String olgAddress; + public String opsAddress; + public String chiefFullname; + public String chiefPosition; + public String ogrn; + public String kpp; + public String inn; + public String empPosition; + public String mobile; + public String email; + public String userRoles; +} diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/model/OrganizationModel.java b/backend/src/main/java/ru/micord/ervu/security/esia/model/OrganizationModel.java new file mode 100644 index 00000000..f82d594d --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/model/OrganizationModel.java @@ -0,0 +1,174 @@ +package ru.micord.ervu.security.esia.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * @author Eduard Tihomirov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class OrganizationModel implements Serializable { + + private static final long serialVersionUID = 1L; + + private String oid; + + private String fullName; + + private String shortName; + + private String type; + + private String inn; + + private String ogrn; + + private String leg; + + private String kpp; + + private Addresses addresses; + + private Contacts contacts; + + private Long staffCount; + + private Long branchesCount; + + private BrhsModel[] brhs; + + private Boolean isLiquidated; + + private String agencyTerRange; + + private String agencyType; + + public String getOid() { + return oid; + } + + public void setOid(String oid) { + this.oid = oid; + } + + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public String getShortName() { + return shortName; + } + + public void setShortName(String shortName) { + this.shortName = shortName; + } + + public String getInn() { + return inn; + } + + public void setInn(String inn) { + this.inn = inn; + } + + public String getOgrn() { + return ogrn; + } + + public void setOgrn(String ogrn) { + this.ogrn = ogrn; + } + + public String getLeg() { + return leg; + } + + public void setLeg(String leg) { + this.leg = leg; + } + + public String getKpp() { + return kpp; + } + + public void setKpp(String kpp) { + this.kpp = kpp; + } + + public Addresses getAddresses() { + return addresses; + } + + public void setAddresses(Addresses addresses) { + this.addresses = addresses; + } + + public Contacts getContacts() { + return contacts; + } + + public void setContacts(Contacts contacts) { + this.contacts = contacts; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Long getStaffCount() { + return staffCount; + } + + public void setStaffCount(Long staffCount) { + this.staffCount = staffCount; + } + + public Long getBranchesCount() { + return branchesCount; + } + + public void setBranchesCount(Long branchesCount) { + this.branchesCount = branchesCount; + } + + public BrhsModel[] getBrhs() { + return brhs; + } + + public void setBrhs(BrhsModel[] brhs) { + this.brhs = brhs; + } + + public Boolean getIsLiquidated() { + return isLiquidated; + } + + public void setIsLiquidated(Boolean liquidated) { + isLiquidated = liquidated; + } + + public String getAgencyTerRange() { + return agencyTerRange; + } + + public void setAgencyTerRange(String agencyTerRange) { + this.agencyTerRange = agencyTerRange; + } + + public String getAgencyType() { + return agencyType; + } + + public void setAgencyType(String agencyType) { + this.agencyType = agencyType; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/model/PassportModel.java b/backend/src/main/java/ru/micord/ervu/security/esia/model/PassportModel.java new file mode 100644 index 00000000..9b74cae8 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/model/PassportModel.java @@ -0,0 +1,74 @@ +package ru.micord.ervu.security.esia.model; + +import java.io.Serializable; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; +import org.springframework.data.elasticsearch.annotations.DateFormat; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +/** + * @author Eduard Tihomirov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class PassportModel implements Serializable { + + private static final long serialVersionUID = 1L; + + private String series; + + private String number; + + @Field(type = FieldType.Date, store = true, format = DateFormat.basic_date) + @JsonSerialize(using = LocalDateSerializer.class) + @JsonFormat(pattern = "dd.MM.yyyy") + private Date issueDate; + + private String issueId; + + private String issuedBy; + + public String getSeries() { + return series; + } + + public void setSeries(String series) { + this.series = series; + } + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } + + public Date getIssueDate() { + return issueDate; + } + + public void setIssueDate(Date issueDate) { + this.issueDate = issueDate; + } + + public String getIssueId() { + return issueId; + } + + public void setIssueId(String issueId) { + this.issueId = issueId; + } + + public String getIssuedBy() { + return issuedBy; + } + + public void setIssuedBy(String issuedBy) { + this.issuedBy = issuedBy; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/model/PersonModel.java b/backend/src/main/java/ru/micord/ervu/security/esia/model/PersonModel.java new file mode 100644 index 00000000..2375c650 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/model/PersonModel.java @@ -0,0 +1,139 @@ +package ru.micord.ervu.security.esia.model; + +import java.io.Serializable; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * @author Eduard Tihomirov + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class PersonModel implements Serializable { + + private static final long serialVersionUID = 1L; + + private String orgOid; + + private String lastName; + + private String firstName; + + private String middleName; + + @JsonFormat(pattern = "dd.MM.yyyy") + private Date birthDate; + + private String gender; + + private String citizenship; + + private String snils; + + private String inn; + + private String birthPlace; + + //Данные не доступны при входе юр лицом + private String email; + + //Данные не доступны при входе юр лицом + private String mobileNumber; + + public String getOrgOid() { + return orgOid; + } + + public void setOrgOid(String orgOid) { + this.orgOid = orgOid; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getMiddleName() { + return middleName; + } + + public void setMiddleName(String middleName) { + this.middleName = middleName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getMobileNumber() { + return mobileNumber; + } + + public void setMobileNumber(String mobileNumber) { + this.mobileNumber = mobileNumber; + } + + public Date getBirthDate() { + return birthDate; + } + + public void setBirthDate(Date birthDate) { + this.birthDate = birthDate; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public String getCitizenship() { + return citizenship; + } + + public void setCitizenship(String citizenship) { + this.citizenship = citizenship; + } + + public String getSnils() { + return snils; + } + + public void setSnils(String snils) { + this.snils = snils; + } + + public String getInn() { + return inn; + } + + public void setInn(String inn) { + this.inn = inn; + } + + public String getBirthPlace() { + return birthPlace; + } + + public void setBirthPlace(String birthPlace) { + this.birthPlace = birthPlace; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/service/EsiaAuthService.java b/backend/src/main/java/ru/micord/ervu/security/esia/service/EsiaAuthService.java new file mode 100644 index 00000000..d05715ce --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/service/EsiaAuthService.java @@ -0,0 +1,486 @@ +package ru.micord.ervu.security.esia.service; + +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.net.URL; +import java.net.URLEncoder; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.fasterxml.jackson.databind.ObjectMapper; +import ervu.service.classifier.OkopfService; +import ru.micord.ervu.security.esia.config.EsiaConfig; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import ru.micord.ervu.kafka.model.Brhs; +import ru.micord.ervu.kafka.model.Data; +import ru.micord.ervu.kafka.model.Employee; +import ru.micord.ervu.kafka.model.ErvuOrgResponse; +import ru.micord.ervu.kafka.model.OrgInfo; +import ru.micord.ervu.kafka.service.ReplyingKafkaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; +import ru.micord.ervu.security.esia.model.EmployeeModel; +import ru.micord.ervu.security.esia.model.EsiaAccessToken; +import ru.micord.ervu.security.esia.model.EsiaTokenResponse; +import ru.micord.ervu.security.esia.model.FormUrlencoded; +import ru.micord.ervu.security.esia.model.OrganizationModel; +import ru.micord.ervu.security.webbpm.jwt.service.JwtTokenService; +import ru.micord.ervu.security.webbpm.jwt.model.Token; + +/** + * @author Eduard Tihomirov + */ +@Service +public class EsiaAuthService { + + @Value("${cookie-path:#{null}}") + private String path; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private EsiaConfig esiaConfig; + + @Autowired + private UlDataService ulDataService; + + @Autowired + private JwtTokenService jwtTokenService; + + @Autowired + @Qualifier("org") + private ReplyingKafkaService replyingKafkaService; + + @Autowired + private OkopfService okopfService; + + @Value("${ervu-kafka.org-reply-topic}") + private String requestReplyTopic; + + @Value("${ervu-kafka.org-request-topic}") + private String requestTopic; + + public String generateAuthCodeUrl() { + try { + String clientId = esiaConfig.getClientId(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss xx"); + ZonedDateTime dt = ZonedDateTime.now(); + String timestamp = dt.format(formatter); + String state = UUID.randomUUID().toString(); + String redirectUrl = esiaConfig.getRedirectUrl(); + String redirectUrlEncoded = redirectUrl.replaceAll(":", "%3A") + .replaceAll("/", "%2F"); + String scope = esiaConfig.getEsiaScopes(); + String scopeOrg = esiaConfig.getEsiaOrgScopes(); + + Map parameters = new LinkedHashMap(); + parameters.put("client_id", clientId); + parameters.put("scope", scope); + parameters.put("scope_org", scopeOrg); + parameters.put("timestamp", timestamp); + parameters.put("state", state); + parameters.put("redirect_uri", esiaConfig.getRedirectUrl()); + + String clientSecret = signMap(parameters); + + String responseType = "code"; + + String authUrl = esiaConfig.getEsiaBaseUri() + esiaConfig.getEsiaCodeUrl(); + + URL url = new URL(authUrl); + Map params = mapOf("scope", scope, + "scope_org", scopeOrg.replaceAll(":", "%3A") + .replaceAll("/", "%2F"), + "timestamp", urlEncode(timestamp), + "state", state, + "client_id", clientId, + "client_secret", clientSecret, + "response_type", responseType, + "redirect_uri", redirectUrlEncoded, + "obj_type", "B L F A", + "client_certificate_hash", esiaConfig.getClientCertHash()); + + return makeRequest(url, params); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static Map mapOf(String... params) { + if (params.length % 2 != 0) { + throw new IllegalArgumentException("Invalid params count"); + } + Map map = new LinkedHashMap<>(params.length / 2); + for (int i = 0; i < params.length / 2; i++) { + map.put(params[i * 2], params[i * 2 + 1]); + } + return map; + } + + private static String urlEncode(String s) { + try { + return URLEncoder.encode(s, "UTF-8") + .replace("+", "%20"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + + private static String makeRequest(URL url, Map params) { + StringBuilder uriBuilder = new StringBuilder(url.toString()); + uriBuilder.append('?'); + for (Map.Entry node : params.entrySet()) { + uriBuilder.append(node.getKey()).append('=').append(node.getValue()).append("&"); + } + return uriBuilder.toString(); + } + + public boolean getEsiaTokensByCode(String esiaAuthCode, HttpServletRequest request, HttpServletResponse response) { + try { + String clientId = esiaConfig.getClientId(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss xx"); + ZonedDateTime dt = ZonedDateTime.now(); + String timestamp = dt.format(formatter); + String state = UUID.randomUUID().toString(); + String redirectUrl = esiaConfig.getRedirectUrl(); + String scope = esiaConfig.getEsiaScopes(); + String scopeOrg = esiaConfig.getEsiaOrgScopes(); + + Map parameters = new LinkedHashMap(); + parameters.put("client_id", clientId); + parameters.put("scope", scope); + parameters.put("scope_org", scopeOrg); + parameters.put("timestamp", timestamp); + parameters.put("state", state); + parameters.put("redirect_uri", redirectUrl); + parameters.put("code", esiaAuthCode); + + String clientSecret = signMap(parameters); + String authUrl = esiaConfig.getEsiaBaseUri() + esiaConfig.getEsiaTokenUrl(); + String postBody = new FormUrlencoded() + .setParameter("client_id", clientId) + .setParameter("code", esiaAuthCode) + .setParameter("grant_type", "authorization_code") + .setParameter("client_secret", clientSecret) + .setParameter("state", state) + .setParameter("redirect_uri", redirectUrl) + .setParameter("scope", scope) + .setParameter("scope_org", scopeOrg) + .setParameter("timestamp", timestamp) + .setParameter("token_type", "Bearer") + .setParameter("client_certificate_hash", esiaConfig.getClientCertHash()) + .toFormUrlencodedString(); + HttpRequest postReq = HttpRequest.newBuilder(URI.create(authUrl)) + .header(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded") + .POST(HttpRequest.BodyPublishers.ofString(postBody)) + .timeout(Duration.ofSeconds(esiaConfig.getRequestTimeout())) + .build(); + HttpResponse postResp = HttpClient.newBuilder() + .connectTimeout(Duration.ofSeconds(esiaConfig.getConnectionTimeout())) + .build() + .send(postReq, HttpResponse.BodyHandlers.ofString()); + String responseString = postResp.body(); + EsiaTokenResponse tokenResponse = objectMapper.readValue(responseString, EsiaTokenResponse.class); + if (tokenResponse != null && tokenResponse.getError() != null) { + throw new RuntimeException(tokenResponse.getError_description()); + } + String accessToken = tokenResponse.getAccess_token(); + boolean hasRole = ulDataService.checkRole(accessToken); + if (!hasRole) { + throw new RuntimeException("The user does not have the required role"); + } + String cookiePath = null; + if (path != null) { + cookiePath = path; + } + else { + cookiePath = request.getContextPath(); + } + Cookie cookie = new Cookie("access_token", accessToken); + cookie.setHttpOnly(true); + cookie.setPath(cookiePath); + response.addCookie(cookie); + + String refreshToken = tokenResponse.getRefresh_token(); + Cookie cookieRefresh = new Cookie("refresh_token", refreshToken); + cookieRefresh.setHttpOnly(true); + cookieRefresh.setPath(cookiePath); + response.addCookie(cookieRefresh); + + EsiaAccessToken esiaAccessToken = ulDataService.readToken(accessToken); + String ervuId = getErvuId(accessToken, esiaAccessToken.getSbj_id()); + Token token = jwtTokenService.createAccessToken(esiaAccessToken.getSbj_id(), tokenResponse.getExpires_in(), ervuId); + Cookie authToken = new Cookie("auth_token", token.getValue()); + authToken.setPath(cookiePath); + authToken.setHttpOnly(true); + response.addCookie(authToken); + SecurityContextHolder.getContext() + .setAuthentication( + new UsernamePasswordAuthenticationToken(esiaAccessToken.getSbj_id(), null)); + + Cookie isAuth = new Cookie("is_auth", "true"); + isAuth.setMaxAge(tokenResponse.getExpires_in().intValue()); + isAuth.setPath(cookiePath); + response.addCookie(isAuth); + return true; + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + public void getEsiaTokensByRefreshToken(HttpServletRequest request, HttpServletResponse response) { + try { + String refreshToken = null; + Cookie[] cookies = request.getCookies(); + if (cookies != null) { + for (Cookie cookie : cookies) { + if (cookie.getName().equals("refresh_token")) { + refreshToken = cookie.getValue(); + } + } + } + String clientId = esiaConfig.getClientId(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss xx"); + ZonedDateTime dt = ZonedDateTime.now(); + String timestamp = dt.format(formatter); + String state = UUID.randomUUID().toString(); + String redirectUrl = esiaConfig.getRedirectUrl(); + String scope = esiaConfig.getEsiaScopes(); + String scopeOrg = esiaConfig.getEsiaOrgScopes(); + + Map parameters = new LinkedHashMap(); + parameters.put("client_id", clientId); + parameters.put("scope", scope); + parameters.put("scope_org", scopeOrg); + parameters.put("timestamp", timestamp); + parameters.put("state", state); + parameters.put("redirect_uri", esiaConfig.getRedirectUrl()); + parameters.put("refresh_token", refreshToken); + + String clientSecret = signMap(parameters); + String authUrl = esiaConfig.getEsiaBaseUri() + esiaConfig.getEsiaTokenUrl(); + String postBody = new FormUrlencoded() + .setParameter("client_id", clientId) + .setParameter("refresh_token", refreshToken) + .setParameter("grant_type", "refresh_token") + .setParameter("client_secret", clientSecret) + .setParameter("state", state) + .setParameter("redirect_uri", redirectUrl) + .setParameter("scope", scope) + .setParameter("scope_org", scopeOrg) + .setParameter("timestamp", timestamp) + .setParameter("token_type", "Bearer") + .setParameter("client_certificate_hash", esiaConfig.getClientCertHash()) + .toFormUrlencodedString(); + HttpRequest postReq = HttpRequest.newBuilder(URI.create(authUrl)) + .header(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded") + .POST(HttpRequest.BodyPublishers.ofString(postBody)) + .timeout(Duration.ofSeconds(esiaConfig.getRequestTimeout())) + .build(); + HttpResponse postResp = HttpClient.newBuilder() + .connectTimeout(Duration.ofSeconds(esiaConfig.getConnectionTimeout())) + .build() + .send(postReq, HttpResponse.BodyHandlers.ofString()); + String responseString = postResp.body(); + EsiaTokenResponse tokenResponse = objectMapper.readValue(responseString, EsiaTokenResponse.class); + if (tokenResponse != null && tokenResponse.getError() != null) { + throw new RuntimeException(tokenResponse.getError_description()); + } + String accessToken = tokenResponse.getAccess_token(); + Cookie cookie = new Cookie("access_token", accessToken); + cookie.setHttpOnly(true); + String cookiePath = null; + if (path != null) { + cookiePath = path; + } + else { + cookiePath = request.getContextPath(); + } + cookie.setPath(cookiePath); + response.addCookie(cookie); + + String newRefreshToken = tokenResponse.getRefresh_token(); + Cookie cookieRefresh = new Cookie("refresh_token", newRefreshToken); + cookieRefresh.setHttpOnly(true); + cookieRefresh.setPath(cookiePath); + response.addCookie(cookieRefresh); + EsiaAccessToken esiaAccessToken = ulDataService.readToken(accessToken); + String ervuId = getErvuId(accessToken, esiaAccessToken.getSbj_id()); + Token token = jwtTokenService.createAccessToken(esiaAccessToken.getSbj_id(), tokenResponse.getExpires_in(), ervuId); + Cookie authToken = new Cookie("auth_token", token.getValue()); + authToken.setPath(cookiePath); + authToken.setHttpOnly(true); + response.addCookie(authToken); + SecurityContextHolder.getContext() + .setAuthentication( + new UsernamePasswordAuthenticationToken(esiaAccessToken.getSbj_id(), null)); + + Cookie isAuth = new Cookie("is_auth", "true"); + isAuth.setMaxAge(tokenResponse.getExpires_in().intValue()); + isAuth.setPath(cookiePath); + response.addCookie(isAuth); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + private String signMap(Map paramsToSign) { + try { + StringBuilder toSign = new StringBuilder(); + for (String s : paramsToSign.values()) { + toSign.append(s); + } + String requestBody = toSign.toString(); + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(esiaConfig.getSignUrl())) + .header("Content-Type", "text/plain") + .POST(HttpRequest.BodyPublishers.ofString(requestBody, StandardCharsets.UTF_8)) + .build(); + HttpResponse response = HttpClient.newBuilder() + .connectTimeout(Duration.ofSeconds(esiaConfig.getConnectionTimeout())) + .build() + .send(request, HttpResponse.BodyHandlers.ofString()); + errorHandler(response); + return response.body(); + + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + private void errorHandler(HttpResponse httpResponse) { + if (httpResponse.statusCode() != 200) { + throw new RuntimeException(httpResponse.statusCode() + " " + httpResponse.body()); + } + } + + public String logout(HttpServletRequest request, HttpServletResponse response) { + try { + Cookie[] cookies = request.getCookies(); + if (cookies != null) + for (Cookie cookie : cookies) { + if (cookie.getName().equals("auth_token") || cookie.getName().equals("refresh_token") + || cookie.getName().equals("access_token") || cookie.getName().equals("is_auth")) { + cookie.setValue(""); + cookie.setMaxAge(0); + response.addCookie(cookie); + } + } + String logoutUrl = esiaConfig.getEsiaBaseUri() + esiaConfig.getEsiaLogoutUrl(); + String redirectUrl = esiaConfig.getRedirectUrl(); + URL url = new URL(logoutUrl); + Map params = mapOf( + "client_id", esiaConfig.getClientId(), + "redirect_url", redirectUrl); + return makeRequest(url, params); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + public String getErvuId(String accessToken, String prnOid) { + try { + OrganizationModel organizationModel = ulDataService.getOrganizationModel(accessToken); + EmployeeModel employeeModel = ulDataService.getEmployeeModel(accessToken); + EmployeeModel chiefModel = ulDataService.getChiefEmployeeModel(accessToken); + OrgInfo orgInfo = copyToOrgInfo(organizationModel, employeeModel, chiefModel); + orgInfo.setOrgTypeName(okopfService.findTitleByLeg(orgInfo.getOrgTypeLeg())); + String kafkaResponse = replyingKafkaService.sendMessageAndGetReply(requestTopic, + requestReplyTopic, objectMapper.writeValueAsString(orgInfo) + ); + ErvuOrgResponse ervuOrgResponse = objectMapper.readValue(kafkaResponse, ErvuOrgResponse.class); + List listErvuId = Arrays.stream(ervuOrgResponse.getData()).filter(data -> data.getPrnOid().equals(prnOid)).map( + Data::getOrgId_ERVU).toList(); + if (listErvuId.size() > 1) { + throw new RuntimeException("More than one ervuId for prnOid = " + prnOid); + } + else if (listErvuId.isEmpty()) { + throw new RuntimeException("No ervuId for prnOid = " + prnOid); + } + return listErvuId.get(0); + } + catch (Exception e) { + throw new RuntimeException(e); + } + + + } + + private OrgInfo copyToOrgInfo(OrganizationModel organizationModel, EmployeeModel employeeModel, EmployeeModel chiefModel ) { + OrgInfo orgInfo = new OrgInfo(); + orgInfo.setChiefInfo(copyToEmployee(chiefModel)); + orgInfo.setSenderInfo(copyToEmployee(employeeModel)); + orgInfo.setBrhs( + Arrays.stream(organizationModel.getBrhs()).map(brhsModel -> { + Brhs brhs = new Brhs(); + brhs.setName(brhsModel.getName()); + brhs.setBrhOid(brhsModel.getBrhOid()); + brhs.setKpp(brhsModel.getKpp()); + brhs.setLeg(brhsModel.getLeg()); + brhs.setAddresses(brhsModel.getAddresses().getElements()); + brhs.setContacts(brhsModel.getContacts().getElements()); + return brhs; + }).toArray(Brhs[]::new)); + orgInfo.setAddresses(organizationModel.getAddresses().getElements()); + orgInfo.setContacts(organizationModel.getContacts().getElements()); + orgInfo.setInn(organizationModel.getInn()); + orgInfo.setOrgFullName(organizationModel.getFullName()); + orgInfo.setOrgTypeLeg(organizationModel.getLeg()); + orgInfo.setKpp(organizationModel.getKpp()); + orgInfo.setLiquidated(organizationModel.getIsLiquidated()); + orgInfo.setOgrn(organizationModel.getOgrn()); + orgInfo.setOrgOid(organizationModel.getOid()); + orgInfo.setOrgShortName(organizationModel.getShortName()); + orgInfo.setStaffCount(organizationModel.getStaffCount()); + orgInfo.setBranchesCount((long) orgInfo.getBrhs().length); + orgInfo.setOrgType(organizationModel.getType()); + orgInfo.setOrgAgencyTerRange(organizationModel.getAgencyTerRange()); + orgInfo.setOrgAgencyType(organizationModel.getAgencyType()); + return orgInfo; + } + + private Employee copyToEmployee(EmployeeModel employeeModel) { + Employee employee = new Employee(); + employee.setBirthDate(employeeModel.getPerson().getBirthDate()); + employee.setFirstName(employeeModel.getPerson().getFirstName()); + employee.setLastName(employeeModel.getPerson().getLastName()); + employee.setMiddleName(employeeModel.getPerson().getMiddleName()); + employee.setBlocked(employeeModel.getBlocked()); + employee.setChief(employeeModel.getChief()); + employee.setCitizenship(employeeModel.getPerson().getCitizenship()); + employee.setEmail(employeeModel.getPerson().getEmail()); + employee.setPhoneNumber(employeeModel.getPerson().getMobileNumber()); + employee.setBirthPlace(employeeModel.getPerson().getBirthPlace()); + employee.setGender(employeeModel.getPerson().getGender()); + employee.setInn(employeeModel.getPerson().getInn()); + employee.setSnils(employeeModel.getPerson().getSnils()); + employee.setPosition(employeeModel.getPosition()); + employee.setPrnOid(employeeModel.getPrnOid()); + employee.setOrgOid(employeeModel.getOrgOid()); + return employee; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/service/EsiaDataService.java b/backend/src/main/java/ru/micord/ervu/security/esia/service/EsiaDataService.java new file mode 100644 index 00000000..8eac1efc --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/service/EsiaDataService.java @@ -0,0 +1,99 @@ +package ru.micord.ervu.security.esia.service; + +import java.util.Arrays; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ru.micord.ervu.security.esia.model.*; + +/** + * @author Eduard Tihomirov + */ +@Service +public class EsiaDataService { + + @Autowired + private UlDataService ulDataService; + + public OrgInfoModel getOrgInfo(HttpServletRequest request) { + String accessToken = getAccessToken(request); + if (accessToken == null) { + return null; + } + OrganizationModel organizationModel = ulDataService.getOrganizationModel(accessToken); + EmployeeModel chiefEmployeeModel = ulDataService.getChiefEmployeeModel(accessToken); + EmployeeModel employeeModel = ulDataService.getEmployeeModel(accessToken); + OrgInfoModel orgInfoModel = new OrgInfoModel(); + + orgInfoModel.empFullname = + employeeModel.getPerson().getLastName() + " " + employeeModel.getPerson().getFirstName() + + " " + employeeModel.getPerson().getMiddleName(); + orgInfoModel.empPosition = employeeModel.getPosition(); + orgInfoModel.fullName = organizationModel.getFullName(); + orgInfoModel.shortName = organizationModel.getShortName(); + Addresses addresses = organizationModel.getAddresses(); + if (addresses != null) { + Arrays.stream(addresses.getElements()).forEach(addressModel -> { + if (addressModel.getType().equals("OLG")) { + orgInfoModel.olgAddress = addressModel.getAddressStr(); + } + else if (addressModel.getType().equals("OPS")) { + orgInfoModel.opsAddress = addressModel.getAddressStr(); + } + } ); + } + orgInfoModel.chiefFullname = + chiefEmployeeModel.getPerson().getLastName() + " " + chiefEmployeeModel.getPerson() + .getFirstName() + " " + chiefEmployeeModel.getPerson().getMiddleName(); + orgInfoModel.chiefPosition = chiefEmployeeModel.getPosition(); + orgInfoModel.ogrn = organizationModel.getOgrn(); + orgInfoModel.kpp = organizationModel.getKpp(); + orgInfoModel.inn = organizationModel.getInn(); + Contacts contacts = organizationModel.getContacts(); + if (contacts != null) { + Arrays.stream(contacts.getElements()).forEach(contactModel -> { + if (contactModel.getType().equals("OPH") && contactModel.getVrfStu().equals("VERIFIED")) { + orgInfoModel.mobile = contactModel.getValue(); + } + else if (contactModel.getType().equals("OEM") && contactModel.getVrfStu().equals("VERIFIED")) { + orgInfoModel.email = contactModel.getValue(); + } + } ); + } + orgInfoModel.userRoles = ulDataService.getAllUserRoles(accessToken); + return orgInfoModel; + } + + public String getOrgUnitName(HttpServletRequest request) { + String accessToken = getAccessToken(request); + if (accessToken == null) { + return null; + } + OrganizationModel organizationModel = ulDataService.getOrganizationModel(accessToken); + return organizationModel.getFullName(); + } + + public String getUserFullname(HttpServletRequest request) { + String accessToken = getAccessToken(request); + if (accessToken == null) { + return null; + } + EsiaAccessToken esiaAccessToken = ulDataService.readToken(accessToken); + PersonModel personModel = ulDataService.getPersonData(esiaAccessToken.getSbj_id(), accessToken); + return personModel.getLastName() + " " + personModel.getFirstName().charAt(0) + ". " + personModel.getMiddleName().charAt(0) + "."; + } + + private String getAccessToken(HttpServletRequest request) { + Cookie[] cookies = request.getCookies(); + if (cookies != null) { + for (Cookie cookie : cookies) { + if (cookie.getName().equals("access_token")) { + return cookie.getValue(); + } + } + } + return null; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/service/UlDataService.java b/backend/src/main/java/ru/micord/ervu/security/esia/service/UlDataService.java new file mode 100644 index 00000000..bce394ba --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/service/UlDataService.java @@ -0,0 +1,26 @@ +package ru.micord.ervu.security.esia.service; + +import ru.micord.ervu.security.esia.model.EmployeeModel; +import ru.micord.ervu.security.esia.model.EsiaAccessToken; +import ru.micord.ervu.security.esia.model.OrganizationModel; +import ru.micord.ervu.security.esia.model.PersonModel; + +/** + * @author Eduard Tihomirov + */ +public interface UlDataService { + + boolean checkRole(String accessToken); + + EmployeeModel getEmployeeModel(String accessToken); + + EmployeeModel getChiefEmployeeModel(String accessToken); + + OrganizationModel getOrganizationModel(String accessToken); + + PersonModel getPersonData(String prnsId, String accessToken); + + EsiaAccessToken readToken(String accessToken); + + String getAllUserRoles(String accessToken); +} diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/service/UlDataServiceImpl.java b/backend/src/main/java/ru/micord/ervu/security/esia/service/UlDataServiceImpl.java new file mode 100644 index 00000000..bb3d071f --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/esia/service/UlDataServiceImpl.java @@ -0,0 +1,257 @@ +package ru.micord.ervu.security.esia.service; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.Duration; +import java.util.Arrays; +import java.util.Base64; +import java.util.Optional; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import ru.micord.ervu.security.esia.config.EsiaConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Service; +import ru.micord.ervu.security.esia.model.*; + +/** + * @author Eduard Tihomirov + */ +@Service +public class UlDataServiceImpl implements UlDataService { + + @Autowired + private EsiaConfig esiaConfig; + + @Autowired + private ObjectMapper objectMapper; + + @Override + public EmployeeModel getEmployeeModel(String accessToken) { + EsiaAccessToken esiaAccessToken = readToken(accessToken); + String scope = esiaAccessToken.getScope(); + String orgOid = scope.substring(scope.indexOf('=') + 1, scope.indexOf(' ')); + String prnsId = esiaAccessToken.getSbj_id(); + EmployeeModel employeeModel = getEmplData(prnsId, orgOid, accessToken); + return employeeModel; + } + + @Override + public EmployeeModel getChiefEmployeeModel(String accessToken) { + try { + EsiaAccessToken esiaAccessToken = readToken(accessToken); + String scope = esiaAccessToken.getScope(); + String orgOid = scope.substring(scope.indexOf('=') + 1, scope.indexOf(' ')); + String url = esiaConfig.getEsiaBaseUri() + "rs/orgs/" + orgOid + "/emps?embed=(elements)"; + HttpRequest getReq = HttpRequest.newBuilder(URI.create(url)) + .header(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded") + .header("Authorization", "Bearer ".concat(accessToken)) + .GET() + .timeout(Duration.ofSeconds(esiaConfig.getRequestTimeout())) + .build(); + HttpResponse getResp = HttpClient.newBuilder() + .connectTimeout(Duration.ofSeconds(esiaConfig.getConnectionTimeout())) + .build() + .send(getReq, HttpResponse.BodyHandlers.ofString()); + errorHandler(getResp); + EmployeeModel[] employeeModels = objectMapper.readValue( + objectMapper.readTree(getResp.body()).get("elements").toString(), EmployeeModel[].class); + Optional chief = Arrays.stream(employeeModels) + .filter(employee -> employee.getChief().equals(true) && employee.getBlocked().equals(false)) + .findFirst(); + if (chief.isPresent()) { + EmployeeModel chiefModel = chief.get(); + PersonModel personModel = getPersonData(chiefModel.getPrnOid(), accessToken); + chiefModel.setPerson(personModel); + return chiefModel; + } + return null; + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public OrganizationModel getOrganizationModel(String accessToken) { + EsiaAccessToken esiaAccessToken = readToken(accessToken); + String scope = esiaAccessToken.getScope(); + String orgOid = scope.substring(scope.indexOf('=') + 1, scope.indexOf(' ')); + OrganizationModel organizationModel = getOrgModel(orgOid, accessToken); + return organizationModel; + } + + private EmployeeModel getEmplData(String prnsId, String orgOid, String accessToken) { + try { + String url = esiaConfig.getEsiaBaseUri() + "rs/orgs/" + orgOid + "/emps/" + prnsId + "?embed=(elements.person)"; + HttpRequest getReq = HttpRequest.newBuilder(URI.create(url)) + .header(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded") + .header("Authorization", "Bearer ".concat(accessToken)) + .GET() + .timeout(Duration.ofSeconds(esiaConfig.getRequestTimeout())) + .build(); + HttpResponse getResp = HttpClient.newBuilder() + .connectTimeout(Duration.ofSeconds(esiaConfig.getConnectionTimeout())) + .build() + .send(getReq, HttpResponse.BodyHandlers.ofString()); + errorHandler(getResp); + return objectMapper.readValue(getResp.body(), EmployeeModel.class); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public PersonModel getPersonData(String prnsId, String accessToken) { + try { + String url = esiaConfig.getEsiaBaseUri() + "rs/prns/" + prnsId; + HttpRequest getReq = HttpRequest.newBuilder(URI.create(url)) + .header(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded") + .header("Authorization", "Bearer ".concat(accessToken)) + .GET() + .timeout(Duration.ofSeconds(esiaConfig.getRequestTimeout())) + .build(); + HttpResponse getResp = HttpClient.newBuilder() + .connectTimeout(Duration.ofSeconds(esiaConfig.getConnectionTimeout())) + .build() + .send(getReq, HttpResponse.BodyHandlers.ofString()); + errorHandler(getResp); + return objectMapper.readValue(getResp.body(), PersonModel.class); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public EsiaAccessToken readToken(String accessToken) { + try { + byte[] decodedBytes = Base64.getDecoder() + .decode( + accessToken.substring(accessToken.indexOf('.') + 1, accessToken.lastIndexOf('.')) + .replace('-', '+') + .replace('_', '/')); + String decodedString = new String(decodedBytes); + EsiaAccessToken esiaAccessToken = objectMapper.readValue(decodedString, + EsiaAccessToken.class + ); + return esiaAccessToken; + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + private OrganizationModel getOrgModel(String orgOid, String accessToken) { + try { + String url = esiaConfig.getEsiaBaseUri() + "rs/orgs/" + orgOid; + HttpRequest getReq = HttpRequest.newBuilder(URI.create(url + "?embed=(contacts.elements,addresses.elements)")) + .header(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded") + .header("Authorization", "Bearer ".concat(accessToken)) + .GET() + .timeout(Duration.ofSeconds(esiaConfig.getRequestTimeout())) + .build(); + HttpResponse getResp = HttpClient.newBuilder() + .connectTimeout(Duration.ofSeconds(esiaConfig.getConnectionTimeout())) + .build() + .send(getReq, HttpResponse.BodyHandlers.ofString()); + errorHandler(getResp); + OrganizationModel organizationModel = objectMapper.readValue(getResp.body(), + OrganizationModel.class + ); + HttpRequest getReqBrhs = HttpRequest.newBuilder( + URI.create(url + "/brhs?embed=(elements,addresses.elements,contacts.elements)")) + .header(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded") + .header("Authorization", "Bearer ".concat(accessToken)) + .GET() + .timeout(Duration.ofSeconds(esiaConfig.getRequestTimeout())) + .build(); + HttpResponse getRespBrhs = HttpClient.newBuilder() + .connectTimeout(Duration.ofSeconds(esiaConfig.getConnectionTimeout())) + .build() + .send(getReqBrhs, HttpResponse.BodyHandlers.ofString()); + errorHandler(getRespBrhs); + BrhsModel[] brhsModels = objectMapper.readValue( + objectMapper.readTree(getRespBrhs.body()).get("elements").toString(), BrhsModel[].class); + organizationModel.setBrhs(brhsModels); + return organizationModel; + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + private void errorHandler(HttpResponse httpResponse) { + if (httpResponse.statusCode() != 200) { + throw new RuntimeException(httpResponse.statusCode() + " " + httpResponse.body()); + } + } + + @Override + public boolean checkRole(String accessToken) { + try { + EsiaAccessToken esiaAccessToken = readToken(accessToken); + String scope = esiaAccessToken.getScope(); + String orgOid = scope.substring(scope.indexOf('=') + 1, scope.indexOf(' ')); + String prnsId = esiaAccessToken.getSbj_id(); + String url = esiaConfig.getEsiaBaseUri() + "rs/orgs/" + orgOid + "/emps/" + prnsId + "/grps?embed=(elements)"; + HttpRequest getReq = HttpRequest.newBuilder(URI.create(url)) + .header(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded") + .header("Authorization", "Bearer ".concat(accessToken)) + .GET() + .timeout(Duration.ofSeconds(esiaConfig.getRequestTimeout())) + .build(); + HttpResponse getResp = HttpClient.newBuilder() + .connectTimeout(Duration.ofSeconds(esiaConfig.getConnectionTimeout())) + .build() + .send(getReq, HttpResponse.BodyHandlers.ofString()); + errorHandler(getResp); + if (getResp.body().contains("MNSV89_UPLOAD_DATA")) { + return true; + } + else { + return false; + } + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public String getAllUserRoles(String accessToken) { + try { + EsiaAccessToken esiaAccessToken = readToken(accessToken); + String scope = esiaAccessToken.getScope(); + String orgOid = scope.substring(scope.indexOf('=') + 1, scope.indexOf(' ')); + String prnsId = esiaAccessToken.getSbj_id(); + String url = esiaConfig.getEsiaBaseUri() + "rs/orgs/" + orgOid + "/emps/" + prnsId + "/grps?embed=(elements)"; + HttpRequest getReq = HttpRequest.newBuilder(URI.create(url)) + .header(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded") + .header("Authorization", "Bearer ".concat(accessToken)) + .GET() + .timeout(Duration.ofSeconds(esiaConfig.getRequestTimeout())) + .build(); + HttpResponse getResp = HttpClient.newBuilder() + .connectTimeout(Duration.ofSeconds(esiaConfig.getConnectionTimeout())) + .build() + .send(getReq, HttpResponse.BodyHandlers.ofString()); + errorHandler(getResp); + JsonNode rootNode = objectMapper.readTree(getResp.body()); + JsonNode elementsNode = rootNode.path("elements"); + StringBuilder names = new StringBuilder(); + for (JsonNode element : elementsNode) { + String name = element.path("name").asText(); + names.append(name).append("\n"); + } + return names.toString(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/JwtAuthentication.java b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/JwtAuthentication.java new file mode 100644 index 00000000..47f65677 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/JwtAuthentication.java @@ -0,0 +1,77 @@ +package ru.micord.ervu.security.webbpm.jwt; + +import java.util.Collection; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.SpringSecurityCoreVersion; + +/** + * @author zamaliev + */ +public class JwtAuthentication implements Authentication { + + private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID; + + private final String userAccountId; + private final Authentication authentication; + private final String token; + + public JwtAuthentication(Authentication authentication, String userAccountId, String token) { + this.userAccountId = userAccountId; + this.authentication = authentication; + this.token = token; + } + + public JwtAuthentication(Authentication authentication, String userAccountId) { + this(authentication, userAccountId, null); + } + + public String getUserAccountId() { + return userAccountId; + } + + @Override + public Collection getAuthorities() { + return authentication.getAuthorities(); + } + + @Override + public Object getCredentials() { + return authentication.getCredentials(); + } + + @Override + public Object getDetails() { + return authentication.getDetails(); + } + + @Override + public Object getPrincipal() { + return authentication.getPrincipal(); + } + + @Override + public boolean isAuthenticated() { + if (authentication == null) { + return false; + } + else { + return authentication.isAuthenticated(); + } + } + + @Override + public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException { + authentication.setAuthenticated(isAuthenticated); + } + + @Override + public String getName() { + return authentication.getName(); + } + + public String getToken() { + return this.token; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/JwtAuthenticationProvider.java b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/JwtAuthenticationProvider.java new file mode 100644 index 00000000..494cf510 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/JwtAuthenticationProvider.java @@ -0,0 +1,57 @@ +package ru.micord.ervu.security.webbpm.jwt; + +import io.jsonwebtoken.ExpiredJwtException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.CredentialsExpiredException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.stereotype.Component; +import ru.micord.ervu.security.webbpm.jwt.model.Token; +import ru.micord.ervu.security.webbpm.jwt.service.JwtTokenService; + +@Component +public class JwtAuthenticationProvider implements AuthenticationProvider { + + private final JwtTokenService jwtTokenService; + + @Autowired + public JwtAuthenticationProvider(JwtTokenService jwtTokenService) { + this.jwtTokenService = jwtTokenService; + } + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + JwtAuthentication jwtAuthentication = (JwtAuthentication) authentication; + String tokenStr = jwtAuthentication.getToken(); + + Token token; + try { + token = jwtTokenService.getToken(tokenStr); + } + catch (ExpiredJwtException e) { + throw new CredentialsExpiredException("The access token is expired and not valid anymore.", + e + ); + } + catch (Exception e) { + throw new BadCredentialsException("Authentication Failed.", e); + } + + if (!jwtTokenService.isValid(token)) { + throw new BadCredentialsException("Auth token is not valid for user " + token.getUserAccountId()); + } + + UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = + new UsernamePasswordAuthenticationToken(token.getUserAccountId(), null); + + return new JwtAuthentication(usernamePasswordAuthenticationToken, token.getUserAccountId()); + } + + @Override + public boolean supports(Class aClass) { + return JwtAuthentication.class.isAssignableFrom(aClass); + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/UnauthorizedEntryPoint.java b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/UnauthorizedEntryPoint.java new file mode 100644 index 00000000..2fbdcec8 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/UnauthorizedEntryPoint.java @@ -0,0 +1,29 @@ +package ru.micord.ervu.security.webbpm.jwt; + +import java.io.IOException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; + +/** + * {@link AuthenticationEntryPoint} that rejects all requests with an unauthorized error message. + */ +public class UnauthorizedEntryPoint implements AuthenticationEntryPoint { + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, + AuthenticationException exception) throws IOException { + + //for correct work with cross domain request + if ("OPTIONS".equals(request.getMethod())) { + response.setStatus(HttpServletResponse.SC_OK); + } + else { + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, + "Unauthorized: Authentication token was either missing or invalid." + ); + } + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/filter/JwtAuthenticationFilter.java b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/filter/JwtAuthenticationFilter.java new file mode 100644 index 00000000..ef8af20c --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/filter/JwtAuthenticationFilter.java @@ -0,0 +1,84 @@ +package ru.micord.ervu.security.webbpm.jwt.filter; + +import java.io.IOException; +import java.lang.invoke.MethodHandles; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.authentication.CredentialsExpiredException; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter; +import ru.micord.ervu.security.webbpm.jwt.JwtAuthentication; + +/** + * @author Flyur Karimov + */ +public class JwtAuthenticationFilter extends AbstractAuthenticationProcessingFilter { + private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + private final AuthenticationEntryPoint entryPoint; + + public JwtAuthenticationFilter(String securityPath, AuthenticationEntryPoint entryPoint) { + super(securityPath); + this.entryPoint = entryPoint; + } + + @Override + public Authentication attemptAuthentication(HttpServletRequest httpServletRequest, + HttpServletResponse httpServletResponse) throws AuthenticationException { + String token = extractAuthTokenFromRequest(httpServletRequest); + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication == null) { + authentication = new JwtAuthentication(null, null, token); + } + try { + authentication = getAuthenticationManager().authenticate(authentication); + } + catch (CredentialsExpiredException e) { + httpServletResponse.setStatus(401); + LOGGER.warn(e.getMessage()); + } + return authentication; + } + + @Override + protected boolean requiresAuthentication(HttpServletRequest request, HttpServletResponse response) { + return extractAuthTokenFromRequest(request) != null; + } + + @Override + protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, + FilterChain chain, Authentication authentication) throws IOException, ServletException { + SecurityContextHolder.getContext().setAuthentication(authentication); + chain.doFilter(request, response); + } + + @Override + protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, + AuthenticationException exception) throws IOException, ServletException { + LOGGER.error("Jwt unsuccessful authentication exception", exception); + SecurityContextHolder.clearContext(); + entryPoint.commence(request, response, exception); + } + + public String extractAuthTokenFromRequest(HttpServletRequest httpRequest) { + String token = null; + Cookie[] cookies = httpRequest.getCookies(); + if (cookies != null) { + for (Cookie cookie : cookies) { + if (cookie.getName().equals("auth_token")) { + token = cookie.getValue(); + } + } + } + return token; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/model/Token.java b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/model/Token.java new file mode 100644 index 00000000..d7da8527 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/model/Token.java @@ -0,0 +1,37 @@ +package ru.micord.ervu.security.webbpm.jwt.model; + +import java.util.Date; + +public class Token { + private final String userAccountId; + private final String issuer; + private final Date expirationDate; + private final String value; + + public Token(String userAccountId, String issuer, Date expirationDate, String value) { + this.userAccountId = userAccountId; + this.issuer = issuer; + this.expirationDate = expirationDate; + this.value = value; + } + + public String getUserAccountId() { + return userAccountId; + } + + public String getIssuer() { + return issuer; + } + + public Date getExpirationDate() { + return expirationDate; + } + + public boolean isExpired() { + return expirationDate.before(new Date()); + } + + public String getValue() { + return value; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/service/JwtTokenService.java b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/service/JwtTokenService.java new file mode 100644 index 00000000..645b582d --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/service/JwtTokenService.java @@ -0,0 +1,75 @@ +package ru.micord.ervu.security.webbpm.jwt.service; + +import java.lang.invoke.MethodHandles; +import java.util.Base64; +import java.util.Date; +import javax.crypto.SecretKey; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.security.Keys; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import ru.micord.ervu.security.webbpm.jwt.model.Token; + +import ru.cg.webbpm.modules.resources.api.ResourceMetadataUtils; + +/** + * @author Flyur Karimov + */ +@Component +public class JwtTokenService { + + private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + @Value("${webbpm.security.token.issuer:#{null}}") + private final String tokenIssuerName = + ResourceMetadataUtils.PROJECT_GROUP_ID + "." + ResourceMetadataUtils.PROJECT_ARTIFACT_ID; + private final SecretKey SIGNING_KEY; + + + @Autowired + public JwtTokenService(@Value("${webbpm.security.token.secret.key:ZjE5ZjMxNmYtODViZC00ZTQ5LWIxZmYtOGEzYzE3Yjc1MDVk}") + String secretKey) { + byte[] encodedKey = Base64.getDecoder().decode(secretKey); + this.SIGNING_KEY = Keys.hmacShaKeyFor(encodedKey); + } + + public Token createAccessToken(String userAccountId, Long expiresIn, String ervuId) { + + Date expirationDate = new Date(System.currentTimeMillis() + 1000L * expiresIn); + String value = Jwts.builder() + .setSubject(userAccountId + ":" + ervuId) + .setIssuer(tokenIssuerName) + .setIssuedAt(new Date(System.currentTimeMillis())) + .setExpiration(expirationDate) + .signWith(SIGNING_KEY) + .compact(); + return new Token(userAccountId + ":" + ervuId, tokenIssuerName, expirationDate, value); + } + + public boolean isValid(Token token) { + if (!tokenIssuerName.equals(token.getIssuer())) { + LOGGER.warn("Unknown token issuer {}", token.getIssuer()); + return false; + } + + if (token.isExpired()) { + LOGGER.info("Token {} is expired ", token.getValue()); + return false; + } + return true; + } + + public Token getToken(String token) { + Claims claims = Jwts.parser() + .setSigningKey(SIGNING_KEY) + .parseClaimsJws(token) + .getBody(); + + return new Token(claims.getSubject(), claims.getIssuer(), claims.getExpiration(), token); + } +} diff --git a/backend/src/main/java/ru/micord/ervu/service/InteractionService.java b/backend/src/main/java/ru/micord/ervu/service/InteractionService.java new file mode 100644 index 00000000..9be9cb11 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/service/InteractionService.java @@ -0,0 +1,16 @@ +package ru.micord.ervu.service; + +import java.sql.Timestamp; +import java.util.List; + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.records.InteractionLogRecord; + +/** + * @author Eduard Tihomirov + */ +public interface InteractionService { + + List get(String ervuId, String[] excludedStatuses); + + void setStatus(String fileId, String status, String fileName, String form, Timestamp timestamp, String sender, Integer count, String ervuId); +} diff --git a/backend/src/main/java/ru/micord/ervu/service/InteractionServiceImpl.java b/backend/src/main/java/ru/micord/ervu/service/InteractionServiceImpl.java new file mode 100644 index 00000000..d2adcdd9 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/service/InteractionServiceImpl.java @@ -0,0 +1,47 @@ +package ru.micord.ervu.service; + +import java.sql.Timestamp; +import java.util.List; + +import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.records.InteractionLogRecord; +import org.jooq.Condition; +import org.jooq.DSLContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import static ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.InteractionLog.INTERACTION_LOG; + +/** + * @author Eduard Tihomirov + */ +@Service +public class InteractionServiceImpl implements InteractionService { + + @Autowired + private DSLContext dslContext; + + @Override + public List get(String ervuId, String[] excludedStatuses) { + Condition condition = INTERACTION_LOG.ERVU_ID.eq(ervuId); + + if (excludedStatuses != null && excludedStatuses.length > 0) { + condition = condition.and(INTERACTION_LOG.STATUS.notIn(excludedStatuses)); + } + return dslContext.selectFrom(INTERACTION_LOG) + .where(condition) + .fetch(); + } + + public void setStatus(String fileId, String status, String fileName, String form, Timestamp timestamp, String sender, + Integer count, String ervuId) { + dslContext.insertInto(INTERACTION_LOG) + .set(INTERACTION_LOG.FILE_ID, fileId) + .set(INTERACTION_LOG.STATUS, status) + .set(INTERACTION_LOG.FORM, form) + .set(INTERACTION_LOG.SENT_DATE, timestamp) + .set(INTERACTION_LOG.SENDER, sender) + .set(INTERACTION_LOG.FILE_NAME, fileName) + .set(INTERACTION_LOG.RECORDS_SENT, count) + .set(INTERACTION_LOG.ERVU_ID, ervuId); + } +} diff --git a/backend/src/main/java/ru/micord/ervu/service/grid/InMemoryStaticGridLoadService.java b/backend/src/main/java/ru/micord/ervu/service/grid/InMemoryStaticGridLoadService.java new file mode 100644 index 00000000..32957e78 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/service/grid/InMemoryStaticGridLoadService.java @@ -0,0 +1,8 @@ +package ru.micord.ervu.service.grid; + +import java.util.List; + +public interface InMemoryStaticGridLoadService { + + List loadData(); +} diff --git a/backend/src/main/java/ru/micord/ervu/service/grid/impl/JournalInMemoryStaticGridLoadService.java b/backend/src/main/java/ru/micord/ervu/service/grid/impl/JournalInMemoryStaticGridLoadService.java new file mode 100644 index 00000000..a58cb6ce --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/service/grid/impl/JournalInMemoryStaticGridLoadService.java @@ -0,0 +1,90 @@ +package ru.micord.ervu.service.grid.impl; + +import java.util.Comparator; +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import ru.micord.ervu.journal.JournalDto; +import ru.micord.ervu.journal.JournalFileDataRequest; +import ru.micord.ervu.journal.JournalFileDataResponse; +import ru.micord.ervu.journal.mapper.JournalDtoMapper; +import ru.micord.ervu.security.webbpm.jwt.JwtAuthentication; +import ru.micord.ervu.service.InteractionService; +import ru.micord.ervu.service.grid.InMemoryStaticGridLoadService; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import ru.micord.ervu.kafka.service.ReplyingKafkaService; +import ru.micord.ervu.security.webbpm.jwt.service.JwtTokenService; + +@Service +public class JournalInMemoryStaticGridLoadService implements + InMemoryStaticGridLoadService { + + private final JwtTokenService jwtTokenService; + private final InteractionService interactionService; + private final ReplyingKafkaService ervuReplyingKafkaService; + private final ObjectMapper objectMapper; + + @Value("${ervu-kafka.journal-request-topic}") + private String requestTopic; + @Value("${ervu-kafka.journal-reply-topic}") + private String replyTopic; + @Value("${db-journal-excluded-statuses:}") + private String[] excludedStatuses; + + public JournalInMemoryStaticGridLoadService(JwtTokenService jwtTokenService, + InteractionService interactionService, + @Qualifier("journal") ReplyingKafkaService ervuReplyingKafkaService, + ObjectMapper objectMapper) { + this.jwtTokenService = jwtTokenService; + this.interactionService = interactionService; + this.ervuReplyingKafkaService = ervuReplyingKafkaService; + this.objectMapper = objectMapper; + } + + @Override + public List loadData() { + JournalFileDataRequest journalFileDataRequest = initJournalFileDataRequest(); + List dbJournalList = interactionService.get(journalFileDataRequest.getOrgIdErvu(), + excludedStatuses) + .stream().map(JournalDtoMapper::mapToJournalDto) + .toList(); + List ervuJournalList; + + try { + String responseJsonString = ervuReplyingKafkaService.sendMessageAndGetReply(requestTopic, + replyTopic, objectMapper.writeValueAsString(journalFileDataRequest)); + JournalFileDataResponse journalFileDataResponse = objectMapper.readValue(responseJsonString, + JournalFileDataResponse.class); + ervuJournalList = journalFileDataResponse.getFilesInfo().stream() + .map(JournalDtoMapper::mapToJournalDto) + .toList(); + } + catch (JsonProcessingException e) { + throw new RuntimeException("Failed to parse JournalFileDataResponse.", e); + } + + return Stream.concat(dbJournalList.stream(), ervuJournalList.stream()) + .sorted(Comparator.comparing(JournalDto::getDepartureDateTime)) + .toList(); + } + + private JournalFileDataRequest initJournalFileDataRequest() { + Optional authentication = Optional.ofNullable( + SecurityContextHolder.getContext().getAuthentication()); + String jwtToken = authentication.map(auth -> ((JwtAuthentication) auth).getToken()) + .orElseThrow(() -> new RuntimeException("Failed to get auth data. User unauthorized.")); + String[] ids = jwtTokenService.getToken(jwtToken).getUserAccountId().split(":"); + String userId = ids[0]; + String ervuId = ids[1]; + return new JournalFileDataRequest() + .setPrnOid(userId) + .setOrgIdErvu(ervuId); + } +} diff --git a/backend/src/main/java/ru/micord/ervu/service/rpc/InMemoryStaticGridRpcService.java b/backend/src/main/java/ru/micord/ervu/service/rpc/InMemoryStaticGridRpcService.java new file mode 100644 index 00000000..45b4c7b2 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/service/rpc/InMemoryStaticGridRpcService.java @@ -0,0 +1,22 @@ +package ru.micord.ervu.service.rpc; + +import java.util.List; + +import ru.micord.ervu.service.grid.InMemoryStaticGridLoadService; + +import ru.cg.webbpm.modules.standard_annotations.validation.NotNull; +import ru.cg.webbpm.modules.webkit.annotations.RpcCall; +import ru.cg.webbpm.modules.webkit.annotations.RpcService; +import ru.cg.webbpm.modules.webkit.beans.Behavior; + +@RpcService +public class InMemoryStaticGridRpcService extends Behavior { + + @NotNull + public InMemoryStaticGridLoadService loadService; + + @RpcCall + public List loadData() { + return loadService.loadData(); + } +} diff --git a/backend/src/main/java/ru/micord/ervu/util/DateUtil.java b/backend/src/main/java/ru/micord/ervu/util/DateUtil.java new file mode 100644 index 00000000..b89d75ad --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/util/DateUtil.java @@ -0,0 +1,40 @@ +package ru.micord.ervu.util; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +import org.springframework.util.StringUtils; + +import static org.springframework.util.StringUtils.hasText; + +/** + * @author gulnaz + */ +public final class DateUtil { + + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy"); + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"); + + private DateUtil() {} + + public static LocalDate convertToLocalDate(String date) { + return StringUtils.hasText(date) + ? LocalDate.parse(date, DateTimeFormatter.ISO_LOCAL_DATE) + : null; + } + + public static LocalDateTime convertToLocalDateTime(String dateTime) { + return hasText(dateTime) + ? LocalDateTime.parse(dateTime, DATE_TIME_FORMATTER) + : null; + } + + public static String convertToString(LocalDate date) { + return date == null ? "" : date.format(DATE_FORMATTER); + } + + public static String convertToString(LocalDate date, DateTimeFormatter formatter) { + return date == null ? "" : date.format(formatter); + } +} diff --git a/backend/src/main/java/ru/micord/ervu/util/StringUtils.java b/backend/src/main/java/ru/micord/ervu/util/StringUtils.java new file mode 100644 index 00000000..2d3cb4a5 --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/util/StringUtils.java @@ -0,0 +1,17 @@ +package ru.micord.ervu.util; + +import static org.apache.commons.lang3.StringUtils.capitalize; +import static org.apache.commons.lang3.StringUtils.substring; + +public class StringUtils { + + public static String convertToFio(String firstName, String middleName, String lastName) { + String firstNameInitial = substring(firstName, 0, 1).toUpperCase(); + String middleNameInitial = substring(middleName, 0, 1).toUpperCase(); + return String.format("%s %s.%s.", + capitalize(lastName), + firstNameInitial, + middleNameInitial + ); + } +} diff --git a/backend/src/main/resources/config/changelog-master.xml b/backend/src/main/resources/config/changelog-master.xml new file mode 100644 index 00000000..7cdfbb4a --- /dev/null +++ b/backend/src/main/resources/config/changelog-master.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/config/v_1.0/2024-09-11--01-add-new-column-interaction-log.xml b/backend/src/main/resources/config/v_1.0/2024-09-11--01-add-new-column-interaction-log.xml new file mode 100644 index 00000000..95fa184c --- /dev/null +++ b/backend/src/main/resources/config/v_1.0/2024-09-11--01-add-new-column-interaction-log.xml @@ -0,0 +1,20 @@ + + + + + add file id column into interaction_log table + + + + + + + add ervu id column into interaction_log table + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/config/v_1.0/2024-29-08--01-create-table-okopf-records.xml b/backend/src/main/resources/config/v_1.0/2024-29-08--01-create-table-okopf-records.xml new file mode 100644 index 00000000..1ab98c43 --- /dev/null +++ b/backend/src/main/resources/config/v_1.0/2024-29-08--01-create-table-okopf-records.xml @@ -0,0 +1,18 @@ + + + + + + CREATE TABLE okopf_records + ( + okopf_records_id varchar primary key, + name varchar unique, + version int not null + ); + + + diff --git a/backend/src/main/resources/config/v_1.0/changelog-v_1.0.xml b/backend/src/main/resources/config/v_1.0/changelog-v_1.0.xml new file mode 100644 index 00000000..7eeb7be0 --- /dev/null +++ b/backend/src/main/resources/config/v_1.0/changelog-v_1.0.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/config.md b/config.md index 74557103..b573e8dd 100644 --- a/config.md +++ b/config.md @@ -677,6 +677,14 @@ JBPM использует 3 корневых категории логирова ``` +# Взаимодействие с ЕСНСИ в части получения справочника ОКОПФ + +Свойства задаются в файле config/standalone/dev/standalone.xml + +## Параметры +- `esnsi.okopf.url` - url который обращается к еснси для получения справочника и скачивает данные спровочников организации в виде заархивированного json файла. +- `esnsi.okopf.cron.load` - настройка, которая указывет расписание для загрузки справочника окопф и сохранение данных по справкам в БД + # Описание параметров конфигурации клиентской части Свойства задаются в файле frontend/src/resources/app-config.json или frontend.war/src/resources/app-config.json @@ -741,6 +749,7 @@ JBPM использует 3 корневых категории логирова "jivo_chat_widget_enabled": false ``` + # Прочее ## Смена удалённого репозитория diff --git a/config/standalone/dev/standalone.xml b/config/standalone/dev/standalone.xml new file mode 100644 index 00000000..eaf6d33d --- /dev/null +++ b/config/standalone/dev/standalone.xml @@ -0,0 +1,594 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jdbc:h2:mem:jbpm;DB_CLOSE_DELAY=-1 + h2 + + ${env.DB_JBPM_USERNAME:sa} + ${env.DB_JBPM_PASSWORD:sa} + + + 300 + + + + 10.10.31.119 + 5432 + ervu-lkrp-ul + postgresql-driver + + ervu-lkrp-ul-sec + ervu-lkrp-ul-sec + + + + false + true + 5000 + + + + + + org.h2.jdbcx.JdbcDataSource + + + org.postgresql.xa.PGXADataSource + + + + + + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${jboss.bind.address:127.0.0.1} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/tomcat/etc/tomcat/webbpm.properties b/config/tomcat/etc/tomcat/webbpm.properties index 7224ec5f..35b553e6 100644 --- a/config/tomcat/etc/tomcat/webbpm.properties +++ b/config/tomcat/etc/tomcat/webbpm.properties @@ -18,3 +18,37 @@ webbpm.mode=production webbpm.jbpm.hibernate_statistics.enabled=false webbpm.cache.hazelcast.hosts=127.0.0.1 webbpm.cache.hazelcast.outbound_port_definitions=5801-5820 + + +file.webdav.upload.url=https://ervu-webdav.k8s.micord.ru +file.webdav.upload.username=test +file.webdav.upload.password=test +av-kafka.send.message.topic.name=file-upload-v2 +av-kafka.send.url=http://10.10.31.11:32609 +av-kafka.send.security.protocol=SASL_PLAINTEXT +av-kafka.sasl.mechanism=SCRAM-SHA-256 +av-kafka.send.username=user1 +av-kafka.send.password=Blfi9d2OFG +ervu.fileupload.max_file_size=5242880 +ervu.fileupload.max_request_size=6291456 +ervu.fileupload.file_size_threshold=0 + +esia-scopes=fullname, snils, id_doc, birthdate, usr_org, openid +esia-org-scopes=org_fullname, org_shortname, org_brhs, org_brhs_ctts, org_brhs_addrs, org_type, org_ogrn, org_inn, org_leg, org_kpp, org_ctts, org_addrs, org_grps, org_emps +esia-org-scope-url=http://esia.gosuslugi.ru/ +esia-uri.base-uri=https://esia-portal1.test.gosuslugi.ru/ +esia-client-id=MNSV89 +esia-redirect-url=https://lkrp-dev.micord.ru/ul/ +sign-url=https://ervu-sign-dev.k8s.micord.ru/sign +client-cert-hash=04508B4B0B58776A954A0E15F574B4E58799D74C61EE020B3330716C203E3BDD +ervu-kafka.bootstrap-servers=localhost:9092 +ervu-kafka.org-reply-topic=ervu.organization.response +ervu-kafka.group-id=1 +ervu-kafka.org-request-topic=ervu.organization.request +ervu-kafka.reply-timeout=30 +esnsi.okopf.url=https://esnsi.gosuslugi.ru/rest/ext/v1/classifiers/11465/file?extension=JSON&encoding=UTF_8 +esnsi.okopf.cron.load=0 0 */1 * * * +ervu-kafka.send.security.protocol=SASL_PLAINTEXT +ervu-kafka.sasl.mechanism=SCRAM-SHA-256 +ervu-kafka.send.username=user1 +ervu-kafka.send.password=Blfi9d2OFG \ No newline at end of file diff --git a/frontend/src/resources/app.version b/frontend/src/resources/app.version index 8b9b8b3d..5deada82 100644 --- a/frontend/src/resources/app.version +++ b/frontend/src/resources/app.version @@ -1 +1 @@ -%project.version% \ No newline at end of file +1.0.0-SNAPSHOT \ No newline at end of file diff --git a/frontend/src/resources/template/app/component/log_out.html b/frontend/src/resources/template/app/component/log_out.html new file mode 100644 index 00000000..cf7831d2 --- /dev/null +++ b/frontend/src/resources/template/app/component/log_out.html @@ -0,0 +1,6 @@ + +
+
{{getOrgUnitName()}}
+ Данные организации + +
\ No newline at end of file diff --git a/frontend/src/resources/template/ervu/component/grid/GridV2.html b/frontend/src/resources/template/ervu/component/grid/GridV2.html new file mode 100644 index 00000000..6b873ea5 --- /dev/null +++ b/frontend/src/resources/template/ervu/component/grid/GridV2.html @@ -0,0 +1,53 @@ +
+ + + +
+ +
+
diff --git a/frontend/src/ts/ervu/component/grid/InMemoryStaticGrid.ts b/frontend/src/ts/ervu/component/grid/InMemoryStaticGrid.ts new file mode 100644 index 00000000..c9ff00c5 --- /dev/null +++ b/frontend/src/ts/ervu/component/grid/InMemoryStaticGrid.ts @@ -0,0 +1,112 @@ +import { + GridColumnIdUtils, + GridRow, + GridRowModelType, + GridV2, + GridV2Column, Visible +} from "@webbpm/base-package"; +import {ChangeDetectionStrategy, Component} from "@angular/core"; +import { + ColDef, + ICellRendererParams, + ITooltipParams, + ValueFormatterParams, + ValueGetterParams +} from "ag-grid-community"; +import {StaticColumnInitializer} from "./StaticColumnInitializer"; +import {InMemoryStaticGridRpcService} from "../../../generated/ru/micord/ervu/service/rpc/InMemoryStaticGridRpcService"; +import {StaticGridColumn} from "../../../generated/ru/micord/ervu/property/grid/StaticGridColumn"; + +@Component({ + moduleId: module.id, + selector: 'in-memory-static-grid', + templateUrl: './../../../../../src/resources/template/ervu/component/grid/GridV2.html', + changeDetection: ChangeDetectionStrategy.OnPush + }) +export class InMemoryStaticGrid extends GridV2 { + + private rpcService: InMemoryStaticGridRpcService; + + getRowModelType(): string { + return GridRowModelType.CLIENT_SIDE; + } + + protected initGrid() { + super.initGrid(); + this.rpcService = this.getScript(InMemoryStaticGridRpcService); + if (this.rpcService) { + this.rpcService.loadData().then(response => { + this.rowData = response; + this.refresh(); + }) + .catch((error) => console.error(`Failed to load data. ${error}`)); + } + } + + getColumns(): any[] { + return this.getScriptsInChildren(GridV2Column) + .map(columnV2 => columnV2.getScript(StaticGridColumn)); + } + + protected columnV2ToColumnDef(column: GridV2Column): ColDef { + let gridColumn = column.getScript(StaticGridColumn); + let colDef = this.columnToColumnDef(gridColumn); + if (column.renderer) { + colDef.cellRenderer = (params: ICellRendererParams) => column.renderer.render(params); + } + if (column.valueGetter) { + colDef.valueGetter = (params: ValueGetterParams) => column.valueGetter.get(params); + } + if (column.tooltipValueGetter) { + if (gridColumn.columnTooltip) { + throw new Error( + "Only one type of tooltip should be specified: tooltipValueGetter or columnTooltip"); + } + colDef.tooltipValueGetter = (params: ITooltipParams) => column.tooltipValueGetter.get(params); + } + column.setGridRef(this); + column.setColDef(colDef); + return colDef; + } + + protected columnToColumnDef(column: any): ColDef { + let colDef = StaticColumnInitializer.columnToColumnDef(this, column); + let columnComp = column.context; + colDef['columnUid'] = columnComp.getObjectId(); + + if (columnComp.cellCssClassRulesProvider) { + colDef.cellClassRules = columnComp.cellCssClassRulesProvider.getRules(); + } + + if (columnComp.valueFormatter) { + colDef.valueFormatter = (params?: ValueFormatterParams) => { + return columnComp.valueFormatter.format(params); + } + } + return colDef; + } + + public load(): void { + this.onLoadStart(); + let rows: GridRow[] = []; + + if (this.rowData) { + this.rowData.forEach((data, i) => { + let row: GridRow = new GridRow(); + row[GridColumnIdUtils.ROW_UID] = i; + this.getColumns().forEach(col => { + let column = col.field.column; + row[column] = data[column]; + }) + rows.push(row); + }) + } + this.getGridApi().setRowData(rows); + this.onLoadEnd(); + } + + @Visible() + public getRowDataSize(): number { + return this.rowData ? this.rowData.length : 0; + } +} diff --git a/frontend/src/ts/ervu/component/grid/StaticColumnInitializer.ts b/frontend/src/ts/ervu/component/grid/StaticColumnInitializer.ts new file mode 100644 index 00000000..35f16780 --- /dev/null +++ b/frontend/src/ts/ervu/component/grid/StaticColumnInitializer.ts @@ -0,0 +1,116 @@ +import {ColDef, ICellRendererFunc, SuppressKeyboardEventParams} from "ag-grid-community"; +import { + DateTimeUtil, + DefaultTooltip, + GridCellTooltipUtils, + GridColumnComparatorUtils, + GridColumnFilterUtils, + GridColumnKeyboardUtils, + GridSettingHeader, + GridValueFormatterUtils, + GridValueRendererUtils, + PinnedType +} from "@webbpm/base-package"; +import {Moment} from "moment"; +import * as moment from "moment-timezone"; +import {StaticGridColumn} from "../../../generated/ru/micord/ervu/property/grid/StaticGridColumn"; + +export class StaticColumnInitializer { + + public static columnToColumnDef(gridRef: any, column: StaticGridColumn) { + const columnDef: ColDef = {}; + columnDef.headerName = column.displayName ? column.displayName : ''; + columnDef.headerClass = "custom-header"; + columnDef.width = column.width; + columnDef.suppressSizeToFit = column.widthFixed; + columnDef.hide = column.hidden; + columnDef.resizable = !column.widthFixed; + columnDef.headerComponentParams = {"disable_hiding": column.disableHiding || false}; + columnDef.lockVisible = column.disableHiding; + columnDef.headerComponent = GridSettingHeader; + columnDef.headerTooltip = column.headerTooltip ? column.headerTooltip : column.displayName; + columnDef.suppressMenu = column.suppressHeaderMenu; + + if (column.pinned) { + columnDef.pinned = column.pinned == PinnedType.LEFT ? 'left' : 'right'; + } + columnDef['gridComp'] = this; + columnDef.sortable = column.sortable; + + if (column.sortable == null) { + columnDef.sortable = true; + } + + if (column.autoHeight) { + columnDef.autoHeight = column.autoHeight; + columnDef.cellClass = 'ag-grid-cell-wrap-text'; + } + + if (column.field) { + columnDef.field = column.field.column; + let type = column.field.type; + + if (type != null) { + + if (gridRef.floatingFilter && column.filter !== false) { + columnDef.floatingFilter = gridRef.floatingFilter; + columnDef.filter = GridColumnFilterUtils.columnFilter(type); + + if (columnDef.filter === 'agDateColumnFilter') { + columnDef.filterParams = { + comparator: function (filterLocalDateAtMidnight, cellValue) { + + if (!cellValue) { + return -1; + } + + let filterMoment: Moment = moment.utc(filterLocalDateAtMidnight) + .add(-filterLocalDateAtMidnight.getTimezoneOffset(), 'm'); + let cellMoment: Moment = DateTimeUtil.parseToMidnightUTC(cellValue); + + if (filterMoment.isSame(cellMoment)) { + return 0; + } + + if (cellMoment.isBefore(filterMoment)) { + return -1; + } + + if (cellMoment.isAfter(filterMoment)) { + return 1; + } + }, + browserDatePicker: true, + }; + } + } + + if (gridRef.getRowModelType() == "clientSide") { + columnDef.comparator = GridColumnComparatorUtils.columnComparator(type); + } + columnDef.valueFormatter = GridValueFormatterUtils.columnFormatter(type); + columnDef.cellRenderer = gridRef.createRenderer(column); + } + + columnDef.suppressKeyboardEvent = (params: SuppressKeyboardEventParams) => { + return GridColumnKeyboardUtils.suppressHomeAndEndKeyboardEvent(params); + } + } + + if (column.displayPopup) { + const renderer: ICellRendererFunc = columnDef.cellRenderer as ICellRendererFunc; + columnDef.cellRenderer = GridValueRendererUtils.tooltipValueRenderer(renderer); + } + else if (column.columnTooltip) { + columnDef.tooltipComponent = DefaultTooltip; + columnDef.tooltipValueGetter = GridCellTooltipUtils.fixedValueTooltip(column.columnTooltip); + } + else if (!gridRef.suppressColumnTooltip) { + columnDef.tooltipComponent = DefaultTooltip; + columnDef.tooltipValueGetter = GridCellTooltipUtils.defaultFormattedTooltip( + column.field ? column.field.type : null); + } + + return columnDef; + } +} diff --git a/frontend/src/ts/ervu/component/text/NumberPrefixSuffixTextFormatter.ts b/frontend/src/ts/ervu/component/text/NumberPrefixSuffixTextFormatter.ts new file mode 100644 index 00000000..ce677099 --- /dev/null +++ b/frontend/src/ts/ervu/component/text/NumberPrefixSuffixTextFormatter.ts @@ -0,0 +1,62 @@ +import {NotNull, TextFormatter, Visible} from "@webbpm/base-package"; + +// A text formatter for integer values appending a prefix and/or suffix +// depending on the last digit of the value +export class NumberPrefixSuffixTextFormatter implements TextFormatter { + + @NotNull() + public hasPrefix: boolean; + + @Visible("hasPrefix == true") + @NotNull("hasPrefix == true") + public oneDigitPrefix: string; + @Visible("hasPrefix == true") + @NotNull("hasPrefix == true") + public otherDigitPrefix: string; + + @NotNull() + public hasSuffix: boolean; + + @Visible("hasSuffix == true") + @NotNull("hasSuffix == true") + public oneDigitSuffix: string; + @Visible("hasSuffix == true") + @NotNull("hasSuffix == true") + public fromTwoToFourDigitSuffix: string; + @Visible("hasSuffix == true") + @NotNull("hasSuffix == true") + public otherDigitSuffix: string; + + private excludedNumbers: number[] = [11, 12, 13, 14]; + + format(value: string): string { + if (value) { + let number = Number.parseInt(value); + let lastDigit = Math.abs(number) % 10; + let lastDigits = Math.abs(number) % 100; + let prefix = ""; + + if (this.hasPrefix) { + prefix = (this.excludedNumbers.includes(lastDigits) + ? this.otherDigitPrefix + : lastDigit == 1 + ? this.oneDigitPrefix + : this.otherDigitPrefix) + " "; + } + let suffix = ""; + + if (this.hasSuffix) { + suffix = " " + (this.excludedNumbers.includes(lastDigits) + ? this.otherDigitSuffix + : lastDigit == 1 + ? this.oneDigitSuffix + : lastDigit > 1 && lastDigit < 5 + ? this.fromTwoToFourDigitSuffix + : this.otherDigitSuffix); + } + return prefix + value + suffix; + } + + return value; + } +} diff --git a/frontend/src/ts/esia/OrgData.ts b/frontend/src/ts/esia/OrgData.ts new file mode 100644 index 00000000..db664983 --- /dev/null +++ b/frontend/src/ts/esia/OrgData.ts @@ -0,0 +1,7 @@ +import {Behavior, NotNull} from "@webbpm/base-package"; + +export class OrgData extends Behavior{ + + @NotNull() + public dataId: string; +} diff --git a/frontend/src/ts/esia/OrgDataRoot.ts b/frontend/src/ts/esia/OrgDataRoot.ts new file mode 100644 index 00000000..677bb89e --- /dev/null +++ b/frontend/src/ts/esia/OrgDataRoot.ts @@ -0,0 +1,33 @@ +import {AnalyticalScope, Behavior, Container, ControlWithValue} from "@webbpm/base-package"; +import {HttpClient} from "@angular/common/http"; +import {OrgData} from "./OrgData"; +import {OrgInfoModel} from "../generated/ru/micord/ervu/security/esia/model/OrgInfoModel"; +import {CookieService} from "ngx-cookie"; + +@AnalyticalScope(Container) +export class OrgDataRoot extends Behavior{ + + private container: Container; + + initialize() { + super.initialize(); + this.container = this.getScript(Container); + let orgScripts: OrgData[] = this.container.getScriptsInThisAndChildren(OrgData); + let httpClient = this.injector.get(HttpClient); + let cookieService = this.injector.get(CookieService); + if (cookieService.get("is_auth")) { + httpClient.get("esia/org") + .toPromise() + .then(orgInfoModel => { + if (orgInfoModel == null) { + return; + } + for (let orgData of orgScripts) { + let control: ControlWithValue = orgData.getScriptInObject(orgData.getObjectId(), + 'component.ControlWithValue'); + control.setValue(orgInfoModel[orgData.dataId]); + } + }); + } + } +} diff --git a/frontend/src/ts/modules/app/app-routing.module.ts b/frontend/src/ts/modules/app/app-routing.module.ts index 9b8f5826..d31e3ac5 100644 --- a/frontend/src/ts/modules/app/app-routing.module.ts +++ b/frontend/src/ts/modules/app/app-routing.module.ts @@ -1,21 +1,24 @@ import {NgModule} from "@angular/core"; import {RouterModule, Routes} from "@angular/router"; import {AccessDeniedComponent} from "./component/access-denied.component"; +import {AuthGuard} from "../security/guard/auth.guard"; import {ConfirmExitGuard} from "@webbpm/base-package"; const appRoutes: Routes = [ { path: 'access-denied', component: AccessDeniedComponent, - canActivate: [ConfirmExitGuard] + canActivate: [ConfirmExitGuard], }, { path: 'mydata', loadChildren: 'generated-sources/page-mydata.module#PagemydataModule', + canActivate: [AuthGuard], }, { path: 'filesentlog', loadChildren: 'generated-sources/page-filesentlog.module#PagefilesentlogModule', + canActivate: [AuthGuard], } diff --git a/frontend/src/ts/modules/app/app.module.ts b/frontend/src/ts/modules/app/app.module.ts index 80be4e44..f48a0cf8 100644 --- a/frontend/src/ts/modules/app/app.module.ts +++ b/frontend/src/ts/modules/app/app.module.ts @@ -13,6 +13,7 @@ import { } from "@webbpm/base-package"; import {AppHeaderComponent} from "./component/app-header.component"; import {AppFooterComponent} from "./component/app-footer.component"; +import {LogOutComponent} from "./component/logout.component"; import {AccessDeniedComponent} from "./component/access-denied.component"; import {ApplicationVersionComponent} from "./component/application-version.component"; import {RouterModule} from "@angular/router"; @@ -22,15 +23,18 @@ import {AppProgressIndicationService} from "./service/app-progress-indication.se import {FileUploadModule} from "ng2-file-upload"; import {ErvuFileUpload} from "../../ervu/component/fileupload/ErvuFileUpload"; +import {InMemoryStaticGrid} from "../../ervu/component/grid/InMemoryStaticGrid"; registerLocaleData(localeRu); export const DIRECTIVES = [ forwardRef(() => AppHeaderComponent), forwardRef(() => AppFooterComponent), forwardRef(() => ApplicationVersionComponent), + forwardRef(() => LogOutComponent), forwardRef(() => AccessDeniedComponent), forwardRef(() => AppProgressIndicationComponent), - forwardRef(() => ErvuFileUpload) + forwardRef(() => ErvuFileUpload), + forwardRef(() => InMemoryStaticGrid) ]; @NgModule({ diff --git a/frontend/src/ts/modules/app/component/logout.component.ts b/frontend/src/ts/modules/app/component/logout.component.ts new file mode 100644 index 00000000..1d7671a6 --- /dev/null +++ b/frontend/src/ts/modules/app/component/logout.component.ts @@ -0,0 +1,52 @@ +import {ChangeDetectorRef, Component, OnInit} from "@angular/core"; +import {Router} from "@angular/router"; +import {HttpClient} from "@angular/common/http"; +import {CookieService} from "ngx-cookie"; + +@Component({ + moduleId: module.id, + selector: "[log-out]", + templateUrl: "../../../../../src/resources/template/app/component/log_out.html" +}) +export class LogOutComponent implements OnInit{ + + private userFullname: string; + private orgUnitName: string; + + + constructor(private router: Router, private httpClient: HttpClient, + private cookieService: CookieService, private cd: ChangeDetectorRef) { + } + + ngOnInit(): void { + let isAuth = this.getIsAuth(); + if (isAuth) { + Promise.all([ + this.httpClient.get("esia/userfullname").toPromise(), + this.httpClient.get("esia/orgunitname").toPromise() + ]).then(([userFullname, orgUnitName]) => { + this.userFullname = userFullname; + this.orgUnitName = orgUnitName; + this.cd.markForCheck(); + }); + } + } + + public logout(): void { + this.httpClient.get("esia/logout").toPromise().then(url => { + window.open(url, "_self"); + }) + } + + public getUserFullname(): string { + return this.userFullname; + } + + public getIsAuth(): boolean { + return this.cookieService.get("is_auth") != null; + } + + public getOrgUnitName(): string { + return this.orgUnitName; + } +} \ No newline at end of file diff --git a/frontend/src/ts/modules/security/guard/auth.guard.ts b/frontend/src/ts/modules/security/guard/auth.guard.ts new file mode 100644 index 00000000..0c81275c --- /dev/null +++ b/frontend/src/ts/modules/security/guard/auth.guard.ts @@ -0,0 +1,61 @@ +import {Injectable} from "@angular/core"; +import {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot} from "@angular/router"; +import {Observable} from "rxjs"; +import {HttpClient, HttpParams} from "@angular/common/http"; +import {CookieService} from "ngx-cookie"; + +@Injectable({providedIn:'root'}) +export abstract class AuthGuard implements CanActivate { + + protected constructor( + protected router: Router, + private httpClient: HttpClient, + private cookieService: CookieService + ) { + } + + public canActivate(route: ActivatedRouteSnapshot, + state: RouterStateSnapshot): Observable | Promise | boolean { + let hasAccess: Promise | boolean = this.checkAccess(); + + return Promise.resolve(hasAccess).then((isAccess) => { + let url = new URL(window.location.href); + let params = new URLSearchParams(url.search); + let code = params.get('code'); + let error = params.get('error'); + let errorDescription = params.get('error_description'); + if (isAccess) { + return true; + } + else if (error) { + throw new Error(error + ', error description =' + errorDescription); + } + else if (code) { + const params = new HttpParams().set('code', code); + this.httpClient.get("esia/auth", {params: params}).toPromise().then( + () => window.open(url.origin + url.pathname, "_self")) + .catch((reason) => + console.error(reason) + ); + return false; + } + else { + this.httpClient.get("esia/url") + .toPromise() + .then(url => window.open(url, "_self")); + return true; + } + }).catch((reason) => { + console.error(reason); + return false + }); + } + + private checkAccess(): Promise | boolean { + return this.getIsAuth() != null; + }; + + public getIsAuth(): string { + return this.cookieService.get('is_auth'); + } +} diff --git a/frontend/src/ts/modules/webbpm/webbpm-routing.module.ts b/frontend/src/ts/modules/webbpm/webbpm-routing.module.ts index 30d07d11..65a35e47 100644 --- a/frontend/src/ts/modules/webbpm/webbpm-routing.module.ts +++ b/frontend/src/ts/modules/webbpm/webbpm-routing.module.ts @@ -1,14 +1,12 @@ import {NgModule} from "@angular/core"; import {RouterModule, Routes} from "@angular/router"; -import { - ConfirmExitGuard -} from "@webbpm/base-package"; +import {AuthGuard} from "../security/guard/auth.guard"; const webbpmRoutes: Routes = [ { path: '', loadChildren: 'generated-sources/page-lkul.module#PagelkulModule', - canActivate: [ConfirmExitGuard], + canActivate: [AuthGuard], pathMatch: 'full', }, { diff --git a/resources/src/main/resources/business-model/Журнал взаимодействия.page b/resources/src/main/resources/business-model/Журнал взаимодействия.page index 6886bf2a..5b6dde11 100644 --- a/resources/src/main/resources/business-model/Журнал взаимодействия.page +++ b/resources/src/main/resources/business-model/Журнал взаимодействия.page @@ -2,7 +2,7 @@ filesentlog - 3.178.0 + 3.178.2 ru.cg.webbpm.packages.base.resources @@ -166,18 +166,112 @@ - + + 312c9663-86b4-4672-97bd-67d313585c00 + 9b7c3369-e1fe-44f6-88f9-f8d9c83b30dc + кол-во hidden + false + false + + + + collectible + +false + + + + initialValue + +0.0 + + + + visible + +false + + + + + + + + + false + + + ba24d307-0b91-4299-ba82-9d0b52384ff2 - a107c5a0-5bc2-482f-b225-a20aaa4ab00c - Текст + 7f891535-8dde-4e00-8064-584cad7ffcfd + кол-во текст false false + + collectible + +false + + initialValue -"Найдено 5 файлов" +null + + + + textFormatter + + + + fromTwoToFourDigitSuffix + + "файла" + + + + hasPrefix + + true + + + + hasSuffix + + true + + + + oneDigitPrefix + + "Найден" + + + + oneDigitSuffix + + "файл" + + + + otherDigitPrefix + + "Найдено" + + + + otherDigitSuffix + + "файлов" + + + + + NumberPrefixSuffixTextFormatter + ervu.component.text + @@ -269,7 +363,7 @@ behavior - {"objectId":"7d63e0d5-c23d-4c32-8311-25b40e713c79","packageName":"component.grid","className":"GridV2","type":"TS"} + {"objectId":"bbaf33d7-0679-440b-a394-cb805ce80300","packageName":"ervu.component.grid","className":"InMemoryStaticGrid","type":"TS"} @@ -286,6 +380,210 @@ + + + + + + behavior + + {"objectId":"9b7c3369-e1fe-44f6-88f9-f8d9c83b30dc","packageName":"component.field","className":"NumberField","type":"TS"} + + + + method + + "setValue" + + + + value + + + + objectValue + + + + argument + + null + + + + behavior + + {"objectId":"bbaf33d7-0679-440b-a394-cb805ce80300","packageName":"ervu.component.grid","className":"InMemoryStaticGrid","type":"TS"} + + + + method + + "getRowDataSize" + + + + + + + + + + + + + + + + + + + + 98594cec-0a9b-4cef-af09-e1b71cb2ad9e + 7f600c0d-ad59-46ad-9aa8-037fdfaaac14 + Action Controller + false + false + + + + eventRefs + + + + + + behavior + + {"objectId":"bbaf33d7-0679-440b-a394-cb805ce80300","packageName":"ervu.component.grid","className":"InMemoryStaticGrid","type":"TS"} + + + + propertyName + + "gridLoaded" + + + + + + + + + ifCondition + + + + logicalOperation + + null + + + + + + + thenActions + + + + + + behavior + + {"objectId":"9b7c3369-e1fe-44f6-88f9-f8d9c83b30dc","packageName":"component.field","className":"NumberField","type":"TS"} + + + + method + + "setValue" + + + + value + + + + objectValue + + + + argument + + null + + + + behavior + + {"objectId":"bbaf33d7-0679-440b-a394-cb805ce80300","packageName":"ervu.component.grid","className":"InMemoryStaticGrid","type":"TS"} + + + + method + + "getRowDataSize" + + + + + + + + + + + + + + + + behavior + + {"objectId":"7f891535-8dde-4e00-8064-584cad7ffcfd","packageName":"component","className":"Text","type":"TS"} + + + + method + + "setValue" + + + + value + + + + objectValue + + + + argument + + null + + + + behavior + + {"objectId":"9b7c3369-e1fe-44f6-88f9-f8d9c83b30dc","packageName":"component.field","className":"NumberField","type":"TS"} + + + + method + + "getTextValue" + + + + + + + + + + @@ -298,17 +596,30 @@ 7d63e0d5-c23d-4c32-8311-25b40e713c79 Таблица true + true + + + bee4e324-a660-4d99-bbc4-9fc2b084a5fc + bbaf33d7-0679-440b-a394-cb805ce80300 + Таблица + true false - + - autoStretchColumns + allowContextMenuWithControlKey - true + null - floatingFilter + autoStretchColumns + + false + + + + clientSideColumnFilters true @@ -330,36 +641,121 @@ - gridService + enableCellTextSelection - - - loadDao - - - - graph - - {"conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"nodeByIndex":{"0":{"tableName":"interaction_log","schemaName":"public","x":519.0,"y":269.0,"alias":"interaction_log","conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"emptyEntityAction":"IGNORE_OR_DELETE"}},"nodes":[{"tableName":"interaction_log","schemaName":"public","x":519.0,"y":269.0,"alias":"interaction_log","conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"emptyEntityAction":"IGNORE_OR_DELETE"}],"nodeByEntityName":{"interaction_log":{"tableName":"interaction_log","schemaName":"public","x":519.0,"y":269.0,"alias":"interaction_log","conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"emptyEntityAction":"IGNORE_OR_DELETE"}},"matrix":[[null]],"mainNodeIndex":0} - - - - - - + null + + + + fetchSize + + 20.0 + + + + headerHeight + + 40.0 + + + + loadingOverlayMessage + + "Загрузка данных, пожалуйста, подождите." + + + + loadingOverlayType + + "PROGRESS_BAR" + + + + noRowsOverlayMessage + + "Данные отсутствуют" + + + + rowClickSelectionType + + "SINGLE_SELECT_CLICK" + + + + rowHeight + + 40.0 + + + + rowModelType + + "CLIENT_SIDE" + + + + showRowNumber + + null + + + + theme + + null - - 364c8faa-5e56-46cd-9203-d2ec6ef2dc74 - e4763783-817a-4573-99b4-8921636e06fa + + + InMemoryStaticGridRpcService + ru.micord.ervu.service.rpc + + true + true + + + loadService + + +JournalInMemoryStaticGridLoadService +ru.micord.ervu.service.grid.impl + + + + + + + c556264f-221b-4af8-9e64-f380a67c41ec + 9b895ce1-494f-4f2e-b87b-78d019fc3760 Дата и время направления false false - - + + + + valueFormatter + + + + dateFormat + + "DD.MM.YYYY HH:mm:ss" + + + + + DateTimeFormatter + component.grid.formatters + + + + + + autoHeight @@ -367,6 +763,15 @@ true + + dataConverter + + + LocalDateTimeConverter + component.field.dataconvert + + + displayName @@ -379,16 +784,23 @@ true - - displayType - -"ONE_COLUMN" - - field -{"schema":"public","table":"interaction_log","entity":"interaction_log","name":"sent_date"} + + + column + + "departureDateTime" + + + + type + + "java.sql.Timestamp" + + + @@ -397,15 +809,6 @@ true - - formatter - - - DateTimeFormatter - custom.grid.formatter - - - sortable @@ -427,14 +830,14 @@ - - 364c8faa-5e56-46cd-9203-d2ec6ef2dc74 - 814aab37-ef69-435f-8e12-1ffe37f4a69f + + c556264f-221b-4af8-9e64-f380a67c41ec + 3669ef66-b471-47df-8e16-10e88c454e3f Название файла false false - + autoHeight @@ -454,16 +857,23 @@ true - - displayType - -"ONE_COLUMN" - - field -{"schema":"public","table":"interaction_log","entity":"interaction_log","name":"file_name"} + + + column + + "fileName" + + + + type + + "java.lang.String" + + + @@ -493,14 +903,14 @@ - - 364c8faa-5e56-46cd-9203-d2ec6ef2dc74 - 4e56e660-7f83-449c-be6b-bf525aba1142 + + c556264f-221b-4af8-9e64-f380a67c41ec + 831118a0-e3bd-49f1-b4b4-614ef50a4844 Форма false false - + autoHeight @@ -520,16 +930,23 @@ true - - displayType - -"ONE_COLUMN" - - field -{"schema":"public","table":"interaction_log","entity":"interaction_log","name":"form"} + + + column + + "filePatternCode" + + + + type + + "java.lang.Number" + + + @@ -559,14 +976,14 @@ - - 364c8faa-5e56-46cd-9203-d2ec6ef2dc74 - b1bc7945-9748-4b15-8385-c9f1da337fac + + c556264f-221b-4af8-9e64-f380a67c41ec + 7dee1f9d-62a2-4f85-b378-583665173ff2 Отправитель false false - + autoHeight @@ -586,16 +1003,23 @@ true - - displayType - -"ONE_COLUMN" - - field -{"schema":"public","table":"interaction_log","entity":"interaction_log","name":"sender"} + + + column + + "senderFio" + + + + type + + "java.lang.String" + + + @@ -625,14 +1049,14 @@ - - 364c8faa-5e56-46cd-9203-d2ec6ef2dc74 - 321f142f-e9e0-436c-a41d-9fb7b06578f0 + + c556264f-221b-4af8-9e64-f380a67c41ec + 203f9bef-fe65-434c-a2e5-3d05ddc7ed94 Статус false false - + autoHeight @@ -652,16 +1076,23 @@ true - - displayType - -"ONE_COLUMN" - - field -{"schema":"public","table":"interaction_log","entity":"interaction_log","name":"status"} + + + column + + "status" + + + + type + + "java.lang.String" + + + @@ -691,14 +1122,14 @@ - - 364c8faa-5e56-46cd-9203-d2ec6ef2dc74 - d8b5a9b1-fd07-41e6-b2d0-572d5f06de9a + + c556264f-221b-4af8-9e64-f380a67c41ec + d3dcfb63-3b27-471d-b1dd-6bd2d3c5b80f Записей отправлено false false - + autoHeight @@ -718,16 +1149,23 @@ true - - displayType - -"ONE_COLUMN" - - field -{"schema":"public","table":"interaction_log","entity":"interaction_log","name":"records_sent"} + + + column + + "filesSentCount" + + + + type + + "java.lang.Number" + + + @@ -757,14 +1195,14 @@ - - 364c8faa-5e56-46cd-9203-d2ec6ef2dc74 - 5b6704c5-1e75-41a5-b61e-0facb663d032 + + c556264f-221b-4af8-9e64-f380a67c41ec + 4c070d5d-cac7-4cc4-8ee4-e9a4b9b289a5 Записей принято false false - + autoHeight @@ -784,16 +1222,23 @@ true - - displayType - -"ONE_COLUMN" - - field -{"schema":"public","table":"interaction_log","entity":"interaction_log","name":"records_accepted"} + + + column + + "acceptedFilesCount" + + + + type + + "java.lang.Number" + + + diff --git a/resources/src/main/resources/business-model/Информация об организации.page b/resources/src/main/resources/business-model/Информация об организации.page index f8980b88..953030de 100644 --- a/resources/src/main/resources/business-model/Информация об организации.page +++ b/resources/src/main/resources/business-model/Информация об организации.page @@ -21,6 +21,14 @@ + + + OrgDataRoot + esia + + true + true + fd7e47b9-dce1-4d14-9f3a-580c79f59579 cfd9b09a-2133-4e26-b0d4-0c44b70b98c5 @@ -108,7 +116,7 @@ initialValue - "Общество с ограниченной ответственностью \"Звезда\"" + null @@ -119,6 +127,22 @@ false + + + OrgData + esia + + true + true + + + dataId + + "fullName" + + + + 9d1b5af1-0b8f-4b1b-b9a5-c2e6acf72d91 @@ -255,6 +279,7 @@ 24766ecb-d984-4af9-82df-5db400573a09 ФИО пользователя false + false false @@ -271,7 +296,7 @@ initialValue - "Иванова Анна Игоревна" + null @@ -282,118 +307,79 @@ false - - - 16071adb-3bdf-4c33-b29b-886876016415 - 5e633339-5878-4b19-9f56-8b97b5f0f5aa - Таблица - true - false - + + + OrgData + esia + +true +true - autoStretchColumns + dataId - true + "empFullname" + + + + + ba24d307-0b91-4299-ba82-9d0b52384ff2 + 9d823f8b-f6c0-4767-a262-717d2d80f69f + Роли пользователя + false + false + false + + cssClasses - + - "okved-list" - - - - - "mute" + "font-bold" - disabled - - true - - - - rowClickSelectionType + initialValue null - + + + + +false + + + + OrgData + esia + +true +true - gridService + dataId - - - loadDao - - - -graph - - {"conditionGroup":{"operator":"AND","conditions":[],"groups":[]},"nodeByIndex":{"0":{"tableName":"org_okved","schemaName":"public","x":387.20000000000005,"y":282.4,"alias":"org_okved","conditionGroup":{"operator":"AND","conditions":[{"column":{"schema":"public","table":"org_okved","entity":"org_okved","name":"code"},"operation":"EQUAL","typeCode":"CONST","values":["\"5\""]}],"groups":[]},"emptyEntityAction":"IGNORE_OR_DELETE"}},"nodes":[{"tableName":"org_okved","schemaName":"public","x":387.20000000000005,"y":282.4,"alias":"org_okved","conditionGroup":{"operator":"AND","conditions":[{"column":{"schema":"public","table":"org_okved","entity":"org_okved","name":"code"},"operation":"EQUAL","typeCode":"CONST","values":["\"5\""]}],"groups":[]},"emptyEntityAction":"IGNORE_OR_DELETE"}],"nodeByEntityName":{"org_okved":{"tableName":"org_okved","schemaName":"public","x":387.20000000000005,"y":282.4,"alias":"org_okved","conditionGroup":{"operator":"AND","conditions":[{"column":{"schema":"public","table":"org_okved","entity":"org_okved","name":"code"},"operation":"EQUAL","typeCode":"CONST","values":["\"5\""]}],"groups":[]},"emptyEntityAction":"IGNORE_OR_DELETE"}},"matrix":[[null]],"mainNodeIndex":0} - - - - - - + "userRoles" - - -364c8faa-5e56-46cd-9203-d2ec6ef2dc74 -2d713b90-9e5a-428c-a40f-b3d164790032 -Столбец -false -false - - - - - disableHiding - - true - - - - displayColumns - - - - - - - displayPopup - - false - - - - displayType - - "ONE_COLUMN" - - - - field - - {"schema":"public","table":"org_okved","entity":"org_okved","name":"okved"} - - - - - + + + 16071adb-3bdf-4c33-b29b-886876016415 + 5e633339-5878-4b19-9f56-8b97b5f0f5aa + Таблица + true + true ba24d307-0b91-4299-ba82-9d0b52384ff2 @@ -406,7 +392,7 @@ initialValue - "Сотрудник, ответственный за военно-учетную работу" + null @@ -423,6 +409,22 @@ false + + + OrgData + esia + +true +true + + + dataId + + "empPosition" + + + + d7d54cfb-26b5-4dba-b56f-b6247183c24d @@ -632,13 +634,14 @@ 72812590-34a2-4be5-890a-b47d24c28d7d Полное наименование false + false false initialValue - "Общество с ограниченной ответственностью \"Звезда\"" + null @@ -655,19 +658,36 @@ false + + + OrgData + esia + +true +true + + + dataId + + "fullName" + + + + ba24d307-0b91-4299-ba82-9d0b52384ff2 61db0ee2-e648-43aa-ab3f-5fb3e3a6bda8 Сокращенное наименование false + false false initialValue - "ООО \"Звезда\"" + null @@ -684,19 +704,36 @@ false + + + OrgData + esia + +true +true + + + dataId + + "shortName" + + + + ba24d307-0b91-4299-ba82-9d0b52384ff2 aae0dbf3-2468-41f3-85db-d311e99668cc Юридический адрес false + false false initialValue - "г.Москва, ул.Новослободская, д.23" + null @@ -713,19 +750,36 @@ false + + + OrgData + esia + +true +true + + + dataId + + "olgAddress" + + + + ba24d307-0b91-4299-ba82-9d0b52384ff2 c5cdac54-6c44-42af-b85a-602ef809c872 Должность руководителя false + false false initialValue - "Директор" + null @@ -742,6 +796,22 @@ false + + + OrgData + esia + +true +true + + + dataId + + "chiefPosition" + + + + 133ca212-09a6-413a-ac66-e2f6ce188f1f @@ -779,7 +849,7 @@ initialValue - "4657301956" + null @@ -795,6 +865,22 @@ false + + + + OrgData + esia + + true + true + + + dataId + + "inn" + + + @@ -836,7 +922,7 @@ initialValue - "165748369" + null @@ -852,6 +938,22 @@ false + + + + OrgData + esia + + true + true + + + dataId + + "kpp" + + + @@ -877,7 +979,7 @@ initialValue - "1121660070021" + null @@ -893,6 +995,22 @@ false + + + + OrgData + esia + + true + true + + + dataId + + "ogrn" + + + @@ -970,7 +1088,7 @@ initialValue - "Сидоров Петр Николаевич" + null @@ -987,6 +1105,22 @@ false + + + OrgData + esia + +true +true + + + dataId + + "chiefFullname" + + + + @@ -1068,7 +1202,7 @@ initialValue - "8 495 333 0000" + null @@ -1084,6 +1218,22 @@ false + + + + OrgData + esia + + true + true + + + dataId + + "mobile" + + + @@ -1125,7 +1275,7 @@ initialValue - "pochta@mail.ru" + null @@ -1141,6 +1291,22 @@ false + + + + OrgData + esia + + true + true + + + dataId + + "email" + + + @@ -1149,13 +1315,14 @@ 83cd4ee9-e574-4181-b367-ce5345abf2e8 Почтовый адрес false + false false initialValue - "г.Москва, ул.Новослободская, д.23" + null @@ -1172,6 +1339,22 @@ false + + + OrgData + esia + +true +true + + + dataId + + "opsAddress" + + + + @@ -1179,7 +1362,6 @@ 18ade34c-a25f-44b8-8d90-79e24edb04b4 VB 3 true - false false diff --git a/resources/src/main/resources/business-model/Личный кабинет юр лица.page b/resources/src/main/resources/business-model/Личный кабинет юр лица.page index ee28f07c..f44bddbb 100644 --- a/resources/src/main/resources/business-model/Личный кабинет юр лица.page +++ b/resources/src/main/resources/business-model/Личный кабинет юр лица.page @@ -10,56 +10,92 @@ - - ba24d307-0b91-4299-ba82-9d0b52384ff2 - f315572a-a735-421b-8297-be0eb6614c2a - Текст - false + + 9d1b5af1-0b8f-4b1b-b9a5-c2e6acf72d91 + 02aa8f2c-b462-4303-9965-9f1de27e6cd2 + Vbox + true false - - - - collectible - - false - - - - cssClasses - - - -"title" - - - - - - initialValue - - "Наименование Организации" - - - - label - - null - - - - tooltip - - null - - - - - - - - - false + + + + + + + + OrgDataRoot + esia + + true + true + + ba24d307-0b91-4299-ba82-9d0b52384ff2 + f315572a-a735-421b-8297-be0eb6614c2a + Текст + false + false + + + + collectible + + false + + + + cssClasses + + + + "title" + + + + + + initialValue + + null + + + + label + + null + + + + tooltip + + null + + + + + + + + + false + + + + OrgData + esia + + true + true + + + dataId + + "fullName" + + + + + d7d54cfb-26b5-4dba-b56f-b6247183c24d diff --git a/resources/src/main/resources/components/InMemoryStaticGrid.component b/resources/src/main/resources/components/InMemoryStaticGrid.component new file mode 100644 index 00000000..1fb15557 --- /dev/null +++ b/resources/src/main/resources/components/InMemoryStaticGrid.component @@ -0,0 +1,54 @@ + + + 63a04163-fae6-49c4-aa1a-c028e7594640 + InMemoryStaticGrid + grids + false + + 3.178.2 + + + ru.cg.webbpm.packages.base.resources + 3.178.2 + + + + + 16071adb-3bdf-4c33-b29b-886876016415 + bee4e324-a660-4d99-bbc4-9fc2b084a5fc + InMemoryStaticGrid + true + false + + false + true + + + false + true + + + + InMemoryStaticGrid + ervu.component.grid + + true + true + + + floatingFilter + + true + + + + visible + + true + + + + + + + diff --git a/resources/src/main/resources/components/StaticGridColumn.component b/resources/src/main/resources/components/StaticGridColumn.component new file mode 100644 index 00000000..896b396b --- /dev/null +++ b/resources/src/main/resources/components/StaticGridColumn.component @@ -0,0 +1,36 @@ + + + d78a169c-8d7d-471a-bc80-909b617f85f0 + StaticGridColumn + grids + false + + 3.178.2 + + + ru.cg.webbpm.packages.base.resources + 3.178.2 + + + + + 364c8faa-5e56-46cd-9203-d2ec6ef2dc74 + c556264f-221b-4af8-9e64-f380a67c41ec + StaticGridColumn + false + false + + + false + true + + + + StaticGridColumn + ru.micord.ervu.property.grid + + true + true + + +