OpenConcerto

Dépôt officiel du code source de l'ERP OpenConcerto
sonarqube

svn://code.openconcerto.org/openconcerto

Compare Revisions

Ignore whitespace Rev 173 → Rev 174

/trunk/OpenConcerto/src/org/jopendocument/link/OOConnexion.java
84,8 → 84,14
perms.add(new RuntimePermission("modifyThread"));
// needed by PrinterJob.getPrinterJob()
perms.add(new RuntimePermission("queuePrintJob"));
 
// ProcessBuilder.start() calls SecurityManager.checkExec() which requires
// absolute path (or execute on "<<ALL FILES>>")
 
// needed by OOConnexion.init() to find the port
perms.add(new FilePermission("/usr/bin/lsof", "execute"));
// macOS path
perms.add(new FilePermission("/usr/sbin/lsof", "execute"));
perms.add(new FilePermission("/bin/ps", "execute"));
perms.add(new FilePermission("C:/Windows/System32/tasklist.exe", "execute"));
perms.add(new RuntimePermission("getenv.*"));
/trunk/OpenConcerto/src/org/jopendocument/link/OOInstallation.java
102,10 → 102,14
rootPaths.addAll(Arrays.asList(loRootPaths));
rootPaths.addAll(Arrays.asList(ooRootPaths));
}
 
for (final String p : rootPaths) {
if (DesktopEnvironment.test("reg", "query", p))
// On force à chercher dans le registre 64 bits sinon il va chercher dans le registre 32
// bits si os 64b et VM 32b
if (DesktopEnvironment.test("reg", "query", p, "/reg:64"))
return p;
}
 
return null;
}
 
123,7 → 127,8
// all string values for the passed registry path
private static Map<String, String> getStringValues(final String path, final String option) throws IOException {
final Map<String, String> values = new HashMap<String, String>();
final String out = DesktopEnvironment.cmdSubstitution(Runtime.getRuntime().exec(new String[] { "reg", "query", path, option }));
// On force /reg:64 (utile si on utilise une VM 32 avec un systeme 64 bits)
final String out = DesktopEnvironment.cmdSubstitution(Runtime.getRuntime().exec(new String[] { "reg", "query", path, option, "/reg:64" }));
final Matcher matcher = stringValuePattern.matcher(out);
while (matcher.find()) {
values.put(matcher.group(1), matcher.group(2));
/trunk/OpenConcerto/src/org/openconcerto/utils/FileUtils.java
695,6 → 695,7
* @see StreamUtils#createXMLWriter(java.io.OutputStream)
*/
public static BufferedWriter createXMLWriter(final File f) throws IOException {
FileUtils.mkParentDirs(f);
final FileOutputStream outs = new FileOutputStream(f);
try {
return StreamUtils.createXMLWriter(outs);
/trunk/OpenConcerto/src/org/openconcerto/utils/CollectionMap2.java
122,6 → 122,9
 
// ** copy constructors
 
// ATTN getDelegate() is not in CollectionMap2Itf, so if one copies an unmodifiableMap() this
// constructor won't be used and the delegate will be the default HashMap (even if the source
// used a LinkedHashMap).
public CollectionMap2(final CollectionMap2<K, C, ? extends V> m) {
this(CopyUtils.copy(m.getDelegate()), m);
}
/trunk/OpenConcerto/src/org/openconcerto/utils/ooxml/XLSXFormat.java
New file
0,0 → 1,71
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.utils.ooxml;
 
import java.text.DecimalFormat;
import java.text.Format;
import java.text.SimpleDateFormat;
 
public class XLSXFormat {
private final int id;
private final String format;
private boolean isDateFormat = false;
private Format jformat;
 
public XLSXFormat(int id, String format) {
this.id = id;
this.format = format;
final String f = format.toLowerCase();
if (f.contains("mm") || f.contains("dd") || f.contains("yy")) {
this.isDateFormat = true;
}
}
 
public XLSXFormat(int id, String format, boolean date) {
this.id = id;
this.format = format;
this.isDateFormat = date;
}
 
public int getId() {
return this.id;
}
 
public String getFormat() {
return this.format;
}
 
public boolean isDateFormat() {
return this.isDateFormat;
}
 
public String format(String txt) {
if (this.format.equalsIgnoreCase("general")) {
return txt;
}
if (this.jformat == null) {
String javaFormat = this.format.replace("YYYY", "yyyy");
javaFormat = javaFormat.replace("YY", "yy");
javaFormat = javaFormat.replace("mm", "MM");
javaFormat = javaFormat.replace("dd", "DD");
if (this.isDateFormat) {
this.jformat = new SimpleDateFormat(javaFormat);
} else {
this.jformat = new DecimalFormat(javaFormat);
}
}
return this.jformat.format(txt);
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/utils/ooxml/XLSXSheet.java
New file
0,0 → 1,261
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.utils.ooxml;
 
import org.openconcerto.utils.StringInputStream;
import org.openconcerto.utils.StringUtils;
 
import java.awt.Point;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
 
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
 
import com.ibm.icu.math.BigDecimal;
 
public class XLSXSheet {
private int columnCount;
private int startX;
private int startY;
private int endX;
private int endY;
private static final String MINCELL = "\\$?([A-Z]+)\\$?([0-9]+)";
private static final Pattern minCellPattern = Pattern.compile(MINCELL);
private final List<List<Object>> rows;
private String id;
private String rId;
private String name;
 
public XLSXSheet(XLSXDocument document, String id, String rId, String name, String xml) throws IOException, ParserConfigurationException, SAXException {
this.id = id;
this.rId = rId;
this.name = name;
 
final DocumentBuilder dBuilder = document.getDbFactory().newDocumentBuilder();
final Document doc = dBuilder.parse(new StringInputStream(xml, StandardCharsets.UTF_8.name()));
doc.getDocumentElement().normalize();
 
final NodeList nList = doc.getElementsByTagName("dimension");
final String dimension = nList.item(0).getAttributes().getNamedItem("ref").getNodeValue();
final List<String> parts = StringUtils.fastSplit(dimension, ':');
 
final Point start = resolve(parts.get(0));
this.startX = start.x;
this.startY = start.y;
 
final Point end = resolve(parts.get(1));
this.endX = end.x;
this.endY = end.y;
this.rows = new ArrayList<>(end.y - start.y);
this.columnCount = this.endX - this.startX + 1;
 
for (int i = start.y; i <= end.y; i++) {
List<Object> row = new ArrayList<>();
for (int j = 0; j < this.columnCount; j++) {
row.add(null);
}
this.rows.add(row);
}
Calendar calendar = Calendar.getInstance();
NodeList nListRows = doc.getElementsByTagName("row");
int l1 = nListRows.getLength();
for (int i = 0; i < l1; i++) {
Node r = nListRows.item(i);
NodeList nListCells = r.getChildNodes();
int l2 = nListCells.getLength();
for (int j = 0; j < l2; j++) {
Node c = nListCells.item(j);
final String location = c.getAttributes().getNamedItem("r").getNodeValue();
final Point p = resolve(location);
if (p == null) {
throw new IllegalStateException("unable to parse location : " + location);
}
// The index of this cell's style. Style records are stored in the Styles Part.
// The possible values for this attribute are defined by the W3C XML Schema
// unsignedInt datatype.
int style = 0;
if (c.getAttributes().getNamedItem("s") != null) {
style = Integer.parseInt(c.getAttributes().getNamedItem("s").getNodeValue());
}
// An enumeration representing the cell's data type.
// The possible values for this attribute are defined by the ST_CellType simple type
// (§18.18.11):
// "b" boolean
// "d" ISO 8601 date
// "n" number
// "e" error
// "s" strin
// "str" formula
// "inlineStr" the cell value is in the is element rather than the v
// element in the cell
String type = "n";
if (c.getAttributes().getNamedItem("t") != null) {
type = c.getAttributes().getNamedItem("t").getNodeValue();
}
NodeList nListCellParts = c.getChildNodes();
int l3 = nListCellParts.getLength();
for (int k = 0; k < l3; k++) {
Node part = nListCellParts.item(k);
if (part.getNodeName().equals("v")) {
String value = part.getTextContent();
Object cellValue = null;
if (type.equals("n")) {
final XLSXFormat format = document.getFormatFromStyle(style);
if (format != null) {
if (format.isDateFormat()) {
cellValue = stringToDate(calendar, value);
} else {
cellValue = new BigDecimal(value);
}
} else {
cellValue = new BigDecimal(value);
}
} else if (type.equals("s")) {
cellValue = document.getSharedString(Integer.parseInt(value));
}
this.rows.get(p.y - this.startY).set(p.x - this.startX, cellValue);
}
}
 
}
}
}
 
public Object getValueAt(int col, int row) {
return this.rows.get(row).get(col);
}
 
public int getColumnCount() {
return this.columnCount;
}
 
public int getRowCount() {
return this.rows.size();
}
 
/**
* Convert string coordinates into numeric ones.
*
* @param ref the string address, eg "$AA$34" or "AA34".
* @return the numeric coordinates or <code>null</code> if <code>ref</code> is not valid, eg
* {26, 33}.
*/
static final Point resolve(String ref) {
final Matcher matcher = minCellPattern.matcher(ref);
if (!matcher.matches())
return null;
return resolve(matcher.group(1), matcher.group(2));
}
 
/**
* Convert string coordinates into numeric ones. ATTN this method does no checks.
*
* @param letters the column, eg "AA".
* @param digits the row, eg "34".
* @return the numeric coordinates, eg {26, 33}.
*/
static final Point resolve(final String letters, final String digits) {
return new Point(toInt(letters), Integer.parseInt(digits) - 1);
}
 
// "AA" => 26
static final int toInt(String col) {
if (col.length() < 1)
throw new IllegalArgumentException("x cannot be empty");
col = col.toUpperCase();
 
int x = 0;
for (int i = 0; i < col.length(); i++) {
x = x * 26 + (col.charAt(i) - 'A' + 1);
}
 
// zero based
return x - 1;
}
 
public static final String toStr(int col) {
if (col < 0)
throw new IllegalArgumentException("negative column : " + col);
// one based (i.e. 0 is A)
col++;
 
final int radix = 26;
final StringBuilder chars = new StringBuilder(4);
while (col > 0) {
chars.append((char) ('A' + ((col - 1) % radix)));
col = (col - 1) / radix;
}
 
return chars.reverse().toString();
}
 
/**
* Convert numeric coordinates into string ones.
*
* @param p the numeric coordinates, e.g. {26, 33}.
* @return the string address, e.g. "AA34".
*/
static final String getAddress(Point p) {
if (p.x < 0 || p.y < 0)
throw new IllegalArgumentException("negative coordinates : " + p);
return toStr(p.x) + (p.y + 1);
}
 
public String getId() {
return this.id;
}
 
public static Date stringToDate(Calendar c, String d) {
c.clear();
c.set(1900, 0, 0);
c.add(Calendar.DAY_OF_YEAR, Integer.parseInt(d) - 1);
return c.getTime();
}
 
public int getStartX() {
return this.startX;
}
 
public int getStartY() {
return this.startY;
}
 
public int getEndX() {
return this.endX;
}
 
public int getEndY() {
return this.endY;
}
 
public String getName() {
return this.name;
}
 
public String getRId() {
return this.rId;
}
}
/trunk/OpenConcerto/src/org/openconcerto/utils/ooxml/XLSXDocument.java
New file
0,0 → 1,273
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.utils.ooxml;
 
import org.openconcerto.utils.StringInputStream;
 
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
 
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
 
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
 
public class XLSXDocument {
 
private File file;
private final List<XLSXSheet> sheets = new ArrayList<>();
private final Map<String, String> relationships = new HashMap<>();
private final List<String> sharedString = new ArrayList<>();
private final Map<Integer, XLSXFormat> mapFormats = new HashMap<>();
private final List<XLSXFormat> customFormats = new ArrayList<>();
private final List<XLSXStyle> styles = new ArrayList<>();
private final DocumentBuilderFactory dbFactory;
 
public static XLSXDocument createFromFile(File f) throws IOException {
XLSXDocument doc = new XLSXDocument();
doc.load(f);
return doc;
}
 
public XLSXDocument() {
this.mapFormats.put(0, new XLSXFormat(0, "General", false));
this.mapFormats.put(1, new XLSXFormat(1, "0", false));
this.mapFormats.put(2, new XLSXFormat(2, "0.00", false));
this.mapFormats.put(3, new XLSXFormat(3, "#,##0", false));
this.mapFormats.put(4, new XLSXFormat(4, "#,##0.00", false));
this.mapFormats.put(9, new XLSXFormat(9, "0%", false));
this.mapFormats.put(10, new XLSXFormat(10, "0.00%", false));
this.mapFormats.put(11, new XLSXFormat(11, "0.00E+00", false));
this.mapFormats.put(12, new XLSXFormat(12, "# ?/?", false));
this.mapFormats.put(13, new XLSXFormat(13, "# ??/??", false));
this.mapFormats.put(14, new XLSXFormat(14, "mm-dd-yy", true));
this.mapFormats.put(15, new XLSXFormat(15, "d-mmm-yy", true));
this.mapFormats.put(16, new XLSXFormat(16, "d-mmm", true));
this.mapFormats.put(17, new XLSXFormat(17, "mmm-yy", true));
this.mapFormats.put(18, new XLSXFormat(18, "h:mm AM/PM", false));
this.mapFormats.put(19, new XLSXFormat(19, "h:mm:ss AM/PM", false));
this.mapFormats.put(20, new XLSXFormat(20, "h:mm", false));
this.mapFormats.put(21, new XLSXFormat(21, "h:mm:ss", false));
this.mapFormats.put(22, new XLSXFormat(22, "m/d/yy h:mm", true));
this.mapFormats.put(27, new XLSXFormat(27, "[$-404]e/m/d", true));
this.mapFormats.put(30, new XLSXFormat(30, "m/d/yy", true));
this.mapFormats.put(36, new XLSXFormat(36, "[$-404]e/m/d", true));
this.mapFormats.put(37, new XLSXFormat(37, "#,##0 ;(#,##0)", false));
this.mapFormats.put(38, new XLSXFormat(38, "#,##0 ;[Red](#,##0)", false));
this.mapFormats.put(39, new XLSXFormat(39, "#,##0.00;(#,##0.00)", false));
this.mapFormats.put(40, new XLSXFormat(40, "#,##0.00;[Red](#,##0.00)", false));
this.mapFormats.put(44, new XLSXFormat(44, "_(\"$\"* #,##0.00_);_(\"$\"* (#,##0.00);_(\"$\"* \"-\"??_);_(@_)", false));
this.mapFormats.put(45, new XLSXFormat(45, "mm:ss", false));
this.mapFormats.put(46, new XLSXFormat(46, "[h]:mm:ss", false));
this.mapFormats.put(47, new XLSXFormat(47, "mmss.0", false));
this.mapFormats.put(48, new XLSXFormat(48, "##0.0E+0", false));
this.mapFormats.put(49, new XLSXFormat(49, "@", false));
this.mapFormats.put(50, new XLSXFormat(50, "[$-404]e/m/d", true));
this.mapFormats.put(57, new XLSXFormat(57, "[$-404]e/m/d", true));
this.mapFormats.put(59, new XLSXFormat(59, "t0", false));
this.mapFormats.put(60, new XLSXFormat(60, "t0.00", false));
this.mapFormats.put(61, new XLSXFormat(61, "t#,##0", false));
this.mapFormats.put(62, new XLSXFormat(62, "t#,##0.00", false));
this.mapFormats.put(67, new XLSXFormat(67, "t0%", false));
this.mapFormats.put(68, new XLSXFormat(68, "t0.00%", false));
this.mapFormats.put(69, new XLSXFormat(69, "t# ?/?", false));
this.mapFormats.put(70, new XLSXFormat(70, "t# ??/??", false));
 
this.dbFactory = DocumentBuilderFactory.newInstance();
try {
this.dbFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
} catch (ParserConfigurationException e) {
throw new IllegalStateException(e);
}
try {
this.dbFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
this.dbFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
} catch (Exception e) {
// ignore
}
this.dbFactory.setNamespaceAware(true);
 
}
 
public File getFile() {
return this.file;
}
 
private void load(File f) throws IOException {
this.file = f;
try (ZipFile zipFile = new ZipFile(f)) {
try {
parseSharedStrings(zipFile);
parseStyles(zipFile);
parseWorkBook(zipFile);
} catch (ParserConfigurationException | SAXException e) {
throw new IOException(e);
}
 
}
}
 
private void parseWorkBook(ZipFile zipFile) throws ParserConfigurationException, SAXException, IOException {
final String relationxXML = getContent(zipFile, "xl/_rels/workbook.xml.rels");
final DocumentBuilder dBuilder1 = this.dbFactory.newDocumentBuilder();
final Document doc1 = dBuilder1.parse(new StringInputStream(relationxXML, StandardCharsets.UTF_8.name()));
doc1.getDocumentElement().normalize();
final NodeList nList = doc1.getElementsByTagName("Relationship");
for (int i = 0; i < nList.getLength(); i++) {
final NamedNodeMap attributes = nList.item(i).getAttributes();
final String rId = attributes.getNamedItem("Id").getNodeValue();
final String target = attributes.getNamedItem("Target").getNodeValue();
this.relationships.put(rId, target);
}
 
final String workbookXML = getContent(zipFile, "xl/workbook.xml");
final DocumentBuilder dBuilder2 = this.dbFactory.newDocumentBuilder();
final Document doc2 = dBuilder2.parse(new StringInputStream(workbookXML, StandardCharsets.UTF_8.name()));
doc2.getDocumentElement().normalize();
doc2.getElementsByTagName("sheets");
final NodeList nListSheet = doc2.getElementsByTagName("sheet");
for (int i = 0; i < nListSheet.getLength(); i++) {
final NamedNodeMap attributes = nListSheet.item(i).getAttributes();
final String sheetId = attributes.getNamedItem("sheetId").getNodeValue();
final String name = attributes.getNamedItem("name").getNodeValue();
final String rId = attributes.getNamedItemNS("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "id").getNodeValue();
final String target = "xl/" + this.relationships.get(rId);
final String xml = getContent(zipFile, target);
this.sheets.add(new XLSXSheet(this, sheetId, rId, name, xml));
}
 
}
 
private void parseSharedStrings(ZipFile zipFile) throws ParserConfigurationException, SAXException, IOException {
final String relationxXML = getContent(zipFile, "xl/sharedStrings.xml");
final DocumentBuilder dBuilder1 = this.dbFactory.newDocumentBuilder();
final Document doc1 = dBuilder1.parse(new StringInputStream(relationxXML, StandardCharsets.UTF_8.name()));
doc1.getDocumentElement().normalize();
final NodeList nList = doc1.getElementsByTagName("si");
for (int i = 0; i < nList.getLength(); i++) {
final Node siNode = nList.item(i);
StringBuilder b = new StringBuilder();
NodeList list = siNode.getChildNodes();
for (int j = 0; j < list.getLength(); j++) {
Node n = list.item(j);
if (n.getLocalName().equals("t")) {
b.append(n.getTextContent());
} else {
NodeList subList = n.getChildNodes();
for (int k = 0; k < subList.getLength(); k++) {
Node nn = subList.item(k);
if (nn.getLocalName().equals("t")) {
b.append(nn.getTextContent());
}
 
}
 
}
}
this.sharedString.add(b.toString());
}
 
}
 
private void parseStyles(ZipFile zipFile) throws ParserConfigurationException, SAXException, IOException {
final String relationxXML = getContent(zipFile, "xl/styles.xml");
final DocumentBuilder dBuilder1 = this.dbFactory.newDocumentBuilder();
final Document doc1 = dBuilder1.parse(new StringInputStream(relationxXML, StandardCharsets.UTF_8.name()));
doc1.getDocumentElement().normalize();
final NodeList nListFormats = doc1.getElementsByTagName("numFmts");
for (int i = 0; i < nListFormats.getLength(); i++) {
final Node siNode = nListFormats.item(i);
NodeList list = siNode.getChildNodes();
for (int j = 0; j < list.getLength(); j++) {
Node n = list.item(j);
NamedNodeMap m = n.getAttributes();
int id = Integer.parseInt(m.getNamedItem("numFmtId").getNodeValue());
String format = m.getNamedItem("formatCode").getNodeValue();
final XLSXFormat f = new XLSXFormat(id, format);
this.mapFormats.put(id, f);
this.customFormats.add(f);
}
 
}
 
final NodeList nListCellXfs = doc1.getElementsByTagName("cellXfs");
for (int i = 0; i < nListCellXfs.getLength(); i++) {
final Node siNode = nListCellXfs.item(i);
NodeList list = siNode.getChildNodes();
for (int j = 0; j < list.getLength(); j++) {
// xf
Node n = list.item(j);
NamedNodeMap m = n.getAttributes();
int id = Integer.parseInt(m.getNamedItem("numFmtId").getNodeValue());
this.styles.add(new XLSXStyle(id));
}
 
}
 
}
 
private String getContent(ZipFile zipFile, String string) throws IOException {
final ZipEntry entry = zipFile.getEntry(string);
if (entry == null) {
throw new IOException("no entry : " + string);
}
final InputStream in = zipFile.getInputStream(entry);
final ByteArrayOutputStream b = new ByteArrayOutputStream();
final byte[] bytes = new byte[8192];
while (in.available() > 0) {
final int length = in.read(bytes);
b.write(bytes, 0, length);
}
return b.toString(StandardCharsets.UTF_8.name());
}
 
public XLSXSheet getSheet(int sheetNumber) {
return this.sheets.get(sheetNumber);
}
 
public int getSheetCount() {
return this.sheets.size();
}
 
public String getSharedString(int index) {
return this.sharedString.get(index);
}
 
public XLSXFormat getFormatFromStyle(int styleIndex) {
final XLSXStyle style = this.styles.get(styleIndex);
if (style == null) {
return null;
}
return this.mapFormats.get(style.getFormatId());
}
 
public DocumentBuilderFactory getDbFactory() {
return this.dbFactory;
}
}
/trunk/OpenConcerto/src/org/openconcerto/utils/ooxml/XLSXStyle.java
New file
0,0 → 1,26
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.utils.ooxml;
 
public class XLSXStyle {
private final int formatId;
 
public XLSXStyle(int formatId) {
this.formatId = formatId;
}
 
public int getFormatId() {
return this.formatId;
}
}
/trunk/OpenConcerto/src/org/openconcerto/utils/StringUtils.java
28,6 → 28,7
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
/**
820,4 → 821,13
}
return b.toString();
}
 
public static final Matcher findFirstContaining(final String s, final Pattern... patterns) {
for (final Pattern p : patterns) {
final Matcher matcher = p.matcher(s);
if (matcher.find())
return matcher;
}
return null;
}
}
/trunk/OpenConcerto/src/org/openconcerto/utils/sync/SimpleSyncClient.java
New file
0,0 → 1,413
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.utils.sync;
 
import org.openconcerto.utils.CollectionUtils;
import org.openconcerto.utils.MessageDigestUtils;
import org.openconcerto.utils.StreamUtils;
 
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.nio.file.attribute.FileTime;
import java.security.DigestOutputStream;
import java.security.MessageDigest;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.BiFunction;
import java.util.function.Predicate;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
 
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSocketFactory;
 
import net.minidev.json.JSONArray;
import net.minidev.json.JSONObject;
import net.minidev.json.parser.JSONParser;
 
public final class SimpleSyncClient {
 
private static final int MIN_GZIP_SIZE = 64;
 
static protected final long getLong(final Object o) {
return ((Number) o).longValue();
}
 
static protected final Instant getInstant(final Object o) {
return Instant.ofEpochMilli(getLong(o));
}
 
static public class ServerException extends RuntimeException {
private final int responseCode;
private final boolean authenticateError;
 
protected ServerException(int responseCode, boolean authenticateError) {
super("Response code was " + responseCode);
this.responseCode = responseCode;
this.authenticateError = authenticateError;
}
 
public final int getResponseCode() {
return this.responseCode;
}
 
public final boolean isAuthenticateError() {
return this.authenticateError;
}
}
 
static public final class Response {
 
protected final static Response create(HttpsURLConnection con, final Set<Integer> okCodes) throws IOException {
final boolean success = okCodes == null ? con.getResponseCode() == 200 : okCodes.contains(con.getResponseCode());
return new Response(success, con.getResponseCode(), con.getResponseMessage(), con.getContentEncoding(), con.getContentType());
}
 
private final boolean success;
private final int code;
private final String message;
private final String contentEncoding, contentType;
 
protected Response(boolean success, int code, String message, String contentEncoding, String contentType) {
super();
this.success = success;
this.code = code;
this.message = message;
this.contentEncoding = contentEncoding;
this.contentType = contentType;
}
 
public final int getCode() {
return this.code;
}
 
public final boolean isSuccess() {
return this.success;
}
 
public final String getMessage() {
return this.message;
}
 
public final String getContentEncoding() {
return this.contentEncoding;
}
 
public final String getContentType() {
return this.contentType;
}
}
 
static protected abstract class BaseAttrs {
private final String path;
private final String name;
private final Instant lastModified;
 
protected BaseAttrs(final String path, final String name, final Instant lastModified) {
super();
this.path = path;
this.name = name;
this.lastModified = lastModified;
}
 
public final String getPath() {
return this.path;
}
 
public final String getName() {
return this.name;
}
 
public final Instant getLastModified() {
return this.lastModified;
}
 
@Override
public String toString() {
return this.getClass().getSimpleName() + " '" + this.getName() + "'";
}
}
 
static public final class DirAttrs extends BaseAttrs {
static protected DirAttrs fromJSON(final String path, final JSONArray array) {
return new DirAttrs(path, (String) array.get(0), getInstant(array.get(1)));
}
 
protected DirAttrs(final String path, String name, Instant lastModified) {
super(path, name, lastModified);
}
}
 
static public final class FileAttrs extends BaseAttrs {
 
static protected FileAttrs fromJSON(final String path, final JSONArray array) {
return new FileAttrs(path, (String) array.get(0), getInstant(array.get(2)), getLong(array.get(1)), (String) array.get(3));
}
 
private final long size;
private final String sha256;
 
protected FileAttrs(final String path, String name, Instant lastModified, long size, String sha256) {
super(path, name, lastModified);
this.size = size;
this.sha256 = sha256;
}
 
public final long getSize() {
return this.size;
}
 
public final String getSHA256() {
return this.sha256;
}
 
public final void saveFile(final InputStream in, final Path localFile) throws IOException {
// Save to temporary file to avoid overwriting old file with a new invalid one. In
// same folder for the move.
final Path tmpFile = Files.createTempFile(localFile.getParent(), "partial", null);
try {
final MessageDigest md = this.getSHA256() == null ? null : MessageDigestUtils.getSHA256();
try (final BufferedOutputStream fileStream = new BufferedOutputStream(Files.newOutputStream(tmpFile));
//
final OutputStream out = md == null ? fileStream : new DigestOutputStream(fileStream, md)) {
StreamUtils.copy(in, out);
}
if (this.getSize() >= 0) {
final long savedSize = Files.size(tmpFile);
if (savedSize != this.getSize())
throw new IOException("Expected " + this.getSize() + " bytes but saved " + savedSize);
}
if (md != null) {
final String savedHash = MessageDigestUtils.getHashString(md);
if (!savedHash.equalsIgnoreCase(this.getSHA256()))
throw new IOException("Expected hash was " + this.getSHA256() + " but saved " + savedHash);
}
Files.move(tmpFile, localFile, StandardCopyOption.REPLACE_EXISTING);
} finally {
Files.deleteIfExists(tmpFile);
}
if (this.getLastModified().compareTo(Instant.EPOCH) > 0)
Files.setLastModifiedTime(localFile, FileTime.from(this.getLastModified()));
}
 
@Override
public String toString() {
return super.toString() + " of size " + getSize();
}
}
 
static public final class DirContent {
private final String path;
private final JSONObject json;
 
protected DirContent(final String path, JSONObject json) {
super();
this.path = path;
this.json = json;
}
 
public final List<FileAttrs> getFiles() {
return this.getFiles(null);
}
 
public final List<FileAttrs> getFiles(final Predicate<String> namePredicate) {
return this.getContent("files", namePredicate, FileAttrs::fromJSON);
}
 
public final List<DirAttrs> getDirs() {
return this.getDirs(null);
}
 
public final List<DirAttrs> getDirs(final Predicate<String> namePredicate) {
return this.getContent("dirs", namePredicate, DirAttrs::fromJSON);
}
 
protected final <T extends BaseAttrs> List<T> getContent(final String key, final Predicate<String> namePredicate, final BiFunction<String, JSONArray, T> create) {
final JSONArray files = (JSONArray) this.json.get(key);
if (files == null)
return Collections.emptyList();
final List<T> res = new ArrayList<>();
for (final Object f : files) {
final JSONArray array = (JSONArray) f;
if (namePredicate == null || namePredicate.test((String) array.get(0))) {
res.add(create.apply(this.path, array));
}
}
return res;
}
}
 
private final String url;
private SSLSocketFactory socketFactory;
private String token;
private boolean throwException = true;
 
public SimpleSyncClient(final String url) {
this.url = url;
}
 
public final SSLSocketFactory getSocketFactory() {
return this.socketFactory;
}
 
public final void setSocketFactory(SSLSocketFactory socketFactory) {
this.socketFactory = socketFactory;
}
 
public final void setToken(String token) {
this.token = token;
}
 
public final boolean hasToken() {
return this.getToken() != null;
}
 
protected final String getToken() {
return this.token;
}
 
public final void setThrowException(boolean throwException) {
this.throwException = throwException;
}
 
public final boolean throwsException() {
return this.throwException;
}
 
protected Response checkResponseCode(final HttpsURLConnection con) throws IOException {
return checkResponseCode(con, null);
}
 
protected Response checkResponseCode(final HttpsURLConnection con, final Set<Integer> okCodes) throws IOException {
final Response res = Response.create(con, okCodes);
if (this.throwsException() && !res.isSuccess())
throw new ServerException(res.getCode(), con.getHeaderField("WWW-Authenticate") != null);
return res;
}
 
private final HttpsURLConnection openConnection(final String path) throws IOException {
final HttpsURLConnection con = (HttpsURLConnection) new URL(this.url + path).openConnection();
con.setRequestProperty("Accept-Encoding", "gzip");
if (this.getSocketFactory() != null)
con.setSSLSocketFactory(this.getSocketFactory());
if (getToken() != null)
con.setRequestProperty("Authorization", "Bearer " + Base64.getEncoder().encodeToString(getToken().getBytes(StandardCharsets.UTF_8)));
return con;
}
 
private final InputStream getInputStream(final HttpsURLConnection con) throws IOException {
return "gzip".equals(con.getContentEncoding()) ? new GZIPInputStream(con.getInputStream()) : con.getInputStream();
}
 
private final HttpsURLConnection send(final HttpsURLConnection con, final String params) throws IOException {
return this.send(con, params.getBytes(StandardCharsets.UTF_8), false);
}
 
private final HttpsURLConnection send(final HttpsURLConnection con, final byte[] toSend, final boolean allowGzip) throws IOException {
final boolean useGzip = allowGzip && toSend.length >= MIN_GZIP_SIZE;
if (useGzip)
con.setRequestProperty("Content-Encoding", "gzip");
con.setRequestMethod("POST");
con.setDoOutput(true);
try (final OutputStream o = useGzip ? new GZIPOutputStream(con.getOutputStream()) : con.getOutputStream()) {
o.write(toSend);
}
return con;
}
 
public DirContent getDir(final String path) throws Exception {
final HttpsURLConnection con = openConnection("/getDir");
final Response res = checkResponseCode(send(con, "rp=" + path + "&type=json"));
if (!res.isSuccess())
return null;
final JSONParser p = new JSONParser(JSONParser.MODE_STRICTEST);
try (final InputStream in = getInputStream(con)) {
return new DirContent(path, (JSONObject) p.parse(in));
}
}
 
@FunctionalInterface
static public interface FileConsumer {
public void accept(FileAttrs attrs, InputStream fileStream) throws IOException;
}
 
static private final Set<Integer> GETFILE_OK_CODES = CollectionUtils.createSet(200, 404);
 
public Response getFile(final String path, final String fileName, final FileConsumer fileConsumer) throws IOException {
final HttpsURLConnection con = openConnection("/get");
send(con, "rn=" + fileName + "&rp=" + path);
final Response res = checkResponseCode(con, GETFILE_OK_CODES);
if (res.getCode() == 404) {
fileConsumer.accept(null, null);
} else if (res.getCode() == 200) {
final FileAttrs fileAttrs = new FileAttrs(path, fileName, Instant.ofEpochMilli(con.getLastModified()), -1, con.getHeaderField("X-SHA256"));
try (final InputStream in = getInputStream(con)) {
fileConsumer.accept(fileAttrs, in);
}
}
return res;
}
 
// ATTN contrary to other methods, the result isn't if the request was OK : it ignores
// throwsException() and always throws. The return value is true if the file existed and was
// saved.
public boolean saveFile(final String path, final String fileName, final Path localFile) throws IOException {
final AtomicBoolean missing = new AtomicBoolean(true);
final Response res = this.getFile(path, fileName, (fileAttrs, in) -> {
missing.set(fileAttrs == null);
if (!missing.get()) {
fileAttrs.saveFile(in, localFile);
}
});
if (!res.isSuccess())
throw new IOException("Couldn't retrieve file " + fileName);
return !missing.get();
}
 
public Response deleteFile(final String path, final String fileName) throws MalformedURLException, IOException, ProtocolException, UnsupportedEncodingException {
final HttpsURLConnection con = openConnection("/delete");
return checkResponseCode(send(con, "rn=" + fileName + "&rp=" + path));
}
 
public Response sendFile(String path, File localFile) throws Exception, MalformedURLException, IOException, ProtocolException {
byte[] newsha256 = HashWriter.getHash(localFile);
long size = localFile.length();
 
final HttpsURLConnection con = openConnection("/put");
// We use Base64 because headers are not supporting UTF8
con.setRequestProperty("X_FILENAME_B64", Base64.getEncoder().encodeToString(localFile.getName().getBytes(StandardCharsets.UTF_8)));
con.setRequestProperty("X_PATH_B64", Base64.getEncoder().encodeToString(path.getBytes(StandardCharsets.UTF_8)));
con.setRequestProperty("X_FILESIZE", String.valueOf(size));
con.setRequestProperty("X_SHA256", HashWriter.bytesToHex(newsha256));
con.setRequestProperty("X-Last-Modified-ms", String.valueOf(localFile.lastModified()));
 
return checkResponseCode(send(con, Files.readAllBytes(localFile.toPath()), true));
}
}
/trunk/OpenConcerto/src/org/openconcerto/utils/sync/HashWriter.java
13,6 → 13,8
package org.openconcerto.utils.sync;
 
import org.openconcerto.utils.MessageDigestUtils;
 
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
38,8 → 40,8
}
final DataOutputStream bOut = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(outputFile)));
bOut.writeInt((int) this.in.length());
final MessageDigest hashSum = MessageDigest.getInstance("SHA-256");
final MessageDigest md5 = MessageDigest.getInstance("MD5");
final MessageDigest hashSum = MessageDigestUtils.getSHA256();
final MessageDigest md5 = MessageDigestUtils.getMD5();
fb = new BufferedInputStream(new FileInputStream(in));
final RollingChecksum32 r32 = new RollingChecksum32();
final byte[] buffer = new byte[BLOCK_SIZE];
74,8 → 76,8
}
}
 
public static byte[] getHash(File f) throws Exception {
final MessageDigest hashSum = MessageDigest.getInstance("SHA-256");
public static byte[] getHash(File f) throws IOException {
final MessageDigest hashSum = MessageDigestUtils.getSHA256();
FileInputStream fIn = null;
try {
fIn = new FileInputStream(f);
123,4 → 125,15
return true;
}
 
private static final char[] hexArray = "0123456789ABCDEF".toCharArray();
 
public static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for (int j = 0; j < bytes.length; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
}
/trunk/OpenConcerto/src/org/openconcerto/utils/i18n/TranslationManager.java
25,16 → 25,17
import java.util.Map;
import java.util.ResourceBundle.Control;
 
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
 
import net.jcip.annotations.GuardedBy;
import net.jcip.annotations.ThreadSafe;
 
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
 
import net.jcip.annotations.GuardedBy;
import net.jcip.annotations.ThreadSafe;
 
@ThreadSafe
public class TranslationManager {
private static final Locale FALLBACK_LOCALE = Locale.ENGLISH;
64,7 → 65,7
@GuardedBy("classes")
private Locale locale;
 
private final Object trMutex = new String("translations mutex");
private final Object trMutex = new Object();
@GuardedBy("trMutex")
private Map<String, String> menuTranslation;
@GuardedBy("trMutex")
73,7 → 74,7
private Map<String, String> actionTranslation;
 
private TranslationManager() {
this.classes = new ArrayList<Class<?>>();
this.classes = new ArrayList<>();
}
 
public void addTranslationStreamFromClass(Class<?> c) {
164,10 → 165,10
 
private void loadAllTranslation() {
synchronized (this.trMutex) {
this.menuTranslation = new HashMap<String, String>();
this.itemTranslation = new HashMap<String, String>();
this.actionTranslation = new HashMap<String, String>();
if (this.classes.size() == 0) {
this.menuTranslation = new HashMap<>();
this.itemTranslation = new HashMap<>();
this.actionTranslation = new HashMap<>();
if (this.classes.isEmpty()) {
Log.get().warning("TranslationManager has no resources to load (" + this.getLocale() + ")");
}
for (Class<?> c : this.classes) {
182,7 → 183,7
// return all existing (e.g fr_CA only specify differences with fr)
private List<InputStream> findStream(final Locale locale, final Class<?> c, final boolean rootLast) {
final Control cntrl = CONTROL;
final List<InputStream> res = new ArrayList<InputStream>();
final List<InputStream> res = new ArrayList<>();
final String baseName = c.getPackage().getName() + "." + BASENAME;
 
// test emptiness to not mix languages
203,7 → 204,7
// we want more specific translations to replace general ones, i.e. root Locale first
for (final InputStream input : findStream(l, c, false)) {
// create new instances to check if there's no duplicates in each resource
final Map<String, String> menuTranslation = new HashMap<String, String>(), itemTranslation = new HashMap<String, String>(), actionTranslation = new HashMap<String, String>();
final Map<String, String> menuTranslation = new HashMap<>(), itemTranslation = new HashMap<>(), actionTranslation = new HashMap<>();
loadTranslation(input, menuTranslation, itemTranslation, actionTranslation);
// on the other hand, it's OK for one resource to override another
this.menuTranslation.putAll(menuTranslation);
214,10 → 215,14
return translationLoaded;
}
 
static private void loadTranslation(final InputStream input, final Map<String, String> menuTranslation, final Map<String, String> itemTranslation, final Map<String, String> actionTranslation) {
private static void loadTranslation(final InputStream input, final Map<String, String> menuTranslation, final Map<String, String> itemTranslation, final Map<String, String> actionTranslation) {
// FIXME : l'implementation de Java est lente
// com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl : 60 ms!
// On pourrait passer à 1ms avec Piccolo...
final DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
 
try {
dbFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
dbFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
final DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
final Document doc = dBuilder.parse(input);
// Menus
239,7 → 244,7
}
}
 
static private void loadTranslation(final Document doc, final String tagName, final Map<String, String> m) {
private static void loadTranslation(final Document doc, final String tagName, final Map<String, String> m) {
final NodeList menuChildren = doc.getElementsByTagName(tagName);
final int size = menuChildren.getLength();
for (int i = 0; i < size; i++) {
/trunk/OpenConcerto/src/org/openconcerto/utils/cc/IFactory.java
13,8 → 13,9
package org.openconcerto.utils.cc;
 
public interface IFactory<E> {
public interface IFactory<E> extends IExnFactory<E, RuntimeException> {
 
@Override
public abstract E createChecked();
 
}
/trunk/OpenConcerto/src/org/openconcerto/utils/cc/CustomEquals.java
19,7 → 19,10
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.ListIterator;
import java.util.RandomAccess;
import java.util.Set;
import java.util.function.BiPredicate;
 
/**
* Allow to create a proxy object which uses a {@link HashingStrategy}.
103,6 → 106,28
return CompareUtils.equals(sA, sB);
}
 
static public final <S, T1 extends S> int indexOf(final List<T1> s1, final S o, final HashingStrategy<S> s) {
return indexOf(s1, o, s::equals);
}
 
static public final <S, T1 extends S> int indexOf(final List<T1> s1, final S o, final BiPredicate<S, S> s) {
if (s1 instanceof RandomAccess) {
final int stop = s1.size();
for (int i = 0; i < stop; i++) {
if (s.test(s1.get(i), o))
return i;
}
} else {
final ListIterator<T1> listIter = s1.listIterator();
while (listIter.hasNext()) {
final T1 item = listIter.next();
if (s.test(item, o))
return listIter.previousIndex();
}
}
return -1;
}
 
static public class ProxyFull<S, E extends S> implements ProxyItf<E> {
 
static public final <S, E extends S> Set<ProxyFull<S, E>> createSet(final HashingStrategy<S> strategy, final Collection<E> coll) {
192,6 → 217,11
else
return this.strategy.equals(this.getDelegate(), delegate2);
}
 
@Override
public String toString() {
return this.getClass().getSimpleName() + " using strategy " + this.getStrategy() + " for " + this.getDelegate();
}
}
 
/**
/trunk/OpenConcerto/src/org/openconcerto/utils/cc/IExnFactory.java
New file
0,0 → 1,20
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.utils.cc;
 
public interface IExnFactory<E, X extends Exception> {
 
public abstract E createChecked() throws X;
 
}
/trunk/OpenConcerto/src/org/openconcerto/utils/cc/Cookies.java
New file
0,0 → 1,216
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.utils.cc;
 
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
 
import com.google.gson.reflect.TypeToken;
 
import net.jcip.annotations.GuardedBy;
import net.jcip.annotations.ThreadSafe;
 
/**
* Type-safer map (e.g. can store multiple types and collections).
*
* @author Sylvain
*/
@ThreadSafe
public class Cookies {
 
@GuardedBy("this")
private final Map<Object, Object> map;
@GuardedBy("this")
private Map<Object, Object> collectionTypes;
 
public Cookies() {
this(8);
}
 
public Cookies(final int initialCapacity) {
this.map = new HashMap<>(initialCapacity);
this.collectionTypes = null;
}
 
public Cookies(final Cookies source) {
synchronized (source) {
this.map = new HashMap<>(source.map);
this.collectionTypes = source.collectionTypes == null ? null : new HashMap<>(source.collectionTypes);
}
}
 
public final void putAll(final Cookies other) {
if (this == other)
return;
final Map<Object, Object> map;
final Map<Object, Object> collectionTypes;
synchronized (other) {
map = new HashMap<>(other.map);
collectionTypes = other.collectionTypes == null ? null : new HashMap<>(other.collectionTypes);
}
synchronized (this) {
// don't just use putAll() since it won't remove entries from collectionTypes for
// replaced items
for (final Entry<Object, Object> e : map.entrySet()) {
this.put(e.getKey(), e.getValue(), collectionTypes == null ? null : collectionTypes.get(e.getKey()));
}
}
}
 
public final Object put(Object k, Object v) {
return this.put(k, v, null);
}
 
private final Object putCollectionType(Object k, Object v, Object type) {
if (type == null)
throw new IllegalArgumentException("Null type");
return this.put(k, v, type);
}
 
private final synchronized Object put(Object k, Object v, Object type) {
if (type != null) {
if (this.collectionTypes == null)
this.collectionTypes = new HashMap<>(4);
this.collectionTypes.put(k, type);
} else if (this.collectionTypes != null) {
this.collectionTypes.remove(k);
}
return this.map.put(k, v);
}
 
public final <T> Object putCollection(Object k, Collection<T> v, Class<T> clazz) {
return this.putCollectionType(k, v, clazz);
}
 
public final <K, V> Object putMap(Object k, Map<K, V> v, Class<K> keyClass, Class<V> valueClass) {
Objects.requireNonNull(keyClass, "Key class");
Objects.requireNonNull(valueClass, "value class");
return this.putCollectionType(k, v, Arrays.asList(keyClass, valueClass));
}
 
public final <T> Object putGeneric(Object k, T v, TypeToken<T> clazz) {
return this.putCollectionType(k, v, clazz);
}
 
public final synchronized boolean containsKey(Object k) {
return this.map.containsKey(k);
}
 
public final synchronized Object getObject(Object k) {
return this.map.get(k);
}
 
public final int getInt(Object k) {
return getObjectAs(k, Number.class).intValue();
}
 
public final long getLong(Object k) {
return getObjectAs(k, Number.class).longValue();
}
 
public final Boolean getBoolean(Object k) {
return getObjectAs(k, Boolean.class);
}
 
public final boolean getBoolean(Object k, final boolean def) {
final Boolean res = getBoolean(k);
return res == null ? def : res.booleanValue();
}
 
public final String getString(Object k) {
return getObjectAs(k, String.class);
}
 
public synchronized final <T> T getContainedObjectAs(Object key, Class<T> clazz) {
if (!this.containsKey(key))
throw new IllegalArgumentException(key + " not present in this : " + this.map.keySet());
return this.getObjectAs(key, clazz);
}
 
public final <T> T getObjectAs(Object k, Class<T> clazz) {
return this.getObjectAs(k, clazz, null);
}
 
public final <T> T getObjectAs(Object k, Class<T> clazz, final T defaultVal) {
return this.getObjectAs(k, clazz, defaultVal, true);
}
 
public synchronized final <T> T getObjectAs(Object k, Class<T> clazz, final T defaultVal, final boolean useDefaultIfNullValue) {
final Object res = this.getObject(k);
if (res == null && (useDefaultIfNullValue || !this.containsKey(k)))
return defaultVal;
try {
return clazz.cast(res);
} catch (ClassCastException e) {
throw new IllegalArgumentException("Couldn't access " + k + " in " + this + " as " + clazz.getSimpleName(), e);
}
}
 
public final <T> Object checkType(Object k, Object wantedType, final String needMethodName) {
final Object object;
final Object type;
synchronized (this) {
object = this.getObject(k);
type = this.collectionTypes == null ? null : this.collectionTypes.get(k);
}
// as getObject() : don't fail on null
if (object == null)
return null;
if (type == null)
throw new IllegalStateException("Wasn't stored with " + needMethodName + " : " + k);
if (!type.equals(wantedType))
throw new IllegalArgumentException("Wasn't stored with the passed type : " + wantedType + " != " + type);
return object;
}
 
public final <T> Collection<T> getCollection(Object k, Class<T> clazz) {
final Object object = checkType(k, clazz, "putCollection()");
@SuppressWarnings("unchecked")
final Collection<T> res = (Collection<T>) object;
return res;
}
 
public final <T> List<T> getList(Object k, Class<T> clazz) {
return (List<T>) this.getCollection(k, clazz);
}
 
public final <T> Set<T> getSet(Object k, Class<T> clazz) {
return (Set<T>) this.getCollection(k, clazz);
}
 
public final <K, V> Map<K, V> getMap(Object k, Class<K> keyClass, Class<V> valueClass) {
final Object object = checkType(k, Arrays.asList(keyClass, valueClass), "putMap()");
@SuppressWarnings("unchecked")
final Map<K, V> res = (Map<K, V>) object;
return res;
}
 
public final <T> T getGeneric(Object k, TypeToken<T> clazz) {
final Object object = checkType(k, clazz, "putGeneric()");
@SuppressWarnings("unchecked")
final T res = (T) object;
return res;
}
 
@Override
public synchronized String toString() {
return this.getClass().getSimpleName() + " of " + this.map.keySet();
}
}
/trunk/OpenConcerto/src/org/openconcerto/utils/NetUtils.java
22,11 → 22,17
import java.net.ServerSocket;
import java.net.SocketException;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.Enumeration;
 
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
 
public class NetUtils {
 
125,6 → 131,10
}
};
 
public static final String getHTTPContent(String address) {
return getHTTPContent(address, false);
}
 
public static final String getHTTPContent(String address, final boolean dontVerify) {
String content = "";
OutputStream out = null;
167,4 → 177,23
 
return content;
}
 
// Create a trust manager that does not validate certificate chains
static private final TrustManager[] TRUSTALL_MANAGERS = new TrustManager[] { new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
 
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
 
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
} };
 
static public final SSLContext createTrustAllContext() throws KeyManagementException, NoSuchAlgorithmException {
final SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, TRUSTALL_MANAGERS, new java.security.SecureRandom());
return sc;
}
}
/trunk/OpenConcerto/src/org/openconcerto/utils/TableSorter.java
348,7 → 348,11
* @return the corresponding index in the model.
*/
public int modelIndex(int viewIndex) {
return getViewToModel()[viewIndex].modelIndex;
try {
return getViewToModel()[viewIndex].modelIndex;
} catch (Exception e) {
throw new IllegalStateException(this + " couldn't get model index for view index " + viewIndex + " with " + this.getTableModel().getRowCount() + " row(s) in our model", e);
}
}
 
private int[] getModelToView() {
430,6 → 434,11
this.supp.removePropertyChangeListener(l);
}
 
@Override
public String toString() {
return this.getClass().getSimpleName() + " on " + this.getTableModel();
}
 
// Helper classes
 
private class Row implements Comparable<Row> {
/trunk/OpenConcerto/src/org/openconcerto/utils/text/CSVReader.java
29,7 → 29,6
 
import java.io.BufferedReader;
import java.io.Closeable;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
248,11 → 247,4
br.close();
}
 
public static void main(String[] args) throws IOException {
CSVReader reader = new CSVReader(new FileReader("n:\\Sans nom 1.csv"));
String[] s = reader.readNext();
for (int i = 0; i < s.length; i++) {
System.err.println("CSVReader.main() :" + i + " : " + s[i]);
}
}
}
/trunk/OpenConcerto/src/org/openconcerto/utils/ProductInfo.java
14,6 → 14,9
package org.openconcerto.utils;
 
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Map;
import java.util.Properties;
 
157,6 → 160,12
return this.getProperty(VERSION);
}
 
public final void store(final Path p) throws IOException {
try (final OutputStream out = Files.newOutputStream(p)) {
this.getProps().store(out, this.getClass().getName());
}
}
 
@Override
public String toString() {
return this.getClass().getSimpleName() + " for " + getName() + " " + getVersion();
/trunk/OpenConcerto/src/org/openconcerto/utils/CollectionUtils.java
18,6 → 18,7
import org.openconcerto.utils.cc.ITransformer;
import org.openconcerto.utils.cc.IdentityHashSet;
import org.openconcerto.utils.cc.IdentitySet;
import org.openconcerto.utils.cc.LinkedIdentitySet;
import org.openconcerto.utils.cc.Transformer;
 
import java.io.Serializable;
643,14 → 644,16
return collector;
}
 
@SuppressWarnings("unchecked")
public static <T> Collection<T> subtract(final Collection<T> a, final Collection<? extends T> b) {
return org.apache.commons.collections.CollectionUtils.subtract(a, b);
final Collection<T> res = a instanceof IdentitySet ? new LinkedIdentitySet<>(a) : new ArrayList<>(a);
for (Iterator<? extends T> it = b.iterator(); it.hasNext();) {
res.remove(it.next());
}
return res;
}
 
@SuppressWarnings("unchecked")
public static <T> Collection<T> substract(final Collection<T> a, final Collection<? extends T> b) {
return org.apache.commons.collections.CollectionUtils.subtract(a, b);
return subtract(a, b);
}
 
public static final <T> T coalesce(T o1, T o2) {
935,10 → 938,11
* @param <K> type of key.
* @param <V> type of value.
* @param keys the keys of the map.
* @return a new map, if <code>keys</code> is a {@link List} it will be ordered.
* @return a new ordered map.
*/
public static <K, V> Map<K, V> createMap(Collection<? extends K> keys) {
return fillMap(keys instanceof List ? new LinkedHashMap<K, V>(keys.size()) : new HashMap<K, V>(keys.size()), keys);
// there's no way to tell if a Collection is ordered, so always use ordered map.
return fillMap(new LinkedHashMap<K, V>(keys.size()), keys);
}
 
/**
/trunk/OpenConcerto/src/org/openconcerto/xml/AbstractXMLDecoder.java
New file
0,0 → 1,381
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.xml;
 
import org.openconcerto.utils.StringUtils;
import org.openconcerto.utils.cache.CacheResult;
import org.openconcerto.utils.cache.ICache;
import org.openconcerto.utils.cc.ExnTransformer;
 
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Stack;
 
/**
* To decode XML in {@link XMLEncoder} format.
*
* @author Sylvain CUAZ
* @param <S> type of source
* @param <E> type of exception
*/
public abstract class AbstractXMLDecoder<S, E extends Exception> {
 
protected static interface Children<C> {
C getNextChild();
}
 
private static final ICache<Object, Method, Object> cache = new ICache<Object, Method, Object>(60, -1, "methods for " + XMLCodecUtils.class);
private static final ICache<Object, Constructor<?>, Object> cacheCtor = new ICache<Object, Constructor<?>, Object>(60, -1, "constructors for " + XMLCodecUtils.class);
 
protected abstract String getLocalName(S elem);
 
protected abstract String getAttributeValue(S elem, final String attrName);
 
protected abstract String getElementText(S elem) throws E;
 
protected abstract S getFirstChild(S elem);
 
protected abstract String toString(S elem);
 
protected abstract Children<S> createChildren(S elem) throws E;
 
public final <K, V> Map<K, V> decodeFromArray(final S elem, final Class<K> keyClass, final Class<V> valueClass) {
return XMLCodecUtils.decodeFromArray((Object[]) this.decode1(elem), keyClass, valueClass);
}
 
/**
* Tries to decode an xml element parsed from a string obtained from XMLEncoder. This doesn't
* use {@link XMLDecoder} as it requires outputting it first to string which is inefficient.
* NOTE: this decoder supports only a subset of XMLDecoder.
*
* @param javaElem a "java" element.
* @return the decoded object.
*/
public final Object decode1(S javaElem) {
final S elem = getFirstChild(javaElem);
try {
return eval(elem, new Stack<Object>(), new HashMap<String, Object>());
} catch (Exception e) {
throw new IllegalStateException("error decoding " + toString(javaElem), e);
}
}
 
private final Object eval(S elem, Stack<Object> context, final Map<String, Object> ids)
throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, E {
preEval(elem);
final Object res = this._eval(elem, context, ids);
postEval(elem, res);
return res;
}
 
protected void preEval(S elem) throws E {
}
 
protected void nullDecoded(S elem) throws E {
}
 
protected void idRefDecoded(S elem) throws E {
}
 
protected void postEval(S elem, final Object res) throws E {
}
 
private final Object _eval(S elem, Stack<Object> context, final Map<String, Object> ids)
throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, E {
final String n = getLocalName(elem);
// Ordered from real world scenario
// string : 80k
// void : 53k
// int : 18k
// object : 9k
// null : 6k
switch (n) {
case "string":
return getElementText(elem);
case "void":
case "object":
final String idref = getAttributeValue(elem, "idref");
if (idref != null) {
if (!ids.containsKey(idref))
throw new IllegalStateException("id '" + idref + "' wasn't defined");
idRefDecoded(elem);
return ids.get(idref);
}
final String id = getAttributeValue(elem, "id");
final String targetClass = getAttributeValue(elem, "class");
final Object target = targetClass == null ? context.peek() : Class.forName(targetClass);
final String propAttr = getAttributeValue(elem, "property");
final String indexAttr = getAttributeValue(elem, "index");
final String methodAttr = getAttributeValue(elem, "method");
 
// statement or expression
final Object res = evalContainer(elem, context, ids, new ExnTransformer<List<Object>, Object, Exception>() {
@Override
public Object transformChecked(List<Object> args) throws Exception {
// call the statement
final Object res;
 
if (propAttr != null) {
final String methodName = (args.size() == 0 ? "get" : "set") + StringUtils.firstUp(propAttr);
res = invoke(target, methodName, args);
} else if (indexAttr != null) {
final String methodName;
if (target instanceof List) {
methodName = args.size() == 0 ? "get" : "set";
// get(index) or set(index, value)
args.add(0, Integer.valueOf(indexAttr));
res = invoke(target, methodName, args);
} else if (target.getClass().isArray()) {
final Class<?> componentType = target.getClass().getComponentType();
// in Array there's set(array, int index, Object value) or
// setPrimitive(array, int index, primitive value)
methodName = (args.size() == 0 ? "get" : "set") + (componentType.isPrimitive() ? StringUtils.firstUp(componentType.getSimpleName()) : "");
args.add(0, target);
args.add(1, Integer.valueOf(indexAttr));
res = invoke(Array.class, methodName, args);
} else
throw new IllegalStateException("use index with neither List nor array: " + target);
} else if (methodAttr != null) {
res = invoke(target, methodAttr, args);
} else
res = getCtor((Class<?>) target, args).newInstance(args.toArray());
return res;
}
});
// not very functional but it works
if (id != null)
ids.put(id, res);
return res;
case "int":
return Integer.valueOf(getElementText(elem));
case "null":
nullDecoded(elem);
return null;
case "boolean":
return Boolean.valueOf(getElementText(elem));
case "byte":
return Byte.valueOf(getElementText(elem));
case "char":
return Character.valueOf(getElementText(elem).charAt(0));
case "short":
return Short.valueOf(getElementText(elem));
case "long":
return Long.valueOf(getElementText(elem));
case "float":
return Float.valueOf(getElementText(elem));
case "double":
return Double.valueOf(getElementText(elem));
case "array":
final String classAttr = getAttributeValue(elem, "class");
final String lengthAttr = getAttributeValue(elem, "length");
 
final Class<?> componentClass = parseClassName(classAttr);
if (lengthAttr != null) {
context.push(Array.newInstance(componentClass, Integer.parseInt(lengthAttr)));
final Children<S> children = createChildren(elem);
S child;
while ((child = children.getNextChild()) != null) {
eval(child, context, ids);
}
return context.pop();
} else {
final List<Object> items = new LinkedList<>();
final Children<S> children = createChildren(elem);
S child;
while ((child = children.getNextChild()) != null) {
items.add(eval(child, context, ids));
}
final Object resArray = Array.newInstance(componentClass, items.size());
int i = 0;
for (final Object item : items)
Array.set(resArray, i++, item);
return resArray;
}
case "class":
return Class.forName(getElementText(elem));
default:
throw new UnsupportedOperationException("doesn't yet support " + n);
}
}
 
private final Object evalContainer(final S parent, Stack<Object> context, final Map<String, Object> ids, final ExnTransformer<List<Object>, Object, ? extends Exception> transf)
throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, E {
final List<Object> args = new ArrayList<Object>();
final Children<S> children = createChildren(parent);
boolean noVoid = true;
S child = null;
while (noVoid && (child = children.getNextChild()) != null) {
if (getLocalName(child).equals("void"))
noVoid = false;
else {
args.add(eval(child, context, ids));
}
}
 
// call the statement
final Object res = transf.transformCheckedWithExn(args, false, InvocationTargetException.class, InstantiationException.class, IllegalAccessException.class);
 
context.push(res);
 
// now call the voids
if (child != null) {
do {
eval(child, context, ids);
} while ((child = children.getNextChild()) != null);
}
return context.pop();
}
 
private static final Object invoke(final Object target, String methodName, final List<Object> args) throws IllegalAccessException, InvocationTargetException {
// <object class="Cell" method="createEmpty" >
// for static methods the target is already a class
final Class clazz = target instanceof Class ? (Class) target : target.getClass();
final Method m = getMethod(clazz, methodName, args);
return m.invoke(target, args.toArray());
}
 
private static final Method getMethod(Class<?> clazz, String name, List<Object> actualArgs) {
final List<Class<?>> actualClasses = objectsToClasses(actualArgs);
final List<Object> key = new ArrayList<Object>(3);
key.add(clazz);
key.add(name);
key.add(actualClasses);
 
final CacheResult<Method> cacheRes = cache.check(key);
if (cacheRes.getState() == CacheResult.State.VALID)
return cacheRes.getRes();
 
final Method res = findMethod(clazz, name, actualClasses);
if (res == null)
throw new IllegalStateException("No matching method " + name + " found in " + clazz);
cache.put(key, res);
return res;
}
 
private static final Constructor getCtor(Class<?> clazz, List<Object> actualArgs) {
final List<Class<?>> actualClasses = objectsToClasses(actualArgs);
final List<Object> key = new ArrayList<Object>(3);
key.add(clazz);
key.add(actualClasses);
 
final CacheResult<Constructor<?>> cacheRes = cacheCtor.check(key);
if (cacheRes.getState() == CacheResult.State.VALID)
return cacheRes.getRes();
 
final Constructor res = findCtor(clazz, actualClasses);
cacheCtor.put(key, res);
return res;
}
 
private static final List<Class<?>> objectsToClasses(List<Object> actualArgs) {
final List<Class<?>> actualClasses = new ArrayList<Class<?>>(actualArgs.size());
for (final Object actualArg : actualArgs)
actualClasses.add(actualArg == null ? null : actualArg.getClass());
return actualClasses;
}
 
// TODO return the most specific matching method instead of the first one
// (handle both Sub/Superclass and primitive/object type)
private static final Method findMethod(Class<?> clazz, String name, List<Class<?>> actualArgs) {
for (final Method m : clazz.getMethods()) {
if (m.getName().equals(name) && callableWith(m.getParameterTypes(), actualArgs)) {
return m;
}
}
return null;
}
 
// TODO see findMethod()
private static final Constructor findCtor(Class<?> clazz, List<Class<?>> actualArgs) {
for (final Constructor m : clazz.getConstructors()) {
if (callableWith(m.getParameterTypes(), actualArgs)) {
return m;
}
}
return null;
}
 
private static final boolean callableWith(Class<?>[] formalArgs, List<Class<?>> actualArgs) {
if (formalArgs.length != actualArgs.size())
return false;
int i = 0;
for (final Class<?> argClass : formalArgs) {
final Class<?> actualArg = actualArgs.get(i);
// null match everything
if (actualArg != null && !argClass.isAssignableFrom(actualArg) && argClass != getPrimitive(actualArg))
return false;
i++;
}
 
return true;
}
 
private static Class<?> getPrimitive(Class<?> argClass) {
if (argClass == Boolean.class)
return Boolean.TYPE;
else if (argClass == Character.class)
return Character.TYPE;
else if (argClass == Byte.class)
return Byte.TYPE;
else if (argClass == Short.class)
return Short.TYPE;
else if (argClass == Integer.class)
return Integer.TYPE;
else if (argClass == Long.class)
return Long.TYPE;
else if (argClass == Float.class)
return Float.TYPE;
else if (argClass == Double.class)
return Double.TYPE;
else
return null;
}
 
private static final Map<String, Class> primitiveNames = new HashMap<String, Class>();
 
static {
primitiveNames.put("boolean", boolean.class);
primitiveNames.put("byte", byte.class);
primitiveNames.put("char", char.class);
primitiveNames.put("short", short.class);
primitiveNames.put("int", int.class);
primitiveNames.put("long", long.class);
primitiveNames.put("float", float.class);
primitiveNames.put("double", double.class);
}
 
/**
* Parse class names (including primitive).
*
* @param className a class name, eg "java.lang.String" or "int".
* @return the matching class, eg java.lang.String.class or Integer.TYPE.
* @throws ClassNotFoundException if the passed name doesn't exist.
*/
private static Class<?> parseClassName(String className) throws ClassNotFoundException {
final Class<?> primitive = primitiveNames.get(className);
if (primitive != null)
return primitive;
else
return Class.forName(className);
}
}
/trunk/OpenConcerto/src/org/openconcerto/xml/XMLCodecUtils.java
13,11 → 13,6
package org.openconcerto.xml;
 
import org.openconcerto.utils.StringUtils;
import org.openconcerto.utils.cache.CacheResult;
import org.openconcerto.utils.cache.ICache;
import org.openconcerto.utils.cc.ExnTransformer;
 
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
35,11 → 30,8
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
47,7 → 39,6
import java.util.Map.Entry;
import java.util.RandomAccess;
import java.util.Set;
import java.util.Stack;
 
import org.jdom2.Element;
import org.jdom2.JDOMException;
62,9 → 53,6
 
private static final String END_DECL = "?>";
 
private static final ICache<Object, Method, Object> cache = new ICache<Object, Method, Object>(60, -1, "methods for " + XMLCodecUtils.class);
private static final ICache<Object, Constructor<?>, Object> cacheCtor = new ICache<Object, Constructor<?>, Object>(60, -1, "constructors for " + XMLCodecUtils.class);
 
// the same as XMLEncoder
private static final Charset CS = Charset.forName("UTF-8");
 
85,6 → 73,9
}
};
 
public static final XMLDecoderJDOM XML_DECODER_JDOM = new XMLDecoderJDOM();
public static final XMLDecoderStAX XML_DECODER_STAX = new XMLDecoderStAX();
 
/**
* Register a {@link PersistenceDelegate} for the passed class. This method tries to set
* <code>del</code> as the default for any subsequent {@link Encoder}, but with the current JRE
130,7 → 121,46
return res;
}
 
public static final String encodeAsArray(final Map<?, ?> m) {
return encodeAsArray(m, new StringBuilder(1024)).toString();
}
 
/**
* Encode a map as an array. Useful since parsing an array is faster than parsing a map.
*
* @param m the map to encode.
* @param sb where to encode.
* @return <code>sb</code>.
* @see AbstractXMLDecoder#decodeFromArray(Object, Class, Class)
*/
public static final StringBuilder encodeAsArray(final Map<?, ?> m, final StringBuilder sb) {
final Object[] array = new Object[m.size() * 2];
int i = 0;
for (final Entry<?, ?> e : m.entrySet()) {
array[i++] = e.getKey();
array[i++] = e.getValue();
}
assert i == array.length;
return encodeSimple(array, sb);
}
 
public static final <K, V> Map<K, V> decodeFromArray(final Object[] array, final Class<K> keyClass, final Class<V> valueClass) {
return decodeFromArray(array, keyClass, valueClass, null);
}
 
public static final <K, V> Map<K, V> decodeFromArray(final Object[] array, final Class<K> keyClass, final Class<V> valueClass, Map<K, V> m) {
final int l = array.length;
if (m == null)
m = new HashMap<K, V>((int) (l / 2 / 0.8f) + 1, 0.8f);
for (int i = 0; i < l; i += 2) {
final K key = keyClass.cast(array[i]);
final V value = valueClass.cast(array[i + 1]);
m.put(key, value);
}
return m;
}
 
/**
* Encodes an object using {@link XMLEncoder}, stripping the XML declaration.
*
* @param o the object to encode.
153,10 → 183,14
*/
public static final String encodeSimple(Object o) {
final StringBuilder sb = new StringBuilder(256);
return encodeSimple(o, sb).toString();
}
 
public static final StringBuilder encodeSimple(final Object o, final StringBuilder sb) {
sb.append("<java version=\"1.6.0\" class=\"java.beans.XMLDecoder\">");
encodeSimpleRec(o, sb);
sb.append("</java>");
return sb.toString();
return sb;
}
 
private static final void createElemEscaped(final String elemName, final Object o, final StringBuilder sb) {
361,287 → 395,9
* @return the decoded object.
*/
public static final Object decode1(Element javaElem) {
final Element elem = (Element) javaElem.getChildren().get(0);
try {
return eval(elem, new Stack<Object>(), new HashMap<String, Object>());
} catch (Exception e) {
throw new IllegalStateException("error decoding " + JDOM2Utils.output(javaElem), e);
}
return XML_DECODER_JDOM.decode1(javaElem);
}
 
private static final Object eval(Element elem, Stack<Object> context, final Map<String, Object> ids)
throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException {
final String n = elem.getName();
// Ordered from real world scenario
// string : 80k
// void : 53k
// int : 18k
// object : 9k
// null : 6k
if (n.equals("string")) {
return elem.getText();
} else if (n.equals("void") || n.equals("object")) {
final String idref = elem.getAttributeValue("idref");
if (idref != null) {
if (!ids.containsKey(idref))
throw new IllegalStateException("id '" + idref + "' wasn't defined");
return ids.get(idref);
}
final String id = elem.getAttributeValue("id");
final String targetClass = elem.getAttributeValue("class");
final Object target = targetClass == null ? context.peek() : Class.forName(targetClass);
final String propAttr = elem.getAttributeValue("property");
final String indexAttr = elem.getAttributeValue("index");
final String methodAttr = elem.getAttributeValue("method");
 
// statement or expression
final Object res = evalContainer(elem, context, ids, new ExnTransformer<List<Object>, Object, Exception>() {
@Override
public Object transformChecked(List<Object> args) throws Exception {
// call the statement
final Object res;
 
if (propAttr != null) {
final String methodName = (args.size() == 0 ? "get" : "set") + StringUtils.firstUp(propAttr);
res = invoke(target, methodName, args);
} else if (indexAttr != null) {
final String methodName;
if (target instanceof List) {
methodName = args.size() == 0 ? "get" : "set";
// get(index) or set(index, value)
args.add(0, Integer.valueOf(indexAttr));
res = invoke(target, methodName, args);
} else if (target.getClass().isArray()) {
final Class<?> componentType = target.getClass().getComponentType();
// in Array there's set(array, int index, Object value) or
// setPrimitive(array, int index, primitive value)
methodName = (args.size() == 0 ? "get" : "set") + (componentType.isPrimitive() ? StringUtils.firstUp(componentType.getSimpleName()) : "");
args.add(0, target);
args.add(1, Integer.valueOf(indexAttr));
res = invoke(Array.class, methodName, args);
} else
throw new IllegalStateException("use index with neither List nor array: " + target);
} else if (methodAttr != null) {
res = invoke(target, methodAttr, args);
} else
res = getCtor((Class<?>) target, args).newInstance(args.toArray());
return res;
}
});
// not very functional but it works
if (id != null)
ids.put(id, res);
return res;
} else if (n.equals("int")) {
return Integer.valueOf(elem.getText());
} else if (n.equals("null")) {
return null;
} else if (n.equals("boolean")) {
return Boolean.valueOf(elem.getText());
} else if (n.equals("byte")) {
return Byte.valueOf(elem.getText());
} else if (n.equals("char")) {
return Character.valueOf(elem.getText().charAt(0));
} else if (n.equals("short")) {
return Short.valueOf(elem.getText());
} else if (n.equals("long")) {
return Long.valueOf(elem.getText());
} else if (n.equals("float")) {
return Float.valueOf(elem.getText());
} else if (n.equals("double")) {
return Double.valueOf(elem.getText());
} else if (n.equals("array")) {
final String classAttr = elem.getAttributeValue("class");
final String lengthAttr = elem.getAttributeValue("length");
 
final Class<?> componentClass = parseClassName(classAttr);
if (lengthAttr != null) {
context.push(Array.newInstance(componentClass, Integer.parseInt(lengthAttr)));
for (final Object child : elem.getChildren()) {
eval((Element) child, context, ids);
}
return context.pop();
} else {
return evalContainer(elem, context, ids, new ExnTransformer<List<Object>, Object, RuntimeException>() {
@Override
public Object transformChecked(List<Object> args) {
final Object res = Array.newInstance(componentClass, args.size());
for (int j = 0; j < args.size(); j++) {
Array.set(res, j, args.get(j));
}
return res;
}
});
}
} else if (n.equals("class")) {
return Class.forName(elem.getText());
} else
throw new UnsupportedOperationException("doesn't yet support " + n);
}
 
private static final Object evalContainer(final Element parent, Stack<Object> context, final Map<String, Object> ids, final ExnTransformer<List<Object>, Object, ? extends Exception> transf)
throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException {
final List<Object> args = new ArrayList<Object>();
final List<?> children = parent.getChildren();
int i = 0;
boolean noVoid = true;
final int size = children.size();
while (i < size && noVoid) {
final Element child = (Element) children.get(i);
if (child.getName().equals("void"))
noVoid = false;
else {
args.add(eval(child, context, ids));
i++;
}
}
 
// call the statement
final Object res = transf.transformCheckedWithExn(args, false, InvocationTargetException.class, InstantiationException.class, IllegalAccessException.class);
 
context.push(res);
 
// now call the voids
while (i < children.size()) {
final Element child = (Element) children.get(i);
eval(child, context, ids);
i++;
}
return context.pop();
}
 
private static final Object invoke(final Object target, String methodName, final List<Object> args) throws IllegalAccessException, InvocationTargetException {
// <object class="Cell" method="createEmpty" >
// for static methods the target is already a class
final Class clazz = target instanceof Class ? (Class) target : target.getClass();
final Method m = getMethod(clazz, methodName, args);
return m.invoke(target, args.toArray());
}
 
private static final Method getMethod(Class<?> clazz, String name, List<Object> actualArgs) {
final List<Class<?>> actualClasses = objectsToClasses(actualArgs);
final List<Object> key = new ArrayList<Object>(3);
key.add(clazz);
key.add(name);
key.add(actualClasses);
 
final CacheResult<Method> cacheRes = cache.check(key);
if (cacheRes.getState() == CacheResult.State.VALID)
return cacheRes.getRes();
 
final Method res = findMethod(clazz, name, actualClasses);
cache.put(key, res);
return res;
}
 
private static final Constructor getCtor(Class<?> clazz, List<Object> actualArgs) {
final List<Class<?>> actualClasses = objectsToClasses(actualArgs);
final List<Object> key = new ArrayList<Object>(3);
key.add(clazz);
key.add(actualClasses);
 
final CacheResult<Constructor<?>> cacheRes = cacheCtor.check(key);
if (cacheRes.getState() == CacheResult.State.VALID)
return cacheRes.getRes();
 
final Constructor res = findCtor(clazz, actualClasses);
cacheCtor.put(key, res);
return res;
}
 
private static final List<Class<?>> objectsToClasses(List<Object> actualArgs) {
final List<Class<?>> actualClasses = new ArrayList<Class<?>>(actualArgs.size());
for (final Object actualArg : actualArgs)
actualClasses.add(actualArg == null ? null : actualArg.getClass());
return actualClasses;
}
 
// TODO return the most specific matching method instead of the first one
// (handle both Sub/Superclass and primitive/object type)
private static final Method findMethod(Class<?> clazz, String name, List<Class<?>> actualArgs) {
for (final Method m : clazz.getMethods()) {
if (m.getName().equals(name) && callableWith(m.getParameterTypes(), actualArgs)) {
return m;
}
}
return null;
}
 
// TODO see findMethod()
private static final Constructor findCtor(Class<?> clazz, List<Class<?>> actualArgs) {
for (final Constructor m : clazz.getConstructors()) {
if (callableWith(m.getParameterTypes(), actualArgs)) {
return m;
}
}
return null;
}
 
private static final boolean callableWith(Class<?>[] formalArgs, List<Class<?>> actualArgs) {
if (formalArgs.length != actualArgs.size())
return false;
int i = 0;
for (final Class<?> argClass : formalArgs) {
final Class<?> actualArg = actualArgs.get(i);
// null match everything
if (actualArg != null && !argClass.isAssignableFrom(actualArg) && argClass != getPrimitive(actualArg))
return false;
i++;
}
 
return true;
}
 
private static Class<?> getPrimitive(Class<?> argClass) {
if (argClass == Boolean.class)
return Boolean.TYPE;
else if (argClass == Character.class)
return Character.TYPE;
else if (argClass == Byte.class)
return Byte.TYPE;
else if (argClass == Short.class)
return Short.TYPE;
else if (argClass == Integer.class)
return Integer.TYPE;
else if (argClass == Long.class)
return Long.TYPE;
else if (argClass == Float.class)
return Float.TYPE;
else if (argClass == Double.class)
return Double.TYPE;
else
return null;
}
 
private static final Map<String, Class> primitiveNames = new HashMap<String, Class>();
 
static {
primitiveNames.put("boolean", boolean.class);
primitiveNames.put("byte", byte.class);
primitiveNames.put("char", char.class);
primitiveNames.put("short", short.class);
primitiveNames.put("int", int.class);
primitiveNames.put("long", long.class);
primitiveNames.put("float", float.class);
primitiveNames.put("double", double.class);
}
 
/**
* Parse class names (including primitive).
*
* @param className a class name, eg "java.lang.String" or "int".
* @return the matching class, eg java.lang.String.class or Integer.TYPE.
* @throws ClassNotFoundException if the passed name doesn't exist.
*/
private static Class<?> parseClassName(String className) throws ClassNotFoundException {
final Class<?> primitive = primitiveNames.get(className);
if (primitive != null)
return primitive;
else
return Class.forName(className);
}
 
private XMLCodecUtils() {
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/xml/XMLUtils.java
New file
0,0 → 1,133
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.xml;
 
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
 
public class XMLUtils {
 
public static final String escapeAttribute(final String value) {
final int len = value.length();
int idx = 0;
 
checkloop: while (idx < len) {
final char ch = value.charAt(idx);
if (ch == '<' || ch == '>' || ch == '&' || ch == '\r' || ch == '\n' || ch == '"' || ch == '\t') {
break checkloop;
}
idx++;
}
 
if (idx == len) {
return value;
}
 
final StringBuilder sb = new StringBuilder(len + 5);
sb.append(value, 0, idx);
while (idx < len) {
final char ch = value.charAt(idx++);
switch (ch) {
case '<':
sb.append("&lt;");
break;
case '>':
sb.append("&gt;");
break;
case '&':
sb.append("&amp;");
break;
case '\r':
sb.append("&#xD;");
break;
case '"':
sb.append("&quot;");
break;
case '\t':
sb.append("&#x9;");
break;
case '\n':
sb.append("&#xA;");
break;
default:
sb.append(ch);
break;
}
}
 
return sb.toString();
}
 
public static final String escapeText(final String value) {
final int right = value.length();
int idx = 0;
checkloop: while (idx < right) {
final char ch = value.charAt(idx);
if (ch == '<' || ch == '>' || ch == '&' || ch == '\r' || ch == '\n') {
break checkloop;
}
idx++;
}
 
if (idx == right) {
// no escape needed.
return value;
}
 
final StringBuilder sb = new StringBuilder();
if (idx > 0) {
sb.append(value, 0, idx);
}
 
while (idx < right) {
final char ch = value.charAt(idx++);
switch (ch) {
case '<':
sb.append("&lt;");
break;
case '>':
sb.append("&gt;");
break;
case '&':
sb.append("&amp;");
break;
case '\r':
sb.append("&#xD;");
break;
case '\n':
sb.append('\n');
break;
default:
sb.append(ch);
break;
}
}
return sb.toString();
}
 
public static final void skipToEndElement(final XMLStreamReader reader) throws XMLStreamException {
if (!reader.isStartElement())
throw new IllegalStateException("Not at a start of an element : " + reader.getEventType() + ", " + reader.getLocation());
final String name = reader.getLocalName();
int depth = 1;
while (!(depth == 0 && reader.isEndElement() && reader.getLocalName().equals(name))) {
final int eventType = reader.next();
if (eventType == XMLStreamConstants.START_ELEMENT)
depth++;
else if (eventType == XMLStreamConstants.END_ELEMENT)
depth--;
}
}
}
/trunk/OpenConcerto/src/org/openconcerto/xml/XMLDecoderStAX.java
New file
0,0 → 1,99
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.xml;
 
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
 
/**
* To decode using {@link XMLStreamReader}.
*
* @author Sylvain CUAZ
*/
public final class XMLDecoderStAX extends AbstractXMLDecoder<XMLStreamReader, XMLStreamException> {
 
@Override
protected String getAttributeValue(XMLStreamReader elem, String attrName) {
return elem.getAttributeValue(null, attrName);
}
 
@Override
protected String getLocalName(XMLStreamReader elem) {
return elem.getLocalName();
}
 
@Override
protected String getElementText(XMLStreamReader elem) throws XMLStreamException {
return elem.getElementText();
}
 
@Override
protected XMLStreamReader getFirstChild(XMLStreamReader reader) {
try {
reader.nextTag();
} catch (XMLStreamException e) {
throw new IllegalStateException("Couldn't advance to first child", e);
}
return reader;
}
 
@Override
protected void preEval(XMLStreamReader reader) throws XMLStreamException {
assert reader.isStartElement();
}
 
@Override
protected void nullDecoded(XMLStreamReader reader) throws XMLStreamException {
reader.nextTag();
}
 
@Override
protected void idRefDecoded(XMLStreamReader reader) throws XMLStreamException {
reader.nextTag();
}
 
@Override
protected void postEval(XMLStreamReader reader, final Object res) throws XMLStreamException {
assert reader.isEndElement();
reader.nextTag();
}
 
@Override
protected String toString(XMLStreamReader elem) {
return elem.getLocation().toString();
}
 
@Override
protected Children<XMLStreamReader> createChildren(final XMLStreamReader reader) throws XMLStreamException {
if (!reader.isStartElement())
throw new IllegalStateException("Not at a start of an element : " + reader.getLocation());
final String localName = reader.getLocalName();
// move from START parent to either :
// 1. END parent if no children, or
// 2. START child
reader.nextTag();
return new Children<XMLStreamReader>() {
@Override
public XMLStreamReader getNextChild() {
if (reader.isEndElement() && reader.getLocalName().equals(localName)) {
return null;
}
return reader;
}
};
}
 
protected XMLDecoderStAX() {
}
}
/trunk/OpenConcerto/src/org/openconcerto/xml/FastXMLProperties.java
New file
0,0 → 1,71
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.xml;
 
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.Properties;
 
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.jdom2.input.sax.XMLReaderSAX2Factory;
 
public class FastXMLProperties {
 
public static void load(Properties props, InputStream in) throws IOException {
final SAXBuilder builder = new SAXBuilder(new XMLReaderSAX2Factory(false, "com.bluecast.xml.Piccolo"), null, null);
try {
final Document document = builder.build(new BufferedInputStream(in));
for (Element element : document.getRootElement().getChildren()) {
if (element.getName().equals("entry")) {
props.setProperty(element.getAttributeValue("key"), element.getText());
}
}
} catch (Exception e) {
throw new IOException(e);
}
 
}
 
/**
* Fast alternative (<1ms) for Properties.storeToXML (30ms)
*
*/
public static void store(Properties props, OutputStream out, String comment) throws IOException {
PrintStream prt = new PrintStream(out, false, "UTF-8");
prt.append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n");
prt.append("<properties>\\r\n");
if (comment != null) {
prt.append("<comment>");
prt.append(comment);
prt.append("</comment>\\r\n");
}
synchronized (props) {
for (String k : props.stringPropertyNames()) {
prt.append("<entry key=\"");
prt.append(XMLUtils.escapeAttribute(k));
prt.append("\">");
prt.append(XMLUtils.escapeText(props.getProperty(k)));
prt.append("</entry>\\r\n");
}
}
prt.append("</properties>");
prt.close();
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/xml/XMLDecoderJDOM.java
New file
0,0 → 1,74
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.xml;
 
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.util.Iterator;
 
import org.jdom2.Element;
 
/**
* To encode and decode using {@link XMLEncoder} and {@link XMLDecoder}.
*
* @author Sylvain CUAZ
*/
public final class XMLDecoderJDOM extends AbstractXMLDecoder<Element, RuntimeException> {
 
@Override
protected String getAttributeValue(Element elem, String attrName) {
return elem.getAttributeValue(attrName);
}
 
@Override
protected String getLocalName(Element elem) {
return elem.getName();
}
 
@Override
protected String getElementText(Element elem) {
return elem.getText();
}
 
@Override
protected Element getFirstChild(Element elem) {
return elem.getChildren().get(0);
}
 
@Override
protected String toString(Element elem) {
return JDOM2Utils.output(elem);
}
 
@Override
protected Children<Element> createChildren(final Element elem) {
return new Children<Element>() {
 
private final Iterator<Element> iter = elem.getChildren().iterator();
 
@Override
public Element getNextChild() {
if (!this.iter.hasNext())
return null;
 
final Element res = this.iter.next();
assert res != null;
return res;
}
};
}
 
protected XMLDecoderJDOM() {
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/panel/compta/ExportFEC.java
42,10 → 42,10
 
public class ExportFEC extends AbstractExport {
 
private static final char ZONE_SEPARATOR = '\t';
private static final char RECORD_SEPARATOR = '\n';
public static final char ZONE_SEPARATOR = '\t';
public static final char RECORD_SEPARATOR = '\n';
private static final char REPLACEMENT = ' ';
static private final List<String> COLS = Arrays.asList("JournalCode", "JournalLib", "EcritureNum", "EcritureDate", "CompteNum", "CompteLib", "CompAuxNum", "CompAuxLib", "PieceRef", "PieceDate",
public static final List<String> COLS = Arrays.asList("JournalCode", "JournalLib", "EcritureNum", "EcritureDate", "CompteNum", "CompteLib", "CompAuxNum", "CompAuxLib", "PieceRef", "PieceDate",
"EcritureLib", "Debit", "Credit", "EcritureLet", "DateLet", "ValidDate", "Montantdevise", "Idevise");
 
private final DecimalFormat format = new DecimalFormat("##0.00", DecimalFormatSymbols.getInstance(Locale.FRANCE));
/trunk/OpenConcerto/src/org/openconcerto/erp/panel/compta/ExportPanel.java
87,6 → 87,12
return new ExportSageXimport(root);
}
},
SAGE_ETENDU("Sage Etendu") {
@Override
public AbstractExport createExport(DBRoot root) {
return new ExportSageEtendu(root);
}
},
CCMX("Cegid CCMX") {
@Override
public AbstractExport createExport(DBRoot root) {
/trunk/OpenConcerto/src/org/openconcerto/erp/panel/compta/ExportSageEtendu.java
New file
0,0 → 1,359
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.panel.compta;
 
import org.openconcerto.erp.core.finance.payment.element.ModeDeReglementSQLElement;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.utils.GestionDevise;
import org.openconcerto.utils.StringUtils;
import org.openconcerto.utils.cc.ITransformer;
 
import java.io.IOException;
import java.io.OutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Row;
 
public class ExportSageEtendu extends AbstractExport {
 
private List<SQLRowValues> data;
private Map<Integer, SQLRowValues> mapFacture = new HashMap<>();
private Map<Integer, SQLRowValues> mapAvoir = new HashMap<>();
 
public ExportSageEtendu(DBRoot rootSociete) {
super(rootSociete, "Sage Etendu", ".xls");
}
 
@Override
protected int fetchData(Date from, Date to, SQLRow selectedJournal, boolean onlyNew) {
 
final SQLTable tableEcriture = getEcritureT();
 
// Fetch facture
final SQLTable tableVF = tableEcriture.getTable("SAISIE_VENTE_FACTURE");
SQLRowValues rowValsVF = new SQLRowValues(tableVF);
rowValsVF.put("ID", null);
rowValsVF.put("DATE", null);
rowValsVF.put("NOM", null);
rowValsVF.put("NUMERO", null);
 
SQLRowValues rowValsMdr = rowValsVF.putRowValues("ID_MODE_REGLEMENT");
 
rowValsMdr.putNulls(rowValsMdr.getTable().getFieldsName());
rowValsMdr.putRowValues("ID_TYPE_REGLEMENT").putNulls("NOM");
 
if (tableVF.contains("ID_ABONNEMENT")) {
rowValsVF.putRowValues("ID_ABONNEMENT").putNulls("DATE_DEBUT_FACTURE", "DATE_FIN_FACTURE");
}
SQLRowValuesListFetcher fetcherVF = SQLRowValuesListFetcher.create(rowValsVF);
List<SQLRowValues> resultVF = fetcherVF.fetch(new Where(tableVF.getField("DATE"), from, to));
 
for (SQLRowValues sqlRowValues : resultVF) {
this.mapFacture.put(sqlRowValues.getID(), sqlRowValues);
}
 
// Fetch avoirs
final SQLTable tableAvoir = tableEcriture.getTable("AVOIR_CLIENT");
SQLRowValues rowValsAvoir = new SQLRowValues(tableAvoir);
rowValsAvoir.put("ID", null);
rowValsAvoir.put("DATE", null);
rowValsAvoir.put("NOM", null);
rowValsAvoir.put("NUMERO", null);
SQLRowValues rowValsMdrAvoir = rowValsAvoir.putRowValues("ID_MODE_REGLEMENT");
 
rowValsMdrAvoir.putNulls(rowValsMdrAvoir.getTable().getFieldsName());
rowValsMdrAvoir.putRowValues("ID_TYPE_REGLEMENT").putNulls("NOM");
 
SQLRowValuesListFetcher fetcherAvoir = SQLRowValuesListFetcher.create(rowValsAvoir);
List<SQLRowValues> resultAvoir = fetcherAvoir.fetch(new Where(tableAvoir.getField("DATE"), from, to));
 
for (SQLRowValues sqlRowValues : resultAvoir) {
this.mapAvoir.put(sqlRowValues.getID(), sqlRowValues);
}
 
final SQLTable tableCompte = tableEcriture.getForeignTable("ID_COMPTE_PCE");
 
SQLRowValues rowValsFetch = new SQLRowValues(tableEcriture);
rowValsFetch.putNulls("NOM", "DATE", "DEBIT", "CREDIT");
if (tableEcriture.contains("CODE_CLIENT")) {
rowValsFetch.put("CODE_CLIENT", null);
}
 
rowValsFetch.putRowValues("ID_MOUVEMENT").putNulls("NUMERO", "SOURCE", "IDSOURCE").putRowValues("ID_PIECE").put("NOM", null);
 
rowValsFetch.putRowValues("ID_COMPTE_PCE").putNulls("NUMERO", "NOM");
rowValsFetch.putRowValues("ID_JOURNAL").putNulls("CODE", "NOM");
 
SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(rowValsFetch);
fetcher.addSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
 
@Override
public SQLSelect transformChecked(SQLSelect input) {
input.setWhere(getWhere(from, to, selectedJournal, onlyNew));
input.addFieldOrder(input.getAlias(tableEcriture).getField("ID_MOUVEMENT"));
input.addFieldOrder(input.getAlias(tableCompte).getField("NUMERO"));
return input;
}
}, 0);
 
final List<SQLRowValues> l = fetcher.fetch();
this.data = l;
return l == null ? 0 : l.size();
}
 
@Override
protected void export(OutputStream bufOut) throws IOException {
final List<SQLRowValues> l = this.data;
final boolean containsCodeClient = getEcritureT().contains("CODE_CLIENT");
final int size = l.size();
 
HSSFWorkbook workBook = new HSSFWorkbook();
HSSFSheet sheet = workBook.createSheet("Ecritures");
Row rowEntete = sheet.createRow(0);
List<String> colName = Arrays.asList("Date d'écriture", "Code Journal", "Numéro de facture", "Référence", "Compte Général", "Compte Client", "Libellé de l'écriture", "Date d'échéance",
"Mode de règlement", "Montant débiteur", "Montant Créditeur", "Date de début d'abonnement", "Date de fin d'abonnement");
int colIndex = 0;
for (String string : colName) {
Cell cell = rowEntete.createCell(colIndex, CellType.STRING);
cell.setCellValue(string);
colIndex++;
}
 
CellStyle cellStyle = workBook.createCellStyle();
CreationHelper createHelper = workBook.getCreationHelper();
cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("m/d/yy"));
 
for (int i = 0; i < size; i++) {
 
Row row = sheet.createRow(i + 1);
 
final SQLRowValues rowLine = l.get(i);
 
// Date
final Date d = rowLine.getDate("DATE").getTime();
Cell cellDate = row.createCell(0);
cellDate.setCellStyle(cellStyle);
cellDate.setCellValue(d);
// Jrnl
SQLRowAccessor rowJrnl = rowLine.getForeign("ID_JOURNAL");
Cell cellJrnl = row.createCell(1);
cellJrnl.setCellValue(StringUtils.toAsciiString(rowJrnl.getString("CODE").trim()));
 
SQLRowAccessor rowValsSource = null;
SQLRowAccessor rowMvt = rowLine.getForeign("ID_MOUVEMENT");
if (rowMvt.getString("SOURCE").equals("AVOIR_CLIENT")) {
rowValsSource = this.mapAvoir.get(rowMvt.getInt("IDSOURCE"));
} else if (rowMvt.getString("SOURCE").equals("SAISIE_VENTE_FACTURE")) {
rowValsSource = this.mapFacture.get(rowMvt.getInt("IDSOURCE"));
}
 
// Numero Piece
Cell cellPiece = row.createCell(2);
if (rowValsSource != null) {
cellPiece.setCellValue(StringUtils.toAsciiString(rowValsSource.getString("NUMERO")));
}
 
// Ref vide
Cell cellRef = row.createCell(3);
cellRef.setCellValue("");
 
// N° Compte
final String cpt = rowLine.getForeign("ID_COMPTE_PCE").getString("NUMERO").trim();
Cell cellCpt = row.createCell(4, CellType.STRING);
cellCpt.setCellValue(getFormattedCompte(cpt));
 
Cell cellCodeClient = row.createCell(5);
if (containsCodeClient) {
// Code Client
String codeClient = "";
if (cpt.startsWith("41")) {
codeClient = rowLine.getString("CODE_CLIENT");
}
cellCodeClient.setCellValue(StringUtils.toAsciiString(codeClient));
}
 
// Libellé
Cell cellLib = row.createCell(6);
cellLib.setCellValue(StringUtils.toAsciiString(rowLine.getString("NOM").trim()));
 
Cell cellDateEch = row.createCell(7);
Cell cellTypeRegl = row.createCell(8);
if (rowValsSource != null && cpt.startsWith("41")) {
final SQLRowAccessor foreignMdr = rowValsSource.getForeign("ID_MODE_REGLEMENT");
Date ech = ModeDeReglementSQLElement.calculDate(foreignMdr, rowValsSource.getDate("DATE").getTime());
cellDateEch.setCellValue(ech);
cellDateEch.setCellStyle(cellStyle);
cellTypeRegl.setCellValue(foreignMdr.getForeign("ID_TYPE_REGLEMENT").getString("NOM"));
}
 
// Debit
Cell cellDebit = row.createCell(9);
final Long debit = rowLine.getLong("DEBIT");
cellDebit.setCellValue(debit / 100.0D);
// Credit
final Long credit = rowLine.getLong("CREDIT");
Cell cellCredit = row.createCell(10);
cellCredit.setCellValue(credit / 100.0D);
 
Cell cellDebAbo = row.createCell(11);
Cell cellFinAbo = row.createCell(12);
 
if (rowValsSource != null && rowValsSource.contains("ID_ABONNEMENT") && rowValsSource.getTable().getName().equals("ID_SAISIE_VENTE_FACTURE") && cpt.startsWith("41")) {
SQLRowAccessor rowValsAbo = rowValsSource.getForeign("ID_ABONNEMENT");
if (rowValsAbo != null && !rowValsAbo.isUndefined()) {
final Calendar calDeb = rowValsAbo.getDate("DATE_DEBUT_FACTURE");
if (calDeb != null) {
cellDebAbo.setCellValue(calDeb.getTime());
cellDebAbo.setCellStyle(cellStyle);
}
 
final Calendar calFin = rowValsAbo.getDate("DATE_FIN_FACTURE");
if (calFin != null) {
cellFinAbo.setCellValue(calFin.getTime());
cellFinAbo.setCellStyle(cellStyle);
}
}
}
 
}
workBook.write(bufOut);
workBook.close();
}
 
private void exportTAB(OutputStream bufOut) throws IOException {
final List<SQLRowValues> l = this.data;
final boolean containsCodeClient = getEcritureT().contains("CODE_CLIENT");
final DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
final int size = l.size();
for (int i = 0; i < size; i++) {
 
// Ligne à insérer dans le fichier
final StringBuilder line = new StringBuilder();
 
final SQLRowValues rowLine = l.get(i);
 
// Date
final Date d = rowLine.getDate("DATE").getTime();
line.append(dateFormat.format(d));
line.append('\t');
// Jrnl
SQLRowAccessor rowJrnl = rowLine.getForeign("ID_JOURNAL");
line.append(StringUtils.toAsciiString(rowJrnl.getString("CODE").trim()));
line.append('\t');
 
SQLRowAccessor rowValsSource = null;
SQLRowAccessor rowMvt = rowLine.getForeign("ID_MOUVEMENT");
if (rowMvt.getString("SOURCE").equals("AVOIR_CLIENT")) {
rowValsSource = this.mapAvoir.get(rowMvt.getInt("IDSOURCE"));
} else if (rowMvt.getString("SOURCE").equals("SAISIE_VENTE_FACTURE")) {
rowValsSource = this.mapFacture.get(rowMvt.getInt("IDSOURCE"));
}
 
// Numero Piece
if (rowValsSource != null) {
line.append(StringUtils.toAsciiString(rowValsSource.getString("NUMERO")));
}
line.append('\t');
 
// Référence
// if (rowValsSource != null) {
// line.append(StringUtils.toAsciiString(rowValsSource.getString("NOM")));
// }
line.append('\t');
 
// N° Compte
final String cpt = rowLine.getForeign("ID_COMPTE_PCE").getString("NUMERO").trim();
line.append(getFormattedCompte(cpt));
line.append('\t');
 
if (containsCodeClient) {
// Code Client
String codeClient = "";
if (cpt.startsWith("41")) {
codeClient = rowLine.getString("CODE_CLIENT");
}
line.append(StringUtils.toAsciiString(codeClient));
line.append('\t');
}
 
// Libellé
line.append(StringUtils.toAsciiString(rowLine.getString("NOM").trim()));
line.append('\t');
 
if (rowValsSource != null && cpt.startsWith("41")) {
final SQLRowAccessor foreignMdr = rowValsSource.getForeign("ID_MODE_REGLEMENT");
Date ech = ModeDeReglementSQLElement.calculDate(foreignMdr, rowValsSource.getDate("DATE").getTime());
line.append(dateFormat.format(ech));
line.append('\t');
line.append(foreignMdr.getForeign("ID_TYPE_REGLEMENT").getString("NOM"));
line.append('\t');
} else {
line.append('\t');
line.append('\t');
}
 
// Debit
final Long debit = rowLine.getLong("DEBIT");
line.append(GestionDevise.currencyToString(debit.longValue(), false));
line.append('\t');
// Credit
final Long credit = rowLine.getLong("CREDIT");
line.append(GestionDevise.currencyToString(credit.longValue(), false));
line.append('\t');
 
if (rowValsSource != null && rowValsSource.contains("ID_ABONNEMENT") && rowValsSource.getTable().getName().equals("ID_SAISIE_VENTE_FACTURE") && cpt.startsWith("41")) {
SQLRowAccessor rowValsAbo = rowValsSource.getForeign("ID_ABONNEMENT");
if (rowValsAbo != null && !rowValsAbo.isUndefined()) {
final Calendar calDeb = rowValsAbo.getDate("DATE_DEBUT_FACTURE");
if (calDeb != null) {
line.append(dateFormat.format(calDeb.getTime()));
}
line.append('\t');
final Calendar calFin = rowValsAbo.getDate("DATE_FIN_FACTURE");
if (calFin != null) {
line.append(dateFormat.format(calFin.getTime()));
}
line.append('\t');
}
} else {
line.append('\t');
line.append('\t');
}
 
line.append('\r');
line.append('\n');
bufOut.write(line.toString().getBytes(StringUtils.Cp1252));
}
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/panel/compta/ImportRImport.java
New file
0,0 → 1,190
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.panel.compta;
 
import org.openconcerto.erp.generationEcritures.Ecriture;
import org.openconcerto.erp.generationEcritures.Exercice;
import org.openconcerto.erp.generationEcritures.Mouvement;
import org.openconcerto.erp.generationEcritures.Piece;
import org.openconcerto.sql.element.SQLElementDirectory;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.users.User;
import org.openconcerto.utils.StringUtils;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.nio.charset.Charset;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class ImportRImport {
private String error = null;
private final Map<String, Piece> mapPiece = new HashMap<>();
private final Map<String, String> mapJournal = new HashMap<>();
 
/**
* Import format Ciel.
*
* Une pièce par journal
*
*/
public ImportRImport() {
//
}
 
public void loadFrom(File file) throws IOException {
this.mapPiece.clear();
this.mapJournal.clear();
this.error = null;
parseJournaux(file);
try (BufferedReader bReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), Charset.forName("Cp1252")))) {
String line = bReader.readLine();
while (!(line.startsWith("##Section") && line.contains("Mvt"))) {
line = bReader.readLine();
}
line = bReader.readLine();
while (line != null && !line.contains("#Section")) {
final List<String> parts = StringUtils.fastSplit(line, '\t');
final String journalCode = unquote(parts.get(1).trim());
final Date ecritureDate = parseDate(unquote(parts.get(2).trim()));
final String compteNum = unquote(parts.get(3).trim());
final String compteLib = unquote(parts.get(4).trim());
final BigDecimal m = new BigDecimal(cleanMontant(parts.get(5)));
BigDecimal debit = BigDecimal.ZERO;
BigDecimal credit = BigDecimal.ZERO;
if (parts.get(6).equalsIgnoreCase("D")) {
debit = m;
} else {
credit = m;
}
final String valid = parts.get(7);
Date validDate = null;
if (valid.equalsIgnoreCase("V")) {
validDate = ecritureDate;
}
final String ecritureLib = unquote(parts.get(8).trim());
final String pieceRef = "Import " + journalCode;
Piece p = this.mapPiece.get(pieceRef);
Mouvement mouvement;
if (p == null) {
p = new Piece(pieceRef);
mouvement = new Mouvement();
p.add(mouvement);
 
} else {
mouvement = p.getMouvements().get(0);
}
final Ecriture ecriture = new Ecriture(ecritureDate, debit, credit);
ecriture.setNom(ecritureLib);
ecriture.setCompte(compteNum, compteLib);
final String journal = getJournal(journalCode);
if (journal == null) {
this.error = "Pas de journal trouvé pour le code journal : " + journalCode;
return;
}
ecriture.setJournal(journalCode, journal);
ecriture.setDateValidation(validDate);
if ("AN".equals(journalCode)) {
ecriture.setaNouveau(true);
}
mouvement.add(ecriture);
 
// Next
line = bReader.readLine();
}
 
}
}
 
private String unquote(String str) {
if (str.length() < 3) {
return str;
}
return str.substring(1, str.length() - 1);
}
 
private void parseJournaux(File file) throws IOException {
try (BufferedReader bReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), Charset.forName("Cp1252")))) {
String line = bReader.readLine();
while (!(line.startsWith("##Section") && line.contains("Jnl"))) {
line = bReader.readLine();
}
line = bReader.readLine();
while (line != null && !line.contains("#Section")) {
final List<String> parts = StringUtils.fastSplit(line, '\t');
this.mapJournal.put(unquote(parts.get(0)), unquote(parts.get(1)));
// Next
line = bReader.readLine();
}
}
 
}
 
private String getJournal(String journalCode) {
return this.mapJournal.get(journalCode);
}
 
private String cleanMontant(String str) {
final int l = str.length();
final StringBuilder b = new StringBuilder(l);
for (int i = 0; i < l; i++) {
final char c = str.charAt(i);
if (Character.isDigit(c)) {
b.append(c);
} else if (c == ',') {
b.append('.');
}
}
return b.toString();
}
 
private Date parseDate(String str) {
if (str.length() != 10) {
return null;
}
final Calendar c = Calendar.getInstance();
 
final int day = Integer.parseInt(str.substring(0, 2));
final int month = Integer.parseInt(str.substring(3, 5));
final int year = Integer.parseInt(str.substring(6, 10));
c.set(year, month - 1, day, 0, 0, 0);
return c.getTime();
}
 
// return null is no error
public String getError() {
return this.error;
}
 
public void importTo(SQLElementDirectory directory, DBRoot rootSociete, User user) throws SQLException {
Exercice e = new Exercice();
e.insert(directory, rootSociete, user, new ArrayList<Piece>(this.mapPiece.values()));
}
 
public static void main(String[] args) throws IOException {
ImportRImport i = new ImportRImport();
i.loadFrom(new File("Y:\\Projets\\OpenConcerto\\ExportCiel\\RImport.txt"));
System.err.println("ImportRImport.main()" + i.getError());
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/panel/compta/ImportFEC.java
New file
0,0 → 1,164
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.panel.compta;
 
import org.openconcerto.erp.generationEcritures.Ecriture;
import org.openconcerto.erp.generationEcritures.Exercice;
import org.openconcerto.erp.generationEcritures.Mouvement;
import org.openconcerto.erp.generationEcritures.Piece;
import org.openconcerto.sql.element.SQLElementDirectory;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.users.User;
import org.openconcerto.utils.StringUtils;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.nio.charset.Charset;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class ImportFEC {
private String error = null;
private Map<String, Piece> mapPiece = new HashMap<>();
 
public ImportFEC() {
//
}
 
public void loadFrom(File file) throws IOException {
this.error = null;
this.mapPiece = null;
 
try (BufferedReader bReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), Charset.forName("Cp1252")))) {
String line = bReader.readLine();
final List<String> headers = StringUtils.fastSplit(line, ExportFEC.ZONE_SEPARATOR);
for (int i = 0; i < headers.size(); i++) {
String c1 = headers.get(i);
String c2 = ExportFEC.COLS.get(i);
// Typo chez les stars de Ciel : MontantDevise au lieu de Montantdevise
if (!c1.equalsIgnoreCase(c2)) {
this.error = "L'entête de la colonne " + (i + 1) + " : " + c1 + " n'est pas " + c2;
return;
}
}
line = bReader.readLine();
while (line != null) {
final List<String> parts = fastSplit(line, ExportFEC.ZONE_SEPARATOR);
final String journalCode = parts.get(0).trim();
final String journalLib = parts.get(1).trim();
// final String ecritureNum = parts.get(2).trim();
final Date ecritureDate = parseDate(parts.get(3).trim());
final String compteNum = parts.get(4).trim();
final String compteLib = parts.get(5).trim();
// final String compAuxNum = parts.get(6).trim();
// final String compAuxLib = parts.get(7).trim();
String pieceRef = parts.get(8).trim();
// final String pieceDate = parts.get(9).trim();
final String ecritureLib = parts.get(10).trim();
final BigDecimal debit = new BigDecimal(parts.get(11).replace(',', '.'));
final BigDecimal credit = new BigDecimal(parts.get(12).replace(',', '.'));
final String ecritureLet = parts.get(13).trim();
final Date dateLet = parseDate(parts.get(14).trim());
final Date validDate = parseDate(parts.get(15).trim());
// final String montantdevise = parts.get(16).trim();
// final String idevise = parts.get(17).trim();
 
if (pieceRef.isEmpty()) {
pieceRef = "Import";
}
Piece p = this.mapPiece.get(pieceRef);
Mouvement mouvement;
if (p == null) {
p = new Piece(pieceRef);
mouvement = new Mouvement();
p.add(mouvement);
 
} else {
mouvement = p.getMouvements().get(0);
}
final Ecriture ecriture = new Ecriture(ecritureDate, debit, credit);
ecriture.setNom(ecritureLib);
ecriture.setCompte(compteNum, compteLib);
ecriture.setJournal(journalCode, journalLib);
ecriture.setDateValidation(validDate);
ecriture.setDateLettrage(dateLet);
ecriture.setLettrage(ecritureLet);
if ("AN".equals(journalCode)) {
ecriture.setaNouveau(true);
}
mouvement.add(ecriture);
 
// Next
line = bReader.readLine();
}
 
}
}
 
private Date parseDate(String str) {
if (str.length() != 8) {
return null;
}
final Calendar c = Calendar.getInstance();
final int year = Integer.parseInt(str.substring(0, 4));
final int month = Integer.parseInt(str.substring(4, 6));
final int day = Integer.parseInt(str.substring(6, 8));
c.set(year, month - 1, day, 0, 0, 0);
return c.getTime();
}
 
// return null is no error
public String getError() {
return this.error;
}
 
public void importTo(SQLElementDirectory directory, DBRoot rootSociete, User user) throws SQLException {
final Exercice e = new Exercice();
e.insert(directory, rootSociete, user, new ArrayList<Piece>(this.mapPiece.values()));
}
 
public static void main(String[] args) throws IOException {
final ImportFEC i = new ImportFEC();
i.loadFrom(new File("Y:\\Projets\\OpenConcerto\\ExportCiel\\FEC20171231.txt"));
System.err.println("ImportFEC.main()" + i.getError());
}
 
public static final List<String> fastSplit(final String string, final char sep) {
final List<String> l = new ArrayList<>();
final int length = string.length();
final char[] cars = string.toCharArray();
int rfirst = 0;
 
for (int i = 0; i < length; i++) {
if (cars[i] == sep) {
l.add(new String(cars, rfirst, i - rfirst));
rfirst = i + 1;
}
}
if (rfirst <= length) {
// <= au lieu de < pour Ciel....
l.add(new String(cars, rfirst, length - rfirst));
}
return l;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/model/MouseSheetXmlListeListener.java
14,6 → 14,8
package org.openconcerto.erp.model;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.customerrelationship.mail.EmailTemplate;
import org.openconcerto.erp.core.customerrelationship.mail.ValueListener;
import org.openconcerto.erp.generationDoc.AbstractSheetXml;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLBase;
27,6 → 29,7
import org.openconcerto.ui.EmailComposer;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.ListMap;
import org.openconcerto.utils.i18n.TranslationManager;
 
import java.awt.event.ActionEvent;
import java.io.File;
112,13 → 115,13
this.showHeader = showHeader;
}
 
protected void sendMail(final AbstractSheetXml sheet, final boolean readOnly) {
protected void sendMail(EmailTemplate template, final AbstractSheetXml sheet, final boolean readOnly) {
List<AbstractSheetXml> l = new ArrayList<>(1);
l.add(sheet);
sendMail(l, readOnly);
sendMail(template, l, readOnly);
}
 
protected void sendMail(final List<AbstractSheetXml> sheets, final boolean readOnly) {
protected void sendMail(EmailTemplate template, final List<AbstractSheetXml> sheets, final boolean readOnly) {
final Thread t = new Thread() {
@Override
public void run() {
231,6 → 234,10
public void run() {
try {
String subject = sheets.get(0).getReference();
if (template != null) {
subject = template.getTitle() + " " + sheets.get(0).getReference().trim();
}
subject = subject.trim();
if (subject.isEmpty()) {
final StringJoiner joiner = new StringJoiner(", ");
for (File f : files) {
238,7 → 245,14
}
subject = joiner.toString();
}
final String message = getMailObject(sheets.get(0).getSQLRow());
String message = getMailObject(sheets.get(0).getSQLRow());
if (template != null) {
if (template.getText().contains("{message}")) {
message = template.getText().replace("{message}", message);
} else {
message += template.getText();
}
}
EmailComposer.getInstance().compose(mailDest, subject, message, files.toArray(new File[files.size()]));
} catch (Exception e) {
ExceptionHandler.handle("Impossible d'envoyer le courriel!", e);
286,11 → 300,27
 
}
} else {
// ODS Viewer
if (this.previewIsVisible) {
l.add(new RowAction(new AbstractAction() {
public void actionPerformed(ActionEvent ev) {
try {
createAbstractSheet(IListe.get(ev).fetchSelectedRow()).showPreviewDocument();
final AbstractSheetXml sheet = createAbstractSheet(IListe.get(ev).fetchSelectedRow());
final SQLTable table = IListe.get(ev).getSource().getPrimaryTable();
sheet.showPreviewDocument(TranslationManager.getInstance().getTranslationForAction("email"), new Runnable() {
 
@Override
public void run() {
EmailTemplate.askTemplate(IListe.get(ev), table.getDBRoot(), new ValueListener() {
 
@Override
public void valueSelected(Object value) {
sendMail((EmailTemplate) value, sheet, true);
}
});
 
}
});
} catch (Exception e) {
ExceptionHandler.handle("Impossible d'ouvrir le fichier", e);
}
388,13 → 418,7
public RowAction getSendMail() {
return new RowAction(new AbstractAction() {
public void actionPerformed(ActionEvent ev) {
final List<SQLRowValues> selectedRows = IListe.get(ev).getSelectedRows();
final SQLTable table = IListe.get(ev).getSource().getPrimaryTable();
final List<SQLRow> rows = new ArrayList<SQLRow>();
for (SQLRowValues r : selectedRows) {
rows.add(table.getRow(r.getID()));
}
sendMail(createAbstractSheets(rows), false);
sendMail(ev, false);
}
}, false, "document.send.email") {
 
411,17 → 435,7
public RowAction getSendMailPDF() {
return new RowAction(new AbstractAction() {
public void actionPerformed(ActionEvent ev) {
try {
final List<SQLRowValues> selectedRows = IListe.get(ev).getSelectedRows();
final SQLTable table = IListe.get(ev).getSource().getPrimaryTable();
final List<SQLRow> rows = new ArrayList<SQLRow>();
for (SQLRowValues r : selectedRows) {
rows.add(table.getRow(r.getID()));
}
sendMail(createAbstractSheets(rows), true);
} catch (Exception e) {
ExceptionHandler.handle("Impossible d'envoyer le(s) fichier(s)", e);
}
sendMail(ev, true);
}
}, false, "document.pdf.send.email") {
 
496,4 → 510,21
}
};
}
 
private void sendMail(ActionEvent ev, boolean pdf) {
final List<SQLRowValues> selectedRows = IListe.get(ev).getSelectedRows();
final SQLTable table = IListe.get(ev).getSource().getPrimaryTable();
final List<SQLRow> rows = new ArrayList<>();
for (SQLRowValues r : selectedRows) {
rows.add(table.getRow(r.getID()));
}
 
EmailTemplate.askTemplate(IListe.get(ev), table.getDBRoot(), new ValueListener() {
 
@Override
public void valueSelected(Object value) {
sendMail((EmailTemplate) value, createAbstractSheets(rows), pdf);
}
});
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/importer/DataImporter.java
13,17 → 13,15
package org.openconcerto.erp.importer;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.openoffice.spreadsheet.Sheet;
import org.openconcerto.openoffice.spreadsheet.SpreadSheet;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLRowValuesCluster.StoreMode;
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.utils.ooxml.XLSXDocument;
import org.openconcerto.utils.ooxml.XLSXSheet;
import org.openconcerto.utils.text.CSVReader;
import org.openconcerto.utils.text.CSVWriter;
import org.openconcerto.utils.text.CharsetHelper;
51,6 → 49,7
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.formula.eval.NotImplementedException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
59,13 → 58,13
public class DataImporter {
private boolean skipFirstLine = true;
private SQLTable table;
private final Map<Integer, ValueConverter> map = new HashMap<Integer, ValueConverter>();
private final Map<SQLField, List<Integer>> fieldMap = new HashMap<SQLField, List<Integer>>();
private final Map<Integer, Constraint> constraints = new HashMap<Integer, Constraint>();
private List<SQLField> uniqueField = new ArrayList<SQLField>();
private List<SQLRowValues> valuesToUpdate = new ArrayList<SQLRowValues>();
private List<SQLRowValues> valuesToInsert = new ArrayList<SQLRowValues>();
private Map<ValueConverter, SQLField> foreignMap = new HashMap<ValueConverter, SQLField>();
private final Map<Integer, ValueConverter> map = new HashMap<>();
private final Map<SQLField, List<Integer>> fieldMap = new HashMap<>();
private final Map<Integer, Constraint> constraints = new HashMap<>();
private List<SQLField> uniqueField = new ArrayList<>();
private List<SQLRowValues> valuesToUpdate = new ArrayList<>();
private List<SQLRowValues> valuesToInsert = new ArrayList<>();
private Map<ValueConverter, SQLField> foreignMap = new HashMap<>();
 
public DataImporter() {
}
78,43 → 77,6
this.table = table;
}
 
public static void main(String[] args) throws Exception {
System.setProperty(SQLBase.STRUCTURE_USE_XML, "true");
final ComptaPropsConfiguration conf = ComptaPropsConfiguration.create();
Configuration.setInstance(conf);
try {
conf.getBase();
} catch (Exception e) {
e.printStackTrace();
}
 
final ComptaPropsConfiguration comptaPropsConfiguration = ((ComptaPropsConfiguration) Configuration.getInstance());
comptaPropsConfiguration.setUpSocieteDataBaseConnexion(39);
UserManager.getInstance().setCurrentUser(2);
 
SQLTable table = Configuration.getInstance().getRoot().findTable("ARTICLE");
DataImporter importer = new DataImporter(table);
importer.skipFirstLine = false;
importer.map(0, table.getField("CODE"));
importer.map(8, table.getField("ID_FOURNISSEUR"));
importer.map(4, table.getField("NOM"));
importer.addContraint(0, new NotEmptyConstraint());
importer.addUniqueField(table.getField("CODE"));
// ArrayTableModel m = importer.createModelFromODS(new File("c:/products-en.ods"));
// ArrayTableModel m = importer.createModelFromCSV(new File("c:/products-en.csv"));
// ArrayTableModel m = importer.createModelFromCSV(new File("c:/products-en.scsv.csv"));
ArrayTableModel m = importer.createModelFromXLS(new File("c:/products-en.xls"), 0);
m.dump(0, 4);
m = importer.createConvertedModel(m);
System.out.println("Dump");
m.dump(0, 4);
importer.importFromModel(m);
System.out.println(importer.getValuesToInsert().size() + " rows to insert");
System.out.println(importer.getValuesToUpdate().size() + " rows to update");
// importer.commit();
 
}
 
public void commit() throws SQLException {
for (SQLRowValues row : this.valuesToInsert) {
row.getGraph().store(StoreMode.INSERT, false);
126,11 → 88,11
}
 
public List<SQLRowValues> getValuesToInsert() {
return valuesToInsert;
return this.valuesToInsert;
}
 
public List<SQLRowValues> getValuesToUpdate() {
return valuesToUpdate;
return this.valuesToUpdate;
}
 
public void addUniqueField(SQLField field) {
142,7 → 104,7
}
 
public void addContraint(int columnIndex, Constraint c) {
constraints.put(Integer.valueOf(columnIndex), c);
this.constraints.put(Integer.valueOf(columnIndex), c);
}
 
public void map(int columnIndex, SQLField field) {
156,17 → 118,17
public void map(int columnIndex, SQLField field, SQLField foreignField) {
final ValueConverter converter = new ValueConverter(foreignField);
map(columnIndex, foreignField, converter);
foreignMap.put(converter, field);
this.foreignMap.put(converter, field);
 
}
 
public void map(int columnIndex, SQLField field, ValueConverter converter) {
final Integer value = Integer.valueOf(columnIndex);
map.put(value, converter);
List<Integer> l = fieldMap.get(field);
this.map.put(value, converter);
List<Integer> l = this.fieldMap.get(field);
if (l == null) {
l = new ArrayList<Integer>();
fieldMap.put(field, l);
l = new ArrayList<>();
this.fieldMap.put(field, l);
} else if (!field.getType().getJavaType().equals(String.class)) {
throw new IllegalArgumentException("Mapping multiple column is only supoprted for String values");
}
195,12 → 157,12
}
}
int start = 0;
if (skipFirstLine) {
if (this.skipFirstLine) {
start = 1;
}
final List<List<Object>> rows = new ArrayList<List<Object>>(rowCount - start);
final List<List<Object>> rows = new ArrayList<>(rowCount - start);
for (int i = start; i < rowCount; i++) {
List<Object> row = new ArrayList<Object>();
List<Object> row = new ArrayList<>();
for (int j = 0; j < columnCount; j++) {
row.add(sheet.getValueAt(j, i));
}
210,16 → 172,45
return new ArrayTableModel(rows);
}
 
public ArrayTableModel createModelFromXLSXGM(File xlsFile, int sheetNumber) throws IOException {
XLSXDocument doc = XLSXDocument.createFromFile(xlsFile);
XLSXSheet sheet = doc.getSheet(sheetNumber);
final int rowCount = sheet.getRowCount();
final int columnCount = sheet.getColumnCount();
 
int start = 0;
if (this.skipFirstLine) {
start = 1;
}
final List<List<Object>> selectedRows = new ArrayList<>(rowCount - start);
for (int i = start; i < rowCount; i++) {
List<Object> row = new ArrayList<>();
for (int j = 0; j < columnCount; j++) {
row.add(sheet.getValueAt(j, i));
}
selectedRows.add(row);
}
 
return new ArrayTableModel(selectedRows);
 
}
 
public ArrayTableModel createModelFromXLS(File xlsFile, int sheetNumber) throws IOException {
final InputStream inputStream = new FileInputStream(xlsFile);
final POIFSFileSystem fileSystem = new POIFSFileSystem(new BufferedInputStream(inputStream));
final HSSFWorkbook workBook = new HSSFWorkbook(fileSystem);
final HSSFSheet sheet = workBook.getSheetAt(sheetNumber);
Iterator<Row> rowsIterator = sheet.rowIterator();
final List<List<Object>> rows = createFromExcel(workBook.getCreationHelper().createFormulaEvaluator(), sheet.rowIterator(), sheet.rowIterator());
workBook.close();
return new ArrayTableModel(rows);
 
}
 
private List<List<Object>> createFromExcel(FormulaEvaluator evaluator, Iterator<Row> rowsIterator1, Iterator<Row> rowsIterator2) {
int columnCount = 0;
int rowCount = 0;
while (rowsIterator.hasNext()) {
Row row = rowsIterator.next();
while (rowsIterator1.hasNext()) {
Row row = rowsIterator1.next();
int i = row.getPhysicalNumberOfCells();
if (i > columnCount) {
columnCount = i;
227,18 → 218,16
rowCount++;
}
// Extract data
rowsIterator = sheet.rowIterator();
int start = 0;
if (skipFirstLine) {
if (this.skipFirstLine) {
start = 1;
rowsIterator.next();
rowsIterator2.next();
}
final List<List<Object>> rows = new ArrayList<List<Object>>(rowCount - start);
FormulaEvaluator evaluator = workBook.getCreationHelper().createFormulaEvaluator();
final List<List<Object>> rows = new ArrayList<>(rowCount - start);
 
while (rowsIterator.hasNext()) {
final Row row = rowsIterator.next();
final List<Object> rowData = new ArrayList<Object>();
while (rowsIterator2.hasNext()) {
final Row row = rowsIterator2.next();
final List<Object> rowData = new ArrayList<>();
for (int i = 0; i < columnCount; i++) {
final Cell cell = row.getCell(i);
 
245,30 → 234,33
if (cell == null) {
rowData.add("");
} else {
CellValue cellValue = evaluator.evaluate(cell);
CellValue cellValue = null;
try {
cellValue = evaluator.evaluate(cell);
} catch (NotImplementedException exception) {
exception.printStackTrace();
}
if (cellValue == null) {
rowData.add("");
} else {
switch (cellValue.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
switch (cellValue.getCellTypeEnum()) {
case BOOLEAN:
rowData.add(Boolean.valueOf(cellValue.getBooleanValue()));
break;
case Cell.CELL_TYPE_NUMERIC:
 
case NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
System.out.println("Row No.: " + row.getRowNum() + " " + cell.getDateCellValue());
rowData.add(cell.getDateCellValue());
} else {
rowData.add(Double.valueOf(cellValue.getNumberValue()));
}
break;
case Cell.CELL_TYPE_STRING:
case STRING:
rowData.add(cellValue.getStringValue());
break;
case Cell.CELL_TYPE_FORMULA:
case FORMULA:
rowData.add(cell.getCellFormula());
break;
case Cell.CELL_TYPE_BLANK:
case BLANK:
rowData.add("");
break;
default:
283,9 → 275,7
rows.add(rowData);
 
}
inputStream.close();
return new ArrayTableModel(rows);
 
return rows;
}
 
public ArrayTableModel createModelFromCSV(File csvFile) throws IOException {
319,12 → 309,12
final int columnCount = lines.get(0).length;
 
int start = 0;
if (skipFirstLine) {
if (this.skipFirstLine) {
start = 1;
}
final List<List<Object>> rows = new ArrayList<List<Object>>(rowCount - start);
final List<List<Object>> rows = new ArrayList<>(rowCount - start);
for (int i = start; i < rowCount; i++) {
List<Object> row = new ArrayList<Object>();
List<Object> row = new ArrayList<>();
String[] values = lines.get(i);
for (int j = 0; j < columnCount; j++) {
row.add(values[j]);
347,23 → 337,23
 
public ArrayTableModel createConvertedModel(ArrayTableModel model) {
final int rowCount = model.getRowCount();
final ArrayList<Integer> colsUsed = new ArrayList<Integer>(map.keySet());
colsUsed.addAll(constraints.keySet());
final ArrayList<Integer> colsUsed = new ArrayList<>(this.map.keySet());
colsUsed.addAll(this.constraints.keySet());
 
final int columnCount = 1 + Collections.max(colsUsed);
 
final List<List<Object>> rows = new ArrayList<List<Object>>(rowCount);
final List<List<Object>> rows = new ArrayList<>(rowCount);
 
for (int i = 0; i < rowCount; i++) {
boolean validRow = true;
final List<Object> row = new ArrayList<Object>();
final List<Object> row = new ArrayList<>();
for (int j = 0; j < columnCount; j++) {
Object value = model.getValueAt(i, j);
ValueConverter converter = map.get(j);
ValueConverter converter = this.map.get(j);
if (converter != null) {
value = converter.convertFrom(value);
}
final Constraint constraint = constraints.get(j);
final Constraint constraint = this.constraints.get(j);
// Verification de la validité de la valeur à importer
if (constraint != null && !constraint.isValid(value)) {
validRow = false;
380,19 → 370,19
}
 
protected void customizeRowValuesToFetch(SQLRowValues vals) {
 
// Nothing
}
 
public void importFromModel(ArrayTableModel model) throws IOException {
final int rowCount = model.getRowCount();
// Load existing data for duplication check
final SQLRowValues vals = new SQLRowValues(table);
final SQLRowValues vals = new SQLRowValues(this.table);
 
for (SQLField field : this.fieldMap.keySet()) {
if (field.getTable().equals(table)) {
if (field.getTable().equals(this.table)) {
vals.put(field.getName(), null);
} else {
final Set<SQLField> foreignKeys = table.getForeignKeys(field.getTable());
final Set<SQLField> foreignKeys = this.table.getForeignKeys(field.getTable());
for (SQLField sqlField : foreignKeys) {
vals.put(sqlField.getName(), null);
}
399,17 → 389,15
}
}
customizeRowValuesToFetch(vals);
System.out.println("Fetching values");
SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(vals);
List<SQLRowValues> existingRows = fetcher.fetch();
System.out.println("Computing cache");
final int existingRowsCount = existingRows.size();
final ValueConverter[] converters = map.values().toArray(new ValueConverter[map.size()]);
final ValueConverter[] converters = this.map.values().toArray(new ValueConverter[this.map.size()]);
 
// Une map <Object(valeur),SQLRowValues> pour chaque champs unique
Map<SQLField, Map<Object, SQLRowValues>> cache = new HashMap<SQLField, Map<Object, SQLRowValues>>();
Map<SQLField, Map<Object, SQLRowValues>> cache = new HashMap<>();
for (SQLField field : this.uniqueField) {
Map<Object, SQLRowValues> m = new HashMap<Object, SQLRowValues>();
Map<Object, SQLRowValues> m = new HashMap<>();
cache.put(field, m);
final String fieldName = field.getName();
for (int j = 0; j < existingRowsCount; j++) {
424,7 → 412,7
// Recherche d'existant
SQLRowValues existingRow = null;
for (SQLField field : this.uniqueField) {
List<Integer> cols = fieldMap.get(field);
List<Integer> cols = this.fieldMap.get(field);
Object objectToInsert = null;
for (Integer col : cols) {
Object v = model.getValueAt(i, col);
449,7 → 437,7
 
private void updateOrInsert(ArrayTableModel model, final ValueConverter[] converters, int i, SQLRowValues existingRow) {
 
final Map<String, Object> newValues = new HashMap<String, Object>();
final Map<String, Object> newValues = new HashMap<>();
if (existingRow != null) {
// Préremplissage de la map avec la row existante
newValues.putAll(existingRow.getAbsolutelyAll());
457,7 → 445,7
for (int j = 0; j < converters.length; j++) {
ValueConverter valueConverter = converters[j];
 
List<Integer> cols = fieldMap.get(valueConverter.getField());
List<Integer> cols = this.fieldMap.get(valueConverter.getField());
Object objectToInsert = null;
for (Integer col : cols) {
Object v = model.getValueAt(i, col);
471,11 → 459,11
 
final String fieldName = valueConverter.getFieldName();
if (objectToInsert != null || !valueConverter.isIgnoringEmptyValue()) {
if (valueConverter.getField().getTable().equals(table)) {
if (valueConverter.getField().getTable().equals(this.table)) {
newValues.put(fieldName, objectToInsert);
} else {
 
final SQLField sqlField = foreignMap.get(valueConverter);
final SQLField sqlField = this.foreignMap.get(valueConverter);
 
final Object value = newValues.get(sqlField.getName());
if (value == null || value instanceof SQLRowValues) {
490,26 → 478,21
}
}
}
final SQLRowValues rowVals = new SQLRowValues(table, newValues);
final SQLRowValues rowVals = new SQLRowValues(this.table, newValues);
patchRowValues(rowVals, model.getLineValuesAt(i), existingRow);
if (existingRow == null) {
this.valuesToInsert.add(rowVals);
}
// else if (!newValues.equals(existingRow.getAbsolutelyAll())) {
else {
} else {
this.valuesToUpdate.add(rowVals);
// for (SQLRowValues ref : rowVals.getReferentRows()) {
// this.valuesToUpdate.add(ref);
// }
}
}
 
public void doAfterImport() throws SQLException {
 
// Nothing
}
 
protected void patchRowValues(SQLRowValues rowVals, List<Object> lineValues, SQLRowValues existingRow) {
 
// Nothing
}
 
public void setSkipFirstLine(boolean skipFirstLine) {
531,8 → 514,10
return createModelFromCSV(file);
} else if (name.endsWith(".xls")) {
return createModelFromXLS(file, sheetNumber);
} else if (name.endsWith(".xlsx") || name.endsWith(".xlsm")) {
return createModelFromXLSXGM(file, sheetNumber);
}
throw new IllegalArgumentException("File format not supported. Please provide an ods, csv or xls file.");
throw new IllegalArgumentException("File format not supported. Please provide an ods, csv, xls or xlsx file.");
 
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/preferences/MailRelancePreferencePanel.java
File deleted
/trunk/OpenConcerto/src/org/openconcerto/erp/preferences/TemplateNXProps.java
17,7 → 17,6
import org.openconcerto.erp.core.customerrelationship.customer.report.FicheClientXmlSheet;
import org.openconcerto.erp.core.edm.AttachmentSQLElement;
import org.openconcerto.erp.core.finance.accounting.report.BalanceSheet;
import org.openconcerto.erp.core.finance.accounting.report.GrandLivreSheet;
import org.openconcerto.erp.core.finance.accounting.report.GrandLivreSheetXML;
import org.openconcerto.erp.core.finance.accounting.report.JournauxSheetXML;
import org.openconcerto.erp.core.humanresources.payroll.report.EtatChargesPayeSheet;
/trunk/OpenConcerto/src/org/openconcerto/erp/preferences/GestionCommercialeGlobalPreferencePanel.java
29,11 → 29,13
 
public class GestionCommercialeGlobalPreferencePanel extends JavaPrefPreferencePanel {
public static String TRANSFERT_REF = "TransfertRef";
public static String COMMANDE_FOURNISSEUR_EN_COURS = "CommandeFournisseurEncours";
public static String TRANSFERT_MULTI_REF = "TransfertMultiRef";
public static String TRANSFERT_NO_REF = "TransfertNoRef";
public static String ACOMPTE_DEVIS = "AcompteDevis";
public static String ORDER_PACKAGING_MANAGEMENT = "OrderPackagingManagement";
public static String ADDRESS_SPEC = "AddressSpec";
public static String CATEGORIE_COMPTABLE_SPEC = "CategorieComptableSpec";
public static String GESTION_TIMBRE_FISCAL = "GestionTimbreFiscal";
public static String TAUX_TIMBRE_FISCAL = "TauxTimbreFiscal";
public static String BARCODE_INSERTION = "BarcodeInsertion";
69,6 → 71,10
orderQuoting.setDefaultValue(Boolean.FALSE);
this.addView(orderQuoting);
 
PrefView<Boolean> cmdEnCours = new PrefView<Boolean>(PrefType.BOOLEAN_TYPE, "Activer la gestion des commandes fournisseurs en cours", COMMANDE_FOURNISSEUR_EN_COURS);
cmdEnCours.setDefaultValue(Boolean.FALSE);
this.addView(cmdEnCours);
 
PrefView<Boolean> viewAcompteDevis = new PrefView<Boolean>(PrefType.BOOLEAN_TYPE, "Gérer les acomptes sur devis", ACOMPTE_DEVIS);
viewAcompteDevis.setDefaultValue(Boolean.FALSE);
this.addView(viewAcompteDevis);
76,6 → 82,10
PrefView<Boolean> addressSpec = new PrefView<Boolean>(PrefType.BOOLEAN_TYPE, "Afficher les sélecteurs d'adresse spécifique", ADDRESS_SPEC);
addressSpec.setDefaultValue(Boolean.TRUE);
this.addView(addressSpec);
PrefView<Boolean> catComptableSpec = new PrefView<Boolean>(PrefType.BOOLEAN_TYPE, "Afficher les sélecteurs de catégorie comptable spécifique", CATEGORIE_COMPTABLE_SPEC);
catComptableSpec.setDefaultValue(Boolean.FALSE);
this.addView(catComptableSpec);
 
PrefView<Boolean> gestTimbreFisc = new PrefView<Boolean>(PrefType.BOOLEAN_TYPE, "Activer la gestion du timbre fiscal", GESTION_TIMBRE_FISCAL);
gestTimbreFisc.setDefaultValue(Boolean.FALSE);
/trunk/OpenConcerto/src/org/openconcerto/erp/config/ComptaPropsConfiguration.java
27,10 → 27,11
import org.openconcerto.erp.core.common.element.StyleSQLElement;
import org.openconcerto.erp.core.common.element.TitrePersonnelSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ClientDepartementSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ComptaContactSQLElement.ContactAdministratifSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ComptaContactSQLElement.ContactFournisseurSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ComptaContactSQLElement.ContactSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ComptaContactSQLElement.ContactSalarieSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.CompteClientTransactionSQLELement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ContactSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ContactSQLElement.ContactAdministratifSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ContactSQLElement.ContactFournisseurSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.CourrierClientSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.CustomerCategorySQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.CustomerSQLElement;
38,6 → 39,7
import org.openconcerto.erp.core.customerrelationship.customer.element.ReferenceClientSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.RelanceSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.TypeLettreRelanceSQLElement;
import org.openconcerto.erp.core.customerrelationship.mail.EmailTemplateSQLElement;
import org.openconcerto.erp.core.edm.AttachmentSQLElement;
import org.openconcerto.erp.core.finance.accounting.element.AssociationAnalytiqueSQLElement;
import org.openconcerto.erp.core.finance.accounting.element.AssociationCompteAnalytiqueSQLElement;
172,6 → 174,7
import org.openconcerto.erp.core.sales.product.element.ArticleFournisseurSecondaireSQLElement;
import org.openconcerto.erp.core.sales.product.element.ArticleTarifSQLElement;
import org.openconcerto.erp.core.sales.product.element.CoutRevientSQLElement;
import org.openconcerto.erp.core.sales.product.element.CustomerProductQtyPriceSQLElement;
import org.openconcerto.erp.core.sales.product.element.EcoContributionSQLElement;
import org.openconcerto.erp.core.sales.product.element.FamilleArticleSQLElement;
import org.openconcerto.erp.core.sales.product.element.FamilleEcoContributionSQLElement;
227,6 → 230,7
import org.openconcerto.erp.generationDoc.provider.AdresseVilleClientValueProvider;
import org.openconcerto.erp.generationDoc.provider.AdresseVilleNomClientValueProvider;
import org.openconcerto.erp.generationDoc.provider.ArticleCodeClientProvider;
import org.openconcerto.erp.generationDoc.provider.ArticleCodeFournisseurProvider;
import org.openconcerto.erp.generationDoc.provider.ConditionsReglementDetailsProvider;
import org.openconcerto.erp.generationDoc.provider.DateBLProvider;
import org.openconcerto.erp.generationDoc.provider.DateProvider;
240,6 → 244,7
import org.openconcerto.erp.generationDoc.provider.PrixUVProvider;
import org.openconcerto.erp.generationDoc.provider.PrixUnitaireProvider;
import org.openconcerto.erp.generationDoc.provider.PrixUnitaireRemiseProvider;
import org.openconcerto.erp.generationDoc.provider.QteTotalDocProvider;
import org.openconcerto.erp.generationDoc.provider.QteTotalProvider;
import org.openconcerto.erp.generationDoc.provider.RecapFactureProvider;
import org.openconcerto.erp.generationDoc.provider.RefClientValueProvider;
269,6 → 274,8
import org.openconcerto.erp.injector.CommandeCliCommandeSQLInjector;
import org.openconcerto.erp.injector.CommandeFactureAchatSQLInjector;
import org.openconcerto.erp.injector.CommandeFactureClientSQLInjector;
import org.openconcerto.erp.injector.CommandeFactureEltSQLInjector;
import org.openconcerto.erp.injector.CommandeFactureFournisseurSQLInjector;
import org.openconcerto.erp.injector.DevisBlEltSQLInjector;
import org.openconcerto.erp.injector.DevisBlSQLInjector;
import org.openconcerto.erp.injector.DevisCommandeFournisseurSQLInjector;
298,7 → 305,6
import org.openconcerto.sql.model.DBStructureItemNotFound;
import org.openconcerto.sql.model.DBSystemRoot;
import org.openconcerto.sql.model.FieldMapper;
import org.openconcerto.sql.model.LoadingListener;
import org.openconcerto.sql.model.SQLDataSource;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLServer;
338,14 → 344,8
import java.util.Collection;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
 
import javax.imageio.ImageIO;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
605,6 → 605,7
AdresseVilleNomClientValueProvider.register();
AdresseFullClientValueProvider.register();
QteTotalProvider.register();
QteTotalDocProvider.register();
StockLocationProvider.register();
RefClientValueProvider.register();
ModeDeReglementDetailsProvider.register();
618,62 → 619,10
RecapFactureProvider.register();
RestantAReglerProvider.register();
SaledTotalNotDiscountedProvider.register();
ArticleCodeFournisseurProvider.register();
}
 
@Override
protected void initSystemRoot(DBSystemRoot input) {
super.initSystemRoot(input);
if (!GraphicsEnvironment.isHeadless()) {
final JDialog f = new JOptionPane("Mise à jour des caches en cours...\nCette opération prend généralement moins d'une minute.", JOptionPane.INFORMATION_MESSAGE, JOptionPane.DEFAULT_OPTION,
null, new Object[] {}).createDialog("Veuillez patienter");
input.addLoadingListener(new LoadingListener() {
 
private int loadingCount = 0;
private final ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
final Thread thread = new Thread(r, "Loading listener thread");
thread.setDaemon(true);
return thread;
}
});
private ScheduledFuture<?> future = null;
 
@Override
public synchronized void loading(LoadingEvent evt) {
this.loadingCount += evt.isStarting() ? 1 : -1;
if (this.loadingCount < 0) {
throw new IllegalStateException();
} else if (this.loadingCount == 0) {
this.future.cancel(false);
this.future = null;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
f.setVisible(false);
f.dispose();
}
});
} else if (this.future == null) {
this.future = this.exec.schedule(new Runnable() {
@Override
public void run() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
f.setVisible(true);
}
});
}
}, 1, TimeUnit.SECONDS);
}
}
 
});
}
}
 
@Override
protected void initDS(SQLDataSource ds) {
super.initDS(ds);
ds.setInitialSize(3);
862,7 → 811,7
 
dir.addSQLElement(AttachmentSQLElement.class);
 
 
dir.addSQLElement(CustomerProductQtyPriceSQLElement.class);
dir.addSQLElement(EtatStockSQLElement.class);
dir.addSQLElement(EtatStockItemSQLElement.class);
dir.addSQLElement(ArticleTarifSQLElement.class);
882,6 → 831,7
dir.addSQLElement(CoefficientPrimeSQLElement.class);
dir.addSQLElement(ContactFournisseurSQLElement.class);
dir.addSQLElement(ContactAdministratifSQLElement.class);
dir.addSQLElement(ContactSalarieSQLElement.class);
dir.addSQLElement(new TitrePersonnelSQLElement());
dir.addSQLElement(new ContactSQLElement());
dir.addSQLElement(new SaisieKmItemSQLElement());
1065,6 → 1015,7
dir.addSQLElement(CalendarItemSQLElement.class);
dir.addSQLElement(CalendarItemGroupSQLElement.class);
dir.addSQLElement(DeviseHistoriqueSQLElement.class);
dir.addSQLElement(EmailTemplateSQLElement.class);
 
if (getRootSociete().contains("FWK_LIST_PREFS")) {
dir.addSQLElement(new FWKListPrefs(getRootSociete()));
1122,6 → 1073,7
 
public static void setSocieteSQLInjector(final DBRoot rootSociete) {
new AchatAvoirSQLInjector(rootSociete);
new CommandeFactureEltSQLInjector(rootSociete);
new ArticleCommandeEltSQLInjector(rootSociete);
new CommandeCliCommandeSQLInjector(rootSociete);
new FactureAvoirSQLInjector(rootSociete);
1141,6 → 1093,7
new CommandeBrSQLInjector(rootSociete);
new BonReceptionFactureFournisseurSQLInjector(rootSociete);
new CommandeFactureAchatSQLInjector(rootSociete);
new CommandeFactureFournisseurSQLInjector(rootSociete);
new EcheanceEncaisseSQLInjector(rootSociete);
new EcheanceRegleSQLInjector(rootSociete);
new BrFactureAchatSQLInjector(rootSociete);
1181,7 → 1134,7
if (getRootSociete().getTable("CLIENT").getFieldsName().contains("LOCALISATION")) {
showAs.show("CLIENT", "NOM", "LOCALISATION");
} else {
SQLPreferences prefs = new SQLPreferences(root);
SQLPreferences prefs = SQLPreferences.getMemCached(root);
if (prefs.getBoolean(GestionClientPreferencePanel.DISPLAY_CLIENT_PCE, false)) {
showAs.show("CLIENT", "ID_PAYS", "GROUPE", "NOM", "ID_COMPTE_PCE");
} else {
1227,12 → 1180,14
final List<String> lEchFact = new ArrayList<String>();
lEchFact.add("NUMERO");
lEchFact.add("DATE");
lEchFact.add("ID_MODE_REGLEMENT");
lEchFact.add("ID_COMMERCIAL");
SQLTable tableEch = root.getTable("ECHEANCE_CLIENT");
showAs.show(tableEch.getField("ID_SAISIE_VENTE_FACTURE"), lEchFact);
 
showAs.show("ECHEANCE_FOURNISSEUR", SQLRow.toList("ID_FOURNISSEUR,ID_MOUVEMENT"));
showAs.show("FICHE_PAYE", SQLRow.toList("ID_MOIS,ANNEE"));
showAs.show("FICHE_PAYE", SQLRow.toList("ID_MOIS,ANNEE,ID_PROFIL_PAYE"));
 
showAs.show("FOURNISSEUR", "NOM");
 
showAs.show("IDCC", "NOM");
1305,6 → 1260,16
public void setUpSocieteDataBaseConnexion(int base) {
final String customerName = setUpSocieteStructure(base);
final DBRoot rootSociete = this.getRootSociete();
 
try {
// create table if necessary
SQLPreferences.getPrefTable(rootSociete);
SQLPreferences.startMemCached(rootSociete);
} catch (Exception e) {
// don't die now, we might not need them
ExceptionHandler.handle("Impossible d'accéder aux préférences", e);
}
 
closeSocieteConnexion();
setSocieteDirectory();
NumerotationAutoSQLElement.addListeners();
1318,15 → 1283,6
// Prefetch undefined
rootSociete.getTables().iterator().next().getUndefinedID();
 
try {
// create table if necessary
SQLPreferences.getPrefTable(rootSociete);
SQLPreferences.startMemCached(rootSociete);
} catch (Exception e) {
// don't die now, we might not need them
ExceptionHandler.handle("Impossible d'accéder aux préférences", e);
}
 
this.getModuleManager().addFactories(Gestion.MODULES_DIR);
this.getModuleManager().setup(this.getRootSociete(), this);
}
1337,9 → 1293,7
 
public void setupBarCodeIfNeeded() {
final DBRoot rootSociete = this.getRootSociete();
 
// TODO check is the SQLPreferences returned by startMemCached() can be used
SQLPreferences pref = new SQLPreferences(rootSociete);
SQLPreferences pref = SQLPreferences.getMemCached(rootSociete);
if (pref.getBoolean(GestionCommercialeGlobalPreferencePanel.BARCODE_INSERTION, false)) {
this.barcodeReader = new BarcodeReader(80);
this.barcodeReader.start();
/trunk/OpenConcerto/src/org/openconcerto/erp/config/DefaultMenuConfiguration.java
28,6 → 28,7
import org.openconcerto.erp.core.customerrelationship.customer.action.ListeDesDepartementsClientsAction;
import org.openconcerto.erp.core.customerrelationship.customer.action.NouvelHistoriqueListeClientAction;
import org.openconcerto.erp.core.customerrelationship.mail.action.ListeDesCourriersClientsAction;
import org.openconcerto.erp.core.customerrelationship.mail.action.ListeDesModelesEmailAction;
import org.openconcerto.erp.core.finance.accounting.action.BalanceAgeeAction;
import org.openconcerto.erp.core.finance.accounting.action.CompteResultatBilanAction;
import org.openconcerto.erp.core.finance.accounting.action.EtatBalanceAction;
68,6 → 69,7
import org.openconcerto.erp.core.finance.payment.action.NouveauDecaissementChequeAvoirAction;
import org.openconcerto.erp.core.finance.payment.action.NouveauListeDesChequesADecaisserAction;
import org.openconcerto.erp.core.finance.payment.action.NouveauListeDesChequesAEncaisserAction;
import org.openconcerto.erp.core.finance.payment.element.EncaisserMontantSQLElement;
import org.openconcerto.erp.core.finance.tax.action.ReportingEcoContributionPanel;
import org.openconcerto.erp.core.finance.tax.action.ReportingTaxeComplementairePanel;
import org.openconcerto.erp.core.humanresources.ListeDesContactsAdministratif;
92,6 → 94,7
import org.openconcerto.erp.core.reports.stat.action.EvolutionCmdAction;
import org.openconcerto.erp.core.reports.stat.action.EvolutionCmdCumulAction;
import org.openconcerto.erp.core.reports.stat.action.EvolutionMargeAction;
import org.openconcerto.erp.core.reports.stat.action.ReportingCommercialAction;
import org.openconcerto.erp.core.reports.stat.action.VenteArticleFamilleGraphAction;
import org.openconcerto.erp.core.reports.stat.action.VenteArticleGraphAction;
import org.openconcerto.erp.core.reports.stat.action.VenteArticleMargeGraphAction;
101,6 → 104,7
import org.openconcerto.erp.core.sales.invoice.action.GenEtatStockAction;
import org.openconcerto.erp.core.sales.invoice.action.GenListeVenteAction;
import org.openconcerto.erp.core.sales.invoice.action.GenReportingVenteAction;
import org.openconcerto.erp.core.sales.invoice.action.ImportReglementSageAction;
import org.openconcerto.erp.core.sales.invoice.action.ListeDebiteursAction;
import org.openconcerto.erp.core.sales.invoice.action.ListeDesElementsFactureAction;
import org.openconcerto.erp.core.sales.invoice.action.ListeDesFactureItemsAction;
121,6 → 125,7
import org.openconcerto.erp.core.sales.product.action.ListeDesArticlesAction;
import org.openconcerto.erp.core.sales.product.action.ListeEcoContributionAction;
import org.openconcerto.erp.core.sales.product.action.ListeHistoCodeClientArticleAction;
import org.openconcerto.erp.core.sales.product.action.TransfertStockAction;
import org.openconcerto.erp.core.sales.quote.action.ListeDesDevisAction;
import org.openconcerto.erp.core.sales.quote.action.ListeDesDevisActionTCP;
import org.openconcerto.erp.core.sales.quote.action.ListeDesElementsDevisAction;
294,6 → 299,7
supplierGroup.addItem("supplier.credit.create");
group.addItem("stock.io.create");
}
group.addItem("product.stock.transfert");
 
return group;
}
328,7 → 334,7
gUser.addItem("user.task.right");
group.add(gUser);
}
 
group.addItem("email.template.list");
group.addItem("product.ecotax");
group.addItem("office.contact.list");
group.addItem("salesman.list");
414,6 → 420,7
group.addItem("sales.list.reporting");
group.addItem("order.list.reporting");
group.addItem("sales.list.report");
group.addItem("sales.list.salesman.report");
group.addItem("sales.product.graph");
group.addItem("sales.product.margin.graph");
group.addItem("sales.product.family.graph");
599,6 → 606,7
mManager.putAction(new NouveauSaisieVenteFactureAction(conf), "customer.invoice.create");
 
mManager.putAction(new NouveauAvoirClientAction(conf), "customer.credit.create");
mManager.putAction(new TransfertStockAction(conf), "product.stock.transfert");
 
if (rights.haveRight(NXRights.LOCK_MENU_ACHAT.getCode())) {
mManager.putAction(new NouvelleDemandePrixAction(conf), "supplier.order.ask.create");
710,8 → 718,8
}
 
public void registerStatsMenuActions(final MenuAndActions mManager) {
final ComptaPropsConfiguration conf = getConfiguration();
 
 
mManager.putAction(new EvolutionCAAction(), "sales.graph");
mManager.putAction(new EvolutionCACumulAction(), "sales.graph.cumulate");
 
718,6 → 726,8
mManager.putAction(new EvolutionCmdAction(), "sales.graph.cmd");
mManager.putAction(new EvolutionCmdCumulAction(), "sales.graph.cmd.cumulate");
 
mManager.putAction(new ReportingCommercialAction(conf.getRootSociete()), "sales.list.salesman.report");
 
mManager.putAction(new EvolutionMargeAction(), "sales.margin.graph");
mManager.putAction(new GenReportingVenteAction(false), "sales.list.reporting");
mManager.putAction(new GenReportingVenteAction(true), "order.list.reporting");
763,6 → 773,7
 
if (rights.haveRight(NXRights.GESTION_ENCAISSEMENT.getCode())) {
mManager.putAction(new ListesFacturesClientsImpayeesAction(), "customer.invoice.unpaid.list");
mManager.putAction(new ImportReglementSageAction(conf.getDirectory().getElement(EncaisserMontantSQLElement.class)), "customer.invoice.payment.xml.sage.import");
mManager.putAction(new ListeDebiteursAction(), "customer.dept.list");
mManager.putAction(new AbstractAction("Relevé client") {
@Override
839,7 → 850,7
mManager.putAction(new GestionDroitsAction(), "user.right.list");
mManager.putAction(new TaskAdminAction(), "user.task.right");
}
 
mManager.putAction(new ListeDesModelesEmailAction(), "email.template.list");
mManager.putAction(new ListeDesContactsAdministratif(), "office.contact.list");
mManager.putAction(new ListeDesCommerciauxAction(), "salesman.list");
mManager.putAction(new ListeDesCaissesTicketAction(), "pos.list");
/trunk/OpenConcerto/src/org/openconcerto/erp/config/translation_fr.xml
178,8 → 178,9
<action id="sales.quote.clone" label="Créer à partir de" />
<action id="sales.quote.create.customer.order" label="Transfert vers commande client" />
<action id="sales.quote.create.customer.delivery" label="Transfert vers bon de livraison" />
<action id="sales.quote.accept.create.customer.order" label="Marquer comme accepté et Transfert en commande client" />
 
<action id="sales.quote.accept.create.customer.order"
label="Marquer comme accepté et Transfert en commande client" />
<!-- Customer -->
<action id="customerrelationship.customer.label.print" label="Imprimer l'étiquette client" />
<action id="customerrelationship.customer.info.create" label="Créer la fiche client" />
220,6 → 221,7
<action id="supplychain.order.create.purchase" label="Transfert vers saisie achat" />
<action id="supplychain.order.valid" label="Marquer comme validée" />
<action id="supplychain.order.create.receipt" label="Transfert vers bon de réception" />
<action id="supplychain.invoice.clone" label="Créer à partir de" />
 
<!-- Customer order -->
<action id="sales.order.create.deliverynote" label="Transfert vers bon de livraison" />
247,9 → 249,9
<item id="customerrelationship.customer.identifier" label="Code" />
<item id="customerrelationship.customer.date" label="Date" />
<item id="customerrelationship.customer.customproduct" label="Réf. Art. Interne" />
<item id="customerrelationship.customer.customtarif" label="Remises client" />
 
 
 
<!-- Currency -->
<item id="currency.USD" label="Dollar américain" />
<item id="currency.EUR" label="Euro" />
290,7 → 292,7
<item id="autres.contributions.ligne" label="Autres contributions dues par l'employeur" />
<item id="csg.nonimp.ligne" label="CSG non imposable à l'impôt sur le revenu" />
<item id="csg.imp.ligne" label="CSG/CRDS imposable à l'impôt sur le revenu" />
<item id="allegement.cotisations.ligne" label="Exonération de cotisations employeur" />
<item id="allegement.cotisations.ligne" label="Allégement de cotisation" />
<item id="paye.simplifie.ignore" label="Ligne ignorée" />
 
<!-- Groupe Paye Simplifiée -->
305,6 → 307,6
<item id="cotisations.convention" label="COTISATIONS DE CONVENTION COLLECTIVE OU STATUAIRES" />
<item id="csg.nonimp" label="CSG/CRDS déductible de l'impôt sur le revenu" />
<item id="csg.imp" label="CSG/CRDS non déductible à l'impôt sur le revenu" />
<item id="allegement" label="Exonération de cotisations employeur" />
 
<item id="allegement" label="Allégement de cotisation" />
<action id="email" label="Email" />
</translation>
/trunk/OpenConcerto/src/org/openconcerto/erp/config/mappingCompta_fr.xml
1,5 → 1,11
<?xml version="1.0" encoding="UTF-8" ?>
<ROOT>
<element refid="sales.customer.product.qty.price" nameClass="masculine" name="tarif client">
<FIELD name="QUANTITE" label="Quantité" />
<FIELD name="ID_ARTICLE" label="Article" />
<FIELD name="ID_CLIENT" label="Client" />
<FIELD name="POURCENT_REMISE" label="% remise" />
</element>
<element refid="humanresources.payroll.advance" nameClass="masculine" name="acompte">
<FIELD name="ID_SALARIE" label="Salarié" />
<FIELD name="MONTANT" label="Montant" />
241,6 → 247,7
<element refid="sales.credit.note" nameClass="feminine" name="facture d'avoir" namePlural="factures d'avoir">
<FIELD name="ID_ADRESSE" label="Adresse fact. spéc." />
<FIELD name="ID_ADRESSE_LIVRAISON" label="Adresse livr. spéc." />
<FIELD name="ID_CATEGORIE_COMPTABLE" label="Cat. comptable spéc." />
<FIELD name="ID_CLIENT_DEPARTEMENT" label="Service" />
<FIELD name="ID_SECRETAIRE" label="Secrétaire" />
<FIELD name="ID_ECHEANCIER_CCI" label="Echeancier CCI" />
386,7 → 393,7
<FIELD name="DATE_NAISSANCE" label="Date de naissance" />
</element>
<element refid="bank" nameClass="feminine" name="banque">
<FIELD name="NOM" label="Nom" />
<FIELD name="NOM" label="Banque" />
<FIELD name="NUMERO_RUE" label="Numéro de rue" />
<FIELD name="VOIE" label="Voie" />
<FIELD name="RUE" label="Rue" />
473,6 → 480,7
<FIELD name="FRAIS_DOCUMENT_HT" label="Frais de document HT" />
<FIELD name="ID_ADRESSE" label="Adresse fact. spéc." />
<FIELD name="ID_ADRESSE_LIVRAISON" label="Adresse livr. spéc." />
<FIELD name="ID_CATEGORIE_COMPTABLE" label="Cat. comptable spéc." />
<FIELD name="ID_CLIENT_DEPARTEMENT" label="Service" />
<FIELD name="ID_CONTACT" label="Contact" />
<FIELD name="ID_TARIF" label="Tarif à appliquer" />
834,6 → 842,25
<FIELD name="FONCTION" label="Fonction" />
<FIELD name="N4DS" label="Contact pour la N4DS" />
</element>
<element refid="CONTACT_SALARIE" nameClass="masculine" name="contact salarié">
<FIELD name="PRENOM" label="Prénom du contact" />
<FIELD name="NOM" label="Nom du contact" />
<FIELD name="ID_TITRE_PERSONNEL" label="Titre" />
<FIELD name="TEL_DIRECT" label="Téléphone" />
<FIELD name="TEL_PERSONEL" label="Téléphone Personnel" />
<FIELD name="TEL_STANDARD" label="Téléphone du standard" />
<FIELD name="TEL_MOBILE" label="Portable" />
<FIELD name="EMAIL" label="Mail" />
<FIELD name="FAX" label="Fax" />
<FIELD name="FONCTION" label="Lien de parenté" />
<FIELD name="ID_SALARIE" label="Salarié" />
<FIELD name="NO_MAILING" label="Pas de mailing" />
<FIELD name="TYPE" label="Type" />
<FIELD name="SERVICE" label="Service" />
<FIELD name="PAYS" label="Pays" />
<FIELD name="ID_ADRESSE" label="Adresse" />
<FIELD name="DATE_NAISSANCE" label="Date de naissance" />
</element>
<element refid="humanresources.payroll.anticipation.contract" nameClass="masculine"
name="contrat de prévoyance, mutuelle, formation" namePlural="contrats de prévoyance, mutuelle, formation">
<FIELD name="REFERENCE" label="Référence du contrat de Prévoyance (S21.G00.15.001)" />
880,6 → 907,7
<element refid="humanresources.payroll.contract.employe" nameClass="masculine" name="contrat salarié"
namePlural="contrats salariés">
<FIELD name="NATURE" label="Nature de l'emploi (*)" titlelabel="Nature de l'emploi" />
<FIELD name="COMPLEMENT_PCS" label="Code complément PCS-ESE" />
<FIELD name="ID_CODE_EMPLOI" label="Catégorie socioprofessionnelle "
titlelabel="Code Catégorie socioprofessionnelle" />
<FIELD name="ID_CODE_CONTRAT_TRAVAIL" label="Contrat de travail" titlelabel="Code contrat" />
989,6 → 1017,7
<FIELD name="DATE_LIVRAISON_PREV" label="Livraison prévue le" />
<FIELD name="ID_ADRESSE" label="Adresse fact. spéc." />
<FIELD name="ID_ADRESSE_LIVRAISON" label="Adresse livr. spéc." />
<FIELD name="ID_CATEGORIE_COMPTABLE" label="Cat. comptable spéc." />
<FIELD name="ID_CLIENT_DEPARTEMENT" label="Service" />
<FIELD name="ACOMPTE_COMMANDE" label="Acompte" />
<FIELD name="ID_CONTACT" label="Contact" />
1276,6 → 1305,7
<FIELD name="ID_CLIENT_DEPARTEMENT" label="Service" />
<FIELD name="ID_ADRESSE" label="Adresse fact. spéc." />
<FIELD name="ID_ADRESSE_LIVRAISON" label="Adresse livr. spéc." />
<FIELD name="ID_CATEGORIE_COMPTABLE" label="Cat. comptable spéc." />
<FIELD name="CONTACT_MAIL_RAPPORT" label="Email dest. suppl." />
<FIELD name="SITE_DIFF" label="Site d'intervention différent du donneur d'ordre" />
<FIELD name="DESIGNATION_SITE" label="Désignation du site" />
1578,6 → 1608,7
</element>
<element refid="supplychain.order.invoice.purchase" nameClass="feminine" name="facture fournisseur"
namePlural="factures fournisseur">
<FIELD name="TVA_ADJUSTMENT" label="Ajustement de TVA" />
<FIELD name="ID_AVOIR_FOURNISSEUR" label="Avoir" />
<FIELD name="NET_A_PAYER" label="Net à payer" />
<FIELD name="ID_TAXE_PORT" label="Taxe sur port" />
1607,6 → 1638,7
</element>
<element refid="supplychain.orderinvoice.purchase.item" nameClass="masculine" name="élément de facture"
namePlural="éléments de facture">
<FIELD name="ID_COMPTE_PCE" label="Compte charge spécifique" />
<FIELD name="ID_DEPOT_STOCK" label="Dépôt Stock" />
<FIELD name="ID_ECO_CONTRIBUTION" label="Code Eco-Contrib." />
<FIELD name="ECO_CONTRIBUTION" label="Dont Eco-Contrib." />
1814,6 → 1846,7
<FIELD name="DATE_SORTIE" label="Date de sortie" />
<FIELD name="CODE_AT" label="Code AT" />
<FIELD name="CODE_SECTION_AT" label="Code section AT" />
<FIELD name="DUREE_FORFAIT" label="Durée du forfait" />
</element>
<element refid="finance.accounting.book" nameClass="masculine" name="journal">
<FIELD name="NOM" label="Journal" />
2217,6 → 2250,7
<FIELD name="TOTAL_TIMBRE_FISCAL" label="Total timbre" />
<FIELD name="ID_CLIENT_DEPARTEMENT" label="Service" />
<FIELD name="ID_ADRESSE_LIVRAISON" label="Adresse livr. spéc." />
<FIELD name="ID_CATEGORIE_COMPTABLE" label="Cat. comptable spéc." />
<FIELD name="ID_COMPTE_PCE_VENTE" label="Compte vente" />
<FIELD name="ID_ADRESSE" label="Adresse spécifique" />
<FIELD name="T_HA" label="Total achat" />
2269,6 → 2303,7
</element>
<element refid="sales.invoice.item" nameClass="masculine" name="article facturé" namePlural="articles facturés">
<FIELD name="ID_DEPOT_STOCK" label="Dépôt Stock" />
<FIELD name="ID_COMPTE_PCE" label="Compte vente spécifique" />
<FIELD name="ID_ECO_CONTRIBUTION" label="Code Eco-Contrib." />
<FIELD name="ECO_CONTRIBUTION" label="Dont Eco-Contrib." />
<FIELD name="T_ECO_CONTRIBUTION" label="Total Eco-Contrib." />
2352,6 → 2387,7
<FIELD name="NOM" label="Nom (*)" titlelabel="Nom" />
<FIELD name="PRENOM" label="Prénom (*)" titlelabel="Prénom" />
<FIELD name="ID_TITRE_PERSONNEL" label="Titre (*)" titlelabel="Titre" />
<FIELD name="ID_USER_COMMON" label="Utilisateur associé" titlelabel="Utilisateur associé" />
<FIELD name="CODE" label="Code (*)" titlelabel="Code" />
<FIELD name="NOM_JEUNE_FILLE" label="Nom de jeune fille" titlelabel="Nom jeune fille" />
<FIELD name="ID_ETAT_CIVIL" label="Etat civil" />
2496,4 → 2532,12
<FIELD name="ControlSum" label="Total des prélèvements" />
<FIELD name="XML" label="Message XML" />
</element>
<element refid="customerrelationship.mail.email.template" nameClass="masculine" name="modèle d'email"
namePlural="modèles d'email">
<FIELD name="NOM" label="Nom du modèle" />
<FIELD name="TITRE" label="Titre" />
<FIELD name="TEXTE" label="Texte" />
<FIELD name="FORMAT_DATE" label="Format de date" />
<FIELD name="PAR_DEFAUT" label="Par défaut" />
</element>
</ROOT>
/trunk/OpenConcerto/src/org/openconcerto/erp/config/translation_pl.xml
193,6 → 193,7
<!-- Supplier order -->
<action id="supplychain.order.create.purchase" label="Transfer do zakupów" />
<action id="supplychain.order.create.receipt" label="Transfer do zamówienia" />
<action id="supplychain.invoice.clone" label="Kopiuj z" />
 
<!-- Customer order -->
<action id="sales.order.create.deliverynote" label="Transfer WZ" />
/trunk/OpenConcerto/src/org/openconcerto/erp/config/Gestion.java
51,6 → 51,7
import org.openconcerto.utils.FileUtils;
import org.openconcerto.utils.ThrowableHandler;
import org.openconcerto.utils.protocol.Helper;
import org.openconcerto.xml.FastXMLProperties;
 
import java.awt.AWTEvent;
import java.awt.Component;
204,6 → 205,9
}
 
public static void main(String[] args) {
System.setProperty("org.xml.sax.driver", "com.bluecast.xml.Piccolo");
System.setProperty("org.xml.sax.parser", "com.bluecast.xml.Piccolo");
System.setProperty("javax.xml.parsers.SAXParserFactory", "com.bluecast.xml.JAXPSAXParserFactory");
ComptaPropsConfiguration.checkJava();
// Check MacOS Sandbox
String cwd = new File(getProperty("user.dir")).toURI().toString();
410,7 → 414,7
 
if (fTOS.exists()) {
try {
pTOS.loadFromXML(new FileInputStream(fTOS));
FastXMLProperties.load(pTOS, new FileInputStream(fTOS));
} catch (Exception e1) {
e1.printStackTrace();
}
578,7 → 582,7
private static void saveProperties(File fTOS, Properties pTOS) {
try {
final FileOutputStream outputStream = new FileOutputStream(fTOS);
pTOS.storeToXML(outputStream, "tos", "UTF-8");
FastXMLProperties.store(pTOS, outputStream, "tos");
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
593,7 → 597,7
public boolean handle(String message, Throwable throwable) {
if (throwable == null)
return false;
 
throwable.printStackTrace();
final ByteArrayOutputStream out = new ByteArrayOutputStream();
throwable.printStackTrace(new PrintStream(out));
String s = new String(out.toByteArray());
634,7 → 638,7
return true;
}
 
else if (s.contains("No application is associated with the specified file for this operation")) {
else if (s.contains("No application is associated with the specified file for this operation") || s.contains("Error message: Package could not be registered")) {
JOptionPane.showMessageDialog(null, "Merci d'installer LibreOffice ou tout autre application succeptible d'ouvrir ce fichier");
return true;
} else if (s.contains("java.net.SocketTimeoutException: connect timed out")) {
/trunk/OpenConcerto/src/org/openconcerto/erp/config/translation_en.xml
196,7 → 196,8
<!-- Supplier order -->
<action id="supplychain.order.create.purchase" label="Transfer to purchase" />
<action id="supplychain.order.create.receipt" label="Transfer to supplier receipt" />
 
<action id="supplychain.invoice.clone" label="Copy from" />
<!-- Customer order -->
<action id="sales.order.create.deliverynote" label="Transfer to delivey note" />
<action id="sales.order.create.invoice" label="Transfer to invoice" />
397,5 → 398,5
<item id="product.bom.expose" label="Expose BOM" />
<item id="product.bom.flat" label="Flat BOM" />
 
 
<action id="email" label="Email" />
</translation>
/trunk/OpenConcerto/src/org/openconcerto/erp/config/mapping_fr.xml
1,5 → 1,15
<?xml version="1.0" encoding="UTF-8" ?>
<ROOT>
 
<element refid="sales.customer.product.qty.price" nameClass="masculine" name="tarif client">
<FIELD name="QUANTITE" label="Quantité" />
<FIELD name="ID_ARTICLE" label="Article" />
<FIELD name="ID_CLIENT" label="Client" />
<FIELD name="POURCENT_REMISE" label="% remise" />
</element>
 
 
 
<element refid="common.address" nameClass="feminine" name="adresse">
<FIELD name="RAISON_SOCIALE" label="Raison sociale" />
<FIELD name="RUE" label="Rue" />
266,4 → 276,6
<FIELD name="FORMULE" label="Formule" />
<FIELD name="INFOS" label="Description" />
</element>
 
</ROOT>
/trunk/OpenConcerto/src/org/openconcerto/erp/config/update/Updater_1_5.java
15,6 → 15,7
 
import org.openconcerto.erp.config.InstallationPanel;
import org.openconcerto.erp.core.common.ui.AbstractVenteArticleItemTable;
import org.openconcerto.erp.core.customerrelationship.mail.EmailTemplateSQLElement;
import org.openconcerto.erp.core.finance.payment.element.SDDMessageSQLElement;
import org.openconcerto.erp.core.finance.payment.element.SEPAMandateSQLElement;
import org.openconcerto.erp.core.finance.payment.element.TypeReglementSQLElement;
23,6 → 24,7
import org.openconcerto.erp.core.sales.pos.element.TicketCaisseSQLElement;
import org.openconcerto.erp.core.sales.product.element.ReferenceArticleSQLElement;
import org.openconcerto.erp.core.sales.quote.element.DevisLogMailSQLElement;
import org.openconcerto.erp.core.supplychain.stock.element.ComposedItemStockUpdater;
import org.openconcerto.erp.core.supplychain.stock.element.DepotStockSQLElement;
import org.openconcerto.erp.core.supplychain.stock.element.StockItem;
import org.openconcerto.sql.changer.convert.AddMDFields;
37,6 → 39,7
import org.openconcerto.sql.model.SQLSyntax;
import org.openconcerto.sql.model.SQLSystem;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.SQLTable.Index;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.sql.request.UpdateBuilder;
58,6 → 61,7
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.prefs.BackingStoreException;
 
import org.apache.commons.dbutils.handlers.ArrayListHandler;
1790,6 → 1794,14
root.refetchTable("VARIABLE_SALARIE");
root.getSchema().updateVersion();
}
SQLTable tableBL = root.getTable("BON_DE_LIVRAISON");
if (!tableBL.contains("ID_COMMERCIAL")) {
final AlterTable alterB = new AlterTable(tableBL);
alterB.addForeignColumn("ID_COMMERCIAL", root.getTable("COMMERCIAL"));
root.getBase().getDataSource().execute(alterB.asString());
root.refetchTable("BON_DE_LIVRAISON");
root.getSchema().updateVersion();
}
 
// fix stock
{
1857,17 → 1869,151
}
}
 
// Tarification client par quantite
if (root.getTable("TARIF_ARTICLE_CLIENT") == null) {
final SQLCreateTable createTableQtyTarif = new SQLCreateTable(root, "TARIF_ARTICLE_CLIENT");
createTableQtyTarif.addForeignColumn("ID_ARTICLE", root.getTable("ARTICLE"));
createTableQtyTarif.addForeignColumn("ID_CLIENT", root.getTable("CLIENT"));
createTableQtyTarif.addDecimalColumn("QUANTITE", 16, 3, BigDecimal.ONE, false);
createTableQtyTarif.addDecimalColumn("POURCENT_REMISE", 16, 3, null, true);
// createTableQtyTarif.addDecimalColumn("PRIX_METRIQUE_VT_1", 16, 6, null, true);
try {
root.getBase().getDataSource().execute(createTableQtyTarif.asString());
InstallationPanel.insertUndef(createTableQtyTarif);
root.refetchTable("TARIF_ARTICLE_CLIENT");
root.getSchema().updateVersion();
} catch (SQLException ex) {
throw new IllegalStateException("Erreur lors de la création de la table " + "TARIF_QUANTITE", ex);
}
}
 
SQLTable tableTrCmd = root.getTable("TR_COMMANDE");
if (!tableTrCmd.contains("ID_FACTURE_FOURNISSEUR")) {
AlterTable t = new AlterTable(tableTrCmd);
t.addForeignColumn("ID_FACTURE_FOURNISSEUR", root.getTable("FACTURE_FOURNISSEUR"));
tableTrCmd.getBase().getDataSource().execute(t.asString());
root.refetchTable(tableTrCmd.getName());
root.getSchema().updateVersion();
}
 
SQLTable tableContrat = root.getTable("CONTRAT_SALARIE");
if (!tableContrat.contains("COMPLEMENT_PCS")) {
AlterTable t = new AlterTable(tableContrat);
t.addVarCharColumn("COMPLEMENT_PCS", 54);
tableContrat.getBase().getDataSource().execute(t.asString());
root.refetchTable(tableContrat.getName());
root.getSchema().updateVersion();
}
 
List<String> tablesCatComptable = Arrays.asList("DEVIS", "COMMANDE_CLIENT", "BON_DE_LIVRAISON", "SAISIE_VENTE_FACTURE", "AVOIR_CLIENT");
for (String tableToUp : tablesCatComptable) {
final SQLTable tableCatComptToAdd = root.getTable(tableToUp);
if (!tableCatComptToAdd.contains("ID_CATEGORIE_COMPTABLE")) {
final AlterTable alter = new AlterTable(tableCatComptToAdd);
alter.addForeignColumn("ID_CATEGORIE_COMPTABLE", root.getTable("CATEGORIE_COMPTABLE"));
exec(alter);
root.refetchTable(tableToUp);
root.getSchema().updateVersion();
}
}
 
 
// Modèles pour les emails
if (!root.contains(EmailTemplateSQLElement.TABLE_NAME)) {
final SQLCreateTable createTable = new SQLCreateTable(root, EmailTemplateSQLElement.TABLE_NAME);
createTable.addVarCharColumn("NOM", 80);
createTable.addVarCharColumn("TITRE", 80);
createTable.addVarCharColumn("TEXTE", 4096);
createTable.addVarCharColumn("FORMAT_DATE", 20);
createTable.addBooleanColumn("PAR_DEFAUT", Boolean.FALSE, false);
try {
root.getBase().getDataSource().execute(createTable.asString());
InstallationPanel.insertUndef(createTable);
root.refetchTable(EmailTemplateSQLElement.TABLE_NAME);
root.getSchema().updateVersion();
} catch (SQLException ex) {
throw new IllegalStateException("Erreur lors de la création de la table " + EmailTemplateSQLElement.TABLE_NAME, ex);
}
}
// Force undefined policy to inDb
root.setMetadata(SQLTable.UNDEFINED_ID_POLICY, "inDB");
final Map<String, Number> mapTableNameUndefined = SQLTable.getUndefIDs(root.getSchema());
final Set<String> tables = root.getSchema().getTableNames();
for (String tName : tables) {
if (!mapTableNameUndefined.containsKey(tName)) {
System.err.println("Updater_1_5.update() adding undefined in db for " + tName);
SQLTable.setUndefID(root.getSchema(), tName, null);
}
}
 
// Création de la table Modéle
if (!root.contains("CONTACT_SALARIE")) {
 
SQLCreateTable createModele = new SQLCreateTable(root, "CONTACT_SALARIE");
createModele.addVarCharColumn("NOM", 256);
createModele.addVarCharColumn("PRENOM", 256);
createModele.addVarCharColumn("TEL_DIRECT", 256);
createModele.addVarCharColumn("TEL_MOBILE", 256);
createModele.addVarCharColumn("EMAIL", 256);
createModele.addVarCharColumn("FAX", 256);
createModele.addVarCharColumn("FONCTION", 256);
createModele.addVarCharColumn("TEL_PERSONEL", 256);
createModele.addVarCharColumn("TEL_STANDARD", 256);
createModele.addForeignColumn("ID_TITRE_PERSONNEL", root.findTable("TITRE_PERSONNEL"));
createModele.addForeignColumn("ID_SALARIE", root.findTable("SALARIE"));
 
try {
root.getBase().getDataSource().execute(createModele.asString());
root.refetchTable("CONTACT_SALARIE");
SQLRowValues rowVals = new SQLRowValues(root.getTable("CONTACT_SALARIE"));
SQLRow rowInserted = rowVals.commit();
SQLTable.setUndefID(root.getSchema(), "CONTACT_SALARIE", rowInserted.getID());
tableDevis.getSchema().updateVersion();
} catch (SQLException ex) {
throw new IllegalStateException("Erreur lors de la création de la table MODELE", ex);
}
}
 
final SQLTable tableRgltPaye = root.getTable("REGLEMENT_PAYE");
if (!tableRgltPaye.contains("IBAN")) {
final AlterTable alter = new AlterTable(tableRgltPaye);
alter.addVarCharColumn("IBAN", 128);
exec(alter);
root.refetchTable(tableRgltPaye.getName());
root.getSchema().updateVersion();
}
if (!tableRgltPaye.contains("BIC")) {
final AlterTable alter = new AlterTable(tableRgltPaye);
alter.addVarCharColumn("BIC", 40);
exec(alter);
root.refetchTable(tableRgltPaye.getName());
root.getSchema().updateVersion();
}
final SQLTable tableSalarie = root.getTable("SALARIE");
if (!tableSalarie.contains("ID_USER_COMMON")) {
final AlterTable alter = new AlterTable(tableSalarie);
alter.addForeignColumn("ID_USER_COMMON", root.findTable("USER_COMMON"));
exec(alter);
root.refetchTable(tableSalarie.getName());
root.getSchema().updateVersion();
}
 
final SQLTable tableInfosSalarie = root.getTable("INFOS_SALARIE_PAYE");
if (!tableInfosSalarie.contains("DUREE_FORFAIT")) {
final AlterTable alter = new AlterTable(tableInfosSalarie);
alter.addColumn("DUREE_FORFAIT", "real");
exec(alter);
root.refetchTable(tableSalarie.getName());
root.getSchema().updateVersion();
}
 
}
 
public static void initStock(SQLRow row) {
SQLSelect sel = new SQLSelect();
sel.addSelectStar(row.getTable().getTable("DEPOT_STOCK"));
List<SQLRow> rowsDepot = SQLRowListRSH.execute(sel);
public static void initStock(SQLRow rowArticle, int idDepot) {
 
SQLSelect selStock = new SQLSelect();
selStock.addSelectStar(row.getTable().getTable("STOCK"));
selStock.setWhere(new Where(row.getTable().getTable("STOCK").getField("ID_ARTICLE"), "=", row.getID()));
selStock.addSelectStar(rowArticle.getTable().getTable("STOCK"));
selStock.setWhere(new Where(rowArticle.getTable().getTable("STOCK").getField("ID_ARTICLE"), "=", rowArticle.getID()));
List<SQLRow> rowsStock = SQLRowListRSH.execute(selStock);
Map<Integer, SQLRow> initedDepot = new HashMap<>();
for (SQLRow sqlRow : rowsStock) {
1875,47 → 2021,51
}
 
List<StockItem> stockItems = new ArrayList<StockItem>();
for (SQLRow sqlRow : rowsDepot) {
try {
if (!initedDepot.keySet().contains(sqlRow.getID())) {
SQLRowValues rowVals = new SQLRowValues(row.getTable().getTable("STOCK"));
rowVals.put("ID_ARTICLE", row.getID());
rowVals.put("ID_DEPOT_STOCK", sqlRow.getID());
try {
if (!initedDepot.keySet().contains(idDepot)) {
SQLRowValues rowVals = new SQLRowValues(rowArticle.getTable().getTable("STOCK"));
rowVals.put("ID_ARTICLE", rowArticle.getID());
rowVals.put("ID_DEPOT_STOCK", idDepot);
 
SQLRow rowStock = rowVals.commit();
if ((row.getObject("ID_DEPOT_STOCK") == null || row.isForeignEmpty("ID_DEPOT_STOCK")) && sqlRow.getID() == DepotStockSQLElement.DEFAULT_ID) {
row.createEmptyUpdateRow().put("ID_STOCK", rowStock.getID()).put("ID_DEPOT_STOCK", DepotStockSQLElement.DEFAULT_ID).commit();
} else if (sqlRow.getID() == row.getForeignID("ID_DEPOT_STOCK")) {
row.createEmptyUpdateRow().put("ID_STOCK", rowStock.getID()).commit();
}
stockItems.add(new StockItem(row, rowStock));
SQLRow rowStock = rowVals.commit();
if ((rowArticle.getObject("ID_DEPOT_STOCK") == null || rowArticle.isForeignEmpty("ID_DEPOT_STOCK")) && idDepot == DepotStockSQLElement.DEFAULT_ID) {
rowArticle.createEmptyUpdateRow().put("ID_STOCK", rowStock.getID()).put("ID_DEPOT_STOCK", DepotStockSQLElement.DEFAULT_ID).commit();
} else if (idDepot == rowArticle.getForeignID("ID_DEPOT_STOCK")) {
rowArticle.createEmptyUpdateRow().put("ID_STOCK", rowStock.getID()).commit();
}
stockItems.add(new StockItem(rowArticle, rowStock));
 
} else {
SQLRow rowExisting = initedDepot.get(sqlRow.getID());
if ((row.getObject("ID_DEPOT_STOCK") == null || row.isForeignEmpty("ID_DEPOT_STOCK")) && sqlRow.getID() == DepotStockSQLElement.DEFAULT_ID) {
row.createEmptyUpdateRow().put("ID_STOCK", rowExisting.getID()).put("ID_DEPOT_STOCK", DepotStockSQLElement.DEFAULT_ID).commit();
} else if (sqlRow.getID() == row.getForeignID("ID_DEPOT_STOCK")) {
row.createEmptyUpdateRow().put("ID_STOCK", rowExisting.getID()).commit();
}
stockItems.add(new StockItem(row, rowExisting));
} else {
SQLRow rowExisting = initedDepot.get(idDepot);
if ((rowArticle.getObject("ID_DEPOT_STOCK") == null || rowArticle.isForeignEmpty("ID_DEPOT_STOCK")) && idDepot == DepotStockSQLElement.DEFAULT_ID) {
rowArticle.createEmptyUpdateRow().put("ID_STOCK", rowExisting.getID()).put("ID_DEPOT_STOCK", DepotStockSQLElement.DEFAULT_ID).commit();
} else if (idDepot == rowArticle.getForeignID("ID_DEPOT_STOCK")) {
rowArticle.createEmptyUpdateRow().put("ID_STOCK", rowExisting.getID()).commit();
}
stockItems.add(new StockItem(rowArticle, rowExisting));
}
} catch (SQLException e) {
ExceptionHandler.handle("Erreur lors de l'initialisation du stock de l'article", e);
}
 
if (rowArticle.getReferentRows(rowArticle.getTable().getTable("ARTICLE_ELEMENT").getField("ID_ARTICLE_PARENT")).size() > 0) {
ComposedItemStockUpdater up = new ComposedItemStockUpdater(rowArticle.getTable().getDBRoot(), stockItems);
try {
up.updateNomenclature(stockItems);
} catch (SQLException e) {
ExceptionHandler.handle("Erreur lors de l'initialisation du stock de l'article", e);
ExceptionHandler.handle("Erreur lors de l'actualisation du stock!", e);
}
}
// if
// (row.getReferentRows(row.getTable().getTable("ARTICLE_ELEMENT").getField("ID_ARTICLE_PARENT")).size()
// > 0) {
// ComposedItemStockUpdater up = new ComposedItemStockUpdater(row.getTable().getDBRoot(),
// stockItems);
// try {
// up.updateNomenclature(stockItems);
// } catch (SQLException e) {
// ExceptionHandler.handle("Erreur lors de l'actualisation du stock!", e);
// }
// }
}
 
public static void initStock(SQLRow row) {
int foreignID = DepotStockSQLElement.DEFAULT_ID;
if (row.getObject("ID_DEPOT_STOCK") != null && !row.isForeignEmpty("ID_DEPOT_STOCK")) {
foreignID = row.getForeignID("ID_DEPOT_STOCK");
}
initStock(row, foreignID);
}
 
public static void exec(final AlterTable alter) throws SQLException {
alter.getTable().getDBSystemRoot().getDataSource().execute(alter.asString());
alter.getTable().getSchema().updateVersion();
/trunk/OpenConcerto/src/org/openconcerto/erp/config/translation_es.xml
200,6 → 200,7
<action id="supplychain.order.create.purchase" label="Transferencia hacia introducción de compra" />
<action id="supplychain.order.valid" label="Marcar como validada" />
<action id="supplychain.order.create.receipt" label="Transferencia hacia álbaran de entrada" />
<action id="supplychain.invoice.clone" label="Crear a partir de" />
 
<!-- Customer order -->
<action id="sales.order.create.deliverynote" label="Transferencia hacia álabaran de salida" />
/trunk/OpenConcerto/src/org/openconcerto/erp/config/InstallationPanel.java
49,6 → 49,7
import org.openconcerto.sql.request.Inserter.Insertion;
import org.openconcerto.sql.request.UpdateBuilder;
import org.openconcerto.sql.sqlobject.SQLTextCombo;
import org.openconcerto.sql.users.rights.TableAllRights;
import org.openconcerto.sql.utils.AlterTable;
import org.openconcerto.sql.utils.ChangeTable;
import org.openconcerto.sql.utils.ChangeTable.ClauseType;
63,6 → 64,7
import org.openconcerto.utils.CollectionUtils;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.ProductInfo;
import org.openconcerto.utils.StringUtils;
import org.openconcerto.utils.cc.ITransformer;
 
import java.awt.GridBagConstraints;
2387,18 → 2389,24
}
root.getTable("ARTICLE").getSchema().updateVersion();
// Valeur par défaut des numérotations
SQLRowValues rNumerotation = root.getTable("NUMEROTATION_AUTO").getRow(2).asRowValues();
boolean numerotationFixed = false;
if (rNumerotation.getString("AVOIR_F_FORMAT").trim().isEmpty()) {
rNumerotation.put("AVOIR_F_FORMAT", "'AVOIR'yyMM-000");
if (root.contains("NUMEROTATION_AUTO")) {
SQLRow rowNumerotation = root.getTable("NUMEROTATION_AUTO").getRow(2);
if (rowNumerotation != null) {
SQLRowValues rNumerotation = rowNumerotation.asRowValues();
boolean numerotationFixed = false;
if (StringUtils.isEmpty(rNumerotation.getString("AVOIR_F_FORMAT"), true)) {
rNumerotation.put("AVOIR_F_FORMAT", "'AVOIR'yyMM-000");
numerotationFixed = true;
}
if (StringUtils.isEmpty(rNumerotation.getString("CLIENT_FORMAT"), true)) {
rNumerotation.put("CLIENT_FORMAT", "'CLI'00000");
numerotationFixed = true;
}
if (numerotationFixed) {
rNumerotation.commit();
}
}
}
if (rNumerotation.getString("CLIENT_FORMAT").trim().isEmpty()) {
rNumerotation.put("CLIENT_FORMAT", "'CLI'00000");
}
if (numerotationFixed) {
rNumerotation.commit();
}
 
//
 
final SQLTable tableCalendarItem = root.getTable("CALENDAR_ITEM");
3835,6 → 3843,32
rowValsUserRight.commit();
}
 
if (!codes.contains(TableAllRights.USER_UI_LOCK_ROW)) {
SQLRowValues rowVals = new SQLRowValues(table);
rowVals.put("CODE", TableAllRights.USER_UI_LOCK_ROW);
rowVals.put("NOM", "Autoriser à verrouiller une ligne dans une liste.");
String desc = "Autorise un utilisateur à verrouiller une ou plusieurs dans les listes où cette fonctionnalité est active.";
rowVals.put("DESCRIPTION", desc);
SQLRow row = rowVals.commit();
SQLRowValues rowValsUserRight = new SQLRowValues(table.getTable("USER_RIGHT"));
rowValsUserRight.put("ID_RIGHT", row.getID());
rowValsUserRight.put("HAVE_RIGHT", Boolean.TRUE);
rowValsUserRight.commit();
}
 
if (!codes.contains(TableAllRights.USER_UI_UNLOCK_ROW)) {
SQLRowValues rowVals = new SQLRowValues(table);
rowVals.put("CODE", TableAllRights.USER_UI_UNLOCK_ROW);
rowVals.put("NOM", "Autoriser à déverrouiller une ligne dans une liste.");
String desc = "Autorise un utilisateur à déverrouiller une ou plusieurs dans les listes où cette fonctionnalité est active.";
rowVals.put("DESCRIPTION", desc);
SQLRow row = rowVals.commit();
SQLRowValues rowValsUserRight = new SQLRowValues(table.getTable("USER_RIGHT"));
rowValsUserRight.put("ID_RIGHT", row.getID());
rowValsUserRight.put("HAVE_RIGHT", Boolean.TRUE);
rowValsUserRight.commit();
}
 
}
 
private void findBadForeignKey(DBRoot root) {
3975,6 → 4009,15
 
// FK
new AddFK(root.getDBSystemRoot()).changeAll(root);
 
// Couleur
final SQLTable tableUser = root.getTable("USER_COMMON");
if (!tableUser.contains("COLOR")) {
final AlterTable alter = new AlterTable(tableUser);
alter.addIntegerColumn("COLOR", 0, false);
Updater_1_5.exec(alter);
}
 
}
 
protected void fixCompletion(DBRoot root) throws SQLException {
4027,6 → 4070,11
alter = true;
}
 
if (!table.getFieldsName().contains("ID_JOURNAL_VALEUR_ENCAISSEMENT")) {
t.addForeignColumn("ID_JOURNAL_VALEUR_ENCAISSEMENT", root.getTable("JOURNAL"));
alter = true;
}
 
if (!table.getFieldsName().contains("ID_COMPTE_PCE_PORT_NON_SOUMIS")) {
t.addForeignColumn("ID_COMPTE_PCE_PORT_NON_SOUMIS", root.getTable("COMPTE_PCE"));
alter = true;
4625,7 → 4673,6
 
// at the end to let Updater_1_5 change field types from varchar to text
fixUnboundedVarchar(root);
 
return null;
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/action/CreateEditFrameAbstractAction.java
29,7 → 29,11
private static final String[] TRANSLATION_KEY_ARRAY = new String[] { TRANSLATION_KEY };
 
protected CreateEditFrameAbstractAction(final PropsConfiguration conf, final Class<? extends E> clazz) {
super(conf.getDirectory().getElement(clazz));
this(conf, conf.getDirectory().getElementOfClass(clazz, true));
}
 
protected CreateEditFrameAbstractAction(final PropsConfiguration conf, final E elem) {
super(elem);
// TODO use conf to find TM
final NounClass nounClass = this.getElem().getName().getNounClass();
final String[] translationKeys = nounClass == null ? TRANSLATION_KEY_ARRAY : new String[] { TRANSLATION_KEY + '.' + nounClass.getName(), TRANSLATION_KEY };
/trunk/OpenConcerto/src/org/openconcerto/erp/action/NouvelleConnexionAction.java
293,6 → 293,11
}
 
static public void initCache(final ComptaPropsConfiguration comptaConf) {
initCache(comptaConf, 600);
}
 
static public void initCache(final ComptaPropsConfiguration comptaConf, final int timeout) {
 
final SQLBase baseSociete = comptaConf.getSQLBaseSociete();
Thread t = new Thread() {
@Override
299,7 → 304,7
public void run() {
// laisse le temps au logiciel de demarrer
try {
Thread.sleep(1000);
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
310,19 → 315,19
 
Ville.init(new NXDatabaseAccessor(comptaConf), prefs.getBoolean(GestionClientPreferencePanel.LOAD_CITIES, true));
 
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("TAXE"), 600);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("ETAT_DEVIS"), 600);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("PREFS_COMPTE"), 600);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("COMPTE_PCE"), 600);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("JOURNAL"), 600);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("TAXE"), timeout);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("ETAT_DEVIS"), timeout);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("PREFS_COMPTE"), timeout);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("COMPTE_PCE"), timeout);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("JOURNAL"), timeout);
 
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("COMMERCIAL"), 600);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("PERIODE_VALIDITE"), 1000);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("COMMERCIAL"), timeout);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("PERIODE_VALIDITE"), timeout);
 
if (comptaConf.getRootSociete().contains("DEPOT_STOCK")) {
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("DEPOT_STOCK"), 600);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("DEPOT_STOCK"), timeout);
}
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("TYPE_REGLEMENT"), 1000);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("TYPE_REGLEMENT"), timeout);
SQLBackgroundTableCache.getInstance().startCacheWatcher();
 
TaxeCache.getCache();
/trunk/OpenConcerto/src/org/openconcerto/erp/action/CreateListFrameAbstractAction.java
61,7 → 61,11
private final ComptaPropsConfiguration conf;
 
protected CreateListFrameAbstractAction(final ComptaPropsConfiguration conf, final Class<? extends E> clazz) {
super(conf.getDirectory().getElement(clazz));
this(conf, conf.getDirectory().getElementOfClass(clazz, true));
}
 
protected CreateListFrameAbstractAction(final ComptaPropsConfiguration conf, final E elem) {
super(elem);
this.conf = conf;
// TODO use conf to find TM
final NounClass nounClass = this.getElem().getName().getNounClass();
/trunk/OpenConcerto/src/org/openconcerto/erp/action/CreateIListFrameAbstractAction.java
27,6 → 27,10
super(conf, clazz);
}
 
protected CreateIListFrameAbstractAction(final ComptaPropsConfiguration conf, final E elem) {
super(conf, elem);
}
 
protected SQLTableModelSource createTableSource() {
return this.getElem().createTableSource();
}
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/BonReceptionFactureFournisseurSQLInjector.java
34,6 → 34,12
map(getSource().getField("PORT_HT"), getDestination().getField("PORT_HT"));
map(getSource().getField("ID_TAXE_PORT"), getDestination().getField("ID_TAXE_PORT"));
}
if (getSource().contains("ID_AFFAIRE") && getDestination().contains("ID_AFFAIRE")) {
map(getSource().getField("ID_AFFAIRE"), getDestination().getField("ID_AFFAIRE"));
}
if (getSource().contains("ID_POLE_PRODUIT") && getDestination().contains("ID_POLE_PRODUIT")) {
map(getSource().getField("ID_POLE_PRODUIT"), getDestination().getField("ID_POLE_PRODUIT"));
}
}
 
@Override
44,9 → 50,9
final SQLTable tableElementSource = getSource().getTable("BON_RECEPTION_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("FACTURE_FOURNISSEUR_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertReference(srcRow, rowVals, "NOM", "NOM");
transfertReference(srcRow, rowVals, "INFOS", "INFOS");
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_FACTURE_FOURNISSEUR");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_FACTURE_FOURNISSEUR", "NOM", "NOM");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_FACTURE_FOURNISSEUR", "INFOS", "INFOS");
if (myListItem.size() != 0) {
final SQLInjector injector = SQLInjector.getInjector(tableElementSource, tableElementDestination);
for (SQLRowAccessor rowElt : myListItem) {
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/CommandeBrSQLInjector.java
40,6 → 40,9
if (tableBr.contains("CREATE_VIRTUAL_STOCK")) {
mapDefaultValues(tableBr.getField("CREATE_VIRTUAL_STOCK"), Boolean.FALSE);
}
if (getSource().contains("ID_AFFAIRE") && getDestination().contains("ID_AFFAIRE")) {
map(getSource().getField("ID_AFFAIRE"), getDestination().getField("ID_AFFAIRE"));
}
}
 
@Override
50,6 → 53,7
final SQLTable tableElementSource = getSource().getTable("COMMANDE_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("BON_RECEPTION_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_BON_RECEPTION");
 
if (myListItem.size() != 0) {
final SQLInjector injector = SQLInjector.getInjector(tableElementSource, tableElementDestination);
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/DevisCommandeSQLInjector.java
68,6 → 68,9
map(tableDevis.getField("MONTANT_REMISE"), getDestination().getField("MONTANT_REMISE"));
map(tableDevis.getField("POURCENT_REMISE"), getDestination().getField("POURCENT_REMISE"));
}
if (getSource().getTable().contains("ID_CATEGORIE_COMPTABLE") && getDestination().getTable().contains("ID_CATEGORIE_COMPTABLE")) {
map(getSource().getField("ID_CATEGORIE_COMPTABLE"), getDestination().getField("ID_CATEGORIE_COMPTABLE"));
}
}
 
@Override
78,9 → 81,9
final SQLTable tableElementSource = getSource().getTable("DEVIS_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("COMMANDE_CLIENT_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertReference(srcRow, rowVals, "OBJET", "NOM");
transfertReference(srcRow, rowVals, "INFOS", "INFOS");
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_COMMANDE_CLIENT");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_COMMANDE_CLIENT", "OBJET", "NOM");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_COMMANDE_CLIENT", "INFOS", "INFOS");
 
if (myListItem.size() != 0) {
final SQLInjector injector = SQLInjector.getInjector(tableElementSource, tableElementDestination);
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/DevisFactureSQLInjector.java
67,6 → 67,9
map(tableDevis.getField("MONTANT_REMISE"), tableFacture.getField("MONTANT_REMISE"));
map(tableDevis.getField("POURCENT_REMISE"), tableFacture.getField("POURCENT_REMISE"));
}
if (getSource().getTable().contains("ID_CATEGORIE_COMPTABLE") && getDestination().getTable().contains("ID_CATEGORIE_COMPTABLE")) {
map(getSource().getField("ID_CATEGORIE_COMPTABLE"), getDestination().getField("ID_CATEGORIE_COMPTABLE"));
}
}
 
@Override
78,9 → 81,9
final SQLTable tableElementSource = getSource().getTable("DEVIS_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("SAISIE_VENTE_FACTURE_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertReference(srcRow, rowVals, "OBJET", "NOM");
transfertReference(srcRow, rowVals, "INFOS", "INFOS");
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_SAISIE_VENTE_FACTURE");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_SAISIE_VENTE_FACTURE", "OBJET", "NOM");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_SAISIE_VENTE_FACTURE", "INFOS", "INFOS");
 
if (getDestination().contains("ID_TAXE_FRAIS_DOCUMENT")) {
final SQLRowAccessor rowClient = srcRow.getForeign("ID_CLIENT");
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/BonFactureSQLInjector.java
46,6 → 46,9
if (getSource().getTable().contains("ID_ADRESSE_LIVRAISON")) {
map(getSource().getField("ID_ADRESSE_LIVRAISON"), getDestination().getField("ID_ADRESSE_LIVRAISON"));
}
if (getSource().getTable().contains("ID_CATEGORIE_COMPTABLE") && getDestination().getTable().contains("ID_CATEGORIE_COMPTABLE")) {
map(getSource().getField("ID_CATEGORIE_COMPTABLE"), getDestination().getField("ID_CATEGORIE_COMPTABLE"));
}
if (tableBon.contains("ID_TAXE_PORT")) {
map(tableBon.getField("ID_TAXE_PORT"), tableFacture.getField("ID_TAXE_PORT"));
}
77,9 → 80,9
final SQLTable tableElementSource = getSource().getTable("BON_DE_LIVRAISON_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("SAISIE_VENTE_FACTURE_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertReference(srcRow, rowVals, "NOM", "NOM");
transfertReference(srcRow, rowVals, "INFOS", "INFOS");
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_SAISIE_VENTE_FACTURE");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_SAISIE_VENTE_FACTURE", "NOM", "NOM");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_SAISIE_VENTE_FACTURE", "INFOS", "INFOS");
if (getDestination().contains("ID_TAXE_FRAIS_DOCUMENT")) {
final SQLRowAccessor rowClient = srcRow.getForeign("ID_CLIENT");
SQLRowAccessor rowFrais = rowClient.getForeign("ID_FRAIS_DOCUMENT");
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/DevisBlSQLInjector.java
45,6 → 45,9
if (getSource().getTable().contains("ID_ADRESSE_LIVRAISON")) {
map(getSource().getField("ID_ADRESSE_LIVRAISON"), getDestination().getField("ID_ADRESSE_LIVRAISON"));
}
if (getSource().getTable().contains("ID_CATEGORIE_COMPTABLE") && getDestination().getTable().contains("ID_CATEGORIE_COMPTABLE")) {
map(getSource().getField("ID_CATEGORIE_COMPTABLE"), getDestination().getField("ID_CATEGORIE_COMPTABLE"));
}
}
 
@Override
55,9 → 58,9
final SQLTable tableElementSource = getSource().getTable("DEVIS_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("BON_DE_LIVRAISON_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertReference(srcRow, rowVals, "NOM", "NOM");
transfertReference(srcRow, rowVals, "INFOS", "INFOS");
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_BON_DE_LIVRAISON");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_BON_DE_LIVRAISON", "NOM", "NOM");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_BON_DE_LIVRAISON", "INFOS", "INFOS");
 
if (myListItem.size() != 0) {
final SQLInjector injector = SQLInjector.getInjector(tableElementSource, tableElementDestination);
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/FactureBonSQLInjector.java
49,9 → 49,9
final SQLTable tableElementSource = getSource().getTable("SAISIE_VENTE_FACTURE_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("BON_DE_LIVRAISON_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertReference(srcRow, rowVals, "NOM", "NOM");
transfertReference(srcRow, rowVals, "INFOS", "INFOS");
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_BON_DE_LIVRAISON");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_BON_DE_LIVRAISON", "NOM", "NOM");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_BON_DE_LIVRAISON", "INFOS", "INFOS");
 
if (myListItem.size() != 0) {
final SQLInjector injector = SQLInjector.getInjector(tableElementSource, tableElementDestination);
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/FactureAvoirSQLInjector.java
43,7 → 43,9
if (getSource().contains("ID_ADRESSE_LIVRAISON") && getDestination().contains("ID_ADRESSE_LIVRAISON")) {
map(getSource().getField("ID_ADRESSE_LIVRAISON"), getDestination().getField("ID_ADRESSE_LIVRAISON"));
}
 
if (getSource().getTable().contains("ID_CATEGORIE_COMPTABLE") && getDestination().getTable().contains("ID_CATEGORIE_COMPTABLE")) {
map(getSource().getField("ID_CATEGORIE_COMPTABLE"), getDestination().getField("ID_CATEGORIE_COMPTABLE"));
}
if (getSource().getTable().contains("DATE_LIVRAISON") && getDestination().contains("DATE_LIVRAISON")) {
map(getSource().getField("DATE_LIVRAISON"), getDestination().getField("DATE_LIVRAISON"));
}
64,8 → 66,8
final SQLTable tableElementSource = getSource().getTable("SAISIE_VENTE_FACTURE_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("AVOIR_CLIENT_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertReference(srcRow, rowVals, "NOM", "NOM");
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_AVOIR_CLIENT");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_AVOIR_CLIENT", "NOM", "NOM");
 
if (myListItem.size() != 0) {
final SQLInjector injector = SQLInjector.getInjector(tableElementSource, tableElementDestination);
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/CommandeFactureClientSQLInjector.java
72,7 → 72,9
if (tableFacture.contains("CREATE_VIRTUAL_STOCK")) {
mapDefaultValues(tableFacture.getField("CREATE_VIRTUAL_STOCK"), Boolean.FALSE);
}
 
if (getSource().getTable().contains("ID_CATEGORIE_COMPTABLE") && getDestination().getTable().contains("ID_CATEGORIE_COMPTABLE")) {
map(getSource().getField("ID_CATEGORIE_COMPTABLE"), getDestination().getField("ID_CATEGORIE_COMPTABLE"));
}
}
 
@Override
83,9 → 85,9
final SQLTable tableElementSource = getSource().getTable("COMMANDE_CLIENT_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("SAISIE_VENTE_FACTURE_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertReference(srcRow, rowVals, "NOM", "NOM");
transfertReference(srcRow, rowVals, "INFOS", "INFOS");
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_SAISIE_VENTE_FACTURE");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_SAISIE_VENTE_FACTURE", "NOM", "NOM");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_SAISIE_VENTE_FACTURE", "INFOS", "INFOS");
if (getDestination().contains("ID_TAXE_FRAIS_DOCUMENT")) {
final SQLRowAccessor rowClient = srcRow.getForeign("ID_CLIENT");
SQLRowAccessor rowFrais = rowClient.getForeign("ID_FRAIS_DOCUMENT");
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/CommandeBlSQLInjector.java
69,6 → 69,9
if (getSource().getTable().contains("ID_ADRESSE_LIVRAISON")) {
map(getSource().getField("ID_ADRESSE_LIVRAISON"), getDestination().getField("ID_ADRESSE_LIVRAISON"));
}
if (getSource().getTable().contains("ID_CATEGORIE_COMPTABLE") && getDestination().getTable().contains("ID_CATEGORIE_COMPTABLE")) {
map(getSource().getField("ID_CATEGORIE_COMPTABLE"), getDestination().getField("ID_CATEGORIE_COMPTABLE"));
}
}
 
@Override
80,10 → 83,9
final SQLTable tableElementDestination = getSource().getTable("BON_DE_LIVRAISON_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
 
transfertReference(srcRow, rowVals, "NOM", "NOM");
transfertReference(srcRow, rowVals, "INFOS", "INFOS");
 
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_BON_DE_LIVRAISON");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_BON_DE_LIVRAISON", "NOM", "NOM");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_BON_DE_LIVRAISON", "INFOS", "INFOS");
 
if (myListItem.size() != 0) {
final SQLInjector injector = SQLInjector.getInjector(tableElementSource, tableElementDestination);
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/CommandeFactureEltSQLInjector.java
20,6 → 20,7
public CommandeFactureEltSQLInjector(final DBRoot root) {
super(root, "COMMANDE_CLIENT_ELEMENT", "SAISIE_VENTE_FACTURE_ELEMENT", false);
createDefaultMap();
remove(getSource().getField("QTE_LIVREE"), getDestination().getField("QTE_LIVREE"));
if (getDestination().contains("ID_COMMANDE_CLIENT_ELEMENT")) {
map(getSource().getKey(), getDestination().getField("ID_COMMANDE_CLIENT_ELEMENT"));
}
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/CommandeFactureFournisseurSQLInjector.java
36,11 → 36,11
 
// Merge elements
final SQLTable tableElementSource = getSource().getTable("COMMANDE_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("FACTURE_FOUNRISSEUR_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("FACTURE_FOURNISSEUR_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertReference(srcRow, rowVals, "NOM", "NOM");
transfertReference(srcRow, rowVals, "INFOS", "INFOS");
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_FACTURE_FOURNISSEUR");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_FACTURE_FOURNISSEUR", "NOM", "NOM");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_FACTURE_FOURNISSEUR", "INFOS", "INFOS");
if (myListItem.size() != 0) {
final SQLInjector injector = SQLInjector.getInjector(tableElementSource, tableElementDestination);
for (SQLRowAccessor rowElt : myListItem) {
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/ArticleCodeFournisseurProvider.java
New file
0,0 → 1,69
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationDoc.provider;
 
import org.openconcerto.erp.generationDoc.SpreadSheetCellValueContext;
import org.openconcerto.erp.generationDoc.SpreadSheetCellValueProvider;
import org.openconcerto.erp.generationDoc.SpreadSheetCellValueProviderManager;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
 
import java.util.List;
 
public class ArticleCodeFournisseurProvider implements SpreadSheetCellValueProvider {
 
public ArticleCodeFournisseurProvider() {
}
 
public Object getValue(SpreadSheetCellValueContext context) {
SQLRowAccessor row = context.getRow();
String code = row.getString("CODE");
if (row.getObject("ID_ARTICLE") != null && !row.isForeignEmpty("ID_ARTICLE")) {
if (row.getTable().contains("ID_CODE_FOURNISSEUR")) {
if (row.getObject("ID_CODE_FOURNISSEUR") != null && !row.isForeignEmpty("ID_CODE_FOURNISSEUR")) {
 
code = row.getForeign("ID_CODE_FOURNISSEUR").getString("CODE");
 
} else {
 
int idFournisseur = row.getForeign("ID_" + row.getTable().getName().replaceAll("_ELEMENT", "")).getForeignID("ID_FOURNISSEUR");
SQLSelect sel = new SQLSelect();
final SQLTable tableCodeFournisseur = row.getTable().getTable("CODE_FOURNISSEUR");
sel.addSelectStar(tableCodeFournisseur);
Where w = new Where(tableCodeFournisseur.getField("ID_ARTICLE"), "=", row.getForeignID("ID_ARTICLE"));
w = w.and(new Where(tableCodeFournisseur.getField("ID_FOURNISSEUR"), "=", idFournisseur));
sel.setWhere(w);
List<SQLRow> result = SQLRowListRSH.execute(sel);
if (!result.isEmpty()) {
final String val = result.get(0).getString("CODE");
if (val.length() > 0) {
code = val;
}
}
}
}
}
return code;
}
 
public static void register() {
SpreadSheetCellValueProviderManager.put("supplier.product.code", new ArticleCodeFournisseurProvider());
 
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/QteTotalDocProvider.java
New file
0,0 → 1,68
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationDoc.provider;
 
import org.openconcerto.erp.generationDoc.SpreadSheetCellValueContext;
import org.openconcerto.erp.generationDoc.SpreadSheetCellValueProviderManager;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLTable;
 
import java.math.BigDecimal;
import java.util.Collection;
 
public class QteTotalDocProvider extends UserInitialsValueProvider {
 
private enum TypeQteTotalDocProvider {
QTE, COLIS
};
 
private final TypeQteTotalDocProvider type;
 
public QteTotalDocProvider(TypeQteTotalDocProvider t) {
this.type = t;
}
 
@Override
public Object getValue(SpreadSheetCellValueContext context) {
SQLRowAccessor row = context.getRow();
 
final SQLTable table = row.getTable();
Collection<? extends SQLRowAccessor> cols = row.getReferentRows(table.getTable(table.getName() + "_ELEMENT"));
BigDecimal total = BigDecimal.ZERO;
for (SQLRowAccessor sqlRowAccessor : cols) {
 
if (!sqlRowAccessor.getTable().contains("NIVEAU") || sqlRowAccessor.getInt("NIVEAU") == 1) {
 
if (this.type == TypeQteTotalDocProvider.QTE) {
BigDecimal qte = sqlRowAccessor.getBigDecimal("QTE_UNITAIRE").multiply(new BigDecimal(sqlRowAccessor.getInt("QTE")));
 
total = total.add(qte);
 
} else {
if (sqlRowAccessor.getObject("NB_COLIS") != null) {
total = total.add(new BigDecimal(sqlRowAccessor.getInt("NB_COLIS")));
}
}
 
}
}
 
return total;
}
 
public static void register() {
SpreadSheetCellValueProviderManager.put("sales.qty.total", new QteTotalDocProvider(TypeQteTotalDocProvider.QTE));
SpreadSheetCellValueProviderManager.put("sales.package.total", new QteTotalDocProvider(TypeQteTotalDocProvider.COLIS));
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/AbstractJOOReportsSheet.java
27,6 → 27,7
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.FileUtils;
 
import java.awt.print.PrinterJob;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileNotFoundException;
245,9 → 246,13
return;
}
final Component doc = ooConnexion.loadDocument(fileOutOO, true);
Map<String, Object> map = new HashMap<String, Object>();
map.put("Name", printer);
doc.printDocument(map);
if (this.printer != null && this.printer.trim().length() > 0) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("Name", this.printer);
doc.printDocument(map);
} else {
doc.printDocument(PrinterJob.getPrinterJob());
}
doc.close();
} catch (LinkageError e) {
JOptionPane.showMessageDialog(new JFrame(), "Merci d'installer OpenOffice ou LibreOffice");
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/SheetXml.java
179,19 → 179,23
 
try {
if (!useODSViewer) {
final Component doc = ComptaPropsConfiguration.getOOConnexion().loadDocument(generatedFile, !showDocument);
if (exportToPDF || printDocument) {
final Component doc = ComptaPropsConfiguration.getOOConnexion().loadDocument(generatedFile, !showDocument);
 
if (printDocument) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("Name", this.printer);
doc.printDocument(map);
if (printDocument) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("Name", this.printer);
doc.printDocument(map);
}
if (exportToPDF) {
doc.saveToPDF(pdfFile).get();
}
if (!showDocument) {
doc.close();
}
} else {
openDocument(false);
}
if (exportToPDF) {
doc.saveToPDF(pdfFile).get();
}
if (!showDocument) {
doc.close();
}
} else {
final OpenDocument doc = new OpenDocument(generatedFile);
 
543,9 → 547,13
}
 
public void showPreviewDocument() throws Exception {
showPreviewDocument(null, null);
}
 
public void showPreviewDocument(String actionName, Runnable r) throws Exception {
File f = null;
f = getOrCreateDocumentFile();
PreviewFrame.show(f);
PreviewFrame.show(f, actionName, r);
}
 
public void printDocument() {
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/gestcomm/EtatVentesXmlSheet.java
24,6 → 24,8
import org.openconcerto.sql.model.AliasedTable;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLSelectJoin;
import org.openconcerto.sql.model.SQLTable;
62,11 → 64,13
 
private Timestamp du, au;
public boolean ticketCaisse = false;
public boolean facture = false;
 
public EtatVentesXmlSheet(Date du, Date au, boolean ticketCaisse) {
public EtatVentesXmlSheet(Date du, Date au, boolean ticketCaisse, boolean facture) {
super();
this.printer = PrinterNXProps.getInstance().getStringProperty("BonPrinter");
this.ticketCaisse = ticketCaisse;
this.facture = facture;
if (du != null) {
final Calendar c1 = Calendar.getInstance();
c1.setTime(du);
128,7 → 132,11
styleAllSheetValues.put(0, style);
}
 
final ArrayList<Map<String, Object>> listValuesStock = new ArrayList<>();
final Map<Integer, String> styleStock = new HashMap<>();
 
// Ventes
final SQLTable foreignTableArticle = tableFactureElement.getForeignTable("ID_ARTICLE");
{
 
final AliasedTable tableModeReglement1 = new AliasedTable(tableModeReglement, MODE1);
135,6 → 143,17
final AliasedTable tableModeReglement2 = new AliasedTable(tableModeReglement, MODE2);
final AliasedTable tableTicket = new AliasedTable(eltTicketCaisse.getTable(), "ticket");
 
// Stock
SQLRowValues rowValsArtStock = new SQLRowValues(foreignTableArticle);
rowValsArtStock.putNulls("ID", "CODE", "NOM");
rowValsArtStock.putRowValues("ID_STOCK").putNulls("QTE_REEL", "QTE_TH", "QTE_MIN", "QTE_RECEPT_ATTENTE", "QTE_LIV_ATTENTE");
SQLRowValuesListFetcher fetcherStock = SQLRowValuesListFetcher.create(rowValsArtStock);
List<SQLRowValues> resultStock = fetcherStock.fetch();
Map<Integer, SQLRowValues> mapStock = new HashMap<>();
for (SQLRowValues sqlRowValues : resultStock) {
mapStock.put(sqlRowValues.getID(), sqlRowValues);
}
 
// Requete Pour obtenir les quantités pour chaque type de réglement
SQLSelect sel = new SQLSelect();
 
193,12 → 212,16
selQte.addSelect(tableFactureElement.getField("T_PV_TTC"), "SUM");
selQte.addSelect(tableFactureElement.getField("ID_TAXE"));
selQte.addSelect(tableFactureElement.getField("ID_ARTICLE"));
if (!this.ticketCaisse) {
if (this.ticketCaisse) {
selQte.addJoin("LEFT", tableFactureElement.getField("ID_SAISIE_VENTE_FACTURE")).setWhere(Where.FALSE);
selQte.addJoin("LEFT", tableFactureElement.getField("ID_TICKET_CAISSE"), "ticket").setWhere(w2);
} else if (this.facture) {
selQte.addJoin("LEFT", tableFactureElement.getField("ID_SAISIE_VENTE_FACTURE")).setWhere(w);
selQte.addJoin("LEFT", tableFactureElement.getField("ID_TICKET_CAISSE"), "ticket").setWhere(Where.FALSE);
} else {
selQte.addJoin("LEFT", tableFactureElement.getField("ID_SAISIE_VENTE_FACTURE")).setWhere(Where.FALSE);
selQte.addJoin("LEFT", tableFactureElement.getField("ID_SAISIE_VENTE_FACTURE")).setWhere(w);
selQte.addJoin("LEFT", tableFactureElement.getField("ID_TICKET_CAISSE"), "ticket").setWhere(w2);
}
selQte.addJoin("LEFT", tableFactureElement.getField("ID_TICKET_CAISSE"), "ticket").setWhere(w2);
SQLSelectJoin joinArt2 = selQte.addJoin("LEFT", tableFactureElement.getField("ID_ARTICLE"));
SQLSelectJoin joinFamArt2 = selQte.addJoin("LEFT", joinArt2.getJoinedTable().getField("ID_FAMILLE_ARTICLE"));
selQte.addSelect(joinFamArt2.getJoinedTable().getField("NOM"));
234,8 → 257,8
mapTVAVT.put(tvaID.intValue(), Tuple2.create(t.get0().add((BigDecimal) ht), t.get1().add(ttc)));
}
Number articleID = (Number) sqlRow[7];
ArticleVendu a = new ArticleVendu(code, nom, qteVendu.intValue(), (BigDecimal) ht, (BigDecimal) ha, ttc, tvaID.intValue(),
tableFactureElement.getForeignTable("ID_ARTICLE").getRow(articleID.intValue()));
ArticleVendu a = new ArticleVendu(code, nom, qteVendu.intValue(), (BigDecimal) ht, (BigDecimal) ha, ttc, tvaID.intValue(), foreignTableArticle.getRow(articleID.intValue()));
 
map.put(articleID + "##" + code + "##" + nom + "##" + tvaID, a);
 
}
256,6 → 279,8
mValues.put("NOM", famille);
style.put(listValues.size(), "Titre 1");
listValues.add(mValues);
styleStock.put(listValuesStock.size(), "Titre 1");
listValuesStock.add(mValues);
} else if (valueFam != null && !valueFam.toString().equalsIgnoreCase(famille)) {
famille = valueFam.toString();
Map<String, Object> mValues = new HashMap<String, Object>();
262,6 → 287,8
mValues.put("NOM", famille);
style.put(listValues.size(), "Titre 1");
listValues.add(mValues);
styleStock.put(listValuesStock.size(), "Titre 1");
listValuesStock.add(mValues);
}
 
Map<String, Object> mValues = new HashMap<String, Object>();
291,6 → 318,25
totalTPVTTC = totalTPVTTC.add(a.ttc);
style.put(listValues.size(), "Normal");
listValues.add(mValues);
 
Map<String, Object> mValuesStock = new HashMap<String, Object>();
mValuesStock.put("CODE", code);
mValuesStock.put("NOM", nom);
mValuesStock.put("QTE", a.qte);
if (mapStock.containsKey(articleID)) {
SQLRowValues rowValsArt = mapStock.get(articleID);
if (rowValsArt.getObject("ID_STOCK") != null && !rowValsArt.isForeignEmpty("ID_STOCK")) {
SQLRowAccessor rowValsStock = rowValsArt.getForeign("ID_STOCK");
mValuesStock.put("QTE_TH", rowValsStock.getObject("QTE_TH"));
mValuesStock.put("QTE_REEL", rowValsStock.getObject("QTE_REEL"));
mValuesStock.put("QTE_MIN", rowValsStock.getObject("QTE_MIN"));
mValuesStock.put("QTE_RECEPT_ATTENTE", rowValsStock.getObject("QTE_RECEPT_ATTENTE"));
mValuesStock.put("QTE_LIV_ATTENTE", rowValsStock.getObject("QTE_LIV_ATTENTE"));
}
styleStock.put(listValuesStock.size(), "Normal");
listValuesStock.add(mValuesStock);
}
 
}
// System.out.println("EtatVentesXmlSheet.createListeValues():" + listValues);
}
440,7 → 486,7
}
Number articleID = (Number) sqlRow[7];
ArticleVendu a = new ArticleVendu(code, nom, -qteVendu.intValue(), ((BigDecimal) ht).negate(), ((BigDecimal) ha).negate(), ttc.negate(), tvaID.intValue(),
tableFactureElement.getForeignTable("ID_ARTICLE").getRow(articleID.intValue()));
foreignTableArticle.getRow(articleID.intValue()));
map.put(articleID + "##" + code + "##" + nom + "##" + tvaID, a);
 
}
713,6 → 759,10
this.listAllSheetValues.put(3, listValuesTVA);
valuesTVA.put("DATE", periode);
this.mapAllSheetValues.put(3, valuesTVA);
 
this.listAllSheetValues.put(4, listValuesStock);
this.styleAllSheetValues.put(4, styleStock);
this.mapAllSheetValues.put(4, values);
}
 
public static SQLRow rowDefaultCptService, rowDefaultCptProduit;
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOXMLField.java
266,6 → 266,9
result += stringValue;
}
if (suffix != null) {
if (suffix.contains("#n")) {
suffix = suffix.replaceAll("#n", "\n");
}
result += suffix;
}
if (cellSize != null && cellSize.trim().length() != 0) {
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOgenerationXML.java
195,6 → 195,7
}
} catch (Exception e) {
ExceptionHandler.handle("Impossible de remplir le document " + templateId + " " + ((rowLanguage == null) ? "" : rowLanguage.getString("CHEMIN")), e);
e.printStackTrace();
return null;
}
 
444,6 → 445,12
}
calc.setRemise(valRemiseHTReel, totalAvtRemise);
 
// Fix TVA si nécessaire pour facture fournisseur
if (row.getTable().contains("TVA_ADJUSTMENT")) {
BigDecimal tvaFix = row.getBigDecimal("TVA_ADJUSTMENT");
calc.addTVAAdjust(tvaFix);
}
 
for (int i = 0; i < rows.size(); i++) {
SQLRowAccessor sqlRow = rows.get(i);
calc.addLine(sqlRow, sqlRow.getForeign("ID_ARTICLE"), i, i == rows.size() - 1);
490,6 → 497,20
 
calc.addLine(rowValsPort, rowValsPort.getForeign("ID_ARTICLE"), 1, false);
}
if (row.getTable().contains("FRAIS_DOCUMENT_HT") && row.getTable().contains("ID_TAXE_FRAIS_DOCUMENT")) {
BigDecimal fraisDoc = BigDecimal.valueOf(row.getLong("FRAIS_DOCUMENT_HT")).movePointLeft(2);
SQLRowAccessor tvafraisDoc = row.getForeign("ID_TAXE_FRAIS_DOCUMENT");
if (tvafraisDoc != null && fraisDoc.signum() != 0 && !tvafraisDoc.isUndefined()) {
SQLRowValues rowValsfraisDoc = new SQLRowValues(tableElt);
rowValsfraisDoc.put("T_PV_HT", fraisDoc);
rowValsfraisDoc.put("QTE", 1);
rowValsfraisDoc.put("ID_TAXE", tvafraisDoc.getIDNumber());
rowValsfraisDoc.put("SERVICE", Boolean.TRUE);
rowValsfraisDoc.put("ID_FAMILLE_ARTICLE", null);
calc.addLine(rowValsfraisDoc, null, 1, false);
}
}
 
calc.checkResult();
Map<SQLRowAccessor, Tuple2<BigDecimal, BigDecimal>> taxeCalc = calc.getMapHtTVARowTaux();
for (SQLRowAccessor sqlRow : taxeCalc.keySet()) {
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtDepotChequeClient.java
93,7 → 93,7
 
List<Integer> pieceIDs = new ArrayList<Integer>();
SQLRowValues rowValsDepotElt = new SQLRowValues(depot.getTable().getTable("DEPOT_CHEQUE_ELEMENT"));
rowValsDepotElt.putNulls("MONTANT", "TIERS");
rowValsDepotElt.putNulls("MONTANT", "TIERS", "PIECE");
rowValsDepotElt.putRowValues("ID_CLIENT").putNulls("NOM", "ID_COMPTE_PCE");
final SQLRowValues rowValuesChq = rowValsDepotElt.putRowValues("ID_CHEQUE_A_ENCAISSER");
rowValuesChq.putNulls("SANS_VALEUR_ENCAISSEMENT").putRowValues("ID_MOUVEMENT").putNulls("ID_PIECE");
102,7 → 102,7
for (SQLRowValues sqlRowAccessor : cheques) {
final SQLRowAccessor clientRow = sqlRowAccessor.getForeign("ID_CLIENT");
// this.nom = this.nom + " " + StringUtils.limitLength(clientRow.getString("NOM"), 20);
this.putValue("NOM", this.nom + " " + StringUtils.limitLength(clientRow.getString("NOM"), 20));
this.putValue("NOM", this.nom + " " + sqlRowAccessor.getString("PIECE") + " " + StringUtils.limitLength(clientRow.getString("NOM"), 20));
SQLRowAccessor chequeRow = sqlRowAccessor.getForeign("ID_CHEQUE_A_ENCAISSER");
pieceIDs.add(chequeRow.getForeign("ID_MOUVEMENT").getForeignID("ID_PIECE"));
// compte Clients
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/Piece.java
New file
0,0 → 1,58
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationEcritures;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLInsert;
 
import java.util.ArrayList;
import java.util.List;
 
public class Piece {
private String nom;
private List<Mouvement> mouvements = new ArrayList<>();
private Number id;
 
public Piece(String nom) {
this.nom = nom;
}
 
public String getNom() {
return nom;
}
 
public void add(Mouvement mouvement) {
this.mouvements.add(mouvement);
mouvement.setPiece(this);
}
 
public List<Mouvement> getMouvements() {
return mouvements;
}
 
public SQLInsert createInsert(final DBRoot root) {
final SQLInsert insert = new SQLInsert();
insert.add(root.getTable("PIECE").getField("NOM"), this.nom);
return insert;
}
 
public Number getId() {
return this.id;
}
 
public void setId(Number id) {
this.id = id;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/Exercice.java
New file
0,0 → 1,517
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationEcritures;
 
import org.openconcerto.sql.element.SQLElementDirectory;
import org.openconcerto.sql.model.ConnectionHandlerNoSetup;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.DBSystemRoot;
import org.openconcerto.sql.model.SQLDataSource;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLInsert;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.SQLUpdate;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.User;
import org.openconcerto.sql.utils.SQLUtils;
import org.openconcerto.utils.CollectionUtils;
import org.openconcerto.utils.cc.ITransformer;
 
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
 
import org.apache.commons.dbutils.ResultSetHandler;
 
public class Exercice {
private Date debut;
private Date fin;
private static final Logger LOGGER = Logger.getLogger(Exercice.class.getName());
 
public Exercice() {
 
}
 
public Exercice(Date debut, Date fin) {
if (debut != null && debut.after(fin)) {
throw new IllegalArgumentException("date de fin invalide");
}
this.debut = debut;
this.fin = fin;
}
 
public String toString() {
return "Exercice " + this.debut + " -> " + this.fin;
}
 
public void insert(SQLElementDirectory directory, final DBRoot root, User user, List<Piece> pieces) throws SQLException {
final DBSystemRoot sysRoot = root.getDBSystemRoot();
final List<SQLInsert> insertsPiece = new ArrayList<>();
LOGGER.log(Level.INFO, "insertion de {0} pièces comptables", pieces.size());
for (Piece p : pieces) {
// Pièces
insertsPiece.add(p.createInsert(root));
 
// Vérification des mouvements
final List<Mouvement> mouvements = p.getMouvements();
if (mouvements.isEmpty()) {
throw new IllegalStateException("Piece vide : " + p);
}
 
for (Mouvement m : mouvements) {
if (!m.isBalanced()) {
throw new IllegalStateException("Mouvement non balancé : " + m);
}
if (m.isEmpty()) {
throw new IllegalStateException("Mouvement vide : " + m);
}
 
for (Ecriture e : m.getEcritures()) {
if (this.debut != null && e.getDate().before(this.debut)) {
throw new IllegalStateException("Mouvement invalide : " + m + " : une écriture est définie avant la date de début d'exercice : " + e);
}
if (e.getNom() == null) {
throw new IllegalStateException("Ecriture sans nom : " + e);
}
}
 
if (this.fin != null) {
for (Ecriture e : m.getEcritures()) {
if (e.getDate().after(this.fin)) {
throw new IllegalStateException("Mouvement invalide : " + m + " : une écriture est définie après la date de fin d'exercice : " + e.getDate() + ">" + this.fin);
}
 
}
}
 
}
}
 
SQLUtils.executeAtomic(sysRoot.getDataSource(), new ConnectionHandlerNoSetup<Object, SQLException>() {
@Override
public Object handle(SQLDataSource ds) throws SQLException {
// Insertion des journaux et comptes manquants et remplissage des champs journaux et
// comptes des
// écritures depuis les ids
final Set<Journal> journauxACreerOuFetcher = new HashSet<>();
final Set<Number> journauxAresoudre = new HashSet<>();
final Set<Compte> comptesACreerOuFetcher = new HashSet<>();
final Set<Number> comptesAresoudre = new HashSet<>();
final List<Ecriture> ecrituresSansJournalID = new LinkedList<>();
final List<Ecriture> ecrituresSansCompteID = new LinkedList<>();
for (Piece p : pieces) {
for (Mouvement m : p.getMouvements()) {
for (Ecriture e : m.getEcritures()) {
if (e.getJournalID() == null) {
// Journal à creer
journauxACreerOuFetcher.add(new Journal(null, e.getJournalCode(), e.getJournalNom()));
ecrituresSansJournalID.add(e);
} else {
journauxAresoudre.add(e.getJournalID());
}
if (e.getCompteID() == null) {
// Compte à creer
comptesACreerOuFetcher.add(new Compte(null, e.getCompteNumero(), e.getCompteNom()));
ecrituresSansCompteID.add(e);
} else {
comptesAresoudre.add(e.getJournalID());
}
}
 
}
}
final Map<Long, Journal> mapJournaux = new HashMap<>();
if (!journauxACreerOuFetcher.isEmpty()) {
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine(journauxACreerOuFetcher.size() + " journaux à créer : " + journauxACreerOuFetcher);
}
// On récupère tous les journaux car il y en a peu
final Map<String, Journal> codesDesJournauxExistants = getCodesJournaux(root);
 
final List<SQLInsert> insertsJournaux = new ArrayList<>();
final List<Journal> list = new ArrayList<>();
for (Journal journal : journauxACreerOuFetcher) {
// journal non déjà existant
if (codesDesJournauxExistants.get(journal.getCode().toLowerCase()) == null) {
list.add(journal);
insertsJournaux.add(journal.createInsert(root));
}
}
final List<Number> journauxIds = new ArrayList<>();
if (!insertsJournaux.isEmpty()) {
journauxIds.addAll(SQLInsert.executeSimilarInserts(sysRoot, insertsJournaux, true));
journauxAresoudre.addAll(journauxIds);
}
// Mise à jour de l'ID du journal pour les écritures dont le journal vient
// d'être créé
final int size = list.size();
for (int i = 0; i < size; i++) {
final String journalCode = list.get(i).getCode();
final Number journalID = journauxIds.get(i);
final Iterator<Ecriture> it = ecrituresSansJournalID.iterator();
while (it.hasNext()) {
final Ecriture e = it.next();
 
if (e.getJournalCode().equalsIgnoreCase(journalCode)) {
e.setJournalID(journalID);
it.remove();
}
 
}
}
final Iterator<Ecriture> it = ecrituresSansJournalID.iterator();
while (it.hasNext()) {
final Ecriture e = it.next();
final Journal journal = codesDesJournauxExistants.get(e.getJournalCode().toLowerCase());
e.setJournalID(journal.getId());
it.remove();
}
for (Journal journal : codesDesJournauxExistants.values()) {
mapJournaux.put(journal.getId(), journal);
}
}
final Map<Long, Compte> mapComptes = new HashMap<>();
if (!comptesACreerOuFetcher.isEmpty()) {
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine(comptesACreerOuFetcher.size() + " comptes à créer ou fetcher: " + comptesACreerOuFetcher);
}
final Map<String, Compte> numerosDesComptesExistants = getNumeroDesComptes(root, pieces);
 
final List<SQLInsert> insertsComptes = new ArrayList<>();
final List<Compte> list = new ArrayList<>();
for (Compte c : comptesACreerOuFetcher) {
if (numerosDesComptesExistants.get(c.getNumero().toLowerCase()) == null) {
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine("création du compte : " + c.getNumero().toLowerCase());
}
list.add(c);
insertsComptes.add(c.createInsert(root));
}
}
List<Number> comptesIds = new ArrayList<>();
if (!insertsComptes.isEmpty()) {
 
final List<Number> insertedIDs = SQLInsert.executeSimilarInserts(sysRoot, insertsComptes, true);
comptesIds.addAll(insertedIDs);
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine("IDs des comptes créés : " + comptesIds);
}
 
comptesAresoudre.addAll(comptesIds);
}
 
// Mise à jour de l'ID du compte pour les écritures dont le compte vient
// d'être créé
final int size = list.size();
for (int i = 0; i < size; i++) {
final String compteCode = list.get(i).getNumero();
final Number compteID = comptesIds.get(i);
final Iterator<Ecriture> it = ecrituresSansCompteID.iterator();
while (it.hasNext()) {
final Ecriture e = it.next();
if (e.getCompteNumero().equalsIgnoreCase(compteCode)) {
if (LOGGER.isLoggable(Level.FINEST)) {
LOGGER.finest("mise à jour de l'écriture " + e + " avec le compte d'ID " + compteID);
}
e.setCompteID(compteID);
it.remove();
}
}
 
}
final Iterator<Ecriture> it = ecrituresSansCompteID.iterator();
while (it.hasNext()) {
final Ecriture e = it.next();
Compte compte = numerosDesComptesExistants.get(e.getCompteNumero().toLowerCase());
if (compte != null) {
e.setCompteID(compte.getId());
it.remove();
}
 
}
for (Compte compte : numerosDesComptesExistants.values()) {
mapComptes.put(compte.getId(), compte);
}
 
}
 
// fetch journaux et comptes, update des code/numéro et nom
final List<String> queries = new ArrayList<>();
final List<ResultSetHandler> handlers = new ArrayList<>();
 
if (!comptesAresoudre.isEmpty()) {
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine(comptesAresoudre.size() + " comptes à résoudre : ids " + comptesAresoudre);
}
final SQLTable tableCompte = root.getTable("COMPTE_PCE");
final SQLSelect selCompte = new SQLSelect();
selCompte.addSelect(tableCompte.getKey());
selCompte.addSelect(tableCompte.getField("NUMERO"));
selCompte.addSelect(tableCompte.getField("NOM"));
selCompte.setWhere(new Where(tableCompte.getKey(), comptesAresoudre));
queries.add(selCompte.asString());
handlers.add(new ResultSetHandler() {
 
@Override
public Object handle(ResultSet rs) throws SQLException {
while (rs.next()) {
final Long id = rs.getLong(1);
final String numero = rs.getString(2);
final String nom = rs.getString(3);
mapComptes.put(id, new Compte(id, numero, nom));
 
}
return null;
}
});
}
if (!journauxAresoudre.isEmpty()) {
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine(journauxAresoudre.size() + " journaux à résoudre ids : " + journauxAresoudre);
}
final SQLTable tableJournal = root.getTable("JOURNAL");
final SQLSelect selJournal = new SQLSelect();
selJournal.addSelect(tableJournal.getKey());
selJournal.addSelect(tableJournal.getField("CODE"));
selJournal.addSelect(tableJournal.getField("NOM"));
selJournal.setWhere(new Where(tableJournal.getKey(), journauxAresoudre));
queries.add(selJournal.asString());
handlers.add(new ResultSetHandler() {
 
@Override
public Object handle(ResultSet rs) throws SQLException {
while (rs.next()) {
final Long id = rs.getLong(1);
final String code = rs.getString(2);
final String nom = rs.getString(3);
mapJournaux.put(id, new Journal(id, code, nom));
 
}
return null;
}
});
 
}
 
SQLUtils.executeMultiple(sysRoot, queries, handlers);
for (Piece p : pieces) {
for (Mouvement m : p.getMouvements()) {
for (Ecriture e : m.getEcritures()) {
Number compteID = e.getCompteID();
if (compteID == null) {
throw new IllegalStateException("pas d'ID compte dans l'écriture " + e);
}
final Long idCompte = compteID.longValue();
final Compte c = mapComptes.get(idCompte);
if (c == null) {
throw new IllegalStateException("pas de compte d'ID " + idCompte + " dans la map " + mapComptes.keySet());
}
e.setCompte(c.getNumero(), c.getNom());
 
final Long idJournal = e.getJournalID().longValue();
final Journal j = mapJournaux.get(idJournal);
if (j == null) {
throw new IllegalStateException("pas de journal d'ID " + idJournal + " dans la map " + mapJournaux.keySet());
}
e.setJournal(j.getCode(), j.getNom());
 
}
}
}
 
// Insertion des pieces
final List<Number> idsPieces = SQLInsert.executeSimilarInserts(sysRoot, insertsPiece, true);
 
// Creation des inserts des mouvements
final List<SQLInsert> insertsMouvement = new ArrayList<>(insertsPiece.size() * 3);
final List<Mouvement> listMvtWithoutIDs = new ArrayList<>(insertsPiece.size() * 3);
for (int i = 0; i < pieces.size(); i++) {
Piece piece = pieces.get(i);
piece.setId(idsPieces.get(i));
for (Mouvement m : piece.getMouvements()) {
listMvtWithoutIDs.add(m);
insertsMouvement.add(m.createInsert(root));
}
}
 
// Insertion des mouvements
final List<Number> idsMouvements = SQLInsert.executeSimilarInserts(sysRoot, insertsMouvement, true);
 
// Mise à jour des numeros de mouvements
SQLSelect sel = new SQLSelect();
final SQLTable tableMvt = root.getTable("MOUVEMENT");
sel.addSelect(tableMvt.getField("NUMERO"), "MAX");
Number maxMvtNumber = (Number) sysRoot.getDataSource().executeScalar(sel.asString());
int maxMvt = 1;
if (maxMvtNumber != null) {
maxMvt = maxMvtNumber.intValue();
}
List<SQLUpdate> mvtUpdate = new ArrayList<>();
for (int i = 0; i < idsMouvements.size(); i++) {
Number mvtId = idsMouvements.get(i);
SQLUpdate update = new SQLUpdate(new Where(tableMvt.getKey(), "=", mvtId));
update.add(tableMvt.getField("NUMERO"), maxMvt);
mvtUpdate.add(update);
maxMvt++;
listMvtWithoutIDs.get(i).setId(mvtId);
}
 
SQLUpdate.executeMultipleWithBatch(sysRoot, mvtUpdate);
 
// Creation des inserts des écritures sans analytique
final List<SQLInsert> insertsEcrituresSansAnalytique = new ArrayList<>(insertsMouvement.size() * 2);
final List<SQLInsert> insertsEcrituresAvecAnalytique = new ArrayList<>(insertsMouvement.size() * 2);
final List<Ecriture> ecrituresAvecAnalytique = new ArrayList<>(insertsEcrituresAvecAnalytique.size());
for (Piece p : pieces) {
final List<Mouvement> mouvements = p.getMouvements();
final int stop = mouvements.size();
for (int i = 0; i < stop; i++) {
final Mouvement m = mouvements.get(i);
for (Ecriture e : m.getEcritures()) {
if (e.hasAnalytique()) {
insertsEcrituresAvecAnalytique.add(e.createInsert(root, user));
ecrituresAvecAnalytique.add(e);
} else {
insertsEcrituresSansAnalytique.add(e.createInsert(root, user));
}
}
 
}
}
// Insertions des écritures des mouvements
SQLInsert.executeSimilarInserts(sysRoot, insertsEcrituresSansAnalytique, false);
// Insertions des écritures avec analytique
if (!ecrituresAvecAnalytique.isEmpty()) {
final List<Number> idsEcritues = SQLInsert.executeSimilarInserts(sysRoot, insertsEcrituresAvecAnalytique, true);
// Analytique
final List<SQLInsert> insertsAssociationAnalytique = new ArrayList<>(insertsEcrituresAvecAnalytique.size());
final int size = ecrituresAvecAnalytique.size();
for (int i = 0; i < size; i++) {
final Ecriture e = ecrituresAvecAnalytique.get(i);
e.setId(idsEcritues.get(i));
for (AssociationAnalytique a : e.getAssociationsAnalytiques()) {
insertsAssociationAnalytique.add(a.createInsert(root, user));
}
}
SQLInsert.executeSimilarInserts(sysRoot, insertsAssociationAnalytique, false);
}
for (Piece p : pieces) {
final List<Mouvement> mouvements = p.getMouvements();
for (Mouvement m : mouvements) {
if (m.getPostInsertionAction() != null) {
m.getPostInsertionAction().afterInsert(m);
}
}
 
}
 
return null;
}
});
 
}
 
/**
* Map des numero de compte en minuscule <-> Compte
*
* @param pieces pièces servant à déterminer sur quels numéros de compte on limite la requête
*/
protected Map<String, Compte> getNumeroDesComptes(DBRoot root, List<Piece> pieces) {
// tous les comptes dont le numero
// est parmis celles des écritures des pièces
final Set<String> numerosDesComptes = new HashSet<>();
for (Piece p : pieces) {
final List<Mouvement> mouvements = p.getMouvements();
for (Mouvement m : mouvements) {
for (Ecriture e : m.getEcritures()) {
numerosDesComptes.add(e.getCompteNumero().toLowerCase());
}
}
}
 
final Map<String, Compte> result = new HashMap<>();
final SQLTable tableCompte = root.getTable("COMPTE_PCE");
final SQLSelect selCompte = new SQLSelect();
selCompte.addSelect(tableCompte.getKey());
final SQLField fNumero = tableCompte.getField("NUMERO");
selCompte.addSelect(fNumero);
selCompte.addSelect(tableCompte.getField("NOM"));
String numeros = CollectionUtils.join(numerosDesComptes, ",", new ITransformer<Object, String>() {
@Override
public String transformChecked(final Object input) {
return fNumero.getField().getType().toString(input);
}
});
final Where w = Where.createRaw("lower(" + fNumero.getFieldRef() + ") in (" + numeros + ")", fNumero);
selCompte.setWhere(w);
 
final ResultSetHandler resultSetHandler = new ResultSetHandler() {
 
@Override
public Object handle(ResultSet rs) throws SQLException {
while (rs.next()) {
final Long id = rs.getLong(1);
final String numero = rs.getString(2);
final String nom = rs.getString(3);
result.put(numero.toLowerCase(), new Compte(id, numero, nom));
}
return null;
}
};
 
root.getDBSystemRoot().getDataSource().execute(selCompte.asString(), resultSetHandler);
return result;
}
 
/**
* Map des codes en minuscule <-> Journal
*/
protected Map<String, Journal> getCodesJournaux(DBRoot root) {
final Map<String, Journal> result = new HashMap<>();
final SQLTable tableJournal = root.getTable("JOURNAL");
final SQLSelect selJournal = new SQLSelect();
selJournal.addSelect(tableJournal.getKey());
selJournal.addSelect(tableJournal.getField("CODE"));
selJournal.addSelect(tableJournal.getField("NOM"));
 
final ResultSetHandler resultSetHandler = new ResultSetHandler() {
 
@Override
public Object handle(ResultSet rs) throws SQLException {
while (rs.next()) {
final Long id = rs.getLong(1);
final String code = rs.getString(2);
final String nom = rs.getString(3);
result.put(code.toLowerCase(), new Journal(id, code, nom));
}
return null;
}
};
 
root.getDBSystemRoot().getDataSource().execute(selJournal.asString(), resultSetHandler);
return result;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/Compte.java
New file
0,0 → 1,69
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationEcritures;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLInsert;
import org.openconcerto.sql.model.SQLTable;
 
public class Compte {
private final Long id;
private String numero;
private String nom;
 
public Compte(Long id, String numero, String nom) {
this.id = id;
this.numero = numero;
this.nom = nom;
}
 
public Long getId() {
return this.id;
}
 
public String getNumero() {
return this.numero;
}
 
public String getNom() {
return this.nom;
}
 
@Override
public int hashCode() {
return this.numero.hashCode();
}
 
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (this.getClass() != obj.getClass())
return false;
return ((Compte) obj).numero.equalsIgnoreCase(this.numero);
}
 
SQLInsert createInsert(DBRoot root) {
final SQLInsert insert = new SQLInsert();
final SQLTable table = root.getTable("COMPTE_PCE");
insert.add(table.getField("NUMERO"), this.numero);
insert.add(table.getField("NOM"), this.nom);
return insert;
}
 
@Override
public String toString() {
return "Compte numero:" + this.numero + " " + this.nom + " (id:" + this.id + ")";
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/AssociationAnalytique.java
New file
0,0 → 1,67
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationEcritures;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLInsert;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.users.User;
 
import java.math.BigDecimal;
 
public class AssociationAnalytique {
private final int idPosteAnalytique;
private int idSaisieKmElement = 1;
private BigDecimal pourcentage;
private long montant; // centimes
private boolean gestionAuto = false;
private Ecriture ecriture;
 
public AssociationAnalytique(int idPosteAnalytique) {
this.idPosteAnalytique = idPosteAnalytique;
}
 
public void setIdSaisieKmElement(int idSaisieKmElement) {
this.idSaisieKmElement = idSaisieKmElement;
}
 
public void setPourcentage(BigDecimal pourcentage) {
this.pourcentage = pourcentage;
}
 
public void setMontant(long montant) {
this.montant = montant;
}
 
public void setGestionAuto(boolean gestionAuto) {
this.gestionAuto = gestionAuto;
}
 
public void setEcriture(Ecriture ecriture) {
this.ecriture = ecriture;
}
 
public SQLInsert createInsert(DBRoot root, User user) {
final SQLInsert insert = new SQLInsert();
final SQLTable table = root.getTable("ASSOCIATION_ANALYTIQUE");
insert.add(table.getField("ID_ECRITURE"), this.ecriture.getId().intValue());
insert.add(table.getField("ID_SAISIE_KM_ELEMENT"), this.idSaisieKmElement);
insert.add(table.getField("ID_POSTE_ANALYTIQUE"), this.idPosteAnalytique);
insert.add(table.getField("POURCENT"), this.pourcentage);
insert.add(table.getField("MONTANT"), this.montant);
insert.add(table.getField("GESTION_AUTO"), this.gestionAuto);
return insert;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/Journal.java
New file
0,0 → 1,69
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationEcritures;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLInsert;
import org.openconcerto.sql.model.SQLTable;
 
public class Journal {
private final Long id;
private final String code;
private final String nom;
 
public Journal(Long id, final String code, final String nom) {
this.id = id;
this.code = code;
this.nom = nom;
}
 
public Long getId() {
return this.id;
}
 
public String getNom() {
return this.nom;
}
 
public String getCode() {
return this.code;
}
 
@Override
public int hashCode() {
return this.code.hashCode();
}
 
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (this.getClass() != obj.getClass())
return false;
return ((Journal) obj).code.equalsIgnoreCase(this.code);
}
 
SQLInsert createInsert(DBRoot root) {
final SQLInsert insert = new SQLInsert();
final SQLTable table = root.getTable("JOURNAL");
insert.add(table.getField("CODE"), this.code);
insert.add(table.getField("NOM"), this.nom);
return insert;
}
 
@Override
public String toString() {
return "Journal code:" + this.code + " " + this.nom + " (id:" + this.id + ")";
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/MouvementPostInsertionAction.java
New file
0,0 → 1,22
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationEcritures;
 
import java.sql.SQLException;
 
public interface MouvementPostInsertionAction {
 
public void afterInsert(Mouvement m) throws SQLException;
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/Mouvement.java
New file
0,0 → 1,114
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationEcritures;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLInsert;
import org.openconcerto.sql.model.SQLTable;
 
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
 
public class Mouvement {
private String numero;
private List<Ecriture> ecritures = new ArrayList<>();
private Number id;
private BigDecimal debit = BigDecimal.ZERO;
private BigDecimal credit = BigDecimal.ZERO;
private Piece piece;
// Source
private Number idSource;
private String source;
private Mouvement pere;
private MouvementPostInsertionAction postInsertionAction;
 
public Mouvement() {
}
 
public void setSource(Number idSource, String source) {
this.idSource = idSource;
this.source = source;
}
 
public void add(Ecriture e) {
this.ecritures.add(e);
this.debit = this.debit.add(e.getDebit());
this.credit = this.credit.add(e.getCredit());
e.setMouvement(this);
}
 
List<Ecriture> getEcritures() {
return this.ecritures;
}
 
void setId(Number id) {
this.id = id;
}
 
public Number getId() {
return this.id;
}
 
SQLInsert createInsert(DBRoot root) {
final SQLInsert insert = new SQLInsert();
final SQLTable table = root.getTable("MOUVEMENT");
// FIXME le numero doit être généré en auto
// Thread.dumpStack();
// NUMERO = SELECT (MAX) ?
// insert.add(table.getField("NUMERO"), this.numero);
// select for update max(numero)
if (this.idSource != null) {
insert.add(table.getField("IDSOURCE"), this.idSource);
insert.add(table.getField("SOURCE"), this.source);
}
insert.add(table.getField("ID_PIECE"), this.piece.getId().intValue());
if (this.pere != null) {
insert.add(table.getField("ID_MOUVEMENT_PERE"), this.pere.getId().intValue());
}
// TODO CREATION_DATE MODIFICATION_DATE
return insert;
}
 
public boolean isBalanced() {
BigDecimal d = BigDecimal.ZERO;
BigDecimal c = BigDecimal.ZERO;
for (Ecriture e : this.ecritures) {
d = d.add(e.getDebit());
c = c.add(e.getCredit());
}
return d.compareTo(c) == 0;
}
 
public Piece getPiece() {
return this.piece;
}
 
public void setPiece(Piece piece) {
this.piece = piece;
 
}
 
public boolean isEmpty() {
return this.ecritures.isEmpty();
}
 
public MouvementPostInsertionAction getPostInsertionAction() {
return this.postInsertionAction;
}
 
public void setAfterInsert(MouvementPostInsertionAction insertionAction) {
this.postInsertionAction = insertionAction;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationEcritures.java
396,6 → 396,10
if (tiers.getObject("ID_CATEGORIE_COMPTABLE") != null && !tiers.isForeignEmpty("ID_CATEGORIE_COMPTABLE")) {
rowCatCompta = tiers.getForeign("ID_CATEGORIE_COMPTABLE");
}
 
if (row.getTable().contains("ID_CATEGORIE_COMPTABLE") && row.getObject("ID_CATEGORIE_COMPTABLE") != null && !row.isForeignEmpty("ID_CATEGORIE_COMPTABLE")) {
rowCatCompta = row.getForeign("ID_CATEGORIE_COMPTABLE");
}
TotalCalculator calc = new TotalCalculator("T_PA_HT", fieldTotalHT, null, achat, defaultCompte, rowCatCompta);
calc.setIntraComm(intra);
 
436,6 → 440,7
calc.addEchantillon((BigDecimal) sqlRow.getObject("T_PV_HT"), sqlRow.getForeign("ID_TAXE"));
}
}
 
calc.checkResult();
totalAvtRemise = calc.getTotalHT();
}
514,6 → 519,12
calc.addLine(rowValsFraisDoc, null, 1, false);
}
 
// Fix TVA si nécessaire pour facture fournisseur
if (row.getTable().contains("TVA_ADJUSTMENT")) {
BigDecimal tvaFix = row.getBigDecimal("TVA_ADJUSTMENT");
calc.addTVAAdjust(tvaFix);
}
 
calc.checkResult();
return calc;
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/Ecriture.java
New file
0,0 → 1,237
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationEcritures;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLInsert;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.users.User;
 
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class Ecriture {
private Date date;
private BigDecimal debit;
private BigDecimal credit;
private Mouvement mouvement;
private String nom;
private String compteNumero;
private String compteNom;
private Number compteID;
private String journalNom;
private String journalCode;
private Number journalID;
private List<AssociationAnalytique> associations;
private Number id;
private Map<String, Object> cookies;
private boolean cloture;
private boolean aNouveau;
private Date dateValidation;
private Date dateLettrage;
private String lettrage;
 
public Ecriture(Date date, BigDecimal debit, BigDecimal credit) {
this.date = date;
this.debit = debit;
this.credit = credit;
}
 
public SQLInsert createInsert(DBRoot root, User user) {
final SQLInsert insert = new SQLInsert();
final SQLTable table = root.getTable("ECRITURE");
insert.add(table.getField("DATE"), this.date);
insert.add(table.getField("ID_MOUVEMENT"), this.mouvement.getId().intValue());
insert.add(table.getField("DEBIT"), this.debit.multiply(new BigDecimal(100)).longValue());
insert.add(table.getField("CREDIT"), this.credit.multiply(new BigDecimal(100)).longValue());
insert.add(table.getField("NOM"), this.nom);
 
if (this.compteNom == null) {
throw new IllegalStateException("nom du compte manquant");
}
if (this.compteNumero == null || this.compteNumero.isEmpty()) {
throw new IllegalStateException("numéro du compte manquant");
}
insert.add(table.getField("ID_COMPTE_PCE"), this.compteID);
insert.add(table.getField("COMPTE_NUMERO"), this.compteNumero);
insert.add(table.getField("COMPTE_NOM"), this.compteNom);
if (this.journalNom == null) {
throw new IllegalStateException("nom du journal manquant");
}
if (this.journalCode == null || this.journalCode.isEmpty()) {
throw new IllegalStateException("code du journal manquant");
}
insert.add(table.getField("ID_JOURNAL"), this.journalID);
insert.add(table.getField("JOURNAL_NOM"), this.journalNom);
insert.add(table.getField("JOURNAL_CODE"), this.journalCode);
insert.add(table.getField("NOM_PIECE"), this.mouvement.getPiece().getNom());
insert.add(table.getField("ID_USER_COMMON_CREATE"), user.getId());
insert.add(table.getField("ID_USER_COMMON_MODIFY"), user.getId());
insert.add(table.getField("CLOTURE"), this.cloture);
insert.add(table.getField("RAN"), this.aNouveau);
if (this.dateValidation != null) {
insert.add(table.getField("DATE_VALIDE"), this.dateValidation);
insert.add(table.getField("VALIDE"), Boolean.TRUE);
} else {
insert.add(table.getField("DATE_VALIDE"), null);
insert.add(table.getField("VALIDE"), Boolean.FALSE);
}
insert.add(table.getField("DATE_LETTRAGE"), this.dateLettrage);
insert.add(table.getField("LETTRAGE"), this.lettrage == null || this.lettrage.isEmpty() ? " " : this.lettrage);
return insert;
}
 
public void setDateValidation(Date dateValidation) {
this.dateValidation = dateValidation;
}
 
public void setDateLettrage(Date dateLettrage) {
this.dateLettrage = dateLettrage;
}
 
public void setLettrage(String lettrage) {
this.lettrage = lettrage;
}
 
public void setCloture(boolean cloture) {
this.cloture = cloture;
}
 
public void setaNouveau(boolean aNouveau) {
this.aNouveau = aNouveau;
}
 
public String getNom() {
return this.nom;
}
 
public void setNom(String nom) {
this.nom = nom;
}
 
void setId(Number id) {
this.id = id;
}
 
public Number getId() {
return this.id;
}
 
public Number getCompteID() {
return this.compteID;
}
 
public void setCompteID(Number compteID) {
this.compteID = compteID;
}
 
public void setCompte(String numero, String nom) {
this.compteNumero = numero;
this.compteNom = nom;
}
 
public String getCompteNumero() {
return this.compteNumero;
}
 
public String getCompteNom() {
return this.compteNom;
}
 
public Number getJournalID() {
return this.journalID;
}
 
public void setJournalID(Number journalID) {
this.journalID = journalID;
}
 
public void setJournal(String code, String nom) {
this.journalCode = code;
this.journalNom = nom;
}
 
public String getJournalCode() {
return this.journalCode;
}
 
public String getJournalNom() {
return this.journalNom;
}
 
public BigDecimal getDebit() {
return this.debit;
}
 
public BigDecimal getCredit() {
return this.credit;
}
 
public Date getDate() {
return this.date;
}
 
public void setMouvement(Mouvement mouvement) {
this.mouvement = mouvement;
}
 
public List<AssociationAnalytique> getAssociationsAnalytiques() {
return this.associations;
}
 
public void addAssociationAnalytique(AssociationAnalytique a) {
if (this.associations == null) {
this.associations = new ArrayList<>();
}
a.setEcriture(this);
this.associations.add(a);
}
 
public void removeAssociationAnalytique(AssociationAnalytique a) {
if (this.associations == null) {
a.setEcriture(null);
return;
}
this.associations.remove(a);
a.setEcriture(null);
if (this.associations.isEmpty()) {
this.associations = null;
}
}
 
public boolean hasAnalytique() {
return this.associations != null;
}
 
public void putCookie(String key, Object value) {
if (this.cookies == null) {
this.cookies = new HashMap<>();
}
this.cookies.put(key, value);
}
 
public Object getCookie(String key) {
return this.cookies.get(key);
}
 
@Override
public String toString() {
return "Ecriture : " + this.nom + ", Compte (id:" + this.compteID + ") " + this.compteNumero + " " + this.compteNom + ", Débit : " + this.debit + ", Crédit:" + this.credit;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationReglementVenteNG.java
392,7 → 392,12
}
}
 
this.putValue("ID_JOURNAL", JournalSQLElement.BANQUES);
int idJournal = JournalSQLElement.BANQUES;
if (rowPrefsCompte.getObject("ID_JOURNAL_VALEUR_ENCAISSEMENT") != null && !rowPrefsCompte.isForeignEmpty("ID_JOURNAL_VALEUR_ENCAISSEMENT")) {
idJournal = rowPrefsCompte.getForeignID("ID_JOURNAL_VALEUR_ENCAISSEMENT");
}
this.putValue("ID_JOURNAL", idJournal);
this.putValue("ID_COMPTE_PCE", idCompteClient);
this.putValue("DEBIT", Long.valueOf(0));
this.putValue("CREDIT", Long.valueOf(ttc.getLongValue()));
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtFactureFournisseur.java
166,6 → 166,10
}
}
this.putValue("ID_COMPTE_PCE", new Integer(idCompteFourn));
if (rowFournisseur.getTable().getTable("ECRITURE").contains("CODE_CLIENT")) {
this.putValue("CODE_CLIENT", rowFournisseur.getString("CODE"));
}
 
this.putValue("DEBIT", new Long(0));
if (rowFournisseur.getBoolean("UE")) {
this.putValue("CREDIT", new Long(htLongValue));
/trunk/OpenConcerto/src/org/openconcerto/erp/core/reports/stat/action/ReportingCommercialAction.java
New file
0,0 → 1,42
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.reports.stat.action;
 
import org.openconcerto.erp.action.CreateFrameAbstractAction;
import org.openconcerto.erp.core.common.ui.PanelFrame;
import org.openconcerto.erp.core.customerrelationship.customer.report.ReportingCommercialPanel;
import org.openconcerto.sql.model.DBRoot;
 
import javax.swing.Action;
import javax.swing.JFrame;
 
public class ReportingCommercialAction extends CreateFrameAbstractAction {
 
private static final String TITLE = "CA par commercial";
 
private DBRoot root;
 
public ReportingCommercialAction(DBRoot root) {
super();
this.root = root;
this.putValue(Action.NAME, TITLE);
this.mustLoadState = false;
}
 
public JFrame createFrame() {
final PanelFrame panelFrame = new PanelFrame(new ReportingCommercialPanel(this.root), TITLE);
panelFrame.setResizable(false);
return panelFrame;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/stock/element/DepotStockSQLElement.java
14,16 → 14,27
package org.openconcerto.erp.core.supplychain.stock.element;
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.common.ui.ListeViewPanel;
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.view.IListFrame;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.FrameUtil;
import org.openconcerto.utils.ListMap;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
 
import javax.swing.AbstractAction;
import javax.swing.JLabel;
import javax.swing.JTextField;
 
33,6 → 44,21
 
public DepotStockSQLElement() {
super("DEPOT_STOCK", "un dépôt", "dépôts");
 
PredicateRowAction actionStock = new PredicateRowAction(new AbstractAction("Voir le détails du stock") {
 
@Override
public void actionPerformed(ActionEvent e) {
SQLRowAccessor selRow = IListe.get(e).getSelectedRow();
final SQLElement elementStock = getDirectory().getElement("STOCK");
IListFrame frame = new IListFrame(
new ListeViewPanel(elementStock, new IListe(elementStock.createTableSource(new Where(elementStock.getTable().getField("ID_DEPOT_STOCK"), "=", selRow.getID())))));
FrameUtil.showPacked(frame);
 
}
}, true);
actionStock.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(actionStock);
}
 
protected List<String> getListFields() {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/stock/element/StockItemsUpdater.java
25,6 → 25,8
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.SQLTableEvent;
import org.openconcerto.sql.model.SQLTableEvent.Mode;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.utils.SQLUtils;
import org.openconcerto.utils.DecimalUtils;
154,12 → 156,13
for (String s : requests) {
handlers.add(null);
}
// FIXME FIRE TABLE CHANGED TO UPDATE ILISTE ??
try {
SQLUtils.executeAtomic(stockTable.getDBSystemRoot().getDataSource(), new ConnectionHandlerNoSetup<Object, IOException>() {
@Override
public Object handle(SQLDataSource ds) throws SQLException, IOException {
SQLUtils.executeMultiple(stockTable.getDBSystemRoot(), requests, handlers);
// FIXME FIRE ONLY CHANGED ROWS
stockTable.fire(new SQLTableEvent(stockTable, SQLRow.NONEXISTANT_ID, Mode.ROW_UPDATED));
return null;
}
});
264,35 → 267,6
SQLUtils.executeMultiple(table.getDBSystemRoot(), multipleRequests, handlers);
}
 
private void fillProductComponent(List<ProductComponent> productComponents, int qte, int index, int level) {
if (level > 0) {
for (int i = index; i < items.size(); i++) {
SQLRowAccessor r = items.get(i);
 
if (!r.getTable().contains("NIVEAU") || r.getInt("NIVEAU") >= level) {
// On ne calcul pas les stocks pour les éléments ayant des fils (le mouvement de
// stock
// des fils impactera les stocks automatiquement)
if (r.getTable().contains("NIVEAU")) {
if (i + 1 < items.size()) {
SQLRowAccessor rNext = items.get(i + 1);
if (rNext.getInt("NIVEAU") > r.getInt("NIVEAU")) {
fillProductComponent(productComponents, qte * r.getInt("QTE"), i + 1, rNext.getInt("NIVEAU"));
continue;
}
}
}
if ((!r.getTable().contains("NIVEAU") || r.getInt("NIVEAU") == level) && !r.isForeignEmpty("ID_ARTICLE") && r.getForeign("ID_ARTICLE") != null) {
productComponents.add(ProductComponent.createFrom(r, qte, r));
}
} else if (r.getInt("NIVEAU") < level) {
// BREAK si on sort de l'article composé
break;
}
}
}
}
 
/**
* Récupére les stocks associés aux articles non composés (inclus les fils des nomenclatures) et
* les met à jour
305,9 → 279,10
 
String mvtStockTableQuoted = rowSource.getTable().getTable("MOUVEMENT_STOCK").getSQLName().quote();
 
ProductHelper helper = new ProductHelper(rowSource.getTable().getDBRoot());
// Liste des éléments à mettre à jour
List<ProductComponent> productComponents = new ArrayList<ProductComponent>();
fillProductComponent(productComponents, 1, 0, 1);
helper.fillProductComponent(this.items, productComponents, 1, 0, 1);
// for (int i = 0; i < items.size(); i++) {
// SQLRowAccessor r = items.get(i);
//
327,7 → 302,6
// }
 
// Liste des articles non composés à mettre à jour (avec les fils des nomenclatures)
ProductHelper helper = new ProductHelper(rowSource.getTable().getDBRoot());
List<ProductComponent> boms = helper.getChildWithQtyFrom(productComponents);
 
for (ProductComponent productComp : boms) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/stock/element/StockSQLElement.java
20,6 → 20,7
import org.openconcerto.erp.model.MouseSheetXmlListeListener;
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
100,7 → 101,7
@Override
public ListMap<String, String> getShowAs() {
if (getTable().contains("ID_DEPOT_STOCK")) {
return ListMap.singleton(null, "QTE_TH", "QTE_REEL", "QTE_LIV_ATTENTE", "QTE_RECEPT_ATTENTE", "ID_DEPOT_STOCK");
return ListMap.singleton(null, "QTE_TH", "QTE_REEL", "QTE_MIN", "QTE_LIV_ATTENTE", "QTE_RECEPT_ATTENTE", "ID_DEPOT_STOCK");
} else {
return ListMap.singleton(null, "QTE_TH", "QTE_REEL", "QTE_LIV_ATTENTE", "QTE_RECEPT_ATTENTE");
}
134,7 → 135,14
if (rowValsSource.getForeign("ID_DEPOT_STOCK") != null && !rowValsSource.isForeignEmpty("ID_DEPOT_STOCK")) {
idDepot = rowValsSource.getForeignID("ID_DEPOT_STOCK");
} else {
idDepot = rowValsSource.getForeign("ID_ARTICLE").getForeignID("ID_DEPOT_STOCK");
SQLRowAccessor rowValsArt = rowValsSource.getForeign("ID_ARTICLE");
if (rowValsArt.getObject("ID_DEPOT_STOCK") == null) {
rowValsArt = rowValsArt.asRow();
((SQLRow) rowValsArt).fetchValues();
System.err.println("REFETCH ARTICLE");
Thread.dumpStack();
}
idDepot = rowValsArt.getForeignID("ID_DEPOT_STOCK");
}
SQLTable stockTable = rowValsSource.getTable().getTable("STOCK");
SQLRowValues putRowValuesStock = new SQLRowValues(stockTable);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/stock/element/MouvementStockSQLElement.java
16,10 → 16,12
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.sales.product.element.ReferenceArticleSQLElement;
import org.openconcerto.erp.core.sales.product.element.UniteVenteArticleSQLElement;
import org.openconcerto.erp.core.supplychain.order.component.CommandeSQLComponent;
import org.openconcerto.erp.core.supplychain.order.ui.CommandeItemTable;
import org.openconcerto.erp.core.supplychain.supplier.component.MouvementStockSQLComponent;
import org.openconcerto.erp.preferences.GestionArticleGlobalPreferencePanel;
import org.openconcerto.erp.preferences.GestionCommercialeGlobalPreferencePanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElement;
50,6 → 52,7
import java.util.List;
import java.util.Map.Entry;
 
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
 
public class MouvementStockSQLElement extends ComptaSQLConfElement {
246,10 → 249,10
}
 
public static void createCommandeF(final ListMap<SQLRow, SQLRowValues> col, final SQLRow rowDevise) {
createCommandeF(col, rowDevise, "", true);
createCommandeF(col, rowDevise, "");
}
 
public static void createCommandeF(final ListMap<SQLRow, SQLRowValues> col, final SQLRow rowDevise, final String ref, final boolean useCommandeEnCours) {
public static void createCommandeF(final ListMap<SQLRow, SQLRowValues> col, final SQLRow rowDevise, final String ref) {
if (SwingUtilities.isEventDispatchThread()) {
throw new IllegalStateException("This method must be called outside of EDT");
}
256,6 → 259,7
if (col.size() > 0) {
 
final SQLElement commande = Configuration.getInstance().getDirectory().getElement("COMMANDE");
Boolean useCommandeEnCours = SQLPreferences.getMemCached(commande.getTable().getDBRoot()).getBoolean(GestionCommercialeGlobalPreferencePanel.COMMANDE_FOURNISSEUR_EN_COURS, false);
for (final Entry<SQLRow, List<SQLRowValues>> e : col.entrySet()) {
final SQLRow fournisseur = e.getKey();
// On regarde si il existe une commande en cours existante
324,8 → 328,22
}
}
if (rowValsMatch != null) {
final int qte = rowValsMatch.getInt("QTE");
model.putValue(qte + rowValsElt.getInt("QTE"), index, "QTE");
 
int qte = rowValsMatch.getInt("QTE");
BigDecimal qteUV = rowValsMatch.getBigDecimal("QTE_UNITAIRE");
 
if (rowValsMatch.getObject("ID_UNITE_VENTE") != null && rowValsMatch.getForeignID("ID_UNITE_VENTE") != UniteVenteArticleSQLElement.A_LA_PIECE) {
qteUV = qteUV.multiply(new BigDecimal(qte));
int qteElt = rowValsElt.getInt("QTE");
BigDecimal qteUVElt = rowValsElt.getBigDecimal("QTE_UNITAIRE");
qteUV = qteUV.add(qteUVElt.multiply(new BigDecimal(qteElt)));
qte = 1;
} else {
qte += rowValsElt.getInt("QTE");
}
 
model.putValue(qte, index, "QTE");
model.putValue(qteUV, index, "QTE_UNITAIRE");
} else {
model.addRow(rowValsElt);
if (rowValsElt.getObject("ID_ARTICLE") != null && !rowValsElt.isForeignEmpty("ID_ARTICLE")) {
342,9 → 360,16
 
}
});
 
}
} else {
SwingUtilities.invokeLater(new Runnable() {
 
@Override
public void run() {
JOptionPane.showMessageDialog(null, "Aucune commande à passer", "Commande fournisseur", JOptionPane.INFORMATION_MESSAGE);
}
 
});
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/action/ListeDesCommandesAction.java
14,9 → 14,11
package org.openconcerto.erp.core.supplychain.order.action;
 
import org.openconcerto.erp.action.CreateFrameAbstractAction;
import org.openconcerto.erp.core.common.ui.IListFilterDatePanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.FieldPath;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.sql.model.graph.PathBuilder;
25,13 → 27,17
import org.openconcerto.sql.view.list.BaseSQLTableModelColumn;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.SQLTableModelSourceOnline;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.table.PercentTableCellRenderer;
import org.openconcerto.utils.CollectionUtils;
import org.openconcerto.utils.DecimalUtils;
 
import java.awt.GridBagConstraints;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
 
import javax.swing.Action;
47,28 → 53,135
 
final SQLElement elementCmd = Configuration.getInstance().getDirectory().getElement("COMMANDE");
final SQLTableModelSourceOnline tableSource = elementCmd.getTableSource(true);
BaseSQLTableModelColumn colAvancement = new BaseSQLTableModelColumn("Avancement réception", BigDecimal.class) {
BaseSQLTableModelColumn colAvancementR = new BaseSQLTableModelColumn("Avancement réception", BigDecimal.class) {
 
@Override
protected Object show_(SQLRowAccessor r) {
 
return getAvancement(r);
return getAvancementLFromBR(r);
}
 
@Override
public Set<FieldPath> getPaths() {
final Path p = new PathBuilder(elementCmd.getTable()).addTable("TR_COMMANDE").addTable("BON_RECEPTION").build();
return CollectionUtils.createSet(new FieldPath(p, "TOTAL_HT"));
final Path p = new PathBuilder(elementCmd.getTable()).addTable("COMMANDE_ELEMENT").build();
return CollectionUtils.createSet(new FieldPath(p, "RECU_FORCED"), new FieldPath(p, "RECU"), new FieldPath(p, "QTE_RECUE"), new FieldPath(p, "PA_HT"), new FieldPath(p, "ID_ARTICLE"),
new FieldPath(p, "QTE"), new FieldPath(p, "QTE_UNITAIRE"));
}
};
tableSource.getColumns().add(colAvancementR);
colAvancementR.setRenderer(new PercentTableCellRenderer());
 
BaseSQLTableModelColumn colAvancement = new BaseSQLTableModelColumn("Avancement facturation", BigDecimal.class) {
 
@Override
protected Object show_(SQLRowAccessor r) {
 
return getAvancementFact(r);
}
 
@Override
public Set<FieldPath> getPaths() {
final Path p = new PathBuilder(elementCmd.getTable()).addTable("TR_COMMANDE").addTable("SAISIE_ACHAT").build();
final Path p2 = new PathBuilder(elementCmd.getTable()).addTable("TR_COMMANDE").addTable("FACTURE_FOURNISSEUR").build();
 
final Path pBr = new PathBuilder(elementCmd.getTable()).addTable("TR_COMMANDE").addTable("BON_RECEPTION").build();
final Path trBr = pBr.add(elementCmd.getTable().getTable("TR_BON_RECEPTION"));
final Path pFact2 = trBr.addTable("FACTURE_FOURNISSEUR");
final Path pAchat2 = trBr.addTable("SAISIE_ACHAT");
return CollectionUtils.createSet(new FieldPath(p, "MONTANT_HT"), new FieldPath(p2, "T_HT"), new FieldPath(pAchat2, "MONTANT_HT"), new FieldPath(pFact2, "T_HT"));
}
};
tableSource.getColumns().add(colAvancement);
colAvancement.setRenderer(new PercentTableCellRenderer());
 
final IListFrame frame = new IListFrame(new ListeAddPanel(elementCmd, new IListe(tableSource)));
final ListeAddPanel panel = new ListeAddPanel(elementCmd, new IListe(tableSource));
// Date panel
Map<IListe, SQLField> map = new HashMap<IListe, SQLField>();
map.put(panel.getListe(), elementCmd.getTable().getField("DATE"));
 
IListFilterDatePanel datePanel = new IListFilterDatePanel(map, IListFilterDatePanel.getDefaultMap());
GridBagConstraints c = new DefaultGridBagConstraints();
c.weightx = 0;
c.fill = GridBagConstraints.NONE;
c.gridy = 4;
c.anchor = GridBagConstraints.CENTER;
c.weighty = 0;
datePanel.setFilterOnDefault();
panel.add(datePanel, c);
final IListFrame frame = new IListFrame(panel);
 
return frame;
}
 
private BigDecimal getAvancementLFromBR(SQLRowAccessor r) {
Collection<? extends SQLRowAccessor> rows = r.getReferentRows(r.getTable().getTable("COMMANDE_ELEMENT"));
BigDecimal totalQte = BigDecimal.ZERO;
BigDecimal totalQteL = BigDecimal.ZERO;
for (SQLRowAccessor row : rows) {
BigDecimal qte = row.getBigDecimal("QTE_UNITAIRE").multiply(new BigDecimal(row.getInt("QTE")));
// On ne prend en compte que les articles ou les lignes différentes de 0
if (!row.isForeignEmpty("ID_ARTICLE") || row.getBigDecimal("PA_HT").signum() != 0) {
totalQte = totalQte.add(qte);
if (row.getBoolean("RECU_FORCED") || row.getBoolean("RECU")) {
totalQteL = totalQteL.add(qte);
} else if (row.getBigDecimal("QTE_RECUE") != null) {
final BigDecimal qteLivree = row.getBigDecimal("QTE_RECUE");
if (qteLivree != null) {
totalQteL = totalQteL.add(qteLivree);
}
}
}
}
if (totalQte.signum() != 0) {
return totalQteL.divide(totalQte, DecimalUtils.HIGH_PRECISION).movePointRight(2).setScale(2, RoundingMode.HALF_UP);
} else {
return BigDecimal.ONE.movePointRight(2);
}
}
 
BigDecimal bigDecimal100 = new BigDecimal(100.0);
 
private BigDecimal getAvancementFact(SQLRowAccessor r) {
Collection<? extends SQLRowAccessor> rows = r.getReferentRows(r.getTable().getTable("TR_COMMANDE"));
long totalFact = 0;
long total = r.getLong("T_HT");
for (SQLRowAccessor row : rows) {
if (!row.isForeignEmpty("ID_FACTURE_FOURNISSEUR")) {
SQLRowAccessor rowFact = row.getForeign("ID_FACTURE_FOURNISSEUR");
Long l = rowFact.getLong("T_HT");
totalFact += l;
}
if (!row.isForeignEmpty("ID_SAISIE_ACHAT")) {
SQLRowAccessor rowFact = row.getForeign("ID_SAISIE_ACHAT");
Long l = rowFact.getLong("MONTANT_HT");
totalFact += l;
}
 
if (!row.isForeignEmpty("ID_BON_RECEPTION")) {
Collection<? extends SQLRowAccessor> rowsBr = row.getForeign("ID_BON_RECEPTION").getReferentRows(r.getTable().getTable("TR_BON_RECEPTION"));
for (SQLRowAccessor rowTrBr : rowsBr) {
if (!rowTrBr.isForeignEmpty("ID_FACTURE_FOURNISSEUR")) {
SQLRowAccessor rowFact = rowTrBr.getForeign("ID_FACTURE_FOURNISSEUR");
Long l = rowFact.getLong("T_HT");
totalFact += l;
}
if (!rowTrBr.isForeignEmpty("ID_SAISIE_ACHAT")) {
SQLRowAccessor rowFact = rowTrBr.getForeign("ID_SAISIE_ACHAT");
Long l = rowFact.getLong("MONTANT_HT");
totalFact += l;
}
 
}
}
}
 
if (total > 0) {
return this.bigDecimal100.min(new BigDecimal(totalFact).divide(new BigDecimal(total), DecimalUtils.HIGH_PRECISION).movePointRight(2).setScale(2, RoundingMode.HALF_UP));
} else {
return BigDecimal.ONE.movePointRight(2);
}
}
 
private BigDecimal getAvancement(SQLRowAccessor r) {
Collection<? extends SQLRowAccessor> rows = r.getReferentRows(r.getTable().getTable("TR_COMMANDE"));
long totalFact = 0;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/component/CommandeSQLComponent.java
31,6 → 31,7
import org.openconcerto.erp.generationDoc.gestcomm.CommandeXmlSheet;
import org.openconcerto.erp.panel.PanelOOSQLComponent;
import org.openconcerto.erp.preferences.DefaultNXProps;
import org.openconcerto.erp.preferences.GestionCommercialeGlobalPreferencePanel;
import org.openconcerto.erp.utils.TM;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.DefaultElementSQLObject;
47,9 → 48,11
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.sql.sqlobject.JUniqueTextField;
import org.openconcerto.sql.sqlobject.SQLRequestComboBox;
import org.openconcerto.sql.sqlobject.SQLTextCombo;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.list.RowValuesTable;
import org.openconcerto.sql.view.list.RowValuesTableModel;
import org.openconcerto.ui.AutoHideListener;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.FormLayouter;
61,6 → 64,7
import org.openconcerto.ui.component.InteractionMode;
import org.openconcerto.ui.preferences.DefaultProps;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.checks.ValidState;
 
import java.awt.Color;
import java.awt.GridBagConstraints;
70,7 → 74,9
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
 
import javax.swing.JCheckBox;
import javax.swing.JLabel;
109,6 → 115,17
return this.fourn;
}
 
@Override
protected Set<String> createRequiredNames() {
final Set<String> s = new HashSet<>(4);
if (getTable().contains("ID_TYPE_CMD")) {
s.add("ID_TYPE_CMD");
s.add("DA1");
s.add("ID_POLE_PRODUIT");
}
return s;
}
 
public void addViews() {
this.setLayout(new GridBagLayout());
final GridBagConstraints c = new DefaultGridBagConstraints();
184,7 → 201,9
} else {
table.setRowCatComptable(null);
}
 
if (getTable().contains("OFFRE_COM")) {
((SQLTextCombo) getView("OFFRE_COM").getComp()).setValue(rowF.getString("RESPONSABLE"));
}
} else {
table.setRowCatComptable(null);
}
191,7 → 210,9
}
});
 
if (!getTable().getFieldsName().contains("LIVRER")) {
Boolean useCommandeEnCours = SQLPreferences.getMemCached(getElement().getTable().getDBRoot()).getBoolean(GestionCommercialeGlobalPreferencePanel.COMMANDE_FOURNISSEUR_EN_COURS, false);
 
if (!getTable().getFieldsName().contains("LIVRER") && useCommandeEnCours) {
// Commande en cours
JCheckBox boxEnCours = new JCheckBox(getLabelFor("EN_COURS"));
c.gridx += 2;
1004,6 → 1025,27
stockUpdater.update();
}
 
@Override
public synchronized ValidState getValidState() {
if (getTable().contains("ID_TYPE_CMD") && getTable().contains("ID_AFFAIRE") && getTable().getTable("COMMANDE_ELEMENT").contains("ID_AFFAIRE")) {
SQLRequestComboBox boxAff = (SQLRequestComboBox) getView("ID_AFFAIRE").getComp();
final SQLRow selectedAff = boxAff.getSelectedRow();
if (selectedAff == null || selectedAff.isUndefined()) {
RowValuesTableModel tableRow = this.table.getRowValuesTable().getRowValuesTableModel();
 
for (int i = 0; i < tableRow.getRowCount(); i++) {
SQLRowValues rowVals = tableRow.getRowValuesAt(i);
if (rowVals.getInt("QTE") != 0 && (rowVals.getObject("ID_AFFAIRE") == null || rowVals.isForeignEmpty("ID_AFFAIRE"))) {
return ValidState.create(false, "Aucune affaire globale sélectionnée et une ligne avec une quantité > 0 n'est pas affectée à une affaire!");
}
}
} else {
ValidState.create(false, "Aucune affaire globale sélectionnée!");
}
}
return super.getValidState();
}
 
public void setDefaults() {
this.resetValue();
this.numeroUniqueCommande.setText(NumerotationAutoSQLElement.getNextNumero(getElement().getClass()));
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/component/FactureFournisseurSQLComponent.java
59,6 → 59,9
import java.beans.PropertyChangeListener;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
 
import javax.swing.JLabel;
import javax.swing.JPanel;
65,6 → 68,7
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.TableModelEvent;
102,7 → 106,7
 
int idModeRegl = rowFourn.getInt("ID_MODE_REGLEMENT");
if (idModeRegl > 1 && FactureFournisseurSQLComponent.this.eltModeRegl != null && getMode() == Mode.INSERTION) {
SQLElement sqlEltModeRegl = Configuration.getInstance().getDirectory().getElement("MODE_REGLEMENT");
SQLElement sqlEltModeRegl = getElement().getDirectory().getElement("MODE_REGLEMENT");
SQLRow rowModeRegl = sqlEltModeRegl.getTable().getRow(idModeRegl);
SQLRowValues rowVals = rowModeRegl.createUpdateRow();
rowVals.clearPrimaryKeys();
124,6 → 128,15
return this.fourn;
}
 
@Override
protected Set<String> createRequiredNames() {
final Set<String> s = new HashSet<>(1);
if (getTable().contains("ID_TYPE_CMD")) {
s.add("ID_TYPE_CMD");
}
return s;
}
 
public void addViews() {
this.setLayout(new GridBagLayout());
final GridBagConstraints c = new DefaultGridBagConstraints();
480,10 → 493,10
ElementComboBox comboTaxePort = new ElementComboBox();
DeviseField textRemiseHT = new DeviseField();
 
final JPanel panelPoids = new JPanel(new GridBagLayout());
GridBagConstraints cPort = new DefaultGridBagConstraints();
if (getTable().contains("PORT_HT")) {
addSQLObject(textPortHT, "PORT_HT");
final JPanel panelPoids = new JPanel(new GridBagLayout());
GridBagConstraints cPort = new DefaultGridBagConstraints();
cPort.gridx = 0;
cPort.weightx = 0;
panelPoids.add(new JLabel(getLabelFor("PORT_HT")), cPort);
562,6 → 575,49
final TotalPanel totalTTC = new TotalPanel(this.table, fieldEco, fieldHT, fieldTVA, fieldTTC, textPortHT, textRemiseHT, fieldService, null, fieldDevise, null, null,
(getTable().contains("ID_TAXE_PORT") ? comboTaxePort : null), null);
 
if (getTable().contains("TVA_ADJUSTMENT")) {
final JTextField textTvaAdujs = new JTextField(15);
 
JLabel labelTvaAdujst = new JLabel(getLabelFor("TVA_ADJUSTMENT"));
labelTvaAdujst.setHorizontalAlignment(SwingConstants.RIGHT);
 
cPort.gridx = 0;
cPort.gridy++;
panelPoids.add(labelTvaAdujst, cPort);
cPort.gridx++;
panelPoids.add(textTvaAdujs, cPort);
addView(textTvaAdujs, "TVA_ADJUSTMENT");
totalTTC.setTextFixTVA(textTvaAdujs);
textTvaAdujs.getDocument().addDocumentListener(new SimpleDocumentListener() {
@Override
public void update(final DocumentEvent e) {
final String text = textTvaAdujs.getText();
if (text != null && text.trim().length() > 0) {
if (!text.trim().equals("-")) {
BigDecimal tvaFix = new BigDecimal(text);
if (tvaFix.abs().compareTo(new BigDecimal(0.05)) > 0) {
final String limitedFix;
if (tvaFix.signum() > 0) {
limitedFix = tvaFix.min(new BigDecimal(0.05)).toString();
} else {
limitedFix = tvaFix.max(new BigDecimal(-0.05)).toString();
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
 
textTvaAdujs.setText(limitedFix);
}
});
}
}
}
totalTTC.updateTotal();
}
});
DefaultGridBagConstraints.lockMinimumSize(textTvaAdujs);
}
 
c.gridx++;
c.gridy--;
c.gridwidth = GridBagConstraints.REMAINDER;
858,4 → 914,48
 
}
 
public void loadFactureExistante(int idFacture) {
 
SQLElement fact = getElement();
SQLElement factElt = getElement().getDirectory().getElement("FACTURE_FOURNISSEUR_ELEMENT");
 
// On duplique la facture
if (idFacture > 1) {
SQLRow row = fact.getTable().getRow(idFacture);
SQLRowValues rowVals = new SQLRowValues(fact.getTable());
rowVals.put("ID_FOURNISSEUR", row.getInt("ID_FOURNISSEUR"));
// if (getTable().contains("ID_NUMEROTATION_AUTO")) {
// rowVals.put("NUMERO",
// NumerotationAutoSQLElement.getNextNumero(SaisieVenteFactureSQLElement.class, new
// Date(), row.getForeign("ID_NUMEROTATION_AUTO")));
// } else {
// rowVals.put("NUMERO",
// NumerotationAutoSQLElement.getNextNumero(SaisieVenteFactureSQLElement.class, new
// Date()));
// }
rowVals.put("NOM", row.getObject("NOM"));
this.select(rowVals);
}
 
// On duplique les elements de facture
List<SQLRow> myListItem = fact.getTable().getRow(idFacture).getReferentRows(factElt.getTable());
 
if (myListItem.size() != 0) {
this.table.getModel().clearRows();
 
for (SQLRow rowElt : myListItem) {
 
SQLRowValues rowVals = rowElt.createUpdateRow();
rowVals.clearPrimaryKeys();
this.table.getModel().addRow(rowVals);
int rowIndex = this.table.getModel().getRowCount() - 1;
this.table.getModel().fireTableModelModified(rowIndex);
}
} else {
this.table.getModel().clearRows();
}
this.table.getModel().fireTableDataChanged();
this.table.repaint();
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/CommandeSQLElement.java
21,6 → 21,7
import org.openconcerto.erp.core.supplychain.receipt.component.BonReceptionSQLComponent;
import org.openconcerto.erp.generationDoc.gestcomm.CommandeXmlSheet;
import org.openconcerto.erp.model.MouseSheetXmlListeListener;
import org.openconcerto.erp.preferences.GestionCommercialeGlobalPreferencePanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElement;
33,6 → 34,7
import org.openconcerto.sql.model.SQLSelectJoin;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.EditPanel;
import org.openconcerto.sql.view.list.IListe;
50,6 → 52,8
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingWorker;
 
import org.apache.commons.dbutils.handlers.ArrayListHandler;
 
67,11 → 71,57
transfertBR(selectedRows);
}
 
}, false, "supplychain.order.create.receipt");
}, true, "supplychain.order.create.receipt");
 
bonAction.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(bonAction);
 
PredicateRowAction actionsTRFA = new PredicateRowAction(new AbstractAction("Transfert vers facture fournisseur") {
public void actionPerformed(ActionEvent e) {
final List<SQLRowValues> selectedRows = IListe.get(e).getSelectedRows();
SwingWorker<Boolean, Object> worker = new SwingWorker<Boolean, Object>() {
@Override
protected Boolean doInBackground() throws Exception {
 
boolean b = TransfertBaseSQLComponent.isAlreadyAllTransfert(selectedRows, getTable(), getTable().getTable("FACTURE_FOURNISSEUR"), "T_HT", "T_HT");
 
if (b) {
String label = "Attention ";
if (selectedRows.size() > 1) {
label += " les " + getPluralName() + " ont déjà été transféré!";
} else {
label += getSingularName() + " a déjà été transféré!";
}
label += "\n Voulez vous continuer?";
 
int ans = JOptionPane.showConfirmDialog(null, label, "Transfert " + getSingularName(), JOptionPane.YES_NO_OPTION);
if (ans == JOptionPane.NO_OPTION) {
return Boolean.FALSE;
}
}
 
return Boolean.TRUE;
 
}
 
@Override
protected void done() {
try {
Boolean b = get();
if (b) {
TransfertBaseSQLComponent.openTransfertFrame(selectedRows, "FACTURE_FOURNISSEUR");
}
} catch (Exception e) {
ExceptionHandler.handle("Erreur lors du transfert des " + getPluralName() + "!", e);
}
}
};
worker.execute();
}
}, false);
actionsTRFA.setPredicate(IListeEvent.getNonEmptySelectionPredicate());
getRowActions().add(actionsTRFA);
 
// Transfert vers facture
PredicateRowAction factureAction = new PredicateRowAction(new AbstractAction() {
public void actionPerformed(ActionEvent e) {
107,9 → 157,13
l.add("NOM");
l.add("DATE");
l.add("ID_FOURNISSEUR");
l.add("ID_COMMERCIAL");
l.add("T_HT");
l.add("T_TTC");
l.add("EN_COURS");
Boolean useCommandeEnCours = SQLPreferences.getMemCached(getTable().getDBRoot()).getBoolean(GestionCommercialeGlobalPreferencePanel.COMMANDE_FOURNISSEUR_EN_COURS, false);
if (useCommandeEnCours) {
l.add("EN_COURS");
}
l.add("INFOS");
return l;
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/EtatDemandeAchatItemSQLElement.java
17,9 → 17,9
package org.openconcerto.erp.core.supplychain.order.element;
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.common.ui.IColorChooser;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.UISQLComponent;
import org.openconcerto.sql.ui.IColorChooser;
import org.openconcerto.utils.ListMap;
 
import java.util.ArrayList;
68,7 → 68,7
return new UISQLComponent(this) {
public void addViews() {
this.addRequiredSQLObject(new JTextField(), "NOM", "left");
this.addRequiredSQLObject(new IColorChooser(), "COLOR", "right");
this.addRequiredSQLObject(new IColorChooser("Couleur"), "COLOR", "right");
}
};
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/FactureFournisseurSQLElement.java
19,15 → 19,23
import org.openconcerto.erp.generationDoc.gestcomm.FactureFournisseurXmlSheet;
import org.openconcerto.erp.model.MouseSheetXmlListeListener;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.EditPanel;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.utils.ListMap;
 
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
 
import javax.swing.AbstractAction;
 
public class FactureFournisseurSQLElement extends ComptaSQLConfElement {
 
public FactureFournisseurSQLElement() {
41,6 → 49,21
actionAttachment.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(actionAttachment);
}
RowAction actionClone = new RowAction(new AbstractAction() {
public void actionPerformed(ActionEvent e) {
 
EditFrame editFrame = new EditFrame(FactureFournisseurSQLElement.this, EditPanel.CREATION);
 
((FactureFournisseurSQLComponent) editFrame.getSQLComponent()).loadFactureExistante(IListe.get(e).getSelectedId());
editFrame.setVisible(true);
}
}, true, "supplychain.invoice.clone") {
public boolean enabledFor(IListeEvent evt) {
List<? extends SQLRowAccessor> l = evt.getSelectedRows();
return (l != null && l.size() == 1);
}
};
getRowActions().add(actionClone);
}
 
@Override
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/DemandeAchatItemSQLElement.java
25,6 → 25,7
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.model.SQLInjector;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLSelect;
92,7 → 93,6
 
@Override
public void actionPerformed(ActionEvent e) {
List<SQLRowValues> rows = IListe.get(e).getSelectedRows();
StyleSQLElement styleElt = getDirectory().getElement(StyleSQLElement.class);
int idNormal = styleElt.getAllStyleByName().get("Normal");
 
99,9 → 99,10
SQLRowValues rowVals = new SQLRowValues(getTable().getTable("DEMANDE_PRIX"));
rowVals.put("DATE", new Date());
SQLInjector inj = SQLInjector.getInjector(getTable(), getTable().getTable("DEMANDE_PRIX_ELEMENT"));
for (SQLRowValues sqlRowValues : rows) {
SQLRow row = sqlRowValues.asRow();
row.fetchValues();
 
final List<SQLRow> rows = SQLRowListRSH.fetch(IListe.get(e).getRequest().getPrimaryTable(), IListe.get(e).getSelection().getSelectedIDs());
 
for (SQLRow row : rows) {
rowVals.put("ID_AFFAIRE", row.getForeignID("ID_AFFAIRE"));
SQLRowValues rowValsCmdElt = inj.createRowValuesFrom(row);
rowValsCmdElt.put("ID_STYLE", idNormal);
152,7 → 153,6
 
@Override
public void actionPerformed(ActionEvent e) {
List<SQLRowValues> rows = IListe.get(e).getSelectedRows();
StyleSQLElement styleElt = getDirectory().getElement(StyleSQLElement.class);
int idNormal = styleElt.getAllStyleByName().get("Normal");
 
159,9 → 159,8
SQLRowValues rowVals = new SQLRowValues(getTable().getTable("COMMANDE"));
rowVals.put("DATE", new Date());
SQLInjector inj = SQLInjector.getInjector(getTable(), getTable().getTable("COMMANDE_ELEMENT"));
for (SQLRowValues sqlRowValues : rows) {
SQLRow row = sqlRowValues.asRow();
row.fetchValues();
final List<SQLRow> rows = SQLRowListRSH.fetch(IListe.get(e).getRequest().getPrimaryTable(), IListe.get(e).getSelection().getSelectedIDs());
for (SQLRow row : rows) {
rowVals.put("ID_AFFAIRE", row.getForeignID("ID_AFFAIRE"));
SQLRowValues rowValsCmdElt = inj.createRowValuesFrom(row);
rowValsCmdElt.put("ID_STYLE", idNormal);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/receipt/component/BonReceptionSQLComponent.java
60,11 → 60,14
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
 
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
91,6 → 94,15
}
 
@Override
protected Set<String> createRequiredNames() {
final Set<String> s = new HashSet<>(1);
if (getTable().contains("ID_TYPE_CMD")) {
s.add("ID_TYPE_CMD");
}
return s;
}
 
@Override
protected SQLRowValues createDefaults() {
this.tableBonItem.getModel().clearRows();
this.textNumeroUnique.setText(NumerotationAutoSQLElement.getNextNumero(getElement().getClass()));
628,6 → 640,8
}
}
int count = this.tableBonItem.getModel().getRowCount();
int receipt = 0;
 
for (int i = 0; i < count; i++) {
SQLRowValues r = this.tableBonItem.getModel().getRowValuesAt(i);
SQLRowValues rowTR = map.get(r.getForeignID("ID_ARTICLE"));
634,13 → 648,27
if (rowTR != null && !rowTR.isUndefined()) {
if (r.getInt("QTE") > 0) {
if (NumberUtils.areNumericallyEqual(r.getBigDecimal("QTE_UNITAIRE"), BigDecimal.ONE) || r.getInt("QTE") > 1) {
this.tableBonItem.getModel().putValue(r.getInt("QTE") - rowTR.getInt("QTE"), i, "QTE");
int value = r.getInt("QTE") - rowTR.getInt("QTE");
if ((value <= 0)) {
receipt++;
}
 
this.tableBonItem.getModel().putValue(Math.max(0, value), i, "QTE");
} else {
this.tableBonItem.getModel().putValue(r.getBigDecimal("QTE_UNITAIRE").subtract(rowTR.getBigDecimal("QTE_UNITAIRE")), i, "QTE_UNITAIRE");
BigDecimal subtract = r.getBigDecimal("QTE_UNITAIRE").subtract(rowTR.getBigDecimal("QTE_UNITAIRE"));
if (subtract.signum() <= 0) {
receipt++;
}
this.tableBonItem.getModel().putValue(subtract.max(BigDecimal.ZERO), i, "QTE_UNITAIRE");
}
} else {
receipt++;
}
}
}
if (receipt == count) {
JOptionPane.showMessageDialog(null, "Attention tous les articles ont déjà été réceptionné!");
}
}
 
@Override
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/receipt/element/BonReceptionSQLElement.java
27,6 → 27,7
import org.openconcerto.sql.model.AliasedTable;
import org.openconcerto.sql.model.SQLName;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
35,6 → 36,7
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.ListMap;
 
import java.awt.event.ActionEvent;
45,6 → 47,8
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingWorker;
 
import org.apache.commons.dbutils.handlers.ArrayListHandler;
 
55,7 → 59,45
 
PredicateRowAction actionsTRFA = new PredicateRowAction(new AbstractAction("Transfert vers facture fournisseur") {
public void actionPerformed(ActionEvent e) {
TransfertBaseSQLComponent.openTransfertFrame(IListe.get(e).getSelectedRows(), "FACTURE_FOURNISSEUR");
final List<SQLRowValues> selectedRows = IListe.get(e).getSelectedRows();
SwingWorker<Boolean, Object> worker = new SwingWorker<Boolean, Object>() {
@Override
protected Boolean doInBackground() throws Exception {
 
boolean b = TransfertBaseSQLComponent.isAlreadyAllTransfert(selectedRows, getTable(), getTable().getTable("FACTURE_FOURNISSEUR"), "TOTAL_HT", "T_HT");
 
if (b) {
String label = "Attention ";
if (selectedRows.size() > 1) {
label += " les " + getPluralName() + " ont déjà été transféré!";
} else {
label += getSingularName() + " a déjà été transféré!";
}
label += "\n Voulez vous continuer?";
 
int ans = JOptionPane.showConfirmDialog(null, label, "Transfert " + getSingularName(), JOptionPane.YES_NO_OPTION);
if (ans == JOptionPane.NO_OPTION) {
return Boolean.FALSE;
}
}
 
return Boolean.TRUE;
 
}
 
@Override
protected void done() {
try {
Boolean b = get();
if (b) {
TransfertBaseSQLComponent.openTransfertFrame(selectedRows, "FACTURE_FOURNISSEUR");
}
} catch (Exception e) {
ExceptionHandler.handle("Erreur lors du transfert des " + getPluralName() + "!", e);
}
}
};
worker.execute();
}
}, true);
actionsTRFA.setPredicate(IListeEvent.getNonEmptySelectionPredicate());
85,6 → 127,7
protected List<String> getListFields() {
final List<String> l = new ArrayList<>(5);
l.add("NUMERO");
l.add("NOM");
l.add("DATE");
l.add("ID_FOURNISSEUR");
l.add("TOTAL_HT");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/receipt/action/ListeDesBonsReceptionsAction.java
94,6 → 94,8
return frame;
}
 
private BigDecimal bigDecimal100 = new BigDecimal(100);
 
private BigDecimal getAvancement(SQLRowAccessor r) {
Collection<? extends SQLRowAccessor> rows = r.getReferentRows(r.getTable().getTable("TR_BON_RECEPTION"));
long totalFact = 0;
106,7 → 108,7
}
}
if (total > 0) {
return new BigDecimal(totalFact).divide(new BigDecimal(total), DecimalUtils.HIGH_PRECISION).movePointRight(2).setScale(2, RoundingMode.HALF_UP);
return this.bigDecimal100.min(new BigDecimal(totalFact).divide(new BigDecimal(total), DecimalUtils.HIGH_PRECISION).movePointRight(2).setScale(2, RoundingMode.HALF_UP));
} else {
return BigDecimal.ONE.movePointRight(2);
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/ContactSQLElement.java
File deleted
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/CustomerSQLComponent.java
17,6 → 17,7
import org.openconcerto.erp.core.common.element.NumerotationAutoSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.ui.AdresseClientItemTable;
import org.openconcerto.erp.core.sales.product.element.ClientCodeArticleTable;
import org.openconcerto.erp.core.sales.product.ui.CustomerProductQtyPriceListTable;
import org.openconcerto.erp.preferences.ModeReglementDefautPrefPanel;
import org.openconcerto.erp.utils.TM;
import org.openconcerto.sql.Configuration;
75,6 → 76,7
private ContactItemTable table;
private ClientCodeArticleTable tableCustomProduct;
private AdresseClientItemTable adresseTable = new AdresseClientItemTable();
 
private SQLTable contactTable = Configuration.getInstance().getDirectory().getElement("CONTACT").getTable();
private final SQLTable tableNum = getTable().getBase().getTable("NUMEROTATION_AUTO");
private final JUniqueTextField code = new JUniqueTextField(20) {
88,6 → 90,7
}
};
 
private CustomerProductQtyPriceListTable clienTarifTable = new CustomerProductQtyPriceListTable();
private SQLRowValues defaultContactRowVals = new SQLRowValues(UndefinedRowValuesCache.getInstance().getDefaultRowValues(this.contactTable));
private JCheckBox checkAdrLivraison, checkAdrFacturation;
 
167,6 → 170,8
return this.table;
} else if (id.equals("customerrelationship.customer.customproduct")) {
return this.tableCustomProduct;
} else if (id.equals("customerrelationship.customer.customtarif")) {
return this.clienTarifTable;
} else if (id.equals("customerrelationship.customer.addresses")) {
return createAdressesComponent();
} else if (id.equals("NOM")) {
243,6 → 248,7
super.update();
final int selectedID = getSelectedID();
this.table.updateField("ID_CLIENT", selectedID);
this.clienTarifTable.updateField("ID_CLIENT", selectedID);
this.tableCustomProduct.updateField("ID_CLIENT", selectedID);
this.adresseTable.updateField("ID_CLIENT", selectedID);
}
254,6 → 260,7
this.checkAdrFacturation.setSelected(r == null || !r.getFields().contains("ID_ADRESSE_F") || r.isForeignEmpty("ID_ADRESSE_F"));
if (r != null) {
this.table.insertFrom("ID_CLIENT", r.asRowValues());
this.clienTarifTable.insertFrom("ID_CLIENT", r.asRowValues());
this.tableCustomProduct.insertFrom("ID_CLIENT", r.asRowValues());
this.adresseTable.insertFrom("ID_CLIENT", r.asRowValues());
}
294,6 → 301,7
id = super.insert(order);
this.table.updateField("ID_CLIENT", id);
this.tableCustomProduct.updateField("ID_CLIENT", id);
this.clienTarifTable.updateField("ID_CLIENT", id);
this.adresseTable.updateField("ID_CLIENT", id);
if (NumerotationAutoSQLElement.getNextNumero(getElement().getClass()).equalsIgnoreCase(this.code.getText().trim())) {
SQLRowValues rowVals = new SQLRowValues(this.tableNum);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/CustomerGroup.java
94,6 → 94,9
final Group gCustomProduct = new Group("customerrelationship.customer.customproduct", LayoutHints.DEFAULT_SEPARATED_GROUP_HINTS);
gCustomProduct.addItem("customerrelationship.customer.customproduct", new LayoutHints(true, true, true, true, true, true, true, true));
this.add(gCustomProduct);
final Group gCustomRemiseProduct = new Group("customerrelationship.customer.customtarif", LayoutHints.DEFAULT_SEPARATED_GROUP_HINTS);
gCustomRemiseProduct.addItem("customerrelationship.customer.customtarif", new LayoutHints(true, true, true, true, true, true, true, true));
this.add(gCustomRemiseProduct);
 
this.add(gState);
final Group gInfo = new Group("customerrelationship.customer.info", LayoutHints.DEFAULT_SEPARATED_GROUP_HINTS);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/ClientNormalSQLElement.java
22,14 → 22,19
import org.openconcerto.ql.QLPrinter;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.model.FieldPath;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.sql.request.ListSQLRequest;
import org.openconcerto.sql.view.list.BaseSQLTableModelColumn;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.sql.view.list.SQLTableModelSource;
import org.openconcerto.ui.EmailComposer;
import org.openconcerto.utils.CollectionUtils;
import org.openconcerto.utils.ExceptionHandler;
 
import java.awt.Font;
37,6 → 42,7
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
 
import javax.swing.AbstractAction;
 
180,6 → 186,28
return l;
}
 
@Override
protected void _initTableSource(SQLTableModelSource res) {
super._initTableSource(res);
 
res.getColumns().add(new BaseSQLTableModelColumn(getDirectory().getTranslator().getLabelFor(getTable().getField("CATEGORIES")), String.class) {
 
@Override
protected Object show_(SQLRowAccessor r) {
 
return r.getString("CATEGORIES");
}
 
@Override
public Set<FieldPath> getPaths() {
Path p = new Path(getTable());
return CollectionUtils.createSet(new FieldPath(p, "CATEGORIES"));
 
}
});
 
}
 
/*
* (non-Javadoc)
*
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/ComptaContactSQLElement.java
New file
0,0 → 1,63
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.customer.element;
 
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
 
import java.awt.event.ActionEvent;
 
import javax.swing.AbstractAction;
 
public abstract class ComptaContactSQLElement extends ContactSQLElementBase {
 
static public class ContactFournisseurSQLElement extends ComptaContactSQLElement {
public ContactFournisseurSQLElement() {
super("CONTACT_FOURNISSEUR");
}
}
 
static public class ContactSalarieSQLElement extends ComptaContactSQLElement {
public ContactSalarieSQLElement() {
super("CONTACT_SALARIE");
}
}
 
static public class ContactAdministratifSQLElement extends ComptaContactSQLElement {
public ContactAdministratifSQLElement() {
super("CONTACT_ADMINISTRATIF");
}
}
 
static public class ContactSQLElement extends ComptaContactSQLElement {
public ContactSQLElement() {
super("CONTACT");
}
}
 
protected ComptaContactSQLElement(String tableName) {
super(tableName);
PredicateRowAction action = new PredicateRowAction(new AbstractAction() {
 
@Override
public void actionPerformed(ActionEvent e) {
sendMail(IListe.get(e).getSelectedRows());
 
}
}, true, "customerrelationship.customer.email.send");
action.setPredicate(IListeEvent.getNonEmptySelectionPredicate());
getRowActions().add(action);
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/report/ReportingCommercialPDF.java
New file
0,0 → 1,177
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.customer.report;
 
import java.awt.Color;
import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
 
import com.ibm.icu.text.SimpleDateFormat;
import com.lowagie.text.Document;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;
 
public class ReportingCommercialPDF {
 
private final List<ReportingCommercial> items;
 
public ReportingCommercialPDF(List<ReportingCommercial> items) {
this.items = new ArrayList<>(items);
Collections.sort(this.items, new Comparator<ReportingCommercial>() {
 
@Override
public int compare(ReportingCommercial o1, ReportingCommercial o2) {
return o2.getTotal().compareTo(o1.getTotal());
}
});
}
 
public static void main(String[] args) throws IOException {
final List<ReportingCommercial> list = new ArrayList<>();
final Calendar c = Calendar.getInstance();
final Date d1 = c.getTime();
c.add(Calendar.MONTH, 50);
final Date d2 = c.getTime();
for (int i = 0; i < 5; i++) {
ReportingCommercial r = new ReportingCommercial("commercial " + i, d1, d2);
for (int j = 0; j < i * 5; j++) {
final ReportingCommercialItem item = new ReportingCommercialItem("client " + j);
item.addCA(BigDecimal.valueOf(j * 12345.78f));
r.add(item);
}
list.add(r);
}
final File file = new File("out.pdf");
final ReportingCommercialPDF pdf = new ReportingCommercialPDF(list);
pdf.export(file);
Desktop.getDesktop().open(file);
}
 
public void export(File file) throws IOException {
try {
final Document document = new Document(PageSize.A4);
PdfWriter.getInstance(document, new FileOutputStream(file));
document.open();
// Formats
final SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
final DecimalFormat decimalFormat = new DecimalFormat("###,###,##0.00");
final DecimalFormatSymbols formatSymbols = decimalFormat.getDecimalFormatSymbols();
formatSymbols.setGroupingSeparator(' ');
formatSymbols.setDecimalSeparator(',');
decimalFormat.setDecimalFormatSymbols(formatSymbols);
// Fonts
final Font fontHeader = new Font(Font.HELVETICA, 11f, Font.BOLD);
fontHeader.setColor(Color.WHITE);
final Font normal = new Font(Font.HELVETICA, 10f, Font.NORMAL);
final Font fontTitle = new Font(Font.HELVETICA, 18f, Font.BOLD);
final Font fontInfo = new Font(Font.HELVETICA, 11f, Font.NORMAL);
// Colors
final Color backgroundColor = new Color(57, 115, 157);
final Color cellBackgroundColor = new Color(225, 236, 244);
 
for (ReportingCommercial reporting : this.items) {
 
final List<ReportingCommercialItem> rItems = new ArrayList<ReportingCommercialItem>(reporting.getItems());
Collections.sort(rItems, new Comparator<ReportingCommercialItem>() {
 
@Override
public int compare(ReportingCommercialItem o1, ReportingCommercialItem o2) {
return o2.getCa().compareTo(o1.getCa());
}
});
 
document.add(new Paragraph("Chiffre d'affaires", fontTitle));
document.add(new Paragraph("Commercial : " + reporting.getCommercial(), fontInfo));
document.add(new Paragraph("Période : du " + df.format(reporting.getDebut()) + " au " + df.format(reporting.getFin()), fontInfo));
 
if (rItems.isEmpty()) {
document.add(new Paragraph("\n"));
document.add(new Paragraph("\n"));
final Font fontInfo2 = new Font(Font.HELVETICA, 13f, Font.ITALIC);
fontInfo2.setColor(Color.GRAY);
document.add(new Paragraph("Aucune donnée.", fontInfo2));
} else {
document.add(new Paragraph("Total : " + decimalFormat.format(reporting.getTotal()) + " € HT", fontInfo));
document.add(new Paragraph("\n"));
final PdfPTable table = new PdfPTable(2);
table.setWidthPercentage(100);
table.setWidths(new float[] { 800f, 160f });
 
final PdfPCell c1 = new PdfPCell(new Phrase("Clients", fontHeader));
c1.setBackgroundColor(backgroundColor);
c1.setBorder(Rectangle.NO_BORDER);
c1.setHorizontalAlignment(Element.ALIGN_LEFT);
c1.setVerticalAlignment(Element.ALIGN_MIDDLE);
c1.setPaddingBottom(7);
c1.setPaddingLeft(6);
table.addCell(c1);
final PdfPCell c2 = new PdfPCell(new Phrase("C.A. H.T.", fontHeader));
c2.setBackgroundColor(backgroundColor);
c2.setBorder(Rectangle.NO_BORDER);
c2.setHorizontalAlignment(Element.ALIGN_CENTER);
c2.setVerticalAlignment(Element.ALIGN_MIDDLE);
c2.setPaddingBottom(7);
c2.setPaddingLeft(6);
table.addCell(c2);
table.setHeaderRows(1);
 
boolean pair = true;
for (ReportingCommercialItem rItem : rItems) {
final PdfPCell col1 = new PdfPCell(new Phrase(rItem.getClient(), normal));
col1.setBorder(Rectangle.NO_BORDER);
col1.setHorizontalAlignment(Element.ALIGN_LEFT);
col1.setVerticalAlignment(Element.ALIGN_CENTER);
col1.setPaddingBottom(5);
col1.setPaddingLeft(6);
final PdfPCell col2 = new PdfPCell(new Phrase(decimalFormat.format(rItem.getCa()), normal));
col2.setHorizontalAlignment(Element.ALIGN_RIGHT);
col2.setBorder(Rectangle.NO_BORDER);
// Alternance couleur
if (pair) {
col1.setBackgroundColor(cellBackgroundColor);
col2.setBackgroundColor(cellBackgroundColor);
}
table.addCell(col1);
table.addCell(col2);
pair = !pair;
}
document.add(table);
}
document.newPage();
}
document.close();
} catch (Exception e) {
throw new IOException(e);
}
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/report/ReportingCommercialItem.java
New file
0,0 → 1,39
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.customer.report;
 
import java.math.BigDecimal;
 
public class ReportingCommercialItem {
private String client;
private BigDecimal ca;
 
public ReportingCommercialItem(String client) {
this.client = client;
this.ca = BigDecimal.ZERO;
}
 
public void addCA(BigDecimal c) {
this.ca = this.ca.add(c);
}
 
public String getClient() {
return this.client;
}
 
public BigDecimal getCa() {
return this.ca;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/report/ReportingCommercial.java
New file
0,0 → 1,73
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.customer.report;
 
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
 
public class ReportingCommercial {
 
private String commercial;
private Date debut;
private Date fin;
private Map<String, ReportingCommercialItem> items = new HashMap<>();
 
public ReportingCommercial(String commercial, Date debut, Date fin) {
this.commercial = commercial;
this.debut = debut;
this.fin = fin;
}
 
public BigDecimal getTotal() {
BigDecimal total = BigDecimal.ZERO;
for (ReportingCommercialItem item : this.items.values()) {
total = total.add(item.getCa());
}
return total;
}
 
public void add(ReportingCommercialItem item) {
this.items.put(item.getClient(), item);
}
 
public void add(String client, BigDecimal ht) {
if (this.items.containsKey(client)) {
this.items.get(client).addCA(ht);
} else {
ReportingCommercialItem reportingCommercialItem = new ReportingCommercialItem(client);
reportingCommercialItem.addCA(ht);
this.items.put(client, reportingCommercialItem);
}
}
 
public Collection<ReportingCommercialItem> getItems() {
return this.items.values();
}
 
public String getCommercial() {
return this.commercial;
}
 
public Date getDebut() {
return this.debut;
}
 
public Date getFin() {
return this.fin;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/report/ReportingCommercialCreator.java
New file
0,0 → 1,111
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.customer.report;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.utils.cc.ITransformer;
 
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class ReportingCommercialCreator {
 
final private Date deb, fin;
final private DBRoot root;
 
public ReportingCommercialCreator(Date deb, Date fin, DBRoot root) {
this.deb = deb;
this.fin = fin;
this.root = root;
}
 
public Collection<ReportingCommercial> getValues() {
 
// Facture
final SQLTable tableFacture = this.root.getTable("SAISIE_VENTE_FACTURE");
SQLRowValues rowValues = new SQLRowValues(tableFacture);
rowValues.putRowValues("ID_COMMERCIAL").putNulls("PRENOM", "NOM");
rowValues.putRowValues("ID_CLIENT").putNulls("CODE", "NOM");
rowValues.putNulls("T_HT", "T_TTC");
 
SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(rowValues);
fetcher.setSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
 
@Override
public SQLSelect transformChecked(SQLSelect input) {
Where w = new Where(tableFacture.getField("DATE"), deb, fin);
input.setWhere(w);
return input;
}
});
 
Map<Integer, ReportingCommercial> mapCommercial = new HashMap<>();
List<SQLRowValues> result = fetcher.fetch();
for (SQLRowValues sqlRowValues : result) {
int commercialID = sqlRowValues.getForeignID("ID_COMMERCIAL");
if (!mapCommercial.containsKey(commercialID)) {
SQLRowAccessor commercialRow = sqlRowValues.getForeign("ID_COMMERCIAL");
mapCommercial.put(commercialID, new ReportingCommercial(commercialRow.getString("PRENOM") + " " + commercialRow.getString("NOM"), deb, fin));
}
 
ReportingCommercial r = mapCommercial.get(commercialID);
BigDecimal bigDecimal = new BigDecimal(sqlRowValues.getLong("T_HT")).movePointLeft(2);
r.add(sqlRowValues.getForeign("ID_CLIENT").getString("NOM"), bigDecimal);
}
 
// Avoir
final SQLTable tableAvoir = this.root.getTable("AVOIR_CLIENT");
SQLRowValues rowValuesAvoir = new SQLRowValues(tableAvoir);
rowValuesAvoir.putRowValues("ID_COMMERCIAL").putNulls("PRENOM", "NOM");
rowValuesAvoir.putRowValues("ID_CLIENT").putNulls("CODE", "NOM");
rowValuesAvoir.putNulls("MONTANT_HT", "MONTANT_TTC");
 
SQLRowValuesListFetcher fetcherAvoir = SQLRowValuesListFetcher.create(rowValuesAvoir);
fetcherAvoir.setSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
 
@Override
public SQLSelect transformChecked(SQLSelect input) {
Where w = new Where(tableAvoir.getField("DATE"), deb, fin);
input.setWhere(w);
return input;
}
});
 
List<SQLRowValues> resultA = fetcherAvoir.fetch();
for (SQLRowValues sqlRowValues : resultA) {
int commercialID = sqlRowValues.getForeignID("ID_COMMERCIAL");
if (!mapCommercial.containsKey(commercialID)) {
SQLRowAccessor commercialRow = sqlRowValues.getForeign("ID_COMMERCIAL");
mapCommercial.put(commercialID, new ReportingCommercial(commercialRow.getString("PRENOM") + " " + commercialRow.getString("NOM"), deb, fin));
}
 
ReportingCommercial r = mapCommercial.get(commercialID);
BigDecimal bigDecimal = new BigDecimal(sqlRowValues.getLong("MONTANT_HT")).movePointLeft(2).negate();
r.add(sqlRowValues.getForeign("ID_CLIENT").getString("NOM"), bigDecimal);
}
 
return mapCommercial.values();
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/report/ReportingCommercialPanel.java
New file
0,0 → 1,125
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
/*
* Créé le 23 avr. 2012
*/
package org.openconcerto.erp.core.customerrelationship.customer.report;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JDate;
import org.openconcerto.utils.ExceptionHandler;
 
import java.awt.Desktop;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
 
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
 
public class ReportingCommercialPanel extends JPanel {
 
public ReportingCommercialPanel(final DBRoot root) {
super(new GridBagLayout());
 
JLabel labelCom = new JLabel("Période du ");
 
GridBagConstraints c = new DefaultGridBagConstraints();
this.add(labelCom, c);
c.gridx++;
final JDate dateDeb = new JDate();
this.add(dateDeb, c);
c.gridx++;
JLabel labelYear = new JLabel("au");
final JDate dateFin = new JDate();
 
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
dateDeb.setValue(cal.getTime());
 
this.add(labelYear, c);
c.gridx++;
this.add(dateFin, c);
cal.set(Calendar.MONTH, Calendar.DECEMBER);
cal.set(Calendar.DAY_OF_MONTH, 31);
dateFin.setValue(cal.getTime());
 
final JButton buttonValid = new JButton(new AbstractAction("Valider") {
 
@Override
public void actionPerformed(ActionEvent e) {
 
new Thread() {
public void run() {
ReportingCommercialCreator creator = new ReportingCommercialCreator(dateDeb.getValue(), dateFin.getValue(), root);
 
List<ReportingCommercial> list = new ArrayList<>(creator.getValues());
ReportingCommercialPDF reporting = new ReportingCommercialPDF(list);
File file;
try {
file = File.createTempFile("ReportingCommerical", ".pdf");
reporting.export(file);
Desktop.getDesktop().open(file);
} catch (IOException e) {
ExceptionHandler.handle("Erreur lors de la cration du fichier", e);
}
SwingUtilities.invokeLater(new Runnable() {
 
@Override
public void run() {
Frame frame = (Frame) SwingUtilities.getRoot(ReportingCommercialPanel.this);
if (frame != null) {
frame.dispose();
}
}
});
};
}.start();
 
}
 
});
c.gridx++;
// buttonValid.setEnabled(false);
this.add(buttonValid, c);
dateDeb.addValueListener(new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
buttonValid.setEnabled(dateDeb.getValue() != null && dateFin.getValue() != null);
}
});
dateFin.addValueListener(new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
buttonValid.setEnabled(dateDeb.getValue() != null && dateFin.getValue() != null);
}
});
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/action/ListeDesContactsAction.java
15,7 → 15,7
 
import org.openconcerto.erp.action.CreateIListFrameAbstractAction;
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.customerrelationship.customer.element.ContactSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ComptaContactSQLElement.ContactSQLElement;
 
public class ListeDesContactsAction extends CreateIListFrameAbstractAction<ContactSQLElement> {
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/action/ListeDesClientsAction.java
15,9 → 15,8
 
import org.openconcerto.erp.action.CreateIListFrameAbstractAction;
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.customerrelationship.customer.element.ClientNormalSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.CustomerSQLElement;
import org.openconcerto.erp.core.sales.invoice.ui.EcheanceRenderer;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.view.IListFrame;
26,10 → 25,12
 
import javax.swing.JTable;
 
public class ListeDesClientsAction extends CreateIListFrameAbstractAction<ClientNormalSQLElement> {
public class ListeDesClientsAction extends CreateIListFrameAbstractAction<SQLElement> {
 
public ListeDesClientsAction(final ComptaPropsConfiguration conf) {
super(conf, CustomerSQLElement.class);
// handle CustomerSQLElement/ClientSocieteSQLElement (or even a module replacing the
// default element)
super(conf, conf.getDirectory().getElement(conf.getRootSociete().getTable("CLIENT")));
}
 
@Override
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/ui/CategorieComptableChoiceUI.java
New file
0,0 → 1,67
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.customer.ui;
 
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.ui.DefaultGridBagConstraints;
 
import java.awt.GridBagConstraints;
 
import javax.swing.JLabel;
import javax.swing.SwingConstants;
 
public class CategorieComptableChoiceUI {
private ElementComboBox comboCatCompt;
 
public CategorieComptableChoiceUI() {
// TODO Auto-generated constructor stub
}
 
public void addToUI(BaseSQLComponent comp, GridBagConstraints c) {
// Adresse Facturation
c.gridx = 0;
c.gridy++;
c.gridwidth = 1;
final JLabel labelCat = new JLabel(comp.getLabelFor("ID_CATEGORIE_COMPTABLE"));
labelCat.setHorizontalAlignment(SwingConstants.RIGHT);
c.weightx = 0;
c.gridwidth = 1;
c.fill = GridBagConstraints.HORIZONTAL;
comp.add(labelCat, c);
 
this.comboCatCompt = new ElementComboBox();
this.comboCatCompt.setButtonsVisible(false);
 
c.gridx++;
c.gridwidth = 1;
c.weightx = 0;
c.weighty = 0;
c.fill = GridBagConstraints.NONE;
comp.add(this.comboCatCompt, c);
final SQLElement catComptableElement = comp.getElement().getForeignElement("ID_CATEGORIE_COMPTABLE");
this.comboCatCompt.init(catComptableElement, catComptableElement.getComboRequest(true));
DefaultGridBagConstraints.lockMinimumSize(this.comboCatCompt);
comp.addView(this.comboCatCompt, "ID_CATEGORIE_COMPTABLE");
this.comboCatCompt.setAddIconVisible(false);
 
}
 
public ElementComboBox getCombo() {
return this.comboCatCompt;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/mail/EmailTemplateSQLComponent.java
New file
0,0 → 1,32
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.mail;
 
import org.openconcerto.sql.element.GroupSQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRowValues;
 
public class EmailTemplateSQLComponent extends GroupSQLComponent {
 
public EmailTemplateSQLComponent(SQLElement element) {
super(element);
}
 
@Override
protected SQLRowValues createDefaults() {
final SQLRowValues defaultValues = super.createDefaults();
defaultValues.put("FORMAT_DATE", "dd/MM/yyyy");
return defaultValues;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/mail/EmailTemplateSQLElement.java
New file
0,0 → 1,52
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.mail;
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.sql.element.GlobalMapper;
import org.openconcerto.sql.element.SQLComponent;
 
import java.util.Arrays;
import java.util.List;
 
public class EmailTemplateSQLElement extends ComptaSQLConfElement {
public static final String TABLE_NAME = "MODELE_EMAIL";
 
public EmailTemplateSQLElement() {
super(TABLE_NAME, "un modèle d'email", "modèles d'emails");
final EmailTemplateGroup group = new EmailTemplateGroup();
GlobalMapper.getInstance().map(EmailTemplateGroup.ID, group);
setDefaultGroup(group);
}
@Override
protected List<String> getListFields() {
return Arrays.asList("NOM", "PAR_DEFAUT");
}
 
@Override
protected List<String> getComboFields() {
return Arrays.asList("NOM");
}
 
@Override
protected SQLComponent createComponent() {
return new EmailTemplateSQLComponent(this);
}
 
@Override
protected String createCode() {
return "customerrelationship.mail.email.template";
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/mail/action/ListeDesModelesEmailAction.java
New file
0,0 → 1,35
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.mail.action;
 
import org.openconcerto.erp.action.CreateFrameAbstractAction;
import org.openconcerto.erp.core.customerrelationship.mail.EmailTemplateSQLElement;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.view.IListFrame;
import org.openconcerto.sql.view.ListeAddPanel;
 
import javax.swing.Action;
import javax.swing.JFrame;
 
public class ListeDesModelesEmailAction extends CreateFrameAbstractAction {
 
public ListeDesModelesEmailAction() {
super();
this.putValue(Action.NAME, "Liste des modèles d'email");
}
 
public JFrame createFrame() {
return new IListFrame(new ListeAddPanel(Configuration.getInstance().getDirectory().getElement(EmailTemplateSQLElement.TABLE_NAME)));
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/mail/EmailTemplateGroup.java
New file
0,0 → 1,30
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.mail;
 
import org.openconcerto.ui.group.Group;
import org.openconcerto.ui.group.LayoutHints;
 
public class EmailTemplateGroup extends Group {
public static final String ID = "customerrelationship.mail.email.template";
 
public EmailTemplateGroup() {
super(ID);
addItem("NOM");
addItem("TITRE", LayoutHints.DEFAULT_LARGE_FIELD_HINTS);
addItem("TEXTE", new LayoutHints(true, true, true, true, true, true, true));
addItem("FORMAT_DATE", new LayoutHints(false, false, true, true, false, false));
addItem("PAR_DEFAUT");
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/mail/ValueListener.java
New file
0,0 → 1,18
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.mail;
 
public interface ValueListener {
public void valueSelected(Object value);
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/mail/EmailTemplate.java
New file
0,0 → 1,170
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.mail;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
 
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
 
import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
 
import com.lowagie.text.Font;
 
public class EmailTemplate {
private String name;
private String title;
private String text;
private boolean isDefault;
private String dateFormat;
 
public EmailTemplate(String name, String title, String text, Boolean isDefault, String dateFormat) {
this.name = name;
this.title = title;
this.text = text;
this.isDefault = isDefault;
this.dateFormat = dateFormat;
}
 
public static List<EmailTemplate> getAll(DBRoot root) {
final List<EmailTemplate> result = new ArrayList<>();
final SQLSelect selF = new SQLSelect();
final SQLTable tFamilleArticle = root.getTable(EmailTemplateSQLElement.TABLE_NAME);
selF.addSelect(tFamilleArticle.getKey());
selF.addSelect(tFamilleArticle.getField("NOM"));
selF.addSelect(tFamilleArticle.getField("TITRE"));
selF.addSelect(tFamilleArticle.getField("TEXTE"));
selF.addSelect(tFamilleArticle.getField("PAR_DEFAUT"));
selF.addSelect(tFamilleArticle.getField("FORMAT_DATE"));
final List<SQLRow> lF = SQLRowListRSH.execute(selF);
for (SQLRow sqlRow : lF) {
result.add(new EmailTemplate(sqlRow.getString("NOM"), sqlRow.getString("TITRE"), sqlRow.getString("TEXTE"), sqlRow.getBoolean("PAR_DEFAUT"), sqlRow.getString("FORMAT_DATE")));
}
return result;
}
 
public String getName() {
return this.name;
}
 
public String getTitle() {
return this.title;
}
 
public String getText() {
return this.text;
}
 
public boolean isDefault() {
return this.isDefault;
}
 
public String getDateFormat() {
return this.dateFormat;
}
 
public static void askTemplate(JComponent parent, DBRoot root, ValueListener listener) {
if (!SwingUtilities.isEventDispatchThread()) {
throw new IllegalStateException("must be called from EDT");
}
List<EmailTemplate> templates = getAll(root);
if (templates.isEmpty()) {
listener.valueSelected(null);
return;
}
if (templates.size() == 1) {
listener.valueSelected(templates.get(0));
return;
}
Collections.sort(templates, new Comparator<EmailTemplate>() {
 
@Override
public int compare(EmailTemplate o1, EmailTemplate o2) {
return o1.getName().compareToIgnoreCase(o2.getName());
}
});
final JDialog dialog = new JDialog((Frame) SwingUtilities.getWindowAncestor(parent), "Modèle à utiliser", true);
final JList<EmailTemplate> list = new JList<>(templates.toArray(new EmailTemplate[0]));
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
for (int i = 0; i < templates.size(); i++) {
final EmailTemplate t = templates.get(i);
if (t.isDefault) {
list.setSelectedIndex(i);
break;
}
}
list.setFixedCellHeight((int) (new JLabel("t").getPreferredSize().height * 1.5));
 
list.setCellRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
EmailTemplate t = (EmailTemplate) value;
 
final JLabel l = (JLabel) super.getListCellRendererComponent(list, t.getName(), index, isSelected, cellHasFocus);
if (t.isDefault) {
l.setFont(l.getFont().deriveFont(Font.BOLD));
} else {
l.setFont(l.getFont().deriveFont(Font.NORMAL));
}
return l;
}
});
list.setMinimumSize(new Dimension(300, 200));
list.setPreferredSize(new Dimension(300, 200));
final Container contentPane = dialog.getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(list, BorderLayout.CENTER);
JPanel p = new JPanel();
p.setLayout(new FlowLayout(FlowLayout.RIGHT));
 
final JButton button = new JButton("Valider");
button.addActionListener(new ActionListener() {
 
@Override
public void actionPerformed(ActionEvent e) {
listener.valueSelected(list.getSelectedValue());
dialog.dispose();
}
});
p.add(button);
contentPane.add(p, BorderLayout.SOUTH);
dialog.pack();
dialog.setLocationRelativeTo(parent);
dialog.setVisible(true);
 
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/ConsultationCompteFrame.java
15,20 → 15,32
 
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.State;
import org.openconcerto.sql.model.SQLBackgroundTableCache;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.ui.state.WindowStateManager;
 
import java.awt.DisplayMode;
import java.awt.GraphicsEnvironment;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
 
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
 
 
public class ConsultationCompteFrame extends JFrame {
// panel contenant la liste des ecritures
private final ListPanelEcritures panelEcritures;
37,12 → 49,13
 
private String titre;
 
public ConsultationCompteFrame(ListeDesEcrituresPanel panel, String titre) {
private int indexID;
 
public ConsultationCompteFrame(ListeDesEcrituresPanel panel, SQLRowAccessor rowCpt) {
super();
this.panel = panel;
this.panelEcritures = panel.getListPanelEcritures();
this.titre = titre;
 
this.titre = "Consultation compte n°" + rowCpt.getString("NUMERO") + " " + rowCpt.getString("NOM");
// rafraichir le titre à chaque changement de la liste
this.panelEcritures.getListe().addListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
63,8 → 76,74
}
});
}
 
SQLTable ecrTable = rowCpt.getTable().getTable("ECRITURE");
 
final int id = rowCpt.getID();
Where w = new Where(ecrTable.getField("ID_COMPTE_PCE"), "=", id);
getPanel().getListe().getRequest().setWhere(w);
 
final SQLTable cptTable = ecrTable.getForeignTable("ID_COMPTE_PCE");
List<SQLRow> rowsCpt = new ArrayList<SQLRow>(SQLBackgroundTableCache.getInstance().getCacheForTable(cptTable).getRows());
Collections.sort(rowsCpt, new Comparator<SQLRow>() {
@Override
public int compare(SQLRow o1, SQLRow o2) {
 
return o1.getString("NUMERO").compareTo(o2.getString("NUMERO"));
}
});
final List<Integer> idsCpt = new ArrayList<>();
for (SQLRow sqlRow : rowsCpt) {
idsCpt.add(sqlRow.getID());
}
this.indexID = idsCpt.indexOf(rowCpt.getID());
 
final PredicateRowAction prec = new PredicateRowAction(new AbstractAction("Précédent") {
 
@Override
public void actionPerformed(ActionEvent e) {
 
if (indexID > 0) {
int newCptId = idsCpt.get(indexID - 1);
Where w = new Where(ecrTable.getField("ID_COMPTE_PCE"), "=", newCptId);
getPanel().getListe().getRequest().setWhere(w);
SQLRow rowCptNew = SQLBackgroundTableCache.getInstance().getCacheForTable(cptTable).getRowFromId(newCptId);
setTitle("Consultation compte n°" + rowCptNew.getString("NUMERO") + " " + rowCptNew.getString("NOM"));
indexID--;
}
 
}
}, true, false);
prec.setPredicate(IListeEvent.createSelectionCountPredicate(0, Integer.MAX_VALUE));
panel.getListPanelEcritures().getListe().addIListeAction(prec);
 
final PredicateRowAction suivant = new PredicateRowAction(new AbstractAction("Suivant") {
 
@Override
public void actionPerformed(ActionEvent e) {
 
if (indexID < idsCpt.size() - 1) {
int newCptId = idsCpt.get(indexID + 1);
Where w = new Where(ecrTable.getField("ID_COMPTE_PCE"), "=", newCptId);
getPanel().getListe().getRequest().setWhere(w);
SQLRow rowCptNew = SQLBackgroundTableCache.getInstance().getCacheForTable(cptTable).getRowFromId(newCptId);
setTitle("Consultation compte n°" + rowCptNew.getString("NUMERO") + " " + rowCptNew.getString("NOM"));
indexID++;
}
 
}
}, true, false);
suivant.setPredicate(IListeEvent.createSelectionCountPredicate(0, Integer.MAX_VALUE));
panel.getListPanelEcritures().getListe().addIListeAction(suivant);
 
}
 
@Override
public void setTitle(String title) {
this.titre = title;
super.setTitle(title);
}
 
private String getPlural(String s, int nb) {
return nb + " " + s + (nb > 1 ? "s" : "");
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/ListeDesEcrituresPanel.java
13,6 → 13,10
package org.openconcerto.erp.core.finance.accounting.ui;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.common.ui.IListFilterDatePanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.view.list.ITableModel;
import org.openconcerto.ui.DefaultGridBagConstraints;
22,6 → 26,7
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.Date;
 
import javax.swing.BorderFactory;
import javax.swing.JLabel;
54,9 → 59,18
c.fill = GridBagConstraints.BOTH;
this.add(this.panelEcritures, c);
 
SQLRow rowExercice = Configuration.getInstance().getBase().getTable("EXERCICE_COMMON").getRow(ComptaPropsConfiguration.getInstanceCompta().getRowSociete().getInt("ID_EXERCICE_COMMON"));
 
final IListFilterDatePanel comp = new IListFilterDatePanel(this.panelEcritures.getListe(), this.panelEcritures.getListe().getSource().getElem().getTable().getField("DATE"),
IListFilterDatePanel.getDefaultMap());
comp.setDateDu((Date) rowExercice.getObject("DATE_DEB"));
c.weightx = 1;
c.gridy++;
this.add(comp, c);
 
/* Panel Legende */
c.gridwidth = 1;
c.gridy = GridBagConstraints.RELATIVE;
c.gridy++;
this.panelLegende = new JPanel();
this.panelLegende.setLayout(new GridBagLayout());
this.panelLegende.setBorder(BorderFactory.createTitledBorder("Légende"));
67,6 → 81,7
panelValide.add(new JLabel("Ecritures validées"));
panelValide.setBackground(Color.WHITE);
// panelValide.setBorder(BorderFactory.createLineBorder(Color.BLACK));
c.gridy++;
this.panelLegende.add(panelValide, c);
 
JPanel panelNonValide = new JPanel();
74,6 → 89,7
panelNonValide.add(new JLabel("Ecritures non validées"));
panelNonValide.setBackground(ListEcritureRenderer.getCouleurEcritureNonValide());
// panelNonValide.setBorder(BorderFactory.createLineBorder(Color.BLACK));
c.gridy++;
this.panelLegende.add(panelNonValide, c);
 
JPanel panelNonValideToDay = new JPanel();
81,9 → 97,10
panelNonValideToDay.add(new JLabel("Ecritures non validées du jour"));
panelNonValideToDay.setBackground(ListEcritureRenderer.getCouleurEcritureToDay());
// panelNonValideToDay.setBorder(BorderFactory.createLineBorder(Color.BLACK));
c.gridy++;
this.panelLegende.add(panelNonValideToDay, c);
 
c.gridy = 1;
c.gridy = 2;
c.weightx = 0;
c.weighty = 0;
c.insets = new Insets(2, 2, 1, 2);
91,7 → 108,7
 
/* Panel Total */
c.gridx = 0;
c.gridy = 0;
// c.gridy = 0;
this.panelTotal = new JPanel();
this.panelTotal.setLayout(new GridBagLayout());
this.panelTotal.setBorder(BorderFactory.createTitledBorder("Totaux"));
125,7 → 142,7
c.gridx++;
this.panelTotal.add(this.montantSolde, c);
 
c.gridy = 1;
c.gridy = 2;
c.gridx = 1;
c.weightx = 0;
c.fill = GridBagConstraints.NONE;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/EcritureGrandLivreRenderer.java
40,23 → 40,16
}
 
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
 
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
 
TableCellRendererUtils.setBackgroundColor(this, table, isSelected);
 
if (!isSelected) {
 
Ecriture ecrTmp = ((ConsultCompteModel) this.model.getTableModel()).getEcritures().get(this.model.viewIndex(row));
 
if (!ecrTmp.getValide()) {
// this.setForeground(couleurEcritureValide);
Date dateEcr = ecrTmp.getDate();
Date dateToDay = new Date();
 
if ((dateEcr.getDate() == dateToDay.getDate()) && (dateEcr.getMonth() == dateToDay.getMonth()) && (dateEcr.getYear() == dateToDay.getYear())) {
// System.out.println("ToDay :: " + dateToDay + " Ecr ::: " + dateEcr);
 
this.setBackground(couleurEcritureToDay);
} else {
this.setBackground(couleurEcritureValide);
63,14 → 56,13
}
}
}
 
if (value instanceof Date) {
this.setText(dateFormat.format((Date) value));
if (value != null) {
if (value instanceof Date) {
this.setText(dateFormat.format((Date) value));
} else if (value.getClass() == Long.class) {
this.setText(GestionDevise.currencyToString(((Long) value).longValue()));
}
}
if (value.getClass() == Long.class) {
this.setText(GestionDevise.currencyToString(((Long) value).longValue()));
}
 
return this;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/SaisieJournalItemTable.java
21,6 → 21,7
import org.openconcerto.erp.generationEcritures.GenerationMvtSaisieKm;
import org.openconcerto.erp.preferences.DefaultNXProps;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.TM;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
36,6 → 37,7
import org.openconcerto.sql.view.list.TextTableCellEditorWithCompletion;
import org.openconcerto.sql.view.list.ValidStateChecker;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JComponentUtils;
import org.openconcerto.ui.RangedIntegerTableCellEditor;
import org.openconcerto.utils.DecimalUtils;
import org.openconcerto.utils.GestionDevise;
45,6 → 47,7
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
54,6 → 57,7
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
62,6 → 66,7
 
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
295,10 → 300,21
 
TextTableCellEditorWithCompletion t = (TextTableCellEditorWithCompletion) this.tableElementNumeroCompte.getTableCellEditor(this.table);
 
this.controlPanel = new RowValuesTableControlPanel(this.table);
controlPanel.setButtonAjouterEnabled(false);
this.add(controlPanel, c);
JButton buttonClone = new JButton(TM.tr("duplicateLine"));
buttonClone.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
cloneLine(table.getSelectedRow());
}
});
buttonClone.setEnabled(false);
c.gridx++;
JComponentUtils.setMinimumWidth(buttonClone, 95);
 
this.controlPanel = new RowValuesTableControlPanel(this.table, Arrays.asList(buttonClone));
this.controlPanel.setVisibleButtonClone(false);
this.controlPanel.setButtonAjouterEnabled(false);
this.add(this.controlPanel, c);
 
c.gridy++;
c.fill = GridBagConstraints.BOTH;
c.weightx = 1;
688,4 → 704,26
public void mouseExited(final MouseEvent e) {
}
 
private void cloneLine(int row) {
if (row < 0) {
System.err.println("RowValuesTableControlPanel.cloneLine() wrong selected line, index = " + row);
Thread.dumpStack();
return;
}
SQLRowValues rowVals = this.table.getRowValuesTableModel().getRowValuesAt(row);
 
SQLRowValues rowValsBis = rowVals.deepCopy();
rowValsBis.clearPrimaryKeys();
rowValsBis.put(rowValsBis.getTable().getOrderField().getName(), null);
 
this.table.getRowValuesTableModel().getSQLElement().clearPrivateFields(rowValsBis);
rowValsBis.putEmptyLink("ID_ECRITURE");
for (String elt : this.table.getClearCloneTableElement()) {
if (rowValsBis.getTable().getFieldsName().contains(elt)) {
rowValsBis.putEmptyLink(elt);
}
}
 
this.table.getRowValuesTableModel().addRow(rowValsBis);
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/CompteCloturePreferencePanel.java
133,7 → 133,7
this.rowPrefCompteVals.put("ID_COMPTE_PCE_BILAN_O", this.selCompteOuverture.getValue());
this.rowPrefCompteVals.put("ID_COMPTE_PCE_BILAN_F", this.selCompteFermeture.getValue());
this.rowPrefCompteVals.put("ID_COMPTE_PCE_RESULTAT", this.selCompteResultat.getValue());
this.rowPrefCompteVals.put("ID_COMPTE_PCE_RESULTAT_PERTE", this.selCompteResultat.getValue());
this.rowPrefCompteVals.put("ID_COMPTE_PCE_RESULTAT_PERTE", this.selCompteResultatPerte.getValue());
this.rowPrefCompteVals.put("ID_JOURNAL_AN", this.selJournal.getValue());
this.rowPrefCompteVals.put("CREATE_NUL_SOLDE_ECR", this.boxCompteSolde.isSelected());
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/CompteGestCommPreferencePanel.java
15,6 → 15,7
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.finance.accounting.element.ComptePCESQLElement;
import org.openconcerto.erp.core.finance.accounting.element.JournalSQLElement;
import org.openconcerto.erp.generationEcritures.GenerationMvtSaisieVenteFacture;
import org.openconcerto.erp.model.ISQLCompteSelector;
import org.openconcerto.erp.preferences.DefaultNXProps;
45,7 → 46,7
 
private ISQLCompteSelector selCompteTVAIntraComm, selCompteFourn, selCompteAchat, selCompteValeurEncaissement, selCompteAvanceClient, selCompteClient, selCompteVenteProduits,
selCompteVenteService, selCompteTVACol, selCompteTVADed, selCompteTVAImmo, selCompteAchatIntra, selCompteFactor, selComptePortSoumis, selComptePortNonSoumis;
private ElementComboBox selJrnlFactor;
private ElementComboBox selJrnlFactor, selJrnlValEnc;
private final static SQLBase base = ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete();
private static final SQLTable tablePrefCompte = base.getTable("PREFS_COMPTE");
private SQLRowValues rowPrefCompteVals = new SQLRowValues(tablePrefCompte);
174,6 → 175,17
this.selCompteValeurEncaissement.init();
this.add(this.selCompteValeurEncaissement, c);
 
// Journal
c.gridy++;
c.weightx = 0;
c.gridx = 0;
this.add(new JLabel("Journal dépôt chèque"), c);
c.weightx = 1;
c.gridx++;
this.selJrnlValEnc = new ElementComboBox();
this.selJrnlValEnc.init(Configuration.getInstance().getDirectory().getElement("JOURNAL"));
this.add(this.selJrnlValEnc, c);
 
// Compte vente produits
c.gridy++;
c.weightx = 0;
325,6 → 337,10
this.rowPrefCompteVals.put("ID_COMPTE_PCE_FACTOR", this.selCompteFactor.getValue());
final int selectedId = this.selJrnlFactor.getSelectedId();
this.rowPrefCompteVals.put("ID_JOURNAL_FACTOR", (selectedId > 1) ? selectedId : 1);
 
final int selectedIdEnc = this.selJrnlValEnc.getSelectedId();
this.rowPrefCompteVals.put("ID_JOURNAL_VALEUR_ENCAISSEMENT", (selectedIdEnc > 1) ? selectedIdEnc : 1);
 
this.rowPrefCompteVals.put("ID_COMPTE_PCE_FOURNISSEUR", this.selCompteFourn.getValue());
this.rowPrefCompteVals.put("ID_COMPTE_PCE_CLIENT", this.selCompteClient.getValue());
this.rowPrefCompteVals.put("ID_COMPTE_PCE_AVANCE_CLIENT", this.selCompteAvanceClient.getValue());
388,6 → 404,7
this.selCompteFactor.setValue(value);
 
this.selJrnlFactor.setValue(GenerationMvtSaisieVenteFacture.journal);
this.selJrnlValEnc.setValue(JournalSQLElement.BANQUES);
 
// Fournisseurs
compte = ComptePCESQLElement.getComptePceDefault("Fournisseurs");
455,14 → 472,22
setComboValues(selCompteVenteService, "ID_COMPTE_PCE_VENTE_SERVICE", "VentesServices");
setComboValues(selCompteFactor, "ID_COMPTE_PCE_FACTOR", "Factor");
 
// Journal Factor
int value = (this.rowPrefCompteVals.getObject("ID_JOURNAL_FACTOR") == null ? 1 : this.rowPrefCompteVals.getInt("ID_JOURNAL_FACTOR"));
if (value <= 1) {
 
value = GenerationMvtSaisieVenteFacture.journal;
{
// Journal Factor
int value = (this.rowPrefCompteVals.getObject("ID_JOURNAL_FACTOR") == null ? 1 : this.rowPrefCompteVals.getInt("ID_JOURNAL_FACTOR"));
if (value <= 1) {
value = GenerationMvtSaisieVenteFacture.journal;
}
this.selJrnlFactor.setValue(value);
}
this.selJrnlFactor.setValue(value);
 
{
// Journal Val enc
int value = (this.rowPrefCompteVals.getObject("ID_JOURNAL_VALEUR_ENCAISSEMENT") == null ? 1 : this.rowPrefCompteVals.getInt("ID_JOURNAL_VALEUR_ENCAISSEMENT"));
if (value <= 1) {
value = JournalSQLElement.BANQUES;
}
this.selJrnlValEnc.setValue(value);
}
setComboValues(selCompteFourn, "ID_COMPTE_PCE_FOURNISSEUR", "Fournisseurs");
setComboValues(selCompteClient, "ID_COMPTE_PCE_CLIENT", "Clients");
setComboValues(selCompteAvanceClient, "ID_COMPTE_PCE_AVANCE_CLIENT", "AvanceClients");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/ComptaPrefTreeNode.java
31,7 → 31,6
import org.openconcerto.erp.preferences.GestionCommercialeGlobalPreferencePanel;
import org.openconcerto.erp.preferences.GestionPieceCommercialePanel;
import org.openconcerto.erp.preferences.ImpressionGestCommPreferencePanel;
import org.openconcerto.erp.preferences.MailRelancePreferencePanel;
import org.openconcerto.erp.preferences.ModeReglementDefautPrefPanel;
import org.openconcerto.erp.preferences.NumerotationPreferencePanel;
import org.openconcerto.erp.preferences.PayPalPreferencePanel;
119,7 → 118,6
nsGlobale.add(new PrefTreeNode(GenerationDocGlobalPreferencePanel.class, "Génération des Documents", new String[] { "documents" }));
nsGlobale.add(new PrefTreeNode(GestionClientPreferencePanel.class, "Gestion des clients", new String[] { "client", "service" }));
nsGlobale.add(new PrefTreeNode(GestionCommercialeGlobalPreferencePanel.class, "Gestion des piéces commericales", new String[] { "transfert", "numéro" }));
nsGlobale.add(new PrefTreeNode(MailRelancePreferencePanel.class, "Email de relance", new String[] { "relance", "mail" }));
 
// PayPal
final PrefTreeNode nPayPall = new PrefTreeNode(PayPalPreferencePanel.class, "PayPal", new String[] { "paypal", "facture" });
162,7 → 160,6
final PrefTreeNode nMail = new PrefTreeNode(EmailNode.class, "EMail", new String[] { "email", "mail", "courriel" });
nsPoste.add(nMail);
 
 
// add preferences for modules
for (final AbstractModule module : moduleManager.getRunningModules().values()) {
for (final Entry<Boolean, List<ModulePreferencePanelDesc>> e : module.getPrefDescriptorsByLocation(moduleManager.getRoot()).entrySet()) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/SaisieKmItemTable.java
20,6 → 20,7
import org.openconcerto.erp.core.finance.accounting.element.ComptePCESQLElement;
import org.openconcerto.erp.preferences.DefaultNXProps;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.TM;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLRow;
38,13 → 39,16
import org.openconcerto.sql.view.list.TextTableCellEditorWithCompletion;
import org.openconcerto.sql.view.list.ValidStateChecker;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JComponentUtils;
import org.openconcerto.utils.checks.ValidState;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
51,6 → 55,7
import java.util.Vector;
 
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
143,7 → 148,7
@Override
public ValidState getValidState(Object o) {
if (o != null) {
return elt.getCompteNumeroValidState(o.toString());
return this.elt.getCompteNumeroValidState(o.toString());
}
return super.getValidState(o);
}
161,8 → 166,19
m2.setWhere(w);
 
TextTableCellEditorWithCompletion t = (TextTableCellEditorWithCompletion) this.tableElementNumeroCompte.getTableCellEditor(this.table);
JButton buttonClone = new JButton(TM.tr("duplicateLine"));
buttonClone.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
cloneLine(table.getSelectedRow());
}
});
buttonClone.setEnabled(false);
c.gridx++;
JComponentUtils.setMinimumWidth(buttonClone, 95);
 
this.add(new RowValuesTableControlPanel(this.table), c);
RowValuesTableControlPanel rowValuesTableControlPanel = new RowValuesTableControlPanel(this.table, Arrays.asList(buttonClone));
rowValuesTableControlPanel.setVisibleButtonClone(false);
this.add(rowValuesTableControlPanel, c);
 
c.gridy++;
c.fill = GridBagConstraints.BOTH;
222,6 → 238,29
 
}
 
private void cloneLine(int row) {
if (row < 0) {
System.err.println("RowValuesTableControlPanel.cloneLine() wrong selected line, index = " + row);
Thread.dumpStack();
return;
}
SQLRowValues rowVals = this.table.getRowValuesTableModel().getRowValuesAt(row);
 
SQLRowValues rowValsBis = rowVals.deepCopy();
rowValsBis.clearPrimaryKeys();
rowValsBis.put(rowValsBis.getTable().getOrderField().getName(), null);
 
this.table.getRowValuesTableModel().getSQLElement().clearPrivateFields(rowValsBis);
rowValsBis.putEmptyLink("ID_ECRITURE");
for (String elt : this.table.getClearCloneTableElement()) {
if (rowValsBis.getTable().getFieldsName().contains(elt)) {
rowValsBis.putEmptyLink(elt);
}
}
 
this.table.getRowValuesTableModel().addRow(rowValsBis);
}
 
/**
* Remplit la RowValuesTable avec les ecritures du mouvement
*
334,11 → 373,11
assert SwingUtilities.isEventDispatchThread();
if (text == null)
return;
RowValuesTableModel model = table.getRowValuesTableModel();
RowValuesTableModel model = this.table.getRowValuesTableModel();
int size = model.getRowCount();
for (int i = 0; i < size; i++) {
SQLRowValues r = model.getRowValuesAt(i);
if (r.getString("NOM_ECRITURE") == null || r.getString("NOM_ECRITURE").trim().isEmpty() || r.getString("NOM_ECRITURE").trim().equals(previousText)) {
if (r.getString("NOM_ECRITURE") == null || r.getString("NOM_ECRITURE").trim().isEmpty() || r.getString("NOM_ECRITURE").equals(previousText)) {
r.put("NOM_ECRITURE", text);
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/element/AssociationAnalytiqueSQLElement.java
16,6 → 16,8
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElementLink.LinkType;
import org.openconcerto.sql.element.SQLElementLinksSetup;
import org.openconcerto.sql.model.FieldPath;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.graph.Path;
44,6 → 46,14
this.setAction("ID_SAISIE_KM_ELEMENT", ReferenceAction.CASCADE);
}
 
@Override
protected void setupLinks(SQLElementLinksSetup links) {
super.setupLinks(links);
if (getTable().contains("ID_ECRITURE")) {
links.get("ID_ECRITURE").setType(LinkType.ASSOCIATION);
}
}
 
protected List<String> getListFields() {
final List<String> list = new ArrayList<String>(2);
list.add("ID_ECRITURE");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/element/EcritureSQLElement.java
65,8 → 65,6
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.SQLException;
80,7 → 78,6
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
 
153,6 → 150,11
return "ID_MOUVEMENT";
}
 
@Override
public boolean isPrivate() {
return false;
}
 
// Impossible de modifier si validée
// FIXME impossible de saisir une écriture avant la date de debut d'exercice --> de saisir de
// document de gest comm
196,67 → 198,9
}
 
public void consultationCompte(SQLRowAccessor rowCpt) {
final ConsultationCompteFrame f = new ConsultationCompteFrame(new ListeDesEcrituresPanel(), "Consultation compte n°" + rowCpt.getString("NUMERO") + " " + rowCpt.getString("NOM"));
final ListeDesEcrituresPanel panel = new ListeDesEcrituresPanel();
final ConsultationCompteFrame f = new ConsultationCompteFrame(panel, rowCpt);
 
f.getPanel().getListe().getJTable().addMouseListener(new MouseAdapter() {
 
public void mousePressed(final MouseEvent mE) {
 
if (mE.getButton() == MouseEvent.BUTTON3) {
JPopupMenu menuDroit = new JPopupMenu();
 
menuDroit.add(new AbstractAction("Voir les ecritures du journal") {
 
public void actionPerformed(ActionEvent e) {
int id = f.getPanel().getListe().idFromIndex(f.getPanel().getListe().getJTable().rowAtPoint(mE.getPoint()));
// int id = f.getPanel().getListe().getSelectedId();
 
SQLTable ecrTable = getTable().getTable("ECRITURE");
 
System.err.println("Ecritures ID ::: " + id);
SQLRow rowEcr = ecrTable.getRow(id);
 
System.err.println("Ecritures ID ::: " + id + " --> ID_JOURNAL = " + rowEcr.getInt("ID_JOURNAL"));
 
ConsultationCompteFrame f2 = new ConsultationCompteFrame(new ListeDesEcrituresPanel(),
"Consultation du journal " + getTable().getTable("JOURNAL").getRow(rowEcr.getInt("ID_JOURNAL")).getString("NOM"));
 
Where w = new Where(ecrTable.getField("ID_JOURNAL"), "=", rowEcr.getInt("ID_JOURNAL"));
 
f2.getPanel().getListe().getRequest().setWhere(w);
f2.getPanel().getListe().setModificationAllowed(false);
f2.pack();
f2.setVisible(true);
}
});
 
menuDroit.add(new AbstractAction("Voir la source") {
 
public void actionPerformed(ActionEvent e) {
 
// int id = f.getPanel().getListe().getSelectedId();
int id = f.getPanel().getListe().idFromIndex(f.getPanel().getListe().getJTable().rowAtPoint(mE.getPoint()));
System.err.println("ID COMPTE SELECTED " + id);
SQLRow rowEcr = getTable().getTable("ECRITURE").getRow(id);
 
System.out.println("MOUVEMENT VALIDE ------------->>>>>>>>>>>>>> " + MouvementSQLElement.isEditable(rowEcr.getInt("ID_MOUVEMENT")));
 
MouvementSQLElement.showSource(rowEcr.getInt("ID_MOUVEMENT"));
 
System.out.println("Mouvement Numero : " + rowEcr.getInt("ID_MOUVEMENT"));
}
});
 
menuDroit.show(mE.getComponent(), mE.getX(), mE.getY());
}
}
});
 
SQLTable ecrTable = getTable().getTable("ECRITURE");
 
Where w = new Where(ecrTable.getField("ID_COMPTE_PCE"), "=", rowCpt.getID());
f.getPanel().getListe().getRequest().setWhere(w);
 
f.getPanel().getListe().setModificationAllowed(false);
f.pack();
f.setVisible(true);
696,7 → 640,9
 
// on archive le mouvement
if (dropMvt) {
SQLElement elt = Configuration.getInstance().getDirectory().getElement(tableMvt);
 
SQLElement elt = getDirectory().getElement(tableMvt);
 
try {
elt.archive(idMvt);
} catch (SQLException e) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/GrandLivreSheetXML.java
179,47 → 179,8
@Override
public SQLSelect transformChecked(SQLSelect sel) {
 
Where w = (new Where(tableEcriture.getField("DATE"), GrandLivreSheetXML.this.dateDu, GrandLivreSheetXML.this.dateAu));
Where w = getWhere(lCompteSolde);
 
if (GrandLivreSheetXML.this.compteDeb.equals(GrandLivreSheetXML.this.compteEnd)) {
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), "=", GrandLivreSheetXML.this.compteDeb));
} else {
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), (Object) GrandLivreSheetXML.this.compteDeb, (Object) GrandLivreSheetXML.this.compteEnd));
}
w = w.and(new Where(tableEcriture.getField("ID_JOURNAL"), "!=", idJrnlExclude));
w = w.and(new Where(tableEcriture.getField("ID_MOUVEMENT"), "=", tableMvt.getField("ID")));
 
if (GrandLivreSheetXML.this.lettrage == GrandLivreSheet.MODELETTREE) {
Object o = null;
w = w.and(new Where(tableEcriture.getField("LETTRAGE"), "<>", o));
w = w.and(new Where(tableEcriture.getField("LETTRAGE"), "!=", ""));
w = w.and(new Where(tableEcriture.getField("DATE_LETTRAGE"), "<=", GrandLivreSheetXML.this.dateAu));
} else if (GrandLivreSheetXML.this.lettrage == GrandLivreSheet.MODENONLETTREE_PERIODE) {
Object o = null;
Where w2 = new Where(tableEcriture.getField("LETTRAGE"), "=", o);
Where wSTTC = new Where(tableEcriture.getField("DATE_LETTRAGE"), "<>", o);
wSTTC = wSTTC.and(new Where(tableEcriture.getField("DATE_LETTRAGE"), ">", GrandLivreSheetXML.this.dateAu));
 
w2 = w2.or(wSTTC);
w = w.and(w2.or(new Where(tableEcriture.getField("LETTRAGE"), "=", "")));
} else if (GrandLivreSheetXML.this.lettrage == GrandLivreSheet.MODENONLETTREE_ALL) {
Object o = null;
Where w2 = new Where(tableEcriture.getField("LETTRAGE"), "=", o);
w = w.and(w2.or(new Where(tableEcriture.getField("LETTRAGE"), "=", "")));
}
 
if (GrandLivreSheetXML.this.excludeCompteSolde) {
System.err.println("Exclude compte");
 
w = w.and(new Where(tableEcriture.getField("ID_COMPTE_PCE"), lCompteSolde).not());
}
w = w.and(new Where(tableEcriture.getField("NOM"), "NOT LIKE", "Fermeture du compte%"));
 
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
 
sel.setWhere(w);
sel.addFieldOrder(tableEcriture.getField("COMPTE_NUMERO"));
sel.addFieldOrder(tableEcriture.getField("DATE"));
567,36 → 528,8
sel.addSelect(tableEcriture.getField("DEBIT"), "SUM");
sel.addSelect(tableEcriture.getField("CREDIT"), "SUM");
 
Where w;
if (this.compteDeb.equals(this.compteEnd)) {
w = new Where(tableCompte.getField("NUMERO"), "=", this.compteDeb);
} else {
w = new Where(tableCompte.getField("NUMERO"), (Object) this.compteDeb, (Object) this.compteEnd);
}
Where w = getWhere(null);
 
w = w.and(new Where(tableEcriture.getField("ID_COMPTE_PCE"), "=", tableCompte.getField("ID")));
 
if (this.cumul) {
w = w.and(new Where(tableEcriture.getField("DATE"), "<=", this.dateAu));
} else {
w = w.and(new Where(tableEcriture.getField("DATE"), this.dateDu, this.dateAu));
}
w = w.and(new Where(tableEcriture.getField("ID_JOURNAL"), "!=", idJrnlExclude));
if (this.lettrage == GrandLivreSheet.MODELETTREE) {
Object o = null;
w = w.and(new Where(tableEcriture.getField("LETTRAGE"), "<>", o));
w = w.and(new Where(tableEcriture.getField("LETTRAGE"), "!=", ""));
} else if (this.lettrage == GrandLivreSheet.MODENONLETTREE_ALL) {
Object o = null;
Where w2 = new Where(tableEcriture.getField("LETTRAGE"), "=", o);
w = w.and(w2.or(new Where(tableEcriture.getField("LETTRAGE"), "=", "")));
 
} else if (this.lettrage == GrandLivreSheet.MODENONLETTREE_PERIODE) {
Object o = null;
Where w2 = new Where(tableEcriture.getField("LETTRAGE"), "=", o);
w = w.and(w2.or(new Where(tableEcriture.getField("LETTRAGE"), "=", "")));
}
 
sel.setWhere(w);
 
String req = sel.asString() + " GROUP BY \"COMPTE_PCE\".\"ID\"";
623,6 → 556,52
return list;
}
 
private Where getWhere(final List<Integer> lCompteSolde) {
Where w = (new Where(tableEcriture.getField("DATE"), GrandLivreSheetXML.this.dateDu, GrandLivreSheetXML.this.dateAu));
 
if (GrandLivreSheetXML.this.compteDeb.equals(GrandLivreSheetXML.this.compteEnd)) {
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), "=", GrandLivreSheetXML.this.compteDeb));
} else {
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), (Object) GrandLivreSheetXML.this.compteDeb, (Object) GrandLivreSheetXML.this.compteEnd));
}
w = w.and(new Where(tableEcriture.getField("ID_JOURNAL"), "!=", idJrnlExclude));
w = w.and(new Where(tableEcriture.getField("ID_MOUVEMENT"), "=", tableMvt.getField("ID")));
 
if (GrandLivreSheetXML.this.lettrage == GrandLivreSheet.MODELETTREE) {
Object o = null;
w = w.and(new Where(tableEcriture.getField("LETTRAGE"), "<>", o));
w = w.and(new Where(tableEcriture.getField("LETTRAGE"), "!=", ""));
w = w.and(new Where(tableEcriture.getField("DATE_LETTRAGE"), "<=", GrandLivreSheetXML.this.dateAu));
} else if (GrandLivreSheetXML.this.lettrage == GrandLivreSheet.MODENONLETTREE_PERIODE) {
Object o = null;
Where w2 = new Where(tableEcriture.getField("LETTRAGE"), "=", o);
Where wSTTC = new Where(tableEcriture.getField("DATE_LETTRAGE"), "<>", o);
wSTTC = wSTTC.and(new Where(tableEcriture.getField("DATE_LETTRAGE"), ">", GrandLivreSheetXML.this.dateAu));
 
w2 = w2.or(wSTTC);
w = w.and(w2.or(new Where(tableEcriture.getField("LETTRAGE"), "=", "")));
} else if (GrandLivreSheetXML.this.lettrage == GrandLivreSheet.MODENONLETTREE_ALL) {
Object o = null;
Where w2 = new Where(tableEcriture.getField("LETTRAGE"), "=", o);
w = w.and(w2.or(new Where(tableEcriture.getField("LETTRAGE"), "=", "")));
}
 
if (GrandLivreSheetXML.this.excludeCompteSolde) {
System.err.println("Exclude compte");
 
if (lCompteSolde != null) {
w = w.and(new Where(tableEcriture.getField("ID_COMPTE_PCE"), lCompteSolde).not());
}
}
w = w.and(new Where(tableEcriture.getField("NOM"), "NOT LIKE", "Fermeture du compte%"));
 
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
return w;
}
 
/**
* @param d date limite des cumuls
* @return Map<Integer id compte, Long solde(debit-credit)>
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/Map2033A.java
499,9 → 499,9
// 120 -SommeSolde( 100, 103* )-SommeSolde( 108, 109* )
// Racine = "101, 104, 108"
// S120=-10...101-108-104
long v120 = -this.sommeCompte.sommeCompteFils("101", this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("103", this.dateDebut, this.dateFin)
- this.sommeCompte.sommeCompteFils("108", this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("104", this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(109, 109, true, this.dateDebut, this.dateFin);
long v120 = -this.sommeCompte.sommeCompteFils("101", this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("102", this.dateDebut, this.dateFin)
- this.sommeCompte.sommeCompteFils("103", this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("108", this.dateDebut, this.dateFin)
- this.sommeCompte.sommeCompteFils("104", this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(109, 109, true, this.dateDebut, this.dateFin);
this.m.put("PASSIF3.15", GestionDevise.currencyToString(v120, false));
 
// 121
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/Map2033B.java
215,7 → 215,7
* VARIATION DE STOCK
******************************************************************************************/
// 240 SommeSolde( 6030, 6036* )
long v240 = this.sommeCompte.soldeCompte(6031, 6032, true, this.dateDeb, this.dateFin);
long v240 = this.sommeCompte.soldeCompte(6031, 6036, true, this.dateDeb, this.dateFin);
this.m.put("CHARGES3.11", GestionDevise.currencyToString(v240, false));
 
// 213
264,7 → 264,7
******************************************************************************************/
// 250 SommeSolde( 640, 644* )+SommeSolde( 648, 649* )
long v250 = this.sommeCompte.soldeCompte(644, 644, true, this.dateDeb, this.dateFin) + this.sommeCompte.soldeCompte(648, 649, true, this.dateDeb, this.dateFin)
+ this.sommeCompte.soldeCompte(641, 641, true, this.dateDeb, this.dateFin);
+ this.sommeCompte.soldeCompte(641, 641, true, this.dateDeb, this.dateFin)+ this.sommeCompte.soldeCompte(642, 642, true, this.dateDeb, this.dateFin);
this.m.put("CHARGES3.14", GestionDevise.currencyToString(v250, false));
 
// 220
352,7 → 352,7
* PRODUITS FINANCIERS
******************************************************************************************/
// 280 -SommeSolde( 760, 769* )-SommeSolde( 786, 786* )-SommeSolde( 796, 796* )
long v280 = -this.sommeCompte.soldeCompte(761, 768, true, this.dateDeb, this.dateFin) - this.sommeCompte.soldeCompte(786, 786, true, this.dateDeb, this.dateFin)
long v280 = -this.sommeCompte.soldeCompte(760, 768, true, this.dateDeb, this.dateFin) - this.sommeCompte.soldeCompte(786, 786, true, this.dateDeb, this.dateFin)
- this.sommeCompte.soldeCompte(796, 796, true, this.dateDeb, this.dateFin);
this.m.put("PCHARGES3.21", GestionDevise.currencyToString(v280, false));
 
369,7 → 369,7
* PRODUITS EXCEPTIONNELS
******************************************************************************************/
// 290 -SommeSolde( 77, 77* )-SommeSolde( 787, 789* )-SommeSolde( 797, 799* )
long v290 = -this.sommeCompte.soldeCompte(771, 772, true, this.dateDeb, this.dateFin) - this.sommeCompte.soldeCompte(775, 778, true, this.dateDeb, this.dateFin)
long v290 = -this.sommeCompte.soldeCompte(770, 772, true, this.dateDeb, this.dateFin) - this.sommeCompte.soldeCompte(775, 778, true, this.dateDeb, this.dateFin)
- this.sommeCompte.soldeCompte(787, 787, true, this.dateDeb, this.dateFin) - this.sommeCompte.soldeCompte(797, 797, true, this.dateDeb, this.dateFin);
this.m.put("PCHARGES3.22", GestionDevise.currencyToString(v290, false));
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/ui/ListeDesChequesAEncaisserPanel.java
18,6 → 18,7
import org.openconcerto.erp.rights.ComptaTotalUserRight;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.sqlobject.SQLRequestComboBox;
import org.openconcerto.sql.users.rights.UserRightsManager;
53,10 → 54,10
 
@Override
protected JTextComponent createLabelText() {
if (fieldLabel == null) {
if (this.fieldLabel == null) {
this.fieldLabel = new JTextField();
}
return fieldLabel;
return this.fieldLabel;
}
 
@Override
66,18 → 67,16
@Override
public void actionPerformed(ActionEvent e) {
final String s = text.getText();
SQLRowValues rowValsDepot = new SQLRowValues(element.getTable().getTable("DEPOT_CHEQUE"));
SQLRowValues rowValsDepot = new SQLRowValues(ListeDesChequesAEncaisserPanel.this.element.getTable().getTable("DEPOT_CHEQUE"));
rowValsDepot.put("DATE", dateDepot.getValue());
rowValsDepot.put("NOM", fieldLabel.getText());
rowValsDepot.put("NOM", ListeDesChequesAEncaisserPanel.this.fieldLabel.getText());
final SQLRow selectedBanque = banqueSelect.getSelectedRow();
if (selectedBanque != null) {
rowValsDepot.put("ID_" + selectedBanque.getTable().getName(), selectedBanque.getID());
}
List<SQLRowValues> chq = getListe().getSelectedRows();
for (SQLRowValues sqlRowValues : chq) {
SQLRow rowChq = sqlRowValues.asRow();
rowChq.fetchValues();
SQLRowValues rowValsDepotElt = new SQLRowValues(element.getTable().getTable("DEPOT_CHEQUE_ELEMENT"));
final List<SQLRow> chq = SQLRowListRSH.fetch(getListe().getRequest().getPrimaryTable(), getListe().getSelection().getSelectedIDs());
for (SQLRow rowChq : chq) {
SQLRowValues rowValsDepotElt = new SQLRowValues(ListeDesChequesAEncaisserPanel.this.element.getTable().getTable("DEPOT_CHEQUE_ELEMENT"));
rowValsDepotElt.put("ID_DEPOT_CHEQUE", rowValsDepot);
if (rowChq.getObject("ID_CLIENT") != null && !rowChq.isForeignEmpty("ID_CLIENT")) {
rowValsDepotElt.put("ID_CLIENT", rowChq.getForeignID("ID_CLIENT"));
96,7 → 95,7
rowValsDepotElt.put("NUMERO", (rowChq.getObject("NUMERO") == null ? "" : rowChq.getObject("NUMERO")));
rowValsDepotElt.put("MONTANT", rowChq.getObject("MONTANT"));
}
EditFrame frame = new EditFrame(element.getDirectory().getElement("DEPOT_CHEQUE"), EditMode.CREATION);
EditFrame frame = new EditFrame(ListeDesChequesAEncaisserPanel.this.element.getDirectory().getElement("DEPOT_CHEQUE"), EditMode.CREATION);
frame.getSQLComponent().select(rowValsDepot);
frame.setVisible(true);
text.setText("");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/component/EncaisserMontantSQLComponent.java
16,11 → 16,9
import org.openconcerto.erp.core.common.element.BanqueSQLElement;
import org.openconcerto.erp.core.common.ui.DeviseField;
import org.openconcerto.erp.core.finance.accounting.element.MouvementSQLElement;
import org.openconcerto.erp.core.finance.payment.element.EncaisserMontantSQLElement;
import org.openconcerto.erp.core.finance.payment.element.TypeReglementSQLElement;
import org.openconcerto.erp.core.finance.payment.ui.EncaisseMontantTable;
import org.openconcerto.erp.core.sales.invoice.component.SaisieVenteFactureSQLComponent;
import org.openconcerto.erp.generationEcritures.GenerationReglementVenteNG;
import org.openconcerto.erp.model.PrixTTC;
import org.openconcerto.erp.preferences.ModeReglementDefautPrefPanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.BaseSQLComponent;
33,7 → 31,6
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.list.RowValuesTableModel;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JDate;
41,7 → 38,6
import org.openconcerto.ui.warning.JLabelWarning;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.GestionDevise;
import org.openconcerto.utils.StringUtils;
import org.openconcerto.utils.text.SimpleDocumentListener;
 
import java.awt.GridBagConstraints;
55,7 → 51,6
 
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.event.DocumentEvent;
182,7 → 177,6
this.addRequiredSQLObject(this.montant, "MONTANT");
 
this.addSQLObject(this.nom, "NOM");
 
this.addSQLObject(new ElementComboBox(), "ID_COMPTE_PCE_TIERS");
this.addSQLObject(new JTextField(), "TIERS");
305,64 → 299,17
public int insert(SQLRow order) {
 
int id = super.insert(order);
try {
this.table.updateField("ID_ENCAISSER_MONTANT", id);
this.table.updateField("ID_ENCAISSER_MONTANT", id);
 
System.out.println("Génération des ecritures du reglement");
SQLRow row = getTable().getRow(id);
String s = row.getString("NOM");
SQLRow rowModeRegl = row.getForeignRow("ID_MODE_REGLEMENT");
SQLRow rowTypeRegl = rowModeRegl.getForeignRow("ID_TYPE_REGLEMENT");
System.out.println("Génération des ecritures du reglement");
SQLRow row = getTable().getRow(id);
 
// Compte Client
SQLRow clientRow = row.getForeignRow("ID_CLIENT");
 
String label = "Règlement vente " + ((s == null) ? "" : s) + " (" + rowTypeRegl.getString("NOM") + ") " + StringUtils.limitLength(clientRow.getString("NOM"), 20);
long montant = row.getLong("MONTANT");
PrixTTC ttc = new PrixTTC(montant);
 
List<SQLRow> l = row.getReferentRows(Configuration.getInstance().getDirectory().getElement("ENCAISSER_MONTANT_ELEMENT").getTable());
if (l.isEmpty()) {
JOptionPane.showMessageDialog(null, "Un problème a été rencontré lors de l'encaissement! \n Les écritures comptables non pu être générer!");
System.err.println("Liste des échéances vides pour l'encaissement ID " + id);
Thread.dumpStack();
}
new GenerationReglementVenteNG(label, clientRow, ttc, row.getDate("DATE").getTime(), rowModeRegl, row, l.get(0).getForeignRow("ID_MOUVEMENT_ECHEANCE"), false, false,
row.getString("TIERS"), row.getForeign("ID_COMPTE_PCE_TIERS"));
 
// Mise a jour du montant de l'echeance
boolean supplement = false;
 
if (!row.getBoolean("ACOMPTE")) {
// On marque les echeances comme reglees
for (SQLRow sqlRow : l) {
 
final SQLRow rowEch = sqlRow.getForeignRow("ID_ECHEANCE_CLIENT");
SQLRowValues rowValsEch = rowEch.createEmptyUpdateRow();
if (sqlRow.getLong("MONTANT_REGLE") >= sqlRow.getLong("MONTANT_A_REGLER")) {
rowValsEch.put("REGLE", Boolean.TRUE);
if (sqlRow.getLong("MONTANT_REGLE") > sqlRow.getLong("MONTANT_A_REGLER")) {
supplement = true;
}
}
rowValsEch.put("MONTANT", Long.valueOf(rowEch.getLong("MONTANT") - sqlRow.getLong("MONTANT_REGLE")));
 
rowValsEch.update();
// this.comboEcheance.rowDeleted(tableEch, rowEch.getID());
// getTable().fireTableModified(rowEch.getID());
}
}
// si le montant réglé est supérieur, on crée une facture de complément
if (supplement) {
SQLElement elt = Configuration.getInstance().getDirectory().getElement("SAISIE_VENTE_FACTURE");
EditFrame f = new EditFrame(elt, EditFrame.CREATION);
SaisieVenteFactureSQLComponent comp = (SaisieVenteFactureSQLComponent) f.getSQLComponent();
comp.setComplement(true);
f.setVisible(true);
}
try {
((EncaisserMontantSQLElement) getElement()).regleFacture(row);
} catch (Exception e) {
ExceptionHandler.handle("Erreur lors de la génération des ecritures du reglement", e);
ExceptionHandler.handle("Erreur de génération des écritures", e);
}
 
return id;
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/ChequeAEncaisserSQLElement.java
100,9 → 100,13
l.add("DATE_VENTE");
l.add(getMinDateFieldName());
l.add("ID_CLIENT");
final ShowAs showAs = new ShowAs(getTable().getDBRoot());
if (getTable().contains("ID_BANQUE")) {
l.add("ID_BANQUE");
showAs.show(getTable().getForeignTable("ID_BANQUE"), "NOM");
}
l.add("MONTANT");
 
final ShowAs showAs = new ShowAs(getTable().getDBRoot());
 
final SQLTable mvtT = getTable().getForeignTable("ID_MOUVEMENT");
showAs.show(mvtT, "ID_PIECE");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/EncaisserMontantSQLElement.java
17,9 → 17,13
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.finance.accounting.element.EcritureSQLElement;
import org.openconcerto.erp.core.finance.payment.component.EncaisserMontantSQLComponent;
import org.openconcerto.erp.core.sales.invoice.component.SaisieVenteFactureSQLComponent;
import org.openconcerto.erp.generationEcritures.GenerationReglementVenteNG;
import org.openconcerto.erp.model.PrixTTC;
import org.openconcerto.erp.preferences.GestionCommercialeGlobalPreferencePanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.element.TreesOfSQLRows;
import org.openconcerto.sql.model.FieldPath;
import org.openconcerto.sql.model.SQLRow;
32,6 → 36,7
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.sql.model.graph.PathBuilder;
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.list.BaseSQLTableModelColumn;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
39,6 → 44,7
import org.openconcerto.sql.view.list.SQLTableModelSource;
import org.openconcerto.utils.CollectionUtils;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.StringUtils;
 
import java.awt.event.ActionEvent;
import java.sql.SQLException;
51,6 → 57,8
import java.util.Set;
 
import javax.swing.AbstractAction;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
 
public class EncaisserMontantSQLElement extends ComptaSQLConfElement {
 
164,6 → 172,76
super.archive(trees, cutLinks);
}
 
public void regleFacture(SQLRow row) throws Exception {
 
System.out.println("Génération des ecritures du reglement");
String s = row.getString("NOM");
SQLRow rowModeRegl = row.getForeignRow("ID_MODE_REGLEMENT");
SQLRow rowTypeRegl = rowModeRegl.getForeignRow("ID_TYPE_REGLEMENT");
 
// Compte Client
SQLRow clientRow = row.getForeignRow("ID_CLIENT");
 
String label = "Règlement vente " + ((s == null) ? "" : s) + " (" + rowTypeRegl.getString("NOM") + ") " + StringUtils.limitLength(clientRow.getString("NOM"), 20);
long montant = row.getLong("MONTANT");
PrixTTC ttc = new PrixTTC(montant);
 
List<SQLRow> l = row.getReferentRows(row.getTable().getTable("ENCAISSER_MONTANT_ELEMENT"));
if (l.isEmpty()) {
SwingUtilities.invokeLater(new Runnable() {
 
@Override
public void run() {
JOptionPane.showMessageDialog(null, "Un problème a été rencontré lors de l'encaissement! \n Les écritures comptables non pu être générer!");
}
});
System.err.println("Liste des échéances vides pour l'encaissement ID " + row.getID());
Thread.dumpStack();
return;
}
new GenerationReglementVenteNG(label, clientRow, ttc, row.getDate("DATE").getTime(), rowModeRegl, row, l.get(0).getForeignRow("ID_MOUVEMENT_ECHEANCE"), false, false, row.getString("TIERS"),
row.getForeign("ID_COMPTE_PCE_TIERS"));
 
// Mise a jour du montant de l'echeance
boolean supplement = false;
 
if (!row.getBoolean("ACOMPTE")) {
// On marque les echeances comme reglees
for (SQLRow sqlRow : l) {
 
final SQLRow rowEch = sqlRow.getForeignRow("ID_ECHEANCE_CLIENT");
SQLRowValues rowValsEch = rowEch.createEmptyUpdateRow();
if (sqlRow.getLong("MONTANT_REGLE") >= sqlRow.getLong("MONTANT_A_REGLER")) {
rowValsEch.put("REGLE", Boolean.TRUE);
if (sqlRow.getLong("MONTANT_REGLE") > sqlRow.getLong("MONTANT_A_REGLER")) {
supplement = true;
}
}
rowValsEch.put("MONTANT", Long.valueOf(rowEch.getLong("MONTANT") - sqlRow.getLong("MONTANT_REGLE")));
 
rowValsEch.update();
// this.comboEcheance.rowDeleted(tableEch, rowEch.getID());
// getTable().fireTableModified(rowEch.getID());
}
}
// si le montant réglé est supérieur, on crée une facture de complément
if (supplement) {
SQLElement elt = getDirectory().getElement("SAISIE_VENTE_FACTURE");
SwingUtilities.invokeLater(new Runnable() {
 
@Override
public void run() {
 
EditFrame f = new EditFrame(elt, EditFrame.CREATION);
SaisieVenteFactureSQLComponent comp = (SaisieVenteFactureSQLComponent) f.getSQLComponent();
comp.setComplement(true);
f.setVisible(true);
}
});
}
 
}
 
@Override
protected String createCodeSuffix() {
return ".category";
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/ui/EditionFichePayePanel.java
165,7 → 165,7
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
buttonValid.setEnabled(dateDeb.getValue() != null && dateFin.getValue() != null && dateDeb.getValue().before(dateFin.getValue()));
buttonValid.setEnabled(dateDeb.getValue() != null && dateFin.getValue() != null && dateDeb.getValue().compareTo(dateFin.getValue()) <= 0);
model.setDateLimit(dateDeb.getValue());
}
};
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/ReglementPayeSQLElement.java
97,7 → 97,7
JLabel labelNomBq = new JLabel(getLabelFor("NOM_BANQUE"));
labelNomBq.setHorizontalAlignment(SwingConstants.RIGHT);
SQLTextCombo textNomBq = new SQLTextCombo();
 
c.weightx = 0;
panelBanque.add(labelNomBq, c);
c.gridx++;
c.weightx = 1;
104,6 → 104,32
panelBanque.add(textNomBq, c);
c.weightx = 0;
 
// IBAN
JLabel labelIBAN = new JLabel(getLabelFor("IBAN"));
labelIBAN.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField textIBAN = new JTextField();
 
c.gridy++;
c.gridx = 0;
c.weightx = 0;
panelBanque.add(labelIBAN, c);
c.gridx++;
c.weightx = 1;
panelBanque.add(textIBAN, c);
 
// BIC
JLabel labelBIC = new JLabel(getLabelFor("BIC"));
labelBIC.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField textBIC = new JTextField();
 
c.gridy++;
c.gridx = 0;
c.weightx = 0;
panelBanque.add(labelBIC, c);
c.gridx++;
c.weightx = 1;
panelBanque.add(textBIC, c);
 
// RIB
JLabel labelRIB = new JLabel(getLabelFor("RIB"));
labelRIB.setHorizontalAlignment(SwingConstants.RIGHT);
153,11 → 179,13
c.gridy++;
panelReglement.add(radioLe, c);
c.gridx++;
c.weightx = 1;
panelReglement.add(textLe, c);
textLe.setText("31");
c.gridx++;
c.weightx = 0;
panelReglement.add(labelDu, c);
c.weightx = 1;
panelReglement.add(labelDu, c);
 
c.gridy++;
c.gridx = 0;
210,6 → 238,7
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 1;
c.weightx = 0;
panelCompta.add(labelCompteSal, c);
c.gridx++;
c.weightx = 1;
225,6 → 254,8
 
this.addSQLObject(textNomBq, "NOM_BANQUE");
this.addSQLObject(textRIB, "RIB");
this.addSQLObject(textIBAN, "IBAN");
this.addSQLObject(textBIC, "BIC");
this.addRequiredSQLObject(typeRegl, "ID_MODE_REGLEMENT_PAYE");
this.addRequiredSQLObject(textLe, "LE");
this.addRequiredSQLObject(compteSal, "ID_COMPTE_PCE");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/SalarieSQLElement.java
15,6 → 15,7
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.common.element.NumerotationAutoSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ContactItemTable;
import org.openconcerto.erp.core.edm.AttachmentAction;
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.ElementSQLObject;
25,15 → 26,17
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.UndefinedRowValuesCache;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.EditPanel.EditMode;
import org.openconcerto.sql.view.EditPanelListener;
import org.openconcerto.sql.view.EditPanel.EditMode;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.FormLayouter;
import org.openconcerto.ui.FrameUtil;
import org.openconcerto.ui.warning.JLabelWarning;
import org.openconcerto.utils.checks.ValidState;
46,9 → 49,11
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
 
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
94,6 → 99,7
try {
rowInfosAncien.createEmptyUpdateRow().put("ID_SALARIE", rowSelected.getID()).commit();
rowSelected.createEmptyUpdateRow().put("ID_INFOS_SALARIE_PAYE", id).commit();
infosPayeElement.getTable().getRow(id).createEmptyUpdateRow().put("ID_SALARIE", rowSelected.getID()).commit();
} catch (SQLException e) {
e.printStackTrace();
}
141,7 → 147,7
return new BaseSQLComponent(this) {
private final JLabel warningCodeSalLabel = new JLabelWarning();
private final JTextField textCode = new JTextField();
 
ContactItemTable tableContact = new ContactItemTable(UndefinedRowValuesCache.getInstance().getDefaultRowValues(getTable().getTable("CONTACT_SALARIE")));
private JTabbedPane tabbedPane;
private final SQLTable tableNum = getTable().getBase().getTable("NUMEROTATION_AUTO");
 
206,6 → 212,18
}
});
 
// User
final JLabel labelUser = new JLabel(getLabelFor("ID_USER_COMMON"));
final ElementComboBox comboUser = new ElementComboBox(false, 50);
c.gridx = 0;
c.gridy++;
this.add(labelUser, c);
c.gridx++;
c.weightx = 0;
c.fill = GridBagConstraints.NONE;
this.add(comboUser, c);
this.addView(comboUser, "ID_USER_COMMON");
 
/***********************************************************************************
* TABBED PANE
**********************************************************************************/
218,6 → 236,18
scrollEtatCivil.setBorder(null);
this.tabbedPane.add("Etat Civil", scrollEtatCivil);
 
// Contact
JPanel panelContact = new JPanel(new GridBagLayout());
DefaultGridBagConstraints cContact = new DefaultGridBagConstraints();
cContact.weighty = 1;
cContact.weightx = 1;
cContact.fill = GridBagConstraints.BOTH;
 
panelContact.add(tableContact, cContact);
JScrollPane scrollContact = new JScrollPane(panelContact);
scrollContact.setBorder(null);
this.tabbedPane.add("Contacts", scrollContact);
 
// Règlement de la paye
this.addView("ID_REGLEMENT_PAYE", REQ + ";" + DEC + ";" + SEP);
ElementSQLObject eltReglPaye = (ElementSQLObject) this.getView("ID_REGLEMENT_PAYE");
286,6 → 316,17
this.tabbedPane.add("Cumuls et variables de la période", new JScrollPane(panelAllCumul));
// this.tabbedPane.setEnabledAt(this.tabbedPane.getTabCount() - 1, false);
 
Map<String, JComponent> additionalFields = getElement().getAdditionalFields();
if (additionalFields != null && additionalFields.size() > 0) {
// Champ Module
c.gridx = 0;
c.gridy++;
c.gridwidth = GridBagConstraints.REMAINDER;
final JPanel addP = ComptaSQLConfElement.createAdditionalPanel();
this.setAdditionalFieldsPanel(new FormLayouter(addP, 2));
this.tabbedPane.add("Compléments", new JScrollPane(addP));
}
 
c.gridy++;
c.gridx = 0;
c.weighty = 1;
335,15 → 376,19
* }
*/
checkCode();
if (r != null) {
this.tableContact.insertFrom("ID_SALARIE", r.asRowValues());
}
}
 
public void update() {
 
super.update();
 
SQLTable tableFichePaye = getTable().getBase().getTable("FICHE_PAYE");
SQLRowValues rowVals = new SQLRowValues(tableFichePaye);
rowVals.put("ID_SALARIE", getSelectedID());
rowVals.put("ID_SALARIE",
 
getSelectedID());
SQLRow row = getTable().getRow(getSelectedID());
try {
rowVals.update(row.getInt("ID_FICHE_PAYE"));
350,6 → 395,7
} catch (SQLException e) {
e.printStackTrace();
}
this.tableContact.updateField("ID_SALARIE", getSelectedID());
}
 
public int insert(SQLRow order) {
387,9 → 433,10
e.printStackTrace();
}
}
 
this.tableContact.updateField("ID_SALARIE", id);
return id;
}
 
};
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/ContratSalarieSQLElement.java
112,6 → 112,20
c.gridx++;
c.weightx = 1;
this.add(selCodeCatSocio, c);
JLabel complPCSLabel = new JLabel(getLabelFor("COMPLEMENT_PCS"));
complPCSLabel.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField complPCS = new JTextField();
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(complPCSLabel, c);
c.gridx++;
c.weightx = 1;
this.add(complPCS, c);
addView(complPCS,"COMPLEMENT_PCS");
 
// Contrat de travail
JLabel labelContratTravail = new JLabel(getLabelFor("ID_CODE_CONTRAT_TRAVAIL"));
225,87 → 239,91
this.add(selFF, c);
this.addSQLObject(selFF, "ID_CONTRAT_MOTIF_RECOURS");
 
// Code Arrco, agirc retirés du contrat et ajoutés dans les caisses de cotisations
 
// Code UGRR
JLabel labelCodeUGRR = new JLabel(getLabelFor("CODE_IRC_UGRR"));
labelCodeUGRR.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField textCodeUGRR = new JTextField();
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(labelCodeUGRR, c);
c.gridx++;
c.weighty = 1;
c.weightx = 1;
this.add(textCodeUGRR, c);
addView(textCodeUGRR, "CODE_IRC_UGRR");
 
JLabel labelNumUGRR = new JLabel(getLabelFor("NUMERO_RATTACHEMENT_UGRR"));
labelNumUGRR.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField textNumUGRR = new JTextField();
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(labelNumUGRR, c);
c.gridx++;
c.weighty = 1;
c.weightx = 1;
this.add(textNumUGRR, c);
addView(textNumUGRR, "NUMERO_RATTACHEMENT_UGRR");
// JLabel labelCodeUGRR = new JLabel(getLabelFor("CODE_IRC_UGRR"));
// labelCodeUGRR.setHorizontalAlignment(SwingConstants.RIGHT);
// JTextField textCodeUGRR = new JTextField();
// c.gridy++;
// c.gridx = 0;
// c.weightx = 0;
// this.add(labelCodeUGRR, c);
// c.gridx++;
// c.weighty = 1;
// c.weightx = 1;
// this.add(textCodeUGRR, c);
// addView(textCodeUGRR, "CODE_IRC_UGRR");
//
// JLabel labelNumUGRR = new JLabel(getLabelFor("NUMERO_RATTACHEMENT_UGRR"));
// labelNumUGRR.setHorizontalAlignment(SwingConstants.RIGHT);
// JTextField textNumUGRR = new JTextField();
// c.gridy++;
// c.gridx = 0;
// c.weightx = 0;
// this.add(labelNumUGRR, c);
// c.gridx++;
// c.weighty = 1;
// c.weightx = 1;
// this.add(textNumUGRR, c);
// addView(textNumUGRR, "NUMERO_RATTACHEMENT_UGRR");
//
// // Code UGRC
// JLabel labelCodeUGRC = new JLabel(getLabelFor("CODE_IRC_UGRC"));
// labelCodeUGRC.setHorizontalAlignment(SwingConstants.RIGHT);
// JTextField textCodeUGRC = new JTextField();
// c.gridy++;
// c.gridx = 0;
// c.weightx = 0;
// this.add(labelCodeUGRC, c);
// c.gridx++;
// c.weighty = 1;
// c.weightx = 1;
// this.add(textCodeUGRC, c);
// addView(textCodeUGRC, "CODE_IRC_UGRC");
//
// JLabel labelNumUGRC = new JLabel(getLabelFor("NUMERO_RATTACHEMENT_UGRC"));
// labelNumUGRC.setHorizontalAlignment(SwingConstants.RIGHT);
// JTextField textNumUGRC = new JTextField();
// c.gridy++;
// c.gridx = 0;
// c.weightx = 0;
// this.add(labelNumUGRC, c);
// c.gridx++;
// c.weighty = 1;
// c.weightx = 1;
// this.add(textNumUGRC, c);
// addView(textNumUGRC, "NUMERO_RATTACHEMENT_UGRC");
//
// // Retraite
// JLabel labelCodeRetraite = new JLabel(getLabelFor("CODE_IRC_RETRAITE"));
// labelCodeRetraite.setHorizontalAlignment(SwingConstants.RIGHT);
// JTextField textCodeRetraite = new JTextField();
// c.gridy++;
// c.gridx = 0;
// c.weightx = 0;
// this.add(labelCodeRetraite, c);
// c.gridx++;
// c.weighty = 1;
// c.weightx = 1;
// this.add(textCodeRetraite, c);
// addView(textCodeRetraite, "CODE_IRC_RETRAITE");
//
// JLabel labelNumRetraite = new
// JLabel(getLabelFor("NUMERO_RATTACHEMENT_RETRAITE"));
// labelNumRetraite.setHorizontalAlignment(SwingConstants.RIGHT);
// JTextField textNumRetraite = new JTextField();
// c.gridy++;
// c.gridx = 0;
// c.weightx = 0;
// this.add(labelNumRetraite, c);
// c.gridx++;
// c.weighty = 1;
// c.weightx = 1;
// this.add(textNumRetraite, c);
// addView(textNumRetraite, "NUMERO_RATTACHEMENT_RETRAITE");
 
// Code UGRC
JLabel labelCodeUGRC = new JLabel(getLabelFor("CODE_IRC_UGRC"));
labelCodeUGRC.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField textCodeUGRC = new JTextField();
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(labelCodeUGRC, c);
c.gridx++;
c.weighty = 1;
c.weightx = 1;
this.add(textCodeUGRC, c);
addView(textCodeUGRC, "CODE_IRC_UGRC");
 
JLabel labelNumUGRC = new JLabel(getLabelFor("NUMERO_RATTACHEMENT_UGRC"));
labelNumUGRC.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField textNumUGRC = new JTextField();
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(labelNumUGRC, c);
c.gridx++;
c.weighty = 1;
c.weightx = 1;
this.add(textNumUGRC, c);
addView(textNumUGRC, "NUMERO_RATTACHEMENT_UGRC");
 
// Retraite
JLabel labelCodeRetraite = new JLabel(getLabelFor("CODE_IRC_RETRAITE"));
labelCodeRetraite.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField textCodeRetraite = new JTextField();
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(labelCodeRetraite, c);
c.gridx++;
c.weighty = 1;
c.weightx = 1;
this.add(textCodeRetraite, c);
addView(textCodeRetraite, "CODE_IRC_RETRAITE");
 
JLabel labelNumRetraite = new JLabel(getLabelFor("NUMERO_RATTACHEMENT_RETRAITE"));
labelNumRetraite.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField textNumRetraite = new JTextField();
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(labelNumRetraite, c);
c.gridx++;
c.weighty = 1;
c.weightx = 1;
this.add(textNumRetraite, c);
addView(textNumRetraite, "NUMERO_RATTACHEMENT_RETRAITE");
 
// JLabel labelCodeRegimeRetraite = new
// JLabel(getLabelFor("CODE_REGIME_RETRAITE_DSN"));
// labelCodeRegimeRetraite.setHorizontalAlignment(SwingConstants.RIGHT);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/InfosSalariePayeSQLElement.java
442,6 → 442,19
panelBase.add(sectionAT, c);
addView(sectionAT, "CODE_SECTION_AT");
 
if (getTable().contains("DUREE_FORFAIT")) {
JLabel labelForfait = new JLabel(getLabelFor("DUREE_FORFAIT"));
labelForfait.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField forfait = new JTextField();
c.gridx++;
c.weightx = 0;
panelBase.add(labelForfait, c);
c.gridx++;
c.weightx = 1;
panelBase.add(forfait, c);
addView(forfait, "DUREE_FORFAIT");
}
 
c.gridy = 5;
c.gridx = 0;
c.gridwidth = GridBagConstraints.REMAINDER;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/report/FichePayeSheetXML.java
198,6 → 198,32
ligneSimplifiee.put("MONTANT_SAL_DED", montantSalBulletinSimpl.add(montantSalLigne));
ligneSimplifiee.put("MONTANT_PAT", montantPatBulletinSimpl.add(montantPatLigne));
}
 
BigDecimal tauxPatBulletinSimpl = BigDecimal.ZERO;
BigDecimal tauxSalBulletinSimpl = BigDecimal.ZERO;
if (ligneSimplifiee.getBigDecimal("TAUX_SAL") != null) {
tauxSalBulletinSimpl = ligneSimplifiee.getBigDecimal("TAUX_SAL");
}
if (ligneSimplifiee.getBigDecimal("TAUX_PAT") != null) {
tauxPatBulletinSimpl = ligneSimplifiee.getBigDecimal("TAUX_PAT");
}
 
BigDecimal tauxPatLigne = BigDecimal.ZERO;
BigDecimal tauxSalLigne = BigDecimal.ZERO;
if (sqlRowAccessor.getBigDecimal("TAUX_SAL") != null) {
tauxSalLigne = sqlRowAccessor.getBigDecimal("TAUX_SAL");
}
if (sqlRowAccessor.getBigDecimal("TAUX_PAT") != null) {
tauxPatLigne = sqlRowAccessor.getBigDecimal("TAUX_PAT");
}
 
if (tauxSalLigne.signum() > 0) {
ligneSimplifiee.put("TAUX_SAL", tauxSalBulletinSimpl.add(tauxSalLigne));
}
 
if (tauxPatLigne.signum() >