|
|
|
|
@@ -6,7 +6,10 @@ import static de.srsoftware.tools.jdbc.Condition.*;
|
|
|
|
|
import static de.srsoftware.tools.jdbc.Query.*;
|
|
|
|
|
import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL;
|
|
|
|
|
import static de.srsoftware.umbrella.core.Constants.*;
|
|
|
|
|
import static de.srsoftware.umbrella.core.Constants.FIELD_COMPANY_ID;
|
|
|
|
|
import static de.srsoftware.umbrella.core.Field.*;
|
|
|
|
|
import static de.srsoftware.umbrella.core.Field.COMPANY_ID;
|
|
|
|
|
import static de.srsoftware.umbrella.core.Field.TAX;
|
|
|
|
|
import static de.srsoftware.umbrella.core.Field.UNIT;
|
|
|
|
|
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.databaseException;
|
|
|
|
|
import static de.srsoftware.umbrella.core.model.Document.DEFAULT_THOUSANDS_SEPARATOR;
|
|
|
|
|
import static de.srsoftware.umbrella.core.model.Document.State;
|
|
|
|
|
@@ -51,7 +54,7 @@ public class SqliteDb implements DocumentDb{
|
|
|
|
|
private void createTableCompanySettings() {
|
|
|
|
|
var sql = "CREATE TABLE IF NOT EXISTS {0} ({1} INT NOT NULL, {2} INT NOT NULL, {3} TEXT DEFAULT \"A\", {4} TEXT DEFAULT NULL, {5} INT NOT NULL DEFAULT 1, PRIMARY KEY ({1}, {2}))";
|
|
|
|
|
try {
|
|
|
|
|
var stmt = db.prepareStatement(format(sql,TABLE_COMPANY_SETTINGS, FIELD_COMPANY_ID,FIELD_DOC_TYPE_ID,FIELD_TYPE_PREFIX,FIELD_TYPE_SUFFIX,FIELD_TYPE_NUMBER));
|
|
|
|
|
var stmt = db.prepareStatement(format(sql,TABLE_COMPANY_SETTINGS, COMPANY_ID,DOC_TYPE_ID,TYPE_PREFIX,TYPE_SUFFIX,TYPE_NUMBER));
|
|
|
|
|
stmt.execute();
|
|
|
|
|
stmt.close();
|
|
|
|
|
} catch (SQLException e) {
|
|
|
|
|
@@ -63,7 +66,7 @@ public class SqliteDb implements DocumentDb{
|
|
|
|
|
private void createTableCustomerPrices() {
|
|
|
|
|
var sql = "CREATE TABLE IF NOT EXISTS {0} ({1} INT NOT NULL, {2} VARCHAR(255), {3} VARCHAR(50), {4} INTEGER)";
|
|
|
|
|
try {
|
|
|
|
|
var stmt = db.prepareStatement(format(sql,TABLE_PRICES, FIELD_COMPANY_ID,FIELD_CUSTOMER_NUMBER, FIELD_ITEM_CODE,FIELD_PRICE));
|
|
|
|
|
var stmt = db.prepareStatement(format(sql,TABLE_PRICES, COMPANY_ID,CUSTOMER_NUMBER, ITEM_CODE,PRICE));
|
|
|
|
|
stmt.execute();
|
|
|
|
|
stmt.close();
|
|
|
|
|
} catch (SQLException e) {
|
|
|
|
|
@@ -75,7 +78,7 @@ public class SqliteDb implements DocumentDb{
|
|
|
|
|
private void createTableCustomerSettings() {
|
|
|
|
|
var sql = "CREATE TABLE IF NOT EXISTS {0} ({1} INT NOT NULL, {2} INT NOT NULL, {3} VARCHAR(255), {4} TEXT, {5} TEXT, {6} TEXT, PRIMARY KEY ({1}, {2}, {3}))";
|
|
|
|
|
try {
|
|
|
|
|
var stmt = db.prepareStatement(format(sql,TABLE_CUSTOMER_SETTINGS, FIELD_COMPANY_ID,FIELD_DOC_TYPE_ID,FIELD_CUSTOMER_NUMBER,FIELD_DEFAULT_HEADER,FIELD_DEFAULT_FOOTER,FIELD_DEFAULT_MAIL));
|
|
|
|
|
var stmt = db.prepareStatement(format(sql,TABLE_CUSTOMER_SETTINGS, COMPANY_ID,DOC_TYPE_ID,CUSTOMER_NUMBER,DEFAULT_HEADER,DEFAULT_FOOTER,DEFAULT_MAIL));
|
|
|
|
|
stmt.execute();
|
|
|
|
|
stmt.close();
|
|
|
|
|
} catch (SQLException e) {
|
|
|
|
|
@@ -108,7 +111,7 @@ CREATE TABLE IF NOT EXISTS {0} (
|
|
|
|
|
{18} VARCHAR(255),
|
|
|
|
|
{19} VARCHAR(255)
|
|
|
|
|
)""";
|
|
|
|
|
createTable = format(createTable,TABLE_DOCUMENTS, ID, FIELD_TYPE_ID, FIELD_COMPANY_ID, NUMBER, DATE, STATE, FIELD_TEMPLATE_ID, FIELD_DELIVERY_DATE,FIELD_HEAD,FIELD_FOOTER,FIELD_CURRENCY, SENDER,FIELD_TAX_NUMBER,FIELD_BANK_ACCOUNT,FIELD_COURT,FIELD_CUSTOMER,FIELD_CUSTOMER_NUMBER,FIELD_CUSTOMER_TAX_NUMBER,FIELD_CUSTOMER_EMAIL);
|
|
|
|
|
createTable = format(createTable,TABLE_DOCUMENTS, ID, TYPE_ID, COMPANY_ID, NUMBER, DATE, STATE, TEMPLATE_ID, DELIVERY_DATE,HEAD,FOOTER,CURRENCY, SENDER,TAX_NUMBER,BANK_ACCOUNT,COURT,CUSTOMER,CUSTOMER_NUMBER,CUSTOMER_TAX_NUMBER,CUSTOMER_EMAIL);
|
|
|
|
|
try {
|
|
|
|
|
var stmt = db.prepareStatement(createTable);
|
|
|
|
|
stmt.execute();
|
|
|
|
|
@@ -122,7 +125,7 @@ CREATE TABLE IF NOT EXISTS {0} (
|
|
|
|
|
private void createTableDocumentTypes() {
|
|
|
|
|
var createTable = "CREATE TABLE IF NOT EXISTS {0} ({1} INTEGER PRIMARY KEY, {2} INT, {3} VARCHAR(255) NOT NULL)";
|
|
|
|
|
try {
|
|
|
|
|
var stmt = db.prepareStatement(format(createTable,TABLE_DOCUMENT_TYPES, ID,FIELD_NEXT_TYPE, NAME));
|
|
|
|
|
var stmt = db.prepareStatement(format(createTable,TABLE_DOCUMENT_TYPES, ID,NEXT_TYPE, NAME));
|
|
|
|
|
stmt.execute();
|
|
|
|
|
stmt.close();
|
|
|
|
|
} catch (SQLException e) {
|
|
|
|
|
@@ -147,7 +150,7 @@ CREATE TABLE IF NOT EXISTS {0} (
|
|
|
|
|
{11} BOOLEAN DEFAULT 0
|
|
|
|
|
)
|
|
|
|
|
""";
|
|
|
|
|
sql = format(sql,TABLE_POSITIONS,FIELD_DOCUMENT_ID,FIELD_POS, FIELD_ITEM_CODE,FIELD_AMOUNT,FIELD_UNIT, TITLE, DESCRIPTION,FIELD_PRICE,FIELD_TAX,FIELD_TIME_ID, OPTIONAL);
|
|
|
|
|
sql = format(sql,TABLE_POSITIONS,DOCUMENT_ID,POS, ITEM_CODE,AMOUNT,UNIT, TITLE, DESCRIPTION,PRICE,TAX,TIME_ID, OPTIONAL);
|
|
|
|
|
try {
|
|
|
|
|
var stmt = db.prepareStatement(sql);
|
|
|
|
|
stmt.execute();
|
|
|
|
|
@@ -191,7 +194,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
private void createTableTemplates() {
|
|
|
|
|
var createTable = "CREATE TABLE IF NOT EXISTS {0} ({1} INTEGER PRIMARY KEY, {2} INT NOT NULL, {3} VARCHAR(255) NOT NULL, {4} BLOB)";
|
|
|
|
|
try {
|
|
|
|
|
var stmt = db.prepareStatement(format(createTable,TABLE_TEMPLATES, ID, FIELD_COMPANY_ID, NAME, TEMPLATE));
|
|
|
|
|
var stmt = db.prepareStatement(format(createTable,TABLE_TEMPLATES, ID, COMPANY_ID, NAME, TEMPLATE));
|
|
|
|
|
stmt.execute();
|
|
|
|
|
stmt.close();
|
|
|
|
|
} catch (SQLException e) {
|
|
|
|
|
@@ -208,7 +211,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
String number = null;
|
|
|
|
|
if (rs.next()) number = rs.getString(NUMBER);
|
|
|
|
|
rs.close();
|
|
|
|
|
delete().from(TABLE_POSITIONS).where(FIELD_DOCUMENT_ID,equal(docId)).execute(db);
|
|
|
|
|
delete().from(TABLE_POSITIONS).where(DOCUMENT_ID,equal(docId)).execute(db);
|
|
|
|
|
delete().from(TABLE_DOCUMENTS).where(ID,equal(docId)).execute(db);
|
|
|
|
|
db.setAutoCommit(true);
|
|
|
|
|
if (number != null) return number;
|
|
|
|
|
@@ -222,8 +225,8 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
public Long dropPosition(long docId, long pos) throws UmbrellaException {
|
|
|
|
|
try {
|
|
|
|
|
db.setAutoCommit(false);
|
|
|
|
|
delete().from(TABLE_POSITIONS).where(FIELD_DOCUMENT_ID,equal(docId)).where(FIELD_POS,equal(pos)).execute(db);
|
|
|
|
|
var sql = format("UPDATE {0} SET {1} = {1}-1 WHERE {2} = ? AND {1} > ?",TABLE_POSITIONS,FIELD_POS,FIELD_DOCUMENT_ID);
|
|
|
|
|
delete().from(TABLE_POSITIONS).where(DOCUMENT_ID,equal(docId)).where(POS,equal(pos)).execute(db);
|
|
|
|
|
var sql = format("UPDATE {0} SET {1} = {1}-1 WHERE {2} = ? AND {1} > ?",TABLE_POSITIONS,POS,DOCUMENT_ID);
|
|
|
|
|
LOG.log(DEBUG,sql.replaceFirst("\\?",docId+"").replace("?",pos+""));
|
|
|
|
|
var stmt = db.prepareStatement(sql);
|
|
|
|
|
stmt.setLong(1,docId);
|
|
|
|
|
@@ -241,7 +244,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
@Override
|
|
|
|
|
public CompanySettings getCompanySettings(long companyId, Type docType) throws UmbrellaException {
|
|
|
|
|
try {
|
|
|
|
|
var rs = select(ALL).from(TABLE_COMPANY_SETTINGS).where(FIELD_COMPANY_ID,equal(companyId)).where(FIELD_DOC_TYPE_ID,equal(docType.id())).exec(db);
|
|
|
|
|
var rs = select(ALL).from(TABLE_COMPANY_SETTINGS).where(COMPANY_ID,equal(companyId)).where(DOC_TYPE_ID,equal(docType.id())).exec(db);
|
|
|
|
|
CompanySettings settings = null;
|
|
|
|
|
if (rs.next()) settings = CompanySettings.of(rs);
|
|
|
|
|
rs.close();
|
|
|
|
|
@@ -267,9 +270,9 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
@Override
|
|
|
|
|
public Long getCustomerPrice(long company, String customer, String itemCode) throws UmbrellaException {
|
|
|
|
|
try {
|
|
|
|
|
var rs = select(FIELD_PRICE).from(TABLE_PRICES).where(FIELD_COMPANY_ID,equal(company)).where(FIELD_CUSTOMER_NUMBER,equal(customer)).where(FIELD_ITEM_CODE,equal(itemCode)).exec(db);
|
|
|
|
|
var rs = select(PRICE).from(TABLE_PRICES).where(COMPANY_ID,equal(company)).where(CUSTOMER_NUMBER,equal(customer)).where(ITEM_CODE,equal(itemCode)).exec(db);
|
|
|
|
|
Long price = null;
|
|
|
|
|
if (rs.next()) price = rs.getLong(FIELD_PRICE);
|
|
|
|
|
if (rs.next()) price = rs.getLong(PRICE);
|
|
|
|
|
rs.close();
|
|
|
|
|
if (price != null) return price;
|
|
|
|
|
} catch (SQLException e) {
|
|
|
|
|
@@ -281,7 +284,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
@Override
|
|
|
|
|
public CustomerSettings getCustomerSettings(long companyId, Type docType, String customerId) throws UmbrellaException {
|
|
|
|
|
try {
|
|
|
|
|
var rs = select(ALL).from(TABLE_CUSTOMER_SETTINGS).where(FIELD_COMPANY_ID,equal(companyId)).where(FIELD_DOC_TYPE_ID,equal(docType.id())).where(FIELD_CUSTOMER_NUMBER,equal(customerId)).exec(db);
|
|
|
|
|
var rs = select(ALL).from(TABLE_CUSTOMER_SETTINGS).where(COMPANY_ID,equal(companyId)).where(DOC_TYPE_ID,equal(docType.id())).where(CUSTOMER_NUMBER,equal(customerId)).exec(db);
|
|
|
|
|
CustomerSettings settings = null;
|
|
|
|
|
if (rs.next()) settings = CustomerSettings.of(rs);
|
|
|
|
|
rs.close();
|
|
|
|
|
@@ -314,10 +317,10 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
public Map<Long, Map<Long, String>> docReferencedByTimes(Set<Long> timeIds) throws UmbrellaException {
|
|
|
|
|
try {
|
|
|
|
|
var map = new HashMap<Long, Map<Long, String>>(); // Map ( timeId → Map ( docId → name ))
|
|
|
|
|
var rs = select(FIELD_TIME_ID,FIELD_DOCUMENT_ID,NUMBER).from(TABLE_POSITIONS).leftJoin(FIELD_DOCUMENT_ID,TABLE_DOCUMENTS,ID).where(FIELD_TIME_ID,in(timeIds.toArray())).exec(db);
|
|
|
|
|
var rs = select(TIME_ID,DOCUMENT_ID,NUMBER).from(TABLE_POSITIONS).leftJoin(DOCUMENT_ID,TABLE_DOCUMENTS,ID).where(TIME_ID,in(timeIds.toArray())).exec(db);
|
|
|
|
|
while (rs.next()) {
|
|
|
|
|
var timeId = rs.getLong(FIELD_TIME_ID);
|
|
|
|
|
var docId = rs.getLong(FIELD_DOCUMENT_ID);
|
|
|
|
|
var timeId = rs.getLong(TIME_ID);
|
|
|
|
|
var docId = rs.getLong(DOCUMENT_ID);
|
|
|
|
|
var number = rs.getString(NUMBER);
|
|
|
|
|
map.computeIfAbsent(timeId,k -> new HashMap<>()).put(docId,number);
|
|
|
|
|
}
|
|
|
|
|
@@ -338,9 +341,9 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
|
|
|
|
|
var query = Query.select(ALL).from(TABLE_DOCUMENTS).where(COMPANY_ID,in(companyIds.toArray()));
|
|
|
|
|
if (fulltext) {
|
|
|
|
|
for (var key : keys) query.where(format("CONCAT({0},\" \",{1},\" \",{2},\" \",{3},\" \",{4},\" \",{5},\" \",{6},\" \",{7},\" \",{8},\" \",{9})",NUMBER,FIELD_HEAD,FIELD_FOOTER,SENDER,FIELD_TAX_NUMBER,FIELD_BANK_ACCOUNT,FIELD_CUSTOMER,FIELD_CUSTOMER_NUMBER,FIELD_CUSTOMER_TAX_NUMBER,FIELD_CUSTOMER_EMAIL),like("%"+key+"%"));
|
|
|
|
|
for (var key : keys) query.where(format("CONCAT({0},\" \",{1},\" \",{2},\" \",{3},\" \",{4},\" \",{5},\" \",{6},\" \",{7},\" \",{8},\" \",{9})",NUMBER,HEAD,FOOTER,SENDER,TAX_NUMBER,BANK_ACCOUNT,CUSTOMER,CUSTOMER_NUMBER,CUSTOMER_TAX_NUMBER,CUSTOMER_EMAIL),like("%"+key+"%"));
|
|
|
|
|
} else {
|
|
|
|
|
for (var key : keys) query.where(format("CONCAT({0},\" \",{1},\" \",{2},\" \",{3},\" \",{4})",NUMBER,FIELD_HEAD,FIELD_FOOTER,SENDER,FIELD_CUSTOMER),like("%"+key+"%"));
|
|
|
|
|
for (var key : keys) query.where(format("CONCAT({0},\" \",{1},\" \",{2},\" \",{3},\" \",{4})",NUMBER,HEAD,FOOTER,SENDER,CUSTOMER),like("%"+key+"%"));
|
|
|
|
|
}
|
|
|
|
|
rs = query.exec(db);
|
|
|
|
|
var map = new HashMap<Long,Document>();
|
|
|
|
|
@@ -349,10 +352,10 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
|
|
|
|
|
if (fulltext){
|
|
|
|
|
var additionalDocIds = new HashSet<Long>();
|
|
|
|
|
query = select(FIELD_DOCUMENT_ID).from(TABLE_POSITIONS).leftJoin(FIELD_DOCUMENT_ID,TABLE_DOCUMENTS,ID).where(COMPANY_ID,in(companyIds.toArray()));
|
|
|
|
|
for (var key : keys) query.where(format("CONCAT({0},\" \",{1},\" \",{2},\" \",{3})",FIELD_ITEM_CODE,UNIT,TITLE,DESCRIPTION),like("%"+key+"%"));
|
|
|
|
|
query = select(DOCUMENT_ID).from(TABLE_POSITIONS).leftJoin(DOCUMENT_ID,TABLE_DOCUMENTS,ID).where(COMPANY_ID,in(companyIds.toArray()));
|
|
|
|
|
for (var key : keys) query.where(format("CONCAT({0},\" \",{1},\" \",{2},\" \",{3})",ITEM_CODE,UNIT,TITLE,DESCRIPTION),like("%"+key+"%"));
|
|
|
|
|
rs = query.exec(db);
|
|
|
|
|
while (rs.next()) additionalDocIds.add(rs.getLong(FIELD_DOCUMENT_ID));
|
|
|
|
|
while (rs.next()) additionalDocIds.add(rs.getLong(DOCUMENT_ID));
|
|
|
|
|
rs.close();
|
|
|
|
|
|
|
|
|
|
additionalDocIds.removeAll(map.keySet());
|
|
|
|
|
@@ -363,9 +366,9 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
rs.close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rs = Query.select(ALL).from(TABLE_POSITIONS).where(FIELD_DOCUMENT_ID,in(map.keySet().toArray())).exec(db);
|
|
|
|
|
rs = Query.select(ALL).from(TABLE_POSITIONS).where(DOCUMENT_ID,in(map.keySet().toArray())).exec(db);
|
|
|
|
|
while (rs.next()){
|
|
|
|
|
var docId = rs.getLong(FIELD_DOCUMENT_ID);
|
|
|
|
|
var docId = rs.getLong(DOCUMENT_ID);
|
|
|
|
|
var position = toPosition(rs);
|
|
|
|
|
map.get(docId).positions().add(position);
|
|
|
|
|
position.clean();
|
|
|
|
|
@@ -386,14 +389,14 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
while (rs.next()) types.put(rs.getInt(ID),toType(rs));
|
|
|
|
|
rs.close();
|
|
|
|
|
|
|
|
|
|
rs = Query.select(ALL).from(TABLE_DOCUMENTS).where(FIELD_COMPANY_ID,equal(companyId)).exec(db);
|
|
|
|
|
rs = Query.select(ALL).from(TABLE_DOCUMENTS).where(COMPANY_ID,equal(companyId)).exec(db);
|
|
|
|
|
var map = new HashMap<Long,Document>();
|
|
|
|
|
while (rs.next()) map.put(rs.getLong(ID),toDoc(rs,types));
|
|
|
|
|
rs.close();
|
|
|
|
|
|
|
|
|
|
rs = Query.select(ALL).from(TABLE_POSITIONS).where(FIELD_DOCUMENT_ID,in(map.keySet().toArray())).exec(db);
|
|
|
|
|
rs = Query.select(ALL).from(TABLE_POSITIONS).where(DOCUMENT_ID,in(map.keySet().toArray())).exec(db);
|
|
|
|
|
while (rs.next()){
|
|
|
|
|
var docId = rs.getLong(FIELD_DOCUMENT_ID);
|
|
|
|
|
var docId = rs.getLong(DOCUMENT_ID);
|
|
|
|
|
var position = toPosition(rs);
|
|
|
|
|
map.get(docId).positions().add(position);
|
|
|
|
|
position.clean();
|
|
|
|
|
@@ -428,14 +431,14 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
while (rs.next()) types.put(rs.getInt(ID),toType(rs));
|
|
|
|
|
rs.close();
|
|
|
|
|
|
|
|
|
|
rs = Query.select(ALL).from(TABLE_DOCUMENTS).leftJoin(FIELD_TEMPLATE_ID,TABLE_TEMPLATES, ID).where(TABLE_DOCUMENTS+"."+ ID,equal(docId)).exec(db);
|
|
|
|
|
rs = Query.select(ALL).from(TABLE_DOCUMENTS).leftJoin(TEMPLATE_ID,TABLE_TEMPLATES, ID).where(TABLE_DOCUMENTS+"."+ ID,equal(docId)).exec(db);
|
|
|
|
|
Document doc = null;
|
|
|
|
|
while (rs.next()) doc = toDoc(rs,types);
|
|
|
|
|
rs.close();
|
|
|
|
|
|
|
|
|
|
if (doc != null) {
|
|
|
|
|
var positions = doc.positions();
|
|
|
|
|
rs = Query.select(ALL).from(TABLE_POSITIONS).where(FIELD_DOCUMENT_ID, equal(docId)).exec(db);
|
|
|
|
|
rs = Query.select(ALL).from(TABLE_POSITIONS).where(DOCUMENT_ID, equal(docId)).exec(db);
|
|
|
|
|
while (rs.next()) {
|
|
|
|
|
var position = toPosition(rs);
|
|
|
|
|
positions.add(position);
|
|
|
|
|
@@ -456,7 +459,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
var settings = getCompanySettings(companyId,type);
|
|
|
|
|
|
|
|
|
|
var numbers = new HashSet<String>();
|
|
|
|
|
var rs = select(NUMBER).from(TABLE_DOCUMENTS).where(FIELD_COMPANY_ID,equal(companyId)).exec(db);
|
|
|
|
|
var rs = select(NUMBER).from(TABLE_DOCUMENTS).where(COMPANY_ID,equal(companyId)).exec(db);
|
|
|
|
|
while (rs.next()) numbers.add(rs.getString(NUMBER));
|
|
|
|
|
rs.close();
|
|
|
|
|
|
|
|
|
|
@@ -475,7 +478,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
var typeId = doc.type().id();
|
|
|
|
|
var customerId = doc.customer().id();
|
|
|
|
|
try{
|
|
|
|
|
replaceInto(TABLE_CUSTOMER_SETTINGS, FIELD_COMPANY_ID, FIELD_DOC_TYPE_ID, FIELD_CUSTOMER_NUMBER, FIELD_DEFAULT_HEADER, FIELD_DEFAULT_FOOTER, FIELD_DEFAULT_MAIL)
|
|
|
|
|
replaceInto(TABLE_CUSTOMER_SETTINGS, COMPANY_ID, DOC_TYPE_ID, CUSTOMER_NUMBER, DEFAULT_HEADER, DEFAULT_FOOTER, DEFAULT_MAIL)
|
|
|
|
|
.values(companyId, typeId, customerId, settings.header(), settings.footer(), settings.mailText())
|
|
|
|
|
.execute(db);
|
|
|
|
|
return settings;
|
|
|
|
|
@@ -490,7 +493,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
var timestamp = doc.date().atStartOfDay(UTC).toInstant().getEpochSecond();
|
|
|
|
|
var sender = doc.sender();
|
|
|
|
|
var custom = doc.customer();
|
|
|
|
|
var stmt = insertInto(TABLE_DOCUMENTS,FIELD_TYPE_ID,FIELD_COMPANY_ID, DATE, FIELD_DELIVERY_DATE,FIELD_FOOTER,FIELD_HEAD, NUMBER, STATE, SENDER,FIELD_TAX_NUMBER,FIELD_BANK_ACCOUNT,FIELD_COURT,FIELD_CUSTOMER,FIELD_CUSTOMER_EMAIL,FIELD_CUSTOMER_NUMBER,FIELD_CUSTOMER_TAX_NUMBER,FIELD_TEMPLATE_ID,FIELD_CURRENCY)
|
|
|
|
|
var stmt = insertInto(TABLE_DOCUMENTS,TYPE_ID,COMPANY_ID, DATE, DELIVERY_DATE,FOOTER,HEAD, NUMBER, STATE, SENDER,TAX_NUMBER,BANK_ACCOUNT,COURT,CUSTOMER,CUSTOMER_EMAIL,CUSTOMER_NUMBER,CUSTOMER_TAX_NUMBER,TEMPLATE_ID,CURRENCY)
|
|
|
|
|
.values(doc.type().id(),doc.companyId(),timestamp,doc.delivery(),doc.footer(),doc.head(),doc.number(),doc.state().code(),sender.name(),sender.taxNumber(),sender.bankAccount(),sender.court(),custom.name(),custom.email(),custom.id(),custom.taxNumber(),doc.template().id(),doc.currency())
|
|
|
|
|
.execute(db);
|
|
|
|
|
var rs = stmt.getGeneratedKeys();
|
|
|
|
|
@@ -513,7 +516,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
var sender = doc.sender();
|
|
|
|
|
var custom = doc.customer();
|
|
|
|
|
update(TABLE_DOCUMENTS)
|
|
|
|
|
.set(DATE, FIELD_DELIVERY_DATE,FIELD_FOOTER,FIELD_HEAD, NUMBER, STATE, SENDER,FIELD_TAX_NUMBER,FIELD_BANK_ACCOUNT,FIELD_COURT,FIELD_CUSTOMER,FIELD_CUSTOMER_EMAIL,FIELD_CUSTOMER_NUMBER,FIELD_CUSTOMER_TAX_NUMBER,FIELD_TEMPLATE_ID)
|
|
|
|
|
.set(DATE, DELIVERY_DATE,FOOTER,HEAD, NUMBER, STATE, SENDER,TAX_NUMBER,BANK_ACCOUNT,COURT,CUSTOMER,CUSTOMER_EMAIL,CUSTOMER_NUMBER,CUSTOMER_TAX_NUMBER,TEMPLATE_ID)
|
|
|
|
|
.where(ID,equal(doc.id()))
|
|
|
|
|
.prepare(db)
|
|
|
|
|
.apply(timestamp,doc.delivery(),doc.footer(),doc.head(),doc.number(),doc.state().code(),sender.name(),sender.taxNumber(),sender.bankAccount(),sender.court(),custom.name(),custom.email(),custom.id(),custom.taxNumber(),doc.template().id())
|
|
|
|
|
@@ -530,7 +533,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
var pos = entry.getValue();
|
|
|
|
|
if (pos.docId() != doc.id()) pos.setDocId(doc.id());
|
|
|
|
|
if (pos.isNew()){
|
|
|
|
|
insertInto(TABLE_POSITIONS,FIELD_DOCUMENT_ID,FIELD_POS, FIELD_ITEM_CODE,FIELD_AMOUNT, DESCRIPTION, TITLE,FIELD_UNIT,FIELD_PRICE,FIELD_TAX,FIELD_TIME_ID, OPTIONAL)
|
|
|
|
|
insertInto(TABLE_POSITIONS,DOCUMENT_ID,POS, ITEM_CODE,AMOUNT, DESCRIPTION, TITLE,UNIT,PRICE,TAX,TIME_ID, OPTIONAL)
|
|
|
|
|
.values(pos.docId(),pos.num(),pos.itemCode(),pos.amount(),pos.description(),pos.title(),pos.unit(),pos.unitPrice(),pos.tax(),pos.timeId(),pos.optional())
|
|
|
|
|
.execute(db)
|
|
|
|
|
.close();
|
|
|
|
|
@@ -538,12 +541,12 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
}
|
|
|
|
|
if (pos.isDirty()){
|
|
|
|
|
update(TABLE_POSITIONS)
|
|
|
|
|
.set(FIELD_ITEM_CODE,FIELD_AMOUNT, DESCRIPTION, TITLE,FIELD_UNIT,FIELD_PRICE,FIELD_TAX,FIELD_TIME_ID, OPTIONAL)
|
|
|
|
|
.where(FIELD_DOCUMENT_ID,equal(doc.id()))
|
|
|
|
|
.where(FIELD_POS,equal(pos.num())).prepare(db)
|
|
|
|
|
.set(ITEM_CODE,AMOUNT, DESCRIPTION, TITLE,UNIT,PRICE,TAX,TIME_ID, OPTIONAL)
|
|
|
|
|
.where(DOCUMENT_ID,equal(doc.id()))
|
|
|
|
|
.where(POS,equal(pos.num())).prepare(db)
|
|
|
|
|
.apply(pos.itemCode(),pos.amount(),pos.description(),pos.title(),pos.unit(),pos.unitPrice(),pos.tax(),pos.timeId(),pos.optional())
|
|
|
|
|
.close();
|
|
|
|
|
if (pos.isDirty(FIELD_UNIT_PRICE)) saveCustomerPrice(doc.companyId(),doc.customer().id(),pos.itemCode(),pos.unitPrice());
|
|
|
|
|
if (pos.isDirty(UNIT_PRICE)) saveCustomerPrice(doc.companyId(),doc.customer().id(),pos.itemCode(),pos.unitPrice());
|
|
|
|
|
pos.clean();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
@@ -558,7 +561,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
public CustomerSettings save(long companyId, Type docType, String customerId, CustomerSettings settings) throws UmbrellaException {
|
|
|
|
|
if (!settings.isDirty()) return settings;
|
|
|
|
|
try {
|
|
|
|
|
replaceInto(TABLE_CUSTOMER_SETTINGS,FIELD_COMPANY_ID,FIELD_DOC_TYPE_ID,FIELD_CUSTOMER_NUMBER,FIELD_DEFAULT_HEADER,FIELD_DEFAULT_FOOTER,FIELD_DEFAULT_MAIL)
|
|
|
|
|
replaceInto(TABLE_CUSTOMER_SETTINGS,COMPANY_ID,DOC_TYPE_ID,CUSTOMER_NUMBER,DEFAULT_HEADER,DEFAULT_FOOTER,DEFAULT_MAIL)
|
|
|
|
|
.values(companyId,docType.id(),customerId,settings.header(),settings.footer(),settings.mailText())
|
|
|
|
|
.execute(db)
|
|
|
|
|
.close();
|
|
|
|
|
@@ -570,16 +573,16 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
|
|
|
|
|
private void saveCustomerPrice(long company, String customer, String item, long price) {
|
|
|
|
|
try {
|
|
|
|
|
var rs = select(FIELD_PRICE).from(TABLE_PRICES).where(FIELD_COMPANY_ID,equal(company)).where(FIELD_CUSTOMER_NUMBER,equal(customer)).where(FIELD_ITEM_CODE,equal(item)).exec(db);
|
|
|
|
|
var rs = select(PRICE).from(TABLE_PRICES).where(COMPANY_ID,equal(company)).where(CUSTOMER_NUMBER,equal(customer)).where(ITEM_CODE,equal(item)).exec(db);
|
|
|
|
|
Long oldPrice = null;
|
|
|
|
|
if (rs.next()) oldPrice = rs.getLong(FIELD_PRICE);
|
|
|
|
|
if (rs.next()) oldPrice = rs.getLong(PRICE);
|
|
|
|
|
rs.close();
|
|
|
|
|
|
|
|
|
|
if (oldPrice == null) {
|
|
|
|
|
insertInto(TABLE_PRICES, FIELD_COMPANY_ID, FIELD_CUSTOMER_NUMBER, FIELD_ITEM_CODE, FIELD_PRICE).values(company, customer, item, price).execute(db).close();
|
|
|
|
|
insertInto(TABLE_PRICES, COMPANY_ID, CUSTOMER_NUMBER, ITEM_CODE, PRICE).values(company, customer, item, price).execute(db).close();
|
|
|
|
|
} else {
|
|
|
|
|
update(TABLE_PRICES).where(FIELD_COMPANY_ID,equal(company)).where(FIELD_CUSTOMER_NUMBER,equal(customer)).where(FIELD_ITEM_CODE,equal(item))
|
|
|
|
|
.set(FIELD_PRICE).prepare(db).apply(price).close();
|
|
|
|
|
update(TABLE_PRICES).where(COMPANY_ID,equal(company)).where(CUSTOMER_NUMBER,equal(customer)).where(ITEM_CODE,equal(item))
|
|
|
|
|
.set(PRICE).prepare(db).apply(price).close();
|
|
|
|
|
}
|
|
|
|
|
} catch (SQLException e) {
|
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
|
@@ -590,8 +593,8 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
public void step(CompanySettings settings) {
|
|
|
|
|
try {
|
|
|
|
|
update(TABLE_COMPANY_SETTINGS)
|
|
|
|
|
.set(FIELD_TYPE_NUMBER)
|
|
|
|
|
.where(FIELD_COMPANY_ID,equal(settings.companyId())).where(FIELD_DOC_TYPE_ID,equal(settings.typeId()))
|
|
|
|
|
.set(TYPE_NUMBER)
|
|
|
|
|
.where(COMPANY_ID,equal(settings.companyId())).where(DOC_TYPE_ID,equal(settings.typeId()))
|
|
|
|
|
.prepare(db)
|
|
|
|
|
.apply(settings.typeNumber()+1)
|
|
|
|
|
.close();
|
|
|
|
|
@@ -604,9 +607,9 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
public Pair<Integer> switchPositions(long docId, Pair<Integer> pair) throws UmbrellaException {
|
|
|
|
|
try {
|
|
|
|
|
db.setAutoCommit(false);
|
|
|
|
|
update(TABLE_POSITIONS).set(FIELD_POS).where(FIELD_DOCUMENT_ID,equal(docId)).where(FIELD_POS,equal(pair.left())).prepare(db).apply(-pair.right()).close();
|
|
|
|
|
update(TABLE_POSITIONS).set(FIELD_POS).where(FIELD_DOCUMENT_ID,equal(docId)).where(FIELD_POS,equal(pair.right())).prepare(db).apply(pair.left()).close();
|
|
|
|
|
update(TABLE_POSITIONS).set(FIELD_POS).where(FIELD_DOCUMENT_ID,equal(docId)).where(FIELD_POS,equal(-pair.right())).prepare(db).apply(pair.right()).close();
|
|
|
|
|
update(TABLE_POSITIONS).set(POS).where(DOCUMENT_ID,equal(docId)).where(POS,equal(pair.left())).prepare(db).apply(-pair.right()).close();
|
|
|
|
|
update(TABLE_POSITIONS).set(POS).where(DOCUMENT_ID,equal(docId)).where(POS,equal(pair.right())).prepare(db).apply(pair.left()).close();
|
|
|
|
|
update(TABLE_POSITIONS).set(POS).where(DOCUMENT_ID,equal(docId)).where(POS,equal(-pair.right())).prepare(db).apply(pair.right()).close();
|
|
|
|
|
db.setAutoCommit(true);
|
|
|
|
|
} catch (SQLException e) {
|
|
|
|
|
LOG.log(ERROR,"Failed to switch positions {0} and {1} of document {2}",pair.left(),pair.right(),docId);
|
|
|
|
|
@@ -617,26 +620,26 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
|
|
|
|
|
private Document toDoc(ResultSet rs, HashMap<Integer, Type> types) throws SQLException {
|
|
|
|
|
var id = rs.getLong(ID);
|
|
|
|
|
var typeId = rs.getInt(FIELD_TYPE_ID);
|
|
|
|
|
var typeId = rs.getInt(TYPE_ID);
|
|
|
|
|
var type = types.get(typeId);
|
|
|
|
|
var company = rs.getLong(FIELD_COMPANY_ID);
|
|
|
|
|
var company = rs.getLong(COMPANY_ID);
|
|
|
|
|
var number = rs.getString(NUMBER);
|
|
|
|
|
var timestamp = rs.getLong(DATE);
|
|
|
|
|
var date = timestamp > 0 ? Instant.ofEpochSecond(timestamp).atOffset(UTC).toLocalDate() : null;
|
|
|
|
|
var state = rs.getInt(STATE);
|
|
|
|
|
|
|
|
|
|
var delivery = rs.getString(FIELD_DELIVERY_DATE);
|
|
|
|
|
var head = rs.getString(FIELD_HEAD);
|
|
|
|
|
var footer = rs.getString(FIELD_FOOTER);
|
|
|
|
|
var currency = rs.getString(FIELD_CURRENCY);
|
|
|
|
|
var delivery = rs.getString(DELIVERY_DATE);
|
|
|
|
|
var head = rs.getString(HEAD);
|
|
|
|
|
var footer = rs.getString(FOOTER);
|
|
|
|
|
var currency = rs.getString(CURRENCY);
|
|
|
|
|
var senderName = rs.getString(SENDER);
|
|
|
|
|
var taxNumber = rs.getString(FIELD_TAX_NUMBER);
|
|
|
|
|
var bankAccount = rs.getString(FIELD_BANK_ACCOUNT);
|
|
|
|
|
var court = rs.getString(FIELD_COURT);
|
|
|
|
|
var customerName = rs.getString(FIELD_CUSTOMER);
|
|
|
|
|
var customerId = rs.getString(FIELD_CUSTOMER_NUMBER);
|
|
|
|
|
var customerTaxNumber = rs.getString(FIELD_CUSTOMER_TAX_NUMBER);
|
|
|
|
|
var customerEmail = rs.getString(FIELD_CUSTOMER_EMAIL);
|
|
|
|
|
var taxNumber = rs.getString(TAX_NUMBER);
|
|
|
|
|
var bankAccount = rs.getString(BANK_ACCOUNT);
|
|
|
|
|
var court = rs.getString(COURT);
|
|
|
|
|
var customerName = rs.getString(CUSTOMER);
|
|
|
|
|
var customerId = rs.getString(CUSTOMER_NUMBER);
|
|
|
|
|
var customerTaxNumber = rs.getString(CUSTOMER_TAX_NUMBER);
|
|
|
|
|
var customerEmail = rs.getString(CUSTOMER_EMAIL);
|
|
|
|
|
var customer = new Customer(customerId, customerName, customerEmail, customerTaxNumber,FALLBACK_LANG);
|
|
|
|
|
var sender = new Sender(senderName,bankAccount,taxNumber,court);
|
|
|
|
|
var template = toTemplate(rs);
|
|
|
|
|
@@ -645,8 +648,8 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
|
|
|
|
|
private Template toTemplate(ResultSet rs) throws SQLException {
|
|
|
|
|
try {
|
|
|
|
|
var id = rs.getLong(FIELD_TEMPLATE_ID);
|
|
|
|
|
var company = rs.getLong(FIELD_COMPANY_ID);
|
|
|
|
|
var id = rs.getLong(TEMPLATE_ID);
|
|
|
|
|
var company = rs.getLong(COMPANY_ID);
|
|
|
|
|
var name = rs.getString(NAME);
|
|
|
|
|
var data = rs.getBytes(TEMPLATE);
|
|
|
|
|
return new Template(id,company,name,data);
|
|
|
|
|
@@ -656,20 +659,20 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Position toPosition(ResultSet rs) throws SQLException {
|
|
|
|
|
var num = rs.getInt(FIELD_POS);
|
|
|
|
|
var itemCode = rs.getString(FIELD_ITEM_CODE);
|
|
|
|
|
var amount = rs.getDouble(FIELD_AMOUNT);
|
|
|
|
|
var unit = rs.getString(FIELD_UNIT);
|
|
|
|
|
var num = rs.getInt(POS);
|
|
|
|
|
var itemCode = rs.getString(ITEM_CODE);
|
|
|
|
|
var amount = rs.getDouble(AMOUNT);
|
|
|
|
|
var unit = rs.getString(UNIT);
|
|
|
|
|
var title = rs.getString(TITLE);
|
|
|
|
|
var description = rs.getString(DESCRIPTION);
|
|
|
|
|
var unitPrice = rs.getLong(FIELD_PRICE);
|
|
|
|
|
var tax = rs.getInt(FIELD_TAX);
|
|
|
|
|
var timeId = rs.getLong(FIELD_TIME_ID);
|
|
|
|
|
var unitPrice = rs.getLong(PRICE);
|
|
|
|
|
var tax = rs.getInt(TAX);
|
|
|
|
|
var timeId = rs.getLong(TIME_ID);
|
|
|
|
|
var optional = rs.getBoolean(OPTIONAL);
|
|
|
|
|
return new Position(num,itemCode,amount,unit,title,description,unitPrice,tax,timeId,optional);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Type toType(ResultSet rs) throws SQLException {
|
|
|
|
|
return new Type(rs.getInt(ID),rs.getInt(FIELD_NEXT_TYPE),rs.getString(NAME));
|
|
|
|
|
return new Type(rs.getInt(ID),rs.getInt(NEXT_TYPE),rs.getString(NAME));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|