diff --git a/signal-package.xsd b/signal-package.xsd
new file mode 100644
index 0000000..d8060de
--- /dev/null
+++ b/signal-package.xsd
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/ru/nbch/credit_tracker/config/datasource/IndicDataSourceConfig.java b/src/main/java/ru/nbch/credit_tracker/config/datasource/IndicDataSourceConfig.java
index a19a918..52910ba 100644
--- a/src/main/java/ru/nbch/credit_tracker/config/datasource/IndicDataSourceConfig.java
+++ b/src/main/java/ru/nbch/credit_tracker/config/datasource/IndicDataSourceConfig.java
@@ -51,6 +51,7 @@ public class IndicDataSourceConfig {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(resources);
+ sqlSessionFactoryBean.setTypeHandlersPackage("ru.nbch.credit_tracker.config.datasource.handlers");
return sqlSessionFactoryBean.getObject();
}
}
diff --git a/src/main/java/ru/nbch/credit_tracker/config/datasource/handlers/BigIntegerTypeHandler.java b/src/main/java/ru/nbch/credit_tracker/config/datasource/handlers/BigIntegerTypeHandler.java
new file mode 100644
index 0000000..12d9600
--- /dev/null
+++ b/src/main/java/ru/nbch/credit_tracker/config/datasource/handlers/BigIntegerTypeHandler.java
@@ -0,0 +1,62 @@
+package ru.nbch.credit_tracker.config.datasource.handlers;
+
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedTypes;
+
+import java.math.BigInteger;
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+@MappedTypes(BigInteger.class)
+public class BigIntegerTypeHandler extends BaseTypeHandler {
+
+ @Override
+ public void setNonNullParameter(PreparedStatement ps, int i, BigInteger parameter, JdbcType jdbcType) throws SQLException {
+ ps.setLong(i, parameter.longValue());
+ }
+
+ @Override
+ public BigInteger getNullableResult(ResultSet rs, String columnName) throws SQLException {
+ String value = rs.getString(columnName);
+ if (rs.wasNull()) {
+ return null;
+ } else {
+ try {
+ return BigInteger.valueOf(Long.parseLong(value.trim()));
+ } catch (NumberFormatException e) {
+ return null;
+ }
+ }
+ }
+
+ @Override
+ public BigInteger getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+ String value = rs.getString(columnIndex);
+ if (rs.wasNull()) {
+ return null;
+ } else {
+ try {
+ return BigInteger.valueOf(Long.parseLong(value.trim()));
+ } catch (NumberFormatException e) {
+ return null;
+ }
+ }
+ }
+
+ @Override
+ public BigInteger getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+ String value = cs.getString(columnIndex);
+ if (cs.wasNull()) {
+ return null;
+ } else {
+ try {
+ return BigInteger.valueOf(Long.parseLong(value.trim()));
+ } catch (NumberFormatException e) {
+ return null;
+ }
+ }
+ }
+}
diff --git a/src/main/java/ru/nbch/credit_tracker/config/datasource/handlers/LocalDateTypeHandler.java b/src/main/java/ru/nbch/credit_tracker/config/datasource/handlers/LocalDateTypeHandler.java
new file mode 100644
index 0000000..fc09b2c
--- /dev/null
+++ b/src/main/java/ru/nbch/credit_tracker/config/datasource/handlers/LocalDateTypeHandler.java
@@ -0,0 +1,47 @@
+package ru.nbch.credit_tracker.config.datasource.handlers;
+
+
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedTypes;
+
+import java.sql.*;
+import java.time.LocalDate;
+
+@MappedTypes(LocalDate.class)
+public class LocalDateTypeHandler extends BaseTypeHandler {
+ @Override
+ public void setNonNullParameter(PreparedStatement ps, int i, LocalDate parameter, JdbcType jdbcType) throws SQLException {
+ ps.setDate(i, Date.valueOf(parameter));
+ }
+
+ @Override
+ public LocalDate getNullableResult(ResultSet rs, String columnName) throws SQLException {
+ Date date = rs.getDate(columnName);
+ if(rs.wasNull()) {
+ return null;
+ } else {
+ return date.toLocalDate();
+ }
+ }
+
+ @Override
+ public LocalDate getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+ Date date = rs.getDate(columnIndex);
+ if(rs.wasNull()) {
+ return null;
+ } else {
+ return date.toLocalDate();
+ }
+ }
+
+ @Override
+ public LocalDate getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+ Date date = cs.getDate(columnIndex);
+ if(cs.wasNull()) {
+ return null;
+ } else {
+ return date.toLocalDate();
+ }
+ }
+}
diff --git a/src/main/java/ru/nbch/credit_tracker/config/settings/XsdValidation.java b/src/main/java/ru/nbch/credit_tracker/config/settings/XsdValidation.java
index 5749fa6..b1bb211 100644
--- a/src/main/java/ru/nbch/credit_tracker/config/settings/XsdValidation.java
+++ b/src/main/java/ru/nbch/credit_tracker/config/settings/XsdValidation.java
@@ -1,5 +1,6 @@
package ru.nbch.credit_tracker.config.settings;
public record XsdValidation (
- String monitoringRequestPath
+ String monitoringRequestPath,
+ String signalPackagePath
) {}
diff --git a/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Auth.java b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Auth.java
new file mode 100644
index 0000000..bbf5d3c
--- /dev/null
+++ b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Auth.java
@@ -0,0 +1,21 @@
+package ru.nbch.credit_tracker.entities.signal_package;
+
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlType;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "", propOrder = {
+ "user"
+})
+public class Auth {
+
+ @XmlElement(name = "User", required = true)
+ protected String user;
+
+}
diff --git a/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Conditions.java b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Conditions.java
new file mode 100644
index 0000000..0d2fd45
--- /dev/null
+++ b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Conditions.java
@@ -0,0 +1,25 @@
+package ru.nbch.credit_tracker.entities.signal_package;
+
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlType;
+import lombok.Setter;
+
+@Setter
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "", propOrder = {
+ "persons"
+})
+public class Conditions {
+
+ @XmlElement(name = "Persons", required = true)
+ protected Persons persons;
+
+ public Persons getPersons() {
+ if (persons == null) {
+ persons = new Persons();
+ }
+ return persons;
+ }
+}
diff --git a/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Person.java b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Person.java
new file mode 100644
index 0000000..a07ca93
--- /dev/null
+++ b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Person.java
@@ -0,0 +1,75 @@
+package ru.nbch.credit_tracker.entities.signal_package;
+
+import jakarta.xml.bind.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "", propOrder = {
+ "value"
+})
+public class Person {
+
+ @XmlValue
+ protected String value;
+ @XmlAttribute(name = "uid", required = true)
+ protected String uid;
+ @XmlAttribute(name = "s", required = true)
+ protected String s;
+ @XmlAttribute(name = "n", required = true)
+ protected String n;
+ @XmlAttribute(name = "m")
+ protected String m;
+ @XmlAttribute(name = "d", required = true)
+ @XmlSchemaType(name = "date")
+ protected String d;
+ @XmlAttribute(name = "pn", required = true)
+ protected String pn;
+ @XmlAttribute(name = "pd", required = true)
+ @XmlSchemaType(name = "date")
+ protected String pd;
+ @XmlAttribute(name = "dt", required = true)
+ protected String dt;
+ @XmlAttribute(name = "ip", required = true)
+ protected String ip;
+ @XmlAttribute(name = "consentDate")
+ @XmlSchemaType(name = "date")
+ protected String consentDate;
+ @XmlAttribute(name = "consentPurpose")
+ protected String consentPurpose;
+ @XmlAttribute(name = "reportUser")
+ protected String reportUser;
+ @XmlAttribute(name = "liability")
+ protected String liability;
+ @XmlAttribute(name = "consentPeriod")
+ protected String consentPeriod;
+ @XmlAttribute(name = "agrDate")
+ protected String agrDate;
+ @XmlAttribute(name = "reportUserRegNum")
+ protected String reportUserRegNum;
+ @XmlAttribute(name = "reportUserTaxID")
+ protected String reportUserTaxID;
+ @XmlAttribute(name = "consentHash")
+ protected String consentHash;
+ @XmlAttribute(name = "cS")
+ protected String cs;
+ @XmlAttribute(name = "consentN")
+ protected String consentN;
+ @XmlAttribute(name = "consentM")
+ protected String consentM;
+ @XmlAttribute(name = "consentBd")
+ @XmlSchemaType(name = "date")
+ protected String consentBd;
+ @XmlAttribute(name = "consentPn")
+ protected String consentPn;
+ @XmlAttribute(name = "consentPd")
+ @XmlSchemaType(name = "date")
+ protected String consentPd;
+ @XmlAttribute(name = "consentDt")
+ protected String consentDt;
+ @XmlAttribute(name = "inqPurpose")
+ protected String inqPurpose;
+
+}
diff --git a/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Persons.java b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Persons.java
new file mode 100644
index 0000000..91893a4
--- /dev/null
+++ b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Persons.java
@@ -0,0 +1,28 @@
+package ru.nbch.credit_tracker.entities.signal_package;
+
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+import jakarta.xml.bind.annotation.XmlType;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "", propOrder = {
+ "person"
+})
+public class Persons {
+
+ @XmlElement(name = "p", required = true)
+ protected List person;
+
+ public List getPerson() {
+ if (person == null) {
+ person = new ArrayList<>();
+ }
+ return this.person;
+ }
+
+
+}
diff --git a/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Signals.java b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Signals.java
new file mode 100644
index 0000000..207721a
--- /dev/null
+++ b/src/main/java/ru/nbch/credit_tracker/entities/signal_package/Signals.java
@@ -0,0 +1,35 @@
+
+package ru.nbch.credit_tracker.entities.signal_package;
+
+import jakarta.xml.bind.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+
+
+@Setter
+@Getter
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "", propOrder = {
+ "id",
+ "auth",
+ "conditions"
+})
+@XmlRootElement(name = "Signals")
+public class Signals {
+
+ @XmlElement(name = "Id", required = true)
+ protected String id;
+ @XmlElement(name = "Auth", required = true)
+ protected Auth auth;
+ @XmlElement(name = "Conditions", required = true)
+ protected Conditions conditions;
+ @XmlAttribute(name = "online", required = true)
+ protected String online;
+
+ public Conditions getConditions() {
+ if (conditions == null) {
+ conditions = new Conditions();
+ }
+ return conditions;
+ }
+}
diff --git a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java
index e79bbd3..c4f4fb2 100644
--- a/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java
+++ b/src/main/java/ru/nbch/credit_tracker/facade/SignalFacade.java
@@ -8,13 +8,16 @@ import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
import ru.nbch.credit_tracker.entities.monitoring_request.MonitoringRequest;
+import ru.nbch.credit_tracker.entities.signal_package.Signals;
import ru.nbch.credit_tracker.enums.SignalError;
import ru.nbch.credit_tracker.service.FailureAnswerGenerator;
import ru.nbch.credit_tracker.service.SignalService;
+import ru.nbch.credit_tracker.service.indic.PhoneService;
import ru.nbch.credit_tracker.service.scoring.AuthorizationService;
import ru.nbch.credit_tracker.service.xml.IXmlProcessor;
import ru.nbch.credit_tracker.service.xml.XmlUtilService;
+import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
@@ -124,7 +127,12 @@ public class SignalFacade {
return getBadResponse(SignalError.ERROR_007);
}
- signalService.registerPackage(monitoringRequest);
+ List phoneFidsData = signalService.registerPackage(monitoringRequest);
+ if(!phoneFidsData.isEmpty()) {
+ Signals signals = signalService.setupMonitoring(monitoringRequest, phoneFidsData);
+ // TODO validate?
+ // TODO marshall to xml and send to nbki signal service
+ }
} catch (Exception e) {
log.error(e.getMessage(), e);
diff --git a/src/main/java/ru/nbch/credit_tracker/mapper/indic/PersonMapper.java b/src/main/java/ru/nbch/credit_tracker/mapper/indic/PersonMapper.java
new file mode 100644
index 0000000..07b1d1b
--- /dev/null
+++ b/src/main/java/ru/nbch/credit_tracker/mapper/indic/PersonMapper.java
@@ -0,0 +1,15 @@
+package ru.nbch.credit_tracker.mapper.indic;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import ru.nbch.credit_tracker.service.indic.PersonService;
+
+import java.util.List;
+
+@Mapper
+public interface PersonMapper {
+
+ PersonService.NameData findNameData(@Param("fid") Integer fid);
+
+ List findPassportData(@Param("fid") Integer fid);
+}
diff --git a/src/main/java/ru/nbch/credit_tracker/service/SignalService.java b/src/main/java/ru/nbch/credit_tracker/service/SignalService.java
index a1f955a..a5a8f92 100644
--- a/src/main/java/ru/nbch/credit_tracker/service/SignalService.java
+++ b/src/main/java/ru/nbch/credit_tracker/service/SignalService.java
@@ -1,28 +1,42 @@
package ru.nbch.credit_tracker.service;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import ru.nbch.credit_tracker.entities.monitoring_request.MonitoringRequest;
+import ru.nbch.credit_tracker.entities.signal_package.Auth;
+import ru.nbch.credit_tracker.entities.signal_package.Person;
+import ru.nbch.credit_tracker.entities.signal_package.Signals;
import ru.nbch.credit_tracker.enums.Status;
import ru.nbch.credit_tracker.mapper.signal.SignalMapper;
import ru.nbch.credit_tracker.service.indic.FlagsService;
+import ru.nbch.credit_tracker.service.indic.PersonService;
import ru.nbch.credit_tracker.service.indic.PhoneService;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Date;
import java.util.List;
@Service
public class SignalService {
+ private final static DateFormat DATE_FORMAT = new SimpleDateFormat("dd.MM.yyyy");
+
private final SignalMapper mapper;
private final PhoneService phoneService;
private final FlagsService flagsService;
+ private final PersonService personService;
public SignalService(SignalMapper mapper,
PhoneService phoneService,
- FlagsService flagsService) {
+ FlagsService flagsService, PersonService personService) {
this.mapper = mapper;
this.phoneService = phoneService;
this.flagsService = flagsService;
+ this.personService = personService;
}
public boolean isPackageNotUnique(MonitoringRequest request) {
@@ -30,7 +44,7 @@ public class SignalService {
return mapper.isPackageNotUnique(userId.substring(0, 6), request.getPackageName());
}
- public void registerPackage(MonitoringRequest request) {
+ public List registerPackage(MonitoringRequest request) {
Integer packageId = mapper.registerPackage(request, LocalDateTime.now(), Status.PROCESSING.name());
mapper.registerSubjects(request.getSubjects().getSubject(), packageId);
List fidsPhoneDataList = phoneService.findFidsPhoneData(request.getSubjects().getSubject());
@@ -39,10 +53,88 @@ public class SignalService {
mapper.registerSubjectsFidAndDebts(phoneData.getId(), phoneData.getFid(), flagsData.getFlagDebt5000(), flagsData.getFlag90days(), packageId);
});
+ return fidsPhoneDataList;
}
public void rejectPackage(MonitoringRequest request) {
mapper.insertPackage(request, LocalDateTime.now(), Status.REJECTED.name());
}
+ public Signals setupMonitoring(MonitoringRequest request, List fids) {
+ Signals signals = new Signals();
+ signals.setOnline("2"); // Всегда=2 (только онлайн-сигналы)
+ signals.setId(request.getUserId().substring(0, 6) + "_" + request.getPackageName()); // _
+ Auth auth = new Auth();
+ auth.setUser("test_user"); // TODO from properties // Внутренний логин НБКИ
+ signals.setAuth(auth);
+ for (PhoneService.FidsPhoneData fidData : fids) {
+ Person person = findPerson(fidData.getFid(), fidData.getId());
+ if (person != null) {
+ signals.getConditions().getPersons().getPerson().add(person);
+ }
+ }
+
+ return signals;
+ }
+
+ private Person findPerson(Integer fid, String id) {
+ PersonService.PersonData personData = personService.findPersonData(fid);
+ if (personData == null) {
+ return null;
+ }
+ PersonService.NameData nameData = personData.getName();
+ PersonService.PassportData passportData = personData.getPassport();
+ Person person = new Person();
+ person.setS(nameData.getLastName());
+ person.setN(nameData.getFirstName());
+ person.setM(StringUtils.isNotBlank(nameData.getMiddleName()) ? nameData.getMiddleName() : null);
+ person.setD(DATE_FORMAT.format(toDate(nameData.getBirthDate())));
+
+ person.setPn(getPn(passportData.getSerNum(), passportData.getIdNum()));
+ person.setPd(passportData.getIssDate() != null ? DATE_FORMAT.format(toDate(passportData.getIssDate())) : "01.01.2000");
+ person.setDt(StringUtils.isNotBlank(passportData.getIdType2()) ? passportData.getIdType2() : passportData.getIdType());
+ person.setIp("0");
+ person.setUid(id);
+ person.setConsentDate(DATE_FORMAT.format(toDate(LocalDate.now())));
+ person.setConsentPurpose("16");
+ person.setReportUser("АО «НБКИ»");
+ person.setLiability("1");
+ person.setConsentPeriod("3");
+ person.setAgrDate(DATE_FORMAT.format(toDate(LocalDate.now())));
+ person.setReportUserRegNum("1057746710713");
+ person.setReportUserTaxID("7703548386");
+ person.setConsentHash("hash");
+
+ person.setCs(person.getS());
+ person.setConsentN(person.getN());
+ person.setConsentM(person.getM());
+ person.setConsentBd(person.getD());
+ person.setConsentPn(person.getPn());
+ person.setConsentPd(person.getPd());
+ person.setConsentDt(person.getDt());
+ person.setInqPurpose("16");
+ return person;
+ }
+
+ private String getPn(String serNum, String idNum) {
+ String normSerNum = normalize(serNum);
+ String normIdNum = normalize(idNum);
+ return StringUtils.isNotBlank(normSerNum) ? normSerNum + normIdNum : normIdNum;
+ }
+
+ // TODO move to utility service
+ private String normalize(String value) {
+ if (value == null)
+ return null;
+ value = value.replaceAll("[^А-Яа-яA-Za-z0-9]", "");
+ return value.replaceFirst("^0+", "");
+ }
+
+ // TODO move to utility service
+ private Date toDate(LocalDate date) {
+ if (date == null) {
+ return null;
+ }
+ return Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant());
+ }
}
diff --git a/src/main/java/ru/nbch/credit_tracker/service/indic/PersonService.java b/src/main/java/ru/nbch/credit_tracker/service/indic/PersonService.java
new file mode 100644
index 0000000..568efde
--- /dev/null
+++ b/src/main/java/ru/nbch/credit_tracker/service/indic/PersonService.java
@@ -0,0 +1,127 @@
+package ru.nbch.credit_tracker.service.indic;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import ru.nbch.credit_tracker.mapper.indic.PersonMapper;
+
+import java.time.LocalDate;
+import java.util.Comparator;
+import java.util.List;
+
+@Service
+public class PersonService {
+
+ private final PersonMapper mapper;
+
+ public PersonService(PersonMapper mapper) {
+ this.mapper = mapper;
+ }
+
+ public PersonData findPersonData(Integer fid) {
+ NameData person = mapper.findNameData(fid);
+ PassportData passort = findPassportData(fid);
+
+ if (person != null && passort != null && requiredFieldPresent(person, passort)) {
+ return new PersonData(person, passort);
+ } else {
+ return null;
+ }
+ }
+
+ private PassportData findPassportData(Integer fid) {
+ List passports = mapper.findPassportData(fid);
+
+ List documents = passports.stream().filter(this::isDUL).toList(); // берем только ДУЛ
+
+ if (documents.isEmpty()) {
+ return null;
+ }
+
+ // Отдаем приоритет паспортам РФ
+ PassportData passport = documents.stream()
+ .filter(p -> "21".equals(p.getIdType2()) || "21".equals(p.getIdType()))
+ .sorted(
+ Comparator.comparing(
+ PassportData::getIssDate,
+ Comparator.nullsLast(Comparator.reverseOrder())
+ )
+ )
+ .sorted(
+ Comparator.comparing(
+ PassportData::getFileSinceDate,
+ Comparator.nullsLast(Comparator.reverseOrder())
+ )
+ ).findFirst().orElse(null);
+
+ if (passport != null) {
+ return passport;
+ }
+
+ // Если паспорт РФ не найден, смотри остальные ДУЛ'ы и берем первый
+ passport = documents.stream()
+ .sorted(
+ Comparator.comparing(
+ PassportData::getIssDate,
+ Comparator.nullsLast(Comparator.reverseOrder())
+ )
+ )
+ .sorted(
+ Comparator.comparing(
+ PassportData::getFileSinceDate,
+ Comparator.nullsLast(Comparator.reverseOrder())
+ )
+ ).findFirst().orElse(null);
+ return passport;
+ }
+
+ private boolean isDUL(PassportData p) {
+ Integer idType;
+ Double idType2;
+ try {
+ idType = p.getIdType() != null ? Integer.parseInt(p.getIdType()) : null;
+ } catch (NumberFormatException e) {
+ idType = null;
+ }
+ try {
+ idType2 = p.getIdType2() != null ? Double.valueOf(p.getIdType2()) : null;
+ } catch (NumberFormatException e) {
+ idType2 = null;
+ }
+ return (idType != null && idType <= 30) || (idType2 != null && (idType2 >= 1 || idType2 <= 999));
+ }
+
+ private boolean requiredFieldPresent(NameData nameData, PassportData passportData) {
+ boolean isDocTypeNotNull = StringUtils.isNotBlank(passportData.idType) || StringUtils.isNotBlank(passportData.idType2);
+ return !StringUtils.isAllBlank(nameData.firstName, nameData.lastName, passportData.idNum) && nameData.birthDate != null && isDocTypeNotNull;
+ }
+
+ @Getter
+ @AllArgsConstructor
+ public static class PersonData {
+ private NameData name;
+ private PassportData passport;
+ }
+
+ @Getter
+ @Setter
+ public static class NameData {
+ private String firstName;
+ private String lastName;
+ private String middleName;
+ private LocalDate birthDate;
+ }
+
+ @Getter
+ @Setter
+ public static class PassportData {
+ private String serNum;
+ private String idNum;
+ private LocalDate issDate;
+ private String idType;
+ private String idType2;
+ private LocalDate fileSinceDate;
+ }
+}
diff --git a/src/main/java/ru/nbch/credit_tracker/service/xml/XmlUtilService.java b/src/main/java/ru/nbch/credit_tracker/service/xml/XmlUtilService.java
index c80d6cf..ebe4677 100644
--- a/src/main/java/ru/nbch/credit_tracker/service/xml/XmlUtilService.java
+++ b/src/main/java/ru/nbch/credit_tracker/service/xml/XmlUtilService.java
@@ -5,6 +5,7 @@ import org.springframework.stereotype.Service;
import org.xml.sax.SAXException;
import ru.nbch.credit_tracker.entities.monitoring_request.MonitoringRequest;
import ru.nbch.credit_tracker.entities.response.errors.MonitoringError;
+import ru.nbch.credit_tracker.entities.signal_package.Signals;
import javax.xml.XMLConstants;
import javax.xml.stream.XMLInputFactory;
@@ -29,6 +30,7 @@ public class XmlUtilService {
// unmarshalling classes
MonitoringRequest.class,
// marshalling classes
+ Signals.class,
MonitoringError.class);
}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index e1d4918..10b22c5 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -25,4 +25,5 @@ ct.scoring-data-source-settings.password=tester
#spring.servlet.multipart.max-request-size=10MB
# xsd paths
-ct.xsd-validation.monitoring-request-path=monitoring-request.xsd
\ No newline at end of file
+ct.xsd-validation.monitoring-request-path=monitoring-request.xsd
+ct.xsd-validation.signal-package-path=signal-package.xsd
\ No newline at end of file
diff --git a/src/main/resources/mybatis/mapper/indic/PersonMapper.xml b/src/main/resources/mybatis/mapper/indic/PersonMapper.xml
new file mode 100644
index 0000000..243c825
--- /dev/null
+++ b/src/main/resources/mybatis/mapper/indic/PersonMapper.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file