OpenConcerto

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

svn://code.openconcerto.org/openconcerto

Compare Revisions

Regard whitespace Rev 179 → Rev 180

/trunk/OpenConcerto/src/org/openconcerto/erp/action/NouvelleConnexionAction.java
35,6 → 35,9
import org.openconcerto.erp.rights.MenuComboRightEditor;
import org.openconcerto.erp.utils.NXDatabaseAccessor;
import org.openconcerto.map.model.Ville;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.PropsConfiguration;
import org.openconcerto.sql.TM;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLBackgroundTableCache;
import org.openconcerto.sql.model.SQLBase;
64,6 → 67,7
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.JImage;
import org.openconcerto.utils.cc.IClosure;
import org.openconcerto.utils.i18n.TranslationManager;
 
import java.awt.Color;
import java.awt.GridBagConstraints;
81,6 → 85,7
import java.util.logging.Level;
 
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
203,6 → 208,7
final String socTitle = comptaPropsConfiguration.getRowSociete() == null ? "" : ", [Société " + comptaPropsConfiguration.getRowSociete().getString("NOM") + "]";
f.setTitle(comptaPropsConfiguration.getAppName() + " " + version + socTitle);
f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
 
}
});
final FutureTask<?> showMainFrame = new FutureTask<Object>(new Runnable() {
275,11 → 281,29
c.fill = GridBagConstraints.BOTH;
 
this.connexionPanel = ConnexionPanel.create(r, image, !Gestion.isMinimalMode());
if (this.connexionPanel == null)
final List<Locale> langs = Arrays.asList(Locale.FRANCE, Locale.CANADA_FRENCH, new Locale("fr", "CH"), new Locale("fr", "BE"), Locale.UK, Locale.CANADA, Locale.US, Locale.GERMANY,
new Locale("de", "CH"), new Locale("es", "ES"), new Locale("pl", "PL"));
if (this.connexionPanel == null) {
final Locale locale = UserProps.getInstance().getLocale();
// for next launch
UserProps.getInstance().setLocale(locale);
// for current run
((PropsConfiguration) Configuration.getInstance()).setLocale(locale);
// for code that will never need more than one Locale concurrently
// (e.g. used by TM singletons in various packages)
Locale.setDefault(locale);
// as explained in Locale.setDefault() javadoc : "be prepared to reinitialize
// locale-sensitive code"
JComponent.setDefaultLocale(locale);
// throw RuntimeException like ResourceBundle.getBundle() at the beginning of this
// method
TranslationManager.createDefaultInstance();
TM.getInstance();
return null;
this.connexionPanel.initLocalization(getClass().getName(), Arrays.asList(Locale.FRANCE, Locale.CANADA_FRENCH, new Locale("fr", "CH"), new Locale("fr", "BE"), Locale.UK, Locale.CANADA,
Locale.US, Locale.GERMANY, new Locale("de", "CH"), new Locale("es", "ES"), new Locale("pl", "PL")));
}
 
this.connexionPanel.initLocalization(getClass().getName(), langs);
 
p.add(this.connexionPanel, c);
final PanelFrame panelFrame = new PanelFrame(p, "Connexion");
panelFrame.setLocationRelativeTo(null);
299,12 → 323,12
@Override
public void run() {
// laisse le temps au logiciel de demarrer
ClasseCompte.loadClasseCompte(comptaConf);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ClasseCompte.loadClasseCompte();
CaisseCotisationSQLElement.getCaisseCotisation();
 
SQLPreferences prefs = SQLPreferences.getMemCached(comptaConf.getRootSociete());
/trunk/OpenConcerto/src/org/openconcerto/erp/action/CreateFrameAbstractAction.java
50,9 → 50,12
final Object name = action.getValue(Action.NAME);
WindowStateManager stateManager = null;
if (name != null) {
stateManager = new WindowStateManager(frame, new File(conf.getConfDir(), "Configuration" + File.separator + "Frame" + File.separator + name.toString() + ".xml"),
true);
if (conf == null) {
System.err.println("Warning: no configuration for action " + action + ", unable to use a window state manager.");
} else {
stateManager = new WindowStateManager(frame, new File(conf.getConfDir(), "Configuration" + File.separator + "Frame" + File.separator + name.toString() + ".xml"), true);
}
} else {
System.err.println("Warning: no action name for action " + action + ", unable to use a window state manager.");
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/CmdEltFactEltSQLInjector.java
New file
0,0 → 1,27
/*
* 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.injector;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLInjector;
 
public class CmdEltFactEltSQLInjector extends SQLInjector {
public CmdEltFactEltSQLInjector(final DBRoot root) {
super(root, "COMMANDE_ELEMENT", "FACTURE_FOURNISSEUR_ELEMENT", false);
createDefaultMap();
if (getDestination().contains("ID_COMMANDE_ELEMENT")) {
map(getSource().getKey(), getDestination().getField("ID_COMMANDE_ELEMENT"));
}
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/BrEltFactEltSQLInjector.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.injector;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLInjector;
 
public class BrEltFactEltSQLInjector extends SQLInjector {
public BrEltFactEltSQLInjector(final DBRoot root) {
super(root, "BON_RECEPTION_ELEMENT", "FACTURE_FOURNISSEUR_ELEMENT", false);
createDefaultMap();
if (getDestination().contains("ID_COMMANDE_ELEMENT") && getSource().contains("ID_COMMANDE_ELEMENT")) {
map(getSource().getField("ID_COMMANDE_ELEMENT"), getDestination().getField("ID_COMMANDE_ELEMENT"));
}
if (getDestination().contains("ID_BON_RECEPTION_ELEMENT")) {
map(getSource().getKey(), getDestination().getField("ID_BON_RECEPTION_ELEMENT"));
}
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/gestcomm/RelanceSheet.java
18,6 → 18,7
import org.openconcerto.erp.generationDoc.AbstractJOOReportsSheet;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
65,6 → 66,12
}
// Infos societe
map.put("SocieteType", rowSoc.getString("TYPE"));
map.put("SocieteTel", rowSoc.getString("NUM_TEL"));
map.put("SocieteFax", rowSoc.getString("NUM_FAX"));
map.put("SocieteRCS", rowSoc.getString("RCS"));
map.put("SocieteSiret", rowSoc.getString("NUM_SIRET"));
map.put("SocieteAPE", rowSoc.getString("NUM_APE"));
map.put("SocieteCapital", GestionDevise.currencyToString(rowSoc.getBigDecimal("CAPITAL")));
map.put("SocieteNom", rowSoc.getString("NOM"));
map.put("SocieteAdresse", rowSocAdresse.getString("RUE"));
map.put("SocieteCodePostal", rowSocAdresse.getString("CODE_POSTAL"));
137,19 → 144,27
 
SQLSelect sel = new SQLSelect();
sel.addSelect(this.rowRelance.getTable().getKey());
sel.addSelect(this.rowRelance.getTable().getField("DATE"));
sel.setWhere(new Where(this.rowRelance.getTable().getField("ID_SAISIE_VENTE_FACTURE"), "=", this.rowRelance.getInt("ID_SAISIE_VENTE_FACTURE")));
sel.addFieldOrder(this.rowRelance.getTable().getField("DATE"));
@SuppressWarnings("unchecked")
List<Map<String, Number>> listResult = Configuration.getInstance().getBase().getDataSource().execute(sel.asString());
List<SQLRow> listResult = SQLRowListRSH.execute(sel);
 
String oldDateRelance = "";
 
if (listResult != null && listResult.size() > 0) {
Map<String, Number> o = listResult.get(0);
Number n = o.get(this.rowRelance.getTable().getKey().getName());
SQLRow rowOldRelance = this.rowRelance.getTable().getRow(n.intValue());
SQLRow rowOldRelance = listResult.get(0);
Date dOldRelance = (Date) rowOldRelance.getObject("DATE");
map.put("DatePremiereRelance", dateFormat2.format(dOldRelance));
 
for (SQLRow rowOldR : listResult) {
oldDateRelance += dateFormat2.format((Date) rowOldR.getObject("DATE")) + ", ";
}
 
} else {
map.put("DatePremiereRelance", "");
}
map.put("DateAncienneRelance", oldDateRelance);
 
return map;
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOXMLElement.java
212,4 → 212,7
return (k == null) ? false : k.equalsIgnoreCase("true");
}
 
public boolean isImage() {
return this.elt.getAttributeValue("type").equalsIgnoreCase("image");
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOgenerationXML.java
20,7 → 20,10
import org.openconcerto.erp.core.finance.accounting.element.ComptePCESQLElement;
import org.openconcerto.erp.core.finance.tax.model.TaxeCache;
import org.openconcerto.erp.preferences.DefaultNXProps;
import org.openconcerto.openoffice.LengthUnit;
import org.openconcerto.openoffice.ODFrame;
import org.openconcerto.openoffice.ODPackage;
import org.openconcerto.openoffice.spreadsheet.BytesProducer.ByteArrayProducer;
import org.openconcerto.openoffice.spreadsheet.MutableCell;
import org.openconcerto.openoffice.spreadsheet.Sheet;
import org.openconcerto.openoffice.spreadsheet.SpreadSheet;
56,6 → 59,7
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
 
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
700,10 → 704,28
value = null;
styleOO = null;
}
int tmpCelluleAffect;
 
int tmpCelluleAffect = fill(test ? "A1" : loc, value, sheet, tableField.isTypeReplace(), null, styleOO, test, tableField.isMultilineAuto(), tableField.isKeepingEmptyLines());
// tmpCelluleAffect = Math.max(tmpCelluleAffect,
// tableField.getLine());
if (tableField.isImage()) {
OOXMLTableImage tableImage = this.rowRefCache.getOOXMLTableImage(tableField, e, rowElt);
tmpCelluleAffect = 1;
try {
if (tableImage.getImgBytes() != null) {
MutableCell cell = sheet.getCellAt(test ? "A1" : loc);
if (!test) {
final ODFrame<SpreadSheet> frame = cell.addFrame(tableImage.getX(), tableImage.getY(), tableImage.getWidth(), tableImage.getHeight(), LengthUnit.MM);
frame.addImage(UUID.randomUUID() + ".png", new ByteArrayProducer(tableImage.getImgBytes(), false));
}
tmpCelluleAffect = tableImage.getRowCount();
}
} catch (Exception e1) {
// TODO popup???
e1.printStackTrace();
}
 
} else {
tmpCelluleAffect = fill(test ? "A1" : loc, value, sheet, tableField.isTypeReplace(), null, styleOO, test, tableField.isMultilineAuto(), tableField.isKeepingEmptyLines());
}
if (tableField.getLine() != 1 && (!tableField.isLineOption() || (value != null && value.toString().trim().length() > 0))) {
if (nbCellule >= tableField.getLine()) {
tmpCelluleAffect = tmpCelluleAffect + nbCellule;
795,11 → 817,27
if (result != null) {
Object o = elt.getAttributeValue("sheet");
int sheet = (o == null) ? 0 : Integer.valueOf(o.toString().trim());
if (OOElt.isImage()) {
OOXMLTableImage tableImage = new OOXMLTableImage(OOElt, elt, row);
try {
if (tableImage.getImgBytes() != null) {
MutableCell cell = spreadSheet.getSheet(sheet).getCellAt(elt.getAttributeValue("location"));
final ODFrame<SpreadSheet> frame = cell.addFrame(tableImage.getX(), tableImage.getY(), tableImage.getWidth(), tableImage.getHeight(), LengthUnit.MM);
frame.addImage(UUID.randomUUID() + ".png", new ByteArrayProducer(tableImage.getImgBytes(), false));
 
}
} catch (Exception e1) {
// TODO popup???
e1.printStackTrace();
}
 
} else {
fill(elt.getAttributeValue("location"), result, spreadSheet.getSheet(sheet), OOElt.isTypeReplace(), OOElt.getReplacePattern(), null, false, OOElt.isMultilineAuto(),
OOElt.isKeepingEmptyLines());
}
}
}
}
 
private static boolean isIncluded(int filterID, String foreignTable, int id, String fieldWhere, SQLRowAccessor rowElt) {
 
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOXMLCache.java
29,6 → 29,7
import org.openconcerto.sql.model.Where;
import org.openconcerto.utils.CompareUtils;
import org.openconcerto.utils.ListMap;
import org.openconcerto.utils.Tuple2;
import org.openconcerto.utils.cc.ITransformer;
 
import java.math.BigDecimal;
39,16 → 40,30
import java.util.List;
import java.util.Map;
 
import org.jdom2.Element;
 
public class OOXMLCache {
 
private ITransformer<List<SQLRowAccessor>, List<SQLRowAccessor>> postProcess = null;
private Map<SQLRowAccessor, Map<SQLTable, List<SQLRowAccessor>>> cacheReferent = new HashMap<SQLRowAccessor, Map<SQLTable, List<SQLRowAccessor>>>();
private Map<String, Map<Integer, SQLRowAccessor>> cacheForeign = new HashMap<String, Map<Integer, SQLRowAccessor>>();
private Map<Tuple2<String, SQLRowAccessor>, OOXMLTableImage> cacheImg = new HashMap<>();
 
public void setPostProcess(ITransformer<List<SQLRowAccessor>, List<SQLRowAccessor>> postProcess) {
this.postProcess = postProcess;
}
 
public OOXMLTableImage getOOXMLTableImage(OOXMLElement x, Element e, SQLRowAccessor r) {
Tuple2<String, SQLRowAccessor> key = Tuple2.create(e.getAttributeValue("fieldPathEDM"), r);
if (this.cacheImg.containsKey(key)) {
return this.cacheImg.get(key);
} else {
OOXMLTableImage img = new OOXMLTableImage(x, e, r);
this.cacheImg.put(key, img);
return img;
}
}
 
protected SQLRowAccessor getForeignRow(SQLRowAccessor row, SQLField field) {
Map<Integer, SQLRowAccessor> c = cacheForeign.get(field.getName());
 
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/SheetUtils.java
154,9 → 154,18
PdfBoxGraphics2DFontTextDrawer fontTextDrawer = new PdfBoxGraphics2DFontTextDrawerDefaultFonts();
final File dir = new File("Fonts");
if (dir.exists()) {
fontTextDrawer.registerFontFromDirectory(dir);
System.out.println("Using fonts dir : " + dir.getAbsolutePath());
for (File f : dir.listFiles()) {
if (f.isFile() && f.getName().toLowerCase().endsWith(".ttf")) {
System.out.println("Registering font : " + f.getAbsolutePath());
fontTextDrawer.registerFont(f);
}
}
 
} else {
System.out.println("No custom fonts dir found : " + dir.getAbsolutePath());
}
 
// Configure the renderer
ODTRenderer renderer = new ODTRenderer(doc);
renderer.setIgnoreMargins(false);
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOXMLTableImage.java
New file
0,0 → 1,193
/*
* 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;
 
import org.openconcerto.erp.core.edm.Attachment;
import org.openconcerto.erp.core.edm.AttachmentUtils;
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.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.utils.FileUtils;
import org.openconcerto.utils.FillMode;
import org.openconcerto.utils.ImageUtils;
import org.openconcerto.utils.StringUtils;
 
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.List;
 
import javax.imageio.ImageIO;
 
import org.jdom2.Element;
 
public class OOXMLTableImage {
 
private float x = 0;
private float y = 0;
private final float width, height;
private int dpi = 300;
 
private final int rowCount;
// #ffffff
private String bgColor = "#ffffff";
 
public final static String EDM_URL = "edm://miniature.png";
// C://Users/Toto.jpg ou edm://miniature.png (prendre nom miniature)
private final String url;
// ID_AFFAIRE.ID_CLIENT
private String fieldPathEDM;
private String edmProvider;
// top,center,bottom
private String vAlign = "center";
// left, center, right
private String hAlign = "center";
 
private OOXMLElement xmlField;
private final SQLRowAccessor row;
 
public OOXMLTableImage(OOXMLElement xmlField, Element e, SQLRowAccessor row) {
this.xmlField = xmlField;
this.row = row;
this.url = e.getAttributeValue("url");
this.fieldPathEDM = e.getAttributeValue("fieldPathEDM");
this.edmProvider = e.getAttributeValue("edmProvider");
this.width = Float.valueOf(e.getAttributeValue("width"));
this.height = Float.valueOf(e.getAttributeValue("height"));
this.rowCount = Integer.valueOf(e.getAttributeValue("rowCount"));
if (e.getAttributeValue("x") != null && !e.getAttributeValue("x").isEmpty()) {
this.x = Integer.valueOf(e.getAttributeValue("x"));
}
if (e.getAttributeValue("y") != null && !e.getAttributeValue("y").isEmpty()) {
this.y = Integer.valueOf(e.getAttributeValue("y"));
}
}
 
private byte[] img = null;
private boolean cachedImg = false;
 
public byte[] getImgBytes() throws IOException {
 
if (this.cachedImg) {
return this.img;
} else {
 
if (this.url.startsWith("edm://")) {
Path p = new Path(this.row.getTable());
final SQLRow r = this.row.asRow();
final SQLRow rowToEdm;
String sourceTableName = r.getTable().getName();
int sourceID = r.getID();
if (this.fieldPathEDM == null || this.fieldPathEDM.isEmpty() || this.fieldPathEDM.equalsIgnoreCase(".")) {
rowToEdm = r;
} else if (this.fieldPathEDM != null && this.fieldPathEDM.equalsIgnoreCase("EDM_PROVIDER")) {
SpreadSheetCellValueProvider provider = SpreadSheetCellValueProviderManager.get(this.edmProvider);
rowToEdm = (SQLRow) provider.getValue(new SpreadSheetCellValueContext(r));
if (rowToEdm == null) {
return null;
} else {
sourceTableName = rowToEdm.getTable().getName();
sourceID = rowToEdm.getID();
}
 
} else {
List<String> fields = StringUtils.fastSplit(this.fieldPathEDM, '.');
if (fields.size() == 1) {
sourceTableName = r.getTable().getForeignTable(fields.get(0)).getName();
sourceID = r.getForeignID(fields.get(0));
} else {
for (String f : fields) {
p = p.add(p.getLast().getField(f));
}
rowToEdm = r.getDistantRow(p);
sourceTableName = rowToEdm.getTable().getName();
sourceID = rowToEdm.getID();
}
}
final SQLTable tableAttachment = this.row.getTable().getTable("ATTACHMENT");
SQLRowValues rowVals = new SQLRowValues(tableAttachment);
rowVals.putNulls(tableAttachment.getFieldsName());
 
SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(rowVals);
Where where = new Where(tableAttachment.getField("SOURCE_TABLE"), "=", sourceTableName);
where = where.and(new Where(tableAttachment.getField("SOURCE_ID"), "=", sourceID));
where = where.and(new Where(tableAttachment.getField("NAME"), "=", this.url.replaceAll("edm://", "")));
final List<SQLRowValues> rAttachments = fetcher.fetch(where);
if (rAttachments.isEmpty()) {
this.cachedImg = true;
return null;
} else {
final SQLRowValues rowValsAttachment = rAttachments.get(0);
final Attachment a = new Attachment(rowValsAttachment);
final AttachmentUtils u = new AttachmentUtils();
final File f = u.getFile(a);
BufferedImage unscaledImage = ImageIO.read(f);
 
// 1 pouce = 25.4 mmm
float scale = this.dpi / 25.4f;
int maxWidth = (int) (this.width * scale);
int maxHeight = (int) (this.height * scale);
final BufferedImage im = ImageUtils.createQualityResizedImage(unscaledImage, maxWidth, maxHeight, false, new FillMode.ZoomOut(Color.WHITE), true);
ByteArrayOutputStream output = new ByteArrayOutputStream();
ImageIO.write(im, "PNG", output);
output.close();
this.img = output.toByteArray();
this.cachedImg = true;
return this.img;
}
 
} else
 
{
this.img = FileUtils.readBytes(new File(this.url));
this.cachedImg = true;
return this.img;
}
}
}
 
public String getBgColor() {
return this.bgColor;
}
 
public int getDpi() {
return this.dpi;
}
 
public float getX() {
return this.x;
}
 
public float getY() {
return this.y;
}
 
public float getWidth() {
return this.width;
}
 
public float getHeight() {
return this.height;
}
 
public int getRowCount() {
return this.rowCount;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOXMLTableField.java
43,6 → 43,9
private int idRef;
private String style = "";
 
 
public OOXMLTableField(Element eltField, SQLRowAccessor row, SQLElement sqlElt, int id, int filterId, SQLRow rowLanguage, int idRef, OOXMLCache cache) {
super(eltField, row, sqlElt, id, rowLanguage, cache);
this.type = eltField.getAttributeValue("type");
247,4 → 250,9
 
return this.style;
}
public boolean isImage() {
return this.type.equalsIgnoreCase("image");
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/FormatedGlobalQtyTotalProvider.java
26,11 → 26,11
 
private final boolean shortName, alwaysShowOnZeroQty, pieceName;
 
private static enum Type {
public static enum Type {
NORMAL, SHIPMENT
}
 
private final Type type;
public final Type type;
 
private FormatedGlobalQtyTotalProvider(Type t, boolean shortName) {
this(t, shortName, false, false);
46,7 → 46,7
public Object getValue(SpreadSheetCellValueContext context) {
final SQLRowAccessor row = context.getRow();
final BigDecimal pv = row.getBigDecimal("PV_HT");
if (!alwaysShowOnZeroQty && pv.compareTo(BigDecimal.ZERO) == 0) {
if (!this.alwaysShowOnZeroQty && pv.compareTo(BigDecimal.ZERO) == 0) {
return null;
}
 
61,10 → 61,8
return String.valueOf(qte);
}
String result = "";
if (qte > 0) {
if (qte > 1) {
if (this.alwaysShowOnZeroQty || qte != 0) {
result += qte + " x ";
}
final BigDecimal qteUV = row.getBigDecimal("QTE_UNITAIRE");
 
result += NumericFormat.getQtyDecimalFormat().format(qteUV);
82,7 → 80,7
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit", new FormatedGlobalQtyTotalProvider(Type.NORMAL, false));
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.deliver.short", new FormatedGlobalQtyTotalProvider(Type.SHIPMENT, true));
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.deliver", new FormatedGlobalQtyTotalProvider(Type.SHIPMENT, false));
 
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.deliver.short.with.quantity", new FormatedGlobalQtyTotalProvider(Type.SHIPMENT, true, true, true));
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.alwaysnamed.short.with.quantity", new FormatedGlobalQtyTotalProvider(Type.NORMAL, true, true, true));
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.alwaysnamed.short", new FormatedGlobalQtyTotalProvider(Type.NORMAL, true, false, true));
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.alwaysnamed", new FormatedGlobalQtyTotalProvider(Type.NORMAL, false, false, true));
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/ConditionsReglementDetailsProvider.java
44,15 → 44,15
 
if (ajours == 0 && njour == 0) {
if (foreignRow.getBoolean("COMPTANT") != null && !foreignRow.getBoolean("COMPTANT")) {
r = "Date de facture";
r += " Date de facture";
} else {
r = "Comptant";
r += " Comptant";
}
} else {
 
if (ajours != 0) {
 
r = "à" + ajours + ((ajours > 1) ? " jours" : " jour");
r += " à " + ajours + ((ajours > 1) ? " jours" : " jour");
}
if (njour > 0 && njour < 31) {
r += " le " + njour;
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/TotalCommandeClientProvider.java
24,7 → 24,7
public class TotalCommandeClientProvider implements SpreadSheetCellValueProvider {
 
public enum TypeTotalCommandeClientProvider {
HT, TTC;
HT, TTC, TVA;
};
 
private final TypeTotalCommandeClientProvider type;
40,9 → 40,16
for (SQLRowAccessor sqlRowAccessor : rows) {
if (!sqlRowAccessor.isForeignEmpty("ID_COMMANDE_CLIENT")) {
SQLRowAccessor rowCmd = sqlRowAccessor.getForeign("ID_COMMANDE_CLIENT");
total += (this.type == TypeTotalCommandeClientProvider.HT ? rowCmd.getLong("T_HT") : rowCmd.getLong("T_TTC"));
if (this.type == TypeTotalCommandeClientProvider.HT) {
total += rowCmd.getLong("T_HT");
} else if (this.type == TypeTotalCommandeClientProvider.TVA) {
total += rowCmd.getLong("T_TVA");
} else if (this.type == TypeTotalCommandeClientProvider.TTC) {
total += rowCmd.getLong("T_TTC");
}
 
}
}
return new BigDecimal(total).movePointLeft(2);
}
 
49,6 → 56,7
public static void register() {
SpreadSheetCellValueProviderManager.put("sales.account.command.total", new TotalCommandeClientProvider(TypeTotalCommandeClientProvider.HT));
SpreadSheetCellValueProviderManager.put("sales.account.command.total.ttc", new TotalCommandeClientProvider(TypeTotalCommandeClientProvider.TTC));
SpreadSheetCellValueProviderManager.put("sales.account.command.total.tva", new TotalCommandeClientProvider(TypeTotalCommandeClientProvider.TVA));
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/AbstractJOOReportsSheet.java
312,6 → 312,25
return new File(outputPDFDirectory, getFileName() + ".pdf");
}
 
public void printDocument(PrinterJob job) {
 
try {
final File f = getDocumentFile();
 
if (!f.exists()) {
generate(false, false, "");
}
 
final Component doc = ComptaPropsConfiguration.getOOConnexion().loadDocument(f, true);
doc.printDocument(job);
doc.close();
 
} catch (Exception e) {
ExceptionHandler.handle("Impossible d'imprimer le document OpenOffice", e);
e.printStackTrace();
}
}
 
public void exportToPdf() {
// Export vers PDF
final File fileOutOO = getDocumentFile();
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtFactureFournisseur.java
16,6 → 16,8
import org.openconcerto.erp.core.common.ui.TotalCalculator;
import org.openconcerto.erp.core.finance.accounting.element.ComptePCESQLElement;
import org.openconcerto.erp.core.finance.accounting.element.JournalSQLElement;
import org.openconcerto.erp.generationEcritures.provider.AccountingRecordsProvider;
import org.openconcerto.erp.generationEcritures.provider.AccountingRecordsProviderManager;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
29,7 → 31,7
 
public class GenerationMvtFactureFournisseur extends GenerationEcritures implements Runnable {
 
public static final String ID = "accounting.records.supply.order";
public static final String ID = "accounting.records.supplychain.order";
 
private int idFacture;
private static final String source = "FACTURE_FOURNISSEUR";
65,6 → 67,11
// AccountingRecordsProvider provider = AccountingRecordsProviderManager.get(ID);
// provider.putLabel(saisieRow, this.mEcritures);
this.putValue("NOM", nom);
AccountingRecordsProvider provider = AccountingRecordsProviderManager.get(ID);
if (provider != null) {
provider.putLabel(saisieRow, this.mEcritures);
}
 
this.putValue("ID_JOURNAL", GenerationMvtFactureFournisseur.journal);
this.putValue("ID_MOUVEMENT", new Integer(1));
 
71,13 → 78,17
// on calcule le nouveau numero de mouvement
if (this.idMvt == 1) {
SQLRowValues rowValsPiece = new SQLRowValues(pieceTable);
// provider.putPieceLabel(saisieRow, rowValsPiece);
rowValsPiece.put("NOM", saisieRow.getObject("NUMERO").toString());
if (provider != null) {
provider.putPieceLabel(saisieRow, rowValsPiece);
}
getNewMouvement(GenerationMvtFactureFournisseur.source, this.idFacture, 1, rowValsPiece);
} else {
SQLRowValues rowValsPiece = pieceTable.getTable("MOUVEMENT").getRow(idMvt).getForeign("ID_PIECE").asRowValues();
// provider.putPieceLabel(saisieRow, rowValsPiece);
rowValsPiece.put("NOM", saisieRow.getObject("NUMERO").toString());
if (provider != null) {
provider.putPieceLabel(saisieRow, rowValsPiece);
}
rowValsPiece.update();
 
this.putValue("ID_MOUVEMENT", new Integer(this.idMvt));
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtReglementChequeClient.java
13,9 → 13,10
package org.openconcerto.erp.generationEcritures;
 
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.core.finance.accounting.element.MouvementSQLElement;
import org.openconcerto.erp.core.finance.tax.model.TaxeCache;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
110,6 → 111,31
this.putValue("CREDIT", new Long(0));
ajoutEcriture();
 
// FIXME remove getConf
SQLRow rowSoc = ComptaPropsConfiguration.getInstanceCompta().getRowSociete();
if (rowSoc.getTable().contains("TVA_ENCAISSEMENT") && rowSoc.getBoolean("TVA_ENCAISSEMENT")) {
SQLRow rowTaxe = TaxeCache.getCache().getFirstTaxe();
if (rowTaxe.contains("ID_COMPTE_PCE_COLLECTE_ENCAISSEMENT")) {
SQLRowAccessor rowCompteTvaEnc = rowTaxe.getNonEmptyForeign("ID_COMPTE_PCE_COLLECTE_ENCAISSEMENT");
SQLRowAccessor rowCompteTvaCol = rowTaxe.getNonEmptyForeign("ID_COMPTE_PCE_COLLECTE");
if (rowCompteTvaCol != null && rowCompteTvaEnc != null) {
Float taux = rowTaxe.getFloat("TAUX");
long ht = Math.round(montant / (1.0 + (taux / 100.0)));
long tva = montant - ht;
this.putValue("ID_COMPTE_PCE", rowCompteTvaCol.getID());
this.putValue("DEBIT", Long.valueOf(tva));
this.putValue("CREDIT", Long.valueOf(0));
ajoutEcriture();
 
this.putValue("ID_COMPTE_PCE", rowCompteTvaEnc.getID());
this.putValue("DEBIT", Long.valueOf(0));
this.putValue("CREDIT", Long.valueOf(tva));
ajoutEcriture();
 
}
}
}
 
List<Integer> pieceIDs = new ArrayList<Integer>();
pieceIDs.add(mouvementTable.getRow(idMvt).getForeignID("ID_PIECE"));
lettrageAuto(pieceIDs, this.date);
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationReglementAchat.java
17,6 → 17,8
import org.openconcerto.erp.core.finance.accounting.element.ComptePCESQLElement;
import org.openconcerto.erp.core.finance.accounting.element.JournalSQLElement;
import org.openconcerto.erp.core.finance.payment.element.ModeDeReglementSQLElement;
import org.openconcerto.erp.generationEcritures.provider.AccountingRecordsProvider;
import org.openconcerto.erp.generationEcritures.provider.AccountingRecordsProviderManager;
import org.openconcerto.erp.model.PrixTTC;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowValues;
35,6 → 37,10
 
public class GenerationReglementAchat extends GenerationEcritures {
 
public static final String ID = "accounting.records.order.supplychain.payment";
// Journal Caisse
private static final Integer journalCaisse = new Integer(JournalSQLElement.CAISSES);
private static final SQLTable tablePrefCompte = base.getTable("PREFS_COMPTE");
61,6 → 67,10
 
// "Règlement achat" + SOURCE.getNom() ??
this.nom = "Règlement achat " + rowFournisseur.getString("NOM") + " (" + typeRegRow.getString("NOM") + ")";
AccountingRecordsProvider provider = AccountingRecordsProviderManager.get(ID);
if (provider != null) {
provider.putLabel(regMontantRow, this.mEcritures);
}
 
List<SQLRow> l = regMontantRow.getReferentRows(regMontantRow.getTable().getTable("REGLER_MONTANT_ELEMENT"));
int mvtSource = -1;
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtSaisieKm.java
14,6 → 14,8
package org.openconcerto.erp.generationEcritures;
 
import org.openconcerto.erp.core.finance.accounting.element.ComptePCESQLElement;
import org.openconcerto.erp.generationEcritures.provider.AccountingRecordsProvider;
import org.openconcerto.erp.generationEcritures.provider.AccountingRecordsProviderManager;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowValues;
28,6 → 30,8
private int idSaisieKm;
private static final String source = "SAISIE_KM";
 
public static final String ID = "accounting.records.km";
 
public GenerationMvtSaisieKm(int idSaisieKm) {
this.idSaisieKm = idSaisieKm;
}
47,8 → 51,15
this.putValue("ID_MOUVEMENT", new Integer(1));
 
// on calcule le nouveau numero de mouvement
getNewMouvement(GenerationMvtSaisieKm.source, this.idSaisieKm, 1, (labelSaisie.length() == 0 ? "Saisie au km " : labelSaisie));
AccountingRecordsProvider provider = AccountingRecordsProviderManager.get(ID);
SQLRowValues rowValsPiece = new SQLRowValues(pieceTable);
rowValsPiece.put("NOM", (labelSaisie.length() == 0 ? "Saisie au km " : labelSaisie));
if (provider != null) {
provider.putPieceLabel(saisieRow, rowValsPiece);
}
 
getNewMouvement(GenerationMvtSaisieKm.source, this.idSaisieKm, 1, rowValsPiece);
 
// gnération des ecritures
SQLTable tableElt = Configuration.getInstance().getRoot().findTable("SAISIE_KM_ELEMENT");
List<SQLRow> set = saisieRow.getReferentRows(tableElt);
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationReglementVenteNG.java
22,6 → 22,9
import org.openconcerto.erp.core.finance.payment.element.ModeDeReglementSQLElement;
import org.openconcerto.erp.core.finance.payment.element.SEPAMandateSQLElement;
import org.openconcerto.erp.core.finance.payment.element.TypeReglementSQLElement;
import org.openconcerto.erp.core.finance.tax.model.TaxeCache;
import org.openconcerto.erp.generationEcritures.provider.AccountingRecordsProvider;
import org.openconcerto.erp.generationEcritures.provider.AccountingRecordsProviderManager;
import org.openconcerto.erp.model.PrixTTC;
import org.openconcerto.erp.preferences.GestionCommercialeGlobalPreferencePanel;
import org.openconcerto.sql.Configuration;
52,6 → 55,8
private static final SQLTable tablePrefCompte = base.getTable("PREFS_COMPTE");
private static final SQLRow rowPrefsCompte = tablePrefCompte.getRow(2);
 
public static final String ID = "accounting.records.invoice.sales.payment";
 
public SQLRow ecrClient = null;
 
public GenerationReglementVenteNG(String label, SQLRow rowClient, PrixTTC ttc, Date d, SQLRow modeReglement, SQLRow source, SQLRow mvtSource) throws SQLException {
81,6 → 86,10
// TODO Nommage des ecritures
 
this.nom = label;
AccountingRecordsProvider provider = AccountingRecordsProviderManager.get(ID);
if (provider != null) {
provider.putLabel(source, this.mEcritures);
}
 
this.putValue("DATE", this.date);
this.putValue("NOM", this.nom);
236,6 → 245,31
this.putValue("CREDIT", Long.valueOf(0));
ajoutEcriture();
 
// FIXME remove getConf
SQLRow rowSoc = ComptaPropsConfiguration.getInstanceCompta().getRowSociete();
if (rowSoc.getTable().contains("TVA_ENCAISSEMENT") && rowSoc.getBoolean("TVA_ENCAISSEMENT")) {
SQLRow rowTaxe = TaxeCache.getCache().getFirstTaxe();
if (rowTaxe.contains("ID_COMPTE_PCE_COLLECTE_ENCAISSEMENT")) {
SQLRowAccessor rowCompteTvaEnc = rowTaxe.getNonEmptyForeign("ID_COMPTE_PCE_COLLECTE_ENCAISSEMENT");
SQLRowAccessor rowCompteTvaCol = rowTaxe.getNonEmptyForeign("ID_COMPTE_PCE_COLLECTE");
if (rowCompteTvaCol != null && rowCompteTvaEnc != null) {
Float taux = rowTaxe.getFloat("TAUX");
 
long tva = ttc.calculLongTVA(taux / 100.0);
this.putValue("ID_COMPTE_PCE", rowCompteTvaCol.getID());
this.putValue("DEBIT", Long.valueOf(tva));
this.putValue("CREDIT", Long.valueOf(0));
ajoutEcriture();
 
this.putValue("ID_COMPTE_PCE", rowCompteTvaEnc.getID());
this.putValue("DEBIT", Long.valueOf(0));
this.putValue("CREDIT", Long.valueOf(tva));
ajoutEcriture();
 
}
}
}
 
List<Integer> pieceIDs = new ArrayList<Integer>();
if (source.getTable().getName().equals("ENCAISSER_MONTANT")) {
List<SQLRow> l = source.getReferentRows(base.getTable("ENCAISSER_MONTANT_ELEMENT"));
299,9 → 333,13
SQLRowValues rowVals = new SQLRowValues(tableMouvement);
rowVals.put("IDSOURCE", row.getID());
rowVals.update(this.idMvt);
if (source.getTable().getName().equalsIgnoreCase("ENCAISSER_MONTANT")) {
 
source.createEmptyUpdateRow().put("ID_MOUVEMENT", this.idMvt).commit();
}
 
}
}
 
private void setDateReglement(SQLRow source, Date d) throws SQLException {
List<SQLRow> sources = new ArrayList<SQLRow>();
460,4 → 498,5
}
 
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtAvoirFournisseur.java
109,12 → 109,14
if (rowFourn.getBoolean("UE")) {
idCompteTVA = taxe.getForeignID("ID_COMPTE_PCE_DED_INTRA");
if (idCompteTVA <= 1) {
idCompteTVA = rowPrefsCompte.getInt("ID_COMPTE_PCE_TVA_INTRA");
idCompteTVA = rowPrefsCompte.getInt("ID_COMPTE_PCE_TVA_ACHAT");
if (idCompteTVA <= 1) {
idCompteTVA = ComptePCESQLElement.getIdComptePceDefault("TVAIntraComm");
idCompteTVA = ComptePCESQLElement.getIdComptePceDefault("TVADeductible");
}
}
} else {
idCompteTVA = taxe.getForeignID("ID_COMPTE_PCE_DED");
if (idCompteTVA <= 1) {
idCompteTVA = rowPrefsCompte.getInt("ID_COMPTE_PCE_TVA_ACHAT");
if (idCompteTVA <= 1) {
idCompteTVA = ComptePCESQLElement.getIdComptePceDefault("TVADeductible");
121,6 → 123,7
}
}
}
}
 
this.putValue("ID_COMPTE_PCE", Integer.valueOf(idCompteTVA));
this.putValue("DEBIT", Long.valueOf(0));
/trunk/OpenConcerto/src/org/openconcerto/erp/core/edm/Attachment.java
29,7 → 29,7
private String sourceTable;
private int sourceId;
private int parentId;
 
private boolean encrypted;
public static final String MIMETYPE_FOLDER = "inode/directory";
 
public Attachment(SQLRowValues rowAttachment) {
43,14 → 43,15
this.sourceTable = rowAttachment.getString("SOURCE_TABLE");
this.sourceId = rowAttachment.getInt("SOURCE_ID");
this.parentId = rowAttachment.getInt("ID_PARENT");
this.encrypted = rowAttachment.getBoolean("ENCRYPTED");
}
 
public int getId() {
return id;
return this.id;
}
 
public String getName() {
return name;
return this.name;
}
 
public void setName(String newName) {
58,35 → 59,35
}
 
public String getMimeType() {
return mimeType;
return this.mimeType;
}
 
public String getFileName() {
return fileName;
return this.fileName;
}
 
public int getFileSize() {
return fileSize;
return this.fileSize;
}
 
public String getStorageFileName() {
return storageFileName;
return this.storageFileName;
}
 
public String getStoragePath() {
return storagePath;
return this.storagePath;
}
 
public String getSourceTable() {
return sourceTable;
return this.sourceTable;
}
 
public int getSourceId() {
return sourceId;
return this.sourceId;
}
 
public int getParentId() {
return parentId;
return this.parentId;
}
 
public boolean isFolder() {
93,6 → 94,10
return this.mimeType.equals(MIMETYPE_FOLDER);
}
 
public boolean isEncrypted() {
return this.encrypted;
}
 
@Override
public String toString() {
return super.toString() + " attachment id:" + this.getId() + " name:" + this.getName();
/trunk/OpenConcerto/src/org/openconcerto/erp/core/edm/AttachmentPanel.java
45,6 → 45,7
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
65,6 → 66,7
public class AttachmentPanel extends JPanel {
 
private final SQLRowAccessor rowSource;
private final Collection<SQLRowAccessor> rowSecondaires;
private List<ListDataListener> listeners = new ArrayList<>();
 
private int idParent = 1;
74,8 → 76,14
private List<FilePanel> filePanels = new ArrayList<>();
 
public AttachmentPanel(SQLRowAccessor rowSource) {
this(rowSource, Collections.emptyList());
}
 
public AttachmentPanel(SQLRowAccessor rowSource, Collection<SQLRowAccessor> rowSecondaires) {
super();
this.rowSource = rowSource;
this.rowSecondaires = rowSecondaires;
 
this.setLayout(new GridBagLayout());
this.parents.add(1);
this.parentsNames.add("Racine");
92,13 → 100,17
}
 
public void fireDataChanged() {
for (ListDataListener listDataListener : listeners) {
for (ListDataListener listDataListener : this.listeners) {
listDataListener.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, 0));
}
}
 
public int getAttachementsSize() {
return this.filePanels.size();
}
 
public void initUI() {
filePanels.clear();
this.filePanels.clear();
this.invalidate();
this.removeAll();
GridBagConstraints c = new DefaultGridBagConstraints();
106,7 → 118,7
// Recupération de la liste des fichiers
 
// TODO requete dans un SwingWorker
final SQLTable tableAttachment = rowSource.getTable().getTable("ATTACHMENT");
final SQLTable tableAttachment = this.rowSource.getTable().getTable("ATTACHMENT");
SQLRowValues rowVals = new SQLRowValues(tableAttachment);
rowVals.putNulls(tableAttachment.getFieldsName());
 
115,7 → 127,13
where = where.and(new Where(tableAttachment.getField("SOURCE_ID"), "=", this.rowSource.getID()));
 
where = where.and(new Where(tableAttachment.getField("ID_PARENT"), "=", this.idParent));
for (SQLRowAccessor rowSecondaire : this.rowSecondaires) {
 
Where whereSec = new Where(tableAttachment.getField("SOURCE_TABLE"), "=", rowSecondaire.getTable().getName());
whereSec = whereSec.and(new Where(tableAttachment.getField("SOURCE_ID"), "=", rowSecondaire.getID()));
 
where = where.or(whereSec);
}
final List<SQLRowValues> rAttachments = fetcher.fetch(where);
c.fill = GridBagConstraints.BOTH;
c.anchor = GridBagConstraints.WEST;
211,7 → 229,7
public void actionPerformed(ActionEvent e) {
AttachmentUtils utils = new AttachmentUtils();
try {
utils.createFolder("Nouveau dossier", rowSource, idParent);
utils.createFolder("Nouveau dossier", AttachmentPanel.this.rowSource, AttachmentPanel.this.idParent);
} catch (SQLException e1) {
JOptionPane.showMessageDialog(null, "Impossible de créer le dossier.", "Erreur", JOptionPane.ERROR_MESSAGE);
}
229,12 → 247,17
fd.setVisible(true);
final String fileName = fd.getFile();
if (fileName != null) {
try {
File inFile = new File(fd.getDirectory(), fileName);
AttachmentUtils utils = new AttachmentUtils();
utils.uploadFile(inFile, rowSource, idParent);
utils.uploadFile(inFile, AttachmentPanel.this.rowSource, AttachmentPanel.this.idParent);
initUI();
} catch (Exception ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(AttachmentPanel.this, "Erreur lors de l'ajout du fichier " + fileName + "(" + ex.getMessage() + ")");
}
}
}
});
 
ScrollablePanel files = new ScrollablePanel() {
350,7 → 373,6
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
Transferable t = dtde.getTransferable();
try {
 
if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
@SuppressWarnings("unchecked")
List<File> fileList = (List<File>) t.getTransferData(DataFlavor.javaFileListFlavor);
362,10 → 384,15
if (cancelledByUser) {
break;
}
try {
if (!f.isDirectory()) {
utils.uploadFile(f, rowSource, idParent);
utils.uploadFile(f, AttachmentPanel.this.rowSource, AttachmentPanel.this.idParent);
}
} catch (Exception ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(AttachmentPanel.this, "Erreur lors de l'ajout du fichier " + f.getAbsolutePath() + "(" + ex.getMessage() + ")");
}
}
initUI();
}
} catch (Exception e) {
379,7 → 406,7
}
 
public Set<Attachment> getSelectedAttachments() {
return selectedAttachments;
return this.selectedAttachments;
}
 
public void select(Attachment a) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/edm/AttachmentUtils.java
17,10 → 17,14
import org.openconcerto.erp.generationDoc.DocumentLocalStorageManager;
import org.openconcerto.erp.storage.StorageEngine;
import org.openconcerto.erp.storage.StorageEngines;
import org.openconcerto.sql.model.SQLInsert;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.utils.Base64;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.FileUtils;
import org.openconcerto.utils.sync.SyncClient;
29,22 → 33,80
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.sql.SQLException;
import java.util.List;
 
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.swing.JOptionPane;
 
public class AttachmentUtils {
 
public void uploadFile(File inFile, SQLRowAccessor rowSource, int idParent) {
try {
String generateBase64Key() throws NoSuchAlgorithmException {
final KeyGenerator generator = KeyGenerator.getInstance("AES");
generator.init(16 * 8);
final SecretKey k = generator.generateKey();
return Base64.encodeBytes(k.getEncoded(), Base64.DONT_BREAK_LINES);
}
 
SecretKey getSecretKey(String base64key) {
byte[] b = Base64.decode(base64key.getBytes(StandardCharsets.UTF_8));
if (b.length != 16) {
throw new IllegalStateException("key length must be 16 bytes for AES");
}
return new SecretKeySpec(b, "AES");
}
 
public byte[] encrypt(SecretKey secretKey, byte[] in)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException {
return process(secretKey, in, Cipher.ENCRYPT_MODE);
}
 
public byte[] decrypt(SecretKey secretKey, byte[] in)
throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException {
return process(secretKey, in, Cipher.DECRYPT_MODE);
}
 
public byte[] process(SecretKey secretKey, byte[] in, int mode)
throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException {
final Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
final byte[] nonce = new byte[12];
final byte[] e = secretKey.getEncoded();
for (int i = 0; i < nonce.length; i++) {
nonce[i] = (byte) (e[i] * e[i + 1] + e[i + 2]);
}
GCMParameterSpec spec = new GCMParameterSpec(16 * 8, nonce);
cipher.init(mode, secretKey, spec);
return cipher.doFinal(in);
}
 
public void uploadFile(File inFile, SQLRowAccessor rowSource, int idParent) throws SQLException {
uploadFile(inFile, rowSource, idParent, null);
}
 
public void uploadFile(File inFile, SQLRowAccessor rowSource, int idParent, String nameInGed) throws SQLException {
 
String encodeKey = fetchEncodedKey(rowSource.getTable().getTable("FWK_SCHEMA_METADATA"));
// Création de la row attachment
SQLRowValues rowValsAttachment = new SQLRowValues(rowSource.getTable().getTable("ATTACHMENT"));
rowValsAttachment.put("SOURCE_TABLE", rowSource.getTable().getName());
rowValsAttachment.put("SOURCE_ID", rowSource.getID());
rowValsAttachment.put("ID_PARENT", idParent);
if (encodeKey != null) {
rowValsAttachment.put("ENCRYPTED", true);
}
 
SQLRow rowAttachment = rowValsAttachment.insert();
int id = rowAttachment.getID();
 
63,39 → 125,36
final ComptaPropsConfiguration config = ComptaPropsConfiguration.getInstanceCompta();
boolean isOnCloud = config.isOnCloud();
 
try {
if (isOnCloud) {
 
String remotePath = subDir;
List<StorageEngine> engines = StorageEngines.getInstance().getActiveEngines();
final List<StorageEngine> engines = StorageEngines.getInstance().getActiveEngines();
File encodedFile = inFile;
if (encodeKey != null) {
encodedFile = File.createTempFile("encrypted", inFile.getName());
final byte[] enc = encrypt(getSecretKey(encodeKey), FileUtils.readBytes(inFile));
Files.write(encodedFile.toPath(), enc);
}
 
for (StorageEngine storageEngine : engines) {
if (storageEngine.isConfigured() && storageEngine.allowAutoStorage()) {
final String path = remotePath;
 
try (FileInputStream in = new FileInputStream(inFile)) {
try (FileInputStream in = new FileInputStream(encodedFile)) {
storageEngine.connect();
final BufferedInputStream inStream = new BufferedInputStream(in);
storageEngine.store(inStream, path, fileWithIDNAme, true);
inStream.close();
storageEngine.disconnect();
} catch (IOException e) {
ExceptionHandler.handle("Impossible de sauvegarder le fichier " + inFile.getAbsolutePath() + " vers " + path + "(" + storageEngine + ")", e);
}
// if (storageEngine instanceof CloudStorageEngine) {
// try {
// storageEngine.connect();
// final BufferedInputStream inStream = new BufferedInputStream(new
// FileInputStream(generatedFile));
// storageEngine.store(inStream, path, generatedFile.getName(), true);
// inStream.close();
// storageEngine.disconnect();
// } catch (IOException e) {
// ExceptionHandler.handle("Impossible de sauvegarder le fichier généré " +
// generatedFile.getAbsolutePath() + " vers " + path + "(" + storageEngine +
// ")", e);
// }
// }
 
}
}
if (encodeKey != null) {
encodedFile.delete();
}
 
} else {
// Upload File
 
104,9 → 163,14
File storagePathFile = new File(dirRoot, subDir);
storagePathFile.mkdirs();
// TODO CHECK IF FILE EXISTS
if (encodeKey == null) {
FileUtils.copyFile(inFile, new File(storagePathFile, fileWithIDNAme));
 
} else {
final File encodedFile = new File(storagePathFile, fileWithIDNAme);
final byte[] enc = encrypt(getSecretKey(encodeKey), FileUtils.readBytes(inFile));
Files.write(encodedFile.toPath(), enc);
}
}
 
// Update rowAttachment
rowValsAttachment = rowAttachment.createEmptyUpdateRow();
113,6 → 177,9
 
// Default is without extension
String fileName = inFile.getName();
if (nameInGed != null) {
rowValsAttachment.put("NAME", nameInGed);
} else {
String name = fileName;
int index = name.lastIndexOf('.');
if (index > 0) {
119,8 → 186,11
name = name.substring(0, index);
}
rowValsAttachment.put("NAME", name);
}
 
rowValsAttachment.put("SOURCE_TABLE", rowSource.getTable().getName());
rowValsAttachment.put("SOURCE_ID", rowSource.getID());
rowValsAttachment.put("ID_PARENT", idParent);
final String mimeType = Files.probeContentType(inFile.toPath());
rowValsAttachment.put("MIMETYPE", mimeType != null ? mimeType : "application/octet-stream");
rowValsAttachment.put("FILENAME", fileName);
127,6 → 197,7
rowValsAttachment.put("FILESIZE", inFile.length());
rowValsAttachment.put("STORAGE_PATH", subDir);
rowValsAttachment.put("STORAGE_FILENAME", fileWithIDNAme);
rowValsAttachment.put("ENCRYPTED", (encodeKey != null));
// TODO THUMBNAIL
// rowVals.put("THUMBNAIL", );
// rowVals.put("THUMBNAIL_WIDTH", );
137,11 → 208,39
rowValsAttachment.commit();
final Attachment a = new Attachment(rowValsAttachment);
updateAttachmentsCountFromAttachment(a);
 
} catch (Exception e) {
e.printStackTrace();
if (rowAttachment != null) {
config.getDirectory().getElement(AttachmentSQLElement.class).archive(rowAttachment.getID());
}
ExceptionHandler.handle("Impossible de sauvegarder le fichier " + inFile.getAbsolutePath(), e);
}
 
}
 
public String fetchEncodedKey(SQLTable table) {
final SQLSelect select = new SQLSelect();
select.addSelect(table.getField("VALUE"));
select.setWhere(new Where(table.getField("NAME"), "=", AttachmentSQLElement.EDM_KEY_METADATA));
final List<?> rows = table.getDBSystemRoot().getDataSource().executeCol(select.asString());
if (rows.size() == 1) {
return rows.get(0).toString();
}
return null;
}
 
public void createKeyOnDatabase(SQLTable table) throws NoSuchAlgorithmException {
final String s = fetchEncodedKey(table);
if (s != null) {
throw new IllegalStateException("key alread exists");
}
 
final SQLInsert insert = new SQLInsert();
insert.add(table.getField("NAME"), AttachmentSQLElement.EDM_KEY_METADATA);
insert.add(table.getField("VALUE"), generateBase64Key());
table.getDBSystemRoot().getDataSource().execute(insert.asString());
}
 
public File getFile(Attachment attachment) {
 
final ComptaPropsConfiguration config = ComptaPropsConfiguration.getInstanceCompta();
202,6 → 301,21
}
}
final File outFile = new File(f, fileName);
if (attachment.isEncrypted() && outFile.length() > 0) {
try {
final byte[] bytes = FileUtils.readBytes(outFile);
final String encodeKey = fetchEncodedKey(config.getRootSociete().getTable("FWK_SCHEMA_METADATA"));
if (encodeKey == null) {
throw new IllegalStateException("missing key");
}
final byte[] decrypted = decrypt(getSecretKey(encodeKey), bytes);
Files.write(outFile.toPath(), decrypted);
} catch (Exception e) {
ExceptionHandler.handle("Impossible de decrypter le fichier\n" + outFile.getAbsolutePath(), e);
return null;
}
 
}
outFile.setReadOnly();
return outFile;
 
208,8 → 322,12
}
 
public void deleteFile(Attachment rowAttachment) throws SQLException, IllegalStateException {
// Delete Row
// Remove from DB first
final ComptaPropsConfiguration config = ComptaPropsConfiguration.getInstanceCompta();
config.getDirectory().getElement(AttachmentSQLElement.class).archive(rowAttachment.getId());
updateAttachmentsCountFromAttachment(rowAttachment);
 
final ComptaPropsConfiguration config = ComptaPropsConfiguration.getInstanceCompta();
if (!rowAttachment.isFolder()) {
boolean isOnCloud = config.isOnCloud();
// Delete File
237,9 → 355,7
}
}
}
// Delete Row
config.getDirectory().getElement(AttachmentSQLElement.class).archive(rowAttachment.getId());
updateAttachmentsCountFromAttachment(rowAttachment);
 
}
 
private void updateAttachmentsCountFromAttachment(Attachment rowAttachment) {
299,6 → 415,10
final String req = "UPDATE " + attachmentTable.getSQLName().quote() + " SET " + attachmentTable.getField("ID_PARENT").getQuotedName() + "=" + folderId + " WHERE "
+ attachmentTable.getKey().getQuotedName() + "=" + a.getId();
attachmentTable.getDBSystemRoot().getDataSource().execute(req);
 
}
 
public static void main(String[] args) throws NoSuchAlgorithmException {
System.err.println("AttachmentUtils.main() key : " + new AttachmentUtils().generateBase64Key());
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/edm/AttachmentSQLElement.java
22,8 → 22,22
 
public class AttachmentSQLElement extends ComptaSQLConfElement {
 
public static final String EDM_KEY_METADATA = "EDM_KEY";
 
public static final String DIRECTORY_PREFS = "EDMdirectory";
 
public static final String ITEM_SOURCE_TABLE = "source.table";
public static final String ITEM_SOURCE_ID = "source.id";
public static final String ITEM_NAME = "name";
public static final String ITEM_MIMETYPE = "mimetype";
public static final String ITEM_FILENAME = "filename";
public static final String ITEM_STORAGE_PATH = "storage.path";
public static final String ITEM_THUMBNAIL = "thumbnail";
public static final String ITEM_THUMBNAIL_WIDTH = "thumbnail.width";
public static final String ITEM_THUMBNAIL_HEIGHT = "thumbnail.height";
public static final String ITEM_TAG = "tag";
public static final String ITEM_PARENT = "parent.id";
 
public AttachmentSQLElement() {
super("ATTACHMENT", "un attachement", "attachements");
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/pos/io/BarcodeReader.java
16,6 → 16,7
import org.openconcerto.erp.core.sales.pos.ui.BarcodeListener;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.component.ITextArea;
import org.openconcerto.utils.StringUtils;
 
import java.awt.Dimension;
import java.awt.GridBagConstraints;
61,16 → 62,16
this.timer = null;
this.task = null;
this.maxInterKeyDelay = maxInterKeyDelay;
mapCharacterFR.put((int) '&', "1");
mapCharacterFR.put((int) 'é', "2");
mapCharacterFR.put((int) '"', "3");
mapCharacterFR.put((int) '\'', "4");
mapCharacterFR.put((int) '(', "5");
mapCharacterFR.put((int) '-', "6");
mapCharacterFR.put((int) 'è', "7");
mapCharacterFR.put((int) '_', "8");
mapCharacterFR.put((int) 'ç', "9");
mapCharacterFR.put((int) 'à', "0");
this.mapCharacterFR.put((int) '&', "1");
this.mapCharacterFR.put((int) 'é', "2");
this.mapCharacterFR.put((int) '"', "3");
this.mapCharacterFR.put((int) '\'', "4");
this.mapCharacterFR.put((int) '(', "5");
this.mapCharacterFR.put((int) '-', "6");
this.mapCharacterFR.put((int) 'è', "7");
this.mapCharacterFR.put((int) '_', "8");
this.mapCharacterFR.put((int) 'ç', "9");
this.mapCharacterFR.put((int) 'à', "0");
}
 
public synchronized void removeBarcodeListener(BarcodeListener l) {
102,7 → 103,7
// init avant que les listeners s'en servent
this.timer = new Timer(getClass().getName(), true);
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this);
System.err.println("BarcodeReader start : scan delay " + maxInterKeyDelay + " ms");
System.err.println("BarcodeReader start : scan delay " + this.maxInterKeyDelay + " ms");
}
}
 
120,9 → 121,9
 
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (!enable)
if (!this.enable) {
return false;
 
}
if (this.task != null)
this.task.cancel();
 
133,10 → 134,10
int keyCode = e.getKeyCode();
 
final long delay = t - this.firstTime;
if (keyCode == KeyEvent.VK_BACK_SPACE || keyCode == KeyEvent.VK_DELETE || (delay > maxInterKeyDelay && keyCode != KeyEvent.VK_SHIFT)) {
if (keyCode == KeyEvent.VK_BACK_SPACE || keyCode == KeyEvent.VK_DELETE || (delay > this.maxInterKeyDelay && keyCode != KeyEvent.VK_SHIFT)) {
// touche normale
if (this.debug) {
System.err.println("TOuche normale " + keyCode);
System.err.println("Touche normale " + keyCode);
}
this.eve.add(e);
redispatch();
151,6 → 152,11
if (this.debug) {
System.err.println("SHIFT " + keyCode);
}
} else if (keyChar == ']') {
this.value += keyChar;
if (this.debug) {
System.err.println("]");
}
} else if (keyChar == '*' || keyChar == '$' || keyChar == '+' || keyChar == '/' || keyChar == '%' || keyChar == ' ') {
this.value += keyChar;
if (this.debug) {
159,7 → 165,7
} else if (keyCode >= KeyEvent.VK_0 && keyCode <= KeyEvent.VK_9 || keyCode >= KeyEvent.VK_A && keyCode <= KeyEvent.VK_Z) {
// from KeyEvent : same as ASCII
if (this.debug) {
System.err.println("[0-9] [A-Z] " + keyCode);
System.err.println("[0-9] [A-Z] " + keyCode + " : " + keyChar);
}
this.value += (char) keyCode;
} else if (keyCode == KeyEvent.VK_ENTER && this.value.length() >= MIN_BARCODE_LENGTH) {
170,20 → 176,27
this.value = this.value.trim();
fire(this.value);
reset();
} else if (mapCharacterFR.containsKey((int) keyChar)) {
} else if (this.mapCharacterFR.containsKey((int) keyChar)) {
if (this.debug) {
System.err.println("MAP DEFAULT FR CHAR " + keyChar + " WITH " + mapCharacterFR.get((int) keyChar));
System.err.println("MAP DEFAULT FR CHAR " + keyChar + " WITH " + this.mapCharacterFR.get((int) keyChar));
}
this.value += mapCharacterFR.get((int) keyChar);
this.value += this.mapCharacterFR.get((int) keyChar);
} else if (Character.isLetter(keyChar) || Character.isDigit(keyChar)) {
this.value += keyChar;
if (this.debug) {
System.err.println("LETTER OR DIGIT " + keyChar);
}
} else if (keyChar == 29) {
this.value += '\u001D';
if (this.debug) {
System.err.println("<GS>");
}
} else if (keyChar == KeyEvent.CHAR_UNDEFINED) {
System.err.println("CHAR_UNDEFINED");
} else {
// Caractere non code barre
if (this.debug) {
System.err.println("CHAR NON CODE BARRE " + e);
System.err.println("CHAR NON CODE BARRE keyCode:" + keyCode + " keyChar:" + keyChar);
}
redispatch();
}
196,12 → 209,13
redispatchLater();
}
};
this.timer.schedule(this.task, maxInterKeyDelay);
this.timer.schedule(this.task, this.maxInterKeyDelay);
}
// si pas d'evenement, pas de temps associé
assert !this.eve.isEmpty() || this.firstTime == -1;
}
return true;
 
}
 
private void redispatchLater() {
231,7 → 245,7
}
 
public Map<Integer, String> getMapCharacterFR() {
return mapCharacterFR;
return this.mapCharacterFR;
}
 
public void setDebug(boolean debug) {
289,6 → 303,7
@Override
public void barcodeRead(String code) {
t1.append("Barcode OK : '" + code + "'\n");
t1.append("Hex: " + StringUtils.bytesToHexString(code.getBytes()));
}
});
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/pos/ui/CaisseControler.java
537,11 → 537,30
TicketItem item = new TicketItem(article, a.getQty().multiply(new BigDecimal(-1)));
this.t.addItem(item);
}
// Annulation de chaque paiement
final List<Paiement> typesAdded = new ArrayList<>();
for (Paiement p : ticket.getPaiements()) {
final Paiement paiement = new Paiement(p.getType());
paiement.setMontantInCents(-1 * p.getMontantInCents());
this.t.addPaiement(paiement);
typesAdded.add(p);
}
// On complete avec les autres types
final List<Paiement> types = new ArrayList<>();
types.add(new Paiement(Paiement.CB));
types.add(new Paiement(Paiement.CHEQUE));
types.add(new Paiement(Paiement.ESPECES));
for (Paiement paiement : types) {
boolean typeFound = false;
for (Paiement p : typesAdded) {
if (paiement.getType() == p.getType()) {
typeFound = true;
}
}
if (!typeFound) {
this.t.addPaiement(paiement);
}
}
 
this.caisseFrame.showCaisse();
fire();
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/shipment/component/BonDeLivraisonSQLComponent.java
391,10 → 391,9
} else {
tableBonItem.setRowCatComptable(null);
}
if (!isFilling()) {
tableBonItem.setClient(rowClient, true);
}
 
tableBonItem.setClient(rowClient, !isFilling());
 
} else {
comboContact.getRequest().setWhere(Where.FALSE);
tableBonItem.setRowCatComptable(null);
409,7 → 408,7
// Commercial
JLabel labelCommercial = new JLabel(getLabelFor("ID_COMMERCIAL"));
labelCommercial.setHorizontalAlignment(SwingConstants.RIGHT);
 
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx++;
c.weightx = 0;
this.add(labelCommercial, c);
1086,9 → 1085,17
private void updateStock(int id) throws SQLException {
 
SQLPreferences prefs = new SQLPreferences(getTable().getDBRoot());
if (!prefs.getBoolean(GestionArticleGlobalPreferencePanel.STOCK_FACT, true)) {
 
// Check if tr from bl or cmd pour DS
boolean stockWithBL = !prefs.getBoolean(GestionArticleGlobalPreferencePanel.STOCK_FACT, true);
if (getTable().getForeignTable("ID_CLIENT").contains("NOTE_2018")) {
SQLRow row = getTable().getRow(id);
List<SQLRow> trCmd = row.getReferentRows(getTable().getTable("TR_COMMANDE_CLIENT"));
if (!trCmd.isEmpty()) {
stockWithBL = true;
}
}
if (stockWithBL) {
SQLRow row = getTable().getRow(id);
StockItemsUpdater stockUpdater = new StockItemsUpdater(new StockLabel() {
@Override
public String getLabel(SQLRowAccessor rowOrigin, SQLRowAccessor rowElt) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/credit/component/AvoirClientSQLComponent.java
118,8 → 118,6
private ElementComboBox selectContact;
private JLabel labelCompteServ;
private ISQLCompteSelector compteSelService;
private static final SQLTable TABLE_PREFS_COMPTE = Configuration.getInstance().getBase().getTable("PREFS_COMPTE");
private static final SQLRow ROW_PREFS_COMPTE = TABLE_PREFS_COMPTE.getRow(2);
private final boolean displayDpt;
private final ElementComboBox comboDpt = new ElementComboBox();
 
194,10 → 192,9
boxTarif.setValue(foreignRow.getID());
}
}
if (!isFilling()) {
AvoirClientSQLComponent.this.table.setClient(row, true);
}
 
AvoirClientSQLComponent.this.table.setClient(row, !isFilling());
 
} else {
table.setRowCatComptable(null);
selectContact.getRequest().setWhere(Where.FALSE);
221,7 → 218,8
 
 
// Selection du compte de service
int idCompteVenteService = ROW_PREFS_COMPTE.getInt("ID_COMPTE_PCE_VENTE_SERVICE");
final SQLRow prefs = getTable().getDBRoot().getTable("PREFS_COMPTE").getTable().getRow(2);
int idCompteVenteService = prefs.getInt("ID_COMPTE_PCE_VENTE_SERVICE");
if (idCompteVenteService <= 1) {
try {
idCompteVenteService = ComptePCESQLElement.getIdComptePceDefault("VentesServices");
654,20 → 652,38
JLabel labelPortHT = new JLabel(getLabelFor("PORT_HT"));
labelPortHT.setHorizontalAlignment(SwingConstants.RIGHT);
cFrais.gridy++;
// panelPortEtRemise.add(labelPortHT, cFrais);
panelPortEtRemise.add(labelPortHT, cFrais);
cFrais.gridx++;
DefaultGridBagConstraints.lockMinimumSize(textPortHT);
// panelPortEtRemise.add(textPortHT, cFrais);
panelPortEtRemise.add(textPortHT, cFrais);
 
JLabel labelTaxeHT = new JLabel(getLabelFor("ID_TAXE_PORT"));
labelTaxeHT.setHorizontalAlignment(SwingConstants.RIGHT);
cFrais.gridx = 1;
cFrais.gridy++;
panelPortEtRemise.add(labelTaxeHT, cFrais);
cFrais.gridx++;
SQLRequestComboBox boxTaxePort = new SQLRequestComboBox(false, 8);
panelPortEtRemise.add(boxTaxePort, cFrais);
this.addView(boxTaxePort, "ID_TAXE_PORT", REQ);
 
boxTaxePort.addValueListener(new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
totalTTC.updateTotal();
}
});
 
// Remise
JLabel labelRemiseHT = new JLabel(getLabelFor("REMISE_HT"));
labelRemiseHT.setHorizontalAlignment(SwingConstants.RIGHT);
cFrais.gridy++;
cFrais.gridx = 1;
// panelPortEtRemise.add(labelRemiseHT, cFrais);
panelPortEtRemise.add(labelRemiseHT, cFrais);
cFrais.gridx++;
DefaultGridBagConstraints.lockMinimumSize(textRemiseHT);
// panelPortEtRemise.add(textRemiseHT, cFrais);
panelPortEtRemise.add(textRemiseHT, cFrais);
cFrais.gridy++;
 
c.gridx++;
699,7 → 715,7
JTextField poids = new JTextField();
if (getTable().getFieldsName().contains("T_POIDS"))
addSQLObject(poids, "T_POIDS");
this.totalTTC = new TotalPanel(this.table, fieldEco, fieldHT, fieldTVA, fieldTTC, textPortHT, textRemiseHT, fieldService, null, fieldDevise, poids, null);
this.totalTTC = new TotalPanel(this.table, fieldEco, fieldHT, fieldTVA, fieldTTC, textPortHT, textRemiseHT, fieldService, null, fieldDevise, poids, null, boxTaxePort, null);
totalTTC.setOpaque(false);
c.gridx++;
c.gridy = 0;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/order/element/CommandeClientElementSQLElement.java
171,6 → 171,10
final SQLTable tableCmdElt = tableStock.getTable("COMMANDE_ELEMENT");
selCmdElt.addSelectStar(tableCmdElt);
Where w = new Where(tableCmdElt.getField("RECU_FORCED"), "=", Boolean.FALSE).and(new Where(tableCmdElt.getField("RECU"), "=", Boolean.FALSE));
w = w.and(Where.createRaw(
tableCmdElt.getField("QTE_RECUE").getQuotedName() + " < (" + tableCmdElt.getField("QTE").getQuotedName() + "*" + tableCmdElt.getField("QTE_UNITAIRE").getQuotedName() + ")",
tableCmdElt.getField("QTE_UNITAIRE"), tableCmdElt.getField("QTE"), tableCmdElt.getField("QTE_RECUE")));
 
selCmdElt.setWhere(w);
List<SQLRow> res = SQLRowListRSH.execute(selCmdElt);
if (res != null && res.size() > 0) {
193,6 → 197,10
final SQLTable tableCmdElt = tableStock.getTable("COMMANDE_CLIENT_ELEMENT");
selCmdElt.addSelectStar(tableCmdElt);
Where w = new Where(tableCmdElt.getField("LIVRE_FORCED"), "=", Boolean.FALSE).and(new Where(tableCmdElt.getField("LIVRE"), "=", Boolean.FALSE));
w = w.and(Where.createRaw(
tableCmdElt.getField("QTE_LIVREE").getQuotedName() + " < (" + tableCmdElt.getField("QTE").getQuotedName() + "*" + tableCmdElt.getField("QTE_UNITAIRE").getQuotedName() + ")",
tableCmdElt.getField("QTE_UNITAIRE"), tableCmdElt.getField("QTE"), tableCmdElt.getField("QTE_LIVREE")));
 
selCmdElt.setWhere(w);
List<SQLRow> res = SQLRowListRSH.execute(selCmdElt);
if (res != null && res.size() > 0) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/order/element/CommandeClientSQLElement.java
52,6 → 52,7
import org.openconcerto.sql.request.UpdateBuilder;
import org.openconcerto.sql.utils.SQLUtils;
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;
245,6 → 246,10
mouseSheetXmlListeListener.setGenerateHeader(true);
mouseSheetXmlListeListener.setShowHeader(true);
 
// Dupliquer
RowAction cloneAction = getCloneAction();
allowedActions.add(cloneAction);
 
allowedActions.add(bonAction);
allowedActions.add(factureAction);
allowedActions.add(acompteAction);
254,6 → 259,16
getRowActions().addAll(allowedActions);
}
 
private boolean chiffrageEditableInUI = true;
 
public void setChiffrageEditableInUI(boolean chiffrageEditableInUI) {
this.chiffrageEditableInUI = chiffrageEditableInUI;
}
 
public boolean isChiffrageEditableInUI() {
return this.chiffrageEditableInUI;
}
 
@Override
protected void setupLinks(SQLElementLinksSetup links) {
super.setupLinks(links);
725,7 → 740,26
}
}
 
public RowAction getCloneAction() {
return new RowAction(new AbstractAction() {
 
public void actionPerformed(ActionEvent e) {
SQLRowAccessor selectedRow = IListe.get(e).getSelectedRow();
 
EditFrame editFrame = new EditFrame(CommandeClientSQLElement.this, EditPanel.CREATION);
 
((CommandeClientSQLComponent) editFrame.getSQLComponent()).loadCommandeExistant(selectedRow.getID());
editFrame.setVisible(true);
}
}, true, "sales.quote.clone") {
@Override
public boolean enabledFor(java.util.List<org.openconcerto.sql.model.SQLRowValues> selection) {
return (selection != null && selection.size() == 1);
}
};
}
 
@Override
protected String createCode() {
return "sales.order";
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/order/element/FacturationCommandeClientSQLElement.java
27,6 → 27,7
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.EditPanelListener;
43,6 → 44,7
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
117,6 → 119,11
public void inserted(int id) {
try {
sel.createEmptyUpdateRow().put("ID_SAISIE_VENTE_FACTURE", id).commit();
SQLTable tableFacture = getForeignElement("ID_SAISIE_VENTE_FACTURE").getTable();
SQLRowValues rowValsFact = new SQLRowValues(tableFacture);
rowValsFact.put(tableFacture.getKey().getName(), id);
rowValsFact.put("ID_FACTURATION_COMMANDE_CLIENT", sel.getID());
rowValsFact.commit();
} catch (SQLException e) {
ExceptionHandler.handle("Erreur lors de l'affectation de la facture", e);
}
223,7 → 230,7
res.init();
res.getColumn(getTable().getField("POURCENT")).setRenderer(new DeviseTableCellRenderer());
res.getColumn(getTable().getField("TYPE_FACTURE")).setRenderer(new TypeFactureCommandeCellRenderer());
final BaseSQLTableModelColumn pourcentFact = new BaseSQLTableModelColumn("Montant facturé", BigDecimal.class) {
final BaseSQLTableModelColumn pourcentFact = new BaseSQLTableModelColumn("Montant à facturer", BigDecimal.class) {
 
@Override
protected Object show_(SQLRowAccessor r) {
241,6 → 248,31
};
pourcentFact.setRenderer(new DeviseTableCellRenderer());
res.getColumns().add(pourcentFact);
 
final BaseSQLTableModelColumn montantFact = new BaseSQLTableModelColumn("Montant facturé", BigDecimal.class) {
 
@Override
protected Object show_(SQLRowAccessor r) {
Collection<? extends SQLRowAccessor> rows = r.getReferentRows(getForeignElement("ID_SAISIE_VENTE_FACTURE").getTable());
long ht = 0;
for (SQLRowAccessor sqlRowAccessor : rows) {
ht += sqlRowAccessor.getLong("T_TTC");
}
 
return new BigDecimal(ht).movePointLeft(2);
}
 
@Override
public Set<FieldPath> getPaths() {
Path p = new Path(getTable());
Path p2 = p.add(p.getFirst().getField("ID_COMMANDE_CLIENT"));
Path p3 = new Path(getTable());
p3 = p3.add(getTable().getForeignTable("ID_SAISIE_VENTE_FACTURE").getField("ID_FACTURATION_COMMANDE_CLIENT"));
return CollectionUtils.createSet(new FieldPath(p, "POURCENT"), new FieldPath(p2, "T_TTC"), new FieldPath(p3, "T_TTC"), new FieldPath(p2, "T_HT"), new FieldPath(p3, "T_HT"));
}
};
montantFact.setRenderer(new DeviseTableCellRenderer());
res.getColumns().add(montantFact);
super._initTableSource(res);
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/order/component/CommandeClientSQLComponent.java
25,6 → 25,7
import org.openconcerto.erp.core.customerrelationship.customer.ui.AdresseType;
import org.openconcerto.erp.core.customerrelationship.customer.ui.CategorieComptableChoiceUI;
import org.openconcerto.erp.core.finance.tax.model.TaxeCache;
import org.openconcerto.erp.core.sales.order.element.CommandeClientSQLElement;
import org.openconcerto.erp.core.sales.order.report.CommandeClientXmlSheet;
import org.openconcerto.erp.core.sales.order.ui.CommandeClientItemTable;
import org.openconcerto.erp.core.sales.order.ui.EtatCommandeClient;
62,7 → 63,6
import org.openconcerto.ui.TitledSeparator;
import org.openconcerto.ui.component.ITextArea;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.text.SimpleDocumentListener;
 
import java.awt.Color;
import java.awt.GridBagConstraints;
72,6 → 72,7
import java.sql.SQLException;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
 
import javax.swing.JLabel;
256,9 → 257,7
// }
// table.setTarif(foreignRow, true);
}
if (!isFilling()) {
table.setClient(row, true);
}
table.setClient(row, !isFilling());
 
} else {
if (!isFilling()) {
552,8 → 551,20
pane.add("Facturation", this.tableFacturationItem);
if (prefs.getBoolean(GestionCommercialeGlobalPreferencePanel.CHIFFRAGE_COMMANDE_CLIENT, false)) {
this.tableChiffrageItem = new ChiffrageCommandeTable(this);
this.tableChiffrageItem.getRowValuesTable().setEditable(((CommandeClientSQLElement) getElement()).isChiffrageEditableInUI());
pane.add("Chiffrage", this.tableChiffrageItem);
}
if (this.getTable().contains("INFOS_DEVIS")) {
JPanel panelInfosDevis = new JPanel(new GridBagLayout());
DefaultGridBagConstraints cI = new DefaultGridBagConstraints();
cI.weightx = 1;
cI.weighty = 1;
cI.fill = GridBagConstraints.BOTH;
ITextArea infosDevis = new ITextArea();
panelInfosDevis.add(new JScrollPane(infosDevis), cI);
this.addView(infosDevis, "INFOS_DEVIS");
pane.add("Informations devis", panelInfosDevis);
}
this.add(pane, c);
 
DeviseField textPortHT = new DeviseField(5);
747,6 → 758,8
textPoidsTotal.setText(String.valueOf(CommandeClientSQLComponent.this.table.getPoidsTotal()));
}
});
 
this.addView(this.table.getRowValuesTable(), "");
DefaultGridBagConstraints.lockMinimumSize(comboClient);
DefaultGridBagConstraints.lockMinimumSize(comboCommercial);
DefaultGridBagConstraints.lockMinimumSize(comboDevis);
1006,4 → 1019,50
this.table.setDateDevise(r.getDate("DATE").getTime());
}
}
 
/**
* Création d'une commande à partir d'un devis existant
*
* @param idCommande
*
*/
public void loadCommandeExistant(final int idCommande) {
 
final SQLElement commande =getElement();
final SQLElement commandeElt = getElement().getDirectory().getElement("COMMANDE_CLIENT_ELEMENT");
 
// On duplique la commande
if (idCommande > 1) {
final SQLRow row = getTable().getRow(idCommande);
final SQLRowValues rowVals = new SQLRowValues(getTable());
rowVals.put("ID_CLIENT", row.getInt("ID_CLIENT"));
if (row.getObject("ID_TARIF") != null && !row.isForeignEmpty("ID_TARIF")) {
rowVals.put("ID_TARIF", row.getInt("ID_TARIF"));
}
rowVals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(getElement().getClass()));
 
this.select(rowVals);
}
 
// On duplique les elements des commandes
final List<SQLRow> myListItem = getTable().getRow(idCommande).getReferentRows(commandeElt.getTable());
 
if (myListItem.size() != 0) {
this.table.getModel().clearRows();
 
for (final SQLRow rowElt : myListItem) {
 
final SQLRowValues rowVals = rowElt.createUpdateRow();
rowVals.clearPrimaryKeys();
this.table.getModel().addRow(rowVals);
final 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/sales/account/VenteFactureSituationSQLComponent.java
207,9 → 207,11
 
@Override
public void update(DocumentEvent e) {
if (!isFilling()) {
Acompte a = acompteField.getValue();
table.calculPourcentage(a, TypeCalcul.CALCUL_FACTURABLE);
}
}
 
};
acompteField.getDocument().addDocumentListener(listenerAcompteField);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/invoice/component/SaisieVenteFactureSQLComponent.java
161,9 → 161,7
tableFacture.setRowCatComptable(null);
}
 
if (!isFilling()) {
tableFacture.setClient(rowCli, true);
}
SaisieVenteFactureSQLComponent.this.tableFacture.setClient(rowCli, !isFilling());
 
if (getMode() == SQLComponent.Mode.INSERTION || !isFilling()) {
SQLElement sqleltModeRegl = Configuration.getInstance().getDirectory().getElement("MODE_REGLEMENT");
301,7 → 299,7
public void propertyChange(PropertyChangeEvent evt) {
if (!isFilling() && dateSaisie.getValue() != null) {
 
final String nextNumero = NumerotationAutoSQLElement.getNextNumero(SaisieVenteFactureSQLElement.class, dateSaisie.getValue(), defaultNum);
final String nextNumero = NumerotationAutoSQLElement.getNextNumero(getElement().getClass(), dateSaisie.getValue(), defaultNum);
 
if (textNumeroUnique.getText().trim().length() > 0 && !nextNumero.equalsIgnoreCase(textNumeroUnique.getText())) {
 
1415,11 → 1413,10
rowFacture = getTable().getRow(idSaisieVF);
// incrémentation du numéro auto
final SQLRow rowNum = comboNumAuto == null ? this.tableNum.getRow(2) : comboNumAuto.getSelectedRow();
if (NumerotationAutoSQLElement.getNextNumero(SaisieVenteFactureSQLElement.class, rowFacture.getDate("DATE").getTime(), rowNum)
.equalsIgnoreCase(this.textNumeroUnique.getText().trim())) {
if (NumerotationAutoSQLElement.getNextNumero(getElement().getClass(), rowFacture.getDate("DATE").getTime(), rowNum).equalsIgnoreCase(this.textNumeroUnique.getText().trim())) {
SQLRowValues rowVals = rowNum.createEmptyUpdateRow();
 
String labelNumberFor = NumerotationAutoSQLElement.getLabelNumberFor(SaisieVenteFactureSQLElement.class);
String labelNumberFor = NumerotationAutoSQLElement.getLabelNumberFor(getElement().getClass());
int val = rowNum.getInt(labelNumberFor);
val++;
rowVals.put(labelNumberFor, Integer.valueOf(val));
1608,9 → 1605,9
SQLRowValues rowVals = new SQLRowValues(fact.getTable());
rowVals.put("ID_CLIENT", row.getInt("ID_CLIENT"));
if (getTable().contains("ID_NUMEROTATION_AUTO")) {
rowVals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(SaisieVenteFactureSQLElement.class, new Date(), row.getForeign("ID_NUMEROTATION_AUTO")));
rowVals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(getElement().getClass(), new Date(), row.getForeign("ID_NUMEROTATION_AUTO")));
} else {
rowVals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(SaisieVenteFactureSQLElement.class, new Date()));
rowVals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(getElement().getClass(), new Date()));
}
rowVals.put("NOM", row.getObject("NOM"));
this.select(rowVals);
1648,7 → 1645,7
SQLRowValues rowVals = new SQLRowValues(fact.getTable());
rowVals.put("ID_CLIENT", row.getInt("ID_CLIENT"));
rowVals.put("ID_AFFAIRE", row.getInt("ID_AFFAIRE"));
rowVals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(SaisieVenteFactureSQLElement.class, new Date()));
rowVals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(getElement().getClass(), new Date()));
rowVals.put("NOM", "Acompte de " + GestionDevise.currencyToString(acompte) + "€");
this.select(rowVals);
}
1808,9 → 1805,9
final ComptaPropsConfiguration comptaPropsConfiguration = ((ComptaPropsConfiguration) Configuration.getInstance());
if (getTable().contains("ID_NUMEROTATION_AUTO")) {
vals.put("ID_NUMEROTATION_AUTO", this.defaultNum.getID());
vals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(SaisieVenteFactureSQLElement.class, new Date(), vals.getForeign("ID_NUMEROTATION_AUTO")));
vals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(getElement().getClass(), new Date(), vals.getForeign("ID_NUMEROTATION_AUTO")));
} else {
vals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(SaisieVenteFactureSQLElement.class, new Date()));
vals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(getElement().getClass(), new Date()));
}
int idCompteVenteProduit = rowPrefsCompte.getInt("ID_COMPTE_PCE_VENTE_PRODUIT");
if (idCompteVenteProduit <= 1) {
1852,7 → 1849,7
public void setDefaults() {
this.resetValue();
 
this.textNumeroUnique.setText(NumerotationAutoSQLElement.getNextNumero(SaisieVenteFactureSQLElement.class, new java.util.Date(), defaultNum));
this.textNumeroUnique.setText(NumerotationAutoSQLElement.getNextNumero(getElement().getClass(), new java.util.Date(), defaultNum));
this.tableFacture.getModel().clearRows();
}
 
1870,7 → 1867,7
public void setPrevisonnelle(boolean b) {
this.checkPrevisionnelle.setSelected(b);
if (!b) {
this.textNumeroUnique.setText(NumerotationAutoSQLElement.getNextNumero(SaisieVenteFactureSQLElement.class, new Date()));
this.textNumeroUnique.setText(NumerotationAutoSQLElement.getNextNumero(getElement().getClass(), new Date()));
}
}
 
1916,6 → 1913,15
SQLPreferences prefs = SQLPreferences.getMemCached(getTable().getDBRoot());
if (prefs.getBoolean(GestionArticleGlobalPreferencePanel.STOCK_FACT, true)) {
SQLRow row = getTable().getRow(id);
 
// Check if tr from bl or cmd pour DS
if (getTable().getForeignTable("ID_CLIENT").contains("NOTE_2018")) {
List<SQLRow> trCmd = row.getReferentRows(getTable().getTable("TR_COMMANDE_CLIENT"));
if (!trCmd.isEmpty()) {
return;
}
}
 
StockItemsUpdater stockUpdater = new StockItemsUpdater(new StockLabel() {
 
@Override
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/invoice/element/EcheanceClientSQLElement.java
25,6 → 25,7
import org.openconcerto.erp.core.finance.payment.element.EncaisserMontantSQLElement;
import org.openconcerto.erp.core.sales.invoice.action.ImportReglementSage;
import org.openconcerto.erp.core.sales.invoice.report.MailRelanceCreator;
import org.openconcerto.erp.core.sales.invoice.report.SituationCompteClientPanel;
import org.openconcerto.erp.core.sales.invoice.report.VenteFactureXmlSheet;
import org.openconcerto.erp.rights.ComptaUserRight;
import org.openconcerto.sql.Configuration;
62,6 → 63,7
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.EmailComposer;
import org.openconcerto.ui.JDate;
import org.openconcerto.ui.PanelFrame;
import org.openconcerto.ui.SwingThreadUtils;
import org.openconcerto.utils.CollectionUtils;
import org.openconcerto.utils.ExceptionHandler;
213,7 → 215,18
}, true);
action.setPredicate(IListeEvent.createTotalRowCountPredicate(0, Integer.MAX_VALUE));
getRowActions().add(action);
 
PredicateRowAction actionSituation = new PredicateRowAction(new AbstractAction("Générer une situationde compte") {
 
@Override
public void actionPerformed(ActionEvent e) {
PanelFrame frame = new PanelFrame(new SituationCompteClientPanel(ComptaPropsConfiguration.getInstanceCompta()), "Situation client");
frame.setVisible(true);
}
}, true);
actionSituation.setPredicate(IListeEvent.createSelectionCountPredicate(0, Integer.MAX_VALUE));
getRowActions().add(actionSituation);
}
 
if (UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.MENU)) {
RowAction actionCancel = new RowAction(new AbstractAction("Annuler la régularisation en comptabilité") {
550,6 → 563,7
SQLRow rowMvtSource = getTable().getTable("MOUVEMENT").getRow(idMvtSource);
 
if (!rowMvtSource.getString("SOURCE").equalsIgnoreCase("SAISIE_VENTE_FACTURE")) {
JOptionPane.showMessageDialog(null, "Impossible de relancer un échéance qui n'est pas issue d'une facture.");
return;
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/invoice/report/SituationCompteXmlSheet.java
New file
0,0 → 1,203
/*
* 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.sales.invoice.report;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.generationDoc.AbstractListeSheetXml;
import org.openconcerto.erp.preferences.PrinterNXProps;
import org.openconcerto.sql.element.SQLElement;
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.cc.ITransformer;
 
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
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 SituationCompteXmlSheet extends AbstractListeSheetXml {
 
private final DateFormat dateFormat = new SimpleDateFormat("dd/MM/yy");
private SQLElement eltEch;
private SQLElement eltVf;
private ComptaPropsConfiguration conf;
 
public SituationCompteXmlSheet(ComptaPropsConfiguration conf, SQLRow rowClient) {
super(rowClient);
this.printer = PrinterNXProps.getInstance().getStringProperty("BonPrinter");
this.eltEch = conf.getDirectory().getElement("ECHEANCE_CLIENT");
this.conf = conf;
}
 
@Override
protected String getStoragePathP() {
return "Autres";
}
 
public String getDefaultTemplateId() {
return "SituationCompte";
}
 
private Date d = null;
 
@Override
public String getName() {
if (this.d == null) {
this.d = new Date();
}
return "SituationCompte-" + this.d.getTime();
}
 
protected void createListeValues() {
 
// On récupére les échéances en cours
final SQLTable echTable = eltEch.getTable();
SQLRowValues rowVals = new SQLRowValues(echTable);
rowVals.putNulls("DATE", "MONTANT");
rowVals.putRowValues("ID_SAISIE_VENTE_FACTURE").putNulls("NUMERO", "NET_A_PAYER", "DATE", "NOM");
Where w = new Where(echTable.getField("REGLE"), "=", Boolean.FALSE);
w = w.and(new Where(echTable.getField("REG_COMPTA"), "=", Boolean.FALSE));
w = w.and(new Where(echTable.getField("ID_CLIENT"), "=", row.getID()));
 
SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(rowVals);
fetcher.addSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
 
@Override
public SQLSelect transformChecked(SQLSelect input) {
input.addFieldOrder(echTable.getField("DATE"));
 
return input;
}
}, 0);
List<SQLRowValues> result = fetcher.fetch(w);
 
List<Map<String, Object>> listValues = new ArrayList<Map<String, Object>>();
Map<Integer, String> styleValues = new HashMap<Integer, String>();
BigDecimal totalRegle = BigDecimal.ZERO;
BigDecimal totalEch = BigDecimal.ZERO;
BigDecimal totalEchPasse = BigDecimal.ZERO;
Calendar today = Calendar.getInstance();
for (SQLRowValues sqlRow : result) {
Map<String, Object> mValues = new HashMap<String, Object>();
final Calendar dateEch = sqlRow.getDate("DATE");
mValues.put("DATE_ECHEANCE", dateFormat.format(dateEch.getTime()));
final BigDecimal montantDu = new BigDecimal(sqlRow.getLong("MONTANT"));
mValues.put("DU", montantDu);
 
totalEch = totalEch.add(montantDu);
 
SQLRowAccessor rowFact = sqlRow.getNonEmptyForeign("ID_SAISIE_VENTE_FACTURE");
final BigDecimal regle;
if (rowFact != null) {
mValues.put("PIECE", rowFact.getString("NUMERO"));
mValues.put("LIBELLE", rowFact.getString("NOM"));
mValues.put("DATE", dateFormat.format(rowFact.getDate("DATE").getTime()));
final BigDecimal montantFact = new BigDecimal(rowFact.getLong("NET_A_PAYER"));
regle = montantFact.subtract(montantDu);
mValues.put("DU", montantFact);
mValues.put("REGLE", montantFact.subtract(montantDu));
mValues.put("SOLDE", montantDu);
 
} else {
regle = BigDecimal.ZERO;
mValues.put("SOLDE", montantDu);
}
if (dateEch.before(today)) {
totalEchPasse = totalEchPasse.add(montantDu);
styleValues.put(listValues.size(), "Normal");
} else {
styleValues.put(listValues.size(), "Titre 1");
}
totalRegle = totalRegle.add(regle);
 
// SQLRow rowClient = sqlRow.getForeignRow("ID_CLIENT");
 
listValues.add(mValues);
 
// List<SQLRow> enc = sqlRow.getReferentRows(eltEncElt.getTable());
//
// for (SQLRow sqlRow2 : enc) {
// Map<String, Object> mValuesEnc = new HashMap<String, Object>();
// SQLRow rowEnc = sqlRow2.getForeignRow("ID_ENCAISSER_MONTANT");
// SQLRow rowMdr = rowEnc.getForeignRow("ID_MODE_REGLEMENT");
// mValuesEnc.put("NUMERO_FACTURE", "");
// mValuesEnc.put("REFERENCE", rowMdr.getString("NOM"));
// mValuesEnc.put("DATE", dateFormat.format(rowEnc.getDate("DATE").getTime()));
// mValuesEnc.put("NOM_CLIENT", "");
// mValuesEnc.put("CODE_CLIENT", "");
// mValuesEnc.put("TELEPHONE", "");
// mValuesEnc.put("MODE_REGLEMENT",
// rowMdr.getForeignRow("ID_TYPE_REGLEMENT").getString("NOM"));
// mValuesEnc.put("MONTANT",
// GestionDevise.currencyToString(sqlRow2.getLong("MONTANT_REGLE")));
// styleValues.put(listValues.size(), "Titre 1");
// listValues.add(mValuesEnc);
//
// }
// if (enc != null && enc.size() > 0) {
// Map<String, Object> mValuesEnc = new HashMap<String, Object>();
// mValuesEnc.put("DATE", dateFormat.format(sqlRow.getDate("DATE").getTime()));
// mValuesEnc.put("MODE_REGLEMENT", "Restant à régler");
// mValuesEnc.put("MONTANT", GestionDevise.currencyToString(sqlRow.getLong("MONTANT")));
// styleValues.put(listValues.size(), "Titre 1");
// listValues.add(mValuesEnc);
// }
 
}
 
SQLRow rowSoc = conf.getRowSociete();
SQLRow adrSoc = rowSoc.getForeign("ID_ADRESSE_COMMON");
 
Map<String, Object> sheetVals = new HashMap<String, Object>();
 
sheetVals.put("TOTAL_REGLE", totalRegle);
sheetVals.put("TOTAL_ECHEANCE", totalEch);
sheetVals.put("TOTAL_FUTUR", totalEch.subtract(totalEchPasse));
sheetVals.put("TOTAL_PASSE", totalEchPasse);
 
sheetVals.put("NOM_CLIENT", row.getString("NOM"));
sheetVals.put("DATE", new Date());
sheetVals.put("CODE_CLIENT", row.getString("CODE"));
sheetVals.put("TELEPHONE", row.getString("TEL"));
SQLRow rowAdrClient = row.getForeign("ID_ADRESSE");
sheetVals.put("ADRESSE", rowAdrClient.getString("RUE"));
sheetVals.put("VILLE", rowAdrClient.getString("CODE_POSTAL") + " " + rowAdrClient.getString("VILLE"));
 
sheetVals.put("SOCIETE_NOM", rowSoc.getString("NOM"));
sheetVals.put("SOCIETE_TEL", rowSoc.getString("NUM_TEL"));
sheetVals.put("SOCIETE_SIRET", rowSoc.getString("NUM_SIRET"));
sheetVals.put("SOCIETE_APE", rowSoc.getString("NUM_APE"));
sheetVals.put("SOCIETE_NII", rowSoc.getString("NUM_NII"));
sheetVals.put("SOCIETE_BIC", rowSoc.getString("BIC"));
sheetVals.put("SOCIETE_IBAN", rowSoc.getString("IBAN"));
sheetVals.put("SOCIETE_MAIL", rowSoc.getString("MAIL"));
 
sheetVals.put("SOCIETE_ADRESSE", adrSoc.getString("RUE"));
sheetVals.put("SOCIETE_VILLE", adrSoc.getString("CODE_POSTAL") + " " + adrSoc.getString("VILLE"));
this.mapAllSheetValues.put(0, sheetVals);
this.listAllSheetValues.put(0, listValues);
this.styleAllSheetValues.put(0, styleValues);
 
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/invoice/report/VenteFactureXmlSheet.java
23,6 → 23,7
public class VenteFactureXmlSheet extends AbstractSheetXMLWithDate {
 
public static final String TEMPLATE_ID = "VenteFacture";
public static final String TEMPLATE_SITUATION_SUFFIX = "Situation";
public static final String TEMPLATE_PROPERTY_NAME = "LocationFacture";
 
@Override
46,9 → 47,14
@Override
public SQLRow getRowLanguage() {
SQLRow rowClient = this.row.getForeignRow("ID_CLIENT");
 
if (rowClient.getTable().contains("ID_LANGUE")) {
return rowClient.getForeignRow("ID_LANGUE");
if (!rowClient.isForeignEmpty("ID_LANGUE")) {
return rowClient.getForeign("ID_LANGUE");
} else {
return null;
}
} else {
return super.getRowLanguage();
}
}
68,7 → 74,7
} else if (row.getBoolean("ACOMPTE")) {
type = "Acompte";
} else if (row.getBoolean("PARTIAL") || row.getBoolean("SOLDE")) {
type = "Situation";
type = TEMPLATE_SITUATION_SUFFIX;
} else {
type = null;
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/invoice/report/SituationCompteClientPanel.java
New file
0,0 → 1,118
/*
* 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.sales.invoice.report;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.request.ComboSQLRequest;
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.EmailComposer;
import org.openconcerto.ui.JLabelBold;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.FileUtils;
 
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 javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JPanel;
 
public class SituationCompteClientPanel extends JPanel {
 
public SituationCompteClientPanel(ComptaPropsConfiguration conf) {
super(new GridBagLayout());
 
JLabelBold title = new JLabelBold("Génération d'une situation de compte d'un client");
 
final ElementComboBox box = new ElementComboBox(true);
SQLElement element = Configuration.getInstance().getDirectory().getElement("CLIENT");
ComboSQLRequest comboRequest = element.getComboRequest(true);
// comboRequest.setUndefLabel("Tous");
box.init(element, comboRequest);
 
GridBagConstraints c = new DefaultGridBagConstraints();
c.gridwidth = 1;
c.weightx = 0;
this.add(title, c);
c.gridx++;
c.gridwidth = 1;
c.weightx = 1;
this.add(box, c);
 
final JCheckBox boxMail = new JCheckBox("Envoie par mail");
c.gridx++;
c.weightx = 0;
this.add(boxMail, c);
 
final JButton buttonValid = new JButton(new AbstractAction("Valider") {
 
@Override
public void actionPerformed(ActionEvent e) {
 
final SQLRow selectedClient = box.getSelectedRow();
new Thread() {
public void run() {
 
try {
SituationCompteXmlSheet sheet = new SituationCompteXmlSheet(conf, selectedClient);
File pdf = sheet.getOrCreatePDFDocumentFile(true);
if (boxMail.isSelected()) {
sheet.createDocument();
// sheet.showPrintAndExport(false, false, false);
 
String mail = selectedClient.getString("MAIL");
 
try {
EmailComposer.getInstance().compose(mail, "", "", pdf);
} catch (Exception exn) {
ExceptionHandler.handle(null, "Impossible de créer le courriel", exn);
}
} else {
FileUtils.openFile(pdf);
}
} catch (Exception e) {
ExceptionHandler.handle("Une erreur est survenue lors de la création du document", e);
}
};
}.start();
 
}
});
 
c.gridy++;
c.fill = GridBagConstraints.NONE;
c.anchor = GridBagConstraints.EAST;
c.weightx = 0;
this.add(buttonValid, c);
 
// Listener enabled/disabled button
buttonValid.setEnabled(false);
box.addModelListener("wantedID", new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent arg0) {
buttonValid.setEnabled(box.getWantedID() != SQLRow.NONEXISTANT_ID && box.getWantedID() != box.getRequest().getPrimaryTable().getUndefinedID());
}
});
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/invoice/report/ReportingStockXmlSheet.java
13,8 → 13,9
package org.openconcerto.erp.core.sales.invoice.report;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.supplychain.stock.element.DepotStockSQLElement;
import org.openconcerto.erp.generationDoc.AbstractListeSheetXml;
import org.openconcerto.erp.preferences.PrinterNXProps;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
23,11 → 24,15
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.TableRef;
import org.openconcerto.sql.model.Where;
import org.openconcerto.utils.cc.ITransformer;
 
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
42,16 → 47,20
 
public static final String TEMPLATE_ID = "EtatStocks";
public static final String TEMPLATE_PROPERTY_NAME = DEFAULT_PROPERTY_NAME;
 
private int intIDDepot = DepotStockSQLElement.DEFAULT_ID;
private boolean bTousLesDepots = false;
private Date date;
private SQLElement eltArticle = Configuration.getInstance().getDirectory().getElement("ARTICLE");
private SQLElement eltStock = Configuration.getInstance().getDirectory().getElement("STOCK");
 
public ReportingStockXmlSheet(boolean fournisseur) {
super();
this.printer = PrinterNXProps.getInstance().getStringProperty("BonPrinter");
 
public ReportingStockXmlSheet(ComptaPropsConfiguration conf, Integer intIDDepot, boolean bTousLesDepots) {
this.eltArticle = conf.getDirectory().getElement("ARTICLE");
this.eltStock = conf.getDirectory().getElement("STOCK");
if (intIDDepot != null) {
this.intIDDepot = intIDDepot;
}
this.bTousLesDepots = bTousLesDepots;
}
 
@Override
public String getStoragePathP() {
73,17 → 82,33
 
protected void createListeValues() {
 
final SQLTable tableArt = eltArticle.getTable();
SQLRowValues rowVals = new SQLRowValues(tableArt);
rowVals.put("ID_FOURNISSEUR", null);
rowVals.put("ID_FAMILLE_ARTICLE", null);
rowVals.put("CODE", null);
rowVals.put("NOM", null);
rowVals.put("PA_HT", null);
rowVals.put("PV_HT", null);
rowVals.putRowValues("ID_STOCK").putNulls("QTE_REEL");
final SQLTable tableArt = this.eltArticle.getTable();
SQLRowValues rowvArticle = new SQLRowValues(tableArt);
rowvArticle.put("ID_FOURNISSEUR", null);
rowvArticle.put("ID_FAMILLE_ARTICLE", null);
rowvArticle.put("CODE", null);
rowvArticle.put("NOM", null);
rowvArticle.put("PA_HT", null);
rowvArticle.put("PV_HT", null);
 
SQLRowValuesListFetcher fetch = SQLRowValuesListFetcher.create(rowVals);
SQLRowValues rowvStock = new SQLRowValues(this.eltStock.getTable());
rowvStock.put("QTE_REEL", null).put("ID_ARTICLE", rowvArticle);
 
SQLRowValuesListFetcher fetch = SQLRowValuesListFetcher.create(rowvArticle);
 
if (!this.bTousLesDepots) {
fetch.setSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
@Override
public SQLSelect transformChecked(SQLSelect input) {
TableRef join = input.getAlias(ReportingStockXmlSheet.this.eltArticle.getTable().getTable("STOCK"));
 
input.setWhere(new Where(join.getField("ID_DEPOT_STOCK"), "=", ReportingStockXmlSheet.this.intIDDepot));
System.out.println(input.toString());
return input;
}
});
}
 
List<SQLRowValues> values = fetch.fetch();
 
final SQLTable tableF = tableArt.getTable("FAMILLE_ARTICLE");
119,7 → 144,11
Line lineTotal = new Line("Total", "", BigDecimal.ZERO, 0F);
final HashMap<Integer, String> style = new HashMap<Integer, String>();
for (SQLRowValues vals : values) {
Float qte = vals.getForeign("ID_STOCK").getFloat("QTE_REEL");
Collection<SQLRowValues> stocks = vals.getReferentRows(this.eltStock.getTable());
Float qte = 0f;
for (SQLRowValues stock : stocks) {
qte += stock.getFloat("QTE_REEL");
}
BigDecimal ha = BigDecimal.ZERO;
if (qte > 0) {
final BigDecimal puHA = vals.getBigDecimal("PA_HT");
213,7 → 242,7
style.put(style.keySet().size(), "Titre 1");
 
final Map<String, Object> valuesSheet = new HashMap<String, Object>();
valuesSheet.put("DATE", "Au " + dateFormat.format(new Date()));
valuesSheet.put("DATE", "Au " + this.dateFormat.format(new Date()));
//
this.listAllSheetValues.put(0, listValues);
 
239,23 → 268,23
}
 
public Float getQte() {
return qte;
return this.qte;
}
 
public String getCodeArt() {
return codeArt;
return this.codeArt;
}
 
public BigDecimal getPuHA() {
return puHA;
return this.puHA;
}
 
public String getNomArt() {
return nomArt;
return this.nomArt;
}
 
public BigDecimal getTotalHA() {
return totalHA;
return this.totalHA;
}
 
public void add(Line l) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/invoice/action/ImportReglementSage.java
170,7 → 170,7
 
SQLRow rowEncaisser = rowValsEncaisser.commit();
 
this.encaisserSQLElement.regleFacture(rowEncaisser);
this.encaisserSQLElement.regleFacture(rowEncaisser, null, false);
 
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/invoice/action/GenEtatStockAction.java
13,11 → 13,19
package org.openconcerto.erp.core.sales.invoice.action;
 
import org.openconcerto.erp.core.sales.invoice.report.ReportingStockXmlSheet;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.sales.invoice.ui.RapportEtatDeStockDepotSelectionPanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.ui.FrameUtil;
import org.openconcerto.ui.state.WindowStateManager;
import org.openconcerto.utils.FileUtils;
 
import java.awt.Dimension;
import java.io.File;
 
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
 
public class GenEtatStockAction extends AbstractAction {
public GenEtatStockAction() {
27,17 → 35,23
public void actionPerformed(java.awt.event.ActionEvent e) {
final Thread thread = new Thread(new Runnable() {
public void run() {
try {
 
ReportingStockXmlSheet sheet = new ReportingStockXmlSheet(false);
// Création de la fenêtre de popup de séléction du dépot.
JFrame frame = new JFrame();
frame.setTitle("Sélection des dépôts.");
frame.setPreferredSize(new Dimension(500, 130));
frame.setLocationRelativeTo(null); // la fenêtre est centrée à l'écran
 
sheet.createDocumentAsynchronous().get();
sheet.openDocument(false);
WindowStateManager stateManager;
stateManager = new WindowStateManager(frame,
new File(Configuration.getInstance().getConfDir(), "Configuration" + File.separator + "Frame" + File.separator + FileUtils.sanitize("RapportEtatDeStockPanel") + ".xml"));
 
} catch (Exception e) {
ExceptionHandler.handle("Erreur de traitement", e);
frame.getContentPane().add(new RapportEtatDeStockDepotSelectionPanel((ComptaPropsConfiguration) Configuration.getInstance()));
 
FrameUtil.showPacked(frame);
stateManager.loadState();
}
}
 
});
thread.start();
};
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/invoice/ui/RapportEtatDeStockDepotSelectionPanel.java
New file
0,0 → 1,152
/*
* 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.sales.invoice.ui;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.sales.invoice.report.ReportingStockXmlSheet;
import org.openconcerto.erp.core.supplychain.stock.element.DepotStockSQLElement;
import org.openconcerto.sql.request.ComboSQLRequest;
import org.openconcerto.sql.sqlobject.SQLRequestComboBox;
import org.openconcerto.ui.component.InteractionMode;
import org.openconcerto.utils.ExceptionHandler;
 
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
 
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
 
public class RapportEtatDeStockDepotSelectionPanel extends JPanel {
 
JPanel pnlMain = new JPanel();
JPanel pnlBottom = new JPanel();
JLabel labDepots = new JLabel("Dépôts");
JButton butReport = new JButton("Générer le rapport");
JCheckBox chkTous = new JCheckBox("Séléctionner tous les dépôts");
 
SQLRequestComboBox sqlreqDepots = new SQLRequestComboBox(false, 20);
 
public RapportEtatDeStockDepotSelectionPanel(ComptaPropsConfiguration conf) {
GridBagLayout layThis = new GridBagLayout();
this.setLayout(layThis);
 
GridBagLayout layMain = new GridBagLayout();
this.pnlMain.setLayout(layMain);
 
GridBagLayout layBottom = new GridBagLayout();
this.pnlBottom.setLayout(layBottom);
 
GridBagConstraints gbcThis = new GridBagConstraints();
gbcThis.weightx = 1;
gbcThis.weighty = 1;
gbcThis.gridheight = 1;
gbcThis.gridwidth = 1;
gbcThis.fill = GridBagConstraints.BOTH;
 
GridBagConstraints gbcBottom = new GridBagConstraints();
gbcBottom.weightx = 1;
gbcBottom.weighty = 1;
gbcBottom.gridheight = 1;
gbcBottom.gridwidth = 2;
gbcBottom.fill = GridBagConstraints.BOTH;
 
GridBagConstraints gbcDefault = new GridBagConstraints();
gbcDefault.weightx = 1;
gbcDefault.gridheight = 1;
gbcDefault.gridwidth = 1;
gbcDefault.insets = new Insets(0, 4, 4, 4);
gbcDefault.fill = GridBagConstraints.HORIZONTAL;
 
GridBagConstraints gbcButton = new GridBagConstraints();
gbcButton.weightx = 1;
gbcButton.weighty = 1;
gbcButton.gridheight = 1;
gbcButton.gridwidth = 1;
gbcButton.insets = new Insets(0, 4, 4, 4);
gbcButton.anchor = GridBagConstraints.SOUTHEAST;
 
this.setBackground(Color.DARK_GRAY);
this.add(this.pnlMain, gbcThis);
 
// Label.
gbcDefault.gridx = 0;
gbcDefault.gridy = 0;
this.pnlMain.add(this.labDepots, gbcDefault);
this.labDepots.setHorizontalAlignment(SwingConstants.RIGHT);
 
// SQLRequestComboBox.
List<String> fields = new ArrayList<>();
fields.add("NOM");
ComboSQLRequest request = new ComboSQLRequest(conf.getDirectory().getElement("DEPOT_STOCK").getTable(), fields, null, conf.getDirectory());
 
gbcDefault.gridx = 1;
gbcDefault.gridy = 0;
this.sqlreqDepots.uiInit(request);
this.sqlreqDepots.setValue(DepotStockSQLElement.DEFAULT_ID);
this.pnlMain.add(this.sqlreqDepots, gbcDefault);
 
// CheckBox.
gbcDefault.gridx = 1;
gbcDefault.gridy = 1;
this.chkTous.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (RapportEtatDeStockDepotSelectionPanel.this.chkTous.isSelected()) {
RapportEtatDeStockDepotSelectionPanel.this.sqlreqDepots.setEnabled(InteractionMode.DISABLED);
} else {
RapportEtatDeStockDepotSelectionPanel.this.sqlreqDepots.setEnabled(InteractionMode.READ_WRITE);
}
}
});
 
this.pnlMain.add(this.chkTous, gbcDefault);
 
// Ajout du panel du bas.
gbcBottom.gridx = 0;
gbcBottom.gridy = 2;
this.pnlMain.add(this.pnlBottom, gbcBottom);
 
// Button.
gbcButton.gridx = 0;
gbcButton.gridy = 0;
this.butReport.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Integer intIDDepot = RapportEtatDeStockDepotSelectionPanel.this.sqlreqDepots.getValue();
boolean bTousLesDepots = RapportEtatDeStockDepotSelectionPanel.this.chkTous.isSelected();
 
try {
ReportingStockXmlSheet sheet = new ReportingStockXmlSheet(conf, intIDDepot, bTousLesDepots);
sheet.createDocumentAsynchronous().get();
sheet.openDocument(false);
 
} catch (Exception excep) {
ExceptionHandler.handle("Erreur de traitement", excep);
}
}
});
 
this.pnlBottom.add(this.butReport, gbcButton);
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/invoice/ui/ListeDesEcheancesClientsPanel.java
54,7 → 54,6
public class ListeDesEcheancesClientsPanel extends JPanel {
 
private ListPanelEcheancesClients panelEcheances;
private EditFrame editEncaisse = null;
private EditFrame editRelance = null;
private JButton relancer;
private JButton encaisser;
192,10 → 191,7
 
}
SQLElement encaisseElt = Configuration.getInstance().getDirectory().getElement("ENCAISSER_MONTANT");
if (ListeDesEcheancesClientsPanel.this.editEncaisse == null) {
ListeDesEcheancesClientsPanel.this.editEncaisse = new EditFrame(encaisseElt);
ListeDesEcheancesClientsPanel.this.editEncaisse.setIconImages(Gestion.getFrameIcon());
}
EditFrame editEncaisse = new EditFrame(encaisseElt);
 
SQLRowValues rowVals = new SQLRowValues(encaisseElt.getTable());
if (idClient > -1) {
207,60 → 203,23
rowVals.put("ID_COMPTE_PCE_TIERS", idCptTiers);
}
 
final EncaisserMontantSQLComponent sqlComponent = (EncaisserMontantSQLComponent) ListeDesEcheancesClientsPanel.this.editEncaisse.getSQLComponent();
final EncaisserMontantSQLComponent sqlComponent = (EncaisserMontantSQLComponent) editEncaisse.getSQLComponent();
 
sqlComponent.resetValue();
sqlComponent.select(rowVals);
sqlComponent.loadEcheancesFromRows(selectedRows);
ListeDesEcheancesClientsPanel.this.editEncaisse.setTitle("Encaissement de factures clients");
ListeDesEcheancesClientsPanel.this.editEncaisse.pack();
ListeDesEcheancesClientsPanel.this.editEncaisse.setVisible(true);
editEncaisse.setTitle("Encaissement de factures clients");
editEncaisse.pack();
editEncaisse.setVisible(true);
}
});
 
// Gestion de la souris
this.panelEcheances.getJTable().addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent mE) {
if (mE.getButton() == MouseEvent.BUTTON1) {
// Mise à jour de l'echeance sur la frame de reglement
// si cette derniere est cree
final SQLBase base = ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete();
final SQLRowValues selectedRow = panelEcheances.getListe().getSelectedRow();
final SQLRow row = selectedRow.asRow();
if (row == null) {
JOptionPane.showMessageDialog(ListeDesEcheancesClientsPanel.this, "Selection", "Merci de sélectionner une ligne", JOptionPane.PLAIN_MESSAGE);
return;
}
if (ListeDesEcheancesClientsPanel.this.editEncaisse != null) {
final SQLRowValues rowVals = new SQLRowValues(base.getTable("ENCAISSER_MONTANT"));
rowVals.put("ID_ECHEANCE_CLIENT", row.getID());
 
ListeDesEcheancesClientsPanel.this.editEncaisse.getSQLComponent().select(rowVals);
ListeDesEcheancesClientsPanel.this.editEncaisse.pack();
}
}
 
}
});
 
liste.addIListener(new IListener() {
public void selectionId(int id, int field) {
if (id > 1) {
final SQLBase base = ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete();
final SQLTable tableEch = base.getTable("ECHEANCE_CLIENT");
final SQLRow rowEch = tableEch.getRow(id);
final int idMvtSource = MouvementSQLElement.getSourceId(rowEch.getInt("ID_MOUVEMENT"));
final SQLRow rowMvtSource = base.getTable("MOUVEMENT").getRow(idMvtSource);
 
ListeDesEcheancesClientsPanel.this.relancer.setEnabled(rowMvtSource.getString("SOURCE").equalsIgnoreCase("SAISIE_VENTE_FACTURE"));
ListeDesEcheancesClientsPanel.this.encaisser.setEnabled(true);
} else {
ListeDesEcheancesClientsPanel.this.relancer.setEnabled(false);
ListeDesEcheancesClientsPanel.this.encaisser.setEnabled(false);
ListeDesEcheancesClientsPanel.this.relancer.setEnabled(id > 1);
ListeDesEcheancesClientsPanel.this.encaisser.setEnabled(id > 1);
}
 
}
});
this.relancer.setEnabled(false);
this.encaisser.setEnabled(false);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/quote/component/DevisSQLComponent.java
436,10 → 436,9
final SQLRow rowClient = getTable().getForeignTable("ID_CLIENT").getRow(wantedID);
int idClient = rowClient.getID();
comboContact.getRequest().setWhere(new Where(contactElement.getTable().getField("ID_CLIENT"), "=", idClient));
if (!isFilling()) {
table.setClient(rowClient, true);
}
 
table.setClient(rowClient, !isFilling());
 
} else {
comboContact.getRequest().setWhere(Where.FALSE);
if (!isFilling()) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/action/TransfertStockPanel.java
20,7 → 20,9
import org.openconcerto.erp.core.supplychain.stock.element.StockItem.TypeStockMouvement;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.ConnectionHandlerNoSetup;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLDataSource;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
81,7 → 83,6
final SQLRequestComboBox comboStockArrive = new SQLRequestComboBox();
comboStockArrive.uiInit(stockElt.createComboRequest());
 
JLabel qteReel = new JLabel("Quantité", SwingConstants.RIGHT);
final NumericTextField fieldReel = new NumericTextField();
 
fieldReel.getDocument().addDocumentListener(new SimpleDocumentListener() {
88,8 → 89,7
 
@Override
public void update(DocumentEvent e) {
buttonUpdate.setEnabled(
fieldReel.getText().trim().length() > 0 && comboArticle.getSelectedRow() != null && comboStockArrive.getSelectedRow() != null && comboStockDepart.getSelectedRow() != null);
updateButtons(buttonUpdate, comboArticle, comboStockDepart, comboStockArrive, fieldReel);
}
});
 
97,8 → 97,7
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
buttonUpdate.setEnabled(
fieldReel.getText().trim().length() > 0 && comboArticle.getSelectedRow() != null && comboStockArrive.getSelectedRow() != null && comboStockDepart.getSelectedRow() != null);
updateButtons(buttonUpdate, comboArticle, comboStockDepart, comboStockArrive, fieldReel);
}
});
 
106,8 → 105,7
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
buttonUpdate.setEnabled(
fieldReel.getText().trim().length() > 0 && comboArticle.getSelectedRow() != null && comboStockArrive.getSelectedRow() != null && comboStockDepart.getSelectedRow() != null);
updateButtons(buttonUpdate, comboArticle, comboStockDepart, comboStockArrive, fieldReel);
}
});
 
115,17 → 113,16
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
buttonUpdate.setEnabled(
fieldReel.getText().trim().length() > 0 && comboArticle.getSelectedRow() != null && comboStockArrive.getSelectedRow() != null && comboStockDepart.getSelectedRow() != null);
updateButtons(buttonUpdate, comboArticle, comboStockDepart, comboStockArrive, fieldReel);
}
});
 
GridBagConstraints c = new DefaultGridBagConstraints();
 
c.gridx = 0;
this.add(new JLabel("Intitulé"), c);
final JTextField label = new JTextField();
c.gridx++;
c.gridwidth = 2;
c.gridwidth = 1;
c.weightx = 1;
this.add(label, c);
label.setText(defaultLabel);
132,72 → 129,49
 
c.gridy++;
c.gridx = 0;
c.gridwidth = 1;
c.weightx = 0;
this.add(new JLabel("Date", SwingConstants.RIGHT), c);
final JDate date = new JDate(true);
c.gridx++;
c.weightx = 0;
this.add(date, c);
 
c.gridy++;
c.gridx = 0;
c.gridwidth = 2;
c.weightx = 0;
this.add(new JLabel("Article", SwingConstants.RIGHT), c);
c.gridx += 2;
c.gridwidth = 1;
c.weightx = 1;
c.gridx++;
this.add(comboArticle, c);
 
c.gridy++;
c.gridx = 0;
c.gridwidth = 2;
c.weightx = 0;
this.add(new JLabel("Départ", SwingConstants.RIGHT), c);
c.gridx += 2;
c.gridwidth = 1;
c.weightx = 1;
c.gridx++;
this.add(comboStockDepart, c);
 
c.gridy++;
c.gridx = 0;
c.gridwidth = 2;
c.weightx = 0;
 
this.add(new JLabel("Arrivée", SwingConstants.RIGHT), c);
c.gridx += 2;
c.gridwidth = 1;
c.weightx = 1;
c.gridx++;
this.add(comboStockArrive, c);
 
c.gridy++;
c.gridx = 0;
c.gridwidth = 2;
c.weightx = 0;
this.add(qteReel, c);
c.gridx += 2;
c.gridwidth = 1;
c.weightx = 1;
this.add(new JLabel("Quantité", SwingConstants.RIGHT), c);
c.gridx++;
this.add(fieldReel, c);
 
c.gridy++;
c.gridx = 0;
c.gridwidth = 2;
c.weightx = 0;
this.add(qteReel, c);
c.gridx += 2;
c.gridwidth = 1;
c.weightx = 1;
this.add(fieldReel, c);
 
c.gridy++;
c.gridx = 0;
JButton buttonCancel = new JButton("Annuler");
JPanel pButton = new JPanel();
pButton.add(buttonCancel);
pButton.add(buttonUpdate);
c.gridwidth = GridBagConstraints.REMAINDER;
c.anchor = GridBagConstraints.EAST;
c.gridwidth = 2;
c.anchor = GridBagConstraints.SOUTHEAST;
c.weightx = 0;
c.fill = GridBagConstraints.NONE;
this.add(pButton, c);
212,19 → 186,19
 
@Override
public void actionPerformed(ActionEvent e) {
 
buttonUpdate.setEnabled(false);
BigDecimal qteReel = fieldReel.getValue();
 
List<String> multipleRequestsHundred = new ArrayList<String>(100);
boolean usePrice = mvtStockTable.contains("PRICE");
List<StockItem> stockItems = new ArrayList<StockItem>();
final Date dateValue = date.getValue();
 
final SQLRow selectedRowArticle = comboArticle.getSelectedRow();
 
final SQLRow selectedRowDepotDepart = comboStockDepart.getSelectedRow();
final SQLRow selectedRowDepotArrivee = comboStockArrive.getSelectedRow();
try {
SQLUtils.executeAtomic(selectedRowDepotDepart.getTable().getDBSystemRoot().getDataSource(), new ConnectionHandlerNoSetup<Object, SQLException>() {
@Override
public Object handle(SQLDataSource ds) throws SQLException {
{
// DEPART
final SQLRowAccessor rowStockDepart = ProductComponent.findOrCreateStock(selectedRowArticle, selectedRowDepotDepart);
233,12 → 207,7
SQLRowValues rowVals = new SQLRowValues(mvtStockTable.getTable("STOCK"));
rowVals.put("ID_ARTICLE", selectedRowArticle.getID());
rowVals.put("ID_DEPOT_STOCK", selectedRowDepotDepart.getID());
try {
rowVals.commit();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
selectedRowArticle.fetchValues();
item = new StockItem(selectedRowArticle, rowStockDepart);
}
245,28 → 214,22
stockItems.add(item);
double diff = -qteReel.doubleValue();
item.updateQty(diff, TypeStockMouvement.REEL);
multipleRequestsHundred.add(getMvtRequest(dateValue, BigDecimal.ZERO, diff, item, getLabel(label.getText(), selectedRowDepotDepart, selectedRowDepotArrivee), true, usePrice));
 
multipleRequestsHundred
.add(getMvtRequest(dateValue, BigDecimal.ZERO, diff, item, getLabel(label.getText(), selectedRowDepotDepart, selectedRowDepotArrivee), true, usePrice));
item.updateQty(diff, TypeStockMouvement.THEORIQUE);
multipleRequestsHundred.add(getMvtRequest(dateValue, BigDecimal.ZERO, diff, item, getLabel(label.getText(), selectedRowDepotDepart, selectedRowDepotArrivee), false, usePrice));
 
multipleRequestsHundred
.add(getMvtRequest(dateValue, BigDecimal.ZERO, diff, item, getLabel(label.getText(), selectedRowDepotDepart, selectedRowDepotArrivee), false, usePrice));
multipleRequestsHundred.add(item.getUpdateRequest());
}
// ARRIVEE
{
final SQLRowAccessor rowStockArrivee = ProductComponent.findOrCreateStock(selectedRowArticle, selectedRowDepotArrivee);
 
StockItem item = new StockItem(selectedRowArticle, rowStockArrivee);
if (!item.isStockInit()) {
SQLRowValues rowVals = new SQLRowValues(mvtStockTable.getTable("STOCK"));
rowVals.put("ID_ARTICLE", selectedRowArticle.getID());
rowVals.put("ID_DEPOT_STOCK", selectedRowDepotArrivee.getID());
try {
rowVals.commit();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
selectedRowArticle.fetchValues();
item = new StockItem(selectedRowArticle, rowStockArrivee);
}
273,16 → 236,14
stockItems.add(item);
double diff = qteReel.doubleValue();
item.updateQty(diff, TypeStockMouvement.REEL);
multipleRequestsHundred.add(getMvtRequest(dateValue, BigDecimal.ZERO, diff, item, getLabel(label.getText(), selectedRowDepotDepart, selectedRowDepotArrivee), true, usePrice));
 
multipleRequestsHundred
.add(getMvtRequest(dateValue, BigDecimal.ZERO, diff, item, getLabel(label.getText(), selectedRowDepotDepart, selectedRowDepotArrivee), true, usePrice));
item.updateQty(diff, TypeStockMouvement.THEORIQUE);
multipleRequestsHundred.add(getMvtRequest(dateValue, BigDecimal.ZERO, diff, item, getLabel(label.getText(), selectedRowDepotDepart, selectedRowDepotArrivee), false, usePrice));
 
multipleRequestsHundred
.add(getMvtRequest(dateValue, BigDecimal.ZERO, diff, item, getLabel(label.getText(), selectedRowDepotDepart, selectedRowDepotArrivee), false, usePrice));
multipleRequestsHundred.add(item.getUpdateRequest());
}
 
try {
 
final int size = multipleRequestsHundred.size();
List<? extends ResultSetHandler> handlers = new ArrayList<ResultSetHandler>(size);
for (int i = 0; i < size; i++) {
290,28 → 251,18
}
SQLUtils.executeMultiple(instance.getRoot().getDBSystemRoot(), multipleRequestsHundred, handlers);
 
} catch (SQLException e1) {
ExceptionHandler.handle("Stock update error", e1);
}
 
final DBRoot root = mvtStockTable.getDBRoot();
if (root.contains("ARTICLE_ELEMENT")) {
// List<StockItem> stockItems = new ArrayList<StockItem>();
// for (SQLRowAccessor sqlRowAccessor2 : stocks) {
// final SQLRow asRow = sqlRowAccessor2.asRow();
// asRow.fetchValues();
// stockItems.add(new StockItem(asRow));
// }
// Mise à jour des stocks des nomenclatures
ComposedItemStockUpdater comp = new ComposedItemStockUpdater(root, stockItems);
try {
comp.update();
}
return null;
}
});
} catch (SQLException e1) {
e1.printStackTrace();
ExceptionHandler.handle("Stock update error", e1);
}
}
 
// liste.getModel().updateAll();
((JFrame) SwingUtilities.getRoot(TransfertStockPanel.this)).dispose();
}
});
318,14 → 269,12
}
 
private String getLabel(String label, SQLRowAccessor fromDepot, SQLRowAccessor toDepot) {
 
return label + " de " + fromDepot.getString("NOM") + " vers " + toDepot.getString("NOM");
 
}
 
private String getMvtRequest(Date time, BigDecimal prc, double qteFinal, StockItem item, String label, boolean reel, boolean usePrice) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String mvtStockQuery = "INSERT INTO " + mvtStockTableQuoted + " (\"QTE\",\"DATE\",\"ID_ARTICLE\",\"ID_STOCK\",\"NOM\",\"REEL\",\"ORDRE\"";
String mvtStockQuery = "INSERT INTO " + this.mvtStockTableQuoted + " (\"QTE\",\"DATE\",\"ID_ARTICLE\",\"ID_STOCK\",\"NOM\",\"REEL\",\"ORDRE\"";
 
if (usePrice && prc != null) {
mvtStockQuery += ",\"PRICE\"";
332,7 → 281,7
}
 
mvtStockQuery += ") VALUES(" + qteFinal + ",'" + dateFormat.format(time) + "'," + item.getArticle().getID() + "," + item.stock.getID() + ",'" + label + "'," + reel
+ ", (SELECT (MAX(\"ORDRE\")+1) FROM " + mvtStockTableQuoted + ")";
+ ", (SELECT (MAX(\"ORDRE\")+1) FROM " + this.mvtStockTableQuoted + ")";
if (usePrice && prc != null) {
mvtStockQuery += "," + prc.setScale(6, RoundingMode.HALF_UP).toString();
}
339,4 → 288,10
mvtStockQuery += ")";
return mvtStockQuery;
}
 
private void updateButtons(final JButton buttonUpdate, final SQLRequestComboBox comboArticle, final SQLRequestComboBox comboStockDepart, final SQLRequestComboBox comboStockArrive,
final NumericTextField fieldReel) {
buttonUpdate.setEnabled(fieldReel.getText().trim().length() > 0 && comboArticle.getSelectedRow() != null && comboStockArrive.getSelectedRow() != null
&& comboStockDepart.getSelectedRow() != null && comboStockArrive.getSelectedRow().getID() != comboStockDepart.getSelectedRow().getID());
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/ui/CustomerProductFamilyQtyPriceListTable.java
New file
0,0 → 1,120
/*
* 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.
*/
/*
* 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.sales.product.ui;
 
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.view.list.RowValuesTable;
import org.openconcerto.sql.view.list.RowValuesTableControlPanel;
import org.openconcerto.sql.view.list.RowValuesTableModel;
import org.openconcerto.sql.view.list.RowValuesTablePanel;
import org.openconcerto.sql.view.list.RowValuesTableRenderer;
import org.openconcerto.sql.view.list.SQLTableElement;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.table.PercentTableCellRenderer;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.math.BigDecimal;
import java.util.List;
import java.util.Vector;
 
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
 
public class CustomerProductFamilyQtyPriceListTable extends RowValuesTablePanel {
 
public CustomerProductFamilyQtyPriceListTable() {
 
init();
uiInit();
}
 
/**
*
*/
protected void init() {
 
final SQLElement e = getSQLElement();
 
final List<SQLTableElement> list = new Vector<SQLTableElement>();
 
final SQLTableElement tableElementFamille = new SQLTableElement(e.getTable().getField("ID_FAMILLE_ARTICLE"));
list.add(tableElementFamille);
 
// final SQLTableElement eQuantity = new SQLTableElement(e.getTable().getField("QUANTITE"))
// {
// @Override
// protected Object getDefaultNullValue() {
// return BigDecimal.ONE;
// }
// };
// list.add(eQuantity);
 
SQLTableElement eltPourcent = new SQLTableElement(e.getTable().getField("POURCENT_REMISE"));
list.add(eltPourcent);
 
this.model = new RowValuesTableModel(e, list, e.getTable().getField("ID_FAMILLE_ARTICLE"), false, this.defaultRowVals);
 
this.table = new RowValuesTable(this.model, null);
 
eltPourcent.setRenderer(new PercentTableCellRenderer());
 
}
 
public SQLElement getSQLElement() {
return Configuration.getInstance().getDirectory().getElement("TARIF_FAMILLE_ARTICLE_CLIENT");
}
 
public void insertFrom(String field, SQLRowValues row) {
this.table.insertFrom(field, row);
}
 
protected void uiInit() {
// Ui init
this.setLayout(new GridBagLayout());
this.setOpaque(false);
final GridBagConstraints c = new DefaultGridBagConstraints();
c.weightx = 1;
c.gridx = 0;
final JPanel control = new RowValuesTableControlPanel(this.table);
control.setOpaque(false);
this.add(control, c);
 
c.gridy++;
c.fill = GridBagConstraints.BOTH;
c.weighty = 1;
c.weightx = 1;
JScrollPane comp = new JScrollPane(this.table);
comp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
this.add(comp, c);
this.table.setDefaultRenderer(Long.class, new RowValuesTableRenderer());
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/model/ProductHelper.java
320,7 → 320,9
for (ProductComponent productParent : source) {
 
final SQLRowAccessor foreignArticle = childRowValues.getForeign("ID_ARTICLE");
ProductComponent childComponent = ProductComponent.createFromRowArticle(foreignArticle, productParent.getSource());
int childQ = childRowValues.getInt("QTE");
BigDecimal childqD = childRowValues.getBigDecimal("QTE_UNITAIRE");
ProductComponent childComponent = ProductComponent.createFromRowArticle(foreignArticle, childqD.multiply(new BigDecimal(childQ)), productParent.getSource());
 
// parentsArticleIDs.remove(foreignArticleParent.getID());
// Calcul de la quantité qte_unit * qte * qteMergedParent
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/model/ProductComponent.java
134,12 → 134,16
return null;
}
 
public static ProductComponent createFromRowArticle(SQLRowAccessor rowArticle, SQLRowAccessor rowValsSource) {
public static ProductComponent createFromRowArticle(SQLRowAccessor rowArticle, BigDecimal qty, SQLRowAccessor rowValsSource) {
SQLRowAccessor rowStock = getStock(rowArticle, rowArticle, rowValsSource);
 
return new ProductComponent(rowArticle, BigDecimal.ONE, rowValsSource, rowStock);
return new ProductComponent(rowArticle, qty, rowValsSource, rowStock);
}
 
public static ProductComponent createFromRowArticle(SQLRowAccessor rowArticle, SQLRowAccessor rowValsSource) {
return createFromRowArticle(rowArticle, BigDecimal.ONE, rowValsSource);
}
 
public static ProductComponent createFrom(SQLRowAccessor rowVals) {
return createFrom(rowVals, 1, rowVals);
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/component/ReferenceArticleSQLComponent.java
89,36 → 89,36
 
public class ReferenceArticleSQLComponent extends BaseSQLComponent {
 
private JTextField textPVHT, textPVTTC, textPAHT;
private JTextField textMetrique1VT, textMetrique1HA;
protected JTextField textPVHT, textPVTTC, textPAHT;
protected JTextField textMetrique1VT, textMetrique1HA;
 
private final JCheckBox boxService = new JCheckBox(getLabelFor("SERVICE"));
private final JCheckBox checkObs = new JCheckBox(getLabelFor("OBSOLETE"));
private JTextField textNom, textCode;
private JTextField textPoids;
private JTextField textValMetrique1, textValMetrique2, textValMetrique3;
private DocumentListener htDocListener, ttcDocListener, detailsListener;
private PropertyChangeListener propertyChangeListener;
private PropertyChangeListener taxeListener;
private final ElementComboBox comboSelTaxe = new ElementComboBox(false, 10);
private final ElementComboBox comboSelModeVente = new ElementComboBox(false, 25);
private JLabel labelMetriqueHA1 = new JLabel(getLabelFor("PRIX_METRIQUE_HA_1"), SwingConstants.RIGHT);
private JLabel labelMetriqueVT1 = new JLabel(getLabelFor("PRIX_METRIQUE_VT_1"), SwingConstants.RIGHT);
protected final JCheckBox boxService = new JCheckBox(getLabelFor("SERVICE"));
protected final JCheckBox checkObs = new JCheckBox(getLabelFor("OBSOLETE"));
protected JTextField textNom, textCode;
protected JTextField textPoids;
protected JTextField textValMetrique1, textValMetrique2, textValMetrique3;
protected DocumentListener htDocListener, ttcDocListener, detailsListener;
protected PropertyChangeListener propertyChangeListener;
protected PropertyChangeListener taxeListener;
protected final ElementComboBox comboSelTaxe = new ElementComboBox(false, 10);
protected final ElementComboBox comboSelModeVente = new ElementComboBox(false, 25);
protected JLabel labelMetriqueHA1 = new JLabel(getLabelFor("PRIX_METRIQUE_HA_1"), SwingConstants.RIGHT);
protected JLabel labelMetriqueVT1 = new JLabel(getLabelFor("PRIX_METRIQUE_VT_1"), SwingConstants.RIGHT);
 
private ArticleDesignationTable tableDes = new ArticleDesignationTable();
private ArticleCodeClientTable tableCodeClient = new ArticleCodeClientTable();
private ArticleTarifTable tableTarifVente = new ArticleTarifTable(this);
private ArticleCategorieComptableTable tableCatComptable = new ArticleCategorieComptableTable();
private SupplierPriceListTable tableFourSec = new SupplierPriceListTable();
protected ArticleDesignationTable tableDes = new ArticleDesignationTable();
protected ArticleCodeClientTable tableCodeClient = new ArticleCodeClientTable();
protected ArticleTarifTable tableTarifVente = new ArticleTarifTable(this);
protected ArticleCategorieComptableTable tableCatComptable = new ArticleCategorieComptableTable();
protected SupplierPriceListTable tableFourSec = new SupplierPriceListTable();
 
private ProductQtyPriceListTable tableTarifQteVente = new ProductQtyPriceListTable(this);
private ProductItemListTable tableBom;
private final JTextField textMarge = new JTextField(10);
private final JLabel labelMarge = new JLabel("% ");
private ElementComboBox boxCR;
private JCheckBox boxMargeWithCR;
protected ProductQtyPriceListTable tableTarifQteVente = new ProductQtyPriceListTable(this);
protected ProductItemListTable tableBom;
protected final JTextField textMarge = new JTextField(10);
protected final JLabel labelMarge = new JLabel("% ");
protected ElementComboBox boxCR;
protected JCheckBox boxMargeWithCR;
 
private DocumentListener pieceHAArticle = new SimpleDocumentListener() {
protected DocumentListener pieceHAArticle = new SimpleDocumentListener() {
 
@Override
public void update(DocumentEvent e) {
129,7 → 129,7
}
 
};
private DocumentListener pieceVTArticle = new SimpleDocumentListener() {
protected DocumentListener pieceVTArticle = new SimpleDocumentListener() {
 
@Override
public void update(DocumentEvent e) {
140,7 → 140,7
 
};
 
private DocumentListener listenerMargeTextMarge = new SimpleDocumentListener() {
protected DocumentListener listenerMargeTextMarge = new SimpleDocumentListener() {
@Override
public void update(DocumentEvent e) {
ReferenceArticleSQLComponent.this.textPVHT.getDocument().removeDocumentListener(ReferenceArticleSQLComponent.this.listenerMargeTextVT);
150,7 → 150,7
 
};
 
private DocumentListener listenerMargeTextVT = new SimpleDocumentListener() {
protected DocumentListener listenerMargeTextVT = new SimpleDocumentListener() {
@Override
public void update(DocumentEvent e) {
ReferenceArticleSQLComponent.this.textMarge.getDocument().removeDocumentListener(ReferenceArticleSQLComponent.this.listenerMargeTextMarge);
196,7 → 196,7
}
};
 
private DocumentListener listenerMargeTextHA = new SimpleDocumentListener() {
protected DocumentListener listenerMargeTextHA = new SimpleDocumentListener() {
@Override
public void update(DocumentEvent e) {
ReferenceArticleSQLComponent.this.textPVHT.getDocument().removeDocumentListener(ReferenceArticleSQLComponent.this.listenerMargeTextVT);
205,7 → 205,7
}
};
 
private void updateVtFromMarge() {
public void updateVtFromMarge() {
if (this.textPAHT.getText().trim().length() > 0) {
 
BigDecimal ha = StringUtils.getBigDecimalFromUserText(this.textPAHT.getText());
474,7 → 474,7
this.comboSelModeVente.setValue(ReferenceArticleSQLElement.A_LA_PIECE);
}
 
private Component createInfosPanel() {
protected Component createInfosPanel() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setOpaque(false);
GridBagConstraints c = new DefaultGridBagConstraints();
586,7 → 586,7
return panel;
}
 
private Component createDescriptifPanel() {
protected Component createDescriptifPanel() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setOpaque(false);
GridBagConstraints c = new DefaultGridBagConstraints();
666,7 → 666,7
return panel;
}
 
private Component createDesignationPanel() {
protected Component createDesignationPanel() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setOpaque(false);
GridBagConstraints c = new DefaultGridBagConstraints();
744,7 → 744,7
return panel;
}
 
private Component createCodeClientPanel() {
protected Component createCodeClientPanel() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setOpaque(false);
GridBagConstraints c = new DefaultGridBagConstraints();
760,7 → 760,7
return panel;
}
 
private Component createStockPanel() {
protected Component createStockPanel() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setOpaque(false);
GridBagConstraints c = new DefaultGridBagConstraints();
830,7 → 830,7
return panel;
}
 
private Component createComptaPanel() {
protected Component createComptaPanel() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setOpaque(false);
GridBagConstraints c = new DefaultGridBagConstraints();
872,10 → 872,10
return panel;
}
 
private SQLRowValues rowValuesDefaultCodeFournisseur;
private CodeFournisseurItemTable codeFournisseurTable;
protected SQLRowValues rowValuesDefaultCodeFournisseur;
protected CodeFournisseurItemTable codeFournisseurTable;
 
private Component createAchatPanel() {
protected Component createAchatPanel() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setOpaque(false);
GridBagConstraints c = new DefaultGridBagConstraints();
1003,7 → 1003,7
 
}
 
private JPanel createExportationPanel() {
protected JPanel createExportationPanel() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setOpaque(false);
GridBagConstraints c = new DefaultGridBagConstraints();
1043,7 → 1043,7
return panel;
}
 
private JPanel createTarifPanel() {
protected JPanel createTarifPanel() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setOpaque(false);
GridBagConstraints c = new DefaultGridBagConstraints();
1127,7 → 1127,7
return panel;
}
 
private JPanel createCategorieComptablePanel() {
protected JPanel createCategorieComptablePanel() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setOpaque(false);
GridBagConstraints c = new DefaultGridBagConstraints();
1204,7 → 1204,7
return panel;
}
 
private JPanel createBOMpanel() {
protected JPanel createBOMpanel() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setOpaque(false);
GridBagConstraints c = new DefaultGridBagConstraints();
1255,7 → 1255,7
 
}
 
private void updatePricesNomenclature(final JCheckBox checkAutoPrice, final JCheckBox checkAutoPriceHA) {
protected void updatePricesNomenclature(final JCheckBox checkAutoPrice, final JCheckBox checkAutoPriceHA) {
final Boolean vtAuto = checkAutoPrice.isSelected();
final Boolean haAuto = checkAutoPriceHA.isSelected();
if (vtAuto || haAuto) {
1271,7 → 1271,7
}
}
 
private JPanel createTarifQtePanel() {
protected JPanel createTarifQtePanel() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setOpaque(false);
GridBagConstraints c = new DefaultGridBagConstraints();
1563,7 → 1563,7
 
}
 
private void setListenerModeVenteActive(boolean b) {
protected void setListenerModeVenteActive(boolean b) {
if (b) {
this.comboSelModeVente.addValueListener(this.propertyChangeListener);
} else {
1575,7 → 1575,7
* @param c
* @param props
*/
private void addModeVenteAvance(GridBagConstraints c) {
protected void addModeVenteAvance(GridBagConstraints c) {
DefaultProps props = DefaultNXProps.getInstance();
JSeparator sep = new JSeparator();
JLabel labelDetails = new JLabel("Article détaillé", SwingConstants.RIGHT);
1769,7 → 1769,7
*
* @param id id du mode de vente
*/
private void selectModeVente(int id) {
protected void selectModeVente(int id) {
 
this.labelMetriqueHA1.setEnabled(true);
this.labelMetriqueVT1.setEnabled(true);
1850,7 → 1850,7
return rowVals;
}
 
private void setTextHT() {
protected void setTextHT() {
if (!isFilling()) {
this.textPVHT.getDocument().removeDocumentListener(this.htDocListener);
final BigDecimal ttc = StringUtils.getBigDecimalFromUserText(this.textPVTTC.getText());
1867,7 → 1867,7
}
}
 
private void setTextTTC() {
protected void setTextTTC() {
if (!isFilling()) {
this.textPVTTC.getDocument().removeDocumentListener(this.ttcDocListener);
final BigDecimal ht = StringUtils.getBigDecimalFromUserText(this.textPVHT.getText());
1887,7 → 1887,7
/**
* calcul du prix achat et vente ainsi que le poids total pour la piece
*/
private void updatePiece() {
protected void updatePiece() {
if (this.comboSelModeVente.getSelectedId() > 1 && this.comboSelModeVente.getSelectedId() != ReferenceArticleSQLElement.A_LA_PIECE) {
SQLRowValues rowVals = getDetailsRowValues();
float poidsTot = ReferenceArticleSQLElement.getPoidsFromDetails(rowVals);
1924,7 → 1924,7
return rowVals;
}
 
private void put(SQLRowValues rowVals, JTextField comp) {
protected void put(SQLRowValues rowVals, JTextField comp) {
Float f = (comp.getText() == null || comp.getText().trim().length() == 0) ? 0.0F : Float.valueOf(comp.getText());
rowVals.put(this.getView(comp).getField().getName(), f);
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/element/ReferenceArticleSQLElement.java
212,6 → 212,8
l.add("PV_HT");
l.add("ID_TAXE");
l.add("PV_TTC");
l.add("ID_COMPTE_PCE");
l.add("ID_COMPTE_PCE_ACHAT");
l.add("ID_FAMILLE_ARTICLE");
l.add("ID_FOURNISSEUR");
l.add("POIDS");
226,6 → 228,7
if (b != null && b.booleanValue()) {
l.add("SERVICE");
}
 
return l;
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/element/CustomerProductFamilyQtyPriceSQLElement.java
New file
0,0 → 1,55
/*
* 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.sales.product.element;
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.model.DBRoot;
 
import java.util.ArrayList;
import java.util.List;
 
public class CustomerProductFamilyQtyPriceSQLElement extends ComptaSQLConfElement {
public static final String ELEMENT_CODE = "sales.customer.product.family.qty.price";
 
public CustomerProductFamilyQtyPriceSQLElement() {
super("TARIF_FAMILLE_ARTICLE_CLIENT");
}
 
@Override
protected String createCode() {
return ELEMENT_CODE;
}
 
@Override
protected List<String> getListFields() {
final List<String> l = new ArrayList<>(2);
l.add("ID_FAMILLE_ARTICLE");
l.add("QUANTITE");
return l;
}
 
@Override
protected List<String> getComboFields() {
final List<String> l = new ArrayList<>(1);
l.add("QUANTITE");
return l;
}
 
@Override
public SQLComponent createComponent() {
return null;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/common/element/NumerotationAutoSQLElement.java
361,6 → 361,13
return getNextCodeLetrrage(s);
}
 
public final String getNextCodeLettragePartiel() {
SQLRow rowNum = this.getTable().getRow(2);
final String string = rowNum.getString("CODE_LETTRAGE_PARTIEL");
String s = (string == null) ? "" : string.trim().toLowerCase();
return getNextCodeLettragePartiel(s);
}
 
public static final String getNextCodeLetrrage(String code) {
code = code.trim();
if (code == null || code.length() == 0) {
394,7 → 401,41
 
}
 
public static final String getNextCodeLettragePartiel(String code) {
code = code.trim();
if (code == null || code.length() == 0) {
return "aaa";
} else {
char[] charArray = code.toCharArray();
char c = 'a';
int i = charArray.length - 1;
while (i >= 0 && (c = charArray[i]) == 'z') {
i--;
}
if (i >= 0) {
c++;
charArray[i] = c;
for (int j = i + 1; j < charArray.length; j++) {
charArray[j] = 'a';
}
code = String.valueOf(charArray);
} else {
// On ajoute une lettre
final StringBuffer buf = new StringBuffer(code.length() + 1);
final int nb = code.length() + 1;
for (int j = 0; j < nb; j++) {
buf.append('a');
}
code = buf.toString();
}
 
return code;
}
 
}
 
private static boolean isNumeroExist(SQLElement element, int num) {
 
if (num < 0) {
return true;
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/common/element/TitrePersonnelSQLElement.java
16,6 → 16,8
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.request.ComboSQLRequest;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
33,6 → 35,12
}
 
@Override
protected void _initComboRequest(ComboSQLRequest req) {
super._initComboRequest(req);
req.setWhere(new Where(getTable().getField("OBSOLETE"), "=", Boolean.FALSE));
}
@Override
public boolean isShared() {
return true;
}
42,6 → 50,7
l.add("CODE");
l.add("NOM");
l.add("SEXE_M");
l.add("OBSOLETE");
return l;
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/common/ui/TotalCalculator.java
572,7 → 572,9
if (compteArticle != null && !compteArticle.isUndefined()) {
cpt = compteArticle;
} else {
SQLRowAccessor familleArticle = article.getForeign("ID_FAMILLE_ARTICLE");
final SQLBackgroundTableCacheItem cacheForTableFamille = SQLBackgroundTableCache.getInstance().getCacheForTable(article.getTable().getForeignTable("ID_FAMILLE_ARTICLE"));
 
SQLRowAccessor familleArticle = cacheForTableFamille.getRowFromId(article.getForeignID("ID_FAMILLE_ARTICLE"));
Set<SQLRowAccessor> unique = new HashSet<SQLRowAccessor>();
while (familleArticle != null && !familleArticle.isUndefined() && !unique.contains(familleArticle)) {
 
584,7 → 586,7
break;
}
}
familleArticle = familleArticle.getForeign("ID_FAMILLE_ARTICLE_PERE");
familleArticle = cacheForTableFamille.getRowFromId(familleArticle.getForeignID("ID_FAMILLE_ARTICLE_PERE"));
}
}
} else {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/common/ui/AbstractAchatArticleItemTable.java
161,17 → 161,15
}
 
SQLTableElement tableElementArticle = new SQLTableElement(e.getTable().getField("ID_ARTICLE"), true, true, true) {
 
@Override
public boolean isCellEditable(SQLRowValues vals, int rowIndex, int columnIndex) {
boolean b = super.isCellEditable(vals, rowIndex, columnIndex);
if (vals.getTable().contains("ID_COMMANDE_ELEMENT")) {
boolean noCmdElt = vals.getObject("ID_COMMANDE_ELEMENT") == null || vals.isForeignEmpty("ID_COMMANDE_ELEMENT");
return b && noCmdElt;
} else {
return b;
 
return b && !isFromTranferred(vals);
 
}
 
}
};
list.add(tableElementArticle);
 
207,12 → 205,7
@Override
public boolean isCellEditable(SQLRowValues vals, int rowIndex, int columnIndex) {
boolean b = super.isCellEditable(vals, rowIndex, columnIndex);
if (vals.getTable().contains("ID_COMMANDE_ELEMENT")) {
boolean noCmdElt = vals.getObject("ID_COMMANDE_ELEMENT") == null || vals.isForeignEmpty("ID_COMMANDE_ELEMENT");
return b && noCmdElt;
} else {
return b;
}
return b && !isFromTranferred(vals);
 
}
};
222,12 → 215,7
@Override
public boolean isCellEditable(SQLRowValues vals, int rowIndex, int columnIndex) {
boolean b = super.isCellEditable(vals, rowIndex, columnIndex);
if (vals.getTable().contains("ID_COMMANDE_ELEMENT")) {
boolean noCmdElt = vals.getObject("ID_COMMANDE_ELEMENT") == null || vals.isForeignEmpty("ID_COMMANDE_ELEMENT");
return b && noCmdElt;
} else {
return b;
}
return b && !isFromTranferred(vals);
 
}
};
336,6 → 324,13
list.add(tableCmdElt);
}
 
if (e.getTable().contains("ID_BON_RECEPTION_ELEMENT")) {
SQLTableElement tableBrElt = null;
tableBrElt = new SQLTableElement(e.getTable().getField("ID_BON_RECEPTION_ELEMENT"));
tableBrElt.setEditable(false);
list.add(tableBrElt);
}
 
if (e.getTable().getFieldsName().contains("QTE_ORIGINE")) {
final SQLTableElement tableQteO = new SQLTableElement(e.getTable().getField("QTE_ORIGINE"));
tableQteO.setEditable(false);
511,7 → 506,7
this.defaultRowVals.put("ID_DEPOT_STOCK", depotDefault);
}
 
final RowValuesTableModel model = new RowValuesTableModel(e, list, e.getTable().getField("NOM"), false, this.defaultRowVals) {
final RowValuesTableModel model = new RowValuesTableModel(e, list, e.getTable().getField("QTE"), false, this.defaultRowVals) {
@Override
public void commitData() {
super.commitData(true);
529,7 → 524,14
this.table.getClearCloneTableElement().add("RECU_FORCED");
} else if (getSQLElement().getTable().getName().equals("BON_RECEPTION_ELEMENT")) {
this.table.getClearCloneTableElement().add("ID_COMMANDE_ELEMENT");
} else if (getSQLElement().getTable().getName().equals("FACTURE_FOURNISSEUR_ELEMENT")) {
if (getSQLElement().getTable().contains("ID_COMMANDE_ELEMENT")) {
this.table.getClearCloneTableElement().add("ID_COMMANDE_ELEMENT");
}
if (getSQLElement().getTable().contains("ID_BON_RECEPTION_ELEMENT")) {
this.table.getClearCloneTableElement().add("ID_BON_RECEPTION_ELEMENT");
}
}
 
table.addMouseListener(new MouseAdapter() {
@Override
886,6 → 888,10
setColumnVisible(model.getColumnForField("ID_COMMANDE_ELEMENT"), false);
}
 
if (e.getTable().contains("ID_BON_RECEPTION_ELEMENT")) {
setColumnVisible(model.getColumnForField("ID_BON_RECEPTION_ELEMENT"), false);
}
 
// Gestion des unités de vente
final boolean gestionUV = prefs.getBoolean(GestionArticleGlobalPreferencePanel.UNITE_VENTE, true);
setColumnVisible(model.getColumnForField("QTE_UNITAIRE"), gestionUV);
1425,4 → 1431,19
}
}
 
private final List<String> trFields = Arrays.asList("ID_COMMANDE_ELEMENT", "ID_BON_RECEPTION_ELEMENT");
 
private boolean isFromTranferred(SQLRowValues vals) {
 
for (String trField : this.trFields) {
if (vals.getTable().contains(trField)) {
boolean noCmdElt = vals.getObject(trField) == null || vals.isForeignEmpty(trField);
if (!noCmdElt) {
return true;
}
}
}
return false;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/common/ui/IListTotalPanel.java
41,6 → 41,8
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.event.EventListenerList;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
93,9 → 95,16
}
 
public IListTotalPanel(IListe l, final List<Tuple2<? extends SQLTableModelColumn, Type>> listField, final List<Tuple2<SQLField, ?>> filters, String title) {
this(l, listField, filters, null, title);
this(l, listField, filters, null, title, false);
}
 
public IListTotalPanel(IListe l, final List<Tuple2<? extends SQLTableModelColumn, Type>> listField, final List<Tuple2<SQLField, ?>> filters, final List<Tuple2<SQLField, ?>> filtersNot,
String title) {
this(l, listField, filters, filtersNot, title, false);
}
 
private final boolean onSelection;
 
/**
*
* @param l
103,11 → 112,11
* @param filters filtre ex : Tuple((SQLField)NATEXIER,(Boolean)FALSE)
*/
public IListTotalPanel(IListe l, final List<Tuple2<? extends SQLTableModelColumn, Type>> listField, final List<Tuple2<SQLField, ?>> filters, final List<Tuple2<SQLField, ?>> filtersNot,
String title) {
String title, boolean onSelection) {
super(new GridBagLayout());
this.list = l;
this.setOpaque(false);
 
this.onSelection = onSelection;
GridBagConstraints c = new DefaultGridBagConstraints();
c.gridx = GridBagConstraints.RELATIVE;
c.weightx = 0;
143,16 → 152,25
c.gridy++;
}
 
this.list.addListener(new TableModelListener() {
if (this.onSelection) {
this.list.getJTable().getSelectionModel().addListSelectionListener(new ListSelectionListener() {
 
private Object getValueAt(final ListSQLLine line, final SQLTableModelColumn col, final List<SQLTableModelColumn> columns) {
final int indexOf = columns.indexOf(col);
final Object res = line.getValueAt(indexOf);
if (res == null)
throw new IllegalStateException("Null value for " + col + " in " + line);
return res;
@Override
public void valueChanged(ListSelectionEvent e) {
 
final List<ListSQLLine> listLines = list.getSelectedLines();
for (Tuple2<? extends SQLTableModelColumn, Type> field : listField) {
if (field.get1() == Type.COUNT) {
map.get(field.get0()).setText(String.valueOf(listLines.size()));
}
}
computeValues(listField, filters, filtersNot, listLines);
}
});
} else {
 
this.list.addListener(new TableModelListener() {
 
@Override
public void tableChanged(TableModelEvent e) {
final TableModel model = (TableModel) e.getSource();
162,17 → 180,48
else
sqlModel = (ITableModel) ((TableSorter) model).getTableModel();
 
Map<SQLTableModelColumn, BigDecimal> mapTotal = new HashMap<SQLTableModelColumn, BigDecimal>();
Map<SQLTableModelColumn, Double> mapPourcent = new HashMap<SQLTableModelColumn, Double>();
Map<SQLTableModelColumn, Integer> mapPourcentSize = new HashMap<SQLTableModelColumn, Integer>();
final List<ListSQLLine> listLines = new ArrayList<>();
for (int i = 0; i < sqlModel.getRowCount(); i++) {
listLines.add(sqlModel.getRow(i));
}
for (Tuple2<? extends SQLTableModelColumn, Type> field : listField) {
if (field.get1() == Type.COUNT) {
map.get(field.get0()).setText(String.valueOf(model.getRowCount()));
}
}
computeValues(listField, filters, filtersNot, listLines);
}
 
for (int i = 0; i < model.getRowCount(); i++) {
final ListSQLLine line = sqlModel.getRow(i);
});
}
}
 
public void fireUpdated() {
for (PropertyChangeListener l : this.loadingListener.getListeners(PropertyChangeListener.class)) {
l.propertyChange(null);
}
}
 
public void addListener(PropertyChangeListener l) {
this.loadingListener.add(PropertyChangeListener.class, l);
}
 
private Object getValueAt(final ListSQLLine line, final SQLTableModelColumn col, final List<SQLTableModelColumn> columns) {
final int indexOf = columns.indexOf(col);
final Object res = line.getValueAt(indexOf);
if (res == null)
throw new IllegalStateException("Null value for " + col + " in " + line);
return res;
}
 
private void computeValues(final List<Tuple2<? extends SQLTableModelColumn, Type>> listField, final List<Tuple2<SQLField, ?>> filters, final List<Tuple2<SQLField, ?>> filtersNot,
final List<ListSQLLine> listLines) {
Map<SQLTableModelColumn, BigDecimal> mapTotal = new HashMap<SQLTableModelColumn, BigDecimal>();
Map<SQLTableModelColumn, Double> mapPourcent = new HashMap<SQLTableModelColumn, Double>();
Map<SQLTableModelColumn, Integer> mapPourcentSize = new HashMap<SQLTableModelColumn, Integer>();
 
for (ListSQLLine line : listLines) {
 
final SQLRowValues rowAt = line.getRow();
final List<SQLTableModelColumn> columns = line.getColumns().getColumns();
 
297,17 → 346,4
}
fireUpdated();
}
});
}
 
public void fireUpdated() {
for (PropertyChangeListener l : this.loadingListener.getListeners(PropertyChangeListener.class)) {
l.propertyChange(null);
}
}
 
public void addListener(PropertyChangeListener l) {
this.loadingListener.add(PropertyChangeListener.class, l);
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/common/ui/AbstractVenteArticleItemTable.java
36,6 → 36,8
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.FieldPath;
import org.openconcerto.sql.model.SQLBackgroundTableCache;
import org.openconcerto.sql.model.SQLBackgroundTableCacheItem;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
1738,6 → 1740,7
}
 
Collection<? extends SQLRowAccessor> cacheRemise = null;
Collection<? extends SQLRowAccessor> cacheRemiseFamille = null;
 
protected BigDecimal getTarifRemiseClient(SQLRowAccessor article, BigDecimal pv) {
if (cacheRemise != null) {
1756,19 → 1759,60
}
 
protected Acompte getRemiseClient(SQLRowAccessor article) {
Acompte remise = new Acompte(BigDecimal.ZERO, BigDecimal.ZERO);
Acompte remise = null;
if (this.cacheRemiseFamille != null) {
if (getRowClient() != null && !getRowClient().isUndefined() && article != null && !article.isUndefined()) {
if (article.getForeign("ID_FAMILLE_ARTICLE") != null && !article.isForeignEmpty("ID_FAMILLE_ARTICLE")) {
Integer fID = article.getForeignID("ID_FAMILLE_ARTICLE");
 
remise = getRemiseFamille(fID);
// TODO faire une fonction recursive avec un test pour eviter les boucles
if (remise == null) {
SQLBackgroundTableCacheItem cacheTableFamille = SQLBackgroundTableCache.getInstance().getCacheForTable(article.getTable().getForeignTable("ID_FAMILLE_ARTICLE"));
SQLRow rowFamille = cacheTableFamille.getRowFromId(fID);
if (rowFamille != null && rowFamille.getObject("ID_FAMILLE_ARTICLE_PERE") != null && !rowFamille.isForeignEmpty("ID_FAMILLE_ARTICLE_PERE")) {
Integer fIDPere = rowFamille.getForeignID("ID_FAMILLE_ARTICLE_PERE");
remise = getRemiseFamille(fIDPere);
if (remise == null) {
SQLRow rowFamille2 = cacheTableFamille.getRowFromId(fIDPere);
if (rowFamille2 != null && rowFamille2.getObject("ID_FAMILLE_ARTICLE_PERE") != null && !rowFamille2.isForeignEmpty("ID_FAMILLE_ARTICLE_PERE")) {
Integer fIDPere2 = rowFamille2.getForeignID("ID_FAMILLE_ARTICLE_PERE");
remise = getRemiseFamille(fIDPere2);
}
}
}
 
}
}
}
}
if (this.cacheRemise != null) {
if (getRowClient() != null && !getRowClient().isUndefined() && article != null && !article.isUndefined()) {
for (SQLRowAccessor sqlRowAccessor : this.cacheRemise) {
if (!sqlRowAccessor.isForeignEmpty("ID_ARTICLE") && sqlRowAccessor.getForeignID("ID_ARTICLE") == article.getID()) {
BigDecimal r = sqlRowAccessor.getBigDecimal("POURCENT_REMISE");
if (remise != null) {
remise = new Acompte(r, null);
break;
}
}
}
}
if (remise == null) {
return new Acompte(BigDecimal.ZERO, BigDecimal.ZERO);
} else {
return remise;
}
}
 
private Acompte getRemiseFamille(int fID) {
Acompte remise = null;
for (SQLRowAccessor sqlRowAccessor : this.cacheRemiseFamille) {
if (!sqlRowAccessor.isForeignEmpty("ID_FAMILLE_ARTICLE") && sqlRowAccessor.getForeignID("ID_FAMILLE_ARTICLE") == fID) {
BigDecimal r = sqlRowAccessor.getBigDecimal("POURCENT_REMISE");
remise = new Acompte(r, null);
break;
}
}
return remise;
}
 
1919,7 → 1963,8
super.setClient(rowClient, ask);
if (getRowClient() != null && !getRowClient().isUndefined()) {
this.cacheRemise = getRowClient().getReferentRows(getSQLElement().getTable().getTable("TARIF_ARTICLE_CLIENT"));
if (ask && this.cacheRemise.size() > 0 && getRowValuesTable().getRowCount() > 0
this.cacheRemiseFamille = getRowClient().getReferentRows(getSQLElement().getTable().getTable("TARIF_FAMILLE_ARTICLE_CLIENT"));
if (ask && (!this.cacheRemise.isEmpty() || !this.cacheRemiseFamille.isEmpty()) && getRowValuesTable().getRowCount() > 0
&& JOptionPane.showConfirmDialog(null, "Appliquer les remises associées au client sur les lignes déjà présentes?") == JOptionPane.YES_OPTION) {
int nbRows = this.table.getRowCount();
for (int i = 0; i < nbRows; i++) {
1943,6 → 1988,7
}
} else {
this.cacheRemise = null;
this.cacheRemiseFamille = null;
}
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/common/ui/TotalPanel.java
172,7 → 172,6
GridBagConstraints c = new DefaultGridBagConstraints();
 
c.gridheight = 1;
c.weighty = 0;
c.fill = GridBagConstraints.HORIZONTAL;
 
// Collone 1 : Selection
302,7 → 301,6
c.gridx = 3;
c.gridy = 0;
c.gridheight = GridBagConstraints.REMAINDER;
c.weighty = 1;
c.fill = GridBagConstraints.VERTICAL;
c.weightx = 0;
this.add(createSeparator(), c);
309,7 → 307,6
 
c.gridheight = 1;
c.fill = GridBagConstraints.HORIZONTAL;
c.weighty = 0;
c.gridx++;
this.add(new JLabelBold(TM.tr("TotalPanel.global")), c); //$NON-NLS-1$
c.gridy++;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/reports/stat/action/ReportingCommercialFournisseurAction.java
New file
0,0 → 1,43
/*
* 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.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.common.ui.PanelFrame;
import org.openconcerto.erp.core.customerrelationship.customer.report.ReportingCommercialFournisseurPanel;
import org.openconcerto.sql.model.DBRoot;
 
import javax.swing.Action;
import javax.swing.JFrame;
 
public class ReportingCommercialFournisseurAction extends CreateFrameAbstractAction {
 
private static final String TITLE = "CA par commercial/fournisseur";
 
private DBRoot root;
 
public ReportingCommercialFournisseurAction(ComptaPropsConfiguration conf) {
super();
this.root = conf.getRootSociete();
this.putValue(Action.NAME, TITLE);
this.mustLoadState = false;
}
 
public JFrame createFrame() {
final PanelFrame panelFrame = new PanelFrame(new ReportingCommercialFournisseurPanel(this.root), TITLE);
panelFrame.setResizable(false);
return panelFrame;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/reports/history/ui/HistoriqueClientFrame.java
56,6 → 56,7
mapList.put("Echéances", Arrays.asList("ECHEANCE_CLIENT"));
mapList.put("Relances", Arrays.asList("RELANCE"));
mapList.put("Devis", Arrays.asList("DEVIS"));
mapList.put("Commandes", Arrays.asList("COMMANDE_CLIENT"));
mapList.put("Avoirs", Arrays.asList("AVOIR_CLIENT"));
mapList.put("Articles facturés", Arrays.asList("SAISIE_VENTE_FACTURE_ELEMENT"));
mapList.put("Articles proposés", Arrays.asList("DEVIS_ELEMENT"));
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/stock/element/ComposedItemStockUpdater.java
21,6 → 21,8
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLSelectJoin;
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.request.UpdateBuilder;
import org.openconcerto.sql.utils.SQLUtils;
114,8 → 116,9
for (String s : requests) {
handlers.add(null);
}
// FIXME FIRE TABLE CHANGED TO UPDATE ILISTE ??
 
SQLUtils.executeMultiple(stockTable.getDBSystemRoot(), requests, handlers);
stockTable.fire(new SQLTableEvent(stockTable, SQLRow.NONEXISTANT_ID, Mode.ROW_UPDATED));
}
 
/**
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/stock/element/InventaireFromEtatStockImporter.java
385,7 → 385,7
} else {
boolean contains = false;
for (SQLRowValues sqlRowValues2 : referentRows) {
if (!sqlRowValues2.isForeignEmpty("ID_ARTICLE") && sqlRowValues2.getForeign("ID_ARTICLE") != null && sqlRowValues2.getForeign("ID_ARTICLE").getString("CODE") != null) {
if (sqlRowValues2.getForeign("ID_ARTICLE") != null && !sqlRowValues2.isForeignEmpty("ID_ARTICLE") && sqlRowValues2.getForeign("ID_ARTICLE").getString("CODE") != null) {
if (codeKits.contains(sqlRowValues2.getForeign("ID_ARTICLE").getString("CODE"))) {
contains = true;
break;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/stock/element/StockItem.java
96,13 → 96,13
 
}
StockItemComponent comp = components.get(0);
double real = comp.getItem().getRealQty() == 0 ? 0 : Math.ceil(comp.getItem().getRealQty() / (comp.getQty() * comp.getQtyUnit().doubleValue()));
double virtual = comp.getItem().getVirtualQty() == 0 ? 0 : Math.ceil(comp.getItem().getVirtualQty() / (comp.getQty() * comp.getQtyUnit().doubleValue()));
double real = comp.getItem().getRealQty() == 0 ? 0 : Math.floor(comp.getItem().getRealQty() / (comp.getQty() * comp.getQtyUnit().doubleValue()));
double virtual = comp.getItem().getVirtualQty() == 0 ? 0 : Math.floor(comp.getItem().getVirtualQty() / (comp.getQty() * comp.getQtyUnit().doubleValue()));
for (StockItemComponent stockItemComponent : components) {
real = Math.min(real, stockItemComponent.getItem().getRealQty() == 0 ? 0
: Math.ceil(stockItemComponent.getItem().getRealQty() / (stockItemComponent.getQty() * stockItemComponent.getQtyUnit().doubleValue())));
: Math.floor(stockItemComponent.getItem().getRealQty() / (stockItemComponent.getQty() * stockItemComponent.getQtyUnit().doubleValue())));
virtual = Math.min(virtual, stockItemComponent.getItem().getVirtualQty() == 0 ? 0
: Math.ceil(stockItemComponent.getItem().getVirtualQty() / (stockItemComponent.getQty() * stockItemComponent.getQtyUnit().doubleValue())));
: Math.floor(stockItemComponent.getItem().getVirtualQty() / (stockItemComponent.getQty() * stockItemComponent.getQtyUnit().doubleValue())));
 
}
// La quantité du kit ne peut être négative
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/supplier/action/NouvelHistoriqueListeFournAction.java
45,7 → 45,11
// l.add("SAISIE_ACHAT");
// l.add("CHEQUE_FOURNISSEUR");
Map<String, List<String>> mapList = new HashMap<String, List<String>>();
mapList.put("Commandes", Arrays.asList("COMMANDE"));
mapList.put("Bons de réception", Arrays.asList("BON_RECEPTION"));
mapList.put("Factures", Arrays.asList("FACTURE_FOURNISSEUR"));
mapList.put("Achats", Arrays.asList("SAISIE_ACHAT"));
mapList.put("Avoirs", Arrays.asList("AVOIR_FOURNISSEUR"));
mapList.put("Chèques émis", Arrays.asList("CHEQUE_FOURNISSEUR"));
 
final HistoriqueFournBilanPanel panelBilan = new HistoriqueFournBilanPanel();
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/supplier/component/FournisseurSQLComponent.java
378,7 → 378,7
 
// BIC
JLabel labelBIC = new JLabel("BIC", SwingConstants.RIGHT);
JTextField textBIC = new JTextField(12);
JTextField textBIC = new JTextField(20);
c2.gridx = 0;
c2.gridy++;
c2.weightx = 0;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/purchase/importer/FacturXExporter.java
13,16 → 13,25
package org.openconcerto.erp.core.supplychain.purchase.importer;
 
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.SQLTable;
import org.openconcerto.sql.model.Where;
 
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
 
import org.jdom2.Document;
import org.jdom2.Element;
34,18 → 43,27
* FacturX export (EN 16931 format)
*/
public class FacturXExporter {
 
private class Tax {
// Taux, ex pour 20% : 20.00
BigDecimal rate;
final BigDecimal rate;
// Montant de la TVA
BigDecimal amount;
BigDecimal amount = BigDecimal.ZERO;
 
// montant HT sur lequel s'applique la TVA
BigDecimal basisAmount;
BigDecimal basisAmount = BigDecimal.ZERO;
 
public Tax(BigDecimal rate) {
this.rate = rate;
}
 
public void add(BigDecimal taxAmount,
 
BigDecimal basisAmount) {
this.amount = this.amount.add(taxAmount);
this.basisAmount = this.basisAmount.add(basisAmount);
}
}
 
public static Namespace QDT_NS = Namespace.getNamespace("qdt", "urn:un:unece:uncefact:data:standard:QualifiedDataType:100");
public static Namespace RAM_NS = Namespace.getNamespace("ram", "urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100");
public static Namespace RSM_NS = Namespace.getNamespace("rsm", "urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100");
56,26 → 74,55
 
FacturXExporter ex = new FacturXExporter();
System.err.println("FacturXExporter.main() " + ex.checkEAN13("5987854125989"));
String xml = ex.createXMLFrom(null, 1);
System.out.println(xml);
// String xml = ex.createXMLFrom(null, 1);
// System.out.println(xml);
}
 
public String createXMLFrom(DBRoot row, int invoiceId) {
DecimalFormat formatAmount = new DecimalFormat("#0.00", DecimalFormatSymbols.getInstance(Locale.ENGLISH));
 
List<Tax> taxes = new ArrayList<>();
Tax t1 = new Tax();
t1.rate = new BigDecimal("20.0");
t1.amount = new BigDecimal("40.0");
t1.basisAmount = new BigDecimal("200.0");
taxes.add(t1);
private boolean useCommonClient = false;
 
DecimalFormat format = new DecimalFormat("#0.00", DecimalFormatSymbols.getInstance(Locale.ENGLISH));
public String createXMLFrom(DBRoot dbRoot, int invoiceId, SQLRow societeRow) {
 
SQLTable factureTable = dbRoot.getTable("SAISIE_VENTE_FACTURE");
SQLRowValues rowValsToFetch = new SQLRowValues(factureTable);
rowValsToFetch.putNulls("NUMERO", "DATE", "NOM", "T_TVA", "T_HT", "T_TTC", "NET_A_PAYER");
rowValsToFetch.putRowValues("ID_MODE_REGLEMENT").putNulls("COMPTANT", "AJOURS", "LENJOUR", "DATE_FACTURE", "FIN_MOIS").putRowValues("ID_TYPE_REGLEMENT").putNulls("NOM");
SQLRowValues putRowValuesClient = rowValsToFetch.putRowValues("ID_CLIENT");
putRowValuesClient.putNulls("NOM", "RESPONSABLE", "SIRET", "NUMERO_TVA", "MAIL", "TEL");
if (putRowValuesClient.getTable().contains("ID_CLIENT")) {
this.useCommonClient = true;
putRowValuesClient.putRowValues("ID_CLIENT").putNulls("NOM", "RESPONSABLE", "SIRET", "NUMERO_TVA", "MAIL", "TEL").putRowValues("ID_ADRESSE").putNulls("RUE", "VILLE", "CODE_POSTAL",
"PAYS");
}
putRowValuesClient.putRowValues("ID_ADRESSE").putNulls("RUE", "VILLE", "CODE_POSTAL", "PAYS");
putRowValuesClient.putRowValues("ID_ADRESSE_F").putNulls("RUE", "VILLE", "CODE_POSTAL", "PAYS");
rowValsToFetch.putRowValues("ID_ADRESSE").putNulls("RUE", "VILLE", "CODE_POSTAL", "PAYS");
 
SQLTable factureItemtable = dbRoot.getTable("SAISIE_VENTE_FACTURE_ELEMENT");
SQLRowValues rowValsItemsToFetch = new SQLRowValues(factureItemtable);
 
rowValsItemsToFetch.putNulls("NIVEAU", "CODE", "NOM", "QTE", "QTE_UNITAIRE", "PV_HT", "T_PV_HT", "T_PV_TTC").putRowValues("ID_TAXE").put("TAUX", null);
rowValsItemsToFetch.put("ID_SAISIE_VENTE_FACTURE", rowValsToFetch);
List<SQLRowValues> factures = SQLRowValuesListFetcher.create(rowValsToFetch).fetch(new Where(factureTable.getKey(), "=", invoiceId));
SQLRowValues facture = factures.get(0);
 
Collection<? extends SQLRowAccessor> factureItems = facture.getReferentRows(factureItemtable.getField("ID_SAISIE_VENTE_FACTURE"));
 
Map<Integer, Tax> taxes = new HashMap<>();
 
// Tax t1 = new Tax();
// t1.rate = new BigDecimal("20.0");
// t1.amount = new BigDecimal("40.0");
// t1.basisAmount = new BigDecimal("200.0");
// taxes.add(t1);
 
DecimalFormat fQty = new DecimalFormat("#0.########", DecimalFormatSymbols.getInstance(Locale.ENGLISH));
String invoiceNumber = "-";
Date invoiceDate = new Date();
String regNote = "SARL au capital de 50 000 EUR";
String legNote = "RCS MAVILLE 123 456 789";
int nbLines = 4;
String invoiceNumber = facture.getString("NUMERO");
Date invoiceDate = facture.getDate("DATE").getTime();
String regNote = societeRow.getString("TYPE") + " au capital de " + societeRow.getObject("CAPITAL") + " €";
String legNote = societeRow.getString("RCS");
int nbLines = factureItems.size();
 
final Document doc = new Document();
Element root = new Element("CrossIndustryInvoice", RSM_NS);
132,21 → 179,40
 
// SupplyChainTradeTransaction
Element eSupplyChainTradeTransaction = new Element("SupplyChainTradeTransaction", RSM_NS);
for (int i = 0; i < nbLines; i++) {
String productCode = "a";
String productName = "b";
int lineID = 1;
for (SQLRowAccessor rowItem : factureItems) {
String productCode = rowItem.getString("CODE");
String productName = rowItem.getString("NOM").trim().length() == 0 ? "Ligne" : rowItem.getString("NOM");
 
BigDecimal pHT = new BigDecimal("12.46");
BigDecimal tax = new BigDecimal("0.20");
BigDecimal pTTC = new BigDecimal("14.95");
BigDecimal qte = new BigDecimal("10.0");
BigDecimal totalHTLigne = new BigDecimal("124.60");
final BigDecimal pHT, pTTC, totalHTLigne, totalTTCLigne;
SQLRowAccessor taxeItem = rowItem.getForeign("ID_TAXE");
BigDecimal taxValue = new BigDecimal(taxeItem.getFloat("TAUX")).setScale(2);
if (rowItem.getInt("NIVEAU") != 1) {
pHT = BigDecimal.ZERO;
pTTC = BigDecimal.ZERO;
totalHTLigne = BigDecimal.ZERO;
totalTTCLigne = BigDecimal.ZERO;
} else {
pHT = rowItem.getBigDecimal("PV_HT");
pTTC = pHT.multiply(taxValue.add(BigDecimal.ONE));
totalHTLigne = rowItem.getBigDecimal("T_PV_HT");
totalTTCLigne = rowItem.getBigDecimal("T_PV_TTC");
}
 
int idTaxe = taxeItem.getID();
if (!taxes.containsKey(idTaxe)) {
Tax t = new Tax(taxValue);
taxes.put(idTaxe, t);
}
taxes.get(idTaxe).add(totalTTCLigne.subtract(totalHTLigne), totalHTLigne);
BigDecimal qte = new BigDecimal(rowItem.getInt("QTE")).multiply(rowItem.getBigDecimal("QTE_UNITAIRE"));
 
Element eLineItem = new Element("IncludedSupplyChainTradeLineItem", RAM_NS);
 
// AssociatedDocumentLineDocument
Element eAssociatedDocumentLineDocument = new Element("AssociatedDocumentLineDocument", RAM_NS);
Element eLineID = new Element("LineID", RAM_NS);
eLineID.setText(String.valueOf(i + 1));
eLineID.setText(String.valueOf(lineID++));
eAssociatedDocumentLineDocument.addContent(eLineID);
eLineItem.addContent(eAssociatedDocumentLineDocument);
// SpecifiedTradeProduct
176,11 → 242,11
// Prix unitaire TTC
Element eGrossPriceProductTradePrice = new Element("GrossPriceProductTradePrice", RAM_NS);
Element eChargeAmount = new Element("ChargeAmount", RAM_NS);
eChargeAmount.setText(format.format(pTTC));
eChargeAmount.setText(formatAmount.format(pTTC));
eGrossPriceProductTradePrice.addContent(eChargeAmount);
Element eAppliedTradeAllowanceCharge = new Element("AppliedTradeAllowanceCharge", RAM_NS);
Element eChargeIndicator = new Element("ChargeIndicator", RAM_NS);
Element eIndicator = new Element("ChargeIndicator", UDT_NS);
Element eIndicator = new Element("Indicator", UDT_NS);
// pas de remise
eIndicator.setText("false");
eChargeIndicator.addContent(eIndicator);
188,17 → 254,17
 
Element eActualAmount = new Element("ActualAmount", RAM_NS);
// Montant de TVA (unitaire)
eActualAmount.setText(format.format(pTTC.subtract(pHT)));
eActualAmount.setText(formatAmount.format(pTTC.subtract(pHT)));
 
eAppliedTradeAllowanceCharge.addContent(eActualAmount);
 
eGrossPriceProductTradePrice.addContent(eAppliedTradeAllowanceCharge);
// eGrossPriceProductTradePrice.addContent(eAppliedTradeAllowanceCharge);
 
eSpecifiedLineTradeAgreement.addContent(eGrossPriceProductTradePrice);
// Prix unitaire HT
Element eNetPriceProductTradePrice = new Element("NetPriceProductTradePrice", RAM_NS);
Element eChargeAmountHT = new Element("ChargeAmount", RAM_NS);
eChargeAmountHT.setText(format.format(pHT));
eChargeAmountHT.setText(formatAmount.format(pHT));
 
eNetPriceProductTradePrice.addContent(eChargeAmountHT);
eSpecifiedLineTradeAgreement.addContent(eNetPriceProductTradePrice);
240,7 → 306,7
 
Element eRateApplicablePercent = new Element("RateApplicablePercent", RAM_NS);
// 20% -> 20.0
eRateApplicablePercent.setText(format.format(tax.multiply(new BigDecimal(100))));
eRateApplicablePercent.setText(formatAmount.format(taxValue));
eApplicableTradeTaxt.addContent(eRateApplicablePercent);
 
eSpecifiedLineTradeSettlement.addContent(eApplicableTradeTaxt);
248,7 → 314,7
Element eSpecifiedTradeSettlementLineMonetarySummation = new Element("SpecifiedTradeSettlementLineMonetarySummation", RAM_NS);
// Total HT
Element eLineTotalAmount = new Element("LineTotalAmount", RAM_NS);
eLineTotalAmount.setText(format.format(totalHTLigne));
eLineTotalAmount.setText(formatAmount.format(totalHTLigne));
eSpecifiedTradeSettlementLineMonetarySummation.addContent(eLineTotalAmount);
eSpecifiedLineTradeSettlement.addContent(eSpecifiedTradeSettlementLineMonetarySummation);
 
257,12 → 323,11
eSupplyChainTradeTransaction.addContent(eLineItem);
}
 
addApplicableHeader(eSupplyChainTradeTransaction, taxes);
root.addContent(ed);
addApplicableHeader(societeRow, facture, eSupplyChainTradeTransaction, taxes.values());
 
ed.addContent(eSupplyChainTradeTransaction);
root.addContent(eSupplyChainTradeTransaction);
 
root.addContent(ed);
 
final XMLOutputter xmlOutput = new XMLOutputter();
xmlOutput.setFormat(Format.getPrettyFormat());
return xmlOutput.outputString(doc);
273,22 → 338,25
parent.addContent(element);
}
 
private void addApplicableHeader(Element eSupplyChainTradeTransaction, List<Tax> taxes) {
private void addApplicableHeader(SQLRowAccessor rowSociete, SQLRowAccessor rowFacture, Element eSupplyChainTradeTransaction, Collection<Tax> taxes) {
//
// ApplicableHeaderTradeAgreement
//
final Element eApplicableHeaderTradeAgreement = new Element("ApplicableHeaderTradeAgreement", RAM_NS);
addSupplierInfo(eApplicableHeaderTradeAgreement);
addBuyerInfo(eApplicableHeaderTradeAgreement);
addSupplierInfo(eApplicableHeaderTradeAgreement, rowSociete);
addBuyerInfo(eApplicableHeaderTradeAgreement, rowFacture);
 
String orderRef = "";
String contractRef = "";
// Date de livraison, facultative
Date effectiveDeliveryDate = new Date(65454654);
String invoiceNumber = "FA-2017-0010";
Date effectiveDeliveryDate = rowFacture.getDate("DATE").getTime();
String invoiceNumber = rowFacture.getString("NUMERO");
String currencyCode = "EUR";
String dueDescription = "30% d'acompte, solde à 30 j";
Date dueDate = new Date(65455654);
SQLRowAccessor foreignMdr = rowFacture.getForeign("ID_MODE_REGLEMENT");
int ajours = foreignMdr.getInt("AJOURS");
int lenjour = foreignMdr.getInt("LENJOUR");
String dueDescription = (ajours > 0 ? "A " + ajours : "") + (lenjour > 0 ? " le " + lenjour : "");
Date dueDate = ModeDeReglementSQLElement.calculDate(foreignMdr, rowFacture.getDate("DATE").getTime());
 
final Element eBuyerOrderReferencedDocument = new Element("BuyerOrderReferencedDocument", RAM_NS);
addValue(eBuyerOrderReferencedDocument, new Element("IssuerAssignedID", RAM_NS), orderRef);
330,6 → 398,7
addValue(eApplicableHeaderTradeSettlement, new Element("PaymentReference", RAM_NS), invoiceNumber);
addValue(eApplicableHeaderTradeSettlement, new Element("InvoiceCurrencyCode", RAM_NS), currencyCode);
final Element aSpecifiedTradeSettlementPaymentMeans = new Element("SpecifiedTradeSettlementPaymentMeans", RAM_NS);
addValue(aSpecifiedTradeSettlementPaymentMeans, new Element("TypeCode", RAM_NS), "57");
 
// <ram:TypeCode>30</ram:TypeCode>
// <ram:Information>Virement sur compte Banque Fiducial</ram:Information>
380,7 → 449,38
eApplicableHeaderTradeSettlement.addContent(eSpecifiedTradePaymentTerms);
 
final Element eSpecifiedTradeSettlementHeaderMonetarySummation = new Element("SpecifiedTradeSettlementHeaderMonetarySummation", RAM_NS);
final Element eTotalHT = new Element("LineTotalAmount", RAM_NS);
eTotalHT.setText(this.formatAmount.format(new BigDecimal(rowFacture.getLong("T_HT")).movePointLeft(2)));
eSpecifiedTradeSettlementHeaderMonetarySummation.addContent(eTotalHT);
 
final Element eTotalBaseTVA = new Element("TaxBasisTotalAmount", RAM_NS);
 
BigDecimal totalBaseTVA = BigDecimal.ZERO;
for (Tax tax : taxes) {
totalBaseTVA = totalBaseTVA.add(tax.basisAmount);
}
eTotalBaseTVA.setText(this.formatAmount.format(totalBaseTVA));
eSpecifiedTradeSettlementHeaderMonetarySummation.addContent(eTotalBaseTVA);
 
final Element eTotalTVA = new Element("TaxTotalAmount", RAM_NS);
eTotalTVA.setAttribute("currencyID", "EUR");
eTotalTVA.setText(this.formatAmount.format(new BigDecimal(rowFacture.getLong("T_TVA")).movePointLeft(2)));
eSpecifiedTradeSettlementHeaderMonetarySummation.addContent(eTotalTVA);
 
final Element eTotalTTC = new Element("GrandTotalAmount", RAM_NS);
BigDecimal totalTTC = new BigDecimal(rowFacture.getLong("T_TTC")).movePointLeft(2);
eTotalTTC.setText(this.formatAmount.format(totalTTC));
eSpecifiedTradeSettlementHeaderMonetarySummation.addContent(eTotalTTC);
 
final Element eTotalPrepaid = new Element("TotalPrepaidAmount", RAM_NS);
BigDecimal netApayer = new BigDecimal(rowFacture.getLong("NET_A_PAYER")).movePointLeft(2);
eTotalPrepaid.setText(this.formatAmount.format(totalTTC.subtract(netApayer)));
eSpecifiedTradeSettlementHeaderMonetarySummation.addContent(eTotalPrepaid);
 
final Element eTotalDue = new Element("DuePayableAmount", RAM_NS);
eTotalDue.setText(this.formatAmount.format(netApayer));
eSpecifiedTradeSettlementHeaderMonetarySummation.addContent(eTotalDue);
 
// Total HT
// <ram:LineTotalAmount>624.90</ram:LineTotalAmount>
// Total HT sur leque est appliqué la TVA
400,20 → 500,35
 
}
 
private void addBuyerInfo(final Element eApplicableHeaderTradeAgreement) {
private void addBuyerInfo(final Element eApplicableHeaderTradeAgreement, final SQLRowAccessor rowFacture) {
 
SQLRowAccessor client = rowFacture.getForeign("ID_CLIENT");
SQLRowAccessor clientGestion = client;
if (this.useCommonClient) {
client = client.getForeign("ID_CLIENT");
}
final SQLRowAccessor adr;
if (!rowFacture.isForeignEmpty("ID_ADRESSE")) {
adr = rowFacture.getForeign("ID_ADRESSE");
} else if (!clientGestion.isForeignEmpty("ID_ADRESSE_F")) {
adr = clientGestion.getForeign("ID_ADRESSE_F");
} else {
adr = client.getForeign("ID_ADRESSE");
}
 
// Acheteur
String buyerName = "Ma jolie boutique";
String buyerSIRET = "78787878400035";
String buyerVAT = "FR19787878784";
String buyerContactName = "Alexandre Payet";
String buyerPhone = "+33 4 72 07 08 67";
String buyerEmail = "alexandre.payet@majolieboutique.net";
String buyerAddrL1 = "35 rue de la République";
String buyerName = client.getString("NOM");
String buyerSIRET = client.getString("SIRET");
String buyerVAT = client.getString("NUMERO_TVA");
String buyerContactName = client.getString("RESPONSABLE");
String buyerPhone = client.getString("TEL");
String buyerEmail = client.getString("MAIL");
String buyerAddrL1 = adr.getString("RUE");
String buyerAddrL2 = "";
String buyerAddrL3 = "";
String buyerPostalCode = "69001";
String buyerCity = "Lyon";
String buyerCountryCode = "FR";
String buyerPostalCode = adr.getString("CODE_POSTAL");
String buyerCity = adr.getString("VILLE");
String buyerCountryCode = resolveCountryCode(adr.getString("PAYS"));
 
final Element eBuyerTradeParty = new Element("BuyerTradeParty", RAM_NS);
this.addValue(eBuyerTradeParty, new Element("Name", RAM_NS), buyerName);
439,19 → 554,20
eBuyerTradeParty.addContent(eDefinedTradeContact);
// Adresse postale
final Element ePostalTradeAddress = new Element("PostalTradeAddress", RAM_NS);
addValue(ePostalTradeAddress, new Element("LineOne>", RAM_NS), buyerAddrL1);
addValue(ePostalTradeAddress, new Element("PostcodeCode", RAM_NS), buyerPostalCode);
addValue(ePostalTradeAddress, new Element("LineOne", RAM_NS), buyerAddrL1);
if (buyerAddrL2 != null && !buyerAddrL2.trim().isEmpty()) {
addValue(ePostalTradeAddress, new Element("LineTwo>", RAM_NS), buyerAddrL2);
addValue(ePostalTradeAddress, new Element("LineTwo", RAM_NS), buyerAddrL2);
}
if (buyerAddrL3 != null && !buyerAddrL3.trim().isEmpty()) {
addValue(ePostalTradeAddress, new Element("LineThree>", RAM_NS), buyerAddrL3);
addValue(ePostalTradeAddress, new Element("LineThree", RAM_NS), buyerAddrL3);
}
addValue(ePostalTradeAddress, new Element("PostcodeCode>", RAM_NS), buyerPostalCode);
addValue(ePostalTradeAddress, new Element("CityName>", RAM_NS), buyerCity);
addValue(ePostalTradeAddress, new Element("CountryID>", RAM_NS), buyerCountryCode);
addValue(ePostalTradeAddress, new Element("CityName", RAM_NS), buyerCity);
addValue(ePostalTradeAddress, new Element("CountryID", RAM_NS), buyerCountryCode);
 
eBuyerTradeParty.addContent(ePostalTradeAddress);
 
if (buyerVAT != null && buyerVAT.trim().length() > 0) {
// TVA
final Element eSpecifiedTaxRegistration = new Element("SpecifiedTaxRegistration", RAM_NS);
final Element eSpecifiedTaxRegistrationId = new Element("ID", RAM_NS);
459,23 → 575,24
eSpecifiedTaxRegistrationId.setText(buyerVAT);
eSpecifiedTaxRegistration.addContent(eSpecifiedTaxRegistrationId);
eBuyerTradeParty.addContent(eSpecifiedTaxRegistration);
 
}
eApplicableHeaderTradeAgreement.addContent(eBuyerTradeParty);
}
 
private void addSupplierInfo(final Element eApplicableHeaderTradeAgreement) {
String supplierName = "Au bon moulin";
String supplierSIRET = "121321321321";
String supplierContactName = "Tony Dubois";
String supplierContactPhone = "+33 4 72 07 08 56";
String supplierContactEmail = "tony.dubois@aubonmoulin.fr";
String supplierAddrL1 = "3 rue du pont";
private void addSupplierInfo(final Element eApplicableHeaderTradeAgreement, SQLRowAccessor rowSociete) {
String supplierName = rowSociete.getString("NOM");
String supplierSIRET = rowSociete.getString("NUM_SIRET");
String supplierContactName = "";
String supplierContactPhone = rowSociete.getString("NUM_TEL");
String supplierContactEmail = rowSociete.getString("MAIL");
SQLRowAccessor adr = rowSociete.getForeign("ID_ADRESSE_COMMON");
String supplierAddrL1 = adr.getString("RUE");
String supplierAddrL2 = "";
String supplierAddrL3 = "";
String supplierAddrPostalCode = "80100";
String supplierAddrCityName = "Abbeville";
String supplierAddrCountryID = "FR";
String supplierNumTVA = "FR121321321321";
String supplierAddrPostalCode = adr.getString("CODE_POSTAL");
String supplierAddrCityName = adr.getString("VILLE");
String supplierAddrCountryID = resolveCountryCode(adr.getString("PAYS"));
String supplierNumTVA = rowSociete.getString("NUM_NII");
// Vendeur
final Element eSellerTradeParty = new Element("SellerTradeParty", RAM_NS);
addValue(eSellerTradeParty, new Element("Name", RAM_NS), supplierName);
507,6 → 624,7
eSellerTradeParty.addContent(eDefinedTradeContact);
 
final Element ePostalTradeAddress = new Element("PostalTradeAddress", RAM_NS);
addValue(ePostalTradeAddress, new Element("PostcodeCode", RAM_NS), supplierAddrPostalCode);
addValue(ePostalTradeAddress, new Element("LineOne", RAM_NS), supplierAddrL1);
if (supplierAddrL2 != null && !supplierAddrL2.trim().isEmpty()) {
addValue(ePostalTradeAddress, new Element("LineTwo", RAM_NS), supplierAddrL2);
514,7 → 632,6
if (supplierAddrL3 != null && !supplierAddrL3.trim().isEmpty()) {
addValue(ePostalTradeAddress, new Element("LineThree", RAM_NS), supplierAddrL3);
}
addValue(ePostalTradeAddress, new Element("PostcodeCode", RAM_NS), supplierAddrPostalCode);
addValue(ePostalTradeAddress, new Element("CityName", RAM_NS), supplierAddrCityName);
addValue(ePostalTradeAddress, new Element("CountryID", RAM_NS), supplierAddrCountryID);
 
568,4 → 685,56
}
return Integer.valueOf(code.substring(12, 13)).intValue() == checkdigit;
}
 
private String resolveCountryCode(String pays) {
if (pays == null || pays.trim().length() == 0) {
return "FR";
} else if (pays.toLowerCase().equals("france")) {
return "FR";
} else if (pays.toLowerCase().equals("fr")) {
return "FR";
} else if (pays.toLowerCase().equals("polska")) {
return "PL";
} else if (pays.toLowerCase().equals("pologne")) {
return "PL";
} else if (pays.toLowerCase().equals("pl")) {
return "PL";
} else if (pays.toLowerCase().equals("allemagne")) {
return "DE";
} else if (pays.toLowerCase().equals("de")) {
return "DE";
} else if (pays.toLowerCase().equals("deutschland")) {
return "DE";
} else if (pays.toLowerCase().equals("italie")) {
return "IT";
} else if (pays.toLowerCase().equals("italy")) {
return "IT";
} else if (pays.toLowerCase().equals("italia")) {
return "IT";
} else if (pays.toLowerCase().equals("it")) {
return "IT";
} else if (pays.toLowerCase().equals("espagne")) {
return "SP";
} else if (pays.toLowerCase().equals("spain")) {
return "SP";
} else if (pays.toLowerCase().equals("sp")) {
return "SP";
} else if (pays.toLowerCase().equals("luxembourg")) {
return "LU";
} else if (pays.toLowerCase().equals("lu")) {
return "LU";
} else if (pays.toLowerCase().equals("portugal")) {
return "PT";
} else if (pays.toLowerCase().equals("pt")) {
return "PT";
} else if (pays.toLowerCase().equals("belgique")) {
return "BE";
} else if (pays.toLowerCase().equals("belgium")) {
return "BE";
} else if (pays.toLowerCase().equals("be")) {
return "BE";
} else {
return "";
}
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/component/FactureFournisseurSQLComponent.java
16,6 → 16,7
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.common.component.TransfertBaseSQLComponent;
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.common.element.NumerotationAutoSQLElement;
import org.openconcerto.erp.core.common.ui.AbstractVenteArticleItemTable;
import org.openconcerto.erp.core.common.ui.DeviseField;
import org.openconcerto.erp.core.common.ui.TotalPanel;
29,7 → 30,6
import org.openconcerto.erp.panel.PanelOOSQLComponent;
import org.openconcerto.erp.preferences.DefaultNXProps;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.DefaultElementSQLObject;
import org.openconcerto.sql.element.ElementSQLObject;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLBackgroundTableCache;
41,16 → 41,19
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.sql.request.ComboSQLRequest;
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.sql.sqlobject.JUniqueTextField;
import org.openconcerto.sql.sqlobject.SQLRequestComboBox;
import org.openconcerto.sql.users.UserManager;
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;
import org.openconcerto.ui.JDate;
import org.openconcerto.ui.TitledSeparator;
import org.openconcerto.ui.component.ITextArea;
import org.openconcerto.ui.preferences.DefaultProps;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.checks.ValidState;
import org.openconcerto.utils.text.SimpleDocumentListener;
 
import java.awt.Color;
60,6 → 63,8
import java.beans.PropertyChangeListener;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
68,6 → 73,7
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
83,7 → 89,8
private ElementComboBox fourn = new ElementComboBox();
private ElementComboBox comptePCE = new ElementComboBox();
private ElementComboBox avoirFourn = new ElementComboBox();
private DefaultElementSQLObject compAdr;
private ElementComboBox avoirFourn2 = new ElementComboBox();
 
private PanelOOSQLComponent panelOO;
final JPanel panelAdrSpec = new JPanel(new GridBagLayout());
private JDate dateCommande = new JDate();
97,15 → 104,9
 
public void propertyChange(PropertyChangeEvent evt) {
 
SQLRow rowFourn = fourn.getRequest().getPrimaryTable().getRow(fourn.getWantedID());
final SQLRow rowFourn = FactureFournisseurSQLComponent.this.fourn.getRequest().getPrimaryTable().getRow(FactureFournisseurSQLComponent.this.fourn.getWantedID());
if ((getMode() == Mode.INSERTION || !isFilling()) && rowFourn != null && !rowFourn.isUndefined()) {
 
if (!isFilling() && rowFourn != null && !rowFourn.isUndefined()) {
 
// SQLRow rowCharge = rowFourn.getForeign("ID_COMPTE_PCE_CHARGE");
// if (rowCharge != null && !rowCharge.isUndefined()) {
// compteSel.setValue(rowCharge);
// }
 
int idModeRegl = rowFourn.getInt("ID_MODE_REGLEMENT");
if (idModeRegl > 1 && FactureFournisseurSQLComponent.this.eltModeRegl != null && getMode() == Mode.INSERTION) {
SQLElement sqlEltModeRegl = getElement().getDirectory().getElement("MODE_REGLEMENT");
113,9 → 114,8
SQLRowValues rowVals = rowModeRegl.createUpdateRow();
rowVals.clearPrimaryKeys();
FactureFournisseurSQLComponent.this.eltModeRegl.setValue(rowVals);
System.err.println("Select Mode regl " + idModeRegl);
}
// }
 
}
 
}
139,21 → 139,79
return s;
}
 
@Override
public synchronized ValidState getValidState() {
if (getTable().contains("ID_COMPTE_PCE") && getTable().contains("ID_TYPE_CMD") && getTable().getTable("FACTURE_FOURNISSEUR_ELEMENT").contains("ID_COMPTE_PCE")) {
SQLRequestComboBox boxCpt = (SQLRequestComboBox) getView("ID_COMPTE_PCE").getComp();
final SQLRow selectedCpt = boxCpt.getSelectedRow();
if (selectedCpt == null || selectedCpt.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_COMPTE_PCE") == null || rowVals.isForeignEmpty("ID_COMPTE_PCE"))) {
return ValidState.create(false, "Aucun compte global sélectionné et une ligne avec une quantité > 0 n'est pas affectée à un compte!");
}
}
}
 
}
return super.getValidState();
}
 
private JUniqueTextField numero;
 
public void addViews() {
this.setLayout(new GridBagLayout());
final GridBagConstraints c = new DefaultGridBagConstraints();
 
if (getTable().getTable("NUMEROTATION_AUTO").contains("FACTURE_FOURNISSEUR_START")) {
this.numero = new JUniqueTextField(35) {
@Override
public String getAutoRefreshNumber() {
if (getMode() == Mode.INSERTION) {
final Date date = FactureFournisseurSQLComponent.this.dateCommande.getDate();
return NumerotationAutoSQLElement.getNextNumero(getElement().getClass(), date == null ? new Date() : date);
} else {
return null;
}
}
};
this.dateCommande.addValueListener(new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (!isFilling() && FactureFournisseurSQLComponent.this.dateCommande.getValue() != null) {
 
final String nextNumero = NumerotationAutoSQLElement.getNextNumero(getElement().getClass(), FactureFournisseurSQLComponent.this.dateCommande.getValue());
 
if (FactureFournisseurSQLComponent.this.numero.getText().trim().length() > 0 && !nextNumero.equalsIgnoreCase(FactureFournisseurSQLComponent.this.numero.getText())) {
 
int answer = JOptionPane.showConfirmDialog(FactureFournisseurSQLComponent.this, "Voulez vous actualiser le numéro de la facture?", "Changement du numéro de facture",
JOptionPane.YES_NO_OPTION);
if (answer == JOptionPane.NO_OPTION) {
return;
}
}
 
FactureFournisseurSQLComponent.this.numero.setText(nextNumero);
 
}
}
});
} else {
this.numero = new JUniqueTextField(35);
}
// Numero du commande
c.gridx = 0;
c.weightx = 0;
this.add(new JLabel(getLabelFor("NUMERO"), SwingConstants.RIGHT), c);
 
JTextField numero = new JTextField(25);
c.gridx++;
c.weightx = 1;
c.fill = GridBagConstraints.NONE;
DefaultGridBagConstraints.lockMinimumSize(numero);
this.add(numero, c);
DefaultGridBagConstraints.lockMinimumSize(this.numero);
this.add(this.numero, c);
 
// Date
JLabel labelDate = new JLabel(getLabelFor("DATE"));
165,14 → 223,14
 
c.gridx++;
c.fill = GridBagConstraints.NONE;
this.add(dateCommande, c);
this.add(this.dateCommande, c);
 
this.dateCommande.addValueListener(new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (!isFilling() && dateCommande.getValue() != null) {
table.setDateDevise(dateCommande.getValue());
if (!isFilling() && FactureFournisseurSQLComponent.this.dateCommande.getValue() != null) {
FactureFournisseurSQLComponent.this.table.setDateDevise(FactureFournisseurSQLComponent.this.dateCommande.getValue());
updateLabelTauxConversion();
}
}
193,23 → 251,23
this.add(this.fourn, c);
addRequiredSQLObject(this.fourn, "ID_FOURNISSEUR");
 
fourn.addModelListener("wantedID", new PropertyChangeListener() {
this.fourn.addModelListener("wantedID", new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
int wantedID = fourn.getWantedID();
int wantedID = FactureFournisseurSQLComponent.this.fourn.getWantedID();
if (wantedID != SQLRow.NONEXISTANT_ID && wantedID >= SQLRow.MIN_VALID_ID) {
 
final SQLRow rowF = getTable().getForeignTable("ID_FOURNISSEUR").getRow(wantedID);
 
if (rowF.getObject("ID_CATEGORIE_COMPTABLE") != null && !rowF.isForeignEmpty("ID_CATEGORIE_COMPTABLE")) {
table.setRowCatComptable(rowF.getForeign("ID_CATEGORIE_COMPTABLE"));
FactureFournisseurSQLComponent.this.table.setRowCatComptable(rowF.getForeign("ID_CATEGORIE_COMPTABLE"));
} else {
table.setRowCatComptable(null);
FactureFournisseurSQLComponent.this.table.setRowCatComptable(null);
}
 
} else {
table.setRowCatComptable(null);
FactureFournisseurSQLComponent.this.table.setRowCatComptable(null);
}
}
});
250,8 → 308,8
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
table.setFournisseur(fourn.getSelectedRow());
SQLRow row = fourn.getSelectedRow();
FactureFournisseurSQLComponent.this.table.setFournisseur(FactureFournisseurSQLComponent.this.fourn.getSelectedRow());
SQLRow row = FactureFournisseurSQLComponent.this.fourn.getSelectedRow();
if (!isFilling()) {
if (row != null && !row.isUndefined() && !row.isForeignEmpty("ID_DEVISE")) {
boxDevise.setValue(row.getForeignID("ID_DEVISE"));
259,9 → 317,10
}
 
if (row != null && !row.isUndefined()) {
avoirFourn.getRequest().setWhere(new Where(avoirFourn.getRequest().getPrimaryTable().getField("ID_FOURNISSEUR"), "=", row.getID()));
FactureFournisseurSQLComponent.this.avoirFourn.getRequest()
.setWhere(new Where(FactureFournisseurSQLComponent.this.avoirFourn.getRequest().getPrimaryTable().getField("ID_FOURNISSEUR"), "=", row.getID()));
} else {
avoirFourn.getRequest().setWhere(null);
FactureFournisseurSQLComponent.this.avoirFourn.getRequest().setWhere(null);
}
}
});
355,21 → 414,21
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
table.setDevise(boxDevise.getSelectedRow());
FactureFournisseurSQLComponent.this.table.setDevise(boxDevise.getSelectedRow());
updateLabelTauxConversion();
 
}
});
 
fieldTaux.getDocument().addDocumentListener(new SimpleDocumentListener() {
this.fieldTaux.getDocument().addDocumentListener(new SimpleDocumentListener() {
 
@Override
public void update(DocumentEvent e) {
BigDecimal tauxConversion = null;
if (fieldTaux.getText().trim().length() > 0) {
tauxConversion = new BigDecimal(fieldTaux.getText());
if (FactureFournisseurSQLComponent.this.fieldTaux.getText().trim().length() > 0) {
tauxConversion = new BigDecimal(FactureFournisseurSQLComponent.this.fieldTaux.getText());
}
table.setTauxConversion(tauxConversion);
FactureFournisseurSQLComponent.this.table.setTauxConversion(tauxConversion);
updateLabelTauxConversion();
}
});
379,13 → 438,13
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
table.setFournisseur(fourn.getSelectedRow());
FactureFournisseurSQLComponent.this.table.setFournisseur(FactureFournisseurSQLComponent.this.fourn.getSelectedRow());
if (!isFilling()) {
SQLRow row = fourn.getSelectedRow();
SQLRow row = FactureFournisseurSQLComponent.this.fourn.getSelectedRow();
if (row != null && !row.isUndefined()) {
row.fetchValues();
if (!row.isForeignEmpty("ID_COMPTE_PCE_CHARGE")) {
comptePCE.setValue(row.getForeign("ID_COMPTE_PCE_CHARGE"));
FactureFournisseurSQLComponent.this.comptePCE.setValue(row.getForeign("ID_COMPTE_PCE_CHARGE"));
}
}
}
395,18 → 454,13
c.gridy++;
c.weighty = 0;
this.add(getBottomPanel(), c);
ModeDeReglementSQLComponent modeReglComp;
 
modeReglComp = (ModeDeReglementSQLComponent) this.eltModeRegl.getSQLChild();
ModeDeReglementSQLComponent modeReglComp = (ModeDeReglementSQLComponent) this.eltModeRegl.getSQLChild();
modeReglComp.addDateCompListener(this.dateCommande);
 
// Modèle, visualiser, imprimer..
c.gridx = 0;
c.gridy++;
c.fill = GridBagConstraints.HORIZONTAL;
c.anchor = GridBagConstraints.WEST;
 
c.gridx = 0;
c.gridy++;
c.fill = GridBagConstraints.NONE;
c.anchor = GridBagConstraints.SOUTHEAST;
c.gridwidth = GridBagConstraints.REMAINDER;
415,8 → 469,8
this.add(this.panelOO, c);
 
addSQLObject(textNom, "NOM");
addRequiredSQLObject(dateCommande, "DATE");
addRequiredSQLObject(numero, "NUMERO");
addRequiredSQLObject(this.dateCommande, "DATE");
addRequiredSQLObject(this.numero, "NUMERO");
addSQLObject(this.infos, "INFOS");
 
DefaultGridBagConstraints.lockMinimumSize(this.fourn);
439,60 → 493,80
final JPanel panel = new JPanel(new GridBagLayout());
final GridBagConstraints c = new DefaultGridBagConstraints();
 
// Colonne 1 : Infos
JTabbedPane tabs = new JTabbedPane();
 
JPanel mainBottomPanel = new JPanel();
mainBottomPanel.setOpaque(false);
tabs.add(mainBottomPanel, "Règlements et caractéristiques");
final JScrollPane scrollPane = new JScrollPane(this.infos);
scrollPane.setBorder(null);
 
tabs.add(scrollPane, getLabelFor("INFOS"));
c.gridx = 0;
c.weightx = 1;
c.anchor = GridBagConstraints.WEST;
c.fill = GridBagConstraints.HORIZONTAL;
c.fill = GridBagConstraints.BOTH;
panel.add(tabs, c);
 
panel.add(new TitledSeparator(getLabelFor("INFOS")), c);
mainBottomPanel.setLayout(new GridBagLayout());
GridBagConstraints cMainBottomPanel = new DefaultGridBagConstraints();
 
c.gridy++;
c.weighty = 0;
c.weightx = 1;
c.fill = GridBagConstraints.BOTH;
final JScrollPane scrollPane = new JScrollPane(this.infos);
scrollPane.setBorder(null);
panel.add(scrollPane, c);
// Colonne 1 : Infos
 
cMainBottomPanel.weighty = 0;
cMainBottomPanel.weightx = 0;
cMainBottomPanel.fill = GridBagConstraints.BOTH;
 
this.addView("ID_MODE_REGLEMENT", REQ + ";" + DEC + ";" + SEP);
this.eltModeRegl = (ElementSQLObject) this.getView("ID_MODE_REGLEMENT");
 
c.gridx++;
c.fill = GridBagConstraints.NONE;
c.weightx = 1;
c.weighty = 1;
eltModeRegl.setOpaque(false);
panel.add(eltModeRegl, c);
this.eltModeRegl.setOpaque(false);
mainBottomPanel.add(this.eltModeRegl, cMainBottomPanel);
 
// Colonne 2 : Poids & autres
JPanel column2 = new JPanel();
column2.setOpaque(false);
cMainBottomPanel.gridx++;
cMainBottomPanel.weightx = 0;
mainBottomPanel.add(column2, cMainBottomPanel);
 
column2.setLayout(new GridBagLayout());
GridBagConstraints c2 = new DefaultGridBagConstraints();
 
c2.weightx = 0;
c2.weighty = 0;
c2.gridwidth = 1;
c2.gridheight = 1;
c2.fill = GridBagConstraints.HORIZONTAL;
c2.anchor = GridBagConstraints.NORTHEAST;
// Poids
DefaultProps props = DefaultNXProps.getInstance();
Boolean b = props.getBooleanValue("ArticleShowPoids");
Boolean poidsVisible = props.getBooleanValue("ArticleShowPoids");
if (poidsVisible) {
column2.add(new JLabel(getLabelFor("T_POIDS"), SwingConstants.RIGHT), c2);
final JTextField textPoidsTotal = new JTextField(8);
JTextField poids = new JTextField();
if (b) {
final JPanel panelPoids = new JPanel();
 
panelPoids.add(new JLabel(getLabelFor("T_POIDS")), c);
 
textPoidsTotal.setEnabled(false);
textPoidsTotal.setHorizontalAlignment(JTextField.RIGHT);
textPoidsTotal.setDisabledTextColor(Color.BLACK);
c2.weightx = 1;
c2.gridx++;
column2.add(textPoidsTotal, c2);
DefaultGridBagConstraints.lockMinimumSize(textPoidsTotal);
addSQLObject(textPoidsTotal, "T_POIDS");
 
panelPoids.add(textPoidsTotal, c);
this.table.getModel().addTableModelListener(new TableModelListener() {
 
c.gridx++;
c.gridy = 0;
c.weightx = 0;
c.weighty = 0;
c.gridwidth = 1;
c.gridheight = 2;
c.fill = GridBagConstraints.NONE;
c.anchor = GridBagConstraints.NORTHEAST;
panel.add(panelPoids, c);
DefaultGridBagConstraints.lockMinimumSize(panelPoids);
addSQLObject(textPoidsTotal, "T_POIDS");
public void tableChanged(TableModelEvent e) {
textPoidsTotal.setText(String.valueOf(FactureFournisseurSQLComponent.this.table.getPoidsTotal()));
}
});
 
} else {
addSQLObject(poids, "T_POIDS");
addSQLObject(new JTextField(), "T_POIDS");
}
 
DeviseField textPortHT = new DeviseField();
499,52 → 573,75
ElementComboBox comboTaxePort = new ElementComboBox();
DeviseField textRemiseHT = new DeviseField();
 
final JPanel panelPoids = new JPanel(new GridBagLayout());
GridBagConstraints cPort = new DefaultGridBagConstraints();
if (getTable().contains("PORT_HT")) {
// Port HT
addSQLObject(textPortHT, "PORT_HT");
cPort.gridx = 0;
cPort.weightx = 0;
panelPoids.add(new JLabel(getLabelFor("PORT_HT")), cPort);
c2.gridx = 0;
c2.gridy++;
c2.weightx = 0;
column2.add(new JLabel(getLabelFor("PORT_HT"), SwingConstants.RIGHT), c2);
textPortHT.setHorizontalAlignment(JTextField.RIGHT);
cPort.gridx++;
cPort.weightx = 1;
panelPoids.add(textPortHT, cPort);
 
cPort.gridy++;
cPort.gridx = 0;
cPort.weightx = 0;
c2.gridx++;
c2.weightx = 1;
column2.add(textPortHT, c2);
// TVA sur port
c2.gridy++;
c2.gridx = 0;
c2.weightx = 0;
addRequiredSQLObject(comboTaxePort, "ID_TAXE_PORT");
panelPoids.add(new JLabel(getLabelFor("ID_TAXE_PORT")), cPort);
cPort.gridx++;
cPort.weightx = 0;
panelPoids.add(comboTaxePort, cPort);
 
c.gridx++;
c.gridy = 0;
c.weightx = 0;
c.weighty = 0;
c.gridwidth = 1;
c.gridheight = 2;
c.fill = GridBagConstraints.NONE;
c.anchor = GridBagConstraints.NORTHEAST;
panel.add(panelPoids, c);
DefaultGridBagConstraints.lockMinimumSize(panelPoids);
 
column2.add(new JLabel(getLabelFor("ID_TAXE_PORT"), SwingConstants.RIGHT), c2);
c2.gridx++;
c2.weightx = 0;
column2.add(comboTaxePort, c2);
// Remise HT
addSQLObject(textRemiseHT, "REMISE_HT");
cPort.gridy++;
cPort.gridx = 0;
cPort.fill = GridBagConstraints.NONE;
cPort.weightx = 0;
panelPoids.add(new JLabel(getLabelFor("REMISE_HT")), cPort);
c2.gridx = 0;
c2.gridy++;
c2.weightx = 0;
column2.add(new JLabel(getLabelFor("REMISE_HT"), SwingConstants.RIGHT), c2);
textRemiseHT.setHorizontalAlignment(JTextField.RIGHT);
cPort.gridx++;
cPort.weightx = 1;
panelPoids.add(textRemiseHT, cPort);
c2.gridx++;
c2.weightx = 1;
column2.add(textRemiseHT, c2);
 
}
// Total
final JTextField textTvaAdujs;
if (getTable().contains("TVA_ADJUSTMENT")) {
textTvaAdujs = new JTextField(15);
final JLabel labelTvaAdujst = new JLabel(getLabelFor("TVA_ADJUSTMENT"), SwingConstants.RIGHT);
c2.gridx = 0;
c2.gridy++;
c2.weightx = 0;
column2.add(labelTvaAdujst, c2);
c2.gridx++;
c2.weightx = 1;
column2.add(textTvaAdujs, c2);
addView(textTvaAdujs, "TVA_ADJUSTMENT");
 
DefaultGridBagConstraints.lockMinimumSize(textTvaAdujs);
} else {
textTvaAdujs = null;
}
 
c2.gridy++;
c2.gridx = 0;
column2.add(new JLabel("Avoirs", SwingConstants.RIGHT), c2);
 
c2.gridx++;
c2.fill = GridBagConstraints.NONE;
c2.anchor = GridBagConstraints.EAST;
column2.add(createPanelAvoir(), c2);
 
c2.gridy++;
column2.add(getModuleTotalPanel(), c2);
c2.gridy++;
JPanel filler = new JPanel();
filler.setOpaque(false);
c2.weighty = 1;
column2.add(filler, c2);
 
// Colonne 4 Total
 
DeviseField fieldHT = new DeviseField();
DeviseField fieldEco = new DeviseField();
DeviseField fieldTVA = new DeviseField();
552,7 → 649,7
DeviseField fieldService = new DeviseField();
fieldHT.setOpaque(false);
fieldTVA.setOpaque(false);
fieldTTC.setOpaque(false);
this.fieldTTC.setOpaque(false);
fieldService.setOpaque(false);
addRequiredSQLObject(fieldDevise, "T_DEVISE");
addRequiredSQLObject(fieldEco, "T_ECO_CONTRIBUTION");
559,10 → 656,10
addRequiredSQLObject(fieldHT, "T_HT");
addRequiredSQLObject(fieldTVA, "T_TVA");
 
addRequiredSQLObject(fieldTTC, "T_TTC");
addRequiredSQLObject(this.fieldTTC, "T_TTC");
addRequiredSQLObject(fieldService, "T_SERVICE");
 
fieldTTC.getDocument().addDocumentListener(new SimpleDocumentListener() {
this.fieldTTC.getDocument().addDocumentListener(new SimpleDocumentListener() {
@Override
public void update(DocumentEvent e) {
refreshText();
578,21 → 675,9
this.allowEditable("T_SERVICE", false);
this.allowEditable("T_POIDS", false);
 
final TotalPanel totalTTC = new TotalPanel(this.table, fieldEco, fieldHT, fieldTVA, fieldTTC, textPortHT, textRemiseHT, fieldService, null, fieldDevise, null, null,
final TotalPanel totalTTC = new TotalPanel(this.table, fieldEco, fieldHT, fieldTVA, this.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");
if (textTvaAdujs != null) {
totalTTC.setTextFixTVA(textTvaAdujs);
textTvaAdujs.getDocument().addDocumentListener(new SimpleDocumentListener() {
@Override
621,44 → 706,23
totalTTC.updateTotal();
}
});
DefaultGridBagConstraints.lockMinimumSize(textTvaAdujs);
}
 
c.gridx++;
c.gridy--;
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridheight = 2;
c.gridy = 0;
c.gridwidth = 1;
c.gridheight = 1;
c.anchor = GridBagConstraints.NORTHEAST;
c.fill = GridBagConstraints.BOTH;
c.fill = GridBagConstraints.HORIZONTAL;
c.weighty = 0;
DefaultGridBagConstraints.lockMinimumSize(totalTTC);
 
panel.add(totalTTC, c);
 
c.gridy += 3;
c.gridheight = 1;
c.fill = GridBagConstraints.NONE;
c.anchor = GridBagConstraints.EAST;
panel.add(createPanelAvoir(), c);
 
c.gridy += 4;
c.gridheight = 2;
c.fill = GridBagConstraints.NONE;
c.anchor = GridBagConstraints.EAST;
panel.add(getModuleTotalPanel(), c);
 
table.getModel().addTableModelListener(new TableModelListener() {
 
public void tableChanged(TableModelEvent e) {
textPoidsTotal.setText(String.valueOf(table.getPoidsTotal()));
}
});
 
this.fourn.addModelListener("wantedID", new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
final SQLRow selectedRow2 = fourn.getSelectedRow();
final SQLRow selectedRow2 = FactureFournisseurSQLComponent.this.fourn.getSelectedRow();
if (selectedRow2 != null && !selectedRow2.isUndefined()) {
totalTTC.setIntraComm(selectedRow2.getBoolean("UE"));
} else {
686,7 → 750,6
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
// TODO Raccord de méthode auto-généré
totalTTC.updateTotal();
}
});
717,6 → 780,24
 
public int insert(SQLRow order) {
 
final SQLTable tableNum = getTable().getTable("NUMEROTATION_AUTO");
// incrémentation du numéro auto
if (tableNum.contains("FACTURE_FOURNISSEUR_START") && NumerotationAutoSQLElement.getNextNumero(getElement().getClass(), new Date()).equalsIgnoreCase(this.numero.getText().trim())) {
SQLRowValues rowVals = new SQLRowValues(tableNum);
 
final SQLRow rowNumAuto = tableNum.getRow(2);
if (rowNumAuto.getObject("FACTURE_FOURNISSEUR_START") != null) {
int val = rowNumAuto.getInt("FACTURE_FOURNISSEUR_START");
val++;
rowVals.put("FACTURE_FOURNISSEUR_START", new Integer(val));
 
try {
rowVals.update(2);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
int idFacture = getSelectedID();
idFacture = super.insert(order);
this.table.updateField("ID_FACTURE_FOURNISSEUR", idFacture);
774,12 → 855,16
}
 
public void commitAvoir(SQLRow rowFactureOld, SQLRow rowFacture) {
 
try {
if (rowFactureOld != null && rowFactureOld.getObject("ID_AVOIR_FOURNISSEUR") != null && !rowFactureOld.isForeignEmpty("ID_AVOIR_FOURNISSEUR")
&& (rowFacture.getObject("ID_AVOIR_FOURNISSEUR") == null || rowFacture.isForeignEmpty("ID_AVOIR_FOURNISSEUR"))) {
List<String> fieldsAvoir = Arrays.asList("ID_AVOIR_FOURNISSEUR", "ID_AVOIR_FOURNISSEUR_2");
for (String field : fieldsAvoir) {
 
SQLRow rowAvoir = rowFactureOld.getForeignRow("ID_AVOIR_FOURNISSEUR");
if (rowFactureOld != null && rowFactureOld.getObject(field) != null && !rowFactureOld.isForeignEmpty(field)
&& (rowFacture.getObject(field) == null || rowFacture.isForeignEmpty(field))) {
 
SQLRow rowAvoir = rowFactureOld.getForeignRow(field);
 
SQLRowValues rowVals = rowAvoir.createEmptyUpdateRow();
 
// Soldé
790,9 → 875,9
}
 
// on solde l'avoir
if (rowFacture.getObject("ID_AVOIR_FOURNISSEUR") != null && !rowFacture.isForeignEmpty("ID_AVOIR_FOURNISSEUR")) {
if (rowFacture.getObject(field) != null && !rowFacture.isForeignEmpty(field)) {
 
SQLRow rowAvoir = rowFacture.getForeignRow("ID_AVOIR_FOURNISSEUR");
SQLRow rowAvoir = rowFacture.getForeignRow(field);
 
SQLRowValues rowVals = rowAvoir.createEmptyUpdateRow();
rowVals.put("SOLDE", Boolean.TRUE);
800,6 → 885,7
rowVals.update();
 
}
}
} catch (SQLException e) {
ExceptionHandler.handle("Erreur lors la mise à jour de l'avoir associée!", e);
}
829,6 → 915,11
if (rowsComm != null) {
rowVals.put("ID_COMMERCIAL", rowsComm.getID());
}
 
if (getTable().getTable("NUMEROTATION_AUTO").contains("FACTURE_FOURNISSEUR_START")) {
rowVals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(getElement().getClass(), new Date()));
}
 
rowVals.put("T_HT", Long.valueOf(0));
rowVals.put("T_SERVICE", Long.valueOf(0));
rowVals.put("T_DEVISE", Long.valueOf(0));
871,19 → 962,43
cA.gridx++;
cA.weightx = 0;
panelAvoir.add(this.textNetAPayer, cA);
addView(textNetAPayer, "NET_A_PAYER");
addView(this.textNetAPayer, "NET_A_PAYER");
this.textNetAPayer.setHorizontalAlignment(SwingConstants.RIGHT);
 
JLabel labelAvoir2 = new JLabel(getLabelFor("ID_AVOIR_FOURNISSEUR_2"));
labelAvoir.setHorizontalAlignment(SwingConstants.RIGHT);
cA.gridx = 0;
cA.gridy++;
cA.weightx = 1;
labelAvoir.setHorizontalAlignment(SwingConstants.RIGHT);
panelAvoir.add(labelAvoir2, cA);
cA.weightx = 0;
cA.gridx++;
this.avoirFourn2 = new ElementComboBox();
this.avoirFourn2.setAddIconVisible(false);
panelAvoir.add(this.avoirFourn2, cA);
 
addView(this.avoirFourn2, "ID_AVOIR_FOURNISSEUR_2");
addView(this.avoirFourn, "ID_AVOIR_FOURNISSEUR");
addView(avoirTTC, "AVOIR_TTC");
this.avoirFourn.addValueListener(new PropertyChangeListener() {
addView(this.avoirTTC, "AVOIR_TTC");
this.avoirFourn.addModelListener("wantedID", new PropertyChangeListener() {
 
public void propertyChange(PropertyChangeEvent evt) {
if (!isFilling()) {
refreshText();
}
}
 
});
this.avoirFourn2.addModelListener("wantedID", new PropertyChangeListener() {
 
public void propertyChange(PropertyChangeEvent evt) {
if (!isFilling()) {
refreshText();
}
}
 
});
return panelAvoir;
}
 
891,16 → 1006,16
Number n = this.fieldTTC.getValue();
long totalAvoirTTC = 0;
long netAPayer = 0;
long ttc = 0;
if (n != null) {
netAPayer = n.longValue();
ttc = n.longValue();
}
 
if (this.avoirFourn.getSelectedId() > 1) {
List<ElementComboBox> boxAvoir = Arrays.asList(this.avoirFourn, this.avoirFourn2);
for (ElementComboBox elementComboBox : boxAvoir) {
if (elementComboBox.getWantedID() > 1) {
SQLTable tableAvoir = getTable().getForeignTable("ID_AVOIR_FOURNISSEUR");
if (n != null) {
SQLRow rowAvoir = tableAvoir.getRow(this.avoirFourn.getSelectedId());
SQLRow rowAvoir = tableAvoir.getRow(elementComboBox.getWantedID());
long totalAvoir = ((Number) rowAvoir.getObject("MONTANT_TTC")).longValue();
if (getSelectedID() > 1) {
SQLRow row = getTable().getRow(getSelectedID());
910,10 → 1025,10
}
}
 
long l = ttc - totalAvoir;
long l = netAPayer - totalAvoir;
if (l < 0) {
l = 0;
totalAvoirTTC = ttc;
totalAvoirTTC = netAPayer;
} else {
totalAvoirTTC = totalAvoir;
}
920,6 → 1035,7
netAPayer = l;
}
}
}
 
this.textNetAPayer.setValue(netAPayer);
this.avoirTTC.setValue(totalAvoirTTC);
947,15 → 1063,7
if (!row.isForeignEmpty("ID_COMPTE_PCE")) {
rowVals.put("ID_COMPTE_PCE", row.getForeignID("ID_COMPTE_PCE"));
}
// 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);
}
970,6 → 1078,12
 
SQLRowValues rowVals = rowElt.createUpdateRow();
rowVals.clearPrimaryKeys();
if (rowVals.getTable().contains("ID_COMMANDE_ELEMENT")) {
rowVals.putEmptyLink("ID_COMMANDE_ELEMENT");
}
if (rowVals.getTable().contains("ID_BON_RECEPTION_ELEMENT")) {
rowVals.putEmptyLink("ID_BON_RECEPTION_ELEMENT");
}
this.table.getModel().addRow(rowVals);
int rowIndex = this.table.getModel().getRowCount() - 1;
this.table.getModel().fireTableModelModified(rowIndex);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/component/SaisieAchatSQLComponent.java
340,7 → 340,7
}
});
 
this.comboAvoir.addValueListener(new PropertyChangeListener() {
this.comboAvoir.addModelListener("wantedID", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
refreshText();
534,11 → 534,11
 
private void refreshText() {
Number n = this.montant.getMontantTTC().getValue();
if (this.comboAvoir.getSelectedId() > 1) {
if (this.comboAvoir.getWantedID() > 1) {
SQLTable tableAvoir = Configuration.getInstance().getDirectory().getElement("AVOIR_FOURNISSEUR").getTable();
if (n != null) {
long ttc = n.longValue();
SQLRow rowAvoir = tableAvoir.getRow(this.comboAvoir.getSelectedId());
SQLRow rowAvoir = tableAvoir.getRow(this.comboAvoir.getWantedID());
long totalAvoir = ((Number) rowAvoir.getObject("MONTANT_TTC")).longValue();
this.fieldMontantRegle.setValue(ttc - totalAvoir);
} else {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/component/CommandeSQLComponent.java
95,19 → 95,19
 
public class CommandeSQLComponent extends TransfertBaseSQLComponent {
 
private CommandeItemTable table = new CommandeItemTable();
private PanelOOSQLComponent panelOO;
protected CommandeItemTable table = new CommandeItemTable();
protected PanelOOSQLComponent panelOO;
 
private JUniqueTextField numeroUniqueCommande;
private final SQLTable tableNum = getTable().getBase().getTable("NUMEROTATION_AUTO");
private final ITextArea infos = new ITextArea(3, 3);
private ElementComboBox fourn = new ElementComboBox();
private final JCheckBox boxLivrClient = new JCheckBox("Livrer directement le client");
private DefaultElementSQLObject compAdr;
final JPanel panelAdrSpec = new JPanel(new GridBagLayout());
protected JUniqueTextField numeroUniqueCommande;
protected final SQLTable tableNum = getTable().getBase().getTable("NUMEROTATION_AUTO");
protected final ITextArea infos = new ITextArea(3, 3);
protected ElementComboBox fourn = new ElementComboBox();
protected final JCheckBox boxLivrClient = new JCheckBox("Livrer directement le client");
protected DefaultElementSQLObject compAdr;
protected final JPanel panelAdrSpec = new JPanel(new GridBagLayout());
protected ElementComboBox boxAdr;
private JDate dateCommande = new JDate(true);
private ElementSQLObject componentPrincipaleAdr;
protected JDate dateCommande = new JDate(true);
protected ElementSQLObject componentPrincipaleAdr;
 
public CommandeSQLComponent() {
super(Configuration.getInstance().getDirectory().getElement("COMMANDE"));
571,7 → 571,7
c.anchor = GridBagConstraints.EAST;
this.add(new JLabel(getLabelFor("NOM"), SwingConstants.RIGHT), c);
 
final JTextField textNom = new JTextField();
final SQLTextCombo textNom = new SQLTextCombo();
c.gridx++;
c.weightx = 1;
this.add(textNom, c);
653,6 → 653,7
 
DefaultGridBagConstraints.lockMinimumSize(this.fourn);
DefaultGridBagConstraints.lockMinimumSize(commSel);
this.addView(this.table.getRowValuesTable(), "");
}
 
protected SQLRowValues getLivraisonAdr(SQLRow rowAffaire) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/table/FacturationCommandeTable.java
20,6 → 20,7
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.UndefinedRowValuesCache;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.request.ComboSQLRequest;
32,6 → 33,7
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.table.PercentTableCellRenderer;
import org.openconcerto.ui.table.TimestampTableCellEditor;
import org.openconcerto.ui.table.XTableColumnModel;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
40,7 → 42,9
import java.math.BigDecimal;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
 
import javax.swing.JButton;
55,6 → 59,12
private RowValuesTableModel model;
private SQLComponent comp;
 
public static Map<String, Boolean> map = new HashMap<String, Boolean>();
 
protected Map<String, Boolean> getCustomVisibilityMap() {
return map;
}
 
public FacturationCommandeTable(SQLComponent comp) {
this.comp = comp;
init();
89,6 → 99,7
final SQLTableElement comptant = new SQLTableElement(e.getTable().getField("COMPTANT"));
list.add(comptant);
 
// TODO fix return value of timestamp if not show hour return date object
final SQLTableElement date = new SQLTableElement(e.getTable().getField("DATE_PREVISIONNELLE"), Date.class, new TimestampTableCellEditor(false) {
@Override
public Object getCellEditorValue() {
110,30 → 121,21
ToolTipManager.sharedInstance().unregisterComponent(this.table);
ToolTipManager.sharedInstance().unregisterComponent(this.table.getTableHeader());
 
// Autocompletion
// AutoCompletionManager m = new AutoCompletionManager(tableElementNom,
// ((ComptaPropsConfiguration)
// Configuration.getInstance()).getSQLBaseSociete().getField("ECHANTILLON.NOM"), this.table,
// this.table.getRowValuesTableModel());
// m.fill("NOM", "NOM");
// m.fill("PV_HT", "PV_HT");
Map<String, Boolean> mapCustom = getCustomVisibilityMap();
if (mapCustom != null) {
for (String string : mapCustom.keySet()) {
setColumnVisible(model.getColumnForField(string), mapCustom.get(string));
}
}
 
// // Calcul automatique du total HT
// qteElement.addModificationListener(this.totalHT);
// this.pvHT.addModificationListener(this.totalHT);
// this.totalHT.setModifier(new CellDynamicModifier() {
// public Object computeValueFrom(final SQLRowValues row, SQLTableElement source) {
// System.out.println("Compute totalHT");
//
// int qte = Integer.parseInt(row.getObject("QTE").toString());
// BigDecimal f = row.getBigDecimal("PV_HT");
// BigDecimal r = f.multiply(new BigDecimal(qte), DecimalUtils.HIGH_PRECISION);
// return r;
// }
//
// });
}
 
protected void setColumnVisible(int col, boolean visible) {
if (col >= 0) {
XTableColumnModel columnModel = this.table.getColumnModel();
columnModel.setColumnVisible(columnModel.getColumnByModelIndex(col), visible);
}
}
 
/**
*
152,7 → 154,7
this.add(new JLabel("Ajouter un terme"), c);
 
final ElementComboBox boxCat = new ElementComboBox();
final SQLElement element = Configuration.getInstance().getDirectory().getElement("FACTURATION_COMMANDE_CLIENT");
final SQLElement element = getSQLElement();
ComboSQLRequest req = element.getComboRequest(true);
req.setWhere(new Where(element.getTable().getField("CHOICE"), "=", Boolean.TRUE));
boxCat.init(element, req);
178,10 → 180,13
return;
}
 
SQLRowValues rowVals = new SQLRowValues(Configuration.getInstance().getBase().getTable("FACTURATION_COMMANDE_CLIENT"));
if (comp.getSelectedID() > 1) {
final SQLTable table2 = getSQLElement().getTable();
SQLRowValues rowVals = new SQLRowValues(table2);
if (table2.getName().equals("FACTURATION_COMMANDE_CLIENT")) {
if (comp != null && comp.getSelectedID() > 1) {
rowVals.put("ID_COMMANDE_CLIENT", comp.getSelectedID());
}
}
rowVals.put("NOM", rowCat.getObject("NOM"));
rowVals.put("ID_TYPE_REGLEMENT", rowCat.getObject("ID_TYPE_REGLEMENT"));
rowVals.put("AJOURS", rowCat.getObject("AJOURS"));
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/table/ChiffrageCommandeTable.java
28,6 → 28,7
import org.openconcerto.sql.view.list.RowValuesTableRenderer;
import org.openconcerto.sql.view.list.SQLTableElement;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.table.XTableColumnModel;
import org.openconcerto.utils.DecimalUtils;
 
import java.awt.GridBagConstraints;
36,7 → 37,9
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
 
import javax.swing.AbstractAction;
80,7 → 83,9
final SQLField fieldHA = e.getTable().getField("PA_HT");
final DeviseNumericCellEditor editorPAHT = new DeviseNumericCellEditor(fieldHA);
final SQLTableElement pa = new SQLTableElement(fieldHA, BigDecimal.class, editorPAHT);
pa.setRenderer(new DeviseTableCellRenderer());
DeviseTableCellRenderer renderer = new DeviseTableCellRenderer();
renderer.setHideZeroValue(true);
pa.setRenderer(renderer);
if (e.getTable().contains("ID_CATEGORIE_HEURE")) {
pa.setEditable(false);
}
89,7 → 94,7
final SQLField fieldPV = e.getTable().getField("PV_HT");
final DeviseNumericCellEditor editorPVHT = new DeviseNumericCellEditor(fieldPV);
final SQLTableElement pv = new SQLTableElement(fieldPV, BigDecimal.class, editorPVHT);
pv.setRenderer(new DeviseTableCellRenderer());
pv.setRenderer(renderer);
list.add(pv);
 
SQLTableElement qteU = new SQLTableElement(e.getTable().getField("QTE"), BigDecimal.class) {
98,7 → 103,7
return BigDecimal.ZERO;
}
};
qteU.setRenderer(new DeviseTableCellRenderer());
qteU.setRenderer(renderer);
list.add(qteU);
if (e.getTable().contains("ANT")) {
108,7 → 113,7
return BigDecimal.ZERO;
}
};
ant.setRenderer(new DeviseTableCellRenderer());
ant.setRenderer(renderer);
list.add(ant);
}
119,7 → 124,7
return BigDecimal.ZERO;
}
};
restant.setRenderer(new DeviseTableCellRenderer());
restant.setRenderer(renderer);
list.add(restant);
}
 
129,7 → 134,7
final SQLField fieldTotalHA = e.getTable().getField("T_PA_HT");
final DeviseNumericCellEditor editorTotalPAHT = new DeviseNumericCellEditor(fieldTotalHA);
final SQLTableElement totalpa = new SQLTableElement(fieldTotalHA, BigDecimal.class, editorTotalPAHT);
totalpa.setRenderer(new DeviseTableCellRenderer());
totalpa.setRenderer(renderer);
totalpa.setEditable(false);
list.add(totalpa);
 
137,7 → 142,7
final DeviseNumericCellEditor editorTotalPVHT = new DeviseNumericCellEditor(fieldTotalPV);
final SQLTableElement totalpv = new SQLTableElement(fieldTotalPV, BigDecimal.class, editorTotalPVHT);
totalpv.setEditable(false);
totalpv.setRenderer(new DeviseTableCellRenderer());
totalpv.setRenderer(renderer);
list.add(totalpv);
 
final SQLField fieldMarge = e.getTable().getField("MARGE");
144,7 → 149,7
final DeviseNumericCellEditor editorMarge = new DeviseNumericCellEditor(fieldMarge);
final SQLTableElement marge = new SQLTableElement(fieldMarge, BigDecimal.class, editorMarge);
marge.setEditable(false);
marge.setRenderer(new DeviseTableCellRenderer());
marge.setRenderer(renderer);
list.add(marge);
 
SQLRowValues defautRow = new SQLRowValues(UndefinedRowValuesCache.getInstance().getDefaultRowValues(e.getTable()));
154,6 → 159,17
ToolTipManager.sharedInstance().unregisterComponent(this.table);
ToolTipManager.sharedInstance().unregisterComponent(this.table.getTableHeader());
 
this.table.readState();
 
Map<String, Boolean> mapCustom = getCustomVisibilityMap();
if (mapCustom != null) {
for (String string : mapCustom.keySet()) {
setColumnVisible(model.getColumnForField(string), mapCustom.get(string));
}
}
 
this.table.writeState();
 
// Autocompletion
// AutoCompletionManager m = new AutoCompletionManager(tableElementNom,
// ((ComptaPropsConfiguration)
214,6 → 230,19
});
}
 
protected void setColumnVisible(int col, boolean visible) {
if (col >= 0) {
XTableColumnModel columnModel = this.table.getColumnModel();
columnModel.setColumnVisible(columnModel.getColumnByModelIndex(col), visible);
}
}
 
public static Map<String, Boolean> map = new HashMap<String, Boolean>();
 
protected Map<String, Boolean> getCustomVisibilityMap() {
return map;
}
 
/**
*
*/
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/CommandeSQLElement.java
16,6 → 16,7
import org.openconcerto.erp.config.Gestion;
import org.openconcerto.erp.core.common.component.TransfertBaseSQLComponent;
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.edm.AttachmentAction;
import org.openconcerto.erp.core.supplychain.order.component.CommandeSQLComponent;
import org.openconcerto.erp.core.supplychain.order.component.SaisieAchatSQLComponent;
import org.openconcerto.erp.core.supplychain.receipt.component.BonReceptionSQLComponent;
62,6 → 63,12
public CommandeSQLElement() {
super("COMMANDE", "une commande fournisseur", "commandes fournisseur");
 
if (getTable().contains("ATTACHMENTS")) {
PredicateRowAction actionAttachment = new PredicateRowAction(new AttachmentAction().getAction(), true);
actionAttachment.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(actionAttachment);
}
 
getRowActions().addAll(new MouseSheetXmlListeListener(CommandeXmlSheet.class).getRowActions());
 
// Transfert vers BR
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/FactureFournisseurSQLElement.java
14,6 → 14,7
package org.openconcerto.erp.core.supplychain.order.element;
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.common.element.NumerotationAutoSQLElement;
import org.openconcerto.erp.core.edm.AttachmentAction;
import org.openconcerto.erp.core.supplychain.order.component.FactureFournisseurSQLComponent;
import org.openconcerto.erp.generationDoc.gestcomm.FactureFournisseurXmlSheet;
21,6 → 22,7
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.model.FieldPath;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.EditPanel;
74,7 → 76,12
}
};
getRowActions().add(actionClone);
final SQLTable tableNum = getTable().getTable("NUMEROTATION_AUTO");
// incrémentation du numéro auto
if (tableNum.contains("FACTURE_FOURNISSEUR_START")) {
NumerotationAutoSQLElement.addClass(this.getClass(), "FACTURE_FOURNISSEUR");
}
}
 
@Override
public Set<String> getReadOnlyFields() {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/RelanceSQLElement.java
15,7 → 15,14
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.common.element.NumerotationAutoSQLElement;
import org.openconcerto.erp.config.Log;
 
import org.openconcerto.erp.core.common.ui.DeviseField;
import org.openconcerto.erp.core.sales.invoice.element.SaisieVenteFactureSQLElement;
import org.openconcerto.erp.core.sales.invoice.report.VenteFactureXmlSheet;
import org.openconcerto.erp.generationDoc.A4;
import org.openconcerto.erp.generationDoc.ProgressPrintingFrame;
import org.openconcerto.erp.generationDoc.gestcomm.FicheRelanceSheet;
import org.openconcerto.erp.generationDoc.gestcomm.RelanceSheet;
import org.openconcerto.erp.preferences.PrinterNXProps;
import org.openconcerto.sql.element.BaseSQLComponent;
29,6 → 36,8
import org.openconcerto.sql.sqlobject.JUniqueTextField;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.RowAction;
import org.openconcerto.ui.JDate;
import org.openconcerto.ui.component.ITextArea;
import org.openconcerto.ui.component.InteractionMode;
36,23 → 45,160
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
 
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.print.Paper;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.logging.Level;
 
import javax.print.PrintService;
import javax.print.attribute.Attribute;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.Size2DSyntax;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.MediaPrintableArea;
import javax.print.attribute.standard.MediaSizeName;
import javax.swing.AbstractAction;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.SwingUtilities;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
 
public class RelanceSQLElement extends ComptaSQLConfElement {
public static final String ITEM_TYPE = "type.id";
public static final String ITEM_DATE = "date";
public static final String ITEM_NUMBER = "number";
public static final String ITEM_CUSTOMER = "customer.id";
public static final String ITEM_SALES_INVOICE_INPUT = "sales.invoice.input.id";
public static final String ITEM_AMOUNT = "amount";
public static final String ITEM_INFORMATIONS = "informations";
public static final String ITEM_VISUALIZATION = "visualization";
public static final String ITEM_PRINT = "impression";
private static final double POINTS_PER_INCH = 72.0;
 
public RelanceSQLElement() {
super("RELANCE", "une relance client", "relances clients");
 
RowAction actionShowDoc = new RowAction(new AbstractAction("Voir le document") {
public void actionPerformed(ActionEvent e) {
final RelanceSheet s = new RelanceSheet(IListe.get(e).getSelectedRow().asRow().fetchNew(false));
s.generate(false, false, "");
s.showDocument();
}
}, false) {
@Override
public boolean enabledFor(List<SQLRowValues> selection) {
if (selection.size() == 1) {
SQLRowValues rowRelance = selection.get(0);
boolean isNotMail = !(rowRelance.getForeign("ID_TYPE_LETTRE_RELANCE") == null || rowRelance.isForeignEmpty("ID_TYPE_LETTRE_RELANCE"));
return isNotMail;
}
return false;
}
};
 
getRowActions().add(actionShowDoc);
 
RowAction actionPrintDoc = new RowAction(new AbstractAction("Imprimer") {
public void actionPerformed(ActionEvent e) {
print(e, false);
}
}, false) {
@Override
public boolean enabledFor(List<SQLRowValues> selection) {
if (selection.size() >= 1) {
boolean isNotMail = true;
for (SQLRowValues rowRelance : selection) {
 
isNotMail &= !(rowRelance.getForeign("ID_TYPE_LETTRE_RELANCE") == null || rowRelance.isForeignEmpty("ID_TYPE_LETTRE_RELANCE"));
}
return isNotMail;
}
return false;
}
};
 
getRowActions().add(actionPrintDoc);
 
// Impression
 
RowAction actionPrintDocFact = new RowAction(new AbstractAction("Imprimer avec la facture") {
public void actionPerformed(ActionEvent e) {
print(e, true);
}
}, false) {
@Override
public boolean enabledFor(List<SQLRowValues> selection) {
if (selection.size() >= 1) {
boolean isNotMail = true;
for (SQLRowValues rowRelance : selection) {
 
isNotMail &= !(rowRelance.getForeign("ID_TYPE_LETTRE_RELANCE") == null || rowRelance.isForeignEmpty("ID_TYPE_LETTRE_RELANCE"));
}
return isNotMail;
}
return false;
}
};
 
getRowActions().add(actionPrintDocFact);
 
// Générer
 
RowAction actionGen = new RowAction(new AbstractAction("Générer le document") {
public void actionPerformed(ActionEvent e) {
 
for (SQLRowValues rowVals : IListe.get(e).getSelectedRows()) {
final RelanceSheet s = new RelanceSheet(rowVals.asRow().fetchNew(false));
String printer = PrinterNXProps.getInstance().getStringProperty("RelancePrinter");
s.generate(false, true, printer, true);
s.showDocument();
}
}
}, false) {
@Override
public boolean enabledFor(List<SQLRowValues> selection) {
if (selection.size() >= 1) {
SQLRowValues rowRelance = selection.get(0);
boolean isNotMail = !(rowRelance.getForeign("ID_TYPE_LETTRE_RELANCE") == null || rowRelance.isForeignEmpty("ID_TYPE_LETTRE_RELANCE"));
return isNotMail;
}
return false;
}
};
 
getRowActions().add(actionGen);
 
RowAction actionFiche = new RowAction(new AbstractAction("Créer la fiche de relance") {
public void actionPerformed(ActionEvent e) {
try {
FicheRelanceSheet sheet = new FicheRelanceSheet(IListe.get(e).getSelectedRow().asRow().fetchNew(false));
sheet.createDocumentAsynchronous();
sheet.showPrintAndExportAsynchronous(true, false, true);
} catch (Exception ex) {
ExceptionHandler.handle("Impression impossible", ex);
}
}
}, false) {
@Override
public boolean enabledFor(List<SQLRowValues> selection) {
return (selection.size() == 1);
}
};
 
getRowActions().add(actionFiche);
 
}
 
protected List<String> getListFields() {
final List<String> l = new ArrayList<String>();
l.add("NUMERO");
302,4 → 448,103
protected String createCode() {
return this.createCodeOfPackage() + ".chaseletter";
}
 
public void print(final ActionEvent ev, boolean withInvoice) {
//
final IListe ilist = IListe.get(ev);
String printerName = PrinterNXProps.getInstance().getStringProperty("RelancePrinter");
// Printer configuration
final PrinterJob printJob = PrinterJob.getPrinterJob();
 
// Set the printer
PrintService myService = null;
if (printerName != null && printerName.trim().length() > 0) {
final PrintService[] services = PrinterJob.lookupPrintServices();
for (int i = 0; i < services.length; i++) {
if (services[i].getName().equals(printerName)) {
myService = services[i];
break;
}
}
if (myService != null) {
try {
printJob.setPrintService(myService);
} catch (PrinterException e) {
Log.get().log(Level.SEVERE, "cannot print", e);
JOptionPane.showMessageDialog(null, "Imprimante non compatible");
return;
}
}
}
 
final HashPrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
// L'impression est forcée en A4, sur OpenSuse le format est en
// Letter par défaut alors que l'imprimante est en A4 dans le système
final MediaSizeName media = MediaSizeName.ISO_A4;
attributes.add(media);
Paper paper = new A4(0, 0);
 
final MediaPrintableArea printableArea = new MediaPrintableArea((float) (paper.getImageableX() / POINTS_PER_INCH), (float) (paper.getImageableY() / POINTS_PER_INCH),
(float) (paper.getImageableWidth() / POINTS_PER_INCH), (float) (paper.getImageableHeight() / POINTS_PER_INCH), Size2DSyntax.INCH);
attributes.add(printableArea);
attributes.add(new Copies(1));
 
boolean okToPrint = printJob.printDialog(attributes);
final Attribute attribute = attributes.get(Copies.class);
if (attribute != null) {
final Copies attributeCopies = (Copies) attribute;
final int value = attributeCopies.getValue();
printJob.setCopies(value);
} else {
printJob.setCopies(1);
}
 
if (okToPrint) {
Window w = SwingUtilities.getWindowAncestor(ilist);
final ProgressPrintingFrame pFrame = new ProgressPrintingFrame(w, printJob, "Impression", "Impression en cours", 300);
// Génération + impression
final List<SQLRowValues> rows = IListe.get(ev).getSelectedRows();
final Thread thread = new Thread() {
@Override
public void run() {
final int size = rows.size();
for (int i = 0; i < size; i++) {
final int index = i;
SwingUtilities.invokeLater(new Runnable() {
 
@Override
public void run() {
pFrame.setMessage("Document " + (index + 1) + "/" + size);
pFrame.setProgress((100 * (index + 1)) / size);
}
});
if (!pFrame.isCancelled()) {
SQLRowValues r = rows.get(i);
SQLRow rowRelance = r.asRow().fetchNew(false);
RelanceSheet s = new RelanceSheet(rowRelance);
s.printDocument(printJob);
if (withInvoice) {
SaisieVenteFactureSQLElement element = getDirectory().getElement(SaisieVenteFactureSQLElement.class);
final VenteFactureXmlSheet sheet = new VenteFactureXmlSheet(rowRelance.getForeignRow("ID_SAISIE_VENTE_FACTURE"));
try {
sheet.getOrCreateDocumentFile();
sheet.printDocument(printJob);
} catch (Exception e) {
ExceptionHandler.handle("Erreur lors de la création de la facture", e);
}
}
 
}
}
}
};
thread.setPriority(Thread.MIN_PRIORITY);
thread.setDaemon(true);
pFrame.setLocationRelativeTo(ilist);
pFrame.setVisible(true);
thread.start();
 
}
 
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/CustomerSQLComponent.java
18,6 → 18,7
import org.openconcerto.erp.core.customerrelationship.customer.ui.AdresseClientItemTable;
import org.openconcerto.erp.core.finance.accounting.element.ComptePCESQLElement;
import org.openconcerto.erp.core.sales.product.element.ClientCodeArticleTable;
import org.openconcerto.erp.core.sales.product.ui.CustomerProductFamilyQtyPriceListTable;
import org.openconcerto.erp.core.sales.product.ui.CustomerProductQtyPriceListTable;
import org.openconcerto.erp.preferences.GestionCommercialeGlobalPreferencePanel;
import org.openconcerto.erp.preferences.ModeReglementDefautPrefPanel;
42,7 → 43,10
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.EditPanel.EditMode;
import org.openconcerto.sql.view.IListFrame;
import org.openconcerto.sql.view.IListPanel;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.SQLTableModelSource;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.FrameUtil;
import org.openconcerto.ui.JDate;
65,6 → 69,7
 
import javax.swing.AbstractAction;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
95,8 → 100,10
};
 
private CustomerProductQtyPriceListTable clienTarifTable = new CustomerProductQtyPriceListTable();
private CustomerProductFamilyQtyPriceListTable clienFamilleTarifTable = new CustomerProductFamilyQtyPriceListTable();
private SQLRowValues defaultContactRowVals = new SQLRowValues(UndefinedRowValuesCache.getInstance().getDefaultRowValues(this.contactTable));
private JCheckBox checkAdrLivraison, checkAdrFacturation;
private IListPanel agencePanel;
 
public CustomerSQLComponent(SQLElement element) {
super(element);
172,10 → 179,34
return new JDate(true);
} else if (id.equals("customerrelationship.customer.contacts")) {
return this.table;
} else if (id.equals("customerrelationship.customer.agencies")) {
SQLElement elementAgence = getElement().getDirectory().getElement("AGENCE");
SQLTableModelSource source = elementAgence.createTableSource(Where.FALSE);
this.agencePanel = new ListeAddPanel(elementAgence, new IListe(source)) {
@Override
protected void handleAction(JButton source, ActionEvent evt) {
if (source == this.buttonAjouter) {
if (getMode() == Mode.MODIFICATION && getSelectedID() != SQLRow.NONEXISTANT_ID) {
SQLRowValues rowValsAgency = new SQLRowValues(elementAgence.getTable());
rowValsAgency.put("ID_CLIENT", getSelectedID());
this.getCreateFrame().getSQLComponent().select(rowValsAgency);
}
FrameUtil.show(this.getCreateFrame());
} else {
super.handleAction(source, evt);
}
}
};
if (getMode() == Mode.INSERTION || getMode() == Mode.READ_ONLY) {
this.agencePanel.getButtonAdd().setEnabled(false);
}
return this.agencePanel;
} 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.customfamilytarif")) {
return this.clienFamilleTarifTable;
} else if (id.equals("customerrelationship.customer.addresses")) {
return createAdressesComponent();
} else if (id.equals("NOM")) {
253,6 → 284,7
final int selectedID = getSelectedID();
this.table.updateField("ID_CLIENT", selectedID);
this.clienTarifTable.updateField("ID_CLIENT", selectedID);
this.clienFamilleTarifTable.updateField("ID_CLIENT", selectedID);
this.tableCustomProduct.updateField("ID_CLIENT", selectedID);
this.adresseTable.updateField("ID_CLIENT", selectedID);
}
265,10 → 297,16
if (r != null) {
this.table.insertFrom("ID_CLIENT", r.asRowValues());
this.clienTarifTable.insertFrom("ID_CLIENT", r.asRowValues());
this.clienFamilleTarifTable.insertFrom("ID_CLIENT", r.asRowValues());
this.tableCustomProduct.insertFrom("ID_CLIENT", r.asRowValues());
this.adresseTable.insertFrom("ID_CLIENT", r.asRowValues());
}
if (r != null && r.hasID()) {
this.agencePanel.getListe().getRequest().setWhere(new Where(this.agencePanel.getListe().getRequest().getPrimaryTable().getField("ID_CLIENT"), "=", r.getID()));
} else {
this.agencePanel.getListe().getRequest().setWhere(Where.FALSE);
}
}
 
@Override
public int insert(SQLRow order) {
304,6 → 342,8
} else {
id = super.insert(order);
this.table.updateField("ID_CLIENT", id);
this.clienTarifTable.updateField("ID_CLIENT", id);
this.clienFamilleTarifTable.updateField("ID_CLIENT", id);
this.tableCustomProduct.updateField("ID_CLIENT", id);
this.clienTarifTable.updateField("ID_CLIENT", id);
this.adresseTable.updateField("ID_CLIENT", id);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/AgenceSQLElement.java
New file
0,0 → 1,108
/*
* 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.element.ElementSQLObject;
import org.openconcerto.sql.element.GroupSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.ui.JLabelBold;
import org.openconcerto.ui.group.Group;
 
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
 
import javax.swing.JComponent;
import javax.swing.JLabel;
 
public class AgenceSQLElement extends SQLElement {
 
public AgenceSQLElement(DBRoot root) {
super(root.findTable("AGENCE"));
// TODO Auto-generated constructor stub
}
 
@Override
protected List<String> getListFields() {
List<String> list = new ArrayList<>(2);
 
list.add("DESIGNATION");
list.add("ID_CLIENT");
list.add("ID_ADRESSE");
return list;
}
 
@Override
public Group getGroupForCreation() {
// TODO Auto-generated method stub
return super.getGroupForCreation();
}
 
@Override
protected SQLComponent createComponent() {
return new GroupSQLComponent(this, new AgenceGroup(this.getCode())) {
 
@Override
public JComponent createEditor(String id) {
if (id.equals("customerrelationship.customer.agency.address")) {
org.openconcerto.sql.element.ElementSQLObject c = (ElementSQLObject) super.createEditor(id);
c.setRequired(true);
return c;
}
if (id.equals("customerrelationship.customer.agency.customer")) {
ElementComboBox compClient = new ElementComboBox();
compClient.setVisible(false);
 
return compClient;
}
return super.createEditor(id);
}
 
@Override
protected Set<String> createRequiredNames() {
final Set<String> required = new HashSet<>();
required.add("customerrelationship.customer.agency.designation");
return required;
}
 
@Override
public JComponent createLabel(String id) {
if (id.equals("customerrelationship.customer.agency.customer")) {
JLabel label = new JLabel();
label.setVisible(false);
return label;
}
if (id.equals("customerrelationship.customer.agency.grp1")) {
JLabel label = new JLabel();
label.setVisible(false);
return label;
} else if (id.equals("customerrelationship.customer.agency.address")) {
return new JLabelBold("Adresse de l'agence");
} else {
return super.createLabel(id);
}
}
};
}
 
@Override
protected String createCode() {
return "customerrelationship.customer.agency";
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/CustomerGroup.java
57,6 → 57,10
 
this.add(gAddress);
 
final Group gAgency = new Group("customerrelationship.customer.agency");
gAgency.addItem("customerrelationship.customer.agencies", new LayoutHints(true, true, true, true, true, true, true, true));
this.add(gAgency);
 
final Group gContact = new Group("customerrelationship.customer.contact", LayoutHints.DEFAULT_SEPARATED_GROUP_HINTS);
gContact.addItem("customerrelationship.customer.contacts", new LayoutHints(true, true, true, true, true, true, true, true));
this.add(gContact);
95,8 → 99,10
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));
gCustomRemiseProduct.addItem("customerrelationship.customer.customfamilytarif", new LayoutHints(true, true, true, true, true, true, true, true));
this.add(gCustomRemiseProduct);
 
this.add(gState);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/CustomerSQLElement.java
15,10 → 15,12
 
import org.openconcerto.erp.core.edm.AttachmentAction;
import org.openconcerto.erp.core.reports.history.ui.HistoriqueClientFrame;
import org.openconcerto.erp.preferences.GestionCommercialeGlobalPreferencePanel;
import org.openconcerto.sql.element.GlobalMapper;
import org.openconcerto.sql.element.GroupSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.sql.request.SQLFieldTranslator;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
73,6 → 75,11
if (getTable().contains("GROUPE")) {
fields.add("GROUPE");
}
SQLPreferences prefs = new SQLPreferences(getTable().getDBRoot());
 
if (prefs.getBoolean(GestionCommercialeGlobalPreferencePanel.CATEGORIE_COMPTABLE_SPEC, false)) {
fields.add("ID_CATEGORIE_COMPTABLE");
}
fields.add("SOLDE_COMPTE");
fields.add("REMIND_DATE");
fields.add("OBSOLETE");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/AgenceGroup.java
New file
0,0 → 1,33
/*
* 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.ui.group.Group;
import org.openconcerto.ui.group.LayoutHints;
 
public class AgenceGroup extends Group {
 
public AgenceGroup(String elemCode) {
super(elemCode);
addItem("customerrelationship.customer.agency.designation", LayoutHints.DEFAULT_VERY_LARGE_FIELD_HINTS);
addItem("customerrelationship.customer.agency.phone1", LayoutHints.DEFAULT_VERY_LARGE_FIELD_HINTS);
addItem("customerrelationship.customer.agency.email", LayoutHints.DEFAULT_VERY_LARGE_FIELD_HINTS);
addItem("customerrelationship.customer.agency.fax", LayoutHints.DEFAULT_VERY_LARGE_FIELD_HINTS);
addItem("customerrelationship.customer.agency.customer", LayoutHints.DEFAULT_VERY_LARGE_FIELD_HINTS);
final Group gAddress = new Group("customerrelationship.customer.agency.grp1", LayoutHints.DEFAULT_SEPARATED_GROUP_HINTS);
gAddress.addItem("customerrelationship.customer.agency.address", new LayoutHints(true, true, true, true, true, true, true, true));
this.add(gAddress);
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/report/ReportingCommercialFournisseurCreator.java
New file
0,0 → 1,127
/*
* 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 ReportingCommercialFournisseurCreator {
 
final private Date deb, fin;
final private DBRoot root;
 
public ReportingCommercialFournisseurCreator(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_ELEMENT");
SQLRowValues rowValues = new SQLRowValues(tableFacture);
rowValues.putRowValues("ID_SAISIE_VENTE_FACTURE").putRowValues("ID_COMMERCIAL").putNulls("PRENOM", "NOM");
rowValues.putRowValues("ID_ARTICLE").putRowValues("ID_FOURNISSEUR").putNulls("CODE", "NOM");
rowValues.putNulls("T_PV_HT", "T_PV_TTC");
 
SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(rowValues);
fetcher.setSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
 
@Override
public SQLSelect transformChecked(SQLSelect input) {
Where w = new Where(input.getJoinFromField(tableFacture.getField("ID_SAISIE_VENTE_FACTURE")).getJoinedTable().getField("DATE"), deb, fin);
 
input.setWhere(w);
return input;
}
});
 
Map<Integer, ReportingCommercial> mapCommercial = new HashMap<>();
List<SQLRowValues> result = fetcher.fetch();
for (SQLRowValues sqlRowValues : result) {
if (!sqlRowValues.isForeignEmpty("ID_ARTICLE")) {
SQLRowAccessor rowArticle = sqlRowValues.getForeign("ID_ARTICLE");
if (!rowArticle.isForeignEmpty("ID_FOURNISSEUR")) {
SQLRowAccessor rowFournisseur = rowArticle.getForeign("ID_FOURNISSEUR");
int commercialID = sqlRowValues.getForeign("ID_SAISIE_VENTE_FACTURE").getForeignID("ID_COMMERCIAL");
if (!mapCommercial.containsKey(commercialID)) {
SQLRowAccessor commercialRow = sqlRowValues.getForeign("ID_SAISIE_VENTE_FACTURE").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_PV_HT")).movePointLeft(2);
r.add(rowFournisseur.getString("NOM"), bigDecimal);
}
}
}
 
// Avoir
final SQLTable tableAvoir = this.root.getTable("AVOIR_CLIENT_ELEMENT");
SQLRowValues rowValuesAvoir = new SQLRowValues(tableAvoir);
rowValuesAvoir.putRowValues("ID_AVOIR_CLIENT").putRowValues("ID_COMMERCIAL").putNulls("PRENOM", "NOM");
rowValuesAvoir.putRowValues("ID_ARTICLE").putRowValues("ID_FOURNISSEUR").putNulls("CODE", "NOM");
rowValuesAvoir.putNulls("T_PV_HT", "T_PV_TTC");
 
SQLRowValuesListFetcher fetcherAvoir = SQLRowValuesListFetcher.create(rowValuesAvoir);
fetcherAvoir.setSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
 
@Override
public SQLSelect transformChecked(SQLSelect input) {
Where w = new Where(input.getJoinFromField(tableAvoir.getField("ID_AVOIR_CLIENT")).getJoinedTable().getField("DATE"), deb, fin);
 
input.setWhere(w);
return input;
}
});
 
List<SQLRowValues> resultA = fetcherAvoir.fetch();
for (SQLRowValues sqlRowValues : resultA) {
 
if (!sqlRowValues.isForeignEmpty("ID_ARTICLE")) {
SQLRowAccessor rowArticle = sqlRowValues.getForeign("ID_ARTICLE");
if (!rowArticle.isForeignEmpty("ID_FOURNISSEUR")) {
SQLRowAccessor rowFournisseur = rowArticle.getForeign("ID_FOURNISSEUR");
 
int commercialID = sqlRowValues.getForeign("ID_AVOIR_CLIENT").getForeignID("ID_COMMERCIAL");
if (!mapCommercial.containsKey(commercialID)) {
SQLRowAccessor commercialRow = sqlRowValues.getForeign("ID_AVOIR_CLIENT").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_PV_HT")).movePointLeft(2).negate();
r.add(rowFournisseur.getString("NOM"), bigDecimal);
}
}
}
 
return mapCommercial.values();
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/report/ReportingCommercialFournisseurPanel.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 ReportingCommercialFournisseurPanel extends JPanel {
 
public ReportingCommercialFournisseurPanel(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() {
ReportingCommercialFournisseurCreator creator = new ReportingCommercialFournisseurCreator(dateDeb.getValue(), dateFin.getValue(), root);
 
List<ReportingCommercial> list = new ArrayList<>(creator.getValues());
ReportingCommercialPDF reporting = new ReportingCommercialPDF(list);
File file;
try {
file = File.createTempFile("ReportingCommericalFournisseur", ".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(ReportingCommercialFournisseurPanel.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/finance/accounting/element/EcritureSQLElement.java
35,6 → 35,7
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
292,6 → 293,7
public final SQLTableModelSourceOnline createLettrageTableSource() {
final List<String> listEcriture = new ArrayList<String>();
listEcriture.add("LETTRAGE");
listEcriture.add("LETTRAGE_PARTIEL");
listEcriture.add("ID_COMPTE_PCE");
listEcriture.add("ID_MOUVEMENT");
if (getTable().contains("NOM_PIECE")) {
668,14 → 670,16
@Override
public Object create() throws SQLException {
// on recupere l'ensemble des ecritures associées au mouvement
 
SQLSelect selEcritures = new SQLSelect();
selEcritures.addSelect(tableEcriture.getField("ID"));
selEcritures.addSelect(tableEcriture.getField("VALIDE"));
selEcritures.addSelect(tableEcriture.getField("LETTRAGE"));
selEcritures.setWhere(tableEcriture.getField("ID_MOUVEMENT"), "=", idMvt);
 
List l = (List) base.getDataSource().execute(selEcritures.asString(), new ArrayListHandler());
for (int i = 0; i < l.size(); i++) {
Object[] tmp = (Object[]) l.get(i);
archiveEcriture(tableEcriture.getRow(Integer.parseInt(tmp[0].toString())));
List<SQLRow> rowEcr = SQLRowListRSH.execute(selEcritures);
for (SQLRow r : rowEcr) {
archiveEcriture(r);
}
 
return null;
717,14 → 721,15
* @param row
* @throws SQLException
*/
public void archiveEcriture(SQLRow row) throws SQLException {
public void archiveEcriture(SQLRowAccessor row) throws SQLException {
 
if (!row.getBoolean("VALIDE")) {
 
SQLRowValues rowVals = new SQLRowValues(this.getTable());
rowVals.put("IDUSER_DELETE", UserManager.getInstance().getCurrentUser().getId());
rowVals.put("ARCHIVE", 1);
rowVals.update(row.getID());
UpdateBuilder builderArc = new UpdateBuilder(getTable());
builderArc.setObject("IDUSER_DELETE", UserManager.getInstance().getCurrentUser().getId());
builderArc.setObject("ARCHIVE", 1);
builderArc.setWhere(new Where(getTable().getKey(), "=", row.getID()));
getTable().getDBSystemRoot().getDataSource().execute(builderArc.asString());
 
// Annulation du lettrage si l'ecriture est lettrée pour ne pas avoir de lettrage
// déséquilibré
736,7 → 741,7
builder.setWhere(new Where(getTable().getField("LETTRAGE"), "=", codeLettrage));
getTable().getDBSystemRoot().getDataSource().execute(builder.asString());
}
 
getTable().fireRowDeleted(row.getID());
// super.archive(row, true);
} else {
System.err.println("Impossible de supprimer une ecriture validée");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/element/SaisieKmSQLElement.java
16,20 → 16,28
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.finance.accounting.ui.AnalytiqueItemTable;
import org.openconcerto.erp.core.finance.accounting.ui.ComptabiliteWorkflowPreferencePanel;
import org.openconcerto.erp.core.finance.accounting.ui.PropoLettrage;
import org.openconcerto.erp.core.finance.accounting.ui.SaisieKmItemTable;
import org.openconcerto.erp.generationEcritures.GenerationMvtSaisieKm;
import org.openconcerto.erp.generationEcritures.provider.AccountingRecordsProvider;
import org.openconcerto.erp.generationEcritures.provider.AccountingRecordsProviderManager;
import org.openconcerto.erp.preferences.DefaultNXProps;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLName;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.TableRef;
import org.openconcerto.sql.model.UndefinedRowValuesCache;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.request.UpdateBuilder;
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.sql.utils.SQLUtils;
import org.openconcerto.sql.view.list.RowValuesTableModel;
432,9 → 440,25
}
});
this.updateEcriture(getTable().getRow(id));
 
} catch (SQLException exn) {
ExceptionHandler.handle("Erreur lors de la création des écritures associées à la saisie au kilometre.", exn);
}
boolean showPropoLettrage = Boolean.valueOf(DefaultNXProps.getInstance().getProperty(ComptabiliteWorkflowPreferencePanel.LETTRAGE_PROPO_KM));
if (showPropoLettrage) {
if (id > SQLRow.NONEXISTANT_ID) {
final SQLRow rowKM = getTable().getRow(id);
SwingUtilities.invokeLater(new Runnable() {
 
@Override
public void run() {
PropoLettrage lettragePropo = new PropoLettrage(getElement().getDirectory().getElement(EcritureSQLElement.class));
lettragePropo.transfert(rowKM);
}
});
 
}
}
return id;
}
 
466,7 → 490,19
this.tableKm.updateField("ID_SAISIE_KM", getSelectedID());
System.err.println("UPDATE ECRITURE");
this.updateEcriture(getElement().getTable().getRow(getSelectedID()));
boolean showPropoLettrage = Boolean.valueOf(DefaultNXProps.getInstance().getProperty(ComptabiliteWorkflowPreferencePanel.LETTRAGE_PROPO_KM));
if (showPropoLettrage) {
SQLRow rowKM = getTable().getRow(getSelectedID());
SwingUtilities.invokeLater(new Runnable() {
 
@Override
public void run() {
PropoLettrage lettragePropo = new PropoLettrage(getElement().getDirectory().getElement(EcritureSQLElement.class));
lettragePropo.transfert(rowKM);
}
});
}
}
 
private Date dTemp = null;
 
521,8 → 557,15
final SQLRow mvt = rowSaisieKm.getForeign("ID_MOUVEMENT");
final SQLRow piece = mvt.getForeign("ID_PIECE");
String labelSaisie = rowSaisieKm.getString("NOM");
piece.createEmptyUpdateRow().put("NOM", (labelSaisie.length() == 0 ? "Saisie au km " : labelSaisie)).commit();
AccountingRecordsProvider provider = AccountingRecordsProviderManager.get(GenerationMvtSaisieKm.ID);
 
SQLRowValues rowValsPiece = piece.asRowValues();
rowValsPiece.put("NOM", (labelSaisie.length() == 0 ? "Saisie au km " : labelSaisie));
if (provider != null) {
provider.putPieceLabel(rowSaisieKm, rowValsPiece);
}
 
rowValsPiece.commit();
// Mise à jour des écritures
for (SQLRow rowKmElement : myListKmItem) {
 
581,11 → 624,54
listEcr.remove(sqlRow);
}
}
 
}
 
}
// Suppression des lettrages déséquilibré (ex : si on modifie un
// montant d'une écriture lettrée)
SQLSelect sel = new SQLSelect();
sel.addSelect(ecritureTable.getField("LETTRAGE"));
sel.addGroupBy(ecritureTable.getField("LETTRAGE"));
final TableRef aliasEcrTable = sel.getAlias(ecritureTable);
final String quoteDebit = new SQLName(aliasEcrTable.getAlias(), "DEBIT").quote();
final String quoteCredit = new SQLName(aliasEcrTable.getAlias(), "CREDIT").quote();
 
sel.setHaving(Where.createRaw("SUM (" + quoteCredit + ") != SUM(" + quoteDebit + ")", aliasEcrTable.getField("DEBIT")));
 
List<String> resultBadLettrage = getElement().getTable().getDBSystemRoot().getDataSource().executeCol(sel.asString());
if (resultBadLettrage != null && !resultBadLettrage.isEmpty()) {
UpdateBuilder update = new UpdateBuilder(ecritureTable);
update.setObject(ecritureTable.getField("LETTRAGE"), "");
update.setObject(ecritureTable.getField("DATE_LETTRAGE"), null);
Where w = new Where(ecritureTable.getField("LETTRAGE"), resultBadLettrage);
update.setWhere(w);
getElement().getTable().getDBSystemRoot().getDataSource().execute(update.asString());
}
 
}
 
// Suppression des lettrages déséquilibré (ex : si on modifie un
// montant d'une écriture lettrée)
SQLSelect sel = new SQLSelect();
sel.addSelect(ecritureTable.getField("LETTRAGE"));
sel.addGroupBy(ecritureTable.getField("LETTRAGE"));
final TableRef aliasEcrTable = sel.getAlias(ecritureTable);
final String quoteDebit = new SQLName(aliasEcrTable.getAlias(), "DEBIT").quote();
final String quoteCredit = new SQLName(aliasEcrTable.getAlias(), "CREDIT").quote();
sel.setWhere(Where.isNotNull(ecritureTable.getField("LETTRAGE")).and(new Where(ecritureTable.getField("LETTRAGE"), "!=", "")));
sel.setHaving(Where.createRaw("SUM (" + quoteCredit + ") != SUM(" + quoteDebit + ")", aliasEcrTable.getField("DEBIT")));
 
List<String> resultBadLettrage = getTable().getDBSystemRoot().getDataSource().executeCol(sel.asString());
if (resultBadLettrage != null && !resultBadLettrage.isEmpty()) {
UpdateBuilder update = new UpdateBuilder(ecritureTable);
update.setObject(ecritureTable.getField("LETTRAGE"), "");
update.setObject(ecritureTable.getField("DATE_LETTRAGE"), null);
Where w = new Where(ecritureTable.getField("LETTRAGE"), resultBadLettrage);
update.setWhere(w);
getTable().getDBSystemRoot().getDataSource().execute(update.asString());
}
 
if (!listEcr.isEmpty()) {
final EcritureSQLElement e = (EcritureSQLElement) Configuration.getInstance().getDirectory().getElement(ecritureTable);
for (SQLRow sqlRow : listEcr) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/Map2033A.java
404,9 → 404,9
// 'Caisse
// Racine = "53"
// S084=511+512(D)...517+5187+54+58(D)+53
long v084 = this.sommeCompte.soldeCompteDebiteur(510, 517, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteDebiteur(5180, 5185, true, this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteDebiteur(5187, 5189, true, this.dateDebut, this.dateFin) + this.sommeCompte.sommeCompteFils("54", this.dateDebut, this.dateFin)
+ this.sommeCompte.sommeCompteFils("53", this.dateDebut, this.dateFin) + this.sommeCompte.sommeCompteFils("58", this.dateDebut, this.dateFin);
long v084 = this.sommeCompte.soldeCompteDebiteur(510, 517, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteDebiteur(518, 518, true, this.dateDebut, this.dateFin)
+ this.sommeCompte.sommeCompteFils("54", this.dateDebut, this.dateFin) + this.sommeCompte.sommeCompteFils("53", this.dateDebut, this.dateFin)
+ this.sommeCompte.sommeCompteFils("58", this.dateDebut, this.dateFin);
 
this.m.put("ACTIF1.11", GestionDevise.currencyToString(v084, false));
 
682,13 → 682,13
* this.sommeCompte.soldeCompteCrediteur(5180, 5180, true) -
* this.sommeCompte.sommeCompteFils("5186") ;
*/
long v156 = -this.sommeCompte.sommeCompteFils("161", this.dateDebut, this.dateFin) - this.sommeCompte.soldeCompte(163, 166, true, this.dateDebut, this.dateFin)
- this.sommeCompte.soldeCompte(1680, 1681, true, this.dateDebut, this.dateFin) - this.sommeCompte.soldeCompte(1682, 1682, true, this.dateDebut, this.dateFin)
- this.sommeCompte.soldeCompte(1684, 1689, true, this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("17", this.dateDebut, this.dateFin)
- this.sommeCompte.sommeCompteFils("426", this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(450, 454, true, this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(456, 456, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(458, 459, true, this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(512, 517, true, this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("518", this.dateDebut, this.dateFin)
- this.sommeCompte.sommeCompteFils("519", this.dateDebut, this.dateFin);
long v156 = -this.sommeCompte.sommeCompteFils("160", this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("161", this.dateDebut, this.dateFin)
- this.sommeCompte.soldeCompte(163, 166, true, this.dateDebut, this.dateFin) - this.sommeCompte.soldeCompte(1680, 1681, true, this.dateDebut, this.dateFin)
- this.sommeCompte.soldeCompte(1682, 1682, true, this.dateDebut, this.dateFin) - this.sommeCompte.soldeCompte(1684, 1689, true, this.dateDebut, this.dateFin)
- this.sommeCompte.sommeCompteFils("17", this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("426", this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(450, 454, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(456, 456, true, this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(458, 459, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(512, 517, true, this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(518, 518, true, this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("519", this.dateDebut, this.dateFin);
this.m.put("PASSIF3.25", GestionDevise.currencyToString(v156, false));
 
// 151
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/Map2033B.java
183,7 → 183,8
******************************************************************************************/
// 234 SommeSolde( 607, 608* )+SommeSolde( 6097, 6097* )
long v234 = this.sommeCompte.soldeCompte(607, 607, true, this.dateDeb, this.dateFin) + this.sommeCompte.soldeCompte(6097, 6097, true, this.dateDeb, this.dateFin)
+ this.sommeCompte.soldeCompte(6087, 6087, true, this.dateDeb, this.dateFin);
+ this.sommeCompte.soldeCompte(608, 608, true, this.dateDeb, this.dateFin) - this.sommeCompte.soldeCompte(6081, 6086, true, this.dateDeb, this.dateFin);
 
this.m.put("CHARGES3.8", GestionDevise.currencyToString(v234, false));
 
// 208
206,7 → 207,7
// S238=601+602+6091+6092
// FIX Abaque ajout 609
long v238 = this.sommeCompte.soldeCompte(601, 602, true, this.dateDeb, this.dateFin) + this.sommeCompte.soldeCompte(609, 609, true, this.dateDeb, this.dateFin)
- this.sommeCompte.soldeCompte(6093, 6099, true, this.dateDeb, this.dateFin) + this.sommeCompte.soldeCompte(6081, 6082, true, this.dateDeb, this.dateFin);
- this.sommeCompte.soldeCompte(6093, 6099, true, this.dateDeb, this.dateFin) + this.sommeCompte.soldeCompte(6081, 6083, true, this.dateDeb, this.dateFin);
this.m.put("CHARGES3.10", GestionDevise.currencyToString(v238, false));
 
// 212
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/GrandLivreSheetXML.java
72,14 → 72,6
Date date;
 
@Override
public String getName() {
if (this.date == null) {
this.date = new Date();
}
return "GrandLivre" + date.getTime();
}
 
@Override
protected String getStoragePathP() {
return "Grand Livre";
}
109,21 → 101,16
private String toDay = dateFormat.format(new Date());
private int size;
 
// private void makeEntete(int rowDeb) {
//
// this.mCell.put("A" + rowDeb, this.rowSociete.getObject("NOM"));
// this.mCell.put("G" + rowDeb, "Edition du " + this.toDay);
// // this.mCell.put("D" + (rowDeb + 2), "Grand livre");
// // System.err.println("MAKE ENTETE");
// }
//
// private void makePiedPage(int row, String comptes) {
// this.mCell.put("A" + row, "Compte : " + comptes);
// this.mCell.put("E" + row, "Période du " + dateFormatEcr.format(this.dateDu) + " au " +
// dateFormatEcr.format(this.dateAu));
// }
private List<Map<String, Object>> recapSousTotaux = new ArrayList<>();
 
@Override
public String getName() {
if (this.date == null) {
this.date = new Date();
}
return "GrandLivre" + this.date.getTime();
}
 
private void makeSousTotal(String numCpt, String nomCpt, Map<String, Object> line, Map<Integer, String> style, int pos, long debit, long credit) {
style.put(pos, "Titre 1");
 
522,9 → 509,8
}
 
private List<Integer> getListeCompteSolde() {
SQLSelect sel = new SQLSelect(base);
 
sel.addSelect(tableCompte.getField("ID"));
SQLSelect sel = new SQLSelect();
sel.addSelect(tableEcriture.getField("ID_COMPTE_PCE"));
sel.addSelect(tableEcriture.getField("DEBIT"), "SUM");
sel.addSelect(tableEcriture.getField("CREDIT"), "SUM");
 
531,8 → 517,9
Where w = getWhere(null);
 
sel.setWhere(w);
sel.addGroupBy(tableEcriture.getField("ID_COMPTE_PCE"));
 
String req = sel.asString() + " GROUP BY \"COMPTE_PCE\".\"ID\"";
String req = sel.asString();
System.err.println(req);
List<Object[]> l = (List) base.getDataSource().execute(req, new ArrayListHandler());
List<Integer> list = new ArrayList<Integer>();
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/BalanceSheet.java
350,7 → 350,7
}
 
if (this.centralClient && !numeroCpt.equalsIgnoreCase("411") && numeroCpt.startsWith("411")) {
if (addedLine || !this.centralFournImmo) {
if (addedLine) {
posLine--;
j--;
} else {
370,7 → 370,7
this.mCell.put("A" + posLine, numCptFourn);
this.mCell.put("B" + posLine, nomCptFourn);
} else if (this.centralFournImmo && !numeroCpt.equalsIgnoreCase("404") && numeroCpt.startsWith("404")) {
if (addedLineImmo || !this.centralFourn) {
if (addedLineImmo) {
posLine--;
j--;
} else {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/ComptabiliteWorkflowPreferencePanel.java
New file
0,0 → 1,135
/*
* 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.finance.accounting.ui;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.preferences.DefaultNXProps;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.request.SQLFieldTranslator;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.preferences.DefaultPreferencePanel;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.sql.SQLException;
 
import javax.swing.JCheckBox;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
 
public class ComptabiliteWorkflowPreferencePanel extends DefaultPreferencePanel {
 
public static final String LETTRAGE_PROPO_KM = "LettragePropoKM";
private final static SQLBase base = ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete();
private static final SQLTable tablePrefCompte = base.getTable("PREFS_COMPTE");
private SQLRowValues rowPrefCompteVals = new SQLRowValues(tablePrefCompte);
private JCheckBox checkLettrageKmPropo = new JCheckBox("Afficher une fenêtre de lettrage lors d'une saisie au kilomètre.");
private JCheckBox checkLettrageAuto = new JCheckBox("Activer le lettrage automatique.");
private JCheckBox checkHideCompteFacture = new JCheckBox("Ne pas afficher les comptes dans les factures.");
private JCheckBox checkHideCompteClient = new JCheckBox("Ne pas afficher les comptes dans les clients.");
private JCheckBox checkHideAnalytique = new JCheckBox("Ne pas afficher l'analytique dans les saisies au kilomètre.");
 
public ComptabiliteWorkflowPreferencePanel() {
super();
 
final SQLRow rowPrefCompte = tablePrefCompte.getRow(2);
this.rowPrefCompteVals.loadAbsolutelyAll(rowPrefCompte);
 
this.setLayout(new GridBagLayout());
 
final GridBagConstraints c = new DefaultGridBagConstraints();
 
c.fill = GridBagConstraints.HORIZONTAL;
c.anchor = GridBagConstraints.WEST;
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 1;
c.gridheight = 1;
c.weightx = 1;
c.weighty = 0;
 
c.gridwidth = GridBagConstraints.REMAINDER;
this.add(this.checkLettrageAuto, c);
c.gridy++;
this.add(this.checkLettrageKmPropo, c);
c.gridy++;
this.add(this.checkHideCompteClient, c);
c.gridy++;
this.add(this.checkHideCompteFacture, c);
c.gridy++;
this.add(this.checkHideAnalytique, c);
c.gridy++;
 
// Spacer
c.weighty = 1;
c.gridy++;
this.add(new JPanel(), c);
 
setValues();
}
 
public void storeValues() {
 
this.rowPrefCompteVals.put("AUTO_LETTRAGE", this.checkLettrageAuto.isSelected());
DefaultNXProps.getInstance().setProperty(LETTRAGE_PROPO_KM, String.valueOf(this.checkLettrageKmPropo.isSelected()));
DefaultNXProps.getInstance().setProperty("HideCompteClient", String.valueOf(this.checkHideCompteClient.isSelected()));
DefaultNXProps.getInstance().setProperty("HideCompteFacture", String.valueOf(this.checkHideCompteFacture.isSelected()));
DefaultNXProps.getInstance().setProperty("HideAnalytique", String.valueOf(this.checkHideAnalytique.isSelected()));
DefaultNXProps.getInstance().store();
try {
final Object[] pb = this.rowPrefCompteVals.getInvalid();
if (pb != null) {
final SQLFieldTranslator trans = Configuration.getInstance().getTranslator();
JOptionPane.showMessageDialog(SwingUtilities.getRoot(this), "Impossible de valider les modifications! Le champ <"
+ trans.getLabelFor(this.rowPrefCompteVals.getTable().getField(pb[0].toString())) + "> pointe sur un compte invalide!(" + pb[1] + ")");
} else {
this.rowPrefCompteVals.update();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
 
public void restoreToDefaults() {
 
this.checkLettrageAuto.setSelected(false);
this.checkLettrageKmPropo.setSelected(false);
 
}
 
public String getTitleName() {
return "Comptabilité";
}
 
private void setValues() {
 
try {
 
this.checkLettrageAuto.setSelected(rowPrefCompteVals.getBoolean("AUTO_LETTRAGE"));
 
this.checkLettrageKmPropo.setSelected(Boolean.valueOf(DefaultNXProps.getInstance().getProperty(LETTRAGE_PROPO_KM)));
this.checkHideCompteClient.setSelected(Boolean.valueOf(DefaultNXProps.getInstance().getProperty("HideCompteClient")));
this.checkHideCompteFacture.setSelected(Boolean.valueOf(DefaultNXProps.getInstance().getProperty("HideCompteFacture")));
this.checkHideAnalytique.setSelected(Boolean.valueOf(DefaultNXProps.getInstance().getProperty("HideAnalytique")));
} catch (Exception e) {
e.printStackTrace();
}
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/PropoLettrageRenderer.java
New file
0,0 → 1,51
/*
* 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.finance.accounting.ui;
 
import org.openconcerto.ui.table.TableCellRendererUtils;
import org.openconcerto.utils.GestionDevise;
 
import java.awt.Component;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
 
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
 
public class PropoLettrageRenderer extends DefaultTableCellRenderer {
 
private final DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
 
public PropoLettrageRenderer() {
 
}
 
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 (value != null) {
if (value instanceof Date) {
this.setHorizontalAlignment(SwingConstants.RIGHT);
this.setText(dateFormat.format((Date) value));
} else if (value.getClass() == Long.class) {
this.setHorizontalAlignment(SwingConstants.RIGHT);
this.setText(GestionDevise.currencyToString(((Long) value).longValue()));
}
}
return this;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/LettragePanel.java
18,10 → 18,12
import org.openconcerto.erp.core.common.ui.DeviseNiceTableCellRenderer;
import org.openconcerto.erp.core.finance.accounting.element.ComptePCESQLElement;
import org.openconcerto.erp.core.finance.accounting.element.EcritureSQLElement;
import org.openconcerto.erp.core.finance.accounting.element.JournalSQLElement;
import org.openconcerto.erp.core.finance.accounting.element.MouvementSQLElement;
import org.openconcerto.erp.core.finance.accounting.model.LettrageModel;
import org.openconcerto.erp.model.ISQLCompteSelector;
import org.openconcerto.erp.rights.ComptaUserRight;
import org.openconcerto.erp.utils.LowerCaseFormatFilter;
import org.openconcerto.erp.utils.UpperCaseFormatFilter;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
28,18 → 30,29
import org.openconcerto.sql.element.SQLElementDirectory;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLSystem;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.UndefinedRowValuesCache;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.request.ComboSQLRequest;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.EditPanel.EditMode;
import org.openconcerto.sql.view.EditPanelListener;
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.FontUtils;
import org.openconcerto.ui.JDate;
import org.openconcerto.ui.TitledSeparator;
import org.openconcerto.ui.warning.JLabelWarning;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.ListMap;
import org.openconcerto.utils.text.DocumentFilterList;
import org.openconcerto.utils.text.DocumentFilterList.FilterType;
import org.openconcerto.utils.text.SimpleDocumentListener;
63,7 → 76,10
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
 
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
85,7 → 101,7
public class LettragePanel extends JPanel {
 
private ListPanelEcritures ecriturePanel;
private JTextField codeLettrage;
private JTextField codeLettrage, codeLettragePartiel;
private ISQLCompteSelector selCompte;
private JCheckBox boxValidEcriture, boxAddSousCompte;
private JPanel warningPanel, warningSolde;
101,6 → 117,7
private int modeSelect;
private LettrageModel model;
private JButton buttonLettrer;
private final JButton buttonRegler = new JButton("Régler");
private JDate dateDeb, dateFin, dateLettrage;
 
public LettragePanel() {
162,6 → 179,20
this.add(this.codeLettrage, c);
this.codeLettrage.setText(NumerotationAutoSQLElement.getNextCodeLettrage());
 
JLabel labelCodepartiel = new JLabel("Code lettrage partiel");
labelCodepartiel.setHorizontalAlignment(SwingConstants.RIGHT);
c.gridx++;
c.gridwidth = 1;
c.weightx = 0;
this.add(labelCodepartiel, c);
 
this.codeLettragePartiel = new JTextField(10);
DocumentFilterList.add((AbstractDocument) this.codeLettragePartiel.getDocument(), new LowerCaseFormatFilter(), FilterType.SIMPLE_FILTER);
c.gridx++;
c.weightx = 1;
this.add(this.codeLettragePartiel, c);
this.codeLettragePartiel.setText(getNextCodeLettragePartiel());
 
// Warning si aucun code rentré
createPanelWarning();
c.gridwidth = GridBagConstraints.REMAINDER;
323,6 → 354,7
this.add(this.boxValidEcriture, c);
 
JPanel panelButton = new JPanel();
panelButton.add(this.buttonRegler, c);
 
// Boutton lettrer
 
355,20 → 387,276
this.add(buttonClose, c);
this.buttonLettrer.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
 
try {
int[] rowIndex = LettragePanel.this.ecriturePanel.getListe().getJTable().getSelectedRows();
actionLettrage(rowIndex, false);
} catch (SQLException e1) {
ExceptionHandler.handle("Erreur de lettrage", e1);
}
 
// System.err.println("Action lettrage sur " + i);
actionLettrage(rowIndex);
}
});
 
this.buttonRegler.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
 
final List<SQLRowValues> res = LettragePanel.this.ecriturePanel.getListe().getSelectedRows();
 
final SQLTable tableKm = LettragePanel.this.ecriturePanel.getListe().getSource().getPrimaryTable().getTable("SAISIE_KM");
SQLRowValues rowValsKm = new SQLRowValues(tableKm);
rowValsKm.put("DATE", new Date());
rowValsKm.put("ID_JOURNAL", JournalSQLElement.BANQUES);
 
long solde = LettragePanel.this.model.getSoldeSelection();
 
final SQLTable tableKmItem = tableKm.getTable("SAISIE_KM_ELEMENT");
List<String> pieces = new ArrayList<>();
 
for (SQLRowValues sqlRowValues : res) {
SQLRowValues rowValsKmItemTiers = new SQLRowValues(UndefinedRowValuesCache.getInstance().getDefaultRowValues(tableKmItem));
rowValsKmItemTiers.put("NUMERO", sqlRowValues.getForeign("ID_COMPTE_PCE").getString("NUMERO"));
rowValsKmItemTiers.put("NOM", sqlRowValues.getForeign("ID_COMPTE_PCE").getString("NOM"));
final String pieceNom;
if (sqlRowValues.getString("NOM_PIECE").trim().length() > 0) {
pieceNom = sqlRowValues.getString("NOM_PIECE");
} else {
pieceNom = sqlRowValues.getForeign("ID_MOUVEMENT").getForeign("ID_PIECE").getString("NOM");
}
rowValsKmItemTiers.put("NOM_PIECE", pieceNom);
if (pieceNom != null && pieceNom.trim().length() > 0) {
pieces.add(pieceNom);
}
rowValsKmItemTiers.put("CREDIT", sqlRowValues.getLong("DEBIT"));
rowValsKmItemTiers.put("DEBIT", sqlRowValues.getLong("CREDIT"));
if (rowValsKmItemTiers.getTable().contains("MONTANT_ECHEANCE")) {
rowValsKmItemTiers.put("MONTANT_ECHEANCE", sqlRowValues.getLong("CREDIT"));
}
rowValsKmItemTiers.put("ID_SAISIE_KM", rowValsKm);
}
 
SQLRowValues rowValsKmItemBq = new SQLRowValues(UndefinedRowValuesCache.getInstance().getDefaultRowValues(tableKmItem));
boolean achat = solde < 0;
// Compte bq
int idPce = tableKm.getTable("TYPE_REGLEMENT").getRow(2).getInt("ID_COMPTE_PCE_" + (achat ? "FOURN" : "CLIENT"));
if (idPce <= 1) {
try {
idPce = ComptePCESQLElement.getIdComptePceDefault("VenteCB");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
final SQLTable tableAccount = tableKmItem.getTable("COMPTE_PCE");
SQLRow rowCptBq = tableAccount.getRow(idPce);
rowValsKmItemBq.put("NUMERO", rowCptBq.getString("NUMERO"));
rowValsKmItemBq.put("NOM", rowCptBq.getString("NOM"));
if (!pieces.isEmpty()) {
StringBuilder build = new StringBuilder();
int nbPieces = pieces.size();
int i = 0;
for (String string : pieces) {
build.append(string);
i++;
if (i < nbPieces) {
build.append(", ");
}
 
}
rowValsKmItemBq.put("NOM_PIECE", build.toString());
}
 
if (solde > 0) {
rowValsKmItemBq.put("CREDIT", solde);
rowValsKmItemBq.put("DEBIT", 0L);
} else {
rowValsKmItemBq.put("DEBIT", -solde);
rowValsKmItemBq.put("CREDIT", 0L);
}
rowValsKmItemBq.put("ID_SAISIE_KM", rowValsKm);
 
EditFrame frame = new EditFrame(Configuration.getInstance().getDirectory().getElement("SAISIE_KM"), EditMode.CREATION);
frame.getSQLComponent().select(rowValsKm);
frame.setVisible(true);
frame.addEditPanelListener(new EditPanelListener() {
 
@Override
public void modified() {
// TODO Auto-generated method stub
 
}
 
@Override
public void inserted(int id) {
List<SQLRow> rowsInserted = tableKm.getRow(id).getReferentRows(tableKmItem);
List<String> piece = new ArrayList<>();
List<SQLRowAccessor> rowsToLettre = new ArrayList<>();
long solde = 0;
for (SQLRowValues sqlRowValues : res) {
rowsToLettre.add(sqlRowValues);
final String nomPiece = sqlRowValues.getString("NOM_PIECE");
if (sqlRowValues.getForeign("ID_COMPTE_PCE").getString("NUMERO").startsWith("4") && nomPiece.trim().length() > 0) {
piece.add(nomPiece);
}
solde += sqlRowValues.getLong("DEBIT");
solde -= sqlRowValues.getLong("CREDIT");
}
 
for (SQLRow sqlRow : rowsInserted) {
SQLRow rowEcr = sqlRow.getForeign("ID_ECRITURE");
 
final String nomPiece = sqlRow.getString("NOM_PIECE");
if (rowEcr.getString("COMPTE_NUMERO").startsWith("4")) {
solde += rowEcr.getLong("DEBIT");
solde -= rowEcr.getLong("CREDIT");
if (nomPiece.trim().length() > 0) {
piece.add(nomPiece);
}
rowsToLettre.add(rowEcr);
}
}
 
if (solde == 0) {
final String codeLettre = codeLettrage.getText().trim();
 
for (SQLRowAccessor row2 : rowsToLettre) {
 
SQLRowValues rowVals = new SQLRowValues(row2.getTable());
 
// Lettrage
// On lettre ou relettre la ligne avec le code saisi
if (codeLettre.length() > 0) {
rowVals.put("LETTRAGE_PARTIEL", "");
rowVals.put("LETTRAGE", codeLettre);
rowVals.put("DATE_LETTRAGE", dateLettrage.getDate());
try {
rowVals.update(row2.getID());
} catch (SQLException e1) {
 
e1.printStackTrace();
}
}
}
// Mise à jour du code de lettrage
SQLElement elt = Configuration.getInstance().getDirectory().getElement("NUMEROTATION_AUTO");
SQLRowValues rowVals = elt.getTable().getRow(2).createEmptyUpdateRow();
rowVals.put("CODE_LETTRAGE", codeLettre);
try {
rowVals.update();
} catch (SQLException e) {
e.printStackTrace();
}
codeLettrage.setText(getNextCodeLettrage());
 
model.updateTotauxCompte();
} else {
String codeLettreP = codeLettragePartiel.getText().trim();
String codeLettre = codeLettrage.getText().trim();
 
SQLSelect selEcr = new SQLSelect();
SQLTable tableEcr = tableKm.getTable("ECRITURE");
selEcr.addSelect(tableEcr.getKey());
selEcr.addSelect(tableEcr.getField("NOM_PIECE"));
selEcr.addSelect(tableEcr.getField("DEBIT"));
selEcr.addSelect(tableEcr.getField("CREDIT"));
selEcr.addSelect(tableEcr.getField("LETTRAGE"));
selEcr.addSelect(tableEcr.getField("LETTRAGE_PARTIEL"));
Where w2 = new Where(tableEcr.getField("NOM_PIECE"), piece);
w2 = w2.and(new Where(tableEcr.getField("COMPTE_NUMERO"), "LIKE", "40%").or(new Where(tableEcr.getField("COMPTE_NUMERO"), "LIKE", "41%")));
w2 = w2.and(new Where(tableEcr.getField("DATE_LETTRAGE"), "=", (Object) null));
selEcr.setWhere(w2);
 
List<SQLRow> rows = SQLRowListRSH.execute(selEcr);
ListMap<String, SQLRow> mapPiece = new ListMap<>();
Map<String, Long> soldePiece = new HashMap<>();
for (SQLRow sqlRow : rows) {
String pieceName = sqlRow.getString("NOM_PIECE");
mapPiece.add(pieceName, sqlRow);
long soldeRow = sqlRow.getLong("DEBIT") - sqlRow.getLong("CREDIT");
if (soldePiece.containsKey(pieceName)) {
soldePiece.put(pieceName, soldePiece.get(pieceName) + soldeRow);
} else {
soldePiece.put(pieceName, soldeRow);
}
}
 
for (Entry<String, List<SQLRow>> entry : mapPiece.entrySet()) {
 
if (soldePiece.get(entry.getKey()) == 0) {
try {
for (SQLRow rowEcr : entry.getValue()) {
SQLRowValues rowVals = rowEcr.createEmptyUpdateRow();
 
// Lettrage
// On lettre ou relettre la ligne avec le code saisi
if (codeLettre.length() > 0) {
rowVals.put("LETTRAGE_PARTIEL", "");
rowVals.put("LETTRAGE", codeLettre);
rowVals.put("DATE_LETTRAGE", dateLettrage.getDate());
rowVals.update();
}
}
// Mise à jour du code de lettrage
SQLElement elt = Configuration.getInstance().getDirectory().getElement("NUMEROTATION_AUTO");
SQLRowValues rowVals = elt.getTable().getRow(2).createEmptyUpdateRow();
rowVals.put("CODE_LETTRAGE", codeLettre);
rowVals.update();
 
codeLettre = getNextCodeLettrage();
} catch (SQLException e) {
e.printStackTrace();
}
} else {
try {
for (SQLRow rowEcr : entry.getValue()) {
SQLRowValues rowVals = rowEcr.createEmptyUpdateRow();
 
// Lettrage
// On lettre ou relettre la ligne avec le code saisi
if (codeLettreP.length() > 0) {
 
rowVals.put("LETTRAGE_PARTIEL", codeLettreP);
rowVals.update();
 
}
}
// Mise à jour du code de lettrage
SQLElement elt = Configuration.getInstance().getDirectory().getElement("NUMEROTATION_AUTO");
SQLRowValues rowVals = elt.getTable().getRow(2).createEmptyUpdateRow();
rowVals.put("CODE_LETTRAGE_PARTIEL", codeLettreP);
rowVals.update();
codeLettreP = getNextCodeLettragePartiel();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
codeLettrage.setText(getNextCodeLettrage());
 
codeLettragePartiel.setText(getNextCodeLettragePartiel());
model.updateTotauxCompte();
}
}
 
@Override
public void deleted() {
// TODO Auto-generated method stub
 
}
 
@Override
public void cancelled() {
// TODO Auto-generated method stub
 
}
});
}
});
 
buttonDelettrer.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
 
int[] rowIndex = LettragePanel.this.ecriturePanel.getListe().getJTable().getSelectedRows();
actionDelettrage(rowIndex);
actionDelettrage(rowIndex, false);
}
});
 
397,6 → 685,7
LettragePanel.this.warningSolde.setVisible(LettragePanel.this.model.getSoldeSelection() != 0);
buttonDelettrer.setEnabled(LettragePanel.this.model.getSoldeSelection() == 0);
LettragePanel.this.buttonLettrer.setEnabled(LettragePanel.this.model.getSoldeSelection() == 0);
LettragePanel.this.buttonRegler.setEnabled(!LettragePanel.this.ecriturePanel.getListe().getSelectedRows().isEmpty());
}
});
 
434,27 → 723,59
this.buttonLettrer.setEnabled((this.codeLettrage.getText().trim().length() != 0));
}
 
private String getNextCodeLettragePartiel() {
return Configuration.getInstance().getDirectory().getElement(NumerotationAutoSQLElement.class).getNextCodeLettragePartiel();
}
 
private String getNextCodeLettrage() {
return Configuration.getInstance().getDirectory().getElement(NumerotationAutoSQLElement.class).getNextCodeLettrage();
}
 
/* Menu clic Droit */
private void addActionMenuDroit() {
// JPopupMenu menu = new JPopupMenu();
 
this.ecriturePanel.getListe().addRowAction(new AbstractAction("Voir la source") {
PredicateRowAction action = new PredicateRowAction(new AbstractAction() {
public void actionPerformed(ActionEvent e) {
 
SQLRow rowEcr = LettragePanel.this.ecriturePanel.getListe().fetchSelectedRow();
MouvementSQLElement.showSource(rowEcr.getInt("ID_MOUVEMENT"));
}
}, "financing.accouning.entries.source.show");
}, false, "financing.accouning.entries.source.show");
action.setPredicate(IListeEvent.getSingleSelectionPredicate());
 
// if (this.codeLettrage.getText().trim().length() != 0) {
this.ecriturePanel.getListe().addIListeAction(action);
 
final AbstractAction abstractAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
 
try {
int[] rowIndex = LettragePanel.this.ecriturePanel.getListe().getJTable().getSelectedRows();
actionLettrage(rowIndex);
actionLettrage(rowIndex, false);
} catch (SQLException e1) {
ExceptionHandler.handle("erreur de lettrage", e1);
}
}
};
this.ecriturePanel.getListe().addRowAction(abstractAction, "financing.accouning.entries.match");
PredicateRowAction actionLettre = new PredicateRowAction(abstractAction, false, "financing.accouning.entries.match");
actionLettre.setPredicate(IListeEvent.getNonEmptySelectionPredicate());
this.ecriturePanel.getListe().addIListeAction(actionLettre);
 
final AbstractAction abstractActionPartiel = new AbstractAction("Lettrage Partiel") {
public void actionPerformed(ActionEvent e) {
 
try {
int[] rowIndex = LettragePanel.this.ecriturePanel.getListe().getJTable().getSelectedRows();
actionLettrage(rowIndex, true);
} catch (SQLException e1) {
ExceptionHandler.handle("erreur de lettrage", e1);
}
}
};
PredicateRowAction actionLettreP = new PredicateRowAction(abstractActionPartiel, false, "financing.accouning.entries.match.partial");
actionLettreP.setPredicate(IListeEvent.getNonEmptySelectionPredicate());
this.ecriturePanel.getListe().addIListeAction(actionLettreP);
 
// }
this.codeLettrage.getDocument().addDocumentListener(new SimpleDocumentListener() {
@Override
467,13 → 788,20
public void actionPerformed(ActionEvent e) {
 
int[] rowIndex = LettragePanel.this.ecriturePanel.getListe().getJTable().getSelectedRows();
actionDelettrage(rowIndex);
actionDelettrage(rowIndex, false);
}
}, "financing.accouning.entries.unmatch");
 
// menu.show(mE.getComponent(), mE.getPoint().x, mE.getPoint().y);
this.ecriturePanel.getListe().addRowAction(new AbstractAction("Délettrer partiel") {
public void actionPerformed(ActionEvent e) {
 
int[] rowIndex = LettragePanel.this.ecriturePanel.getListe().getJTable().getSelectedRows();
actionDelettrage(rowIndex, true);
}
}, "financing.accouning.entries.unmatch.partial");
 
}
 
/* Panel Warning no numero releve */
private void createPanelWarning() {
 
525,9 → 853,17
}
 
// Lettre la ligne passée en parametre
private void actionLettrage(int[] rowIndex) {
String codeLettre = this.codeLettrage.getText().trim();
 
private void actionLettrage(int[] rowIndex, boolean partiel) throws SQLException {
 
String codeLettre;
if (partiel) {
codeLettre = this.codeLettragePartiel.getText().trim();
} else {
codeLettre = this.codeLettrage.getText().trim();
}
// FIXME : transaction
 
List<SQLRow> rowsSelected = new ArrayList<SQLRow>(rowIndex.length);
 
long solde = 0;
540,7 → 876,7
solde -= ((Long) row.getObject("CREDIT")).longValue();
}
 
if (solde == 0) {
if (partiel || solde == 0) {
 
for (SQLRow row2 : rowsSelected) {
 
555,8 → 891,12
EcritureSQLElement.validationEcritures(row2.getInt("ID_MOUVEMENT"));
}
 
if (partiel) {
rowVals.put("LETTRAGE_PARTIEL", codeLettre);
} else {
rowVals.put("LETTRAGE", codeLettre);
rowVals.put("DATE_LETTRAGE", this.dateLettrage.getDate());
}
try {
rowVals.update(row2.getID());
} catch (SQLException e1) {
568,7 → 908,11
// Mise à jour du code de lettrage
SQLElement elt = Configuration.getInstance().getDirectory().getElement("NUMEROTATION_AUTO");
SQLRowValues rowVals = elt.getTable().getRow(2).createEmptyUpdateRow();
if (partiel) {
rowVals.put("CODE_LETTRAGE_PARTIEL", codeLettre);
} else {
rowVals.put("CODE_LETTRAGE", codeLettre);
}
try {
rowVals.update();
} catch (SQLException e) {
576,6 → 920,12
}
this.codeLettrage.setText(NumerotationAutoSQLElement.getNextCodeLettrage());
 
if (partiel) {
this.codeLettragePartiel.setText(getNextCodeLettragePartiel());
} else {
this.codeLettrage.setText(getNextCodeLettrage());
}
 
this.model.updateTotauxCompte();
}
}
592,7 → 942,7
}
 
// Pointe la ligne passée en parametre
private void actionDelettrage(int[] rowIndex) {
private void actionDelettrage(int[] rowIndex, boolean partiel) {
 
List<SQLRow> rowsSelected = new ArrayList<SQLRow>(rowIndex.length);
 
606,11 → 956,22
solde -= ((Long) row.getObject("CREDIT")).longValue();
}
 
if (solde == 0) {
if (partiel || solde == 0) {
for (SQLRow row : rowsSelected) {
 
SQLRowValues rowVals = new SQLRowValues(this.tableEcr);
if (partiel) {
// Dépointage
if (row.getString("LETTRAGE_PARTIEL").trim().length() != 0) {
 
rowVals.put("LETTRAGE_PARTIEL", "");
try {
rowVals.update(row.getID());
} catch (SQLException e1) {
e1.printStackTrace();
}
}
} else {
// Dépointage
if (row.getString("LETTRAGE").trim().length() != 0) {
 
624,6 → 985,7
}
}
}
}
this.model.updateTotauxCompte();
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/PointagePanel.java
14,6 → 14,7
package org.openconcerto.erp.core.finance.accounting.ui;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.common.ui.DeviseField;
import org.openconcerto.erp.core.common.ui.DeviseNiceTableCellRenderer;
import org.openconcerto.erp.core.finance.accounting.element.ComptePCESQLElement;
import org.openconcerto.erp.core.finance.accounting.element.EcritureSQLElement;
74,7 → 75,6
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
 
86,6 → 86,9
private final JDate datePointee;
private JCheckBox boxValidEcriture;
private JPanel warningPanel;
private final DeviseField fieldSoldeD = new DeviseField(15);
private final DeviseField fieldSoldeA = new DeviseField(15);
private final DeviseField fieldEcart = new DeviseField(15);
 
private final SQLBase base = ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete();
private final SQLTable tableEcr = this.base.getTable("ECRITURE");
204,6 → 207,67
c.gridwidth = 1;
this.add(this.datePointee, c);
 
JPanel panelCheckValue = new JPanel(new GridBagLayout());
GridBagConstraints cCheck = new DefaultGridBagConstraints();
JLabel labelSoldeD = new JLabel("Solde de départ");
labelSoldeD.setHorizontalAlignment(SwingConstants.RIGHT);
cCheck.gridwidth = 1;
cCheck.weightx = 0;
panelCheckValue.add(labelSoldeD, cCheck);
 
cCheck.fill = GridBagConstraints.NONE;
cCheck.weightx = 1;
cCheck.gridx++;
cCheck.gridwidth = 1;
panelCheckValue.add(this.fieldSoldeD, cCheck);
 
JLabel labelSoldeA = new JLabel("Solde d'arrivée");
labelSoldeA.setHorizontalAlignment(SwingConstants.RIGHT);
cCheck.gridx++;
 
cCheck.gridwidth = 1;
cCheck.weightx = 0;
panelCheckValue.add(labelSoldeA, cCheck);
cCheck.fill = GridBagConstraints.NONE;
cCheck.weightx = 1;
cCheck.gridx++;
cCheck.gridwidth = 1;
panelCheckValue.add(this.fieldSoldeA, cCheck);
 
JLabel labelEcart = new JLabel("Ecart pointage");
labelEcart.setHorizontalAlignment(SwingConstants.RIGHT);
cCheck.gridx++;
cCheck.gridwidth = 1;
cCheck.weightx = 0;
panelCheckValue.add(labelEcart, cCheck);
 
cCheck.fill = GridBagConstraints.NONE;
cCheck.weightx = 1;
cCheck.gridx++;
cCheck.gridwidth = 1;
this.fieldEcart.setEditable(false);
panelCheckValue.add(this.fieldEcart, cCheck);
 
c.gridx++;
c.gridwidth = 3;
c.weightx = 1;
this.add(panelCheckValue, c);
this.fieldSoldeA.getDocument().addDocumentListener(new SimpleDocumentListener() {
 
@Override
public void update(DocumentEvent e) {
PointagePanel.this.model.updateTotauxCompte(PointagePanel.this.fieldSoldeD, PointagePanel.this.fieldSoldeA, PointagePanel.this.fieldEcart);
}
});
 
this.fieldSoldeD.getDocument().addDocumentListener(new SimpleDocumentListener() {
 
@Override
public void update(DocumentEvent e) {
PointagePanel.this.model.updateTotauxCompte(PointagePanel.this.fieldSoldeD, PointagePanel.this.fieldSoldeA, PointagePanel.this.fieldEcart);
}
});
 
TitledSeparator sepPeriode = new TitledSeparator("Filtre ");
c.gridy++;
c.gridx = 0;
244,7 → 308,7
this.dateDeb.addValueListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
changeListRequest();
PointagePanel.this.model.updateTotauxCompte();
PointagePanel.this.model.updateTotauxCompte(PointagePanel.this.fieldSoldeD, PointagePanel.this.fieldSoldeA, PointagePanel.this.fieldEcart);
}
});
 
254,7 → 318,7
this.dateFin.addValueListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
changeListRequest();
PointagePanel.this.model.updateTotauxCompte();
PointagePanel.this.model.updateTotauxCompte(PointagePanel.this.fieldSoldeD, PointagePanel.this.fieldSoldeA, PointagePanel.this.fieldEcart);
}
});
 
446,7 → 510,7
this.ecriturePanel.getListe().addListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
PointagePanel.this.model.updateTotauxCompte();
PointagePanel.this.model.updateTotauxCompte(PointagePanel.this.fieldSoldeD, PointagePanel.this.fieldSoldeA, PointagePanel.this.fieldEcart);
}
});
 
457,7 → 521,7
public void update(DocumentEvent e) {
PointagePanel.this.warningPanel.setVisible((PointagePanel.this.codePointage.getText().trim().length() == 0));
PointagePanel.this.buttonPointer.setEnabled((PointagePanel.this.codePointage.getText().trim().length() != 0));
PointagePanel.this.model.updateTotauxCompte();
PointagePanel.this.model.updateTotauxCompte(PointagePanel.this.fieldSoldeD, PointagePanel.this.fieldSoldeA, PointagePanel.this.fieldEcart);
}
});
 
569,7 → 633,7
e1.printStackTrace();
}
}
this.model.updateTotauxCompte();
this.model.updateTotauxCompte(PointagePanel.this.fieldSoldeD, PointagePanel.this.fieldSoldeA, PointagePanel.this.fieldEcart);
}
 
public ListPanelEcritures getEcriturePanel() {
596,7 → 660,7
e1.printStackTrace();
}
}
this.model.updateTotauxCompte();
this.model.updateTotauxCompte(PointagePanel.this.fieldSoldeD, PointagePanel.this.fieldSoldeA, PointagePanel.this.fieldEcart);
}
 
/*
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/ComptaPrefTreeNode.java
96,6 → 96,10
 
nsGlobale.add(new PrefTreeNode(PayeGlobalPreferencePanel.class, "Paye", new String[] { "paye", "csg" }));
 
// Comptabilité
final PrefTreeNode nCompta = new PrefTreeNode(ComptabiliteWorkflowPreferencePanel.class, "Comptabilité", new String[] { "comptabilité", "lettrage" });
nsGlobale.add(nCompta);
 
// Gestion commerciale
final PrefTreeNode nGestionArticle = new PrefTreeNode(GestionArticlePreferencePanel.class, "Gestion des articles", new String[] { "articles", "gestion", "longueur", "largeur", "poids" });
final PrefTreeNode nGestionPiece = new PrefTreeNode(GestionPieceCommercialePanel.class, "Gestion des pièces commerciales", new String[] { "mouvements", "pieces", "facture" });
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/PropoLettrage.java
New file
0,0 → 1,239
/*
* 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.finance.accounting.ui;
 
import org.openconcerto.erp.config.Gestion;
import org.openconcerto.erp.core.common.element.NumerotationAutoSQLElement;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.ConnectionHandlerNoSetup;
import org.openconcerto.sql.model.SQLDataSource;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.utils.SQLUtils;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.FrameUtil;
import org.openconcerto.ui.JDate;
import org.openconcerto.ui.JLabelBold;
import org.openconcerto.utils.TableSorter;
import org.openconcerto.utils.Tuple2;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
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.sql.SQLException;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
 
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
 
public class PropoLettrage {
 
private SQLElement eltEcr;
private Date dateKm;
 
public PropoLettrage(SQLElement eltEcr) {
this.eltEcr = eltEcr;
}
 
public void transfert(SQLRow rowKM) {
List<SQLRow> rowItems = rowKM.getReferentRows(rowKM.getTable().getTable("SAISIE_KM_ELEMENT").getField("ID_SAISIE_KM"));
 
this.dateKm = rowKM.getDate("DATE").getTime();
 
Set<Tuple2<String, String>> cpts = new HashSet();
for (SQLRow sqlRow : rowItems) {
final String cptNumero = sqlRow.getString("NUMERO");
if (cptNumero.startsWith("40") || cptNumero.startsWith("41")) {
cpts.add(Tuple2.create(cptNumero, sqlRow.getString("NOM")));
}
}
if (!cpts.isEmpty()) {
 
for (Tuple2<String, String> cpt : cpts) {
 
SQLRowValues rowValsEcr = new SQLRowValues(this.eltEcr.getTable());
rowValsEcr.putNulls("DEBIT", "CREDIT", "ID", "COMPTE_NOM", "COMPTE_NUMERO", "NOM", "NOM_PIECE", "DATE");
rowValsEcr.putRowValues("ID_MOUVEMENT").putNulls("NUMERO").putRowValues("ID_PIECE").putNulls("NOM");
List<SQLRowValues> resultEcrNonLettrees = SQLRowValuesListFetcher.create(rowValsEcr).fetch(new Where(this.eltEcr.getTable().getField("COMPTE_NUMERO"), "=", cpt.get0())
.and(new Where(this.eltEcr.getTable().getField("LETTRAGE"), "=", "").or(new Where(this.eltEcr.getTable().getField("LETTRAGE"), "=", (Object) null))));
showPreview(resultEcrNonLettrees, cpt);
}
}
}
 
private void showPreview(final List<SQLRowValues> rows, Tuple2<String, String> compte) {
if (rows.isEmpty() || rows.size() == 1) {
return;
}
JPanel panelPreview = new JPanel(new GridBagLayout());
GridBagConstraints c = new DefaultGridBagConstraints();
final PropoLettrageTableModel propoModel = new PropoLettrageTableModel(this.eltEcr, rows);
final TableSorter s = new TableSorter(propoModel);
final JTable table = new JTable(s);
s.setTableHeader(table.getTableHeader());
final int columnCount = table.getColumnCount();
for (int col = 0; col < columnCount; col++) {
 
table.getColumnModel().getColumn(col).setCellRenderer(new PropoLettrageRenderer());
}
 
c.gridwidth = GridBagConstraints.REMAINDER;
 
panelPreview.add(new JLabelBold("Ecritures non lettrées du compte " + compte.get0() + " " + compte.get1()), c);
c.gridx = 0;
c.gridy++;
c.fill = GridBagConstraints.BOTH;
c.gridwidth = GridBagConstraints.REMAINDER;
c.weightx = 1;
c.weighty = 1;
panelPreview.add(new JScrollPane(table), c);
 
c.gridy++;
c.gridx = 0;
c.gridwidth = 1;
c.weighty = 0;
c.weightx = 0;
c.fill = GridBagConstraints.HORIZONTAL;
panelPreview.add(new JLabel("Lettrer les écritures sélectionnées à la date du "), c);
final JDate date = new JDate();
date.setValue(this.dateKm);
c.gridx++;
panelPreview.add(date);
 
JDialog diag = new JDialog();
diag.setModal(true);
diag.setContentPane(panelPreview);
diag.setTitle("Lettrage " + compte.get0() + " " + compte.get1());
 
c.gridy++;
c.fill = GridBagConstraints.NONE;
c.anchor = GridBagConstraints.EAST;
c.weightx = 1;
c.weighty = 0;
c.gridwidth = 1;
final JButton valid = new JButton(new AbstractAction("Lettrer") {
 
@Override
public void actionPerformed(ActionEvent e) {
try {
SQLUtils.executeAtomic(eltEcr.getTable().getDBSystemRoot().getDataSource(), new ConnectionHandlerNoSetup<Object, Exception>() {
@Override
public Object handle(SQLDataSource ds) throws SQLException, Exception {
String codeLettre = NumerotationAutoSQLElement.getNextCodeLettrage();
int[] selectedRows = table.getSelectedRows();
int[] modelRows = new int[selectedRows.length];
int nb = 0;
for (int i : selectedRows) {
modelRows[nb] = s.modelIndex(i);
nb++;
}
 
final Date dateLettrage = date.getValue() == null ? new Date() : date.getValue();
for (int index : modelRows) {
 
SQLRowValues rowValsEcr = propoModel.getRowValuesAt(index).createEmptyUpdateRow();
// Lettrage
// On lettre ou relettre la ligne avec le code saisi
if (codeLettre.length() > 0) {
 
rowValsEcr.put("LETTRAGE", codeLettre);
rowValsEcr.put("DATE_LETTRAGE", dateLettrage);
 
rowValsEcr.update();
 
}
 
}
// Mise à jour du code de lettrage
SQLElement elt = Configuration.getInstance().getDirectory().getElement("NUMEROTATION_AUTO");
SQLRowValues rowVals = elt.getTable().getRow(2).createEmptyUpdateRow();
rowVals.put("CODE_LETTRAGE", codeLettre);
 
rowVals.update();
 
return null;
}
});
} catch (Exception e1) {
org.openconcerto.utils.ExceptionHandler.handle("Erreur lors du lettrage", e1);
}
diag.dispose();
}
});
panelPreview.add(valid, c);
valid.setEnabled(false);
c.weightx = 0;
c.gridx++;
JButton fermer = new JButton(new AbstractAction("Fermer") {
 
@Override
public void actionPerformed(ActionEvent e) {
diag.dispose();
}
});
 
panelPreview.add(fermer, c);
 
table.addMouseListener(new MouseAdapter() {
 
public void mouseReleased(MouseEvent e) {
int[] selectedRows = table.getSelectedRows();
int[] modelRows = new int[selectedRows.length];
int nb = 0;
for (int i : selectedRows) {
modelRows[nb] = s.modelIndex(i);
nb++;
}
valid.setEnabled(propoModel.isSelectionEqual(modelRows));
}
});
 
table.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
 
int[] selectedRows = table.getSelectedRows();
int[] modelRows = new int[selectedRows.length];
int nb = 0;
for (int i : selectedRows) {
modelRows[nb] = s.modelIndex(i);
nb++;
}
 
valid.setEnabled(propoModel.isSelectionEqual(modelRows));
 
}
});
diag.pack();
diag.setIconImage(new ImageIcon(Gestion.class.getResource("frameicon.png")).getImage());
diag.setLocationRelativeTo(null);
FrameUtil.show(diag);
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/SuppressionEcrituresPanel.java
20,6 → 20,7
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.warning.JLabelWarning;
 
27,7 → 28,10
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
 
import javax.swing.JButton;
import javax.swing.JFrame;
69,13 → 73,20
c.gridx = 0;
this.add(labelMouv, c);
s.append(idS[0]);
List<Integer> idMvts = new ArrayList<>();
for (int i = 1; i < idS.length; i++) {
 
idMvts.add(idS[i]);
s.append(", ");
s.append(idS[i]);
}
s.append(')');
 
Set<String> lettrage = getLettrage(idMvts);
if (lettrage != null && !lettrage.isEmpty()) {
s.append("\nAttention certaines écritures sont lettrées avec les codes(" + org.openconcerto.utils.CollectionUtils.join(lettrage, ",") + "!");
}
labelMouv.setText(s.toString());
 
}
 
JButton buttonOK = new JButton("OK");
132,4 → 143,26
return idS;
}
 
private Set<String> getLettrage(List<Integer> mvtIds) {
 
Set<String> codes = new HashSet<>();
 
SQLBase b = ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete();
SQLTable tableEcr = b.getTable("ECRITURE");
 
SQLSelect sel = new SQLSelect();
sel.setDistinct(true);
sel.addSelect(tableEcr.getField("LETTRAGE"));
sel.setWhere(new Where(tableEcr.getField("ID_MOUVEMENT"), mvtIds).and(new Where(tableEcr.getField("LETTRAGE"), "=", "").and(new Where(tableEcr.getField("LETTRAGE"), "!=", (Object) null))));
 
List l = (List) b.getDataSource().execute(sel.asString(), new ArrayListHandler());
 
for (int i = 0; i < l.size(); i++) {
Object[] tmp = (Object[]) l.get(i);
codes.add(((String) tmp[0]));
}
 
return codes;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/CompteGestCommPreferencePanel.java
18,7 → 18,6
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;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLRow;
36,7 → 35,6
import java.awt.Insets;
import java.sql.SQLException;
 
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
50,10 → 48,6
private final static SQLBase base = ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete();
private static final SQLTable tablePrefCompte = base.getTable("PREFS_COMPTE");
private SQLRowValues rowPrefCompteVals = new SQLRowValues(tablePrefCompte);
private JCheckBox checkLettrageAuto = new JCheckBox("Activer le lettrage automatique.");
private JCheckBox checkHideCompteFacture = new JCheckBox("Ne pas afficher les comptes dans les factures.");
private JCheckBox checkHideCompteClient = new JCheckBox("Ne pas afficher les comptes dans les clients.");
private JCheckBox checkHideAnalytique = new JCheckBox("Ne pas afficher l'analytique dans les saisies au kilomètre.");
 
public CompteGestCommPreferencePanel() {
super();
78,14 → 72,6
c.weighty = 0;
 
c.gridwidth = GridBagConstraints.REMAINDER;
this.add(this.checkLettrageAuto, c);
c.gridy++;
this.add(this.checkHideCompteClient, c);
c.gridy++;
this.add(this.checkHideCompteFacture, c);
c.gridy++;
this.add(this.checkHideAnalytique, c);
c.gridy++;
 
/*******************************************************************************************
* SAISIE DES ACHATS
375,11 → 361,6
this.rowPrefCompteVals.put("ID_COMPTE_PCE_TVA_IMMO", this.selCompteTVAImmo.getValue());
this.rowPrefCompteVals.put("ID_COMPTE_PCE_PORT_SOUMIS", this.selComptePortSoumis.getValue());
this.rowPrefCompteVals.put("ID_COMPTE_PCE_PORT_NON_SOUMIS", this.selComptePortNonSoumis.getValue());
this.rowPrefCompteVals.put("AUTO_LETTRAGE", this.checkLettrageAuto.isSelected());
DefaultNXProps.getInstance().setProperty("HideCompteClient", String.valueOf(this.checkHideCompteClient.isSelected()));
DefaultNXProps.getInstance().setProperty("HideCompteFacture", String.valueOf(this.checkHideCompteFacture.isSelected()));
DefaultNXProps.getInstance().setProperty("HideAnalytique", String.valueOf(this.checkHideAnalytique.isSelected()));
DefaultNXProps.getInstance().store();
try {
final Object[] pb = this.rowPrefCompteVals.getInvalid();
if (pb != null) {
402,8 → 383,6
 
compte = ComptePCESQLElement.getComptePceDefault("Achats");
 
this.checkLettrageAuto.setSelected(false);
 
int value = ComptePCESQLElement.getId(compte);
this.selCompteAchat.setValue(value);
 
525,20 → 504,16
}
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");
setComboValues(selCompteValeurEncaissement, "ID_COMPTE_PCE_VALEUR_ENCAISSEMENT", "ValeurEncaissement");
setComboValues(selComptePortSoumis, "ID_COMPTE_PCE_PORT_SOUMIS", "PortVenteSoumisTVA");
setComboValues(selComptePortNonSoumis, "ID_COMPTE_PCE_PORT_NON_SOUMIS", "PortVenteNonSoumisTVA");
setComboValues(selCompteTVACol, "ID_COMPTE_PCE_TVA_VENTE", "TVACollectee");
setComboValues(selCompteTVADed, "ID_COMPTE_PCE_TVA_ACHAT", "TVADeductible");
setComboValues(selCompteTVAIntraComm, "ID_COMPTE_PCE_TVA_INTRA", "TVAIntraComm");
setComboValues(selCompteTVAImmo, "ID_COMPTE_PCE_TVA_IMMO", "TVAImmo");
this.checkLettrageAuto.setSelected(rowPrefCompteVals.getBoolean("AUTO_LETTRAGE"));
this.checkHideCompteClient.setSelected(Boolean.valueOf(DefaultNXProps.getInstance().getProperty("HideCompteClient")));
this.checkHideCompteFacture.setSelected(Boolean.valueOf(DefaultNXProps.getInstance().getProperty("HideCompteFacture")));
this.checkHideAnalytique.setSelected(Boolean.valueOf(DefaultNXProps.getInstance().getProperty("HideAnalytique")));
setComboValues(this.selCompteFourn, "ID_COMPTE_PCE_FOURNISSEUR", "Fournisseurs");
setComboValues(this.selCompteClient, "ID_COMPTE_PCE_CLIENT", "Clients");
setComboValues(this.selCompteAvanceClient, "ID_COMPTE_PCE_AVANCE_CLIENT", "AvanceClients");
setComboValues(this.selCompteValeurEncaissement, "ID_COMPTE_PCE_VALEUR_ENCAISSEMENT", "ValeurEncaissement");
setComboValues(this.selComptePortSoumis, "ID_COMPTE_PCE_PORT_SOUMIS", "PortVenteSoumisTVA");
setComboValues(this.selComptePortNonSoumis, "ID_COMPTE_PCE_PORT_NON_SOUMIS", "PortVenteNonSoumisTVA");
setComboValues(this.selCompteTVACol, "ID_COMPTE_PCE_TVA_VENTE", "TVACollectee");
setComboValues(this.selCompteTVADed, "ID_COMPTE_PCE_TVA_ACHAT", "TVADeductible");
setComboValues(this.selCompteTVAIntraComm, "ID_COMPTE_PCE_TVA_INTRA", "TVAIntraComm");
setComboValues(this.selCompteTVAImmo, "ID_COMPTE_PCE_TVA_IMMO", "TVAImmo");
} catch (Exception e) {
e.printStackTrace();
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/PropoLettrageTableModel.java
New file
0,0 → 1,106
/*
* 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.finance.accounting.ui;
 
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRowValues;
 
import java.util.Arrays;
import java.util.Date;
import java.util.List;
 
import javax.swing.table.AbstractTableModel;
 
public class PropoLettrageTableModel extends AbstractTableModel {
 
List<SQLRowValues> datas;
 
List<String> colName = Arrays.asList("Libellé", "N° Mouvement", "Pièce", "Pièce commerciale", "Date", "Débit", "Crédit");
List<String> fieldName = Arrays.asList("NOM", "ID_MOUVEMENT", "ID_PIECE", "PIECE_COMMERCIALE", "DATE", "DEBIT", "CREDIT");
List<Class<?>> colClass = Arrays.asList(String.class, Integer.class, String.class, String.class, Date.class, Long.class, Long.class);
SQLElement eltEcr;
 
public PropoLettrageTableModel(SQLElement eltEcr, List<SQLRowValues> datas) {
this.datas = datas;
this.eltEcr = eltEcr;
}
 
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
 
@Override
public Class<?> getColumnClass(int columnIndex) {
 
return this.colClass.get(columnIndex);
}
 
@Override
public int getRowCount() {
return this.datas.size();
}
 
@Override
public int getColumnCount() {
return this.fieldName.size();
}
 
@Override
public String getColumnName(int column) {
String field = this.colName.get(column);
return field;
}
 
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
final SQLRowValues sqlRowValues = this.datas.get(rowIndex);
 
final String fieldName2 = this.fieldName.get(columnIndex);
if (fieldName2.startsWith("ID_")) {
if (fieldName2.equals("ID_MOUVEMENT")) {
return sqlRowValues.getForeign("ID_MOUVEMENT").getInt("NUMERO");
} else {
return sqlRowValues.getForeign("ID_MOUVEMENT").getForeign("ID_PIECE").getString("NOM");
}
} else {
return sqlRowValues.getObject(fieldName2);
}
}
 
public boolean isSelectionEqual(int[] selectionIndex) {
if (selectionIndex == null || selectionIndex.length == 0) {
return false;
} else {
long l = 0;
for (int i : selectionIndex) {
l += this.datas.get(i).getLong("DEBIT");
l -= this.datas.get(i).getLong("CREDIT");
}
return l == 0;
}
}
 
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
 
// this.datas.get(rowIndex).put(columnIndex, aValue);
}
 
public SQLRowValues getRowValuesAt(int index) {
return this.datas.get(index);
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/CloturePanel.java
95,7 → 95,7
JLabel label = new JLabel("- report des charges et produits constatés d'avance");
JLabel label2 = new JLabel("- report des charges à payer et produits à recevoir");
JLabel label3 = new JLabel("- impression du bilan, compte de résultat, grand livre, journaux et balance");
JLabel label5 = new JLabel("- génération les écritures comptables des payes");
JLabel label5 = new JLabel("- génération des écritures comptables des payes");
JLabel label4 = new JLabel("Il est préférable de réaliser une sauvegarde avant de continuer.");
 
JLabel op = new JLabelBold("Opérations qui vont etre effectuées: ");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/ListeGestCommEltPanel.java
152,6 → 152,9
}
editModifyFrame.selectionId(this.getListe().getSelectedId());
editModifyFrame.setVisible(true);
// Bouton delete retiré pour passer par la méthode qui supprime les
// ecritures comptables
editModifyFrame.getPanel().disableDelete();
} else {
if (this.editReadOnlyFrame == null) {
this.editReadOnlyFrame = new EditFrame(this.element, EditPanel.READONLY);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/model/PointageModel.java
14,6 → 14,7
package org.openconcerto.erp.core.finance.accounting.model;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.common.ui.DeviseField;
import org.openconcerto.erp.core.finance.accounting.ui.PointagePanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLBase;
111,6 → 112,11
private SwingWorker<String, Object> workerUpdater;
 
public void updateTotauxCompte() {
updateTotauxCompte(null, null, null);
}
 
public void updateTotauxCompte(final DeviseField depart, final DeviseField arrive, final DeviseField ecart) {
 
final Date deb = panel.getDateDeb();
final Date fin = panel.getDateFin();
 
232,6 → 238,15
if (isCancelled()) {
return;
}
if (arrive != null && depart != null && ecart != null) {
final Long valueArrive = arrive.getValue();
final Long valueDepart = depart.getValue();
if (valueArrive != null && valueDepart != null) {
ecart.setValue(valueArrive - valueDepart + PointageModel.this.debitNonPointe - PointageModel.this.creditNonPointe);
} else {
ecart.setValue(null);
}
}
PointageModel.this.fireTableDataChanged();
}
};
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/tax/model/TaxeCache.java
40,10 → 40,12
SQLRowValues rowVals = new SQLRowValues(table);
rowVals.putNulls("TAUX", "CODE", "NOM", "ID_TAXE", "DEFAULT", "DEFAULT_ACHAT");
List<String> compteFields = Arrays.asList("ID_COMPTE_PCE_COLLECTE", "ID_COMPTE_PCE_DED", "ID_COMPTE_PCE", "ID_COMPTE_PCE_VENTE", "ID_COMPTE_PCE_VENTE_SERVICE", "ID_COMPTE_PCE_COLLECTE_INTRA",
"ID_COMPTE_PCE_DED_INTRA");
"ID_COMPTE_PCE_DED_INTRA", "ID_COMPTE_PCE_COLLECTE_ENCAISSEMENT");
for (String foreignFieldName : compteFields) {
if (table.contains(foreignFieldName)) {
rowVals.putRowValues(foreignFieldName).putNulls("NUMERO", "NOM");
}
}
return SQLRowValuesListFetcher.create(rowVals);
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/action/ListeDesRelancesAction.java
14,16 → 14,9
package org.openconcerto.erp.core.finance.payment.action;
 
import org.openconcerto.erp.action.CreateFrameAbstractAction;
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.common.ui.IListFilterDatePanel;
import org.openconcerto.erp.core.sales.invoice.report.VenteFactureXmlSheet;
import org.openconcerto.erp.generationDoc.gestcomm.FicheRelanceSheet;
import org.openconcerto.erp.generationDoc.gestcomm.RelanceSheet;
import org.openconcerto.erp.preferences.PrinterNXProps;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.view.IListFrame;
import org.openconcerto.sql.view.ListeAddPanel;
31,22 → 24,15
import org.openconcerto.sql.view.list.SQLTableModelColumnPath;
import org.openconcerto.sql.view.list.SQLTableModelSourceOnline;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.cc.ITransformer;
 
import java.awt.GridBagConstraints;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.List;
 
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPopupMenu;
 
public class ListeDesRelancesAction extends CreateFrameAbstractAction implements MouseListener {
public class ListeDesRelancesAction extends CreateFrameAbstractAction {
 
private IListFrame frame;
 
67,9 → 53,9
@Override
public String transformChecked(JButton input) {
 
SQLRowAccessor row = getListe().fetchSelectedRow();
SQLRowValues row = getListe().getSelectedRow();
 
if (row.getForeign("ID_TYPE_LETTRE_RELANCE") == null || row.isForeignEmpty("ID_TYPE_LETTRE_RELANCE")) {
if (row.getObject("ID_TYPE_LETTRE_RELANCE") == null || row.isForeignEmpty("ID_TYPE_LETTRE_RELANCE")) {
return "Vous ne pouvez pas modifier une relance envoyée par mail!";
}
return null;
90,7 → 76,6
 
((SQLTableModelColumnPath) src.getColumns(elt.getTable().getField("INFOS")).iterator().next()).setEditable(true);
 
this.frame.getPanel().getListe().getJTable().addMouseListener(this);
this.frame.getPanel().setAddVisible(false);
 
// Date panel
109,124 → 94,4
return this.frame;
}
 
public void mouseClicked(MouseEvent e) {
}
 
public void mousePressed(MouseEvent e) {
 
int selectedId = this.frame.getPanel().getListe().getSelectedId();
if (selectedId > 1 && e.getButton() == MouseEvent.BUTTON3) {
 
// String locationRelance =
// TemplateNXProps.getInstance().getStringProperty("LocationRelanceOO");
final SQLRow rowRelance = this.frame.getPanel().getListe().fetchSelectedRow();
 
boolean isNotMail = !(rowRelance.getForeign("ID_TYPE_LETTRE_RELANCE") == null || rowRelance.isForeignEmpty("ID_TYPE_LETTRE_RELANCE"));
// final String fileName = "Relance_" + rowRelance.getString("NUMERO");
// final File fileOutOO = new File(locationRelance, fileName + ".odt");
JPopupMenu menu = new JPopupMenu();
final RelanceSheet s = new RelanceSheet(rowRelance);
 
// Voir le document
AbstractAction actionOpen = new AbstractAction("Voir le document") {
public void actionPerformed(ActionEvent e) {
s.generate(false, false, "");
s.showDocument();
}
};
actionOpen.setEnabled(isNotMail);
menu.add(actionOpen);
 
// Impression
AbstractAction actionPrint = new AbstractAction("Imprimer") {
public void actionPerformed(ActionEvent e) {
s.fastPrintDocument();
}
};
actionPrint.setEnabled(isNotMail);
menu.add(actionPrint);
 
// Impression
AbstractAction actionPrintFact = new AbstractAction("Imprimer la facture") {
public void actionPerformed(ActionEvent e) {
final Thread t = new Thread(new Runnable() {
 
@Override
public void run() {
try {
printInvoice(rowRelance);
} catch (Exception e) {
ExceptionHandler.handle("Impression impossible", e);
}
}
});
t.start();
 
}
};
actionPrintFact.setEnabled(isNotMail);
menu.add(actionPrintFact);
 
// Impression
 
AbstractAction actionPrintBoth = new AbstractAction("Imprimer la facture et la relance") {
public void actionPerformed(ActionEvent e) {
final Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
s.fastPrintDocument();
printInvoice(rowRelance);
} catch (Exception e) {
ExceptionHandler.handle("Impression impossible", e);
}
}
});
t.start();
}
};
actionPrintBoth.setEnabled(isNotMail);
menu.add(actionPrintBoth);
 
// Générer
final AbstractAction actionGenerate = new AbstractAction("Générer") {
public void actionPerformed(ActionEvent e) {
 
String printer = PrinterNXProps.getInstance().getStringProperty("RelancePrinter");
s.generate(false, true, printer, true);
}
};
actionGenerate.setEnabled(isNotMail);
menu.add(actionGenerate);
 
// Créer la fiche de relance
menu.add(new AbstractAction("Créer la fiche de relance") {
public void actionPerformed(ActionEvent e) {
try {
FicheRelanceSheet sheet = new FicheRelanceSheet(rowRelance);
sheet.createDocumentAsynchronous();
sheet.showPrintAndExportAsynchronous(true, false, true);
} catch (Exception ex) {
ExceptionHandler.handle("Impression impossible", ex);
}
}
});
menu.show(e.getComponent(), e.getPoint().x, e.getPoint().y);
}
}
 
public void mouseReleased(MouseEvent e) {
}
 
public void mouseEntered(MouseEvent e) {
}
 
public void mouseExited(MouseEvent e) {
}
 
private void printInvoice(final SQLRow rowRelance) throws Exception {
final VenteFactureXmlSheet sheet = new VenteFactureXmlSheet(rowRelance.getForeignRow("ID_SAISIE_VENTE_FACTURE"));
sheet.getOrCreateDocumentFile();
sheet.showPrintAndExport(false, true, true);
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/action/ListeDesEncaissementsAction.java
16,10 → 16,12
import org.openconcerto.erp.action.CreateFrameAbstractAction;
import org.openconcerto.erp.core.common.ui.IListFilterDatePanel;
import org.openconcerto.erp.core.common.ui.IListTotalPanel;
import org.openconcerto.erp.core.common.ui.ListeViewPanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.view.IListFrame;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.IListe;
26,11 → 28,15
import org.openconcerto.ui.DefaultGridBagConstraints;
 
import java.awt.GridBagConstraints;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
 
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
 
public class ListeDesEncaissementsAction extends CreateFrameAbstractAction {
 
43,12 → 49,55
 
final SQLElement elementEchClient = Configuration.getInstance().getDirectory().getElement("ENCAISSER_MONTANT");
 
// FIXME Cacher les encaissements de reports (créer à partir d'une échéance pour la reporter
// ????)
ListeAddPanel panel = new ListeAddPanel(elementEchClient, new IListe(elementEchClient.getTableSource(true))) {
// FIXME faire les checks en plus dans l'element
@Override
protected void handleAction(JButton source, ActionEvent evt) {
if (source == this.buttonEffacer) {
List<SQLRowValues> rowValsSel = this.getListe().getSelectedRows();
 
ListeViewPanel panel = new ListeViewPanel(elementEchClient, new IListe(elementEchClient.getTableSource(true)));
if (isEncaissementEditable(rowValsSel, "effacer")) {
super.handleAction(source, evt);
}
} else if (source == this.buttonModifier) {
List<SQLRowValues> rowValsSel = this.getListe().getSelectedRows();
 
if (isEncaissementEditable(rowValsSel, "supprimer")) {
super.handleAction(source, evt);
}
} else {
super.handleAction(source, evt);
}
}
 
private boolean isEncaissementEditable(List<SQLRowValues> rowValsSel, String action) {
for (SQLRowValues sqlRowValues : rowValsSel) {
final SQLRow asRow = sqlRowValues.asRow();
Collection<? extends SQLRowAccessor> rowItems = asRow.getReferentRows(sqlRowValues.getTable().getTable("ENCAISSER_MONTANT_ELEMENT"));
for (SQLRowAccessor sqlRowValues2 : rowItems) {
if (sqlRowValues2.isForeignEmpty("ID_ECHEANCE_CLIENT")) {
JOptionPane.showMessageDialog(null, "Impossible de " + action + " un encaissement qui ne vient pas d'une échéance");
return false;
}
}
SQLRowAccessor rowAcMvt = asRow.getNonEmptyForeign("ID_MOUVEMENT");
if (rowAcMvt != null) {
Collection<? extends SQLRowAccessor> rowItemsEcr = rowAcMvt.getReferentRows(rowAcMvt.getTable().getTable("ECRITURE").getField("ID_MOUVEMENT"));
for (SQLRowAccessor sqlRowValues2 : rowItemsEcr) {
if (sqlRowValues2.getBoolean("VALIDE")) {
JOptionPane.showMessageDialog(null, "Impossible de " + action + " un encaissement dont les écritures sont validées.");
return false;
}
}
}
}
return true;
}
};
 
panel.setAddVisible(false);
panel.setDeleteVisible(false);
 
// panel.setDeleteVisible(false);
IListFrame frame = new IListFrame(panel);
 
List<SQLField> fields = new ArrayList<SQLField>(2);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/component/EncaisserMontantSQLComponent.java
28,7 → 28,9
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.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.sql.view.list.RowValuesTableModel;
import org.openconcerto.ui.DefaultGridBagConstraints;
313,14 → 315,36
 
System.out.println("Génération des ecritures du reglement");
SQLRow row = getTable().getRow(id);
try {
((EncaisserMontantSQLElement) getElement()).regleFacture(row, null, false);
} catch (Exception e) {
ExceptionHandler.handle("Erreur de génération des écritures", e);
}
return id;
}
 
@Override
public void update() {
 
int id = getSelectedID();
SQLRowValues rowValsFetcValues = new SQLRowValues(getTable());
rowValsFetcValues.putRowValues("ID_MOUVEMENT").putNulls("ID","SOURCE","IDSOURCE");
SQLRowValues rowValsFetcValuesItem = new SQLRowValues(getTable().getTable("ENCAISSER_MONTANT_ELEMENT"));
rowValsFetcValuesItem.put("ID_ENCAISSER_MONTANT", rowValsFetcValues).putNulls("MONTANT_REGLE");
rowValsFetcValuesItem.putRowValues("ID_ECHEANCE_CLIENT").putNulls("MONTANT", "REGLE");
List<SQLRowValues> oldEch = SQLRowValuesListFetcher.create(rowValsFetcValues).fetch(new Where(getTable().getKey(), "=", id));
super.update();
this.table.updateField("ID_ENCAISSER_MONTANT", id);
 
System.out.println("Génération des ecritures du reglement");
SQLRow row = getTable().getRow(id);
 
try {
((EncaisserMontantSQLElement) getElement()).regleFacture(row);
((EncaisserMontantSQLElement) getElement()).regleFacture(row, oldEch.get(0), true);
} catch (Exception e) {
ExceptionHandler.handle("Erreur de génération des écritures", e);
}
 
return id;
}
 
@Override
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/ReglerMontantSQLComponent.java
59,7 → 59,7
public class ReglerMontantSQLComponent extends BaseSQLComponent {
 
private RegleMontantTable table = new RegleMontantTable();
private DeviseField montant = new DeviseField(10);
private DeviseField montant = new DeviseField(15);
private JDate date;
private JLabel labelWarning = new JLabelWarning();
private JLabel labelWarningText = new JLabel("Le montant n'est pas valide!");
68,6 → 68,14
super(elt);
}
 
@Override
public void select(SQLRowAccessor r) {
super.select(r);
if (r != null) {
this.table.getRowValuesTable().insertFrom(r);
}
}
 
public void addViews() {
this.setLayout(new GridBagLayout());
final GridBagConstraints c = new DefaultGridBagConstraints();
115,9 → 123,10
c.weightx = 0;
this.add(new JLabel("Montant réglé", SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 0;
c.weightx = 1;
c.gridwidth = 1;
c.fill = GridBagConstraints.NONE;
DefaultGridBagConstraints.lockMinimumSize(this.montant);
this.add(this.montant, c);
 
// Warning
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/EncaisserMontantSQLElement.java
121,7 → 121,29
return Collections.singleton("ID_CLIENT");
}
 
@Override
protected synchronized void _initTableSource(final SQLTableModelSource table) {
super._initTableSource(table);
 
final BaseSQLTableModelColumn racCol = new BaseSQLTableModelColumn("Report échéance", Boolean.class) {
@Override
protected Object show_(SQLRowAccessor r) {
 
return !r.getForeign("ID_MODE_REGLEMENT").getBoolean("COMPTANT");
}
 
@Override
public Set<FieldPath> getPaths() {
Path p = new Path(getTable());
Path p2 = p.add(p.getLast().getField("ID_MODE_REGLEMENT"));
return CollectionUtils.createSet(new FieldPath(p2, "COMPTANT"));
}
};
 
table.getColumns().add(racCol);
 
}
 
/*
* (non-Javadoc)
*
172,21 → 194,64
super.archive(trees, cutLinks);
}
 
public void regleFacture(SQLRow row) throws Exception {
public void regleFacture(SQLRow rowAfter, SQLRowValues rowBefore, boolean update) throws Exception {
 
if (update && rowBefore == null) {
throw new IllegalArgumentException();
} else if (update) {
 
// Recalcul des échéances
for (SQLRowAccessor rowEncaisse : rowBefore.getReferentRows(getTable().getTable("ENCAISSER_MONTANT_ELEMENT"))) {
 
SQLRowAccessor rowEch = rowEncaisse.getForeign("ID_ECHEANCE_CLIENT");
// SI une echeance est associée (paiement non comptant)
if (rowEch.getID() > 1) {
SQLRowValues rowVals = rowEch.createEmptyUpdateRow();
rowVals.put("REGLE", Boolean.FALSE);
if (rowEch.getBoolean("REGLE")) {
rowVals.put("MONTANT", rowEncaisse.getLong("MONTANT_REGLE"));
} else {
rowVals.put("MONTANT", rowEch.getLong("MONTANT") + rowEncaisse.getLong("MONTANT_REGLE"));
}
rowVals.update();
}
// TODO si pas une echeance, echeance à creer
}
 
// On supprime les mouvements
SQLSelect sel = new SQLSelect(getTable().getBase());
 
SQLTable tableMvt = getTable().getTable("MOUVEMENT");
EcritureSQLElement eltEcr = (EcritureSQLElement) Configuration.getInstance().getDirectory().getElement(tableMvt.getTable("ECRITURE"));
sel.addSelectStar(tableMvt);
Where w = new Where(tableMvt.getField("SOURCE"), "=", getTable().getName());
w = w.and(new Where(tableMvt.getField("IDSOURCE"), "=", rowBefore.getID()));
sel.setWhere(w);
List<SQLRow> list = (List<SQLRow>) getTable().getBase().getDataSource().execute(sel.asString(), SQLRowListRSH.createFromSelect(sel, tableMvt));
for (SQLRow sqlRow : list) {
eltEcr.archiveMouvementProfondeur(sqlRow.getID(), false);
}
 
// On supprime si une prochaine échéance a été créé (ex: prélévement)
final SQLRowAccessor nonEmptyForeignMvt = rowBefore.getNonEmptyForeign("ID_MOUVEMENT");
if (nonEmptyForeignMvt != null && nonEmptyForeignMvt.getString("SOURCE").equals("ECHEANCE_CLIENT")) {
eltEcr.archiveMouvementProfondeur(nonEmptyForeignMvt.getID(), true);
}
}
 
System.out.println("Génération des ecritures du reglement");
String s = row.getString("NOM");
SQLRow rowModeRegl = row.getForeignRow("ID_MODE_REGLEMENT");
String s = rowAfter.getString("NOM");
SQLRow rowModeRegl = rowAfter.getForeignRow("ID_MODE_REGLEMENT");
SQLRow rowTypeRegl = rowModeRegl.getForeignRow("ID_TYPE_REGLEMENT");
 
// Compte Client
SQLRow clientRow = row.getForeignRow("ID_CLIENT");
SQLRow clientRow = rowAfter.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");
long montant = rowAfter.getLong("MONTANT");
PrixTTC ttc = new PrixTTC(montant);
 
List<SQLRow> l = row.getReferentRows(row.getTable().getTable("ENCAISSER_MONTANT_ELEMENT"));
List<SQLRow> l = rowAfter.getReferentRows(rowAfter.getTable().getTable("ENCAISSER_MONTANT_ELEMENT"));
if (l.isEmpty()) {
SwingUtilities.invokeLater(new Runnable() {
 
195,17 → 260,17
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());
System.err.println("Liste des échéances vides pour l'encaissement ID " + rowAfter.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"));
new GenerationReglementVenteNG(label, clientRow, ttc, rowAfter.getDate("DATE").getTime(), rowModeRegl, rowAfter, l.get(0).getForeignRow("ID_MOUVEMENT_ECHEANCE"), false, false,
rowAfter.getString("TIERS"), rowAfter.getForeign("ID_COMPTE_PCE_TIERS"));
 
// Mise a jour du montant de l'echeance
boolean supplement = false;
 
if (!row.getBoolean("ACOMPTE")) {
if (!rowAfter.getBoolean("ACOMPTE")) {
// On marque les echeances comme reglees
for (SQLRow sqlRow : l) {
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/ChequeFournisseurSQLElement.java
34,6 → 34,7
import java.util.List;
 
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
 
public class ChequeFournisseurSQLElement extends ChequeSQLElement {
129,7 → 130,7
final GridBagConstraints c = new DefaultGridBagConstraints();
 
// Montant
JLabel labelMontant = new JLabel("Montant ");
JLabel labelMontant = new JLabel("Montant", SwingConstants.RIGHT);
 
this.add(labelMontant, c);
c.gridx++;
137,7 → 138,7
this.add(this.textMontant, c);
 
// Date
JLabel labelDate = new JLabel("Date ");
JLabel labelDate = new JLabel("Date", SwingConstants.RIGHT);
c.weightx = 0;
c.gridx++;
labelDate.setHorizontalAlignment(SwingConstants.RIGHT);
145,19 → 146,24
 
JDate dateAchat = new JDate(true);
c.gridx++;
c.gridwidth = GridBagConstraints.REMAINDER;
this.add(dateAchat, c);
 
c.gridy++;
c.gridx = 0;
JLabel labelFournisseurNom = new JLabel("Fournisseur ");
JLabel labelFournisseurNom = new JLabel("Fournisseur", SwingConstants.RIGHT);
this.add(labelFournisseurNom, c);
 
final ElementComboBox nomFournisseur = new ElementComboBox();
c.gridx++;
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridwidth = 3;
this.add(nomFournisseur, c);
 
JPanel spacer = new JPanel();
spacer.setOpaque(false);
c.weighty = 1;
c.gridy++;
this.add(spacer, c);
 
this.addRequiredSQLObject(nomFournisseur, "ID_FOURNISSEUR");
this.addRequiredSQLObject(this.textMontant, "MONTANT");
this.addRequiredSQLObject(dateAchat, "DATE_ACHAT");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/SDDMessageSQLElement.java
207,7 → 207,7
final File directDebitDir = new File(newPath);
try {
for (final SQLRowAccessor messageRow : messages) {
FileUtils.write(messageRow.getString("XML"), new File(directDebitDir, messageRow.getString("MessageIdentification") + ".xml"), StringUtils.UTF8, false);
FileUtils.writeUTF8(messageRow.getString("XML"), new File(directDebitDir, messageRow.getString("MessageIdentification") + ".xml"));
}
} catch (IOException exn) {
ExceptionHandler.handle(comp, "Impossible d'exporter", exn);
422,7 → 422,7
}
 
public SQLTable getTable() {
return table;
return this.table;
}
 
@Override
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/ReglerMontantSQLElement.java
23,6 → 23,7
import org.openconcerto.utils.CollectionUtils;
 
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
 
51,6 → 52,38
@Override
protected void _initTableSource(SQLTableModelSource res) {
super._initTableSource(res);
 
final BaseSQLTableModelColumn racColFact = new BaseSQLTableModelColumn("Factures associées", String.class) {
@Override
protected Object show_(SQLRowAccessor r) {
 
Collection<? extends SQLRowAccessor> l = r.getReferentRows(r.getTable().getTable("REGLER_MONTANT_ELEMENT"));
String s = "";
for (SQLRowAccessor sqlRowAccessor : l) {
if (!sqlRowAccessor.isForeignEmpty("ID_MOUVEMENT_ECHEANCE")) {
SQLRowAccessor rMvt = sqlRowAccessor.getForeign("ID_MOUVEMENT_ECHEANCE");
if (!rMvt.isForeignEmpty("ID_PIECE")) {
SQLRowAccessor rP = rMvt.getForeign("ID_PIECE");
s += (s.trim().length() > 0 ? ", " : "") + rP.getString("NOM");
}
}
}
 
return s;
}
 
@Override
public Set<FieldPath> getPaths() {
Path p = new Path(getTable());
Path p2 = p.add(p.getLast().getTable("REGLER_MONTANT_ELEMENT"));
Path p3 = p2.add(p2.getLast().getField("ID_MOUVEMENT_ECHEANCE"));
Path p4 = p3.add(p3.getLast().getField("ID_PIECE"));
return CollectionUtils.createSet(new FieldPath(p4, "NOM"));
}
};
 
res.getColumns().add(racColFact);
 
final BaseSQLTableModelColumn racCol = new BaseSQLTableModelColumn("Report échéance", Boolean.class) {
@Override
protected Object show_(SQLRowAccessor r) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/employe/element/CommercialSQLElement.java
14,7 → 14,10
package org.openconcerto.erp.core.humanresources.employe.element;
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.edm.AttachmentAction;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.utils.ListMap;
 
import java.util.ArrayList;
28,7 → 31,12
 
public CommercialSQLElement(String tableName, String singular, String plural) {
super(tableName, singular, plural);
if (getTable().contains("ATTACHMENTS")) {
PredicateRowAction actionAttachment = new PredicateRowAction(new AttachmentAction().getAction(), true);
actionAttachment.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(actionAttachment);
}
}
 
protected List<String> getListFields() {
final List<String> l = new ArrayList<String>();
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/ui/EditionFichePayePanel.java
259,7 → 259,7
 
public void mousePressed(final MouseEvent e) {
 
int row = table.rowAtPoint(e.getPoint());
int row = ((TableSorter) table.getModel()).modelIndex(table.rowAtPoint(e.getPoint()));
final int idSal = model.getIdSalAtRow(row);
 
if (e.getButton() == MouseEvent.BUTTON3) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/InfosSalariePayeSQLElement.java
141,6 → 141,30
this.add(comboConvention, c);
c.gridwidth = 1;
 
// Contrat
c.fill = GridBagConstraints.BOTH;
JPanel panelContrat = new JPanel();
panelContrat.setOpaque(false);
panelContrat.setBorder(BorderFactory.createTitledBorder("Contrat de travail"));
panelContrat.setLayout(new GridBagLayout());
GridBagConstraints c2 = new DefaultGridBagConstraints();
c2.fill = GridBagConstraints.HORIZONTAL;
c2.weighty = 1;
c2.weightx = 1;
c2.anchor = GridBagConstraints.NORTH;
this.addView("ID_CONTRAT_SALARIE", REQ + ";" + DEC + ";" + SEP);
ElementSQLObject eltContrat = (ElementSQLObject) this.getView("ID_CONTRAT_SALARIE");
panelContrat.add(eltContrat, c2);
 
c.gridx = 0;
c.gridy++;
c.gridheight = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
c.weightx = 1;
this.add(panelContrat, c);
c.gridwidth = 1;
c.gridheight = 1;
 
// Classement conventionnel
c.fill = GridBagConstraints.BOTH;
JPanel panelClassement = new JPanel();
154,10 → 178,10
c.weightx = 1;
panelClassement.add(eltClassement, c);
 
c.gridy = 1;
c.gridy = 2;
c.gridx = 0;
c.gridwidth = 2;
c.weightx = 0;
c.weightx = 1;
this.add(panelClassement, c);
 
// Classement conventionnel
174,7 → 198,7
c.gridy = 0;
c.weightx = 1;
panelCoeff.add(eltCoeff, c);
c.gridy = 2;
c.gridy = 3;
c.gridx = 0;
c.gridwidth = 2;
c.weightx = 0;
181,30 → 205,7
this.add(panelCoeff, c);
c.gridwidth = 1;
}
// Contrat
c.fill = GridBagConstraints.BOTH;
JPanel panelContrat = new JPanel();
panelContrat.setOpaque(false);
panelContrat.setBorder(BorderFactory.createTitledBorder("Contrat de travail"));
panelContrat.setLayout(new GridBagLayout());
GridBagConstraints c2 = new DefaultGridBagConstraints();
c2.fill = GridBagConstraints.HORIZONTAL;
c2.weighty = 1;
c2.weightx = 1;
c2.anchor = GridBagConstraints.NORTH;
this.addView("ID_CONTRAT_SALARIE", REQ + ";" + DEC + ";" + SEP);
ElementSQLObject eltContrat = (ElementSQLObject) this.getView("ID_CONTRAT_SALARIE");
panelContrat.add(eltContrat, c2);
 
c.gridx = 2;
c.gridy = 1;
c.gridheight = 4;
c.gridwidth = GridBagConstraints.REMAINDER;
c.weightx = 1;
this.add(panelContrat, c);
c.gridwidth = 1;
c.gridheight = 1;
 
/***********************************************************************************
* DATE ENTREE / SORTIE
**********************************************************************************/
248,8 → 249,8
* c.gridy++; c.gridx = 0; c.fill = GridBagConstraints.HORIZONTAL;
* panelEntreeSortie.add(labelAnc, c); c.gridx++; panelEntreeSortie.add(textAnc, c);
*/
c.gridx = 0;
c.gridy = 3;
c.gridx = 2;
c.gridy = 2;
c.gridwidth = 2;
this.add(panelEntreeSortie, c);
c.gridwidth = 1;
307,6 → 308,7
labelSalaireBase.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField salaireBase = new JTextField();
c.gridx++;
 
c.weightx = 0;
panelBase.add(labelSalaireBase, c);
c.gridx++;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/DiplomePrepareSQLElement.java
New file
0,0 → 1,28
/*
* 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.humanresources.payroll.element;
 
import org.openconcerto.sql.model.DBRoot;
 
public class DiplomePrepareSQLElement extends AbstractCodeSQLElement {
 
public DiplomePrepareSQLElement(final DBRoot root) {
super(root.getTable("DIPLOME_PREPARE"), "un diplôme préparé", "diplômes préparés");
}
 
@Override
protected String createCode() {
return createCodeOfPackage() + ".diplome.code";
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/SalarieSQLElement.java
49,11 → 49,9
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;
316,8 → 314,7
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) {
if (!getElement().getAdditionalFields().isEmpty()) {
// Champ Module
c.gridx = 0;
c.gridy++;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/ContratSalarieSQLElement.java
246,7 → 246,7
this.add(selStatutCatConv, c);
 
List<String> dsnFF = Arrays.asList("ID_CONTRAT_MODALITE_TEMPS", "ID_CONTRAT_REGIME_MALADIE", "ID_CONTRAT_REGIME_VIEILLESSE", "ID_CONTRAT_DETACHE_EXPATRIE",
"ID_CONTRAT_DISPOSITIF_POLITIQUE", "ID_CONTRAT_MOTIF_RECOURS");
"ID_CONTRAT_DISPOSITIF_POLITIQUE", "ID_CONTRAT_MOTIF_RECOURS", "ID_DIPLOME_PREPARE");
int p = 0;
for (String ffName : dsnFF) {
JLabel labelFF = new JLabel(getLabelFor(ffName));
266,7 → 266,7
c.weighty = 1;
c.weightx = 1;
this.add(selFF, c);
if (ffName.equals("ID_CONTRAT_MOTIF_RECOURS")) {
if (ffName.equals("ID_CONTRAT_MOTIF_RECOURS") || ffName.equals("ID_DIPLOME_PREPARE")) {
this.addSQLObject(selFF, ffName);
} else {
this.addRequiredSQLObject(selFF, ffName);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/report/FichePayeSheetXML.java
220,11 → 220,11
tauxPatLigne = sqlRowAccessor.getBigDecimal("TAUX_PAT");
}
 
if (tauxSalLigne.signum() > 0) {
if (tauxSalLigne.signum() > 0 && montantSalLigne.signum() != 0) {
ligneSimplifiee.put("TAUX_SAL", tauxSalBulletinSimpl.add(tauxSalLigne));
}
 
if (tauxPatLigne.signum() > 0) {
if (tauxPatLigne.signum() > 0 && montantPatLigne.signum() != 0) {
ligneSimplifiee.put("TAUX_PAT", tauxPatBulletinSimpl.add(tauxPatLigne));
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/element/objet/ClasseCompte.java
14,8 → 14,7
package org.openconcerto.erp.element.objet;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
 
30,12 → 29,12
 
private static List<ClasseCompte> liste;
 
public static void loadClasseCompte() {
SQLBase base = ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete();
public static void loadClasseCompte(ComptaPropsConfiguration conf) {
DBRoot base = conf.getRootSociete();
 
SQLTable classeCompteTable = base.getTable("CLASSE_COMPTE");
 
SQLSelect selClasse = new SQLSelect(base);
SQLSelect selClasse = new SQLSelect();
 
selClasse.addSelect(classeCompteTable.getField("ID"));
selClasse.addSelect(classeCompteTable.getField("NOM"));
45,7 → 44,7
 
String reqClasse = selClasse.asString();
System.err.println(reqClasse);
List<Map<String, Object>> obClasse = base.getDataSource().execute(reqClasse);
List<Map<String, Object>> obClasse = base.getDBSystemRoot().getDataSource().execute(reqClasse);
liste = new ArrayList<ClasseCompte>();
for (Map<String, Object> map : obClasse) {
 
/trunk/OpenConcerto/src/org/openconcerto/erp/panel/compta/AbstractExport.java
29,6 → 29,7
import java.io.IOException;
import java.io.OutputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
170,7 → 171,7
 
protected abstract int fetchData(Date from, Date to, SQLRow selectedJournal, boolean onlyNew);
 
protected abstract void export(final OutputStream out) throws IOException;
protected abstract void export(final OutputStream out) throws IOException, ParseException;
 
public static final String fixedLengthLeftAlign(final String str, final int fixedWidth) {
if (str.length() >= fixedWidth) {
/trunk/OpenConcerto/src/org/openconcerto/erp/panel/compta/ExportToQuadraCompta.java
New file
0,0 → 1,162
/*
* 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.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.utils.StringUtils;
 
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
 
import org.apache.commons.dbutils.handlers.ArrayListHandler;
 
public class ExportToQuadraCompta extends AbstractExport {
private static final Charset CHARSET = StringUtils.Cp1252;
private List<Object[]> data;
 
protected ExportToQuadraCompta(DBRoot rootSociete) {
super(rootSociete, "QuadraCompta", ".txt");
}
 
@Override
protected int fetchData(Date from, Date to, SQLRow selectedJournal, boolean onlyNew) {
final SQLTable tableEcriture = getEcritureT();
final SQLTable tableMouvement = tableEcriture.getForeignTable("ID_MOUVEMENT");
final SQLTable tableCompte = tableEcriture.getForeignTable("ID_COMPTE_PCE");
final SQLTable tableJrnl = tableEcriture.getForeignTable("ID_JOURNAL");
final SQLTable tablePiece = tableMouvement.getForeignTable("ID_PIECE");
 
final SQLSelect sel = createSelect(from, to, selectedJournal, onlyNew);
sel.addSelect(tableCompte.getField("NUMERO"));
sel.addSelect(tableJrnl.getField("CODE"));
sel.addSelect(tableEcriture.getField("DATE"));
sel.addSelect(tableEcriture.getField("NOM"));
sel.addSelect(tableEcriture.getField("DEBIT"));
sel.addSelect(tableEcriture.getField("CREDIT"));
sel.addSelect(tablePiece.getField("NOM"));
@SuppressWarnings("unchecked")
final List<Object[]> l = (List<Object[]>) this.getRootSociete().getDBSystemRoot().getDataSource().execute(sel.asString(), new ArrayListHandler());
this.data = l;
return l == null ? 0 : l.size();
}
 
@Override
protected void export(OutputStream out) throws IOException, ParseException {
final Writer bufOut = new OutputStreamWriter(out, CHARSET);
SimpleDateFormat dateFormat = new SimpleDateFormat("ddMMyy");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
for (final Object[] array : this.data) {
bufOut.write("M");
bufOut.write(matchStringToFixedLength(array[0],8,'0', true, false ));
bufOut.write(matchStringToFixedLength(array[1],2,' '));
bufOut.write("000");
 
Date date1 = simpleDateFormat.parse(String.valueOf(array[2]).trim());
bufOut.write(dateFormat.format(date1));
bufOut.write(" ");
bufOut.write(matchStringToFixedLength("",20,' '));
long debit = ((Number)array[4]).longValue();
long credit = ((Number)array[5]).longValue();
// Exception si débit et crédit > 0
bufOut.write(getDebitOrCredit(debit,credit));
bufOut.write(getAmountSign(getAmount(debit,credit)));
bufOut.write(matchStringToFixedLength(getAmount(debit,credit),12,'0', false, false));
bufOut.write(matchStringToFixedLength("",44,' '));
bufOut.write(matchStringToFixedLength(array[6],8,' ',false, true));
bufOut.write("EUR");
bufOut.write(matchStringToFixedLength(array[1],3,' '));
bufOut.write(matchStringToFixedLength(array[3],30,' ', false, false));
bufOut.write(matchStringToFixedLength("",12,' '));
 
bufOut.write("\r\n");
}
bufOut.flush();
}
 
/**
* Adapte une chaine à une longueur (champs à longueur fixe).
* @param : un objet que l'on va transformer en chaine.
* @param : une longueur.
* @param : un caractère pour le remplissage si la chaine est plus petite que la longueur fixée.
* @param : placement du remplissage, true = à droite.
* @param : le coté de la chaine à garder, true = à droite.
*
*/
private String matchStringToFixedLength(Object o, int length, char filler, boolean fillRight, boolean keepRight) {
String str = String.valueOf(o).trim();
if(str.length() >= length) {
if(keepRight) {
return str.substring(str.length()-length, str.length());
}else {
return str.substring(0,length);
}
}else {
String format;
if(fillRight) {
format = "%-"+length+"s";
}else {
format = "%"+length+"s";
}
return String.format(format, str).replace(' ',filler);
}
}
private String matchStringToFixedLength(Object o, int length, char filler) {
return matchStringToFixedLength(o, length, filler, true, true);
}
private String getDebitOrCredit(final long debit, final long credit) {
if(debit > 0 && credit > 0) {
throw new IllegalStateException("Both credit and debit");
}else if(debit == 0) {
return "C";
}else {
return "D";
}
}
private String getAmountSign(final long amount) {
if(amount < 0) {
return "-";
}else {
return "+";
}
}
private long getAmount(final long debit, final long credit) {
if(debit > 0) {
return debit;
}else {
return credit;
}
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/panel/compta/ExportEBP_ComptaPro.java
160,5 → 160,6
bufOut.write(StringUtils.getFixedWidthString(amount, wAmount, Side.RIGHT, false));
bufOut.write("\r\n");
}
bufOut.flush();
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/panel/compta/ExportPanel.java
99,6 → 99,12
return new ExportSageEtendu(root);
}
},
QUADRACOMPTA("Quadratus : Export des écritures vers QuadraCompta") {
@Override
public AbstractExport createExport(DBRoot root) {
return new ExportToQuadraCompta(root);
}
},
CCMX("Cegid CCMX") {
@Override
public AbstractExport createExport(DBRoot root) {
/trunk/OpenConcerto/src/org/openconcerto/erp/utils/LowerCaseFormat.java
New file
0,0 → 1,49
/*
* 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.utils;
 
import java.text.FieldPosition;
import java.text.Format;
import java.text.ParsePosition;
 
public class LowerCaseFormat extends Format {
 
@Override
public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
// TODO Auto-generated method stub
System.err.println("ToAppendTo " + toAppendTo + " --- Obj" + obj);
if (obj != null) {
return new StringBuffer(obj.toString().toLowerCase());
}
return null;
}
 
@Override
public Object parseObject(String source, ParsePosition pos) {
int i = pos.getIndex();
source = source.toLowerCase();
for (; i < source.length(); i++) {
final char charAt = source.charAt(i);
 
if (charAt < 'a' || charAt > 'z') {
return source;
}
pos.setIndex(i);
}
pos.setIndex(i);
System.err.println("Source " + source);
return source;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/utils/LowerCaseFormatFilter.java
New file
0,0 → 1,112
/*
* 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.utils;
 
import java.text.Format;
import java.text.ParsePosition;
 
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.DocumentFilter;
 
public class LowerCaseFormatFilter extends DocumentFilter {
 
/**
* Whether <code>s</code> is valid, ie if <code>s</code> is completely parsed by <code>f</code>
* and the parsed object belongs to <code>c</code>.
*
* @param s the string to test.
* @param f the format s must use.
* @param c the class of the object returned by f.
* @return <code>true</code> if s is valid.
*/
static public final boolean isValid(String s, Format f, Class<?> c) {
final ParsePosition pp = new ParsePosition(0);
final Object o = f.parseObject(s, pp);
return c.isInstance(o) && pp.getIndex() == s.length();
}
 
static private final String subString(Document doc, int offset) throws BadLocationException {
return doc.getText(offset, doc.getLength() - offset);
}
 
private final Format format;
private final Class<?> c;
 
/**
* Create a new instance.
*
* @param f the format the document has to comply.
* @param c the class the format has to parse to.
*/
public LowerCaseFormatFilter() {
this.format = new LowerCaseFormat();
this.c = String.class;
}
 
public final void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
string = string.toLowerCase();
final String newString = fb.getDocument().getText(0, offset) + string + subString(fb.getDocument(), offset);
if (this.isValid(newString))
fb.insertString(offset, string, attr);
}
 
public final void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
text = text.toLowerCase();
final String newString = fb.getDocument().getText(0, offset) + text + subString(fb.getDocument(), offset + length);
if (this.isValid(newString))
fb.replace(offset, length, text, attrs);
}
 
public final boolean isValid(String s) {
return this.isPartialValid(s) || isCompleteValid(s);
}
 
public final boolean isCompleteValid(String s) {
return isValid(s, this.getFormat(), this.c);
}
 
public boolean isPartialValid(String s) {
return false;
}
 
public String getValidationText(String s) {
if (this.isCompleteValid(s))
return s + " est valide";
else if (this.isPartialValid(s))
return getPartialValidationText(s);
else
return s + " n'est pas du tout valide";
}
 
protected String getPartialValidationText(String s) {
return s + " n'est que partiellement valide";
}
 
public final Format getFormat() {
return this.format;
}
 
/**
* Let the subclass choose an appropriate string representation (must be parseable by the
* format).
*
* @param o the object to format.
* @return its string representation.
*/
public String format(Object o) {
return this.getFormat().format(o);
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/preferences/UIPreferencePanel.java
40,6 → 40,8
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;
 
import com.formdev.flatlaf.FlatLightLaf;
 
public class UIPreferencePanel extends DefaultLocalPreferencePanel {
 
private static final String UI_PROPERTIES = "ui.properties";
61,10 → 63,12
final GridBagConstraints c = new DefaultGridBagConstraints();
c.fill = GridBagConstraints.NONE;
this.add(new JLabel("Look"), c);
comboLook = new JComboBox(new String[] { "natif du système", "Nimbus" });
comboLook = new JComboBox(new String[] { "natif du système", "Nimbus", "Flat" });
String look = this.properties.getProperty(UI_LOOK);
if (look != null && !look.equals("system")) {
if (look != null && look.equals("nimbus")) {
comboLook.setSelectedIndex(1);
} else if (look != null && look.equals("flat")) {
comboLook.setSelectedIndex(2);
} else {
comboLook.setSelectedIndex(0);
}
211,8 → 215,10
AlternateTableCellRenderer.setDefaultMap(Collections.singletonMap(Color.WHITE, background));
if (this.comboLook.getSelectedIndex() == 0) {
properties.setProperty(UI_LOOK, "system");
} else if (this.comboLook.getSelectedIndex() == 1) {
properties.setProperty(UI_LOOK, "nimbus");
} else {
properties.setProperty(UI_LOOK, "nimbus");
properties.setProperty(UI_LOOK, "flat");
}
 
if (this.comboDPI.getSelectedIndex() == 1) {
272,8 → 278,9
 
final String look = properties.getProperty(UI_LOOK);
final String nimbusClassName = getNimbusClassName();
 
if (look != null && look.equals("system")) {
if (look != null && look.equals("flat")) {
FlatLightLaf.install();
} else if (look != null && look.equals("system")) {
useSystemLF();
} else if (look != null && look.equals("nimbus")) {
useNimbusLF();
280,7 → 287,7
} else if (nimbusClassName == null || !System.getProperty("os.name", "??").toLowerCase().contains("linux")) {
useSystemLF();
} else {
useNimbusLF();
FlatLightLaf.install();
}
final String dpi = properties.getProperty(UI_DPI);
if (dpi != null && dpi.length() > 0 && !dpi.equalsIgnoreCase("1")) {
/trunk/OpenConcerto/src/org/openconcerto/erp/preferences/TemplateNXProps.java
53,6 → 53,7
import org.openconcerto.task.config.ComptaBasePropsConfiguration;
import org.openconcerto.ui.preferences.TemplateProps;
import org.openconcerto.utils.StreamUtils;
import org.openconcerto.utils.prog.VMLauncher;
 
import java.io.File;
import java.io.IOException;
134,6 → 135,8
register(DemandePrixSheetXML.TEMPLATE_ID, DemandePrixSheetXML.TEMPLATE_PROPERTY_NAME, AbstractGenerationDocumentPreferencePanel.getLabelFromTable("DEMANDE_PRIX"));
register(DevisXmlSheet.TEMPLATE_ID, DevisXmlSheet.TEMPLATE_PROPERTY_NAME, AbstractGenerationDocumentPreferencePanel.getLabelFromTable("DEVIS"));
register(VenteFactureXmlSheet.TEMPLATE_ID, VenteFactureXmlSheet.TEMPLATE_PROPERTY_NAME, AbstractGenerationDocumentPreferencePanel.getLabelFromTable("SAISIE_VENTE_FACTURE"));
register(VenteFactureXmlSheet.TEMPLATE_ID + VenteFactureXmlSheet.TEMPLATE_SITUATION_SUFFIX, VenteFactureXmlSheet.TEMPLATE_PROPERTY_NAME,
AbstractGenerationDocumentPreferencePanel.getLabelFromTable("SAISIE_VENTE_FACTURE") + " " + VenteFactureXmlSheet.TEMPLATE_SITUATION_SUFFIX);
register(CommandeClientXmlSheet.TEMPLATE_ID, CommandeClientXmlSheet.TEMPLATE_PROPERTY_NAME, AbstractGenerationDocumentPreferencePanel.getLabelFromTable("COMMANDE_CLIENT"));
register(BonLivraisonXmlSheet.TEMPLATE_ID, BonLivraisonXmlSheet.TEMPLATE_PROPERTY_NAME, AbstractGenerationDocumentPreferencePanel.getLabelFromTable("BON_DE_LIVRAISON"));
register(AvoirClientXmlSheet.TEMPLATE_ID, AvoirClientXmlSheet.TEMPLATE_PROPERTY_NAME, AbstractGenerationDocumentPreferencePanel.getLabelFromTable("AVOIR_CLIENT"));
229,6 → 232,8
if (property != null) {
File storage = new File(property);
((DefaultLocalTemplateProvider) provider).setBaseDirectory(storage);
} else if (VMLauncher.getJPackageAppDir() != null) {
((DefaultLocalTemplateProvider) provider).setBaseDirectory(new File(VMLauncher.getJPackageAppDir(), "Configuration/Template/Default"));
}
} else {
provider = new DefaultCloudTemplateProvider(configuration.getSocieteID());
/trunk/OpenConcerto/src/org/openconcerto/erp/config/translation_fr.xml
189,7 → 189,9
<!-- Matching -->
<action id="financing.accouning.entries.source.show" label="Voir la source" />
<action id="financing.accouning.entries.match" label="Lettrer" />
<action id="financing.accouning.entries.match.partial" label="Lettrer partiel" />
<action id="financing.accouning.entries.unmatch" label="Délettrer" />
<action id="financing.accouning.entries.unmatch.partial" label="Délettrer partiel" />
<!-- Invoice -->
<item id="sales.invoice.number" label="Numéro" />
<item id="sales.invoice.date" label="Date" />
250,8 → 252,18
<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" />
<item id="customerrelationship.customer.customtarif" label="Remises client sur article" />
<item id="customerrelationship.customer.customfamilytarif" label="Remises client sur famille d'article" />
 
<!-- Agence -->
<item id="customerrelationship.customer.agency" label="Agences" />
<item id="customerrelationship.customer.agencies" label="Liste des agences" />
<item id="customerrelationship.customer.agency.designation" label="Designation" />
<item id="customerrelationship.customer.agency.phone1" label="Téléphone" />
<item id="customerrelationship.customer.agency.email" label="E-Mail" />
<item id="customerrelationship.customer.agency.fax" label="Fax" />
<item id="customerrelationship.customer.agency.customer" label="Client" />
<item id="customerrelationship.customer.agency.address" label="Adresse de l'agence" />
 
<!-- Currency -->
<item id="currency.USD" label="Dollar américain" />
/trunk/OpenConcerto/src/org/openconcerto/erp/config/mappingCompta_fr.xml
12,6 → 12,22
<FIELD name="MONTANT" label="Montant" />
<FIELD name="ID_MOUVEMENT" label="Mouvement" />
</element>
<element refid="customerrelationship.customer.category" nameClass="feminine" name="catégorie de client">
<FIELD name="name" label="Nom" />
</element>
<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="sales.customer.product.family.qty.price" nameClass="masculine"
name="tarif famille d'article client">
<FIELD name="QUANTITE" label="Quantité" />
<FIELD name="ID_FAMILLE_ARTICLE" label="Famille article" />
<FIELD name="ID_CLIENT" label="Client" />
<FIELD name="POURCENT_REMISE" label="% remise" />
</element>
<element refid="address" nameClass="feminine" name="adresse">
<FIELD name="TYPE" label="Type" />
<FIELD name="LIBELLE" label="Libellé" />
291,6 → 307,7
<FIELD name="T_DEVISE" label="Total Devise" />
<FIELD name="ID_MODELE" label="Modèle" />
<FIELD name="T_ECO_CONTRIBUTION" label="Dont Eco-Contrib." />
<FIELD name="ID_TAXE_PORT" label="Taxe sur port" />
</element>
<element refid="sales.credit.item" nameClass="masculine" name="élément d'avoir" namePlural="éléments d'avoir">
<FIELD name="ID_DEPOT_STOCK" label="Dépôt Stock" />
365,6 → 382,7
<FIELD name="DATE" label="Date d'intervention" />
<FIELD name="DATE_FIN" label="Date de fin d'intervention" />
<FIELD name="POURCENT_SERVICE" label="Pourcentage service" />
<FIELD name="ID_TAXE_PORT" label="Taxe sur port" />
</element>
<element refid="supplychain.credit.note" nameClass="feminine" name="facture d'avoir fournisseur"
namePlural="factures d'avoir fournisseur">
467,7 → 485,7
<FIELD name="ID_TAXE" label="Taxe" />
<FIELD name="POIDS" label="Poids UV net" />
<FIELD name="PRIX_METRIQUE_VT_1" label="P.V. UV HT" />
<FIELD name="PRIX_METRIQUE_HA_1" label="P.A. UV² HT" />
<FIELD name="PRIX_METRIQUE_HA_1" label="P.A. UV HT" />
<FIELD name="VALEUR_METRIQUE_1" label="Longueur par défaut" />
<FIELD name="ID_METRIQUE_1" label="Métrique" />
<FIELD name="PRIX_METRIQUE_VT_2" label="P.V. HT au mètre" />
486,6 → 504,7
<FIELD name="ID_STYLE" label="Style" />
<FIELD name="SERVICE" label="Service" />
<FIELD name="ID_MODE_VENTE_ARTICLE" label="Mode de vente" />
<FIELD name="ID_FAMILLE_ARTICLE" label="Famille" />
</element>
<element refid="sales.shipment.delivery.note" nameClass="masculine" name="bon de livraison"
namePlural="bons de livraison">
516,6 → 535,7
<FIELD name="ID_MODELE" label="Modèle" />
<FIELD name="T_ECO_CONTRIBUTION" label="Dont Eco-Contrib." />
<FIELD name="invoiceProgress" label="Avancement facturation" />
<FIELD name="ID_COMMERCIAL" label="Commercial" />
</element>
<element refid="sales.shipment.item" nameClass="masculine" name="élément de bon de livraison"
namePlural="éléments de bon de livraison">
1011,7 → 1031,7
</element>
<element refid="humanresources.payroll.contract.employe" nameClass="masculine" name="contrat salarié"
namePlural="contrats salariés">
 
<FIELD name="ID_DIPLOME_PREPARE" label="Diplôme préparé (S21.G00.30.025)" />
<FIELD name="ID_CODE_AMENAGEMENT_PARTIEL" label="Aménagement temps partiel (S21.G00.40.078)" />
<FIELD name="ID_CODE_SUSPENSION" label="Motif de suspension (S21.G00.65.001)" />
<FIELD name="DATE_FIN_SUSPENSION" label="Fin de supension (S21.G00.65.003)" />
1216,8 → 1236,10
<FIELD name="T_PA_HT" label="Total achat HT" />
<FIELD name="T_POIDS" label="Poids total net" />
<FIELD name="ID_MODE_VENTE_ARTICLE" label="Mode de vente" />
 
<FIELD name="POURCENT_ACOMPTE" label="% Acompte" />
<FIELD name="LIVRE" label="Livré" />
<FIELD name="QTE_LIVREE" label="Qté livrée" />
<FIELD name="LIVRE_FORCED" label="Livraison forcée" />
</element>
<element refid="humanresources.employe.salesman" nameClass="masculine" name="commercial">
<FIELD name="ID_POLE_PRODUIT" label="Pôle produit" />
1310,6 → 1332,7
<FIELD name="ID_FABRICANT" label="Fabricant" />
<FIELD name="ID_UNITE_VENTE" label="Unité de vente" />
<FIELD name="QTE" label="Quantité" />
<FIELD name="QTE_RECUE" label="Qté recues" />
<FIELD name="QTE_UNITAIRE" label="Quantité unitaire" />
<FIELD name="REPERE" label="Repère" />
<FIELD name="EN_STOCK" label="En stock" />
1713,6 → 1736,7
</element>
<element refid="sales.order.facturation" nameClass="masculine" name="terme de facturation de commande client"
namePlural="termes de facturation commandes clients">
<FIELD name="NOM" label="Désignation" />
<FIELD name="ID_SAISIE_VENTE_FACTURE" label="Facture" />
<FIELD name="ID_COMMANDE_CLIENT" label="Commande" />
<FIELD name="ID_TYPE_REGLEMENT" label="Type règlement" />
1729,7 → 1753,8
namePlural="factures fournisseur">
<FIELD name="DATE_REGLEMENT" label="Date de règlement" />
<FIELD name="TVA_ADJUSTMENT" label="Ajustement de TVA" />
<FIELD name="ID_AVOIR_FOURNISSEUR" label="Avoir" />
<FIELD name="ID_AVOIR_FOURNISSEUR" label="Avoir N°1" />
<FIELD name="ID_AVOIR_FOURNISSEUR_2" label="Avoir N°2" />
<FIELD name="NET_A_PAYER" label="Net à payer" />
<FIELD name="ID_TAXE_PORT" label="Taxe sur port" />
<FIELD name="PORT_HT" label="Frais de port HT" />
1770,6 → 1795,7
<FIELD name="ID_CODE_FOURNISSEUR" label="Code Fournisseur" />
<FIELD name="ID_UNITE_VENTE" label="Unité de vente" />
<FIELD name="ID_ARTICLE" label="Article" />
<FIELD name="ID_FAMILLE_ARTICLE" label="Famille" />
<FIELD name="ID_DEVISE" label="Devise" />
<FIELD name="PA_DEVISE" label="PA Devise" />
<FIELD name="PA_DEVISE_T" label="PA Devise Total" />
2041,6 → 2067,7
<FIELD name="DATE" label="Date" />
<FIELD name="ID_ARTICLE" label="Article" />
<FIELD name="REEL" label="Réel" />
<FIELD name="ID_STOCK" label="Stock" />
</element>
<element refid="finance.accounting.account.kind" nameClass="feminine" name="nature du compte"
namePlural="natures du compte">
2338,7 → 2365,7
<FIELD name="ANALYTIQUE" label="Analytique" />
<FIELD name="NUMERO" label="N° compte" />
<FIELD name="NOM" label="Compte" />
<FIELD name="NOM_ECRITURE" label="libellé écriture" />
<FIELD name="NOM_ECRITURE" label="Libellé écriture" />
<FIELD name="DEBIT" label="Débit" />
<FIELD name="CREDIT" label="Crédit" />
<FIELD name="ID_ECRITURE" label="Ecriture" />
/trunk/OpenConcerto/src/org/openconcerto/erp/config/fieldmapping.xml
7,7 → 7,14
<field id="customerrelationship.country" name="ID_PAYS" />
<field id="customerrelationship.phone" name="PHONE" />
</table>
 
<table id="customerrelationship.customer.agency" name="AGENCE">
<field id="customerrelationship.customer.agency.designation" name="DESIGNATION" />
<field id="customerrelationship.customer.agency.phone1" name="TEL_1" />
<field id="customerrelationship.customer.agency.email" name="EMAIL" />
<field id="customerrelationship.customer.agency.fax" name="FAX" />
<field id="customerrelationship.customer.agency.customer" name="ID_CLIENT" />
<field id="customerrelationship.customer.agency.address" name="ID_ADRESSE" />
</table>
<table id="sales.invoice" name="SAISIE_VENTE_FACTURE">
<field id="sales.invoice.number" name="NUMERO" />
<field id="sales.invoice.date" name="DATE" />
/trunk/OpenConcerto/src/org/openconcerto/erp/config/DSNInstallationUtils.java
161,6 → 161,33
}
}
 
if (!root.contains("DIPLOME_PREPARE")) {
final SQLCreateTable createTableDiplome = new SQLCreateTable(root, "DIPLOME_PREPARE");
createTableDiplome.addVarCharColumn("CODE", 25);
createTableDiplome.addVarCharColumn("NOM", 512);
 
try {
root.getBase().getDataSource().execute(createTableDiplome.asString());
insertUndef(createTableDiplome);
root.refetchTable("DIPLOME_PREPARE");
root.getSchema().updateVersion();
 
final SQLTable table = root.getTable("DIPLOME_PREPARE");
List<Tuple2<String, String>> v = new ArrayList<Tuple2<String, String>>();
v.add(Tuple2.create("03", "Niveau de formation équivalent au CAP (certificat d'aptitude professionnelle) ou au BEP (brevet d'études professionnelles)"));
v.add(Tuple2.create("04", "Formation de niveau du bac (général, technologique ou professionnel), du brevet de technicien (BT) ou du brevet professionnel"));
v.add(Tuple2.create("05", "Formation de niveau bac+2 : licence 2, BTS (brevet de technicien supérieur), DUT (diplôme universitaire de technologie), etc."));
v.add(Tuple2.create("06", "Formation de niveau bac+3 et bac+4 : licence 3, licence professionnelle, master 1, etc."));
v.add(Tuple2.create("07", "Formation de niveau bac+5 : master 2, diplôme d'études approfondies, diplôme d'études supérieures spécialisées, diplôme d'ingénieur, etc."));
v.add(Tuple2.create("08", "Formation de niveau bac+8 : doctorat, habilitation à diriger des recherches, etc. "));
 
insertValues(v, table);
} catch (SQLException ex) {
throw new IllegalStateException("Erreur lors de la création de la table " + "DIPLOME_PREPARE", ex);
}
}
 
 
if (!root.contains("TYPE_PREAVIS")) {
final SQLCreateTable createTableMotif = new SQLCreateTable(root, "TYPE_PREAVIS");
createTableMotif.addVarCharColumn("CODE", 25);
1652,6 → 1679,14
root.getSchema().updateVersion();
}
 
if (!tableContrat.contains("ID_DIPLOME_PREPARE")) {
updateContrat = true;
AlterTable alter = new AlterTable(tableContrat);
alter.addForeignColumn("ID_DIPLOME_PREPARE", root.findTable("DIPLOME_PREPARE"));
root.getBase().getDataSource().execute(alter.asString());
root.getSchema().updateVersion();
}
 
if (updateContrat) {
root.refetchTable("CONTRAT_SALARIE");
tableContrat = root.findTable("CONTRAT_SALARIE");
/trunk/OpenConcerto/src/org/openconcerto/erp/config/ComptaPropsConfiguration.java
26,6 → 26,7
import org.openconcerto.erp.core.common.element.SocieteCommonSQLElement;
import org.openconcerto.erp.core.common.element.StyleSQLElement;
import org.openconcerto.erp.core.common.element.TitrePersonnelSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.AgenceSQLElement;
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;
122,6 → 123,7
import org.openconcerto.erp.core.humanresources.payroll.element.CumulsCongesSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.CumulsPayeSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.DSNNatureSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.DiplomePrepareSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.FichePayeElementSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.FichePayeSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.ImpressionRubriqueSQLElement;
176,6 → 178,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.CustomerProductFamilyQtyPriceSQLElement;
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;
273,7 → 276,9
import org.openconcerto.erp.injector.BonFactureEltSQLInjector;
import org.openconcerto.erp.injector.BonFactureSQLInjector;
import org.openconcerto.erp.injector.BonReceptionFactureFournisseurSQLInjector;
import org.openconcerto.erp.injector.BrEltFactEltSQLInjector;
import org.openconcerto.erp.injector.BrFactureAchatSQLInjector;
import org.openconcerto.erp.injector.CmdEltFactEltSQLInjector;
import org.openconcerto.erp.injector.CommandeBlEltSQLInjector;
import org.openconcerto.erp.injector.CommandeBlSQLInjector;
import org.openconcerto.erp.injector.CommandeBrEltSQLInjector;
786,6 → 791,7
dir.addSQLElement(TypeTauxPasSQLElement.class, root);
dir.addSQLElement(CodeAmenagementPartielSQLElement.class, root);
dir.addSQLElement(CodeSuspensionSQLElement.class, root);
dir.addSQLElement(DiplomePrepareSQLElement.class, root);
 
// ECO
dir.addSQLElement(FamilleEcoContributionSQLElement.class, root);
832,6 → 838,7
dir.addSQLElement(AttachmentSQLElement.class);
 
dir.addSQLElement(CustomerProductQtyPriceSQLElement.class);
dir.addSQLElement(CustomerProductFamilyQtyPriceSQLElement.class);
dir.addSQLElement(EtatStockSQLElement.class);
dir.addSQLElement(EtatStockItemSQLElement.class);
dir.addSQLElement(ArticleTarifSQLElement.class);
854,6 → 861,7
dir.addSQLElement(ContactSalarieSQLElement.class);
dir.addSQLElement(new TitrePersonnelSQLElement());
dir.addSQLElement(new ContactSQLElement());
dir.addSQLElement(new AgenceSQLElement(this.getRootSociete()));
dir.addSQLElement(new SaisieKmItemSQLElement());
dir.addSQLElement(new EcritureSQLElement());
 
1105,6 → 1113,8
new DevisBlEltSQLInjector(rootSociete);
new DevisBlSQLInjector(rootSociete);
new CommandeBlEltSQLInjector(rootSociete);
new CmdEltFactEltSQLInjector(rootSociete);
new BrEltFactEltSQLInjector(rootSociete);
new CommandeBrEltSQLInjector(rootSociete);
new CommandeBlSQLInjector(rootSociete);
new BonFactureSQLInjector(rootSociete);
/trunk/OpenConcerto/src/org/openconcerto/erp/config/DefaultMenuConfiguration.java
96,6 → 96,7
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.ReportingCommercialFournisseurAction;
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;
117,6 → 118,7
import org.openconcerto.erp.core.sales.invoice.action.NouveauSaisieVenteComptoirAction;
import org.openconcerto.erp.core.sales.invoice.action.NouveauSaisieVenteFactureAction;
import org.openconcerto.erp.core.sales.invoice.report.ReportingClientPanel;
import org.openconcerto.erp.core.sales.invoice.report.SituationCompteClientPanel;
import org.openconcerto.erp.core.sales.order.action.ListeDesCommandesClientAction;
import org.openconcerto.erp.core.sales.order.action.ListeDesCommandesClientItemsAction;
import org.openconcerto.erp.core.sales.order.action.ListeDesElementsACommanderClientAction;
391,7 → 393,6
gCustomer.addItem("customer.payment.list");
gCustomer.addItem("customer.payment.followup.list");
gCustomer.addItem("customer.payment.check.pending.list");
gCustomer.addItem("customer.payment.check.deposit.list");
gCustomer.addItem("customer.payment.check.pending.create");
gCustomer.addItem("customer.payment.check.deposit.list");
gCustomer.addItem("customer.credit.check.list");
423,6 → 424,7
group.addItem("order.list.reporting");
group.addItem("sales.list.report");
group.addItem("sales.list.salesman.report");
group.addItem("sales.list.salesman.supplier.report");
group.addItem("sales.product.graph");
group.addItem("sales.product.margin.graph");
group.addItem("sales.product.family.graph");
731,6 → 733,7
mManager.putAction(new EvolutionCmdCumulAction(), "sales.graph.cmd.cumulate");
 
mManager.putAction(new ReportingCommercialAction(conf.getRootSociete()), "sales.list.salesman.report");
mManager.putAction(new ReportingCommercialFournisseurAction(conf), "sales.list.salesman.supplier.report");
 
mManager.putAction(new EvolutionMargeAction(), "sales.margin.graph");
mManager.putAction(new GenReportingVenteAction(false), "sales.list.reporting");
788,6 → 791,15
 
}
}, "customer.payment.report");
mManager.putAction(new AbstractAction("Situation Client") {
@Override
public void actionPerformed(ActionEvent arg0) {
 
PanelFrame frame = new PanelFrame(new SituationCompteClientPanel(conf), "Situation client");
frame.setVisible(true);
 
}
}, "customer.payment.details");
mManager.putAction(new ListeDesEncaissementsAction(), "customer.payment.list");
mManager.putAction(new ListeDesRelancesAction(), "customer.payment.followup.list");
mManager.putAction(new ListeDesChequesAEncaisserAction(), "customer.payment.check.pending.list");
/trunk/OpenConcerto/src/org/openconcerto/erp/config/update/Updater_1_5.java
29,6 → 29,7
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;
import org.openconcerto.sql.model.AliasedTable;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLField.Properties;
80,6 → 81,24
tableCompte.fetchFields();
}
 
// Champ obsolete sur compte
SQLTable tableTitre = root.getTable("TITRE_PERSONNEL");
if (!tableTitre.contains("OBSOLETE")) {
final AlterTable alter = new AlterTable(tableTitre);
alter.addBooleanColumn("OBSOLETE", Boolean.FALSE, false);
tableTitre.getBase().getDataSource().execute(alter.asString());
tableTitre.getSchema().updateVersion();
tableTitre.fetchFields();
final UpdateBuilder updBuilder = new UpdateBuilder(tableTitre).setObject(tableTitre.getField("OBSOLETE"), Boolean.TRUE);
updBuilder.setWhere(new Where(tableTitre.getField("CODE"), "=", "Mlle"));
tableTitre.getBase().getDataSource().execute(updBuilder.asString());
final UpdateBuilder updBuilder2 = new UpdateBuilder(tableTitre).setObject(tableTitre.getField("CODE"), "M.");
updBuilder2.setWhere(new Where(tableTitre.getField("CODE"), "=", "Mr"));
 
tableTitre.getBase().getDataSource().execute(updBuilder2.asString());
 
}
 
// Transaction du solde
if (!root.contains(COMPTE_CLIENT_TRANSACTION)) {
final SQLCreateTable createTable = new SQLCreateTable(root, COMPTE_CLIENT_TRANSACTION);
231,7 → 250,7
createTable.addVarCharColumn("TAG", 128);
createTable.addIntegerColumn("VERSION", 0);
createTable.addVarCharColumn("HASH", 32);
 
createTable.addBooleanColumn("ENCRYPTED", Boolean.FALSE, false);
try {
root.getBase().getDataSource().execute(createTable.asString());
InstallationPanel.insertUndef(createTable);
267,7 → 286,13
tableAttachment.getSchema().updateVersion();
tableAttachment.fetchFields();
}
 
if (!tableAttachment.contains("ENCRYPTED")) {
final AlterTable alter = new AlterTable(tableAttachment);
alter.addBooleanColumn("ENCRYPTED", Boolean.FALSE, false);
tableAttachment.getBase().getDataSource().execute(alter.asString());
tableAttachment.getSchema().updateVersion();
tableAttachment.fetchFields();
}
List<String> gedTable = Arrays.asList("CLIENT", "MOUVEMENT", "FOURNISSEUR", "ARTICLE", "FACTURE_FOURNISSEUR", "SAISIE_VENTE_FACTURE", "SALARIE");
for (String string : gedTable) {
SQLTable tableGED = root.getTable(string);
409,7 → 434,6
root.getSchema().updateVersion();
UpdateBuilder build = new UpdateBuilder(tableCmdFElt);
build.setObject("RECU", Boolean.FALSE);
build.set("QTE_RECUE", "\"QTE\"*\"QTE_UNITAIRE\"");
 
Where w = Where.createRaw(tableCmdFElt.getField("QTE_RECUE").getQuotedName() + " < (" + tableCmdFElt.getField("QTE").getQuotedName() + "*"
+ tableCmdFElt.getField("QTE_UNITAIRE").getQuotedName() + ")", tableCmdFElt.getField("QTE_UNITAIRE"), tableCmdFElt.getField("QTE"), tableCmdFElt.getField("QTE_RECUE"));
2286,8 → 2310,118
tableEtatStock.getSchema().updateVersion();
tableEtatStock.fetchFields();
}
 
// Création de la table Agence
if (!root.contains("AGENCE")) {
SQLCreateTable createAgence = new SQLCreateTable(root, "AGENCE");
createAgence.addVarCharColumn("DESIGNATION", 256);
createAgence.addVarCharColumn("TEL_1", 256);
createAgence.addVarCharColumn("EMAIL", 256);
createAgence.addVarCharColumn("FAX", 256);
createAgence.addForeignColumn("ID_CLIENT", root.findTable("CLIENT"));
createAgence.addForeignColumn("ID_ADRESSE", root.findTable("ADRESSE"));
 
try {
// test
root.getBase().getDataSource().execute(createAgence.asString());
root.refetchTable("AGENCE");
SQLRowValues rowVals = new SQLRowValues(root.getTable("AGENCE"));
SQLRow rowInserted = rowVals.commit();
SQLTable.setUndefID(root.getSchema(), "AGENCE", rowInserted.getID());
tableDevis.getSchema().updateVersion();
} catch (SQLException ex) {
throw new IllegalStateException("Erreur lors de la création de la table AGENCE", ex);
}
}
// Tarification client par famille article
if (root.getTable("TARIF_FAMILLE_ARTICLE_CLIENT") == null) {
final SQLCreateTable createTableQtyTarif = new SQLCreateTable(root, "TARIF_FAMILLE_ARTICLE_CLIENT");
createTableQtyTarif.addForeignColumn("ID_FAMILLE_ARTICLE", root.getTable("FAMILLE_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_FAMILLE_ARTICLE_CLIENT");
root.getSchema().updateVersion();
} catch (SQLException ex) {
throw new IllegalStateException("Erreur lors de la création de la table " + "TARIF_FAMILLE_ARTICLE_CLIENT", ex);
}
}
 
// Tarification client par famille article
if (root.getTable("TARIF_FAMILLE_ARTICLE_CLIENT") == null) {
final SQLCreateTable createTableQtyTarif = new SQLCreateTable(root, "TARIF_FAMILLE_ARTICLE_CLIENT");
createTableQtyTarif.addForeignColumn("ID_FAMILLE_ARTICLE", root.getTable("FAMILLE_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_FAMILLE_ARTICLE_CLIENT");
root.getSchema().updateVersion();
} catch (SQLException ex) {
throw new IllegalStateException("Erreur lors de la création de la table " + "TARIF_FAMILLE_ARTICLE_CLIENT", ex);
}
}
 
SQLTable tableAvoirC = root.getTable("AVOIR_CLIENT");
if (!tableAvoirC.contains("ID_TAXE_PORT")) {
final AlterTable alterB = new AlterTable(tableAvoirC);
alterB.addForeignColumn("ID_TAXE_PORT", root.getTable("TAXE"));
root.getBase().getDataSource().execute(alterB.asString());
root.refetchTable(tableAvoirC.getName());
root.getSchema().updateVersion();
}
 
SQLTable tableVF = root.getTable("SAISIE_VENTE_FACTURE");
if (!tableVF.contains("ID_FACTURATION_COMMANDE_CLIENT")) {
final AlterTable alter = new AlterTable(tableVF);
final SQLTable tableFacturationCommandeClient = tableVF.getDBRoot().getTable("FACTURATION_COMMANDE_CLIENT");
alter.addForeignColumn("ID_FACTURATION_COMMANDE_CLIENT", tableFacturationCommandeClient);
tableVF.getBase().getDataSource().execute(alter.asString());
tableVF.getSchema().updateVersion();
tableVF.fetchFields();
 
// update ID_FACTURATION_COMMANDE
UpdateBuilder builder = new UpdateBuilder(tableVF);
AliasedTable ref = new AliasedTable(tableFacturationCommandeClient, "tf");
builder.addBackwardVirtualJoin(ref, "ID_SAISIE_VENTE_FACTURE");
builder.setFromVirtualJoinField("ID_FACTURATION_COMMANDE_CLIENT", "tf", tableFacturationCommandeClient.getKey().getName());
tableVF.getBase().getDataSource().execute(builder.asString());
}
if (!root.getTable("NUMEROTATION_AUTO").contains("CODE_LETTRAGE_PARTIEL")) {
final AlterTable alterNumero = new AlterTable(root.getTable("NUMEROTATION_AUTO"));
alterNumero.addVarCharColumn("CODE_LETTRAGE_PARTIEL", 256);
root.getBase().getDataSource().execute(alterNumero.asString());
root.refetchTable("NUMEROTATION_AUTO");
root.getSchema().updateVersion();
}
 
if (!root.getTable("ECRITURE").contains("LETTRAGE_PARTIEL")) {
final AlterTable alterEcriture = new AlterTable(root.getTable("ECRITURE"));
alterEcriture.addVarCharColumn("LETTRAGE_PARTIEL", 256);
root.getBase().getDataSource().execute(alterEcriture.asString());
root.refetchTable("ECRITURE");
root.getSchema().updateVersion();
}
 
SQLTable tableFactureF = root.getTable("FACTURE_FOURNISSEUR");
if (!tableFactureF.contains("ID_AVOIR_FOURNISSEUR_2")) {
final AlterTable alter = new AlterTable(tableFactureF);
final SQLTable tableAvoirF = tableVF.getDBRoot().getTable("AVOIR_FOURNISSEUR");
alter.addForeignColumn("ID_AVOIR_FOURNISSEUR_2", tableAvoirF);
tableFactureF.getBase().getDataSource().execute(alter.asString());
tableFactureF.getSchema().updateVersion();
tableVF.fetchFields();
}
 
}
 
public static void initStock(SQLRow rowArticle, int idDepot) {
 
SQLSelect selStock = new SQLSelect();
/trunk/OpenConcerto/src/org/openconcerto/erp/modules/ModulePackager.java
216,7 → 216,7
final JarEntry e = entries.nextElement();
if (!e.getName().startsWith("META-INF")) {
// use copy-constructor to keep all fields
zip(out, new JarEntry(e), f.getInputStream(e));
zip(out, new JarEntry(e.getName()), f.getInputStream(e));
}
}
} finally {
/trunk/OpenConcerto/src/org/openconcerto/erp/modules/ComponentsContext.java
17,6 → 17,7
import org.openconcerto.sql.element.SQLElementDirectory;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLName;
import org.openconcerto.sql.sqlobject.SQLRequestComboBox;
import org.openconcerto.sql.sqlobject.SQLTextCombo;
import org.openconcerto.sql.view.DropManager;
import org.openconcerto.sql.view.FileDropHandler;
24,6 → 25,7
import org.openconcerto.utils.ListMap;
 
import java.util.Set;
import java.util.function.Supplier;
 
import javax.swing.text.JTextComponent;
 
73,9 → 75,9
}
}
 
public final void putAdditionalField(final String tableName, final String name, final JTextComponent comp) {
public final void putAdditionalTextField(final String tableName, final String name, final Supplier<? extends JTextComponent> comp) {
final SQLElement elem = checkField(tableName, name);
if (elem.putAdditionalField(name, comp)) {
if (elem.putAdditionalTextField(name, comp)) {
this.fields.add(elem, name);
} else {
throw new IllegalStateException("Already added " + name + " in " + elem);
82,9 → 84,9
}
}
 
public final void putAdditionalField(final String tableName, final String name, final SQLTextCombo comp) {
public final void putAdditionalTextCombo(final String tableName, final String name, final Supplier<? extends SQLTextCombo> comp) {
final SQLElement elem = checkField(tableName, name);
if (elem.putAdditionalField(name, comp)) {
if (elem.putAdditionalTextCombo(name, comp)) {
this.fields.add(elem, name);
} else {
throw new IllegalStateException("Already added " + name + " in " + elem);
91,6 → 93,15
}
}
 
public final void putAdditionalCombo(final String tableName, final String name, final Supplier<? extends SQLRequestComboBox> comp) {
final SQLElement elem = checkField(tableName, name);
if (elem.putAdditionalCombo(name, comp)) {
this.fields.add(elem, name);
} else {
throw new IllegalStateException("Already added " + name + " in " + elem);
}
}
 
final ListMap<SQLElement, String> getFields() {
return this.fields;
}
/trunk/OpenConcerto/src/org/openconcerto/ql/QLPrinter.java
23,10 → 23,12
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;
 
import javax.imageio.ImageIO;
 
public class QLPrinter {
private static final int ESC = 0x1B;
private String host;
private boolean highQuality;
private boolean paperCutAuto;
49,7 → 51,7
 
/**
* Set print width (in milimeters)
* */
*/
public void setPrintWidth(int mm) {
this.printWidth = mm;
}
77,16 → 79,18
for (int i = 0; i < 200; i++) {
out.write(0x00);
}
// Init 0x1B 0x40
out.write(0x1B);
out.write(0x40);
// ?? : 0x1B 0x69 0x61 0x01
out.write(0x1B);
 
// Select ESCP/P Mode : 0x1B 0x69 0x61 0x01
out.write(ESC);
out.write(0x69);
out.write(0x61);
out.write(0x01);
// Init 0x1B 0x40
out.write(ESC);
out.write(0x40);
 
// Page Length
out.write(0x1B);
out.write(ESC);
out.write(0x69);
out.write(0x7A);
 
101,8 → 105,8
out.write(0);
out.write(0);
out.write(0);
// Paper Cut
out.write(0x1B);
// Paper Cut : ESC i
out.write(ESC);
out.write(0x69);
out.write(0x4D);
if (this.paperCutAuto) {
111,13 → 115,13
out.write(0x00);
}
 
// ?? : 0x1B 0x69 0x41 0x01
out.write(0x1B);
// ?? : 0x1B 0x69 0x41 0x01 :ESC i A
out.write(ESC);
out.write(0x69);
out.write(0x41);
out.write(0x01);
// Set Mode
out.write(0x1B);
// Set Mode : ESC i K
out.write(ESC);
out.write(0x69);
out.write(0x4B);
if (!this.highQuality) {
126,7 → 130,7
out.write(0x48);
}
// Set Margin
out.write(0x1B);
out.write(ESC);
out.write(0x69);
out.write(0x64);
out.write(0x00);
332,6 → 336,7
out.close();
in.close();
socket.close();
System.out.println("QLPrinter.print() done");
}
}
 
346,4 → 351,92
return cfA;
}
 
/**
* Print 2D barcode (DataMatrix)
*
* @param dotsPerCell (3 - 10)
* @param barcode : barcode (ascii)
* @throws IOException
*
*/
public void printDataMatrixBarCode2D(int dotsPerCell, String barcode) throws IOException {
if (barcode.length() > (144 * 144)) {
throw new IllegalArgumentException("barcode too long (max : 144x144:20736)");
}
 
ByteArrayOutputStream out = new ByteArrayOutputStream();
{
// Header: 0x00 : 200 fois
for (int i = 0; i < 200; i++) {
out.write(0x00);
}
 
}
 
// Select ESCP/P Mode : 0x1B 0x69 0x61 0x00
out.write(ESC);
out.write(0x69);
out.write(0x61);
out.write(0x00); // mode ESC/P standard
// Init 0x1B 0x40
out.write(ESC);
out.write(0x40);
 
// ESC i D
out.write(ESC);
out.write(0x69);
out.write(0x44);
//
out.write(dotsPerCell);
out.write(0); // square
out.write(0); // vertical size : auto
out.write(0); // horizontal size : auto
for (int i = 0; i < 5; i++) {
out.write(0); // reserved
}
// data
out.write(barcode.getBytes(StandardCharsets.US_ASCII));
out.write('\\');
out.write('\\');
out.write('\\');
// Page feed
out.write(0x0C);
 
out.flush();
 
final byte[] byteArray = out.toByteArray();
print(byteArray);
}
 
public void print(String string) throws IOException {
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
// Select ESCP/P Mode : 0x1B 0x69 0x61 0x00
bOut.write(ESC);
bOut.write(0x69);
bOut.write(0x61);
bOut.write(0x0); // mode ESC/P standard
// Init 0x1B 0x40
bOut.write(ESC);
bOut.write(0x40);
 
// Init
bOut.write(ESC);
bOut.write(0x40);
// French characters
bOut.write(ESC);
bOut.write(0x52);
bOut.write(0x01);
// Normal
bOut.write(ESC);
bOut.write(0x21);
bOut.write(0);// Default
bOut.write(string.getBytes(StandardCharsets.US_ASCII));
bOut.write(0x0A);// Retour a la ligne
// Page feed
bOut.write(0x0C);
 
print(bOut.toByteArray());
 
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/ql/QLPrinterExample.java
18,15 → 18,19
 
public class QLPrinterExample {
public static void main(String[] args) {
QLPrinter prt = new QLPrinter("192.168.1.103");
QLPrinter prt = new QLPrinter("192.168.168.53");
prt.setHighQuality(true);
try {
 
prt.print(new File("Hello_720x300.png"));
String code = "123456789";
prt.printDataMatrixBarCode2D(10, code);
 
prt.print("Hello");
} catch (IOException e) {
e.printStackTrace();
}
}
}
/trunk/OpenConcerto/src/org/openconcerto/openoffice/generation/ReportGeneration.java
39,13 → 39,14
import java.util.Map.Entry;
import java.util.Stack;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeoutException;
 
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.filter.Filter;
 
import net.jcip.annotations.GuardedBy;
import ognl.Ognl;
import ognl.OgnlException;
import ognl.OgnlRuntime;
87,9 → 88,11
// Inheritable to allow generators to spawn threads
private final InheritableThreadLocal<ReportPart> currentParts;
private final InheritableThreadLocal<DocumentGenerator> currentGenerator;
@GuardedBy("this")
private Throwable interruptCause;
// tous les générateurs s'exécuter dans ce groupe
private final ThreadGroup thg;
@GuardedBy("this")
private List<Thread> thg;
private final List<PropertyChangeListener> taskListeners;
private final PropertyChangeListener taskListener;
private Map<String, Object> commonData;
109,11 → 112,7
this.currentParts = new InheritableThreadLocal<ReportPart>();
this.currentGenerator = new InheritableThreadLocal<DocumentGenerator>();
this.interruptCause = null;
this.thg = new ThreadGroup("Generateurs") {
public void uncaughtException(Thread t, Throwable e) {
ReportGeneration.this.interrupt(e);
}
};
this.thg = null;
 
this.taskListeners = new ArrayList<PropertyChangeListener>();
this.taskListener = new PropertyChangeListener() {
198,6 → 197,7
public final Map<String, ODSingleXMLDocument> generateMulti() throws Throwable {
synchronized (this) {
this.interruptCause = null;
this.thg = new ArrayList<>();
}
 
Map<String, ODSingleXMLDocument> f = null;
206,17 → 206,34
return createDocument();
}
});
final Thread thr = new Thread(this.thg, future);
// Don't pass a ThreadGroup, since every thread created, including "cache timeout", JDBC
// threads will be in it. But these threads must out-live this generation.
final Thread thr = new Thread(null, future);
this.registerThread(thr);
thr.start();
try {
thr.join();
f = future.get();
} catch (Exception e) {
if (isInterruptedExn(e) || (e instanceof ExecutionException && isInterruptedExn(e.getCause())))
f = null;
else
assert f == null;
// If one thread was interrupted (or failed), interrupt the others
this.interrupt(e);
} finally {
// Make sure all threads are stopped and don't prevent this from being garbage
// collected.
final List<Thread> toJoin;
synchronized (this) {
toJoin = this.thg;
this.thg = null;
}
for (final Thread t : toJoin) {
// If no exception occurred, then should already be finished but if there was one in
// a thread, another thread might be stuck on some I/O for a while before it can
// process the interrupt.
t.join(4500);
if (t.isAlive())
throw new TimeoutException("Thread still not terminated : " + t);
}
}
 
final Map<String, ODSingleXMLDocument> res;
synchronized (this) {
236,14 → 253,20
return res;
}
 
public final synchronized void registerThread(final Thread thr) {
this.thg.add(thr);
}
 
protected final void interrupt(Throwable cause) {
synchronized (this) {
if (this.interruptCause == null) {
this.interruptCause = cause;
this.thg.interrupt();
for (final Thread thr : this.thg) {
thr.interrupt();
}
}
}
}
 
private Map<String, ODSingleXMLDocument> createDocument() throws IOException, OgnlException, InterruptedException {
// recompute common data for each run
276,6 → 299,7
if (part instanceof ForkReportPart) {
GenThread thread = new GenThread(part.getName(), ((ForkReportPart) part).getChildren());
forked.put(part.getName(), thread);
this.registerThread(thread);
thread.start();
} else if (part instanceof SubReportPart) {
final SubReportPart subReportPart = (SubReportPart) part;
/trunk/OpenConcerto/src/org/openconcerto/openoffice/generation/view/BaseGenerationRapport.java
59,9 → 59,12
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
 
import org.jdom.JDOMException;
 
import net.jcip.annotations.GuardedBy;
 
/**
* A panel to choose a ReportType, see the tasks of the generation, and optionnaly open the
* document. NOTE: you have to call {@link #enableGeneration(boolean)} before being able to
95,11 → 98,11
private JList<GenerationTask> tasksView;
private final JLabel status;
 
// le groupe dans lequel doivent être toutes les thread de la génération
private final ThreadGroup thg;
@GuardedBy("EDT")
private SwingWorker<Void, Void> generationWorker;
 
public BaseGenerationRapport() throws JDOMException, IOException {
this.thg = new ThreadGroup(this + " thread group");
this.generationWorker = null;
this.status = new JLabel();
this.setStatus("Inactif");
}
234,7 → 237,8
*/
public final void interrupt() {
// pas de threads active, quand pas génération
this.thg.interrupt();
if (this.generationWorker != null)
this.generationWorker.cancel(true);
}
 
class GenerateAction implements ActionListener {
246,21 → 250,22
enableGeneration(false);
final FileAction sel = (FileAction) BaseGenerationRapport.this.fileActionCombo.getSelectedItem();
// "génération..."
new Thread(BaseGenerationRapport.this.thg, new Runnable() {
BaseGenerationRapport.this.generationWorker = new SwingWorker<Void, Void>() {
@Override
public void run() {
protected Void doInBackground() throws Exception {
generate(sel);
return null;
}
 
@Override
protected void done() {
// toujours le faire, même si interrompu
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
enableGeneration(true);
}
});
};
BaseGenerationRapport.this.generationWorker.execute();
}
}).start();
}
}
 
protected final void enableGeneration(final boolean b) {
this.fileActionCombo.setEnabled(b);
267,7 → 272,6
this.genererButton.setEnabled(b);
}
 
// doit s'exécuter dans this.thg
protected final void generate(final FileAction sel) {
final ReportType type = (ReportType) this.typeRapportComboSelection.getSelectedItem();
final R rg = this.createGeneration(type);
/trunk/OpenConcerto/src/org/openconcerto/openoffice/ODFrame.java
13,6 → 13,7
package org.openconcerto.openoffice;
 
import org.openconcerto.openoffice.spreadsheet.BytesProducer;
import org.openconcerto.openoffice.text.TextNode;
 
import java.math.BigDecimal;
28,6 → 29,20
*/
public class ODFrame<D extends ODDocument> extends ImmutableDocStyledNode<GraphicStyle, D> {
 
static public Element createEmpty(XMLVersion ns, final Number w, final Number h, final LengthUnit unit) {
return createEmpty(ns, BigDecimal.ZERO, BigDecimal.ZERO, w, h, unit);
}
 
static public Element createEmpty(XMLVersion ns, final Number x, final Number y, final Number w, final Number h, final LengthUnit unit) {
final Namespace svgNS = ns.getNS("svg");
final Element res = new Element("frame", ns.getNS("draw"));
res.setAttribute("x", unit.format(x), svgNS);
res.setAttribute("y", unit.format(y), svgNS);
res.setAttribute("width", unit.format(w), svgNS);
res.setAttribute("height", unit.format(h), svgNS);
return res;
}
 
/**
* Parse SVG and OD length.
*
120,4 → 135,36
public final LengthUnit getUnit() {
return LengthUnit.MM;
}
 
public final void addImage(final String name, final BytesProducer data) {
final Element imageElem = new Element("image", getElement().getNamespace("draw"));
this.getElement().addContent(imageElem);
this.putImage(imageElem, name, data);
}
 
private final void putImage(final Element imageElem, final String name, final BytesProducer data) {
final String imgPath = "Pictures/" + name + (data.getFormat() != null ? "." + data.getFormat() : "");
imageElem.setAttribute("href", imgPath, this.getODDocument().getVersion().getNS("xlink"));
this.getODDocument().getPackage().putFile(imgPath, data.getBytes(this));
}
 
public final void setImage(final String name, final BytesProducer data, final boolean allowAdd) {
final Element