diff --git a/clearing-parent/dbf-export/pom.xml b/clearing-parent/dbf-export/pom.xml
new file mode 100644
index 000000000..093bb2711
--- /dev/null
+++ b/clearing-parent/dbf-export/pom.xml
@@ -0,0 +1,86 @@
+
+
+ 4.0.0
+
+ dbf-export
+ dbf-export
+ DBF exporter for DBF files
+ SPCEX-1.0.0.0
+
+
+ clearing-parent
+ ru.spcex.clearing
+ SPCEX-1.0.0.0
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+
+
+
+
+ org.springframework
+ spring-jdbc
+
+
+ com.mchange
+ c3p0
+ 0.9.5.2
+
+
+ org.postgresql
+ postgresql
+
+
+
+
+ com.github.albfernandez
+ javadbf
+ 1.13.1
+
+
+
+
+
+ jar/${project.artifactId}
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+
+
+ ru.spcex.clearing.dbf.export.DBFLoaderApplication
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+
+
+ true
+ exec
+
+
+
+
+
+
\ No newline at end of file
diff --git a/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/DBFExportApplication.java b/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/DBFExportApplication.java
new file mode 100644
index 000000000..4d2684252
--- /dev/null
+++ b/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/DBFExportApplication.java
@@ -0,0 +1,18 @@
+package ru.spcex.clearing.dbf.export;
+
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+
+@SpringBootApplication
+public class DBFExportApplication {
+ public static void main(String[] args) {
+ try {
+ SpringApplicationBuilder builder = new SpringApplicationBuilder(DBFExportApplication.class);
+ builder.run(args);
+ } catch (Throwable e) {
+ LoggerFactory.getLogger(DBFExportApplication.class).error("DBF-Loader start failed: {} -> {}", e.getClass().getSimpleName(), e.getMessage());
+ System.exit(-1);
+ }
+ }
+}
diff --git a/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/config/DBFExportConfig.java b/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/config/DBFExportConfig.java
new file mode 100644
index 000000000..d82e773fd
--- /dev/null
+++ b/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/config/DBFExportConfig.java
@@ -0,0 +1,56 @@
+package ru.spcex.clearing.dbf.export.config;
+
+import com.mchange.v2.c3p0.ComboPooledDataSource;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jdbc.core.JdbcTemplate;
+import ru.spcex.clearing.dbf.export.logic.stages.ExportFromDB;
+import ru.spcex.clearing.dbf.export.logic.stages.PrepareDBFFiles;
+import ru.spcex.clearing.dbf.export.logic.stages.Stage;
+import ru.spcex.clearing.dbf.export.properties.AProperties;
+
+import javax.sql.DataSource;
+import java.beans.PropertyVetoException;
+import java.util.LinkedList;
+import java.util.List;
+
+@Configuration
+@ComponentScan(basePackages = {"ru.spcex.clearing.dbf.export"})
+public class DBFExportConfig {
+ private final AProperties properties;
+ private final ApplicationContext context;
+
+ public DBFExportConfig(@Qualifier("dbfExportProperties") AProperties properties, ApplicationContext context) {
+ this.properties = properties;
+ this.context = context;
+ }
+
+ @Bean("dbfDataSource")
+ public DataSource dataSource() throws PropertyVetoException {
+ ComboPooledDataSource dataSource = new ComboPooledDataSource();
+ dataSource.setDriverClass(properties.getDbDriver());
+ dataSource.setJdbcUrl(properties.getJdbcUrl());
+ dataSource.setUser(properties.getDbLogin());
+ dataSource.setPassword(properties.getDbPassword());
+ return dataSource;
+ }
+
+ @Bean("dbfJdbcTemplate")
+ public JdbcTemplate jdbcTemplate(@Qualifier("dbfDataSource") DataSource dataSource) {
+ return new JdbcTemplate(dataSource);
+ }
+
+ @Bean("pipeline")
+ public List pipeline() {
+ List pipeline = new LinkedList<>();
+
+ pipeline.add(context.getBean(PrepareDBFFiles.class));
+ pipeline.add(context.getBean(ExportFromDB.class));
+
+ return pipeline;
+ }
+
+}
diff --git a/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/exceptions/ConfigException.java b/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/exceptions/ConfigException.java
new file mode 100644
index 000000000..ce17d44a7
--- /dev/null
+++ b/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/exceptions/ConfigException.java
@@ -0,0 +1,6 @@
+package ru.spcex.clearing.dbf.export.exceptions;
+
+public class ConfigException extends RuntimeException {
+ public ConfigException(String msg) { super(msg); }
+ public ConfigException(String msg, Throwable cause) { super(msg, cause); }
+}
diff --git a/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/logic/data/ISqlFilter.java b/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/logic/data/ISqlFilter.java
new file mode 100644
index 000000000..ff4b61033
--- /dev/null
+++ b/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/logic/data/ISqlFilter.java
@@ -0,0 +1,8 @@
+package ru.spcex.clearing.dbf.export.logic.data;
+
+/**
+ * Фильтр записей для экспорта
+ */
+public interface ISqlFilter {
+ String getSqlCondition();
+}
diff --git a/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/logic/data/ResultContainer.java b/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/logic/data/ResultContainer.java
new file mode 100644
index 000000000..bc8adc5da
--- /dev/null
+++ b/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/logic/data/ResultContainer.java
@@ -0,0 +1,35 @@
+package ru.spcex.clearing.dbf.export.logic.data;
+
+import ru.spcex.clearing.dbf.export.logic.data.enums.Table;
+
+import java.io.File;
+import java.util.Map;
+
+/**
+ * Контейнер для передачи результата между стадиями
+ */
+public class ResultContainer {
+ private Map tablesForExport;
+ private Map filesForTables;
+
+ protected ResultContainer() {}
+
+ public static ResultContainer createNewTask(Map tablesForExport) {
+ ResultContainer container = new ResultContainer();
+ container.tablesForExport = tablesForExport;
+ return container;
+ }
+
+ public Map getTablesForExport() {
+ return tablesForExport;
+ }
+
+ public Map getFilesForTables() {
+ return filesForTables;
+ }
+
+ public void setFilesForTables(Map filesForTables) {
+ this.filesForTables = filesForTables;
+ }
+
+}
diff --git a/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/logic/data/enums/ColumnType.java b/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/logic/data/enums/ColumnType.java
new file mode 100644
index 000000000..b6445dbe2
--- /dev/null
+++ b/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/logic/data/enums/ColumnType.java
@@ -0,0 +1,46 @@
+package ru.spcex.clearing.dbf.export.logic.data.enums;
+
+import com.linuxense.javadbf.DBFDataType;
+
+import java.sql.Types;
+
+/**
+ * Типы данных в таблицах.
+ * Ставит в соответствие типы PostGRE и DBF
+ */
+public enum ColumnType {
+ VARCHAR(DBFDataType.CHARACTER, Types.VARCHAR),
+ CHARACTER(DBFDataType.CHARACTER, Types.CHAR),
+ NUMERIC(DBFDataType.NUMERIC, Types.NUMERIC),
+ DATE(DBFDataType.DATE, Types.DATE);
+
+ private final DBFDataType dbfType;
+ private final int sqlType;
+
+ ColumnType(DBFDataType dbfType, int postgreSqlType) {
+ this.dbfType = dbfType;
+ this.sqlType = postgreSqlType;
+ }
+
+ public DBFDataType getDbfType() {
+ return dbfType;
+ }
+
+ public int getSqlType() {
+ return sqlType;
+ }
+
+ public static ColumnType getForSQLType(int sqlType) {
+ for (ColumnType columnType : values()) {
+ if (columnType.sqlType == sqlType) return columnType;
+ }
+ return null;
+ }
+
+ public static ColumnType getForDBFType(DBFDataType dbfType) {
+ for (ColumnType columnType : values()) {
+ if (columnType.dbfType == dbfType) return columnType;
+ }
+ return null;
+ }
+}
diff --git a/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/logic/data/enums/StageResult.java b/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/logic/data/enums/StageResult.java
new file mode 100644
index 000000000..76e9be113
--- /dev/null
+++ b/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/logic/data/enums/StageResult.java
@@ -0,0 +1,7 @@
+package ru.spcex.clearing.dbf.export.logic.data.enums;
+
+public enum StageResult {
+ OK,
+ ERROR,
+ COMPLETE
+}
diff --git a/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/logic/data/enums/Table.java b/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/logic/data/enums/Table.java
new file mode 100644
index 000000000..6ce65dcec
--- /dev/null
+++ b/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/logic/data/enums/Table.java
@@ -0,0 +1,39 @@
+package ru.spcex.clearing.dbf.export.logic.data.enums;
+
+public enum Table {
+ DF_01("DF-01"),
+ DF_02("DF-02"),
+ DF_03("DF-03"),
+ DF_04("DF-04"),
+ DF_05("DF-05"),
+ DF_06("DF-06");
+
+ private final String filePrefix;
+
+ Table(String prefix) {
+ this.filePrefix = prefix;
+ }
+
+ public boolean fileForThisTable(String filename) {
+ return filename != null && filename.startsWith(filePrefix);
+ }
+
+ public static Table getTableForFilename(String filename) {
+ for (Table table : Table.values()) {
+ if (table.fileForThisTable(filename)) return table;
+ }
+ return null;
+ }
+
+ public static Table tableForName(String name) {
+ for (Table table : values()) {
+ if (name.equalsIgnoreCase(table.name()))
+ return table;
+ }
+ return null;
+ }
+
+ public String getFilePrefix() {
+ return filePrefix;
+ }
+}
diff --git a/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/logic/stages/ExportFromDB.java b/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/logic/stages/ExportFromDB.java
new file mode 100644
index 000000000..1922c49f2
--- /dev/null
+++ b/clearing-parent/dbf-export/src/main/java/ru/spcex/clearing/dbf/export/logic/stages/ExportFromDB.java
@@ -0,0 +1,149 @@
+package ru.spcex.clearing.dbf.export.logic.stages;
+
+import com.linuxense.javadbf.DBFDataType;
+import com.linuxense.javadbf.DBFException;
+import com.linuxense.javadbf.DBFField;
+import com.linuxense.javadbf.DBFWriter;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.support.JdbcUtils;
+import org.springframework.jdbc.support.MetaDataAccessException;
+import org.springframework.stereotype.Component;
+import ru.spcex.clearing.dbf.export.exceptions.ConfigException;
+import ru.spcex.clearing.dbf.export.logic.data.ISqlFilter;
+import ru.spcex.clearing.dbf.export.logic.data.ResultContainer;
+import ru.spcex.clearing.dbf.export.logic.data.enums.ColumnType;
+import ru.spcex.clearing.dbf.export.logic.data.enums.StageResult;
+import ru.spcex.clearing.dbf.export.logic.data.enums.Table;
+import ru.spcex.clearing.dbf.export.properties.AProperties;
+
+import java.io.File;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.nio.charset.Charset;
+import java.sql.ResultSet;
+import java.time.LocalDate;
+import java.time.ZoneOffset;
+import java.util.*;
+
+/**
+ * Выгрузка данных из базы и их запись
+ */
+@Component
+public class ExportFromDB extends Stage implements InitializingBean {
+ private final AProperties properties;
+ private final JdbcTemplate dbfJdbcTemplate;
+ private final Map dbfFieldsForTable = new HashMap<>();
+
+ private Charset dbfCharset;
+
+ public ExportFromDB(@Qualifier("dbfExportProperties") AProperties properties,
+ @Qualifier("dbfJdbcTemplate") JdbcTemplate dbfJdbcTemplate) {
+ this.properties = properties;
+ this.dbfJdbcTemplate = dbfJdbcTemplate;
+ }
+
+ @Override
+ public StageResult process(ResultContainer resultContainer) {
+ for (Table table : resultContainer.getTablesForExport().keySet()) {
+ ISqlFilter sqlFilter = resultContainer.getTablesForExport().get(table);
+ String sqlCondition = sqlFilter != null ? " where " + sqlFilter : "";
+
+ String sql = "select * from " + table + sqlCondition;
+ List