OpenConcerto

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

svn://code.openconcerto.org/openconcerto

Compare Revisions

Regard whitespace Rev 173 → Rev 174

/trunk/OpenConcerto/.classpath
16,7 → 16,6
<classpathentry exported="true" kind="lib" path="lib/ognl-2.6.5.jar"/>
<classpathentry exported="true" kind="lib" path="lib/resolver.jar"/>
<classpathentry exported="true" kind="lib" path="lib/RXTXcomm.jar"/>
<classpathentry exported="true" kind="lib" path="lib/poi-3.8-beta3-20110606.jar"/>
<classpathentry kind="lib" path="lib/jcip-annotations.jar"/>
<classpathentry kind="lib" path="lib/fb-annotations-2.0.0.jar"/>
<classpathentry exported="true" kind="lib" path="lib/commons-dbcp-1.4.jar"/>
44,5 → 43,6
<classpathentry kind="lib" path="lib/mysql-connector-java-5.1.40-bin.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="lib" path="lib/postgresql-42.2.2.jre7.jar"/>
<classpathentry kind="lib" path="lib/poi-3.17.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
/trunk/OpenConcerto/lib/jOpenDocument-1.4rc2.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/lib/jOpenCalendar.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/src/org/jopendocument/link/OOConnexion.java
84,8 → 84,14
perms.add(new RuntimePermission("modifyThread"));
// needed by PrinterJob.getPrinterJob()
perms.add(new RuntimePermission("queuePrintJob"));
 
// ProcessBuilder.start() calls SecurityManager.checkExec() which requires
// absolute path (or execute on "<<ALL FILES>>")
 
// needed by OOConnexion.init() to find the port
perms.add(new FilePermission("/usr/bin/lsof", "execute"));
// macOS path
perms.add(new FilePermission("/usr/sbin/lsof", "execute"));
perms.add(new FilePermission("/bin/ps", "execute"));
perms.add(new FilePermission("C:/Windows/System32/tasklist.exe", "execute"));
perms.add(new RuntimePermission("getenv.*"));
/trunk/OpenConcerto/src/org/jopendocument/link/OOInstallation.java
102,10 → 102,14
rootPaths.addAll(Arrays.asList(loRootPaths));
rootPaths.addAll(Arrays.asList(ooRootPaths));
}
 
for (final String p : rootPaths) {
if (DesktopEnvironment.test("reg", "query", p))
// On force à chercher dans le registre 64 bits sinon il va chercher dans le registre 32
// bits si os 64b et VM 32b
if (DesktopEnvironment.test("reg", "query", p, "/reg:64"))
return p;
}
 
return null;
}
 
123,7 → 127,8
// all string values for the passed registry path
private static Map<String, String> getStringValues(final String path, final String option) throws IOException {
final Map<String, String> values = new HashMap<String, String>();
final String out = DesktopEnvironment.cmdSubstitution(Runtime.getRuntime().exec(new String[] { "reg", "query", path, option }));
// On force /reg:64 (utile si on utilise une VM 32 avec un systeme 64 bits)
final String out = DesktopEnvironment.cmdSubstitution(Runtime.getRuntime().exec(new String[] { "reg", "query", path, option, "/reg:64" }));
final Matcher matcher = stringValuePattern.matcher(out);
while (matcher.find()) {
values.put(matcher.group(1), matcher.group(2));
/trunk/OpenConcerto/src/org/openconcerto/erp/panel/compta/ImportRImport.java
New file
0,0 → 1,190
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.panel.compta;
 
import org.openconcerto.erp.generationEcritures.Ecriture;
import org.openconcerto.erp.generationEcritures.Exercice;
import org.openconcerto.erp.generationEcritures.Mouvement;
import org.openconcerto.erp.generationEcritures.Piece;
import org.openconcerto.sql.element.SQLElementDirectory;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.users.User;
import org.openconcerto.utils.StringUtils;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.nio.charset.Charset;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class ImportRImport {
private String error = null;
private final Map<String, Piece> mapPiece = new HashMap<>();
private final Map<String, String> mapJournal = new HashMap<>();
 
/**
* Import format Ciel.
*
* Une pièce par journal
*
*/
public ImportRImport() {
//
}
 
public void loadFrom(File file) throws IOException {
this.mapPiece.clear();
this.mapJournal.clear();
this.error = null;
parseJournaux(file);
try (BufferedReader bReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), Charset.forName("Cp1252")))) {
String line = bReader.readLine();
while (!(line.startsWith("##Section") && line.contains("Mvt"))) {
line = bReader.readLine();
}
line = bReader.readLine();
while (line != null && !line.contains("#Section")) {
final List<String> parts = StringUtils.fastSplit(line, '\t');
final String journalCode = unquote(parts.get(1).trim());
final Date ecritureDate = parseDate(unquote(parts.get(2).trim()));
final String compteNum = unquote(parts.get(3).trim());
final String compteLib = unquote(parts.get(4).trim());
final BigDecimal m = new BigDecimal(cleanMontant(parts.get(5)));
BigDecimal debit = BigDecimal.ZERO;
BigDecimal credit = BigDecimal.ZERO;
if (parts.get(6).equalsIgnoreCase("D")) {
debit = m;
} else {
credit = m;
}
final String valid = parts.get(7);
Date validDate = null;
if (valid.equalsIgnoreCase("V")) {
validDate = ecritureDate;
}
final String ecritureLib = unquote(parts.get(8).trim());
final String pieceRef = "Import " + journalCode;
Piece p = this.mapPiece.get(pieceRef);
Mouvement mouvement;
if (p == null) {
p = new Piece(pieceRef);
mouvement = new Mouvement();
p.add(mouvement);
 
} else {
mouvement = p.getMouvements().get(0);
}
final Ecriture ecriture = new Ecriture(ecritureDate, debit, credit);
ecriture.setNom(ecritureLib);
ecriture.setCompte(compteNum, compteLib);
final String journal = getJournal(journalCode);
if (journal == null) {
this.error = "Pas de journal trouvé pour le code journal : " + journalCode;
return;
}
ecriture.setJournal(journalCode, journal);
ecriture.setDateValidation(validDate);
if ("AN".equals(journalCode)) {
ecriture.setaNouveau(true);
}
mouvement.add(ecriture);
 
// Next
line = bReader.readLine();
}
 
}
}
 
private String unquote(String str) {
if (str.length() < 3) {
return str;
}
return str.substring(1, str.length() - 1);
}
 
private void parseJournaux(File file) throws IOException {
try (BufferedReader bReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), Charset.forName("Cp1252")))) {
String line = bReader.readLine();
while (!(line.startsWith("##Section") && line.contains("Jnl"))) {
line = bReader.readLine();
}
line = bReader.readLine();
while (line != null && !line.contains("#Section")) {
final List<String> parts = StringUtils.fastSplit(line, '\t');
this.mapJournal.put(unquote(parts.get(0)), unquote(parts.get(1)));
// Next
line = bReader.readLine();
}
}
 
}
 
private String getJournal(String journalCode) {
return this.mapJournal.get(journalCode);
}
 
private String cleanMontant(String str) {
final int l = str.length();
final StringBuilder b = new StringBuilder(l);
for (int i = 0; i < l; i++) {
final char c = str.charAt(i);
if (Character.isDigit(c)) {
b.append(c);
} else if (c == ',') {
b.append('.');
}
}
return b.toString();
}
 
private Date parseDate(String str) {
if (str.length() != 10) {
return null;
}
final Calendar c = Calendar.getInstance();
 
final int day = Integer.parseInt(str.substring(0, 2));
final int month = Integer.parseInt(str.substring(3, 5));
final int year = Integer.parseInt(str.substring(6, 10));
c.set(year, month - 1, day, 0, 0, 0);
return c.getTime();
}
 
// return null is no error
public String getError() {
return this.error;
}
 
public void importTo(SQLElementDirectory directory, DBRoot rootSociete, User user) throws SQLException {
Exercice e = new Exercice();
e.insert(directory, rootSociete, user, new ArrayList<Piece>(this.mapPiece.values()));
}
 
public static void main(String[] args) throws IOException {
ImportRImport i = new ImportRImport();
i.loadFrom(new File("Y:\\Projets\\OpenConcerto\\ExportCiel\\RImport.txt"));
System.err.println("ImportRImport.main()" + i.getError());
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/panel/compta/ImportFEC.java
New file
0,0 → 1,164
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.panel.compta;
 
import org.openconcerto.erp.generationEcritures.Ecriture;
import org.openconcerto.erp.generationEcritures.Exercice;
import org.openconcerto.erp.generationEcritures.Mouvement;
import org.openconcerto.erp.generationEcritures.Piece;
import org.openconcerto.sql.element.SQLElementDirectory;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.users.User;
import org.openconcerto.utils.StringUtils;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.nio.charset.Charset;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class ImportFEC {
private String error = null;
private Map<String, Piece> mapPiece = new HashMap<>();
 
public ImportFEC() {
//
}
 
public void loadFrom(File file) throws IOException {
this.error = null;
this.mapPiece = null;
 
try (BufferedReader bReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), Charset.forName("Cp1252")))) {
String line = bReader.readLine();
final List<String> headers = StringUtils.fastSplit(line, ExportFEC.ZONE_SEPARATOR);
for (int i = 0; i < headers.size(); i++) {
String c1 = headers.get(i);
String c2 = ExportFEC.COLS.get(i);
// Typo chez les stars de Ciel : MontantDevise au lieu de Montantdevise
if (!c1.equalsIgnoreCase(c2)) {
this.error = "L'entête de la colonne " + (i + 1) + " : " + c1 + " n'est pas " + c2;
return;
}
}
line = bReader.readLine();
while (line != null) {
final List<String> parts = fastSplit(line, ExportFEC.ZONE_SEPARATOR);
final String journalCode = parts.get(0).trim();
final String journalLib = parts.get(1).trim();
// final String ecritureNum = parts.get(2).trim();
final Date ecritureDate = parseDate(parts.get(3).trim());
final String compteNum = parts.get(4).trim();
final String compteLib = parts.get(5).trim();
// final String compAuxNum = parts.get(6).trim();
// final String compAuxLib = parts.get(7).trim();
String pieceRef = parts.get(8).trim();
// final String pieceDate = parts.get(9).trim();
final String ecritureLib = parts.get(10).trim();
final BigDecimal debit = new BigDecimal(parts.get(11).replace(',', '.'));
final BigDecimal credit = new BigDecimal(parts.get(12).replace(',', '.'));
final String ecritureLet = parts.get(13).trim();
final Date dateLet = parseDate(parts.get(14).trim());
final Date validDate = parseDate(parts.get(15).trim());
// final String montantdevise = parts.get(16).trim();
// final String idevise = parts.get(17).trim();
 
if (pieceRef.isEmpty()) {
pieceRef = "Import";
}
Piece p = this.mapPiece.get(pieceRef);
Mouvement mouvement;
if (p == null) {
p = new Piece(pieceRef);
mouvement = new Mouvement();
p.add(mouvement);
 
} else {
mouvement = p.getMouvements().get(0);
}
final Ecriture ecriture = new Ecriture(ecritureDate, debit, credit);
ecriture.setNom(ecritureLib);
ecriture.setCompte(compteNum, compteLib);
ecriture.setJournal(journalCode, journalLib);
ecriture.setDateValidation(validDate);
ecriture.setDateLettrage(dateLet);
ecriture.setLettrage(ecritureLet);
if ("AN".equals(journalCode)) {
ecriture.setaNouveau(true);
}
mouvement.add(ecriture);
 
// Next
line = bReader.readLine();
}
 
}
}
 
private Date parseDate(String str) {
if (str.length() != 8) {
return null;
}
final Calendar c = Calendar.getInstance();
final int year = Integer.parseInt(str.substring(0, 4));
final int month = Integer.parseInt(str.substring(4, 6));
final int day = Integer.parseInt(str.substring(6, 8));
c.set(year, month - 1, day, 0, 0, 0);
return c.getTime();
}
 
// return null is no error
public String getError() {
return this.error;
}
 
public void importTo(SQLElementDirectory directory, DBRoot rootSociete, User user) throws SQLException {
final Exercice e = new Exercice();
e.insert(directory, rootSociete, user, new ArrayList<Piece>(this.mapPiece.values()));
}
 
public static void main(String[] args) throws IOException {
final ImportFEC i = new ImportFEC();
i.loadFrom(new File("Y:\\Projets\\OpenConcerto\\ExportCiel\\FEC20171231.txt"));
System.err.println("ImportFEC.main()" + i.getError());
}
 
public static final List<String> fastSplit(final String string, final char sep) {
final List<String> l = new ArrayList<>();
final int length = string.length();
final char[] cars = string.toCharArray();
int rfirst = 0;
 
for (int i = 0; i < length; i++) {
if (cars[i] == sep) {
l.add(new String(cars, rfirst, i - rfirst));
rfirst = i + 1;
}
}
if (rfirst <= length) {
// <= au lieu de < pour Ciel....
l.add(new String(cars, rfirst, length - rfirst));
}
return l;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/panel/compta/ExportFEC.java
42,10 → 42,10
 
public class ExportFEC extends AbstractExport {
 
private static final char ZONE_SEPARATOR = '\t';
private static final char RECORD_SEPARATOR = '\n';
public static final char ZONE_SEPARATOR = '\t';
public static final char RECORD_SEPARATOR = '\n';
private static final char REPLACEMENT = ' ';
static private final List<String> COLS = Arrays.asList("JournalCode", "JournalLib", "EcritureNum", "EcritureDate", "CompteNum", "CompteLib", "CompAuxNum", "CompAuxLib", "PieceRef", "PieceDate",
public static final List<String> COLS = Arrays.asList("JournalCode", "JournalLib", "EcritureNum", "EcritureDate", "CompteNum", "CompteLib", "CompAuxNum", "CompAuxLib", "PieceRef", "PieceDate",
"EcritureLib", "Debit", "Credit", "EcritureLet", "DateLet", "ValidDate", "Montantdevise", "Idevise");
 
private final DecimalFormat format = new DecimalFormat("##0.00", DecimalFormatSymbols.getInstance(Locale.FRANCE));
/trunk/OpenConcerto/src/org/openconcerto/erp/panel/compta/ExportPanel.java
87,6 → 87,12
return new ExportSageXimport(root);
}
},
SAGE_ETENDU("Sage Etendu") {
@Override
public AbstractExport createExport(DBRoot root) {
return new ExportSageEtendu(root);
}
},
CCMX("Cegid CCMX") {
@Override
public AbstractExport createExport(DBRoot root) {
/trunk/OpenConcerto/src/org/openconcerto/erp/panel/compta/ExportSageEtendu.java
New file
0,0 → 1,359
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.panel.compta;
 
import org.openconcerto.erp.core.finance.payment.element.ModeDeReglementSQLElement;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.utils.GestionDevise;
import org.openconcerto.utils.StringUtils;
import org.openconcerto.utils.cc.ITransformer;
 
import java.io.IOException;
import java.io.OutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Row;
 
public class ExportSageEtendu extends AbstractExport {
 
private List<SQLRowValues> data;
private Map<Integer, SQLRowValues> mapFacture = new HashMap<>();
private Map<Integer, SQLRowValues> mapAvoir = new HashMap<>();
 
public ExportSageEtendu(DBRoot rootSociete) {
super(rootSociete, "Sage Etendu", ".xls");
}
 
@Override
protected int fetchData(Date from, Date to, SQLRow selectedJournal, boolean onlyNew) {
 
final SQLTable tableEcriture = getEcritureT();
 
// Fetch facture
final SQLTable tableVF = tableEcriture.getTable("SAISIE_VENTE_FACTURE");
SQLRowValues rowValsVF = new SQLRowValues(tableVF);
rowValsVF.put("ID", null);
rowValsVF.put("DATE", null);
rowValsVF.put("NOM", null);
rowValsVF.put("NUMERO", null);
 
SQLRowValues rowValsMdr = rowValsVF.putRowValues("ID_MODE_REGLEMENT");
 
rowValsMdr.putNulls(rowValsMdr.getTable().getFieldsName());
rowValsMdr.putRowValues("ID_TYPE_REGLEMENT").putNulls("NOM");
 
if (tableVF.contains("ID_ABONNEMENT")) {
rowValsVF.putRowValues("ID_ABONNEMENT").putNulls("DATE_DEBUT_FACTURE", "DATE_FIN_FACTURE");
}
SQLRowValuesListFetcher fetcherVF = SQLRowValuesListFetcher.create(rowValsVF);
List<SQLRowValues> resultVF = fetcherVF.fetch(new Where(tableVF.getField("DATE"), from, to));
 
for (SQLRowValues sqlRowValues : resultVF) {
this.mapFacture.put(sqlRowValues.getID(), sqlRowValues);
}
 
// Fetch avoirs
final SQLTable tableAvoir = tableEcriture.getTable("AVOIR_CLIENT");
SQLRowValues rowValsAvoir = new SQLRowValues(tableAvoir);
rowValsAvoir.put("ID", null);
rowValsAvoir.put("DATE", null);
rowValsAvoir.put("NOM", null);
rowValsAvoir.put("NUMERO", null);
SQLRowValues rowValsMdrAvoir = rowValsAvoir.putRowValues("ID_MODE_REGLEMENT");
 
rowValsMdrAvoir.putNulls(rowValsMdrAvoir.getTable().getFieldsName());
rowValsMdrAvoir.putRowValues("ID_TYPE_REGLEMENT").putNulls("NOM");
 
SQLRowValuesListFetcher fetcherAvoir = SQLRowValuesListFetcher.create(rowValsAvoir);
List<SQLRowValues> resultAvoir = fetcherAvoir.fetch(new Where(tableAvoir.getField("DATE"), from, to));
 
for (SQLRowValues sqlRowValues : resultAvoir) {
this.mapAvoir.put(sqlRowValues.getID(), sqlRowValues);
}
 
final SQLTable tableCompte = tableEcriture.getForeignTable("ID_COMPTE_PCE");
 
SQLRowValues rowValsFetch = new SQLRowValues(tableEcriture);
rowValsFetch.putNulls("NOM", "DATE", "DEBIT", "CREDIT");
if (tableEcriture.contains("CODE_CLIENT")) {
rowValsFetch.put("CODE_CLIENT", null);
}
 
rowValsFetch.putRowValues("ID_MOUVEMENT").putNulls("NUMERO", "SOURCE", "IDSOURCE").putRowValues("ID_PIECE").put("NOM", null);
 
rowValsFetch.putRowValues("ID_COMPTE_PCE").putNulls("NUMERO", "NOM");
rowValsFetch.putRowValues("ID_JOURNAL").putNulls("CODE", "NOM");
 
SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(rowValsFetch);
fetcher.addSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
 
@Override
public SQLSelect transformChecked(SQLSelect input) {
input.setWhere(getWhere(from, to, selectedJournal, onlyNew));
input.addFieldOrder(input.getAlias(tableEcriture).getField("ID_MOUVEMENT"));
input.addFieldOrder(input.getAlias(tableCompte).getField("NUMERO"));
return input;
}
}, 0);
 
final List<SQLRowValues> l = fetcher.fetch();
this.data = l;
return l == null ? 0 : l.size();
}
 
@Override
protected void export(OutputStream bufOut) throws IOException {
final List<SQLRowValues> l = this.data;
final boolean containsCodeClient = getEcritureT().contains("CODE_CLIENT");
final int size = l.size();
 
HSSFWorkbook workBook = new HSSFWorkbook();
HSSFSheet sheet = workBook.createSheet("Ecritures");
Row rowEntete = sheet.createRow(0);
List<String> colName = Arrays.asList("Date d'écriture", "Code Journal", "Numéro de facture", "Référence", "Compte Général", "Compte Client", "Libellé de l'écriture", "Date d'échéance",
"Mode de règlement", "Montant débiteur", "Montant Créditeur", "Date de début d'abonnement", "Date de fin d'abonnement");
int colIndex = 0;
for (String string : colName) {
Cell cell = rowEntete.createCell(colIndex, CellType.STRING);
cell.setCellValue(string);
colIndex++;
}
 
CellStyle cellStyle = workBook.createCellStyle();
CreationHelper createHelper = workBook.getCreationHelper();
cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("m/d/yy"));
 
for (int i = 0; i < size; i++) {
 
Row row = sheet.createRow(i + 1);
 
final SQLRowValues rowLine = l.get(i);
 
// Date
final Date d = rowLine.getDate("DATE").getTime();
Cell cellDate = row.createCell(0);
cellDate.setCellStyle(cellStyle);
cellDate.setCellValue(d);
// Jrnl
SQLRowAccessor rowJrnl = rowLine.getForeign("ID_JOURNAL");
Cell cellJrnl = row.createCell(1);
cellJrnl.setCellValue(StringUtils.toAsciiString(rowJrnl.getString("CODE").trim()));
 
SQLRowAccessor rowValsSource = null;
SQLRowAccessor rowMvt = rowLine.getForeign("ID_MOUVEMENT");
if (rowMvt.getString("SOURCE").equals("AVOIR_CLIENT")) {
rowValsSource = this.mapAvoir.get(rowMvt.getInt("IDSOURCE"));
} else if (rowMvt.getString("SOURCE").equals("SAISIE_VENTE_FACTURE")) {
rowValsSource = this.mapFacture.get(rowMvt.getInt("IDSOURCE"));
}
 
// Numero Piece
Cell cellPiece = row.createCell(2);
if (rowValsSource != null) {
cellPiece.setCellValue(StringUtils.toAsciiString(rowValsSource.getString("NUMERO")));
}
 
// Ref vide
Cell cellRef = row.createCell(3);
cellRef.setCellValue("");
 
// N° Compte
final String cpt = rowLine.getForeign("ID_COMPTE_PCE").getString("NUMERO").trim();
Cell cellCpt = row.createCell(4, CellType.STRING);
cellCpt.setCellValue(getFormattedCompte(cpt));
 
Cell cellCodeClient = row.createCell(5);
if (containsCodeClient) {
// Code Client
String codeClient = "";
if (cpt.startsWith("41")) {
codeClient = rowLine.getString("CODE_CLIENT");
}
cellCodeClient.setCellValue(StringUtils.toAsciiString(codeClient));
}
 
// Libellé
Cell cellLib = row.createCell(6);
cellLib.setCellValue(StringUtils.toAsciiString(rowLine.getString("NOM").trim()));
 
Cell cellDateEch = row.createCell(7);
Cell cellTypeRegl = row.createCell(8);
if (rowValsSource != null && cpt.startsWith("41")) {
final SQLRowAccessor foreignMdr = rowValsSource.getForeign("ID_MODE_REGLEMENT");
Date ech = ModeDeReglementSQLElement.calculDate(foreignMdr, rowValsSource.getDate("DATE").getTime());
cellDateEch.setCellValue(ech);
cellDateEch.setCellStyle(cellStyle);
cellTypeRegl.setCellValue(foreignMdr.getForeign("ID_TYPE_REGLEMENT").getString("NOM"));
}
 
// Debit
Cell cellDebit = row.createCell(9);
final Long debit = rowLine.getLong("DEBIT");
cellDebit.setCellValue(debit / 100.0D);
// Credit
final Long credit = rowLine.getLong("CREDIT");
Cell cellCredit = row.createCell(10);
cellCredit.setCellValue(credit / 100.0D);
 
Cell cellDebAbo = row.createCell(11);
Cell cellFinAbo = row.createCell(12);
 
if (rowValsSource != null && rowValsSource.contains("ID_ABONNEMENT") && rowValsSource.getTable().getName().equals("ID_SAISIE_VENTE_FACTURE") && cpt.startsWith("41")) {
SQLRowAccessor rowValsAbo = rowValsSource.getForeign("ID_ABONNEMENT");
if (rowValsAbo != null && !rowValsAbo.isUndefined()) {
final Calendar calDeb = rowValsAbo.getDate("DATE_DEBUT_FACTURE");
if (calDeb != null) {
cellDebAbo.setCellValue(calDeb.getTime());
cellDebAbo.setCellStyle(cellStyle);
}
 
final Calendar calFin = rowValsAbo.getDate("DATE_FIN_FACTURE");
if (calFin != null) {
cellFinAbo.setCellValue(calFin.getTime());
cellFinAbo.setCellStyle(cellStyle);
}
}
}
 
}
workBook.write(bufOut);
workBook.close();
}
 
private void exportTAB(OutputStream bufOut) throws IOException {
final List<SQLRowValues> l = this.data;
final boolean containsCodeClient = getEcritureT().contains("CODE_CLIENT");
final DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
final int size = l.size();
for (int i = 0; i < size; i++) {
 
// Ligne à insérer dans le fichier
final StringBuilder line = new StringBuilder();
 
final SQLRowValues rowLine = l.get(i);
 
// Date
final Date d = rowLine.getDate("DATE").getTime();
line.append(dateFormat.format(d));
line.append('\t');
// Jrnl
SQLRowAccessor rowJrnl = rowLine.getForeign("ID_JOURNAL");
line.append(StringUtils.toAsciiString(rowJrnl.getString("CODE").trim()));
line.append('\t');
 
SQLRowAccessor rowValsSource = null;
SQLRowAccessor rowMvt = rowLine.getForeign("ID_MOUVEMENT");
if (rowMvt.getString("SOURCE").equals("AVOIR_CLIENT")) {
rowValsSource = this.mapAvoir.get(rowMvt.getInt("IDSOURCE"));
} else if (rowMvt.getString("SOURCE").equals("SAISIE_VENTE_FACTURE")) {
rowValsSource = this.mapFacture.get(rowMvt.getInt("IDSOURCE"));
}
 
// Numero Piece
if (rowValsSource != null) {
line.append(StringUtils.toAsciiString(rowValsSource.getString("NUMERO")));
}
line.append('\t');
 
// Référence
// if (rowValsSource != null) {
// line.append(StringUtils.toAsciiString(rowValsSource.getString("NOM")));
// }
line.append('\t');
 
// N° Compte
final String cpt = rowLine.getForeign("ID_COMPTE_PCE").getString("NUMERO").trim();
line.append(getFormattedCompte(cpt));
line.append('\t');
 
if (containsCodeClient) {
// Code Client
String codeClient = "";
if (cpt.startsWith("41")) {
codeClient = rowLine.getString("CODE_CLIENT");
}
line.append(StringUtils.toAsciiString(codeClient));
line.append('\t');
}
 
// Libellé
line.append(StringUtils.toAsciiString(rowLine.getString("NOM").trim()));
line.append('\t');
 
if (rowValsSource != null && cpt.startsWith("41")) {
final SQLRowAccessor foreignMdr = rowValsSource.getForeign("ID_MODE_REGLEMENT");
Date ech = ModeDeReglementSQLElement.calculDate(foreignMdr, rowValsSource.getDate("DATE").getTime());
line.append(dateFormat.format(ech));
line.append('\t');
line.append(foreignMdr.getForeign("ID_TYPE_REGLEMENT").getString("NOM"));
line.append('\t');
} else {
line.append('\t');
line.append('\t');
}
 
// Debit
final Long debit = rowLine.getLong("DEBIT");
line.append(GestionDevise.currencyToString(debit.longValue(), false));
line.append('\t');
// Credit
final Long credit = rowLine.getLong("CREDIT");
line.append(GestionDevise.currencyToString(credit.longValue(), false));
line.append('\t');
 
if (rowValsSource != null && rowValsSource.contains("ID_ABONNEMENT") && rowValsSource.getTable().getName().equals("ID_SAISIE_VENTE_FACTURE") && cpt.startsWith("41")) {
SQLRowAccessor rowValsAbo = rowValsSource.getForeign("ID_ABONNEMENT");
if (rowValsAbo != null && !rowValsAbo.isUndefined()) {
final Calendar calDeb = rowValsAbo.getDate("DATE_DEBUT_FACTURE");
if (calDeb != null) {
line.append(dateFormat.format(calDeb.getTime()));
}
line.append('\t');
final Calendar calFin = rowValsAbo.getDate("DATE_FIN_FACTURE");
if (calFin != null) {
line.append(dateFormat.format(calFin.getTime()));
}
line.append('\t');
}
} else {
line.append('\t');
line.append('\t');
}
 
line.append('\r');
line.append('\n');
bufOut.write(line.toString().getBytes(StringUtils.Cp1252));
}
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/model/MouseSheetXmlListeListener.java
14,6 → 14,8
package org.openconcerto.erp.model;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.customerrelationship.mail.EmailTemplate;
import org.openconcerto.erp.core.customerrelationship.mail.ValueListener;
import org.openconcerto.erp.generationDoc.AbstractSheetXml;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLBase;
27,6 → 29,7
import org.openconcerto.ui.EmailComposer;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.ListMap;
import org.openconcerto.utils.i18n.TranslationManager;
 
import java.awt.event.ActionEvent;
import java.io.File;
112,13 → 115,13
this.showHeader = showHeader;
}
 
protected void sendMail(final AbstractSheetXml sheet, final boolean readOnly) {
protected void sendMail(EmailTemplate template, final AbstractSheetXml sheet, final boolean readOnly) {
List<AbstractSheetXml> l = new ArrayList<>(1);
l.add(sheet);
sendMail(l, readOnly);
sendMail(template, l, readOnly);
}
 
protected void sendMail(final List<AbstractSheetXml> sheets, final boolean readOnly) {
protected void sendMail(EmailTemplate template, final List<AbstractSheetXml> sheets, final boolean readOnly) {
final Thread t = new Thread() {
@Override
public void run() {
231,6 → 234,10
public void run() {
try {
String subject = sheets.get(0).getReference();
if (template != null) {
subject = template.getTitle() + " " + sheets.get(0).getReference().trim();
}
subject = subject.trim();
if (subject.isEmpty()) {
final StringJoiner joiner = new StringJoiner(", ");
for (File f : files) {
238,7 → 245,14
}
subject = joiner.toString();
}
final String message = getMailObject(sheets.get(0).getSQLRow());
String message = getMailObject(sheets.get(0).getSQLRow());
if (template != null) {
if (template.getText().contains("{message}")) {
message = template.getText().replace("{message}", message);
} else {
message += template.getText();
}
}
EmailComposer.getInstance().compose(mailDest, subject, message, files.toArray(new File[files.size()]));
} catch (Exception e) {
ExceptionHandler.handle("Impossible d'envoyer le courriel!", e);
286,11 → 300,27
 
}
} else {
// ODS Viewer
if (this.previewIsVisible) {
l.add(new RowAction(new AbstractAction() {
public void actionPerformed(ActionEvent ev) {
try {
createAbstractSheet(IListe.get(ev).fetchSelectedRow()).showPreviewDocument();
final AbstractSheetXml sheet = createAbstractSheet(IListe.get(ev).fetchSelectedRow());
final SQLTable table = IListe.get(ev).getSource().getPrimaryTable();
sheet.showPreviewDocument(TranslationManager.getInstance().getTranslationForAction("email"), new Runnable() {
 
@Override
public void run() {
EmailTemplate.askTemplate(IListe.get(ev), table.getDBRoot(), new ValueListener() {
 
@Override
public void valueSelected(Object value) {
sendMail((EmailTemplate) value, sheet, true);
}
});
 
}
});
} catch (Exception e) {
ExceptionHandler.handle("Impossible d'ouvrir le fichier", e);
}
388,14 → 418,8
public RowAction getSendMail() {
return new RowAction(new AbstractAction() {
public void actionPerformed(ActionEvent ev) {
final List<SQLRowValues> selectedRows = IListe.get(ev).getSelectedRows();
final SQLTable table = IListe.get(ev).getSource().getPrimaryTable();
final List<SQLRow> rows = new ArrayList<SQLRow>();
for (SQLRowValues r : selectedRows) {
rows.add(table.getRow(r.getID()));
sendMail(ev, false);
}
sendMail(createAbstractSheets(rows), false);
}
}, false, "document.send.email") {
 
@Override
411,18 → 435,8
public RowAction getSendMailPDF() {
return new RowAction(new AbstractAction() {
public void actionPerformed(ActionEvent ev) {
try {
final List<SQLRowValues> selectedRows = IListe.get(ev).getSelectedRows();
final SQLTable table = IListe.get(ev).getSource().getPrimaryTable();
final List<SQLRow> rows = new ArrayList<SQLRow>();
for (SQLRowValues r : selectedRows) {
rows.add(table.getRow(r.getID()));
sendMail(ev, true);
}
sendMail(createAbstractSheets(rows), true);
} catch (Exception e) {
ExceptionHandler.handle("Impossible d'envoyer le(s) fichier(s)", e);
}
}
}, false, "document.pdf.send.email") {
 
@Override
496,4 → 510,21
}
};
}
 
private void sendMail(ActionEvent ev, boolean pdf) {
final List<SQLRowValues> selectedRows = IListe.get(ev).getSelectedRows();
final SQLTable table = IListe.get(ev).getSource().getPrimaryTable();
final List<SQLRow> rows = new ArrayList<>();
for (SQLRowValues r : selectedRows) {
rows.add(table.getRow(r.getID()));
}
 
EmailTemplate.askTemplate(IListe.get(ev), table.getDBRoot(), new ValueListener() {
 
@Override
public void valueSelected(Object value) {
sendMail((EmailTemplate) value, createAbstractSheets(rows), pdf);
}
});
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/importer/DataImporter.java
13,17 → 13,15
package org.openconcerto.erp.importer;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.openoffice.spreadsheet.Sheet;
import org.openconcerto.openoffice.spreadsheet.SpreadSheet;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLRowValuesCluster.StoreMode;
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.utils.ooxml.XLSXDocument;
import org.openconcerto.utils.ooxml.XLSXSheet;
import org.openconcerto.utils.text.CSVReader;
import org.openconcerto.utils.text.CSVWriter;
import org.openconcerto.utils.text.CharsetHelper;
51,6 → 49,7
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.formula.eval.NotImplementedException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
59,13 → 58,13
public class DataImporter {
private boolean skipFirstLine = true;
private SQLTable table;
private final Map<Integer, ValueConverter> map = new HashMap<Integer, ValueConverter>();
private final Map<SQLField, List<Integer>> fieldMap = new HashMap<SQLField, List<Integer>>();
private final Map<Integer, Constraint> constraints = new HashMap<Integer, Constraint>();
private List<SQLField> uniqueField = new ArrayList<SQLField>();
private List<SQLRowValues> valuesToUpdate = new ArrayList<SQLRowValues>();
private List<SQLRowValues> valuesToInsert = new ArrayList<SQLRowValues>();
private Map<ValueConverter, SQLField> foreignMap = new HashMap<ValueConverter, SQLField>();
private final Map<Integer, ValueConverter> map = new HashMap<>();
private final Map<SQLField, List<Integer>> fieldMap = new HashMap<>();
private final Map<Integer, Constraint> constraints = new HashMap<>();
private List<SQLField> uniqueField = new ArrayList<>();
private List<SQLRowValues> valuesToUpdate = new ArrayList<>();
private List<SQLRowValues> valuesToInsert = new ArrayList<>();
private Map<ValueConverter, SQLField> foreignMap = new HashMap<>();
 
public DataImporter() {
}
78,43 → 77,6
this.table = table;
}
 
public static void main(String[] args) throws Exception {
System.setProperty(SQLBase.STRUCTURE_USE_XML, "true");
final ComptaPropsConfiguration conf = ComptaPropsConfiguration.create();
Configuration.setInstance(conf);
try {
conf.getBase();
} catch (Exception e) {
e.printStackTrace();
}
 
final ComptaPropsConfiguration comptaPropsConfiguration = ((ComptaPropsConfiguration) Configuration.getInstance());
comptaPropsConfiguration.setUpSocieteDataBaseConnexion(39);
UserManager.getInstance().setCurrentUser(2);
 
SQLTable table = Configuration.getInstance().getRoot().findTable("ARTICLE");
DataImporter importer = new DataImporter(table);
importer.skipFirstLine = false;
importer.map(0, table.getField("CODE"));
importer.map(8, table.getField("ID_FOURNISSEUR"));
importer.map(4, table.getField("NOM"));
importer.addContraint(0, new NotEmptyConstraint());
importer.addUniqueField(table.getField("CODE"));
// ArrayTableModel m = importer.createModelFromODS(new File("c:/products-en.ods"));
// ArrayTableModel m = importer.createModelFromCSV(new File("c:/products-en.csv"));
// ArrayTableModel m = importer.createModelFromCSV(new File("c:/products-en.scsv.csv"));
ArrayTableModel m = importer.createModelFromXLS(new File("c:/products-en.xls"), 0);
m.dump(0, 4);
m = importer.createConvertedModel(m);
System.out.println("Dump");
m.dump(0, 4);
importer.importFromModel(m);
System.out.println(importer.getValuesToInsert().size() + " rows to insert");
System.out.println(importer.getValuesToUpdate().size() + " rows to update");
// importer.commit();
 
}
 
public void commit() throws SQLException {
for (SQLRowValues row : this.valuesToInsert) {
row.getGraph().store(StoreMode.INSERT, false);
126,11 → 88,11
}
 
public List<SQLRowValues> getValuesToInsert() {
return valuesToInsert;
return this.valuesToInsert;
}
 
public List<SQLRowValues> getValuesToUpdate() {
return valuesToUpdate;
return this.valuesToUpdate;
}
 
public void addUniqueField(SQLField field) {
142,7 → 104,7
}
 
public void addContraint(int columnIndex, Constraint c) {
constraints.put(Integer.valueOf(columnIndex), c);
this.constraints.put(Integer.valueOf(columnIndex), c);
}
 
public void map(int columnIndex, SQLField field) {
156,17 → 118,17
public void map(int columnIndex, SQLField field, SQLField foreignField) {
final ValueConverter converter = new ValueConverter(foreignField);
map(columnIndex, foreignField, converter);
foreignMap.put(converter, field);
this.foreignMap.put(converter, field);
 
}
 
public void map(int columnIndex, SQLField field, ValueConverter converter) {
final Integer value = Integer.valueOf(columnIndex);
map.put(value, converter);
List<Integer> l = fieldMap.get(field);
this.map.put(value, converter);
List<Integer> l = this.fieldMap.get(field);
if (l == null) {
l = new ArrayList<Integer>();
fieldMap.put(field, l);
l = new ArrayList<>();
this.fieldMap.put(field, l);
} else if (!field.getType().getJavaType().equals(String.class)) {
throw new IllegalArgumentException("Mapping multiple column is only supoprted for String values");
}
195,12 → 157,12
}
}
int start = 0;
if (skipFirstLine) {
if (this.skipFirstLine) {
start = 1;
}
final List<List<Object>> rows = new ArrayList<List<Object>>(rowCount - start);
final List<List<Object>> rows = new ArrayList<>(rowCount - start);
for (int i = start; i < rowCount; i++) {
List<Object> row = new ArrayList<Object>();
List<Object> row = new ArrayList<>();
for (int j = 0; j < columnCount; j++) {
row.add(sheet.getValueAt(j, i));
}
210,16 → 172,45
return new ArrayTableModel(rows);
}
 
public ArrayTableModel createModelFromXLSXGM(File xlsFile, int sheetNumber) throws IOException {
XLSXDocument doc = XLSXDocument.createFromFile(xlsFile);
XLSXSheet sheet = doc.getSheet(sheetNumber);
final int rowCount = sheet.getRowCount();
final int columnCount = sheet.getColumnCount();
 
int start = 0;
if (this.skipFirstLine) {
start = 1;
}
final List<List<Object>> selectedRows = new ArrayList<>(rowCount - start);
for (int i = start; i < rowCount; i++) {
List<Object> row = new ArrayList<>();
for (int j = 0; j < columnCount; j++) {
row.add(sheet.getValueAt(j, i));
}
selectedRows.add(row);
}
 
return new ArrayTableModel(selectedRows);
 
}
 
public ArrayTableModel createModelFromXLS(File xlsFile, int sheetNumber) throws IOException {
final InputStream inputStream = new FileInputStream(xlsFile);
final POIFSFileSystem fileSystem = new POIFSFileSystem(new BufferedInputStream(inputStream));
final HSSFWorkbook workBook = new HSSFWorkbook(fileSystem);
final HSSFSheet sheet = workBook.getSheetAt(sheetNumber);
Iterator<Row> rowsIterator = sheet.rowIterator();
final List<List<Object>> rows = createFromExcel(workBook.getCreationHelper().createFormulaEvaluator(), sheet.rowIterator(), sheet.rowIterator());
workBook.close();
return new ArrayTableModel(rows);
 
}
 
private List<List<Object>> createFromExcel(FormulaEvaluator evaluator, Iterator<Row> rowsIterator1, Iterator<Row> rowsIterator2) {
int columnCount = 0;
int rowCount = 0;
while (rowsIterator.hasNext()) {
Row row = rowsIterator.next();
while (rowsIterator1.hasNext()) {
Row row = rowsIterator1.next();
int i = row.getPhysicalNumberOfCells();
if (i > columnCount) {
columnCount = i;
227,18 → 218,16
rowCount++;
}
// Extract data
rowsIterator = sheet.rowIterator();
int start = 0;
if (skipFirstLine) {
if (this.skipFirstLine) {
start = 1;
rowsIterator.next();
rowsIterator2.next();
}
final List<List<Object>> rows = new ArrayList<List<Object>>(rowCount - start);
FormulaEvaluator evaluator = workBook.getCreationHelper().createFormulaEvaluator();
final List<List<Object>> rows = new ArrayList<>(rowCount - start);
 
while (rowsIterator.hasNext()) {
final Row row = rowsIterator.next();
final List<Object> rowData = new ArrayList<Object>();
while (rowsIterator2.hasNext()) {
final Row row = rowsIterator2.next();
final List<Object> rowData = new ArrayList<>();
for (int i = 0; i < columnCount; i++) {
final Cell cell = row.getCell(i);
 
245,30 → 234,33
if (cell == null) {
rowData.add("");
} else {
CellValue cellValue = evaluator.evaluate(cell);
CellValue cellValue = null;
try {
cellValue = evaluator.evaluate(cell);
} catch (NotImplementedException exception) {
exception.printStackTrace();
}
if (cellValue == null) {
rowData.add("");
} else {
switch (cellValue.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
switch (cellValue.getCellTypeEnum()) {
case BOOLEAN:
rowData.add(Boolean.valueOf(cellValue.getBooleanValue()));
break;
case Cell.CELL_TYPE_NUMERIC:
 
case NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
System.out.println("Row No.: " + row.getRowNum() + " " + cell.getDateCellValue());
rowData.add(cell.getDateCellValue());
} else {
rowData.add(Double.valueOf(cellValue.getNumberValue()));
}
break;
case Cell.CELL_TYPE_STRING:
case STRING:
rowData.add(cellValue.getStringValue());
break;
case Cell.CELL_TYPE_FORMULA:
case FORMULA:
rowData.add(cell.getCellFormula());
break;
case Cell.CELL_TYPE_BLANK:
case BLANK:
rowData.add("");
break;
default:
283,9 → 275,7
rows.add(rowData);
 
}
inputStream.close();
return new ArrayTableModel(rows);
 
return rows;
}
 
public ArrayTableModel createModelFromCSV(File csvFile) throws IOException {
319,12 → 309,12
final int columnCount = lines.get(0).length;
 
int start = 0;
if (skipFirstLine) {
if (this.skipFirstLine) {
start = 1;
}
final List<List<Object>> rows = new ArrayList<List<Object>>(rowCount - start);
final List<List<Object>> rows = new ArrayList<>(rowCount - start);
for (int i = start; i < rowCount; i++) {
List<Object> row = new ArrayList<Object>();
List<Object> row = new ArrayList<>();
String[] values = lines.get(i);
for (int j = 0; j < columnCount; j++) {
row.add(values[j]);
347,23 → 337,23
 
public ArrayTableModel createConvertedModel(ArrayTableModel model) {
final int rowCount = model.getRowCount();
final ArrayList<Integer> colsUsed = new ArrayList<Integer>(map.keySet());
colsUsed.addAll(constraints.keySet());
final ArrayList<Integer> colsUsed = new ArrayList<>(this.map.keySet());
colsUsed.addAll(this.constraints.keySet());
 
final int columnCount = 1 + Collections.max(colsUsed);
 
final List<List<Object>> rows = new ArrayList<List<Object>>(rowCount);
final List<List<Object>> rows = new ArrayList<>(rowCount);
 
for (int i = 0; i < rowCount; i++) {
boolean validRow = true;
final List<Object> row = new ArrayList<Object>();
final List<Object> row = new ArrayList<>();
for (int j = 0; j < columnCount; j++) {
Object value = model.getValueAt(i, j);
ValueConverter converter = map.get(j);
ValueConverter converter = this.map.get(j);
if (converter != null) {
value = converter.convertFrom(value);
}
final Constraint constraint = constraints.get(j);
final Constraint constraint = this.constraints.get(j);
// Verification de la validité de la valeur à importer
if (constraint != null && !constraint.isValid(value)) {
validRow = false;
380,19 → 370,19
}
 
protected void customizeRowValuesToFetch(SQLRowValues vals) {
 
// Nothing
}
 
public void importFromModel(ArrayTableModel model) throws IOException {
final int rowCount = model.getRowCount();
// Load existing data for duplication check
final SQLRowValues vals = new SQLRowValues(table);
final SQLRowValues vals = new SQLRowValues(this.table);
 
for (SQLField field : this.fieldMap.keySet()) {
if (field.getTable().equals(table)) {
if (field.getTable().equals(this.table)) {
vals.put(field.getName(), null);
} else {
final Set<SQLField> foreignKeys = table.getForeignKeys(field.getTable());
final Set<SQLField> foreignKeys = this.table.getForeignKeys(field.getTable());
for (SQLField sqlField : foreignKeys) {
vals.put(sqlField.getName(), null);
}
399,17 → 389,15
}
}
customizeRowValuesToFetch(vals);
System.out.println("Fetching values");
SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(vals);
List<SQLRowValues> existingRows = fetcher.fetch();
System.out.println("Computing cache");
final int existingRowsCount = existingRows.size();
final ValueConverter[] converters = map.values().toArray(new ValueConverter[map.size()]);
final ValueConverter[] converters = this.map.values().toArray(new ValueConverter[this.map.size()]);
 
// Une map <Object(valeur),SQLRowValues> pour chaque champs unique
Map<SQLField, Map<Object, SQLRowValues>> cache = new HashMap<SQLField, Map<Object, SQLRowValues>>();
Map<SQLField, Map<Object, SQLRowValues>> cache = new HashMap<>();
for (SQLField field : this.uniqueField) {
Map<Object, SQLRowValues> m = new HashMap<Object, SQLRowValues>();
Map<Object, SQLRowValues> m = new HashMap<>();
cache.put(field, m);
final String fieldName = field.getName();
for (int j = 0; j < existingRowsCount; j++) {
424,7 → 412,7
// Recherche d'existant
SQLRowValues existingRow = null;
for (SQLField field : this.uniqueField) {
List<Integer> cols = fieldMap.get(field);
List<Integer> cols = this.fieldMap.get(field);
Object objectToInsert = null;
for (Integer col : cols) {
Object v = model.getValueAt(i, col);
449,7 → 437,7
 
private void updateOrInsert(ArrayTableModel model, final ValueConverter[] converters, int i, SQLRowValues existingRow) {
 
final Map<String, Object> newValues = new HashMap<String, Object>();
final Map<String, Object> newValues = new HashMap<>();
if (existingRow != null) {
// Préremplissage de la map avec la row existante
newValues.putAll(existingRow.getAbsolutelyAll());
457,7 → 445,7
for (int j = 0; j < converters.length; j++) {
ValueConverter valueConverter = converters[j];
 
List<Integer> cols = fieldMap.get(valueConverter.getField());
List<Integer> cols = this.fieldMap.get(valueConverter.getField());
Object objectToInsert = null;
for (Integer col : cols) {
Object v = model.getValueAt(i, col);
471,11 → 459,11
 
final String fieldName = valueConverter.getFieldName();
if (objectToInsert != null || !valueConverter.isIgnoringEmptyValue()) {
if (valueConverter.getField().getTable().equals(table)) {
if (valueConverter.getField().getTable().equals(this.table)) {
newValues.put(fieldName, objectToInsert);
} else {
 
final SQLField sqlField = foreignMap.get(valueConverter);
final SQLField sqlField = this.foreignMap.get(valueConverter);
 
final Object value = newValues.get(sqlField.getName());
if (value == null || value instanceof SQLRowValues) {
490,26 → 478,21
}
}
}
final SQLRowValues rowVals = new SQLRowValues(table, newValues);
final SQLRowValues rowVals = new SQLRowValues(this.table, newValues);
patchRowValues(rowVals, model.getLineValuesAt(i), existingRow);
if (existingRow == null) {
this.valuesToInsert.add(rowVals);
}
// else if (!newValues.equals(existingRow.getAbsolutelyAll())) {
else {
} else {
this.valuesToUpdate.add(rowVals);
// for (SQLRowValues ref : rowVals.getReferentRows()) {
// this.valuesToUpdate.add(ref);
// }
}
}
 
public void doAfterImport() throws SQLException {
 
// Nothing
}
 
protected void patchRowValues(SQLRowValues rowVals, List<Object> lineValues, SQLRowValues existingRow) {
 
// Nothing
}
 
public void setSkipFirstLine(boolean skipFirstLine) {
531,8 → 514,10
return createModelFromCSV(file);
} else if (name.endsWith(".xls")) {
return createModelFromXLS(file, sheetNumber);
} else if (name.endsWith(".xlsx") || name.endsWith(".xlsm")) {
return createModelFromXLSXGM(file, sheetNumber);
}
throw new IllegalArgumentException("File format not supported. Please provide an ods, csv or xls file.");
throw new IllegalArgumentException("File format not supported. Please provide an ods, csv, xls or xlsx file.");
 
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/preferences/MailRelancePreferencePanel.java
File deleted
/trunk/OpenConcerto/src/org/openconcerto/erp/preferences/TemplateNXProps.java
17,7 → 17,6
import org.openconcerto.erp.core.customerrelationship.customer.report.FicheClientXmlSheet;
import org.openconcerto.erp.core.edm.AttachmentSQLElement;
import org.openconcerto.erp.core.finance.accounting.report.BalanceSheet;
import org.openconcerto.erp.core.finance.accounting.report.GrandLivreSheet;
import org.openconcerto.erp.core.finance.accounting.report.GrandLivreSheetXML;
import org.openconcerto.erp.core.finance.accounting.report.JournauxSheetXML;
import org.openconcerto.erp.core.humanresources.payroll.report.EtatChargesPayeSheet;
/trunk/OpenConcerto/src/org/openconcerto/erp/preferences/GestionCommercialeGlobalPreferencePanel.java
29,11 → 29,13
 
public class GestionCommercialeGlobalPreferencePanel extends JavaPrefPreferencePanel {
public static String TRANSFERT_REF = "TransfertRef";
public static String COMMANDE_FOURNISSEUR_EN_COURS = "CommandeFournisseurEncours";
public static String TRANSFERT_MULTI_REF = "TransfertMultiRef";
public static String TRANSFERT_NO_REF = "TransfertNoRef";
public static String ACOMPTE_DEVIS = "AcompteDevis";
public static String ORDER_PACKAGING_MANAGEMENT = "OrderPackagingManagement";
public static String ADDRESS_SPEC = "AddressSpec";
public static String CATEGORIE_COMPTABLE_SPEC = "CategorieComptableSpec";
public static String GESTION_TIMBRE_FISCAL = "GestionTimbreFiscal";
public static String TAUX_TIMBRE_FISCAL = "TauxTimbreFiscal";
public static String BARCODE_INSERTION = "BarcodeInsertion";
69,6 → 71,10
orderQuoting.setDefaultValue(Boolean.FALSE);
this.addView(orderQuoting);
 
PrefView<Boolean> cmdEnCours = new PrefView<Boolean>(PrefType.BOOLEAN_TYPE, "Activer la gestion des commandes fournisseurs en cours", COMMANDE_FOURNISSEUR_EN_COURS);
cmdEnCours.setDefaultValue(Boolean.FALSE);
this.addView(cmdEnCours);
 
PrefView<Boolean> viewAcompteDevis = new PrefView<Boolean>(PrefType.BOOLEAN_TYPE, "Gérer les acomptes sur devis", ACOMPTE_DEVIS);
viewAcompteDevis.setDefaultValue(Boolean.FALSE);
this.addView(viewAcompteDevis);
77,6 → 83,10
addressSpec.setDefaultValue(Boolean.TRUE);
this.addView(addressSpec);
 
PrefView<Boolean> catComptableSpec = new PrefView<Boolean>(PrefType.BOOLEAN_TYPE, "Afficher les sélecteurs de catégorie comptable spécifique", CATEGORIE_COMPTABLE_SPEC);
catComptableSpec.setDefaultValue(Boolean.FALSE);
this.addView(catComptableSpec);
 
PrefView<Boolean> gestTimbreFisc = new PrefView<Boolean>(PrefType.BOOLEAN_TYPE, "Activer la gestion du timbre fiscal", GESTION_TIMBRE_FISCAL);
gestTimbreFisc.setDefaultValue(Boolean.FALSE);
this.addView(gestTimbreFisc);
/trunk/OpenConcerto/src/org/openconcerto/erp/config/InstallationPanel.java
49,6 → 49,7
import org.openconcerto.sql.request.Inserter.Insertion;
import org.openconcerto.sql.request.UpdateBuilder;
import org.openconcerto.sql.sqlobject.SQLTextCombo;
import org.openconcerto.sql.users.rights.TableAllRights;
import org.openconcerto.sql.utils.AlterTable;
import org.openconcerto.sql.utils.ChangeTable;
import org.openconcerto.sql.utils.ChangeTable.ClauseType;
63,6 → 64,7
import org.openconcerto.utils.CollectionUtils;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.ProductInfo;
import org.openconcerto.utils.StringUtils;
import org.openconcerto.utils.cc.ITransformer;
 
import java.awt.GridBagConstraints;
2387,18 → 2389,24
}
root.getTable("ARTICLE").getSchema().updateVersion();
// Valeur par défaut des numérotations
SQLRowValues rNumerotation = root.getTable("NUMEROTATION_AUTO").getRow(2).asRowValues();
if (root.contains("NUMEROTATION_AUTO")) {
SQLRow rowNumerotation = root.getTable("NUMEROTATION_AUTO").getRow(2);
if (rowNumerotation != null) {
SQLRowValues rNumerotation = rowNumerotation.asRowValues();
boolean numerotationFixed = false;
if (rNumerotation.getString("AVOIR_F_FORMAT").trim().isEmpty()) {
if (StringUtils.isEmpty(rNumerotation.getString("AVOIR_F_FORMAT"), true)) {
rNumerotation.put("AVOIR_F_FORMAT", "'AVOIR'yyMM-000");
numerotationFixed = true;
}
if (rNumerotation.getString("CLIENT_FORMAT").trim().isEmpty()) {
if (StringUtils.isEmpty(rNumerotation.getString("CLIENT_FORMAT"), true)) {
rNumerotation.put("CLIENT_FORMAT", "'CLI'00000");
numerotationFixed = true;
}
if (numerotationFixed) {
rNumerotation.commit();
}
 
}
}
//
 
final SQLTable tableCalendarItem = root.getTable("CALENDAR_ITEM");
3835,8 → 3843,34
rowValsUserRight.commit();
}
 
if (!codes.contains(TableAllRights.USER_UI_LOCK_ROW)) {
SQLRowValues rowVals = new SQLRowValues(table);
rowVals.put("CODE", TableAllRights.USER_UI_LOCK_ROW);
rowVals.put("NOM", "Autoriser à verrouiller une ligne dans une liste.");
String desc = "Autorise un utilisateur à verrouiller une ou plusieurs dans les listes où cette fonctionnalité est active.";
rowVals.put("DESCRIPTION", desc);
SQLRow row = rowVals.commit();
SQLRowValues rowValsUserRight = new SQLRowValues(table.getTable("USER_RIGHT"));
rowValsUserRight.put("ID_RIGHT", row.getID());
rowValsUserRight.put("HAVE_RIGHT", Boolean.TRUE);
rowValsUserRight.commit();
}
 
if (!codes.contains(TableAllRights.USER_UI_UNLOCK_ROW)) {
SQLRowValues rowVals = new SQLRowValues(table);
rowVals.put("CODE", TableAllRights.USER_UI_UNLOCK_ROW);
rowVals.put("NOM", "Autoriser à déverrouiller une ligne dans une liste.");
String desc = "Autorise un utilisateur à déverrouiller une ou plusieurs dans les listes où cette fonctionnalité est active.";
rowVals.put("DESCRIPTION", desc);
SQLRow row = rowVals.commit();
SQLRowValues rowValsUserRight = new SQLRowValues(table.getTable("USER_RIGHT"));
rowValsUserRight.put("ID_RIGHT", row.getID());
rowValsUserRight.put("HAVE_RIGHT", Boolean.TRUE);
rowValsUserRight.commit();
}
 
}
 
private void findBadForeignKey(DBRoot root) {
Set<SQLTable> tables = root.getTables();
for (SQLTable table : tables) {
3975,8 → 4009,17
 
// FK
new AddFK(root.getDBSystemRoot()).changeAll(root);
 
// Couleur
final SQLTable tableUser = root.getTable("USER_COMMON");
if (!tableUser.contains("COLOR")) {
final AlterTable alter = new AlterTable(tableUser);
alter.addIntegerColumn("COLOR", 0, false);
Updater_1_5.exec(alter);
}
 
}
 
protected void fixCompletion(DBRoot root) throws SQLException {
final SQLTable completionT = root.getTable(SQLTextCombo.getTableName());
if (completionT != null && completionT.getPrimaryKeys().size() == 0) {
4027,6 → 4070,11
alter = true;
}
 
if (!table.getFieldsName().contains("ID_JOURNAL_VALEUR_ENCAISSEMENT")) {
t.addForeignColumn("ID_JOURNAL_VALEUR_ENCAISSEMENT", root.getTable("JOURNAL"));
alter = true;
}
 
if (!table.getFieldsName().contains("ID_COMPTE_PCE_PORT_NON_SOUMIS")) {
t.addForeignColumn("ID_COMPTE_PCE_PORT_NON_SOUMIS", root.getTable("COMPTE_PCE"));
alter = true;
4625,7 → 4673,6
 
// at the end to let Updater_1_5 change field types from varchar to text
fixUnboundedVarchar(root);
 
return null;
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/config/translation_fr.xml
179,7 → 179,8
<action id="sales.quote.create.customer.order" label="Transfert vers commande client" />
<action id="sales.quote.create.customer.delivery" label="Transfert vers bon de livraison" />
<action id="sales.quote.accept.create.customer.order" label="Marquer comme accepté et Transfert en commande client" />
<action id="sales.quote.accept.create.customer.order"
label="Marquer comme accepté et Transfert en commande client" />
<!-- Customer -->
<action id="customerrelationship.customer.label.print" label="Imprimer l'étiquette client" />
<action id="customerrelationship.customer.info.create" label="Créer la fiche client" />
220,6 → 221,7
<action id="supplychain.order.create.purchase" label="Transfert vers saisie achat" />
<action id="supplychain.order.valid" label="Marquer comme validée" />
<action id="supplychain.order.create.receipt" label="Transfert vers bon de réception" />
<action id="supplychain.invoice.clone" label="Créer à partir de" />
 
<!-- Customer order -->
<action id="sales.order.create.deliverynote" label="Transfert vers bon de livraison" />
247,9 → 249,9
<item id="customerrelationship.customer.identifier" label="Code" />
<item id="customerrelationship.customer.date" label="Date" />
<item id="customerrelationship.customer.customproduct" label="Réf. Art. Interne" />
<item id="customerrelationship.customer.customtarif" label="Remises client" />
 
 
 
<!-- Currency -->
<item id="currency.USD" label="Dollar américain" />
<item id="currency.EUR" label="Euro" />
290,7 → 292,7
<item id="autres.contributions.ligne" label="Autres contributions dues par l'employeur" />
<item id="csg.nonimp.ligne" label="CSG non imposable à l'impôt sur le revenu" />
<item id="csg.imp.ligne" label="CSG/CRDS imposable à l'impôt sur le revenu" />
<item id="allegement.cotisations.ligne" label="Exonération de cotisations employeur" />
<item id="allegement.cotisations.ligne" label="Allégement de cotisation" />
<item id="paye.simplifie.ignore" label="Ligne ignorée" />
 
<!-- Groupe Paye Simplifiée -->
305,6 → 307,6
<item id="cotisations.convention" label="COTISATIONS DE CONVENTION COLLECTIVE OU STATUAIRES" />
<item id="csg.nonimp" label="CSG/CRDS déductible de l'impôt sur le revenu" />
<item id="csg.imp" label="CSG/CRDS non déductible à l'impôt sur le revenu" />
<item id="allegement" label="Exonération de cotisations employeur" />
 
<item id="allegement" label="Allégement de cotisation" />
<action id="email" label="Email" />
</translation>
/trunk/OpenConcerto/src/org/openconcerto/erp/config/mappingCompta_fr.xml
1,5 → 1,11
<?xml version="1.0" encoding="UTF-8" ?>
<ROOT>
<element refid="sales.customer.product.qty.price" nameClass="masculine" name="tarif client">
<FIELD name="QUANTITE" label="Quantité" />
<FIELD name="ID_ARTICLE" label="Article" />
<FIELD name="ID_CLIENT" label="Client" />
<FIELD name="POURCENT_REMISE" label="% remise" />
</element>
<element refid="humanresources.payroll.advance" nameClass="masculine" name="acompte">
<FIELD name="ID_SALARIE" label="Salarié" />
<FIELD name="MONTANT" label="Montant" />
241,6 → 247,7
<element refid="sales.credit.note" nameClass="feminine" name="facture d'avoir" namePlural="factures d'avoir">
<FIELD name="ID_ADRESSE" label="Adresse fact. spéc." />
<FIELD name="ID_ADRESSE_LIVRAISON" label="Adresse livr. spéc." />
<FIELD name="ID_CATEGORIE_COMPTABLE" label="Cat. comptable spéc." />
<FIELD name="ID_CLIENT_DEPARTEMENT" label="Service" />
<FIELD name="ID_SECRETAIRE" label="Secrétaire" />
<FIELD name="ID_ECHEANCIER_CCI" label="Echeancier CCI" />
386,7 → 393,7
<FIELD name="DATE_NAISSANCE" label="Date de naissance" />
</element>
<element refid="bank" nameClass="feminine" name="banque">
<FIELD name="NOM" label="Nom" />
<FIELD name="NOM" label="Banque" />
<FIELD name="NUMERO_RUE" label="Numéro de rue" />
<FIELD name="VOIE" label="Voie" />
<FIELD name="RUE" label="Rue" />
473,6 → 480,7
<FIELD name="FRAIS_DOCUMENT_HT" label="Frais de document HT" />
<FIELD name="ID_ADRESSE" label="Adresse fact. spéc." />
<FIELD name="ID_ADRESSE_LIVRAISON" label="Adresse livr. spéc." />
<FIELD name="ID_CATEGORIE_COMPTABLE" label="Cat. comptable spéc." />
<FIELD name="ID_CLIENT_DEPARTEMENT" label="Service" />
<FIELD name="ID_CONTACT" label="Contact" />
<FIELD name="ID_TARIF" label="Tarif à appliquer" />
834,6 → 842,25
<FIELD name="FONCTION" label="Fonction" />
<FIELD name="N4DS" label="Contact pour la N4DS" />
</element>
<element refid="CONTACT_SALARIE" nameClass="masculine" name="contact salarié">
<FIELD name="PRENOM" label="Prénom du contact" />
<FIELD name="NOM" label="Nom du contact" />
<FIELD name="ID_TITRE_PERSONNEL" label="Titre" />
<FIELD name="TEL_DIRECT" label="Téléphone" />
<FIELD name="TEL_PERSONEL" label="Téléphone Personnel" />
<FIELD name="TEL_STANDARD" label="Téléphone du standard" />
<FIELD name="TEL_MOBILE" label="Portable" />
<FIELD name="EMAIL" label="Mail" />
<FIELD name="FAX" label="Fax" />
<FIELD name="FONCTION" label="Lien de parenté" />
<FIELD name="ID_SALARIE" label="Salarié" />
<FIELD name="NO_MAILING" label="Pas de mailing" />
<FIELD name="TYPE" label="Type" />
<FIELD name="SERVICE" label="Service" />
<FIELD name="PAYS" label="Pays" />
<FIELD name="ID_ADRESSE" label="Adresse" />
<FIELD name="DATE_NAISSANCE" label="Date de naissance" />
</element>
<element refid="humanresources.payroll.anticipation.contract" nameClass="masculine"
name="contrat de prévoyance, mutuelle, formation" namePlural="contrats de prévoyance, mutuelle, formation">
<FIELD name="REFERENCE" label="Référence du contrat de Prévoyance (S21.G00.15.001)" />
880,6 → 907,7
<element refid="humanresources.payroll.contract.employe" nameClass="masculine" name="contrat salarié"
namePlural="contrats salariés">
<FIELD name="NATURE" label="Nature de l'emploi (*)" titlelabel="Nature de l'emploi" />
<FIELD name="COMPLEMENT_PCS" label="Code complément PCS-ESE" />
<FIELD name="ID_CODE_EMPLOI" label="Catégorie socioprofessionnelle "
titlelabel="Code Catégorie socioprofessionnelle" />
<FIELD name="ID_CODE_CONTRAT_TRAVAIL" label="Contrat de travail" titlelabel="Code contrat" />
989,6 → 1017,7
<FIELD name="DATE_LIVRAISON_PREV" label="Livraison prévue le" />
<FIELD name="ID_ADRESSE" label="Adresse fact. spéc." />
<FIELD name="ID_ADRESSE_LIVRAISON" label="Adresse livr. spéc." />
<FIELD name="ID_CATEGORIE_COMPTABLE" label="Cat. comptable spéc." />
<FIELD name="ID_CLIENT_DEPARTEMENT" label="Service" />
<FIELD name="ACOMPTE_COMMANDE" label="Acompte" />
<FIELD name="ID_CONTACT" label="Contact" />
1276,6 → 1305,7
<FIELD name="ID_CLIENT_DEPARTEMENT" label="Service" />
<FIELD name="ID_ADRESSE" label="Adresse fact. spéc." />
<FIELD name="ID_ADRESSE_LIVRAISON" label="Adresse livr. spéc." />
<FIELD name="ID_CATEGORIE_COMPTABLE" label="Cat. comptable spéc." />
<FIELD name="CONTACT_MAIL_RAPPORT" label="Email dest. suppl." />
<FIELD name="SITE_DIFF" label="Site d'intervention différent du donneur d'ordre" />
<FIELD name="DESIGNATION_SITE" label="Désignation du site" />
1578,6 → 1608,7
</element>
<element refid="supplychain.order.invoice.purchase" nameClass="feminine" name="facture fournisseur"
namePlural="factures fournisseur">
<FIELD name="TVA_ADJUSTMENT" label="Ajustement de TVA" />
<FIELD name="ID_AVOIR_FOURNISSEUR" label="Avoir" />
<FIELD name="NET_A_PAYER" label="Net à payer" />
<FIELD name="ID_TAXE_PORT" label="Taxe sur port" />
1607,6 → 1638,7
</element>
<element refid="supplychain.orderinvoice.purchase.item" nameClass="masculine" name="élément de facture"
namePlural="éléments de facture">
<FIELD name="ID_COMPTE_PCE" label="Compte charge spécifique" />
<FIELD name="ID_DEPOT_STOCK" label="Dépôt Stock" />
<FIELD name="ID_ECO_CONTRIBUTION" label="Code Eco-Contrib." />
<FIELD name="ECO_CONTRIBUTION" label="Dont Eco-Contrib." />
1814,6 → 1846,7
<FIELD name="DATE_SORTIE" label="Date de sortie" />
<FIELD name="CODE_AT" label="Code AT" />
<FIELD name="CODE_SECTION_AT" label="Code section AT" />
<FIELD name="DUREE_FORFAIT" label="Durée du forfait" />
</element>
<element refid="finance.accounting.book" nameClass="masculine" name="journal">
<FIELD name="NOM" label="Journal" />
2217,6 → 2250,7
<FIELD name="TOTAL_TIMBRE_FISCAL" label="Total timbre" />
<FIELD name="ID_CLIENT_DEPARTEMENT" label="Service" />
<FIELD name="ID_ADRESSE_LIVRAISON" label="Adresse livr. spéc." />
<FIELD name="ID_CATEGORIE_COMPTABLE" label="Cat. comptable spéc." />
<FIELD name="ID_COMPTE_PCE_VENTE" label="Compte vente" />
<FIELD name="ID_ADRESSE" label="Adresse spécifique" />
<FIELD name="T_HA" label="Total achat" />
2269,6 → 2303,7
</element>
<element refid="sales.invoice.item" nameClass="masculine" name="article facturé" namePlural="articles facturés">
<FIELD name="ID_DEPOT_STOCK" label="Dépôt Stock" />
<FIELD name="ID_COMPTE_PCE" label="Compte vente spécifique" />
<FIELD name="ID_ECO_CONTRIBUTION" label="Code Eco-Contrib." />
<FIELD name="ECO_CONTRIBUTION" label="Dont Eco-Contrib." />
<FIELD name="T_ECO_CONTRIBUTION" label="Total Eco-Contrib." />
2352,6 → 2387,7
<FIELD name="NOM" label="Nom (*)" titlelabel="Nom" />
<FIELD name="PRENOM" label="Prénom (*)" titlelabel="Prénom" />
<FIELD name="ID_TITRE_PERSONNEL" label="Titre (*)" titlelabel="Titre" />
<FIELD name="ID_USER_COMMON" label="Utilisateur associé" titlelabel="Utilisateur associé" />
<FIELD name="CODE" label="Code (*)" titlelabel="Code" />
<FIELD name="NOM_JEUNE_FILLE" label="Nom de jeune fille" titlelabel="Nom jeune fille" />
<FIELD name="ID_ETAT_CIVIL" label="Etat civil" />
2496,4 → 2532,12
<FIELD name="ControlSum" label="Total des prélèvements" />
<FIELD name="XML" label="Message XML" />
</element>
<element refid="customerrelationship.mail.email.template" nameClass="masculine" name="modèle d'email"
namePlural="modèles d'email">
<FIELD name="NOM" label="Nom du modèle" />
<FIELD name="TITRE" label="Titre" />
<FIELD name="TEXTE" label="Texte" />
<FIELD name="FORMAT_DATE" label="Format de date" />
<FIELD name="PAR_DEFAUT" label="Par défaut" />
</element>
</ROOT>
/trunk/OpenConcerto/src/org/openconcerto/erp/config/translation_pl.xml
193,6 → 193,7
<!-- Supplier order -->
<action id="supplychain.order.create.purchase" label="Transfer do zakupów" />
<action id="supplychain.order.create.receipt" label="Transfer do zamówienia" />
<action id="supplychain.invoice.clone" label="Kopiuj z" />
 
<!-- Customer order -->
<action id="sales.order.create.deliverynote" label="Transfer WZ" />
/trunk/OpenConcerto/src/org/openconcerto/erp/config/Gestion.java
51,6 → 51,7
import org.openconcerto.utils.FileUtils;
import org.openconcerto.utils.ThrowableHandler;
import org.openconcerto.utils.protocol.Helper;
import org.openconcerto.xml.FastXMLProperties;
 
import java.awt.AWTEvent;
import java.awt.Component;
204,6 → 205,9
}
 
public static void main(String[] args) {
System.setProperty("org.xml.sax.driver", "com.bluecast.xml.Piccolo");
System.setProperty("org.xml.sax.parser", "com.bluecast.xml.Piccolo");
System.setProperty("javax.xml.parsers.SAXParserFactory", "com.bluecast.xml.JAXPSAXParserFactory");
ComptaPropsConfiguration.checkJava();
// Check MacOS Sandbox
String cwd = new File(getProperty("user.dir")).toURI().toString();
410,7 → 414,7
 
if (fTOS.exists()) {
try {
pTOS.loadFromXML(new FileInputStream(fTOS));
FastXMLProperties.load(pTOS, new FileInputStream(fTOS));
} catch (Exception e1) {
e1.printStackTrace();
}
578,7 → 582,7
private static void saveProperties(File fTOS, Properties pTOS) {
try {
final FileOutputStream outputStream = new FileOutputStream(fTOS);
pTOS.storeToXML(outputStream, "tos", "UTF-8");
FastXMLProperties.store(pTOS, outputStream, "tos");
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
593,7 → 597,7
public boolean handle(String message, Throwable throwable) {
if (throwable == null)
return false;
 
throwable.printStackTrace();
final ByteArrayOutputStream out = new ByteArrayOutputStream();
throwable.printStackTrace(new PrintStream(out));
String s = new String(out.toByteArray());
634,7 → 638,7
return true;
}
 
else if (s.contains("No application is associated with the specified file for this operation")) {
else if (s.contains("No application is associated with the specified file for this operation") || s.contains("Error message: Package could not be registered")) {
JOptionPane.showMessageDialog(null, "Merci d'installer LibreOffice ou tout autre application succeptible d'ouvrir ce fichier");
return true;
} else if (s.contains("java.net.SocketTimeoutException: connect timed out")) {
/trunk/OpenConcerto/src/org/openconcerto/erp/config/ComptaPropsConfiguration.java
27,10 → 27,11
import org.openconcerto.erp.core.common.element.StyleSQLElement;
import org.openconcerto.erp.core.common.element.TitrePersonnelSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ClientDepartementSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ComptaContactSQLElement.ContactAdministratifSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ComptaContactSQLElement.ContactFournisseurSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ComptaContactSQLElement.ContactSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ComptaContactSQLElement.ContactSalarieSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.CompteClientTransactionSQLELement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ContactSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ContactSQLElement.ContactAdministratifSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ContactSQLElement.ContactFournisseurSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.CourrierClientSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.CustomerCategorySQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.CustomerSQLElement;
38,6 → 39,7
import org.openconcerto.erp.core.customerrelationship.customer.element.ReferenceClientSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.RelanceSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.TypeLettreRelanceSQLElement;
import org.openconcerto.erp.core.customerrelationship.mail.EmailTemplateSQLElement;
import org.openconcerto.erp.core.edm.AttachmentSQLElement;
import org.openconcerto.erp.core.finance.accounting.element.AssociationAnalytiqueSQLElement;
import org.openconcerto.erp.core.finance.accounting.element.AssociationCompteAnalytiqueSQLElement;
172,6 → 174,7
import org.openconcerto.erp.core.sales.product.element.ArticleFournisseurSecondaireSQLElement;
import org.openconcerto.erp.core.sales.product.element.ArticleTarifSQLElement;
import org.openconcerto.erp.core.sales.product.element.CoutRevientSQLElement;
import org.openconcerto.erp.core.sales.product.element.CustomerProductQtyPriceSQLElement;
import org.openconcerto.erp.core.sales.product.element.EcoContributionSQLElement;
import org.openconcerto.erp.core.sales.product.element.FamilleArticleSQLElement;
import org.openconcerto.erp.core.sales.product.element.FamilleEcoContributionSQLElement;
227,6 → 230,7
import org.openconcerto.erp.generationDoc.provider.AdresseVilleClientValueProvider;
import org.openconcerto.erp.generationDoc.provider.AdresseVilleNomClientValueProvider;
import org.openconcerto.erp.generationDoc.provider.ArticleCodeClientProvider;
import org.openconcerto.erp.generationDoc.provider.ArticleCodeFournisseurProvider;
import org.openconcerto.erp.generationDoc.provider.ConditionsReglementDetailsProvider;
import org.openconcerto.erp.generationDoc.provider.DateBLProvider;
import org.openconcerto.erp.generationDoc.provider.DateProvider;
240,6 → 244,7
import org.openconcerto.erp.generationDoc.provider.PrixUVProvider;
import org.openconcerto.erp.generationDoc.provider.PrixUnitaireProvider;
import org.openconcerto.erp.generationDoc.provider.PrixUnitaireRemiseProvider;
import org.openconcerto.erp.generationDoc.provider.QteTotalDocProvider;
import org.openconcerto.erp.generationDoc.provider.QteTotalProvider;
import org.openconcerto.erp.generationDoc.provider.RecapFactureProvider;
import org.openconcerto.erp.generationDoc.provider.RefClientValueProvider;
269,6 → 274,8
import org.openconcerto.erp.injector.CommandeCliCommandeSQLInjector;
import org.openconcerto.erp.injector.CommandeFactureAchatSQLInjector;
import org.openconcerto.erp.injector.CommandeFactureClientSQLInjector;
import org.openconcerto.erp.injector.CommandeFactureEltSQLInjector;
import org.openconcerto.erp.injector.CommandeFactureFournisseurSQLInjector;
import org.openconcerto.erp.injector.DevisBlEltSQLInjector;
import org.openconcerto.erp.injector.DevisBlSQLInjector;
import org.openconcerto.erp.injector.DevisCommandeFournisseurSQLInjector;
298,7 → 305,6
import org.openconcerto.sql.model.DBStructureItemNotFound;
import org.openconcerto.sql.model.DBSystemRoot;
import org.openconcerto.sql.model.FieldMapper;
import org.openconcerto.sql.model.LoadingListener;
import org.openconcerto.sql.model.SQLDataSource;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLServer;
338,14 → 344,8
import java.util.Collection;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
 
import javax.imageio.ImageIO;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
605,6 → 605,7
AdresseVilleNomClientValueProvider.register();
AdresseFullClientValueProvider.register();
QteTotalProvider.register();
QteTotalDocProvider.register();
StockLocationProvider.register();
RefClientValueProvider.register();
ModeDeReglementDetailsProvider.register();
618,62 → 619,10
RecapFactureProvider.register();
RestantAReglerProvider.register();
SaledTotalNotDiscountedProvider.register();
ArticleCodeFournisseurProvider.register();
}
 
@Override
protected void initSystemRoot(DBSystemRoot input) {
super.initSystemRoot(input);
if (!GraphicsEnvironment.isHeadless()) {
final JDialog f = new JOptionPane("Mise à jour des caches en cours...\nCette opération prend généralement moins d'une minute.", JOptionPane.INFORMATION_MESSAGE, JOptionPane.DEFAULT_OPTION,
null, new Object[] {}).createDialog("Veuillez patienter");
input.addLoadingListener(new LoadingListener() {
 
private int loadingCount = 0;
private final ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
final Thread thread = new Thread(r, "Loading listener thread");
thread.setDaemon(true);
return thread;
}
});
private ScheduledFuture<?> future = null;
 
@Override
public synchronized void loading(LoadingEvent evt) {
this.loadingCount += evt.isStarting() ? 1 : -1;
if (this.loadingCount < 0) {
throw new IllegalStateException();
} else if (this.loadingCount == 0) {
this.future.cancel(false);
this.future = null;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
f.setVisible(false);
f.dispose();
}
});
} else if (this.future == null) {
this.future = this.exec.schedule(new Runnable() {
@Override
public void run() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
f.setVisible(true);
}
});
}
}, 1, TimeUnit.SECONDS);
}
}
 
});
}
}
 
@Override
protected void initDS(SQLDataSource ds) {
super.initDS(ds);
ds.setInitialSize(3);
862,7 → 811,7
 
dir.addSQLElement(AttachmentSQLElement.class);
 
 
dir.addSQLElement(CustomerProductQtyPriceSQLElement.class);
dir.addSQLElement(EtatStockSQLElement.class);
dir.addSQLElement(EtatStockItemSQLElement.class);
dir.addSQLElement(ArticleTarifSQLElement.class);
882,6 → 831,7
dir.addSQLElement(CoefficientPrimeSQLElement.class);
dir.addSQLElement(ContactFournisseurSQLElement.class);
dir.addSQLElement(ContactAdministratifSQLElement.class);
dir.addSQLElement(ContactSalarieSQLElement.class);
dir.addSQLElement(new TitrePersonnelSQLElement());
dir.addSQLElement(new ContactSQLElement());
dir.addSQLElement(new SaisieKmItemSQLElement());
1065,6 → 1015,7
dir.addSQLElement(CalendarItemSQLElement.class);
dir.addSQLElement(CalendarItemGroupSQLElement.class);
dir.addSQLElement(DeviseHistoriqueSQLElement.class);
dir.addSQLElement(EmailTemplateSQLElement.class);
 
if (getRootSociete().contains("FWK_LIST_PREFS")) {
dir.addSQLElement(new FWKListPrefs(getRootSociete()));
1122,6 → 1073,7
 
public static void setSocieteSQLInjector(final DBRoot rootSociete) {
new AchatAvoirSQLInjector(rootSociete);
new CommandeFactureEltSQLInjector(rootSociete);
new ArticleCommandeEltSQLInjector(rootSociete);
new CommandeCliCommandeSQLInjector(rootSociete);
new FactureAvoirSQLInjector(rootSociete);
1141,6 → 1093,7
new CommandeBrSQLInjector(rootSociete);
new BonReceptionFactureFournisseurSQLInjector(rootSociete);
new CommandeFactureAchatSQLInjector(rootSociete);
new CommandeFactureFournisseurSQLInjector(rootSociete);
new EcheanceEncaisseSQLInjector(rootSociete);
new EcheanceRegleSQLInjector(rootSociete);
new BrFactureAchatSQLInjector(rootSociete);
1181,7 → 1134,7
if (getRootSociete().getTable("CLIENT").getFieldsName().contains("LOCALISATION")) {
showAs.show("CLIENT", "NOM", "LOCALISATION");
} else {
SQLPreferences prefs = new SQLPreferences(root);
SQLPreferences prefs = SQLPreferences.getMemCached(root);
if (prefs.getBoolean(GestionClientPreferencePanel.DISPLAY_CLIENT_PCE, false)) {
showAs.show("CLIENT", "ID_PAYS", "GROUPE", "NOM", "ID_COMPTE_PCE");
} else {
1227,12 → 1180,14
final List<String> lEchFact = new ArrayList<String>();
lEchFact.add("NUMERO");
lEchFact.add("DATE");
lEchFact.add("ID_MODE_REGLEMENT");
lEchFact.add("ID_COMMERCIAL");
SQLTable tableEch = root.getTable("ECHEANCE_CLIENT");
showAs.show(tableEch.getField("ID_SAISIE_VENTE_FACTURE"), lEchFact);
 
showAs.show("ECHEANCE_FOURNISSEUR", SQLRow.toList("ID_FOURNISSEUR,ID_MOUVEMENT"));
showAs.show("FICHE_PAYE", SQLRow.toList("ID_MOIS,ANNEE"));
showAs.show("FICHE_PAYE", SQLRow.toList("ID_MOIS,ANNEE,ID_PROFIL_PAYE"));
 
showAs.show("FOURNISSEUR", "NOM");
 
showAs.show("IDCC", "NOM");
1305,6 → 1260,16
public void setUpSocieteDataBaseConnexion(int base) {
final String customerName = setUpSocieteStructure(base);
final DBRoot rootSociete = this.getRootSociete();
 
try {
// create table if necessary
SQLPreferences.getPrefTable(rootSociete);
SQLPreferences.startMemCached(rootSociete);
} catch (Exception e) {
// don't die now, we might not need them
ExceptionHandler.handle("Impossible d'accéder aux préférences", e);
}
 
closeSocieteConnexion();
setSocieteDirectory();
NumerotationAutoSQLElement.addListeners();
1318,15 → 1283,6
// Prefetch undefined
rootSociete.getTables().iterator().next().getUndefinedID();
 
try {
// create table if necessary
SQLPreferences.getPrefTable(rootSociete);
SQLPreferences.startMemCached(rootSociete);
} catch (Exception e) {
// don't die now, we might not need them
ExceptionHandler.handle("Impossible d'accéder aux préférences", e);
}
 
this.getModuleManager().addFactories(Gestion.MODULES_DIR);
this.getModuleManager().setup(this.getRootSociete(), this);
}
1337,9 → 1293,7
 
public void setupBarCodeIfNeeded() {
final DBRoot rootSociete = this.getRootSociete();
 
// TODO check is the SQLPreferences returned by startMemCached() can be used
SQLPreferences pref = new SQLPreferences(rootSociete);
SQLPreferences pref = SQLPreferences.getMemCached(rootSociete);
if (pref.getBoolean(GestionCommercialeGlobalPreferencePanel.BARCODE_INSERTION, false)) {
this.barcodeReader = new BarcodeReader(80);
this.barcodeReader.start();
/trunk/OpenConcerto/src/org/openconcerto/erp/config/translation_en.xml
196,6 → 196,7
<!-- Supplier order -->
<action id="supplychain.order.create.purchase" label="Transfer to purchase" />
<action id="supplychain.order.create.receipt" label="Transfer to supplier receipt" />
<action id="supplychain.invoice.clone" label="Copy from" />
 
<!-- Customer order -->
<action id="sales.order.create.deliverynote" label="Transfer to delivey note" />
397,5 → 398,5
<item id="product.bom.expose" label="Expose BOM" />
<item id="product.bom.flat" label="Flat BOM" />
 
 
<action id="email" label="Email" />
</translation>
/trunk/OpenConcerto/src/org/openconcerto/erp/config/DefaultMenuConfiguration.java
28,6 → 28,7
import org.openconcerto.erp.core.customerrelationship.customer.action.ListeDesDepartementsClientsAction;
import org.openconcerto.erp.core.customerrelationship.customer.action.NouvelHistoriqueListeClientAction;
import org.openconcerto.erp.core.customerrelationship.mail.action.ListeDesCourriersClientsAction;
import org.openconcerto.erp.core.customerrelationship.mail.action.ListeDesModelesEmailAction;
import org.openconcerto.erp.core.finance.accounting.action.BalanceAgeeAction;
import org.openconcerto.erp.core.finance.accounting.action.CompteResultatBilanAction;
import org.openconcerto.erp.core.finance.accounting.action.EtatBalanceAction;
68,6 → 69,7
import org.openconcerto.erp.core.finance.payment.action.NouveauDecaissementChequeAvoirAction;
import org.openconcerto.erp.core.finance.payment.action.NouveauListeDesChequesADecaisserAction;
import org.openconcerto.erp.core.finance.payment.action.NouveauListeDesChequesAEncaisserAction;
import org.openconcerto.erp.core.finance.payment.element.EncaisserMontantSQLElement;
import org.openconcerto.erp.core.finance.tax.action.ReportingEcoContributionPanel;
import org.openconcerto.erp.core.finance.tax.action.ReportingTaxeComplementairePanel;
import org.openconcerto.erp.core.humanresources.ListeDesContactsAdministratif;
92,6 → 94,7
import org.openconcerto.erp.core.reports.stat.action.EvolutionCmdAction;
import org.openconcerto.erp.core.reports.stat.action.EvolutionCmdCumulAction;
import org.openconcerto.erp.core.reports.stat.action.EvolutionMargeAction;
import org.openconcerto.erp.core.reports.stat.action.ReportingCommercialAction;
import org.openconcerto.erp.core.reports.stat.action.VenteArticleFamilleGraphAction;
import org.openconcerto.erp.core.reports.stat.action.VenteArticleGraphAction;
import org.openconcerto.erp.core.reports.stat.action.VenteArticleMargeGraphAction;
101,6 → 104,7
import org.openconcerto.erp.core.sales.invoice.action.GenEtatStockAction;
import org.openconcerto.erp.core.sales.invoice.action.GenListeVenteAction;
import org.openconcerto.erp.core.sales.invoice.action.GenReportingVenteAction;
import org.openconcerto.erp.core.sales.invoice.action.ImportReglementSageAction;
import org.openconcerto.erp.core.sales.invoice.action.ListeDebiteursAction;
import org.openconcerto.erp.core.sales.invoice.action.ListeDesElementsFactureAction;
import org.openconcerto.erp.core.sales.invoice.action.ListeDesFactureItemsAction;
121,6 → 125,7
import org.openconcerto.erp.core.sales.product.action.ListeDesArticlesAction;
import org.openconcerto.erp.core.sales.product.action.ListeEcoContributionAction;
import org.openconcerto.erp.core.sales.product.action.ListeHistoCodeClientArticleAction;
import org.openconcerto.erp.core.sales.product.action.TransfertStockAction;
import org.openconcerto.erp.core.sales.quote.action.ListeDesDevisAction;
import org.openconcerto.erp.core.sales.quote.action.ListeDesDevisActionTCP;
import org.openconcerto.erp.core.sales.quote.action.ListeDesElementsDevisAction;
294,6 → 299,7
supplierGroup.addItem("supplier.credit.create");
group.addItem("stock.io.create");
}
group.addItem("product.stock.transfert");
 
return group;
}
328,7 → 334,7
gUser.addItem("user.task.right");
group.add(gUser);
}
 
group.addItem("email.template.list");
group.addItem("product.ecotax");
group.addItem("office.contact.list");
group.addItem("salesman.list");
414,6 → 420,7
group.addItem("sales.list.reporting");
group.addItem("order.list.reporting");
group.addItem("sales.list.report");
group.addItem("sales.list.salesman.report");
group.addItem("sales.product.graph");
group.addItem("sales.product.margin.graph");
group.addItem("sales.product.family.graph");
599,6 → 606,7
mManager.putAction(new NouveauSaisieVenteFactureAction(conf), "customer.invoice.create");
 
mManager.putAction(new NouveauAvoirClientAction(conf), "customer.credit.create");
mManager.putAction(new TransfertStockAction(conf), "product.stock.transfert");
 
if (rights.haveRight(NXRights.LOCK_MENU_ACHAT.getCode())) {
mManager.putAction(new NouvelleDemandePrixAction(conf), "supplier.order.ask.create");
710,8 → 718,8
}
 
public void registerStatsMenuActions(final MenuAndActions mManager) {
final ComptaPropsConfiguration conf = getConfiguration();
 
 
mManager.putAction(new EvolutionCAAction(), "sales.graph");
mManager.putAction(new EvolutionCACumulAction(), "sales.graph.cumulate");
 
718,6 → 726,8
mManager.putAction(new EvolutionCmdAction(), "sales.graph.cmd");
mManager.putAction(new EvolutionCmdCumulAction(), "sales.graph.cmd.cumulate");
 
mManager.putAction(new ReportingCommercialAction(conf.getRootSociete()), "sales.list.salesman.report");
 
mManager.putAction(new EvolutionMargeAction(), "sales.margin.graph");
mManager.putAction(new GenReportingVenteAction(false), "sales.list.reporting");
mManager.putAction(new GenReportingVenteAction(true), "order.list.reporting");
763,6 → 773,7
 
if (rights.haveRight(NXRights.GESTION_ENCAISSEMENT.getCode())) {
mManager.putAction(new ListesFacturesClientsImpayeesAction(), "customer.invoice.unpaid.list");
mManager.putAction(new ImportReglementSageAction(conf.getDirectory().getElement(EncaisserMontantSQLElement.class)), "customer.invoice.payment.xml.sage.import");
mManager.putAction(new ListeDebiteursAction(), "customer.dept.list");
mManager.putAction(new AbstractAction("Relevé client") {
@Override
839,7 → 850,7
mManager.putAction(new GestionDroitsAction(), "user.right.list");
mManager.putAction(new TaskAdminAction(), "user.task.right");
}
 
mManager.putAction(new ListeDesModelesEmailAction(), "email.template.list");
mManager.putAction(new ListeDesContactsAdministratif(), "office.contact.list");
mManager.putAction(new ListeDesCommerciauxAction(), "salesman.list");
mManager.putAction(new ListeDesCaissesTicketAction(), "pos.list");
/trunk/OpenConcerto/src/org/openconcerto/erp/config/mapping_fr.xml
1,5 → 1,15
<?xml version="1.0" encoding="UTF-8" ?>
<ROOT>
 
<element refid="sales.customer.product.qty.price" nameClass="masculine" name="tarif client">
<FIELD name="QUANTITE" label="Quantité" />
<FIELD name="ID_ARTICLE" label="Article" />
<FIELD name="ID_CLIENT" label="Client" />
<FIELD name="POURCENT_REMISE" label="% remise" />
</element>
 
 
 
<element refid="common.address" nameClass="feminine" name="adresse">
<FIELD name="RAISON_SOCIALE" label="Raison sociale" />
<FIELD name="RUE" label="Rue" />
266,4 → 276,6
<FIELD name="FORMULE" label="Formule" />
<FIELD name="INFOS" label="Description" />
</element>
 
</ROOT>
/trunk/OpenConcerto/src/org/openconcerto/erp/config/update/Updater_1_5.java
15,6 → 15,7
 
import org.openconcerto.erp.config.InstallationPanel;
import org.openconcerto.erp.core.common.ui.AbstractVenteArticleItemTable;
import org.openconcerto.erp.core.customerrelationship.mail.EmailTemplateSQLElement;
import org.openconcerto.erp.core.finance.payment.element.SDDMessageSQLElement;
import org.openconcerto.erp.core.finance.payment.element.SEPAMandateSQLElement;
import org.openconcerto.erp.core.finance.payment.element.TypeReglementSQLElement;
23,6 → 24,7
import org.openconcerto.erp.core.sales.pos.element.TicketCaisseSQLElement;
import org.openconcerto.erp.core.sales.product.element.ReferenceArticleSQLElement;
import org.openconcerto.erp.core.sales.quote.element.DevisLogMailSQLElement;
import org.openconcerto.erp.core.supplychain.stock.element.ComposedItemStockUpdater;
import org.openconcerto.erp.core.supplychain.stock.element.DepotStockSQLElement;
import org.openconcerto.erp.core.supplychain.stock.element.StockItem;
import org.openconcerto.sql.changer.convert.AddMDFields;
37,6 → 39,7
import org.openconcerto.sql.model.SQLSyntax;
import org.openconcerto.sql.model.SQLSystem;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.SQLTable.Index;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.sql.request.UpdateBuilder;
58,6 → 61,7
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.prefs.BackingStoreException;
 
import org.apache.commons.dbutils.handlers.ArrayListHandler;
1790,6 → 1794,14
root.refetchTable("VARIABLE_SALARIE");
root.getSchema().updateVersion();
}
SQLTable tableBL = root.getTable("BON_DE_LIVRAISON");
if (!tableBL.contains("ID_COMMERCIAL")) {
final AlterTable alterB = new AlterTable(tableBL);
alterB.addForeignColumn("ID_COMMERCIAL", root.getTable("COMMERCIAL"));
root.getBase().getDataSource().execute(alterB.asString());
root.refetchTable("BON_DE_LIVRAISON");
root.getSchema().updateVersion();
}
 
// fix stock
{
1857,17 → 1869,151
}
}
 
// Tarification client par quantite
if (root.getTable("TARIF_ARTICLE_CLIENT") == null) {
final SQLCreateTable createTableQtyTarif = new SQLCreateTable(root, "TARIF_ARTICLE_CLIENT");
createTableQtyTarif.addForeignColumn("ID_ARTICLE", root.getTable("ARTICLE"));
createTableQtyTarif.addForeignColumn("ID_CLIENT", root.getTable("CLIENT"));
createTableQtyTarif.addDecimalColumn("QUANTITE", 16, 3, BigDecimal.ONE, false);
createTableQtyTarif.addDecimalColumn("POURCENT_REMISE", 16, 3, null, true);
// createTableQtyTarif.addDecimalColumn("PRIX_METRIQUE_VT_1", 16, 6, null, true);
try {
root.getBase().getDataSource().execute(createTableQtyTarif.asString());
InstallationPanel.insertUndef(createTableQtyTarif);
root.refetchTable("TARIF_ARTICLE_CLIENT");
root.getSchema().updateVersion();
} catch (SQLException ex) {
throw new IllegalStateException("Erreur lors de la création de la table " + "TARIF_QUANTITE", ex);
}
}
 
SQLTable tableTrCmd = root.getTable("TR_COMMANDE");
if (!tableTrCmd.contains("ID_FACTURE_FOURNISSEUR")) {
AlterTable t = new AlterTable(tableTrCmd);
t.addForeignColumn("ID_FACTURE_FOURNISSEUR", root.getTable("FACTURE_FOURNISSEUR"));
tableTrCmd.getBase().getDataSource().execute(t.asString());
root.refetchTable(tableTrCmd.getName());
root.getSchema().updateVersion();
}
 
public static void initStock(SQLRow row) {
SQLSelect sel = new SQLSelect();
sel.addSelectStar(row.getTable().getTable("DEPOT_STOCK"));
List<SQLRow> rowsDepot = SQLRowListRSH.execute(sel);
SQLTable tableContrat = root.getTable("CONTRAT_SALARIE");
if (!tableContrat.contains("COMPLEMENT_PCS")) {
AlterTable t = new AlterTable(tableContrat);
t.addVarCharColumn("COMPLEMENT_PCS", 54);
tableContrat.getBase().getDataSource().execute(t.asString());
root.refetchTable(tableContrat.getName());
root.getSchema().updateVersion();
}
 
List<String> tablesCatComptable = Arrays.asList("DEVIS", "COMMANDE_CLIENT", "BON_DE_LIVRAISON", "SAISIE_VENTE_FACTURE", "AVOIR_CLIENT");
for (String tableToUp : tablesCatComptable) {
final SQLTable tableCatComptToAdd = root.getTable(tableToUp);
if (!tableCatComptToAdd.contains("ID_CATEGORIE_COMPTABLE")) {
final AlterTable alter = new AlterTable(tableCatComptToAdd);
alter.addForeignColumn("ID_CATEGORIE_COMPTABLE", root.getTable("CATEGORIE_COMPTABLE"));
exec(alter);
root.refetchTable(tableToUp);
root.getSchema().updateVersion();
}
}
 
 
// Modèles pour les emails
if (!root.contains(EmailTemplateSQLElement.TABLE_NAME)) {
final SQLCreateTable createTable = new SQLCreateTable(root, EmailTemplateSQLElement.TABLE_NAME);
createTable.addVarCharColumn("NOM", 80);
createTable.addVarCharColumn("TITRE", 80);
createTable.addVarCharColumn("TEXTE", 4096);
createTable.addVarCharColumn("FORMAT_DATE", 20);
createTable.addBooleanColumn("PAR_DEFAUT", Boolean.FALSE, false);
try {
root.getBase().getDataSource().execute(createTable.asString());
InstallationPanel.insertUndef(createTable);
root.refetchTable(EmailTemplateSQLElement.TABLE_NAME);
root.getSchema().updateVersion();
} catch (SQLException ex) {
throw new IllegalStateException("Erreur lors de la création de la table " + EmailTemplateSQLElement.TABLE_NAME, ex);
}
}
// Force undefined policy to inDb
root.setMetadata(SQLTable.UNDEFINED_ID_POLICY, "inDB");
final Map<String, Number> mapTableNameUndefined = SQLTable.getUndefIDs(root.getSchema());
final Set<String> tables = root.getSchema().getTableNames();
for (String tName : tables) {
if (!mapTableNameUndefined.containsKey(tName)) {
System.err.println("Updater_1_5.update() adding undefined in db for " + tName);
SQLTable.setUndefID(root.getSchema(), tName, null);
}
}
 
// Création de la table Modéle
if (!root.contains("CONTACT_SALARIE")) {
 
SQLCreateTable createModele = new SQLCreateTable(root, "CONTACT_SALARIE");
createModele.addVarCharColumn("NOM", 256);
createModele.addVarCharColumn("PRENOM", 256);
createModele.addVarCharColumn("TEL_DIRECT", 256);
createModele.addVarCharColumn("TEL_MOBILE", 256);
createModele.addVarCharColumn("EMAIL", 256);
createModele.addVarCharColumn("FAX", 256);
createModele.addVarCharColumn("FONCTION", 256);
createModele.addVarCharColumn("TEL_PERSONEL", 256);
createModele.addVarCharColumn("TEL_STANDARD", 256);
createModele.addForeignColumn("ID_TITRE_PERSONNEL", root.findTable("TITRE_PERSONNEL"));
createModele.addForeignColumn("ID_SALARIE", root.findTable("SALARIE"));
 
try {
root.getBase().getDataSource().execute(createModele.asString());
root.refetchTable("CONTACT_SALARIE");
SQLRowValues rowVals = new SQLRowValues(root.getTable("CONTACT_SALARIE"));
SQLRow rowInserted = rowVals.commit();
SQLTable.setUndefID(root.getSchema(), "CONTACT_SALARIE", rowInserted.getID());
tableDevis.getSchema().updateVersion();
} catch (SQLException ex) {
throw new IllegalStateException("Erreur lors de la création de la table MODELE", ex);
}
}
 
final SQLTable tableRgltPaye = root.getTable("REGLEMENT_PAYE");
if (!tableRgltPaye.contains("IBAN")) {
final AlterTable alter = new AlterTable(tableRgltPaye);
alter.addVarCharColumn("IBAN", 128);
exec(alter);
root.refetchTable(tableRgltPaye.getName());
root.getSchema().updateVersion();
}
if (!tableRgltPaye.contains("BIC")) {
final AlterTable alter = new AlterTable(tableRgltPaye);
alter.addVarCharColumn("BIC", 40);
exec(alter);
root.refetchTable(tableRgltPaye.getName());
root.getSchema().updateVersion();
}
final SQLTable tableSalarie = root.getTable("SALARIE");
if (!tableSalarie.contains("ID_USER_COMMON")) {
final AlterTable alter = new AlterTable(tableSalarie);
alter.addForeignColumn("ID_USER_COMMON", root.findTable("USER_COMMON"));
exec(alter);
root.refetchTable(tableSalarie.getName());
root.getSchema().updateVersion();
}
 
final SQLTable tableInfosSalarie = root.getTable("INFOS_SALARIE_PAYE");
if (!tableInfosSalarie.contains("DUREE_FORFAIT")) {
final AlterTable alter = new AlterTable(tableInfosSalarie);
alter.addColumn("DUREE_FORFAIT", "real");
exec(alter);
root.refetchTable(tableSalarie.getName());
root.getSchema().updateVersion();
}
 
}
 
public static void initStock(SQLRow rowArticle, int idDepot) {
 
SQLSelect selStock = new SQLSelect();
selStock.addSelectStar(row.getTable().getTable("STOCK"));
selStock.setWhere(new Where(row.getTable().getTable("STOCK").getField("ID_ARTICLE"), "=", row.getID()));
selStock.addSelectStar(rowArticle.getTable().getTable("STOCK"));
selStock.setWhere(new Where(rowArticle.getTable().getTable("STOCK").getField("ID_ARTICLE"), "=", rowArticle.getID()));
List<SQLRow> rowsStock = SQLRowListRSH.execute(selStock);
Map<Integer, SQLRow> initedDepot = new HashMap<>();
for (SQLRow sqlRow : rowsStock) {
1875,47 → 2021,51
}
 
List<StockItem> stockItems = new ArrayList<StockItem>();
for (SQLRow sqlRow : rowsDepot) {
try {
if (!initedDepot.keySet().contains(sqlRow.getID())) {
SQLRowValues rowVals = new SQLRowValues(row.getTable().getTable("STOCK"));
rowVals.put("ID_ARTICLE", row.getID());
rowVals.put("ID_DEPOT_STOCK", sqlRow.getID());
if (!initedDepot.keySet().contains(idDepot)) {
SQLRowValues rowVals = new SQLRowValues(rowArticle.getTable().getTable("STOCK"));
rowVals.put("ID_ARTICLE", rowArticle.getID());
rowVals.put("ID_DEPOT_STOCK", idDepot);
 
SQLRow rowStock = rowVals.commit();
if ((row.getObject("ID_DEPOT_STOCK") == null || row.isForeignEmpty("ID_DEPOT_STOCK")) && sqlRow.getID() == DepotStockSQLElement.DEFAULT_ID) {
row.createEmptyUpdateRow().put("ID_STOCK", rowStock.getID()).put("ID_DEPOT_STOCK", DepotStockSQLElement.DEFAULT_ID).commit();
} else if (sqlRow.getID() == row.getForeignID("ID_DEPOT_STOCK")) {
row.createEmptyUpdateRow().put("ID_STOCK", rowStock.getID()).commit();
if ((rowArticle.getObject("ID_DEPOT_STOCK") == null || rowArticle.isForeignEmpty("ID_DEPOT_STOCK")) && idDepot == DepotStockSQLElement.DEFAULT_ID) {
rowArticle.createEmptyUpdateRow().put("ID_STOCK", rowStock.getID()).put("ID_DEPOT_STOCK", DepotStockSQLElement.DEFAULT_ID).commit();
} else if (idDepot == rowArticle.getForeignID("ID_DEPOT_STOCK")) {
rowArticle.createEmptyUpdateRow().put("ID_STOCK", rowStock.getID()).commit();
}
stockItems.add(new StockItem(row, rowStock));
stockItems.add(new StockItem(rowArticle, rowStock));
 
} else {
SQLRow rowExisting = initedDepot.get(sqlRow.getID());
if ((row.getObject("ID_DEPOT_STOCK") == null || row.isForeignEmpty("ID_DEPOT_STOCK")) && sqlRow.getID() == DepotStockSQLElement.DEFAULT_ID) {
row.createEmptyUpdateRow().put("ID_STOCK", rowExisting.getID()).put("ID_DEPOT_STOCK", DepotStockSQLElement.DEFAULT_ID).commit();
} else if (sqlRow.getID() == row.getForeignID("ID_DEPOT_STOCK")) {
row.createEmptyUpdateRow().put("ID_STOCK", rowExisting.getID()).commit();
SQLRow rowExisting = initedDepot.get(idDepot);
if ((rowArticle.getObject("ID_DEPOT_STOCK") == null || rowArticle.isForeignEmpty("ID_DEPOT_STOCK")) && idDepot == DepotStockSQLElement.DEFAULT_ID) {
rowArticle.createEmptyUpdateRow().put("ID_STOCK", rowExisting.getID()).put("ID_DEPOT_STOCK", DepotStockSQLElement.DEFAULT_ID).commit();
} else if (idDepot == rowArticle.getForeignID("ID_DEPOT_STOCK")) {
rowArticle.createEmptyUpdateRow().put("ID_STOCK", rowExisting.getID()).commit();
}
stockItems.add(new StockItem(row, rowExisting));
stockItems.add(new StockItem(rowArticle, rowExisting));
}
} catch (SQLException e) {
ExceptionHandler.handle("Erreur lors de l'initialisation du stock de l'article", e);
}
 
if (rowArticle.getReferentRows(rowArticle.getTable().getTable("ARTICLE_ELEMENT").getField("ID_ARTICLE_PARENT")).size() > 0) {
ComposedItemStockUpdater up = new ComposedItemStockUpdater(rowArticle.getTable().getDBRoot(), stockItems);
try {
up.updateNomenclature(stockItems);
} catch (SQLException e) {
ExceptionHandler.handle("Erreur lors de l'actualisation du stock!", e);
}
// if
// (row.getReferentRows(row.getTable().getTable("ARTICLE_ELEMENT").getField("ID_ARTICLE_PARENT")).size()
// > 0) {
// ComposedItemStockUpdater up = new ComposedItemStockUpdater(row.getTable().getDBRoot(),
// stockItems);
// try {
// up.updateNomenclature(stockItems);
// } catch (SQLException e) {
// ExceptionHandler.handle("Erreur lors de l'actualisation du stock!", e);
// }
// }
}
}
 
public static void initStock(SQLRow row) {
int foreignID = DepotStockSQLElement.DEFAULT_ID;
if (row.getObject("ID_DEPOT_STOCK") != null && !row.isForeignEmpty("ID_DEPOT_STOCK")) {
foreignID = row.getForeignID("ID_DEPOT_STOCK");
}
initStock(row, foreignID);
}
 
public static void exec(final AlterTable alter) throws SQLException {
alter.getTable().getDBSystemRoot().getDataSource().execute(alter.asString());
alter.getTable().getSchema().updateVersion();
/trunk/OpenConcerto/src/org/openconcerto/erp/config/translation_es.xml
200,6 → 200,7
<action id="supplychain.order.create.purchase" label="Transferencia hacia introducción de compra" />
<action id="supplychain.order.valid" label="Marcar como validada" />
<action id="supplychain.order.create.receipt" label="Transferencia hacia álbaran de entrada" />
<action id="supplychain.invoice.clone" label="Crear a partir de" />
 
<!-- Customer order -->
<action id="sales.order.create.deliverynote" label="Transferencia hacia álabaran de salida" />
/trunk/OpenConcerto/src/org/openconcerto/erp/action/CreateListFrameAbstractAction.java
61,7 → 61,11
private final ComptaPropsConfiguration conf;
 
protected CreateListFrameAbstractAction(final ComptaPropsConfiguration conf, final Class<? extends E> clazz) {
super(conf.getDirectory().getElement(clazz));
this(conf, conf.getDirectory().getElementOfClass(clazz, true));
}
 
protected CreateListFrameAbstractAction(final ComptaPropsConfiguration conf, final E elem) {
super(elem);
this.conf = conf;
// TODO use conf to find TM
final NounClass nounClass = this.getElem().getName().getNounClass();
/trunk/OpenConcerto/src/org/openconcerto/erp/action/CreateIListFrameAbstractAction.java
27,6 → 27,10
super(conf, clazz);
}
 
protected CreateIListFrameAbstractAction(final ComptaPropsConfiguration conf, final E elem) {
super(conf, elem);
}
 
protected SQLTableModelSource createTableSource() {
return this.getElem().createTableSource();
}
/trunk/OpenConcerto/src/org/openconcerto/erp/action/CreateEditFrameAbstractAction.java
29,7 → 29,11
private static final String[] TRANSLATION_KEY_ARRAY = new String[] { TRANSLATION_KEY };
 
protected CreateEditFrameAbstractAction(final PropsConfiguration conf, final Class<? extends E> clazz) {
super(conf.getDirectory().getElement(clazz));
this(conf, conf.getDirectory().getElementOfClass(clazz, true));
}
 
protected CreateEditFrameAbstractAction(final PropsConfiguration conf, final E elem) {
super(elem);
// TODO use conf to find TM
final NounClass nounClass = this.getElem().getName().getNounClass();
final String[] translationKeys = nounClass == null ? TRANSLATION_KEY_ARRAY : new String[] { TRANSLATION_KEY + '.' + nounClass.getName(), TRANSLATION_KEY };
/trunk/OpenConcerto/src/org/openconcerto/erp/action/NouvelleConnexionAction.java
293,6 → 293,11
}
 
static public void initCache(final ComptaPropsConfiguration comptaConf) {
initCache(comptaConf, 600);
}
 
static public void initCache(final ComptaPropsConfiguration comptaConf, final int timeout) {
 
final SQLBase baseSociete = comptaConf.getSQLBaseSociete();
Thread t = new Thread() {
@Override
299,7 → 304,7
public void run() {
// laisse le temps au logiciel de demarrer
try {
Thread.sleep(1000);
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
310,19 → 315,19
 
Ville.init(new NXDatabaseAccessor(comptaConf), prefs.getBoolean(GestionClientPreferencePanel.LOAD_CITIES, true));
 
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("TAXE"), 600);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("ETAT_DEVIS"), 600);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("PREFS_COMPTE"), 600);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("COMPTE_PCE"), 600);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("JOURNAL"), 600);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("TAXE"), timeout);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("ETAT_DEVIS"), timeout);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("PREFS_COMPTE"), timeout);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("COMPTE_PCE"), timeout);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("JOURNAL"), timeout);
 
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("COMMERCIAL"), 600);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("PERIODE_VALIDITE"), 1000);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("COMMERCIAL"), timeout);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("PERIODE_VALIDITE"), timeout);
 
if (comptaConf.getRootSociete().contains("DEPOT_STOCK")) {
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("DEPOT_STOCK"), 600);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("DEPOT_STOCK"), timeout);
}
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("TYPE_REGLEMENT"), 1000);
SQLBackgroundTableCache.getInstance().add(baseSociete.getTable("TYPE_REGLEMENT"), timeout);
SQLBackgroundTableCache.getInstance().startCacheWatcher();
 
TaxeCache.getCache();
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/CommandeFactureClientSQLInjector.java
72,8 → 72,10
if (tableFacture.contains("CREATE_VIRTUAL_STOCK")) {
mapDefaultValues(tableFacture.getField("CREATE_VIRTUAL_STOCK"), Boolean.FALSE);
}
 
if (getSource().getTable().contains("ID_CATEGORIE_COMPTABLE") && getDestination().getTable().contains("ID_CATEGORIE_COMPTABLE")) {
map(getSource().getField("ID_CATEGORIE_COMPTABLE"), getDestination().getField("ID_CATEGORIE_COMPTABLE"));
}
}
 
@Override
protected void merge(SQLRowAccessor srcRow, SQLRowValues rowVals) {
83,9 → 85,9
final SQLTable tableElementSource = getSource().getTable("COMMANDE_CLIENT_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("SAISIE_VENTE_FACTURE_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertReference(srcRow, rowVals, "NOM", "NOM");
transfertReference(srcRow, rowVals, "INFOS", "INFOS");
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_SAISIE_VENTE_FACTURE");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_SAISIE_VENTE_FACTURE", "NOM", "NOM");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_SAISIE_VENTE_FACTURE", "INFOS", "INFOS");
if (getDestination().contains("ID_TAXE_FRAIS_DOCUMENT")) {
final SQLRowAccessor rowClient = srcRow.getForeign("ID_CLIENT");
SQLRowAccessor rowFrais = rowClient.getForeign("ID_FRAIS_DOCUMENT");
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/CommandeBlSQLInjector.java
69,7 → 69,10
if (getSource().getTable().contains("ID_ADRESSE_LIVRAISON")) {
map(getSource().getField("ID_ADRESSE_LIVRAISON"), getDestination().getField("ID_ADRESSE_LIVRAISON"));
}
if (getSource().getTable().contains("ID_CATEGORIE_COMPTABLE") && getDestination().getTable().contains("ID_CATEGORIE_COMPTABLE")) {
map(getSource().getField("ID_CATEGORIE_COMPTABLE"), getDestination().getField("ID_CATEGORIE_COMPTABLE"));
}
}
 
@Override
protected void merge(SQLRowAccessor srcRow, SQLRowValues rowVals) {
80,10 → 83,9
final SQLTable tableElementDestination = getSource().getTable("BON_DE_LIVRAISON_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
 
transfertReference(srcRow, rowVals, "NOM", "NOM");
transfertReference(srcRow, rowVals, "INFOS", "INFOS");
 
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_BON_DE_LIVRAISON");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_BON_DE_LIVRAISON", "NOM", "NOM");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_BON_DE_LIVRAISON", "INFOS", "INFOS");
 
if (myListItem.size() != 0) {
final SQLInjector injector = SQLInjector.getInjector(tableElementSource, tableElementDestination);
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/CommandeFactureFournisseurSQLInjector.java
36,11 → 36,11
 
// Merge elements
final SQLTable tableElementSource = getSource().getTable("COMMANDE_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("FACTURE_FOUNRISSEUR_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("FACTURE_FOURNISSEUR_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertReference(srcRow, rowVals, "NOM", "NOM");
transfertReference(srcRow, rowVals, "INFOS", "INFOS");
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_FACTURE_FOURNISSEUR");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_FACTURE_FOURNISSEUR", "NOM", "NOM");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_FACTURE_FOURNISSEUR", "INFOS", "INFOS");
if (myListItem.size() != 0) {
final SQLInjector injector = SQLInjector.getInjector(tableElementSource, tableElementDestination);
for (SQLRowAccessor rowElt : myListItem) {
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/CommandeFactureEltSQLInjector.java
20,6 → 20,7
public CommandeFactureEltSQLInjector(final DBRoot root) {
super(root, "COMMANDE_CLIENT_ELEMENT", "SAISIE_VENTE_FACTURE_ELEMENT", false);
createDefaultMap();
remove(getSource().getField("QTE_LIVREE"), getDestination().getField("QTE_LIVREE"));
if (getDestination().contains("ID_COMMANDE_CLIENT_ELEMENT")) {
map(getSource().getKey(), getDestination().getField("ID_COMMANDE_CLIENT_ELEMENT"));
}
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/BonReceptionFactureFournisseurSQLInjector.java
34,7 → 34,13
map(getSource().getField("PORT_HT"), getDestination().getField("PORT_HT"));
map(getSource().getField("ID_TAXE_PORT"), getDestination().getField("ID_TAXE_PORT"));
}
if (getSource().contains("ID_AFFAIRE") && getDestination().contains("ID_AFFAIRE")) {
map(getSource().getField("ID_AFFAIRE"), getDestination().getField("ID_AFFAIRE"));
}
if (getSource().contains("ID_POLE_PRODUIT") && getDestination().contains("ID_POLE_PRODUIT")) {
map(getSource().getField("ID_POLE_PRODUIT"), getDestination().getField("ID_POLE_PRODUIT"));
}
}
 
@Override
protected void merge(SQLRowAccessor srcRow, SQLRowValues rowVals) {
44,9 → 50,9
final SQLTable tableElementSource = getSource().getTable("BON_RECEPTION_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("FACTURE_FOURNISSEUR_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertReference(srcRow, rowVals, "NOM", "NOM");
transfertReference(srcRow, rowVals, "INFOS", "INFOS");
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_FACTURE_FOURNISSEUR");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_FACTURE_FOURNISSEUR", "NOM", "NOM");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_FACTURE_FOURNISSEUR", "INFOS", "INFOS");
if (myListItem.size() != 0) {
final SQLInjector injector = SQLInjector.getInjector(tableElementSource, tableElementDestination);
for (SQLRowAccessor rowElt : myListItem) {
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/CommandeBrSQLInjector.java
40,7 → 40,10
if (tableBr.contains("CREATE_VIRTUAL_STOCK")) {
mapDefaultValues(tableBr.getField("CREATE_VIRTUAL_STOCK"), Boolean.FALSE);
}
if (getSource().contains("ID_AFFAIRE") && getDestination().contains("ID_AFFAIRE")) {
map(getSource().getField("ID_AFFAIRE"), getDestination().getField("ID_AFFAIRE"));
}
}
 
@Override
protected void merge(SQLRowAccessor srcRow, SQLRowValues rowVals) {
50,6 → 53,7
final SQLTable tableElementSource = getSource().getTable("COMMANDE_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("BON_RECEPTION_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_BON_RECEPTION");
 
if (myListItem.size() != 0) {
final SQLInjector injector = SQLInjector.getInjector(tableElementSource, tableElementDestination);
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/DevisCommandeSQLInjector.java
68,7 → 68,10
map(tableDevis.getField("MONTANT_REMISE"), getDestination().getField("MONTANT_REMISE"));
map(tableDevis.getField("POURCENT_REMISE"), getDestination().getField("POURCENT_REMISE"));
}
if (getSource().getTable().contains("ID_CATEGORIE_COMPTABLE") && getDestination().getTable().contains("ID_CATEGORIE_COMPTABLE")) {
map(getSource().getField("ID_CATEGORIE_COMPTABLE"), getDestination().getField("ID_CATEGORIE_COMPTABLE"));
}
}
 
@Override
protected void merge(SQLRowAccessor srcRow, SQLRowValues rowVals) {
78,9 → 81,9
final SQLTable tableElementSource = getSource().getTable("DEVIS_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("COMMANDE_CLIENT_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertReference(srcRow, rowVals, "OBJET", "NOM");
transfertReference(srcRow, rowVals, "INFOS", "INFOS");
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_COMMANDE_CLIENT");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_COMMANDE_CLIENT", "OBJET", "NOM");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_COMMANDE_CLIENT", "INFOS", "INFOS");
 
if (myListItem.size() != 0) {
final SQLInjector injector = SQLInjector.getInjector(tableElementSource, tableElementDestination);
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/DevisFactureSQLInjector.java
67,7 → 67,10
map(tableDevis.getField("MONTANT_REMISE"), tableFacture.getField("MONTANT_REMISE"));
map(tableDevis.getField("POURCENT_REMISE"), tableFacture.getField("POURCENT_REMISE"));
}
if (getSource().getTable().contains("ID_CATEGORIE_COMPTABLE") && getDestination().getTable().contains("ID_CATEGORIE_COMPTABLE")) {
map(getSource().getField("ID_CATEGORIE_COMPTABLE"), getDestination().getField("ID_CATEGORIE_COMPTABLE"));
}
}
 
@Override
protected void merge(SQLRowAccessor srcRow, SQLRowValues rowVals) {
78,9 → 81,9
final SQLTable tableElementSource = getSource().getTable("DEVIS_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("SAISIE_VENTE_FACTURE_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertReference(srcRow, rowVals, "OBJET", "NOM");
transfertReference(srcRow, rowVals, "INFOS", "INFOS");
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_SAISIE_VENTE_FACTURE");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_SAISIE_VENTE_FACTURE", "OBJET", "NOM");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_SAISIE_VENTE_FACTURE", "INFOS", "INFOS");
 
if (getDestination().contains("ID_TAXE_FRAIS_DOCUMENT")) {
final SQLRowAccessor rowClient = srcRow.getForeign("ID_CLIENT");
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/FactureBonSQLInjector.java
49,9 → 49,9
final SQLTable tableElementSource = getSource().getTable("SAISIE_VENTE_FACTURE_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("BON_DE_LIVRAISON_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertReference(srcRow, rowVals, "NOM", "NOM");
transfertReference(srcRow, rowVals, "INFOS", "INFOS");
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_BON_DE_LIVRAISON");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_BON_DE_LIVRAISON", "NOM", "NOM");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_BON_DE_LIVRAISON", "INFOS", "INFOS");
 
if (myListItem.size() != 0) {
final SQLInjector injector = SQLInjector.getInjector(tableElementSource, tableElementDestination);
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/DevisBlSQLInjector.java
45,7 → 45,10
if (getSource().getTable().contains("ID_ADRESSE_LIVRAISON")) {
map(getSource().getField("ID_ADRESSE_LIVRAISON"), getDestination().getField("ID_ADRESSE_LIVRAISON"));
}
if (getSource().getTable().contains("ID_CATEGORIE_COMPTABLE") && getDestination().getTable().contains("ID_CATEGORIE_COMPTABLE")) {
map(getSource().getField("ID_CATEGORIE_COMPTABLE"), getDestination().getField("ID_CATEGORIE_COMPTABLE"));
}
}
 
@Override
protected void merge(SQLRowAccessor srcRow, SQLRowValues rowVals) {
55,9 → 58,9
final SQLTable tableElementSource = getSource().getTable("DEVIS_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("BON_DE_LIVRAISON_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertReference(srcRow, rowVals, "NOM", "NOM");
transfertReference(srcRow, rowVals, "INFOS", "INFOS");
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_BON_DE_LIVRAISON");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_BON_DE_LIVRAISON", "NOM", "NOM");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_BON_DE_LIVRAISON", "INFOS", "INFOS");
 
if (myListItem.size() != 0) {
final SQLInjector injector = SQLInjector.getInjector(tableElementSource, tableElementDestination);
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/BonFactureSQLInjector.java
46,6 → 46,9
if (getSource().getTable().contains("ID_ADRESSE_LIVRAISON")) {
map(getSource().getField("ID_ADRESSE_LIVRAISON"), getDestination().getField("ID_ADRESSE_LIVRAISON"));
}
if (getSource().getTable().contains("ID_CATEGORIE_COMPTABLE") && getDestination().getTable().contains("ID_CATEGORIE_COMPTABLE")) {
map(getSource().getField("ID_CATEGORIE_COMPTABLE"), getDestination().getField("ID_CATEGORIE_COMPTABLE"));
}
if (tableBon.contains("ID_TAXE_PORT")) {
map(tableBon.getField("ID_TAXE_PORT"), tableFacture.getField("ID_TAXE_PORT"));
}
77,9 → 80,9
final SQLTable tableElementSource = getSource().getTable("BON_DE_LIVRAISON_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("SAISIE_VENTE_FACTURE_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertReference(srcRow, rowVals, "NOM", "NOM");
transfertReference(srcRow, rowVals, "INFOS", "INFOS");
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_SAISIE_VENTE_FACTURE");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_SAISIE_VENTE_FACTURE", "NOM", "NOM");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_SAISIE_VENTE_FACTURE", "INFOS", "INFOS");
if (getDestination().contains("ID_TAXE_FRAIS_DOCUMENT")) {
final SQLRowAccessor rowClient = srcRow.getForeign("ID_CLIENT");
SQLRowAccessor rowFrais = rowClient.getForeign("ID_FRAIS_DOCUMENT");
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/FactureAvoirSQLInjector.java
43,7 → 43,9
if (getSource().contains("ID_ADRESSE_LIVRAISON") && getDestination().contains("ID_ADRESSE_LIVRAISON")) {
map(getSource().getField("ID_ADRESSE_LIVRAISON"), getDestination().getField("ID_ADRESSE_LIVRAISON"));
}
 
if (getSource().getTable().contains("ID_CATEGORIE_COMPTABLE") && getDestination().getTable().contains("ID_CATEGORIE_COMPTABLE")) {
map(getSource().getField("ID_CATEGORIE_COMPTABLE"), getDestination().getField("ID_CATEGORIE_COMPTABLE"));
}
if (getSource().getTable().contains("DATE_LIVRAISON") && getDestination().contains("DATE_LIVRAISON")) {
map(getSource().getField("DATE_LIVRAISON"), getDestination().getField("DATE_LIVRAISON"));
}
64,8 → 66,8
final SQLTable tableElementSource = getSource().getTable("SAISIE_VENTE_FACTURE_ELEMENT");
final SQLTable tableElementDestination = getSource().getTable("AVOIR_CLIENT_ELEMENT");
final Collection<? extends SQLRowAccessor> myListItem = srcRow.asRow().getReferentRows(tableElementSource);
transfertReference(srcRow, rowVals, "NOM", "NOM");
transfertNumberReference(srcRow, rowVals, tableElementDestination, "ID_AVOIR_CLIENT");
transfertReference(srcRow, rowVals, tableElementDestination, "ID_AVOIR_CLIENT", "NOM", "NOM");
 
if (myListItem.size() != 0) {
final SQLInjector injector = SQLInjector.getInjector(tableElementSource, tableElementDestination);
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/AbstractJOOReportsSheet.java
27,6 → 27,7
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.FileUtils;
 
import java.awt.print.PrinterJob;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileNotFoundException;
245,9 → 246,13
return;
}
final Component doc = ooConnexion.loadDocument(fileOutOO, true);
if (this.printer != null && this.printer.trim().length() > 0) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("Name", printer);
map.put("Name", this.printer);
doc.printDocument(map);
} else {
doc.printDocument(PrinterJob.getPrinterJob());
}
doc.close();
} catch (LinkageError e) {
JOptionPane.showMessageDialog(new JFrame(), "Merci d'installer OpenOffice ou LibreOffice");
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/SheetXml.java
179,6 → 179,7
 
try {
if (!useODSViewer) {
if (exportToPDF || printDocument) {
final Component doc = ComptaPropsConfiguration.getOOConnexion().loadDocument(generatedFile, !showDocument);
 
if (printDocument) {
193,6 → 194,9
doc.close();
}
} else {
openDocument(false);
}
} else {
final OpenDocument doc = new OpenDocument(generatedFile);
 
if (showDocument) {
543,9 → 547,13
}
 
public void showPreviewDocument() throws Exception {
showPreviewDocument(null, null);
}
 
public void showPreviewDocument(String actionName, Runnable r) throws Exception {
File f = null;
f = getOrCreateDocumentFile();
PreviewFrame.show(f);
PreviewFrame.show(f, actionName, r);
}
 
public void printDocument() {
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/gestcomm/EtatVentesXmlSheet.java
24,6 → 24,8
import org.openconcerto.sql.model.AliasedTable;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLSelectJoin;
import org.openconcerto.sql.model.SQLTable;
62,11 → 64,13
 
private Timestamp du, au;
public boolean ticketCaisse = false;
public boolean facture = false;
 
public EtatVentesXmlSheet(Date du, Date au, boolean ticketCaisse) {
public EtatVentesXmlSheet(Date du, Date au, boolean ticketCaisse, boolean facture) {
super();
this.printer = PrinterNXProps.getInstance().getStringProperty("BonPrinter");
this.ticketCaisse = ticketCaisse;
this.facture = facture;
if (du != null) {
final Calendar c1 = Calendar.getInstance();
c1.setTime(du);
128,7 → 132,11
styleAllSheetValues.put(0, style);
}
 
final ArrayList<Map<String, Object>> listValuesStock = new ArrayList<>();
final Map<Integer, String> styleStock = new HashMap<>();
 
// Ventes
final SQLTable foreignTableArticle = tableFactureElement.getForeignTable("ID_ARTICLE");
{
 
final AliasedTable tableModeReglement1 = new AliasedTable(tableModeReglement, MODE1);
135,6 → 143,17
final AliasedTable tableModeReglement2 = new AliasedTable(tableModeReglement, MODE2);
final AliasedTable tableTicket = new AliasedTable(eltTicketCaisse.getTable(), "ticket");
 
// Stock
SQLRowValues rowValsArtStock = new SQLRowValues(foreignTableArticle);
rowValsArtStock.putNulls("ID", "CODE", "NOM");
rowValsArtStock.putRowValues("ID_STOCK").putNulls("QTE_REEL", "QTE_TH", "QTE_MIN", "QTE_RECEPT_ATTENTE", "QTE_LIV_ATTENTE");
SQLRowValuesListFetcher fetcherStock = SQLRowValuesListFetcher.create(rowValsArtStock);
List<SQLRowValues> resultStock = fetcherStock.fetch();
Map<Integer, SQLRowValues> mapStock = new HashMap<>();
for (SQLRowValues sqlRowValues : resultStock) {
mapStock.put(sqlRowValues.getID(), sqlRowValues);
}
 
// Requete Pour obtenir les quantités pour chaque type de réglement
SQLSelect sel = new SQLSelect();
 
193,12 → 212,16
selQte.addSelect(tableFactureElement.getField("T_PV_TTC"), "SUM");
selQte.addSelect(tableFactureElement.getField("ID_TAXE"));
selQte.addSelect(tableFactureElement.getField("ID_ARTICLE"));
if (!this.ticketCaisse) {
if (this.ticketCaisse) {
selQte.addJoin("LEFT", tableFactureElement.getField("ID_SAISIE_VENTE_FACTURE")).setWhere(Where.FALSE);
selQte.addJoin("LEFT", tableFactureElement.getField("ID_TICKET_CAISSE"), "ticket").setWhere(w2);
} else if (this.facture) {
selQte.addJoin("LEFT", tableFactureElement.getField("ID_SAISIE_VENTE_FACTURE")).setWhere(w);
selQte.addJoin("LEFT", tableFactureElement.getField("ID_TICKET_CAISSE"), "ticket").setWhere(Where.FALSE);
} else {
selQte.addJoin("LEFT", tableFactureElement.getField("ID_SAISIE_VENTE_FACTURE")).setWhere(Where.FALSE);
selQte.addJoin("LEFT", tableFactureElement.getField("ID_SAISIE_VENTE_FACTURE")).setWhere(w);
selQte.addJoin("LEFT", tableFactureElement.getField("ID_TICKET_CAISSE"), "ticket").setWhere(w2);
}
selQte.addJoin("LEFT", tableFactureElement.getField("ID_TICKET_CAISSE"), "ticket").setWhere(w2);
SQLSelectJoin joinArt2 = selQte.addJoin("LEFT", tableFactureElement.getField("ID_ARTICLE"));
SQLSelectJoin joinFamArt2 = selQte.addJoin("LEFT", joinArt2.getJoinedTable().getField("ID_FAMILLE_ARTICLE"));
selQte.addSelect(joinFamArt2.getJoinedTable().getField("NOM"));
234,8 → 257,8
mapTVAVT.put(tvaID.intValue(), Tuple2.create(t.get0().add((BigDecimal) ht), t.get1().add(ttc)));
}
Number articleID = (Number) sqlRow[7];
ArticleVendu a = new ArticleVendu(code, nom, qteVendu.intValue(), (BigDecimal) ht, (BigDecimal) ha, ttc, tvaID.intValue(),
tableFactureElement.getForeignTable("ID_ARTICLE").getRow(articleID.intValue()));
ArticleVendu a = new ArticleVendu(code, nom, qteVendu.intValue(), (BigDecimal) ht, (BigDecimal) ha, ttc, tvaID.intValue(), foreignTableArticle.getRow(articleID.intValue()));
 
map.put(articleID + "##" + code + "##" + nom + "##" + tvaID, a);
 
}
256,6 → 279,8
mValues.put("NOM", famille);
style.put(listValues.size(), "Titre 1");
listValues.add(mValues);
styleStock.put(listValuesStock.size(), "Titre 1");
listValuesStock.add(mValues);
} else if (valueFam != null && !valueFam.toString().equalsIgnoreCase(famille)) {
famille = valueFam.toString();
Map<String, Object> mValues = new HashMap<String, Object>();
262,6 → 287,8
mValues.put("NOM", famille);
style.put(listValues.size(), "Titre 1");
listValues.add(mValues);
styleStock.put(listValuesStock.size(), "Titre 1");
listValuesStock.add(mValues);
}
 
Map<String, Object> mValues = new HashMap<String, Object>();
291,7 → 318,26
totalTPVTTC = totalTPVTTC.add(a.ttc);
style.put(listValues.size(), "Normal");
listValues.add(mValues);
 
Map<String, Object> mValuesStock = new HashMap<String, Object>();
mValuesStock.put("CODE", code);
mValuesStock.put("NOM", nom);
mValuesStock.put("QTE", a.qte);
if (mapStock.containsKey(articleID)) {
SQLRowValues rowValsArt = mapStock.get(articleID);
if (rowValsArt.getObject("ID_STOCK") != null && !rowValsArt.isForeignEmpty("ID_STOCK")) {
SQLRowAccessor rowValsStock = rowValsArt.getForeign("ID_STOCK");
mValuesStock.put("QTE_TH", rowValsStock.getObject("QTE_TH"));
mValuesStock.put("QTE_REEL", rowValsStock.getObject("QTE_REEL"));
mValuesStock.put("QTE_MIN", rowValsStock.getObject("QTE_MIN"));
mValuesStock.put("QTE_RECEPT_ATTENTE", rowValsStock.getObject("QTE_RECEPT_ATTENTE"));
mValuesStock.put("QTE_LIV_ATTENTE", rowValsStock.getObject("QTE_LIV_ATTENTE"));
}
styleStock.put(listValuesStock.size(), "Normal");
listValuesStock.add(mValuesStock);
}
 
}
// System.out.println("EtatVentesXmlSheet.createListeValues():" + listValues);
}
}
440,7 → 486,7
}
Number articleID = (Number) sqlRow[7];
ArticleVendu a = new ArticleVendu(code, nom, -qteVendu.intValue(), ((BigDecimal) ht).negate(), ((BigDecimal) ha).negate(), ttc.negate(), tvaID.intValue(),
tableFactureElement.getForeignTable("ID_ARTICLE").getRow(articleID.intValue()));
foreignTableArticle.getRow(articleID.intValue()));
map.put(articleID + "##" + code + "##" + nom + "##" + tvaID, a);
 
}
713,6 → 759,10
this.listAllSheetValues.put(3, listValuesTVA);
valuesTVA.put("DATE", periode);
this.mapAllSheetValues.put(3, valuesTVA);
 
this.listAllSheetValues.put(4, listValuesStock);
this.styleAllSheetValues.put(4, styleStock);
this.mapAllSheetValues.put(4, values);
}
 
public static SQLRow rowDefaultCptService, rowDefaultCptProduit;
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOXMLField.java
266,6 → 266,9
result += stringValue;
}
if (suffix != null) {
if (suffix.contains("#n")) {
suffix = suffix.replaceAll("#n", "\n");
}
result += suffix;
}
if (cellSize != null && cellSize.trim().length() != 0) {
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOgenerationXML.java
195,6 → 195,7
}
} catch (Exception e) {
ExceptionHandler.handle("Impossible de remplir le document " + templateId + " " + ((rowLanguage == null) ? "" : rowLanguage.getString("CHEMIN")), e);
e.printStackTrace();
return null;
}
 
444,6 → 445,12
}
calc.setRemise(valRemiseHTReel, totalAvtRemise);
 
// Fix TVA si nécessaire pour facture fournisseur
if (row.getTable().contains("TVA_ADJUSTMENT")) {
BigDecimal tvaFix = row.getBigDecimal("TVA_ADJUSTMENT");
calc.addTVAAdjust(tvaFix);
}
 
for (int i = 0; i < rows.size(); i++) {
SQLRowAccessor sqlRow = rows.get(i);
calc.addLine(sqlRow, sqlRow.getForeign("ID_ARTICLE"), i, i == rows.size() - 1);
490,6 → 497,20
 
calc.addLine(rowValsPort, rowValsPort.getForeign("ID_ARTICLE"), 1, false);
}
if (row.getTable().contains("FRAIS_DOCUMENT_HT") && row.getTable().contains("ID_TAXE_FRAIS_DOCUMENT")) {
BigDecimal fraisDoc = BigDecimal.valueOf(row.getLong("FRAIS_DOCUMENT_HT")).movePointLeft(2);
SQLRowAccessor tvafraisDoc = row.getForeign("ID_TAXE_FRAIS_DOCUMENT");
if (tvafraisDoc != null && fraisDoc.signum() != 0 && !tvafraisDoc.isUndefined()) {
SQLRowValues rowValsfraisDoc = new SQLRowValues(tableElt);
rowValsfraisDoc.put("T_PV_HT", fraisDoc);
rowValsfraisDoc.put("QTE", 1);
rowValsfraisDoc.put("ID_TAXE", tvafraisDoc.getIDNumber());
rowValsfraisDoc.put("SERVICE", Boolean.TRUE);
rowValsfraisDoc.put("ID_FAMILLE_ARTICLE", null);
calc.addLine(rowValsfraisDoc, null, 1, false);
}
}
 
calc.checkResult();
Map<SQLRowAccessor, Tuple2<BigDecimal, BigDecimal>> taxeCalc = calc.getMapHtTVARowTaux();
for (SQLRowAccessor sqlRow : taxeCalc.keySet()) {
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/ArticleCodeFournisseurProvider.java
New file
0,0 → 1,69
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationDoc.provider;
 
import org.openconcerto.erp.generationDoc.SpreadSheetCellValueContext;
import org.openconcerto.erp.generationDoc.SpreadSheetCellValueProvider;
import org.openconcerto.erp.generationDoc.SpreadSheetCellValueProviderManager;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
 
import java.util.List;
 
public class ArticleCodeFournisseurProvider implements SpreadSheetCellValueProvider {
 
public ArticleCodeFournisseurProvider() {
}
 
public Object getValue(SpreadSheetCellValueContext context) {
SQLRowAccessor row = context.getRow();
String code = row.getString("CODE");
if (row.getObject("ID_ARTICLE") != null && !row.isForeignEmpty("ID_ARTICLE")) {
if (row.getTable().contains("ID_CODE_FOURNISSEUR")) {
if (row.getObject("ID_CODE_FOURNISSEUR") != null && !row.isForeignEmpty("ID_CODE_FOURNISSEUR")) {
 
code = row.getForeign("ID_CODE_FOURNISSEUR").getString("CODE");
 
} else {
 
int idFournisseur = row.getForeign("ID_" + row.getTable().getName().replaceAll("_ELEMENT", "")).getForeignID("ID_FOURNISSEUR");
SQLSelect sel = new SQLSelect();
final SQLTable tableCodeFournisseur = row.getTable().getTable("CODE_FOURNISSEUR");
sel.addSelectStar(tableCodeFournisseur);
Where w = new Where(tableCodeFournisseur.getField("ID_ARTICLE"), "=", row.getForeignID("ID_ARTICLE"));
w = w.and(new Where(tableCodeFournisseur.getField("ID_FOURNISSEUR"), "=", idFournisseur));
sel.setWhere(w);
List<SQLRow> result = SQLRowListRSH.execute(sel);
if (!result.isEmpty()) {
final String val = result.get(0).getString("CODE");
if (val.length() > 0) {
code = val;
}
}
}
}
}
return code;
}
 
public static void register() {
SpreadSheetCellValueProviderManager.put("supplier.product.code", new ArticleCodeFournisseurProvider());
 
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/QteTotalDocProvider.java
New file
0,0 → 1,68
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationDoc.provider;
 
import org.openconcerto.erp.generationDoc.SpreadSheetCellValueContext;
import org.openconcerto.erp.generationDoc.SpreadSheetCellValueProviderManager;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLTable;
 
import java.math.BigDecimal;
import java.util.Collection;
 
public class QteTotalDocProvider extends UserInitialsValueProvider {
 
private enum TypeQteTotalDocProvider {
QTE, COLIS
};
 
private final TypeQteTotalDocProvider type;
 
public QteTotalDocProvider(TypeQteTotalDocProvider t) {
this.type = t;
}
 
@Override
public Object getValue(SpreadSheetCellValueContext context) {
SQLRowAccessor row = context.getRow();
 
final SQLTable table = row.getTable();
Collection<? extends SQLRowAccessor> cols = row.getReferentRows(table.getTable(table.getName() + "_ELEMENT"));
BigDecimal total = BigDecimal.ZERO;
for (SQLRowAccessor sqlRowAccessor : cols) {
 
if (!sqlRowAccessor.getTable().contains("NIVEAU") || sqlRowAccessor.getInt("NIVEAU") == 1) {
 
if (this.type == TypeQteTotalDocProvider.QTE) {
BigDecimal qte = sqlRowAccessor.getBigDecimal("QTE_UNITAIRE").multiply(new BigDecimal(sqlRowAccessor.getInt("QTE")));
 
total = total.add(qte);
 
} else {
if (sqlRowAccessor.getObject("NB_COLIS") != null) {
total = total.add(new BigDecimal(sqlRowAccessor.getInt("NB_COLIS")));
}
}
 
}
}
 
return total;
}
 
public static void register() {
SpreadSheetCellValueProviderManager.put("sales.qty.total", new QteTotalDocProvider(TypeQteTotalDocProvider.QTE));
SpreadSheetCellValueProviderManager.put("sales.package.total", new QteTotalDocProvider(TypeQteTotalDocProvider.COLIS));
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/AssociationAnalytique.java
New file
0,0 → 1,67
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationEcritures;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLInsert;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.users.User;
 
import java.math.BigDecimal;
 
public class AssociationAnalytique {
private final int idPosteAnalytique;
private int idSaisieKmElement = 1;
private BigDecimal pourcentage;
private long montant; // centimes
private boolean gestionAuto = false;
private Ecriture ecriture;
 
public AssociationAnalytique(int idPosteAnalytique) {
this.idPosteAnalytique = idPosteAnalytique;
}
 
public void setIdSaisieKmElement(int idSaisieKmElement) {
this.idSaisieKmElement = idSaisieKmElement;
}
 
public void setPourcentage(BigDecimal pourcentage) {
this.pourcentage = pourcentage;
}
 
public void setMontant(long montant) {
this.montant = montant;
}
 
public void setGestionAuto(boolean gestionAuto) {
this.gestionAuto = gestionAuto;
}
 
public void setEcriture(Ecriture ecriture) {
this.ecriture = ecriture;
}
 
public SQLInsert createInsert(DBRoot root, User user) {
final SQLInsert insert = new SQLInsert();
final SQLTable table = root.getTable("ASSOCIATION_ANALYTIQUE");
insert.add(table.getField("ID_ECRITURE"), this.ecriture.getId().intValue());
insert.add(table.getField("ID_SAISIE_KM_ELEMENT"), this.idSaisieKmElement);
insert.add(table.getField("ID_POSTE_ANALYTIQUE"), this.idPosteAnalytique);
insert.add(table.getField("POURCENT"), this.pourcentage);
insert.add(table.getField("MONTANT"), this.montant);
insert.add(table.getField("GESTION_AUTO"), this.gestionAuto);
return insert;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/Journal.java
New file
0,0 → 1,69
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationEcritures;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLInsert;
import org.openconcerto.sql.model.SQLTable;
 
public class Journal {
private final Long id;
private final String code;
private final String nom;
 
public Journal(Long id, final String code, final String nom) {
this.id = id;
this.code = code;
this.nom = nom;
}
 
public Long getId() {
return this.id;
}
 
public String getNom() {
return this.nom;
}
 
public String getCode() {
return this.code;
}
 
@Override
public int hashCode() {
return this.code.hashCode();
}
 
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (this.getClass() != obj.getClass())
return false;
return ((Journal) obj).code.equalsIgnoreCase(this.code);
}
 
SQLInsert createInsert(DBRoot root) {
final SQLInsert insert = new SQLInsert();
final SQLTable table = root.getTable("JOURNAL");
insert.add(table.getField("CODE"), this.code);
insert.add(table.getField("NOM"), this.nom);
return insert;
}
 
@Override
public String toString() {
return "Journal code:" + this.code + " " + this.nom + " (id:" + this.id + ")";
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/MouvementPostInsertionAction.java
New file
0,0 → 1,22
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationEcritures;
 
import java.sql.SQLException;
 
public interface MouvementPostInsertionAction {
 
public void afterInsert(Mouvement m) throws SQLException;
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/Mouvement.java
New file
0,0 → 1,114
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationEcritures;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLInsert;
import org.openconcerto.sql.model.SQLTable;
 
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
 
public class Mouvement {
private String numero;
private List<Ecriture> ecritures = new ArrayList<>();
private Number id;
private BigDecimal debit = BigDecimal.ZERO;
private BigDecimal credit = BigDecimal.ZERO;
private Piece piece;
// Source
private Number idSource;
private String source;
private Mouvement pere;
private MouvementPostInsertionAction postInsertionAction;
 
public Mouvement() {
}
 
public void setSource(Number idSource, String source) {
this.idSource = idSource;
this.source = source;
}
 
public void add(Ecriture e) {
this.ecritures.add(e);
this.debit = this.debit.add(e.getDebit());
this.credit = this.credit.add(e.getCredit());
e.setMouvement(this);
}
 
List<Ecriture> getEcritures() {
return this.ecritures;
}
 
void setId(Number id) {
this.id = id;
}
 
public Number getId() {
return this.id;
}
 
SQLInsert createInsert(DBRoot root) {
final SQLInsert insert = new SQLInsert();
final SQLTable table = root.getTable("MOUVEMENT");
// FIXME le numero doit être généré en auto
// Thread.dumpStack();
// NUMERO = SELECT (MAX) ?
// insert.add(table.getField("NUMERO"), this.numero);
// select for update max(numero)
if (this.idSource != null) {
insert.add(table.getField("IDSOURCE"), this.idSource);
insert.add(table.getField("SOURCE"), this.source);
}
insert.add(table.getField("ID_PIECE"), this.piece.getId().intValue());
if (this.pere != null) {
insert.add(table.getField("ID_MOUVEMENT_PERE"), this.pere.getId().intValue());
}
// TODO CREATION_DATE MODIFICATION_DATE
return insert;
}
 
public boolean isBalanced() {
BigDecimal d = BigDecimal.ZERO;
BigDecimal c = BigDecimal.ZERO;
for (Ecriture e : this.ecritures) {
d = d.add(e.getDebit());
c = c.add(e.getCredit());
}
return d.compareTo(c) == 0;
}
 
public Piece getPiece() {
return this.piece;
}
 
public void setPiece(Piece piece) {
this.piece = piece;
 
}
 
public boolean isEmpty() {
return this.ecritures.isEmpty();
}
 
public MouvementPostInsertionAction getPostInsertionAction() {
return this.postInsertionAction;
}
 
public void setAfterInsert(MouvementPostInsertionAction insertionAction) {
this.postInsertionAction = insertionAction;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationEcritures.java
396,6 → 396,10
if (tiers.getObject("ID_CATEGORIE_COMPTABLE") != null && !tiers.isForeignEmpty("ID_CATEGORIE_COMPTABLE")) {
rowCatCompta = tiers.getForeign("ID_CATEGORIE_COMPTABLE");
}
 
if (row.getTable().contains("ID_CATEGORIE_COMPTABLE") && row.getObject("ID_CATEGORIE_COMPTABLE") != null && !row.isForeignEmpty("ID_CATEGORIE_COMPTABLE")) {
rowCatCompta = row.getForeign("ID_CATEGORIE_COMPTABLE");
}
TotalCalculator calc = new TotalCalculator("T_PA_HT", fieldTotalHT, null, achat, defaultCompte, rowCatCompta);
calc.setIntraComm(intra);
 
436,6 → 440,7
calc.addEchantillon((BigDecimal) sqlRow.getObject("T_PV_HT"), sqlRow.getForeign("ID_TAXE"));
}
}
 
calc.checkResult();
totalAvtRemise = calc.getTotalHT();
}
514,6 → 519,12
calc.addLine(rowValsFraisDoc, null, 1, false);
}
 
// Fix TVA si nécessaire pour facture fournisseur
if (row.getTable().contains("TVA_ADJUSTMENT")) {
BigDecimal tvaFix = row.getBigDecimal("TVA_ADJUSTMENT");
calc.addTVAAdjust(tvaFix);
}
 
calc.checkResult();
return calc;
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/Ecriture.java
New file
0,0 → 1,237
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationEcritures;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLInsert;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.users.User;
 
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class Ecriture {
private Date date;
private BigDecimal debit;
private BigDecimal credit;
private Mouvement mouvement;
private String nom;
private String compteNumero;
private String compteNom;
private Number compteID;
private String journalNom;
private String journalCode;
private Number journalID;
private List<AssociationAnalytique> associations;
private Number id;
private Map<String, Object> cookies;
private boolean cloture;
private boolean aNouveau;
private Date dateValidation;
private Date dateLettrage;
private String lettrage;
 
public Ecriture(Date date, BigDecimal debit, BigDecimal credit) {
this.date = date;
this.debit = debit;
this.credit = credit;
}
 
public SQLInsert createInsert(DBRoot root, User user) {
final SQLInsert insert = new SQLInsert();
final SQLTable table = root.getTable("ECRITURE");
insert.add(table.getField("DATE"), this.date);
insert.add(table.getField("ID_MOUVEMENT"), this.mouvement.getId().intValue());
insert.add(table.getField("DEBIT"), this.debit.multiply(new BigDecimal(100)).longValue());
insert.add(table.getField("CREDIT"), this.credit.multiply(new BigDecimal(100)).longValue());
insert.add(table.getField("NOM"), this.nom);
 
if (this.compteNom == null) {
throw new IllegalStateException("nom du compte manquant");
}
if (this.compteNumero == null || this.compteNumero.isEmpty()) {
throw new IllegalStateException("numéro du compte manquant");
}
insert.add(table.getField("ID_COMPTE_PCE"), this.compteID);
insert.add(table.getField("COMPTE_NUMERO"), this.compteNumero);
insert.add(table.getField("COMPTE_NOM"), this.compteNom);
if (this.journalNom == null) {
throw new IllegalStateException("nom du journal manquant");
}
if (this.journalCode == null || this.journalCode.isEmpty()) {
throw new IllegalStateException("code du journal manquant");
}
insert.add(table.getField("ID_JOURNAL"), this.journalID);
insert.add(table.getField("JOURNAL_NOM"), this.journalNom);
insert.add(table.getField("JOURNAL_CODE"), this.journalCode);
insert.add(table.getField("NOM_PIECE"), this.mouvement.getPiece().getNom());
insert.add(table.getField("ID_USER_COMMON_CREATE"), user.getId());
insert.add(table.getField("ID_USER_COMMON_MODIFY"), user.getId());
insert.add(table.getField("CLOTURE"), this.cloture);
insert.add(table.getField("RAN"), this.aNouveau);
if (this.dateValidation != null) {
insert.add(table.getField("DATE_VALIDE"), this.dateValidation);
insert.add(table.getField("VALIDE"), Boolean.TRUE);
} else {
insert.add(table.getField("DATE_VALIDE"), null);
insert.add(table.getField("VALIDE"), Boolean.FALSE);
}
insert.add(table.getField("DATE_LETTRAGE"), this.dateLettrage);
insert.add(table.getField("LETTRAGE"), this.lettrage == null || this.lettrage.isEmpty() ? " " : this.lettrage);
return insert;
}
 
public void setDateValidation(Date dateValidation) {
this.dateValidation = dateValidation;
}
 
public void setDateLettrage(Date dateLettrage) {
this.dateLettrage = dateLettrage;
}
 
public void setLettrage(String lettrage) {
this.lettrage = lettrage;
}
 
public void setCloture(boolean cloture) {
this.cloture = cloture;
}
 
public void setaNouveau(boolean aNouveau) {
this.aNouveau = aNouveau;
}
 
public String getNom() {
return this.nom;
}
 
public void setNom(String nom) {
this.nom = nom;
}
 
void setId(Number id) {
this.id = id;
}
 
public Number getId() {
return this.id;
}
 
public Number getCompteID() {
return this.compteID;
}
 
public void setCompteID(Number compteID) {
this.compteID = compteID;
}
 
public void setCompte(String numero, String nom) {
this.compteNumero = numero;
this.compteNom = nom;
}
 
public String getCompteNumero() {
return this.compteNumero;
}
 
public String getCompteNom() {
return this.compteNom;
}
 
public Number getJournalID() {
return this.journalID;
}
 
public void setJournalID(Number journalID) {
this.journalID = journalID;
}
 
public void setJournal(String code, String nom) {
this.journalCode = code;
this.journalNom = nom;
}
 
public String getJournalCode() {
return this.journalCode;
}
 
public String getJournalNom() {
return this.journalNom;
}
 
public BigDecimal getDebit() {
return this.debit;
}
 
public BigDecimal getCredit() {
return this.credit;
}
 
public Date getDate() {
return this.date;
}
 
public void setMouvement(Mouvement mouvement) {
this.mouvement = mouvement;
}
 
public List<AssociationAnalytique> getAssociationsAnalytiques() {
return this.associations;
}
 
public void addAssociationAnalytique(AssociationAnalytique a) {
if (this.associations == null) {
this.associations = new ArrayList<>();
}
a.setEcriture(this);
this.associations.add(a);
}
 
public void removeAssociationAnalytique(AssociationAnalytique a) {
if (this.associations == null) {
a.setEcriture(null);
return;
}
this.associations.remove(a);
a.setEcriture(null);
if (this.associations.isEmpty()) {
this.associations = null;
}
}
 
public boolean hasAnalytique() {
return this.associations != null;
}
 
public void putCookie(String key, Object value) {
if (this.cookies == null) {
this.cookies = new HashMap<>();
}
this.cookies.put(key, value);
}
 
public Object getCookie(String key) {
return this.cookies.get(key);
}
 
@Override
public String toString() {
return "Ecriture : " + this.nom + ", Compte (id:" + this.compteID + ") " + this.compteNumero + " " + this.compteNom + ", Débit : " + this.debit + ", Crédit:" + this.credit;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationReglementVenteNG.java
392,7 → 392,12
}
}
 
this.putValue("ID_JOURNAL", JournalSQLElement.BANQUES);
int idJournal = JournalSQLElement.BANQUES;
if (rowPrefsCompte.getObject("ID_JOURNAL_VALEUR_ENCAISSEMENT") != null && !rowPrefsCompte.isForeignEmpty("ID_JOURNAL_VALEUR_ENCAISSEMENT")) {
idJournal = rowPrefsCompte.getForeignID("ID_JOURNAL_VALEUR_ENCAISSEMENT");
}
this.putValue("ID_JOURNAL", idJournal);
this.putValue("ID_COMPTE_PCE", idCompteClient);
this.putValue("DEBIT", Long.valueOf(0));
this.putValue("CREDIT", Long.valueOf(ttc.getLongValue()));
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtFactureFournisseur.java
166,6 → 166,10
}
}
this.putValue("ID_COMPTE_PCE", new Integer(idCompteFourn));
if (rowFournisseur.getTable().getTable("ECRITURE").contains("CODE_CLIENT")) {
this.putValue("CODE_CLIENT", rowFournisseur.getString("CODE"));
}
 
this.putValue("DEBIT", new Long(0));
if (rowFournisseur.getBoolean("UE")) {
this.putValue("CREDIT", new Long(htLongValue));
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtDepotChequeClient.java
93,7 → 93,7
 
List<Integer> pieceIDs = new ArrayList<Integer>();
SQLRowValues rowValsDepotElt = new SQLRowValues(depot.getTable().getTable("DEPOT_CHEQUE_ELEMENT"));
rowValsDepotElt.putNulls("MONTANT", "TIERS");
rowValsDepotElt.putNulls("MONTANT", "TIERS", "PIECE");
rowValsDepotElt.putRowValues("ID_CLIENT").putNulls("NOM", "ID_COMPTE_PCE");
final SQLRowValues rowValuesChq = rowValsDepotElt.putRowValues("ID_CHEQUE_A_ENCAISSER");
rowValuesChq.putNulls("SANS_VALEUR_ENCAISSEMENT").putRowValues("ID_MOUVEMENT").putNulls("ID_PIECE");
102,7 → 102,7
for (SQLRowValues sqlRowAccessor : cheques) {
final SQLRowAccessor clientRow = sqlRowAccessor.getForeign("ID_CLIENT");
// this.nom = this.nom + " " + StringUtils.limitLength(clientRow.getString("NOM"), 20);
this.putValue("NOM", this.nom + " " + StringUtils.limitLength(clientRow.getString("NOM"), 20));
this.putValue("NOM", this.nom + " " + sqlRowAccessor.getString("PIECE") + " " + StringUtils.limitLength(clientRow.getString("NOM"), 20));
SQLRowAccessor chequeRow = sqlRowAccessor.getForeign("ID_CHEQUE_A_ENCAISSER");
pieceIDs.add(chequeRow.getForeign("ID_MOUVEMENT").getForeignID("ID_PIECE"));
// compte Clients
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/Piece.java
New file
0,0 → 1,58
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationEcritures;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLInsert;
 
import java.util.ArrayList;
import java.util.List;
 
public class Piece {
private String nom;
private List<Mouvement> mouvements = new ArrayList<>();
private Number id;
 
public Piece(String nom) {
this.nom = nom;
}
 
public String getNom() {
return nom;
}
 
public void add(Mouvement mouvement) {
this.mouvements.add(mouvement);
mouvement.setPiece(this);
}
 
public List<Mouvement> getMouvements() {
return mouvements;
}
 
public SQLInsert createInsert(final DBRoot root) {
final SQLInsert insert = new SQLInsert();
insert.add(root.getTable("PIECE").getField("NOM"), this.nom);
return insert;
}
 
public Number getId() {
return this.id;
}
 
public void setId(Number id) {
this.id = id;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/Exercice.java
New file
0,0 → 1,517
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationEcritures;
 
import org.openconcerto.sql.element.SQLElementDirectory;
import org.openconcerto.sql.model.ConnectionHandlerNoSetup;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.DBSystemRoot;
import org.openconcerto.sql.model.SQLDataSource;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLInsert;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.SQLUpdate;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.User;
import org.openconcerto.sql.utils.SQLUtils;
import org.openconcerto.utils.CollectionUtils;
import org.openconcerto.utils.cc.ITransformer;
 
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
 
import org.apache.commons.dbutils.ResultSetHandler;
 
public class Exercice {
private Date debut;
private Date fin;
private static final Logger LOGGER = Logger.getLogger(Exercice.class.getName());
 
public Exercice() {
 
}
 
public Exercice(Date debut, Date fin) {
if (debut != null && debut.after(fin)) {
throw new IllegalArgumentException("date de fin invalide");
}
this.debut = debut;
this.fin = fin;
}
 
public String toString() {
return "Exercice " + this.debut + " -> " + this.fin;
}
 
public void insert(SQLElementDirectory directory, final DBRoot root, User user, List<Piece> pieces) throws SQLException {
final DBSystemRoot sysRoot = root.getDBSystemRoot();
final List<SQLInsert> insertsPiece = new ArrayList<>();
LOGGER.log(Level.INFO, "insertion de {0} pièces comptables", pieces.size());
for (Piece p : pieces) {
// Pièces
insertsPiece.add(p.createInsert(root));
 
// Vérification des mouvements
final List<Mouvement> mouvements = p.getMouvements();
if (mouvements.isEmpty()) {
throw new IllegalStateException("Piece vide : " + p);
}
 
for (Mouvement m : mouvements) {
if (!m.isBalanced()) {
throw new IllegalStateException("Mouvement non balancé : " + m);
}
if (m.isEmpty()) {
throw new IllegalStateException("Mouvement vide : " + m);
}
 
for (Ecriture e : m.getEcritures()) {
if (this.debut != null && e.getDate().before(this.debut)) {
throw new IllegalStateException("Mouvement invalide : " + m + " : une écriture est définie avant la date de début d'exercice : " + e);
}
if (e.getNom() == null) {
throw new IllegalStateException("Ecriture sans nom : " + e);
}
}
 
if (this.fin != null) {
for (Ecriture e : m.getEcritures()) {
if (e.getDate().after(this.fin)) {
throw new IllegalStateException("Mouvement invalide : " + m + " : une écriture est définie après la date de fin d'exercice : " + e.getDate() + ">" + this.fin);
}
 
}
}
 
}
}
 
SQLUtils.executeAtomic(sysRoot.getDataSource(), new ConnectionHandlerNoSetup<Object, SQLException>() {
@Override
public Object handle(SQLDataSource ds) throws SQLException {
// Insertion des journaux et comptes manquants et remplissage des champs journaux et
// comptes des
// écritures depuis les ids
final Set<Journal> journauxACreerOuFetcher = new HashSet<>();
final Set<Number> journauxAresoudre = new HashSet<>();
final Set<Compte> comptesACreerOuFetcher = new HashSet<>();
final Set<Number> comptesAresoudre = new HashSet<>();
final List<Ecriture> ecrituresSansJournalID = new LinkedList<>();
final List<Ecriture> ecrituresSansCompteID = new LinkedList<>();
for (Piece p : pieces) {
for (Mouvement m : p.getMouvements()) {
for (Ecriture e : m.getEcritures()) {
if (e.getJournalID() == null) {
// Journal à creer
journauxACreerOuFetcher.add(new Journal(null, e.getJournalCode(), e.getJournalNom()));
ecrituresSansJournalID.add(e);
} else {
journauxAresoudre.add(e.getJournalID());
}
if (e.getCompteID() == null) {
// Compte à creer
comptesACreerOuFetcher.add(new Compte(null, e.getCompteNumero(), e.getCompteNom()));
ecrituresSansCompteID.add(e);
} else {
comptesAresoudre.add(e.getJournalID());
}
}
 
}
}
final Map<Long, Journal> mapJournaux = new HashMap<>();
if (!journauxACreerOuFetcher.isEmpty()) {
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine(journauxACreerOuFetcher.size() + " journaux à créer : " + journauxACreerOuFetcher);
}
// On récupère tous les journaux car il y en a peu
final Map<String, Journal> codesDesJournauxExistants = getCodesJournaux(root);
 
final List<SQLInsert> insertsJournaux = new ArrayList<>();
final List<Journal> list = new ArrayList<>();
for (Journal journal : journauxACreerOuFetcher) {
// journal non déjà existant
if (codesDesJournauxExistants.get(journal.getCode().toLowerCase()) == null) {
list.add(journal);
insertsJournaux.add(journal.createInsert(root));
}
}
final List<Number> journauxIds = new ArrayList<>();
if (!insertsJournaux.isEmpty()) {
journauxIds.addAll(SQLInsert.executeSimilarInserts(sysRoot, insertsJournaux, true));
journauxAresoudre.addAll(journauxIds);
}
// Mise à jour de l'ID du journal pour les écritures dont le journal vient
// d'être créé
final int size = list.size();
for (int i = 0; i < size; i++) {
final String journalCode = list.get(i).getCode();
final Number journalID = journauxIds.get(i);
final Iterator<Ecriture> it = ecrituresSansJournalID.iterator();
while (it.hasNext()) {
final Ecriture e = it.next();
 
if (e.getJournalCode().equalsIgnoreCase(journalCode)) {
e.setJournalID(journalID);
it.remove();
}
 
}
}
final Iterator<Ecriture> it = ecrituresSansJournalID.iterator();
while (it.hasNext()) {
final Ecriture e = it.next();
final Journal journal = codesDesJournauxExistants.get(e.getJournalCode().toLowerCase());
e.setJournalID(journal.getId());
it.remove();
}
for (Journal journal : codesDesJournauxExistants.values()) {
mapJournaux.put(journal.getId(), journal);
}
}
final Map<Long, Compte> mapComptes = new HashMap<>();
if (!comptesACreerOuFetcher.isEmpty()) {
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine(comptesACreerOuFetcher.size() + " comptes à créer ou fetcher: " + comptesACreerOuFetcher);
}
final Map<String, Compte> numerosDesComptesExistants = getNumeroDesComptes(root, pieces);
 
final List<SQLInsert> insertsComptes = new ArrayList<>();
final List<Compte> list = new ArrayList<>();
for (Compte c : comptesACreerOuFetcher) {
if (numerosDesComptesExistants.get(c.getNumero().toLowerCase()) == null) {
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine("création du compte : " + c.getNumero().toLowerCase());
}
list.add(c);
insertsComptes.add(c.createInsert(root));
}
}
List<Number> comptesIds = new ArrayList<>();
if (!insertsComptes.isEmpty()) {
 
final List<Number> insertedIDs = SQLInsert.executeSimilarInserts(sysRoot, insertsComptes, true);
comptesIds.addAll(insertedIDs);
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine("IDs des comptes créés : " + comptesIds);
}
 
comptesAresoudre.addAll(comptesIds);
}
 
// Mise à jour de l'ID du compte pour les écritures dont le compte vient
// d'être créé
final int size = list.size();
for (int i = 0; i < size; i++) {
final String compteCode = list.get(i).getNumero();
final Number compteID = comptesIds.get(i);
final Iterator<Ecriture> it = ecrituresSansCompteID.iterator();
while (it.hasNext()) {
final Ecriture e = it.next();
if (e.getCompteNumero().equalsIgnoreCase(compteCode)) {
if (LOGGER.isLoggable(Level.FINEST)) {
LOGGER.finest("mise à jour de l'écriture " + e + " avec le compte d'ID " + compteID);
}
e.setCompteID(compteID);
it.remove();
}
}
 
}
final Iterator<Ecriture> it = ecrituresSansCompteID.iterator();
while (it.hasNext()) {
final Ecriture e = it.next();
Compte compte = numerosDesComptesExistants.get(e.getCompteNumero().toLowerCase());
if (compte != null) {
e.setCompteID(compte.getId());
it.remove();
}
 
}
for (Compte compte : numerosDesComptesExistants.values()) {
mapComptes.put(compte.getId(), compte);
}
 
}
 
// fetch journaux et comptes, update des code/numéro et nom
final List<String> queries = new ArrayList<>();
final List<ResultSetHandler> handlers = new ArrayList<>();
 
if (!comptesAresoudre.isEmpty()) {
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine(comptesAresoudre.size() + " comptes à résoudre : ids " + comptesAresoudre);
}
final SQLTable tableCompte = root.getTable("COMPTE_PCE");
final SQLSelect selCompte = new SQLSelect();
selCompte.addSelect(tableCompte.getKey());
selCompte.addSelect(tableCompte.getField("NUMERO"));
selCompte.addSelect(tableCompte.getField("NOM"));
selCompte.setWhere(new Where(tableCompte.getKey(), comptesAresoudre));
queries.add(selCompte.asString());
handlers.add(new ResultSetHandler() {
 
@Override
public Object handle(ResultSet rs) throws SQLException {
while (rs.next()) {
final Long id = rs.getLong(1);
final String numero = rs.getString(2);
final String nom = rs.getString(3);
mapComptes.put(id, new Compte(id, numero, nom));
 
}
return null;
}
});
}
if (!journauxAresoudre.isEmpty()) {
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine(journauxAresoudre.size() + " journaux à résoudre ids : " + journauxAresoudre);
}
final SQLTable tableJournal = root.getTable("JOURNAL");
final SQLSelect selJournal = new SQLSelect();
selJournal.addSelect(tableJournal.getKey());
selJournal.addSelect(tableJournal.getField("CODE"));
selJournal.addSelect(tableJournal.getField("NOM"));
selJournal.setWhere(new Where(tableJournal.getKey(), journauxAresoudre));
queries.add(selJournal.asString());
handlers.add(new ResultSetHandler() {
 
@Override
public Object handle(ResultSet rs) throws SQLException {
while (rs.next()) {
final Long id = rs.getLong(1);
final String code = rs.getString(2);
final String nom = rs.getString(3);
mapJournaux.put(id, new Journal(id, code, nom));
 
}
return null;
}
});
 
}
 
SQLUtils.executeMultiple(sysRoot, queries, handlers);
for (Piece p : pieces) {
for (Mouvement m : p.getMouvements()) {
for (Ecriture e : m.getEcritures()) {
Number compteID = e.getCompteID();
if (compteID == null) {
throw new IllegalStateException("pas d'ID compte dans l'écriture " + e);
}
final Long idCompte = compteID.longValue();
final Compte c = mapComptes.get(idCompte);
if (c == null) {
throw new IllegalStateException("pas de compte d'ID " + idCompte + " dans la map " + mapComptes.keySet());
}
e.setCompte(c.getNumero(), c.getNom());
 
final Long idJournal = e.getJournalID().longValue();
final Journal j = mapJournaux.get(idJournal);
if (j == null) {
throw new IllegalStateException("pas de journal d'ID " + idJournal + " dans la map " + mapJournaux.keySet());
}
e.setJournal(j.getCode(), j.getNom());
 
}
}
}
 
// Insertion des pieces
final List<Number> idsPieces = SQLInsert.executeSimilarInserts(sysRoot, insertsPiece, true);
 
// Creation des inserts des mouvements
final List<SQLInsert> insertsMouvement = new ArrayList<>(insertsPiece.size() * 3);
final List<Mouvement> listMvtWithoutIDs = new ArrayList<>(insertsPiece.size() * 3);
for (int i = 0; i < pieces.size(); i++) {
Piece piece = pieces.get(i);
piece.setId(idsPieces.get(i));
for (Mouvement m : piece.getMouvements()) {
listMvtWithoutIDs.add(m);
insertsMouvement.add(m.createInsert(root));
}
}
 
// Insertion des mouvements
final List<Number> idsMouvements = SQLInsert.executeSimilarInserts(sysRoot, insertsMouvement, true);
 
// Mise à jour des numeros de mouvements
SQLSelect sel = new SQLSelect();
final SQLTable tableMvt = root.getTable("MOUVEMENT");
sel.addSelect(tableMvt.getField("NUMERO"), "MAX");
Number maxMvtNumber = (Number) sysRoot.getDataSource().executeScalar(sel.asString());
int maxMvt = 1;
if (maxMvtNumber != null) {
maxMvt = maxMvtNumber.intValue();
}
List<SQLUpdate> mvtUpdate = new ArrayList<>();
for (int i = 0; i < idsMouvements.size(); i++) {
Number mvtId = idsMouvements.get(i);
SQLUpdate update = new SQLUpdate(new Where(tableMvt.getKey(), "=", mvtId));
update.add(tableMvt.getField("NUMERO"), maxMvt);
mvtUpdate.add(update);
maxMvt++;
listMvtWithoutIDs.get(i).setId(mvtId);
}
 
SQLUpdate.executeMultipleWithBatch(sysRoot, mvtUpdate);
 
// Creation des inserts des écritures sans analytique
final List<SQLInsert> insertsEcrituresSansAnalytique = new ArrayList<>(insertsMouvement.size() * 2);
final List<SQLInsert> insertsEcrituresAvecAnalytique = new ArrayList<>(insertsMouvement.size() * 2);
final List<Ecriture> ecrituresAvecAnalytique = new ArrayList<>(insertsEcrituresAvecAnalytique.size());
for (Piece p : pieces) {
final List<Mouvement> mouvements = p.getMouvements();
final int stop = mouvements.size();
for (int i = 0; i < stop; i++) {
final Mouvement m = mouvements.get(i);
for (Ecriture e : m.getEcritures()) {
if (e.hasAnalytique()) {
insertsEcrituresAvecAnalytique.add(e.createInsert(root, user));
ecrituresAvecAnalytique.add(e);
} else {
insertsEcrituresSansAnalytique.add(e.createInsert(root, user));
}
}
 
}
}
// Insertions des écritures des mouvements
SQLInsert.executeSimilarInserts(sysRoot, insertsEcrituresSansAnalytique, false);
// Insertions des écritures avec analytique
if (!ecrituresAvecAnalytique.isEmpty()) {
final List<Number> idsEcritues = SQLInsert.executeSimilarInserts(sysRoot, insertsEcrituresAvecAnalytique, true);
// Analytique
final List<SQLInsert> insertsAssociationAnalytique = new ArrayList<>(insertsEcrituresAvecAnalytique.size());
final int size = ecrituresAvecAnalytique.size();
for (int i = 0; i < size; i++) {
final Ecriture e = ecrituresAvecAnalytique.get(i);
e.setId(idsEcritues.get(i));
for (AssociationAnalytique a : e.getAssociationsAnalytiques()) {
insertsAssociationAnalytique.add(a.createInsert(root, user));
}
}
SQLInsert.executeSimilarInserts(sysRoot, insertsAssociationAnalytique, false);
}
for (Piece p : pieces) {
final List<Mouvement> mouvements = p.getMouvements();
for (Mouvement m : mouvements) {
if (m.getPostInsertionAction() != null) {
m.getPostInsertionAction().afterInsert(m);
}
}
 
}
 
return null;
}
});
 
}
 
/**
* Map des numero de compte en minuscule <-> Compte
*
* @param pieces pièces servant à déterminer sur quels numéros de compte on limite la requête
*/
protected Map<String, Compte> getNumeroDesComptes(DBRoot root, List<Piece> pieces) {
// tous les comptes dont le numero
// est parmis celles des écritures des pièces
final Set<String> numerosDesComptes = new HashSet<>();
for (Piece p : pieces) {
final List<Mouvement> mouvements = p.getMouvements();
for (Mouvement m : mouvements) {
for (Ecriture e : m.getEcritures()) {
numerosDesComptes.add(e.getCompteNumero().toLowerCase());
}
}
}
 
final Map<String, Compte> result = new HashMap<>();
final SQLTable tableCompte = root.getTable("COMPTE_PCE");
final SQLSelect selCompte = new SQLSelect();
selCompte.addSelect(tableCompte.getKey());
final SQLField fNumero = tableCompte.getField("NUMERO");
selCompte.addSelect(fNumero);
selCompte.addSelect(tableCompte.getField("NOM"));
String numeros = CollectionUtils.join(numerosDesComptes, ",", new ITransformer<Object, String>() {
@Override
public String transformChecked(final Object input) {
return fNumero.getField().getType().toString(input);
}
});
final Where w = Where.createRaw("lower(" + fNumero.getFieldRef() + ") in (" + numeros + ")", fNumero);
selCompte.setWhere(w);
 
final ResultSetHandler resultSetHandler = new ResultSetHandler() {
 
@Override
public Object handle(ResultSet rs) throws SQLException {
while (rs.next()) {
final Long id = rs.getLong(1);
final String numero = rs.getString(2);
final String nom = rs.getString(3);
result.put(numero.toLowerCase(), new Compte(id, numero, nom));
}
return null;
}
};
 
root.getDBSystemRoot().getDataSource().execute(selCompte.asString(), resultSetHandler);
return result;
}
 
/**
* Map des codes en minuscule <-> Journal
*/
protected Map<String, Journal> getCodesJournaux(DBRoot root) {
final Map<String, Journal> result = new HashMap<>();
final SQLTable tableJournal = root.getTable("JOURNAL");
final SQLSelect selJournal = new SQLSelect();
selJournal.addSelect(tableJournal.getKey());
selJournal.addSelect(tableJournal.getField("CODE"));
selJournal.addSelect(tableJournal.getField("NOM"));
 
final ResultSetHandler resultSetHandler = new ResultSetHandler() {
 
@Override
public Object handle(ResultSet rs) throws SQLException {
while (rs.next()) {
final Long id = rs.getLong(1);
final String code = rs.getString(2);
final String nom = rs.getString(3);
result.put(code.toLowerCase(), new Journal(id, code, nom));
}
return null;
}
};
 
root.getDBSystemRoot().getDataSource().execute(selJournal.asString(), resultSetHandler);
return result;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/Compte.java
New file
0,0 → 1,69
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationEcritures;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLInsert;
import org.openconcerto.sql.model.SQLTable;
 
public class Compte {
private final Long id;
private String numero;
private String nom;
 
public Compte(Long id, String numero, String nom) {
this.id = id;
this.numero = numero;
this.nom = nom;
}
 
public Long getId() {
return this.id;
}
 
public String getNumero() {
return this.numero;
}
 
public String getNom() {
return this.nom;
}
 
@Override
public int hashCode() {
return this.numero.hashCode();
}
 
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (this.getClass() != obj.getClass())
return false;
return ((Compte) obj).numero.equalsIgnoreCase(this.numero);
}
 
SQLInsert createInsert(DBRoot root) {
final SQLInsert insert = new SQLInsert();
final SQLTable table = root.getTable("COMPTE_PCE");
insert.add(table.getField("NUMERO"), this.numero);
insert.add(table.getField("NOM"), this.nom);
return insert;
}
 
@Override
public String toString() {
return "Compte numero:" + this.numero + " " + this.nom + " (id:" + this.id + ")";
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/ContactSQLElement.java
File deleted
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/ClientNormalSQLElement.java
22,14 → 22,19
import org.openconcerto.ql.QLPrinter;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.model.FieldPath;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.sql.request.ListSQLRequest;
import org.openconcerto.sql.view.list.BaseSQLTableModelColumn;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.sql.view.list.SQLTableModelSource;
import org.openconcerto.ui.EmailComposer;
import org.openconcerto.utils.CollectionUtils;
import org.openconcerto.utils.ExceptionHandler;
 
import java.awt.Font;
37,6 → 42,7
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
 
import javax.swing.AbstractAction;
 
180,6 → 186,28
return l;
}
 
@Override
protected void _initTableSource(SQLTableModelSource res) {
super._initTableSource(res);
 
res.getColumns().add(new BaseSQLTableModelColumn(getDirectory().getTranslator().getLabelFor(getTable().getField("CATEGORIES")), String.class) {
 
@Override
protected Object show_(SQLRowAccessor r) {
 
return r.getString("CATEGORIES");
}
 
@Override
public Set<FieldPath> getPaths() {
Path p = new Path(getTable());
return CollectionUtils.createSet(new FieldPath(p, "CATEGORIES"));
 
}
});
 
}
 
/*
* (non-Javadoc)
*
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/ComptaContactSQLElement.java
New file
0,0 → 1,63
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.customer.element;
 
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
 
import java.awt.event.ActionEvent;
 
import javax.swing.AbstractAction;
 
public abstract class ComptaContactSQLElement extends ContactSQLElementBase {
 
static public class ContactFournisseurSQLElement extends ComptaContactSQLElement {
public ContactFournisseurSQLElement() {
super("CONTACT_FOURNISSEUR");
}
}
 
static public class ContactSalarieSQLElement extends ComptaContactSQLElement {
public ContactSalarieSQLElement() {
super("CONTACT_SALARIE");
}
}
 
static public class ContactAdministratifSQLElement extends ComptaContactSQLElement {
public ContactAdministratifSQLElement() {
super("CONTACT_ADMINISTRATIF");
}
}
 
static public class ContactSQLElement extends ComptaContactSQLElement {
public ContactSQLElement() {
super("CONTACT");
}
}
 
protected ComptaContactSQLElement(String tableName) {
super(tableName);
PredicateRowAction action = new PredicateRowAction(new AbstractAction() {
 
@Override
public void actionPerformed(ActionEvent e) {
sendMail(IListe.get(e).getSelectedRows());
 
}
}, true, "customerrelationship.customer.email.send");
action.setPredicate(IListeEvent.getNonEmptySelectionPredicate());
getRowActions().add(action);
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/CustomerSQLComponent.java
17,6 → 17,7
import org.openconcerto.erp.core.common.element.NumerotationAutoSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.ui.AdresseClientItemTable;
import org.openconcerto.erp.core.sales.product.element.ClientCodeArticleTable;
import org.openconcerto.erp.core.sales.product.ui.CustomerProductQtyPriceListTable;
import org.openconcerto.erp.preferences.ModeReglementDefautPrefPanel;
import org.openconcerto.erp.utils.TM;
import org.openconcerto.sql.Configuration;
75,6 → 76,7
private ContactItemTable table;
private ClientCodeArticleTable tableCustomProduct;
private AdresseClientItemTable adresseTable = new AdresseClientItemTable();
 
private SQLTable contactTable = Configuration.getInstance().getDirectory().getElement("CONTACT").getTable();
private final SQLTable tableNum = getTable().getBase().getTable("NUMEROTATION_AUTO");
private final JUniqueTextField code = new JUniqueTextField(20) {
88,6 → 90,7
}
};
 
private CustomerProductQtyPriceListTable clienTarifTable = new CustomerProductQtyPriceListTable();
private SQLRowValues defaultContactRowVals = new SQLRowValues(UndefinedRowValuesCache.getInstance().getDefaultRowValues(this.contactTable));
private JCheckBox checkAdrLivraison, checkAdrFacturation;
 
167,6 → 170,8
return this.table;
} else if (id.equals("customerrelationship.customer.customproduct")) {
return this.tableCustomProduct;
} else if (id.equals("customerrelationship.customer.customtarif")) {
return this.clienTarifTable;
} else if (id.equals("customerrelationship.customer.addresses")) {
return createAdressesComponent();
} else if (id.equals("NOM")) {
243,6 → 248,7
super.update();
final int selectedID = getSelectedID();
this.table.updateField("ID_CLIENT", selectedID);
this.clienTarifTable.updateField("ID_CLIENT", selectedID);
this.tableCustomProduct.updateField("ID_CLIENT", selectedID);
this.adresseTable.updateField("ID_CLIENT", selectedID);
}
254,6 → 260,7
this.checkAdrFacturation.setSelected(r == null || !r.getFields().contains("ID_ADRESSE_F") || r.isForeignEmpty("ID_ADRESSE_F"));
if (r != null) {
this.table.insertFrom("ID_CLIENT", r.asRowValues());
this.clienTarifTable.insertFrom("ID_CLIENT", r.asRowValues());
this.tableCustomProduct.insertFrom("ID_CLIENT", r.asRowValues());
this.adresseTable.insertFrom("ID_CLIENT", r.asRowValues());
}
294,6 → 301,7
id = super.insert(order);
this.table.updateField("ID_CLIENT", id);
this.tableCustomProduct.updateField("ID_CLIENT", id);
this.clienTarifTable.updateField("ID_CLIENT", id);
this.adresseTable.updateField("ID_CLIENT", id);
if (NumerotationAutoSQLElement.getNextNumero(getElement().getClass()).equalsIgnoreCase(this.code.getText().trim())) {
SQLRowValues rowVals = new SQLRowValues(this.tableNum);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/CustomerGroup.java
94,6 → 94,9
final Group gCustomProduct = new Group("customerrelationship.customer.customproduct", LayoutHints.DEFAULT_SEPARATED_GROUP_HINTS);
gCustomProduct.addItem("customerrelationship.customer.customproduct", new LayoutHints(true, true, true, true, true, true, true, true));
this.add(gCustomProduct);
final Group gCustomRemiseProduct = new Group("customerrelationship.customer.customtarif", LayoutHints.DEFAULT_SEPARATED_GROUP_HINTS);
gCustomRemiseProduct.addItem("customerrelationship.customer.customtarif", new LayoutHints(true, true, true, true, true, true, true, true));
this.add(gCustomRemiseProduct);
 
this.add(gState);
final Group gInfo = new Group("customerrelationship.customer.info", LayoutHints.DEFAULT_SEPARATED_GROUP_HINTS);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/report/ReportingCommercialPDF.java
New file
0,0 → 1,177
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.customer.report;
 
import java.awt.Color;
import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
 
import com.ibm.icu.text.SimpleDateFormat;
import com.lowagie.text.Document;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;
 
public class ReportingCommercialPDF {
 
private final List<ReportingCommercial> items;
 
public ReportingCommercialPDF(List<ReportingCommercial> items) {
this.items = new ArrayList<>(items);
Collections.sort(this.items, new Comparator<ReportingCommercial>() {
 
@Override
public int compare(ReportingCommercial o1, ReportingCommercial o2) {
return o2.getTotal().compareTo(o1.getTotal());
}
});
}
 
public static void main(String[] args) throws IOException {
final List<ReportingCommercial> list = new ArrayList<>();
final Calendar c = Calendar.getInstance();
final Date d1 = c.getTime();
c.add(Calendar.MONTH, 50);
final Date d2 = c.getTime();
for (int i = 0; i < 5; i++) {
ReportingCommercial r = new ReportingCommercial("commercial " + i, d1, d2);
for (int j = 0; j < i * 5; j++) {
final ReportingCommercialItem item = new ReportingCommercialItem("client " + j);
item.addCA(BigDecimal.valueOf(j * 12345.78f));
r.add(item);
}
list.add(r);
}
final File file = new File("out.pdf");
final ReportingCommercialPDF pdf = new ReportingCommercialPDF(list);
pdf.export(file);
Desktop.getDesktop().open(file);
}
 
public void export(File file) throws IOException {
try {
final Document document = new Document(PageSize.A4);
PdfWriter.getInstance(document, new FileOutputStream(file));
document.open();
// Formats
final SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
final DecimalFormat decimalFormat = new DecimalFormat("###,###,##0.00");
final DecimalFormatSymbols formatSymbols = decimalFormat.getDecimalFormatSymbols();
formatSymbols.setGroupingSeparator(' ');
formatSymbols.setDecimalSeparator(',');
decimalFormat.setDecimalFormatSymbols(formatSymbols);
// Fonts
final Font fontHeader = new Font(Font.HELVETICA, 11f, Font.BOLD);
fontHeader.setColor(Color.WHITE);
final Font normal = new Font(Font.HELVETICA, 10f, Font.NORMAL);
final Font fontTitle = new Font(Font.HELVETICA, 18f, Font.BOLD);
final Font fontInfo = new Font(Font.HELVETICA, 11f, Font.NORMAL);
// Colors
final Color backgroundColor = new Color(57, 115, 157);
final Color cellBackgroundColor = new Color(225, 236, 244);
 
for (ReportingCommercial reporting : this.items) {
 
final List<ReportingCommercialItem> rItems = new ArrayList<ReportingCommercialItem>(reporting.getItems());
Collections.sort(rItems, new Comparator<ReportingCommercialItem>() {
 
@Override
public int compare(ReportingCommercialItem o1, ReportingCommercialItem o2) {
return o2.getCa().compareTo(o1.getCa());
}
});
 
document.add(new Paragraph("Chiffre d'affaires", fontTitle));
document.add(new Paragraph("Commercial : " + reporting.getCommercial(), fontInfo));
document.add(new Paragraph("Période : du " + df.format(reporting.getDebut()) + " au " + df.format(reporting.getFin()), fontInfo));
 
if (rItems.isEmpty()) {
document.add(new Paragraph("\n"));
document.add(new Paragraph("\n"));
final Font fontInfo2 = new Font(Font.HELVETICA, 13f, Font.ITALIC);
fontInfo2.setColor(Color.GRAY);
document.add(new Paragraph("Aucune donnée.", fontInfo2));
} else {
document.add(new Paragraph("Total : " + decimalFormat.format(reporting.getTotal()) + " € HT", fontInfo));
document.add(new Paragraph("\n"));
final PdfPTable table = new PdfPTable(2);
table.setWidthPercentage(100);
table.setWidths(new float[] { 800f, 160f });
 
final PdfPCell c1 = new PdfPCell(new Phrase("Clients", fontHeader));
c1.setBackgroundColor(backgroundColor);
c1.setBorder(Rectangle.NO_BORDER);
c1.setHorizontalAlignment(Element.ALIGN_LEFT);
c1.setVerticalAlignment(Element.ALIGN_MIDDLE);
c1.setPaddingBottom(7);
c1.setPaddingLeft(6);
table.addCell(c1);
final PdfPCell c2 = new PdfPCell(new Phrase("C.A. H.T.", fontHeader));
c2.setBackgroundColor(backgroundColor);
c2.setBorder(Rectangle.NO_BORDER);
c2.setHorizontalAlignment(Element.ALIGN_CENTER);
c2.setVerticalAlignment(Element.ALIGN_MIDDLE);
c2.setPaddingBottom(7);
c2.setPaddingLeft(6);
table.addCell(c2);
table.setHeaderRows(1);
 
boolean pair = true;
for (ReportingCommercialItem rItem : rItems) {
final PdfPCell col1 = new PdfPCell(new Phrase(rItem.getClient(), normal));
col1.setBorder(Rectangle.NO_BORDER);
col1.setHorizontalAlignment(Element.ALIGN_LEFT);
col1.setVerticalAlignment(Element.ALIGN_CENTER);
col1.setPaddingBottom(5);
col1.setPaddingLeft(6);
final PdfPCell col2 = new PdfPCell(new Phrase(decimalFormat.format(rItem.getCa()), normal));
col2.setHorizontalAlignment(Element.ALIGN_RIGHT);
col2.setBorder(Rectangle.NO_BORDER);
// Alternance couleur
if (pair) {
col1.setBackgroundColor(cellBackgroundColor);
col2.setBackgroundColor(cellBackgroundColor);
}
table.addCell(col1);
table.addCell(col2);
pair = !pair;
}
document.add(table);
}
document.newPage();
}
document.close();
} catch (Exception e) {
throw new IOException(e);
}
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/report/ReportingCommercialItem.java
New file
0,0 → 1,39
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.customer.report;
 
import java.math.BigDecimal;
 
public class ReportingCommercialItem {
private String client;
private BigDecimal ca;
 
public ReportingCommercialItem(String client) {
this.client = client;
this.ca = BigDecimal.ZERO;
}
 
public void addCA(BigDecimal c) {
this.ca = this.ca.add(c);
}
 
public String getClient() {
return this.client;
}
 
public BigDecimal getCa() {
return this.ca;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/report/ReportingCommercial.java
New file
0,0 → 1,73
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.customer.report;
 
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
 
public class ReportingCommercial {
 
private String commercial;
private Date debut;
private Date fin;
private Map<String, ReportingCommercialItem> items = new HashMap<>();
 
public ReportingCommercial(String commercial, Date debut, Date fin) {
this.commercial = commercial;
this.debut = debut;
this.fin = fin;
}
 
public BigDecimal getTotal() {
BigDecimal total = BigDecimal.ZERO;
for (ReportingCommercialItem item : this.items.values()) {
total = total.add(item.getCa());
}
return total;
}
 
public void add(ReportingCommercialItem item) {
this.items.put(item.getClient(), item);
}
 
public void add(String client, BigDecimal ht) {
if (this.items.containsKey(client)) {
this.items.get(client).addCA(ht);
} else {
ReportingCommercialItem reportingCommercialItem = new ReportingCommercialItem(client);
reportingCommercialItem.addCA(ht);
this.items.put(client, reportingCommercialItem);
}
}
 
public Collection<ReportingCommercialItem> getItems() {
return this.items.values();
}
 
public String getCommercial() {
return this.commercial;
}
 
public Date getDebut() {
return this.debut;
}
 
public Date getFin() {
return this.fin;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/report/ReportingCommercialCreator.java
New file
0,0 → 1,111
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.customer.report;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.utils.cc.ITransformer;
 
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class ReportingCommercialCreator {
 
final private Date deb, fin;
final private DBRoot root;
 
public ReportingCommercialCreator(Date deb, Date fin, DBRoot root) {
this.deb = deb;
this.fin = fin;
this.root = root;
}
 
public Collection<ReportingCommercial> getValues() {
 
// Facture
final SQLTable tableFacture = this.root.getTable("SAISIE_VENTE_FACTURE");
SQLRowValues rowValues = new SQLRowValues(tableFacture);
rowValues.putRowValues("ID_COMMERCIAL").putNulls("PRENOM", "NOM");
rowValues.putRowValues("ID_CLIENT").putNulls("CODE", "NOM");
rowValues.putNulls("T_HT", "T_TTC");
 
SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(rowValues);
fetcher.setSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
 
@Override
public SQLSelect transformChecked(SQLSelect input) {
Where w = new Where(tableFacture.getField("DATE"), deb, fin);
input.setWhere(w);
return input;
}
});
 
Map<Integer, ReportingCommercial> mapCommercial = new HashMap<>();
List<SQLRowValues> result = fetcher.fetch();
for (SQLRowValues sqlRowValues : result) {
int commercialID = sqlRowValues.getForeignID("ID_COMMERCIAL");
if (!mapCommercial.containsKey(commercialID)) {
SQLRowAccessor commercialRow = sqlRowValues.getForeign("ID_COMMERCIAL");
mapCommercial.put(commercialID, new ReportingCommercial(commercialRow.getString("PRENOM") + " " + commercialRow.getString("NOM"), deb, fin));
}
 
ReportingCommercial r = mapCommercial.get(commercialID);
BigDecimal bigDecimal = new BigDecimal(sqlRowValues.getLong("T_HT")).movePointLeft(2);
r.add(sqlRowValues.getForeign("ID_CLIENT").getString("NOM"), bigDecimal);
}
 
// Avoir
final SQLTable tableAvoir = this.root.getTable("AVOIR_CLIENT");
SQLRowValues rowValuesAvoir = new SQLRowValues(tableAvoir);
rowValuesAvoir.putRowValues("ID_COMMERCIAL").putNulls("PRENOM", "NOM");
rowValuesAvoir.putRowValues("ID_CLIENT").putNulls("CODE", "NOM");
rowValuesAvoir.putNulls("MONTANT_HT", "MONTANT_TTC");
 
SQLRowValuesListFetcher fetcherAvoir = SQLRowValuesListFetcher.create(rowValuesAvoir);
fetcherAvoir.setSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
 
@Override
public SQLSelect transformChecked(SQLSelect input) {
Where w = new Where(tableAvoir.getField("DATE"), deb, fin);
input.setWhere(w);
return input;
}
});
 
List<SQLRowValues> resultA = fetcherAvoir.fetch();
for (SQLRowValues sqlRowValues : resultA) {
int commercialID = sqlRowValues.getForeignID("ID_COMMERCIAL");
if (!mapCommercial.containsKey(commercialID)) {
SQLRowAccessor commercialRow = sqlRowValues.getForeign("ID_COMMERCIAL");
mapCommercial.put(commercialID, new ReportingCommercial(commercialRow.getString("PRENOM") + " " + commercialRow.getString("NOM"), deb, fin));
}
 
ReportingCommercial r = mapCommercial.get(commercialID);
BigDecimal bigDecimal = new BigDecimal(sqlRowValues.getLong("MONTANT_HT")).movePointLeft(2).negate();
r.add(sqlRowValues.getForeign("ID_CLIENT").getString("NOM"), bigDecimal);
}
 
return mapCommercial.values();
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/report/ReportingCommercialPanel.java
New file
0,0 → 1,125
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
/*
* Créé le 23 avr. 2012
*/
package org.openconcerto.erp.core.customerrelationship.customer.report;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JDate;
import org.openconcerto.utils.ExceptionHandler;
 
import java.awt.Desktop;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
 
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
 
public class ReportingCommercialPanel extends JPanel {
 
public ReportingCommercialPanel(final DBRoot root) {
super(new GridBagLayout());
 
JLabel labelCom = new JLabel("Période du ");
 
GridBagConstraints c = new DefaultGridBagConstraints();
this.add(labelCom, c);
c.gridx++;
final JDate dateDeb = new JDate();
this.add(dateDeb, c);
c.gridx++;
JLabel labelYear = new JLabel("au");
final JDate dateFin = new JDate();
 
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
dateDeb.setValue(cal.getTime());
 
this.add(labelYear, c);
c.gridx++;
this.add(dateFin, c);
cal.set(Calendar.MONTH, Calendar.DECEMBER);
cal.set(Calendar.DAY_OF_MONTH, 31);
dateFin.setValue(cal.getTime());
 
final JButton buttonValid = new JButton(new AbstractAction("Valider") {
 
@Override
public void actionPerformed(ActionEvent e) {
 
new Thread() {
public void run() {
ReportingCommercialCreator creator = new ReportingCommercialCreator(dateDeb.getValue(), dateFin.getValue(), root);
 
List<ReportingCommercial> list = new ArrayList<>(creator.getValues());
ReportingCommercialPDF reporting = new ReportingCommercialPDF(list);
File file;
try {
file = File.createTempFile("ReportingCommerical", ".pdf");
reporting.export(file);
Desktop.getDesktop().open(file);
} catch (IOException e) {
ExceptionHandler.handle("Erreur lors de la cration du fichier", e);
}
SwingUtilities.invokeLater(new Runnable() {
 
@Override
public void run() {
Frame frame = (Frame) SwingUtilities.getRoot(ReportingCommercialPanel.this);
if (frame != null) {
frame.dispose();
}
}
});
};
}.start();
 
}
 
});
c.gridx++;
// buttonValid.setEnabled(false);
this.add(buttonValid, c);
dateDeb.addValueListener(new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
buttonValid.setEnabled(dateDeb.getValue() != null && dateFin.getValue() != null);
}
});
dateFin.addValueListener(new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
buttonValid.setEnabled(dateDeb.getValue() != null && dateFin.getValue() != null);
}
});
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/action/ListeDesContactsAction.java
15,7 → 15,7
 
import org.openconcerto.erp.action.CreateIListFrameAbstractAction;
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.customerrelationship.customer.element.ContactSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ComptaContactSQLElement.ContactSQLElement;
 
public class ListeDesContactsAction extends CreateIListFrameAbstractAction<ContactSQLElement> {
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/action/ListeDesClientsAction.java
15,9 → 15,8
 
import org.openconcerto.erp.action.CreateIListFrameAbstractAction;
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.customerrelationship.customer.element.ClientNormalSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.CustomerSQLElement;
import org.openconcerto.erp.core.sales.invoice.ui.EcheanceRenderer;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.view.IListFrame;
26,10 → 25,12
 
import javax.swing.JTable;
 
public class ListeDesClientsAction extends CreateIListFrameAbstractAction<ClientNormalSQLElement> {
public class ListeDesClientsAction extends CreateIListFrameAbstractAction<SQLElement> {
 
public ListeDesClientsAction(final ComptaPropsConfiguration conf) {
super(conf, CustomerSQLElement.class);
// handle CustomerSQLElement/ClientSocieteSQLElement (or even a module replacing the
// default element)
super(conf, conf.getDirectory().getElement(conf.getRootSociete().getTable("CLIENT")));
}
 
@Override
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/ui/CategorieComptableChoiceUI.java
New file
0,0 → 1,67
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.customer.ui;
 
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.ui.DefaultGridBagConstraints;
 
import java.awt.GridBagConstraints;
 
import javax.swing.JLabel;
import javax.swing.SwingConstants;
 
public class CategorieComptableChoiceUI {
private ElementComboBox comboCatCompt;
 
public CategorieComptableChoiceUI() {
// TODO Auto-generated constructor stub
}
 
public void addToUI(BaseSQLComponent comp, GridBagConstraints c) {
// Adresse Facturation
c.gridx = 0;
c.gridy++;
c.gridwidth = 1;
final JLabel labelCat = new JLabel(comp.getLabelFor("ID_CATEGORIE_COMPTABLE"));
labelCat.setHorizontalAlignment(SwingConstants.RIGHT);
c.weightx = 0;
c.gridwidth = 1;
c.fill = GridBagConstraints.HORIZONTAL;
comp.add(labelCat, c);
 
this.comboCatCompt = new ElementComboBox();
this.comboCatCompt.setButtonsVisible(false);
 
c.gridx++;
c.gridwidth = 1;
c.weightx = 0;
c.weighty = 0;
c.fill = GridBagConstraints.NONE;
comp.add(this.comboCatCompt, c);
final SQLElement catComptableElement = comp.getElement().getForeignElement("ID_CATEGORIE_COMPTABLE");
this.comboCatCompt.init(catComptableElement, catComptableElement.getComboRequest(true));
DefaultGridBagConstraints.lockMinimumSize(this.comboCatCompt);
comp.addView(this.comboCatCompt, "ID_CATEGORIE_COMPTABLE");
this.comboCatCompt.setAddIconVisible(false);
 
}
 
public ElementComboBox getCombo() {
return this.comboCatCompt;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/mail/EmailTemplateSQLElement.java
New file
0,0 → 1,52
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.mail;
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.sql.element.GlobalMapper;
import org.openconcerto.sql.element.SQLComponent;
 
import java.util.Arrays;
import java.util.List;
 
public class EmailTemplateSQLElement extends ComptaSQLConfElement {
public static final String TABLE_NAME = "MODELE_EMAIL";
 
public EmailTemplateSQLElement() {
super(TABLE_NAME, "un modèle d'email", "modèles d'emails");
final EmailTemplateGroup group = new EmailTemplateGroup();
GlobalMapper.getInstance().map(EmailTemplateGroup.ID, group);
setDefaultGroup(group);
}
@Override
protected List<String> getListFields() {
return Arrays.asList("NOM", "PAR_DEFAUT");
}
 
@Override
protected List<String> getComboFields() {
return Arrays.asList("NOM");
}
 
@Override
protected SQLComponent createComponent() {
return new EmailTemplateSQLComponent(this);
}
 
@Override
protected String createCode() {
return "customerrelationship.mail.email.template";
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/mail/action/ListeDesModelesEmailAction.java
New file
0,0 → 1,35
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.mail.action;
 
import org.openconcerto.erp.action.CreateFrameAbstractAction;
import org.openconcerto.erp.core.customerrelationship.mail.EmailTemplateSQLElement;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.view.IListFrame;
import org.openconcerto.sql.view.ListeAddPanel;
 
import javax.swing.Action;
import javax.swing.JFrame;
 
public class ListeDesModelesEmailAction extends CreateFrameAbstractAction {
 
public ListeDesModelesEmailAction() {
super();
this.putValue(Action.NAME, "Liste des modèles d'email");
}
 
public JFrame createFrame() {
return new IListFrame(new ListeAddPanel(Configuration.getInstance().getDirectory().getElement(EmailTemplateSQLElement.TABLE_NAME)));
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/mail/EmailTemplateGroup.java
New file
0,0 → 1,30
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.mail;
 
import org.openconcerto.ui.group.Group;
import org.openconcerto.ui.group.LayoutHints;
 
public class EmailTemplateGroup extends Group {
public static final String ID = "customerrelationship.mail.email.template";
 
public EmailTemplateGroup() {
super(ID);
addItem("NOM");
addItem("TITRE", LayoutHints.DEFAULT_LARGE_FIELD_HINTS);
addItem("TEXTE", new LayoutHints(true, true, true, true, true, true, true));
addItem("FORMAT_DATE", new LayoutHints(false, false, true, true, false, false));
addItem("PAR_DEFAUT");
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/mail/ValueListener.java
New file
0,0 → 1,18
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.mail;
 
public interface ValueListener {
public void valueSelected(Object value);
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/mail/EmailTemplate.java
New file
0,0 → 1,170
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.mail;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
 
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
 
import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
 
import com.lowagie.text.Font;
 
public class EmailTemplate {
private String name;
private String title;
private String text;
private boolean isDefault;
private String dateFormat;
 
public EmailTemplate(String name, String title, String text, Boolean isDefault, String dateFormat) {
this.name = name;
this.title = title;
this.text = text;
this.isDefault = isDefault;
this.dateFormat = dateFormat;
}
 
public static List<EmailTemplate> getAll(DBRoot root) {
final List<EmailTemplate> result = new ArrayList<>();
final SQLSelect selF = new SQLSelect();
final SQLTable tFamilleArticle = root.getTable(EmailTemplateSQLElement.TABLE_NAME);
selF.addSelect(tFamilleArticle.getKey());
selF.addSelect(tFamilleArticle.getField("NOM"));
selF.addSelect(tFamilleArticle.getField("TITRE"));
selF.addSelect(tFamilleArticle.getField("TEXTE"));
selF.addSelect(tFamilleArticle.getField("PAR_DEFAUT"));
selF.addSelect(tFamilleArticle.getField("FORMAT_DATE"));
final List<SQLRow> lF = SQLRowListRSH.execute(selF);
for (SQLRow sqlRow : lF) {
result.add(new EmailTemplate(sqlRow.getString("NOM"), sqlRow.getString("TITRE"), sqlRow.getString("TEXTE"), sqlRow.getBoolean("PAR_DEFAUT"), sqlRow.getString("FORMAT_DATE")));
}
return result;
}
 
public String getName() {
return this.name;
}
 
public String getTitle() {
return this.title;
}
 
public String getText() {
return this.text;
}
 
public boolean isDefault() {
return this.isDefault;
}
 
public String getDateFormat() {
return this.dateFormat;
}
 
public static void askTemplate(JComponent parent, DBRoot root, ValueListener listener) {
if (!SwingUtilities.isEventDispatchThread()) {
throw new IllegalStateException("must be called from EDT");
}
List<EmailTemplate> templates = getAll(root);
if (templates.isEmpty()) {
listener.valueSelected(null);
return;
}
if (templates.size() == 1) {
listener.valueSelected(templates.get(0));
return;
}
Collections.sort(templates, new Comparator<EmailTemplate>() {
 
@Override
public int compare(EmailTemplate o1, EmailTemplate o2) {
return o1.getName().compareToIgnoreCase(o2.getName());
}
});
final JDialog dialog = new JDialog((Frame) SwingUtilities.getWindowAncestor(parent), "Modèle à utiliser", true);
final JList<EmailTemplate> list = new JList<>(templates.toArray(new EmailTemplate[0]));
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
for (int i = 0; i < templates.size(); i++) {
final EmailTemplate t = templates.get(i);
if (t.isDefault) {
list.setSelectedIndex(i);
break;
}
}
list.setFixedCellHeight((int) (new JLabel("t").getPreferredSize().height * 1.5));
 
list.setCellRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
EmailTemplate t = (EmailTemplate) value;
 
final JLabel l = (JLabel) super.getListCellRendererComponent(list, t.getName(), index, isSelected, cellHasFocus);
if (t.isDefault) {
l.setFont(l.getFont().deriveFont(Font.BOLD));
} else {
l.setFont(l.getFont().deriveFont(Font.NORMAL));
}
return l;
}
});
list.setMinimumSize(new Dimension(300, 200));
list.setPreferredSize(new Dimension(300, 200));
final Container contentPane = dialog.getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(list, BorderLayout.CENTER);
JPanel p = new JPanel();
p.setLayout(new FlowLayout(FlowLayout.RIGHT));
 
final JButton button = new JButton("Valider");
button.addActionListener(new ActionListener() {
 
@Override
public void actionPerformed(ActionEvent e) {
listener.valueSelected(list.getSelectedValue());
dialog.dispose();
}
});
p.add(button);
contentPane.add(p, BorderLayout.SOUTH);
dialog.pack();
dialog.setLocationRelativeTo(parent);
dialog.setVisible(true);
 
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/mail/EmailTemplateSQLComponent.java
New file
0,0 → 1,32
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.customerrelationship.mail;
 
import org.openconcerto.sql.element.GroupSQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRowValues;
 
public class EmailTemplateSQLComponent extends GroupSQLComponent {
 
public EmailTemplateSQLComponent(SQLElement element) {
super(element);
}
 
@Override
protected SQLRowValues createDefaults() {
final SQLRowValues defaultValues = super.createDefaults();
defaultValues.put("FORMAT_DATE", "dd/MM/yyyy");
return defaultValues;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/Map2033A.java
499,9 → 499,9
// 120 -SommeSolde( 100, 103* )-SommeSolde( 108, 109* )
// Racine = "101, 104, 108"
// S120=-10...101-108-104
long v120 = -this.sommeCompte.sommeCompteFils("101", this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("103", this.dateDebut, this.dateFin)
- this.sommeCompte.sommeCompteFils("108", this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("104", this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(109, 109, true, this.dateDebut, this.dateFin);
long v120 = -this.sommeCompte.sommeCompteFils("101", this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("102", this.dateDebut, this.dateFin)
- this.sommeCompte.sommeCompteFils("103", this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("108", this.dateDebut, this.dateFin)
- this.sommeCompte.sommeCompteFils("104", this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(109, 109, true, this.dateDebut, this.dateFin);
this.m.put("PASSIF3.15", GestionDevise.currencyToString(v120, false));
 
// 121
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/Map2033B.java
215,7 → 215,7
* VARIATION DE STOCK
******************************************************************************************/
// 240 SommeSolde( 6030, 6036* )
long v240 = this.sommeCompte.soldeCompte(6031, 6032, true, this.dateDeb, this.dateFin);
long v240 = this.sommeCompte.soldeCompte(6031, 6036, true, this.dateDeb, this.dateFin);
this.m.put("CHARGES3.11", GestionDevise.currencyToString(v240, false));
 
// 213
264,7 → 264,7
******************************************************************************************/
// 250 SommeSolde( 640, 644* )+SommeSolde( 648, 649* )
long v250 = this.sommeCompte.soldeCompte(644, 644, true, this.dateDeb, this.dateFin) + this.sommeCompte.soldeCompte(648, 649, true, this.dateDeb, this.dateFin)
+ this.sommeCompte.soldeCompte(641, 641, true, this.dateDeb, this.dateFin);
+ this.sommeCompte.soldeCompte(641, 641, true, this.dateDeb, this.dateFin)+ this.sommeCompte.soldeCompte(642, 642, true, this.dateDeb, this.dateFin);
this.m.put("CHARGES3.14", GestionDevise.currencyToString(v250, false));
 
// 220
352,7 → 352,7
* PRODUITS FINANCIERS
******************************************************************************************/
// 280 -SommeSolde( 760, 769* )-SommeSolde( 786, 786* )-SommeSolde( 796, 796* )
long v280 = -this.sommeCompte.soldeCompte(761, 768, true, this.dateDeb, this.dateFin) - this.sommeCompte.soldeCompte(786, 786, true, this.dateDeb, this.dateFin)
long v280 = -this.sommeCompte.soldeCompte(760, 768, true, this.dateDeb, this.dateFin) - this.sommeCompte.soldeCompte(786, 786, true, this.dateDeb, this.dateFin)
- this.sommeCompte.soldeCompte(796, 796, true, this.dateDeb, this.dateFin);
this.m.put("PCHARGES3.21", GestionDevise.currencyToString(v280, false));
 
369,7 → 369,7
* PRODUITS EXCEPTIONNELS
******************************************************************************************/
// 290 -SommeSolde( 77, 77* )-SommeSolde( 787, 789* )-SommeSolde( 797, 799* )
long v290 = -this.sommeCompte.soldeCompte(771, 772, true, this.dateDeb, this.dateFin) - this.sommeCompte.soldeCompte(775, 778, true, this.dateDeb, this.dateFin)
long v290 = -this.sommeCompte.soldeCompte(770, 772, true, this.dateDeb, this.dateFin) - this.sommeCompte.soldeCompte(775, 778, true, this.dateDeb, this.dateFin)
- this.sommeCompte.soldeCompte(787, 787, true, this.dateDeb, this.dateFin) - this.sommeCompte.soldeCompte(797, 797, true, this.dateDeb, this.dateFin);
this.m.put("PCHARGES3.22", GestionDevise.currencyToString(v290, false));
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/GrandLivreSheetXML.java
179,47 → 179,8
@Override
public SQLSelect transformChecked(SQLSelect sel) {
 
Where w = (new Where(tableEcriture.getField("DATE"), GrandLivreSheetXML.this.dateDu, GrandLivreSheetXML.this.dateAu));
Where w = getWhere(lCompteSolde);
 
if (GrandLivreSheetXML.this.compteDeb.equals(GrandLivreSheetXML.this.compteEnd)) {
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), "=", GrandLivreSheetXML.this.compteDeb));
} else {
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), (Object) GrandLivreSheetXML.this.compteDeb, (Object) GrandLivreSheetXML.this.compteEnd));
}
w = w.and(new Where(tableEcriture.getField("ID_JOURNAL"), "!=", idJrnlExclude));
w = w.and(new Where(tableEcriture.getField("ID_MOUVEMENT"), "=", tableMvt.getField("ID")));
 
if (GrandLivreSheetXML.this.lettrage == GrandLivreSheet.MODELETTREE) {
Object o = null;
w = w.and(new Where(tableEcriture.getField("LETTRAGE"), "<>", o));
w = w.and(new Where(tableEcriture.getField("LETTRAGE"), "!=", ""));
w = w.and(new Where(tableEcriture.getField("DATE_LETTRAGE"), "<=", GrandLivreSheetXML.this.dateAu));
} else if (GrandLivreSheetXML.this.lettrage == GrandLivreSheet.MODENONLETTREE_PERIODE) {
Object o = null;
Where w2 = new Where(tableEcriture.getField("LETTRAGE"), "=", o);
Where wSTTC = new Where(tableEcriture.getField("DATE_LETTRAGE"), "<>", o);
wSTTC = wSTTC.and(new Where(tableEcriture.getField("DATE_LETTRAGE"), ">", GrandLivreSheetXML.this.dateAu));
 
w2 = w2.or(wSTTC);
w = w.and(w2.or(new Where(tableEcriture.getField("LETTRAGE"), "=", "")));
} else if (GrandLivreSheetXML.this.lettrage == GrandLivreSheet.MODENONLETTREE_ALL) {
Object o = null;
Where w2 = new Where(tableEcriture.getField("LETTRAGE"), "=", o);
w = w.and(w2.or(new Where(tableEcriture.getField("LETTRAGE"), "=", "")));
}
 
if (GrandLivreSheetXML.this.excludeCompteSolde) {
System.err.println("Exclude compte");
 
w = w.and(new Where(tableEcriture.getField("ID_COMPTE_PCE"), lCompteSolde).not());
}
w = w.and(new Where(tableEcriture.getField("NOM"), "NOT LIKE", "Fermeture du compte%"));
 
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
 
sel.setWhere(w);
sel.addFieldOrder(tableEcriture.getField("COMPTE_NUMERO"));
sel.addFieldOrder(tableEcriture.getField("DATE"));
567,36 → 528,8
sel.addSelect(tableEcriture.getField("DEBIT"), "SUM");
sel.addSelect(tableEcriture.getField("CREDIT"), "SUM");
 
Where w;
if (this.compteDeb.equals(this.compteEnd)) {
w = new Where(tableCompte.getField("NUMERO"), "=", this.compteDeb);
} else {
w = new Where(tableCompte.getField("NUMERO"), (Object) this.compteDeb, (Object) this.compteEnd);
}
Where w = getWhere(null);
 
w = w.and(new Where(tableEcriture.getField("ID_COMPTE_PCE"), "=", tableCompte.getField("ID")));
 
if (this.cumul) {
w = w.and(new Where(tableEcriture.getField("DATE"), "<=", this.dateAu));
} else {
w = w.and(new Where(tableEcriture.getField("DATE"), this.dateDu, this.dateAu));
}
w = w.and(new Where(tableEcriture.getField("ID_JOURNAL"), "!=", idJrnlExclude));
if (this.lettrage == GrandLivreSheet.MODELETTREE) {
Object o = null;
w = w.and(new Where(tableEcriture.getField("LETTRAGE"), "<>", o));
w = w.and(new Where(tableEcriture.getField("LETTRAGE"), "!=", ""));
} else if (this.lettrage == GrandLivreSheet.MODENONLETTREE_ALL) {
Object o = null;
Where w2 = new Where(tableEcriture.getField("LETTRAGE"), "=", o);
w = w.and(w2.or(new Where(tableEcriture.getField("LETTRAGE"), "=", "")));
 
} else if (this.lettrage == GrandLivreSheet.MODENONLETTREE_PERIODE) {
Object o = null;
Where w2 = new Where(tableEcriture.getField("LETTRAGE"), "=", o);
w = w.and(w2.or(new Where(tableEcriture.getField("LETTRAGE"), "=", "")));
}
 
sel.setWhere(w);
 
String req = sel.asString() + " GROUP BY \"COMPTE_PCE\".\"ID\"";
623,6 → 556,52
return list;
}
 
private Where getWhere(final List<Integer> lCompteSolde) {
Where w = (new Where(tableEcriture.getField("DATE"), GrandLivreSheetXML.this.dateDu, GrandLivreSheetXML.this.dateAu));
 
if (GrandLivreSheetXML.this.compteDeb.equals(GrandLivreSheetXML.this.compteEnd)) {
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), "=", GrandLivreSheetXML.this.compteDeb));
} else {
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), (Object) GrandLivreSheetXML.this.compteDeb, (Object) GrandLivreSheetXML.this.compteEnd));
}
w = w.and(new Where(tableEcriture.getField("ID_JOURNAL"), "!=", idJrnlExclude));
w = w.and(new Where(tableEcriture.getField("ID_MOUVEMENT"), "=", tableMvt.getField("ID")));
 
if (GrandLivreSheetXML.this.lettrage == GrandLivreSheet.MODELETTREE) {
Object o = null;
w = w.and(new Where(tableEcriture.getField("LETTRAGE"), "<>", o));
w = w.and(new Where(tableEcriture.getField("LETTRAGE"), "!=", ""));
w = w.and(new Where(tableEcriture.getField("DATE_LETTRAGE"), "<=", GrandLivreSheetXML.this.dateAu));
} else if (GrandLivreSheetXML.this.lettrage == GrandLivreSheet.MODENONLETTREE_PERIODE) {
Object o = null;
Where w2 = new Where(tableEcriture.getField("LETTRAGE"), "=", o);
Where wSTTC = new Where(tableEcriture.getField("DATE_LETTRAGE"), "<>", o);
wSTTC = wSTTC.and(new Where(tableEcriture.getField("DATE_LETTRAGE"), ">", GrandLivreSheetXML.this.dateAu));
 
w2 = w2.or(wSTTC);
w = w.and(w2.or(new Where(tableEcriture.getField("LETTRAGE"), "=", "")));
} else if (GrandLivreSheetXML.this.lettrage == GrandLivreSheet.MODENONLETTREE_ALL) {
Object o = null;
Where w2 = new Where(tableEcriture.getField("LETTRAGE"), "=", o);
w = w.and(w2.or(new Where(tableEcriture.getField("LETTRAGE"), "=", "")));
}
 
if (GrandLivreSheetXML.this.excludeCompteSolde) {
System.err.println("Exclude compte");
 
if (lCompteSolde != null) {
w = w.and(new Where(tableEcriture.getField("ID_COMPTE_PCE"), lCompteSolde).not());
}
}
w = w.and(new Where(tableEcriture.getField("NOM"), "NOT LIKE", "Fermeture du compte%"));
 
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
return w;
}
 
/**
* @param d date limite des cumuls
* @return Map<Integer id compte, Long solde(debit-credit)>
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/SaisieKmItemTable.java
20,6 → 20,7
import org.openconcerto.erp.core.finance.accounting.element.ComptePCESQLElement;
import org.openconcerto.erp.preferences.DefaultNXProps;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.TM;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLRow;
38,13 → 39,16
import org.openconcerto.sql.view.list.TextTableCellEditorWithCompletion;
import org.openconcerto.sql.view.list.ValidStateChecker;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JComponentUtils;
import org.openconcerto.utils.checks.ValidState;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
51,6 → 55,7
import java.util.Vector;
 
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
143,7 → 148,7
@Override
public ValidState getValidState(Object o) {
if (o != null) {
return elt.getCompteNumeroValidState(o.toString());
return this.elt.getCompteNumeroValidState(o.toString());
}
return super.getValidState(o);
}
161,8 → 166,19
m2.setWhere(w);
 
TextTableCellEditorWithCompletion t = (TextTableCellEditorWithCompletion) this.tableElementNumeroCompte.getTableCellEditor(this.table);
JButton buttonClone = new JButton(TM.tr("duplicateLine"));
buttonClone.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
cloneLine(table.getSelectedRow());
}
});
buttonClone.setEnabled(false);
c.gridx++;
JComponentUtils.setMinimumWidth(buttonClone, 95);
 
this.add(new RowValuesTableControlPanel(this.table), c);
RowValuesTableControlPanel rowValuesTableControlPanel = new RowValuesTableControlPanel(this.table, Arrays.asList(buttonClone));
rowValuesTableControlPanel.setVisibleButtonClone(false);
this.add(rowValuesTableControlPanel, c);
 
c.gridy++;
c.fill = GridBagConstraints.BOTH;
222,6 → 238,29
 
}
 
private void cloneLine(int row) {
if (row < 0) {
System.err.println("RowValuesTableControlPanel.cloneLine() wrong selected line, index = " + row);
Thread.dumpStack();
return;
}
SQLRowValues rowVals = this.table.getRowValuesTableModel().getRowValuesAt(row);
 
SQLRowValues rowValsBis = rowVals.deepCopy();
rowValsBis.clearPrimaryKeys();
rowValsBis.put(rowValsBis.getTable().getOrderField().getName(), null);
 
this.table.getRowValuesTableModel().getSQLElement().clearPrivateFields(rowValsBis);
rowValsBis.putEmptyLink("ID_ECRITURE");
for (String elt : this.table.getClearCloneTableElement()) {
if (rowValsBis.getTable().getFieldsName().contains(elt)) {
rowValsBis.putEmptyLink(elt);
}
}
 
this.table.getRowValuesTableModel().addRow(rowValsBis);
}
 
/**
* Remplit la RowValuesTable avec les ecritures du mouvement
*
334,11 → 373,11
assert SwingUtilities.isEventDispatchThread();
if (text == null)
return;
RowValuesTableModel model = table.getRowValuesTableModel();
RowValuesTableModel model = this.table.getRowValuesTableModel();
int size = model.getRowCount();
for (int i = 0; i < size; i++) {
SQLRowValues r = model.getRowValuesAt(i);
if (r.getString("NOM_ECRITURE") == null || r.getString("NOM_ECRITURE").trim().isEmpty() || r.getString("NOM_ECRITURE").trim().equals(previousText)) {
if (r.getString("NOM_ECRITURE") == null || r.getString("NOM_ECRITURE").trim().isEmpty() || r.getString("NOM_ECRITURE").equals(previousText)) {
r.put("NOM_ECRITURE", text);
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/EcritureGrandLivreRenderer.java
40,23 → 40,16
}
 
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
 
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
 
TableCellRendererUtils.setBackgroundColor(this, table, isSelected);
 
if (!isSelected) {
 
Ecriture ecrTmp = ((ConsultCompteModel) this.model.getTableModel()).getEcritures().get(this.model.viewIndex(row));
 
if (!ecrTmp.getValide()) {
// this.setForeground(couleurEcritureValide);
Date dateEcr = ecrTmp.getDate();
Date dateToDay = new Date();
 
if ((dateEcr.getDate() == dateToDay.getDate()) && (dateEcr.getMonth() == dateToDay.getMonth()) && (dateEcr.getYear() == dateToDay.getYear())) {
// System.out.println("ToDay :: " + dateToDay + " Ecr ::: " + dateEcr);
 
this.setBackground(couleurEcritureToDay);
} else {
this.setBackground(couleurEcritureValide);
63,14 → 56,13
}
}
}
 
if (value != null) {
if (value instanceof Date) {
this.setText(dateFormat.format((Date) value));
}
if (value.getClass() == Long.class) {
} else if (value.getClass() == Long.class) {
this.setText(GestionDevise.currencyToString(((Long) value).longValue()));
}
 
}
return this;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/SaisieJournalItemTable.java
21,6 → 21,7
import org.openconcerto.erp.generationEcritures.GenerationMvtSaisieKm;
import org.openconcerto.erp.preferences.DefaultNXProps;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.TM;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
36,6 → 37,7
import org.openconcerto.sql.view.list.TextTableCellEditorWithCompletion;
import org.openconcerto.sql.view.list.ValidStateChecker;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JComponentUtils;
import org.openconcerto.ui.RangedIntegerTableCellEditor;
import org.openconcerto.utils.DecimalUtils;
import org.openconcerto.utils.GestionDevise;
45,6 → 47,7
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
54,6 → 57,7
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
62,6 → 66,7
 
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
295,10 → 300,21
 
TextTableCellEditorWithCompletion t = (TextTableCellEditorWithCompletion) this.tableElementNumeroCompte.getTableCellEditor(this.table);
 
this.controlPanel = new RowValuesTableControlPanel(this.table);
controlPanel.setButtonAjouterEnabled(false);
this.add(controlPanel, c);
JButton buttonClone = new JButton(TM.tr("duplicateLine"));
buttonClone.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
cloneLine(table.getSelectedRow());
}
});
buttonClone.setEnabled(false);
c.gridx++;
JComponentUtils.setMinimumWidth(buttonClone, 95);
 
this.controlPanel = new RowValuesTableControlPanel(this.table, Arrays.asList(buttonClone));
this.controlPanel.setVisibleButtonClone(false);
this.controlPanel.setButtonAjouterEnabled(false);
this.add(this.controlPanel, c);
 
c.gridy++;
c.fill = GridBagConstraints.BOTH;
c.weightx = 1;
688,4 → 704,26
public void mouseExited(final MouseEvent e) {
}
 
private void cloneLine(int row) {
if (row < 0) {
System.err.println("RowValuesTableControlPanel.cloneLine() wrong selected line, index = " + row);
Thread.dumpStack();
return;
}
SQLRowValues rowVals = this.table.getRowValuesTableModel().getRowValuesAt(row);
 
SQLRowValues rowValsBis = rowVals.deepCopy();
rowValsBis.clearPrimaryKeys();
rowValsBis.put(rowValsBis.getTable().getOrderField().getName(), null);
 
this.table.getRowValuesTableModel().getSQLElement().clearPrivateFields(rowValsBis);
rowValsBis.putEmptyLink("ID_ECRITURE");
for (String elt : this.table.getClearCloneTableElement()) {
if (rowValsBis.getTable().getFieldsName().contains(elt)) {
rowValsBis.putEmptyLink(elt);
}
}
 
this.table.getRowValuesTableModel().addRow(rowValsBis);
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/ConsultationCompteFrame.java
15,20 → 15,32
 
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.State;
import org.openconcerto.sql.model.SQLBackgroundTableCache;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.ui.state.WindowStateManager;
 
import java.awt.DisplayMode;
import java.awt.GraphicsEnvironment;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
 
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
 
 
public class ConsultationCompteFrame extends JFrame {
// panel contenant la liste des ecritures
private final ListPanelEcritures panelEcritures;
37,12 → 49,13
 
private String titre;
 
public ConsultationCompteFrame(ListeDesEcrituresPanel panel, String titre) {
private int indexID;
 
public ConsultationCompteFrame(ListeDesEcrituresPanel panel, SQLRowAccessor rowCpt) {
super();
this.panel = panel;
this.panelEcritures = panel.getListPanelEcritures();
this.titre = titre;
 
this.titre = "Consultation compte n°" + rowCpt.getString("NUMERO") + " " + rowCpt.getString("NOM");
// rafraichir le titre à chaque changement de la liste
this.panelEcritures.getListe().addListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
63,8 → 76,74
}
});
}
 
SQLTable ecrTable = rowCpt.getTable().getTable("ECRITURE");
 
final int id = rowCpt.getID();
Where w = new Where(ecrTable.getField("ID_COMPTE_PCE"), "=", id);
getPanel().getListe().getRequest().setWhere(w);
 
final SQLTable cptTable = ecrTable.getForeignTable("ID_COMPTE_PCE");
List<SQLRow> rowsCpt = new ArrayList<SQLRow>(SQLBackgroundTableCache.getInstance().getCacheForTable(cptTable).getRows());
Collections.sort(rowsCpt, new Comparator<SQLRow>() {
@Override
public int compare(SQLRow o1, SQLRow o2) {
 
return o1.getString("NUMERO").compareTo(o2.getString("NUMERO"));
}
});
final List<Integer> idsCpt = new ArrayList<>();
for (SQLRow sqlRow : rowsCpt) {
idsCpt.add(sqlRow.getID());
}
this.indexID = idsCpt.indexOf(rowCpt.getID());
 
final PredicateRowAction prec = new PredicateRowAction(new AbstractAction("Précédent") {
 
@Override
public void actionPerformed(ActionEvent e) {
 
if (indexID > 0) {
int newCptId = idsCpt.get(indexID - 1);
Where w = new Where(ecrTable.getField("ID_COMPTE_PCE"), "=", newCptId);
getPanel().getListe().getRequest().setWhere(w);
SQLRow rowCptNew = SQLBackgroundTableCache.getInstance().getCacheForTable(cptTable).getRowFromId(newCptId);
setTitle("Consultation compte n°" + rowCptNew.getString("NUMERO") + " " + rowCptNew.getString("NOM"));
indexID--;
}
 
}
}, true, false);
prec.setPredicate(IListeEvent.createSelectionCountPredicate(0, Integer.MAX_VALUE));
panel.getListPanelEcritures().getListe().addIListeAction(prec);
 
final PredicateRowAction suivant = new PredicateRowAction(new AbstractAction("Suivant") {
 
@Override
public void actionPerformed(ActionEvent e) {
 
if (indexID < idsCpt.size() - 1) {
int newCptId = idsCpt.get(indexID + 1);
Where w = new Where(ecrTable.getField("ID_COMPTE_PCE"), "=", newCptId);
getPanel().getListe().getRequest().setWhere(w);
SQLRow rowCptNew = SQLBackgroundTableCache.getInstance().getCacheForTable(cptTable).getRowFromId(newCptId);
setTitle("Consultation compte n°" + rowCptNew.getString("NUMERO") + " " + rowCptNew.getString("NOM"));
indexID++;
}
 
}
}, true, false);
suivant.setPredicate(IListeEvent.createSelectionCountPredicate(0, Integer.MAX_VALUE));
panel.getListPanelEcritures().getListe().addIListeAction(suivant);
 
}
 
@Override
public void setTitle(String title) {
this.titre = title;
super.setTitle(title);
}
 
private String getPlural(String s, int nb) {
return nb + " " + s + (nb > 1 ? "s" : "");
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/CompteGestCommPreferencePanel.java
15,6 → 15,7
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.finance.accounting.element.ComptePCESQLElement;
import org.openconcerto.erp.core.finance.accounting.element.JournalSQLElement;
import org.openconcerto.erp.generationEcritures.GenerationMvtSaisieVenteFacture;
import org.openconcerto.erp.model.ISQLCompteSelector;
import org.openconcerto.erp.preferences.DefaultNXProps;
45,7 → 46,7
 
private ISQLCompteSelector selCompteTVAIntraComm, selCompteFourn, selCompteAchat, selCompteValeurEncaissement, selCompteAvanceClient, selCompteClient, selCompteVenteProduits,
selCompteVenteService, selCompteTVACol, selCompteTVADed, selCompteTVAImmo, selCompteAchatIntra, selCompteFactor, selComptePortSoumis, selComptePortNonSoumis;
private ElementComboBox selJrnlFactor;
private ElementComboBox selJrnlFactor, selJrnlValEnc;
private final static SQLBase base = ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete();
private static final SQLTable tablePrefCompte = base.getTable("PREFS_COMPTE");
private SQLRowValues rowPrefCompteVals = new SQLRowValues(tablePrefCompte);
174,6 → 175,17
this.selCompteValeurEncaissement.init();
this.add(this.selCompteValeurEncaissement, c);
 
// Journal
c.gridy++;
c.weightx = 0;
c.gridx = 0;
this.add(new JLabel("Journal dépôt chèque"), c);
c.weightx = 1;
c.gridx++;
this.selJrnlValEnc = new ElementComboBox();
this.selJrnlValEnc.init(Configuration.getInstance().getDirectory().getElement("JOURNAL"));
this.add(this.selJrnlValEnc, c);
 
// Compte vente produits
c.gridy++;
c.weightx = 0;
325,6 → 337,10
this.rowPrefCompteVals.put("ID_COMPTE_PCE_FACTOR", this.selCompteFactor.getValue());
final int selectedId = this.selJrnlFactor.getSelectedId();
this.rowPrefCompteVals.put("ID_JOURNAL_FACTOR", (selectedId > 1) ? selectedId : 1);
 
final int selectedIdEnc = this.selJrnlValEnc.getSelectedId();
this.rowPrefCompteVals.put("ID_JOURNAL_VALEUR_ENCAISSEMENT", (selectedIdEnc > 1) ? selectedIdEnc : 1);
 
this.rowPrefCompteVals.put("ID_COMPTE_PCE_FOURNISSEUR", this.selCompteFourn.getValue());
this.rowPrefCompteVals.put("ID_COMPTE_PCE_CLIENT", this.selCompteClient.getValue());
this.rowPrefCompteVals.put("ID_COMPTE_PCE_AVANCE_CLIENT", this.selCompteAvanceClient.getValue());
388,6 → 404,7
this.selCompteFactor.setValue(value);
 
this.selJrnlFactor.setValue(GenerationMvtSaisieVenteFacture.journal);
this.selJrnlValEnc.setValue(JournalSQLElement.BANQUES);
 
// Fournisseurs
compte = ComptePCESQLElement.getComptePceDefault("Fournisseurs");
455,14 → 472,22
setComboValues(selCompteVenteService, "ID_COMPTE_PCE_VENTE_SERVICE", "VentesServices");
setComboValues(selCompteFactor, "ID_COMPTE_PCE_FACTOR", "Factor");
 
{
// Journal Factor
int value = (this.rowPrefCompteVals.getObject("ID_JOURNAL_FACTOR") == null ? 1 : this.rowPrefCompteVals.getInt("ID_JOURNAL_FACTOR"));
if (value <= 1) {
 
value = GenerationMvtSaisieVenteFacture.journal;
}
this.selJrnlFactor.setValue(value);
 
}
{
// Journal Val enc
int value = (this.rowPrefCompteVals.getObject("ID_JOURNAL_VALEUR_ENCAISSEMENT") == null ? 1 : this.rowPrefCompteVals.getInt("ID_JOURNAL_VALEUR_ENCAISSEMENT"));
if (value <= 1) {
value = JournalSQLElement.BANQUES;
}
this.selJrnlValEnc.setValue(value);
}
setComboValues(selCompteFourn, "ID_COMPTE_PCE_FOURNISSEUR", "Fournisseurs");
setComboValues(selCompteClient, "ID_COMPTE_PCE_CLIENT", "Clients");
setComboValues(selCompteAvanceClient, "ID_COMPTE_PCE_AVANCE_CLIENT", "AvanceClients");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/ComptaPrefTreeNode.java
31,7 → 31,6
import org.openconcerto.erp.preferences.GestionCommercialeGlobalPreferencePanel;
import org.openconcerto.erp.preferences.GestionPieceCommercialePanel;
import org.openconcerto.erp.preferences.ImpressionGestCommPreferencePanel;
import org.openconcerto.erp.preferences.MailRelancePreferencePanel;
import org.openconcerto.erp.preferences.ModeReglementDefautPrefPanel;
import org.openconcerto.erp.preferences.NumerotationPreferencePanel;
import org.openconcerto.erp.preferences.PayPalPreferencePanel;
119,7 → 118,6
nsGlobale.add(new PrefTreeNode(GenerationDocGlobalPreferencePanel.class, "Génération des Documents", new String[] { "documents" }));
nsGlobale.add(new PrefTreeNode(GestionClientPreferencePanel.class, "Gestion des clients", new String[] { "client", "service" }));
nsGlobale.add(new PrefTreeNode(GestionCommercialeGlobalPreferencePanel.class, "Gestion des piéces commericales", new String[] { "transfert", "numéro" }));
nsGlobale.add(new PrefTreeNode(MailRelancePreferencePanel.class, "Email de relance", new String[] { "relance", "mail" }));
 
// PayPal
final PrefTreeNode nPayPall = new PrefTreeNode(PayPalPreferencePanel.class, "PayPal", new String[] { "paypal", "facture" });
162,7 → 160,6
final PrefTreeNode nMail = new PrefTreeNode(EmailNode.class, "EMail", new String[] { "email", "mail", "courriel" });
nsPoste.add(nMail);
 
 
// add preferences for modules
for (final AbstractModule module : moduleManager.getRunningModules().values()) {
for (final Entry<Boolean, List<ModulePreferencePanelDesc>> e : module.getPrefDescriptorsByLocation(moduleManager.getRoot()).entrySet()) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/CompteCloturePreferencePanel.java
133,7 → 133,7
this.rowPrefCompteVals.put("ID_COMPTE_PCE_BILAN_O", this.selCompteOuverture.getValue());
this.rowPrefCompteVals.put("ID_COMPTE_PCE_BILAN_F", this.selCompteFermeture.getValue());
this.rowPrefCompteVals.put("ID_COMPTE_PCE_RESULTAT", this.selCompteResultat.getValue());
this.rowPrefCompteVals.put("ID_COMPTE_PCE_RESULTAT_PERTE", this.selCompteResultat.getValue());
this.rowPrefCompteVals.put("ID_COMPTE_PCE_RESULTAT_PERTE", this.selCompteResultatPerte.getValue());
this.rowPrefCompteVals.put("ID_JOURNAL_AN", this.selJournal.getValue());
this.rowPrefCompteVals.put("CREATE_NUL_SOLDE_ECR", this.boxCompteSolde.isSelected());
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/ListeDesEcrituresPanel.java
13,6 → 13,10
package org.openconcerto.erp.core.finance.accounting.ui;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.common.ui.IListFilterDatePanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.view.list.ITableModel;
import org.openconcerto.ui.DefaultGridBagConstraints;
22,6 → 26,7
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.Date;
 
import javax.swing.BorderFactory;
import javax.swing.JLabel;
54,9 → 59,18
c.fill = GridBagConstraints.BOTH;
this.add(this.panelEcritures, c);
 
SQLRow rowExercice = Configuration.getInstance().getBase().getTable("EXERCICE_COMMON").getRow(ComptaPropsConfiguration.getInstanceCompta().getRowSociete().getInt("ID_EXERCICE_COMMON"));
 
final IListFilterDatePanel comp = new IListFilterDatePanel(this.panelEcritures.getListe(), this.panelEcritures.getListe().getSource().getElem().getTable().getField("DATE"),
IListFilterDatePanel.getDefaultMap());
comp.setDateDu((Date) rowExercice.getObject("DATE_DEB"));
c.weightx = 1;
c.gridy++;
this.add(comp, c);
 
/* Panel Legende */
c.gridwidth = 1;
c.gridy = GridBagConstraints.RELATIVE;
c.gridy++;
this.panelLegende = new JPanel();
this.panelLegende.setLayout(new GridBagLayout());
this.panelLegende.setBorder(BorderFactory.createTitledBorder("Légende"));
67,6 → 81,7
panelValide.add(new JLabel("Ecritures validées"));
panelValide.setBackground(Color.WHITE);
// panelValide.setBorder(BorderFactory.createLineBorder(Color.BLACK));
c.gridy++;
this.panelLegende.add(panelValide, c);
 
JPanel panelNonValide = new JPanel();
74,6 → 89,7
panelNonValide.add(new JLabel("Ecritures non validées"));
panelNonValide.setBackground(ListEcritureRenderer.getCouleurEcritureNonValide());
// panelNonValide.setBorder(BorderFactory.createLineBorder(Color.BLACK));
c.gridy++;
this.panelLegende.add(panelNonValide, c);
 
JPanel panelNonValideToDay = new JPanel();
81,9 → 97,10
panelNonValideToDay.add(new JLabel("Ecritures non validées du jour"));
panelNonValideToDay.setBackground(ListEcritureRenderer.getCouleurEcritureToDay());
// panelNonValideToDay.setBorder(BorderFactory.createLineBorder(Color.BLACK));
c.gridy++;
this.panelLegende.add(panelNonValideToDay, c);
 
c.gridy = 1;
c.gridy = 2;
c.weightx = 0;
c.weighty = 0;
c.insets = new Insets(2, 2, 1, 2);
91,7 → 108,7
 
/* Panel Total */
c.gridx = 0;
c.gridy = 0;
// c.gridy = 0;
this.panelTotal = new JPanel();
this.panelTotal.setLayout(new GridBagLayout());
this.panelTotal.setBorder(BorderFactory.createTitledBorder("Totaux"));
125,7 → 142,7
c.gridx++;
this.panelTotal.add(this.montantSolde, c);
 
c.gridy = 1;
c.gridy = 2;
c.gridx = 1;
c.weightx = 0;
c.fill = GridBagConstraints.NONE;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/element/EcritureSQLElement.java
65,8 → 65,6
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.SQLException;
80,7 → 78,6
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
 
153,6 → 150,11
return "ID_MOUVEMENT";
}
 
@Override
public boolean isPrivate() {
return false;
}
 
// Impossible de modifier si validée
// FIXME impossible de saisir une écriture avant la date de debut d'exercice --> de saisir de
// document de gest comm
196,67 → 198,9
}
 
public void consultationCompte(SQLRowAccessor rowCpt) {
final ConsultationCompteFrame f = new ConsultationCompteFrame(new ListeDesEcrituresPanel(), "Consultation compte n°" + rowCpt.getString("NUMERO") + " " + rowCpt.getString("NOM"));
final ListeDesEcrituresPanel panel = new ListeDesEcrituresPanel();
final ConsultationCompteFrame f = new ConsultationCompteFrame(panel, rowCpt);
 
f.getPanel().getListe().getJTable().addMouseListener(new MouseAdapter() {
 
public void mousePressed(final MouseEvent mE) {
 
if (mE.getButton() == MouseEvent.BUTTON3) {
JPopupMenu menuDroit = new JPopupMenu();
 
menuDroit.add(new AbstractAction("Voir les ecritures du journal") {
 
public void actionPerformed(ActionEvent e) {
int id = f.getPanel().getListe().idFromIndex(f.getPanel().getListe().getJTable().rowAtPoint(mE.getPoint()));
// int id = f.getPanel().getListe().getSelectedId();
 
SQLTable ecrTable = getTable().getTable("ECRITURE");
 
System.err.println("Ecritures ID ::: " + id);
SQLRow rowEcr = ecrTable.getRow(id);
 
System.err.println("Ecritures ID ::: " + id + " --> ID_JOURNAL = " + rowEcr.getInt("ID_JOURNAL"));
 
ConsultationCompteFrame f2 = new ConsultationCompteFrame(new ListeDesEcrituresPanel(),
"Consultation du journal " + getTable().getTable("JOURNAL").getRow(rowEcr.getInt("ID_JOURNAL")).getString("NOM"));
 
Where w = new Where(ecrTable.getField("ID_JOURNAL"), "=", rowEcr.getInt("ID_JOURNAL"));
 
f2.getPanel().getListe().getRequest().setWhere(w);
f2.getPanel().getListe().setModificationAllowed(false);
f2.pack();
f2.setVisible(true);
}
});
 
menuDroit.add(new AbstractAction("Voir la source") {
 
public void actionPerformed(ActionEvent e) {
 
// int id = f.getPanel().getListe().getSelectedId();
int id = f.getPanel().getListe().idFromIndex(f.getPanel().getListe().getJTable().rowAtPoint(mE.getPoint()));
System.err.println("ID COMPTE SELECTED " + id);
SQLRow rowEcr = getTable().getTable("ECRITURE").getRow(id);
 
System.out.println("MOUVEMENT VALIDE ------------->>>>>>>>>>>>>> " + MouvementSQLElement.isEditable(rowEcr.getInt("ID_MOUVEMENT")));
 
MouvementSQLElement.showSource(rowEcr.getInt("ID_MOUVEMENT"));
 
System.out.println("Mouvement Numero : " + rowEcr.getInt("ID_MOUVEMENT"));
}
});
 
menuDroit.show(mE.getComponent(), mE.getX(), mE.getY());
}
}
});
 
SQLTable ecrTable = getTable().getTable("ECRITURE");
 
Where w = new Where(ecrTable.getField("ID_COMPTE_PCE"), "=", rowCpt.getID());
f.getPanel().getListe().getRequest().setWhere(w);
 
f.getPanel().getListe().setModificationAllowed(false);
f.pack();
f.setVisible(true);
696,7 → 640,9
 
// on archive le mouvement
if (dropMvt) {
SQLElement elt = Configuration.getInstance().getDirectory().getElement(tableMvt);
 
SQLElement elt = getDirectory().getElement(tableMvt);
 
try {
elt.archive(idMvt);
} catch (SQLException e) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/element/AssociationAnalytiqueSQLElement.java
16,6 → 16,8
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElementLink.LinkType;
import org.openconcerto.sql.element.SQLElementLinksSetup;
import org.openconcerto.sql.model.FieldPath;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.graph.Path;
44,6 → 46,14
this.setAction("ID_SAISIE_KM_ELEMENT", ReferenceAction.CASCADE);
}
 
@Override
protected void setupLinks(SQLElementLinksSetup links) {
super.setupLinks(links);
if (getTable().contains("ID_ECRITURE")) {
links.get("ID_ECRITURE").setType(LinkType.ASSOCIATION);
}
}
 
protected List<String> getListFields() {
final List<String> list = new ArrayList<String>(2);
list.add("ID_ECRITURE");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/ui/ListeDesChequesAEncaisserPanel.java
18,6 → 18,7
import org.openconcerto.erp.rights.ComptaTotalUserRight;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.sqlobject.SQLRequestComboBox;
import org.openconcerto.sql.users.rights.UserRightsManager;
53,10 → 54,10
 
@Override
protected JTextComponent createLabelText() {
if (fieldLabel == null) {
if (this.fieldLabel == null) {
this.fieldLabel = new JTextField();
}
return fieldLabel;
return this.fieldLabel;
}
 
@Override
66,18 → 67,16
@Override
public void actionPerformed(ActionEvent e) {
final String s = text.getText();
SQLRowValues rowValsDepot = new SQLRowValues(element.getTable().getTable("DEPOT_CHEQUE"));
SQLRowValues rowValsDepot = new SQLRowValues(ListeDesChequesAEncaisserPanel.this.element.getTable().getTable("DEPOT_CHEQUE"));
rowValsDepot.put("DATE", dateDepot.getValue());
rowValsDepot.put("NOM", fieldLabel.getText());
rowValsDepot.put("NOM", ListeDesChequesAEncaisserPanel.this.fieldLabel.getText());
final SQLRow selectedBanque = banqueSelect.getSelectedRow();
if (selectedBanque != null) {
rowValsDepot.put("ID_" + selectedBanque.getTable().getName(), selectedBanque.getID());
}
List<SQLRowValues> chq = getListe().getSelectedRows();
for (SQLRowValues sqlRowValues : chq) {
SQLRow rowChq = sqlRowValues.asRow();
rowChq.fetchValues();
SQLRowValues rowValsDepotElt = new SQLRowValues(element.getTable().getTable("DEPOT_CHEQUE_ELEMENT"));
final List<SQLRow> chq = SQLRowListRSH.fetch(getListe().getRequest().getPrimaryTable(), getListe().getSelection().getSelectedIDs());
for (SQLRow rowChq : chq) {
SQLRowValues rowValsDepotElt = new SQLRowValues(ListeDesChequesAEncaisserPanel.this.element.getTable().getTable("DEPOT_CHEQUE_ELEMENT"));
rowValsDepotElt.put("ID_DEPOT_CHEQUE", rowValsDepot);
if (rowChq.getObject("ID_CLIENT") != null && !rowChq.isForeignEmpty("ID_CLIENT")) {
rowValsDepotElt.put("ID_CLIENT", rowChq.getForeignID("ID_CLIENT"));
96,7 → 95,7
rowValsDepotElt.put("NUMERO", (rowChq.getObject("NUMERO") == null ? "" : rowChq.getObject("NUMERO")));
rowValsDepotElt.put("MONTANT", rowChq.getObject("MONTANT"));
}
EditFrame frame = new EditFrame(element.getDirectory().getElement("DEPOT_CHEQUE"), EditMode.CREATION);
EditFrame frame = new EditFrame(ListeDesChequesAEncaisserPanel.this.element.getDirectory().getElement("DEPOT_CHEQUE"), EditMode.CREATION);
frame.getSQLComponent().select(rowValsDepot);
frame.setVisible(true);
text.setText("");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/component/EncaisserMontantSQLComponent.java
16,11 → 16,9
import org.openconcerto.erp.core.common.element.BanqueSQLElement;
import org.openconcerto.erp.core.common.ui.DeviseField;
import org.openconcerto.erp.core.finance.accounting.element.MouvementSQLElement;
import org.openconcerto.erp.core.finance.payment.element.EncaisserMontantSQLElement;
import org.openconcerto.erp.core.finance.payment.element.TypeReglementSQLElement;
import org.openconcerto.erp.core.finance.payment.ui.EncaisseMontantTable;
import org.openconcerto.erp.core.sales.invoice.component.SaisieVenteFactureSQLComponent;
import org.openconcerto.erp.generationEcritures.GenerationReglementVenteNG;
import org.openconcerto.erp.model.PrixTTC;
import org.openconcerto.erp.preferences.ModeReglementDefautPrefPanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.BaseSQLComponent;
33,7 → 31,6
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.list.RowValuesTableModel;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JDate;
41,7 → 38,6
import org.openconcerto.ui.warning.JLabelWarning;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.GestionDevise;
import org.openconcerto.utils.StringUtils;
import org.openconcerto.utils.text.SimpleDocumentListener;
 
import java.awt.GridBagConstraints;
55,7 → 51,6
 
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.event.DocumentEvent;
183,7 → 178,6
 
this.addSQLObject(this.nom, "NOM");
 
this.addSQLObject(new ElementComboBox(), "ID_COMPTE_PCE_TIERS");
this.addSQLObject(new JTextField(), "TIERS");
DefaultGridBagConstraints.lockMinimumSize(this.montant);
305,64 → 299,17
public int insert(SQLRow order) {
 
int id = super.insert(order);
try {
this.table.updateField("ID_ENCAISSER_MONTANT", id);
 
System.out.println("Génération des ecritures du reglement");
SQLRow row = getTable().getRow(id);
String s = row.getString("NOM");
SQLRow rowModeRegl = row.getForeignRow("ID_MODE_REGLEMENT");
SQLRow rowTypeRegl = rowModeRegl.getForeignRow("ID_TYPE_REGLEMENT");
 
// Compte Client
SQLRow clientRow = row.getForeignRow("ID_CLIENT");
 
String label = "Règlement vente " + ((s == null) ? "" : s) + " (" + rowTypeRegl.getString("NOM") + ") " + StringUtils.limitLength(clientRow.getString("NOM"), 20);
long montant = row.getLong("MONTANT");
PrixTTC ttc = new PrixTTC(montant);
 
List<SQLRow> l = row.getReferentRows(Configuration.getInstance().getDirectory().getElement("ENCAISSER_MONTANT_ELEMENT").getTable());
if (l.isEmpty()) {
JOptionPane.showMessageDialog(null, "Un problème a été rencontré lors de l'encaissement! \n Les écritures comptables non pu être générer!");
System.err.println("Liste des échéances vides pour l'encaissement ID " + id);
Thread.dumpStack();
try {
((EncaisserMontantSQLElement) getElement()).regleFacture(row);
} catch (Exception e) {
ExceptionHandler.handle("Erreur de génération des écritures", e);
}
new GenerationReglementVenteNG(label, clientRow, ttc, row.getDate("DATE").getTime(), rowModeRegl, row, l.get(0).getForeignRow("ID_MOUVEMENT_ECHEANCE"), false, false,
row.getString("TIERS"), row.getForeign("ID_COMPTE_PCE_TIERS"));
 
// Mise a jour du montant de l'echeance
boolean supplement = false;
 
if (!row.getBoolean("ACOMPTE")) {
// On marque les echeances comme reglees
for (SQLRow sqlRow : l) {
 
final SQLRow rowEch = sqlRow.getForeignRow("ID_ECHEANCE_CLIENT");
SQLRowValues rowValsEch = rowEch.createEmptyUpdateRow();
if (sqlRow.getLong("MONTANT_REGLE") >= sqlRow.getLong("MONTANT_A_REGLER")) {
rowValsEch.put("REGLE", Boolean.TRUE);
if (sqlRow.getLong("MONTANT_REGLE") > sqlRow.getLong("MONTANT_A_REGLER")) {
supplement = true;
}
}
rowValsEch.put("MONTANT", Long.valueOf(rowEch.getLong("MONTANT") - sqlRow.getLong("MONTANT_REGLE")));
 
rowValsEch.update();
// this.comboEcheance.rowDeleted(tableEch, rowEch.getID());
// getTable().fireTableModified(rowEch.getID());
}
}
// si le montant réglé est supérieur, on crée une facture de complément
if (supplement) {
SQLElement elt = Configuration.getInstance().getDirectory().getElement("SAISIE_VENTE_FACTURE");
EditFrame f = new EditFrame(elt, EditFrame.CREATION);
SaisieVenteFactureSQLComponent comp = (SaisieVenteFactureSQLComponent) f.getSQLComponent();
comp.setComplement(true);
f.setVisible(true);
}
} catch (Exception e) {
ExceptionHandler.handle("Erreur lors de la génération des ecritures du reglement", e);
}
return id;
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/ChequeAEncaisserSQLElement.java
100,9 → 100,13
l.add("DATE_VENTE");
l.add(getMinDateFieldName());
l.add("ID_CLIENT");
final ShowAs showAs = new ShowAs(getTable().getDBRoot());
if (getTable().contains("ID_BANQUE")) {
l.add("ID_BANQUE");
showAs.show(getTable().getForeignTable("ID_BANQUE"), "NOM");
}
l.add("MONTANT");
 
final ShowAs showAs = new ShowAs(getTable().getDBRoot());
 
final SQLTable mvtT = getTable().getForeignTable("ID_MOUVEMENT");
showAs.show(mvtT, "ID_PIECE");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/EncaisserMontantSQLElement.java
17,9 → 17,13
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.finance.accounting.element.EcritureSQLElement;
import org.openconcerto.erp.core.finance.payment.component.EncaisserMontantSQLComponent;
import org.openconcerto.erp.core.sales.invoice.component.SaisieVenteFactureSQLComponent;
import org.openconcerto.erp.generationEcritures.GenerationReglementVenteNG;
import org.openconcerto.erp.model.PrixTTC;
import org.openconcerto.erp.preferences.GestionCommercialeGlobalPreferencePanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.element.TreesOfSQLRows;
import org.openconcerto.sql.model.FieldPath;
import org.openconcerto.sql.model.SQLRow;
32,6 → 36,7
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.sql.model.graph.PathBuilder;
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.list.BaseSQLTableModelColumn;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
39,6 → 44,7
import org.openconcerto.sql.view.list.SQLTableModelSource;
import org.openconcerto.utils.CollectionUtils;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.StringUtils;
 
import java.awt.event.ActionEvent;
import java.sql.SQLException;
51,6 → 57,8
import java.util.Set;
 
import javax.swing.AbstractAction;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
 
public class EncaisserMontantSQLElement extends ComptaSQLConfElement {
 
164,7 → 172,77
super.archive(trees, cutLinks);
}
 
public void regleFacture(SQLRow row) throws Exception {
 
System.out.println("Génération des ecritures du reglement");
String s = row.getString("NOM");
SQLRow rowModeRegl = row.getForeignRow("ID_MODE_REGLEMENT");
SQLRow rowTypeRegl = rowModeRegl.getForeignRow("ID_TYPE_REGLEMENT");
 
// Compte Client
SQLRow clientRow = row.getForeignRow("ID_CLIENT");
 
String label = "Règlement vente " + ((s == null) ? "" : s) + " (" + rowTypeRegl.getString("NOM") + ") " + StringUtils.limitLength(clientRow.getString("NOM"), 20);
long montant = row.getLong("MONTANT");
PrixTTC ttc = new PrixTTC(montant);
 
List<SQLRow> l = row.getReferentRows(row.getTable().getTable("ENCAISSER_MONTANT_ELEMENT"));
if (l.isEmpty()) {
SwingUtilities.invokeLater(new Runnable() {
 
@Override
public void run() {
JOptionPane.showMessageDialog(null, "Un problème a été rencontré lors de l'encaissement! \n Les écritures comptables non pu être générer!");
}
});
System.err.println("Liste des échéances vides pour l'encaissement ID " + row.getID());
Thread.dumpStack();
return;
}
new GenerationReglementVenteNG(label, clientRow, ttc, row.getDate("DATE").getTime(), rowModeRegl, row, l.get(0).getForeignRow("ID_MOUVEMENT_ECHEANCE"), false, false, row.getString("TIERS"),
row.getForeign("ID_COMPTE_PCE_TIERS"));
 
// Mise a jour du montant de l'echeance
boolean supplement = false;
 
if (!row.getBoolean("ACOMPTE")) {
// On marque les echeances comme reglees
for (SQLRow sqlRow : l) {
 
final SQLRow rowEch = sqlRow.getForeignRow("ID_ECHEANCE_CLIENT");
SQLRowValues rowValsEch = rowEch.createEmptyUpdateRow();
if (sqlRow.getLong("MONTANT_REGLE") >= sqlRow.getLong("MONTANT_A_REGLER")) {
rowValsEch.put("REGLE", Boolean.TRUE);
if (sqlRow.getLong("MONTANT_REGLE") > sqlRow.getLong("MONTANT_A_REGLER")) {
supplement = true;
}
}
rowValsEch.put("MONTANT", Long.valueOf(rowEch.getLong("MONTANT") - sqlRow.getLong("MONTANT_REGLE")));
 
rowValsEch.update();
// this.comboEcheance.rowDeleted(tableEch, rowEch.getID());
// getTable().fireTableModified(rowEch.getID());
}
}
// si le montant réglé est supérieur, on crée une facture de complément
if (supplement) {
SQLElement elt = getDirectory().getElement("SAISIE_VENTE_FACTURE");
SwingUtilities.invokeLater(new Runnable() {
 
@Override
public void run() {
 
EditFrame f = new EditFrame(elt, EditFrame.CREATION);
SaisieVenteFactureSQLComponent comp = (SaisieVenteFactureSQLComponent) f.getSQLComponent();
comp.setComplement(true);
f.setVisible(true);
}
});
}
 
}
 
@Override
protected String createCodeSuffix() {
return ".category";
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/report/FichePayeSheetXML.java
198,10 → 198,36
ligneSimplifiee.put("MONTANT_SAL_DED", montantSalBulletinSimpl.add(montantSalLigne));
ligneSimplifiee.put("MONTANT_PAT", montantPatBulletinSimpl.add(montantPatLigne));
}
 
BigDecimal tauxPatBulletinSimpl = BigDecimal.ZERO;
BigDecimal tauxSalBulletinSimpl = BigDecimal.ZERO;
if (ligneSimplifiee.getBigDecimal("TAUX_SAL") != null) {
tauxSalBulletinSimpl = ligneSimplifiee.getBigDecimal("TAUX_SAL");
}
if (ligneSimplifiee.getBigDecimal("TAUX_PAT") != null) {
tauxPatBulletinSimpl = ligneSimplifiee.getBigDecimal("TAUX_PAT");
}
 
BigDecimal tauxPatLigne = BigDecimal.ZERO;
BigDecimal tauxSalLigne = BigDecimal.ZERO;
if (sqlRowAccessor.getBigDecimal("TAUX_SAL") != null) {
tauxSalLigne = sqlRowAccessor.getBigDecimal("TAUX_SAL");
}
if (sqlRowAccessor.getBigDecimal("TAUX_PAT") != null) {
tauxPatLigne = sqlRowAccessor.getBigDecimal("TAUX_PAT");
}
 
if (tauxSalLigne.signum() > 0) {
ligneSimplifiee.put("TAUX_SAL", tauxSalBulletinSimpl.add(tauxSalLigne));
}
 
if (tauxPatLigne.signum() > 0) {
ligneSimplifiee.put("TAUX_PAT", tauxPatBulletinSimpl.add(tauxPatLigne));
}
}
}
}
 
private StyleSQLElement eltStyle = Configuration.getInstance().getDirectory().getElement(StyleSQLElement.class);
 
private Map<String, SQLRowValues> initCotisations(boolean cadre, List<SQLRowAccessor> resultCotis) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/ui/EditionFichePayePanel.java
165,7 → 165,7
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
buttonValid.setEnabled(dateDeb.getValue() != null && dateFin.getValue() != null && dateDeb.getValue().before(dateFin.getValue()));
buttonValid.setEnabled(dateDeb.getValue() != null && dateFin.getValue() != null && dateDeb.getValue().compareTo(dateFin.getValue()) <= 0);
model.setDateLimit(dateDeb.getValue());
}
};
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/InfosSalariePayeSQLElement.java
442,6 → 442,19
panelBase.add(sectionAT, c);
addView(sectionAT, "CODE_SECTION_AT");
 
if (getTable().contains("DUREE_FORFAIT")) {
JLabel labelForfait = new JLabel(getLabelFor("DUREE_FORFAIT"));
labelForfait.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField forfait = new JTextField();
c.gridx++;
c.weightx = 0;
panelBase.add(labelForfait, c);
c.gridx++;
c.weightx = 1;
panelBase.add(forfait, c);
addView(forfait, "DUREE_FORFAIT");
}
 
c.gridy = 5;
c.gridx = 0;
c.gridwidth = GridBagConstraints.REMAINDER;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/ReglementPayeSQLElement.java
97,7 → 97,7
JLabel labelNomBq = new JLabel(getLabelFor("NOM_BANQUE"));
labelNomBq.setHorizontalAlignment(SwingConstants.RIGHT);
SQLTextCombo textNomBq = new SQLTextCombo();
 
c.weightx = 0;
panelBanque.add(labelNomBq, c);
c.gridx++;
c.weightx = 1;
104,6 → 104,32
panelBanque.add(textNomBq, c);
c.weightx = 0;
 
// IBAN
JLabel labelIBAN = new JLabel(getLabelFor("IBAN"));
labelIBAN.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField textIBAN = new JTextField();
 
c.gridy++;
c.gridx = 0;
c.weightx = 0;
panelBanque.add(labelIBAN, c);
c.gridx++;
c.weightx = 1;
panelBanque.add(textIBAN, c);
 
// BIC
JLabel labelBIC = new JLabel(getLabelFor("BIC"));
labelBIC.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField textBIC = new JTextField();
 
c.gridy++;
c.gridx = 0;
c.weightx = 0;
panelBanque.add(labelBIC, c);
c.gridx++;
c.weightx = 1;
panelBanque.add(textBIC, c);
 
// RIB
JLabel labelRIB = new JLabel(getLabelFor("RIB"));
labelRIB.setHorizontalAlignment(SwingConstants.RIGHT);
153,11 → 179,13
c.gridy++;
panelReglement.add(radioLe, c);
c.gridx++;
c.weightx = 1;
panelReglement.add(textLe, c);
textLe.setText("31");
c.gridx++;
c.weightx = 0;
panelReglement.add(labelDu, c);
c.weightx = 1;
panelReglement.add(labelDu, c);
 
c.gridy++;
c.gridx = 0;
210,6 → 238,7
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 1;
c.weightx = 0;
panelCompta.add(labelCompteSal, c);
c.gridx++;
c.weightx = 1;
225,6 → 254,8
 
this.addSQLObject(textNomBq, "NOM_BANQUE");
this.addSQLObject(textRIB, "RIB");
this.addSQLObject(textIBAN, "IBAN");
this.addSQLObject(textBIC, "BIC");
this.addRequiredSQLObject(typeRegl, "ID_MODE_REGLEMENT_PAYE");
this.addRequiredSQLObject(textLe, "LE");
this.addRequiredSQLObject(compteSal, "ID_COMPTE_PCE");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/SalarieSQLElement.java
15,6 → 15,7
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.common.element.NumerotationAutoSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.element.ContactItemTable;
import org.openconcerto.erp.core.edm.AttachmentAction;
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.ElementSQLObject;
25,15 → 26,17
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.UndefinedRowValuesCache;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.EditPanel.EditMode;
import org.openconcerto.sql.view.EditPanelListener;
import org.openconcerto.sql.view.EditPanel.EditMode;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.FormLayouter;
import org.openconcerto.ui.FrameUtil;
import org.openconcerto.ui.warning.JLabelWarning;
import org.openconcerto.utils.checks.ValidState;
46,9 → 49,11
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
 
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
94,6 → 99,7
try {
rowInfosAncien.createEmptyUpdateRow().put("ID_SALARIE", rowSelected.getID()).commit();
rowSelected.createEmptyUpdateRow().put("ID_INFOS_SALARIE_PAYE", id).commit();
infosPayeElement.getTable().getRow(id).createEmptyUpdateRow().put("ID_SALARIE", rowSelected.getID()).commit();
} catch (SQLException e) {
e.printStackTrace();
}
141,7 → 147,7
return new BaseSQLComponent(this) {
private final JLabel warningCodeSalLabel = new JLabelWarning();
private final JTextField textCode = new JTextField();
 
ContactItemTable tableContact = new ContactItemTable(UndefinedRowValuesCache.getInstance().getDefaultRowValues(getTable().getTable("CONTACT_SALARIE")));
private JTabbedPane tabbedPane;
private final SQLTable tableNum = getTable().getBase().getTable("NUMEROTATION_AUTO");
 
206,6 → 212,18
}
});
 
// User
final JLabel labelUser = new JLabel(getLabelFor("ID_USER_COMMON"));
final ElementComboBox comboUser = new ElementComboBox(false, 50);
c.gridx = 0;
c.gridy++;
this.add(labelUser, c);
c.gridx++;
c.weightx = 0;
c.fill = GridBagConstraints.NONE;
this.add(comboUser, c);
this.addView(comboUser, "ID_USER_COMMON");
 
/***********************************************************************************
* TABBED PANE
**********************************************************************************/
218,6 → 236,18
scrollEtatCivil.setBorder(null);
this.tabbedPane.add("Etat Civil", scrollEtatCivil);
 
// Contact
JPanel panelContact = new JPanel(new GridBagLayout());
DefaultGridBagConstraints cContact = new DefaultGridBagConstraints();
cContact.weighty = 1;
cContact.weightx = 1;
cContact.fill = GridBagConstraints.BOTH;
 
panelContact.add(tableContact, cContact);
JScrollPane scrollContact = new JScrollPane(panelContact);
scrollContact.setBorder(null);
this.tabbedPane.add("Contacts", scrollContact);
 
// Règlement de la paye
this.addView("ID_REGLEMENT_PAYE", REQ + ";" + DEC + ";" + SEP);
ElementSQLObject eltReglPaye = (ElementSQLObject) this.getView("ID_REGLEMENT_PAYE");
286,7 → 316,18
this.tabbedPane.add("Cumuls et variables de la période", new JScrollPane(panelAllCumul));
// this.tabbedPane.setEnabledAt(this.tabbedPane.getTabCount() - 1, false);
 
Map<String, JComponent> additionalFields = getElement().getAdditionalFields();
if (additionalFields != null && additionalFields.size() > 0) {
// Champ Module
c.gridx = 0;
c.gridy++;
c.gridwidth = GridBagConstraints.REMAINDER;
final JPanel addP = ComptaSQLConfElement.createAdditionalPanel();
this.setAdditionalFieldsPanel(new FormLayouter(addP, 2));
this.tabbedPane.add("Compléments", new JScrollPane(addP));
}
 
c.gridy++;
c.gridx = 0;
c.weighty = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
335,15 → 376,19
* }
*/
checkCode();
if (r != null) {
this.tableContact.insertFrom("ID_SALARIE", r.asRowValues());
}
}
 
public void update() {
 
super.update();
 
SQLTable tableFichePaye = getTable().getBase().getTable("FICHE_PAYE");
SQLRowValues rowVals = new SQLRowValues(tableFichePaye);
rowVals.put("ID_SALARIE", getSelectedID());
rowVals.put("ID_SALARIE",
 
getSelectedID());
SQLRow row = getTable().getRow(getSelectedID());
try {
rowVals.update(row.getInt("ID_FICHE_PAYE"));
350,6 → 395,7
} catch (SQLException e) {
e.printStackTrace();
}
this.tableContact.updateField("ID_SALARIE", getSelectedID());
}
 
public int insert(SQLRow order) {
387,9 → 433,10
e.printStackTrace();
}
}
 
this.tableContact.updateField("ID_SALARIE", id);
return id;
}
 
};
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/ContratSalarieSQLElement.java
113,6 → 113,20
c.weightx = 1;
this.add(selCodeCatSocio, c);
 
JLabel complPCSLabel = new JLabel(getLabelFor("COMPLEMENT_PCS"));
complPCSLabel.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField complPCS = new JTextField();
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(complPCSLabel, c);
c.gridx++;
c.weightx = 1;
this.add(complPCS, c);
addView(complPCS,"COMPLEMENT_PCS");
 
// Contrat de travail
JLabel labelContratTravail = new JLabel(getLabelFor("ID_CODE_CONTRAT_TRAVAIL"));
labelContratTravail.setHorizontalAlignment(SwingConstants.RIGHT);
225,87 → 239,91
this.add(selFF, c);
this.addSQLObject(selFF, "ID_CONTRAT_MOTIF_RECOURS");
 
// Code Arrco, agirc retirés du contrat et ajoutés dans les caisses de cotisations
 
// Code UGRR
JLabel labelCodeUGRR = new JLabel(getLabelFor("CODE_IRC_UGRR"));
labelCodeUGRR.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField textCodeUGRR = new JTextField();
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(labelCodeUGRR, c);
c.gridx++;
c.weighty = 1;
c.weightx = 1;
this.add(textCodeUGRR, c);
addView(textCodeUGRR, "CODE_IRC_UGRR");
 
JLabel labelNumUGRR = new JLabel(getLabelFor("NUMERO_RATTACHEMENT_UGRR"));
labelNumUGRR.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField textNumUGRR = new JTextField();
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(labelNumUGRR, c);
c.gridx++;
c.weighty = 1;
c.weightx = 1;
this.add(textNumUGRR, c);
addView(textNumUGRR, "NUMERO_RATTACHEMENT_UGRR");
// JLabel labelCodeUGRR = new JLabel(getLabelFor("CODE_IRC_UGRR"));
// labelCodeUGRR.setHorizontalAlignment(SwingConstants.RIGHT);
// JTextField textCodeUGRR = new JTextField();
// c.gridy++;
// c.gridx = 0;
// c.weightx = 0;
// this.add(labelCodeUGRR, c);
// c.gridx++;
// c.weighty = 1;
// c.weightx = 1;
// this.add(textCodeUGRR, c);
// addView(textCodeUGRR, "CODE_IRC_UGRR");
//
// JLabel labelNumUGRR = new JLabel(getLabelFor("NUMERO_RATTACHEMENT_UGRR"));
// labelNumUGRR.setHorizontalAlignment(SwingConstants.RIGHT);
// JTextField textNumUGRR = new JTextField();
// c.gridy++;
// c.gridx = 0;
// c.weightx = 0;
// this.add(labelNumUGRR, c);
// c.gridx++;
// c.weighty = 1;
// c.weightx = 1;
// this.add(textNumUGRR, c);
// addView(textNumUGRR, "NUMERO_RATTACHEMENT_UGRR");
//
// // Code UGRC
// JLabel labelCodeUGRC = new JLabel(getLabelFor("CODE_IRC_UGRC"));
// labelCodeUGRC.setHorizontalAlignment(SwingConstants.RIGHT);
// JTextField textCodeUGRC = new JTextField();
// c.gridy++;
// c.gridx = 0;
// c.weightx = 0;
// this.add(labelCodeUGRC, c);
// c.gridx++;
// c.weighty = 1;
// c.weightx = 1;
// this.add(textCodeUGRC, c);
// addView(textCodeUGRC, "CODE_IRC_UGRC");
//
// JLabel labelNumUGRC = new JLabel(getLabelFor("NUMERO_RATTACHEMENT_UGRC"));
// labelNumUGRC.setHorizontalAlignment(SwingConstants.RIGHT);
// JTextField textNumUGRC = new JTextField();
// c.gridy++;
// c.gridx = 0;
// c.weightx = 0;
// this.add(labelNumUGRC, c);
// c.gridx++;
// c.weighty = 1;
// c.weightx = 1;
// this.add(textNumUGRC, c);
// addView(textNumUGRC, "NUMERO_RATTACHEMENT_UGRC");
//
// // Retraite
// JLabel labelCodeRetraite = new JLabel(getLabelFor("CODE_IRC_RETRAITE"));
// labelCodeRetraite.setHorizontalAlignment(SwingConstants.RIGHT);
// JTextField textCodeRetraite = new JTextField();
// c.gridy++;
// c.gridx = 0;
// c.weightx = 0;
// this.add(labelCodeRetraite, c);
// c.gridx++;
// c.weighty = 1;
// c.weightx = 1;
// this.add(textCodeRetraite, c);
// addView(textCodeRetraite, "CODE_IRC_RETRAITE");
//
// JLabel labelNumRetraite = new
// JLabel(getLabelFor("NUMERO_RATTACHEMENT_RETRAITE"));
// labelNumRetraite.setHorizontalAlignment(SwingConstants.RIGHT);
// JTextField textNumRetraite = new JTextField();
// c.gridy++;
// c.gridx = 0;
// c.weightx = 0;
// this.add(labelNumRetraite, c);
// c.gridx++;
// c.weighty = 1;
// c.weightx = 1;
// this.add(textNumRetraite, c);
// addView(textNumRetraite, "NUMERO_RATTACHEMENT_RETRAITE");
 
// Code UGRC
JLabel labelCodeUGRC = new JLabel(getLabelFor("CODE_IRC_UGRC"));
labelCodeUGRC.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField textCodeUGRC = new JTextField();
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(labelCodeUGRC, c);
c.gridx++;
c.weighty = 1;
c.weightx = 1;
this.add(textCodeUGRC, c);
addView(textCodeUGRC, "CODE_IRC_UGRC");
 
JLabel labelNumUGRC = new JLabel(getLabelFor("NUMERO_RATTACHEMENT_UGRC"));
labelNumUGRC.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField textNumUGRC = new JTextField();
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(labelNumUGRC, c);
c.gridx++;
c.weighty = 1;
c.weightx = 1;
this.add(textNumUGRC, c);
addView(textNumUGRC, "NUMERO_RATTACHEMENT_UGRC");
 
// Retraite
JLabel labelCodeRetraite = new JLabel(getLabelFor("CODE_IRC_RETRAITE"));
labelCodeRetraite.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField textCodeRetraite = new JTextField();
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(labelCodeRetraite, c);
c.gridx++;
c.weighty = 1;
c.weightx = 1;
this.add(textCodeRetraite, c);
addView(textCodeRetraite, "CODE_IRC_RETRAITE");
 
JLabel labelNumRetraite = new JLabel(getLabelFor("NUMERO_RATTACHEMENT_RETRAITE"));
labelNumRetraite.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField textNumRetraite = new JTextField();
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(labelNumRetraite, c);
c.gridx++;
c.weighty = 1;
c.weightx = 1;
this.add(textNumRetraite, c);
addView(textNumRetraite, "NUMERO_RATTACHEMENT_RETRAITE");
 
// JLabel labelCodeRegimeRetraite = new
// JLabel(getLabelFor("CODE_REGIME_RETRAITE_DSN"));
// labelCodeRegimeRetraite.setHorizontalAlignment(SwingConstants.RIGHT);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/employe/element/EtatCivilSQLElement.java
293,7 → 293,7
c.gridwidth = 1;
c.weightx = 1;
JTextField fieldNTT = new JTextField();
panelSituation.add(fieldCNPS, c);
panelSituation.add(fieldNTT, c);
c.weightx = 0;
c.gridwidth = 1;
addView(fieldNTT, "NTT");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/credit/component/AvoirClientSQLComponent.java
27,6 → 27,7
import org.openconcerto.erp.core.common.ui.TotalPanel;
import org.openconcerto.erp.core.customerrelationship.customer.ui.AddressChoiceUI;
import org.openconcerto.erp.core.customerrelationship.customer.ui.AdresseType;
import org.openconcerto.erp.core.customerrelationship.customer.ui.CategorieComptableChoiceUI;
import org.openconcerto.erp.core.finance.accounting.element.ComptePCESQLElement;
import org.openconcerto.erp.core.finance.accounting.element.EcritureSQLElement;
import org.openconcerto.erp.core.finance.payment.component.ModeDeReglementSQLComponent;
193,6 → 194,9
boxTarif.setValue(foreignRow.getID());
}
}
if (!isFilling()) {
AvoirClientSQLComponent.this.table.setClient(row, true);
}
 
} else {
table.setRowCatComptable(null);
423,7 → 427,25
}
});
}
if (prefs.getBoolean(GestionCommercialeGlobalPreferencePanel.CATEGORIE_COMPTABLE_SPEC, false)) {
// cat spe
final CategorieComptableChoiceUI catUI = new CategorieComptableChoiceUI();
catUI.addToUI(this, c);
catUI.getCombo().addModelListener("wantedID", new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
int wantedID = catUI.getCombo().getWantedID();
if (wantedID != SQLRow.NONEXISTANT_ID && wantedID >= SQLRow.MIN_VALID_ID) {
table.setRowCatComptable(catUI.getCombo().getElement().getTable().getRow(wantedID));
} else {
table.setRowCatComptable(null);
}
}
});
 
}
 
final ComptaPropsConfiguration comptaPropsConfiguration = ((ComptaPropsConfiguration) Configuration.getInstance());
 
// Contact
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/order/element/CommandeClientSQLElement.java
22,7 → 22,9
import org.openconcerto.erp.core.sales.order.component.CommandeClientSQLComponent;
import org.openconcerto.erp.core.sales.order.report.CommandeClientXmlSheet;
import org.openconcerto.erp.core.sales.order.ui.EtatCommandeClient;
import org.openconcerto.erp.core.sales.product.element.ReferenceArticleSQLElement;
import org.openconcerto.erp.core.sales.product.element.UniteVenteArticleSQLElement;
import org.openconcerto.erp.core.sales.product.model.ProductComponent;
import org.openconcerto.erp.core.sales.product.model.ProductHelper;
import org.openconcerto.erp.core.sales.shipment.component.BonDeLivraisonSQLComponent;
import org.openconcerto.erp.core.supplychain.stock.element.MouvementStockSQLElement;
import org.openconcerto.erp.core.supplychain.stock.element.StockSQLElement;
36,7 → 38,6
import org.openconcerto.sql.element.TreesOfSQLRows;
import org.openconcerto.sql.model.ConnectionHandlerNoSetup;
import org.openconcerto.sql.model.SQLDataSource;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLInjector;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
579,43 → 580,68
public void transfertCommande(int commandeID, boolean useCommandeEnCours) {
 
SQLElement elt = Configuration.getInstance().getDirectory().getElement("COMMANDE_CLIENT_ELEMENT");
SQLTable tableCmdElt = Configuration.getInstance().getDirectory().getElement("COMMANDE_ELEMENT").getTable();
SQLElement eltArticle = Configuration.getInstance().getDirectory().getElement("ARTICLE");
SQLRow rowCmd = getTable().getRow(commandeID);
List<SQLRow> rows = rowCmd.getReferentRows(elt.getTable());
transfertEltToCommandeF(rows);
}
 
public void transfertEltToCommandeF(List<? extends SQLRowAccessor> rowsItems) {
ComptaPropsConfiguration.getInstanceCompta().getNonInteractiveSQLExecutor().execute(new Runnable() {
 
@Override
public void run() {
ProductHelper helper = new ProductHelper(getTable().getDBRoot());
List<ProductComponent> productComp = new ArrayList<>();
helper.fillProductComponent(rowsItems, productComp, 1, 0, 1);
 
List<ProductComponent> leafItems = helper.getChildWithQtyFrom(productComp);
 
final ListMap<SQLRow, SQLRowValues> map = new ListMap<SQLRow, SQLRowValues>();
for (SQLRow sqlRow : rows) {
// on récupére l'article qui lui correspond
SQLRowValues rowArticle = new SQLRowValues(eltArticle.getTable());
for (SQLField field : eltArticle.getTable().getFields()) {
if (sqlRow.getTable().getFieldsName().contains(field.getName())) {
rowArticle.put(field.getName(), sqlRow.getObject(field.getName()));
final Set<Integer> stockChecked = new HashSet<Integer>();
for (ProductComponent comp : leafItems) {
SQLRowAccessor rowArticleFind = comp.getProduct();
 
SQLRow row = rowArticleFind.asRow();
SQLRowAccessor rowStock = comp.getStock();
int value = 0;
if (row.getBoolean("GESTION_STOCK") && !stockChecked.contains(rowStock.getID())) {
stockChecked.add(rowStock.getID());
 
value = -Math.round(rowStock.getFloat("QTE_TH") - rowStock.getFloat("QTE_MIN"));
} else if (!row.getBoolean("GESTION_STOCK")) {
value = comp.getQty().intValue();
}
if (value > 0) {
 
SQLInjector inj = SQLInjector.getInjector(row.getTable(), row.getTable().getTable("COMMANDE_ELEMENT"));
SQLRowValues rowValsElt = new SQLRowValues(inj.createRowValuesFrom(row));
 
int qte = 1;
BigDecimal qteUV = BigDecimal.ONE;
 
if (row.getObject("ID_UNITE_VENTE") != null && row.getForeignID("ID_UNITE_VENTE") != UniteVenteArticleSQLElement.A_LA_PIECE) {
qteUV = comp.getQty();
} else {
qte = comp.getQty().setScale(0, RoundingMode.HALF_UP).intValue();
}
 
int idArticle = ReferenceArticleSQLElement.getIdForCNM(rowArticle, true);
SQLRow rowArticleFind = eltArticle.getTable().getRow(idArticle);
if (rowArticleFind != null && !rowArticleFind.isUndefined()) {
SQLInjector inj = SQLInjector.getInjector(rowArticle.getTable(), tableCmdElt);
SQLRowValues rowValsElt = new SQLRowValues(inj.createRowValuesFrom(rowArticleFind));
rowValsElt.put("ID_STYLE", sqlRow.getObject("ID_STYLE"));
rowValsElt.put("QTE", sqlRow.getObject("QTE"));
rowValsElt.put("QTE", qte);
rowValsElt.put("QTE_UNITAIRE", qteUV);
 
rowValsElt.put("T_POIDS", rowValsElt.getLong("POIDS") * rowValsElt.getInt("QTE"));
rowValsElt.put("T_PA_HT", ((BigDecimal) rowValsElt.getObject("PA_HT")).multiply(new BigDecimal(rowValsElt.getInt("QTE")), DecimalUtils.HIGH_PRECISION));
rowValsElt.put("T_PA_TTC",
((BigDecimal) rowValsElt.getObject("T_PA_HT")).multiply(new BigDecimal((rowValsElt.getForeign("ID_TAXE").getFloat("TAUX") / 100.0 + 1.0)), DecimalUtils.HIGH_PRECISION));
final SQLRow foreignRow = rowArticleFind.getForeignRow("ID_FOURNISSEUR");
if (foreignRow != null && !foreignRow.isUndefined()) {
rowValsElt.put("ID_DEVISE", foreignRow.getForeignID("ID_DEVISE"));
} else {
rowValsElt.put("ID_DEVISE", rowCmd.getForeignRow("ID_TARIF").getForeignID("ID_DEVISE"));
rowValsElt.put("T_PA_TTC", ((BigDecimal) rowValsElt.getObject("T_PA_HT")).multiply(new BigDecimal((rowValsElt.getForeign("ID_TAXE").getFloat("TAUX") / 100.0 + 1.0)),
DecimalUtils.HIGH_PRECISION));
// rowValsElt.put("ID_DEVISE",
// rowCmd.getForeignRow("ID_TARIF").getForeignID("ID_DEVISE"));
map.add(rowArticleFind.getForeign("ID_FOURNISSEUR").asRow(), rowValsElt);
}
map.add(rowArticleFind.getForeignRow("ID_FOURNISSEUR"), rowValsElt);
}
 
}
MouvementStockSQLElement.createCommandeF(map, rowCmd.getForeignRow("ID_TARIF").getForeignRow("ID_DEVISE"), rowCmd.getString("NUMERO") + " - " + rowCmd.getString("NOM"), useCommandeEnCours);
MouvementStockSQLElement.createCommandeF(map, null, "");
}
});
}
 
/**
* Transfert en BL
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/order/element/CommandeClientElementSQLElement.java
16,11 → 16,11
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.sales.product.element.ReferenceArticleSQLElement;
import org.openconcerto.erp.core.sales.product.element.UniteVenteArticleSQLElement;
import org.openconcerto.erp.core.supplychain.stock.element.MouvementStockSQLElement;
import org.openconcerto.erp.core.supplychain.stock.element.StockItemsUpdater;
import org.openconcerto.erp.core.supplychain.stock.element.StockItemsUpdater.TypeStockUpdate;
import org.openconcerto.erp.core.supplychain.stock.element.StockLabel;
import org.openconcerto.erp.core.supplychain.stock.element.StockSQLElement;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.element.UISQLComponent;
66,16 → 66,9
 
@Override
public void actionPerformed(ActionEvent e) {
final List<SQLRowValues> selectedRows = IListe.get(e).getSelectedRows();
ComptaPropsConfiguration.getInstanceCompta().getNonInteractiveSQLExecutor().execute(new Runnable() {
 
@Override
public void run() {
 
createCommandeF(selectedRows);
final List<SQLRow> rows = SQLRowListRSH.fetch(IListe.get(e).getRequest().getPrimaryTable(), IListe.get(e).getSelection().getSelectedIDs());
((CommandeClientSQLElement) getForeignElement("ID_COMMANDE_CLIENT")).transfertEltToCommandeF(rows);
}
});
}
 
}, true);
rowAction.setPredicate(IListeEvent.getNonEmptySelectionPredicate());
214,6 → 207,7
l.add("NOM");
l.add("ID_COMMANDE_CLIENT");
l.add("ID_ARTICLE");
l.add("ID_DEPOT_STOCK");
l.add("PA_HT");
l.add("PV_HT");
l.add("T_PA_HT");
234,6 → 228,11
*/
public void transfertCommande(List<SQLRowValues> commandeClientEltsRows) {
 
ComptaPropsConfiguration.getInstanceCompta().getNonInteractiveSQLExecutor().execute(new Runnable() {
 
@Override
public void run() {
 
SQLTable tableCmdElt = getDirectory().getElement("COMMANDE_ELEMENT").getTable();
SQLElement eltArticle = getDirectory().getElement("ARTICLE");
 
240,10 → 239,26
final ListMap<SQLRow, SQLRowValues> map = new ListMap<SQLRow, SQLRowValues>();
List<String> fields2copy = Arrays.asList("CODE", "NOM", "VALEUR_METRIQUE_1", "VALEUR_METRIQUE_2", "VALEUR_METRIQUE_3");
 
// Set<Integer> art = new HashSet<Integer>();
Set<Integer> artAdded = new HashSet<Integer>();
for (SQLRowValues sqlRow : commandeClientEltsRows) {
boolean article = false;
if (sqlRow.getTable().getName().equalsIgnoreCase("ARTICLE")) {
article = true;
}
 
// renderer sur liste des ar
 
// if()
 
/// rowValsElt.put("QTE", sqlRow.getObject("QTE"));
SQLRowAccessor rowArticleFind;
SQLRowValues rowArticle;
int qte = 1;
BigDecimal qteUV = BigDecimal.ONE;
boolean gestionStock = true;
if (!article) {
// on récupére l'article qui lui correspond
SQLRowValues rowArticle = new SQLRowValues(eltArticle.getTable());
rowArticle = new SQLRowValues(eltArticle.getTable());
for (String field : fields2copy) {
// if (sqlRow.getTable().getFieldsName().contains(field.getName())) {
rowArticle.put(field, sqlRow.asRow().getObject(field));
251,54 → 266,43
}
 
int idArticle = ReferenceArticleSQLElement.getIdForCNM(rowArticle, true);
SQLRow rowArticleFind = eltArticle.getTable().getRow(idArticle);
if (rowArticleFind != null && !rowArticleFind.isUndefined()) {
SQLInjector inj = SQLInjector.getInjector(rowArticle.getTable(), tableCmdElt);
SQLRowValues rowValsElt = new SQLRowValues(inj.createRowValuesFrom(rowArticleFind));
rowValsElt.put("ID_STYLE", sqlRow.getObject("ID_STYLE"));
rowArticleFind = eltArticle.getTable().getRow(idArticle);
 
// if()
gestionStock = rowArticleFind.getBoolean("GESTION_STOCK");
if (!gestionStock) {
qte = sqlRow.getInt("QTE");
qteUV = sqlRow.getBigDecimal("QTE_UNITAIRE");
 
rowValsElt.put("QTE", sqlRow.getObject("QTE"));
rowValsElt.put("T_POIDS", rowValsElt.getLong("POIDS") * rowValsElt.getInt("QTE"));
rowValsElt.put("T_PA_HT", ((BigDecimal) rowValsElt.getObject("PA_HT")).multiply(new BigDecimal(rowValsElt.getInt("QTE")), DecimalUtils.HIGH_PRECISION));
rowValsElt.put("T_PA_TTC",
((BigDecimal) rowValsElt.getObject("T_PA_HT")).multiply(new BigDecimal((rowValsElt.getForeign("ID_TAXE").getFloat("TAUX") / 100.0 + 1.0)), DecimalUtils.HIGH_PRECISION));
// rowValsElt.put("ID_DEVISE",
// rowCmd.getForeignRow("ID_TARIF").getForeignID("ID_DEVISE"));
map.add(rowArticleFind.getForeignRow("ID_FOURNISSEUR"), rowValsElt);
if (sqlRow.getObject("ID_UNITE_VENTE") != null && sqlRow.getForeignID("ID_UNITE_VENTE") != UniteVenteArticleSQLElement.A_LA_PIECE) {
qteUV = qteUV.multiply(new BigDecimal(qte));
qte = 1;
}
 
} else {
if (rowArticle.getForeign("ID_STOCK") != null && !rowArticle.isForeignEmpty("ID_STOCK")) {
SQLRowAccessor rowStock = rowArticle.getForeign("ID_STOCK");
qte = -Math.round(rowStock.getFloat("QTE_TH") - rowStock.getFloat("QTE_MIN"));
}
// TODO
MouvementStockSQLElement.createCommandeF(map, null, "", false);
}
} else {
rowArticleFind = sqlRow;
rowArticle = sqlRow;
if (rowArticle.getForeign("ID_STOCK") != null && !rowArticle.isForeignEmpty("ID_STOCK")) {
SQLRowAccessor rowStock = rowArticle.getForeign("ID_STOCK");
qte = -Math.round(rowStock.getFloat("QTE_TH") - rowStock.getFloat("QTE_MIN"));
}
}
if (rowArticleFind != null && !rowArticleFind.isUndefined() && (!gestionStock || !artAdded.contains(rowArticleFind.getID()))) {
 
public void createCommandeF(final List<? extends SQLRowAccessor> rowsItems) {
artAdded.add(rowArticleFind.getID());
 
ComptaPropsConfiguration.getInstanceCompta().getNonInteractiveSQLExecutor().execute(new Runnable() {
SQLInjector inj = SQLInjector.getInjector(rowArticle.getTable(), tableCmdElt);
SQLRowValues rowValsElt = new SQLRowValues(inj.createRowValuesFrom(rowArticleFind.asRow()));
 
@Override
public void run() {
final ListMap<SQLRow, SQLRowValues> map = new ListMap<SQLRow, SQLRowValues>();
final Set<Integer> stockChecked = new HashSet<Integer>();
for (SQLRowAccessor rowItem : rowsItems) {
if (rowItem.getObject("ID_ARTICLE") != null && !rowItem.isForeignEmpty("ID_ARTICLE")) {
SQLRowAccessor rowArticleFind = rowItem.getForeign("ID_ARTICLE");
rowValsElt.put("ID_STYLE", sqlRow.getObject("ID_STYLE"));
 
SQLRow row = rowArticleFind.asRow();
SQLRowAccessor rowStock = StockSQLElement.getStock(rowItem);
if (!stockChecked.contains(rowStock.getID())) {
stockChecked.add(rowStock.getID());
rowValsElt.put("QTE", qte);
rowValsElt.put("QTE_UNITAIRE", qteUV);
 
int value = -Math.round(rowStock.getFloat("QTE_TH") - rowStock.getFloat("QTE_MIN"));
 
if (value > 0) {
 
SQLInjector inj = SQLInjector.getInjector(row.getTable(), row.getTable().getTable("COMMANDE_ELEMENT"));
SQLRowValues rowValsElt = new SQLRowValues(inj.createRowValuesFrom(row));
 
rowValsElt.put("QTE", value);
rowValsElt.put("T_POIDS", rowValsElt.getLong("POIDS") * rowValsElt.getInt("QTE"));
rowValsElt.put("T_PA_HT", ((BigDecimal) rowValsElt.getObject("PA_HT")).multiply(new BigDecimal(rowValsElt.getInt("QTE")), DecimalUtils.HIGH_PRECISION));
rowValsElt.put("T_PA_TTC", ((BigDecimal) rowValsElt.getObject("T_PA_HT")).multiply(new BigDecimal((rowValsElt.getForeign("ID_TAXE").getFloat("TAUX") / 100.0 + 1.0)),
305,15 → 309,13
DecimalUtils.HIGH_PRECISION));
// rowValsElt.put("ID_DEVISE",
// rowCmd.getForeignRow("ID_TARIF").getForeignID("ID_DEVISE"));
map.add(rowArticleFind.getForeign("ID_FOURNISSEUR").asRow(), rowValsElt);
map.add(rowArticleFind.asRow().getForeignRow("ID_FOURNISSEUR"), rowValsElt);
}
}
 
MouvementStockSQLElement.createCommandeF(map, null, "");
}
}
MouvementStockSQLElement.createCommandeF(map, null, "", false);
}
});
 
}
 
protected List<String> getComboFields() {
338,7 → 340,7
res.putCollection("ID_COMMANDE_CLIENT", "NUMERO", "DATE", "DATE_LIVRAISON_PREV", "ID_CLIENT");
 
if (getTable().contains("ID_ARTICLE")) {
res.putCollection("ID_ARTICLE", "ID_FAMILLE_ARTICLE", "ID_FOURNISSEUR");
res.putCollection("ID_ARTICLE", "GESTION_STOCK", "ID_FAMILLE_ARTICLE", "ID_FOURNISSEUR");
}
res.putCollection(null, "NOM");
return res;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/order/action/ListeDesElementsACommanderClientAction.java
18,6 → 18,7
import org.openconcerto.erp.core.common.ui.IListFilterDatePanel;
import org.openconcerto.erp.core.common.ui.ListeViewPanel;
import org.openconcerto.erp.core.sales.order.element.CommandeClientElementSQLElement;
import org.openconcerto.erp.core.sales.product.ui.QteAcommanderRenderer;
import org.openconcerto.erp.core.supplychain.stock.element.StockSQLElement;
import org.openconcerto.erp.preferences.GestionArticleGlobalPreferencePanel;
import org.openconcerto.sql.element.SQLElement;
124,14 → 125,17
protected Object show_(SQLRowAccessor r) {
 
final SQLRowAccessor foreign = r.getForeign("ID_ARTICLE");
 
if (foreign != null && !foreign.isUndefined()) {
if (foreign.getBoolean("GESTION_STOCK")) {
SQLRowAccessor foreign2 = StockSQLElement.getStockFetched(r);
if (foreign2 != null && !foreign2.isUndefined()) {
return foreign2.getFloat("QTE_REEL");
}
}
return 0F;
}
return null;
}
 
@Override
public Set<FieldPath> getPaths() {
150,13 → 154,16
 
final SQLRowAccessor foreign = r.getForeign("ID_ARTICLE");
if (foreign != null && !foreign.isUndefined()) {
if (foreign.getBoolean("GESTION_STOCK")) {
 
SQLRowAccessor foreign2 = StockSQLElement.getStockFetched(r);
if (foreign2 != null && !foreign2.isUndefined()) {
return foreign2.getFloat("QTE_TH");
}
}
return 0F;
}
return null;
}
 
@Override
public Set<FieldPath> getPaths() {
175,13 → 182,16
 
final SQLRowAccessor foreign = r.getForeign("ID_ARTICLE");
if (foreign != null && !foreign.isUndefined()) {
if (foreign.getBoolean("GESTION_STOCK")) {
 
SQLRowAccessor foreign2 = StockSQLElement.getStockFetched(r);
if (foreign2 != null && !foreign2.isUndefined()) {
return foreign2.getFloat("QTE_MIN");
}
}
return 0F;
}
return null;
}
 
@Override
public Set<FieldPath> getPaths() {
200,6 → 210,8
 
final SQLRowAccessor foreign = r.getForeign("ID_ARTICLE");
if (foreign != null && !foreign.isUndefined()) {
if (foreign.getBoolean("GESTION_STOCK")) {
 
SQLRowAccessor foreign2 = StockSQLElement.getStockFetched(r);
if (foreign2 != null && !foreign2.isUndefined()) {
float qteMin = foreign2.getFloat("QTE_MIN");
206,10 → 218,13
float manque = foreign2.getFloat("QTE_TH") - qteMin;
if (manque < 0) {
return -manque;
} else {
return 0f;
}
}
}
return 0F;
}
return r.getBigDecimal("QTE_UNITAIRE").multiply(new BigDecimal(r.getInt("QTE"))).floatValue();
 
}
 
222,7 → 237,7
}
};
tableSource.getColumns().add(colSug);
// colLiv2.setRenderer(new PercentTableCellRenderer());
colSug.setRenderer(new QteAcommanderRenderer());
 
return tableSource;
}
314,7 → 329,7
@Override
public void actionPerformed(ActionEvent e) {
List<SQLRowValues> selectedRows = IListe.get(e).getSelectedRows();
eltCmd.createCommandeF(selectedRows);
eltCmd.transfertCommande(selectedRows);
}
}, true);
predicateACtion.setPredicate(IListeEvent.getNonEmptySelectionPredicate());
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/order/component/CommandeClientSQLComponent.java
23,6 → 23,7
import org.openconcerto.erp.core.common.ui.TotalPanel;
import org.openconcerto.erp.core.customerrelationship.customer.ui.AddressChoiceUI;
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.report.CommandeClientXmlSheet;
import org.openconcerto.erp.core.sales.order.ui.CommandeClientItemTable;
255,8 → 256,16
// }
// table.setTarif(foreignRow, true);
}
if (!isFilling()) {
table.setClient(row, true);
}
 
} else {
if (!isFilling()) {
table.setClient(null, true);
}
}
}
 
}
});
393,6 → 402,24
});
}
 
if (prefs.getBoolean(GestionCommercialeGlobalPreferencePanel.CATEGORIE_COMPTABLE_SPEC, false)) {
// cat spe
final CategorieComptableChoiceUI catUI = new CategorieComptableChoiceUI();
catUI.addToUI(this, c);
catUI.getCombo().addModelListener("wantedID", new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
int wantedID = catUI.getCombo().getWantedID();
if (wantedID != SQLRow.NONEXISTANT_ID && wantedID >= SQLRow.MIN_VALID_ID) {
table.setRowCatComptable(catUI.getCombo().getElement().getTable().getRow(wantedID));
} else {
table.setRowCatComptable(null);
}
}
});
}
 
if (prefs.getBoolean(GestionCommercialeGlobalPreferencePanel.ORDER_PACKAGING_MANAGEMENT, true)) {
// Emballage
c.gridy++;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/invoice/element/EcheanceClientSQLElement.java
18,7 → 18,11
import org.openconcerto.erp.core.common.element.NumerotationAutoSQLElement;
import org.openconcerto.erp.core.common.ui.DeviseField;
import org.openconcerto.erp.core.customerrelationship.customer.element.RelanceSQLElement;
import org.openconcerto.erp.core.customerrelationship.mail.EmailTemplate;
import org.openconcerto.erp.core.customerrelationship.mail.ValueListener;
import org.openconcerto.erp.core.finance.accounting.element.MouvementSQLElement;
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.VenteFactureXmlSheet;
import org.openconcerto.erp.rights.ComptaUserRight;
26,18 → 30,25
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.ConnectionHandlerNoSetup;
import org.openconcerto.sql.model.FieldPath;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLDataSource;
import org.openconcerto.sql.model.SQLField;
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.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.model.graph.Link;
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.sql.model.graph.PathBuilder;
import org.openconcerto.sql.request.ListSQLRequest;
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.utils.SQLUtils;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.EditPanel.EditMode;
import org.openconcerto.sql.view.list.BaseSQLTableModelColumn;
49,11 → 60,15
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.EmailComposer;
import org.openconcerto.ui.JDate;
import org.openconcerto.ui.SwingThreadUtils;
import org.openconcerto.utils.CollectionUtils;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.GestionDevise;
import org.openconcerto.utils.ListMap;
 
import java.awt.Component;
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
62,6 → 77,7
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
71,7 → 87,6
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
 
public class EcheanceClientSQLElement extends ComptaSQLConfElement {
 
111,16 → 126,90
}
 
{
PredicateRowAction action = new PredicateRowAction(new AbstractAction("Envoyer un mail") {
PredicateRowAction action = new PredicateRowAction(new AbstractAction("Envoyer un mail de relance") {
 
@Override
public void actionPerformed(ActionEvent arg0) {
public void actionPerformed(ActionEvent e) {
final IListe iListe = IListe.get(e);
if (iListe.getSelectedRows().isEmpty()) {
int result = JOptionPane.showConfirmDialog(iListe,
"Souhaitez vous envoyer un email de relance pour toutes les factures\ndont l'échéance est dépassée?\nLes relances ne seront pas envoyées si les factures ont déjà  une relance de moins d'un mois. ",
"Relance automatique", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION) {
EmailTemplate.askTemplate(iListe, getTable().getDBRoot(), new ValueListener() {
 
SQLRow row = IListe.get(arg0).fetchSelectedRow();
sendMail(row);
@Override
public void valueSelected(Object value) {
final Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
EmailTemplate template = (EmailTemplate) value;
final SQLTable table = getTable();
final SQLRowValues v = new SQLRowValues(table);
v.putNulls(table.getFieldsName());
Where w = new Where(table.getField("REGLE"), "=", false);
w = w.and(new Where(table.getField("REG_COMPTA"), "=", false));
final Calendar c = Calendar.getInstance();
c.add(Calendar.MONTH, -1);
w = w.and(new Where(table.getField("DATE_LAST_RELANCE"), ">", c.getTime()));
w = w.and(new Where(table.getField("DATE"), "<=", Calendar.getInstance().getTime()));
List<SQLRowValues> rowValues = SQLRowValuesListFetcher.create(v).fetch(w);
if (rowValues.isEmpty()) {
JOptionPane.showMessageDialog(iListe, "Aucune relance à  envoyer.");
} else {
for (SQLRowValues row : rowValues) {
sendMail(row.asRow(), template);
}
}, false);
action.setPredicate(IListeEvent.getSingleSelectionPredicate());
}
} catch (Exception e) {
ExceptionHandler.handle("erreur lors de l'envoi", e);
}
 
}
});
t.setDaemon(true);
t.setName("email relance");
t.start();
 
}
});
 
}
 
} else {
final SQLTable primaryTable = iListe.getRequest().getPrimaryTable();
final List<Integer> selectedIDs = iListe.getSelection().getSelectedIDs();
EmailTemplate.askTemplate(iListe, getTable().getDBRoot(), new ValueListener() {
 
@Override
public void valueSelected(Object value) {
final Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
EmailTemplate template = (EmailTemplate) value;
final List<SQLRow> rows = SQLRowListRSH.fetch(primaryTable, selectedIDs);
for (SQLRow row : rows) {
sendMail(row, template);
}
} catch (Exception e) {
ExceptionHandler.handle("erreur lors de l'envoi", e);
}
 
}
});
t.setDaemon(true);
t.setName("email relance selection");
t.start();
 
}
});
 
}
}
}, true);
action.setPredicate(IListeEvent.createTotalRowCountPredicate(0, Integer.MAX_VALUE));
getRowActions().add(action);
}
 
143,6 → 232,7
}
}
}, false) {
 
@Override
public boolean enabledFor(List<SQLRowValues> selection) {
if (selection != null && selection.size() == 1) {
184,6 → 274,7
}
}
}, false) {
 
@Override
public boolean enabledFor(List<SQLRowValues> selection) {
if (selection != null && selection.size() == 1) {
193,24 → 284,63
return true;
}
}
 
};
getRowActions().add(actionRegul);
}
 
RowAction actionImport = new RowAction(new AbstractAction("Importer") {
 
public void actionPerformed(ActionEvent e) {
 
final Frame frame = SwingThreadUtils.getAncestorOrSelf(Frame.class, (Component) e.getSource());
final FileDialog fd = new FileDialog(frame, "Import XML des réglements Sage", FileDialog.LOAD);
if (fd.getFile() != null) {
try {
SQLUtils.executeAtomic(getTable().getDBSystemRoot().getDataSource(), new ConnectionHandlerNoSetup<Object, IOException>() {
@Override
public Object handle(final SQLDataSource ds) throws SQLException, IOException {
 
ImportReglementSage sageImporter = new ImportReglementSage(getDirectory().getElement(EncaisserMontantSQLElement.class));
try {
sageImporter.importFromFile(new File(fd.getDirectory(), fd.getFile()));
} catch (Exception e) {
e.printStackTrace();
new SQLException(e);
}
return null;
}
 
});
JOptionPane.showMessageDialog(null, "Import des paiements terminés!");
} catch (IOException exn) {
ExceptionHandler.handle(frame, "Erreur lors de la lecture du fichier", exn);
} catch (SQLException exn) {
ExceptionHandler.handle(frame, "Erreur lors de l'insertion des paiements dans la base", exn);
}
 
private void sendMail(final SQLRow row) {
}
fd.setVisible(true);
}
}, true) {
@Override
public boolean enabledFor(List<SQLRowValues> selection) {
return true;
}
};
getRowActions().add(actionImport);
 
}
 
 
private void sendMail(final SQLRow row, EmailTemplate template) throws Exception {
 
SQLBase base = ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete();
 
if (row != null) {
 
int idMvtSource = MouvementSQLElement.getSourceId(row.getInt("ID_MOUVEMENT"));
SQLRow rowMvtSource = base.getTable("MOUVEMENT").getRow(idMvtSource);
 
if (!rowMvtSource.getString("SOURCE").equalsIgnoreCase("SAISIE_VENTE_FACTURE")) {
// this.relancer.setEnabled(false);
return;
}
int idFact = rowMvtSource.getInt("IDSOURCE");
242,16 → 372,12
}
final String adresseMail = mail;
 
MailRelanceCreator creator = new MailRelanceCreator();
final String references = creator.getObject(row);
final String text = creator.getValue(row);
MailRelanceCreator creator = new MailRelanceCreator(template, row);
final String references = creator.getObject();
final String text = creator.getValue();
 
final Thread t = new Thread() {
@Override
public void run() {
final File f;
 
final File f;
try {
f = sheet.getOrCreatePDFDocumentFile(true);
 
EmailComposer.getInstance().compose(adresseMail, references, text, f.getAbsoluteFile());
266,7 → 392,7
rowValsR.put("MONTANT", row.getObject("MONTANT"));
rowValsR.put("INFOS", "Email");
rowValsR.put("ID_ECHEANCE_CLIENT", row.getID());
try {
 
rowValsR.insert();
 
SQLTable tableNum = getTable().getBase().getTable("NUMEROTATION_AUTO");
287,26 → 413,8
 
rowValsEch.update(row.getID());
 
} catch (SQLException e) {
 
e.printStackTrace();
}
} catch (IOException exn) {
exn.printStackTrace();
} catch (InterruptedException exn) {
exn.printStackTrace();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
 
}
};
 
t.start();
}
}
 
@Override
public ListMap<String, String> getShowAs() {
ListMap<String, String> map = new ListMap<String, String>();
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/invoice/report/MailRelanceCreator.java
14,11 → 14,10
package org.openconcerto.erp.core.sales.invoice.report;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.customerrelationship.mail.EmailTemplate;
import org.openconcerto.erp.core.finance.payment.element.ModeDeReglementSQLElement;
import org.openconcerto.erp.preferences.MailRelancePreferencePanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.utils.GestionDevise;
 
30,10 → 29,18
 
public class MailRelanceCreator {
 
SQLRow rowEcheance;
private final EmailTemplate template;
private final SQLRow rowEcheance;
private final Map<String, String> map;
 
public MailRelanceCreator() {
public MailRelanceCreator(EmailTemplate template, SQLRow row) {
if (template == null) {
template = new EmailTemplate("defautl", getDefaultObject(), getDefaultValue(), true, "dd/MM/yyyy");
}
this.template = template;
this.rowEcheance = row;
 
this.map = getMapValues();
}
 
public String getDefaultObject() {
50,9 → 57,14
return value;
}
 
public Map<String, String> getMapValues(SQLRow rowEch, String datePattern) {
final Map<String, String> map = new HashMap<String, String>();
private Map<String, String> getMapValues() {
String datePattern = this.template.getDateFormat();
if (datePattern == null || datePattern.trim().isEmpty()) {
datePattern = "dd/MM/yyyy";
}
 
final Map<String, String> map = new HashMap<>();
 
final SQLRow rowSoc = ((ComptaPropsConfiguration) Configuration.getInstance()).getRowSociete();
final SQLRow rowSocAdresse = rowSoc.getForeignRow("ID_ADRESSE_COMMON");
SQLRow rowUser = rowSoc.getTable().getDBRoot().findTable("USER_COMMON").getRow(UserManager.getUser().getId());
84,7 → 96,7
map.put("SocieteVille", ville);
 
SQLRow rowClient;
final SQLRow clientRowNX = rowEch.getForeignRow("ID_CLIENT");
final SQLRow clientRowNX = this.rowEcheance.getForeignRow("ID_CLIENT");
rowClient = clientRowNX;
SQLRow rowAdresse = rowClient.getForeignRow("ID_ADRESSE");
if (!clientRowNX.isForeignEmpty("ID_ADRESSE_F")) {
118,13 → 130,13
DateFormat dateFormat = new SimpleDateFormat(datePattern);
map.put("RelanceDate", dateFormat.format(d));
 
SQLRow rowFacture = rowEch.getForeignRow("ID_SAISIE_VENTE_FACTURE");
SQLRow rowFacture = this.rowEcheance.getForeignRow("ID_SAISIE_VENTE_FACTURE");
 
 
// Infos facture
Long lTotal = (Long) rowFacture.getObject("T_TTC");
Long lRestant = (Long) rowEch.getObject("MONTANT");
Long lVerse = new Long(lTotal.longValue() - lRestant.longValue());
Long lRestant = (Long) this.rowEcheance.getObject("MONTANT");
Long lVerse = Long.valueOf(lTotal.longValue() - lRestant.longValue());
map.put("FactureNumero", rowFacture.getString("NUMERO"));
map.put("FactureReference", rowFacture.getString("NOM"));
map.put("FactureTotal", GestionDevise.currencyToString(lTotal.longValue(), true));
136,30 → 148,22
SQLRow modeRegRow = rowFacture.getForeignRow("ID_MODE_REGLEMENT");
Date dateEch = ModeDeReglementSQLElement.calculDate(modeRegRow.getInt("AJOURS"), modeRegRow.getInt("LENJOUR"), dFacture);
map.put("FactureDateEcheance", dateFormat.format(dateEch));
 
map.put("message", "");
return map;
}
 
public String getObject(SQLRow rowEch) {
SQLPreferences prefs = new SQLPreferences(rowEch.getTable().getDBRoot());
String object = prefs.get(MailRelancePreferencePanel.MAIL_RELANCE_OBJET, getDefaultObject());
String date = prefs.get(MailRelancePreferencePanel.MAIL_RELANCE_DATE_PATTERN, "dd/MM/yyyy");
return fill(rowEch, date, object);
public String getObject() {
return fill(this.template.getTitle());
}
 
public String getValue(SQLRow rowEch) {
SQLPreferences prefs = new SQLPreferences(rowEch.getTable().getDBRoot());
String value = prefs.get(MailRelancePreferencePanel.MAIL_RELANCE, getDefaultValue());
String date = prefs.get(MailRelancePreferencePanel.MAIL_RELANCE_DATE_PATTERN, "dd/MM/yyyy");
return fill(rowEch, date, value);
public String getValue() {
return fill(this.template.getText());
}
 
private String fill(SQLRow rowEch, String datePattern, String string) {
 
Map<String, String> map = getMapValues(rowEch, datePattern);
private String fill(String string) {
String result = string;
for (String key : map.keySet()) {
result = result.replace("{" + key + "}", map.get(key));
for (String key : this.map.keySet()) {
result = result.replace("{" + key + "}", this.map.get(key));
}
return result;
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/invoice/report/ReportingStockXmlSheet.java
13,7 → 13,6
package org.openconcerto.erp.core.sales.invoice.report;
 
import org.openconcerto.erp.core.sales.invoice.report.ReportingVenteXmlSheet.Line;
import org.openconcerto.erp.generationDoc.AbstractListeSheetXml;
import org.openconcerto.erp.preferences.PrinterNXProps;
import org.openconcerto.sql.Configuration;
37,8 → 36,6
import java.util.Map;
import java.util.TreeMap;
 
import javax.swing.JProgressBar;
 
public class ReportingStockXmlSheet extends AbstractListeSheetXml {
 
private final DateFormat dateFormat = new SimpleDateFormat("dd/MM/yy");
125,11 → 122,12
Float qte = vals.getForeign("ID_STOCK").getFloat("QTE_REEL");
BigDecimal ha = BigDecimal.ZERO;
if (qte > 0) {
ha = vals.getBigDecimal("PA_HT").multiply(new BigDecimal(qte));
final BigDecimal puHA = vals.getBigDecimal("PA_HT");
ha = puHA.multiply(new BigDecimal(qte));
 
int idFamille = vals.getForeignID("ID_FAMILLE_ARTICLE");
SQLRow rowF = mapF.get(idFamille);
Line lineArt = new Line(vals.getString("NOM"), vals.getString("CODE"), ha, qte);
Line lineArt = new Line(vals.getString("NOM"), vals.getString("CODE"), puHA, ha, qte);
 
// Init des lines familles
 
225,13 → 223,18
 
class Line {
final private String nomArt, codeArt;
private BigDecimal totalHA;
private BigDecimal totalHA, puHA;
private Float qte;
 
public Line(String nomArt, String codeArt, BigDecimal totalHA, Float qte) {
this(nomArt, codeArt, BigDecimal.ZERO, totalHA, qte);
}
 
public Line(String nomArt, String codeArt, BigDecimal puHA, BigDecimal totalHA, Float qte) {
this.nomArt = nomArt;
this.codeArt = codeArt;
this.totalHA = totalHA;
this.puHA = puHA;
this.qte = qte;
}
 
243,6 → 246,10
return codeArt;
}
 
public BigDecimal getPuHA() {
return puHA;
}
 
public String getNomArt() {
return nomArt;
}
263,6 → 270,7
m.put("CODE", getCodeArt());
m.put("NOM", getNomArt());
m.put("QTE", getQte());
m.put("PU_HA", getPuHA());
m.put("TOTAL_HA", getTotalHA());
return m;
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/invoice/action/ImportReglementSageAction.java
New file
0,0 → 1,76
/*
* 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.action;
 
import org.openconcerto.erp.core.finance.payment.element.EncaisserMontantSQLElement;
import org.openconcerto.sql.model.ConnectionHandlerNoSetup;
import org.openconcerto.sql.model.SQLDataSource;
import org.openconcerto.sql.utils.SQLUtils;
import org.openconcerto.ui.SwingThreadUtils;
import org.openconcerto.utils.ExceptionHandler;
 
import java.awt.Component;
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
 
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JOptionPane;
 
public class ImportReglementSageAction extends AbstractAction {
private final EncaisserMontantSQLElement elt;
 
public ImportReglementSageAction(EncaisserMontantSQLElement elt) {
super();
this.elt = elt;
this.putValue(Action.NAME, "Import XML des réglements depuis Sage");
}
 
@Override
public void actionPerformed(ActionEvent e) {
final Frame frame = SwingThreadUtils.getAncestorOrSelf(Frame.class, (Component) e.getSource());
final FileDialog fd = new FileDialog(frame, "Import XML des réglements Sage", FileDialog.LOAD);
if (fd.getFile() != null) {
try {
SQLUtils.executeAtomic(this.elt.getTable().getDBSystemRoot().getDataSource(), new ConnectionHandlerNoSetup<Object, IOException>() {
@Override
public Object handle(final SQLDataSource ds) throws SQLException, IOException {
 
ImportReglementSage sageImporter = new ImportReglementSage(ImportReglementSageAction.this.elt);
try {
sageImporter.importFromFile(new File(fd.getDirectory(), fd.getFile()));
} catch (Exception e) {
e.printStackTrace();
new SQLException(e);
}
return null;
}
 
});
JOptionPane.showMessageDialog(null, "Import des paiements terminés!");
} catch (IOException exn) {
ExceptionHandler.handle(frame, "Erreur lors de la lecture du fichier", exn);
} catch (SQLException exn) {
ExceptionHandler.handle(frame, "Erreur lors de l'insertion des paiements dans la base", exn);
}
 
}
fd.setVisible(true);
 
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/invoice/action/ImportReglementSage.java
New file
0,0 → 1,190
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.sales.invoice.action;
 
import org.openconcerto.erp.core.finance.payment.element.EncaisserMontantSQLElement;
import org.openconcerto.erp.core.finance.payment.element.TypeReglementSQLElement;
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.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.charset.Charset;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
 
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
 
public class ImportReglementSage {
 
private final DBRoot root;
private EncaisserMontantSQLElement encaisserSQLElement;
Map<String, SQLRowValues> mapVf;
// <Reglements>
// <Reglement>
// <Code_Client>0010CHDMVA</Code_Client>
// <Date_Reglement>28/01/2019</Date_Reglement>
// <Numero_Facture>FA005088</Numero_Facture>
// <Montant_Reglement>294.00</Montant_Reglement>
// <Libelle_Reglement>Aucun</Libelle_Reglement>
// </Reglement>
// ...
// </Reglements>
 
public ImportReglementSage(EncaisserMontantSQLElement encaisserSQLElement) {
this.root = encaisserSQLElement.getTable().getDBRoot();
this.encaisserSQLElement = encaisserSQLElement;
}
 
public void importFromFile(File f) throws Exception {
final BufferedReader xmlReader = new BufferedReader(new InputStreamReader(new FileInputStream(f), Charset.forName("UTF8")));
SAXBuilder builder = new SAXBuilder();
final Document doc = builder.build(xmlReader);
 
Element root = doc.getRootElement();
List<Element> reglements = root.getChildren("Reglement");
List<String> numeroFacts = new ArrayList<>(reglements.size());
for (Element r : reglements) {
Element n = r.getChild("Numero_Facture");
numeroFacts.add(n.getValue());
}
 
this.mapVf = fetchFactures(numeroFacts);
for (Element r : reglements) {
Element n = r.getChild("Numero_Facture");
Element d = r.getChild("Date_Reglement");
Element m = r.getChild("Montant_Reglement");
Element c = r.getChild("Code_Client");
createEncaissement(n.getValue(), m.getValue(), d.getValue(), c.getValue());
}
 
}
 
private Map<String, SQLRowValues> fetchFactures(List<String> numerosFactures) {
 
final SQLTable tableVf = this.root.getTable("SAISIE_VENTE_FACTURE");
SQLRowValues rowValsFact = new SQLRowValues(tableVf);
rowValsFact.putNulls("DATE", "NUMERO");
rowValsFact.putRowValues("ID_MODE_REGLEMENT").putNulls("ID_TYPE_REGLEMENT");
rowValsFact.putRowValues("ID_CLIENT").putRowValues("ID_MODE_REGLEMENT").putNulls("ID_TYPE_REGLEMENT");
SQLRowValues rowValsEch = new SQLRowValues(this.root.getTable("ECHEANCE_CLIENT"));
rowValsEch.put("ID_SAISIE_VENTE_FACTURE", rowValsFact);
rowValsEch.put("REGLE", null);
rowValsEch.put("MONTANT", null);
rowValsEch.put("REG_COMPTA", null);
 
SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(rowValsFact);
List<SQLRowValues> res = fetcher.fetch(new Where(tableVf.getField("NUMERO"), numerosFactures));
Map<String, SQLRowValues> rowValsVf = new HashMap<>();
for (SQLRowValues sqlRowValues : res) {
rowValsVf.put(sqlRowValues.getString("NUMERO"), sqlRowValues);
}
 
return rowValsVf;
 
}
 
private void createEncaissement(String numeroFacture, String montant, String dateReglement, String codeClient) throws Exception {
SQLRowValues rowVals = this.mapVf.get(numeroFacture);
if (rowVals == null) {
SwingUtilities.invokeLater(new Runnable() {
 
@Override
public void run() {
JOptionPane.showMessageDialog(null, "Impossible de trouver la facture numéro " + numeroFacture);
}
});
} else {
final Collection<SQLRowValues> referentRows = rowVals.getReferentRows(rowVals.getTable().getTable("ECHEANCE_CLIENT"));
if (referentRows.size() == 1) {
SQLRowValues ech = referentRows.iterator().next();
if (!ech.getBoolean("REGLE") && !ech.getBoolean("REG_COMPTA")) {
BigDecimal b = new BigDecimal(montant);
long montantL = b.movePointRight(2).setScale(0, RoundingMode.HALF_UP).longValue();
DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
SQLRowValues rowValsEncaisser = new SQLRowValues(this.encaisserSQLElement.getTable());
rowValsEncaisser.put("ID_CLIENT", rowVals.getForeignID("ID_CLIENT"));
rowValsEncaisser.put("NOM", numeroFacture);
rowValsEncaisser.put("TIERS", codeClient);
rowValsEncaisser.put("DATE", format.parse(dateReglement));
 
rowValsEncaisser.put("MONTANT", montantL);
 
SQLRowAccessor rowValsMdrFact = rowVals.getForeign("ID_MODE_REGLEMENT");
int idType = rowValsMdrFact.getForeignID("ID_TYPE_REGLEMENT");
 
SQLRowValues rowValsMdrEnc = new SQLRowValues(rowValsMdrFact.getTable());
 
if (idType == TypeReglementSQLElement.CB || idType == TypeReglementSQLElement.ESPECE || idType == TypeReglementSQLElement.CHEQUE || idType == TypeReglementSQLElement.VIREMENT) {
rowValsMdrEnc.put("ID_TYPE_REGLEMENT", idType);
} else {
rowValsMdrFact = rowVals.getForeign("ID_CLIENT").getForeign("ID_MODE_REGLEMENT");
idType = rowValsMdrFact.getForeignID("ID_TYPE_REGLEMENT");
if (idType == TypeReglementSQLElement.CB || idType == TypeReglementSQLElement.ESPECE || idType == TypeReglementSQLElement.CHEQUE
|| idType == TypeReglementSQLElement.VIREMENT) {
rowValsMdrEnc.put("ID_TYPE_REGLEMENT", idType);
} else {
rowValsMdrEnc.put("ID_TYPE_REGLEMENT", TypeReglementSQLElement.VIREMENT);
}
}
rowValsMdrEnc.put("AJOURS", 0);
rowValsMdrEnc.put("LENJOUR", 0);
rowValsMdrEnc.put("COMPTANT", Boolean.TRUE);
rowValsEncaisser.put("ID_MODE_REGLEMENT", rowValsMdrEnc);
 
SQLRowValues rowValsEncaisserItem = new SQLRowValues(this.encaisserSQLElement.getTable().getTable("ENCAISSER_MONTANT_ELEMENT"));
rowValsEncaisserItem.put("ID_ECHEANCE_CLIENT", ech);
rowValsEncaisserItem.put("ID_ENCAISSER_MONTANT", rowValsEncaisser);
rowValsEncaisserItem.put("MONTANT_REGLE", montantL);
rowValsEncaisserItem.put("MONTANT_A_REGLER", ech.getLong("MONTANT"));
 
SQLRow rowEncaisser = rowValsEncaisser.commit();
 
this.encaisserSQLElement.regleFacture(rowEncaisser);
 
}
}
}
}
 
public static void main(String[] args) {
File f = new File("ExempleReglementSAge.xml");
ImportReglementSage i = new ImportReglementSage(null);
try {
i.importFromFile(f);
} catch (Exception e) {
e.printStackTrace();
}
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/invoice/ui/GenListeVentePanel.java
31,6 → 31,8
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
 
import javax.swing.JButton;
109,16 → 111,40
sel.addSelectStar(tableFact);
sel.setDistinct(true);
sel.setWhere(new Where(tableFact.getField("DATE"), GenListeVentePanel.this.du.getDate(), GenListeVentePanel.this.au.getDate()));
List<SQLRow> l = (List<SQLRow>) dataSource.execute(sel.asString(), SQLRowListRSH.createFromSelect(sel, tableFact));
List<SQLRow> l = new ArrayList((List<SQLRow>) dataSource.execute(sel.asString(), SQLRowListRSH.createFromSelect(sel, tableFact)));
Collections.sort(l, new Comparator<SQLRow>() {
@Override
public int compare(SQLRow o1, SQLRow o2) {
int dateComp = o1.getDate("DATE").compareTo(o2.getDate("DATE"));
if (dateComp == 0) {
return o1.getString("NUMERO").compareTo(o2.getString("NUMERO"));
} else {
return dateComp;
}
}
});
 
SQLSelect sel2 = new SQLSelect(Configuration.getInstance().getBase());
sel2.addSelectStar(tableAvoir);
sel2.setWhere(new Where(tableAvoir.getField("DATE"), GenListeVentePanel.this.du.getDate(), GenListeVentePanel.this.au.getDate()));
sel2.setDistinct(true);
List<SQLRow> l2 = (List<SQLRow>) dataSource.execute(sel2.asString(), SQLRowListRSH.createFromSelect(sel2, tableAvoir));
List<SQLRow> l2 = new ArrayList((List<SQLRow>) dataSource.execute(sel2.asString(), SQLRowListRSH.createFromSelect(sel2, tableAvoir)));
Collections.sort(l2, new Comparator<SQLRow>() {
@Override
public int compare(SQLRow o1, SQLRow o2) {
int dateComp = o1.getDate("DATE").compareTo(o2.getDate("DATE"));
if (dateComp == 0) {
return o1.getString("NUMERO").compareTo(o2.getString("NUMERO"));
} else {
return dateComp;
}
}
});
 
List<SQLRow> lTotal = new ArrayList<SQLRow>();
lTotal.addAll(l);
lTotal.addAll(l2);
 
ListeVenteXmlSheet sheet = new ListeVenteXmlSheet(lTotal, GenListeVentePanel.this.du.getDate(), GenListeVentePanel.this.au.getDate(), GenListeVentePanel.this.bar);
 
sheet.createDocumentAsynchronous().get();
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/invoice/ui/EtatVentesPanel.java
18,6 → 18,7
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JDate;
import org.openconcerto.ui.JLabelBold;
import org.openconcerto.utils.NoneSelectedButtonGroup;
import org.openconcerto.utils.Tuple2;
 
import java.awt.FlowLayout;
43,7 → 44,8
private JDate du, au;
private JButton buttonGen = new JButton("Créer");
private JButton buttonClose = new JButton("Fermer");
JCheckBox boxTicket = new JCheckBox("Uniquement les ventes en caisse");
private JCheckBox boxTicket = new JCheckBox("Uniquement les ventes en caisse");
private JCheckBox boxFacture = new JCheckBox("Uniquement les ventes sur facture");
 
public EtatVentesPanel() {
super(new GridBagLayout());
120,7 → 122,18
 
c.gridy++;
c.gridx = 0;
c.weightx = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
 
this.add(boxFacture, c);
 
NoneSelectedButtonGroup grou = new NoneSelectedButtonGroup();
grou.add(boxFacture);
grou.add(boxTicket);
 
c.gridy++;
c.gridx = 0;
 
JPanel panelButton = new JPanel();
panelButton.add(this.buttonGen);
panelButton.add(this.buttonClose);
167,7 → 180,7
if (e.getSource() == this.buttonGen) {
final Date start = this.du.getDate();
final Date stop = this.au.getDate();
final EtatVentesXmlSheet sheet = new EtatVentesXmlSheet(start, stop, boxTicket.isSelected());
final EtatVentesXmlSheet sheet = new EtatVentesXmlSheet(start, stop, boxTicket.isSelected(), boxFacture.isSelected());
try {
// FIXME probleme de rendu avec le viewer
sheet.createDocumentAsynchronous().get();
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/invoice/component/SaisieVenteFactureSQLComponent.java
24,6 → 24,7
import org.openconcerto.erp.core.common.ui.DeviseField;
import org.openconcerto.erp.core.common.ui.TotalPanel;
import org.openconcerto.erp.core.customerrelationship.customer.ui.AdresseType;
import org.openconcerto.erp.core.customerrelationship.customer.ui.CategorieComptableChoiceUI;
import org.openconcerto.erp.core.finance.accounting.element.ComptePCESQLElement;
import org.openconcerto.erp.core.finance.accounting.element.EcritureSQLElement;
import org.openconcerto.erp.core.finance.payment.component.ModeDeReglementSQLComponent;
160,6 → 161,10
tableFacture.setRowCatComptable(null);
}
 
if (!isFilling()) {
tableFacture.setClient(rowCli, true);
}
 
if (getMode() == SQLComponent.Mode.INSERTION || !isFilling()) {
SQLElement sqleltModeRegl = Configuration.getInstance().getDirectory().getElement("MODE_REGLEMENT");
int idModeRegl = rowCli.getInt("ID_MODE_REGLEMENT");
480,6 → 485,26
}
});
// }
 
SQLPreferences prefs = SQLPreferences.getMemCached(getTable().getDBRoot());
if (prefs.getBoolean(GestionCommercialeGlobalPreferencePanel.CATEGORIE_COMPTABLE_SPEC, false)) {
// cat spe
final CategorieComptableChoiceUI catUI = new CategorieComptableChoiceUI();
catUI.addToUI(this, c);
catUI.getCombo().addModelListener("wantedID", new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
int wantedID = catUI.getCombo().getWantedID();
if (wantedID != SQLRow.NONEXISTANT_ID && wantedID >= SQLRow.MIN_VALID_ID) {
tableFacture.setRowCatComptable(catUI.getCombo().getElement().getTable().getRow(wantedID));
} else {
tableFacture.setRowCatComptable(null);
}
}
});
}
 
// Contact
this.contact = new ElementComboBox() {
@Override
726,7 → 751,6
final DeviseField textFraisDocHT = new DeviseField();
final SQLRequestComboBox boxTaxeFraisDoc = new SQLRequestComboBox(false, 8);
 
SQLPreferences prefs = SQLPreferences.getMemCached(getTable().getDBRoot());
final boolean showFrais = prefs.getBoolean(GestionCommercialeGlobalPreferencePanel.FRAIS_DOCUMENT, false);
if (showFrais) {
 
1915,4 → 1939,57
this.tableFacture.setDateDevise(this.dateSaisie.getValue());
}
 
@Override
protected void initDone() {
 
super.initDone();
 
// FIXME listener pour le module project à déplacer dans le module quand l'interface passera
// en group
if (getTable().contains("ID_AFFAIRE")) {
final SQLRequestComboBox viewClient = (SQLRequestComboBox) getView("ID_CLIENT").getComp();
final SQLRequestComboBox viewAffaire = (SQLRequestComboBox) getView("ID_AFFAIRE").getComp();
final SQLRequestComboBox viewComm = (SQLRequestComboBox) getView("ID_COMMERCIAL").getComp();
final SQLRequestComboBox viewAgence;
if (getTable().contains("ID_POLE_PRODUIT")) {
viewAgence = (SQLRequestComboBox) getView("ID_POLE_PRODUIT").getComp();
} else {
viewAgence = null;
}
 
viewAffaire.addModelListener("wantedID", new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (!isFilling()) {
SQLRowAccessor selAffaire = viewAffaire.getSelectedRow();
if (selAffaire != null && !selAffaire.isUndefined()) {
viewClient.setValue(selAffaire.getForeignID("ID_CLIENT"));
if (selAffaire.getTable().contains("ID_COMMERCIAL")) {
viewComm.setValue(selAffaire.getForeignID("ID_COMMERCIAL"));
}
}
}
}
});
 
if (viewAgence != null) {
 
viewComm.addModelListener("wantedID", new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (!isFilling()) {
SQLRowAccessor selComm = viewComm.getSelectedRow();
if (selComm != null && !selComm.isUndefined() && selComm.getTable().contains("ID_POLE_PRODUIT")) {
viewAgence.setValue(selComm.getForeignID("ID_POLE_PRODUIT"));
}
}
}
});
}
}
 
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/quote/component/DevisSQLComponent.java
27,6 → 27,7
import org.openconcerto.erp.core.common.ui.TotalPanel;
import org.openconcerto.erp.core.customerrelationship.customer.ui.AddressChoiceUI;
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.quote.element.EtatDevisSQLElement;
import org.openconcerto.erp.core.sales.quote.report.DevisXmlSheet;
383,6 → 384,23
}
});
}
if (prefs.getBoolean(GestionCommercialeGlobalPreferencePanel.CATEGORIE_COMPTABLE_SPEC, false)) {
// cat spe
final CategorieComptableChoiceUI catUI = new CategorieComptableChoiceUI();
catUI.addToUI(this, c);
catUI.getCombo().addModelListener("wantedID", new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
int wantedID = catUI.getCombo().getWantedID();
if (wantedID != SQLRow.NONEXISTANT_ID && wantedID >= SQLRow.MIN_VALID_ID) {
table.setRowCatComptable(catUI.getCombo().getElement().getTable().getRow(wantedID));
} else {
table.setRowCatComptable(null);
}
}
});
}
if (getTable().contains("ID_CONTACT")) {
// Contact Client
c.gridx = 0;
418,8 → 436,15
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);
}
 
} else {
comboContact.getRequest().setWhere(Where.FALSE);
if (!isFilling()) {
table.setClient(null, true);
}
DevisSQLComponent.this.table.setTarif(null, false);
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/quote/element/DevisSQLElement.java
48,6 → 48,7
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.sql.request.ListSQLRequest;
import org.openconcerto.sql.ui.light.CustomRowEditor;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.view.EditFrame;
63,7 → 64,6
import org.openconcerto.ui.light.ActivationOnSelectionControler;
import org.openconcerto.ui.light.ColumnSpec;
import org.openconcerto.ui.light.ColumnsSpec;
import org.openconcerto.ui.light.CustomEditorProvider;
import org.openconcerto.ui.light.LightController;
import org.openconcerto.ui.light.LightUIButtonUnmanaged;
import org.openconcerto.ui.light.LightUIComboBox;
99,7 → 99,6
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
 
import javax.swing.AbstractAction;
767,14 → 766,12
}
 
@Override
protected Map<String, CustomEditorProvider> _getDefaultCustomEditorProvider(final Configuration configuration, final SQLRowAccessor sqlRow, final String sessionSecurityToken)
throws IllegalArgumentException {
final Map<String, CustomEditorProvider> map = super._getDefaultCustomEditorProvider(configuration, sqlRow, sessionSecurityToken);
map.put("sales.quote.items.list", new CustomEditorProvider() {
public List<CustomRowEditor> getCustomRowEditors(Configuration configuration, String sessionToken) {
List<CustomRowEditor> map = super.getCustomRowEditors(configuration, sessionToken);
map.add(new CustomRowEditor("sales.quote.items.list") {
 
@Override
public LightUIElement createUIElement(final String id) {
 
public LightUIElement createUIElement() {
final ColumnSpec c1 = new ColumnSpec("sales.quote.item.style", StringWithId.class, "Style", new StringWithId(2, "Normal"), true, new LightUIComboBox("sales.quote.item.style"));
final ColumnSpec c2 = new ColumnSpec("sales.quote.item.code", String.class, "Code", "", true, new LightUITextField("sales.quote.item.code"));
final ColumnSpec c3 = new ColumnSpec("sales.quote.item.label", String.class, "Nom", "", true, new LightUITextField("sales.quote.item.name"));
864,65 → 861,11
final ColumnsSpec cSpec = new ColumnsSpec(lId, columnsSpec, possibleColumnIds, null);
cSpec.setAllowMove(true);
cSpec.setAllowResize(true);
final RowSelectionSpec selectionSpec = new RowSelectionSpec(id);
final TableSpec tSpec = new TableSpec(id, selectionSpec, cSpec);
final RowSelectionSpec selectionSpec = new RowSelectionSpec(getItemId());
final TableSpec tSpec = new TableSpec(getItemId(), selectionSpec, cSpec);
tSpec.setColumns(cSpec);
 
if (sqlRow != null) {
// send: id,value
final SQLElement elem = configuration.getDirectory().getElement("DEVIS_ELEMENT");
final SQLTable table = elem.getTable();
final List<String> fieldsToFetch = new ArrayList<>();
for (ColumnSpec cs : columnsSpec) {
String colId = cs.getId();
SQLField f = configuration.getFieldMapper().getSQLFieldForItem(colId);
if (f != null) {
fieldsToFetch.add(f.getName());
} else {
throw new IllegalStateException("No field in " + table + " for column id " + colId);
}
}
 
final Where where = new Where(table.getField("ID_DEVIS"), "=", sqlRow.getID());
final ListSQLRequest req = elem.createListRequest(fieldsToFetch, where, configuration.getShowAs());
List<SQLRowValues> fetchedRows = req.getValues();
 
List<Row> rows = new ArrayList<>();
for (final SQLRowValues vals : fetchedRows) {
Row r = new Row(vals.getID(), columnsSpec.size());
List<Object> values = new ArrayList<>();
for (ColumnSpec cs : columnsSpec) {
String colId = cs.getId();
SQLField f = configuration.getFieldMapper().getSQLFieldForItem(colId);
if (f != null) {
Object object = vals.getObject(f.getName());
if (object instanceof SQLRowValues) {
SQLRowValues sqlRowValues = (SQLRowValues) object;
long rowId = sqlRowValues.getIDNumber().longValue();
List<SQLField> fieldsToExpand = configuration.getShowAs().getFieldExpand(sqlRowValues.getTable());
final StringBuilder b = new StringBuilder();
for (SQLField sqlField : fieldsToExpand) {
b.append(sqlRowValues.getObject(sqlField.getName()).toString());
b.append(' ');
}
object = new StringWithId(rowId, b.toString().trim());
}
values.add(object);
} else {
throw new IllegalStateException("No field in " + table + " for column id " + colId);
}
}
r.setValues(values);
rows.add(r);
}
 
TableContent tableContent = new TableContent();
tableContent.setRows(rows);
// tableContent.setSpec(new RowSpec());
tSpec.setContent(tableContent);
 
}
 
String id = getItemId();
final LightUITable eList = new LightUITable(id);
eList.setTableSpec(tSpec);
 
974,8 → 917,74
panel.addChild(listLine);
 
return panel;
 
}
 
@Override
public void fillFrom(LightUIElement uiElement, SQLRowAccessor sqlRow) {
LightUIPanel p = (LightUIPanel) uiElement;
LightUITable ltable = p.getFirstChild(LightUITable.class);
TableSpec tSpec = ltable.getTableSpec();
ColumnsSpec columnsSpec = tSpec.getColumns();
// send: id,value
final SQLElement elem = configuration.getDirectory().getElement("DEVIS_ELEMENT");
final SQLTable table = elem.getTable();
final List<String> fieldsToFetch = new ArrayList<>();
for (ColumnSpec cs : columnsSpec.getColumns()) {
String colId = cs.getId();
SQLField f = configuration.getFieldMapper().getSQLFieldForItem(colId);
if (f != null) {
fieldsToFetch.add(f.getName());
} else {
throw new IllegalStateException("No field in " + table + " for column id " + colId);
}
}
 
final Where where = new Where(table.getField("ID_DEVIS"), "=", sqlRow.getID());
final ListSQLRequest req = elem.createListRequest(fieldsToFetch, where, configuration.getShowAs());
List<SQLRowValues> fetchedRows = req.getValues();
 
List<Row> rows = new ArrayList<>();
for (final SQLRowValues vals : fetchedRows) {
Row r = new Row(vals.getID(), columnsSpec.getColumns().size());
List<Object> values = new ArrayList<>();
for (ColumnSpec cs : columnsSpec.getColumns()) {
String colId = cs.getId();
SQLField f = configuration.getFieldMapper().getSQLFieldForItem(colId);
if (f != null) {
Object object = vals.getObject(f.getName());
if (object instanceof SQLRowValues) {
SQLRowValues sqlRowValues = (SQLRowValues) object;
long rowId = sqlRowValues.getIDNumber().longValue();
List<SQLField> fieldsToExpand = configuration.getShowAs().getFieldExpand(sqlRowValues.getTable());
final StringBuilder b = new StringBuilder();
for (SQLField sqlField : fieldsToExpand) {
b.append(sqlRowValues.getObject(sqlField.getName()).toString());
b.append(' ');
}
object = new StringWithId(rowId, b.toString().trim());
}
values.add(object);
} else {
throw new IllegalStateException("No field in " + table + " for column id " + colId);
}
}
r.setValues(values);
rows.add(r);
}
 
TableContent tableContent = new TableContent();
tableContent.setRows(rows);
tSpec.setContent(tableContent);
 
}
 
@Override
public void store(LightUIElement uiElement, SQLRowValues row) {
// TODO Auto-generated method stub
 
}
 
});
return map;
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/element/CustomerProductQtyPriceSQLElement.java
New file
0,0 → 1,54
/*
* 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 java.util.ArrayList;
import java.util.List;
 
public class CustomerProductQtyPriceSQLElement extends ComptaSQLConfElement {
public static final String ELEMENT_CODE = "sales.customer.product.qty.price";
 
public CustomerProductQtyPriceSQLElement() {
super("TARIF_ARTICLE_CLIENT");
}
 
@Override
protected String createCode() {
return ELEMENT_CODE;
}
 
@Override
protected List<String> getListFields() {
final List<String> l = new ArrayList<String>();
l.add("ID_ARTICLE");
l.add("QUANTITE");
return l;
}
 
@Override
protected List<String> getComboFields() {
final List<String> l = new ArrayList<String>();
l.add("QUANTITE");
return l;
}
 
@Override
protected SQLComponent createComponent() {
return null;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/element/ReferenceArticleSQLElement.java
14,6 → 14,7
package org.openconcerto.erp.core.sales.product.element;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.config.update.Updater_1_5;
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.edm.AttachmentAction;
import org.openconcerto.erp.core.finance.tax.model.TaxeCache;
20,9 → 21,7
import org.openconcerto.erp.core.reports.history.ui.HistoriqueArticleFrame;
import org.openconcerto.erp.core.sales.product.action.InventairePanel;
import org.openconcerto.erp.core.sales.product.component.ReferenceArticleSQLComponent;
import org.openconcerto.erp.core.supplychain.stock.element.ComposedItemStockUpdater;
import org.openconcerto.erp.core.supplychain.stock.element.DepotStockSQLElement;
import org.openconcerto.erp.core.supplychain.stock.element.StockItem;
import org.openconcerto.erp.generationDoc.gestcomm.FicheArticleXmlSheet;
import org.openconcerto.erp.model.MouseSheetXmlListeListener;
import org.openconcerto.erp.preferences.DefaultNXProps;
53,7 → 52,6
import org.openconcerto.ui.PanelFrame;
import org.openconcerto.utils.CollectionUtils;
import org.openconcerto.utils.DecimalUtils;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.ListMap;
 
import java.awt.event.ActionEvent;
221,6 → 219,7
l.add("SKU");
 
// if (!prefs.getBoolean(GestionArticleGlobalPreferencePanel.STOCK_MULTI_DEPOT, false)) {
l.add("GESTION_STOCK");
l.add("ID_STOCK");
// }
String val = DefaultNXProps.getInstance().getStringProperty("ArticleService");
527,58 → 526,9
 
public void initStock(int id) {
SQLRow row = getTable().getRow(id);
SQLSelect sel = new SQLSelect();
sel.addSelectStar(getTable().getTable("DEPOT_STOCK"));
List<SQLRow> rowsDepot = SQLRowListRSH.execute(sel);
 
SQLSelect selStock = new SQLSelect();
selStock.addSelectStar(getTable().getTable("STOCK"));
selStock.setWhere(new Where(getTable().getTable("STOCK").getField("ID_ARTICLE"), "=", id));
List<SQLRow> rowsStock = SQLRowListRSH.execute(selStock);
Map<Integer, SQLRow> initedDepot = new HashMap<>();
for (SQLRow sqlRow : rowsStock) {
initedDepot.put(sqlRow.getForeignID("ID_DEPOT_STOCK"), sqlRow);
Updater_1_5.initStock(row);
}
 
List<StockItem> stockItems = new ArrayList<StockItem>();
for (SQLRow sqlRow : rowsDepot) {
try {
if (!initedDepot.keySet().contains(sqlRow.getID())) {
SQLRowValues rowVals = new SQLRowValues(getTable().getTable("STOCK"));
rowVals.put("ID_ARTICLE", row.getID());
rowVals.put("ID_DEPOT_STOCK", sqlRow.getID());
 
SQLRow rowStock = rowVals.commit();
if ((row.getObject("ID_DEPOT_STOCK") == null || row.isForeignEmpty("ID_DEPOT_STOCK")) && sqlRow.getID() == DepotStockSQLElement.DEFAULT_ID) {
row.createEmptyUpdateRow().put("ID_STOCK", rowStock.getID()).put("ID_DEPOT_STOCK", DepotStockSQLElement.DEFAULT_ID).commit();
} else if (sqlRow.getID() == row.getForeignID("ID_DEPOT_STOCK")) {
row.createEmptyUpdateRow().put("ID_STOCK", rowStock.getID()).commit();
}
stockItems.add(new StockItem(row, rowStock));
 
} else {
SQLRow rowExisting = initedDepot.get(sqlRow.getID());
if ((row.getObject("ID_DEPOT_STOCK") == null || row.isForeignEmpty("ID_DEPOT_STOCK")) && sqlRow.getID() == DepotStockSQLElement.DEFAULT_ID) {
row.createEmptyUpdateRow().put("ID_STOCK", rowExisting.getID()).put("ID_DEPOT_STOCK", DepotStockSQLElement.DEFAULT_ID).commit();
} else if (sqlRow.getID() == row.getForeignID("ID_DEPOT_STOCK")) {
row.createEmptyUpdateRow().put("ID_STOCK", rowExisting.getID()).commit();
}
stockItems.add(new StockItem(row, rowExisting));
}
} catch (SQLException e) {
ExceptionHandler.handle("Erreur lors de l'initialisation du stock de l'article", e);
}
}
if (row.getReferentRows(getTable().getTable("ARTICLE_ELEMENT").getField("ID_ARTICLE_PARENT")).size() > 0) {
ComposedItemStockUpdater up = new ComposedItemStockUpdater(getTable().getDBRoot(), stockItems);
try {
up.updateNomenclature(stockItems);
} catch (SQLException e) {
ExceptionHandler.handle("Erreur lors de l'actualisation du stock!", e);
}
}
}
 
@Override
protected String createCode() {
return createCodeOfPackage() + ".ref";
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/action/TransfertStockAction.java
New file
0,0 → 1,36
/*
* 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.action;
 
import org.openconcerto.erp.action.CreateFrameAbstractAction;
import org.openconcerto.erp.core.common.ui.PanelFrame;
import org.openconcerto.sql.Configuration;
 
import javax.swing.Action;
import javax.swing.JFrame;
 
public class TransfertStockAction extends CreateFrameAbstractAction {
 
private Configuration conf;
 
public TransfertStockAction(Configuration conf) {
super();
this.conf = conf;
this.putValue(Action.NAME, "Transfert de stock");
}
 
public JFrame createFrame() {
return new PanelFrame(new TransfertStockPanel(this.conf), "Transfert de stocks");
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/action/TransfertStockPanel.java
New file
0,0 → 1,337
/*
* 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.action;
 
import org.openconcerto.erp.core.common.ui.NumericTextField;
import org.openconcerto.erp.core.sales.product.model.ProductComponent;
import org.openconcerto.erp.core.supplychain.stock.element.ComposedItemStockUpdater;
import org.openconcerto.erp.core.supplychain.stock.element.StockItem;
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.DBRoot;
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.sqlobject.SQLRequestComboBox;
import org.openconcerto.sql.utils.SQLUtils;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JDate;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.text.SimpleDocumentListener;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
 
import org.apache.commons.dbutils.ResultSetHandler;
 
public class TransfertStockPanel extends JPanel {
 
private final String mvtStockTableQuoted;
private static String defaultLabel = "Transfert de stock";
 
public TransfertStockPanel(Configuration instance) {
super(new GridBagLayout());
 
final JButton buttonUpdate = new JButton("Mettre à jour");
 
final SQLTable mvtStockTable = instance.getRoot().findTable("MOUVEMENT_STOCK");
this.mvtStockTableQuoted = mvtStockTable.getSQLName().quote();
 
final SQLElement articleElt = instance.getDirectory().getElement("ARTICLE");
final SQLRequestComboBox comboArticle = new SQLRequestComboBox();
comboArticle.uiInit(articleElt.createComboRequest());
 
final SQLElement stockElt = instance.getDirectory().getElement("DEPOT_STOCK");
final SQLRequestComboBox comboStockDepart = new SQLRequestComboBox();
comboStockDepart.uiInit(stockElt.createComboRequest());
 
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() {
 
@Override
public void update(DocumentEvent e) {
buttonUpdate.setEnabled(
fieldReel.getText().trim().length() > 0 && comboArticle.getSelectedRow() != null && comboStockArrive.getSelectedRow() != null && comboStockDepart.getSelectedRow() != null);
}
});
 
comboArticle.addModelListener("wantedID", new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
buttonUpdate.setEnabled(
fieldReel.getText().trim().length() > 0 && comboArticle.getSelectedRow() != null && comboStockArrive.getSelectedRow() != null && comboStockDepart.getSelectedRow() != null);
}
});
 
comboStockArrive.addModelListener("wantedID", new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
buttonUpdate.setEnabled(
fieldReel.getText().trim().length() > 0 && comboArticle.getSelectedRow() != null && comboStockArrive.getSelectedRow() != null && comboStockDepart.getSelectedRow() != null);
}
});
 
comboStockDepart.addModelListener("wantedID", new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
buttonUpdate.setEnabled(
fieldReel.getText().trim().length() > 0 && comboArticle.getSelectedRow() != null && comboStockArrive.getSelectedRow() != null && comboStockDepart.getSelectedRow() != null);
}
});
 
GridBagConstraints c = new DefaultGridBagConstraints();
 
this.add(new JLabel("Intitulé"), c);
final JTextField label = new JTextField();
c.gridx++;
c.gridwidth = 2;
c.weightx = 1;
this.add(label, c);
label.setText(defaultLabel);
 
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;
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;
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;
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(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.weightx = 0;
c.fill = GridBagConstraints.NONE;
this.add(pButton, c);
buttonCancel.addActionListener(new ActionListener() {
 
@Override
public void actionPerformed(ActionEvent e) {
((JFrame) SwingUtilities.getRoot(TransfertStockPanel.this)).dispose();
}
});
buttonUpdate.addActionListener(new ActionListener() {
 
@Override
public void actionPerformed(ActionEvent e) {
 
buttonUpdate.setEnabled(false);
defaultLabel = label.getText();
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();
 
{
// DEPART
final SQLRow selectedRowDepotDepart = comboStockDepart.getSelectedRow();
final SQLRowAccessor rowStockDepart = ProductComponent.findOrCreateStock(selectedRowArticle, selectedRowDepotDepart);
StockItem item = new StockItem(selectedRowArticle, rowStockDepart);
if (!item.isStockInit()) {
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);
}
stockItems.add(item);
double diff = -qteReel.doubleValue();
item.updateQty(diff, TypeStockMouvement.REEL);
multipleRequestsHundred.add(getMvtRequest(dateValue, BigDecimal.ZERO, diff, item, label.getText(), true, usePrice));
 
item.updateQty(diff, TypeStockMouvement.THEORIQUE);
multipleRequestsHundred.add(getMvtRequest(dateValue, BigDecimal.ZERO, diff, item, label.getText(), false, usePrice));
 
multipleRequestsHundred.add(item.getUpdateRequest());
}
// ARRIVEE
{
final SQLRow selectedRowDepotArrivee = comboStockArrive.getSelectedRow();
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);
}
stockItems.add(item);
double diff = qteReel.doubleValue();
item.updateQty(diff, TypeStockMouvement.REEL);
multipleRequestsHundred.add(getMvtRequest(dateValue, BigDecimal.ZERO, diff, item, label.getText(), true, usePrice));
 
item.updateQty(diff, TypeStockMouvement.THEORIQUE);
multipleRequestsHundred.add(getMvtRequest(dateValue, BigDecimal.ZERO, diff, item, label.getText(), 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++) {
handlers.add(null);
}
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();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
 
// liste.getModel().updateAll();
((JFrame) SwingUtilities.getRoot(TransfertStockPanel.this)).dispose();
}
});
}
 
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\"";
 
if (usePrice && prc != null) {
mvtStockQuery += ",\"PRICE\"";
}
 
mvtStockQuery += ") VALUES(" + qteFinal + ",'" + dateFormat.format(time) + "'," + item.getArticle().getID() + "," + item.stock.getID() + ",'" + label + "'," + reel
+ ", (SELECT (MAX(\"ORDRE\")+1) FROM " + mvtStockTableQuoted + ")";
if (usePrice && prc != null) {
mvtStockQuery += "," + prc.setScale(6, RoundingMode.HALF_UP).toString();
}
mvtStockQuery += ")";
return mvtStockQuery;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/ui/DeliveredQtyRowValuesRenderer.java
45,8 → 45,15
public final static Color lightBlack = new Color(192, 192, 192);
public final static Color lightBlackGrey = new Color(155, 155, 155);
 
private final boolean customer;
 
public DeliveredQtyRowValuesRenderer() {
this(true);
}
 
public DeliveredQtyRowValuesRenderer(boolean customer) {
AlternateTableCellRenderer.setBGColorMap(this, CollectionUtils.createMap(lightBlack, lightBlackGrey, red, redLightGrey, orange, orangeGrey));
this.customer = customer;
}
 
@Override
60,8 → 67,15
RowValuesTableModel model = ((RowValuesTable) table).getRowValuesTableModel();
SQLRowValues rowVals = model.getRowValuesAt(row);
 
Number qte = (Number) rowVals.getObject("QTE");
Number qteL = (Number) rowVals.getObject("QTE_LIVREE");
Number qte;
Number qteL;
if (this.customer) {
qte = (Number) rowVals.getObject("QTE");
qteL = (Number) rowVals.getObject("QTE_LIVREE");
} else {
qte = (Number) rowVals.getObject("QTE_ORIGINE");
qteL = (Number) rowVals.getObject("QTE");
}
if (qte != null && qteL != null) {
if (qte.intValue() < qteL.intValue()) {
comp.setBackground(red);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/ui/CurrencyWithSymbolRenderer.java
34,6 → 34,8
private final FieldPath fieldPath;
private final CurrencyConverter c;
 
private boolean hideZeroValue = false;
 
private String getSymbol(String currencyCode) {
// Because Java Currency return PLN as Symbol for Zl, we use our own talbe
return org.openconcerto.erp.core.finance.accounting.model.Currency.getSymbol(currencyCode);
46,6 → 48,10
this(null);
}
 
public void setHideZeroValue(boolean hideZeroValue) {
this.hideZeroValue = hideZeroValue;
}
 
/**
* Affiche une valeur monétaire en ajoutant le symbole de la devise du path
*
60,8 → 66,13
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
 
if (value != null) {
value = GestionDevise.currencyToString((BigDecimal) value);
BigDecimal amount = (BigDecimal) value;
 
if (this.hideZeroValue && amount.signum() == 0) {
value = "";
} else {
value = GestionDevise.currencyToString(amount);
 
if (fieldPath == null) {
value = value + " " + getSymbol(c.getCompanyCurrencyCode());
} else {
78,7 → 89,8
// reprend
// pas les valeurs de la SQLRow (ex : si on veut récupérer la devise du
// fournisseur
// sélectionné, getDistantRow ira chercher la valeur du fournisseur référencé en
// sélectionné, getDistantRow ira chercher la valeur du fournisseur
// référencé en
// BDD
// et non dans la SQLRow)
 
108,6 → 120,7
}
}
}
}
setHorizontalAlignment(SwingConstants.RIGHT);
 
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/ui/QteAcommanderRenderer.java
New file
0,0 → 1,50
/*
* 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.erp.core.common.ui.DeviseNiceTableCellRenderer;
import org.openconcerto.ui.table.AlternateTableCellRenderer;
 
import java.awt.Color;
import java.awt.Component;
 
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
 
public class QteAcommanderRenderer extends DeviseNiceTableCellRenderer {
 
private final static Color green = new Color(225, 254, 207);
private final static Color greenDark = new Color(205, 234, 187);
 
public QteAcommanderRenderer() {
AlternateTableCellRenderer.setBGColorMap(this, green, greenDark);
}
 
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
 
Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
 
((JLabel) comp).setHorizontalAlignment(SwingConstants.RIGHT);
if (value != null) {
Float b = (Float) value;
if (b <= 0) {
comp.setBackground(green);
}
}
 
return comp;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/ui/CustomerProductQtyPriceListTable.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 CustomerProductQtyPriceListTable extends RowValuesTablePanel {
 
public CustomerProductQtyPriceListTable() {
 
init();
uiInit();
}
 
/**
*
*/
protected void init() {
 
final SQLElement e = getSQLElement();
 
final List<SQLTableElement> list = new Vector<SQLTableElement>();
 
final SQLTableElement tableElementClient = new SQLTableElement(e.getTable().getField("ID_ARTICLE"));
list.add(tableElementClient);
 
// 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_ARTICLE"), false, this.defaultRowVals);
 
this.table = new RowValuesTable(this.model, null);
 
eltPourcent.setRenderer(new PercentTableCellRenderer());
 
}
 
public SQLElement getSQLElement() {
return Configuration.getInstance().getDirectory().getElement("TARIF_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/ProductComponent.java
15,6 → 15,8
 
import org.openconcerto.erp.core.sales.product.model.ProductHelper.SupplierPriceField;
import org.openconcerto.erp.core.supplychain.stock.element.DepotStockSQLElement;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
167,10 → 169,39
 
private static SQLRowAccessor getStock(SQLRowAccessor rowValsProduct, SQLRowAccessor rowValsElt, SQLRowAccessor rowValsSource) {
SQLRowAccessor rowStock = null;
final int idDepot;
int idDepot = -1;
 
if (rowValsProduct.getTable().getDBRoot().contains("AFFAIRE")) {
SQLTable tableAff = rowValsProduct.getTable().getTable("AFFAIRE");
if (tableAff.contains("ID_DEPOT_STOCK")) {
if (rowValsSource.getFields().contains("ID_DEPOT_STOCK") && !rowValsSource.isForeignEmpty("ID_DEPOT_STOCK")) {
idDepot = rowValsSource.getForeignID("ID_DEPOT_STOCK");
} else if (rowValsSource.getFields().contains("ID_AFFAIRE") && !rowValsSource.isForeignEmpty("ID_AFFAIRE")) {
SQLRowAccessor rowAff = rowValsSource.getForeign("ID_AFFAIRE");
if (rowAff.getFields().contains("ID_DEPOT_STOCK") && !rowAff.isForeignEmpty("ID_DEPOT_STOCK")) {
idDepot = rowAff.getForeignID("ID_DEPOT_STOCK");
}
} else {
SQLField fieldParent = Configuration.getInstance().getDirectory().getElement(rowValsSource.getTable()).getParentForeignField();
if (fieldParent != null) {
SQLRowAccessor parent = rowValsSource.getForeign(fieldParent.getName());
 
if (parent.getFields().contains("ID_AFFAIRE") && !parent.isForeignEmpty("ID_AFFAIRE")) {
SQLRowAccessor rowAff = parent.getForeign("ID_AFFAIRE");
if (rowAff.getFields().contains("ID_DEPOT_STOCK") && !rowAff.isForeignEmpty("ID_DEPOT_STOCK")) {
idDepot = rowAff.getForeignID("ID_DEPOT_STOCK");
}
}
}
}
}
}
 
if (idDepot == -1) {
 
if (rowValsSource.getFields().contains("ID_DEPOT_STOCK") && !rowValsSource.isForeignEmpty("ID_DEPOT_STOCK")) {
idDepot = rowValsSource.getForeignID("ID_DEPOT_STOCK");
} else {
if (rowValsElt.getForeign("ID_DEPOT_STOCK") != null && !rowValsElt.isForeignEmpty("ID_DEPOT_STOCK")) {
idDepot = rowValsElt.getForeignID("ID_DEPOT_STOCK");
} else {
183,7 → 214,7
 
}
}
 
}
SQLTable stockTable = rowValsElt.getTable().getTable("STOCK");
SQLRowValues putRowValuesStock = new SQLRowValues(stockTable);
putRowValuesStock.putNulls(stockTable.getTable().getFieldsName());
215,4 → 246,37
}
return rowStock;
}
 
public static SQLRowAccessor findOrCreateStock(SQLRowAccessor article, SQLRowAccessor depot) {
 
SQLRowAccessor rowStock = null;
SQLTable stockTable = article.getTable().getTable("STOCK");
SQLRowValues putRowValuesStock = new SQLRowValues(stockTable);
putRowValuesStock.putNulls(stockTable.getTable().getFieldsName());
 
SQLRowValuesListFetcher fetch = SQLRowValuesListFetcher.create(putRowValuesStock);
Where w = new Where(putRowValuesStock.getTable().getField("ID_DEPOT_STOCK"), "=", depot.getID());
Where w2 = new Where(putRowValuesStock.getTable().getField("ID_ARTICLE"), "=", article.getID());
Collection<SQLRowValues> rowValsResult = fetch.fetch(w.and(w2));
if (rowValsResult.size() == 0) {
SQLRowValues rowValsStock = new SQLRowValues(stockTable);
rowValsStock.put("ID_ARTICLE", article.getID());
rowValsStock.put("ID_DEPOT_STOCK", depot.getID());
rowValsStock.put("QTE_TH", 0F);
rowValsStock.put("QTE_REEL", 0F);
rowValsStock.put("QTE_RECEPT_ATTENTE", 0F);
rowValsStock.put("QTE_LIV_ATTENTE", 0F);
try {
rowStock = rowValsStock.insert();
} catch (SQLException e) {
ExceptionHandler.handle("Erreur lors la création du stock!", e);
}
} else if (rowValsResult.size() == 1) {
rowStock = rowValsResult.iterator().next();
} else if (rowValsResult.size() > 1) {
throw new IllegalStateException("2 lignes de stocks pour le même dépôt! Article " + article.getID() + " Depot " + depot.getID());
}
return rowStock;
 
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/model/ProductHelper.java
74,6 → 74,44
return result;
}
 
/**
* Fill productComponents with items (SQLrowAccessor of TABLE_ELEMENT)
*
* @param items
* @param productComponents
* @param qte
* @param index
* @param level
*/
public void fillProductComponent(List<? extends SQLRowAccessor> itemsTableElement, List<ProductComponent> productComponents, int qte, int index, int level) {
if (level > 0) {
for (int i = index; i < itemsTableElement.size(); i++) {
SQLRowAccessor r = itemsTableElement.get(i);
 
if (!r.getTable().contains("NIVEAU") || r.getInt("NIVEAU") >= level) {
// On ne calcul pas les stocks pour les éléments ayant des fils (le mouvement de
// stock
// des fils impactera les stocks automatiquement)
if (r.getTable().contains("NIVEAU")) {
if (i + 1 < itemsTableElement.size()) {
SQLRowAccessor rNext = itemsTableElement.get(i + 1);
if (rNext.getInt("NIVEAU") > r.getInt("NIVEAU")) {
fillProductComponent(itemsTableElement, productComponents, qte * r.getInt("QTE"), i + 1, rNext.getInt("NIVEAU"));
continue;
}
}
}
if ((!r.getTable().contains("NIVEAU") || r.getInt("NIVEAU") == level) && r.getForeign("ID_ARTICLE") != null && !r.isForeignEmpty("ID_ARTICLE")) {
productComponents.add(ProductComponent.createFrom(r, qte, r));
}
} else if (r.getInt("NIVEAU") < level) {
// BREAK si on sort de l'article composé
break;
}
}
}
}
 
public BigDecimal getUnitCostForQuantity(SQLRowAccessor rArticle, int qty) {
 
Collection<? extends SQLRowAccessor> l = rArticle.getReferentRows(rArticle.getTable().getTable("ARTICLE_PRIX_REVIENT"));
246,7 → 284,7
 
SQLRowValues rowVals = new SQLRowValues(costTable);
 
final SQLRowValues artRowValues = rowVals.putRowValues("ID_ARTICLE").putNulls("ID", "GESTION_STOCK", "CODE", "NOM", "ID_DEPOT_STOCK", "ID_UNITE_VENTE");
final SQLRowValues artRowValues = rowVals.putRowValues("ID_ARTICLE").putNulls("ID", "GESTION_STOCK", "CODE", "NOM", "ID_DEPOT_STOCK", "ID_UNITE_VENTE", "ID_FOURNISSEUR");
SQLRowValues stockRowVals = new SQLRowValues(root.getTable("STOCK"));
stockRowVals.putNulls("QTE_TH", "QTE_RECEPT_ATTENTE", "QTE_REEL", "QTE_LIV_ATTENTE", "ID_DEPOT_STOCK");
stockRowVals.put("ID_ARTICLE", artRowValues);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/pos/POSConfiguration.java
30,6 → 30,7
import org.openconcerto.erp.core.sales.pos.model.RegisterFiles.HashMode;
import org.openconcerto.erp.core.sales.pos.model.RegisterLogEntry.ReceiptEntry;
import org.openconcerto.erp.core.sales.pos.model.Ticket;
import org.openconcerto.erp.core.sales.pos.model.TicketItem;
import org.openconcerto.erp.core.sales.pos.model.TicketLine;
import org.openconcerto.erp.core.supplychain.stock.element.StockItemsUpdater;
import org.openconcerto.erp.core.supplychain.stock.element.StockItemsUpdater.TypeStockUpdate;
41,10 → 42,12
import org.openconcerto.erp.preferences.DefaultNXProps;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.element.SQLElementDirectory;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLDataSource;
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.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLSelect;
55,7 → 58,6
import org.openconcerto.utils.BaseDirs;
import org.openconcerto.utils.DecimalUtils;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.Pair;
import org.openconcerto.utils.i18n.TranslationManager;
 
import java.io.File;
69,9 → 71,11
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.logging.Logger;
 
import javax.swing.JOptionPane;
118,6 → 122,8
private String LCDLine1 = "Bienvenue";
private String LCDLine2 = "ILM Informatique";
 
private boolean askPostalCode = false;
 
public static POSConfiguration createInstance() throws JDOMException, IOException {
POSConfiguration res = new POSConfiguration(getConfigFile(new File(".")));
res.loadConfiguration();
255,8 → 261,8
System.exit(2);
}
 
NouvelleConnexionAction.initCache(conf);
 
NouvelleConnexionAction.initCache(conf, -1);
TaxeCache.getCache();
return conf;
}
 
317,14 → 323,23
throw new IllegalArgumentException("Size mismatch");
 
final int defaultIDClient = getClientCaisse().getID();
SQLElement elt = Configuration.getInstance().getDirectory().getElement("TICKET_CAISSE");
SQLElement eltFact = Configuration.getInstance().getDirectory().getElement("SAISIE_VENTE_FACTURE_ELEMENT");
SQLElement eltEnc = Configuration.getInstance().getDirectory().getElement("ENCAISSER_MONTANT");
SQLElement eltMode = Configuration.getInstance().getDirectory().getElement("MODE_REGLEMENT");
SQLElement eltArticle = Configuration.getInstance().getDirectory().getElement("ARTICLE");
final SQLElementDirectory directory = Configuration.getInstance().getDirectory();
SQLElement elt = directory.getElement("TICKET_CAISSE");
SQLElement eltFact = directory.getElement("SAISIE_VENTE_FACTURE_ELEMENT");
SQLElement eltEnc = directory.getElement("ENCAISSER_MONTANT");
SQLElement eltMode = directory.getElement("MODE_REGLEMENT");
SQLElement eltArticle = directory.getElement("ARTICLE");
final SQLDataSource ds = elt.getTable().getDBSystemRoot().getDataSource();
int imported = 0;
 
//
final SQLSelect selUniteVente = new SQLSelect();
selUniteVente.addSelectStar(directory.getElement("UNITE_VENTE").getTable());
final Map<String, Integer> mapUniteVenteName = new HashMap<>();
for (SQLRow row : SQLRowListRSH.execute(selUniteVente)) {
mapUniteVenteName.put(row.getString("CODE"), row.getID());
}
 
final Iterator<ReceiptEntry> entriesIter = entries == null ? null : entries.iterator();
for (Ticket ticket : tickets) {
SQLSelect sel = new SQLSelect();
347,6 → 362,9
rowVals.put("NUMERO", ticket.getCode());
rowVals.put("DATE", ticket.getCreationDate());
rowVals.put("ID_CAISSE", getPosID());
if (elt.getTable().contains("CODE_POSTAL")) {
rowVals.put("CODE_POSTAL", ticket.getCodePostal());
}
if (entry != null) {
rowVals.put("FILE_HASH", entry.getFileHash());
rowVals.put("FILE_HASH_PREVIOUS", ticket.getPreviousHash());
364,17 → 382,24
calc.setServiceActive(bServiceActive != null && bServiceActive);
 
// Articles
for (Pair<Article, Integer> item : ticket.getArticles()) {
for (TicketItem item : ticket.getItems()) {
SQLRowValues rowValsElt = new SQLRowValues(eltFact.getTable());
final Article article = item.getFirst();
final Integer nb = item.getSecond();
rowValsElt.put("QTE", nb);
final Article article = item.getArticle();
final BigDecimal nb = item.getQty();
if (article.getSalesUnit() == null) {
rowValsElt.put("QTE", nb.intValue());
} else {
rowValsElt.put("QTE", 1);
rowValsElt.put("QTE_UNITAIRE", nb);
}
rowValsElt.put("PV_HT", article.getPriceWithoutTax());
Float tauxFromId = TaxeCache.getCache().getTauxFromId(article.getIdTaxe());
BigDecimal tauxTVA = new BigDecimal(tauxFromId).movePointLeft(2).add(BigDecimal.ONE);
BigDecimal tauxTVA = BigDecimal.valueOf(tauxFromId).movePointLeft(2).add(BigDecimal.ONE);
 
final BigDecimal valueHT = article.getPriceWithoutTax().multiply(new BigDecimal(nb), DecimalUtils.HIGH_PRECISION);
 
final BigDecimal valueHT = article.getPriceWithoutTax().multiply(nb, DecimalUtils.HIGH_PRECISION);
if (article.getSalesUnit() != null) {
rowValsElt.put("ID_UNITE_VENTE", mapUniteVenteName.get(article.getSalesUnit()));
}
rowValsElt.put("T_PV_HT", valueHT);
rowValsElt.put("T_PV_TTC", valueHT.multiply(tauxTVA, DecimalUtils.HIGH_PRECISION));
rowValsElt.put("ID_TAXE", article.getIdTaxe());
449,7 → 474,7
false);
}
if (totalEnc > longValueTotal) {
final SQLTable table = Configuration.getInstance().getDirectory().getElement("TYPE_REGLEMENT").getTable();
final SQLTable table = directory.getElement("TYPE_REGLEMENT").getTable();
int idComptePceCaisse = table.getRow(TypeReglementSQLElement.ESPECE).getInt("ID_COMPTE_PCE_CLIENT");
if (idComptePceCaisse == table.getUndefinedID()) {
idComptePceCaisse = ComptePCESQLElement.getId(ComptePCESQLElement.getComptePceDefault("VenteEspece"));
520,15 → 545,13
stockUpdater.update();
}
 
public List<Ticket> allTickets() {
public List<Ticket> allTickets() throws IOException {
final List<Ticket> l = new ArrayList<Ticket>();
for (final File f : ReceiptCode.getReceiptsToImport(getPosID())) {
// old receipts have no hash files
final Ticket ticket = Ticket.parseFile(f, HashMode.NOT_REQUIRED);
if (ticket != null) {
l.add(ticket);
}
}
return l;
}
 
565,6 → 588,8
setCompanyID(Integer.valueOf(rootElement.getAttributeValue("societeID", "42")));
setPosID(Integer.valueOf(rootElement.getAttributeValue("caisseID", "2")));
setScanDelay(Integer.valueOf(rootElement.getAttributeValue("scanDelay", "80")));
setAskPostalCode(rootElement.getAttributeValue("askPostalCode", "false").equals("true"));
 
// screen
final List<Element> children = rootElement.getChildren("screen");
if (children != null) {
607,7 → 632,7
}
// ticket printers
final List<Element> printers = rootElement.getChildren("ticketPrinter");
if (printers.size() > 0) {
if (!printers.isEmpty()) {
configureTicketPrinter(this.ticketPrinterConf1, printers.get(0));
}
if (printers.size() > 1) {
649,6 → 674,7
configElement.setAttribute("societeID", String.valueOf(this.companyID));
configElement.setAttribute("caisseID", String.valueOf(this.posID));
configElement.setAttribute("scanDelay", String.valueOf(this.scanDelay));
configElement.setAttribute("askPostalCode", this.askPostalCode ? "true" : "false");
doc.addContent(configElement);
// screen size
final Element screenElement = new Element("screen");
799,4 → 825,12
public String getLCDType() {
return this.LCDType;
}
 
public boolean askPostalCode() {
return this.askPostalCode;
}
 
public void setAskPostalCode(boolean askPostalCode) {
this.askPostalCode = askPostalCode;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/pos/element/TicketCaisseSQLElement.java
30,6 → 30,7
static public final String UNARCHIVED_WHERE = SQLBase.quoteIdentifier("ARCHIVE") + " = " + 0;
static public final String DATE_WHERE = UNARCHIVED_WHERE + " and " + SQLBase.quoteIdentifier("FILE_HASH") + " is not null";
 
// needed until H2 databases are upgraded to use JS code
static public final class UniqueNumber_PartialUniqueTrigger extends PartialUniqueTrigger {
public UniqueNumber_PartialUniqueTrigger() {
super(Arrays.asList("NUMERO"), UNARCHIVED_WHERE);
36,6 → 37,7
}
}
 
// needed until H2 databases are upgraded to use JS code
static public final class UniqueDate_PartialUniqueTrigger extends PartialUniqueTrigger {
public UniqueDate_PartialUniqueTrigger() {
super(Arrays.asList("ID_CAISSE", "DATE"), DATE_WHERE);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/pos/ui/TextAreaTicketPanel.java
23,7 → 23,10
import org.openconcerto.erp.core.sales.pos.model.Ticket;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.element.SQLElementDirectory;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.utils.DecimalUtils;
 
33,7 → 36,9
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.swing.JButton;
import javax.swing.JPanel;
77,6 → 82,7
}
 
private Ticket createTicket(SQLRow row) {
// TODO merger ce code avec CaissepPanel.loadArticles si possible
final Ticket t;
try {
t = new Ticket(new ReceiptCode(row.getString("NUMERO")), row.getDate("DATE"), row.getString("FILE_HASH_PREVIOUS"));
84,7 → 90,8
throw new IllegalStateException("Couldn't parse " + row, e);
}
 
SQLElement eltEncaisser = Configuration.getInstance().getDirectory().getElement("ENCAISSER_MONTANT");
final SQLElementDirectory directory = Configuration.getInstance().getDirectory();
SQLElement eltEncaisser = directory.getElement("ENCAISSER_MONTANT");
List<SQLRow> l = row.getReferentRows(eltEncaisser.getTable());
for (SQLRow row2 : l) {
long montant = row2.getLong("MONTANT");
106,20 → 113,35
t.addPaiement(p);
}
 
SQLElement eltArticle = Configuration.getInstance().getDirectory().getElement("SAISIE_VENTE_FACTURE_ELEMENT");
SQLElement eltArticle = directory.getElement("SAISIE_VENTE_FACTURE_ELEMENT");
 
final SQLSelect selUniteVente = new SQLSelect();
selUniteVente.addSelectStar(directory.getElement("UNITE_VENTE").getTable());
final Map<Integer, String> mapUniteVenteName = new HashMap<>();
for (SQLRow rowUniteVente : SQLRowListRSH.execute(selUniteVente)) {
mapUniteVenteName.put(rowUniteVente.getID(), rowUniteVente.getString("CODE"));
}
 
List<SQLRow> l2 = row.getReferentRows(eltArticle.getTable());
Categorie c = new Categorie("");
for (SQLRow row2 : l2) {
Article a = new Article(c, row2.getString("NOM"), row2.getInt("ID_ARTICLE"));
if (row2.getInt("ID_UNITE_VENTE") != 2) {
a.setSalesUnit(mapUniteVenteName.get(row2.getInt("ID_UNITE_VENTE")));
}
BigDecimal ht = (BigDecimal) row2.getObject("PV_HT");
a.setPriceWithoutTax(ht);
int idTaxe = row2.getInt("ID_TAXE");
float tva = TaxeCache.getCache().getTauxFromId(idTaxe);
a.setPriceWithTax(ht.multiply(new BigDecimal(1.0 + (tva / 100.0D)), DecimalUtils.HIGH_PRECISION));
a.setPriceWithTax(ht.multiply(BigDecimal.valueOf(1.0 + (tva / 100.0D)), DecimalUtils.HIGH_PRECISION));
a.setIdTaxe(idTaxe);
t.addArticle(a);
t.setArticleCount(a, row2.getInt("QTE"));
if (a.getSalesUnit() == null) {
t.setArticleCount(a, new BigDecimal(row2.getInt("QTE")));
} else {
t.setArticleCount(a, row2.getBigDecimal("QTE_UNITAIRE"));
}
}
 
return t;
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/pos/ui/CategorieSelector.java
85,6 → 85,10
 
}
super.paint(g);
 
g.setColor(Color.LIGHT_GRAY);
g.drawLine(0, 0, 0, this.getHeight());
 
}
 
private int getLeftMargin() {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/pos/ui/TicketCellRenderer.java
14,8 → 14,8
package org.openconcerto.erp.core.sales.pos.ui;
 
import org.openconcerto.erp.core.sales.pos.model.Article;
import org.openconcerto.erp.core.sales.pos.model.TicketItem;
import org.openconcerto.ui.touch.ScrollableList;
import org.openconcerto.utils.Pair;
 
import java.awt.Color;
import java.awt.Component;
35,12 → 35,11
import javax.swing.ListCellRenderer;
import javax.swing.SwingConstants;
 
public class TicketCellRenderer implements ListCellRenderer {
public class TicketCellRenderer implements ListCellRenderer<TicketItem> {
 
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
@SuppressWarnings("unchecked")
Pair<Article, Integer> item = (Pair<Article, Integer>) value;
public Component getListCellRendererComponent(JList<? extends TicketItem> list, TicketItem item, int index, boolean isSelected, boolean cellHasFocus) {
 
JPanel p = new JPanel();
p.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
48,12 → 47,12
 
c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(5, 5, 5, 5);
final JLabel l1 = new JLabel(item.getSecond().toString(), SwingConstants.RIGHT);
final JLabel l1 = new JLabel(item.getArticle().toString(), SwingConstants.RIGHT);
 
p.add(l1, c);
c.gridx++;
c.weightx = 1;
Article article = item.getFirst();
Article article = item.getArticle();
final JLabel l2 = new JLabel(article.getName().toUpperCase(), SwingConstants.LEFT);
p.add(l2, c);
c.gridx++;
82,9 → 81,7
return p;
}
 
public void paint(Graphics g, ScrollableList list, Object value, int index, boolean isSelected) {
@SuppressWarnings("unchecked")
final Pair<Article, Integer> item = (Pair<Article, Integer>) value;
public void paint(Graphics g, ScrollableList list, TicketItem item, int index, boolean isSelected) {
 
if (isSelected) {
g.setColor(new Color(232, 242, 254));
97,20 → 94,34
g.setFont(new Font("Arial", Font.PLAIN, 16));
final int height = g.getFontMetrics().getMaxAscent() + g.getFontMetrics().getMaxDescent() + inset;
 
final String s1 = item.getSecond().toString();
System.err.println("TicketCellRenderer.paint()" + item);
 
Article article = item.getArticle();
final BigDecimal qty = item.getQty();
String s1 = qty.toString();
if (article.getSalesUnit() != null) {
s1 = qty.toString() + article.getSalesUnit();
}
g.drawString(s1, inset, height);
final int width1 = (int) g.getFontMetrics().getStringBounds("999 ", g).getWidth() + inset * 2;
final int width1 = (int) g.getFontMetrics().getStringBounds("1999kg ", g).getWidth() + inset * 2;
 
Article article = item.getFirst();
String s2 = article.getName().toUpperCase();
final int maxLength = 13;
String s2 = article.getName().toUpperCase().trim();
 
final int maxLength = 15;
if (s2.length() > maxLength)
s2 = s2.substring(0, maxLength + 1) + '…';
g.drawString(s2, width1 + inset, height);
 
final String s3 = centsToString(article.getPriceWithTax().movePointRight(2).setScale(0, RoundingMode.HALF_UP).intValue());
final int width3 = (int) g.getFontMetrics().getStringBounds(s3, g).getWidth() + inset * 2;
g.drawString(s3, list.getWidth() - width3, height);
final String s3 = centsToString(article.getPriceWithTax().multiply(qty).movePointRight(2).setScale(0, RoundingMode.HALF_UP).intValue()) + "€";
final int width3 = (int) g.getFontMetrics().getStringBounds(s3, g).getWidth() + +inset;
g.drawString(s3, list.getWidth() - width3, height - 4);
 
g.setFont(g.getFont().deriveFont(12f));
final String s4 = qty.toPlainString() + " x " + centsToString(article.getPriceWithTax().movePointRight(2).setScale(0, RoundingMode.HALF_UP).intValue());
 
final int width4 = (int) g.getFontMetrics().getStringBounds(s4, g).getWidth() + +inset;
g.drawString(s4, list.getWidth() - width4, height + 11);
 
}
 
public static String centsToString(int cents) {
125,4 → 136,5
public static String toString(final BigDecimal p) {
return centsToString(p.movePointRight(2).setScale(0, RoundingMode.HALF_UP).intValue());
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/pos/ui/ListeDesTicketsPanel.java
16,7 → 16,6
import org.openconcerto.erp.core.sales.pos.TicketPrinterConfiguration;
import org.openconcerto.erp.core.sales.pos.io.Printable;
import org.openconcerto.erp.core.sales.pos.io.TicketPrinter;
import org.openconcerto.erp.core.sales.pos.model.Article;
import org.openconcerto.erp.core.sales.pos.model.RegisterFiles;
import org.openconcerto.erp.core.sales.pos.model.RegisterLog;
import org.openconcerto.erp.core.sales.pos.model.Ticket;
23,7 → 22,6
import org.openconcerto.ui.DefaultListModel;
import org.openconcerto.ui.touch.ScrollableList;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.Pair;
 
import java.awt.Color;
import java.awt.Component;
111,7 → 109,7
}
 
@Override
protected final List<Ticket> getReceipts() throws ParseException {
protected final List<Ticket> getReceipts() throws ParseException, IOException {
return this.getLog().parseReceipts();
}
 
160,22 → 158,22
try {
final RegisterLog lastLog = this.frame.getFiles().getLastLog();
final List<Ticket> receipts = lastLog.parseReceipts();
ticketLlistModel = new DefaultListModel();
ticketLlistModel.addElement(new X(lastLog, receipts));
ticketLlistModel.addElement(new XLite(lastLog, receipts));
this.ticketLlistModel = new DefaultListModel();
this.ticketLlistModel.addElement(new X(lastLog, receipts));
this.ticketLlistModel.addElement(new XLite(lastLog, receipts));
final Date previousDate = lastLog.getFirstRegisterEvent().getPreviousDate();
if (previousDate != null) {
final Calendar cal = Calendar.getInstance();
cal.setTime(previousDate);
ticketLlistModel.addElement(new Z(this.frame.getFiles(), cal));
this.ticketLlistModel.addElement(new Z(this.frame.getFiles(), cal));
}
ticketLlistModel.addAll(receipts);
this.ticketLlistModel.addAll(receipts);
 
} catch (Exception exn) {
ExceptionHandler.handle(this.frame, "Impossible de charger les tickets", exn);
}
final Font f = new Font(ARIAL_FONT, Font.PLAIN, 24);
ticketList = new ScrollableList(ticketLlistModel) {
this.ticketList = new ScrollableList(this.ticketLlistModel) {
@Override
public void paintCell(Graphics g, Object object, int index, boolean isSelected, int posY) {
g.setFont(f);
211,24 → 209,25
}
}
};
this.add(ticketList, c);
this.add(this.ticketList, c);
// Ticket
c.fill = GridBagConstraints.VERTICAL;
c.weightx = 0;
c.gridx++;
c.gridheight = 1;
c.insets = new Insets(10, 10, 10, 10);
ticketP = new TextAreaTicketPrinter();
this.ticketP = new TextAreaTicketPrinter();
 
JScrollPane scrollPane = new JScrollPane(ticketP);
JScrollPane scrollPane = new JScrollPane(this.ticketP);
scrollPane.setPreferredSize(new Dimension(400, 200));
scrollPane.setMinimumSize(new Dimension(400, 200));
this.add(scrollPane, c);
 
ticketList.addListSelectionListener(new ListSelectionListener() {
this.ticketList.addListSelectionListener(new ListSelectionListener() {
 
@Override
public void valueChanged(ListSelectionEvent e) {
Object selectedValue = ticketList.getSelectedValue();
Object selectedValue = ListeDesTicketsPanel.this.ticketList.getSelectedValue();
setSelectedTicket(selectedValue);
}
});
239,8 → 238,8
c.weighty = 0;
c.fill = GridBagConstraints.NONE;
final Font font = new Font(ARIAL_FONT, Font.PLAIN, 46);
l = new JList(new String[] { "Imprimer", "Annuler" });
l.setCellRenderer(new ListCellRenderer() {
this.l = new JList(new String[] { "Imprimer", "Annuler le ticket" });
this.l.setCellRenderer(new ListCellRenderer() {
 
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
259,11 → 258,11
}
 
});
l.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
l.getSelectionModel().addListSelectionListener(this);
this.l.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.l.getSelectionModel().addListSelectionListener(this);
 
l.setFixedCellHeight(160);
this.add(l, c);
this.l.setFixedCellHeight(100);
this.add(this.l, c);
 
setFont(new Font(ARIAL_FONT, Font.BOLD, 24));
 
272,7 → 271,7
 
@Override
public void actionPerformed(ActionEvent e) {
frame.showCaisse();
ListeDesTicketsPanel.this.frame.showCaisse();
 
}
});
284,30 → 283,25
if (e.getValueIsAdjusting()) {
return;
}
Object selectedValue = ticketList.getSelectedValue();
int selectedIndex = l.getSelectedIndex();
Object selectedValue = this.ticketList.getSelectedValue();
int selectedIndex = this.l.getSelectedIndex();
if (selectedIndex == 0 && selectedValue != null) {
this.frame.getPOSConf().printOnceOnFirstPrinter(((Printable) selectedValue));
} else if (selectedIndex == 1 && selectedValue != null) {
// Annulation du ticket
} else if (selectedIndex == 1 && selectedValue != null && selectedValue instanceof Ticket) {
Ticket t = (Ticket) selectedValue;
for (Pair<Article, Integer> a : t.getArticles()) {
frame.getControler().addArticle(a.getFirst());
frame.getControler().setArticleCount(a.getFirst(), -a.getSecond());
frame.getControler().setArticleHT(a.getFirst(), a.getFirst().getPriceWithoutTax());
this.frame.getControler().cancel(t);
 
}
frame.showCaisse();
this.l.clearSelection();
}
l.clearSelection();
}
 
public void setSelectedTicket(Object selectedValue) {
ticketP.clear();
this.ticketP.clear();
if (selectedValue != null) {
this.frame.getPOSConf().print(((Printable) selectedValue), new TicketPrinterConfiguration() {
@Override
public TicketPrinter createTicketPrinter() {
return ticketP;
return ListeDesTicketsPanel.this.ticketP;
}
 
@Override
321,11 → 315,11
}
});
try {
ticketP.printBuffer();
this.ticketP.printBuffer();
} catch (Exception e1) {
e1.printStackTrace();
}
}
ticketList.setSelectedValue(selectedValue, true);
this.ticketList.setSelectedValue(selectedValue, true);
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/pos/ui/PostalCodeEditorPanel.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.sales.pos.ui;
 
import org.openconcerto.erp.core.common.ui.NumericTextField;
 
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
 
public class PostalCodeEditorPanel extends JPanel {
 
private final NumericTextField postalCodeTextField;
 
private final NumericKeypadPanel keyPad;
 
public PostalCodeEditorPanel(final CaisseFrame caisseFrame, final CaissePanel caissePanel) {
 
this.setBackground(Color.WHITE);
this.setOpaque(true);
this.setLayout(new GridBagLayout());
final GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.anchor = GridBagConstraints.EAST;
c.weightx = 0;
c.weighty = 1;
c.gridx = 0;
c.gridy = 0;
c.insets = new Insets(20, 20, 30, 20);
// Line 1
c.gridwidth = 2;
POSLabel title = new POSLabel("Code postal");
this.add(title, c);
// Line 2
this.postalCodeTextField = new NumericTextField(8);
this.postalCodeTextField.setFont(this.postalCodeTextField.getFont().deriveFont(16f));
c.gridy++;
this.add(this.postalCodeTextField, c);
 
c.gridy++;
c.gridx = 0;
c.fill = GridBagConstraints.NONE;
c.anchor = GridBagConstraints.SOUTHEAST;
 
final JPanel buttons = new JPanel(new GridLayout(1, 2, 10, 0));
buttons.setOpaque(false);
POSButton bCancel = new POSButton("Annuler");
buttons.add(bCancel, c);
POSButton bApply = new POSButton("Valider");
buttons.add(bApply, c);
bApply.addActionListener(new ActionListener() {
 
@Override
public void actionPerformed(ActionEvent e) {
caissePanel.getControler().setCodePostal(PostalCodeEditorPanel.this.postalCodeTextField.getText());
caissePanel.validateTicket(caisseFrame);
caisseFrame.showCaisse();
}
});
bCancel.addActionListener(new ActionListener() {
 
@Override
public void actionPerformed(ActionEvent e) {
caisseFrame.showCaisse();
}
});
 
this.add(buttons, c);
 
c.anchor = GridBagConstraints.CENTER;
c.weightx = 0;
c.weighty = 0;
c.gridx = 3;
c.gridy = 2;
c.insets = new Insets(20, 20, 30, 20);
// Line 1
c.gridheight = 5;
keyPad = new NumericKeypadPanel(postalCodeTextField);
this.add(keyPad, c);
 
SwingUtilities.invokeLater(new Runnable() {
public void run() {
postalCodeTextField.requestFocus();
}
});
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/pos/ui/CaisseControler.java
27,10 → 27,10
import org.openconcerto.erp.core.sales.pos.model.RegisterLogEntry.ReceiptEntry;
import org.openconcerto.erp.core.sales.pos.model.RegisterState.Status;
import org.openconcerto.erp.core.sales.pos.model.Ticket;
import org.openconcerto.erp.core.sales.pos.model.TicketItem;
import org.openconcerto.erp.preferences.TemplateNXProps;
import org.openconcerto.sql.element.SQLElementDirectory;
import org.openconcerto.utils.FileUtils;
import org.openconcerto.utils.Pair;
import org.openconcerto.utils.StringUtils;
 
import java.awt.event.KeyEvent;
59,7 → 59,7
private Paiement paiementSelected;
private Ticket t;
private Client client = Client.NONE;
private List<CaisseListener> listeners = new ArrayList<CaisseListener>();
private List<CaisseListener> listeners = new ArrayList<>();
 
private final BarcodeReader r;
private Paiement p1 = new Paiement(Paiement.ESPECES);
67,6 → 67,7
private Paiement p3 = new Paiement(Paiement.CHEQUE);
private final CaisseFrame caisseFrame;
private final POSDisplay lcd;
private TicketItem ticketItemSelected;
 
public CaisseControler(CaisseFrame caisseFrame) throws ParseException, JDOMException, IOException {
this.caisseFrame = caisseFrame;
95,9 → 96,9
this.r.start();
this.r.addBarcodeListener(this);
if (posConf.getLCDType().equals("serial")) {
lcd = new ESCSerialDisplay(posConf.getLCDPort());
this.lcd = new ESCSerialDisplay(posConf.getLCDPort());
} else {
lcd = new PrinterPOSDisplay(posConf.getLCDPort());
this.lcd = new PrinterPOSDisplay(posConf.getLCDPort());
}
this.setLCDDefaultDisplay(0);
}
119,7 → 120,7
}
 
void setArticleSelected(Article a) {
if (a != articleSelected) {
if (a != this.articleSelected) {
this.articleSelected = a;
this.paiementSelected = null;
fire();
129,6 → 130,7
void setPaiementSelected(Paiement p) {
this.paiementSelected = p;
this.articleSelected = null;
this.ticketItemSelected = null;
fire();
}
 
159,9 → 161,13
}
 
public Client getClient() {
return client;
return this.client;
}
 
public void setCodePostal(String codePostal) {
this.t.setCodePostal(codePostal);
}
 
// Articles
public void addArticle(Article a) {
this.t.addArticle(a);
225,20 → 231,20
 
//
 
public List<Pair<Article, Integer>> getItems() {
return this.t.getArticles();
public List<TicketItem> getItems() {
return this.t.getItems();
}
 
public int getItemCount(Article article) {
public BigDecimal getItemCount(Article article) {
return this.t.getItemCount(article);
}
 
public void clearArticle(Article article) {
this.t.clearArticle(article);
this.setArticleSelected(null);
this.setTicketItemSelected(null);
}
 
public void setArticleCount(Article article, int count) {
public void setArticleCount(Article article, BigDecimal count) {
this.t.setArticleCount(article, count);
this.setArticleSelected(null);
}
258,15 → 264,10
} else if (code.equalsIgnoreCase("annuler")) {
if (this.articleSelected != null) {
this.clearArticle(this.articleSelected);
 
} else {
if (this.paiementSelected != null) {
} else if (this.paiementSelected != null) {
this.paiementSelected.setMontantInCents(0);
// setPaiementSelected(null);
fire();
}
 
}
} else if (code.equalsIgnoreCase("valider")) {
 
} else if (code.equalsIgnoreCase("facture")) {
284,7 → 285,7
Ticket t = Ticket.getTicketFromCode(code, this.caisseFrame.getFiles());
if (t != null) {
System.err.println("CaisseControler.barcodeRead() barcode : " + code + " : receipt found :" + t.getNumber());
caisseFrame.showTickets(t);
this.caisseFrame.showTickets(t);
}
}
}
325,7 → 326,7
 
@Override
public void keyReceived(KeyEvent ee) {
 
// nothing
}
 
public static String getCents(int cents) {
337,9 → 338,7
}
 
public static String getEuros(int cents) {
String s = String.valueOf(cents / 100);
 
return s;
return String.valueOf(cents / 100);
}
 
public Ticket saveAndClearTicket(final RegisterFiles files, final SQLElementDirectory dir) throws IOException, SQLException {
349,16 → 348,16
final String fileHash = this.t.save(files, dir);
final Ticket res = this.t;
final int newIndex = this.t.getNumber() + 1;
t = new Ticket(getPOSConf().getPosID(), newIndex, fileHash);
p1 = new Paiement(Paiement.ESPECES);
p2 = new Paiement(Paiement.CB);
p3 = new Paiement(Paiement.CHEQUE);
this.t = new Ticket(getPOSConf().getPosID(), newIndex, fileHash);
this.p1 = new Paiement(Paiement.ESPECES);
this.p2 = new Paiement(Paiement.CB);
this.p3 = new Paiement(Paiement.CHEQUE);
this.t.addPaiement(this.p1);
this.t.addPaiement(this.p2);
this.t.addPaiement(this.p3);
this.setPaiementSelected(null);
this.setArticleSelected(null);
client = Client.NONE;
this.client = Client.NONE;
return res;
}
 
377,7 → 376,7
}
 
public void switchListMode() {
caisseFrame.mainPanel.switchListMode();
this.caisseFrame.mainPanel.switchListMode();
 
}
 
386,7 → 385,7
@Override
public void run() {
try {
lcd.setMessage(line1, line2);
CaisseControler.this.lcd.setMessage(line1, line2);
} catch (Exception e) {
e.printStackTrace();
}
393,17 → 392,22
}
};
final Timer timer = new Timer("LCD : " + line1, true);
timer.schedule(task, delay * 1000);
timer.schedule(task, delay * 1000L);
 
}
 
public void setLCDDefaultDisplay(int delay) {
if (t.getTotalInCents() > 0) {
if (this.t.getTotalInCents() > 0) {
int count = 0;
final List<Pair<Article, Integer>> articles = t.getArticles();
for (Pair<Article, Integer> pair : articles) {
count += pair.getSecond();
final List<TicketItem> articles = this.t.getItems();
for (TicketItem pair : articles) {
Article a = pair.getArticle();
if (a.getSalesUnit() == null) {
count += pair.getQty().intValue();
} else {
count++;
}
}
String line1;
if (count == 1) {
line1 = "1 article";
410,7 → 414,7
} else {
line1 = count + " articles";
}
int cents = t.getTotalInCents();
int cents = this.t.getTotalInCents();
setLCD(line1, "Total : " + TicketCellRenderer.centsToString(cents), delay);
} else {
setLCD(getPOSConf().getLCDLine1(), getPOSConf().getLCDLine2(), delay);
421,7 → 425,7
 
final String creditCardPort = getPOSConf().getCreditCardPort();
if (creditCardPort != null && creditCardPort.trim().length() > 2) {
final Thread t = new Thread(new Runnable() {
final Thread thread = new Thread(new Runnable() {
 
@Override
public void run() {
438,33 → 442,22
}
}
});
t.setDaemon(true);
t.start();
thread.setDaemon(true);
thread.start();
 
}
 
}
 
public void setArticleHT(Article article, BigDecimal ht) {
Article existingArticle = null;
final List<Pair<Article, Integer>> articles = t.getArticles();
for (Pair<Article, Integer> pair : articles) {
final Article a = pair.getFirst();
if (a.getId() == article.getId()) {
if (article.getPriceWithoutTax().doubleValue() == a.getPriceWithoutTax().doubleValue()) {
existingArticle = a;
break;
}
}
}
if (existingArticle != null) {
existingArticle.updatePriceWithoutTax(ht);
public void setArticleHT(TicketItem item, BigDecimal ht) {
final Article newArticle = new Article(item.getArticle());
newArticle.updatePriceWithoutTax(ht);
item.setArticle(newArticle);
fire();
}
}
 
public void openPriceEditor(Article article) {
caisseFrame.showPriceEditor(article, this);
public void openPriceEditor(TicketItem item) {
this.caisseFrame.showPriceEditor(item, this);
}
 
public void enableBarcodeReader() {
476,7 → 469,7
}
 
public boolean isTicketValid() {
return (!this.t.getArticles().isEmpty()) && ((this.getTotal() >= 0 && this.getPaidTotal() >= this.getTotal()) || (this.getTotal() < 0 && this.getPaidTotal() == this.getTotal()));
return (!this.t.getItems().isEmpty()) && ((this.getTotal() >= 0 && this.getPaidTotal() >= this.getTotal()) || (this.getTotal() < 0 && this.getPaidTotal() == this.getTotal()));
}
 
public Set<Integer> loadFavoriteProductsIds() {
515,4 → 508,43
}
}
 
public void setTicketItemSelected(TicketItem item) {
this.ticketItemSelected = item;
if (item == null) {
this.articleSelected = null;
} else {
this.articleSelected = item.getArticle();
this.paiementSelected = null;
}
fire();
 
}
 
public TicketItem getTicketItemSelected() {
return this.ticketItemSelected;
}
 
public void removeTicketItem(TicketItem item) {
this.t.removeTicketItem(item);
this.setTicketItemSelected(null);
}
 
public void cancel(Ticket ticket) {
this.t.clear();
// Annulation du ticket
for (TicketItem a : ticket.getItems()) {
final Article article = a.getArticle();
TicketItem item = new TicketItem(article, a.getQty().multiply(new BigDecimal(-1)));
this.t.addItem(item);
}
for (Paiement p : ticket.getPaiements()) {
final Paiement paiement = new Paiement(p.getType());
paiement.setMontantInCents(-1 * p.getMontantInCents());
this.t.addPaiement(paiement);
}
 
this.caisseFrame.showCaisse();
fire();
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/pos/ui/RegisterSummary.java
23,6 → 23,7
import org.openconcerto.erp.core.sales.pos.model.RegisterState.Status;
import org.openconcerto.erp.core.sales.pos.model.Ticket;
 
import java.io.IOException;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.ParseException;
56,7 → 57,7
 
public abstract String getLabel();
 
protected abstract List<Ticket> getReceipts() throws ParseException;
protected abstract List<Ticket> getReceipts() throws ParseException, IOException;
 
@Override
public void print(TicketPrinter prt, int ticketWidth) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/pos/ui/TicketPanel.java
17,8 → 17,8
import org.openconcerto.erp.core.sales.pos.model.Article;
import org.openconcerto.erp.core.sales.pos.model.RegisterState;
import org.openconcerto.erp.core.sales.pos.model.RegisterState.Status;
import org.openconcerto.erp.core.sales.pos.model.TicketItem;
import org.openconcerto.ui.touch.ScrollableList;
import org.openconcerto.utils.Pair;
 
import java.awt.Color;
import java.awt.Dimension;
45,27 → 45,27
 
public class TicketPanel extends JPanel implements CaisseListener {
 
static private final DateFormat DF = new SimpleDateFormat("' le' EEEE d MMMM à H:mm:ss");
 
private final DateFormat df = new SimpleDateFormat("' le' d MMMM à H:mm");
private final Image bg;
 
private final ListModel dataModel;
private final List<ListDataListener> listeners = new ArrayList<ListDataListener>();
JLabel lTotal = new JLabel("", SwingConstants.RIGHT);
JLabel lNumero = new JLabel("", SwingConstants.LEFT);
private final ListModel<TicketItem> dataModel;
private final List<ListDataListener> listeners = new ArrayList<>();
private final JLabel lTotal = new JLabel("", SwingConstants.RIGHT);
private final JLabel lNumero = new JLabel("", SwingConstants.LEFT);
private final CaisseControler controler;
 
private final ScrollableList list;
private int xOffset = 0;
 
TicketPanel(final CaisseControler controler) {
this.controler = controler;
this.controler.addCaisseListener(this);
 
if (this.controler.getPOSConf().getScreenWidth() < 1280) {
this.xOffset = -24;
}
this.setOpaque(false);
this.bg = new ImageIcon(TicketPanel.class.getResource("ticket.png")).getImage();
this.setLayout(null);
 
this.dataModel = new ListModel() {
this.dataModel = new ListModel<TicketItem>() {
 
@Override
public void addListDataListener(final ListDataListener l) {
73,7 → 73,7
}
 
@Override
public Object getElementAt(final int index) {
public TicketItem getElementAt(final int index) {
return controler.getItems().get(index);
}
 
95,22 → 95,22
@Override
public void paintCell(final Graphics g, final Object value, final int index, final boolean isSelected, final int posY) {
g.translate(0, posY);
this.renderer.paint(g, TicketPanel.this.list, value, index, isSelected);
this.renderer.paint(g, TicketPanel.this.list, (TicketItem) value, index, isSelected);
g.translate(0, -posY);
}
};
this.list.setOpaque(false);
this.list.setSize(276, 450);
this.list.setSize(315, 450);
this.list.setFixedCellHeight(40);
this.list.setLocation(68, 18);
this.list.setLocation(30 + this.xOffset, 18);
this.add(this.list);
 
this.lTotal.setSize(276 - 10, 32);
this.lTotal.setLocation(68, 500 - 32);
this.lTotal.setLocation(68 + this.xOffset, 500 - 32);
this.lTotal.setFont(new Font("Arial", Font.BOLD, 18));
this.add(this.lTotal);
this.lNumero.setSize(276 - 10, 32);
this.lNumero.setLocation(68, 500);
this.lNumero.setLocation(68 + this.xOffset, 500);
this.lNumero.setForeground(Color.DARK_GRAY);
this.lNumero.setFont(new Font("Arial", Font.BOLD, 12));
this.add(this.lNumero);
122,12 → 122,13
if (!e.getValueIsAdjusting()) {
final Object selectedValue = TicketPanel.this.list.getSelectedValue();
if (selectedValue != null) {
final Article a = ((Pair<Article, Integer>) selectedValue).getFirst();
controler.setArticleSelected(a);
TicketItem item = (TicketItem) selectedValue;
controler.setTicketItemSelected(item);
// If the category of the selected article does not match the current
// category of the categories list,
// then the corresponding article is not selected.
controler.setArticleSelected(a); // Dirty fix : use two refresh
controler.setTicketItemSelected(item); // Dirty fix : use two refresh
 
}
}
 
138,19 → 139,28
 
@Override
protected void paintComponent(final Graphics g) {
g.drawImage(this.bg, 0, 0, null);
g.drawImage(this.bg, this.xOffset, 0, null);
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
try {
final RegisterState registerState = this.controler.getCaisseFrame().getFiles().getLastLog().getRegisterState();
 
// Display caisse and Vendor ID
String InfoCaisseVendeur = "Caisse " + this.controler.getPOSConf().getPosID() + " Vendeur " + this.controler.getPOSConf().getUserID();
final String infoCaisseVendeur = "Caisse " + this.controler.getPOSConf().getPosID() + " Vendeur " + this.controler.getPOSConf().getUserID();
final String infoCaisse = (registerState.getStatus() == Status.OPEN ? "Ouverte" : "Fermée") + registerState.formatDate(this.df);
g.setColor(new Color(230, 230, 230));
g.setFont(getFont().deriveFont(28.0f));
g.drawString(InfoCaisseVendeur, 20, this.getHeight() - 50);
if (this.controler.getPOSConf().getScreenWidth() < 1280) {
g.setFont(getFont().deriveFont(16.0f));
} else {
g.setFont(getFont().deriveFont(14.0f));
}
int w1 = g.getFontMetrics().stringWidth(infoCaisseVendeur);
int w2 = g.getFontMetrics().stringWidth(infoCaisse);
 
int x = 330 - Math.max(w1, w2) + this.xOffset;
g.drawString(infoCaisseVendeur, x, this.getHeight() - 40);
g.setColor(Color.LIGHT_GRAY);
g.setFont(getFont().deriveFont(18.0f));
final RegisterState registerState = this.controler.getCaisseFrame().getFiles().getLastLog().getRegisterState();
g.drawString("Caisse " + (registerState.getStatus() == Status.OPEN ? "ouverte" : "fermée") + registerState.formatDate(DF), 20, this.getHeight() - 25);
 
g.drawString(infoCaisse, x, this.getHeight() - 25);
} catch (Exception e) {
POSConfiguration.getLogger().log(Level.WARNING, "Couldn't find register state", e);
}
157,14 → 167,28
super.paintComponent(g);
}
 
int getMinWidth() {
if (this.controler.getPOSConf().getScreenWidth() < 1280) {
return 330;
}
return 480;
}
 
int getMaxHeight() {
if (this.controler.getPOSConf().getScreenHeight() < 1000) {
return 550;
}
return 707;
}
 
@