implemented display of document positions
This commit is contained in:
@@ -90,5 +90,5 @@ public class Constants {
|
||||
public static final String TABLE_POSITIONS = "document_positions";
|
||||
public static final String TABLE_PRICES = "customer_prices";
|
||||
public static final String TABLE_TEMPLATES = "templates";
|
||||
|
||||
public static final String TEMPLATES = "templates";
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
|
||||
import static de.srsoftware.umbrella.core.Constants.*;
|
||||
import static de.srsoftware.umbrella.core.Paths.LIST;
|
||||
import static de.srsoftware.umbrella.core.Util.request;
|
||||
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.forbidden;
|
||||
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingFieldException;
|
||||
import static de.srsoftware.umbrella.documents.Constants.*;
|
||||
import static de.srsoftware.umbrella.documents.model.Document.State.NEW;
|
||||
@@ -28,11 +29,9 @@ import de.srsoftware.umbrella.documents.model.*;
|
||||
import java.io.IOException;
|
||||
import java.time.LocalDate;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONObject;
|
||||
|
||||
@@ -75,10 +74,7 @@ public class DocumentApi extends BaseHandler {
|
||||
private boolean deleteDocument(HttpExchange ex, long docId, UmbrellaUser user) throws IOException, UmbrellaException {
|
||||
var doc = db.loadDoc(docId);
|
||||
var companyId = doc.companyId();
|
||||
var members = companies.getMembers(companyId);
|
||||
var isMember = false;
|
||||
for (var member : members) isMember |= user.equals(member);
|
||||
if (!isMember) throw new UmbrellaException(HTTP_FORBIDDEN,"You are mot a member of company {0}",doc.companyId());
|
||||
if (!companies.membership(companyId,user.id())) throw forbidden("You are mot a member of company {0}",doc.companyId());
|
||||
if (doc.state() != NEW) throw new UmbrellaException(HTTP_BAD_REQUEST,"This document has already been sent");
|
||||
return sendContent(ex,db.deleteDoc(docId));
|
||||
}
|
||||
@@ -99,7 +95,8 @@ public class DocumentApi extends BaseHandler {
|
||||
case null -> super.doGet(path,ex);
|
||||
default -> {
|
||||
try {
|
||||
yield getDocument(ex,Long.parseLong(head),user.get());
|
||||
var docId = Long.parseLong(head);
|
||||
yield getDocument(ex,docId,user.get());
|
||||
} catch (NumberFormatException ignored) {}
|
||||
yield super.doGet(path,ex);
|
||||
}
|
||||
@@ -123,7 +120,8 @@ public class DocumentApi extends BaseHandler {
|
||||
if (user.isEmpty()) return unauthorized(ex);
|
||||
var head = path.pop();
|
||||
return switch (head){
|
||||
case LIST -> listDocuments(ex,user.get(),token.orElse(null));
|
||||
case LIST -> listCompaniesDocuments(ex,user.get(),token.orElse(null));
|
||||
case TEMPLATES -> postTemplateList(ex,user.get());
|
||||
case null -> postDocument(ex,user.get());
|
||||
default -> super.doPost(path,ex);
|
||||
};
|
||||
@@ -145,6 +143,8 @@ public class DocumentApi extends BaseHandler {
|
||||
return sendContent(ex,map);
|
||||
}
|
||||
|
||||
|
||||
|
||||
private boolean getDocTypes(HttpExchange ex) throws UmbrellaException, IOException {
|
||||
var types = db.listTypes();
|
||||
var map = types.values().stream().collect(Collectors.toMap(Type::id, Type::name));
|
||||
@@ -155,10 +155,7 @@ public class DocumentApi extends BaseHandler {
|
||||
var doc = db.loadDoc(docId);
|
||||
var companyId = doc.companyId();
|
||||
var company = companies.get(companyId);
|
||||
var members = companies.getMembers(companyId);
|
||||
var isMember = false;
|
||||
for (var member : members) isMember |= user.equals(member);
|
||||
if (!isMember) return sendContent(ex,HTTP_FORBIDDEN,"You are mot a member of company "+doc.companyId());
|
||||
if (!companies.membership(companyId,user.id())) throw forbidden("You are mot a member of company {0}",company.name());
|
||||
var sep = company.decimalSeparator();
|
||||
if (sep != null) doc.setDecimalSeparator(sep);
|
||||
doc.setCompanyName(company.name());
|
||||
@@ -173,13 +170,13 @@ public class DocumentApi extends BaseHandler {
|
||||
return new JSONArray(s);
|
||||
}
|
||||
|
||||
private boolean listDocuments(HttpExchange ex, UmbrellaUser user, Token token) throws UmbrellaException {
|
||||
private boolean listCompaniesDocuments(HttpExchange ex, UmbrellaUser user, Token token) throws UmbrellaException {
|
||||
try {
|
||||
var json = json(ex);
|
||||
if (!json.has(COMPANY)) throw missingFieldException(COMPANY);
|
||||
long companyId = json.getLong(COMPANY);
|
||||
var company = companies.get(companyId);
|
||||
if (!companies.membership(companyId,user.id())) throw new UmbrellaException(HTTP_FORBIDDEN,"You are mot a member of company {0}",company);
|
||||
if (!companies.membership(companyId,user.id())) throw forbidden("You are mot a member of company {0}",company);
|
||||
var docs = db.listDocs(companyId);
|
||||
var map = new HashMap<Long,Object>();
|
||||
for (var entry : docs.entrySet()) map.put(entry.getKey(),entry.getValue().summary());
|
||||
@@ -196,7 +193,7 @@ public class DocumentApi extends BaseHandler {
|
||||
if (!senderData.has(FIELD_COMPANY) || !(senderData.get(FIELD_COMPANY) instanceof Number companyId)) throw missingFieldException(FIELD_COMPANY);
|
||||
|
||||
var company = companies.get(companyId.longValue());
|
||||
if (!companies.membership(companyId.longValue(),user.id())) throw new UmbrellaException(HTTP_FORBIDDEN,"You are mot a member of company {0}",company);
|
||||
if (!companies.membership(companyId.longValue(),user.id())) throw forbidden("You are mot a member of company {0}",company);
|
||||
|
||||
if (!json.has(FIELD_CUSTOMER) || !(json.get(FIELD_CUSTOMER) instanceof JSONObject customerData)) throw missingFieldException(FIELD_CUSTOMER);
|
||||
if (!json.has(FIELD_TYPE) || !(json.get(FIELD_TYPE) instanceof Number docTypeId)) throw missingFieldException(FIELD_TYPE);
|
||||
@@ -217,4 +214,13 @@ public class DocumentApi extends BaseHandler {
|
||||
db.step(companySettings);
|
||||
return sendContent(ex,saved.toMap());
|
||||
}
|
||||
|
||||
private boolean postTemplateList(HttpExchange ex, UmbrellaUser user) throws UmbrellaException, IOException {
|
||||
var json = json(ex);
|
||||
if (!(json.has(COMPANY) && json.get(COMPANY) instanceof Number companyId)) throw missingFieldException(COMPANY);
|
||||
var company = companies.get(companyId.longValue());
|
||||
if (!companies.membership(companyId.longValue(),user.id())) throw forbidden("You are not a member of {0}",company.name());
|
||||
var templates = db.getCompanyTemplates(companyId.longValue());
|
||||
return sendContent(ex,templates.stream().map(Template::toMap));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,10 +3,8 @@ package de.srsoftware.umbrella.documents;
|
||||
|
||||
import de.srsoftware.tools.Pair;
|
||||
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
|
||||
import de.srsoftware.umbrella.documents.model.CompanySettings;
|
||||
import de.srsoftware.umbrella.documents.model.CustomerSettings;
|
||||
import de.srsoftware.umbrella.documents.model.Document;
|
||||
import de.srsoftware.umbrella.documents.model.Type;
|
||||
import de.srsoftware.umbrella.documents.model.*;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -52,4 +50,6 @@ public interface DocumentDb {
|
||||
void step(CompanySettings settings);
|
||||
|
||||
Pair<Integer> switchPositions(long docId, Pair<Integer> longPair) throws UmbrellaException;
|
||||
|
||||
Collection<Template> getCompanyTemplates(long l) throws UmbrellaException;
|
||||
}
|
||||
|
||||
@@ -6,8 +6,8 @@ import static de.srsoftware.tools.jdbc.Condition.equal;
|
||||
import static de.srsoftware.tools.jdbc.Condition.in;
|
||||
import static de.srsoftware.tools.jdbc.Query.*;
|
||||
import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL;
|
||||
import static de.srsoftware.umbrella.company.Constants.*;
|
||||
import static de.srsoftware.umbrella.core.Constants.*;
|
||||
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.databaseException;
|
||||
import static de.srsoftware.umbrella.documents.Constants.*;
|
||||
import static de.srsoftware.umbrella.documents.model.Document.DEFAULT_THOUSANDS_SEPARATOR;
|
||||
import static de.srsoftware.umbrella.documents.model.Document.State;
|
||||
@@ -24,6 +24,7 @@ import java.sql.Connection;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.time.Instant;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
@@ -252,11 +253,22 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
||||
if (rs.next()) settings = CompanySettings.of(rs);
|
||||
rs.close();
|
||||
if (settings != null) return settings;
|
||||
|
||||
} catch (SQLException e) {
|
||||
LOG.log(WARNING,"Failed to load customer settings (company: {0}, document type: {1}",companyId, docType.name(),e);
|
||||
} catch (SQLException ignored) {
|
||||
}
|
||||
throw databaseException("Failed to load customer settings (company: {0}, document type: {1})",companyId, docType.name());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Template> getCompanyTemplates(long companyId) throws UmbrellaException {
|
||||
try {
|
||||
var rs = select(ALL).from(TABLE_TEMPLATES).where(COMPANY_ID,equal(companyId)).exec(db);
|
||||
var templates = new HashSet<Template>();
|
||||
while (rs.next()) templates.add(Template.of(rs));
|
||||
rs.close();
|
||||
return templates;
|
||||
} catch (SQLException e) {
|
||||
throw databaseException("Failed to load templates for company {0}",companyId);
|
||||
}
|
||||
throw new UmbrellaException(500,"Failed to load customer settings (company: {0}, document type: {1}",companyId, docType.name());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,14 +1,20 @@
|
||||
/* © SRSoftware 2025 */
|
||||
package de.srsoftware.umbrella.documents.model;
|
||||
|
||||
import static de.srsoftware.umbrella.core.Constants.ID;
|
||||
import static de.srsoftware.umbrella.core.Constants.NAME;
|
||||
import static de.srsoftware.umbrella.core.Constants.*;
|
||||
import static de.srsoftware.umbrella.documents.Constants.FIELD_COMPANY;
|
||||
|
||||
import de.srsoftware.tools.Mappable;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Map;
|
||||
|
||||
public record Template(long id, long company, String name, byte[] data) implements Mappable {
|
||||
|
||||
public static Template of(ResultSet rs) throws SQLException {
|
||||
return new Template(rs.getLong(ID),rs.getLong(COMPANY_ID),rs.getString(NAME),rs.getBytes(TEMPLATE));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> toMap() {
|
||||
return Map.of(ID,id,FIELD_COMPANY,company, NAME,name);
|
||||
|
||||
Reference in New Issue
Block a user