diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index a6547029..e5cf3aa5 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -1,10 +1,10 @@
-name: Maven Build Artifact
+name: Build Maven Artifact
on:
pull_request:
branches:
- - '*'
+ - '**'
jobs:
build:
- uses: valitydev/java-workflow/.github/workflows/maven-service-build.yml@v1
+ uses: valitydev/base-workflow/.github/workflows/maven-service-build.yml@v2
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 6a394b04..72a7a272 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -1,18 +1,15 @@
-name: Maven Deploy Artifact
+name: Deploy Docker Image
on:
push:
branches:
- 'master'
- 'main'
-
-env:
- REGISTRY: ghcr.io
- IMAGE_NAME: ${{ github.repository }}
+ - 'epic/**'
jobs:
- deploy:
- uses: valitydev/java-workflow/.github/workflows/maven-service-deploy.yml@v1
+ build-and-deploy:
+ uses: valitydev/base-workflow/.github/workflows/maven-service-deploy.yml@v2
secrets:
github-token: ${{ secrets.GITHUB_TOKEN }}
mm-webhook-url: ${{ secrets.MATTERMOST_WEBHOOK_URL }}
diff --git a/pom.xml b/pom.xml
index d3476ebd..ad3bbe4e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
dev.vality
service-parent-pom
- 1.0.16
+ 2.0.0-BETA-11
newway
@@ -25,7 +25,7 @@
postgres
postgres
newway
- nw
+ dw
jdbc:postgresql://localhost:5432/newway
5432
./src/main/resources/checkstyle/checkstyle-suppressions.xml
@@ -65,7 +65,7 @@
de.codecentric
spring-boot-admin-starter-client
- 2.6.6
+ 2.7.1
org.postgresql
@@ -123,6 +123,10 @@
io.micrometer
micrometer-registry-prometheus
+
+ software.amazon.msk
+ aws-msk-iam-auth
+
@@ -155,17 +159,29 @@
dev.vality
damsel
+
+ 1.597-bfedcb9
dev.vality
fistful-proto
- 1.145-c45166d
+ 1.159-936ed9a
dev.vality
xrates-proto
1.23-bf0d62d
+
+ dev.vality
+ limiter-proto
+ 1.33-31de59b
+
+
+ dev.vality
+ exrates-proto
+ 1.3-875328b
+
dev.vality
shared-resources
@@ -188,7 +204,13 @@
dev.vality
testcontainers-annotations
- 1.4.0
+ 1.4.1
+ test
+
+
+ org.awaitility
+ awaitility
+ 4.2.0
test
diff --git a/src/main/java/dev/vality/newway/config/ApplicationConfig.java b/src/main/java/dev/vality/newway/config/ApplicationConfig.java
index 3270b24c..9f308c5b 100644
--- a/src/main/java/dev/vality/newway/config/ApplicationConfig.java
+++ b/src/main/java/dev/vality/newway/config/ApplicationConfig.java
@@ -1,7 +1,7 @@
package dev.vality.newway.config;
import dev.vality.damsel.domain_config.RepositorySrv;
-import dev.vality.newway.domain.Nw;
+import dev.vality.newway.domain.Dw;
import dev.vality.woody.thrift.impl.http.THSpawnClientBuilder;
import org.jooq.Schema;
import org.springframework.beans.factory.annotation.Value;
@@ -25,6 +25,6 @@ public RepositorySrv.Iface dominantClient(@Value("${dmt.url}") Resource resource
@Bean
public Schema schema() {
- return Nw.NW;
+ return Dw.DW;
}
}
diff --git a/src/main/java/dev/vality/newway/config/CacheConfig.java b/src/main/java/dev/vality/newway/config/CacheConfig.java
index 34dce07b..db105f4b 100644
--- a/src/main/java/dev/vality/newway/config/CacheConfig.java
+++ b/src/main/java/dev/vality/newway/config/CacheConfig.java
@@ -2,23 +2,23 @@
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
-import dev.vality.newway.model.InvoiceWrapper;
-import dev.vality.newway.model.InvoicingKey;
-import dev.vality.newway.model.PaymentWrapper;
+import dev.vality.newway.model.PartyShop;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import java.time.Duration;
+
@Configuration
public class CacheConfig {
@Bean
- public Cache invoiceDataCache(@Value("${cache.invoice.size}") int cacheSize) {
- return Caffeine.newBuilder().maximumSize(cacheSize).build();
+ public Cache partyShopDataCache(@Value("${cache.party-shop.size}") int cacheSize,
+ @Value("${cache.party-shop.expire.after.sec}") long expireAfter) {
+ return Caffeine.newBuilder()
+ .maximumSize(cacheSize)
+ .expireAfterWrite(Duration.ofSeconds(expireAfter))
+ .build();
}
- @Bean
- public Cache paymentDataCache(@Value("${cache.payment.size}") int cacheSize) {
- return Caffeine.newBuilder().maximumSize(cacheSize).build();
- }
}
diff --git a/src/main/java/dev/vality/newway/config/KafkaConfig.java b/src/main/java/dev/vality/newway/config/KafkaConfig.java
index 85c8bdca..45717fb1 100644
--- a/src/main/java/dev/vality/newway/config/KafkaConfig.java
+++ b/src/main/java/dev/vality/newway/config/KafkaConfig.java
@@ -1,20 +1,19 @@
package dev.vality.newway.config;
+import dev.vality.exrates.events.CurrencyEvent;
import dev.vality.kafka.common.util.ExponentialBackOffDefaultErrorHandlerFactory;
import dev.vality.machinegun.eventsink.MachineEvent;
import dev.vality.newway.config.properties.KafkaConsumerProperties;
-import dev.vality.newway.config.properties.KafkaSslProperties;
+import dev.vality.newway.serde.CurrencyExchangeRateEventDeserializer;
import dev.vality.newway.serde.PayoutEventDeserializer;
import dev.vality.newway.serde.SinkEventDeserializer;
+import dev.vality.newway.service.FileService;
import dev.vality.payout.manager.Event;
import lombok.RequiredArgsConstructor;
-import org.apache.kafka.clients.CommonClientConfigs;
import org.apache.kafka.clients.consumer.ConsumerConfig;
-import org.apache.kafka.common.config.SslConfigs;
-import org.apache.kafka.common.security.auth.SecurityProtocol;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.boot.autoconfigure.kafka.KafkaProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
@@ -24,64 +23,50 @@
import org.springframework.kafka.listener.ConcurrentMessageListenerContainer;
import org.springframework.kafka.listener.ContainerProperties;
-import java.io.File;
-import java.util.HashMap;
import java.util.Map;
+import java.util.Objects;
@Configuration
@RequiredArgsConstructor
-@EnableConfigurationProperties(KafkaSslProperties.class)
@SuppressWarnings("LineLength")
public class KafkaConfig {
+ private final KafkaProperties kafkaProperties;
private final KafkaConsumerProperties kafkaConsumerProperties;
+ private final FileService fileService;
@Value("${kafka.topics.party-management.consumer.group-id}")
private String partyConsumerGroup;
- @Value("${kafka.client-id}")
- private String clientId;
- @Value("${kafka.bootstrap-servers}")
- private String bootstrapServers;
+
+ @Value("${kafka.topics.exrate.consumer.group-id}")
+ private String exrateConsumerGroup;
+
+ @Value("${kafka.topics.withdrawal-adjustment.consumer.group-id}")
+ private String withdrawalAdjustmentConsumerGroup;
+
+ @Value("${kafka.rack.path:/tmp/.kafka_rack_env}")
+ private String rackPath;
@Bean
- public Map consumerConfigs(KafkaSslProperties kafkaSslProperties) {
- return createConsumerConfig(kafkaSslProperties);
+ public Map consumerConfigs() {
+ return createConsumerConfig();
}
- private Map createConsumerConfig(KafkaSslProperties kafkaSslProperties) {
- Map props = new HashMap<>();
- props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
+ private Map createConsumerConfig() {
+ Map props = kafkaProperties.buildConsumerProperties();
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, SinkEventDeserializer.class);
props.put(ConsumerConfig.GROUP_ID_CONFIG, kafkaConsumerProperties.getGroupId());
- props.put(ConsumerConfig.CLIENT_ID_CONFIG, clientId);
- props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, kafkaConsumerProperties.isEnableAutoCommit());
- props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, kafkaConsumerProperties.getAutoOffsetReset());
- props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, kafkaConsumerProperties.getMaxPollRecords());
- props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, kafkaConsumerProperties.getSessionTimeoutMs());
- props.put(ConsumerConfig.MAX_POLL_INTERVAL_MS_CONFIG, kafkaConsumerProperties.getMaxPollIntervalMs());
- configureSsl(props, kafkaSslProperties);
- return props;
- }
-
- private void configureSsl(Map props, KafkaSslProperties kafkaSslProperties) {
- if (kafkaSslProperties.isEnabled()) {
- props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, SecurityProtocol.SSL.name());
- props.put(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG,
- new File(kafkaSslProperties.getTrustStoreLocation()).getAbsolutePath());
- props.put(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG, kafkaSslProperties.getTrustStorePassword());
- props.put(SslConfigs.SSL_KEYSTORE_TYPE_CONFIG, kafkaSslProperties.getKeyStoreType());
- props.put(SslConfigs.SSL_TRUSTSTORE_TYPE_CONFIG, kafkaSslProperties.getTrustStoreType());
- props.put(SslConfigs.SSL_KEYSTORE_LOCATION_CONFIG,
- new File(kafkaSslProperties.getKeyStoreLocation()).getAbsolutePath());
- props.put(SslConfigs.SSL_KEYSTORE_PASSWORD_CONFIG, kafkaSslProperties.getKeyStorePassword());
- props.put(SslConfigs.SSL_KEY_PASSWORD_CONFIG, kafkaSslProperties.getKeyPassword());
+ String clientRack = fileService.getClientRack(rackPath);
+ if (Objects.nonNull(clientRack)) {
+ props.put(ConsumerConfig.CLIENT_RACK_CONFIG, clientRack);
}
+ return props;
}
@Bean
- public ConsumerFactory consumerFactory(KafkaSslProperties kafkaSslProperties) {
- return new DefaultKafkaConsumerFactory<>(consumerConfigs(kafkaSslProperties));
+ public ConsumerFactory consumerFactory() {
+ return new DefaultKafkaConsumerFactory<>(consumerConfigs());
}
@Bean
@@ -127,10 +112,23 @@ public KafkaListenerContainerFactory> payoutContainerFactory(
- KafkaSslProperties kafkaSslProperties) {
+ public KafkaListenerContainerFactory> withdrawalAdjustmentContainerFactory() {
+ Map props = kafkaProperties.buildConsumerProperties();
+ props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
+ props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, SinkEventDeserializer.class);
+ props.put(ConsumerConfig.GROUP_ID_CONFIG, withdrawalAdjustmentConsumerGroup);
+ String clientRack = fileService.getClientRack(rackPath);
+ if (Objects.nonNull(clientRack)) {
+ props.put(ConsumerConfig.CLIENT_RACK_CONFIG, clientRack);
+ }
+ ConsumerFactory consumerFactory = new DefaultKafkaConsumerFactory<>(props);
+ return createConcurrentFactory(consumerFactory, kafkaConsumerProperties.getWithdrawalAdjustmentConcurrency());
+ }
+
+ @Bean
+ public KafkaListenerContainerFactory> payoutContainerFactory() {
DefaultKafkaConsumerFactory kafkaConsumerFactory =
- new DefaultKafkaConsumerFactory<>(createConsumerConfig(kafkaSslProperties));
+ new DefaultKafkaConsumerFactory<>(createConsumerConfig());
kafkaConsumerFactory.setValueDeserializer(new PayoutEventDeserializer());
ConcurrentKafkaListenerContainerFactory factory =
new ConcurrentKafkaListenerContainerFactory<>();
@@ -157,17 +155,33 @@ public KafkaListenerContainerFactory> partyManagementContainerFactory(
- KafkaSslProperties kafkaSslProperties) {
- Map configs = createConsumerConfig(kafkaSslProperties);
+ public KafkaListenerContainerFactory> partyManagementContainerFactory() {
+ Map configs = createConsumerConfig();
configs.put(ConsumerConfig.GROUP_ID_CONFIG, partyConsumerGroup);
ConsumerFactory consumerFactory = new DefaultKafkaConsumerFactory<>(configs);
return createConcurrentFactory(consumerFactory, kafkaConsumerProperties.getPartyManagementConcurrency());
}
- private KafkaListenerContainerFactory> createConcurrentFactory(
- ConsumerFactory consumerFactory, int threadsNumber) {
- ConcurrentKafkaListenerContainerFactory factory =
+ @Bean
+ public KafkaListenerContainerFactory> limitConfigContainerFactory(
+ ConsumerFactory consumerFactory) {
+ return createConcurrentFactory(consumerFactory, kafkaConsumerProperties.getLimitConfigConcurrency());
+ }
+
+ @Bean
+ public KafkaListenerContainerFactory> exchangeRateContainerFactory() {
+ Map props = kafkaProperties.buildConsumerProperties();
+ props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
+ props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, CurrencyExchangeRateEventDeserializer.class);
+ props.put(ConsumerConfig.GROUP_ID_CONFIG, exrateConsumerGroup);
+ ConsumerFactory consumerFactory = new DefaultKafkaConsumerFactory<>(props);
+
+ return createConcurrentFactory(consumerFactory, kafkaConsumerProperties.getExrateConcurrency());
+ }
+
+ private KafkaListenerContainerFactory> createConcurrentFactory(
+ ConsumerFactory consumerFactory, int threadsNumber) {
+ ConcurrentKafkaListenerContainerFactory factory =
new ConcurrentKafkaListenerContainerFactory<>();
initFactory(consumerFactory, threadsNumber, factory);
return factory;
diff --git a/src/main/java/dev/vality/newway/config/SchedulerConfig.java b/src/main/java/dev/vality/newway/config/SchedulerConfig.java
index 4282a496..38d90a2e 100644
--- a/src/main/java/dev/vality/newway/config/SchedulerConfig.java
+++ b/src/main/java/dev/vality/newway/config/SchedulerConfig.java
@@ -18,7 +18,7 @@
@EnableSchedulerLock(defaultLockAtMostFor = "PT5M")
public class SchedulerConfig {
- public static final String TABLE_NAME = "nw.shedlock";
+ public static final String TABLE_NAME = "dw.shedlock";
@Bean
public DominantPoller dominantPoller(RepositorySrv.Iface dominantClient,
diff --git a/src/main/java/dev/vality/newway/config/properties/KafkaConsumerProperties.java b/src/main/java/dev/vality/newway/config/properties/KafkaConsumerProperties.java
index f82498b1..c35b0b64 100644
--- a/src/main/java/dev/vality/newway/config/properties/KafkaConsumerProperties.java
+++ b/src/main/java/dev/vality/newway/config/properties/KafkaConsumerProperties.java
@@ -11,12 +11,7 @@
@ConfigurationProperties(prefix = "kafka.consumer")
public class KafkaConsumerProperties {
- private String autoOffsetReset;
- private boolean enableAutoCommit;
private String groupId;
- private int maxPollRecords;
- private int maxPollIntervalMs;
- private int sessionTimeoutMs;
private int invoicingConcurrency;
private int recurrentPaymentToolConcurrency;
private int partyManagementConcurrency;
@@ -29,5 +24,8 @@ public class KafkaConsumerProperties {
private int sourceConcurrency;
private int destinationConcurrency;
private int withdrawalSessionConcurrency;
+ private int limitConfigConcurrency;
+ private int exrateConcurrency;
+ private int withdrawalAdjustmentConcurrency;
}
diff --git a/src/main/java/dev/vality/newway/config/properties/KafkaSslProperties.java b/src/main/java/dev/vality/newway/config/properties/KafkaSslProperties.java
deleted file mode 100644
index 5438ac36..00000000
--- a/src/main/java/dev/vality/newway/config/properties/KafkaSslProperties.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package dev.vality.newway.config.properties;
-
-import lombok.Getter;
-import lombok.Setter;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.stereotype.Component;
-
-@Getter
-@Setter
-@Component
-@ConfigurationProperties(prefix = "kafka.ssl")
-public class KafkaSslProperties {
-
- private String trustStorePassword;
- private String trustStoreLocation;
- private String keyStorePassword;
- private String keyPassword;
- private String keyStoreLocation;
- private boolean enabled;
- private String keyStoreType;
- private String trustStoreType;
-
-}
diff --git a/src/main/java/dev/vality/newway/dao/dominant/iface/DominantDao.java b/src/main/java/dev/vality/newway/dao/dominant/iface/DominantDao.java
index 420e8605..3c493eca 100644
--- a/src/main/java/dev/vality/newway/dao/dominant/iface/DominantDao.java
+++ b/src/main/java/dev/vality/newway/dao/dominant/iface/DominantDao.java
@@ -5,4 +5,5 @@
public interface DominantDao extends GenericDao {
Long getLastVersionId() throws DaoException;
+ void updateLastVersionId(Long versionId) throws DaoException;
}
diff --git a/src/main/java/dev/vality/newway/dao/dominant/impl/DominantDaoImpl.java b/src/main/java/dev/vality/newway/dao/dominant/impl/DominantDaoImpl.java
index 5a2cb82d..e7263a69 100644
--- a/src/main/java/dev/vality/newway/dao/dominant/impl/DominantDaoImpl.java
+++ b/src/main/java/dev/vality/newway/dao/dominant/impl/DominantDaoImpl.java
@@ -10,6 +10,8 @@
import javax.sql.DataSource;
+import static org.jooq.impl.DSL.max;
+
@Component
public class DominantDaoImpl extends AbstractGenericDao implements DominantDao {
@@ -19,27 +21,16 @@ public DominantDaoImpl(DataSource dataSource) {
@Override
public Long getLastVersionId() throws DaoException {
- Query query = getDslContext().select(DSL.max(DSL.field("version_id"))).from(
- getDslContext().select(Tables.CALENDAR.VERSION_ID.max().as("version_id")).from(Tables.CALENDAR)
- .unionAll(getDslContext().select(Tables.CATEGORY.VERSION_ID.max().as("version_id")).from(Tables.CATEGORY))
- .unionAll(getDslContext().select(Tables.CURRENCY.VERSION_ID.max().as("version_id")).from(Tables.CURRENCY))
- .unionAll(getDslContext().select(Tables.INSPECTOR.VERSION_ID.max().as("version_id")).from(Tables.INSPECTOR))
- .unionAll(getDslContext().select(Tables.PAYMENT_INSTITUTION.VERSION_ID.max().as("version_id"))
- .from(Tables.PAYMENT_INSTITUTION))
- .unionAll(getDslContext().select(Tables.PAYMENT_METHOD.VERSION_ID.max().as("version_id"))
- .from(Tables.PAYMENT_METHOD))
- .unionAll(getDslContext().select(Tables.PAYOUT_METHOD.VERSION_ID.max().as("version_id"))
- .from(Tables.PAYOUT_METHOD))
- .unionAll(getDslContext().select(Tables.PROVIDER.VERSION_ID.max().as("version_id")).from(Tables.PROVIDER))
- .unionAll(getDslContext().select(Tables.PROXY.VERSION_ID.max().as("version_id")).from(Tables.PROXY))
- .unionAll(getDslContext().select(Tables.TERMINAL.VERSION_ID.max().as("version_id")).from(Tables.TERMINAL))
- .unionAll(getDslContext().select(Tables.TERM_SET_HIERARCHY.VERSION_ID.max().as("version_id"))
- .from(Tables.TERM_SET_HIERARCHY))
- .unionAll(getDslContext().select(Tables.WITHDRAWAL_PROVIDER.VERSION_ID.max().as("version_id"))
- .from(Tables.WITHDRAWAL_PROVIDER))
- .unionAll(getDslContext().select(Tables.PAYMENT_ROUTING_RULE.VERSION_ID.max().as("version_id"))
- .from(Tables.PAYMENT_ROUTING_RULE))
- );
+ Query query = getDslContext()
+ .select(Tables.DOMINANT_LAST_VERSION_ID.VERSION_ID)
+ .from(Tables.DOMINANT_LAST_VERSION_ID);
return fetchOne(query, Long.class);
}
+
+ @Override
+ public void updateLastVersionId(Long versionId) throws DaoException {
+ Query query = getDslContext().update(Tables.DOMINANT_LAST_VERSION_ID)
+ .set(Tables.DOMINANT_LAST_VERSION_ID.VERSION_ID, versionId);
+ executeOne(query);
+ }
}
diff --git a/src/main/java/dev/vality/newway/dao/exrate/iface/ExchangeRateDao.java b/src/main/java/dev/vality/newway/dao/exrate/iface/ExchangeRateDao.java
new file mode 100644
index 00000000..19bda164
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/exrate/iface/ExchangeRateDao.java
@@ -0,0 +1,12 @@
+package dev.vality.newway.dao.exrate.iface;
+
+import dev.vality.dao.DaoException;
+import dev.vality.dao.GenericDao;
+import dev.vality.newway.domain.tables.pojos.ExRate;
+
+import java.util.List;
+
+public interface ExchangeRateDao extends GenericDao {
+ void saveBatch(List exchangeRates) throws DaoException;
+ ExRate findBySourceSymbolicCode(String symbolicCode);
+}
diff --git a/src/main/java/dev/vality/newway/dao/exrate/impl/ExchangeRateDaoImpl.java b/src/main/java/dev/vality/newway/dao/exrate/impl/ExchangeRateDaoImpl.java
new file mode 100644
index 00000000..22474563
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/exrate/impl/ExchangeRateDaoImpl.java
@@ -0,0 +1,48 @@
+package dev.vality.newway.dao.exrate.impl;
+
+import dev.vality.dao.DaoException;
+import dev.vality.dao.impl.AbstractGenericDao;
+import dev.vality.mapper.RecordRowMapper;
+import dev.vality.newway.dao.exrate.iface.ExchangeRateDao;
+import dev.vality.newway.domain.tables.pojos.ExRate;
+import org.jooq.Query;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static dev.vality.newway.domain.tables.ExRate.EX_RATE;
+
+@Component
+public class ExchangeRateDaoImpl extends AbstractGenericDao implements ExchangeRateDao {
+
+ private final RowMapper rowMapper;
+
+ @Autowired
+ public ExchangeRateDaoImpl(@Qualifier("dataSource") DataSource dataSource) {
+ super(dataSource);
+ this.rowMapper = new RecordRowMapper<>(EX_RATE, ExRate.class);
+ }
+
+ @Override
+ public void saveBatch(List exchangeRates) throws DaoException {
+ List queryList = exchangeRates.stream()
+ .map(exrate -> getDslContext().newRecord(EX_RATE, exrate))
+ .map(record -> (Query) getDslContext().insertInto(EX_RATE).set(record)
+ .onConflict(EX_RATE.EVENT_ID)
+ .doNothing())
+ .collect(Collectors.toList());
+ batchExecute(queryList);
+ }
+
+ @Override
+ public ExRate findBySourceSymbolicCode(String symbolicCode) {
+ Query query = getDslContext().selectFrom(EX_RATE)
+ .where(EX_RATE.SOURCE_CURRENCY_SYMBOLIC_CODE.eq(symbolicCode));
+ return fetchOne(query, rowMapper);
+ }
+}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/iface/CashFlowLinkDao.java b/src/main/java/dev/vality/newway/dao/invoicing/iface/CashFlowLinkDao.java
new file mode 100644
index 00000000..58c3992f
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/iface/CashFlowLinkDao.java
@@ -0,0 +1,22 @@
+package dev.vality.newway.dao.invoicing.iface;
+
+import dev.vality.dao.GenericDao;
+import dev.vality.newway.domain.tables.pojos.CashFlowLink;
+import dev.vality.newway.exception.DaoException;
+import dev.vality.newway.model.InvoicePaymentEventIdHolder;
+import dev.vality.newway.model.InvoicingKey;
+
+import java.util.List;
+import java.util.Set;
+
+public interface CashFlowLinkDao extends GenericDao {
+
+ void saveBatch(List links) throws DaoException;
+
+ CashFlowLink get(String invoiceId, String paymentId);
+
+ void switchCurrent(Set keys) throws DaoException;
+
+ Set getExistingEvents(List links);
+
+}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/iface/InvoiceCartDao.java b/src/main/java/dev/vality/newway/dao/invoicing/iface/InvoiceCartDao.java
index dc6773ea..b284033c 100644
--- a/src/main/java/dev/vality/newway/dao/invoicing/iface/InvoiceCartDao.java
+++ b/src/main/java/dev/vality/newway/dao/invoicing/iface/InvoiceCartDao.java
@@ -5,11 +5,14 @@
import dev.vality.newway.exception.DaoException;
import java.util.List;
+import java.util.Set;
public interface InvoiceCartDao extends GenericDao {
void save(List invoiceCartList) throws DaoException;
- List getByInvId(Long invId) throws DaoException;
+ List getByInvoiceId(String invoiceId) throws DaoException;
+
+ Set getExistingInvoiceIds(Set invoiceIds) throws DaoException;
}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/iface/InvoiceDao.java b/src/main/java/dev/vality/newway/dao/invoicing/iface/InvoiceDao.java
index 7813731b..5124af9b 100644
--- a/src/main/java/dev/vality/newway/dao/invoicing/iface/InvoiceDao.java
+++ b/src/main/java/dev/vality/newway/dao/invoicing/iface/InvoiceDao.java
@@ -3,9 +3,7 @@
import dev.vality.dao.GenericDao;
import dev.vality.newway.domain.tables.pojos.Invoice;
import dev.vality.newway.exception.DaoException;
-import dev.vality.newway.model.InvoicingKey;
-import java.util.Collection;
import java.util.List;
public interface InvoiceDao extends GenericDao {
@@ -14,5 +12,4 @@ public interface InvoiceDao extends GenericDao {
Invoice get(String invoiceId) throws DaoException;
- void switchCurrent(Collection invoicesSwitchIds) throws DaoException;
}
\ No newline at end of file
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/iface/InvoiceStatusInfoDao.java b/src/main/java/dev/vality/newway/dao/invoicing/iface/InvoiceStatusInfoDao.java
new file mode 100644
index 00000000..bab72c01
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/iface/InvoiceStatusInfoDao.java
@@ -0,0 +1,18 @@
+package dev.vality.newway.dao.invoicing.iface;
+
+import dev.vality.dao.GenericDao;
+import dev.vality.newway.domain.tables.pojos.InvoiceStatusInfo;
+import dev.vality.newway.exception.DaoException;
+
+import java.util.List;
+import java.util.Set;
+
+public interface InvoiceStatusInfoDao extends GenericDao {
+
+ void saveBatch(List statuses) throws DaoException;
+
+ InvoiceStatusInfo get(String invoiceId);
+
+ void switchCurrent(Set invoiceIds) throws DaoException;
+
+}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentAdditionalInfoDao.java b/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentAdditionalInfoDao.java
new file mode 100644
index 00000000..bebf4fd8
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentAdditionalInfoDao.java
@@ -0,0 +1,19 @@
+package dev.vality.newway.dao.invoicing.iface;
+
+import dev.vality.dao.GenericDao;
+import dev.vality.newway.domain.tables.pojos.PaymentAdditionalInfo;
+import dev.vality.newway.exception.DaoException;
+import dev.vality.newway.model.InvoicingKey;
+
+import java.util.List;
+import java.util.Set;
+
+public interface PaymentAdditionalInfoDao extends GenericDao {
+
+ void saveBatch(List paymentAdditionalInfos) throws DaoException;
+
+ PaymentAdditionalInfo get(String invoiceId, String paymentId) throws DaoException;
+
+ void switchCurrent(Set invoicesSwitchIds) throws DaoException;
+
+}
\ No newline at end of file
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentDao.java b/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentDao.java
index 076c54ca..ee94ade6 100644
--- a/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentDao.java
+++ b/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentDao.java
@@ -3,18 +3,13 @@
import dev.vality.dao.GenericDao;
import dev.vality.newway.domain.tables.pojos.Payment;
import dev.vality.newway.exception.DaoException;
-import dev.vality.newway.model.InvoicingKey;
-import java.util.Collection;
import java.util.List;
public interface PaymentDao extends GenericDao {
void saveBatch(List payments) throws DaoException;
- void updateBatch(List records) throws DaoException;
-
Payment get(String invoiceId, String paymentId) throws DaoException;
- void switchCurrent(Collection invoicesSwitchIds) throws DaoException;
}
\ No newline at end of file
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentFeeDao.java b/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentFeeDao.java
new file mode 100644
index 00000000..90ed3359
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentFeeDao.java
@@ -0,0 +1,19 @@
+package dev.vality.newway.dao.invoicing.iface;
+
+import dev.vality.dao.GenericDao;
+import dev.vality.newway.domain.tables.pojos.PaymentFee;
+import dev.vality.newway.exception.DaoException;
+import dev.vality.newway.model.InvoicingKey;
+
+import java.util.List;
+import java.util.Set;
+
+public interface PaymentFeeDao extends GenericDao {
+
+ void saveBatch(List paymentFees) throws DaoException;
+
+ PaymentFee get(String invoiceId, String paymentId) throws DaoException;
+
+ void switchCurrent(Set invoicingKeys) throws DaoException;
+
+}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentPayerInfoDao.java b/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentPayerInfoDao.java
new file mode 100644
index 00000000..821817cb
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentPayerInfoDao.java
@@ -0,0 +1,16 @@
+package dev.vality.newway.dao.invoicing.iface;
+
+import dev.vality.dao.GenericDao;
+
+import dev.vality.newway.domain.tables.pojos.PaymentPayerInfo;
+import dev.vality.newway.exception.DaoException;
+
+import java.util.List;
+
+public interface PaymentPayerInfoDao extends GenericDao {
+
+ void saveBatch(List payerInfos) throws DaoException;
+
+ PaymentPayerInfo get(String invoiceId, String paymentId) throws DaoException;
+
+}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentRecurrentInfoDao.java b/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentRecurrentInfoDao.java
new file mode 100644
index 00000000..c1a4490b
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentRecurrentInfoDao.java
@@ -0,0 +1,19 @@
+package dev.vality.newway.dao.invoicing.iface;
+
+import dev.vality.dao.GenericDao;
+import dev.vality.newway.domain.tables.pojos.PaymentRecurrentInfo;
+import dev.vality.newway.exception.DaoException;
+import dev.vality.newway.model.InvoicingKey;
+
+import java.util.List;
+import java.util.Set;
+
+public interface PaymentRecurrentInfoDao extends GenericDao {
+
+ void saveBatch(List paymentRecurrentInfos) throws DaoException;
+
+ PaymentRecurrentInfo get(String invoiceId, String paymentId) throws DaoException;
+
+ void switchCurrent(Set invoicesSwitchIds) throws DaoException;
+
+}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentRiskDataDao.java b/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentRiskDataDao.java
new file mode 100644
index 00000000..8ab00f94
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentRiskDataDao.java
@@ -0,0 +1,19 @@
+package dev.vality.newway.dao.invoicing.iface;
+
+import dev.vality.dao.GenericDao;
+import dev.vality.newway.domain.tables.pojos.PaymentRiskData;
+import dev.vality.newway.exception.DaoException;
+import dev.vality.newway.model.InvoicingKey;
+
+import java.util.List;
+import java.util.Set;
+
+public interface PaymentRiskDataDao extends GenericDao {
+
+ void saveBatch(List paymentRiskDataList) throws DaoException;
+
+ PaymentRiskData get(String invoiceId, String paymentId) throws DaoException;
+
+ void switchCurrent(Set invoicingKeys) throws DaoException;
+
+}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentRouteDao.java b/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentRouteDao.java
new file mode 100644
index 00000000..447db170
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentRouteDao.java
@@ -0,0 +1,19 @@
+package dev.vality.newway.dao.invoicing.iface;
+
+import dev.vality.dao.GenericDao;
+import dev.vality.newway.domain.tables.pojos.PaymentRoute;
+import dev.vality.newway.exception.DaoException;
+import dev.vality.newway.model.InvoicingKey;
+
+import java.util.List;
+import java.util.Set;
+
+public interface PaymentRouteDao extends GenericDao {
+
+ void saveBatch(List paymentRoutes) throws DaoException;
+
+ PaymentRoute get(String invoiceId, String paymentId) throws DaoException;
+
+ void switchCurrent(Set invoicingKeys) throws DaoException;
+
+}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentSessionInfoDao.java b/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentSessionInfoDao.java
new file mode 100644
index 00000000..057b8f95
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentSessionInfoDao.java
@@ -0,0 +1,15 @@
+package dev.vality.newway.dao.invoicing.iface;
+
+import dev.vality.dao.GenericDao;
+import dev.vality.newway.domain.tables.pojos.PaymentRoute;
+import dev.vality.newway.domain.tables.pojos.PaymentSessionInfo;
+import dev.vality.newway.exception.DaoException;
+
+import java.util.List;
+
+public interface PaymentSessionInfoDao extends GenericDao {
+
+ void saveBatch(List paymentStatusInfos) throws DaoException;
+
+ PaymentSessionInfo get(String invoiceId, String paymentId) throws DaoException;
+}
\ No newline at end of file
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentStatusInfoDao.java b/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentStatusInfoDao.java
new file mode 100644
index 00000000..3315389c
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/iface/PaymentStatusInfoDao.java
@@ -0,0 +1,18 @@
+package dev.vality.newway.dao.invoicing.iface;
+
+import dev.vality.dao.GenericDao;
+import dev.vality.newway.domain.tables.pojos.PaymentStatusInfo;
+import dev.vality.newway.exception.DaoException;
+import dev.vality.newway.model.InvoicingKey;
+
+import java.util.List;
+import java.util.Set;
+
+public interface PaymentStatusInfoDao extends GenericDao {
+
+ void saveBatch(List paymentStatusInfos) throws DaoException;
+
+ PaymentStatusInfo get(String invoiceId, String paymentId) throws DaoException;
+
+ void switchCurrent(Set invoicesSwitchIds) throws DaoException;
+}
\ No newline at end of file
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/impl/CashFlowLinkDaoImpl.java b/src/main/java/dev/vality/newway/dao/invoicing/impl/CashFlowLinkDaoImpl.java
new file mode 100644
index 00000000..1fcc99c4
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/impl/CashFlowLinkDaoImpl.java
@@ -0,0 +1,124 @@
+package dev.vality.newway.dao.invoicing.impl;
+
+import dev.vality.dao.impl.AbstractGenericDao;
+import dev.vality.mapper.RecordRowMapper;
+import dev.vality.newway.dao.invoicing.iface.CashFlowLinkDao;
+import dev.vality.newway.domain.tables.pojos.CashFlowLink;
+import dev.vality.newway.exception.DaoException;
+import dev.vality.newway.exception.NotFoundException;
+import dev.vality.newway.model.InvoicePaymentEventIdHolder;
+import dev.vality.newway.model.InvoicingKey;
+import org.jooq.Field;
+import org.jooq.Query;
+import org.jooq.impl.DSL;
+import org.springframework.jdbc.core.DataClassRowMapper;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static dev.vality.newway.domain.Tables.CASH_FLOW_LINK;
+
+@Component
+public class CashFlowLinkDaoImpl extends AbstractGenericDao implements CashFlowLinkDao {
+
+ private final RowMapper rowMapper;
+ private final RowMapper invoicePaymentEventIdRowMapper;
+
+ private static final Field[] INVOICE_PAYMENT_EVENT_ID_HOLDER_FIELDS = new Field[]{
+ CASH_FLOW_LINK.INVOICE_ID,
+ CASH_FLOW_LINK.PAYMENT_ID,
+ CASH_FLOW_LINK.CHANGE_ID,
+ CASH_FLOW_LINK.SEQUENCE_ID
+ };
+
+ public CashFlowLinkDaoImpl(DataSource dataSource) {
+ super(dataSource);
+ rowMapper = new RecordRowMapper<>(CASH_FLOW_LINK, CashFlowLink.class);
+ invoicePaymentEventIdRowMapper = new DataClassRowMapper<>(InvoicePaymentEventIdHolder.class);
+ }
+
+ @Override
+ public void saveBatch(List links) throws DaoException {
+ batchExecute(links.stream()
+ .map(status -> getDslContext().newRecord(CASH_FLOW_LINK, status))
+ .map(invoiceStatusInfoRecord -> getDslContext().insertInto(CASH_FLOW_LINK)
+ .set(invoiceStatusInfoRecord))
+ .collect(Collectors.toList())
+ );
+ }
+
+ @Override
+ public CashFlowLink get(String invoiceId, String paymentId) {
+ Query query = getDslContext().selectFrom(CASH_FLOW_LINK)
+ .where(CASH_FLOW_LINK.INVOICE_ID.eq(invoiceId)
+ .and(CASH_FLOW_LINK.PAYMENT_ID.eq(paymentId))
+ .and(CASH_FLOW_LINK.CURRENT));
+ return Optional.ofNullable(fetchOne(query, rowMapper))
+ .orElseThrow(() -> new NotFoundException(
+ String.format("CashFlowLink not found, invoiceId='%s', paymentId='%s'", invoiceId, paymentId)));
+ }
+
+ @Override
+ public void switchCurrent(Set keys) throws DaoException {
+ keys.forEach(key -> {
+ setOldCashFlowLinkNotCurrent(key);
+ setLatestCashFlowLinkCurrent(key);
+ });
+ }
+
+ @Override
+ public Set getExistingEvents(List links) {
+ Set invoiceIds = new HashSet<>();
+ Set paymentIds = new HashSet<>();
+ Set changeIds = new HashSet<>();
+ Set sequenceIds = new HashSet<>();
+ Set concatenatedIds = new HashSet<>();
+ links.forEach(link -> {
+ invoiceIds.add(link.getInvoiceId());
+ paymentIds.add(link.getPaymentId());
+ changeIds.add(link.getChangeId());
+ sequenceIds.add(link.getSequenceId());
+ concatenatedIds.add(link.getInvoiceId() + link.getPaymentId() + link.getChangeId() + link.getSequenceId());
+ });
+
+ // we have to use concatenated ids otherwise there is small probability of collision.
+ // some non-processed events might fall under "invoice_id/payment_id/change_id/sequence_id in()" conditiona.
+ // e.g. we will receive several cash_flow_change events within one batch
+ // and there will be overlap in change ids.
+ // concat() is used as last step so there is minimal operation overhead.
+ Query query = getDslContext()
+ .select(INVOICE_PAYMENT_EVENT_ID_HOLDER_FIELDS)
+ .from(CASH_FLOW_LINK)
+ .where(CASH_FLOW_LINK.INVOICE_ID.in(invoiceIds))
+ .and(CASH_FLOW_LINK.PAYMENT_ID.in(paymentIds))
+ .and(CASH_FLOW_LINK.CHANGE_ID.in(changeIds))
+ .and(CASH_FLOW_LINK.SEQUENCE_ID.in(sequenceIds))
+ .and(DSL.concat(INVOICE_PAYMENT_EVENT_ID_HOLDER_FIELDS).in(concatenatedIds));
+
+ return new HashSet<>(fetch(query, invoicePaymentEventIdRowMapper));
+ }
+
+ private void setOldCashFlowLinkNotCurrent(InvoicingKey key) {
+ execute(getDslContext().update(CASH_FLOW_LINK)
+ .set(CASH_FLOW_LINK.CURRENT, false)
+ .where(CASH_FLOW_LINK.INVOICE_ID.eq(key.getInvoiceId())
+ .and(CASH_FLOW_LINK.PAYMENT_ID.eq(key.getPaymentId()))
+ .and(CASH_FLOW_LINK.CURRENT))
+ );
+ }
+
+ private void setLatestCashFlowLinkCurrent(InvoicingKey key) {
+ execute(getDslContext().update(CASH_FLOW_LINK)
+ .set(CASH_FLOW_LINK.CURRENT, true)
+ .where(CASH_FLOW_LINK.ID.eq(
+ DSL.select(DSL.max(CASH_FLOW_LINK.ID))
+ .from(CASH_FLOW_LINK)
+ .where(CASH_FLOW_LINK.INVOICE_ID.eq(key.getInvoiceId())
+ .and(CASH_FLOW_LINK.PAYMENT_ID.eq(key.getPaymentId())))
+ ))
+ );
+ }
+}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentIdsGeneratorDaoImpl.java b/src/main/java/dev/vality/newway/dao/invoicing/impl/CashFlowLinkIdsGeneratorDaoImpl.java
similarity index 84%
rename from src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentIdsGeneratorDaoImpl.java
rename to src/main/java/dev/vality/newway/dao/invoicing/impl/CashFlowLinkIdsGeneratorDaoImpl.java
index eb359bc7..018a964b 100644
--- a/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentIdsGeneratorDaoImpl.java
+++ b/src/main/java/dev/vality/newway/dao/invoicing/impl/CashFlowLinkIdsGeneratorDaoImpl.java
@@ -14,14 +14,14 @@
@Slf4j
@Component
@RequiredArgsConstructor
-public class PaymentIdsGeneratorDaoImpl implements IdsGeneratorDao {
+public class CashFlowLinkIdsGeneratorDaoImpl implements IdsGeneratorDao {
private final NamedParameterJdbcTemplate jdbcTemplate;
@Override
public List get(int size) throws DaoException {
try {
- String sql = "select nextval('nw.pmnt_seq') from generate_series(1, :size)";
+ String sql = "select nextval('dw.cash_flow_link_id_seq') from generate_series(1, :size)";
MapSqlParameterSource parameterSource = new MapSqlParameterSource().addValue("size", size);
return jdbcTemplate.queryForList(sql, parameterSource, Long.class);
} catch (NestedRuntimeException e) {
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/impl/InvoiceCartDaoImpl.java b/src/main/java/dev/vality/newway/dao/invoicing/impl/InvoiceCartDaoImpl.java
index 6d734db4..ab285f42 100644
--- a/src/main/java/dev/vality/newway/dao/invoicing/impl/InvoiceCartDaoImpl.java
+++ b/src/main/java/dev/vality/newway/dao/invoicing/impl/InvoiceCartDaoImpl.java
@@ -6,12 +6,16 @@
import dev.vality.newway.domain.tables.pojos.InvoiceCart;
import dev.vality.newway.exception.DaoException;
import org.jooq.Query;
+import org.jooq.impl.DSL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.RowMapper;
+import org.springframework.jdbc.core.SingleColumnRowMapper;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import java.util.stream.Collectors;
import static dev.vality.newway.domain.tables.InvoiceCart.INVOICE_CART;
@@ -37,9 +41,29 @@ public void save(List carts) throws DaoException {
}
@Override
- public List getByInvId(Long invId) throws DaoException {
+ public List getByInvoiceId(String invoiceId) throws DaoException {
Query query = getDslContext().selectFrom(INVOICE_CART)
- .where(INVOICE_CART.INV_ID.eq(invId));
+ .where(INVOICE_CART.INVOICE_ID.eq(invoiceId));
return fetch(query, invoiceCartRowMapper);
}
+
+ /**
+ * Invoice cart can be written only once when Invoice is created.
+ * Invoice cart cannot be changed, only way to change invoice cart is to cancel invoice and create new one.
+ *
+ * @param invoiceIds set of invoice ids to check for existence.
+ * @return List of invoice ids which haven't been saved already.
+ * @throws DaoException
+ */
+ @Override
+ public Set getExistingInvoiceIds(Set invoiceIds) throws DaoException {
+ Query query = getDslContext()
+ .select(INVOICE_CART.INVOICE_ID)
+ .from(INVOICE_CART)
+ .where(INVOICE_CART.INVOICE_ID.in(invoiceIds))
+ .groupBy(INVOICE_CART.INVOICE_ID)
+ .having(DSL.count(INVOICE_CART.ID).greaterThan(0));
+
+ return new HashSet<>(fetch(query, new SingleColumnRowMapper<>(String.class)));
+ }
}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/impl/InvoiceDaoImpl.java b/src/main/java/dev/vality/newway/dao/invoicing/impl/InvoiceDaoImpl.java
index 1490b4f8..99be3cca 100644
--- a/src/main/java/dev/vality/newway/dao/invoicing/impl/InvoiceDaoImpl.java
+++ b/src/main/java/dev/vality/newway/dao/invoicing/impl/InvoiceDaoImpl.java
@@ -4,18 +4,16 @@
import dev.vality.mapper.RecordRowMapper;
import dev.vality.newway.dao.invoicing.iface.InvoiceDao;
import dev.vality.newway.domain.tables.pojos.Invoice;
+import dev.vality.newway.domain.tables.records.InvoiceRecord;
import dev.vality.newway.exception.DaoException;
import dev.vality.newway.exception.NotFoundException;
-import dev.vality.newway.model.InvoicingKey;
import org.jooq.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.RowMapper;
-import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
import javax.validation.constraints.NotNull;
-import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -37,11 +35,7 @@ public InvoiceDaoImpl(DataSource dataSource) {
public void saveBatch(List invoices) throws DaoException {
List queries = invoices.stream()
.map(invoice -> getDslContext().newRecord(INVOICE, invoice))
- .map(invoiceRecord -> getDslContext().insertInto(INVOICE)
- .set(invoiceRecord)
- .onConflict(INVOICE.INVOICE_ID, INVOICE.SEQUENCE_ID, INVOICE.CHANGE_ID)
- .doNothing()
- )
+ .map(this::prepareInsertQuery)
.collect(Collectors.toList());
batchExecute(queries);
}
@@ -50,20 +44,21 @@ public void saveBatch(List invoices) throws DaoException {
@Override
public Invoice get(String invoiceId) throws DaoException {
Query query = getDslContext().selectFrom(INVOICE)
- .where(INVOICE.INVOICE_ID.eq(invoiceId).and(INVOICE.CURRENT));
+ .where(INVOICE.INVOICE_ID.eq(invoiceId));
return Optional.ofNullable(fetchOne(query, invoiceRowMapper))
.orElseThrow(
() -> new NotFoundException(String.format("Invoice not found, invoiceId='%s'", invoiceId)));
}
- @Override
- public void switchCurrent(Collection invoicesSwitchIds) throws DaoException {
- invoicesSwitchIds.forEach(ik ->
- this.getNamedParameterJdbcTemplate()
- .update("update nw.invoice set current = false " +
- "where invoice_id =:invoice_id and current;" +
- "update nw.invoice set current = true " +
- "where id = (select max(id) from nw.invoice where invoice_id =:invoice_id);",
- new MapSqlParameterSource("invoice_id", ik.getInvoiceId())));
+ private Query prepareInsertQuery(InvoiceRecord invoiceRecord) {
+ return getDslContext().insertInto(INVOICE)
+ .set(invoiceRecord)
+ .onConflict(
+ INVOICE.INVOICE_ID,
+ INVOICE.SEQUENCE_ID,
+ INVOICE.CHANGE_ID
+ )
+ .doNothing();
}
+
}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/impl/InvoiceIdsGeneratorDaoImpl.java b/src/main/java/dev/vality/newway/dao/invoicing/impl/InvoiceIdsGeneratorDaoImpl.java
deleted file mode 100644
index be6da94d..00000000
--- a/src/main/java/dev/vality/newway/dao/invoicing/impl/InvoiceIdsGeneratorDaoImpl.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package dev.vality.newway.dao.invoicing.impl;
-
-import dev.vality.newway.dao.invoicing.iface.IdsGeneratorDao;
-import dev.vality.newway.exception.DaoException;
-import lombok.RequiredArgsConstructor;
-import org.springframework.core.NestedRuntimeException;
-import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
-import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-@Component
-@RequiredArgsConstructor
-public class InvoiceIdsGeneratorDaoImpl implements IdsGeneratorDao {
-
- private final NamedParameterJdbcTemplate jdbcTemplate;
-
- @Override
- public List get(int size) throws DaoException {
- try {
- String sql = "select nextval('nw.inv_seq') from generate_series(1, :size)";
- MapSqlParameterSource parameterSource = new MapSqlParameterSource().addValue("size", size);
- return jdbcTemplate.queryForList(sql, parameterSource, Long.class);
- } catch (NestedRuntimeException e) {
- throw new DaoException(e);
- }
- }
-}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/impl/InvoiceStatusInfoDaoImpl.java b/src/main/java/dev/vality/newway/dao/invoicing/impl/InvoiceStatusInfoDaoImpl.java
new file mode 100644
index 00000000..cbc49a3b
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/impl/InvoiceStatusInfoDaoImpl.java
@@ -0,0 +1,87 @@
+package dev.vality.newway.dao.invoicing.impl;
+
+import dev.vality.dao.impl.AbstractGenericDao;
+import dev.vality.mapper.RecordRowMapper;
+import dev.vality.newway.dao.invoicing.iface.InvoiceStatusInfoDao;
+import dev.vality.newway.domain.tables.pojos.InvoiceStatusInfo;
+import dev.vality.newway.domain.tables.records.InvoiceStatusInfoRecord;
+import dev.vality.newway.exception.DaoException;
+import dev.vality.newway.exception.NotFoundException;
+import org.jooq.Query;
+import org.jooq.impl.DSL;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static dev.vality.newway.domain.Tables.*;
+
+@Component
+public class InvoiceStatusInfoDaoImpl extends AbstractGenericDao implements InvoiceStatusInfoDao {
+
+ private final RowMapper rowMapper;
+
+ public InvoiceStatusInfoDaoImpl(DataSource dataSource) {
+ super(dataSource);
+ this.rowMapper = new RecordRowMapper<>(INVOICE_STATUS_INFO, InvoiceStatusInfo.class);
+ }
+
+ @Override
+ public void saveBatch(List statuses) throws DaoException {
+ batchExecute(statuses.stream()
+ .map(status -> getDslContext().newRecord(INVOICE_STATUS_INFO, status))
+ .map(this::prepareInsertQuery)
+ .collect(Collectors.toList())
+ );
+ }
+
+ @Override
+ public InvoiceStatusInfo get(String invoiceId) {
+ Query query = getDslContext().selectFrom(INVOICE_STATUS_INFO)
+ .where(INVOICE_STATUS_INFO.INVOICE_ID.eq(invoiceId)
+ .and(INVOICE_STATUS_INFO.CURRENT));
+ return Optional.ofNullable(fetchOne(query, rowMapper)).orElseThrow(() ->
+ new NotFoundException(String.format("InvoiceStatusInfo not found, invoiceId='%s'", invoiceId)));
+ }
+
+ @Override
+ public void switchCurrent(Set invoiceIds) throws DaoException {
+ invoiceIds.forEach(invoiceId -> {
+ setOldStatusInfoNotCurrent(invoiceId);
+ setLatestStatusInfoCurrent(invoiceId);
+ });
+ }
+
+ private Query prepareInsertQuery(InvoiceStatusInfoRecord invoiceStatusInfoRecord) {
+ return getDslContext().insertInto(INVOICE_STATUS_INFO)
+ .set(invoiceStatusInfoRecord)
+ .onConflict(
+ INVOICE_STATUS_INFO.INVOICE_ID,
+ INVOICE_STATUS_INFO.SEQUENCE_ID,
+ INVOICE_STATUS_INFO.CHANGE_ID)
+ .doNothing();
+ }
+
+ private void setOldStatusInfoNotCurrent(String invoiceId) {
+ execute(getDslContext().update(INVOICE_STATUS_INFO)
+ .set(INVOICE_STATUS_INFO.CURRENT, false)
+ .where(INVOICE_STATUS_INFO.INVOICE_ID.eq(invoiceId)
+ .and(INVOICE_STATUS_INFO.CURRENT))
+ );
+ }
+
+ private void setLatestStatusInfoCurrent(String invoiceId) {
+ execute(getDslContext().update(INVOICE_STATUS_INFO)
+ .set(INVOICE_STATUS_INFO.CURRENT, true)
+ .where(INVOICE_STATUS_INFO.ID.eq(
+ DSL.select(DSL.max(INVOICE_STATUS_INFO.ID))
+ .from(INVOICE_STATUS_INFO)
+ .where(INVOICE_STATUS_INFO.INVOICE_ID.eq(invoiceId))
+ ))
+ );
+ }
+}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentAdditionalInfoDaoImpl.java b/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentAdditionalInfoDaoImpl.java
new file mode 100644
index 00000000..84da3e1e
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentAdditionalInfoDaoImpl.java
@@ -0,0 +1,95 @@
+package dev.vality.newway.dao.invoicing.impl;
+
+import dev.vality.dao.impl.AbstractGenericDao;
+import dev.vality.mapper.RecordRowMapper;
+import dev.vality.newway.dao.invoicing.iface.PaymentAdditionalInfoDao;
+import dev.vality.newway.domain.tables.pojos.PaymentAdditionalInfo;
+import dev.vality.newway.domain.tables.records.PaymentAdditionalInfoRecord;
+import dev.vality.newway.exception.DaoException;
+import dev.vality.newway.exception.NotFoundException;
+import dev.vality.newway.model.InvoicingKey;
+import org.jooq.Query;
+import org.jooq.impl.DSL;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static dev.vality.newway.domain.tables.PaymentAdditionalInfo.PAYMENT_ADDITIONAL_INFO;
+
+@Component
+public class PaymentAdditionalInfoDaoImpl extends AbstractGenericDao implements PaymentAdditionalInfoDao {
+
+ private final RowMapper rowMapper;
+
+ public PaymentAdditionalInfoDaoImpl(DataSource dataSource) {
+ super(dataSource);
+ this.rowMapper = new RecordRowMapper<>(PAYMENT_ADDITIONAL_INFO, PaymentAdditionalInfo.class);
+
+ }
+
+ @Override
+ public void saveBatch(List paymentAdditionalInfos) throws DaoException {
+ List queries = paymentAdditionalInfos.stream()
+ .map(statusInfo -> getDslContext().newRecord(PAYMENT_ADDITIONAL_INFO, statusInfo))
+ .map(this::prepareInsertQuery
+ )
+ .collect(Collectors.toList());
+ batchExecute(queries);
+ }
+
+ @Override
+ public PaymentAdditionalInfo get(String invoiceId, String paymentId) throws DaoException {
+ Query query = getDslContext().selectFrom(PAYMENT_ADDITIONAL_INFO)
+ .where(PAYMENT_ADDITIONAL_INFO.INVOICE_ID.eq(invoiceId)
+ .and(PAYMENT_ADDITIONAL_INFO.PAYMENT_ID.eq(paymentId))
+ .and(PAYMENT_ADDITIONAL_INFO.CURRENT));
+ return Optional.ofNullable(fetchOne(query, rowMapper)).orElseThrow(() ->
+ new NotFoundException("PaymentAdditionalInfo not found, invoiceId=" + invoiceId + " paymentId=" + paymentId));
+ }
+
+ @Override
+ public void switchCurrent(Set invoicesSwitchIds) throws DaoException {
+ invoicesSwitchIds.forEach(key -> {
+ setOldAdditionalInfoNotCurrent(key);
+ setLatestAdditionalInfoCurrent(key);
+ });
+ }
+
+ private Query prepareInsertQuery(PaymentAdditionalInfoRecord record) {
+ return getDslContext().insertInto(PAYMENT_ADDITIONAL_INFO)
+ .set(record)
+ .onConflict(
+ PAYMENT_ADDITIONAL_INFO.INVOICE_ID,
+ PAYMENT_ADDITIONAL_INFO.PAYMENT_ID,
+ PAYMENT_ADDITIONAL_INFO.SEQUENCE_ID,
+ PAYMENT_ADDITIONAL_INFO.CHANGE_ID
+ )
+ .doNothing();
+ }
+
+ private void setOldAdditionalInfoNotCurrent(InvoicingKey key) {
+ execute(getDslContext().update(PAYMENT_ADDITIONAL_INFO)
+ .set(PAYMENT_ADDITIONAL_INFO.CURRENT, false)
+ .where(PAYMENT_ADDITIONAL_INFO.INVOICE_ID.eq(key.getInvoiceId())
+ .and(PAYMENT_ADDITIONAL_INFO.PAYMENT_ID.eq(key.getPaymentId()))
+ .and(PAYMENT_ADDITIONAL_INFO.CURRENT))
+ );
+ }
+
+ private void setLatestAdditionalInfoCurrent(InvoicingKey key) {
+ execute(getDslContext().update(PAYMENT_ADDITIONAL_INFO)
+ .set(PAYMENT_ADDITIONAL_INFO.CURRENT, true)
+ .where(PAYMENT_ADDITIONAL_INFO.ID.eq(
+ DSL.select(DSL.max(PAYMENT_ADDITIONAL_INFO.ID))
+ .from(PAYMENT_ADDITIONAL_INFO)
+ .where(PAYMENT_ADDITIONAL_INFO.INVOICE_ID.eq(key.getInvoiceId())
+ .and(PAYMENT_ADDITIONAL_INFO.PAYMENT_ID.eq(key.getPaymentId())))
+ ))
+ );
+ }
+}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentDaoImpl.java b/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentDaoImpl.java
index 7af1bbb7..2d6c0074 100644
--- a/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentDaoImpl.java
+++ b/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentDaoImpl.java
@@ -4,18 +4,16 @@
import dev.vality.mapper.RecordRowMapper;
import dev.vality.newway.dao.invoicing.iface.PaymentDao;
import dev.vality.newway.domain.tables.pojos.Payment;
+import dev.vality.newway.domain.tables.records.PaymentRecord;
import dev.vality.newway.exception.DaoException;
import dev.vality.newway.exception.NotFoundException;
-import dev.vality.newway.model.InvoicingKey;
import org.jooq.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.RowMapper;
-import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
import javax.validation.constraints.NotNull;
-import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -37,22 +35,7 @@ public PaymentDaoImpl(DataSource dataSource) {
public void saveBatch(List payments) throws DaoException {
List queries = payments.stream()
.map(payment -> getDslContext().newRecord(PAYMENT, payment))
- .map(paymentRecord -> getDslContext().insertInto(PAYMENT)
- .set(paymentRecord)
- .onConflict(PAYMENT.INVOICE_ID, PAYMENT.SEQUENCE_ID, PAYMENT.CHANGE_ID)
- .doNothing()
- )
- .collect(Collectors.toList());
- batchExecute(queries);
- }
-
- @Override
- public void updateBatch(List payments) throws DaoException {
- List queries = payments.stream()
- .map(payment -> getDslContext().newRecord(PAYMENT, payment))
- .map(paymentRecord -> getDslContext().update(PAYMENT)
- .set(paymentRecord)
- .where(PAYMENT.ID.eq(paymentRecord.getId())))
+ .map(this::prepareInsertQuery)
.collect(Collectors.toList());
batchExecute(queries);
}
@@ -62,24 +45,22 @@ public void updateBatch(List payments) throws DaoException {
public Payment get(String invoiceId, String paymentId) throws DaoException {
Query query = getDslContext().selectFrom(PAYMENT)
.where(PAYMENT.INVOICE_ID.eq(invoiceId)
- .and(PAYMENT.PAYMENT_ID.eq(paymentId))
- .and(PAYMENT.CURRENT));
-
+ .and(PAYMENT.PAYMENT_ID.eq(paymentId)));
return Optional.ofNullable(fetchOne(query, paymentRowMapper))
.orElseThrow(() -> new NotFoundException(
String.format("Payment not found, invoiceId='%s', paymentId='%s'", invoiceId, paymentId)));
}
- @Override
- public void switchCurrent(Collection paymentsSwitchIds) throws DaoException {
- paymentsSwitchIds.forEach(ik ->
- this.getNamedParameterJdbcTemplate()
- .update("update nw.payment set current = false " +
- "where invoice_id =:invoice_id and payment_id=:payment_id and current;" +
- "update nw.payment set current = true " +
- "where id = (select max(id) from nw.payment where invoice_id =:invoice_id " +
- "and payment_id=:payment_id);",
- new MapSqlParameterSource("invoice_id", ik.getInvoiceId())
- .addValue("payment_id", ik.getPaymentId())));
+ private Query prepareInsertQuery(PaymentRecord paymentRecord) {
+ return getDslContext().insertInto(PAYMENT)
+ .set(paymentRecord)
+ .onConflict(
+ PAYMENT.INVOICE_ID,
+ PAYMENT.PAYMENT_ID,
+ PAYMENT.SEQUENCE_ID,
+ PAYMENT.CHANGE_ID
+ )
+ .doNothing();
}
+
}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentFeeDaoImpl.java b/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentFeeDaoImpl.java
new file mode 100644
index 00000000..fd5d0b16
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentFeeDaoImpl.java
@@ -0,0 +1,94 @@
+package dev.vality.newway.dao.invoicing.impl;
+
+import dev.vality.dao.impl.AbstractGenericDao;
+import dev.vality.mapper.RecordRowMapper;
+import dev.vality.newway.dao.invoicing.iface.PaymentFeeDao;
+import dev.vality.newway.domain.tables.pojos.PaymentFee;
+import dev.vality.newway.domain.tables.records.PaymentFeeRecord;
+import dev.vality.newway.exception.DaoException;
+import dev.vality.newway.exception.NotFoundException;
+import dev.vality.newway.model.InvoicingKey;
+import org.jooq.Query;
+import org.jooq.impl.DSL;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static dev.vality.newway.domain.tables.PaymentFee.PAYMENT_FEE;
+
+@Component
+public class PaymentFeeDaoImpl extends AbstractGenericDao implements PaymentFeeDao {
+
+ private final RowMapper rowMapper;
+
+ public PaymentFeeDaoImpl(DataSource dataSource) {
+ super(dataSource);
+ this.rowMapper = new RecordRowMapper<>(PAYMENT_FEE, PaymentFee.class);
+ }
+
+ @Override
+ public void saveBatch(List paymentFees) throws DaoException {
+ List queries = paymentFees.stream()
+ .map(statusInfo -> getDslContext().newRecord(PAYMENT_FEE, statusInfo))
+ .map(this::prepareInsertQuery)
+ .collect(Collectors.toList());
+ batchExecute(queries);
+ }
+
+ @Override
+ public PaymentFee get(String invoiceId, String paymentId) throws DaoException {
+ Query query = getDslContext().selectFrom(PAYMENT_FEE)
+ .where(PAYMENT_FEE.INVOICE_ID.eq(invoiceId)
+ .and(PAYMENT_FEE.PAYMENT_ID.eq(paymentId))
+ .and(PAYMENT_FEE.CURRENT)
+ );
+ return Optional.ofNullable(fetchOne(query, rowMapper)).orElseThrow(() ->
+ new NotFoundException("PaymentFee not found, invoiceId=" + invoiceId + " paymentId=" + paymentId));
+ }
+
+ @Override
+ public void switchCurrent(Set invoicingKeys) throws DaoException {
+ invoicingKeys.forEach(key -> {
+ setOldPaymentFeeNotCurrent(key);
+ setLatestPaymentFeeCurrent(key);
+ });
+ }
+
+ private Query prepareInsertQuery(PaymentFeeRecord record) {
+ return getDslContext().insertInto(PAYMENT_FEE)
+ .set(record)
+ .onConflict(
+ PAYMENT_FEE.INVOICE_ID,
+ PAYMENT_FEE.PAYMENT_ID,
+ PAYMENT_FEE.SEQUENCE_ID,
+ PAYMENT_FEE.CHANGE_ID
+ )
+ .doNothing();
+ }
+
+ private void setOldPaymentFeeNotCurrent(InvoicingKey key) {
+ execute(getDslContext().update(PAYMENT_FEE)
+ .set(PAYMENT_FEE.CURRENT, false)
+ .where(PAYMENT_FEE.INVOICE_ID.eq(key.getInvoiceId())
+ .and(PAYMENT_FEE.PAYMENT_ID.eq(key.getPaymentId()))
+ .and(PAYMENT_FEE.CURRENT))
+ );
+ }
+
+ private void setLatestPaymentFeeCurrent(InvoicingKey key) {
+ execute(getDslContext().update(PAYMENT_FEE)
+ .set(PAYMENT_FEE.CURRENT, true)
+ .where(PAYMENT_FEE.ID.eq(
+ DSL.select(DSL.max(PAYMENT_FEE.ID))
+ .from(PAYMENT_FEE)
+ .where(PAYMENT_FEE.INVOICE_ID.eq(key.getInvoiceId())
+ .and(PAYMENT_FEE.PAYMENT_ID.eq(key.getPaymentId())))
+ ))
+ );
+ }
+}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentPayerInfoDaoImpl.java b/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentPayerInfoDaoImpl.java
new file mode 100644
index 00000000..71f65ed9
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentPayerInfoDaoImpl.java
@@ -0,0 +1,60 @@
+package dev.vality.newway.dao.invoicing.impl;
+
+import dev.vality.dao.impl.AbstractGenericDao;
+import dev.vality.mapper.RecordRowMapper;
+import dev.vality.newway.dao.invoicing.iface.PaymentPayerInfoDao;
+import dev.vality.newway.domain.tables.pojos.PaymentPayerInfo;
+import dev.vality.newway.domain.tables.records.PaymentPayerInfoRecord;
+import dev.vality.newway.exception.DaoException;
+import dev.vality.newway.exception.NotFoundException;
+import org.jooq.Query;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import static dev.vality.newway.domain.tables.PaymentPayerInfo.PAYMENT_PAYER_INFO;
+
+@Component
+public class PaymentPayerInfoDaoImpl extends AbstractGenericDao implements PaymentPayerInfoDao {
+
+ private final RowMapper rowMapper;
+
+ public PaymentPayerInfoDaoImpl(DataSource dataSource) {
+ super(dataSource);
+ this.rowMapper = new RecordRowMapper<>(PAYMENT_PAYER_INFO, PaymentPayerInfo.class);
+ }
+
+ @Override
+ public void saveBatch(List payerInfos) throws DaoException {
+ List queries = payerInfos.stream()
+ .map(statusInfo -> getDslContext().newRecord(PAYMENT_PAYER_INFO, statusInfo))
+ .map(this::prepareInsertQuery)
+ .collect(Collectors.toList());
+ batchExecute(queries);
+ }
+
+ @Override
+ public PaymentPayerInfo get(String invoiceId, String paymentId) throws DaoException {
+ Query query = getDslContext().selectFrom(PAYMENT_PAYER_INFO)
+ .where(PAYMENT_PAYER_INFO.INVOICE_ID.eq(invoiceId)
+ .and(PAYMENT_PAYER_INFO.PAYMENT_ID.eq(paymentId)));
+ return Optional.ofNullable(fetchOne(query, rowMapper)).orElseThrow(() ->
+ new NotFoundException("PaymentPayerInfo not found, invoiceId=" + invoiceId + " paymentId=" + paymentId));
+ }
+
+ private Query prepareInsertQuery(PaymentPayerInfoRecord record) {
+ return getDslContext().insertInto(PAYMENT_PAYER_INFO)
+ .set(record)
+ .onConflict(
+ PAYMENT_PAYER_INFO.INVOICE_ID,
+ PAYMENT_PAYER_INFO.PAYMENT_ID,
+ PAYMENT_PAYER_INFO.SEQUENCE_ID,
+ PAYMENT_PAYER_INFO.CHANGE_ID
+ )
+ .doNothing();
+ }
+}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentRecurrentInfoDaoImpl.java b/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentRecurrentInfoDaoImpl.java
new file mode 100644
index 00000000..d6eed7c6
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentRecurrentInfoDaoImpl.java
@@ -0,0 +1,93 @@
+package dev.vality.newway.dao.invoicing.impl;
+
+import dev.vality.dao.impl.AbstractGenericDao;
+import dev.vality.mapper.RecordRowMapper;
+import dev.vality.newway.dao.invoicing.iface.PaymentRecurrentInfoDao;
+import dev.vality.newway.domain.tables.pojos.PaymentRecurrentInfo;
+import dev.vality.newway.domain.tables.records.PaymentRecurrentInfoRecord;
+import dev.vality.newway.exception.DaoException;
+import dev.vality.newway.exception.NotFoundException;
+import dev.vality.newway.model.InvoicingKey;
+import org.jooq.Query;
+import org.jooq.impl.DSL;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static dev.vality.newway.domain.tables.PaymentRecurrentInfo.PAYMENT_RECURRENT_INFO;
+
+@Component
+public class PaymentRecurrentInfoDaoImpl extends AbstractGenericDao implements PaymentRecurrentInfoDao {
+
+ private final RowMapper rowMapper;
+
+ public PaymentRecurrentInfoDaoImpl(DataSource dataSource) {
+ super(dataSource);
+ this.rowMapper = new RecordRowMapper<>(PAYMENT_RECURRENT_INFO, PaymentRecurrentInfo.class);
+ }
+
+ @Override
+ public void saveBatch(List paymentRecurrentInfos) throws DaoException {
+ List queries = paymentRecurrentInfos.stream()
+ .map(statusInfo -> getDslContext().newRecord(PAYMENT_RECURRENT_INFO, statusInfo))
+ .map(this::prepareInsertQuery)
+ .collect(Collectors.toList());
+ batchExecute(queries);
+ }
+
+ @Override
+ public PaymentRecurrentInfo get(String invoiceId, String paymentId) throws DaoException {
+ Query query = getDslContext().selectFrom(PAYMENT_RECURRENT_INFO)
+ .where(PAYMENT_RECURRENT_INFO.INVOICE_ID.eq(invoiceId)
+ .and(PAYMENT_RECURRENT_INFO.PAYMENT_ID.eq(paymentId))
+ .and(PAYMENT_RECURRENT_INFO.CURRENT));
+ return Optional.ofNullable(fetchOne(query, rowMapper)).orElseThrow(() ->
+ new NotFoundException("PaymentPayerInfo not found, invoiceId=" + invoiceId + " paymentId=" + paymentId));
+ }
+
+ @Override
+ public void switchCurrent(Set invoicesSwitchIds) throws DaoException {
+ invoicesSwitchIds.forEach(key -> {
+ setOldRecurrentInfoNotCurrent(key);
+ setLatestRecurrentInfoCurrent(key);
+ });
+ }
+
+ private Query prepareInsertQuery(PaymentRecurrentInfoRecord record) {
+ return getDslContext().insertInto(PAYMENT_RECURRENT_INFO)
+ .set(record)
+ .onConflict(
+ PAYMENT_RECURRENT_INFO.INVOICE_ID,
+ PAYMENT_RECURRENT_INFO.PAYMENT_ID,
+ PAYMENT_RECURRENT_INFO.SEQUENCE_ID,
+ PAYMENT_RECURRENT_INFO.CHANGE_ID
+ )
+ .doNothing();
+ }
+
+ private void setOldRecurrentInfoNotCurrent(InvoicingKey key) {
+ execute(getDslContext().update(PAYMENT_RECURRENT_INFO)
+ .set(PAYMENT_RECURRENT_INFO.CURRENT, false)
+ .where(PAYMENT_RECURRENT_INFO.INVOICE_ID.eq(key.getInvoiceId())
+ .and(PAYMENT_RECURRENT_INFO.PAYMENT_ID.eq(key.getPaymentId()))
+ .and(PAYMENT_RECURRENT_INFO.CURRENT))
+ );
+ }
+
+ private void setLatestRecurrentInfoCurrent(InvoicingKey key) {
+ execute(getDslContext().update(PAYMENT_RECURRENT_INFO)
+ .set(PAYMENT_RECURRENT_INFO.CURRENT, true)
+ .where(PAYMENT_RECURRENT_INFO.ID.eq(
+ DSL.select(DSL.max(PAYMENT_RECURRENT_INFO.ID))
+ .from(PAYMENT_RECURRENT_INFO)
+ .where(PAYMENT_RECURRENT_INFO.INVOICE_ID.eq(key.getInvoiceId())
+ .and(PAYMENT_RECURRENT_INFO.PAYMENT_ID.eq(key.getPaymentId())))
+ ))
+ );
+ }
+}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentRiskDataDaoImpl.java b/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentRiskDataDaoImpl.java
new file mode 100644
index 00000000..3811b5ec
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentRiskDataDaoImpl.java
@@ -0,0 +1,94 @@
+package dev.vality.newway.dao.invoicing.impl;
+
+import dev.vality.dao.impl.AbstractGenericDao;
+import dev.vality.mapper.RecordRowMapper;
+import dev.vality.newway.dao.invoicing.iface.PaymentRiskDataDao;
+import dev.vality.newway.domain.tables.pojos.PaymentRiskData;
+import dev.vality.newway.domain.tables.records.PaymentRiskDataRecord;
+import dev.vality.newway.exception.DaoException;
+import dev.vality.newway.exception.NotFoundException;
+import dev.vality.newway.model.InvoicingKey;
+import org.jooq.Query;
+import org.jooq.impl.DSL;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static dev.vality.newway.domain.tables.PaymentRiskData.PAYMENT_RISK_DATA;
+
+@Component
+public class PaymentRiskDataDaoImpl extends AbstractGenericDao implements PaymentRiskDataDao {
+
+ private final RowMapper rowMapper;
+
+ public PaymentRiskDataDaoImpl(DataSource dataSource) {
+ super(dataSource);
+ this.rowMapper = new RecordRowMapper<>(PAYMENT_RISK_DATA, PaymentRiskData.class);
+ }
+
+ @Override
+ public void saveBatch(List paymentRiskDataList) throws DaoException {
+ List queries = paymentRiskDataList.stream()
+ .map(statusInfo -> getDslContext().newRecord(PAYMENT_RISK_DATA, statusInfo))
+ .map(this::prepareInsertQuery)
+ .collect(Collectors.toList());
+ batchExecute(queries);
+ }
+
+ @Override
+ public PaymentRiskData get(String invoiceId, String paymentId) throws DaoException {
+ Query query = getDslContext().selectFrom(PAYMENT_RISK_DATA)
+ .where(PAYMENT_RISK_DATA.INVOICE_ID.eq(invoiceId)
+ .and(PAYMENT_RISK_DATA.PAYMENT_ID.eq(paymentId))
+ .and(PAYMENT_RISK_DATA.CURRENT)
+ );
+ return Optional.ofNullable(fetchOne(query, rowMapper)).orElseThrow(() ->
+ new NotFoundException("PaymentRiskData not found, invoiceId=" + invoiceId + " paymentId=" + paymentId));
+ }
+
+ @Override
+ public void switchCurrent(Set invoicingKeys) throws DaoException {
+ invoicingKeys.forEach(key -> {
+ setOldRiskDataNotCurrent(key);
+ setLatestRiskDataCurrent(key);
+ });
+ }
+
+ private Query prepareInsertQuery(PaymentRiskDataRecord record) {
+ return getDslContext().insertInto(PAYMENT_RISK_DATA)
+ .set(record)
+ .onConflict(
+ PAYMENT_RISK_DATA.INVOICE_ID,
+ PAYMENT_RISK_DATA.PAYMENT_ID,
+ PAYMENT_RISK_DATA.SEQUENCE_ID,
+ PAYMENT_RISK_DATA.CHANGE_ID
+ )
+ .doNothing();
+ }
+
+ private void setOldRiskDataNotCurrent(InvoicingKey key) {
+ execute(getDslContext().update(PAYMENT_RISK_DATA)
+ .set(PAYMENT_RISK_DATA.CURRENT, false)
+ .where(PAYMENT_RISK_DATA.INVOICE_ID.eq(key.getInvoiceId())
+ .and(PAYMENT_RISK_DATA.PAYMENT_ID.eq(key.getPaymentId()))
+ .and(PAYMENT_RISK_DATA.CURRENT))
+ );
+ }
+
+ private void setLatestRiskDataCurrent(InvoicingKey key) {
+ execute(getDslContext().update(PAYMENT_RISK_DATA)
+ .set(PAYMENT_RISK_DATA.CURRENT, true)
+ .where(PAYMENT_RISK_DATA.ID.eq(
+ DSL.select(DSL.max(PAYMENT_RISK_DATA.ID))
+ .from(PAYMENT_RISK_DATA)
+ .where(PAYMENT_RISK_DATA.INVOICE_ID.eq(key.getInvoiceId())
+ .and(PAYMENT_RISK_DATA.PAYMENT_ID.eq(key.getPaymentId())))
+ ))
+ );
+ }
+}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentRouteDaoImpl.java b/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentRouteDaoImpl.java
new file mode 100644
index 00000000..cd182e4a
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentRouteDaoImpl.java
@@ -0,0 +1,94 @@
+package dev.vality.newway.dao.invoicing.impl;
+
+import dev.vality.dao.impl.AbstractGenericDao;
+import dev.vality.mapper.RecordRowMapper;
+import dev.vality.newway.dao.invoicing.iface.PaymentRouteDao;
+import dev.vality.newway.domain.tables.pojos.PaymentRoute;
+import dev.vality.newway.domain.tables.records.PaymentRouteRecord;
+import dev.vality.newway.exception.DaoException;
+import dev.vality.newway.exception.NotFoundException;
+import dev.vality.newway.model.InvoicingKey;
+import org.jooq.Query;
+import org.jooq.impl.DSL;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static dev.vality.newway.domain.tables.PaymentRoute.PAYMENT_ROUTE;
+
+@Component
+public class PaymentRouteDaoImpl extends AbstractGenericDao implements PaymentRouteDao {
+
+ private final RowMapper rowMapper;
+
+ public PaymentRouteDaoImpl(DataSource dataSource) {
+ super(dataSource);
+ this.rowMapper = new RecordRowMapper<>(PAYMENT_ROUTE, PaymentRoute.class);
+ }
+
+ @Override
+ public void saveBatch(List paymentRoutes) throws DaoException {
+ List queries = paymentRoutes.stream()
+ .map(statusInfo -> getDslContext().newRecord(PAYMENT_ROUTE, statusInfo))
+ .map(this::prepareInsertQuery)
+ .collect(Collectors.toList());
+ batchExecute(queries);
+ }
+
+ @Override
+ public PaymentRoute get(String invoiceId, String paymentId) throws DaoException {
+ Query query = getDslContext().selectFrom(PAYMENT_ROUTE)
+ .where(PAYMENT_ROUTE.INVOICE_ID.eq(invoiceId)
+ .and(PAYMENT_ROUTE.PAYMENT_ID.eq(paymentId))
+ .and(PAYMENT_ROUTE.CURRENT)
+ );
+ return Optional.ofNullable(fetchOne(query, rowMapper)).orElseThrow(() ->
+ new NotFoundException("PaymentRoute not found, invoiceId=" + invoiceId + " paymentId=" + paymentId));
+ }
+
+ @Override
+ public void switchCurrent(Set invoicingKeys) throws DaoException {
+ invoicingKeys.forEach(key -> {
+ setOldRouteNotCurrent(key);
+ setLatestRouteCurrent(key);
+ });
+ }
+
+ private void setOldRouteNotCurrent(InvoicingKey key) {
+ execute(getDslContext().update(PAYMENT_ROUTE)
+ .set(PAYMENT_ROUTE.CURRENT, false)
+ .where(PAYMENT_ROUTE.INVOICE_ID.eq(key.getInvoiceId())
+ .and(PAYMENT_ROUTE.PAYMENT_ID.eq(key.getPaymentId()))
+ .and(PAYMENT_ROUTE.CURRENT))
+ );
+ }
+
+ private void setLatestRouteCurrent(InvoicingKey key) {
+ execute(getDslContext().update(PAYMENT_ROUTE)
+ .set(PAYMENT_ROUTE.CURRENT, true)
+ .where(PAYMENT_ROUTE.ID.eq(
+ DSL.select(DSL.max(PAYMENT_ROUTE.ID))
+ .from(PAYMENT_ROUTE)
+ .where(PAYMENT_ROUTE.INVOICE_ID.eq(key.getInvoiceId())
+ .and(PAYMENT_ROUTE.PAYMENT_ID.eq(key.getPaymentId())))
+ ))
+ );
+ }
+
+ private Query prepareInsertQuery(PaymentRouteRecord record) {
+ return getDslContext().insertInto(PAYMENT_ROUTE)
+ .set(record)
+ .onConflict(
+ PAYMENT_ROUTE.INVOICE_ID,
+ PAYMENT_ROUTE.PAYMENT_ID,
+ PAYMENT_ROUTE.SEQUENCE_ID,
+ PAYMENT_ROUTE.CHANGE_ID
+ )
+ .doNothing();
+ }
+}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentSessionInfoDaoImpl.java b/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentSessionInfoDaoImpl.java
new file mode 100644
index 00000000..b36f7372
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentSessionInfoDaoImpl.java
@@ -0,0 +1,63 @@
+package dev.vality.newway.dao.invoicing.impl;
+
+import dev.vality.dao.impl.AbstractGenericDao;
+import dev.vality.mapper.RecordRowMapper;
+import dev.vality.newway.dao.invoicing.iface.PaymentSessionInfoDao;
+import dev.vality.newway.domain.tables.pojos.PaymentSessionInfo;
+import dev.vality.newway.domain.tables.records.PaymentSessionInfoRecord;
+import dev.vality.newway.exception.DaoException;
+import dev.vality.newway.exception.NotFoundException;
+import org.jooq.Query;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import static dev.vality.newway.domain.tables.PaymentSessionInfo.PAYMENT_SESSION_INFO;
+
+@Component
+public class PaymentSessionInfoDaoImpl extends AbstractGenericDao implements PaymentSessionInfoDao {
+
+ private final RowMapper rowMapper;
+
+ public PaymentSessionInfoDaoImpl(DataSource dataSource) {
+ super(dataSource);
+ this.rowMapper = new RecordRowMapper<>(PAYMENT_SESSION_INFO, PaymentSessionInfo.class);
+ }
+
+ @Override
+ public void saveBatch(List paymentSessionInfos) throws DaoException {
+ List queries = paymentSessionInfos.stream()
+ .map(statusInfo -> getDslContext().newRecord(PAYMENT_SESSION_INFO, statusInfo))
+ .map(this::prepareInsertQuery)
+ .collect(Collectors.toList());
+ batchExecute(queries);
+ }
+
+ @Override
+ public PaymentSessionInfo get(String invoiceId, String paymentId) throws DaoException {
+ Query query = getDslContext().selectFrom(PAYMENT_SESSION_INFO)
+ .where(PAYMENT_SESSION_INFO.INVOICE_ID.eq(invoiceId)
+ .and(PAYMENT_SESSION_INFO.PAYMENT_ID.eq(paymentId)));
+ return Optional.ofNullable(fetchOne(query, rowMapper)).orElseThrow(() ->
+ new NotFoundException(
+ "PaymentPayerInfo not found, invoiceId=" + invoiceId + " paymentId=" + paymentId));
+ }
+
+
+ private Query prepareInsertQuery(PaymentSessionInfoRecord record) {
+ return getDslContext().insertInto(PAYMENT_SESSION_INFO)
+ .set(record)
+ .onConflict(
+ PAYMENT_SESSION_INFO.INVOICE_ID,
+ PAYMENT_SESSION_INFO.PAYMENT_ID,
+ PAYMENT_SESSION_INFO.SEQUENCE_ID,
+ PAYMENT_SESSION_INFO.CHANGE_ID
+ )
+ .doNothing();
+ }
+
+}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentStatusInfoDaoImpl.java b/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentStatusInfoDaoImpl.java
new file mode 100644
index 00000000..3d7f1745
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/invoicing/impl/PaymentStatusInfoDaoImpl.java
@@ -0,0 +1,95 @@
+package dev.vality.newway.dao.invoicing.impl;
+
+import dev.vality.dao.impl.AbstractGenericDao;
+import dev.vality.mapper.RecordRowMapper;
+import dev.vality.newway.dao.invoicing.iface.PaymentStatusInfoDao;
+import dev.vality.newway.domain.tables.pojos.PaymentStatusInfo;
+import dev.vality.newway.domain.tables.records.PaymentStatusInfoRecord;
+import dev.vality.newway.exception.DaoException;
+import dev.vality.newway.exception.NotFoundException;
+import dev.vality.newway.model.InvoicingKey;
+import org.jooq.Query;
+import org.jooq.impl.DSL;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static dev.vality.newway.domain.tables.PaymentStatusInfo.PAYMENT_STATUS_INFO;
+
+@Component
+public class PaymentStatusInfoDaoImpl extends AbstractGenericDao implements PaymentStatusInfoDao {
+
+ private final RowMapper rowMapper;
+
+ public PaymentStatusInfoDaoImpl(DataSource dataSource) {
+ super(dataSource);
+ this.rowMapper = new RecordRowMapper<>(PAYMENT_STATUS_INFO, PaymentStatusInfo.class);
+ }
+
+ // TODO: try with resources?
+
+ @Override
+ public void saveBatch(List paymentStatusInfos) throws DaoException {
+ List queries = paymentStatusInfos.stream()
+ .map(statusInfo -> getDslContext().newRecord(PAYMENT_STATUS_INFO, statusInfo))
+ .map(this::prepareInsertQuery)
+ .collect(Collectors.toList());
+ batchExecute(queries);
+ }
+
+ @Override
+ public PaymentStatusInfo get(String invoiceId, String paymentId) throws DaoException {
+ Query query = getDslContext().selectFrom(PAYMENT_STATUS_INFO)
+ .where(PAYMENT_STATUS_INFO.INVOICE_ID.eq(invoiceId)
+ .and(PAYMENT_STATUS_INFO.PAYMENT_ID.eq(paymentId))
+ .and(PAYMENT_STATUS_INFO.CURRENT));
+ return Optional.ofNullable(fetchOne(query, rowMapper)).orElseThrow(() ->
+ new NotFoundException("PaymentStatusInfo not found, invoiceId=" + invoiceId + " paymentId=" + paymentId));
+ }
+
+ @Override
+ public void switchCurrent(Set invoicesSwitchIds) throws DaoException {
+ invoicesSwitchIds.forEach(key -> {
+ setOldStatusInfoNotCurrent(key);
+ setLatestStatusInfoCurrent(key);
+ });
+ }
+
+ private Query prepareInsertQuery(PaymentStatusInfoRecord record) {
+ return getDslContext().insertInto(PAYMENT_STATUS_INFO)
+ .set(record)
+ .onConflict(
+ PAYMENT_STATUS_INFO.INVOICE_ID,
+ PAYMENT_STATUS_INFO.PAYMENT_ID,
+ PAYMENT_STATUS_INFO.SEQUENCE_ID,
+ PAYMENT_STATUS_INFO.CHANGE_ID
+ )
+ .doNothing();
+ }
+
+ private void setOldStatusInfoNotCurrent(InvoicingKey key) {
+ execute(getDslContext().update(PAYMENT_STATUS_INFO)
+ .set(PAYMENT_STATUS_INFO.CURRENT, false)
+ .where(PAYMENT_STATUS_INFO.INVOICE_ID.eq(key.getInvoiceId())
+ .and(PAYMENT_STATUS_INFO.PAYMENT_ID.eq(key.getPaymentId()))
+ .and(PAYMENT_STATUS_INFO.CURRENT))
+ );
+ }
+
+ private void setLatestStatusInfoCurrent(InvoicingKey key) {
+ execute(getDslContext().update(PAYMENT_STATUS_INFO)
+ .set(PAYMENT_STATUS_INFO.CURRENT, true)
+ .where(PAYMENT_STATUS_INFO.ID.eq(
+ DSL.select(DSL.max(PAYMENT_STATUS_INFO.ID))
+ .from(PAYMENT_STATUS_INFO)
+ .where(PAYMENT_STATUS_INFO.INVOICE_ID.eq(key.getInvoiceId())
+ .and(PAYMENT_STATUS_INFO.PAYMENT_ID.eq(key.getPaymentId())))
+ ))
+ );
+ }
+}
diff --git a/src/main/java/dev/vality/newway/dao/invoicing/impl/RefundDaoImpl.java b/src/main/java/dev/vality/newway/dao/invoicing/impl/RefundDaoImpl.java
index 7ef47d39..ce1b32cb 100644
--- a/src/main/java/dev/vality/newway/dao/invoicing/impl/RefundDaoImpl.java
+++ b/src/main/java/dev/vality/newway/dao/invoicing/impl/RefundDaoImpl.java
@@ -64,16 +64,28 @@ public void updateCommissions(Long rfndId) throws DaoException {
MapSqlParameterSource params =
new MapSqlParameterSource("rfndId", rfndId).addValue("objType", PaymentChangeType.refund.name());
this.getNamedParameterJdbcTemplate().update(
- "UPDATE nw.refund SET fee = (SELECT nw.get_refund_fee(nw.cash_flow.*) " +
- "FROM nw.cash_flow WHERE obj_id = :rfndId " +
- "AND obj_type = CAST(:objType as nw.payment_change_type)), " +
- "provider_fee = (SELECT nw.get_refund_provider_fee(nw.cash_flow.*) " +
- "FROM nw.cash_flow WHERE obj_id = :rfndId " +
- "AND obj_type = CAST(:objType as nw.payment_change_type)), " +
- "external_fee = (SELECT nw.get_refund_external_fee(nw.cash_flow.*) " +
- "FROM nw.cash_flow WHERE obj_id = :rfndId " +
- "AND obj_type = CAST(:objType as nw.payment_change_type)) " +
- "WHERE id = :rfndId",
+ """
+ UPDATE dw.refund
+ SET
+ fee = (
+ SELECT dw.get_refund_fee(dw.cash_flow.*)
+ FROM dw.cash_flow
+ WHERE obj_id = :rfndId
+ AND obj_type = CAST(:objType as dw.payment_change_type)
+ ),
+ provider_fee = (
+ SELECT dw.get_refund_provider_fee(dw.cash_flow.*)
+ FROM dw.cash_flow
+ WHERE obj_id = :rfndId
+ AND obj_type = CAST(:objType as dw.payment_change_type)
+ ),
+ external_fee = (
+ SELECT dw.get_refund_external_fee(dw.cash_flow.*)
+ FROM dw.cash_flow
+ WHERE obj_id = :rfndId
+ AND obj_type = CAST(:objType as dw.payment_change_type)
+ )
+ WHERE id = :rfndId""",
params);
}
diff --git a/src/main/java/dev/vality/newway/dao/limiter/LimitConfigDao.java b/src/main/java/dev/vality/newway/dao/limiter/LimitConfigDao.java
new file mode 100644
index 00000000..128c1eca
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/limiter/LimitConfigDao.java
@@ -0,0 +1,15 @@
+package dev.vality.newway.dao.limiter;
+
+import dev.vality.dao.GenericDao;
+import dev.vality.newway.domain.tables.pojos.LimitConfig;
+import dev.vality.newway.exception.DaoException;
+
+import java.util.Optional;
+
+public interface LimitConfigDao extends GenericDao {
+
+ Optional save(LimitConfig limitConfig) throws DaoException;
+
+ void updateNotCurrent(Long id) throws DaoException;
+
+}
diff --git a/src/main/java/dev/vality/newway/dao/limiter/LimitConfigDaoImpl.java b/src/main/java/dev/vality/newway/dao/limiter/LimitConfigDaoImpl.java
new file mode 100644
index 00000000..87fc02ad
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/limiter/LimitConfigDaoImpl.java
@@ -0,0 +1,49 @@
+package dev.vality.newway.dao.limiter;
+
+import dev.vality.dao.impl.AbstractGenericDao;
+import dev.vality.mapper.RecordRowMapper;
+import dev.vality.newway.domain.tables.pojos.LimitConfig;
+import dev.vality.newway.exception.DaoException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.jdbc.support.GeneratedKeyHolder;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.Optional;
+
+import static dev.vality.newway.domain.Tables.LIMIT_CONFIG;
+
+@Component
+public class LimitConfigDaoImpl extends AbstractGenericDao implements LimitConfigDao {
+
+ private final RowMapper limitConfigRowMapper;
+
+ @Autowired
+ public LimitConfigDaoImpl(DataSource dataSource) {
+ super(dataSource);
+ limitConfigRowMapper = new RecordRowMapper<>(LIMIT_CONFIG, LimitConfig.class);
+ }
+
+ @Override
+ public Optional save(LimitConfig limitConfig) throws DaoException {
+ var limitConfigRecord = getDslContext().newRecord(LIMIT_CONFIG, limitConfig);
+ var query = getDslContext()
+ .insertInto(LIMIT_CONFIG)
+ .set(limitConfigRecord)
+ .onConflict(LIMIT_CONFIG.LIMIT_CONFIG_ID, LIMIT_CONFIG.SEQUENCE_ID)
+ .doNothing()
+ .returning(LIMIT_CONFIG.ID);
+ GeneratedKeyHolder keyHolder = new GeneratedKeyHolder();
+ execute(query, keyHolder);
+ return Optional.ofNullable(keyHolder.getKey()).map(Number::longValue);
+ }
+
+ @Override
+ public void updateNotCurrent(Long id) throws DaoException {
+ var query = getDslContext().update(LIMIT_CONFIG).set(LIMIT_CONFIG.CURRENT, false)
+ .where(LIMIT_CONFIG.ID.eq(id)
+ .and(LIMIT_CONFIG.CURRENT));
+ executeOne(query);
+ }
+}
diff --git a/src/main/java/dev/vality/newway/dao/party/impl/RevisionDaoImpl.java b/src/main/java/dev/vality/newway/dao/party/impl/RevisionDaoImpl.java
index 15332d70..e5ba6c0c 100644
--- a/src/main/java/dev/vality/newway/dao/party/impl/RevisionDaoImpl.java
+++ b/src/main/java/dev/vality/newway/dao/party/impl/RevisionDaoImpl.java
@@ -17,8 +17,8 @@ public RevisionDaoImpl(DataSource dataSource) {
@Override
public void saveShopsRevision(String partyId, long revision) throws DaoException {
- getNamedParameterJdbcTemplate().update("insert into nw.shop_revision(obj_id, revision) " +
- "select id, :revision from nw.shop where party_id = :party_id and current",
+ getNamedParameterJdbcTemplate().update("insert into dw.shop_revision(obj_id, revision) " +
+ "select id, :revision from dw.shop where party_id = :party_id and current",
new MapSqlParameterSource()
.addValue("party_id", partyId)
.addValue("revision", revision));
@@ -26,8 +26,8 @@ public void saveShopsRevision(String partyId, long revision) throws DaoException
@Override
public void saveContractsRevision(String partyId, long revision) throws DaoException {
- getNamedParameterJdbcTemplate().update("insert into nw.contract_revision(obj_id, revision) " +
- "select id, :revision from nw.contract where party_id = :party_id and current",
+ getNamedParameterJdbcTemplate().update("insert into dw.contract_revision(obj_id, revision) " +
+ "select id, :revision from dw.contract where party_id = :party_id and current",
new MapSqlParameterSource()
.addValue("party_id", partyId)
.addValue("revision", revision));
@@ -35,8 +35,8 @@ public void saveContractsRevision(String partyId, long revision) throws DaoExcep
@Override
public void saveContractorsRevision(String partyId, long revision) throws DaoException {
- getNamedParameterJdbcTemplate().update("insert into nw.contractor_revision(obj_id, revision) " +
- "select id, :revision from nw.contractor where party_id = :party_id and current",
+ getNamedParameterJdbcTemplate().update("insert into dw.contractor_revision(obj_id, revision) " +
+ "select id, :revision from dw.contractor where party_id = :party_id and current",
new MapSqlParameterSource()
.addValue("party_id", partyId)
.addValue("revision", revision));
diff --git a/src/main/java/dev/vality/newway/dao/rate/impl/RateDaoImpl.java b/src/main/java/dev/vality/newway/dao/rate/impl/RateDaoImpl.java
index 8fbf84c3..6fcd54e3 100644
--- a/src/main/java/dev/vality/newway/dao/rate/impl/RateDaoImpl.java
+++ b/src/main/java/dev/vality/newway/dao/rate/impl/RateDaoImpl.java
@@ -42,7 +42,7 @@ public Long save(Rate rate) throws DaoException {
@Override
public List getIds(String sourceId) throws DaoException {
return this.getNamedParameterJdbcTemplate()
- .queryForList("select id from nw.rate where source_id=:source_id and current",
+ .queryForList("select id from dw.rate where source_id=:source_id and current",
new MapSqlParameterSource("source_id", sourceId), Long.class);
}
@@ -50,7 +50,7 @@ public List getIds(String sourceId) throws DaoException {
public void updateNotCurrent(List ids) throws DaoException {
if (ids != null && !ids.isEmpty()) {
this.getNamedParameterJdbcTemplate()
- .update("update nw.rate set current=false where id in (:ids)",
+ .update("update dw.rate set current=false where id in (:ids)",
new MapSqlParameterSource("ids", ids));
}
}
diff --git a/src/main/java/dev/vality/newway/dao/withdrawal/iface/WithdrawalAdjustmentDao.java b/src/main/java/dev/vality/newway/dao/withdrawal/iface/WithdrawalAdjustmentDao.java
new file mode 100644
index 00000000..c8793b43
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/withdrawal/iface/WithdrawalAdjustmentDao.java
@@ -0,0 +1,17 @@
+package dev.vality.newway.dao.withdrawal.iface;
+
+import dev.vality.dao.GenericDao;
+import dev.vality.newway.domain.tables.pojos.WithdrawalAdjustment;
+import dev.vality.newway.exception.DaoException;
+
+import java.util.Optional;
+
+public interface WithdrawalAdjustmentDao extends GenericDao {
+
+ Optional save(WithdrawalAdjustment withdrawalAdjustment) throws DaoException;
+
+ WithdrawalAdjustment getByIds(String withdrawalId, String withdrawalAdjustmentId) throws DaoException;
+
+ void updateNotCurrent(Long withdrawalAdjustmentId) throws DaoException;
+
+}
diff --git a/src/main/java/dev/vality/newway/dao/withdrawal/impl/WithdrawalAdjustmentDaoImpl.java b/src/main/java/dev/vality/newway/dao/withdrawal/impl/WithdrawalAdjustmentDaoImpl.java
new file mode 100644
index 00000000..210f5160
--- /dev/null
+++ b/src/main/java/dev/vality/newway/dao/withdrawal/impl/WithdrawalAdjustmentDaoImpl.java
@@ -0,0 +1,66 @@
+package dev.vality.newway.dao.withdrawal.impl;
+
+import dev.vality.dao.impl.AbstractGenericDao;
+import dev.vality.mapper.RecordRowMapper;
+import dev.vality.newway.dao.withdrawal.iface.WithdrawalAdjustmentDao;
+import dev.vality.newway.domain.tables.pojos.WithdrawalAdjustment;
+import dev.vality.newway.domain.tables.records.WithdrawalAdjustmentRecord;
+import dev.vality.newway.exception.DaoException;
+import dev.vality.newway.exception.NotFoundException;
+import org.jooq.Query;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.jdbc.support.GeneratedKeyHolder;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.Optional;
+
+import static dev.vality.newway.domain.tables.WithdrawalAdjustment.WITHDRAWAL_ADJUSTMENT;
+
+@Component
+public class WithdrawalAdjustmentDaoImpl extends AbstractGenericDao implements WithdrawalAdjustmentDao {
+
+ private final RowMapper withdrawalAdjustmentRowMapper;
+
+ @Autowired
+ public WithdrawalAdjustmentDaoImpl(DataSource dataSource) {
+ super(dataSource);
+ withdrawalAdjustmentRowMapper = new RecordRowMapper<>(WITHDRAWAL_ADJUSTMENT, WithdrawalAdjustment.class);
+ }
+
+ @Override
+ public Optional save(WithdrawalAdjustment withdrawalAdjustment) throws DaoException {
+ WithdrawalAdjustmentRecord adjustmentRecord = getDslContext().newRecord(WITHDRAWAL_ADJUSTMENT, withdrawalAdjustment);
+ Query query = getDslContext()
+ .insertInto(WITHDRAWAL_ADJUSTMENT)
+ .set(adjustmentRecord)
+ .onConflict(WITHDRAWAL_ADJUSTMENT.ADJUSTMENT_ID, WITHDRAWAL_ADJUSTMENT.WITHDRAWAL_ID, WITHDRAWAL_ADJUSTMENT.SEQUENCE_ID)
+ .doNothing()
+ .returning(WITHDRAWAL_ADJUSTMENT.ID);
+
+ GeneratedKeyHolder keyHolder = new GeneratedKeyHolder();
+ execute(query, keyHolder);
+ return Optional.ofNullable(keyHolder.getKey()).map(Number::longValue);
+ }
+
+ @Override
+ public WithdrawalAdjustment getByIds(String withdrawalId, String withdrawalAdjustmentId) throws DaoException {
+ Query query = getDslContext().selectFrom(WITHDRAWAL_ADJUSTMENT)
+ .where(WITHDRAWAL_ADJUSTMENT.ADJUSTMENT_ID.eq(withdrawalAdjustmentId)
+ .and(WITHDRAWAL_ADJUSTMENT.WITHDRAWAL_ID.eq(withdrawalId))
+ .and(WITHDRAWAL_ADJUSTMENT.CURRENT));
+ return Optional.ofNullable(fetchOne(query, withdrawalAdjustmentRowMapper))
+ .orElseThrow(() -> new NotFoundException(
+ String.format("WithdrawalAdjustment not found, withdrawalAdjustmentId='%s', withdrawalId='%s'",
+ withdrawalAdjustmentId, withdrawalId)));
+ }
+
+ @Override
+ public void updateNotCurrent(Long id) throws DaoException {
+ Query query = getDslContext().update(WITHDRAWAL_ADJUSTMENT).set(WITHDRAWAL_ADJUSTMENT.CURRENT, false)
+ .where(WITHDRAWAL_ADJUSTMENT.ID.eq(id)
+ .and(WITHDRAWAL_ADJUSTMENT.CURRENT));
+ execute(query);
+ }
+}
diff --git a/src/main/java/dev/vality/newway/factory/cash/flow/CashFlowFactory.java b/src/main/java/dev/vality/newway/factory/cash/flow/CashFlowFactory.java
new file mode 100644
index 00000000..44d8349c
--- /dev/null
+++ b/src/main/java/dev/vality/newway/factory/cash/flow/CashFlowFactory.java
@@ -0,0 +1,69 @@
+package dev.vality.newway.factory.cash.flow;
+
+import dev.vality.damsel.domain.FinalCashFlowAccount;
+import dev.vality.damsel.domain.FinalCashFlowPosting;
+import dev.vality.geck.common.util.TypeUtil;
+import dev.vality.newway.domain.enums.AdjustmentCashFlowType;
+import dev.vality.newway.domain.enums.PaymentChangeType;
+import dev.vality.newway.domain.tables.pojos.CashFlow;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class CashFlowFactory {
+
+ public static List build(List cashFlowPostings, Long objId,
+ PaymentChangeType paymentChangeType) {
+ return build(cashFlowPostings, objId, paymentChangeType, null);
+ }
+
+ public static List build(List cashFlowPostings, Long objId,
+ PaymentChangeType paymentChangeType,
+ AdjustmentCashFlowType adjustmentCashFlowType) {
+ return cashFlowPostings.stream().map(cf -> {
+ CashFlow pcf = new CashFlow();
+ pcf.setObjId(objId);
+ pcf.setObjType(paymentChangeType);
+ pcf.setAdjFlowType(adjustmentCashFlowType);
+ pcf.setSourceAccountType(getCashFlowAccountType(cf.getSource()));
+ pcf.setSourceAccountTypeValue(getCashFlowAccountTypeValue(cf.getSource()));
+ pcf.setSourceAccountId(cf.getSource().getAccountId());
+ pcf.setDestinationAccountType(getCashFlowAccountType(cf.getDestination()));
+ pcf.setDestinationAccountTypeValue(getCashFlowAccountTypeValue(cf.getDestination()));
+ pcf.setDestinationAccountId(cf.getDestination().getAccountId());
+ pcf.setAmount(cf.getVolume().getAmount());
+ pcf.setCurrencyCode(cf.getVolume().getCurrency().getSymbolicCode());
+ pcf.setDetails(cf.getDetails());
+ return pcf;
+ }).collect(Collectors.toList());
+ }
+
+ private static dev.vality.newway.domain.enums.CashFlowAccount getCashFlowAccountType(FinalCashFlowAccount cfa) {
+ dev.vality.newway.domain.enums.CashFlowAccount sourceAccountType =
+ TypeUtil.toEnumField(cfa.getAccountType().getSetField().getFieldName(), dev.vality.newway.domain.enums.CashFlowAccount.class);
+ if (sourceAccountType == null) {
+ throw new IllegalArgumentException("Illegal cash flow account type: " + cfa.getAccountType());
+ }
+ return sourceAccountType;
+ }
+
+ private static String getCashFlowAccountTypeValue(FinalCashFlowAccount cfa) {
+ if (cfa.getAccountType().isSetMerchant()) {
+ return cfa.getAccountType().getMerchant().name();
+ } else if (cfa.getAccountType().isSetProvider()) {
+ return cfa.getAccountType().getProvider().name();
+ } else if (cfa.getAccountType().isSetSystem()) {
+ return cfa.getAccountType().getSystem().name();
+ } else if (cfa.getAccountType().isSetExternal()) {
+ return cfa.getAccountType().getExternal().name();
+ } else if (cfa.getAccountType().isSetWallet()) {
+ return cfa.getAccountType().getWallet().name();
+ } else {
+ throw new IllegalArgumentException("Illegal cash flow account type: " + cfa.getAccountType());
+ }
+ }
+
+}
diff --git a/src/main/java/dev/vality/newway/factory/cash/flow/CashFlowLinkFactory.java b/src/main/java/dev/vality/newway/factory/cash/flow/CashFlowLinkFactory.java
new file mode 100644
index 00000000..00c727dd
--- /dev/null
+++ b/src/main/java/dev/vality/newway/factory/cash/flow/CashFlowLinkFactory.java
@@ -0,0 +1,26 @@
+package dev.vality.newway.factory.cash.flow;
+
+import dev.vality.newway.domain.tables.pojos.CashFlowLink;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class CashFlowLinkFactory {
+
+ public static CashFlowLink build(String paymentId,
+ String invoiceId,
+ LocalDateTime eventCreatedAt,
+ Integer changeId,
+ Long sequenceId) {
+ CashFlowLink link = new CashFlowLink();
+ link.setPaymentId(paymentId);
+ link.setInvoiceId(invoiceId);
+ link.setEventCreatedAt(eventCreatedAt);
+ link.setChangeId(changeId);
+ link.setSequenceId(sequenceId);
+ return link;
+ }
+
+}
diff --git a/src/main/java/dev/vality/newway/util/ContractorUtil.java b/src/main/java/dev/vality/newway/factory/contractor/ContractorFactory.java
similarity index 91%
rename from src/main/java/dev/vality/newway/util/ContractorUtil.java
rename to src/main/java/dev/vality/newway/factory/contractor/ContractorFactory.java
index 3ef2b4a8..2a31ff4b 100644
--- a/src/main/java/dev/vality/newway/util/ContractorUtil.java
+++ b/src/main/java/dev/vality/newway/factory/contractor/ContractorFactory.java
@@ -1,4 +1,4 @@
-package dev.vality.newway.util;
+package dev.vality.newway.factory.contractor;
import dev.vality.damsel.domain.InternationalLegalEntity;
import dev.vality.damsel.domain.RussianLegalEntity;
@@ -9,11 +9,15 @@
import dev.vality.newway.domain.enums.LegalEntity;
import dev.vality.newway.domain.enums.PrivateEntity;
import dev.vality.newway.domain.tables.pojos.Contractor;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
-public class ContractorUtil {
- public static Contractor convertContractor(long sequenceId, String eventCreatedAt, String partyId,
- dev.vality.damsel.domain.Contractor contractorSource,
- String contractorId, Integer changeId, Integer claimEffectId) {
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class ContractorFactory {
+
+ public static Contractor build(long sequenceId, String eventCreatedAt, String partyId,
+ dev.vality.damsel.domain.Contractor contractorSource,
+ String contractorId, Integer changeId, Integer claimEffectId) {
Contractor contractor = new Contractor();
contractor.setSequenceId((int) sequenceId);
contractor.setChangeId(changeId);
diff --git a/src/main/java/dev/vality/newway/factory/invoice/payment/InvoicePaymentEventIdHolderFactory.java b/src/main/java/dev/vality/newway/factory/invoice/payment/InvoicePaymentEventIdHolderFactory.java
new file mode 100644
index 00000000..a52e990e
--- /dev/null
+++ b/src/main/java/dev/vality/newway/factory/invoice/payment/InvoicePaymentEventIdHolderFactory.java
@@ -0,0 +1,20 @@
+package dev.vality.newway.factory.invoice.payment;
+
+import dev.vality.newway.domain.tables.pojos.CashFlowLink;
+import dev.vality.newway.model.InvoicePaymentEventIdHolder;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class InvoicePaymentEventIdHolderFactory {
+
+ public static InvoicePaymentEventIdHolder build(CashFlowLink link) {
+ return new InvoicePaymentEventIdHolder(
+ link.getInvoiceId(),
+ link.getPaymentId(),
+ link.getSequenceId(),
+ link.getChangeId()
+ );
+ }
+
+}
diff --git a/src/main/java/dev/vality/newway/factory/invoice/payment/PaymentFeeFactory.java b/src/main/java/dev/vality/newway/factory/invoice/payment/PaymentFeeFactory.java
new file mode 100644
index 00000000..b55d8fb0
--- /dev/null
+++ b/src/main/java/dev/vality/newway/factory/invoice/payment/PaymentFeeFactory.java
@@ -0,0 +1,37 @@
+package dev.vality.newway.factory.invoice.payment;
+
+import dev.vality.damsel.domain.FinalCashFlowPosting;
+import dev.vality.newway.domain.tables.pojos.PaymentFee;
+import dev.vality.newway.model.CashFlowType;
+import dev.vality.newway.util.CashFlowUtil;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class PaymentFeeFactory {
+
+ public static PaymentFee build(List finalCashFlow,
+ String invoiceId,
+ String paymentId,
+ LocalDateTime eventCreatedAt,
+ Integer changeId,
+ Long sequenceId) {
+ PaymentFee paymentFee = new PaymentFee();
+ paymentFee.setEventCreatedAt(eventCreatedAt);
+ paymentFee.setInvoiceId(invoiceId);
+ paymentFee.setPaymentId(paymentId);
+ Map parsedCashFlow = CashFlowUtil.parseCashFlow(finalCashFlow);
+ paymentFee.setFee(parsedCashFlow.getOrDefault(CashFlowType.FEE, 0L));
+ paymentFee.setProviderFee(parsedCashFlow.getOrDefault(CashFlowType.PROVIDER_FEE, 0L));
+ paymentFee.setExternalFee(parsedCashFlow.getOrDefault(CashFlowType.EXTERNAL_FEE, 0L));
+ paymentFee.setGuaranteeDeposit(parsedCashFlow.getOrDefault(CashFlowType.GUARANTEE_DEPOSIT, 0L));
+ paymentFee.setSequenceId(sequenceId);
+ paymentFee.setChangeId(changeId);
+ return paymentFee;
+ }
+
+}
diff --git a/src/main/java/dev/vality/newway/factory/invoice/payment/PaymentRouteFactory.java b/src/main/java/dev/vality/newway/factory/invoice/payment/PaymentRouteFactory.java
new file mode 100644
index 00000000..b583e47d
--- /dev/null
+++ b/src/main/java/dev/vality/newway/factory/invoice/payment/PaymentRouteFactory.java
@@ -0,0 +1,29 @@
+package dev.vality.newway.factory.invoice.payment;
+
+import dev.vality.newway.domain.tables.pojos.PaymentRoute;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class PaymentRouteFactory {
+
+ public static PaymentRoute build(dev.vality.damsel.domain.PaymentRoute paymentRouteSource,
+ String invoiceId,
+ String paymentId,
+ LocalDateTime eventCreatedAt,
+ Integer changeId,
+ Long sequenceId) {
+ PaymentRoute paymentRoute = new PaymentRoute();
+ paymentRoute.setEventCreatedAt(eventCreatedAt);
+ paymentRoute.setInvoiceId(invoiceId);
+ paymentRoute.setPaymentId(paymentId);
+ paymentRoute.setRouteProviderId(paymentRouteSource.getProvider().getId());
+ paymentRoute.setRouteTerminalId(paymentRouteSource.getTerminal().getId());
+ paymentRoute.setSequenceId(sequenceId);
+ paymentRoute.setChangeId(changeId);
+ return paymentRoute;
+ }
+
+}
diff --git a/src/main/java/dev/vality/newway/factory/invoice/payment/PaymentStatusInfoFactory.java b/src/main/java/dev/vality/newway/factory/invoice/payment/PaymentStatusInfoFactory.java
new file mode 100644
index 00000000..f6895af1
--- /dev/null
+++ b/src/main/java/dev/vality/newway/factory/invoice/payment/PaymentStatusInfoFactory.java
@@ -0,0 +1,45 @@
+package dev.vality.newway.factory.invoice.payment;
+
+import dev.vality.damsel.domain.InvoicePaymentCaptured;
+import dev.vality.damsel.domain.InvoicePaymentStatus;
+import dev.vality.geck.common.util.TBaseUtil;
+import dev.vality.newway.domain.enums.PaymentStatus;
+import dev.vality.newway.domain.tables.pojos.PaymentStatusInfo;
+import dev.vality.newway.util.JsonUtil;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class PaymentStatusInfoFactory {
+
+ public static PaymentStatusInfo build(InvoicePaymentStatus status,
+ String invoiceId,
+ String paymentId,
+ LocalDateTime eventCreatedAt,
+ Integer changeId,
+ Long sequenceId) {
+ PaymentStatusInfo statusInfo = new PaymentStatusInfo();
+ statusInfo.setInvoiceId(invoiceId);
+ statusInfo.setPaymentId(paymentId);
+ statusInfo.setStatus(TBaseUtil.unionFieldToEnum(status, PaymentStatus.class));
+ statusInfo.setEventCreatedAt(eventCreatedAt);
+ if (status.isSetCancelled()) {
+ statusInfo.setReason(status.getCancelled().getReason());
+ } else if (status.isSetFailed()) {
+ statusInfo.setReason(JsonUtil.thriftBaseToJsonString(status.getFailed()));
+ } else if (status.isSetCaptured()) {
+ InvoicePaymentCaptured invoicePaymentCaptured = status.getCaptured();
+ statusInfo.setReason(invoicePaymentCaptured.getReason());
+ if (invoicePaymentCaptured.isSetCost()) {
+ statusInfo.setAmount(invoicePaymentCaptured.getCost().getAmount());
+ statusInfo.setCurrencyCode(invoicePaymentCaptured.getCost().getCurrency().getSymbolicCode());
+ }
+ }
+ statusInfo.setChangeId(changeId);
+ statusInfo.setSequenceId(sequenceId);
+ return statusInfo;
+ }
+
+}
diff --git a/src/main/java/dev/vality/newway/factory/AdjustmentMachineEventCopyFactoryImpl.java b/src/main/java/dev/vality/newway/factory/machine/event/AdjustmentMachineEventCopyFactoryImpl.java
similarity index 95%
rename from src/main/java/dev/vality/newway/factory/AdjustmentMachineEventCopyFactoryImpl.java
rename to src/main/java/dev/vality/newway/factory/machine/event/AdjustmentMachineEventCopyFactoryImpl.java
index 4a4b2289..dc975c9d 100644
--- a/src/main/java/dev/vality/newway/factory/AdjustmentMachineEventCopyFactoryImpl.java
+++ b/src/main/java/dev/vality/newway/factory/machine/event/AdjustmentMachineEventCopyFactoryImpl.java
@@ -1,4 +1,4 @@
-package dev.vality.newway.factory;
+package dev.vality.newway.factory.machine.event;
import dev.vality.geck.common.util.TypeUtil;
import dev.vality.machinegun.eventsink.MachineEvent;
diff --git a/src/main/java/dev/vality/newway/factory/ChallengeMachineEventCopyFactoryImpl.java b/src/main/java/dev/vality/newway/factory/machine/event/ChallengeMachineEventCopyFactoryImpl.java
similarity index 96%
rename from src/main/java/dev/vality/newway/factory/ChallengeMachineEventCopyFactoryImpl.java
rename to src/main/java/dev/vality/newway/factory/machine/event/ChallengeMachineEventCopyFactoryImpl.java
index 39557103..69ef6036 100644
--- a/src/main/java/dev/vality/newway/factory/ChallengeMachineEventCopyFactoryImpl.java
+++ b/src/main/java/dev/vality/newway/factory/machine/event/ChallengeMachineEventCopyFactoryImpl.java
@@ -1,4 +1,4 @@
-package dev.vality.newway.factory;
+package dev.vality.newway.factory.machine.event;
import dev.vality.geck.common.util.TypeUtil;
import dev.vality.machinegun.eventsink.MachineEvent;
diff --git a/src/main/java/dev/vality/newway/factory/ChargebackMachineEventCopyFactoryImpl.java b/src/main/java/dev/vality/newway/factory/machine/event/ChargebackMachineEventCopyFactoryImpl.java
similarity index 95%
rename from src/main/java/dev/vality/newway/factory/ChargebackMachineEventCopyFactoryImpl.java
rename to src/main/java/dev/vality/newway/factory/machine/event/ChargebackMachineEventCopyFactoryImpl.java
index a2c2d793..b7d8ebbc 100644
--- a/src/main/java/dev/vality/newway/factory/ChargebackMachineEventCopyFactoryImpl.java
+++ b/src/main/java/dev/vality/newway/factory/machine/event/ChargebackMachineEventCopyFactoryImpl.java
@@ -1,4 +1,4 @@
-package dev.vality.newway.factory;
+package dev.vality.newway.factory.machine.event;
import dev.vality.geck.common.util.TypeUtil;
import dev.vality.machinegun.eventsink.MachineEvent;
diff --git a/src/main/java/dev/vality/newway/factory/DepositAjustmentMachineEventCopyFactoryImpl.java b/src/main/java/dev/vality/newway/factory/machine/event/DepositAjustmentMachineEventCopyFactoryImpl.java
similarity index 96%
rename from src/main/java/dev/vality/newway/factory/DepositAjustmentMachineEventCopyFactoryImpl.java
rename to src/main/java/dev/vality/newway/factory/machine/event/DepositAjustmentMachineEventCopyFactoryImpl.java
index 60fcc30e..cdc37411 100644
--- a/src/main/java/dev/vality/newway/factory/DepositAjustmentMachineEventCopyFactoryImpl.java
+++ b/src/main/java/dev/vality/newway/factory/machine/event/DepositAjustmentMachineEventCopyFactoryImpl.java
@@ -1,4 +1,4 @@
-package dev.vality.newway.factory;
+package dev.vality.newway.factory.machine.event;
import dev.vality.geck.common.util.TypeUtil;
import dev.vality.machinegun.eventsink.MachineEvent;
diff --git a/src/main/java/dev/vality/newway/factory/DepositMachineEventCopyFactoryImpl.java b/src/main/java/dev/vality/newway/factory/machine/event/DepositMachineEventCopyFactoryImpl.java
similarity index 96%
rename from src/main/java/dev/vality/newway/factory/DepositMachineEventCopyFactoryImpl.java
rename to src/main/java/dev/vality/newway/factory/machine/event/DepositMachineEventCopyFactoryImpl.java
index b38a5c35..7b833030 100644
--- a/src/main/java/dev/vality/newway/factory/DepositMachineEventCopyFactoryImpl.java
+++ b/src/main/java/dev/vality/newway/factory/machine/event/DepositMachineEventCopyFactoryImpl.java
@@ -1,4 +1,4 @@
-package dev.vality.newway.factory;
+package dev.vality.newway.factory.machine.event;
import dev.vality.geck.common.util.TypeUtil;
import dev.vality.machinegun.eventsink.MachineEvent;
diff --git a/src/main/java/dev/vality/newway/factory/DepositRevertMachineEventCopyFactoryImpl.java b/src/main/java/dev/vality/newway/factory/machine/event/DepositRevertMachineEventCopyFactoryImpl.java
similarity index 96%
rename from src/main/java/dev/vality/newway/factory/DepositRevertMachineEventCopyFactoryImpl.java
rename to src/main/java/dev/vality/newway/factory/machine/event/DepositRevertMachineEventCopyFactoryImpl.java
index 736dd686..6ebb37ff 100644
--- a/src/main/java/dev/vality/newway/factory/DepositRevertMachineEventCopyFactoryImpl.java
+++ b/src/main/java/dev/vality/newway/factory/machine/event/DepositRevertMachineEventCopyFactoryImpl.java
@@ -1,4 +1,4 @@
-package dev.vality.newway.factory;
+package dev.vality.newway.factory.machine.event;
import dev.vality.geck.common.util.TypeUtil;
import dev.vality.machinegun.eventsink.MachineEvent;
diff --git a/src/main/java/dev/vality/newway/factory/DestinationMachineEventCopyFactoryImpl.java b/src/main/java/dev/vality/newway/factory/machine/event/DestinationMachineEventCopyFactoryImpl.java
similarity index 96%
rename from src/main/java/dev/vality/newway/factory/DestinationMachineEventCopyFactoryImpl.java
rename to src/main/java/dev/vality/newway/factory/machine/event/DestinationMachineEventCopyFactoryImpl.java
index 30648faf..7b9a692e 100644
--- a/src/main/java/dev/vality/newway/factory/DestinationMachineEventCopyFactoryImpl.java
+++ b/src/main/java/dev/vality/newway/factory/machine/event/DestinationMachineEventCopyFactoryImpl.java
@@ -1,4 +1,4 @@
-package dev.vality.newway.factory;
+package dev.vality.newway.factory.machine.event;
import dev.vality.geck.common.util.TypeUtil;
import dev.vality.machinegun.eventsink.MachineEvent;
diff --git a/src/main/java/dev/vality/newway/factory/IdentityMachineEventCopyFactoryImpl.java b/src/main/java/dev/vality/newway/factory/machine/event/IdentityMachineEventCopyFactoryImpl.java
similarity index 95%
rename from src/main/java/dev/vality/newway/factory/IdentityMachineEventCopyFactoryImpl.java
rename to src/main/java/dev/vality/newway/factory/machine/event/IdentityMachineEventCopyFactoryImpl.java
index 71d5238b..a8fd1244 100644
--- a/src/main/java/dev/vality/newway/factory/IdentityMachineEventCopyFactoryImpl.java
+++ b/src/main/java/dev/vality/newway/factory/machine/event/IdentityMachineEventCopyFactoryImpl.java
@@ -1,4 +1,4 @@
-package dev.vality.newway.factory;
+package dev.vality.newway.factory.machine.event;
import dev.vality.geck.common.util.TypeUtil;
import dev.vality.machinegun.eventsink.MachineEvent;
diff --git a/src/main/java/dev/vality/newway/factory/machine/event/LimitConfigMachineEventCopyFactoryImpl.java b/src/main/java/dev/vality/newway/factory/machine/event/LimitConfigMachineEventCopyFactoryImpl.java
new file mode 100644
index 00000000..68b79e75
--- /dev/null
+++ b/src/main/java/dev/vality/newway/factory/machine/event/LimitConfigMachineEventCopyFactoryImpl.java
@@ -0,0 +1,27 @@
+package dev.vality.newway.factory.machine.event;
+
+import dev.vality.geck.common.util.TypeUtil;
+import dev.vality.machinegun.eventsink.MachineEvent;
+import dev.vality.newway.domain.tables.pojos.LimitConfig;
+import org.springframework.stereotype.Component;
+
+@Component
+public class LimitConfigMachineEventCopyFactoryImpl implements MachineEventCopyFactory {
+
+ @Override
+ public LimitConfig create(MachineEvent event, Long sequenceId, String id, LimitConfig old, String occurredAt) {
+ var limitConfig = old != null ? new LimitConfig(old) : new LimitConfig();
+ limitConfig.setId(null);
+ limitConfig.setWtime(null);
+ limitConfig.setSequenceId(sequenceId.intValue());
+ limitConfig.setSourceId(id);
+ limitConfig.setEventCreatedAt(TypeUtil.stringToLocalDateTime(event.getCreatedAt()));
+ limitConfig.setEventOccuredAt(TypeUtil.stringToLocalDateTime(occurredAt));
+ return limitConfig;
+ }
+
+ @Override
+ public LimitConfig create(MachineEvent event, Long sequenceId, String id, String occurredAt) {
+ return create(event, sequenceId, id, null, occurredAt);
+ }
+}
diff --git a/src/main/java/dev/vality/newway/factory/MachineEventCopyFactory.java b/src/main/java/dev/vality/newway/factory/machine/event/MachineEventCopyFactory.java
similarity index 84%
rename from src/main/java/dev/vality/newway/factory/MachineEventCopyFactory.java
rename to src/main/java/dev/vality/newway/factory/machine/event/MachineEventCopyFactory.java
index e8f363f2..7736997a 100644
--- a/src/main/java/dev/vality/newway/factory/MachineEventCopyFactory.java
+++ b/src/main/java/dev/vality/newway/factory/machine/event/MachineEventCopyFactory.java
@@ -1,4 +1,4 @@
-package dev.vality.newway.factory;
+package dev.vality.newway.factory.machine.event;
import dev.vality.machinegun.eventsink.MachineEvent;
diff --git a/src/main/java/dev/vality/newway/factory/PartyMachineEventCopyFactoryImpl.java b/src/main/java/dev/vality/newway/factory/machine/event/PartyMachineEventCopyFactoryImpl.java
similarity index 93%
rename from src/main/java/dev/vality/newway/factory/PartyMachineEventCopyFactoryImpl.java
rename to src/main/java/dev/vality/newway/factory/machine/event/PartyMachineEventCopyFactoryImpl.java
index 128b6059..dc7b1d54 100644
--- a/src/main/java/dev/vality/newway/factory/PartyMachineEventCopyFactoryImpl.java
+++ b/src/main/java/dev/vality/newway/factory/machine/event/PartyMachineEventCopyFactoryImpl.java
@@ -1,4 +1,4 @@
-package dev.vality.newway.factory;
+package dev.vality.newway.factory.machine.event;
import dev.vality.geck.common.util.TypeUtil;
import dev.vality.machinegun.eventsink.MachineEvent;
@@ -18,7 +18,6 @@ public Party create(MachineEvent event, Long sequenceId, Integer id, Party old,
party = new Party();
}
party.setId(null);
- party.setRevision(null);
party.setWtime(null);
party.setSequenceId(sequenceId.intValue());
party.setChangeId(id);
diff --git a/src/main/java/dev/vality/newway/factory/RecurrentPaymentToolCopyFactoryImpl.java b/src/main/java/dev/vality/newway/factory/machine/event/RecurrentPaymentToolCopyFactoryImpl.java
similarity index 96%
rename from src/main/java/dev/vality/newway/factory/RecurrentPaymentToolCopyFactoryImpl.java
rename to src/main/java/dev/vality/newway/factory/machine/event/RecurrentPaymentToolCopyFactoryImpl.java
index f1b1c457..a5dd50e3 100644
--- a/src/main/java/dev/vality/newway/factory/RecurrentPaymentToolCopyFactoryImpl.java
+++ b/src/main/java/dev/vality/newway/factory/machine/event/RecurrentPaymentToolCopyFactoryImpl.java
@@ -1,4 +1,4 @@
-package dev.vality.newway.factory;
+package dev.vality.newway.factory.machine.event;
import dev.vality.geck.common.util.TypeUtil;
import dev.vality.machinegun.eventsink.MachineEvent;
diff --git a/src/main/java/dev/vality/newway/factory/RefundMachineEventCopyFactoryImpl.java b/src/main/java/dev/vality/newway/factory/machine/event/RefundMachineEventCopyFactoryImpl.java
similarity index 95%
rename from src/main/java/dev/vality/newway/factory/RefundMachineEventCopyFactoryImpl.java
rename to src/main/java/dev/vality/newway/factory/machine/event/RefundMachineEventCopyFactoryImpl.java
index 787cb4c6..5a63295e 100644
--- a/src/main/java/dev/vality/newway/factory/RefundMachineEventCopyFactoryImpl.java
+++ b/src/main/java/dev/vality/newway/factory/machine/event/RefundMachineEventCopyFactoryImpl.java
@@ -1,4 +1,4 @@
-package dev.vality.newway.factory;
+package dev.vality.newway.factory.machine.event;
import dev.vality.geck.common.util.TypeUtil;
import dev.vality.machinegun.eventsink.MachineEvent;
diff --git a/src/main/java/dev/vality/newway/factory/SourceMachineEventCopyFactoryImpl.java b/src/main/java/dev/vality/newway/factory/machine/event/SourceMachineEventCopyFactoryImpl.java
similarity index 95%
rename from src/main/java/dev/vality/newway/factory/SourceMachineEventCopyFactoryImpl.java
rename to src/main/java/dev/vality/newway/factory/machine/event/SourceMachineEventCopyFactoryImpl.java
index 93064b24..cc4292a1 100644
--- a/src/main/java/dev/vality/newway/factory/SourceMachineEventCopyFactoryImpl.java
+++ b/src/main/java/dev/vality/newway/factory/machine/event/SourceMachineEventCopyFactoryImpl.java
@@ -1,4 +1,4 @@
-package dev.vality.newway.factory;
+package dev.vality.newway.factory.machine.event;
import dev.vality.geck.common.util.TypeUtil;
import dev.vality.machinegun.eventsink.MachineEvent;
diff --git a/src/main/java/dev/vality/newway/factory/WalletMachineEventCopyFactoryImpl.java b/src/main/java/dev/vality/newway/factory/machine/event/WalletMachineEventCopyFactoryImpl.java
similarity index 95%
rename from src/main/java/dev/vality/newway/factory/WalletMachineEventCopyFactoryImpl.java
rename to src/main/java/dev/vality/newway/factory/machine/event/WalletMachineEventCopyFactoryImpl.java
index eedc085f..f40c2815 100644
--- a/src/main/java/dev/vality/newway/factory/WalletMachineEventCopyFactoryImpl.java
+++ b/src/main/java/dev/vality/newway/factory/machine/event/WalletMachineEventCopyFactoryImpl.java
@@ -1,4 +1,4 @@
-package dev.vality.newway.factory;
+package dev.vality.newway.factory.machine.event;
import dev.vality.geck.common.util.TypeUtil;
import dev.vality.machinegun.eventsink.MachineEvent;
diff --git a/src/main/java/dev/vality/newway/factory/machine/event/WithdrawalAdjustmentMachineEventCopyFactoryImpl.java b/src/main/java/dev/vality/newway/factory/machine/event/WithdrawalAdjustmentMachineEventCopyFactoryImpl.java
new file mode 100644
index 00000000..7ed3c7ea
--- /dev/null
+++ b/src/main/java/dev/vality/newway/factory/machine/event/WithdrawalAdjustmentMachineEventCopyFactoryImpl.java
@@ -0,0 +1,33 @@
+package dev.vality.newway.factory.machine.event;
+
+import dev.vality.geck.common.util.TypeUtil;
+import dev.vality.machinegun.eventsink.MachineEvent;
+import dev.vality.newway.domain.tables.pojos.WithdrawalAdjustment;
+import org.springframework.stereotype.Component;
+
+@Component
+public class WithdrawalAdjustmentMachineEventCopyFactoryImpl implements MachineEventCopyFactory {
+
+ @Override
+ public WithdrawalAdjustment create(MachineEvent event, Long sequenceId, String id, WithdrawalAdjustment old, String occurredAt) {
+ WithdrawalAdjustment withdrawalAdjustment = null;
+ if (old != null) {
+ withdrawalAdjustment = new WithdrawalAdjustment(old);
+ } else {
+ withdrawalAdjustment = new WithdrawalAdjustment();
+ }
+ withdrawalAdjustment.setId(null);
+ withdrawalAdjustment.setWtime(null);
+ withdrawalAdjustment.setAdjustmentId(id);
+ withdrawalAdjustment.setSequenceId(sequenceId);
+ withdrawalAdjustment.setEventCreatedAt(TypeUtil.stringToLocalDateTime(event.getCreatedAt()));
+ withdrawalAdjustment.setEventOccuredAt(TypeUtil.stringToLocalDateTime(occurredAt));
+ return withdrawalAdjustment;
+ }
+
+ @Override
+ public WithdrawalAdjustment create(MachineEvent event, Long sequenceId, String id, String occurredAt) {
+ return create(event, sequenceId, id, null, occurredAt);
+ }
+
+}
diff --git a/src/main/java/dev/vality/newway/factory/WithdrawalMachineEventCopyFactoryImpl.java b/src/main/java/dev/vality/newway/factory/machine/event/WithdrawalMachineEventCopyFactoryImpl.java
similarity index 96%
rename from src/main/java/dev/vality/newway/factory/WithdrawalMachineEventCopyFactoryImpl.java
rename to src/main/java/dev/vality/newway/factory/machine/event/WithdrawalMachineEventCopyFactoryImpl.java
index 3be91301..aded5c65 100644
--- a/src/main/java/dev/vality/newway/factory/WithdrawalMachineEventCopyFactoryImpl.java
+++ b/src/main/java/dev/vality/newway/factory/machine/event/WithdrawalMachineEventCopyFactoryImpl.java
@@ -1,4 +1,4 @@
-package dev.vality.newway.factory;
+package dev.vality.newway.factory.machine.event;
import dev.vality.geck.common.util.TypeUtil;
import dev.vality.machinegun.eventsink.MachineEvent;
diff --git a/src/main/java/dev/vality/newway/factory/WithdrawalSessionMachineEventCopyFactoryImpl.java b/src/main/java/dev/vality/newway/factory/machine/event/WithdrawalSessionMachineEventCopyFactoryImpl.java
similarity index 96%
rename from src/main/java/dev/vality/newway/factory/WithdrawalSessionMachineEventCopyFactoryImpl.java
rename to src/main/java/dev/vality/newway/factory/machine/event/WithdrawalSessionMachineEventCopyFactoryImpl.java
index e678e388..67b357e5 100644
--- a/src/main/java/dev/vality/newway/factory/WithdrawalSessionMachineEventCopyFactoryImpl.java
+++ b/src/main/java/dev/vality/newway/factory/machine/event/WithdrawalSessionMachineEventCopyFactoryImpl.java
@@ -1,4 +1,4 @@
-package dev.vality.newway.factory;
+package dev.vality.newway.factory.machine.event;
import dev.vality.geck.common.util.TypeUtil;
import dev.vality.machinegun.eventsink.MachineEvent;
diff --git a/src/main/java/dev/vality/newway/handler/dominant/DominantPoller.java b/src/main/java/dev/vality/newway/handler/dominant/DominantPoller.java
index 7e4ded82..c779854f 100644
--- a/src/main/java/dev/vality/newway/handler/dominant/DominantPoller.java
+++ b/src/main/java/dev/vality/newway/handler/dominant/DominantPoller.java
@@ -6,7 +6,6 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
-import org.apache.thrift.TException;
import org.springframework.context.annotation.DependsOn;
import org.springframework.scheduling.annotation.Scheduled;
@@ -35,7 +34,7 @@ public void process() {
pullRange.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.forEach(e -> handleDominantData(after, versionId, e));
- } catch (TException e) {
+ } catch (Exception e) {
log.warn("Error to polling dominant, after={}", after, e);
}
}
@@ -45,6 +44,7 @@ private void handleDominantData(AtomicLong after, AtomicLong versionId, Map.Entr
try {
versionId.set(e.getKey());
dominantService.processCommit(versionId.get(), e);
+ dominantService.updateLastVersionId(versionId.get());
after.set(versionId.get());
} catch (RuntimeException ex) {
throw new RuntimeException(
diff --git a/src/main/java/dev/vality/newway/handler/dominant/impl/ProviderHandler.java b/src/main/java/dev/vality/newway/handler/dominant/impl/ProviderHandler.java
index aaeaa1f8..85c6f782 100644
--- a/src/main/java/dev/vality/newway/handler/dominant/impl/ProviderHandler.java
+++ b/src/main/java/dev/vality/newway/handler/dominant/impl/ProviderHandler.java
@@ -49,10 +49,6 @@ public Provider convertToDatabaseObject(ProviderObject providerObject, Long vers
provider.setName(data.getName());
provider.setDescription(data.getDescription());
provider.setProxyRefId(data.getProxy().getRef().getId());
- provider.setProxyAdditionalJson(JsonUtil.objectToJsonString(data.getProxy().getAdditional()));
- if (data.isSetTerminal()) {
- provider.setTerminalJson(JsonUtil.thriftBaseToJsonString(data.getTerminal()));
- }
if (data.isSetAbsAccount()) {
provider.setAbsAccount(data.getAbsAccount());
}
diff --git a/src/main/java/dev/vality/newway/handler/dominant/impl/ProxyHandler.java b/src/main/java/dev/vality/newway/handler/dominant/impl/ProxyHandler.java
index cdbb114a..8fa494fd 100644
--- a/src/main/java/dev/vality/newway/handler/dominant/impl/ProxyHandler.java
+++ b/src/main/java/dev/vality/newway/handler/dominant/impl/ProxyHandler.java
@@ -47,7 +47,6 @@ public Proxy convertToDatabaseObject(ProxyObject proxyObject, Long versionId, bo
proxy.setName(data.getName());
proxy.setDescription(data.getDescription());
proxy.setUrl(data.getUrl());
- proxy.setOptionsJson(JsonUtil.objectToJsonString(data.getOptions()));
proxy.setCurrent(current);
return proxy;
}
diff --git a/src/main/java/dev/vality/newway/handler/dominant/impl/TerminalHandler.java b/src/main/java/dev/vality/newway/handler/dominant/impl/TerminalHandler.java
index 6247f92d..2c1025b1 100644
--- a/src/main/java/dev/vality/newway/handler/dominant/impl/TerminalHandler.java
+++ b/src/main/java/dev/vality/newway/handler/dominant/impl/TerminalHandler.java
@@ -45,9 +45,6 @@ public Terminal convertToDatabaseObject(TerminalObject terminalObject, Long vers
dev.vality.damsel.domain.Terminal data = terminalObject.getData();
terminal.setName(data.getName());
terminal.setDescription(data.getDescription());
- if (data.isSetOptions()) {
- terminal.setOptionsJson(JsonUtil.objectToJsonString(data.getOptions()));
- }
if (data.isSetRiskCoverage()) {
terminal.setRiskCoverage(data.getRiskCoverage().name());
}
diff --git a/src/main/java/dev/vality/newway/handler/dominant/impl/WithdrawalProviderHandler.java b/src/main/java/dev/vality/newway/handler/dominant/impl/WithdrawalProviderHandler.java
deleted file mode 100644
index a080b6a9..00000000
--- a/src/main/java/dev/vality/newway/handler/dominant/impl/WithdrawalProviderHandler.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package dev.vality.newway.handler.dominant.impl;
-
-import dev.vality.damsel.domain.WithdrawalProviderObject;
-import dev.vality.newway.dao.dominant.iface.DomainObjectDao;
-import dev.vality.newway.dao.dominant.impl.WithdrawalProviderDaoImpl;
-import dev.vality.newway.domain.tables.pojos.WithdrawalProvider;
-import dev.vality.newway.handler.dominant.AbstractDominantHandler;
-import dev.vality.newway.util.JsonUtil;
-import org.springframework.stereotype.Component;
-
-import java.util.Map;
-import java.util.stream.Collectors;
-
-@Component
-public class WithdrawalProviderHandler
- extends AbstractDominantHandler {
-
- private final WithdrawalProviderDaoImpl withdrawalProviderDao;
-
- public WithdrawalProviderHandler(WithdrawalProviderDaoImpl withdrawalProviderDao) {
- this.withdrawalProviderDao = withdrawalProviderDao;
- }
-
- @Override
- protected DomainObjectDao getDomainObjectDao() {
- return withdrawalProviderDao;
- }
-
- @Override
- protected WithdrawalProviderObject getTargetObject() {
- return getDomainObject().getWithdrawalProvider();
- }
-
- @Override
- protected Integer getTargetObjectRefId() {
- return getTargetObject().getRef().getId();
- }
-
- @Override
- protected boolean acceptDomainObject() {
- return getDomainObject().isSetWithdrawalProvider();
- }
-
- @Override
- public WithdrawalProvider convertToDatabaseObject(WithdrawalProviderObject withdrawalProviderObject, Long versionId,
- boolean current) {
- WithdrawalProvider withdrawalProvider = new WithdrawalProvider();
- withdrawalProvider.setVersionId(versionId);
- withdrawalProvider.setWithdrawalProviderRefId(getTargetObjectRefId());
- var data = withdrawalProviderObject.getData();
- withdrawalProvider.setName(data.getName());
- withdrawalProvider.setDescription(data.getDescription());
- withdrawalProvider.setProxyRefId(data.getProxy().getRef().getId());
- withdrawalProvider.setProxyAdditionalJson(JsonUtil.objectToJsonString(data.getProxy().getAdditional()));
- withdrawalProvider.setIdentity(data.getIdentity());
- if (data.isSetWithdrawalTerms()) {
- withdrawalProvider.setWithdrawalTermsJson(JsonUtil.thriftBaseToJsonString(data.getWithdrawalTerms()));
- }
- if (data.isSetAccounts()) {
- Map accountsMap = data.getAccounts().entrySet()
- .stream()
- .collect(Collectors.toMap(e -> e.getKey().getSymbolicCode(), e -> e.getValue().getSettlement()));
- withdrawalProvider.setAccountsJson(JsonUtil.objectToJsonString(accountsMap));
- }
- withdrawalProvider.setCurrent(current);
- return withdrawalProvider;
- }
-}
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/Handler.java b/src/main/java/dev/vality/newway/handler/event/stock/Handler.java
index 6700e665..aa38a869 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/Handler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/Handler.java
@@ -1,6 +1,5 @@
package dev.vality.newway.handler.event.stock;
-
import dev.vality.geck.filter.Filter;
import org.apache.commons.lang3.NotImplementedException;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/LocalStorage.java b/src/main/java/dev/vality/newway/handler/event/stock/LocalStorage.java
deleted file mode 100644
index b4f9e0c8..00000000
--- a/src/main/java/dev/vality/newway/handler/event/stock/LocalStorage.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package dev.vality.newway.handler.event.stock;
-
-import dev.vality.newway.model.InvoicingKey;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class LocalStorage {
- private Map map = new HashMap<>();
-
- public Object get(InvoicingKey key) {
- return map.get(key);
- }
-
- public void put(InvoicingKey key, Object object) {
- map.put(key, object);
- }
-}
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/DepositCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/DepositCreatedHandler.java
index ffe5dba7..17859f2e 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/DepositCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/DepositCreatedHandler.java
@@ -11,7 +11,7 @@
import dev.vality.newway.dao.deposit.iface.DepositDao;
import dev.vality.newway.domain.enums.DepositStatus;
import dev.vality.newway.domain.tables.pojos.Deposit;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/DepositStatusChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/DepositStatusChangedHandler.java
index 03599b4d..25d96719 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/DepositStatusChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/DepositStatusChangedHandler.java
@@ -15,7 +15,7 @@
import dev.vality.newway.domain.enums.FistfulCashFlowChangeType;
import dev.vality.newway.domain.tables.pojos.Deposit;
import dev.vality.newway.domain.tables.pojos.FistfulCashFlow;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/DepositTransferCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/DepositTransferCreatedHandler.java
index 4d619863..b7262101 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/DepositTransferCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/DepositTransferCreatedHandler.java
@@ -14,7 +14,7 @@
import dev.vality.newway.domain.enums.FistfulCashFlowChangeType;
import dev.vality.newway.domain.tables.pojos.Deposit;
import dev.vality.newway.domain.tables.pojos.FistfulCashFlow;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.util.FistfulCashFlowUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/DepositTransferStatusChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/DepositTransferStatusChangedHandler.java
index 1891ab64..efef023a 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/DepositTransferStatusChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/DepositTransferStatusChangedHandler.java
@@ -15,7 +15,7 @@
import dev.vality.newway.domain.enums.FistfulCashFlowChangeType;
import dev.vality.newway.domain.tables.pojos.Deposit;
import dev.vality.newway.domain.tables.pojos.FistfulCashFlow;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/adjustment/DepositAdjustmentCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/adjustment/DepositAdjustmentCreatedHandler.java
index 13b22be3..34affdae 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/adjustment/DepositAdjustmentCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/adjustment/DepositAdjustmentCreatedHandler.java
@@ -16,7 +16,7 @@
import dev.vality.newway.domain.enums.DepositStatus;
import dev.vality.newway.domain.tables.pojos.Deposit;
import dev.vality.newway.domain.tables.pojos.DepositAdjustment;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.deposit.DepositHandler;
import dev.vality.newway.util.FistfulCashFlowUtil;
import lombok.Getter;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/adjustment/DepositAdjustmentStatusChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/adjustment/DepositAdjustmentStatusChangedHandler.java
index ff0a19b9..e809a768 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/adjustment/DepositAdjustmentStatusChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/adjustment/DepositAdjustmentStatusChangedHandler.java
@@ -15,7 +15,7 @@
import dev.vality.newway.domain.enums.FistfulCashFlowChangeType;
import dev.vality.newway.domain.tables.pojos.DepositAdjustment;
import dev.vality.newway.domain.tables.pojos.FistfulCashFlow;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.deposit.DepositHandler;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/adjustment/DepositAdjustmentTransferCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/adjustment/DepositAdjustmentTransferCreatedHandler.java
index 11d068cc..8f3162cd 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/adjustment/DepositAdjustmentTransferCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/adjustment/DepositAdjustmentTransferCreatedHandler.java
@@ -14,7 +14,7 @@
import dev.vality.newway.domain.enums.FistfulCashFlowChangeType;
import dev.vality.newway.domain.tables.pojos.DepositAdjustment;
import dev.vality.newway.domain.tables.pojos.FistfulCashFlow;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.deposit.DepositHandler;
import dev.vality.newway.util.FistfulCashFlowUtil;
import lombok.Getter;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/adjustment/DepositAdjustmentTransferStatusChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/adjustment/DepositAdjustmentTransferStatusChangedHandler.java
index 4f92df29..e5bc7482 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/adjustment/DepositAdjustmentTransferStatusChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/adjustment/DepositAdjustmentTransferStatusChangedHandler.java
@@ -15,7 +15,7 @@
import dev.vality.newway.domain.enums.FistfulCashFlowChangeType;
import dev.vality.newway.domain.tables.pojos.DepositAdjustment;
import dev.vality.newway.domain.tables.pojos.FistfulCashFlow;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.deposit.DepositHandler;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/revert/DepositRevertCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/revert/DepositRevertCreatedHandler.java
index 2b1e7824..9f8e240a 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/revert/DepositRevertCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/revert/DepositRevertCreatedHandler.java
@@ -12,7 +12,7 @@
import dev.vality.newway.dao.deposit.revert.iface.DepositRevertDao;
import dev.vality.newway.domain.enums.DepositRevertStatus;
import dev.vality.newway.domain.tables.pojos.DepositRevert;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.deposit.DepositHandler;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/revert/DepositRevertStatusChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/revert/DepositRevertStatusChangedHandler.java
index 9b989d01..230ed616 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/revert/DepositRevertStatusChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/revert/DepositRevertStatusChangedHandler.java
@@ -15,7 +15,7 @@
import dev.vality.newway.domain.enums.FistfulCashFlowChangeType;
import dev.vality.newway.domain.tables.pojos.DepositRevert;
import dev.vality.newway.domain.tables.pojos.FistfulCashFlow;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.deposit.DepositHandler;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/revert/DepositRevertTransferCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/revert/DepositRevertTransferCreatedHandler.java
index 70c450f8..76ee2aac 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/revert/DepositRevertTransferCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/revert/DepositRevertTransferCreatedHandler.java
@@ -14,7 +14,7 @@
import dev.vality.newway.domain.enums.FistfulCashFlowChangeType;
import dev.vality.newway.domain.tables.pojos.DepositRevert;
import dev.vality.newway.domain.tables.pojos.FistfulCashFlow;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.deposit.DepositHandler;
import dev.vality.newway.util.FistfulCashFlowUtil;
import lombok.Getter;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/revert/DepositRevertTransferStatusChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/revert/DepositRevertTransferStatusChangedHandler.java
index d884eceb..8fe800e6 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/revert/DepositRevertTransferStatusChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/deposit/revert/DepositRevertTransferStatusChangedHandler.java
@@ -15,7 +15,7 @@
import dev.vality.newway.domain.enums.FistfulCashFlowChangeType;
import dev.vality.newway.domain.tables.pojos.DepositRevert;
import dev.vality.newway.domain.tables.pojos.FistfulCashFlow;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.deposit.DepositHandler;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/destination/DestinationAccountCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/destination/DestinationAccountCreatedHandler.java
index d12bd261..28179c5e 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/destination/DestinationAccountCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/destination/DestinationAccountCreatedHandler.java
@@ -12,7 +12,7 @@
import dev.vality.newway.dao.identity.iface.IdentityDao;
import dev.vality.newway.domain.tables.pojos.Destination;
import dev.vality.newway.domain.tables.pojos.Identity;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/destination/DestinationCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/destination/DestinationCreatedHandler.java
index afcdccb3..dc08b2a4 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/destination/DestinationCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/destination/DestinationCreatedHandler.java
@@ -15,7 +15,7 @@
import dev.vality.newway.domain.enums.DestinationResourceType;
import dev.vality.newway.domain.enums.DestinationStatus;
import dev.vality.newway.domain.tables.pojos.Destination;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.util.JsonUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/destination/DestinationStatusChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/destination/DestinationStatusChangedHandler.java
index 0321e836..da4b4485 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/destination/DestinationStatusChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/destination/DestinationStatusChangedHandler.java
@@ -12,7 +12,7 @@
import dev.vality.newway.dao.destination.iface.DestinationDao;
import dev.vality.newway.domain.enums.DestinationStatus;
import dev.vality.newway.domain.tables.pojos.Destination;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/exrate/CurrencyExchangeRateHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/exrate/CurrencyExchangeRateHandler.java
new file mode 100644
index 00000000..3adec16d
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/exrate/CurrencyExchangeRateHandler.java
@@ -0,0 +1,47 @@
+package dev.vality.newway.handler.event.stock.impl.exrate;
+
+import dev.vality.exrates.events.CurrencyEvent;
+import dev.vality.exrates.events.CurrencyExchangeRate;
+import dev.vality.geck.common.util.TypeUtil;
+import dev.vality.newway.dao.exrate.iface.ExchangeRateDao;
+import dev.vality.newway.domain.tables.pojos.ExRate;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class CurrencyExchangeRateHandler implements ExchangeRateHandler {
+
+ private final ExchangeRateDao exchangeRateDao;
+
+ @Override
+ public void handle(List events) {
+ List exrates = events.stream().map(currencyEvent -> {
+ CurrencyExchangeRate exchangeRate = currencyEvent.getPayload().getExchangeRate();
+ ExRate exrate = new ExRate();
+ exrate.setEventId(UUID.fromString(currencyEvent.getEventId()));
+ exrate.setEventCreatedAt(TypeUtil.stringToLocalDateTime(currencyEvent.getEventCreatedAt()));
+ exrate.setSourceCurrencySymbolicCode(exchangeRate.getSourceCurrency().getSymbolicCode());
+ exrate.setSourceCurrencyExponent(exchangeRate.getSourceCurrency().getExponent());
+ exrate.setDestinationCurrencySymbolicCode(exchangeRate.getDestinationCurrency().getSymbolicCode());
+ exrate.setDestinationCurrencyExponent(exchangeRate.getDestinationCurrency().getExponent());
+ exrate.setRationalP(exchangeRate.getExchangeRate().getP());
+ exrate.setRationalQ(exchangeRate.getExchangeRate().getQ());
+ exrate.setRateTimestamp(TypeUtil.stringToLocalDateTime(exchangeRate.timestamp));
+ return exrate;
+ }).collect(Collectors.toList());
+
+ exchangeRateDao.saveBatch(exrates);
+ }
+
+ @Override
+ public boolean isHandle(CurrencyEvent currencyEvent) {
+ return currencyEvent.payload.isSetExchangeRate();
+ }
+}
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/exrate/ExchangeRateHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/exrate/ExchangeRateHandler.java
new file mode 100644
index 00000000..006df3ae
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/exrate/ExchangeRateHandler.java
@@ -0,0 +1,12 @@
+package dev.vality.newway.handler.event.stock.impl.exrate;
+
+import dev.vality.exrates.events.CurrencyEvent;
+
+import java.util.List;
+
+public interface ExchangeRateHandler {
+
+ void handle(List currencyEvents);
+
+ boolean isHandle(CurrencyEvent currencyEvent);
+}
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityChallengeCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityChallengeCreatedHandler.java
index 88009d4e..8cf7d576 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityChallengeCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityChallengeCreatedHandler.java
@@ -12,7 +12,7 @@
import dev.vality.newway.dao.identity.iface.ChallengeDao;
import dev.vality.newway.domain.enums.ChallengeStatus;
import dev.vality.newway.domain.tables.pojos.Challenge;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.util.JsonUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityChallengeStatusChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityChallengeStatusChangedHandler.java
index ed833f87..836665c3 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityChallengeStatusChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityChallengeStatusChangedHandler.java
@@ -10,7 +10,7 @@
import dev.vality.machinegun.eventsink.MachineEvent;
import dev.vality.newway.dao.identity.iface.ChallengeDao;
import dev.vality.newway.domain.tables.pojos.Challenge;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityCreatedHandler.java
index 27e441e3..3002942c 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityCreatedHandler.java
@@ -10,7 +10,7 @@
import dev.vality.machinegun.eventsink.MachineEvent;
import dev.vality.newway.dao.identity.iface.IdentityDao;
import dev.vality.newway.domain.tables.pojos.Identity;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.util.JsonUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityEffectiveChallengeChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityEffectiveChallengeChangedHandler.java
index 258e9cba..ab93ed77 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityEffectiveChallengeChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityEffectiveChallengeChangedHandler.java
@@ -9,7 +9,7 @@
import dev.vality.machinegun.eventsink.MachineEvent;
import dev.vality.newway.dao.identity.iface.IdentityDao;
import dev.vality.newway.domain.tables.pojos.Identity;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityLevelChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityLevelChangedHandler.java
index 42122851..add147a7 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityLevelChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/identity/IdentityLevelChangedHandler.java
@@ -9,7 +9,7 @@
import dev.vality.machinegun.eventsink.MachineEvent;
import dev.vality.newway.dao.identity.iface.IdentityDao;
import dev.vality.newway.domain.tables.pojos.Identity;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/adjustment/InvoicePaymentAdjustmentCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/adjustment/InvoicePaymentAdjustmentCreatedHandler.java
index a54d35a8..3e8e3942 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/adjustment/InvoicePaymentAdjustmentCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/adjustment/InvoicePaymentAdjustmentCreatedHandler.java
@@ -22,10 +22,10 @@
import dev.vality.newway.domain.tables.pojos.Adjustment;
import dev.vality.newway.domain.tables.pojos.CashFlow;
import dev.vality.newway.domain.tables.pojos.Payment;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.cash.flow.CashFlowFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.invoicing.InvoicingHandler;
import dev.vality.newway.util.AdjustmentUtils;
-import dev.vality.newway.util.CashFlowUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -111,13 +111,13 @@ public void handle(InvoiceChange invoiceChange, MachineEvent event, Integer chan
adjustmentDao.save(adjustment).ifPresentOrElse(
id -> {
- List newCashFlowList = CashFlowUtil.convertCashFlows(
+ List newCashFlowList = CashFlowFactory.build(
invoicePaymentAdjustment.getNewCashFlow(),
id,
PaymentChangeType.adjustment,
AdjustmentCashFlowType.new_cash_flow);
cashFlowDao.save(newCashFlowList);
- List oldCashFlowList = CashFlowUtil.convertCashFlows(
+ List oldCashFlowList = CashFlowFactory.build(
invoicePaymentAdjustment.getOldCashFlowInverse(),
id,
PaymentChangeType.adjustment,
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/adjustment/InvoicePaymentAdjustmentStatusChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/adjustment/InvoicePaymentAdjustmentStatusChangedHandler.java
index ded4b1b5..5b549bdc 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/adjustment/InvoicePaymentAdjustmentStatusChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/adjustment/InvoicePaymentAdjustmentStatusChangedHandler.java
@@ -17,7 +17,7 @@
import dev.vality.newway.domain.enums.AdjustmentStatus;
import dev.vality.newway.domain.tables.pojos.Adjustment;
import dev.vality.newway.domain.tables.pojos.CashFlow;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.invoicing.InvoicingHandler;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackBodyChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackBodyChangedHandler.java
index 620a18a4..c4610673 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackBodyChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackBodyChangedHandler.java
@@ -12,7 +12,7 @@
import dev.vality.newway.dao.invoicing.iface.ChargebackDao;
import dev.vality.newway.domain.enums.PaymentChangeType;
import dev.vality.newway.domain.tables.pojos.Chargeback;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.invoicing.InvoicingHandler;
import dev.vality.newway.service.CashFlowService;
import lombok.Getter;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackCashFlowChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackCashFlowChangedHandler.java
index 499e3a84..c70cf221 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackCashFlowChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackCashFlowChangedHandler.java
@@ -14,10 +14,10 @@
import dev.vality.newway.domain.enums.PaymentChangeType;
import dev.vality.newway.domain.tables.pojos.CashFlow;
import dev.vality.newway.domain.tables.pojos.Chargeback;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.cash.flow.CashFlowFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.invoicing.InvoicingHandler;
import dev.vality.newway.service.CashFlowService;
-import dev.vality.newway.util.CashFlowUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -65,7 +65,7 @@ public void handle(InvoiceChange change, MachineEvent event, Integer changeId) {
Long oldId = chargebackOld.getId();
chargebackDao.updateNotCurrent(oldId);
cashFlowService.save(oldId, id, PaymentChangeType.chargeback);
- List cashFlows = CashFlowUtil.convertCashFlows(
+ List cashFlows = CashFlowFactory.build(
invoicePaymentChargebackCashFlowChanged.getCashFlow(),
id,
PaymentChangeType.chargeback);
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackCreatedHandler.java
index 33fb4568..297079a4 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackCreatedHandler.java
@@ -19,7 +19,7 @@
import dev.vality.newway.domain.enums.ChargebackStatus;
import dev.vality.newway.domain.tables.pojos.Chargeback;
import dev.vality.newway.domain.tables.pojos.Payment;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.invoicing.InvoicingHandler;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackLevyChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackLevyChangedHandler.java
index 86294133..ba5192fb 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackLevyChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackLevyChangedHandler.java
@@ -12,7 +12,7 @@
import dev.vality.newway.dao.invoicing.iface.ChargebackDao;
import dev.vality.newway.domain.enums.PaymentChangeType;
import dev.vality.newway.domain.tables.pojos.Chargeback;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.invoicing.InvoicingHandler;
import dev.vality.newway.service.CashFlowService;
import lombok.Getter;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackStageChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackStageChangedHandler.java
index 3d8b83ad..4e93fee4 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackStageChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackStageChangedHandler.java
@@ -14,7 +14,7 @@
import dev.vality.newway.domain.enums.ChargebackStage;
import dev.vality.newway.domain.enums.PaymentChangeType;
import dev.vality.newway.domain.tables.pojos.Chargeback;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.invoicing.InvoicingHandler;
import dev.vality.newway.service.CashFlowService;
import lombok.Getter;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackStatusChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackStatusChangedHandler.java
index ebe1f23e..39f931e9 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackStatusChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/chargeback/InvoicePaymentChargebackStatusChangedHandler.java
@@ -14,7 +14,7 @@
import dev.vality.newway.domain.enums.ChargebackStatus;
import dev.vality.newway.domain.enums.PaymentChangeType;
import dev.vality.newway.domain.tables.pojos.Chargeback;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.invoicing.InvoicingHandler;
import dev.vality.newway.service.CashFlowService;
import lombok.Getter;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/refund/InvoicePaymentRefundCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/refund/InvoicePaymentRefundCreatedHandler.java
index 12caefa6..6ef785c1 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/refund/InvoicePaymentRefundCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/refund/InvoicePaymentRefundCreatedHandler.java
@@ -20,9 +20,9 @@
import dev.vality.newway.domain.tables.pojos.CashFlow;
import dev.vality.newway.domain.tables.pojos.Payment;
import dev.vality.newway.domain.tables.pojos.Refund;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.cash.flow.CashFlowFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.invoicing.InvoicingHandler;
-import dev.vality.newway.util.CashFlowUtil;
import dev.vality.newway.util.JsonUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@@ -99,8 +99,8 @@ public void handle(InvoiceChange invoiceChange, MachineEvent event, Integer chan
refundDao.save(refund).ifPresentOrElse(
id -> {
- List cashFlowList = CashFlowUtil
- .convertCashFlows(invoicePaymentRefundCreated.getCashFlow(), id, PaymentChangeType.refund);
+ List cashFlowList = CashFlowFactory.build(
+ invoicePaymentRefundCreated.getCashFlow(), id, PaymentChangeType.refund);
cashFlowDao.save(cashFlowList);
refundDao.updateCommissions(id);
log.info("Refund has been saved, sequenceId={}, invoiceId={}, paymentId={}, refundId={}",
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/refund/InvoicePaymentRefundSessionChangeTransactionBoundHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/refund/InvoicePaymentRefundSessionChangeTransactionBoundHandler.java
index 20e98886..45e90295 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/refund/InvoicePaymentRefundSessionChangeTransactionBoundHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/refund/InvoicePaymentRefundSessionChangeTransactionBoundHandler.java
@@ -13,7 +13,7 @@
import dev.vality.newway.dao.invoicing.iface.RefundDao;
import dev.vality.newway.domain.enums.PaymentChangeType;
import dev.vality.newway.domain.tables.pojos.Refund;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.invoicing.InvoicingHandler;
import dev.vality.newway.service.CashFlowService;
import dev.vality.newway.util.JsonUtil;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/refund/InvoicePaymentRefundStatusChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/refund/InvoicePaymentRefundStatusChangedHandler.java
index 7acea134..c2f22d59 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/refund/InvoicePaymentRefundStatusChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/invoicing/refund/InvoicePaymentRefundStatusChangedHandler.java
@@ -14,7 +14,7 @@
import dev.vality.newway.domain.enums.PaymentChangeType;
import dev.vality.newway.domain.enums.RefundStatus;
import dev.vality.newway.domain.tables.pojos.Refund;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.invoicing.InvoicingHandler;
import dev.vality.newway.service.CashFlowService;
import dev.vality.newway.util.JsonUtil;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/limiter/LimitConfigCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/limiter/LimitConfigCreatedHandler.java
new file mode 100644
index 00000000..b01aa1f0
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/limiter/LimitConfigCreatedHandler.java
@@ -0,0 +1,113 @@
+package dev.vality.newway.handler.event.stock.impl.limiter;
+
+import dev.vality.geck.common.util.TBaseUtil;
+import dev.vality.geck.common.util.TypeUtil;
+import dev.vality.geck.filter.Filter;
+import dev.vality.geck.filter.PathConditionFilter;
+import dev.vality.geck.filter.condition.IsNullCondition;
+import dev.vality.geck.filter.rule.PathConditionRule;
+import dev.vality.limiter.config.LimitScopeType;
+import dev.vality.limiter.config.TimestampedChange;
+import dev.vality.machinegun.eventsink.MachineEvent;
+import dev.vality.newway.dao.limiter.LimitConfigDao;
+import dev.vality.newway.domain.enums.*;
+import dev.vality.newway.domain.tables.pojos.LimitConfig;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
+import dev.vality.newway.util.JsonUtil;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class LimitConfigCreatedHandler implements LimitConfigHandler {
+
+ private final LimitConfigDao limitConfigDao;
+ private final MachineEventCopyFactory limitConfigMachineEventCopyFactory;
+
+ @Getter
+ private final Filter filter = new PathConditionFilter(new PathConditionRule(
+ "change.created",
+ new IsNullCondition().not()));
+
+ @Override
+ @Transactional(propagation = Propagation.REQUIRED)
+ public void handle(TimestampedChange timestampedChange, MachineEvent event) {
+ var change = timestampedChange.getChange();
+ var limitConfigSource = change.getCreated().getLimitConfig();
+ var limitConfigId = limitConfigSource.getId();
+ var sequenceId = event.getEventId();
+ var sourceId = event.getSourceId();
+ log.info("Start LimitConfig created handling, sequenceId={}, limitConfigId={}", sequenceId, limitConfigId);
+ var limitConfig = limitConfigMachineEventCopyFactory.create(
+ event, sequenceId, sourceId, timestampedChange.getOccuredAt());
+ limitConfig.setLimitConfigId(limitConfigId);
+ limitConfig.setProcessorType(limitConfigSource.getProcessorType());
+ limitConfig.setCreatedAt(TypeUtil.stringToLocalDateTime(limitConfigSource.getCreatedAt()));
+ limitConfig.setStartedAt(TypeUtil.stringToLocalDateTime(limitConfigSource.getStartedAt()));
+ limitConfig.setShardSize(limitConfigSource.getShardSize());
+ if (limitConfigSource.isSetTimeRangeType()) {
+ limitConfig.setTimeRangeType(TBaseUtil.unionFieldToEnum(
+ limitConfigSource.getTimeRangeType(), LimitConfigTimeRangeType.class));
+ switch (limitConfigSource.getTimeRangeType().getSetField()) {
+ case CALENDAR -> limitConfig.setTimeRangeTypeCalendar(TBaseUtil.unionFieldToEnum(
+ limitConfigSource.getTimeRangeType().getCalendar(),
+ LimitConfigTimeRangeTypeCalendar.class));
+ case INTERVAL -> limitConfig.setTimeRangeTypeIntervalAmount(
+ limitConfigSource.getTimeRangeType().getInterval().getAmount());
+ }
+ }
+ if (limitConfigSource.isSetContextType()) {
+ limitConfig.setLimitContextType(TBaseUtil.unionFieldToEnum(
+ limitConfigSource.getContextType(), LimitConfigLimitContextType.class));
+ }
+ if (limitConfigSource.isSetType()) {
+ if (limitConfigSource.getType().isSetTurnover()) {
+ var turnover = limitConfigSource.getType().getTurnover();
+ if (turnover.isSetMetric()) {
+ var metric = turnover.getMetric();
+ limitConfig.setLimitTypeTurnoverMetric(
+ TBaseUtil.unionFieldToEnum(metric, LimitConfigLimitTypeTurnoverMetric.class));
+ if (metric.isSetAmount()) {
+ limitConfig.setLimitTypeTurnoverMetricAmountCurrency(metric.getAmount().getCurrency());
+ }
+ }
+ }
+ }
+ if (limitConfigSource.isSetScope()) {
+ limitConfig.setLimitScope(TBaseUtil.unionFieldToEnum(
+ limitConfigSource.getScope(), LimitConfigLimitScope.class));
+ switch (limitConfigSource.getScope().getSetField()) {
+ case SINGLE -> limitConfig.setLimitScopeTypesJson(
+ getLimitScopeTypesJson(Set.of(limitConfigSource.getScope().getSingle())));
+ case MULTI -> limitConfig.setLimitScopeTypesJson(
+ getLimitScopeTypesJson(limitConfigSource.getScope().getMulti()));
+ }
+ }
+ limitConfig.setDescription(limitConfigSource.getDescription());
+ if (limitConfigSource.isSetOpBehaviour() && limitConfigSource.getOpBehaviour().isSetInvoicePaymentRefund()) {
+ limitConfig.setOperationLimitBehaviour(TBaseUtil.unionFieldToEnum(
+ limitConfigSource.getOpBehaviour().getInvoicePaymentRefund(),
+ LimitConfigOperationLimitBehaviour.class));
+ }
+
+ limitConfigDao.save(limitConfig).ifPresentOrElse(
+ dbContractId -> log.info("LimitConfig created has been saved, sequenceId={}, limitConfigId={}",
+ sequenceId, limitConfigId),
+ () -> log.info("LimitConfig created bound duplicated, sequenceId={}, limitConfigId={}",
+ sequenceId, limitConfigId));
+ }
+
+ private String getLimitScopeTypesJson(Set limitScopeTypes) {
+ return JsonUtil.objectToJsonString(limitScopeTypes.stream()
+ .map(JsonUtil::thriftBaseToJsonNode)
+ .collect(Collectors.toList()));
+ }
+}
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/limiter/LimitConfigHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/limiter/LimitConfigHandler.java
new file mode 100644
index 00000000..504b5d53
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/limiter/LimitConfigHandler.java
@@ -0,0 +1,8 @@
+package dev.vality.newway.handler.event.stock.impl.limiter;
+
+import dev.vality.limiter.config.TimestampedChange;
+import dev.vality.machinegun.eventsink.MachineEvent;
+import dev.vality.newway.handler.event.stock.Handler;
+
+public interface LimitConfigHandler extends Handler {
+}
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/contract/ContractCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/contract/ContractCreatedHandler.java
index 2515e08b..fe1d8ebd 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/contract/ContractCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/contract/ContractCreatedHandler.java
@@ -15,7 +15,7 @@
import dev.vality.newway.factory.claim.effect.ClaimEffectCopyFactory;
import dev.vality.newway.handler.event.stock.impl.partymngmnt.AbstractClaimChangedHandler;
import dev.vality.newway.util.ContractUtil;
-import dev.vality.newway.util.ContractorUtil;
+import dev.vality.newway.factory.contractor.ContractorFactory;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
@@ -118,7 +118,7 @@ private void updateContractReference(MachineEvent event, Integer changeId, long
String contractId, String partyId, String contractorId, Long cntrctId,
Integer claimEffectId) {
if (contractCreated.isSetContractor()) {
- Contractor contractor = ContractorUtil.convertContractor(sequenceId, event.getCreatedAt(),
+ Contractor contractor = ContractorFactory.build(sequenceId, event.getCreatedAt(),
partyId, contractCreated.getContractor(), contractorId, changeId, claimEffectId);
contractorDao.save(contractor);
}
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/contractor/ContractorCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/contractor/ContractorCreatedHandler.java
index c00a796b..0b13a8b6 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/contractor/ContractorCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/contractor/ContractorCreatedHandler.java
@@ -9,7 +9,7 @@
import dev.vality.newway.dao.party.iface.PartyDao;
import dev.vality.newway.domain.tables.pojos.Contractor;
import dev.vality.newway.handler.event.stock.impl.partymngmnt.AbstractClaimChangedHandler;
-import dev.vality.newway.util.ContractorUtil;
+import dev.vality.newway.factory.contractor.ContractorFactory;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
@@ -55,7 +55,7 @@ private void handleEvent(MachineEvent event, Integer changeId, long eventId, lon
eventId, partyId, contractorId);
partyDao.get(partyId); //check party is exist
- Contractor contractor = ContractorUtil.convertContractor(
+ Contractor contractor = ContractorFactory.build(
eventId, event.getCreatedAt(), partyId, contractorCreated, contractorId, changeId, claimEffectId);
contractor.setIdentificationalLevel(partyContractor.getStatus().name());
contractorDao.save(contractor).ifPresentOrElse(
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartyBlockingHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartyBlockingHandler.java
index 9faf6a82..5c53a4ed 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartyBlockingHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartyBlockingHandler.java
@@ -11,7 +11,7 @@
import dev.vality.machinegun.eventsink.MachineEvent;
import dev.vality.newway.dao.party.iface.PartyDao;
import dev.vality.newway.domain.tables.pojos.Party;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.partymngmnt.PartyManagementHandler;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartyCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartyCreatedHandler.java
index 1dabd73e..006ad437 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartyCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartyCreatedHandler.java
@@ -12,7 +12,7 @@
import dev.vality.newway.domain.enums.Blocking;
import dev.vality.newway.domain.enums.Suspension;
import dev.vality.newway.domain.tables.pojos.Party;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.partymngmnt.PartyManagementHandler;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartyMetaSetHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartyMetaSetHandler.java
index ec1d8fbf..8f231185 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartyMetaSetHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartyMetaSetHandler.java
@@ -9,7 +9,7 @@
import dev.vality.machinegun.eventsink.MachineEvent;
import dev.vality.newway.dao.party.iface.PartyDao;
import dev.vality.newway.domain.tables.pojos.Party;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.partymngmnt.PartyManagementHandler;
import dev.vality.newway.util.JsonUtil;
import lombok.Getter;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartyRevisionChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartyRevisionChangedHandler.java
index 32275f28..365f9e52 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartyRevisionChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartyRevisionChangedHandler.java
@@ -11,7 +11,7 @@
import dev.vality.newway.dao.party.iface.PartyDao;
import dev.vality.newway.dao.party.iface.RevisionDao;
import dev.vality.newway.domain.tables.pojos.Party;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.partymngmnt.PartyManagementHandler;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartySuspensionHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartySuspensionHandler.java
index 57c9a936..99df479f 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartySuspensionHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/partymngmnt/party/PartySuspensionHandler.java
@@ -11,7 +11,7 @@
import dev.vality.machinegun.eventsink.MachineEvent;
import dev.vality.newway.dao.party.iface.PartyDao;
import dev.vality.newway.domain.tables.pojos.Party;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.handler.event.stock.impl.partymngmnt.PartyManagementHandler;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolHasAbandonedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolHasAbandonedHandler.java
index 87927c7f..33931f02 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolHasAbandonedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolHasAbandonedHandler.java
@@ -9,7 +9,7 @@
import dev.vality.newway.dao.recurrent.payment.tool.iface.RecurrentPaymentToolDao;
import dev.vality.newway.domain.enums.RecurrentPaymentToolStatus;
import dev.vality.newway.domain.tables.pojos.RecurrentPaymentTool;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolHasAcquiredHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolHasAcquiredHandler.java
index 79c53bec..951e3953 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolHasAcquiredHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolHasAcquiredHandler.java
@@ -9,7 +9,7 @@
import dev.vality.newway.dao.recurrent.payment.tool.iface.RecurrentPaymentToolDao;
import dev.vality.newway.domain.enums.RecurrentPaymentToolStatus;
import dev.vality.newway.domain.tables.pojos.RecurrentPaymentTool;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolHasCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolHasCreatedHandler.java
index adcf593b..f67ce263 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolHasCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolHasCreatedHandler.java
@@ -14,7 +14,7 @@
import dev.vality.newway.domain.enums.PaymentToolType;
import dev.vality.newway.domain.enums.RecurrentPaymentToolStatus;
import dev.vality.newway.domain.tables.pojos.RecurrentPaymentTool;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.util.JsonUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolHasFailedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolHasFailedHandler.java
index b78fcf0c..2ddde637 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolHasFailedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolHasFailedHandler.java
@@ -9,7 +9,7 @@
import dev.vality.newway.dao.recurrent.payment.tool.iface.RecurrentPaymentToolDao;
import dev.vality.newway.domain.enums.RecurrentPaymentToolStatus;
import dev.vality.newway.domain.tables.pojos.RecurrentPaymentTool;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.util.JsonUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolRiskScoreChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolRiskScoreChangedHandler.java
index d7915f37..c1afef15 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolRiskScoreChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolRiskScoreChangedHandler.java
@@ -8,7 +8,7 @@
import dev.vality.machinegun.eventsink.MachineEvent;
import dev.vality.newway.dao.recurrent.payment.tool.iface.RecurrentPaymentToolDao;
import dev.vality.newway.domain.tables.pojos.RecurrentPaymentTool;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolRouteChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolRouteChangedHandler.java
index 98ecdb53..19c1ae30 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolRouteChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolRouteChangedHandler.java
@@ -8,7 +8,7 @@
import dev.vality.machinegun.eventsink.MachineEvent;
import dev.vality.newway.dao.recurrent.payment.tool.iface.RecurrentPaymentToolDao;
import dev.vality.newway.domain.tables.pojos.RecurrentPaymentTool;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolSessionChangedTransactionBoundHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolSessionChangedTransactionBoundHandler.java
index fc7b58fd..37faf404 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolSessionChangedTransactionBoundHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/recurrent/payment/tool/RecurrentPaymentToolSessionChangedTransactionBoundHandler.java
@@ -9,7 +9,7 @@
import dev.vality.machinegun.eventsink.MachineEvent;
import dev.vality.newway.dao.recurrent.payment.tool.iface.RecurrentPaymentToolDao;
import dev.vality.newway.domain.tables.pojos.RecurrentPaymentTool;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.util.JsonUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/source/SourceAccountCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/source/SourceAccountCreatedHandler.java
index be93dc27..9b1e930d 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/source/SourceAccountCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/source/SourceAccountCreatedHandler.java
@@ -12,7 +12,7 @@
import dev.vality.newway.dao.source.iface.SourceDao;
import dev.vality.newway.domain.tables.pojos.Identity;
import dev.vality.newway.domain.tables.pojos.Source;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/source/SourceCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/source/SourceCreatedHandler.java
index 9fd4de57..5e9ce9e6 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/source/SourceCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/source/SourceCreatedHandler.java
@@ -12,7 +12,7 @@
import dev.vality.newway.dao.source.iface.SourceDao;
import dev.vality.newway.domain.enums.SourceStatus;
import dev.vality.newway.domain.tables.pojos.Source;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/source/SourceStatusChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/source/SourceStatusChangedHandler.java
index 276ccfe6..5cfa662a 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/source/SourceStatusChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/source/SourceStatusChangedHandler.java
@@ -12,7 +12,7 @@
import dev.vality.newway.dao.source.iface.SourceDao;
import dev.vality.newway.domain.enums.SourceStatus;
import dev.vality.newway.domain.tables.pojos.Source;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/wallet/WalletAccountCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/wallet/WalletAccountCreatedHandler.java
index 6ff4d804..2e2a900d 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/wallet/WalletAccountCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/wallet/WalletAccountCreatedHandler.java
@@ -12,7 +12,7 @@
import dev.vality.newway.dao.wallet.iface.WalletDao;
import dev.vality.newway.domain.tables.pojos.Identity;
import dev.vality.newway.domain.tables.pojos.Wallet;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/wallet/WalletCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/wallet/WalletCreatedHandler.java
index 6c7adc87..5094f0df 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/wallet/WalletCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/wallet/WalletCreatedHandler.java
@@ -9,7 +9,7 @@
import dev.vality.machinegun.eventsink.MachineEvent;
import dev.vality.newway.dao.wallet.iface.WalletDao;
import dev.vality.newway.domain.tables.pojos.Wallet;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalAdjustmentCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalAdjustmentCreatedHandler.java
new file mode 100644
index 00000000..d337491a
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalAdjustmentCreatedHandler.java
@@ -0,0 +1,85 @@
+package dev.vality.newway.handler.event.stock.impl.withdrawal;
+
+import dev.vality.fistful.withdrawal.TimestampedChange;
+import dev.vality.fistful.withdrawal.adjustment.Adjustment;
+import dev.vality.fistful.withdrawal.adjustment.CashFlowChangePlan;
+import dev.vality.fistful.withdrawal.adjustment.ChangesPlan;
+import dev.vality.fistful.withdrawal.adjustment.DataRevisionChangePlan;
+import dev.vality.fistful.withdrawal.status.Status;
+import dev.vality.geck.common.util.TBaseUtil;
+import dev.vality.geck.filter.Filter;
+import dev.vality.geck.filter.PathConditionFilter;
+import dev.vality.geck.filter.condition.IsNullCondition;
+import dev.vality.geck.filter.rule.PathConditionRule;
+import dev.vality.machinegun.eventsink.MachineEvent;
+import dev.vality.newway.dao.withdrawal.iface.WithdrawalAdjustmentDao;
+import dev.vality.newway.domain.enums.WithdrawalAdjustmentStatus;
+import dev.vality.newway.domain.enums.WithdrawalAdjustmentType;
+import dev.vality.newway.domain.enums.WithdrawalStatus;
+import dev.vality.newway.domain.tables.pojos.WithdrawalAdjustment;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
+import dev.vality.newway.util.FistfulCashFlowUtil;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class WithdrawalAdjustmentCreatedHandler implements WithdrawalHandler, WithdrawalAdjustmentHandler {
+
+ private final WithdrawalAdjustmentDao withdrawalAdjustmentDao;
+ private final MachineEventCopyFactory machineEventCopyFactory;
+
+ @Getter
+ private final Filter filter =
+ new PathConditionFilter(new PathConditionRule("change.adjustment.payload.created.adjustment", new IsNullCondition().not()));
+
+ @Override
+ public void handle(TimestampedChange timestampedChange, MachineEvent event) {
+ Adjustment adjustmentDamsel = timestampedChange.getChange().getAdjustment().getPayload().getCreated().getAdjustment();
+ long sequenceId = event.getEventId();
+ String withdrawalId = event.getSourceId();
+ String withdrawalAdjustmentId = adjustmentDamsel.getId();
+ log.info("Start withdrawal adjustment created handling, sequenceId={}, withdrawalId={}, withdrawalAdjustmentId={}",
+ sequenceId, withdrawalId, withdrawalAdjustmentId);
+
+ WithdrawalAdjustment withdrawalAdjustment =
+ machineEventCopyFactory.create(event, sequenceId, withdrawalAdjustmentId, timestampedChange.getOccuredAt());
+ withdrawalAdjustment.setExternalId(adjustmentDamsel.getExternalId());
+ withdrawalAdjustment.setStatus(WithdrawalAdjustmentStatus.pending);
+ withdrawalAdjustment.setPartyRevision(adjustmentDamsel.getPartyRevision());
+ withdrawalAdjustment.setWithdrawalId(withdrawalId);
+ ChangesPlan changesPlan = adjustmentDamsel.getChangesPlan();
+ if (changesPlan.isSetNewStatus()) {
+ Status newStatus = changesPlan.getNewStatus().getNewStatus();
+ withdrawalAdjustment.setType(WithdrawalAdjustmentType.status_change);
+ withdrawalAdjustment.setWithdrawalStatus(TBaseUtil.unionFieldToEnum(newStatus, WithdrawalStatus.class));
+ } else if (changesPlan.isSetNewDomainRevision()) {
+ DataRevisionChangePlan newDomainRevision = changesPlan.getNewDomainRevision();
+ withdrawalAdjustment.setType(WithdrawalAdjustmentType.domain_revision);
+ withdrawalAdjustment.setDomainRevision(newDomainRevision.getNewDomainRevision());
+ }
+ if (changesPlan.isSetNewCashFlow()) {
+ CashFlowChangePlan cashFlow = changesPlan.getNewCashFlow();
+ long amount = computeAmount(cashFlow);
+ withdrawalAdjustment.setAmount(amount);
+ withdrawalAdjustment
+ .setProviderFee(FistfulCashFlowUtil.getFistfulProviderFee(cashFlow.getNewCashFlow().getPostings()));
+ withdrawalAdjustment.setFee(FistfulCashFlowUtil.getFistfulFee(cashFlow.getNewCashFlow().getPostings()));
+ }
+ withdrawalAdjustmentDao.save(withdrawalAdjustment).ifPresentOrElse(
+ id -> log.info("withdrawalAdjustment created has been saved, sequenceId={}, withdrawalId={}, withdrawalAdjustmentId={}",
+ sequenceId, withdrawalId, withdrawalAdjustmentId),
+ () -> log.info("withdrawalAdjustment created duplicated, sequenceId={}, withdrawalId={}, withdrawalAdjustmentId={}",
+ sequenceId, withdrawalId, withdrawalAdjustmentId));
+ }
+
+ private long computeAmount(CashFlowChangePlan cashFlow) {
+ Long oldAmount = FistfulCashFlowUtil.computeAmount(cashFlow.getOldCashFlowInverted().getPostings());
+ Long newAmount = FistfulCashFlowUtil.computeAmount(cashFlow.getNewCashFlow().getPostings());
+ return newAmount + oldAmount;
+ }
+
+}
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalAdjustmentHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalAdjustmentHandler.java
new file mode 100644
index 00000000..cca02860
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalAdjustmentHandler.java
@@ -0,0 +1,4 @@
+package dev.vality.newway.handler.event.stock.impl.withdrawal;
+
+public interface WithdrawalAdjustmentHandler {
+}
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalAdjustmentStatusChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalAdjustmentStatusChangedHandler.java
new file mode 100644
index 00000000..f2046c63
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalAdjustmentStatusChangedHandler.java
@@ -0,0 +1,59 @@
+package dev.vality.newway.handler.event.stock.impl.withdrawal;
+
+import dev.vality.fistful.withdrawal.AdjustmentChange;
+import dev.vality.fistful.withdrawal.TimestampedChange;
+import dev.vality.fistful.withdrawal.adjustment.Status;
+import dev.vality.geck.common.util.TBaseUtil;
+import dev.vality.geck.filter.Filter;
+import dev.vality.geck.filter.PathConditionFilter;
+import dev.vality.geck.filter.condition.IsNullCondition;
+import dev.vality.geck.filter.rule.PathConditionRule;
+import dev.vality.machinegun.eventsink.MachineEvent;
+import dev.vality.newway.dao.withdrawal.iface.WithdrawalAdjustmentDao;
+import dev.vality.newway.domain.enums.WithdrawalAdjustmentStatus;
+import dev.vality.newway.domain.tables.pojos.WithdrawalAdjustment;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class WithdrawalAdjustmentStatusChangedHandler implements WithdrawalHandler, WithdrawalAdjustmentHandler {
+
+ private final WithdrawalAdjustmentDao withdrawalAdjustmentDao;
+ private final MachineEventCopyFactory machineEventCopyFactory;
+
+ @Getter
+ private final Filter filter =
+ new PathConditionFilter(new PathConditionRule("change.adjustment.payload.status_changed.status", new IsNullCondition().not()));
+
+ @Override
+ public void handle(TimestampedChange timestampedChange, MachineEvent event) {
+ AdjustmentChange adjustmentChange = timestampedChange.getChange().getAdjustment();
+ Status status = adjustmentChange.getPayload().getStatusChanged().getStatus();
+ long sequenceId = event.getEventId();
+ String withdrawalId = event.getSourceId();
+ String withdrawalAdjustmentId = adjustmentChange.getId();
+ log.info("Start withdrawal adjustment status changed handling, " +
+ "sequenceId={}, withdrawalId={}, withdrawalAdjustmentId={}",
+ sequenceId, withdrawalId, withdrawalAdjustmentId);
+ final var withdrawalAdjustmentOld = withdrawalAdjustmentDao.getByIds(withdrawalId, withdrawalAdjustmentId);
+ var withdrawalAdjustmentNew = machineEventCopyFactory
+ .create(event, sequenceId, withdrawalAdjustmentId, withdrawalAdjustmentOld, timestampedChange.getOccuredAt());
+ withdrawalAdjustmentNew.setStatus(TBaseUtil.unionFieldToEnum(status, WithdrawalAdjustmentStatus.class));
+ withdrawalAdjustmentDao.save(withdrawalAdjustmentNew).ifPresentOrElse(
+ id -> {
+ Long oldId = withdrawalAdjustmentOld.getId();
+ log.info("Update not current for withdrawal adjustment with id={}", oldId);
+ withdrawalAdjustmentDao.updateNotCurrent(oldId);
+ log.info("WithdrawalAdjustment status have been changed, sequenceId={}, withdrawalId={}, withdrawalAdjustmentId={}",
+ sequenceId, withdrawalId, withdrawalAdjustmentId);
+ },
+ () -> log.info("WithdrawalAdjustment status have been changed, sequenceId={}, withdrawalId={}, withdrawalAdjustmentId={}",
+ sequenceId, withdrawalId, withdrawalAdjustmentId));
+ }
+
+}
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalAdjustmentTransferCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalAdjustmentTransferCreatedHandler.java
new file mode 100644
index 00000000..0aa11390
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalAdjustmentTransferCreatedHandler.java
@@ -0,0 +1,79 @@
+package dev.vality.newway.handler.event.stock.impl.withdrawal;
+
+import dev.vality.fistful.cashflow.FinalCashFlowPosting;
+import dev.vality.fistful.withdrawal.Change;
+import dev.vality.fistful.withdrawal.TimestampedChange;
+import dev.vality.fistful.withdrawal.adjustment.TransferChange;
+import dev.vality.geck.filter.Filter;
+import dev.vality.geck.filter.PathConditionFilter;
+import dev.vality.geck.filter.condition.IsNullCondition;
+import dev.vality.geck.filter.rule.PathConditionRule;
+import dev.vality.machinegun.eventsink.MachineEvent;
+import dev.vality.newway.dao.withdrawal.iface.FistfulCashFlowDao;
+import dev.vality.newway.dao.withdrawal.iface.WithdrawalAdjustmentDao;
+import dev.vality.newway.domain.enums.FistfulCashFlowChangeType;
+import dev.vality.newway.domain.enums.WithdrawalTransferStatus;
+import dev.vality.newway.domain.tables.pojos.FistfulCashFlow;
+import dev.vality.newway.domain.tables.pojos.WithdrawalAdjustment;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
+import dev.vality.newway.util.FistfulCashFlowUtil;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class WithdrawalAdjustmentTransferCreatedHandler implements WithdrawalHandler, WithdrawalAdjustmentHandler {
+
+ private final WithdrawalAdjustmentDao withdrawalAdjustmentDao;
+ private final FistfulCashFlowDao fistfulCashFlowDao;
+ private final MachineEventCopyFactory machineEventCopyFactory;
+
+ @Getter
+ private final Filter filter = new PathConditionFilter(
+ new PathConditionRule(
+ "change.adjustment.payload.transfer.payload.created",
+ new IsNullCondition().not())
+ );
+
+ @Override
+ public void handle(TimestampedChange timestampedChange, MachineEvent event) {
+ Change change = timestampedChange.getChange();
+ long sequenceId = event.getEventId();
+ String withdrawalId = event.getSourceId();
+ String withdrawalAdjustmentId = change.getAdjustment().getId();
+ TransferChange transferChange = change.getAdjustment().getPayload().getTransfer();
+ log.info("Start withdrawal adjustment transfer created handling, " +
+ "sequenceId={}, withdrawalId={}, withdrawalAdjustmentId={}",
+ sequenceId, withdrawalId, withdrawalAdjustmentId);
+ log.debug("Transfer={}", transferChange);
+ final var withdrawalAdjustmentOld = withdrawalAdjustmentDao.getByIds(withdrawalId, withdrawalAdjustmentId);
+ var withdrawalAdjustmentNew = machineEventCopyFactory
+ .create(event, sequenceId, withdrawalAdjustmentId, withdrawalAdjustmentOld, timestampedChange.getOccuredAt());
+
+ withdrawalAdjustmentNew.setWithdrawalTransferStatus(WithdrawalTransferStatus.created);
+ List postings =
+ transferChange.getPayload().getCreated().getTransfer().getCashflow().getPostings();
+ withdrawalAdjustmentNew.setFee(FistfulCashFlowUtil.getFistfulFee(postings));
+ withdrawalAdjustmentNew.setProviderFee(FistfulCashFlowUtil.getFistfulProviderFee(postings));
+
+ withdrawalAdjustmentDao.save(withdrawalAdjustmentNew).ifPresentOrElse(
+ id -> {
+ Long oldId = withdrawalAdjustmentOld.getId();
+ log.info("Update not current for withdrawal adjustment with id={}", oldId);
+ withdrawalAdjustmentDao.updateNotCurrent(oldId);
+ List fistfulCashFlows = FistfulCashFlowUtil
+ .convertFistfulCashFlows(postings, id, FistfulCashFlowChangeType.withdrawal_adjustment);
+ fistfulCashFlowDao.save(fistfulCashFlows);
+ log.info("Withdrawal adjustment transfer have been changed, sequenceId={}, withdrawalId={}, withdrawalAdjustmentId={}",
+ sequenceId, withdrawalId, withdrawalAdjustmentId);
+ },
+ () -> log.info("Withdrawal adjustment transfer have been changed, sequenceId={}, withdrawalId={}, withdrawalAdjustmentId={}",
+ sequenceId, withdrawalId, withdrawalAdjustmentId));
+ }
+
+}
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalAdjustmentTransferStatusChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalAdjustmentTransferStatusChangedHandler.java
new file mode 100644
index 00000000..3e213877
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalAdjustmentTransferStatusChangedHandler.java
@@ -0,0 +1,77 @@
+package dev.vality.newway.handler.event.stock.impl.withdrawal;
+
+import dev.vality.fistful.transfer.Status;
+import dev.vality.fistful.withdrawal.Change;
+import dev.vality.fistful.withdrawal.TimestampedChange;
+import dev.vality.fistful.withdrawal.adjustment.TransferChange;
+import dev.vality.geck.common.util.TBaseUtil;
+import dev.vality.geck.filter.Filter;
+import dev.vality.geck.filter.PathConditionFilter;
+import dev.vality.geck.filter.condition.IsNullCondition;
+import dev.vality.geck.filter.rule.PathConditionRule;
+import dev.vality.machinegun.eventsink.MachineEvent;
+import dev.vality.newway.dao.withdrawal.iface.FistfulCashFlowDao;
+import dev.vality.newway.dao.withdrawal.iface.WithdrawalAdjustmentDao;
+import dev.vality.newway.domain.enums.FistfulCashFlowChangeType;
+import dev.vality.newway.domain.enums.WithdrawalTransferStatus;
+import dev.vality.newway.domain.tables.pojos.FistfulCashFlow;
+import dev.vality.newway.domain.tables.pojos.WithdrawalAdjustment;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class WithdrawalAdjustmentTransferStatusChangedHandler implements WithdrawalHandler, WithdrawalAdjustmentHandler {
+
+ private final WithdrawalAdjustmentDao withdrawalAdjustmentDao;
+ private final FistfulCashFlowDao fistfulCashFlowDao;
+ private final MachineEventCopyFactory machineEventCopyFactory;
+
+ @Getter
+ private final Filter filter = new PathConditionFilter(
+ new PathConditionRule(
+ "change.adjustment.payload.transfer.payload.status_changed.status",
+ new IsNullCondition().not()));
+
+ @Override
+ public void handle(TimestampedChange timestampedChange, MachineEvent event) {
+ Change change = timestampedChange.getChange();
+ TransferChange transferChange = change.getAdjustment().getPayload().getTransfer();
+ Status status = transferChange.getPayload().getStatusChanged().getStatus();
+ long sequenceId = event.getEventId();
+ String withdrawalId = event.getSourceId();
+ String withdrawalAdjustmentId = change.getAdjustment().getId();
+ log.info("Start withdrawal adjustment transfer status changed handling, sequenceId={}, withdrawalId={}, withdrawalAdjustmentId={}, transfer={}",
+ sequenceId, withdrawalId, withdrawalAdjustmentId, transferChange);
+
+ final WithdrawalAdjustment withdrawalAdjustmentOld = withdrawalAdjustmentDao.getByIds(withdrawalId, withdrawalAdjustmentId);
+ WithdrawalAdjustment withdrawalAdjustmentNew = machineEventCopyFactory
+ .create(event, sequenceId, withdrawalAdjustmentId, withdrawalAdjustmentOld, timestampedChange.getOccuredAt());
+ withdrawalAdjustmentNew.setWithdrawalTransferStatus(TBaseUtil.unionFieldToEnum(status, WithdrawalTransferStatus.class));
+
+ withdrawalAdjustmentDao.save(withdrawalAdjustmentNew).ifPresentOrElse(
+ id -> {
+ Long oldId = withdrawalAdjustmentOld.getId();
+ log.info("Update not current for withdrawal adjustment with id={}", oldId);
+ withdrawalAdjustmentDao.updateNotCurrent(oldId);
+ List cashFlows =
+ fistfulCashFlowDao.getByObjId(oldId, FistfulCashFlowChangeType.withdrawal_adjustment);
+ cashFlows.forEach(pcf -> {
+ pcf.setId(null);
+ pcf.setObjId(id);
+ });
+ fistfulCashFlowDao.save(cashFlows);
+ log.info("Withdrawal adjustment transfer status have been changed, sequenceId={}, withdrawalId={}, withdrawalAdjustmentId={}",
+ sequenceId, withdrawalId, withdrawalAdjustmentId);
+ },
+ () -> log.info("Withdrawal adjustment transfer have been changed, sequenceId={}, withdrawalId={}, withdrawalAdjustmentId={}",
+ sequenceId, withdrawalId, withdrawalAdjustmentId));
+ }
+
+}
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalCreatedHandler.java
index 71e8561e..44cec14d 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalCreatedHandler.java
@@ -11,7 +11,7 @@
import dev.vality.newway.dao.withdrawal.iface.WithdrawalDao;
import dev.vality.newway.domain.enums.WithdrawalStatus;
import dev.vality.newway.domain.tables.pojos.Withdrawal;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -48,6 +48,9 @@ public void handle(TimestampedChange timestampedChange, MachineEvent event) {
withdrawal.setAmount(cash.getAmount());
withdrawal.setCurrencyCode(cash.getCurrency().getSymbolicCode());
withdrawal.setWithdrawalStatus(WithdrawalStatus.pending);
+ if (withdrawalDamsel.getRoute() != null && withdrawalDamsel.getRoute().isSetTerminalId()) {
+ withdrawal.setTerminalId(String.valueOf(withdrawalDamsel.getRoute().getTerminalId()));
+ }
withdrawalDao.save(withdrawal).ifPresentOrElse(
dbContractId -> log
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalRouteChangeHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalRouteChangeHandler.java
index 06997275..f828be47 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalRouteChangeHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalRouteChangeHandler.java
@@ -13,7 +13,7 @@
import dev.vality.newway.domain.enums.FistfulCashFlowChangeType;
import dev.vality.newway.domain.tables.pojos.FistfulCashFlow;
import dev.vality.newway.domain.tables.pojos.Withdrawal;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -54,6 +54,8 @@ public void handle(TimestampedChange timestampedChange, MachineEvent event) {
String providerIdLegacy = route.getProviderIdLegacy();
withdrawalNew.setProviderId(providerId);
withdrawalNew.setProviderIdLegacy(providerIdLegacy);
+ withdrawalNew.setTerminalId(route.isSetTerminalId()
+ ? String.valueOf(route.getTerminalId()) : null);
withdrawalDao.save(withdrawalNew).ifPresentOrElse(
id -> {
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalStatusChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalStatusChangedHandler.java
index 2043215f..bb8c97b5 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalStatusChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalStatusChangedHandler.java
@@ -15,7 +15,7 @@
import dev.vality.newway.domain.enums.WithdrawalStatus;
import dev.vality.newway.domain.tables.pojos.FistfulCashFlow;
import dev.vality.newway.domain.tables.pojos.Withdrawal;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.util.JsonUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalTransferCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalTransferCreatedHandler.java
index b712bc2e..1beb5b0b 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalTransferCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalTransferCreatedHandler.java
@@ -14,7 +14,7 @@
import dev.vality.newway.domain.enums.WithdrawalTransferStatus;
import dev.vality.newway.domain.tables.pojos.FistfulCashFlow;
import dev.vality.newway.domain.tables.pojos.Withdrawal;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.util.FistfulCashFlowUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalTransferStatusChangedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalTransferStatusChangedHandler.java
index c0915894..4cd1518d 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalTransferStatusChangedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/WithdrawalTransferStatusChangedHandler.java
@@ -15,7 +15,7 @@
import dev.vality.newway.domain.enums.WithdrawalTransferStatus;
import dev.vality.newway.domain.tables.pojos.FistfulCashFlow;
import dev.vality.newway.domain.tables.pojos.Withdrawal;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/session/WithdrawalSessionCreatedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/session/WithdrawalSessionCreatedHandler.java
index f04e1aad..d582afac 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/session/WithdrawalSessionCreatedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/session/WithdrawalSessionCreatedHandler.java
@@ -12,11 +12,10 @@
import dev.vality.geck.filter.rule.PathConditionRule;
import dev.vality.machinegun.eventsink.MachineEvent;
import dev.vality.newway.dao.withdrawal.session.iface.WithdrawalSessionDao;
-import dev.vality.newway.domain.enums.BankCardPaymentSystem;
import dev.vality.newway.domain.enums.DestinationResourceType;
import dev.vality.newway.domain.enums.WithdrawalSessionStatus;
import dev.vality.newway.domain.tables.pojos.WithdrawalSession;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -65,8 +64,7 @@ public void handle(TimestampedChange timestampedChange, MachineEvent event) {
withdrawalSession.setDestinationCardBin(bankCard.getBin());
withdrawalSession.setDestinationCardMaskedPan(bankCard.getMaskedPan());
if (bankCard.isSetPaymentSystem()) {
- withdrawalSession.setDestinationCardPaymentSystem(
- BankCardPaymentSystem.valueOf(bankCard.getPaymentSystem().getId().toLowerCase(Locale.ROOT)));
+ withdrawalSession.setDestinationCardPaymentSystem(bankCard.getPaymentSystem().getId());
}
withdrawalSession.setResourceBankCardBankName(bankCard.getBankName());
if (bankCard.isSetIssuerCountry()) {
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/session/WithdrawalSessionFinishedHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/session/WithdrawalSessionFinishedHandler.java
index 93dd4007..898a8464 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/session/WithdrawalSessionFinishedHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/session/WithdrawalSessionFinishedHandler.java
@@ -11,7 +11,7 @@
import dev.vality.newway.dao.withdrawal.session.iface.WithdrawalSessionDao;
import dev.vality.newway.domain.enums.WithdrawalSessionStatus;
import dev.vality.newway.domain.tables.pojos.WithdrawalSession;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.util.JsonUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/session/WithdrawalSessionNextStateHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/session/WithdrawalSessionNextStateHandler.java
index 26891fa1..f688f46f 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/session/WithdrawalSessionNextStateHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/session/WithdrawalSessionNextStateHandler.java
@@ -9,7 +9,7 @@
import dev.vality.machinegun.eventsink.MachineEvent;
import dev.vality.newway.dao.withdrawal.session.iface.WithdrawalSessionDao;
import dev.vality.newway.domain.tables.pojos.WithdrawalSession;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.util.JsonUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/session/WithdrawalSessionTransactionBoundHandler.java b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/session/WithdrawalSessionTransactionBoundHandler.java
index 8fd769c4..a26a80a2 100644
--- a/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/session/WithdrawalSessionTransactionBoundHandler.java
+++ b/src/main/java/dev/vality/newway/handler/event/stock/impl/withdrawal/session/WithdrawalSessionTransactionBoundHandler.java
@@ -12,7 +12,7 @@
import dev.vality.machinegun.eventsink.MachineEvent;
import dev.vality.newway.dao.withdrawal.session.iface.WithdrawalSessionDao;
import dev.vality.newway.domain.tables.pojos.WithdrawalSession;
-import dev.vality.newway.factory.MachineEventCopyFactory;
+import dev.vality.newway.factory.machine.event.MachineEventCopyFactory;
import dev.vality.newway.util.JsonUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/dev/vality/newway/handler/wrapper/WrapperHandler.java b/src/main/java/dev/vality/newway/handler/wrapper/WrapperHandler.java
new file mode 100644
index 00000000..0aca84eb
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/wrapper/WrapperHandler.java
@@ -0,0 +1,11 @@
+package dev.vality.newway.handler.wrapper;
+
+import java.util.List;
+
+public interface WrapperHandler {
+
+ boolean accept(List wrappers);
+
+ void saveBatch(List wrappers);
+
+}
diff --git a/src/main/java/dev/vality/newway/handler/wrapper/invoice/InvoiceCartWrapperHandler.java b/src/main/java/dev/vality/newway/handler/wrapper/invoice/InvoiceCartWrapperHandler.java
new file mode 100644
index 00000000..7c3d724a
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/wrapper/invoice/InvoiceCartWrapperHandler.java
@@ -0,0 +1,47 @@
+package dev.vality.newway.handler.wrapper.invoice;
+
+import dev.vality.newway.dao.invoicing.iface.InvoiceCartDao;
+import dev.vality.newway.domain.tables.pojos.InvoiceCart;
+import dev.vality.newway.handler.wrapper.WrapperHandler;
+import dev.vality.newway.model.InvoiceWrapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@RequiredArgsConstructor
+@Component
+public class InvoiceCartWrapperHandler implements WrapperHandler {
+
+ private final InvoiceCartDao invoiceCartDao;
+
+ @Override
+ public boolean accept(List wrappers) {
+ return wrappers.stream()
+ .map(InvoiceWrapper::getCarts)
+ .anyMatch(invoiceCarts -> !CollectionUtils.isEmpty(invoiceCarts));
+ }
+
+ @Override
+ public void saveBatch(List wrappers) {
+ List carts = wrappers.stream()
+ .map(InvoiceWrapper::getCarts)
+ .filter(Objects::nonNull)
+ .flatMap(Collection::stream)
+ .collect(Collectors.toList());
+ Set invoiceIds = carts.stream()
+ .map(InvoiceCart::getInvoiceId)
+ .collect(Collectors.toSet());
+ Set existingInvoiceIds = invoiceCartDao.getExistingInvoiceIds(invoiceIds);
+ carts.removeIf(cart -> existingInvoiceIds.contains(cart.getInvoiceId()));
+ if (!carts.isEmpty()) {
+ invoiceCartDao.save(carts);
+ }
+ }
+
+}
diff --git a/src/main/java/dev/vality/newway/handler/wrapper/invoice/InvoiceStatusInfoWrapperHandler.java b/src/main/java/dev/vality/newway/handler/wrapper/invoice/InvoiceStatusInfoWrapperHandler.java
new file mode 100644
index 00000000..d997a7fc
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/wrapper/invoice/InvoiceStatusInfoWrapperHandler.java
@@ -0,0 +1,53 @@
+package dev.vality.newway.handler.wrapper.invoice;
+
+import dev.vality.newway.dao.invoicing.iface.InvoiceStatusInfoDao;
+import dev.vality.newway.domain.tables.pojos.InvoiceStatusInfo;
+import dev.vality.newway.handler.wrapper.WrapperHandler;
+import dev.vality.newway.model.InvoiceWrapper;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@Slf4j
+@RequiredArgsConstructor
+@Component
+public class InvoiceStatusInfoWrapperHandler implements WrapperHandler {
+
+ private final InvoiceStatusInfoDao invoiceStatusInfoDao;
+
+ @Override
+ public boolean accept(List wrappers) {
+ return wrappers.stream()
+ .map(InvoiceWrapper::getInvoiceStatusInfo)
+ .anyMatch(Objects::nonNull);
+ }
+
+ @Override
+ public void saveBatch(List wrappers) {
+ saveInvoiceStatusInfos(wrappers);
+ switchCurrent(wrappers);
+ }
+
+ private void saveInvoiceStatusInfos(List wrappers) {
+ List invoiceStatusInfos = wrappers.stream()
+ .map(InvoiceWrapper::getInvoiceStatusInfo)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ invoiceStatusInfoDao.saveBatch(invoiceStatusInfos);
+ }
+
+ private void switchCurrent(List wrappers) {
+ Set invoiceStatusInfoChangedIds = wrappers.stream()
+ .map(InvoiceWrapper::getInvoiceStatusInfo)
+ .filter(Objects::nonNull)
+ .map(InvoiceStatusInfo::getInvoiceId)
+ .collect(Collectors.toSet());
+ log.info("Switch to current ids - invoiceStatusInfo:{}", invoiceStatusInfoChangedIds);
+ invoiceStatusInfoDao.switchCurrent(invoiceStatusInfoChangedIds);
+ }
+}
diff --git a/src/main/java/dev/vality/newway/handler/wrapper/invoice/InvoiceWrapperHandler.java b/src/main/java/dev/vality/newway/handler/wrapper/invoice/InvoiceWrapperHandler.java
new file mode 100644
index 00000000..33bd512b
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/wrapper/invoice/InvoiceWrapperHandler.java
@@ -0,0 +1,36 @@
+package dev.vality.newway.handler.wrapper.invoice;
+
+import dev.vality.newway.dao.invoicing.iface.InvoiceDao;
+import dev.vality.newway.domain.tables.pojos.Invoice;
+import dev.vality.newway.handler.wrapper.WrapperHandler;
+import dev.vality.newway.model.InvoiceWrapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@RequiredArgsConstructor
+@Component
+public class InvoiceWrapperHandler implements WrapperHandler {
+
+ private final InvoiceDao invoiceDao;
+
+ @Override
+ public boolean accept(List wrappers) {
+ return wrappers.stream()
+ .map(InvoiceWrapper::getInvoice)
+ .anyMatch(Objects::nonNull);
+ }
+
+ @Override
+ public void saveBatch(List wrappers) {
+ List invoices = wrappers.stream()
+ .map(InvoiceWrapper::getInvoice)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ invoiceDao.saveBatch(invoices);
+ }
+
+}
diff --git a/src/main/java/dev/vality/newway/handler/wrapper/payment/CashFlowWrapperHandler.java b/src/main/java/dev/vality/newway/handler/wrapper/payment/CashFlowWrapperHandler.java
new file mode 100644
index 00000000..a42ef999
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/wrapper/payment/CashFlowWrapperHandler.java
@@ -0,0 +1,96 @@
+package dev.vality.newway.handler.wrapper.payment;
+
+import dev.vality.newway.dao.invoicing.iface.CashFlowDao;
+import dev.vality.newway.dao.invoicing.iface.CashFlowLinkDao;
+import dev.vality.newway.dao.invoicing.impl.CashFlowLinkIdsGeneratorDaoImpl;
+import dev.vality.newway.domain.tables.pojos.CashFlow;
+import dev.vality.newway.domain.tables.pojos.CashFlowLink;
+import dev.vality.newway.handler.wrapper.WrapperHandler;
+import dev.vality.newway.model.CashFlowWrapper;
+import dev.vality.newway.model.InvoicePaymentEventIdHolder;
+import dev.vality.newway.model.InvoicingKey;
+import dev.vality.newway.factory.invoice.payment.InvoicePaymentEventIdHolderFactory;
+import dev.vality.newway.model.PaymentWrapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@RequiredArgsConstructor
+@Component
+public class CashFlowWrapperHandler implements WrapperHandler {
+
+ private final CashFlowLinkDao cashFlowLinkDao;
+
+ private final CashFlowDao cashFlowDao;
+
+ private final CashFlowLinkIdsGeneratorDaoImpl idsGenerator;
+
+ @Override
+ public boolean accept(List wrappers) {
+ return wrappers.stream()
+ .map(PaymentWrapper::getCashFlowWrapper)
+ .anyMatch(Objects::nonNull);
+ }
+
+ @Override
+ public void saveBatch(List wrappers) {
+ List cashFlowWrappers = wrappers.stream()
+ .map(PaymentWrapper::getCashFlowWrapper)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+
+ removeAlreadyProcessedWrappers(cashFlowWrappers);
+ if (CollectionUtils.isEmpty(wrappers)) {
+ return;
+ }
+ setLinkIds(cashFlowWrappers);
+ saveCashFlowLinks(cashFlowWrappers);
+ saveCashFlows(cashFlowWrappers);
+ }
+
+ private void removeAlreadyProcessedWrappers(List cashFlowWrappers) {
+ Set existingEvents = cashFlowLinkDao.getExistingEvents(
+ cashFlowWrappers.stream()
+ .map(CashFlowWrapper::getCashFlowLink)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList())
+ );
+ cashFlowWrappers.removeIf(wrapper ->
+ existingEvents.contains(InvoicePaymentEventIdHolderFactory.build(wrapper.getCashFlowLink()))
+ );
+ }
+
+ private void setLinkIds(List cashFlowWrappers) {
+ Iterator linkIdIterator = idsGenerator.get(cashFlowWrappers.size()).iterator();
+ for (CashFlowWrapper wrapper : cashFlowWrappers) {
+ Long linkId = linkIdIterator.next();
+ wrapper.getCashFlowLink().setId(linkId);
+ for (CashFlow cashFlow : wrapper.getCashFlows()) {
+ cashFlow.setObjId(linkId);
+ }
+ }
+ }
+
+ private void saveCashFlowLinks(List cashFlowWrappers) {
+ List links = cashFlowWrappers.stream()
+ .map(CashFlowWrapper::getCashFlowLink)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ cashFlowLinkDao.saveBatch(links);
+ Set invoicingKeys = links.stream()
+ .map(link -> InvoicingKey.buildKey(link.getInvoiceId(), link.getPaymentId()))
+ .collect(Collectors.toSet());
+ cashFlowLinkDao.switchCurrent(invoicingKeys);
+ }
+
+ private void saveCashFlows(List cashFlowWrappers) {
+ List cashFlows = cashFlowWrappers.stream()
+ .flatMap(wrapper -> wrapper.getCashFlows().stream())
+ .collect(Collectors.toList());
+ cashFlowDao.save(cashFlows);
+ }
+
+}
diff --git a/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentAdditionalInfoWrapperHandler.java b/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentAdditionalInfoWrapperHandler.java
new file mode 100644
index 00000000..b7d2c73a
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentAdditionalInfoWrapperHandler.java
@@ -0,0 +1,39 @@
+package dev.vality.newway.handler.wrapper.payment;
+
+import dev.vality.newway.dao.invoicing.iface.PaymentAdditionalInfoDao;
+import dev.vality.newway.domain.tables.pojos.PaymentAdditionalInfo;
+import dev.vality.newway.handler.wrapper.WrapperHandler;
+import dev.vality.newway.model.PaymentWrapper;
+import dev.vality.newway.util.PaymentWrapperUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@RequiredArgsConstructor
+@Component
+public class PaymentAdditionalInfoWrapperHandler implements WrapperHandler {
+
+ private final PaymentAdditionalInfoDao paymentAdditionalInfoDao;
+
+ @Override
+ public boolean accept(List wrappers) {
+ return wrappers.stream()
+ .map(PaymentWrapper::getPaymentAdditionalInfo)
+ .anyMatch(Objects::nonNull);
+ }
+
+ @Override
+ public void saveBatch(List wrappers) {
+ List processableWrappers = wrappers.stream()
+ .filter(paymentWrapper -> Objects.nonNull(paymentWrapper.getPaymentAdditionalInfo()))
+ .collect(Collectors.toList());
+ List paymentAdditionalInfos = processableWrappers.stream()
+ .map(PaymentWrapper::getPaymentAdditionalInfo)
+ .collect(Collectors.toList());
+ paymentAdditionalInfoDao.saveBatch(paymentAdditionalInfos);
+ paymentAdditionalInfoDao.switchCurrent(PaymentWrapperUtil.getInvoicingKeys(processableWrappers));
+ }
+}
diff --git a/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentFeeWrapperHandler.java b/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentFeeWrapperHandler.java
new file mode 100644
index 00000000..8feb05bd
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentFeeWrapperHandler.java
@@ -0,0 +1,39 @@
+package dev.vality.newway.handler.wrapper.payment;
+
+import dev.vality.newway.dao.invoicing.iface.PaymentFeeDao;
+import dev.vality.newway.domain.tables.pojos.PaymentFee;
+import dev.vality.newway.handler.wrapper.WrapperHandler;
+import dev.vality.newway.model.PaymentWrapper;
+import dev.vality.newway.util.PaymentWrapperUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@RequiredArgsConstructor
+@Component
+public class PaymentFeeWrapperHandler implements WrapperHandler {
+
+ private final PaymentFeeDao paymentFeeDao;
+
+ @Override
+ public boolean accept(List wrappers) {
+ return wrappers.stream()
+ .map(PaymentWrapper::getPaymentFee)
+ .anyMatch(Objects::nonNull);
+ }
+
+ @Override
+ public void saveBatch(List wrappers) {
+ List processableWrappers = wrappers.stream()
+ .filter(paymentWrapper -> Objects.nonNull(paymentWrapper.getPaymentFee()))
+ .collect(Collectors.toList());
+ List paymentFees = processableWrappers.stream()
+ .map(PaymentWrapper::getPaymentFee)
+ .collect(Collectors.toList());
+ paymentFeeDao.saveBatch(paymentFees);
+ paymentFeeDao.switchCurrent(PaymentWrapperUtil.getInvoicingKeys(processableWrappers));
+ }
+}
diff --git a/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentPayerInfoWrapperHandler.java b/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentPayerInfoWrapperHandler.java
new file mode 100644
index 00000000..046d2255
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentPayerInfoWrapperHandler.java
@@ -0,0 +1,35 @@
+package dev.vality.newway.handler.wrapper.payment;
+
+import dev.vality.newway.dao.invoicing.iface.PaymentPayerInfoDao;
+import dev.vality.newway.domain.tables.pojos.PaymentPayerInfo;
+import dev.vality.newway.handler.wrapper.WrapperHandler;
+import dev.vality.newway.model.PaymentWrapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@RequiredArgsConstructor
+@Component
+public class PaymentPayerInfoWrapperHandler implements WrapperHandler {
+
+ private final PaymentPayerInfoDao paymentPayerInfoDao;
+
+ @Override
+ public boolean accept(List wrappers) {
+ return wrappers.stream()
+ .map(PaymentWrapper::getPaymentPayerInfo)
+ .anyMatch(Objects::nonNull);
+ }
+
+ @Override
+ public void saveBatch(List wrappers) {
+ List paymentPayerInfos = wrappers.stream()
+ .map(PaymentWrapper::getPaymentPayerInfo)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ paymentPayerInfoDao.saveBatch(paymentPayerInfos);
+ }
+}
diff --git a/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentRecurrentInfoWrapperHandler.java b/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentRecurrentInfoWrapperHandler.java
new file mode 100644
index 00000000..bae7f7de
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentRecurrentInfoWrapperHandler.java
@@ -0,0 +1,39 @@
+package dev.vality.newway.handler.wrapper.payment;
+
+import dev.vality.newway.dao.invoicing.iface.PaymentRecurrentInfoDao;
+import dev.vality.newway.domain.tables.pojos.PaymentRecurrentInfo;
+import dev.vality.newway.handler.wrapper.WrapperHandler;
+import dev.vality.newway.model.PaymentWrapper;
+import dev.vality.newway.util.PaymentWrapperUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@RequiredArgsConstructor
+@Component
+public class PaymentRecurrentInfoWrapperHandler implements WrapperHandler {
+
+ private final PaymentRecurrentInfoDao paymentRecurrentInfoDao;
+
+ @Override
+ public boolean accept(List wrappers) {
+ return wrappers.stream()
+ .map(PaymentWrapper::getPaymentRecurrentInfo)
+ .anyMatch(Objects::nonNull);
+ }
+
+ @Override
+ public void saveBatch(List wrappers) {
+ List processableWrappers = wrappers.stream()
+ .filter(paymentWrapper -> Objects.nonNull(paymentWrapper.getPaymentRecurrentInfo()))
+ .collect(Collectors.toList());
+ List paymentRecurrentInfos = processableWrappers.stream()
+ .map(PaymentWrapper::getPaymentRecurrentInfo)
+ .collect(Collectors.toList());
+ paymentRecurrentInfoDao.saveBatch(paymentRecurrentInfos);
+ paymentRecurrentInfoDao.switchCurrent(PaymentWrapperUtil.getInvoicingKeys(processableWrappers));
+ }
+}
diff --git a/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentRiskDataWrapperHandler.java b/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentRiskDataWrapperHandler.java
new file mode 100644
index 00000000..f1177676
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentRiskDataWrapperHandler.java
@@ -0,0 +1,39 @@
+package dev.vality.newway.handler.wrapper.payment;
+
+import dev.vality.newway.dao.invoicing.iface.PaymentRiskDataDao;
+import dev.vality.newway.domain.tables.pojos.PaymentRiskData;
+import dev.vality.newway.handler.wrapper.WrapperHandler;
+import dev.vality.newway.model.PaymentWrapper;
+import dev.vality.newway.util.PaymentWrapperUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@RequiredArgsConstructor
+@Component
+public class PaymentRiskDataWrapperHandler implements WrapperHandler {
+
+ private final PaymentRiskDataDao paymentRiskDataDao;
+
+ @Override
+ public boolean accept(List wrappers) {
+ return wrappers.stream()
+ .map(PaymentWrapper::getPaymentRiskData)
+ .anyMatch(Objects::nonNull);
+ }
+
+ @Override
+ public void saveBatch(List wrappers) {
+ List processableWrappers = wrappers.stream()
+ .filter(paymentWrapper -> Objects.nonNull(paymentWrapper.getPaymentRiskData()))
+ .collect(Collectors.toList());
+ List paymentRiskDataList = processableWrappers.stream()
+ .map(PaymentWrapper::getPaymentRiskData)
+ .collect(Collectors.toList());
+ paymentRiskDataDao.saveBatch(paymentRiskDataList);
+ paymentRiskDataDao.switchCurrent(PaymentWrapperUtil.getInvoicingKeys(processableWrappers));
+ }
+}
diff --git a/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentRouteWrapperHandler.java b/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentRouteWrapperHandler.java
new file mode 100644
index 00000000..9d52c2d0
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentRouteWrapperHandler.java
@@ -0,0 +1,39 @@
+package dev.vality.newway.handler.wrapper.payment;
+
+import dev.vality.newway.dao.invoicing.iface.PaymentRouteDao;
+import dev.vality.newway.domain.tables.pojos.PaymentRoute;
+import dev.vality.newway.handler.wrapper.WrapperHandler;
+import dev.vality.newway.model.PaymentWrapper;
+import dev.vality.newway.util.PaymentWrapperUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@RequiredArgsConstructor
+@Component
+public class PaymentRouteWrapperHandler implements WrapperHandler {
+
+ private final PaymentRouteDao paymentRouteDao;
+
+ @Override
+ public boolean accept(List wrappers) {
+ return wrappers.stream()
+ .map(PaymentWrapper::getPaymentRoute)
+ .anyMatch(Objects::nonNull);
+ }
+
+ @Override
+ public void saveBatch(List wrappers) {
+ List processableWrappers = wrappers.stream()
+ .filter(paymentWrapper -> Objects.nonNull(paymentWrapper.getPaymentRoute()))
+ .collect(Collectors.toList());
+ List paymentRoutes = processableWrappers.stream()
+ .map(PaymentWrapper::getPaymentRoute)
+ .collect(Collectors.toList());
+ paymentRouteDao.saveBatch(paymentRoutes);
+ paymentRouteDao.switchCurrent(PaymentWrapperUtil.getInvoicingKeys(processableWrappers));
+ }
+}
diff --git a/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentSessionWrapperHandler.java b/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentSessionWrapperHandler.java
new file mode 100644
index 00000000..4e2e2e09
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentSessionWrapperHandler.java
@@ -0,0 +1,35 @@
+package dev.vality.newway.handler.wrapper.payment;
+
+import dev.vality.newway.dao.invoicing.iface.PaymentSessionInfoDao;
+import dev.vality.newway.domain.tables.pojos.PaymentSessionInfo;
+import dev.vality.newway.handler.wrapper.WrapperHandler;
+import dev.vality.newway.model.PaymentWrapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@RequiredArgsConstructor
+@Component
+public class PaymentSessionWrapperHandler implements WrapperHandler {
+
+ private final PaymentSessionInfoDao paymentSessionInfoDao;
+
+ @Override
+ public boolean accept(List wrappers) {
+ return wrappers.stream()
+ .map(PaymentWrapper::getPaymentSessionInfo)
+ .anyMatch(Objects::nonNull);
+ }
+
+ @Override
+ public void saveBatch(List wrappers) {
+ List payments = wrappers.stream()
+ .map(PaymentWrapper::getPaymentSessionInfo)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ paymentSessionInfoDao.saveBatch(payments);
+ }
+}
diff --git a/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentStatusInfoWrapperHandler.java b/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentStatusInfoWrapperHandler.java
new file mode 100644
index 00000000..de834608
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentStatusInfoWrapperHandler.java
@@ -0,0 +1,39 @@
+package dev.vality.newway.handler.wrapper.payment;
+
+import dev.vality.newway.dao.invoicing.iface.PaymentStatusInfoDao;
+import dev.vality.newway.domain.tables.pojos.PaymentStatusInfo;
+import dev.vality.newway.handler.wrapper.WrapperHandler;
+import dev.vality.newway.model.PaymentWrapper;
+import dev.vality.newway.util.PaymentWrapperUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@RequiredArgsConstructor
+@Component
+public class PaymentStatusInfoWrapperHandler implements WrapperHandler {
+
+ private final PaymentStatusInfoDao paymentStatusInfoDao;
+
+ @Override
+ public boolean accept(List wrappers) {
+ return wrappers.stream()
+ .map(PaymentWrapper::getPaymentStatusInfo)
+ .anyMatch(Objects::nonNull);
+ }
+
+ @Override
+ public void saveBatch(List wrappers) {
+ List processableWrappers = wrappers.stream()
+ .filter(paymentWrapper -> Objects.nonNull(paymentWrapper.getPaymentStatusInfo()))
+ .collect(Collectors.toList());
+ List paymentStatusInfos = processableWrappers.stream()
+ .map(PaymentWrapper::getPaymentStatusInfo)
+ .collect(Collectors.toList());
+ paymentStatusInfoDao.saveBatch(paymentStatusInfos);
+ paymentStatusInfoDao.switchCurrent(PaymentWrapperUtil.getInvoicingKeys(processableWrappers));
+ }
+}
diff --git a/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentWrapperHandler.java b/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentWrapperHandler.java
new file mode 100644
index 00000000..c7cf2af0
--- /dev/null
+++ b/src/main/java/dev/vality/newway/handler/wrapper/payment/PaymentWrapperHandler.java
@@ -0,0 +1,35 @@
+package dev.vality.newway.handler.wrapper.payment;
+
+import dev.vality.newway.dao.invoicing.iface.PaymentDao;
+import dev.vality.newway.domain.tables.pojos.Payment;
+import dev.vality.newway.handler.wrapper.WrapperHandler;
+import dev.vality.newway.model.PaymentWrapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@RequiredArgsConstructor
+@Component
+public class PaymentWrapperHandler implements WrapperHandler {
+
+ private final PaymentDao paymentDao;
+
+ @Override
+ public boolean accept(List wrappers) {
+ return wrappers.stream()
+ .map(PaymentWrapper::getPayment)
+ .anyMatch(Objects::nonNull);
+ }
+
+ @Override
+ public void saveBatch(List wrappers) {
+ List payments = wrappers.stream()
+ .map(PaymentWrapper::getPayment)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ paymentDao.saveBatch(payments);
+ }
+}
diff --git a/src/main/java/dev/vality/newway/listener/ExchangeRateListener.java b/src/main/java/dev/vality/newway/listener/ExchangeRateListener.java
new file mode 100644
index 00000000..7fb72020
--- /dev/null
+++ b/src/main/java/dev/vality/newway/listener/ExchangeRateListener.java
@@ -0,0 +1,36 @@
+package dev.vality.newway.listener;
+
+import dev.vality.exrates.events.CurrencyEvent;
+import dev.vality.newway.service.ExchangeRateService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.kafka.clients.consumer.ConsumerRecord;
+import org.springframework.kafka.annotation.KafkaListener;
+import org.springframework.kafka.support.Acknowledgment;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ExchangeRateListener {
+
+ private final ExchangeRateService exchangeRateService;
+
+ @KafkaListener(
+ autoStartup = "${kafka.topics.exrate.enabled}",
+ topics = "${kafka.topics.exrate.id}",
+ containerFactory = "exchangeRateContainerFactory")
+ public void handle(List> messages, Acknowledgment ack) {
+ log.info("Got ExchangeRate messages batch with size: {}", messages.size());
+ exchangeRateService.handleEvents(
+ messages.stream()
+ .map(ConsumerRecord::value)
+ .collect(Collectors.toList())
+ );
+ ack.acknowledge();
+ log.info("Batch ExchangeRate has been committed, size={}", messages.size());
+ }
+}
diff --git a/src/main/java/dev/vality/newway/listener/LimitConfigKafkaListener.java b/src/main/java/dev/vality/newway/listener/LimitConfigKafkaListener.java
new file mode 100644
index 00000000..26cb18e9
--- /dev/null
+++ b/src/main/java/dev/vality/newway/listener/LimitConfigKafkaListener.java
@@ -0,0 +1,36 @@
+package dev.vality.newway.listener;
+
+import dev.vality.kafka.common.util.LogUtil;
+import dev.vality.machinegun.eventsink.SinkEvent;
+import dev.vality.newway.service.LimitConfigService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.kafka.clients.consumer.ConsumerRecord;
+import org.springframework.kafka.annotation.KafkaListener;
+import org.springframework.kafka.support.Acknowledgment;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class LimitConfigKafkaListener {
+
+ private final LimitConfigService limitConfigService;
+
+ @KafkaListener(
+ autoStartup = "${kafka.topics.limit-config.enabled}",
+ topics = "${kafka.topics.limit-config.id}",
+ containerFactory = "limitConfigContainerFactory")
+ public void handle(List> messages, Acknowledgment ack) {
+ log.info("Got machineEvent batch with size: {}", messages.size());
+ limitConfigService.handleEvents(messages.stream()
+ .map(m -> m.value().getEvent())
+ .collect(Collectors.toList()));
+ ack.acknowledge();
+ log.info("Batch has been committed, size={}, {}", messages.size(),
+ LogUtil.toSummaryStringWithSinkEventValues(messages));
+ }
+}
diff --git a/src/main/java/dev/vality/newway/listener/WithdrawalAdjustmentKafkaListener.java b/src/main/java/dev/vality/newway/listener/WithdrawalAdjustmentKafkaListener.java
new file mode 100644
index 00000000..310baa40
--- /dev/null
+++ b/src/main/java/dev/vality/newway/listener/WithdrawalAdjustmentKafkaListener.java
@@ -0,0 +1,35 @@
+package dev.vality.newway.listener;
+
+import dev.vality.kafka.common.util.LogUtil;
+import dev.vality.machinegun.eventsink.SinkEvent;
+import dev.vality.newway.service.WithdrawalAdjustmentService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.kafka.clients.consumer.ConsumerRecord;
+import org.springframework.kafka.annotation.KafkaListener;
+import org.springframework.kafka.support.Acknowledgment;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class WithdrawalAdjustmentKafkaListener {
+
+ private final WithdrawalAdjustmentService withdrawalAdjustmentService;
+
+ @KafkaListener(
+ autoStartup = "${kafka.topics.withdrawal-adjustment.enabled}",
+ topics = "${kafka.topics.withdrawal-adjustment.id}",
+ containerFactory = "withdrawalAdjustmentContainerFactory")
+ public void handle(List> messages, Acknowledgment ack) {
+ log.info("withdrawalAdjustmentKafkaListener got machineEvent batch with size: {}", messages.size());
+ withdrawalAdjustmentService.handleEvents(messages.stream()
+ .map(m -> m.value().getEvent())
+ .toList());
+ ack.acknowledge();
+ log.info("withdrawalAdjustmentKafkaListener batch has been committed, size={}, {}", messages.size(),
+ LogUtil.toSummaryStringWithSinkEventValues(messages));
+ }
+}
diff --git a/src/main/java/dev/vality/newway/mapper/AbstractInvoicingMapper.java b/src/main/java/dev/vality/newway/mapper/AbstractInvoicingMapper.java
deleted file mode 100644
index 66e90aab..00000000
--- a/src/main/java/dev/vality/newway/mapper/AbstractInvoicingMapper.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package dev.vality.newway.mapper;
-
-import dev.vality.damsel.payment_processing.InvoiceChange;
-import dev.vality.machinegun.eventsink.MachineEvent;
-
-public abstract class AbstractInvoicingMapper implements Mapper