From 9410af7c15e61c047407273cd94561e02c6a9f63 Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 25 May 2023 19:50:43 +0300 Subject: [PATCH] fix CheckSecurityExist stage --- .../logic/listings/CheckSecurityExist.java | 82 ++++++++++++++++++- .../logic/listings/GroupingSecurityParts.java | 4 +- .../listings/ValidateIncomeSecurities.java | 6 +- .../gatewayapi/request/ListingsRequest.java | 6 +- .../request/objects/CouponSchedule.java | 2 +- .../{Listing.java => IncomeListing.java} | 4 +- .../request/objects/IncomeSecurity.java | 29 +------ .../gatewayapi/request/objects/Nominal.java | 26 +++++- .../gatewayapi/request/objects/WithMapId.java | 27 ++++++ 9 files changed, 147 insertions(+), 39 deletions(-) rename clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/{Listing.java => IncomeListing.java} (99%) create mode 100644 clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/WithMapId.java diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/CheckSecurityExist.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/CheckSecurityExist.java index 6202575c3..c8b734d15 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/CheckSecurityExist.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/CheckSecurityExist.java @@ -1,10 +1,16 @@ package ru.spcex.clearing.gatewayapi.logic.listings; +import ru.clearing.classes.statics.data.instrument.issue.CouponPeriod; import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity; +import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeCashFlow; import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity; +import ru.clearing.classes.statics.data.misc.Listing; import ru.spcex.clearing.gatewayapi.logic.ProcessResult; import ru.spcex.clearing.gatewayapi.logic.Stage; +import ru.spcex.clearing.gatewayapi.request.objects.CouponSchedule; +import ru.spcex.clearing.gatewayapi.request.objects.IncomeListing; import ru.spcex.clearing.gatewayapi.request.objects.IncomeSecurity; +import ru.spcex.clearing.gatewayapi.request.objects.Nominal; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.platform.enumeration.InstrumentType; import ru.spcex.platform.imdg.api.Imdg; @@ -17,10 +23,16 @@ import java.util.Map; public class CheckSecurityExist extends Stage { private final Imdg equitySecurityImdg; private final Imdg fixedIncomeSecurityImdg; + private final Imdg listingImdg; + private final Imdg couponPeriodImdg; + private final Imdg fixedIncomeCashFlowImdg; public CheckSecurityExist(ImdgProvider imdgProvider) { equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class); fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class); + listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); + couponPeriodImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CouponPeriod, CouponPeriod.class); + fixedIncomeCashFlowImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeCashFlow, FixedIncomeCashFlow.class); } @Override @@ -34,6 +46,7 @@ public class CheckSecurityExist extends Stage { Map.of("securitySymbol", securitySymbol) ); if (!fixedIncomeSecurity.isEmpty()) { + // todo log for multiply elements incomeSecurity.setAlreadyExist(true); incomeSecurity.setMapId(fixedIncomeSecurity.iterator().next().getId()); } else { @@ -44,6 +57,7 @@ public class CheckSecurityExist extends Stage { Map.of("securitySymbol", securitySymbol) ); if (!equitySecurity.isEmpty()) { + // todo log for multiply elements incomeSecurity.setAlreadyExist(true); incomeSecurity.setMapId(equitySecurity.iterator().next().getId()); } else { @@ -51,8 +65,72 @@ public class CheckSecurityExist extends Stage { } } - if (incomeSecurity.isAlreadyExist()) { - // todo after answer + for (IncomeListing listing : incomeSecurity.getListingList()) { + if (!incomeSecurity.isAlreadyExist()) { + listing.setAlreadyExist(false); + continue; + } + Collection listingFromImdg = listingImdg.getCollectionObjectsByFieldValues( + Map.of( + "securityId", incomeSecurity.getMapId(), + "market", listing.getCode() + ) + ); + if (listingFromImdg.isEmpty()) { + listing.setAlreadyExist(false); + } else { + // todo log for multiply elements + listing.setAlreadyExist(true); + listing.setMapId(listingFromImdg.iterator().next().getId()); + } + } + + for (CouponSchedule couponSchedule : incomeSecurity.getCouponScheduleList()) { + if (!incomeSecurity.isAlreadyExist()) { + couponSchedule.setAlreadyExist(false); + continue; + } + Collection couponPeriodFromImdg = couponPeriodImdg.getCollectionObjectsByFieldValues( + Map.of( + "securityId", incomeSecurity.getMapId(), + "periodStartDate", couponSchedule.getPeriodStartDate(), + "periodEndDate", couponSchedule.getPeriodEndDate() + ) + ); + if (couponPeriodFromImdg.isEmpty()) { + couponSchedule.setAlreadyExist(false); + } else { + // todo log for multiply elements + couponSchedule.setAlreadyExist(true); + couponSchedule.setMapId(couponPeriodFromImdg.iterator().next().getId()); + } + } + + for (Nominal nominal : incomeSecurity.getNominalList()) { + if (incomeSecurity.isAlreadyExist()) { + Collection fixedIncomeCashFlowFromImdg = fixedIncomeCashFlowImdg.getCollectionObjectsByFieldValues( + Map.of( + "securityId", incomeSecurity.getMapId(), + "valueDate", nominal.getDate() + ) + ); + if (fixedIncomeCashFlowFromImdg.isEmpty()) { + nominal.setAlreadyExist(false); + } else { + // todo log for multiply elements + nominal.setAlreadyExist(true); + nominal.setMapId(fixedIncomeCashFlowFromImdg.iterator().next().getId()); + } + } else { + nominal.setAlreadyExist(false); + } + + for (CouponSchedule couponSchedule : incomeSecurity.getCouponScheduleList()) { + if (nominal.getDate().isBefore(couponSchedule.getPeriodStartDate()) || nominal.getDate().isAfter(couponSchedule.getPeriodEndDate())) + continue; + nominal.setAccruedCoupon(couponSchedule.getAccruedCoupon()); + nominal.setCouponNumber(couponSchedule.getCouponNumber()); + } } } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/GroupingSecurityParts.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/GroupingSecurityParts.java index 8ccda7471..e245fbfdb 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/GroupingSecurityParts.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/GroupingSecurityParts.java @@ -38,8 +38,8 @@ public class GroupingSecurityParts extends Stage { // todo сделать после выяснения } - List listingList = param.getListingsRequest().getListingList(); - for (Listing listing : listingList) { + List listingList = param.getListingsRequest().getListingList(); + for (IncomeListing listing : listingList) { UUID listingUUID = listing.getSecurityId(); IncomeSecurity incomeSecurity = securityMap.get(listingUUID); if (incomeSecurity == null) { diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/ValidateIncomeSecurities.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/ValidateIncomeSecurities.java index 3cd3201cc..cf45ee024 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/ValidateIncomeSecurities.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/logic/listings/ValidateIncomeSecurities.java @@ -2,8 +2,8 @@ package ru.spcex.clearing.gatewayapi.logic.listings; import ru.spcex.clearing.gatewayapi.logic.ProcessResult; import ru.spcex.clearing.gatewayapi.logic.Stage; +import ru.spcex.clearing.gatewayapi.request.objects.IncomeListing; import ru.spcex.clearing.gatewayapi.request.objects.IncomeSecurity; -import ru.spcex.clearing.gatewayapi.request.objects.Listing; import ru.spcex.platform.enumeration.BondType; import ru.spcex.platform.enumeration.InstrumentType; import ru.spcex.platform.enumeration.WorkflowStatus; @@ -43,9 +43,9 @@ public class ValidateIncomeSecurities extends Stage { continue; } - List listingList = incomeSecurity.getListingList(); + List listingList = incomeSecurity.getListingList(); - for (Listing listing : listingList) { + for (IncomeListing listing : listingList) { workflowStatusStr = listing.getWorkflowStatus(); workflowStatus = IEnumKey.getEnumByKey(WorkflowStatus.class, workflowStatusStr); if (workflowStatus == null) { diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/ListingsRequest.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/ListingsRequest.java index 09663b32b..8adb693c3 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/ListingsRequest.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/ListingsRequest.java @@ -21,7 +21,7 @@ public class ListingsRequest extends BaseRequest { @JsonProperty("listing") @ApiModelProperty(value = "Список режимов торгов") - private List listingList; + private List listingList; @JsonProperty("nominal") @ApiModelProperty(value = "Список nominal") @@ -67,11 +67,11 @@ public class ListingsRequest extends BaseRequest { this.currencies = currencies; } - public List getListingList() { + public List getListingList() { return listingList; } - public void setListingList(List listingList) { + public void setListingList(List listingList) { this.listingList = listingList; } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/CouponSchedule.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/CouponSchedule.java index a53ca6976..2388f882d 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/CouponSchedule.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/CouponSchedule.java @@ -9,7 +9,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.util.UUID; -public class CouponSchedule { +public class CouponSchedule extends WithMapId { @JsonProperty("security_id") @ApiModelProperty( value = "Ссылка на security", diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/Listing.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IncomeListing.java similarity index 99% rename from clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/Listing.java rename to clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IncomeListing.java index 8965e1d2a..aa3baff9a 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/Listing.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IncomeListing.java @@ -9,7 +9,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.util.UUID; -public class Listing { +public class IncomeListing extends WithMapId { @JsonProperty("security_id") @ApiModelProperty( value = "Ссылка на security", @@ -120,7 +120,6 @@ public class Listing { ) private LocalDate endDate; - public UUID getSecurityId() { return securityId; } @@ -240,4 +239,5 @@ public class Listing { public void setEndDate(LocalDate endDate) { this.endDate = endDate; } + } \ No newline at end of file diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IncomeSecurity.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IncomeSecurity.java index 443230c06..a68740573 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IncomeSecurity.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/IncomeSecurity.java @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; -public class IncomeSecurity { +public class IncomeSecurity extends WithMapId { @JsonProperty("id") @ApiModelProperty( value = "id (uuid)", @@ -174,7 +174,7 @@ public class IncomeSecurity { @JsonIgnore - private List listingList = new ArrayList<>(); + private List listingList = new ArrayList<>(); @JsonIgnore private List couponScheduleList = new ArrayList<>(); @@ -185,12 +185,6 @@ public class IncomeSecurity { @JsonIgnore private List issuerCompanyList = new ArrayList<>(); - @JsonIgnore - private boolean alreadyExist = false; - - @JsonIgnore - private Long mapId; - public UUID getId() { return id; } @@ -335,11 +329,11 @@ public class IncomeSecurity { this.couponFrequency = couponFrequency; } - public List getListingList() { + public List getListingList() { return listingList; } - public void setListingList(List listingList) { + public void setListingList(List listingList) { this.listingList = listingList; } @@ -367,19 +361,4 @@ public class IncomeSecurity { this.issuerCompanyList = issuerCompanyList; } - public boolean isAlreadyExist() { - return alreadyExist; - } - - public void setAlreadyExist(boolean alreadyExist) { - this.alreadyExist = alreadyExist; - } - - public Long getMapId() { - return mapId; - } - - public void setMapId(Long mapId) { - this.mapId = mapId; - } } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/Nominal.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/Nominal.java index 9fb026604..fc921495e 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/Nominal.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/Nominal.java @@ -1,5 +1,6 @@ package ru.spcex.clearing.gatewayapi.request.objects; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import io.swagger.annotations.ApiModelProperty; @@ -9,7 +10,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.util.UUID; -public class Nominal { +public class Nominal extends WithMapId { @JsonProperty("security_id") @ApiModelProperty( value = "Ссылка на security", @@ -42,6 +43,13 @@ public class Nominal { ) private Boolean isDeleted; + @JsonIgnore + private Long couponNumber; + + @JsonIgnore + private BigDecimal accruedCoupon; + + public UUID getSecurityId() { return securityId; } @@ -73,4 +81,20 @@ public class Nominal { public void setDeleted(Boolean deleted) { isDeleted = deleted; } + + public Long getCouponNumber() { + return couponNumber; + } + + public void setCouponNumber(Long couponNumber) { + this.couponNumber = couponNumber; + } + + public BigDecimal getAccruedCoupon() { + return accruedCoupon; + } + + public void setAccruedCoupon(BigDecimal accruedCoupon) { + this.accruedCoupon = accruedCoupon; + } } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/WithMapId.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/WithMapId.java new file mode 100644 index 000000000..ffb33d3fa --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/request/objects/WithMapId.java @@ -0,0 +1,27 @@ +package ru.spcex.clearing.gatewayapi.request.objects; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +public abstract class WithMapId { + @JsonIgnore + protected Long mapId; + + @JsonIgnore + protected boolean alreadyExist = false; + + public Long getMapId() { + return mapId; + } + + public void setMapId(Long mapId) { + this.mapId = mapId; + } + + public boolean isAlreadyExist() { + return alreadyExist; + } + + public void setAlreadyExist(boolean alreadyExist) { + this.alreadyExist = alreadyExist; + } +}