Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
434089c005
21 changed files with 292 additions and 270 deletions
|
|
@ -4,10 +4,22 @@ import io.swagger.annotations.ApiOperation;
|
|||
import io.swagger.annotations.ApiParam;
|
||||
import io.swagger.annotations.ApiResponse;
|
||||
import io.swagger.annotations.ApiResponses;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
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.ResponseBody;
|
||||
import org.springframework.web.server.ResponseStatusException;
|
||||
import ru.clearing.classes.statics.data.account.Account;
|
||||
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
|
||||
import ru.spcex.clearing.backendapi.controller.request.cud.account.AccountNewAction;
|
||||
|
|
@ -20,30 +32,46 @@ import ru.spcex.clearing.backendapi.service.IOperator;
|
|||
import ru.spcex.clearing.backendapi.service.IStateLoader;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import ru.spcex.platform.enumeration.Status;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("/accounting/accounts")
|
||||
public class AccountController extends AbstractQueueController {
|
||||
private final IStateLoader stateLoader;
|
||||
private final ImdgPredicateBuilder predicateBuilder;
|
||||
|
||||
@Autowired
|
||||
public AccountController(IOperator operator, IStateLoader stateLoader) {
|
||||
public AccountController(IOperator operator,
|
||||
IStateLoader stateLoader,
|
||||
ImdgProvider imdgProvider) {
|
||||
super(operator);
|
||||
this.stateLoader = stateLoader;
|
||||
this.predicateBuilder = imdgProvider
|
||||
.getImdg(IMDGDistributedNames.Map_Account, Account.class)
|
||||
.predicateBuilder();
|
||||
}
|
||||
|
||||
@ApiOperation(value = "get all accounts.")
|
||||
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
|
||||
@RequestMapping(method = RequestMethod.GET)
|
||||
@ResponseBody
|
||||
public CommonGetAllResponse getAll() {
|
||||
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Account, Account.class);
|
||||
public CommonGetAllResponse getAll(@RequestParam(name = "kind", required = false) String kind) {
|
||||
CommonGetAllResponse response = new CommonGetAllResponse();
|
||||
response.fromEntity(all);
|
||||
if (StringUtils.isEmpty(kind)) {
|
||||
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Account, Account.class);
|
||||
response.fromEntity(all);
|
||||
} else if (kind.equals("BLKD")) {
|
||||
ImdgPredicate predicate = predicateBuilder.in("status",
|
||||
Arrays.asList(Status.Blocked.getKey(), Status.Close.getKey()).toArray(new String[0]));
|
||||
Collection<Map<String, Object>> allByStatus = stateLoader.getAllMetaTransform(
|
||||
IMDGDistributedNames.Map_Account, Account.class, predicate);
|
||||
response.fromEntity(allByStatus);
|
||||
} else {
|
||||
throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Kind is not supported: " + kind);
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,10 +4,21 @@ import io.swagger.annotations.ApiOperation;
|
|||
import io.swagger.annotations.ApiParam;
|
||||
import io.swagger.annotations.ApiResponse;
|
||||
import io.swagger.annotations.ApiResponses;
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
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.ResponseBody;
|
||||
import org.springframework.web.server.ResponseStatusException;
|
||||
import ru.clearing.classes.statics.data.company.Company;
|
||||
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
|
||||
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
|
||||
|
|
@ -19,21 +30,26 @@ import ru.spcex.clearing.backendapi.service.IOperator;
|
|||
import ru.spcex.clearing.backendapi.service.IStateLoader;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import ru.spcex.platform.enumeration.WorkflowStatus;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("/companies")
|
||||
public class CompanyController extends AbstractQueueController {
|
||||
private final IStateLoader stateLoader;
|
||||
private final ImdgPredicateBuilder predicateBuilder;
|
||||
|
||||
@Autowired
|
||||
public CompanyController(IOperator operator,
|
||||
IStateLoader stateLoader) {
|
||||
IStateLoader stateLoader,
|
||||
ImdgProvider imdgProvider) {
|
||||
super(operator);
|
||||
this.stateLoader = stateLoader;
|
||||
this.predicateBuilder = imdgProvider
|
||||
.getImdg(IMDGDistributedNames.Map_Company, Company.class)
|
||||
.predicateBuilder();
|
||||
}
|
||||
|
||||
@ApiOperation(value = "delete company.")
|
||||
|
|
@ -51,10 +67,19 @@ public class CompanyController extends AbstractQueueController {
|
|||
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
|
||||
@RequestMapping(method = RequestMethod.GET)
|
||||
@ResponseBody
|
||||
public CommonGetAllResponse getAll() {
|
||||
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Company, Company.class);
|
||||
public CommonGetAllResponse getAll(@RequestParam(name = "kind", required = false) String kind) {
|
||||
CommonGetAllResponse response = new CommonGetAllResponse();
|
||||
response.fromEntity(all);
|
||||
if (StringUtils.isEmpty(kind)) {
|
||||
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Company, Company.class);
|
||||
response.fromEntity(all);
|
||||
} else if (kind.equals("BLKD")){
|
||||
ImdgPredicate predicate = predicateBuilder.equals("workflowStatus", WorkflowStatus.Blocked.getKey());
|
||||
Collection<Map<String, Object>> allByStatus = stateLoader.getAllMetaTransform(
|
||||
IMDGDistributedNames.Map_Company, Company.class, predicate);
|
||||
response.fromEntity(allByStatus);
|
||||
} else {
|
||||
throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Kind is not supported: " + kind);
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,10 +4,23 @@ import io.swagger.annotations.ApiOperation;
|
|||
import io.swagger.annotations.ApiParam;
|
||||
import io.swagger.annotations.ApiResponse;
|
||||
import io.swagger.annotations.ApiResponses;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
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.ResponseBody;
|
||||
import org.springframework.web.server.ResponseStatusException;
|
||||
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
|
||||
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
|
||||
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
|
||||
|
|
@ -21,21 +34,26 @@ import ru.spcex.clearing.backendapi.service.IOperator;
|
|||
import ru.spcex.clearing.backendapi.service.IStateLoader;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import ru.spcex.platform.enumeration.Status;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("/trading-clearing-registries")
|
||||
public class TradingClearingRegistryController extends AbstractQueueController {
|
||||
private final IStateLoader stateLoader;
|
||||
private final ImdgPredicateBuilder predicateBuilder;
|
||||
|
||||
@Autowired
|
||||
public TradingClearingRegistryController(IOperator operator, IStateLoader stateLoader) {
|
||||
public TradingClearingRegistryController(IOperator operator,
|
||||
IStateLoader stateLoader,
|
||||
ImdgProvider imdgProvider) {
|
||||
super(operator);
|
||||
this.stateLoader = stateLoader;
|
||||
this.predicateBuilder = imdgProvider
|
||||
.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class)
|
||||
.predicateBuilder();
|
||||
}
|
||||
|
||||
@ApiOperation(value = "create TradingClearingRegistry.")
|
||||
|
|
@ -88,10 +106,21 @@ public class TradingClearingRegistryController extends AbstractQueueController {
|
|||
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
|
||||
@RequestMapping(method = RequestMethod.GET)
|
||||
@ResponseBody
|
||||
public CommonGetAllResponse getAll() {
|
||||
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
|
||||
public CommonGetAllResponse getAll(@RequestParam(name = "kind", required = false) String kind) {
|
||||
CommonGetAllResponse response = new CommonGetAllResponse();
|
||||
response.fromEntity(all);
|
||||
|
||||
if (StringUtils.isEmpty(kind)) {
|
||||
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
|
||||
response.fromEntity(all);
|
||||
} else if (kind.equals("BLKD")) {
|
||||
ImdgPredicate predicate = predicateBuilder.in("status",
|
||||
Arrays.asList(Status.Blocked.getKey(), Status.Close.getKey()).toArray(new String[0]));
|
||||
Collection<Map<String, Object>> allByStatus = stateLoader.getAllMetaTransform(
|
||||
IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class, predicate);
|
||||
response.fromEntity(allByStatus);
|
||||
} else {
|
||||
throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Kind is not supported: " + kind);
|
||||
}
|
||||
return response;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,14 +1,20 @@
|
|||
package ru.spcex.clearing.backendapi.controller.request.cud.securities;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import ru.spcex.clearing.backendapi.domain.actions.IAction;
|
||||
import ru.spcex.clearing.platform.messaging.domain.ActionType;
|
||||
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.SCrossRateNewRequest;
|
||||
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
|
||||
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
|
||||
|
||||
public class SCrossRateNewAction implements IAction<SCrossRateNewRequest> {
|
||||
@JsonProperty
|
||||
@JsonSerialize(using = LocalDateSerializer.class)
|
||||
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||
private LocalDate date;
|
||||
@JsonProperty
|
||||
private String currency;
|
||||
|
|
|
|||
|
|
@ -1,16 +1,22 @@
|
|||
package ru.spcex.clearing.backendapi.controller.request.cud.securities;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import ru.spcex.clearing.backendapi.domain.actions.IAction;
|
||||
import ru.spcex.clearing.platform.messaging.domain.ActionType;
|
||||
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.SCrossRateUpdateRequest;
|
||||
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
|
||||
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
|
||||
|
||||
public class SCrossRateUpdateAction implements IAction<SCrossRateUpdateRequest> {
|
||||
@JsonProperty
|
||||
private Long id;
|
||||
@JsonProperty
|
||||
@JsonSerialize(using = LocalDateSerializer.class)
|
||||
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||
private LocalDate date;
|
||||
@JsonProperty
|
||||
private String currency;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
{
|
||||
"version": "3.23.295.156",
|
||||
"version": "3.23.295.157",
|
||||
|
||||
"enums": {
|
||||
|
||||
|
|
@ -11036,7 +11036,7 @@
|
|||
|
||||
"name": "Добавление параметров риска",
|
||||
|
||||
"confirmation": "value,settlementType,currencyPairId,status",
|
||||
"confirmation": "value,quoteValue,settlementType,currencyPairId,status",
|
||||
|
||||
"class": "ru.spcex.clearing.backendapi.controller.request.cud.securities.RiskParameterNewAction",
|
||||
|
||||
|
|
@ -11067,7 +11067,7 @@
|
|||
|
||||
"name": "Изменение параметров риска",
|
||||
|
||||
"confirmation": "value,status",
|
||||
"confirmation": "value,quoteValue,status",
|
||||
|
||||
"class": "ru.spcex.clearing.backendapi.controller.request.cud.securities.RiskParameterUpdateAction",
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--?xml-stylesheet type="text/xsl" href="\..\corp-reports\src\data\meta\meta.server.xslt"?-->
|
||||
<meta version="3.23.295.156">
|
||||
<meta version="3.23.295.157">
|
||||
<!-- _xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" _xsi:noNamespaceSchemaLocation="file:///E:/d/projects/meta/from/meta.xsd" -->
|
||||
<!--Здесь словари-->
|
||||
<enums>
|
||||
|
|
@ -2557,14 +2557,14 @@
|
|||
<quoteValue name="Ставка сопряженной валюты" shortname="Ставка сопряженной валюты" type="10"/>
|
||||
<workflowStatus name="Статус" shortname="Статус" type="2" length="4" link="workflowStatus"/>
|
||||
<actions>
|
||||
<post name="Добавление параметров риска" confirmation="value,settlementType,currencyPairId,status" class="ru.spcex.clearing.backendapi.controller.request.cud.securities.RiskParameterNewAction">
|
||||
<post name="Добавление параметров риска" confirmation="value,quoteValue,settlementType,currencyPairId,status" class="ru.spcex.clearing.backendapi.controller.request.cud.securities.RiskParameterNewAction">
|
||||
<currencyPairId name="Идентификатор валютной пары" shortname="Валютная пара" type="1" link="currencyPair" linkCode="code" linkKeyCode="id"/>
|
||||
<settlementType name="Код расчёта" shortname="Код расчёта" type="12" link="currencySettlementType" linkCode="code"/>
|
||||
<value name="Ставка" shortname="Ставка" type="10"/>
|
||||
<quoteValue name="Ставка сопряженной валюты" shortname="Ставка сопряженной валюты" type="10"/>
|
||||
<status name="Статус" shortname="Статус" type="2" length="4" link="workflowStatus"/>
|
||||
</post>
|
||||
<put name="Изменение параметров риска" confirmation="value,status" class="ru.spcex.clearing.backendapi.controller.request.cud.securities.RiskParameterUpdateAction">
|
||||
<put name="Изменение параметров риска" confirmation="value,quoteValue,status" class="ru.spcex.clearing.backendapi.controller.request.cud.securities.RiskParameterUpdateAction">
|
||||
<id type="1" name="Идентификатор записи" shortname="ID" link="riskParameter" linkCode="id" required="true"/>
|
||||
<value name="Ставка" shortname="Ставка" type="10"/>
|
||||
<quoteValue name="Ставка сопряженной валюты" shortname="Ставка сопряженной валюты" type="10"/>
|
||||
|
|
|
|||
|
|
@ -358,19 +358,24 @@ public class OrderCurrencyListener extends QueueConsumer implements Initializing
|
|||
continue;
|
||||
}
|
||||
orderCurrency.setStatus(status.getKey());
|
||||
orderCurrency.setUpdated(Instant.now());
|
||||
orderCurrencyImdg.update(orderCurrency);
|
||||
}
|
||||
}
|
||||
private void updateByFix(BaseRequest<OrderCurrencyStatusUpdateRequest> req) {
|
||||
OrderCurrencyStatusUpdateRequest payload = req.getRequestPayload();
|
||||
for (Long orderId : payload.getIds()) {
|
||||
SOrders sOrder = sOrdersImdg.getSingleObjectByID(orderId);
|
||||
SOrders sOrder = sOrdersImdg.getSingleObjectByPredicate(
|
||||
sOrdersImdg.predicateBuilder().equals("orderNum", orderId)
|
||||
);
|
||||
OrderCurrency orderCurrency = orderCurrencyImdg.getSingleObjectByID(orderId);
|
||||
OrderStatus status = resolveStatusByFixState(sOrder.getState());
|
||||
if (status == null) {
|
||||
continue;
|
||||
}
|
||||
orderCurrency.setStatus(status.getKey());
|
||||
orderCurrency.setUpdated(Instant.now());
|
||||
// orderCurrency.setUpdated(sOrder.getTradeDate());//todo
|
||||
orderCurrencyImdg.update(orderCurrency);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ public class TaskListener extends QueueConsumer implements InitializingBean {
|
|||
}
|
||||
|
||||
private void exportToTriAndSendToFix(BaseRequest<LauncherCommandRequest> req) {
|
||||
|
||||
log.info("SDOR export and send command to fix, request={}", req);
|
||||
try {
|
||||
Collection<OrderCurrency> orders = imdgQueryService.getClccOrderCurrencyIds();
|
||||
String content = orderCurrencyTriExportService.exportToTri(orders);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
package ru.spcex.clearing.dflt.management.model;
|
||||
|
||||
import ru.clearing.classes.statics.data.misc.Listing;
|
||||
import ru.clearing.classes.statics.data.misc.Market;
|
||||
import ru.clearing.classes.statics.data.registry.Registry;
|
||||
import ru.clearing.classes.statics.data.security.RiskParameter;
|
||||
|
|
@ -9,7 +8,6 @@ public class SwapContext {
|
|||
private final Registry registry;
|
||||
private final String orderCategory;
|
||||
private final Market market;
|
||||
private final Listing listing;
|
||||
private final RiskParameter riskParameter;
|
||||
private final CounterpartyInfo categoryP;
|
||||
private final CounterpartyInfo clcc;
|
||||
|
|
@ -19,7 +17,6 @@ public class SwapContext {
|
|||
this.registry = builder.registry;
|
||||
this.orderCategory = builder.orderCategory;
|
||||
this.market = builder.market;
|
||||
this.listing = builder.listing;
|
||||
this.riskParameter = builder.riskParameter;
|
||||
this.categoryP = builder.categoryP;
|
||||
this.clcc = builder.clcc;
|
||||
|
|
@ -38,10 +35,6 @@ public class SwapContext {
|
|||
return market;
|
||||
}
|
||||
|
||||
public Listing getListing() {
|
||||
return listing;
|
||||
}
|
||||
|
||||
public RiskParameter getRiskParameter() {
|
||||
return riskParameter;
|
||||
}
|
||||
|
|
@ -66,7 +59,6 @@ public class SwapContext {
|
|||
private Registry registry;
|
||||
private String orderCategory;
|
||||
private Market market;
|
||||
private Listing listing;
|
||||
private RiskParameter riskParameter;
|
||||
private CounterpartyInfo categoryP;
|
||||
private CounterpartyInfo clcc;
|
||||
|
|
@ -87,11 +79,6 @@ public class SwapContext {
|
|||
return this;
|
||||
}
|
||||
|
||||
public Builder listing(Listing listing) {
|
||||
this.listing = listing;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder riskParameter(RiskParameter riskParameter) {
|
||||
this.riskParameter = riskParameter;
|
||||
return this;
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import java.math.BigDecimal;
|
|||
import java.time.LocalDate;
|
||||
import java.util.Collection;
|
||||
import java.util.Optional;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
|
||||
import ru.clearing.classes.statics.data.company.Company;
|
||||
|
|
@ -68,7 +69,8 @@ public class ImdgQueryService {
|
|||
ImdgPredicateBuilder builder = registryImdg.predicateBuilder();
|
||||
ImdgPredicate registryPredicate = builder.and(
|
||||
builder.regex("registryCode", "^PM.*T"),
|
||||
builder.not(builder.equals("registryStatus", RegistryStatus.OK.getKey()))
|
||||
builder.not(builder.equals("registryStatus", RegistryStatus.OK.getKey())),
|
||||
builder.equals("clearingDate", LocalDate.now())
|
||||
);
|
||||
|
||||
return registryImdg.getCollectionIdsByPredicate(registryPredicate);
|
||||
|
|
@ -159,8 +161,14 @@ public class ImdgQueryService {
|
|||
|
||||
public Listing findListing(Registry registry, String marketCode) {
|
||||
return "RUB".equals(registry.getSecuritySymbol())
|
||||
? findListingForRub(registry, marketCode)
|
||||
: findListingForOtherCurrency(registry, marketCode);
|
||||
? findListingForRub(registry, marketCode, null)
|
||||
: findListingForOtherCurrency(registry, marketCode, null);
|
||||
}
|
||||
|
||||
public Listing findListing(Registry registry, String marketCode, String settleCode) {
|
||||
return "RUB".equals(registry.getSecuritySymbol())
|
||||
? findListingForRub(registry, marketCode, settleCode)
|
||||
: findListingForOtherCurrency(registry, marketCode, settleCode);
|
||||
}
|
||||
|
||||
public RiskParameter findRiskParameter(Registry registry) {
|
||||
|
|
@ -192,7 +200,8 @@ public class ImdgQueryService {
|
|||
|
||||
public BigDecimal defineTransferRate(Long currencyPairDictionaryId, String securitySymbol) {
|
||||
ImdgPredicateBuilder pb = riskParameterImdg.predicateBuilder();
|
||||
String baseCurrency = "RUB".equals(securitySymbol) ? "CNY" : securitySymbol;
|
||||
boolean isRub = "RUB".equals(securitySymbol);
|
||||
String baseCurrency = isRub ? "CNY" : securitySymbol;
|
||||
|
||||
RiskParameter riskParameter = riskParameterImdg.getSingleObjectByPredicate(
|
||||
pb.and(
|
||||
|
|
@ -200,7 +209,7 @@ public class ImdgQueryService {
|
|||
pb.equals("currencyPairId", currencyPairDictionaryId)
|
||||
)
|
||||
);
|
||||
return riskParameter.getQuoteValue();
|
||||
return isRub ? riskParameter.getValue() : riskParameter.getQuoteValue();
|
||||
}
|
||||
|
||||
public CurrencyPairDictionary getCurrencyPairDictionaryBySecurityId(Long securityId) {
|
||||
|
|
@ -208,9 +217,8 @@ public class ImdgQueryService {
|
|||
return currencyPairDictionaryImdg.getSingleObjectByID(security.getCurrencyPairId());
|
||||
}
|
||||
|
||||
private Listing findListingForRub(Registry registry, String marketCode) {
|
||||
private Listing findListingForRub(Registry registry, String marketCode, String settleCode) {
|
||||
ImdgPredicateBuilder pb = currencyPairDictionaryImdg.predicateBuilder();
|
||||
|
||||
CurrencyPairDictionary pair = currencyPairDictionaryImdg.getFirstObjectByPredicate(
|
||||
pb.and(
|
||||
pb.equals("baseCurrency", "CNY"),
|
||||
|
|
@ -218,8 +226,13 @@ public class ImdgQueryService {
|
|||
)
|
||||
);
|
||||
|
||||
ImdgPredicate settlementTypeCondition =
|
||||
StringUtils.isNotEmpty(settleCode) ? pb.equals("settlementType", settleCode) : pb.alwaysTrue();
|
||||
Collection<Long> securityIds = currencyPairSecurityImdg.getCollectionIdsByPredicate(
|
||||
pb.equals("currencyPairId", pair.getId())
|
||||
pb.and(
|
||||
pb.equals("currencyPairId", pair.getId()),
|
||||
settlementTypeCondition
|
||||
)
|
||||
);
|
||||
|
||||
return listingImdg.getSingleObjectByPredicate(
|
||||
|
|
@ -230,7 +243,7 @@ public class ImdgQueryService {
|
|||
);
|
||||
}
|
||||
|
||||
private Listing findListingForOtherCurrency(Registry registry, String marketCode) {
|
||||
private Listing findListingForOtherCurrency(Registry registry, String marketCode, String settleCode) {
|
||||
ImdgPredicateBuilder pb = currencyPairDictionaryImdg.predicateBuilder();
|
||||
|
||||
CurrencyPairDictionary pair = currencyPairDictionaryImdg.getFirstObjectByPredicate(
|
||||
|
|
@ -240,8 +253,13 @@ public class ImdgQueryService {
|
|||
)
|
||||
);
|
||||
|
||||
ImdgPredicate settlementTypeCondition =
|
||||
StringUtils.isNotEmpty(settleCode) ? pb.equals("settlementType", settleCode) : pb.alwaysTrue();
|
||||
Collection<Long> securityIds = currencyPairSecurityImdg.getCollectionIdsByPredicate(
|
||||
pb.equals("currencyPairId", pair.getId())
|
||||
pb.and(
|
||||
pb.equals("currencyPairId", pair.getId()),
|
||||
settlementTypeCondition
|
||||
)
|
||||
);
|
||||
|
||||
return listingImdg.getSingleObjectByPredicate(
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ public class OrderCalculationService {
|
|||
public void calcAndEnrichSwap(OrderCurrency order,
|
||||
SwapContext context) {
|
||||
Registry registry = context.getRegistry();
|
||||
Listing listing = context.getListing();
|
||||
Listing listing = imdgQueryService.findListing(registry, context.getMarket().getCode(), order.getSettleCode());
|
||||
|
||||
CurrencyPairDictionary pair = imdgQueryService.getCurrencyPairDictionaryBySecurityId(listing.getSecurityId());
|
||||
BigDecimal s = imdgQueryService.defineTransferRate(pair.getId(), registry.getSecuritySymbol());
|
||||
|
|
@ -51,7 +51,7 @@ public class OrderCalculationService {
|
|||
public void calcAndEnrichSpot(OrderCurrency order,
|
||||
SwapContext context) {
|
||||
Registry registry = context.getRegistry();
|
||||
Listing listing = context.getListing();
|
||||
Listing listing = imdgQueryService.findListing(registry, context.getMarket().getCode(), order.getSettleCode());
|
||||
|
||||
CurrencyPairDictionary pair = imdgQueryService.getCurrencyPairDictionaryBySecurityId(listing.getSecurityId());
|
||||
BigDecimal s = imdgQueryService.defineTransferRate(pair.getId(), registry.getSecuritySymbol());
|
||||
|
|
@ -75,6 +75,7 @@ public class OrderCalculationService {
|
|||
|
||||
order.setPrice(price);
|
||||
order.setQuantityLot(quantityLot);
|
||||
order.setRate(s);
|
||||
}
|
||||
|
||||
private CalculationResult calculationSums(Registry registry, Integer lotSize, BigDecimal s, BigDecimal n) {
|
||||
|
|
@ -88,7 +89,7 @@ public class OrderCalculationService {
|
|||
BigDecimal rateValue = rates.getValue();
|
||||
|
||||
BigDecimal sum2 = planPositionRub.divide(rateValue, lotSize, RoundingMode.HALF_DOWN);
|
||||
BigDecimal sum3 = sum1.setScale(0, RoundingMode.CEILING).min(sum2);
|
||||
BigDecimal sum3 = sum1.setScale(lotSize, RoundingMode.CEILING);
|
||||
BigDecimal sum4 = sum3.multiply(rateValue, MC).negate();
|
||||
BigDecimal sum5 = sum3.negate();
|
||||
|
||||
|
|
@ -113,7 +114,7 @@ public class OrderCalculationService {
|
|||
BigDecimal planPositionCny = cnyRegistry.getBalance();
|
||||
|
||||
BigDecimal sum2 = planPositionCny.divide(rateValue, lotSize, RoundingMode.HALF_DOWN);
|
||||
BigDecimal sum3 = sum1.setScale(0, RoundingMode.CEILING).min(sum2).negate();
|
||||
BigDecimal sum3 = sum1.setScale(lotSize, RoundingMode.CEILING).min(sum2).negate();
|
||||
BigDecimal sum4 = sum3.multiply(rateValue, MC).negate();
|
||||
BigDecimal sum5 = sum3.negate();
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package ru.spcex.clearing.dflt.management.service;
|
||||
|
||||
import java.time.Instant;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.clearing.classes.statics.data.misc.Listing;
|
||||
import ru.clearing.classes.statics.data.misc.Market;
|
||||
|
|
@ -14,6 +15,11 @@ import ru.spcex.platform.enumeration.Side;
|
|||
|
||||
@Service
|
||||
public class OrderTemplateBuilder {
|
||||
private final ImdgQueryService imdgQueryService;
|
||||
|
||||
public OrderTemplateBuilder(ImdgQueryService imdgQueryService) {
|
||||
this.imdgQueryService = imdgQueryService;
|
||||
}
|
||||
|
||||
public OrderCurrency buildPrimaryTransfer(SwapContext context, SettleCode settleCode) {
|
||||
OrderCurrency orderCurrency;
|
||||
|
|
@ -192,9 +198,9 @@ public class OrderTemplateBuilder {
|
|||
String comment,
|
||||
SettleCode settleCode) {
|
||||
Registry registry = context.getRegistry();
|
||||
Listing listing = context.getListing();
|
||||
Market market = context.getMarket();
|
||||
RiskParameter riskParameter = context.getRiskParameter();
|
||||
Listing listing = imdgQueryService.findListing(registry, market.getCode(), settleCode.getKey());
|
||||
|
||||
order.setOvernightType("SWAP");
|
||||
order.setMarket(market.getCode());
|
||||
|
|
@ -202,12 +208,12 @@ public class OrderTemplateBuilder {
|
|||
order.setSecuritySymbol(listing.getSymbolCode());
|
||||
order.setSecurityId(listing.getSecurityId());
|
||||
order.setLotSize(listing.getLotSize());
|
||||
order.setRate(riskParameter.getQuoteValue());
|
||||
order.setSide(side.getKey());
|
||||
order.setSettleCode(settleCode.getKey());
|
||||
order.setStatus("CRET");
|
||||
order.setComment(comment);
|
||||
order.setRegistryId(registry.getId());
|
||||
order.setCreated(Instant.now());
|
||||
}
|
||||
|
||||
private Side resolvePrimaryTransferSide(Registry registry, SettleCode settleCode) {
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ package ru.spcex.clearing.dflt.management.service;
|
|||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.clearing.classes.statics.data.misc.Listing;
|
||||
import ru.clearing.classes.statics.data.misc.Market;
|
||||
import ru.clearing.classes.statics.data.misc.OrderCurrency;
|
||||
import ru.clearing.classes.statics.data.registry.Registry;
|
||||
|
|
@ -12,6 +11,7 @@ import ru.spcex.clearing.dflt.management.model.CounterpartyInfo;
|
|||
import ru.spcex.clearing.dflt.management.model.SwapContext;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.platform.enumeration.CompanyRole;
|
||||
import ru.spcex.platform.enumeration.RegistryStatus;
|
||||
import ru.spcex.platform.enumeration.SettleCode;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
|
|
@ -22,6 +22,7 @@ public class SpotOvernightOrderService {
|
|||
|
||||
private final ImdgQueryService imdgQueryService;
|
||||
private final Imdg<OrderCurrency> orderCurrencyImdg;
|
||||
private final Imdg<Registry> registryImdg;
|
||||
private final OrderTemplateBuilder templateBuilder;
|
||||
private final OrderCalculationService swapCalculationService;
|
||||
|
||||
|
|
@ -31,6 +32,7 @@ public class SpotOvernightOrderService {
|
|||
OrderCalculationService swapCalculationService) {
|
||||
this.imdgQueryService = imdgQueryService;
|
||||
this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class);
|
||||
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||
this.templateBuilder = templateBuilder;
|
||||
this.swapCalculationService = swapCalculationService;
|
||||
}
|
||||
|
|
@ -39,7 +41,6 @@ public class SpotOvernightOrderService {
|
|||
String orderCategory = imdgQueryService.resolveOrderCategory(registry.getCompanyId());
|
||||
|
||||
Market market = imdgQueryService.getSpotMarket();
|
||||
Listing listing = imdgQueryService.findListing(registry, market.getCode());
|
||||
RiskParameter riskParameter = imdgQueryService.findRiskParameter(registry);
|
||||
CounterpartyInfo categoryP = imdgQueryService.getCompanyByClearingCategory("P");
|
||||
CounterpartyInfo clcc = imdgQueryService.getCompanyByRole(CompanyRole.CLCC);
|
||||
|
|
@ -49,7 +50,6 @@ public class SpotOvernightOrderService {
|
|||
.registry(registry)
|
||||
.orderCategory(orderCategory)
|
||||
.market(market)
|
||||
.listing(listing)
|
||||
.riskParameter(riskParameter)
|
||||
.categoryP(categoryP)
|
||||
.clcc(clcc)
|
||||
|
|
@ -86,6 +86,8 @@ public class SpotOvernightOrderService {
|
|||
orderCurrencyImdg.insert(primaryBalancingT1);
|
||||
orderCurrencyImdg.insert(counterBalancingT1);
|
||||
|
||||
registry.setRegistryStatus(RegistryStatus.OK.getKey());
|
||||
registryImdg.update(registry);
|
||||
log.info("Spot orders created for registryId={}", registry.getId());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ package ru.spcex.clearing.dflt.management.service;
|
|||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.clearing.classes.statics.data.misc.Listing;
|
||||
import ru.clearing.classes.statics.data.misc.Market;
|
||||
import ru.clearing.classes.statics.data.misc.OrderCurrency;
|
||||
import ru.clearing.classes.statics.data.registry.Registry;
|
||||
|
|
@ -12,6 +11,7 @@ import ru.spcex.clearing.dflt.management.model.CounterpartyInfo;
|
|||
import ru.spcex.clearing.dflt.management.model.SwapContext;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.platform.enumeration.CompanyRole;
|
||||
import ru.spcex.platform.enumeration.RegistryStatus;
|
||||
import ru.spcex.platform.enumeration.SettleCode;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
|
|
@ -22,6 +22,7 @@ public class SwapOvernightOrderService {
|
|||
|
||||
private final ImdgQueryService imdgQueryService;
|
||||
private final Imdg<OrderCurrency> orderCurrencyImdg;
|
||||
private final Imdg<Registry> registryImdg;
|
||||
private final OrderTemplateBuilder templateBuilder;
|
||||
private final OrderCalculationService swapCalculationService;
|
||||
|
||||
|
|
@ -31,6 +32,7 @@ public class SwapOvernightOrderService {
|
|||
OrderCalculationService swapCalculationService) {
|
||||
this.imdgQueryService = imdgQueryService;
|
||||
this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class);
|
||||
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||
this.templateBuilder = templateBuilder;
|
||||
this.swapCalculationService = swapCalculationService;
|
||||
}
|
||||
|
|
@ -39,7 +41,6 @@ public class SwapOvernightOrderService {
|
|||
String orderCategory = imdgQueryService.resolveOrderCategory(registry.getCompanyId());
|
||||
|
||||
Market market = imdgQueryService.getSwapMarket();
|
||||
Listing listing = imdgQueryService.findListing(registry, market.getCode());
|
||||
RiskParameter riskParameter = imdgQueryService.findRiskParameter(registry);
|
||||
CounterpartyInfo categoryP = imdgQueryService.getCompanyByClearingCategory("P");
|
||||
CounterpartyInfo clcc = imdgQueryService.getCompanyByRole(CompanyRole.CLCC);
|
||||
|
|
@ -49,7 +50,6 @@ public class SwapOvernightOrderService {
|
|||
.registry(registry)
|
||||
.orderCategory(orderCategory)
|
||||
.market(market)
|
||||
.listing(listing)
|
||||
.riskParameter(riskParameter)
|
||||
.categoryP(categoryP)
|
||||
.clcc(clcc)
|
||||
|
|
@ -71,6 +71,8 @@ public class SwapOvernightOrderService {
|
|||
orderCurrencyImdg.insert(primaryBalancing);
|
||||
orderCurrencyImdg.insert(counterBalancing);
|
||||
|
||||
registry.setRegistryStatus(RegistryStatus.OK.getKey());
|
||||
registryImdg.update(registry);
|
||||
log.info("Swap orders created for registryId={}", registry.getId());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,10 +9,14 @@ import org.springframework.stereotype.Service;
|
|||
import quickfix.*;
|
||||
import quickfix.field.*;
|
||||
import quickfix.fix44.ExecutionReport;
|
||||
import quickfix.fix44.MessageCracker;
|
||||
import quickfix.fix44.NewOrderSingle;
|
||||
import ru.clearing.classes.statics.data.misc.OrderCurrency;
|
||||
import ru.clearing.classes.statics.data.misc.SOrders;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
||||
import ru.spcex.clearing.platform.messaging.domain.cud.order.OrderCurrencyStatusUpdateRequest;
|
||||
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
import ru.spcex.platform.imdg.api.ImdgTransaction;
|
||||
|
|
@ -29,13 +33,20 @@ public class Application extends MessageCracker implements quickfix.Application,
|
|||
private final ImdgProvider imdgProvider;
|
||||
|
||||
private final SocketInitiator initiator;
|
||||
private final KafkaSender kafkaSender;
|
||||
|
||||
private SessionID fixSessionID;
|
||||
private SessionID fdcSessionID;
|
||||
|
||||
@Autowired
|
||||
public Application(ImdgProvider imdgProvider, MessageStoreFactory storeFactory, SessionSettings settings, LogFactory logFactory, MessageFactory messageFactory) throws ConfigError {
|
||||
public Application(ImdgProvider imdgProvider,
|
||||
MessageStoreFactory storeFactory,
|
||||
SessionSettings settings,
|
||||
LogFactory logFactory,
|
||||
MessageFactory messageFactory,
|
||||
KafkaSender kafkaSender) throws ConfigError {
|
||||
this.imdgProvider = imdgProvider;
|
||||
this.kafkaSender = kafkaSender;
|
||||
initiator = new SocketInitiator(this, storeFactory, settings, logFactory, messageFactory);
|
||||
}
|
||||
|
||||
|
|
@ -95,9 +106,10 @@ public class Application extends MessageCracker implements quickfix.Application,
|
|||
@Override
|
||||
public void fromApp(Message message, SessionID sessionID) throws FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {
|
||||
log.trace("fromApp {}, [{}]: {}", sessionID, message.getClass(), message);
|
||||
crack(message, sessionID);
|
||||
}
|
||||
|
||||
public void onMessage(ExecutionReport executionReport) {
|
||||
public void onMessage(ExecutionReport executionReport, SessionID sessionID) {
|
||||
ImdgTransaction transaction = imdgProvider.newTransaction();
|
||||
transaction.beginTransaction();
|
||||
try {
|
||||
|
|
@ -139,6 +151,7 @@ public class Application extends MessageCracker implements quickfix.Application,
|
|||
sOrders.setAccount(account.getValue());
|
||||
sOrders.setSettleCode(settlType.getValue());
|
||||
sOrders.setPriceCurrency(currency.getValue());
|
||||
sOrders.setState(String.valueOf(ordStatus.getValue()));
|
||||
|
||||
if (ordStatus.valueEquals(OrdStatus.NEW)) {
|
||||
sOrders.setOrderDateTime(transactTime.getValue().toInstant(ZoneOffset.UTC));
|
||||
|
|
@ -156,6 +169,11 @@ public class Application extends MessageCracker implements quickfix.Application,
|
|||
|
||||
sOrdersImdg.update(sOrders);
|
||||
}
|
||||
|
||||
//send message to df for update orderCurrency status
|
||||
OrderCurrencyStatusUpdateRequest updateRequest = new OrderCurrencyStatusUpdateRequest();
|
||||
updateRequest.addId(orderNum);
|
||||
kafkaSender.sendRequestToQueue(Consts.ORDER_CURRENCY_STATUS_UPDATE_FIX, updateRequest);
|
||||
}
|
||||
}
|
||||
transaction.commitTransaction();
|
||||
|
|
|
|||
|
|
@ -1,197 +0,0 @@
|
|||
package ru.spcex.clearing.fix.service;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.kafka.clients.consumer.Consumer;
|
||||
import org.apache.kafka.clients.producer.Producer;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.clearing.classes.statics.data.company.Company;
|
||||
import ru.clearing.classes.statics.data.company.CompanySymbols;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.platform.messaging.domain.ActionType;
|
||||
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
|
||||
import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanyNewRequest;
|
||||
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
|
||||
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
|
||||
import ru.spcex.clearing.util.security.UserRoleVerification;
|
||||
import ru.spcex.clearing.util.services.RequestHelper;
|
||||
import ru.spcex.platform.enumeration.CompanySymbol;
|
||||
import ru.spcex.platform.enumeration.UserRole;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.ImdgId;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
import ru.spcex.platform.imdg.api.ImdgTransaction;
|
||||
import ru.spcex.platform.utils.error.ValidationException;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.Objects;
|
||||
|
||||
@Service
|
||||
public class FixService extends QueueConsumer implements InitializingBean {
|
||||
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
private final RequestHelper requestHelper;
|
||||
private final ImdgProvider imdgProvider;
|
||||
private final ImdgId idSequence;
|
||||
private final Imdg<Company> companyIMap;
|
||||
protected UserRoleVerification userRoleVerification;
|
||||
// protected CompanySymbolService companySymbolService;
|
||||
// protected AccountNotificationHelper accountNotification;
|
||||
// protected RelationService relationService;
|
||||
// private final ValidationHelper validationHelper;
|
||||
// private final Function<CompanyNewRequest, IValidator> companyNewRequestValidator;
|
||||
// private final Function<CompanyNewRequest, IValidator> companyUpdateRequestValidator;
|
||||
// private final Function<CommonDeleteRequest, IValidator> companyDeleteRequestValidator;
|
||||
|
||||
@Autowired
|
||||
public FixService(Consumer<String, Object> kafkaQueue, Producer<String, Object> kafkaProducer,
|
||||
ImdgProvider imdgProvider,
|
||||
RequestHelper requestHelper,
|
||||
// ValidationHelper validationHelper,
|
||||
UserRoleVerification userRoleVerification
|
||||
// @Qualifier("companyNewRequestValidator")
|
||||
// Function<CompanyNewRequest, IValidator> companyNewRequestValidator,
|
||||
// @Qualifier("companyUpdateRequestValidator")
|
||||
// Function<CompanyNewRequest, IValidator> companyUpdateRequestValidator,
|
||||
// @Qualifier("CompanyDeleteRequestValidator")
|
||||
// Function<CommonDeleteRequest, IValidator> companyDeleteRequestValidator,
|
||||
// CompanySymbolService companySymbolService,
|
||||
// AccountNotificationHelper accountNotification,
|
||||
/*RelationService relationService*/) {
|
||||
super(kafkaQueue, kafkaProducer);
|
||||
this.imdgProvider = imdgProvider;
|
||||
this.requestHelper = requestHelper.setLogger(log);
|
||||
this.idSequence = imdgProvider.getImdgIdGenerator();
|
||||
this.userRoleVerification = userRoleVerification;
|
||||
this.userRoleVerification.setRoleForVerification(UserRole.Admin);
|
||||
// this.validationHelper = validationHelper;
|
||||
// this.companyNewRequestValidator = companyNewRequestValidator;
|
||||
// this.companyUpdateRequestValidator = companyUpdateRequestValidator;
|
||||
// this.companyDeleteRequestValidator = companyDeleteRequestValidator;
|
||||
// this.companySymbolService = companySymbolService;
|
||||
// this.companySymbolService.setCompanyService(this);
|
||||
// this.accountNotification = accountNotification;
|
||||
// this.relationService = relationService;
|
||||
|
||||
companyIMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
// callback(CommonDeleteRequest.class)
|
||||
// .setFunction(request -> requestHelper.requestFunction(this::deleteCompany, request))
|
||||
// .forDestination(Consts.DESTINATION_COMPANY_DELETE, callbacks::put);
|
||||
// callback(CommonDeleteRequest.class)
|
||||
// .setFunction(request -> requestHelper.requestFunction(this::blockCompanyAfterDocument, request))
|
||||
// .forDestination(Consts.DESTINATION_COMPANY_BLOCK, callbacks::put);
|
||||
// callback(CompanyNewRequest.class)
|
||||
// .setFunction(request -> requestHelper.requestFunction(this::processBaseRequest, request))
|
||||
// .forDestination(Consts.DESTINATION_COMPANY_NEW, callbacks::put);
|
||||
// callback(CompanyNewRequest.class)
|
||||
// .setFunction(request -> requestHelper.requestFunction(this::processBaseRequest, request))
|
||||
// .forDestination(Consts.DESTINATION_COMPANY_UPDATE, callbacks::put);
|
||||
// callback(AccountTerminationRequest.class)
|
||||
// .setFunction(request -> requestHelper.requestFunction(this::finishCompanyTermination, request))
|
||||
// .forDestination(Consts.ACCOUNT_TERMINATION_STEP2, callbacks::put);
|
||||
init();
|
||||
}
|
||||
|
||||
private RequestInfoUpdate processBaseRequest(BaseRequest<?> request) throws ValidationException {
|
||||
// Валидация
|
||||
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(request);
|
||||
if (requestInfoUpdate != null) return requestInfoUpdate;
|
||||
ActionType actionType = request.getActionType();
|
||||
switch (actionType) {
|
||||
case NEW -> {
|
||||
CompanyNewRequest companyNewRequest = (CompanyNewRequest) request.getRequestPayload();
|
||||
// IValidator validator = companyNewRequestValidator.apply(companyNewRequest);
|
||||
// Optional<EnumMessage> error = validator.tillFirstError();
|
||||
// if (error.isPresent()) {
|
||||
// throw new ValidationException(error.get());
|
||||
// }
|
||||
// create(companyNewRequest);
|
||||
}
|
||||
case UPDATE -> update((CompanyNewRequest) request.getRequestPayload(), true);
|
||||
}
|
||||
return requestInfoUpdate;
|
||||
}
|
||||
|
||||
public synchronized void update(CompanyNewRequest updateRequest, boolean validationIsEnable) throws ValidationException {
|
||||
// if (validationIsEnable) {
|
||||
// IValidator validator = companyUpdateRequestValidator.apply(updateRequest);
|
||||
// Optional<EnumMessage> error = validator.tillFirstError();
|
||||
// if (error.isPresent()) {
|
||||
// throw new ValidationException(error.get());
|
||||
// }
|
||||
// }
|
||||
ImdgTransaction transaction = imdgProvider.newTransaction();
|
||||
transaction.beginTransaction();
|
||||
boolean txOk = false;
|
||||
try {
|
||||
Imdg<Company> companyMap = transaction.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||
Company company = companyMap.getSingleObjectByID(updateRequest.getId());
|
||||
// if (company == null) {
|
||||
// log.trace("Company {} not found", updateRequest.getId());
|
||||
// throw new ValidationException(new EnumMessage(FixErrors.CompanyNotFound));
|
||||
// }
|
||||
// if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) {
|
||||
// log.trace("Company {} not active: {}", company.getId(), company.getWorkflowStatus());
|
||||
// return requestHelper.makeErrorResponse(companyUpdateRequestBaseRequest, CompanyErrors.CompanyDisabled, updateRequest.getId());
|
||||
// }
|
||||
|
||||
company.setUpdated(Instant.now());
|
||||
if (StringUtils.isNotEmpty(updateRequest.getShortName()))
|
||||
company.setShortName(updateRequest.getShortName());
|
||||
if (StringUtils.isNotEmpty(updateRequest.getFullName()))
|
||||
company.setFullName(updateRequest.getFullName());
|
||||
|
||||
if (updateRequest.getCompanySymbol() != null || updateRequest.getCompanySymbolValue() != null) {
|
||||
log.trace("Request field CompanySymbol, CompanySymbolValue ignore for update company request.");
|
||||
}
|
||||
|
||||
String prevStatus = company.getWorkflowStatus();
|
||||
if (updateRequest.getWorkflowStatus() != null) {
|
||||
company.setWorkflowStatus(updateRequest.getWorkflowStatus());
|
||||
if (!Objects.equals(prevStatus, company.getWorkflowStatus())) {
|
||||
// relationService.onChangeWorkflowStatus(transaction, company, prevStatus, company.getWorkflowStatus());
|
||||
} else {
|
||||
log.trace("Status was not changed");
|
||||
}
|
||||
} else {
|
||||
log.trace("Null new WorkflowStatus");
|
||||
}
|
||||
companyMap.update(company);
|
||||
txOk = true;
|
||||
} finally {
|
||||
if (txOk)
|
||||
transaction.commitTransaction();
|
||||
else
|
||||
transaction.rollbackTransaction();
|
||||
}
|
||||
}
|
||||
|
||||
protected void updateCompanyBySymbol(Company company, CompanySymbols companySymbol, boolean shouldBeDeleted) {
|
||||
assert company.getId().equals(companySymbol.getCompanyId());
|
||||
String companySymbolValue = companySymbol.getCompanySymbolValue();
|
||||
String setUpValue = shouldBeDeletedOrSet(companySymbolValue, shouldBeDeleted);
|
||||
if (CompanySymbol.TRDC.equalsByKey(companySymbol.getCompanySymbol())) {
|
||||
company.setTradingCode(setUpValue);
|
||||
}
|
||||
if (CompanySymbol.CLRC.equalsByKey(companySymbol.getCompanySymbol())) {
|
||||
company.setClearingCode(setUpValue);
|
||||
}
|
||||
if (CompanySymbol.RGRC.equalsByKey(companySymbol.getCompanySymbol())) {
|
||||
company.setRegistrationCode(setUpValue);
|
||||
}
|
||||
if (CompanySymbol.TAXN.equalsByKey(companySymbol.getCompanySymbol())) {
|
||||
company.getProfile().setTaxNumber(setUpValue);
|
||||
}
|
||||
}
|
||||
|
||||
private String shouldBeDeletedOrSet(String companySymbol, boolean shouldBeDeleted) {
|
||||
return shouldBeDeleted ? "" : companySymbol;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
package ru.spcex.clearing.fix.service;
|
||||
|
||||
import java.util.Collection;
|
||||
import org.apache.kafka.clients.consumer.Consumer;
|
||||
import org.apache.kafka.clients.producer.Producer;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.clearing.classes.statics.data.company.CompanyRoleSet;
|
||||
import ru.clearing.classes.statics.data.misc.OrderCurrency;
|
||||
import ru.spcex.clearing.fix.quickfix.Application;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
|
||||
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
||||
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
|
||||
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
|
||||
import ru.spcex.platform.enumeration.CompanyRole;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||
|
||||
@Service
|
||||
public class FixTaskListener extends QueueConsumer implements InitializingBean {
|
||||
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
private final ImdgProvider imdgProvider;
|
||||
private final Application fixApplication;
|
||||
private final Imdg<CompanyRoleSet> companyRoleSetImdg;
|
||||
private final Imdg<OrderCurrency> orderCurrencyImdg;
|
||||
|
||||
@Autowired
|
||||
public FixTaskListener(Consumer<String, Object> kafkaQueue,
|
||||
Producer<String, Object> kafkaProducer,
|
||||
ImdgProvider imdgProvider,
|
||||
Application fixApplication) {
|
||||
super(kafkaQueue, kafkaProducer);
|
||||
this.imdgProvider = imdgProvider;
|
||||
this.fixApplication = fixApplication;
|
||||
this.companyRoleSetImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanyRoleSet, CompanyRoleSet.class);
|
||||
this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
callback(LauncherCommandRequest.class)
|
||||
.setConsumer(this::processSendOrders)
|
||||
.forDestination(Consts.SDOR_FIX_TASK, callbacks::put);
|
||||
init();
|
||||
}
|
||||
|
||||
private void processSendOrders(BaseRequest<LauncherCommandRequest> request) {
|
||||
log.info("SDOR[send order] started, request={}", request);
|
||||
ImdgPredicateBuilder builder = orderCurrencyImdg.predicateBuilder();
|
||||
CompanyRoleSet companyRoleSet = companyRoleSetImdg.getFirstObjectByPredicate(
|
||||
builder.equals("companyRole", CompanyRole.CLCC.getKey())
|
||||
);
|
||||
|
||||
ImdgPredicate clccOrderPredicate = builder.and(
|
||||
builder.equals("status", "CRET"),
|
||||
builder.or(
|
||||
builder.equals("companyId", companyRoleSet.getCompanyId()),
|
||||
builder.equals("counterPartyId", companyRoleSet.getCompanyId())
|
||||
)
|
||||
);
|
||||
Collection<OrderCurrency> orderCurrencies = orderCurrencyImdg.getCollectionObjectsByPredicate(clccOrderPredicate);
|
||||
orderCurrencies.forEach(fixApplication::sendOrder);
|
||||
log.info("SDOR[send order] completed, count orders:{}", orderCurrencies.size());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -5,6 +5,7 @@ import ru.spcex.platform.utils.enumeration.IEnumKey;
|
|||
public enum Status implements IEnumKey {
|
||||
Active("ACTV"),
|
||||
Blocked("BLKD"),
|
||||
Close("CLOS"),
|
||||
Cancel("CNCL");
|
||||
|
||||
private final String key;
|
||||
|
|
|
|||
|
|
@ -1,13 +1,19 @@
|
|||
package ru.spcex.clearing.platform.messaging.domain.cud.securitites;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
|
||||
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
|
||||
|
||||
public class SCrossRateNewRequest {
|
||||
@JsonProperty
|
||||
private String type;
|
||||
@JsonProperty
|
||||
@JsonSerialize(using = LocalDateSerializer.class)
|
||||
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||
private LocalDate date;
|
||||
@JsonProperty
|
||||
private String currency;
|
||||
|
|
|
|||
|
|
@ -1,13 +1,19 @@
|
|||
package ru.spcex.clearing.platform.messaging.domain.cud.securitites;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
|
||||
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
|
||||
|
||||
public class SCrossRateUpdateRequest {
|
||||
@JsonProperty
|
||||
private Long id;
|
||||
@JsonProperty
|
||||
@JsonSerialize(using = LocalDateSerializer.class)
|
||||
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||
private LocalDate date;
|
||||
@JsonProperty
|
||||
private String currency;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue