diff --git a/backend/src/main/java/ru/micord/ervu/converter/SummonsResponseDataConverter.java b/backend/src/main/java/ru/micord/ervu/converter/SummonsResponseDataConverter.java index 56029ab..63c3e4d 100644 --- a/backend/src/main/java/ru/micord/ervu/converter/SummonsResponseDataConverter.java +++ b/backend/src/main/java/ru/micord/ervu/converter/SummonsResponseDataConverter.java @@ -1,9 +1,11 @@ package ru.micord.ervu.converter; +import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Optional; +import ru.micord.ervu.dto.Restriction; import ru.micord.ervu.dto.SubpoenaResponseDto; import org.springframework.stereotype.Component; import proto.ervu.rp.summons.MeasuresTemporary; @@ -13,6 +15,7 @@ import proto.ervu.rp.summons.SummonsResponseData; import static ru.micord.ervu.util.DateUtil.convertToLocalDate; import static java.util.Objects.requireNonNull; +import static ru.micord.ervu.util.DateUtil.convertToString; import static ru.micord.ervu.util.DateUtil.getDaysTill; /** @@ -64,29 +67,23 @@ public class SummonsResponseDataConverter { .recruitmentStatusCode( Integer.parseInt(responseData.getRecruitmentInfo().getRecruitmentStatusCode())) .recruitmentStartDate(responseData.getRecruitmentInfo().getRecruitmentStart()) - .daysToAppearance(getDaysTill(convertToLocalDate(estimatedDate))) - .otherRestrictionCount(-1); + .daysToAppearance(getDaysTill(convertToLocalDate(estimatedDate))); - summonsInfo.getMeasuresTemporaryPackagesList() - .stream() - // get last package - .max(Comparator.comparing( - mp -> requireNonNull(convertToLocalDate(mp.getPackageStartDate())))) - .ifPresent( - measuresTemporaryPackage -> { - List temporariesList = measuresTemporaryPackage.getMeasuresTemporariesList(); - temporariesList.forEach(measuresTemporary -> - builder.addRestriction(measuresTemporary.getMeasureName(), - measuresTemporary.getStartDate() - )); + List restrictions = new ArrayList<>(); + summonsInfo.getMeasuresTemporaryPackagesList().forEach( + measuresTemporaryPackage -> measuresTemporaryPackage.getMeasuresTemporariesList() + .forEach(measuresTemporary -> + restrictions.add(new Restriction(measuresTemporary.getMeasureName(), + convertToString(convertToLocalDate(measuresTemporary.getStartDate())))) + )); - if (!temporariesList.isEmpty()) { - MeasuresTemporary firstMeasure = temporariesList.get(0); - builder.firstRestrictionName(firstMeasure.getMeasureName()); - builder.firstRestrictionStartDate(firstMeasure.getStartDate()); - } - builder.otherRestrictionCount(temporariesList.size() - 1); - }); + if (!restrictions.isEmpty()) { + builder.addRestrictions(restrictions); + Restriction firstRestriction = restrictions.get(0); + builder.firstRestrictionName(firstRestriction.name()); + builder.firstRestrictionStartDate(firstRestriction.startDate()); + } + builder.otherRestrictionCount(restrictions.size() - 1); } return builder.build(); } diff --git a/backend/src/main/java/ru/micord/ervu/dto/SubpoenaResponseDto.java b/backend/src/main/java/ru/micord/ervu/dto/SubpoenaResponseDto.java index 8963d1c..d661d75 100644 --- a/backend/src/main/java/ru/micord/ervu/dto/SubpoenaResponseDto.java +++ b/backend/src/main/java/ru/micord/ervu/dto/SubpoenaResponseDto.java @@ -165,8 +165,8 @@ public record SubpoenaResponseDto(String personName, String birthDate, String do return this; } - public void addRestriction(String name, String date) { - this.restrictions.add(new Restriction(name, convertToString(convertToLocalDate(date)))); + public void addRestrictions(List restrictions) { + this.restrictions.addAll(restrictions); } public void firstRestrictionName(String name) { diff --git a/backend/src/main/java/ru/micord/ervu/kafka/ReplyingKafkaConfig.java b/backend/src/main/java/ru/micord/ervu/kafka/ReplyingKafkaConfig.java index 6b55dae..61e64b3 100644 --- a/backend/src/main/java/ru/micord/ervu/kafka/ReplyingKafkaConfig.java +++ b/backend/src/main/java/ru/micord/ervu/kafka/ReplyingKafkaConfig.java @@ -100,7 +100,7 @@ public class ReplyingKafkaConfig { configProps.put(SaslConfigs.SASL_JAAS_CONFIG, loginModule + " required username=\"" + username + "\" password=\"" + password + "\";"); configProps.put(SaslConfigs.SASL_MECHANISM, saslMechanism); - configProps.put(ConsumerConfig.GROUP_ID_CONFIG, groupId); + configProps.put(ConsumerConfig.GROUP_ID_CONFIG, groupId + "-" + UUID.randomUUID()); configProps.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); return configProps; } @@ -122,19 +122,13 @@ public class ReplyingKafkaConfig { @Bean public ConcurrentMessageListenerContainer replyContainer( ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory) { - ConcurrentMessageListenerContainer container = - kafkaListenerContainerFactory.createContainer(replyTopic); - container.getContainerProperties().setGroupId(groupId); - return container; + return kafkaListenerContainerFactory.createContainer(replyTopic); } @Bean public ConcurrentMessageListenerContainer subpoenaReplyContainer( ConcurrentKafkaListenerContainerFactory subpoenaKafkaListenerContainerFactory) { - ConcurrentMessageListenerContainer container = - subpoenaKafkaListenerContainerFactory.createContainer(recruitReplyTopic, registryExtractReplyTopic); - container.getContainerProperties().setGroupId(groupId); - return container; + return subpoenaKafkaListenerContainerFactory.createContainer(recruitReplyTopic, registryExtractReplyTopic); } @Bean("person") @@ -162,5 +156,6 @@ public class ReplyingKafkaConfig { replyingKafkaTemplate.setCorrelationIdStrategy(record -> new CorrelationKey(UUID.randomUUID().toString().getBytes(StandardCharsets.UTF_8))); replyingKafkaTemplate.setDefaultReplyTimeout(Duration.ofSeconds(replyTimeout)); + replyingKafkaTemplate.setSharedReplyTopic(true); } } 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 0c5a10b..5f088ea 100644 --- a/backend/src/main/java/ru/micord/ervu/security/SecurityConfig.java +++ b/backend/src/main/java/ru/micord/ervu/security/SecurityConfig.java @@ -13,6 +13,7 @@ import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.logout.LogoutFilter; +import org.springframework.security.web.authentication.session.NullAuthenticatedSessionStrategy; import org.springframework.security.web.csrf.CookieCsrfTokenRepository; import org.springframework.security.web.csrf.CsrfTokenRequestHandler; import org.springframework.security.web.csrf.XorCsrfTokenRequestAttributeHandler; @@ -49,31 +50,22 @@ public class SecurityConfig { } @Bean - public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - httpConfigure(http); - http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); - http.addFilterBefore(new RequestContextFilter(), LogoutFilter.class); - http.addFilterAfter(filterChainExceptionHandler, RequestContextFilter.class); - return http.build(); - } - - protected void httpConfigure(HttpSecurity httpSecurity) throws Exception { - CookieCsrfTokenRepository tokenRepository = CookieCsrfTokenRepository.withHttpOnlyFalse(); - tokenRepository.setCookieName(TokenConstants.CSRF_TOKEN_NAME); - tokenRepository.setHeaderName(TokenConstants.CSRF_HEADER_NAME); - tokenRepository.setCookiePath("/"); + public SecurityFilterChain filterChain(HttpSecurity http, + CookieCsrfTokenRepository tokenRepository) + throws Exception { XorCsrfTokenRequestAttributeHandler delegate = new XorCsrfTokenRequestAttributeHandler(); delegate.setCsrfRequestAttributeName(null); // Use only the handle() method of XorCsrfTokenRequestAttributeHandler and the // default implementation of resolveCsrfTokenValue() from CsrfTokenRequestHandler CsrfTokenRequestHandler requestHandler = delegate::handle; - httpSecurity.authorizeHttpRequests( + http.authorizeHttpRequests( (authorizeHttpRequests) -> authorizeHttpRequests.requestMatchers(PERMIT_ALL) .permitAll() .anyRequest() .authenticated()) .csrf((csrf) -> csrf.csrfTokenRepository(tokenRepository) - .csrfTokenRequestHandler(requestHandler)) + .csrfTokenRequestHandler(requestHandler) + .sessionAuthenticationStrategy(new NullAuthenticatedSessionStrategy())) .logout((logout) -> logout.logoutUrl(ESIA_LOGOUT) .logoutSuccessHandler(new LogoutSuccessHandler(tokenRepository, esiaAuthService))) .exceptionHandling() @@ -81,6 +73,19 @@ public class SecurityConfig { .and() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS); + http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); + http.addFilterBefore(new RequestContextFilter(), LogoutFilter.class); + http.addFilterAfter(filterChainExceptionHandler, RequestContextFilter.class); + return http.build(); + } + + @Bean + public CookieCsrfTokenRepository cookieCsrfTokenRepository() { + CookieCsrfTokenRepository tokenRepository = CookieCsrfTokenRepository.withHttpOnlyFalse(); + tokenRepository.setCookieName(TokenConstants.CSRF_TOKEN_NAME); + tokenRepository.setHeaderName(TokenConstants.CSRF_HEADER_NAME); + tokenRepository.setCookiePath("/"); + return tokenRepository; } public AuthenticationEntryPoint entryPoint() { 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 index be5878e..08c9f82 100644 --- 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 @@ -1,6 +1,5 @@ package ru.micord.ervu.security.esia.service; -import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URL; import java.net.URLEncoder; @@ -21,11 +20,10 @@ import javax.servlet.http.HttpServletResponse; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.core.context.SecurityContext; import ru.micord.ervu.kafka.model.Document; -import ru.micord.ervu.kafka.model.ErrorData; import ru.micord.ervu.kafka.model.Person; import ru.micord.ervu.kafka.model.Response; import ru.micord.ervu.kafka.service.ReplyingKafkaService; @@ -69,6 +67,8 @@ public class EsiaAuthService { @Autowired private SecurityHelper securityHelper; + @Autowired + private AuthenticationManager authenticationManager; @Value("${ervu.kafka.reply.topic}") private String requestReplyTopic; @@ -130,12 +130,8 @@ public class EsiaAuthService { } private static String urlEncode(String s) { - try { - return URLEncoder.encode(s, "UTF-8") - .replace("+", "%20"); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } + return URLEncoder.encode(s, StandardCharsets.UTF_8) + .replace("+", "%20"); } private static String makeRequest(URL url, Map params) { @@ -193,21 +189,19 @@ public class EsiaAuthService { EsiaTokenResponse.class ); - if (tokenResponse == null) { - throw new IllegalStateException("Got empty esia response"); + if (tokenResponse == null || tokenResponse.getError() != null) { + String errMsg = + tokenResponse != null ? tokenResponse.getError_description() : "response is empty"; + throw new IllegalStateException("Esia response error. " + errMsg); } - - if (tokenResponse.getError() != null) { - throw new RuntimeException(tokenResponse.getError_description()); - } - String accessToken = tokenResponse.getAccess_token(); - String refreshToken = tokenResponse.getRefresh_token(); - EsiaAccessToken esiaAccessToken = personalDataService.readToken(accessToken); + String esiaAccessTokenStr = tokenResponse.getAccess_token(); + String esiaRefreshTokenStr = tokenResponse.getRefresh_token(); + EsiaAccessToken esiaAccessToken = personalDataService.readToken(esiaAccessTokenStr); String prnOid = esiaAccessToken.getSbj_id(); Long expiresIn = tokenResponse.getExpires_in(); - TokensStore.addAccessToken(prnOid, accessToken, expiresIn); - TokensStore.addRefreshToken(prnOid, refreshToken, expiresIn); - Response ervuIdResponse = getErvuIdResponse(accessToken); + TokensStore.addAccessToken(prnOid, esiaAccessTokenStr, expiresIn); + TokensStore.addRefreshToken(prnOid, esiaRefreshTokenStr, expiresIn); + Response ervuIdResponse = getErvuIdResponse(esiaAccessTokenStr); Token token = jwtTokenService.createAccessToken(esiaAccessToken.getSbj_id(), expiresIn, ervuIdResponse.getErvuId()); int expiry = tokenResponse.getExpires_in().intValue(); Cookie accessCookie = securityHelper.createAccessCookie(token.getValue(), expiry); @@ -215,9 +209,10 @@ public class EsiaAuthService { UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(token.getUserAccountId(), null); SecurityContext context = SecurityContextHolder.createEmptyContext(); - JwtAuthentication authentication = new JwtAuthentication(usernamePasswordAuthenticationToken, + JwtAuthentication jwtAuthentication = new JwtAuthentication(usernamePasswordAuthenticationToken, esiaAccessToken.getSbj_id(), token.getValue()); - context.setAuthentication(authentication); + authenticationManager.authenticate(jwtAuthentication); + context.setAuthentication(jwtAuthentication); SecurityContextHolder.setContext(context); Cookie authMarkerCookie = securityHelper.createAuthMarkerCookie("true", expiry); response.addCookie(authMarkerCookie); @@ -271,17 +266,19 @@ public class EsiaAuthService { .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()); + if (tokenResponse == null || tokenResponse.getError() != null) { + String errMsg = + tokenResponse != null ? tokenResponse.getError_description() : "response is empty"; + throw new IllegalStateException("Esia response error. " + errMsg); } - String accessToken = tokenResponse.getAccess_token(); - String newRefreshToken = tokenResponse.getRefresh_token(); - EsiaAccessToken esiaAccessToken = personalDataService.readToken(accessToken); + String esiaAccessTokenStr = tokenResponse.getAccess_token(); + String esiaNewRefreshTokenStr = tokenResponse.getRefresh_token(); + EsiaAccessToken esiaAccessToken = personalDataService.readToken(esiaAccessTokenStr); String prnOid = esiaAccessToken.getSbj_id(); Long expiresIn = tokenResponse.getExpires_in(); - TokensStore.addAccessToken(prnOid, accessToken, expiresIn); - TokensStore.addRefreshToken(prnOid, newRefreshToken, expiresIn); - Response ervuIdResponse = getErvuIdResponse(accessToken); + TokensStore.addAccessToken(prnOid, esiaAccessTokenStr, expiresIn); + TokensStore.addRefreshToken(prnOid, esiaNewRefreshTokenStr, expiresIn); + Response ervuIdResponse = getErvuIdResponse(esiaAccessTokenStr); Token token = jwtTokenService.createAccessToken(esiaAccessToken.getSbj_id(), expiresIn, ervuIdResponse.getErvuId()); int expiry = tokenResponse.getExpires_in().intValue(); Cookie accessCookie = securityHelper.createAccessCookie(token.getValue(), expiry); @@ -289,9 +286,10 @@ public class EsiaAuthService { UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(token.getUserAccountId(), null); SecurityContext context = SecurityContextHolder.createEmptyContext(); - JwtAuthentication authentication = new JwtAuthentication(usernamePasswordAuthenticationToken, + JwtAuthentication jwtAuthentication = new JwtAuthentication(usernamePasswordAuthenticationToken, esiaAccessToken.getSbj_id(), token.getValue()); - context.setAuthentication(authentication); + authenticationManager.authenticate(jwtAuthentication); + context.setAuthentication(jwtAuthentication); SecurityContextHolder.setContext(context); Cookie authMarkerCookie = securityHelper.createAuthMarkerCookie("true", expiry); response.addCookie(authMarkerCookie); @@ -327,7 +325,7 @@ public class EsiaAuthService { } } - private void errorHandler(HttpResponse httpResponse) { + private void errorHandler(HttpResponse httpResponse) { if (httpResponse.statusCode() != 200) { throw new RuntimeException(httpResponse.statusCode() + " " + httpResponse.body()); } diff --git a/backend/src/main/java/ru/micord/ervu/security/listener/JwtUpdateListener.java b/backend/src/main/java/ru/micord/ervu/security/listener/JwtUpdateListener.java new file mode 100644 index 0000000..0709b6a --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/security/listener/JwtUpdateListener.java @@ -0,0 +1,72 @@ +package ru.micord.ervu.security.listener; + +import java.lang.invoke.MethodHandles; +import java.util.Arrays; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationListener; +import org.springframework.security.authentication.event.AuthenticationSuccessEvent; +import org.springframework.security.web.csrf.CsrfTokenRepository; +import org.springframework.security.web.csrf.CsrfTokenRequestAttributeHandler; +import org.springframework.security.web.csrf.CsrfTokenRequestHandler; +import org.springframework.security.web.csrf.DeferredCsrfToken; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import static org.springframework.web.context.request.RequestAttributes.REFERENCE_REQUEST; + + +@Component +public class JwtUpdateListener implements ApplicationListener { + private final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + private final CsrfTokenRepository tokenRepository; + private final Set csrfUpdateRequiredPathMatchers; + + private CsrfTokenRequestHandler requestHandler = new CsrfTokenRequestAttributeHandler(); + + @Autowired + public JwtUpdateListener(CsrfTokenRepository tokenRepository) { + Assert.notNull(tokenRepository, "tokenRepository cannot be null"); + this.tokenRepository = tokenRepository; + this.csrfUpdateRequiredPathMatchers = Arrays.stream(new String[] {"/esia/auth"}) + .map(AntPathRequestMatcher::new) + .collect(Collectors.toSet()); + } + + @Override + public void onApplicationEvent(AuthenticationSuccessEvent event) { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + HttpServletRequest request = (HttpServletRequest) Objects.requireNonNull(requestAttributes) + .resolveReference( + REFERENCE_REQUEST); + HttpServletResponse response = ((ServletRequestAttributes) requestAttributes).getResponse(); + + //if csrf cookie update is not required return + if (this.csrfUpdateRequiredPathMatchers.stream() + .noneMatch(matcher -> matcher.matches(request))) { + return; + } + boolean containsToken = this.tokenRepository.loadToken(request) != null; + + if (containsToken) { + this.tokenRepository.saveToken(null, request, response); + DeferredCsrfToken deferredCsrfToken = this.tokenRepository.loadDeferredToken(request, + response + ); + this.requestHandler.handle(request, response, deferredCsrfToken::get); + this.logger.debug("Replaced CSRF Token"); + } + } +} diff --git a/frontend/home.html b/frontend/home.html index e94645b..aae7711 100644 --- a/frontend/home.html +++ b/frontend/home.html @@ -13,6 +13,16 @@
+
+
+
+
Для обеспечения защищённого соединения с сайтом реестра повесток необходимо установить браузер Яндекс или Chromium GOST.
+
+
+
+
diff --git a/frontend/src/resources/css/components-lkrp.css b/frontend/src/resources/css/components-lkrp.css index b11e23e..dac0050 100644 --- a/frontend/src/resources/css/components-lkrp.css +++ b/frontend/src/resources/css/components-lkrp.css @@ -343,6 +343,7 @@ .webbpm.ervu_lkrp_fl .right-block field-set { font-size: var(--size-text-secondary); } +/* .webbpm.ervu_lkrp_fl .right-block field-set:first-child .fieldset { padding-top: 52px; } @@ -355,7 +356,7 @@ height: 24px; background-image: url(../img/svg/doc.svg); } - +*/ .webbpm.ervu_lkrp_fl field-set + field-set { margin-top: var(--indent-medium); } @@ -468,6 +469,25 @@ border-color: var(--color-link); } +.webbpm.ervu_lkrp_fl .grid-warning .ag-root-wrapper { + background-color: transparent; +} +.webbpm.ervu_lkrp_fl .grid-warning .ag-row, +.webbpm.ervu_lkrp_fl .grid-warning .ag-row.ag-row-hover { + border: 0 !important; + border-radius: 8px; + background-color: var(--bg-warn) !important; +} +.webbpm.ervu_lkrp_fl .grid-warning .ag-row + .ag-row { + border-top: 4px solid var(--bg-light) !important; +} +.webbpm.ervu_lkrp_fl .grid-warning .ag-row .ag-cell { + color: var(--color-text-primary) !important; + height: auto !important; + padding: var(--indent-mini); + border: 0 !important; +} + .webbpm.ervu_lkrp_fl .okved-list { height: auto; } diff --git a/frontend/src/resources/landing/home.css b/frontend/src/resources/landing/home.css index b58813f..b68b3d1 100644 --- a/frontend/src/resources/landing/home.css +++ b/frontend/src/resources/landing/home.css @@ -624,6 +624,29 @@ a.btn:is(:hover, :focus, :active) { color: var(--color-link); } +.browser-check-content { + font-family: 'Golos'; + font-size: var(--size-text-secondary); + padding: var(--indent-mini) var(--w-screen) var(--indent-mini) calc(var(--w-screen) + 38px); + background-color: var(--bg-warn); +} +.browser-check-text { + position: relative; + padding-left: 40px; +} +.browser-check-text::before { + position: absolute; + content: url(../img/svg/info.svg); + left: 0; + top: calc((100% - 24px) / 2); +} +.text-header { + color: var(--color-link); + font-family: 'GolosB'; + font-size: var(--size-text-primary); + margin-bottom: 4px; +} + /*@media ((max-width: 780px) or ((orientation: landscape) and (max-device-width : 1024px))) {*/ @media (max-width: 1024px) { body { diff --git a/resources/src/main/resources/business-model/LK RP FL/mydata.page b/resources/src/main/resources/business-model/LK RP FL/mydata.page index ea10a55..c568298 100644 --- a/resources/src/main/resources/business-model/LK RP FL/mydata.page +++ b/resources/src/main/resources/business-model/LK RP FL/mydata.page @@ -489,7 +489,7 @@ - "font-bold" + "subtitle" @@ -497,7 +497,7 @@ initialValue - null + "Паспорт" diff --git a/resources/src/main/resources/business-model/LK RP FL/restriction.page b/resources/src/main/resources/business-model/LK RP FL/restriction.page index 72ebcfb..8dc69e6 100644 --- a/resources/src/main/resources/business-model/LK RP FL/restriction.page +++ b/resources/src/main/resources/business-model/LK RP FL/restriction.page @@ -238,7 +238,6 @@ a674ce01-eadd-4297-b782-53e45e059310 HB - (сценарий) в связи с неявкой в военкомат без уважительной причины в течение 20 календарных true - false false @@ -378,7 +377,6 @@ 699b5c5c-2501-42a0-9572-692ec55de595 VB - текст true - false false @@ -448,157 +446,181 @@ 0276d338-dbbc-406a-a356-96f7fd02a5a6 Таблица - временные меры true - false - - - - dataList - - "restrictions" - - - - headerHeight - - 0.0 - - - - rowHeight - - 70.0 - - - - - - - c556264f-221b-4af8-9e64-f380a67c41ec - 887d096c-95f4-4938-afed-171f350accd6 - Наименование - false - false - - - - - autoHeight - - true - - - - displayName - - "Наименование" - - - - field - - - - column - - "name" - - - - type - - "java.lang.String" - - - - - - - - - - c556264f-221b-4af8-9e64-f380a67c41ec - 991ac56c-fc92-4ecf-b617-d2c1a1f08bee - Дата - false - false - - - - renderer - - - - label - - "c" - - - - - ValueWithPrefixRenderer - ervu.component.grid.renderer - - - - - - - - - displayName - - "Дата" - - - - field - - - - column - - "startDate" - - - - type - - "java.lang.String" - - - - - - - - - - 98594cec-0a9b-4cef-af09-e1b71cb2ad9e - f2b252d0-4b3b-4ac2-8915-1d1481f99ef1 - Обработка событий - false - true - - - 364c8faa-5e56-46cd-9203-d2ec6ef2dc74 - 640a3f04-fbe0-4287-9c20-69b28bc39406 - Наименование меры - false - true - + true f7504fc9-f501-43fe-a678-5c6ba756ba5c c13a9405-f8c1-4676-be98-b7cef733e6a7 FS - 2 (список ограничений) true - false false + + bee4e324-a660-4d99-bbc4-9fc2b084a5fc + 0276d338-dbbc-406a-a356-96f7fd02a5a6 + Таблица - временные меры + true + false + false + + + + cssClasses + + + + "grid-warning" + + + true + + + + dataList + + "restrictions" + + + + headerHeight + + 0.0 + + + + rowHeight + + null + + + + + + +c556264f-221b-4af8-9e64-f380a67c41ec +887d096c-95f4-4938-afed-171f350accd6 +Наименование +false +false + + + + + autoHeight + + true + + + + displayName + + "Наименование" + + + + field + + + + column + + "name" + + + + type + + "java.lang.String" + + + + + + + + + +c556264f-221b-4af8-9e64-f380a67c41ec +991ac56c-fc92-4ecf-b617-d2c1a1f08bee +Дата +false +false + + + + renderer + + + + label + + "c" + + + + + ValueWithPrefixRenderer + ervu.component.grid.renderer + + + + + + + + + autoHeight + + true + + + + displayName + + "Дата" + + + + field + + + + column + + "startDate" + + + + type + + "java.lang.String" + + + + + + + + + +98594cec-0a9b-4cef-af09-e1b71cb2ad9e +f2b252d0-4b3b-4ac2-8915-1d1481f99ef1 +Обработка событий +false +true + + +364c8faa-5e56-46cd-9203-d2ec6ef2dc74 +640a3f04-fbe0-4287-9c20-69b28bc39406 +Наименование меры +false +true + + 9d1b5af1-0b8f-4b1b-b9a5-c2e6acf72d91 3d37c6ac-d693-42e0-a534-0148b6677f39 @@ -615,7 +637,6 @@ 040fa808-ccbf-4844-b179-d63f54dc220a HB - запрет на выезд из России true -false false @@ -761,7 +782,6 @@ 7dd0d142-e1fd-4603-902f-b445f03c4ddf HB - запрет на регистрацию в качестве индивидуального предпринимателя true -false false @@ -875,7 +895,6 @@ 573a720b-91f7-4e25-a441-7fd3133fdf31 HB - запрет на постановку в налоговом органе физического лица в качестве налогоплательщика, применяющего спец true -false false @@ -1529,7 +1548,7 @@ - "font-bold" + "subtitle" @@ -1824,6 +1843,7 @@ ffa21c64-1030-45c8-9901-db59f298fc11 Диалоговые окна (информационные) true + false false @@ -3215,13 +3235,6 @@ - - ba24d307-0b91-4299-ba82-9d0b52384ff2 - 15d83ba6-b210-4904-8712-5ffb950507a0 - Текст(гссылка) - Закон о воинской обязанности и военной службе, ст. 7. - false - true - ba24d307-0b91-4299-ba82-9d0b52384ff2 81c3d5d2-0f2e-401d-b107-4ad7467f7b30 diff --git a/resources/src/main/resources/business-model/LK RP FL/screen-form-fl.page b/resources/src/main/resources/business-model/LK RP FL/screen-form-fl.page index 284a0cb..ce0af5f 100644 --- a/resources/src/main/resources/business-model/LK RP FL/screen-form-fl.page +++ b/resources/src/main/resources/business-model/LK RP FL/screen-form-fl.page @@ -1970,7 +1970,6 @@ c3fc56e5-4aec-44e3-92ed-5fb7b6a68519 FS - 1.1.2 (Временные меры) true - false false @@ -2128,7 +2127,6 @@ 9f8fe06c-2f44-426e-8249-10f9cb5d76f2 VB - 1.1.2.2 (применена временная мера) сценарий true - false false @@ -2222,6 +2220,13 @@ false + + +d7d54cfb-26b5-4dba-b56f-b6247183c24d +bdffd190-e62e-446b-aaa2-fb3f5e170af6 +Горизонтальный контейнер +true +true d7d54cfb-26b5-4dba-b56f-b6247183c24d @@ -2544,6 +2549,13 @@ false + + +d7d54cfb-26b5-4dba-b56f-b6247183c24d +ab01ad21-ea41-413e-a1b1-bbd54ed8d959 +Горизонтальный контейнер +true +true d7d54cfb-26b5-4dba-b56f-b6247183c24d @@ -2840,6 +2852,149 @@ + + + 98594cec-0a9b-4cef-af09-e1b71cb2ad9e + 3bdd9af7-850c-40f8-8b79-4c1530dd8e8f + Обработка событий + false + false + + + + eventRefs + + + + + + behavior + + {"objectId":"0b5b5863-6ab7-4b68-9f52-5369ac5cab9f","packageName":"component","className":"Text","type":"TS"} + + + + propertyName + + "valueChangeEvent" + + + + + + + + + ifCondition + + + + conditions + + + + + + _isGroupSelected + + false + + + + one + + + + conditionFirstPart + + + + objectValue + + + + behavior + + {"objectId":"0b5b5863-6ab7-4b68-9f52-5369ac5cab9f","packageName":"component","className":"Text","type":"TS"} + + + + method + + "getValue" + + + + + + + + + + operation + +"IS_EMPTY" + + + + + + + + + + + + logicalOperation + +null + + + + + + + thenActions + + + + + + behavior + + {"objectId":"0b5b5863-6ab7-4b68-9f52-5369ac5cab9f","packageName":"component","className":"Text","type":"TS"} + + + + method + + "setVisible" + + + + value + + + + staticValue + + + boolean + + + false + + + + + + + + + + + + @@ -4039,7 +4194,6 @@ 304824d5-9f9f-4af9-9b08-6232f7536774 FS - 1.1.3 (Воинский учёт) true - false false @@ -4172,7 +4326,6 @@ 35a5afea-7a37-42fb-8cbe-55c1e4d6f170 Hbox - строка с текстом "Военный комиссариат "город, район, наименование"" true -false false diff --git a/resources/src/main/resources/business-model/LK RP FL/subpoena.page b/resources/src/main/resources/business-model/LK RP FL/subpoena.page index 41ece7c..06f4e0f 100644 --- a/resources/src/main/resources/business-model/LK RP FL/subpoena.page +++ b/resources/src/main/resources/business-model/LK RP FL/subpoena.page @@ -155,7 +155,6 @@ 23a3d23b-eb21-4923-b1e9-0b0f003b5b0f LoadForm true - false false @@ -211,6 +210,7 @@ 2d0083b3-0994-4131-9cfc-de84cab46dab HB - явитесь по повестке в военкомат. Ели не придёте в срок, к Вам применят временные меры true + false false @@ -240,6 +240,7 @@ 805e05e6-5c7f-42e4-8770-a742f50f45b0 VB true + false false @@ -426,7 +427,7 @@ - "font-bold" + "subtitle" @@ -777,7 +778,7 @@ - "font-bold" + "subtitle" @@ -984,7 +985,7 @@ - "font-bold" + "subtitle" @@ -1017,7 +1018,7 @@ - "font-bold" + "subtitle" @@ -1404,7 +1405,7 @@ - "font-bold" + "subtitle" @@ -1606,7 +1607,7 @@ - "font-bold" + "subtitle" @@ -1951,7 +1952,7 @@ - "font-bold" + "subtitle" @@ -2162,6 +2163,7 @@ 713e58f9-9106-4e75-bf08-23761e541e51 VB - правый true + false false @@ -2447,6 +2449,7 @@ c9c74406-f8f4-4a9a-8a62-57fe026f5fa5 FS - (если вы не можете явиться по уважительной причине) true + false false @@ -2645,6 +2648,7 @@ d63ff6bf-f971-4a5e-8b36-e4c5a2e48771 Диалоговые окна (информационные) true + false false @@ -3978,13 +3982,6 @@ false - - ba24d307-0b91-4299-ba82-9d0b52384ff2 - 18b4a2ef-37be-4665-9a7a-32263121805b - Текст(гссылка) - Закон о воинской обязанности и военной службе, ст. 7. - false - true - ba24d307-0b91-4299-ba82-9d0b52384ff2