OpenConcerto

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

svn://code.openconcerto.org/openconcerto

Compare Revisions

Regard whitespace Rev 181 → Rev 182

/trunk/OpenConcerto/lib/mysql-connector-java-5.1.40-bin.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/lib/poi-3.17.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/lib/poi-4.1.0.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/lib/flatlaf-0.41.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/lib/fontbox-2.0.19.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/lib/pdfbox-2.0.19.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/lib/jOpenDocument-1.4rc2.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/lib/jOpenDocument-1.4rc2.badSecurity.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/lib/jOpenDocument-1.4rc2.badSecurity.jar
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/OpenConcerto/lib/pdfbox-2.0.22.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/lib/pdfbox-2.0.22.jar
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/OpenConcerto/lib/jOpenCalendar.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/lib/flatlaf-1.2.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/lib/flatlaf-1.2.jar
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/OpenConcerto/lib/pdfbox2d.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/lib/pdfbox2d.jar
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/OpenConcerto/lib/mysql-connector-java-5.1.45-bin.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/lib/mysql-connector-java-5.1.45-bin.jar
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/OpenConcerto/lib/poi-5.0.0.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/lib/poi-5.0.0.jar
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/OpenConcerto/lib/fontbox-2.0.22.jar
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/lib/fontbox-2.0.22.jar
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/OpenConcerto/Configuration/Template/Labels/test.graphicspl
New file
0,0 → 1,30
<?xml version="1.0" encoding="UTF-8" ?>
<graphicspl width="600" height="400" dpi="300"
printratio="0.5">
<rectangle fill="true" x="0" y="380" width="600" height="20"
color="#FF000" />
 
<image x="420" y="20" width="160" height="160" file="icon.png" />
 
 
 
<text x="10" y="10" fontsize="20" font="Verdana">OpenConcerto</text>
 
<text x="390" y="60" fontsize="40" font="Verdana" align="right"
wrap="true" maxwidth="200">Atome Premium</text>
 
<text x="390" y="140" fontsize="40" font="Verdana" align="right"
color="#12000">56.00 € HT</text>
 
 
 
<barcode x="10" y="120" modulewidth="4" type="datamatrix"
width="200">OpenConcerto</barcode>
<barcode x="10" y="220" type="gs1" height="100" modulewidth="6"
fontsize="25">1234566546
</barcode>
<text x="300" y="200" fontsize="10" font="Verdana" align="center"
color="#666666">ARTICLE EN PROMOTION - NON ECHANGEABLE</text>
<rectangle fill="false" x="0" y="0" width="599" height="399" />
 
</graphicspl>
/trunk/OpenConcerto/Configuration/Template/Labels/icon.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Labels/icon.png
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/OpenConcerto/Configuration/Template/Default/Courrier.odt
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/ReportingVentes.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/Commande.xml
25,7 → 25,7
</element>
 
<element location="B6" type="fill">
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIREN "/>
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIRET "/>
</element>
 
<element location="B7" type="replace" replacePattern="_">
/trunk/OpenConcerto/Configuration/Template/Default/JournauxMois.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/VenteFactureSituation.xml
24,7 → 24,7
</element>
 
<element location="B6" type="fill">
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIREN "/>
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIRET "/>
</element>
 
<element location="B7" type="replace" replacePattern="_">
/trunk/OpenConcerto/Configuration/Template/Default/ReportingClient.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/ReportingClient.ods
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/OpenConcerto/Configuration/Template/Default/FicheArticle.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/DepotCheque.odsp
New file
0,0 → 1,9
<odsp>
<spliteveryrow>
<sheet number="0">56</sheet>
</spliteveryrow>
<offset x="40" y ="20"/>
<resize percent="85"/>
 
 
</odsp>
/trunk/OpenConcerto/Configuration/Template/Default/VenteFacture.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/Relance1.odt
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/FichePaye.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/Relance3.odt
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/RepartitionAnalytique.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/Commande.odsp
1,6 → 1,6
<odsp>
<spliteveryrow>
<sheet number="0">57</sheet>
<sheet number="0">58</sheet>
</spliteveryrow>
<offset x="40" y ="20"/>
<resize percent="85"/>
/trunk/OpenConcerto/Configuration/Template/Default/EtatStockInventaire.odsp
New file
0,0 → 1,9
<odsp>
<spliteveryrow>
<sheet number="0">57</sheet>
</spliteveryrow>
<offset x="40" y ="20"/>
<resize percent="85"/>
 
 
</odsp>
/trunk/OpenConcerto/Configuration/Template/Default/DepotCheque.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/DepotCheque.ods
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/OpenConcerto/Configuration/Template/Default/BalanceAgee.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/VenteFactureTicket.xml
New file
0,0 → 1,90
<?xml version="1.0" encoding="UTF-8" ?>
<contentDocument>
 
<element0 location="B1" type="Value" ValueName="SOCIETE_NOM">
</element0>
 
<element0 location="B2" type="Value" ValueName="SOCIETE_RUE">
</element0>
 
<element0 location="B3" type="Value" ValueName="SOCIETE_CODE_POSTAL_VILLE">
</element0>
 
<element0 location="B5" type="Value" ValueName="SOCIETE_TYPE_CAPITAL">
</element0>
 
<element0 location="B6" type="Value" ValueName="SOCIETE_SIRET" prefix="N° de SIREN ">
</element0>
 
<element0 location="B7" type="Value" ValueName="SOCIETE_TVA" prefix="N° de TVA ">
</element0>
 
<element0 location="B8" type="Value" ValueName="SOCIETE_TEL" prefix="N° de Téléphone ">
</element0>
 
<element0 location="B10" type="Value" ValueName="SOCIETE_MAIL" prefix="Email ">
</element0>
 
<element0 location="B13" type="Value" ValueName="NUMERO">
</element0>
 
<element0 location="C13" type="Value" ValueName="DATE">
</element0>
 
<element0 location="H10" type="Value" ValueName="CLIENT">
</element0>
 
<element0 location="H11" type="Value" ValueName="ADRESSE">
</element0>
 
<element0 location="L62" type="Value" ValueName="T_HT">
</element0>
<element0 location="L65" type="Value" ValueName="T_TTC">
</element0>
 
<element0 location="L63" type="Value" ValueName="T_TVA_1">
</element0>
<element0 location="I63" type="Value" ValueName="TVA_1">
</element0>
 
<element0 location="L64" type="Value" ValueName="T_TVA_2">
</element0>
<element0 location="I64" type="Value" ValueName="TVA_2">
</element0>
 
<table0 endPageLine="66" firstLine="20" endLine="60" blankLineBeforeStyle="Titre 1,Titre 2" lastColumn="K"
base="Societe" table="SAISIE_VENTE_FACTURE_ELEMENT" pageRef="L16">
<element location="B" type="fill" cellSize="45">
<field name="CODE" />
</element>
<element location="C" type="fill" cellSize="45">
<field name="NOM" />
</element>
<element location="H" type="fill">
<field name="POURCENT_REMISE">
<exclude value="0.000000" />
</field>
</element>
<element location="I" type="fill">
<field name="PV_HT" type="devise">
<exclude value="0.000000" />
</field>
</element>
<element location="J" type="fill">
<field name="QTE" />
</element>
<element location="K" type="fill">
<field name="TVA">
</field>
</element>
<element location="L" type="fill">
<field name="T_HT_REMISE" type="devise">
<exclude value="0.000000" />
</field>
</element>
 
</table0>
</contentDocument>
/trunk/OpenConcerto/Configuration/Template/Default/Devis.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/Journaux.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/EtatStockInventaire.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/EtatStockInventaire.ods
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/OpenConcerto/Configuration/Template/Default/ReleveChequeEmis.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/LivrePaye.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/AvoirF.xml
27,7 → 27,7
</element>
 
<element location="B6" type="fill">
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIREN "/>
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIRET "/>
</element>
 
<element location="B7" type="replace" replacePattern="_">
/trunk/OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/BonLivraison.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/FicheRelance.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/EtatChargesPaye.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/FactureFournisseur.xml
25,7 → 25,7
</element>
 
<element location="B6" type="fill">
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIREN " />
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIRET " />
</element>
 
<element location="B7" type="replace" replacePattern="_">
/trunk/OpenConcerto/Configuration/Template/Default/Avoir.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/EtatVentes.xml
124,4 → 124,28
</element>
</table3>
<element4 location="A4" type="Value" ValueName="DATE">
</element4>
<table4 firstLine="7" endLine="52" endPageLine="54" lastColumn="F" base="Societe" table="SAISIE_VENTE_FACTURE_ELEMENT">
<element location="A" type="fill">
<field base="Societe" name="CODE" />
</element>
 
<element location="B" type="fill">
<field base="Societe" name="NOM" />
</element>
 
<element location="D" type="fill">
<field base="Societe" name="QTE" />
</element>
 
<element location="E" type="fill">
<field base="Societe" name="QTE_REEL" />
</element>
<element location="F" type="fill">
<field base="Societe" name="QTE_MIN" />
</element>
</table4>
</contentDocument>
/trunk/OpenConcerto/Configuration/Template/Default/DemandePrix.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/CommandeClient.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/ReportingClient.xml
New file
0,0 → 1,36
<?xml version="1.0" encoding="UTF-8" ?>
<contentDocument>
<element location="C2" type="Value" ValueName="DATE">
</element>
 
<element location="C5" type="Value" ValueName="CLIENT" >
</element>
<table firstLine="8" endLine="305" endPageLine="305" lastColumn="H" >
<element location="B" type="fill">
<field base="Societe" name="NUMERO_FACTURE"/>
</element>
<element location="C" type="fill">
<field base="Societe" name="DATE"/>
</element>
<element location="D" type="fill" cellSize="24">
<field base="Societe" name="NOM"/>
</element>
<element location="E" type="fill">
<field base="Societe" name="ECHEANCE"/>
</element>
<element location="F" type="fill">
<field base="Societe" name="T_TTC"/>
</element>
<element location="G" type="fill">
<field base="Societe" name="REGLE"/>
</element>
 
<element location="H" type="fill">
<field base="Societe" name="DU"/>
</element>
</table>
</contentDocument>
/trunk/OpenConcerto/Configuration/Template/Default/EtatStocks.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/Balance.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/SituationCompte.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/SituationCompte.ods
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/OpenConcerto/Configuration/Template/Default/BonReception.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/ListeFacture.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/VenteFacture.xml
25,7 → 25,7
</element>
 
<element location="B6" type="fill">
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIREN "/>
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIRET "/>
</element>
 
<element location="B7" type="replace" replacePattern="_">
/trunk/OpenConcerto/Configuration/Template/Default/BonReception.odsp
1,6 → 1,6
<odsp>
<spliteveryrow>
<sheet number="0">57</sheet>
<sheet number="0">58</sheet>
</spliteveryrow>
<offset x="40" y ="20"/>
<resize percent="85"/>
/trunk/OpenConcerto/Configuration/Template/Default/SituationCompte.odsp
New file
0,0 → 1,9
<odsp>
<spliteveryrow>
<sheet number="0">58</sheet>
</spliteveryrow>
<offset x="0" y ="0"/>
<resize percent="100"/>
 
 
</odsp>
/trunk/OpenConcerto/Configuration/Template/Default/DemandePrix.odsp
2,8 → 2,4
<spliteveryrow>
<sheet number="0">58</sheet>
</spliteveryrow>
<offset x="40" y ="20"/>
<resize percent="85"/>
 
 
</odsp>
/trunk/OpenConcerto/Configuration/Template/Default/DepotCheque.xml
New file
0,0 → 1,60
<?xml version="1.0" encoding="UTF-8" ?>
<contentDocument>
 
<element location="H1" type="fill">
<field base="Societe" name="DATE">
</field>
</element>
<element location="K56" type="fill">
<field base="Societe" name="MONTANT" type="devise">
</field>
</element>
<element location="A55" type="fill">
<field base="Societe" name="NOM">
</field>
</element>
<element location="A56" type="fill">
<field base="Societe" name="ID_BANQUE">
<field base="Societe" name="NOM" prefix ="Dépôt sur la banque "/>
</field>
</element>
 
<table endPageLine="56" firstLine="5" endLine="53" lastColumn="L" base="Societe" table="DEPOT_CHEQUE_ELEMENT">
 
<element location="A" type="fill">
<field name="BANQUE" />
</element>
<element location="B" type="fill">
<field name="DATE" />
</element>
 
<element location="C" type="fill">
<field name="NUMERO" />
</element>
 
<element location="E" type="fill">
<field name="ID_CLIENT" >
<field name="NOM" />
</field>
</element>
 
<element location="J" type="fill">
<field name="PIECE" />
</element>
 
<element location="K" type="fill">
<field name="MONTANT" type="devise"/>
</element>
<element location="L" type="LineReference">
<field name="MONTANT" type="LineReference"/>
</element>
</table>
</contentDocument>
/trunk/OpenConcerto/Configuration/Template/Default/Commande.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/Devis.xml
23,7 → 23,7
</element>
 
<element location="B6" type="fill">
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIREN "/>
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIRET "/>
</element>
 
<element location="B7" type="replace" replacePattern="_">
62,7 → 62,7
<field name="OBJET" />
</element>
 
<element location="I10" type="fill">
<element location="H10" type="fill">
<field name="ID_CLIENT">
<field name="FORME_JURIDIQUE" />
<field name="NOM" />
69,7 → 69,7
</field>
</element>
 
<element location="I11" type="address.customer.full">
<element location="H11" type="address.customer.full">
</element>
 
<element location="L63" type="fill">
/trunk/OpenConcerto/Configuration/Template/Default/VenteFactureSituation.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/Relance2.odt
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/GrandLivre.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/EtatStockInventaire.xml
New file
0,0 → 1,33
<?xml version="1.0" encoding="UTF-8" ?>
<contentDocument>
<!-- <element location="A3" type="Value" ValueName="DATE">
</element>
-->
<table firstLine="2" endLine="17000" endPageLine="25000" lastColumn="E" table="SAISIE_VENTE_FACTURE">
<element location="A" type="fill">
<field name="FAMILLE" />
</element>
<element location="B" type="fill">
<field name="CODE" />
</element>
 
<element location="C" type="fill">
<field name="NOM" />
</element>
<element location="D" type="fill">
<field name="TAILLE" />
</element>
<element location="E" type="fill">
<field name="COULEUR" />
</element>
<element location="F" type="fill">
<field name="QTE" />
</element>
 
</table>
</contentDocument>
/trunk/OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.xml
47,7 → 47,7
<field name="AU" prefix=" au " type="date" datePattern="dd/MM/yy" />
</element>
 
<element location="D54" type="fill">
<element location="D58" type="fill">
<field name="DU" type="datePaye" />
</element>
 
89,7 → 89,7
</element>
<element location="F12" type="fill">
<field name="ID_CUMULS_CONGES">
<field name="ACQUIS" />
<field name="ACQUIS" type="cumulConges" />
</field>
</element>
<element location="B6" type="replace" replacePattern="_">
122,79 → 122,159
</element>
 
 
<element location="I54" type="fill">
<field name="NET_A_PAYER" />
<element location="H54" type="fill">
<field name="NET_AVANT_PAS" />
</element>
 
<element location="I55" type="fill">
<field name="REDUCTION_GVT" />
</element>
 
<element location="D58" type="fill">
<element location="E57" type="fill">
<field name="NET_IMP" />
</element>
<element location="F57" type="fill">
<field name="ID_PAS">
<field name="TAUX_PAS" />
</field>
</element>
<element location="I57" type="fill">
<field name="TOTAL_PAS" />
</element>
 
 
 
 
<element location="I58" type="fill">
<field name="NET_A_PAYER" />
</element>
 
<element location="D62" type="fill">
<field name="SAL_BRUT" />
</element>
<element location="E58" type="fill">
<element location="E62" type="fill">
<field name="COT_SAL" />
</element>
<element location="F58" type="fill">
<element location="F62" type="fill">
<field name="COT_PAT" />
</element>
 
<element location="G58" type="fill">
<element location="G62" type="fill">
<field name="AVANTAGE_NATURE" />
</element>
 
<element location="H58" type="fill">
<element location="H62" type="fill">
<field name="NET_IMP" />
</element>
 
<element location="I58" type="fill">
<element location="I62" type="fill">
<field name="ALLEGEMENT_COTISATION" />
</element>
 
<element location="D59" type="fill">
<element location="D63" type="fill">
<field name="SAL_BRUT" type="cumulPaye" />
</element>
<element location="E59" type="fill">
<element location="E63" type="fill">
<field name="COT_SAL" type="cumulPaye" />
</element>
<element location="F59" type="fill">
<element location="F63" type="fill">
<field name="COT_PAT" type="cumulPaye" />
</element>
<element location="G59" type="fill">
<element location="G63" type="fill">
<field name="AVANTAGE_NATURE" type="cumulPaye" />
</element>
 
<element location="H59" type="fill">
<element location="H63" type="fill">
<field name="NET_IMP" type="cumulPaye" />
</element>
 
<element location="I59" type="fill">
<element location="I63" type="fill">
<field name="ALLEGEMENT_COTISATION" type="cumulPaye" />
</element>
 
<table endPageLine="61" firstLine="15" endLine="51" lastColumn="J" base="Societe" table="FICHE_PAYE_ELEMENT"
<element location="J16" type="fill">
<field name="ID_SALARIE">
<field name="CODE" />
</field>
</element>
<element location="J18" type="fill">
<field name="ID_SALARIE">
<field name="ID_INFOS_SALARIE_PAYE">
<field name="DATE_ARRIVE">
</field>
</field>
</field>
</element>
<element location="J21" type="fichepaye.smic" />
<element location="J23" type="fichepaye.plafond" />
 
<element location="J28" type="fill">
<field name="ID_VARIABLE_SALARIE">
<field name="HEURE_TRAV" />
</field>
</element>
 
<element location="J30" type="fichepaye.heure.sup.total">
</element>
<element location="J32" type="fichepaye.heure.total">
</element>
 
<element location="J35" type="fill">
<field name="ID_VARIABLE_SALARIE">
<field name="HEURE_TRAV_CUMUL_VAL" />
</field>
</element>
<element location="J37" type="fichepaye.heure.sup.cumul.total">
</element>
 
<element location="J39" type="fichepaye.heure.cumul.total">
</element>
 
 
<table endPageLine="65" firstLine="15" endLine="51" lastColumn="J" base="Societe" table="FICHE_PAYE_ELEMENT"
blankLineBeforeStyle="Titre 1,Titre 2" fieldWhere="IMPRESSION" orderBy="POSITION">
<element location="B" type="fill" cellSize="52">
<field name="NOM" />
</element>
<element location="E" type="fill">
<element location="D" type="fill">
<field name="NB_BASE" />
</element>
<element location="E" type="fill">
<field name="TAUX_SAL">
<exclude value="0.00" />
<exclude value="0.00%" />
<exclude value="0.000000" />
</field>
</element>
<element location="F" type="fill">
<field name="TAUX_SAL" />
<field name="MONTANT_SAL_AJ">
<exclude value="0.00" />
<exclude value="0.00%" />
<exclude value="0.000000" />
</field>
</element>
<element location="G" type="fill">
<field name="MONTANT_SAL_AJ" />
<field name="MONTANT_SAL_DED">
<exclude value="0.00" />
<exclude value="0.00%" />
<exclude value="0.000000" />
</field>
</element>
<element location="H" type="fill">
<field name="MONTANT_SAL_DED" />
<field name="TAUX_PAT">
<exclude value="0.00" />
<exclude value="0.00%" />
<exclude value="0.000000" />
</field>
</element>
<!-- <element location="I" type="fill">
<field name="TAUX_PAT" type="Devise" />
</element> -->
<element location="J" type="fill">
<field name="MONTANT_PAT" />
<element location="I" type="fill">
<field name="MONTANT_PAT">
<exclude value="0.00" />
<exclude value="0.00%" />
<exclude value="0.000000" />
</field>
</element>
 
 
/trunk/OpenConcerto/Configuration/Template/Default/BonLivraison.xml
24,7 → 24,7
</element>
 
<element location="B6" type="fill">
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIREN "/>
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIRET "/>
</element>
 
<element location="B7" type="replace" replacePattern="_">
/trunk/OpenConcerto/Configuration/Template/Default/Avoir.xml
26,7 → 26,7
</element>
 
<element location="B6" type="fill">
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIREN "/>
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIRET "/>
</element>
 
 
/trunk/OpenConcerto/Configuration/Template/Default/VenteFactureTicket.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/VenteFactureTicket.ods
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/OpenConcerto/Configuration/Template/Default/DemandePrix.xml
25,7 → 25,7
</element>
 
<element location="B6" type="fill">
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIREN "/>
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIRET "/>
</element>
 
<element location="B7" type="replace" replacePattern="_">
/trunk/OpenConcerto/Configuration/Template/Default/FicheClient.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/FactureFournisseur.odsp
1,6 → 1,6
<odsp>
<spliteveryrow>
<sheet number="0">57</sheet>
<sheet number="0">58</sheet>
</spliteveryrow>
<offset x="40" y ="20"/>
<resize percent="85"/>
/trunk/OpenConcerto/Configuration/Template/Default/VenteFactureTicket.odsp
New file
0,0 → 1,9
<odsp>
<spliteveryrow>
<sheet number="0">66</sheet>
</spliteveryrow>
<offset x="40" y ="20"/>
<resize percent="85"/>
 
 
</odsp>
/trunk/OpenConcerto/Configuration/Template/Default/AvoirF.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/CommandeClient.xml
24,7 → 24,7
</element>
 
<element location="B6" type="fill">
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIREN "/>
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIRET "/>
</element>
 
<element location="B7" type="replace" replacePattern="_">
62,7 → 62,7
<field name="NOM" />
</element>
 
<element location="I10" type="fill">
<element location="H10" type="fill">
<field name="ID_CLIENT">
<field name="FORME_JURIDIQUE" />
<field name="NOM" />
69,7 → 69,7
</field>
</element>
 
<element location="I11" type="address.customer.full">
<element location="H11" type="address.customer.full">
 
</element>
 
/trunk/OpenConcerto/Configuration/Template/Default/FactureFournisseur.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/BonReception.xml
25,7 → 25,7
</element>
 
<element location="B6" type="fill">
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIREN "/>
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIRET "/>
</element>
 
<element location="B7" type="replace" replacePattern="_">
/trunk/OpenConcerto/Configuration/Template/Default/SituationCompte.xml
New file
0,0 → 1,57
<?xml version="1.0" encoding="UTF-8" ?>
<contentDocument>
 
<element0 location="A1" type="Value" ValueName="SOCIETE_NOM">
</element0>
<element0 location="A2" type="Value" ValueName="SOCIETE_ADRESSE">
</element0>
<element0 location="A4" type="Value" ValueName="SOCIETE_VILLE">
</element0>
<element0 location="A5" type="Value" prefix="Tél:" ValueName="SOCIETE_TEL">
</element0>
 
<element0 location="D6" type="Value" ValueName="NOM_CLIENT">
</element0>
<element0 location="F8" type="Value" ValueName="DATE">
</element0>
<element0 location="G51" type="Value" ValueName="TOTAL_ECHEANCE">
</element0>
<element0 location="G52" type="Value" ValueName="TOTAL_FUTUR">
</element0>
<element0 location="G53" type="Value" ValueName="TOTAL_PASSE">
</element0>
 
<table0 firstLine="17" endLine="50" endPageLine="58" lastColumn="G" base="Societe" table="ECHEANCE_CLIENT" pageRef="F1">
<element location="A" type="fill" useOOFormat="false">
<field base="Societe" name="DATE"/>
</element>
 
<element location="B" type="fill" useOOFormat="false">
<field base="Societe" name="PIECE"/>
</element>
 
 
<element location="C" type="fill" useOOFormat="false" maxChar="25">
<field base="Societe" name="LIBELLE"/>
</element>
 
<element location="D" type="fill" useOOFormat="false">
<field base="Societe" name="DATE_ECHEANCE"/>
</element>
 
<element location="E" type="fill" >
<field base="Societe" name="DU"/>
</element>
 
<element location="F" type="fill" >
<field base="Societe" name="REGLE"/>
</element>
<element location="G" type="fill" >
<field base="Societe" name="SOLDE"/>
</element>
</table0>
</contentDocument>
/trunk/OpenConcerto/Configuration/Template/Default/CommandeClient.odsp
1,6 → 1,6
<odsp>
<spliteveryrow>
<sheet number="0">65</sheet>
<sheet number="0">66</sheet>
</spliteveryrow>
<offset x="40" y ="20"/>
<resize percent="85"/>
/trunk/OpenConcerto/Configuration/Template/Default/ListeDebiteur.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/JournauxAnalytique.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/ReleveCheque.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/Operations Report.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/ReportingTaxeComplementaire.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/DIPE.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/EtatVentes.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.odsp
1,6 → 1,7
<odsp>
<spliteveryrow>
<sheet number="0">61</sheet>
<sheet number="0">65</sheet>
</spliteveryrow>
<offset x="20" y ="20"/>
<resize percent="92"/>
<offset x="23" y ="0"/>
</odsp>
/trunk/OpenConcerto/Configuration/Template/Default/ExportArticle.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/Configuration/Template/Default/VentilationAnalytique.ods
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/OpenConcerto/src/org/openconcerto/erp/gs1/GS1Util.java
New file
0,0 → 1,254
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011-2019 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.gs1;
 
public class GS1Util {
 
// ISO/IEC 15424 symbology identifiers
// ]E0 : EAN-13, UPC-A, or UPC-E : 13 digits
// ]E1 : Two-digit add-on symbol : 2 digits
// ]E2 : Five-digit add-on symbol : 5 digits
// ]E3 : EAN-13, UPC-A, or UPC-E with add-on symbol : 15 or 18 digits
// ]E4 : EAN-8 : 8 digits
// ]I1 : ITF-14 : 14 digits
// ]C1 : GS1-128 : Standard AI element strings
private static final String GS1_128_SCANNER_PREFIX = "]C1";
// ]e0 : GS1 DataBar : Standard AI element strings
private static final String GS1_DATABAR_SCANNER_PREFIX = "]e0";
// ]e1 : GS1 Composite : Data packet containing the data + an encoded symbol separator
// character.
// ]e2 : GS1 Composite : Data packet containing the data following an escape mechanism
// character.
// ]d2 : GS1 DataMatrix : Standard AI element strings
private static final String GS1_DATAMATRIX_SCANNER_PREFIX = "]d2";
private static final String GS1_DATAMATRIX_SCANNER_PREFIX_2 = "]D2";
// ]Q3 : GS1 QR Code : Standard AI element strings
private static final String GS1_QRCODE_SCANNER_PREFIX = "]Q3";
// ]J1 : GS1 DotCode : Standard AI element strings
 
static final int ERROR_CODE_INVALID_GS1_SCAN = 0;
static final int ERROR_CODE_UNKNOWN_AI = 1;
static final int ERROR_CODE_INCOMPLETE_AI = 2;
static final int ERROR_CODE_NOT_FOUND_SEPARATOR = 3;
static final int ERROR_CODE_INSUFFICIENT_VALUE_LENGTH = 4;
static final int ERROR_CODE_EXCEEDED_VALUE_LENGTH = 5;
static final int ERROR_CODE_CONVERT_DECIMAL_POINT = 5;
static final int ERROR_CODE_WRONG_DECIMAL_POINT = 6;
static final int ERROR_CODE_CONVERT_DECIMAL_VALUE = 7;
 
public static final char GS_SEPARATOR = '\u001D';
 
static final int SPACE_SEPARATOR = ' ';
 
int separator;
 
public GS1Util() {
this(GS_SEPARATOR);
}
 
public GS1Util(int separator) {
this.separator = separator;
}
 
public GS1AIElements parseFromScanner(String scan) throws GS1ParseException {
if (scan.startsWith(GS1_DATAMATRIX_SCANNER_PREFIX) || scan.startsWith(GS1_DATAMATRIX_SCANNER_PREFIX_2) || scan.startsWith(GS1_128_SCANNER_PREFIX) || scan.startsWith(GS1_DATABAR_SCANNER_PREFIX)
|| scan.startsWith(GS1_QRCODE_SCANNER_PREFIX)) {
return parse(scan.substring(3));
}
return parse(scan);
}
 
public GS1AIElements parse(String barcode) throws GS1ParseException {
if (barcode.length() < 3) {
throw new GS1ParseException("", ERROR_CODE_INVALID_GS1_SCAN, "code too short");
}
 
GS1AIElements attr = new GS1AIElements();
StringBuilder ai = new StringBuilder();
 
int length = barcode.length();
for (int i = 0; i < length; ++i) {
int aiLength = ai.length();
if (aiLength > 1) {
GS1ApplicationIdentifier aii = GS1AIElements.getApplicationIdentifier(ai.toString());
if (aii == null) {
if (aiLength < 4)
ai.append(barcode.charAt(i));
else
throw new GS1ParseException(ai.toString(), ERROR_CODE_UNKNOWN_AI, "Unknown AI");
} else {
int decimalPoint = 0;
if (aii.decimalPoint) {
try {
decimalPoint = Integer.valueOf(String.valueOf(barcode.charAt(i)));
} catch (NumberFormatException e) {
throw new GS1ParseException(ai.toString(), ERROR_CODE_CONVERT_DECIMAL_POINT, "Errow convert to decimal point");
}
 
if (++i >= length)
throw new GS1ParseException(ai.toString(), ERROR_CODE_INSUFFICIENT_VALUE_LENGTH, "Insufficient value length");
}
 
String value;
 
if (aii.variableLength) {
int separatorIndex = barcode.indexOf(this.separator, i);
 
if (separatorIndex < 0) {
if (length - i > aii.length)
throw new GS1ParseException(ai.toString(), ERROR_CODE_NOT_FOUND_SEPARATOR, "Not found separator");
else if (length - i < aii.minLength)
throw new GS1ParseException(ai.toString(), ERROR_CODE_INSUFFICIENT_VALUE_LENGTH, "Insufficient value length");
else {
value = barcode.substring(i);
i = length;
}
} else if (separatorIndex - i > aii.length)
throw new GS1ParseException(ai.toString(), ERROR_CODE_EXCEEDED_VALUE_LENGTH, "Exceeded value length");
else if (separatorIndex - i < aii.minLength)
throw new GS1ParseException(ai.toString(), ERROR_CODE_INSUFFICIENT_VALUE_LENGTH, "Insufficient value length");
else {
value = barcode.substring(i, separatorIndex);
i = separatorIndex;
}
} else {
if (i + aii.length > length) {
throw new GS1ParseException(ai.toString(), ERROR_CODE_INSUFFICIENT_VALUE_LENGTH, "Insufficient value length");
}
value = barcode.substring(i, i + aii.length);
i += aii.length - 1;
}
 
if (aii.decimalPoint && decimalPoint > 0) {
if (decimalPoint >= value.length())
throw new GS1ParseException(ai.toString(), ERROR_CODE_WRONG_DECIMAL_POINT, "Decimal point more then value length");
 
try {
value = String.valueOf(Double.valueOf(value.substring(0, value.length() - decimalPoint) + "." + value.substring(value.length() - decimalPoint)));
} catch (NumberFormatException e) {
throw new GS1ParseException(ai.toString(), ERROR_CODE_CONVERT_DECIMAL_VALUE, "Error convert decimal point value");
}
}
 
attr.put(ai.toString(), value);
 
ai.setLength(0);
}
} else
ai.append(barcode.charAt(i));
}
 
if (ai.length() > 0)
throw new GS1ParseException(ai.toString(), ERROR_CODE_INCOMPLETE_AI, "Incomplete AI");
 
return attr;
}
 
public String format(GS1AIElements values) {
 
StringBuilder b = new StringBuilder();
int size = values.size();
for (int i = 0; i < size; i++) {
String k = values.getKey(i);
GS1ApplicationIdentifier ai = GS1AIElements.getApplicationIdentifier(k);
final String value = values.getValue(i);
b.append(k);
b.append(value);
if (ai.variableLength && i < size - 1) {
b.append((char) this.separator);
}
}
return b.toString();
}
 
public String formatZPL(GS1AIElements values) {
 
StringBuilder b = new StringBuilder();
int size = values.size();
b.append("@1");
for (int i = 0; i < size; i++) {
String k = values.getKey(i);
GS1ApplicationIdentifier ai = GS1AIElements.getApplicationIdentifier(k);
final String value = values.getValue(i);
b.append(k);
b.append(value);
if (ai.variableLength && i < size - 1) {
b.append("@d029");
}
}
return b.toString();
}
 
public String formatDataMatrix(GS1AIElements values) {
 
StringBuilder b = new StringBuilder();
int size = values.size();
// b.append(FNC1_SEPARATOR);
for (int i = 0; i < size; i++) {
String k = values.getKey(i);
GS1ApplicationIdentifier ai = GS1AIElements.getApplicationIdentifier(k);
final String value = values.getValue(i);
b.append('[');
b.append(k);
b.append(']');
b.append(value);
if (ai.variableLength && i < size - 1) {
// b.append(GS_SEPARATOR);
}
}
return b.toString();
}
 
public static void main(String[] args) throws GS1ParseException {
GS1Util p = new GS1Util('_');
System.out.println("GS1Util.main()" + (char) p.separator);
String barcode = "0104607018700852111806051718062910180605_211";
// barcode = "01088888931021461712031510W1040190";
GS1AIElements values = p.parse(barcode);
values.dump(System.out);
 
values.put("391", "kookkk");
System.out.println(p.format(values));
System.out.println(values.formatHumanReadable());
 
GS1AIElements valuesMax = new GS1AIElements();
valuesMax.put("02", "01234567891234");
valuesMax.put("15", "201202");
valuesMax.put("37", "12345678");
valuesMax.put("10", "12345678901234567890");
GS1Util pStd = new GS1Util();
System.out.println(p.format(valuesMax));
System.out.println(p.format(valuesMax).length());
System.out.println(pStd.format(valuesMax));
System.out.println(pStd.format(valuesMax).length());
System.err.println("GS1Util.main() GS128 from barcode reader");
String gs1128 = "]C10207612345678900152012153745646578";
GS1Util p2 = new GS1Util();
values = p2.parseFromScanner(gs1128);
values.dump(System.out);
}
 
public static String showAllChars(String s) {
StringBuilder b = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (ISO646.isValid(s.charAt(i))) {
b.append(s.charAt(i));
} else {
b.append("[" + (int) s.charAt(i) + "]");
}
}
return b.toString();
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/gs1/ISO646.java
New file
0,0 → 1,43
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011-2019 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.gs1;
 
public class ISO646 {
public static final String ALLOWED_CHARS = "!\"%&'()*+,-./01234567989:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz";
 
public static boolean isValid(char c) {
final int length = ALLOWED_CHARS.length();
for (int i = 0; i < length; i++) {
if (c == ALLOWED_CHARS.charAt(i)) {
return true;
}
}
return false;
}
 
public static String clean(String s) {
final int length = s.length();
final StringBuilder b = new StringBuilder(length);
for (int i = 0; i < length; i++) {
final char charAt = s.charAt(i);
if (isValid(charAt)) {
b.append(s.charAt(i));
} else {
b.append('_');
}
}
return b.toString();
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/gs1/GS1AIElements.java
New file
0,0 → 1,290
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011-2019 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.gs1;
 
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
 
public class GS1AIElements {
static final HashMap<String, GS1ApplicationIdentifier> GS1_128_AI = new HashMap<>();
static {
GS1_128_AI.put("00", new GS1ApplicationIdentifier(0, 18, false, false));
GS1_128_AI.put("01", new GS1ApplicationIdentifier(0, 14, false, false));
GS1_128_AI.put("02", new GS1ApplicationIdentifier(0, 14, false, false));
GS1_128_AI.put("10", new GS1ApplicationIdentifier(0, 20, true, false));
GS1_128_AI.put("11", new GS1ApplicationIdentifier(0, 6, false, false));
GS1_128_AI.put("12", new GS1ApplicationIdentifier(0, 6, false, false));
GS1_128_AI.put("13", new GS1ApplicationIdentifier(0, 6, false, false));
GS1_128_AI.put("14", new GS1ApplicationIdentifier(0, 6, false, false));
GS1_128_AI.put("15", new GS1ApplicationIdentifier(0, 6, false, false));
GS1_128_AI.put("17", new GS1ApplicationIdentifier(0, 6, false, false));
GS1_128_AI.put("20", new GS1ApplicationIdentifier(0, 2, false, false));
GS1_128_AI.put("21", new GS1ApplicationIdentifier(0, 20, true, false));
GS1_128_AI.put("240", new GS1ApplicationIdentifier(0, 30, true, false));
GS1_128_AI.put("241", new GS1ApplicationIdentifier(0, 30, true, false));
GS1_128_AI.put("242", new GS1ApplicationIdentifier(0, 6, true, false));
GS1_128_AI.put("250", new GS1ApplicationIdentifier(0, 30, true, false));
GS1_128_AI.put("251", new GS1ApplicationIdentifier(0, 30, true, false));
GS1_128_AI.put("253", new GS1ApplicationIdentifier(13, 30, true, false));
GS1_128_AI.put("254", new GS1ApplicationIdentifier(0, 20, true, false));
GS1_128_AI.put("255", new GS1ApplicationIdentifier(13, 25, true, false));
GS1_128_AI.put("30", new GS1ApplicationIdentifier(0, 8, true, false));
GS1_128_AI.put("310", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("311", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("312", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("313", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("314", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("315", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("316", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("320", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("321", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("322", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("323", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("324", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("325", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("326", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("327", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("328", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("329", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("330", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("331", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("332", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("333", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("334", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("335", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("336", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("340", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("341", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("342", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("343", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("344", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("345", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("346", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("347", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("348", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("349", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("350", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("351", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("352", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("353", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("354", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("355", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("356", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("357", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("360", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("361", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("362", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("363", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("364", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("365", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("366", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("367", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("368", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("369", new GS1ApplicationIdentifier(0, 6, false, true));
GS1_128_AI.put("37", new GS1ApplicationIdentifier(0, 8, true, false));
GS1_128_AI.put("390", new GS1ApplicationIdentifier(0, 15, true, true));
GS1_128_AI.put("391", new GS1ApplicationIdentifier(3, 18, true, true));
GS1_128_AI.put("392", new GS1ApplicationIdentifier(0, 15, true, true));
GS1_128_AI.put("393", new GS1ApplicationIdentifier(3, 18, true, true));
GS1_128_AI.put("400", new GS1ApplicationIdentifier(0, 30, true, false));
GS1_128_AI.put("401", new GS1ApplicationIdentifier(0, 30, true, false));
GS1_128_AI.put("402", new GS1ApplicationIdentifier(0, 17, false, false));
GS1_128_AI.put("403", new GS1ApplicationIdentifier(3, 30, true, false));
GS1_128_AI.put("410", new GS1ApplicationIdentifier(0, 17, false, false));
GS1_128_AI.put("411", new GS1ApplicationIdentifier(0, 17, false, false));
GS1_128_AI.put("412", new GS1ApplicationIdentifier(0, 17, false, false));
GS1_128_AI.put("413", new GS1ApplicationIdentifier(0, 17, false, false));
GS1_128_AI.put("414", new GS1ApplicationIdentifier(0, 17, false, false));
GS1_128_AI.put("420", new GS1ApplicationIdentifier(0, 20, true, false));
GS1_128_AI.put("421", new GS1ApplicationIdentifier(0, 0, true, false));
GS1_128_AI.put("422", new GS1ApplicationIdentifier(0, 3, false, false));
GS1_128_AI.put("423", new GS1ApplicationIdentifier(3, 15, true, false));
GS1_128_AI.put("424", new GS1ApplicationIdentifier(0, 3, false, false));
GS1_128_AI.put("425", new GS1ApplicationIdentifier(0, 3, false, false));
GS1_128_AI.put("426", new GS1ApplicationIdentifier(0, 3, false, false));
GS1_128_AI.put("7001", new GS1ApplicationIdentifier(0, 13, false, false));
GS1_128_AI.put("7002", new GS1ApplicationIdentifier(0, 30, false, false));
GS1_128_AI.put("7003", new GS1ApplicationIdentifier(0, 10, false, false));
GS1_128_AI.put("7004", new GS1ApplicationIdentifier(0, 4, true, false));
GS1_128_AI.put("8001", new GS1ApplicationIdentifier(0, 14, false, false));
GS1_128_AI.put("8002", new GS1ApplicationIdentifier(0, 20, true, false));
GS1_128_AI.put("8003", new GS1ApplicationIdentifier(14, 30, true, false));
GS1_128_AI.put("8004", new GS1ApplicationIdentifier(0, 30, true, false));
GS1_128_AI.put("8005", new GS1ApplicationIdentifier(0, 6, false, false));
GS1_128_AI.put("8006", new GS1ApplicationIdentifier(0, 18, false, false));
GS1_128_AI.put("8007", new GS1ApplicationIdentifier(0, 30, true, false));
GS1_128_AI.put("8008", new GS1ApplicationIdentifier(8, 12, true, false));
GS1_128_AI.put("8018", new GS1ApplicationIdentifier(0, 18, false, false));
GS1_128_AI.put("8020", new GS1ApplicationIdentifier(0, 25, true, false));
GS1_128_AI.put("8100", new GS1ApplicationIdentifier(0, 6, false, false));
GS1_128_AI.put("8101", new GS1ApplicationIdentifier(0, 10, false, false));
GS1_128_AI.put("8102", new GS1ApplicationIdentifier(0, 2, false, false));
GS1_128_AI.put("8110", new GS1ApplicationIdentifier(0, 30, true, false));
GS1_128_AI.put("8200", new GS1ApplicationIdentifier(0, 70, true, false));
GS1_128_AI.put("90", new GS1ApplicationIdentifier(0, 30, true, false));
GS1_128_AI.put("91", new GS1ApplicationIdentifier(0, 30, true, false));
GS1_128_AI.put("92", new GS1ApplicationIdentifier(0, 30, true, false));
GS1_128_AI.put("93", new GS1ApplicationIdentifier(0, 30, true, false));
GS1_128_AI.put("94", new GS1ApplicationIdentifier(0, 30, true, false));
GS1_128_AI.put("95", new GS1ApplicationIdentifier(0, 30, true, false));
GS1_128_AI.put("96", new GS1ApplicationIdentifier(0, 30, true, false));
GS1_128_AI.put("97", new GS1ApplicationIdentifier(0, 30, true, false));
GS1_128_AI.put("98", new GS1ApplicationIdentifier(0, 30, true, false));
GS1_128_AI.put("99", new GS1ApplicationIdentifier(0, 30, true, false));
}
 
private final ArrayList<String> keysAndValues = new ArrayList<>();
 
public GS1AIElements() {
 
}
 
public boolean isEmpty() {
return this.keysAndValues.isEmpty();
}
 
public boolean containsKey(String key) {
final int size = this.keysAndValues.size();
for (int i = 0; i < size; i += 2) {
if (this.keysAndValues.get(i).equals(key)) {
return true;
}
}
return false;
}
 
public boolean containsValue(String value) {
final int size = this.keysAndValues.size();
for (int i = 1; i < size; i += 2) {
if (this.keysAndValues.get(i).equals(value)) {
return true;
}
}
return false;
}
 
public String getKey(int index) {
return this.keysAndValues.get(index * 2);
}
 
public String getValue(int index) {
return this.keysAndValues.get(1 + index * 2);
}
 
public String get(String key) {
final int size = this.keysAndValues.size();
for (int i = 0; i < size; i += 2) {
if (this.keysAndValues.get(i).equals(key)) {
 
return this.keysAndValues.get(i + 1);
}
}
return null;
}
 
public Date getAsDate(String key) throws NumberFormatException {
String str = get(key);
if (str == null) {
return null;
}
final int year = 2000 + Integer.parseInt(str.substring(0, 2));
final int month = Integer.parseInt(str.substring(2, 4));
final int day = Integer.parseInt(str.substring(4, 6));
final Calendar c = Calendar.getInstance();
c.clear();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month - 1);
c.set(Calendar.DAY_OF_MONTH, day);
return c.getTime();
}
 
public String put(String key, String value) {
GS1ApplicationIdentifier ai = GS1_128_AI.get(key);
if (ai == null) {
throw new IllegalArgumentException("AI " + key + " unknown");
}
if (ai.variableLength) {
if (value.length() < ai.minLength) {
throw new IllegalArgumentException("AI " + key + " value length must >= " + ai.minLength + " but is " + value.length() + " for value " + value);
}
if (value.length() > ai.length) {
throw new IllegalArgumentException("AI " + key + " value length must be <= " + ai.length + " but is " + value.length() + " for value " + value);
}
} else {
if (value.length() != ai.length) {
throw new IllegalArgumentException("AI " + key + " value length must be " + ai.length + " but is " + value.length() + " for value " + value);
}
}
 
final int size = this.keysAndValues.size();
for (int i = 0; i < size; i += 2) {
if (this.keysAndValues.get(i).equals(key)) {
final String old = this.keysAndValues.get(i + 1);
this.keysAndValues.set(i + 1, value);
return old;
}
}
this.keysAndValues.add(key);
this.keysAndValues.add(value);
return null;
}
 
public String remove(String key) {
final int size = this.keysAndValues.size();
for (int i = 0; i < size; i += 2) {
if (this.keysAndValues.get(i).equals(key)) {
this.keysAndValues.remove(i);
return this.keysAndValues.remove(i);
}
}
return null;
}
 
public void clear() {
this.keysAndValues.clear();
}
 
public int size() {
return this.keysAndValues.size() / 2;
}
 
public void dump(PrintStream out) {
for (int i = 0; i < size(); i++) {
out.print("(");
out.print(getKey(i));
out.print(")");
out.println(getValue(i));
}
out.flush();
}
 
public static GS1ApplicationIdentifier getApplicationIdentifier(String k) {
return GS1_128_AI.get(k);
}
 
public String formatHumanReadable() {
StringBuilder b = new StringBuilder();
int size = size();
for (int i = 0; i < size; i++) {
b.append('(');
b.append(this.getKey(i));
b.append(')');
b.append(this.getValue(i));
}
return b.toString();
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/gs1/GS1ApplicationIdentifier.java
New file
0,0 → 1,30
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011-2019 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.gs1;
 
public class GS1ApplicationIdentifier {
 
public final int minLength;
public final int length;
public final boolean variableLength;
public final boolean decimalPoint;
 
public GS1ApplicationIdentifier(int minLength, int length, boolean variableLength, boolean decimalPoint) {
this.minLength = minLength;
this.length = length;
this.variableLength = variableLength;
this.decimalPoint = decimalPoint;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/gs1/GS1ParseException.java
New file
0,0 → 1,31
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011-2019 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.gs1;
 
public class GS1ParseException extends Exception {
final String ai;
final int errorCode;
final String errorMessage;
 
public GS1ParseException(final String ai, final int errorCode, final String errorMessage) {
this.ai = ai;
this.errorCode = errorCode;
this.errorMessage = errorMessage;
}
 
@Override
public String toString() {
return "AI: " + ai + ", errorCode: " + errorCode + ", errorMessage: " + errorMessage;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/panel/ITreeSelection.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
36,6 → 36,8
import org.openconcerto.utils.checks.ValidState;
 
import java.awt.event.ActionEvent;
import java.awt.event.HierarchyEvent;
import java.awt.event.HierarchyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.beans.PropertyChangeListener;
69,11 → 71,12
private DefaultTreeModel model;
 
// Map <Id, Node>
private Map<Integer, ITreeSelectionNode> mapNode = new HashMap<Integer, ITreeSelectionNode>();
private final Map<Integer, ITreeSelectionNode> mapNode = new HashMap<Integer, ITreeSelectionNode>();
 
protected static final int EMPTY_ID = SQLRow.MIN_VALID_ID - 1;
private final EmptyChangeSupport helper;
private final PropertyChangeSupport supp;
private final SQLTableListener listener;
 
public ITreeSelection() {
this(null);
103,22 → 106,59
}
});
 
this.listener = new SQLTableListener() {
public void rowModified(SQLTable table, int id) {
final ITreeSelectionNode node = ITreeSelection.this.mapNode.get(Integer.valueOf(id));
if (node != null) {
modifyNode(table.getRow(id), node);
}
}
 
public void rowAdded(SQLTable table, int id) {
final SQLRow row = table.getRow(id);
int idPere = row.getInt("ID_" + element.getTable().getName() + "_PERE");
addNewNode(null, row, idPere, new HashSet<>());
}
 
public void rowDeleted(SQLTable table, int id) {
final ITreeSelectionNode node = ITreeSelection.this.mapNode.get(Integer.valueOf(id));
for (int i = 0; i < node.getChildCount(); i++) {
removeNode(table.getRow(id), node);
}
}
};
 
}
 
private void initTree() {
if (this.element == null) {
this.rootNode = new ITreeSelectionNode(null);
} else {
SQLRowValues row = UndefinedRowValuesCache.getInstance().getDefaultRowValues(element.getTable());
SQLRowValues row = UndefinedRowValuesCache.getInstance().getDefaultRowValues(this.element.getTable());
this.rootNode = new ITreeSelectionNode(row);
}
this.model = new DefaultTreeModel(this.rootNode);
this.setModel(this.model);
loadTree();
setTableListener();
this.addMouseListener(this);
this.element.getTable().addTableListener(this.listener);
this.addHierarchyListener(new HierarchyListener() {
 
@Override
public void hierarchyChanged(HierarchyEvent e) {
// check for Hierarchy event
if (e.getChangeFlags() == HierarchyEvent.DISPLAYABILITY_CHANGED) {
// do the required action upon close
if (!isDisplayable()) {
ITreeSelection.this.element.getTable().removeTableListener(ITreeSelection.this.listener);
}
 
}
 
}
});
}
 
public void mouseClicked(MouseEvent e) {
}
 
183,10 → 223,10
* Ajouter une feuille
*/
public void addElement(int idRoot) {
EditFrame frameAdd = new EditFrame(element, EditFrame.CREATION);
SQLRowValues rowVals = new SQLRowValues(element.getTable());
EditFrame frameAdd = new EditFrame(this.element, EditFrame.CREATION);
SQLRowValues rowVals = new SQLRowValues(this.element.getTable());
if (idRoot > 1) {
rowVals.put("ID_" + element.getTable().getName() + "_PERE", idRoot);
rowVals.put("ID_" + this.element.getTable().getName() + "_PERE", idRoot);
frameAdd.getSQLComponent().select(rowVals);
}
FrameUtil.showPacked(frameAdd);
199,7 → 239,7
public void removeElement(int id) {
if (id > 1) {
try {
element.archive(id);
this.element.archive(id);
} catch (SQLException e1) {
e1.printStackTrace();
}
211,7 → 251,7
*/
public void modifyElement(int id) {
if (id > 1) {
EditFrame frameModFamille = new EditFrame(element, EditFrame.MODIFICATION);
EditFrame frameModFamille = new EditFrame(this.element, EditFrame.MODIFICATION);
frameModFamille.selectionId(id, 1);
FrameUtil.showPacked(frameModFamille);
}
302,7 → 342,7
new SwingWorker<List<SQLRow>, Object>() {
@Override
protected List<SQLRow> doInBackground() throws Exception {
final SQLTable table = element.getTable();
final SQLTable table = ITreeSelection.this.element.getTable();
final SQLSelect sel = new SQLSelect();
sel.addSelectStar(table);
return SQLRowListRSH.execute(sel);
321,7 → 361,7
}
for (int i = 0; i < l.size(); i++) {
SQLRow row = l.get(i);
addNewNode(familles, row, row.getInt("ID_" + element.getTable().getName() + "_PERE"), new HashSet<>());
addNewNode(familles, row, row.getInt("ID_" + ITreeSelection.this.element.getTable().getName() + "_PERE"), new HashSet<>());
}
expandRow(0);
}
348,7 → 388,7
if (idPere != row.getID()) {
if (!addedIDs.contains(idPere)) {
addedIDs.add(idPere);
addNewNode(familles, rowPere, rowPere.getInt("ID_" + element.getTable().getName() + "_PERE"), addedIDs);
addNewNode(familles, rowPere, rowPere.getInt("ID_" + this.element.getTable().getName() + "_PERE"), addedIDs);
}
}
nodePere = this.mapNode.get(Integer.valueOf(idPere));
360,7 → 400,7
addNode(newNode, nodePere);
} else {
if (idPere == 1) {
addNode(newNode, rootNode);
addNode(newNode, this.rootNode);
}
}
}
381,7 → 421,7
break;
}
}
model.insertNodeInto(nodeToAdd, nodeParent, n);
this.model.insertNodeInto(nodeToAdd, nodeParent, n);
}
 
/**
391,10 → 431,10
*/
private void modifyNode(SQLRow row, ITreeSelectionNode node) {
if (row.isArchived() && node.getParent() != null) {
model.removeNodeFromParent(node);
this.model.removeNodeFromParent(node);
} else {
node.setRow(row);
model.nodeChanged(node);
this.model.nodeChanged(node);
}
}
 
409,7 → 449,7
for (int i = 0; i < childCount; i++) {
final ITreeSelectionNode v = (ITreeSelectionNode) nodeParent.getChildAt(i);
if (v.getId() == row.getID()) {
model.removeNodeFromParent(v);
this.model.removeNodeFromParent(v);
}
}
}
419,27 → 459,7
*
*/
private void setTableListener() {
final SQLTableListener listener = new SQLTableListener() {
public void rowModified(SQLTable table, int id) {
final ITreeSelectionNode node = mapNode.get(Integer.valueOf(id));
if (node != null) {
modifyNode(table.getRow(id), node);
}
}
 
public void rowAdded(SQLTable table, int id) {
final SQLRow row = table.getRow(id);
int idPere = row.getInt("ID_" + element.getTable().getName() + "_PERE");
addNewNode(null, row, idPere, new HashSet<>());
this.element.getTable().addTableListener(this.listener);
}
 
public void rowDeleted(SQLTable table, int id) {
final ITreeSelectionNode node = mapNode.get(Integer.valueOf(id));
for (int i = 0; i < node.getChildCount(); i++) {
removeNode(table.getRow(id), node);
}
}
};
this.element.getTable().addTableListener(listener);
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/panel/UserExitPanel.java
37,8 → 37,6
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
 
190,50 → 188,15
Gestion.pgFrameStart.setVisible(false);
}
new Thread() {
private PostgreSQLFrame pgFrame = null;
 
@Override
public void run() {
try {
Configuration.getInstance().destroy();
Runtime runtime = Runtime.getRuntime();
 
File f = new File(".\\PostgreSQL\\bin\\");
if (f.exists()) {
final Process p = runtime.exec(new String[] { "cmd.exe", "/C", "stopPostGres.bat" }, null, f);
SwingUtilities.invokeLater(new Runnable() {
 
@Override
public void run() {
 
try {
pgFrame = new PostgreSQLFrame("Arrêt en cours");
pgFrame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
System.err.println("Execute end postgres");
ProcessStreams.handle(p, ProcessStreams.Action.REDIRECT);
p.waitFor();
 
}
ComptaPropsConfiguration.getInstanceCompta().tearDownLogging(true);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
if (pgFrame != null) {
pgFrame.dispose();
}
}
});
 
startTimeOut();
// System.exit(0);
}
/trunk/OpenConcerto/src/org/openconcerto/erp/panel/compta/ImportRImport.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
65,6 → 65,7
line = bReader.readLine();
while (line != null && !line.contains("#Section")) {
final List<String> parts = StringUtils.fastSplit(line, '\t');
if (parts.size() > 6) {
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());
90,7 → 91,7
p = new Piece(pieceRef);
mouvement = new Mouvement();
p.add(mouvement);
 
this.mapPiece.put(pieceRef, p);
} else {
mouvement = p.getMouvements().get(0);
}
107,8 → 108,11
if ("AN".equals(journalCode)) {
ecriture.setaNouveau(true);
}
 
mouvement.add(ecriture);
 
} else {
System.err.println("Ignoring : " + line);
}
// Next
line = bReader.readLine();
}
176,6 → 180,10
return this.error;
}
 
public List<Piece> getPieces() {
return new ArrayList<Piece>(this.mapPiece.values());
}
 
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()));
184,7 → 192,15
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.getPieces().size() + " pieces");
System.err.println("ImportRImport.main()" + i.getError());
for (Piece p : i.getPieces()) {
System.err.println(p.getNom() + " " + p.getMouvements().size() + " mouvements");
for (Mouvement m : p.getMouvements()) {
System.err.println(m.asString());
}
}
 
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/panel/compta/ExportFEC.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
44,7 → 44,7
 
public static final char ZONE_SEPARATOR = '\t';
public static final char RECORD_SEPARATOR = '\n';
private static final char REPLACEMENT = ' ';
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");
 
99,7 → 99,7
}
 
private final void addAmountField(final List<String> line, final Number cents) {
final String formattedAmount = format.format(BigDecimal.valueOf(cents.longValue()).movePointLeft(2));
final String formattedAmount = this.format.format(BigDecimal.valueOf(cents.longValue()).movePointLeft(2));
line.add(formattedAmount);
}
 
107,10 → 107,42
if (s == null) {
throw new NullPointerException("Valeur manquante pour remplir la ligne : " + line);
}
final String escapedString = StringUtils.toAsciiString(s).trim();
line.add(escapedString.replace(ZONE_SEPARATOR, REPLACEMENT).replace(RECORD_SEPARATOR, REPLACEMENT));
final String escapedString = strongEscape(s).trim();
line.add(escapedString);
}
 
private final String strongEscape(String str) {
if (str == null) {
return "";
}
final int length = str.length();
final StringBuilder b = new StringBuilder(length);
for (int i = 0; i < length; i++) {
final char c = str.charAt(i);
final char newChar;
if (c > 31 && c < 126 && c != ';') {
// ';' is escaped to avoid issue with Excel
newChar = c;
} else if (c == 'é' || c == 'è' || c == 'ê') {
newChar = 'e';
} else if (c == 'â' || c == 'à') {
newChar = 'a';
} else if (c == 'î') {
newChar = 'i';
} else if (c == 'ù' || c == 'û') {
newChar = 'u';
} else if (c == 'ô') {
newChar = 'o';
} else if (c == 'ç') {
newChar = 'c';
} else {
newChar = ' ';
}
b.append(newChar);
}
return b.toString();
}
 
@Override
protected void export(OutputStream out) throws IOException {
final Writer bufOut = new OutputStreamWriter(out, StringUtils.ISO8859_15);
186,7 → 218,7
line.add(ecritureDateValid);
} else {
line.add("");
if (cloture) {
if (this.cloture) {
bufOut.close();
JOptionPane.showMessageDialog(new JFrame(), "Une écriture n'est pas validée (pas de date):\n" + line, "Erreur FEC", JOptionPane.ERROR_MESSAGE);
return;
/trunk/OpenConcerto/src/org/openconcerto/erp/utils/SoundGenerator.java
New file
0,0 → 1,210
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011-2019 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.utils;
 
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
 
public class SoundGenerator {
private int sampleRate = 44100; // 16 * 1024 or ~16KHz
public static final double A4 = 440.;
 
public static final byte FADE_NONE = 0;
public static final byte FADE_LINEAR = 1;
public static final byte FADE_QUADRATIC = 2;
 
public static final byte WAVE_SIN = 0;
public static final byte WAVE_SQUARE = 1;
public static final byte WAVE_TRIANGLE = 2;
public static final byte WAVE_SAWTOOTH = 3;
 
private static final double BYTE_OSCI = 127.0; // max value for byte
 
private static double linearFade(double i, int max) {
return (max - (float) i) / max;
}
 
private static double quadraticFade(double i, int max) {
// (-1/ max^2) * i^2 + 1
return (-1 / Math.pow(max, 2)) * Math.pow(i, 2) + 1;
}
 
private static double sinWave(double i, double period) {
return Math.sin(2.0 * Math.PI * i / period);
}
 
private static double squareWave(double i, double period) {
return (i % period) / period < .5 ? 1 : -1;
}
 
private static double triangleWave(double i, double period) {
return Math.asin(Math.sin((2 * Math.PI) * (i / period)));
}
 
private static double sawtoothWave(double i, double period) {
return -1 + 2 * ((i % period) / period);
}
 
public void playGradient(double fstart, double fend, double duration, double volume, byte fadeend, byte wave) {
byte[] freqdata = new byte[(int) (duration * sampleRate)];
 
// Generate the sound
for (int i = 0; i < freqdata.length; i++) {
freqdata[i] = (byte) generateValue(i, duration, fstart + (fend - fstart) * (i / (double) freqdata.length), volume, fadeend, wave);
}
 
// Play it
try {
final AudioFormat af = new AudioFormat(sampleRate, 8, 1, true, true);
SourceDataLine line = AudioSystem.getSourceDataLine(af);
line.open(af, sampleRate);
line.start();
line.write(freqdata, 0, freqdata.length);
line.drain();
line.close();
} catch (LineUnavailableException e) {
throw new IllegalStateException(e);
}
}
 
/**
* Same as playSound but plays several frequences at the same time<br/>
* <code>
* double[] freqs = {440.0,440*1.5}; <br/>
* SoundGenerator.playSound(freqs,1.0,0.5,SoundGenerator.FADE_LINEAR,SoundGenerator.WAVE_SIN);
* </code>
*
*/
public void playSounds(double[] freqs, double duration, double volume, byte fade, byte wave) {
if (freqs.length == 0) {
throw new IllegalArgumentException("no frequences");
}
volume = volume / freqs.length; // ease volume to avoid overflow
 
double[][] soundData = new double[freqs.length][];
 
for (int i = 0; i < soundData.length; i++) {
soundData[i] = generateSoundData(freqs[i], duration, volume, fade, wave);
}
byte[] freqdata = new byte[soundData[0].length];
 
for (int i = 0; i < soundData[0].length; i++) {
for (int j = 0; j < soundData.length; j++) {
freqdata[i] += (byte) (soundData[j][i]);
}
}
 
// Play it
try {
final AudioFormat af = new AudioFormat(sampleRate, 8, 1, true, true);
SourceDataLine line = AudioSystem.getSourceDataLine(af);
line.open(af, sampleRate);
line.start();
line.write(freqdata, 0, freqdata.length);
line.drain();
line.close();
} catch (LineUnavailableException e) {
throw new IllegalStateException(e);
}
}
 
/**
* Play a sound at a given frequency freq during duration (in seconds) with volume as strenght
* <br/>
* <br/>
* <code>SoundGenerator.playSound(440.0,1.0,0.5,SoundGenerator.FADE_LINEAR,SoundGenerator.WAVE_SIN);</code><br/>
* Available fades : FADE_NONE, FADE_LINEAR, FADE_QUADRATIC<br/>
* Available waves : WAVE_SIN, WAVE_SQUARE, WAVE_TRIANGLE, WAVE_SAWTOOTH<br/>
*/
public void playSound(double freq, double duration, double volume, byte fade, byte wave) {
 
double[] soundData = generateSoundData(freq, duration, volume, fade, wave);
byte[] freqdata = new byte[soundData.length];
 
for (int i = 0; i < soundData.length; i++) {
freqdata[i] = (byte) soundData[i];
}
 
// Play it
try {
final AudioFormat af = new AudioFormat(sampleRate, 8, 1, true, true);
SourceDataLine line = AudioSystem.getSourceDataLine(af);
line.open(af, sampleRate);
line.start();
line.write(freqdata, 0, freqdata.length);
line.drain();
line.close();
} catch (LineUnavailableException e) {
throw new IllegalStateException(e);
}
}
 
public double generateValue(double i, double duration, double freq, double volume, byte fade, byte wave) {
double period = (double) sampleRate / freq;
double fadeData = 0;
double waveData = 0;
int length = (int) (duration * sampleRate);
 
switch (fade) {
case FADE_NONE:
fadeData = 1.0D;
break;
case FADE_LINEAR:
fadeData = linearFade(i, length);
break;
case FADE_QUADRATIC:
fadeData = quadraticFade(i, length);
break;
default:
fadeData = 1.0D;
}
switch (wave) {
case WAVE_SIN:
waveData = sinWave(i, period);
break;
case WAVE_SQUARE:
waveData = squareWave(i, period);
break;
case WAVE_TRIANGLE:
waveData = triangleWave(i, period);
break;
case WAVE_SAWTOOTH:
waveData = sawtoothWave(i, period);
break;
default:
waveData = sinWave(i, period);
}
return (waveData * BYTE_OSCI * fadeData * volume);
}
 
public double[] generateSoundData(double freq, double duration, double volume, byte fade, byte wave) {
double[] freqdata = new double[(int) (duration * sampleRate)];
 
// Generate the sound
for (int i = 0; i < freqdata.length; i++) {
freqdata[i] = generateValue(i, duration, freq, volume, fade, wave);
}
return freqdata;
}
 
public void sampleRate(int sr) {
sampleRate = sr;
}
 
public int sampleRate() {
return sampleRate;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/utils/correct/CorrectMouvement.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
48,7 → 48,7
final SQLSelect selUnbalanced = new SQLSelect();
selUnbalanced.addSelect(ecritureMvtFF);
selUnbalanced.addGroupBy(ecritureMvtFF);
selUnbalanced.setHaving(Where.quote(ecritureT.getBase().quote("SUM(%n) != SUM(%n)", ecritureT.getField("DEBIT"), ecritureT.getField("CREDIT"))));
selUnbalanced.setHaving(Where.quote(selUnbalanced.getSyntax(), ecritureT.getBase().quote("SUM(%n) != SUM(%n)", ecritureT.getField("DEBIT"), ecritureT.getField("CREDIT"))));
return selUnbalanced;
}
 
112,7 → 112,7
Where joinEcritureW = null;
for (final String uniqField : uniqueFields) {
final SQLTable t = uniqField.equals("ID_MOUVEMENT") ? saisieKmT : saisieKmElemT;
joinEcritureW = Where.quote("e." + SQLBase.quoteIdentifier(uniqField) + "= %f", t.getField(uniqField)).and(joinEcritureW);
joinEcritureW = Where.quote(getSyntax(), "e." + SQLBase.quoteIdentifier(uniqField) + "= %f", t.getField(uniqField)).and(joinEcritureW);
}
final Where dontOverwrite = new Where(saisieKmElemT.getField("ID_ECRITURE"), Where.NULL_IS_DATA_EQ, ecritureT.getUndefinedIDNumber());
final Where dontUpdateUndef = new Where(saisieKmElemT.getKey(), Where.NULL_IS_DATA_NEQ, saisieKmElemT.getUndefinedIDNumber());
/trunk/OpenConcerto/src/org/openconcerto/erp/model/MouseSheetXmlListeListener.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
14,33 → 14,48
package org.openconcerto.erp.model;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.common.ui.PreviewFrame;
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.element.SQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.EditPanel.EditMode;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.RowAction;
import org.openconcerto.sql.view.list.action.ListEvent;
import org.openconcerto.ui.EmailComposer;
import org.openconcerto.ui.FrameUtil;
import org.openconcerto.utils.Action;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.ListMap;
import org.openconcerto.utils.i18n.Grammar;
import org.openconcerto.utils.i18n.TranslationManager;
 
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.StringJoiner;
 
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
 
56,13 → 71,15
private boolean previewHeader = false;
private boolean showHeader = false;
private boolean generateHeader = false;
private SQLElement element;
 
public MouseSheetXmlListeListener(Class<? extends AbstractSheetXml> clazz) {
this(clazz, true, true, true, true);
public MouseSheetXmlListeListener(SQLElement element, Class<? extends AbstractSheetXml> clazz) {
this(element, clazz, true, true, true, true);
 
}
 
public MouseSheetXmlListeListener(Class<? extends AbstractSheetXml> clazz, boolean show, boolean preview, boolean print, boolean generate) {
public MouseSheetXmlListeListener(SQLElement element, Class<? extends AbstractSheetXml> clazz, boolean show, boolean preview, boolean print, boolean generate) {
this.element = element;
this.clazz = clazz;
this.printIsVisible = print;
this.previewIsVisible = preview;
115,7 → 132,7
this.showHeader = showHeader;
}
 
protected void sendMail(EmailTemplate template, final AbstractSheetXml sheet, final boolean readOnly) {
public void sendMail(EmailTemplate template, final AbstractSheetXml sheet, final boolean readOnly) {
List<AbstractSheetXml> l = new ArrayList<>(1);
l.add(sheet);
sendMail(template, l, readOnly);
289,7 → 306,7
}, this.previewHeader, "document.modify") {
 
@Override
public boolean enabledFor(IListeEvent evt) {
public boolean enabledFor(ListEvent evt) {
// On ne teste pas l'existence du fichier génété car les IOs peuvent prendre
// du temps
return evt.getSelectedRow() != null && (evt.getTotalRowCount() >= 1);
307,10 → 324,10
try {
final AbstractSheetXml sheet = createAbstractSheet(IListe.get(ev).fetchSelectedRow());
final SQLTable table = IListe.get(ev).getSource().getPrimaryTable();
sheet.showPreviewDocument(TranslationManager.getInstance().getTranslationForAction("email"), new Runnable() {
final Action emailAction = new Action(TranslationManager.getInstance().getTranslationForAction("document.pdf.send.email")) {
 
@Override
public void run() {
public void run(Object source) {
EmailTemplate.askTemplate(IListe.get(ev), table.getDBRoot(), new ValueListener() {
 
@Override
320,7 → 337,23
});
 
}
});
};
final Action modifyAction = new Action(
TranslationManager.getInstance().getTranslationForAction("modify") + " " + element.getName().getVariant(Grammar.DEFINITE_ARTICLE_SINGULAR)) {
 
@Override
public void run(Object source) {
if (source instanceof PreviewFrame) {
((PreviewFrame) source).dispose();
}
final SQLComponent component = element.createDefaultComponent();
final EditFrame f = new EditFrame(component, EditMode.MODIFICATION);
f.selectionId(IListe.get(ev).getSelectedId());
FrameUtil.show(f);
 
}
};
sheet.showPreviewDocument(Arrays.asList(emailAction, modifyAction));
} catch (Exception e) {
ExceptionHandler.handle("Impossible d'ouvrir le fichier", e);
}
329,7 → 362,7
}, this.previewHeader, "document.preview") {
 
@Override
public boolean enabledFor(IListeEvent evt) {
public boolean enabledFor(ListEvent evt) {
// On ne teste pas l'existence du fichier génété car les IOs peuvent prendre
// du temps
return evt.getSelectedRow() != null && evt.getTotalRowCount() >= 1;
359,7 → 392,7
}, this.showHeader, "document.modify") {
 
@Override
public boolean enabledFor(IListeEvent evt) {
public boolean enabledFor(ListEvent evt) {
// On ne teste pas l'existence du fichier génété car les IOs peuvent prendre
// du temps
return evt.getSelectedRow() != null && evt.getTotalRowCount() >= 1;
368,6 → 401,62
 
}
 
l.add(new RowAction(new AbstractAction() {
public void actionPerformed(ActionEvent ev) {
try {
File file = createAbstractSheet(IListe.get(ev).fetchSelectedRow()).getOrCreatePDFDocumentFile(true);
 
JFileChooser fileChooser = new JFileChooser();
fileChooser.setSelectedFile(file);
fileChooser.setDialogTitle(TranslationManager.getInstance().getTranslationForAction("document.saveToPDF"));
 
int userSelection = fileChooser.showSaveDialog(IListe.get(ev));
 
if (userSelection == JFileChooser.APPROVE_OPTION) {
File fileToSave = fileChooser.getSelectedFile();
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream(file);
os = new FileOutputStream(fileToSave);
byte[] buffer = new byte[4096];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
 
try {
if (is != null)
is.close();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
if (os != null)
os.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
 
} catch (Exception e) {
ExceptionHandler.handle("Impossible d'ouvrir le fichier", e);
}
}
}, false, "document.saveToPDF") {
 
@Override
public boolean enabledFor(ListEvent evt) {
// On ne teste pas l'existence du fichier génété car les IOs peuvent prendre
// du temps
return evt.getSelectedRow() != null && evt.getSelectedRowAccessors().size() == 1;
}
});
 
if (this.printIsVisible) {
 
// Impression rapide : imprime le ou les documents sélectionnés (les génère si besoin)
375,8 → 464,8
l.add(new RowAction(new PrintDocumentAction(this), false, "document.print") {
 
@Override
public boolean enabledFor(IListeEvent evt) {
return evt.getSelectedRow() != null && evt.getSelectedRows().size() > 0;
public boolean enabledFor(ListEvent evt) {
return evt.getSelectedRow() != null && evt.getTotalRowCount() > 0;
}
});
 
394,8 → 483,9
if (this.generateIsVisible) {
l.add(new RowAction(new AbstractAction() {
public void actionPerformed(ActionEvent ev) {
List<SQLRowValues> l = IListe.get(ev).getSelectedRows();
 
List<SQLRowAccessor> l = IListe.get(ev).getSelectedRowAccessors();
 
if (l.size() == 1) {
createDocument(ev);
} else {
405,8 → 495,8
}, this.generateHeader, "document.create") {
 
@Override
public boolean enabledFor(List<SQLRowValues> selection) {
return selection != null && !selection.isEmpty();
public boolean enabledFor(ListEvent selection) {
return selection != null && selection.getTotalRowCount() > 0;
}
 
});
423,7 → 513,7
}, false, "document.send.email") {
 
@Override
public boolean enabledFor(IListeEvent evt) {
public boolean enabledFor(ListEvent evt) {
// On ne teste pas l'existence du fichier génété car les IOs peuvent prendre du
// temps
return evt.getSelectedRow() != null && evt.getTotalRowCount() >= 1;
440,7 → 530,7
}, false, "document.pdf.send.email") {
 
@Override
public boolean enabledFor(IListeEvent evt) {
public boolean enabledFor(ListEvent evt) {
// On ne teste pas l'existence du fichier génété car les IOs peuvent prendre du
// temps
return evt.getSelectedRow() != null && evt.getTotalRowCount() >= 1;
456,7 → 546,7
for (SQLRowAccessor sqlRowAccessor : selection) {
final AbstractSheetXml sheet = createAbstractSheet(sqlRowAccessor.getTable().getRow(sqlRowAccessor.getID()));
sheet.createDocumentAsynchronous();
sheet.showPrintAndExportAsynchronous(false, false, true);
sheet.showPrintAndExportAsynchronous(false, false, true, Collections.emptyList());
}
}
}
467,7 → 557,7
int a = JOptionPane.showConfirmDialog(null, "Voulez vous remplacer le document existant?", "Génération de documents", JOptionPane.YES_NO_OPTION);
if (a == JOptionPane.YES_OPTION) {
sheet.createDocumentAsynchronous();
sheet.showPrintAndExportAsynchronous(true, false, true);
sheet.showPrintAndExportAsynchronous(true, false, true, Collections.emptyList());
return;
}
}
474,7 → 564,7
 
try {
sheet.getOrCreateDocumentFile();
sheet.showPrintAndExportAsynchronous(true, false, false);
sheet.showPrintAndExportAsynchronous(true, false, false, Collections.emptyList());
} catch (Exception exn) {
exn.printStackTrace();
}
492,7 → 582,7
final AbstractSheetXml sheet = createAbstractSheet(IListe.get(ev).fetchSelectedRow().asRow());
try {
sheet.getOrCreateDocumentFile();
sheet.showPrintAndExportAsynchronous(true, false, true);
sheet.showPrintAndExportAsynchronous(true, false, true, Collections.emptyList());
} catch (Exception exn) {
ExceptionHandler.handle("Une erreur est survenue lors de la création du document.", exn);
}
500,22 → 590,23
}, false, false, "document.create") {
 
@Override
public boolean enabledFor(List<SQLRowValues> selection) {
return selection != null && selection.size() == 1;
public boolean enabledFor(ListEvent selection) {
return selection != null && selection.getTotalRowCount() == 1;
}
 
@Override
public Action getDefaultAction(final IListeEvent evt) {
public javax.swing.Action getDefaultAction(final ListEvent evt) {
return this.getAction();
}
};
}
 
private void sendMail(ActionEvent ev, boolean pdf) {
final List<SQLRowValues> selectedRows = IListe.get(ev).getSelectedRows();
protected void sendMail(ActionEvent ev, boolean pdf) {
final List<SQLRowAccessor> selectedRows = IListe.get(ev).getSelectedRowAccessors();
 
final SQLTable table = IListe.get(ev).getSource().getPrimaryTable();
final List<SQLRow> rows = new ArrayList<>();
for (SQLRowValues r : selectedRows) {
for (SQLRowAccessor r : selectedRows) {
rows.add(table.getRow(r.getID()));
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/model/EditionFichePayeModel.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
28,6 → 28,7
 
import java.sql.Date;
import java.sql.SQLException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
340,7 → 341,7
FichePayeSheetXML sheet = new FichePayeSheetXML(rowFiche);
sheet.createDocumentAsynchronous();
Boolean bPrint = (Boolean) m.get("IMPRESSION");
sheet.showPrintAndExportAsynchronous(false, bPrint.booleanValue(), true);
sheet.showPrintAndExportAsynchronous(false, bPrint.booleanValue(), true, Collections.emptyList());
} catch (Exception e) {
ExceptionHandler.handle("Erreur lors de la création du document!", e);
}
/trunk/OpenConcerto/src/org/openconcerto/erp/rights/DepotStockViewRightEditor.java
New file
0,0 → 1,62
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011-2019 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.rights;
 
import org.openconcerto.erp.core.supplychain.stock.element.DepotStockSQLElement;
import org.openconcerto.sql.element.SQLElementDirectory;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.sqlobject.SQLRequestComboBox;
import org.openconcerto.sql.users.rights.RightEditor;
import org.openconcerto.sql.users.rights.RightEditorManager;
 
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
 
import javax.swing.JComponent;
import javax.swing.JTextField;
 
public class DepotStockViewRightEditor implements RightEditor {
 
public static final String ID_RIGHT = "DEPOT_STOCK_VIEW";
 
@Override
public void setValue(final String object, final DBRoot root, final SQLElementDirectory directory, final JComponent editorComponent) {
if (object != null && object.trim().length() > 0) {
((SQLRequestComboBox) editorComponent).setValue(Integer.valueOf(object));
} else {
((SQLRequestComboBox) editorComponent).setValue(directory.getElement(DepotStockSQLElement.class).getTable().getUndefinedID());
}
}
 
@Override
public JComponent getRightEditor(final String right, final DBRoot root, final SQLElementDirectory directory, final JTextField fieldObject) {
final SQLRequestComboBox box = new SQLRequestComboBox();
box.uiInit(directory.getElement(DepotStockSQLElement.class).getComboRequest());
box.addModelListener("wantedID", new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
int id = box.getWantedID();
fieldObject.setText(String.valueOf(id));
}
});
 
return box;
}
 
public static void register() {
RightEditorManager.getInstance().register(ID_RIGHT, new DepotStockViewRightEditor());
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/importer/DataImporter.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
243,7 → 243,7
if (cellValue == null) {
rowData.add("");
} else {
switch (cellValue.getCellTypeEnum()) {
switch (cellValue.getCellType()) {
case BOOLEAN:
rowData.add(Boolean.valueOf(cellValue.getBooleanValue()));
break;
/trunk/OpenConcerto/src/org/openconcerto/erp/preferences/TemplateNXProps.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
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.GrandLivreSheetXML;
import org.openconcerto.erp.core.finance.accounting.report.JournauxSheetXML;
import org.openconcerto.erp.core.humanresources.payroll.report.EtatChargesPayeSheet;
import org.openconcerto.erp.core.humanresources.payroll.report.FichePayeSheetXML;
151,7 → 150,6
register(ReleveChequeSheet.TEMPLATE_ID, ReleveChequeSheet.TEMPLATE_PROPERTY_NAME, null);
register(ListeVenteXmlSheet.TEMPLATE_ID, ListeVenteXmlSheet.TEMPLATE_PROPERTY_NAME, null);
register(BalanceSheet.TEMPLATE_ID, BalanceSheet.TEMPLATE_PROPERTY_NAME, BalanceSheet.TEMPLATE_ID);
register(GrandLivreSheetXML.TEMPLATE_ID, GrandLivreSheetXML.TEMPLATE_PROPERTY_NAME, GrandLivreSheetXML.TEMPLATE_ID);
register(JournauxSheetXML.TEMPLATE_ID, JournauxSheetXML.TEMPLATE_PROPERTY_NAME, JournauxSheetXML.TEMPLATE_ID);
register(EtatChargesPayeSheet.TEMPLATE_ID, EtatChargesPayeSheet.TEMPLATE_PROPERTY_NAME, "Etat des charges");
register(FichePayeSheetXML.TEMPLATE_ID, FichePayeSheetXML.TEMPLATE_PROPERTY_NAME, "Fiche paye");
/trunk/OpenConcerto/src/org/openconcerto/erp/preferences/GestionArticleGlobalPreferencePanel.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
25,6 → 25,7
import org.openconcerto.utils.PrefType;
 
public class GestionArticleGlobalPreferencePanel extends JavaPrefPreferencePanel {
public static String ACTIVER_DECLINAISON = "GestionDeclinaison";
public static String STOCK_FACT = "StockOnOrder";
public static String UNITE_VENTE = "UniteVenteActive";
public static String USE_CREATED_ARTICLE = "UseCreatedArticle";
40,6 → 41,10
public static String STOCK_MULTI_DEPOT = "MultiDepot";
public static String CAN_EXPAND_NOMENCLATURE_VT = "CanExpandNomenclature";
public static String CAN_EXPAND_NOMENCLATURE_HA = "CanExpandNomenclaturePurchase";
public static String SHOW_LIST_COMPTE = "ShowListProductCompte";
public static String SHOW_LIST_TAXE = "ShowListProductTaxe";
public static String SHOW_LIST_FAMILLE = "ShowListProductFamille";
public static String SHOW_LIST_FOURNISSEUR = "ShowListProductFournisseur";
 
public GestionArticleGlobalPreferencePanel() {
super("Gestion des articles", null);
82,6 → 87,10
view.setDefaultValue(Boolean.TRUE);
this.addView(view);
 
PrefView<Boolean> viewGestionDeclinaison = new PrefView<Boolean>(PrefType.BOOLEAN_TYPE, "Activer la gestion des déclinaisons", ACTIVER_DECLINAISON);
viewGestionDeclinaison.setDefaultValue(Boolean.FALSE);
this.addView(viewGestionDeclinaison);
 
PrefView<Boolean> viewMultiStock = new PrefView<Boolean>(PrefType.BOOLEAN_TYPE, "Activer la gestion multidépôt", STOCK_MULTI_DEPOT);
viewMultiStock.setDefaultValue(Boolean.FALSE);
this.addView(viewMultiStock);
110,5 → 119,18
view5.setDefaultValue(Boolean.FALSE);
this.addView(view5);
 
PrefView<Boolean> viewCompte = new PrefView<Boolean>(PrefType.BOOLEAN_TYPE, "Afficher les comptes comptables des articles dans les listes", SHOW_LIST_COMPTE);
viewCompte.setDefaultValue(Boolean.FALSE);
this.addView(viewCompte);
PrefView<Boolean> viewTaxe = new PrefView<Boolean>(PrefType.BOOLEAN_TYPE, "Afficher la TVA des articles dans les listes", SHOW_LIST_TAXE);
viewTaxe.setDefaultValue(Boolean.FALSE);
this.addView(viewTaxe);
PrefView<Boolean> viewFamille = new PrefView<Boolean>(PrefType.BOOLEAN_TYPE, "Afficher les familles des articles dans les listes", SHOW_LIST_FAMILLE);
viewFamille.setDefaultValue(Boolean.FALSE);
this.addView(viewFamille);
PrefView<Boolean> viewFournisseur = new PrefView<Boolean>(PrefType.BOOLEAN_TYPE, "Afficher les fournisseurs des articles dans les listes", SHOW_LIST_FOURNISSEUR);
viewFournisseur.setDefaultValue(Boolean.FALSE);
this.addView(viewFournisseur);
 
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/preferences/GenerationDocumentComptaPreferencePanel.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
14,7 → 14,6
package org.openconcerto.erp.preferences;
 
import org.openconcerto.erp.core.finance.accounting.report.BalanceSheet;
import org.openconcerto.erp.core.finance.accounting.report.GrandLivreSheetXML;
import org.openconcerto.erp.core.finance.accounting.report.JournauxSheetXML;
import org.openconcerto.utils.Tuple2;
 
22,10 → 21,8
 
public GenerationDocumentComptaPreferencePanel() {
super();
this.mapKeyLabel.put(Tuple2.create(GrandLivreSheetXML.TEMPLATE_ID, GrandLivreSheetXML.TEMPLATE_PROPERTY_NAME), GrandLivreSheetXML.TEMPLATE_ID);
this.mapKeyLabel.put(Tuple2.create(JournauxSheetXML.TEMPLATE_ID, JournauxSheetXML.TEMPLATE_PROPERTY_NAME), JournauxSheetXML.TEMPLATE_ID);
this.mapKeyLabel.put(Tuple2.create(BalanceSheet.TEMPLATE_ID, BalanceSheet.TEMPLATE_PROPERTY_NAME), BalanceSheet.TEMPLATE_ID);
// uiInit();
}
 
public String getTitleName() {
/trunk/OpenConcerto/src/org/openconcerto/erp/preferences/UIPreferencePanel.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
279,6 → 279,11
final String look = properties.getProperty(UI_LOOK);
final String nimbusClassName = getNimbusClassName();
if (look != null && look.equals("flat")) {
UIManager.put("Table.showHorizontalLines", true);
UIManager.put("Table.showVerticalLines", true);
UIManager.put("ScrollBar.showButtons", true);
UIManager.put("TabbedPane.selectedBackground", Color.white);
UIManager.put("TabbedPane.showTabSeparators", true);
FlatLightLaf.install();
} else if (look != null && look.equals("system")) {
useSystemLF();
/trunk/OpenConcerto/src/org/openconcerto/erp/config/NewsUpdater.java
File deleted
/trunk/OpenConcerto/src/org/openconcerto/erp/config/InProgressFrame.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
15,7 → 15,12
 
import org.openconcerto.ui.ReloadPanel;
 
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.SplashScreen;
 
import javax.swing.JDialog;
import javax.swing.JLabel;
27,6 → 32,25
}
 
public void show(String title) {
try {
final SplashScreen splash = SplashScreen.getSplashScreen();
if (splash != null) {
Graphics2D g = splash.createGraphics();
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
g.setColor(Color.WHITE);
g.fillRect(0, (int) splash.getSize().getHeight() - 24, (int) splash.getSize().getWidth(), 24);
g.setFont(g.getFont().deriveFont(Font.BOLD).deriveFont(11f));
g.setColor(Color.DARK_GRAY);
g.drawString(title, 20, ((int) splash.getSize().getHeight()) - 8);
 
splash.update();
return;
}
} catch (Throwable e) {
// OpenJDK bug on linux
e.printStackTrace();
}
 
setTitle("Veuillez patienter");
JPanel p = new JPanel();
p.setLayout(new FlowLayout(FlowLayout.LEADING, 5, 5));
/trunk/OpenConcerto/src/org/openconcerto/erp/config/MenuAndActions.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
130,7 → 130,7
 
// check and modify group
final Group groupDesc = this.getGroup().followPath(path, true);
final Item child = groupDesc.getChildFromID(actionID);
final Item child = groupDesc.getDescFromID(actionID);
if (!canReplace && child != null) {
throw new IllegalStateException("ID exists : " + child);
}
/trunk/OpenConcerto/src/org/openconcerto/erp/config/InstallationPanel.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
19,9 → 19,11
import org.openconcerto.erp.core.sales.quote.element.EtatDevisSQLElement;
import org.openconcerto.erp.modules.ModuleManager;
import org.openconcerto.erp.modules.ModuleReference;
import org.openconcerto.sql.Configuration;
import org.openconcerto.erp.rights.DepotStockViewRightEditor;
import org.openconcerto.sql.changer.convert.AddFK;
import org.openconcerto.sql.changer.convert.AddMDFields;
import org.openconcerto.sql.changer.convert.ChangeIDToInt;
import org.openconcerto.sql.changer.convert.MergeTable;
import org.openconcerto.sql.changer.correct.CorrectOrder;
import org.openconcerto.sql.changer.correct.FixSerial;
import org.openconcerto.sql.element.GroupSQLComponent;
141,20 → 143,6
System.setProperty(SQLSchema.NOAUTO_CREATE_METADATA, "false");
final ComptaPropsConfiguration conf = ComptaPropsConfiguration.create(true);
 
final DBSystemRoot systemRoot = conf.getSystemRoot();
if (systemRoot.getChild(conf.getRootNameValue().getValue()) == null) {
conf.destroy();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
up.setEnabled(true);
bar.setValue(bar.getMaximum());
JOptionPane.showMessageDialog(InstallationPanel.this, "Votre base de données n'est pas initialisée");
}
});
return;
}
 
updateDatabase(conf);
 
conf.destroy();
3568,7 → 3556,7
patchFieldElt1Dot3(table, root);
}
 
private void updateSocieteSchema(final Configuration conf, final DBRoot root) throws IOException, Exception {
private void updateSocieteSchema(final DBRoot root) throws IOException, Exception {
final DBSystemRoot sysRoot = root.getDBSystemRoot();
final SQLDataSource ds = sysRoot.getDataSource();
System.out.println("InstallationPanel.InstallationPanel() UPDATE COMMERCIAL " + root);
3672,7 → 3660,7
final List<ChangeTable<?>> changes = new ArrayList<ChangeTable<?>>();
 
final ModuleManager instance = new ModuleManager();
instance.setup(root, conf);
instance.setRoot(root);
final Collection<ModuleReference> refs = instance.getModulesInstalledRemotely();
final Set<String> allUsedTable = new HashSet<String>();
for (ModuleReference ref : refs) {
3681,10 → 3669,6
}
System.out.println("Tables created by modules:" + allUsedTable);
 
final Set<String> notMigrated = instance.migrateOldTransientDirs();
if (!notMigrated.isEmpty())
System.out.println("Couldn't migrate old backed up/failed modules: " + notMigrated);
 
final List<String> alterRequests = ChangeTable.cat(changes, root.getName());
try {
for (final String req : alterRequests) {
3758,6 → 3742,19
rowValsUserRight.commit();
}
 
if (!codes.contains(DepotStockViewRightEditor.ID_RIGHT)) {
SQLRowValues rowVals = new SQLRowValues(table);
rowVals.put("CODE", DepotStockViewRightEditor.ID_RIGHT);
rowVals.put("NOM", "Voir le stock d'un dépôt");
String desc = "Autorise un utilisateur à visualiser le stock d'un dépôt.";
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("MENU_ACCESS")) {
SQLRowValues rowVals = new SQLRowValues(table);
rowVals.put("CODE", "MENU_ACCESS");
3818,6 → 3815,7
rowValsUserRight.put("HAVE_RIGHT", Boolean.TRUE);
rowValsUserRight.commit();
}
 
// if (!codes.contains("MODIF_PRODUCT_KIT")) {
// SQLRowValues rowVals = new SQLRowValues(table);
// rowVals.put("CODE", "MODIF_PRODUCT_KIT");
4210,25 → 4208,23
public void updateDatabase(final ComptaPropsConfiguration conf) {
 
try {
final DBSystemRoot systemRoot = conf.getSystemRoot();
System.err.println("SystemRoot:" + systemRoot);
final DBRoot rootCommon = conf.getRoot();
System.err.println("Root:" + rootCommon);
final SQLDataSource ds = conf.getSystemRoot().getDataSource();
System.err.println("SystemRoot:" + conf.getSystemRoot());
System.err.println("Root:" + conf.getRoot());
 
final SQLDataSource ds = systemRoot.getDataSource();
// FixUnbounded varchar
fixUnboundedVarchar(rootCommon);
fixUnboundedVarchar(conf.getRoot());
 
// FIXME DROP CONSTRAINT UNIQUE ORDRE ON
// CONTACT_FOURNISSEUR
 
checkCompteDefault(rootCommon);
checkCompteDefault(conf.getRoot());
 
updateSocieteTable(rootCommon);
updateVille(rootCommon.getTable("ADRESSE"));
updateSocieteTable(conf.getRoot());
updateVille(conf.getRoot().getTable("ADRESSE"));
 
// Champ user 1.4.1
final SQLTable tableUser = rootCommon.getTable("USER_COMMON");
final SQLTable tableUser = conf.getRoot().getTable("USER_COMMON");
if (tableUser != null) {
final AlterTable alter = new AlterTable(tableUser);
boolean alterUser = false;
4243,46 → 4239,56
 
if (alterUser) {
final String req = alter.asString();
rootCommon.getDBSystemRoot().getDataSource().execute(req);
rootCommon.refetchTable(tableUser.getName());
rootCommon.getSchema().updateVersion();
conf.getRoot().getDBSystemRoot().getDataSource().execute(req);
conf.getRoot().refetchTable(tableUser.getName());
conf.getRoot().getSchema().updateVersion();
}
}
 
// Champ Paye
final SQLTable tableCaisse = rootCommon.getTable("CAISSE_COTISATION");
final SQLTable tableCaisse = conf.getRoot().getTable("CAISSE_COTISATION");
if (!tableCaisse.contains("NUMERO_COMPTE_PCE")) {
final AlterTable alter = new AlterTable(tableCaisse);
alter.addVarCharColumn("NUMERO_COMPTE_PCE", 128);
alter.addVarCharColumn("NUMERO_COMPTE_PCE_CHARGES", 128);
final String req = alter.asString();
rootCommon.getDBSystemRoot().getDataSource().execute(req);
rootCommon.refetchTable(tableCaisse.getName());
rootCommon.getSchema().updateVersion();
conf.getRoot().getDBSystemRoot().getDataSource().execute(req);
conf.getRoot().refetchTable(tableCaisse.getName());
conf.getRoot().getSchema().updateVersion();
}
 
final SQLTable tableRC = rootCommon.getTable("RUBRIQUE_COTISATION");
final SQLTable tableRC = conf.getRoot().getTable("RUBRIQUE_COTISATION");
if (!tableRC.contains("PART_CSG_SANS_ABATTEMENT")) {
final AlterTable alter = new AlterTable(tableRC);
alter.addBooleanColumn("PART_CSG_SANS_ABATTEMENT", Boolean.FALSE, false);
final String req = alter.asString();
rootCommon.getDBSystemRoot().getDataSource().execute(req);
rootCommon.refetchTable(tableRC.getName());
rootCommon.getSchema().updateVersion();
conf.getRoot().getDBSystemRoot().getDataSource().execute(req);
conf.getRoot().refetchTable(tableRC.getName());
conf.getRoot().getSchema().updateVersion();
}
 
// if (!tableRC.contains("DATE_DEBUT_REGUL")) {
// final AlterTable alter = new AlterTable(tableRC);
// alter.addColumn("DATE_DEBUT_REGUL", "date");
// alter.addColumn("DATE_FIN_REGUL", "date");
// final String req = alter.asString();
// conf.getRoot().getDBSystemRoot().getDataSource().execute(req);
// conf.getRoot().refetchTable(tableRC.getName());
// conf.getRoot().getSchema().updateVersion();
// }
 
// Paye simplifiee
List<SQLRow> rowRubriqueReduGvt = new ArrayList<>();
{
 
final SQLTable tableRCom = rootCommon.getTable("RUBRIQUE_COMM");
final SQLTable tableRCom = conf.getRoot().getTable("RUBRIQUE_COMM");
if (!tableRCom.contains("REDUCTION_GVT_COM")) {
final AlterTable alter = new AlterTable(tableRCom);
alter.addBooleanColumn("REDUCTION_GVT_COM", Boolean.FALSE, false);
final String req = alter.asString();
rootCommon.getDBSystemRoot().getDataSource().execute(req);
rootCommon.refetchTable(tableRCom.getName());
rootCommon.getSchema().updateVersion();
conf.getRoot().getDBSystemRoot().getDataSource().execute(req);
conf.getRoot().refetchTable(tableRCom.getName());
conf.getRoot().getSchema().updateVersion();
 
SQLRowValues rowValsCommChom = new SQLRowValues(tableRCom);
rowValsCommChom.put("TAUX_SAL", "1.45;");
4321,13 → 4327,13
rowRubriqueReduGvt.add(rowValsCommCSG.commit());
 
SQLSelect sel = new SQLSelect();
sel.addSelect(rootCommon.getTable("PROFIL_PAYE").getKey());
sel.addSelect(conf.getRoot().getTable("PROFIL_PAYE").getKey());
List<SQLRow> rowsProfil = SQLRowListRSH.execute(sel);
int pos = 70;
for (SQLRow rowRub : rowRubriqueReduGvt) {
for (SQLRow rowProfil : rowsProfil) {
 
SQLRowValues rowValsRubGvt = new SQLRowValues(rootCommon.getTable("PROFIL_PAYE_ELEMENT"));
SQLRowValues rowValsRubGvt = new SQLRowValues(conf.getRoot().getTable("PROFIL_PAYE_ELEMENT"));
rowValsRubGvt.put("ID_PROFIL_PAYE", rowProfil.getID());
rowValsRubGvt.put("POSITION", pos);
rowValsRubGvt.put("IDSOURCE", rowRub.getID());
4339,14 → 4345,14
}
}
 
final SQLTable tableRB = rootCommon.getTable("RUBRIQUE_BRUT");
final SQLTable tableRB = conf.getRoot().getTable("RUBRIQUE_BRUT");
if (!tableRB.contains("AVANTAGE_NATURE")) {
final AlterTable alter = new AlterTable(tableRB);
alter.addBooleanColumn("AVANTAGE_NATURE", Boolean.FALSE, false);
final String req = alter.asString();
rootCommon.getDBSystemRoot().getDataSource().execute(req);
rootCommon.refetchTable(tableRB.getName());
rootCommon.getSchema().updateVersion();
conf.getRoot().getDBSystemRoot().getDataSource().execute(req);
conf.getRoot().refetchTable(tableRB.getName());
conf.getRoot().getSchema().updateVersion();
}
 
if (!tableRC.contains("LIGNE_PAYE_SIMPLIFIEE")) {
4355,9 → 4361,9
alter.addBooleanColumn("ALLEGEMENT_COTISATION", Boolean.FALSE, false);
alter.addVarCharColumn("LIGNE_PAYE_SIMPLIFIEE", 256);
final String req = alter.asString();
rootCommon.getDBSystemRoot().getDataSource().execute(req);
rootCommon.refetchTable(tableRC.getName());
rootCommon.getSchema().updateVersion();
conf.getRoot().getDBSystemRoot().getDataSource().execute(req);
conf.getRoot().refetchTable(tableRC.getName());
conf.getRoot().getSchema().updateVersion();
Map<String, String> liaison = new HashMap<String, String>();
liaison.put("COTCSA", LignePayeSimplifiee.SANTE_SECURITE.getId());
liaison.put("COTMALADIE", LignePayeSimplifiee.SANTE_SECURITE.getId());
4406,9 → 4412,9
liaison.put("COT_PENIBLE", LignePayeSimplifiee.AUTRES_CONTRIBUTIONS.getId());
 
SQLSelect sel = new SQLSelect();
sel.addSelect(rootCommon.findTable("RUBRIQUE_COTISATION").getField("CODE"));
sel.addSelect(rootCommon.findTable("RUBRIQUE_COTISATION").getField("NOM"));
sel.addSelect(rootCommon.findTable("RUBRIQUE_COTISATION").getKey());
sel.addSelect(conf.getRoot().findTable("RUBRIQUE_COTISATION").getField("CODE"));
sel.addSelect(conf.getRoot().findTable("RUBRIQUE_COTISATION").getField("NOM"));
sel.addSelect(conf.getRoot().findTable("RUBRIQUE_COTISATION").getKey());
List<SQLRow> rubCotis = SQLRowListRSH.execute(sel);
 
for (SQLRow sqlRow : rubCotis) {
4423,15 → 4429,15
}
}
 
final SQLTable tableRnet = rootCommon.getTable("RUBRIQUE_NET");
final SQLTable tableRnet = conf.getRoot().getTable("RUBRIQUE_NET");
 
if (!tableRnet.contains("NUMERO_COMPTE_PCE_CHARGES")) {
final AlterTable alter = new AlterTable(tableRnet);
alter.addVarCharColumn("NUMERO_COMPTE_PCE_CHARGES", 128);
final String req = alter.asString();
rootCommon.getDBSystemRoot().getDataSource().execute(req);
rootCommon.refetchTable(tableRnet.getName());
rootCommon.getSchema().updateVersion();
conf.getRoot().getDBSystemRoot().getDataSource().execute(req);
conf.getRoot().refetchTable(tableRnet.getName());
conf.getRoot().getSchema().updateVersion();
}
 
if (!tableRC.contains("PART_PAT_IMPOSABLE")) {
4438,9 → 4444,9
final AlterTable alter = new AlterTable(tableRC);
alter.addBooleanColumn("PART_PAT_IMPOSABLE", Boolean.FALSE, false);
final String req = alter.asString();
rootCommon.getDBSystemRoot().getDataSource().execute(req);
rootCommon.refetchTable(tableRC.getName());
rootCommon.getSchema().updateVersion();
conf.getRoot().getDBSystemRoot().getDataSource().execute(req);
conf.getRoot().refetchTable(tableRC.getName());
conf.getRoot().getSchema().updateVersion();
}
 
if (!tableRC.contains("REDUCTION_FILLON")) {
4447,21 → 4453,21
final AlterTable alter = new AlterTable(tableRC);
alter.addBooleanColumn("REDUCTION_FILLON", Boolean.FALSE, false);
final String req = alter.asString();
rootCommon.getDBSystemRoot().getDataSource().execute(req);
rootCommon.refetchTable(tableRC.getName());
rootCommon.getSchema().updateVersion();
conf.getRoot().getDBSystemRoot().getDataSource().execute(req);
conf.getRoot().refetchTable(tableRC.getName());
conf.getRoot().getSchema().updateVersion();
}
 
// Vérification des droits existants
checkRights(rootCommon);
checkRights(conf.getRoot());
 
if (!rootCommon.contains("DEVISE")) {
if (!conf.getRoot().contains("DEVISE")) {
System.out.println("InstallationPanel.InstallationPanel() ADD DEVISE");
try {
SQLUtils.executeAtomic(ds, new SQLUtils.SQLFactory<Object>() {
@Override
public Object create() throws SQLException {
final SQLCreateTable createDevise = new SQLCreateTable(rootCommon, "DEVISE");
final SQLCreateTable createDevise = new SQLCreateTable(conf.getRoot(), "DEVISE");
createDevise.addVarCharColumn("CODE", 128);
createDevise.addVarCharColumn("NOM", 128);
createDevise.addVarCharColumn("LIBELLE", 128);
4470,7 → 4476,7
createDevise.addDecimalColumn("TAUX_COMMERCIAL", 16, 8, BigDecimal.ONE, false);
ds.execute(createDevise.asString());
insertUndef(createDevise);
rootCommon.getSchema().updateVersion();
conf.getRoot().getSchema().updateVersion();
return null;
}
});
4477,8 → 4483,8
} catch (Exception ex) {
throw new IllegalStateException("Erreur lors de la création de la table DEVISE", ex);
}
} else if (!rootCommon.getTable("DEVISE").contains("TAUX_COMMERCIAL")) {
final SQLTable tDevise = rootCommon.getTable("DEVISE");
} else if (!conf.getRoot().getTable("DEVISE").contains("TAUX_COMMERCIAL")) {
final SQLTable tDevise = conf.getRoot().getTable("DEVISE");
final AlterTable alterDevise = new AlterTable(tDevise);
alterDevise.addDecimalColumn("TAUX_COMMERCIAL", 16, 8, BigDecimal.ONE, false);
ds.execute(alterDevise.asString());
4485,7 → 4491,7
tDevise.getSchema().updateVersion();
}
 
if (!rootCommon.contains("TYPE_MODELE")) {
if (!conf.getRoot().contains("TYPE_MODELE")) {
System.out.println("InstallationPanel.InstallationPanel() ADD TYPE_MODELE");
try {
SQLUtils.executeAtomic(ds, new SQLUtils.SQLFactory<Object>() {
4492,7 → 4498,7
 
@Override
public Object create() throws SQLException {
final SQLCreateTable createTypeModele = new SQLCreateTable(rootCommon, "TYPE_MODELE");
final SQLCreateTable createTypeModele = new SQLCreateTable(conf.getRoot(), "TYPE_MODELE");
createTypeModele.addVarCharColumn("NOM", 128);
createTypeModele.addVarCharColumn("TABLE", 128);
createTypeModele.addVarCharColumn("DEFAULT_MODELE", 128);
4500,9 → 4506,9
 
insertUndef(createTypeModele);
 
rootCommon.getSchema().updateVersion();
conf.getRoot().getSchema().updateVersion();
 
rootCommon.refetch();
conf.getRoot().refetch();
 
return null;
}
4512,7 → 4518,7
// ('FR', 'Français', 1.000), ('EN',
// 'Anglais', 2.000)
final List<String> values = new ArrayList<String>();
final SQLBase base = rootCommon.getBase();
final SQLBase base = conf.getRoot().getBase();
 
for (int i = 0; i < type.length; i += 3) {
final int order = values.size() + 1;
4519,8 → 4525,8
values.add("(" + base.quoteString(type[i]) + ", " + base.quoteString(type[i + 1]) + ", " + base.quoteString(type[i + 2]) + ", " + order + ")");
}
final String valuesStr = CollectionUtils.join(values, ", ");
final String insertVals = "INSERT INTO " + rootCommon.getTable("TYPE_MODELE").getSQLName().quote() + "(" + SQLBase.quoteIdentifier("NOM") + ", " + SQLBase.quoteIdentifier("TABLE")
+ ", " + SQLBase.quoteIdentifier("DEFAULT_MODELE") + ", " + SQLBase.quoteIdentifier(SQLSyntax.ORDER_NAME) + ") VALUES" + valuesStr;
final String insertVals = "INSERT INTO " + conf.getRoot().getTable("TYPE_MODELE").getSQLName().quote() + "(" + SQLBase.quoteIdentifier("NOM") + ", "
+ SQLBase.quoteIdentifier("TABLE") + ", " + SQLBase.quoteIdentifier("DEFAULT_MODELE") + ", " + SQLBase.quoteIdentifier(SQLSyntax.ORDER_NAME) + ") VALUES" + valuesStr;
 
ds.execute(insertVals);
} catch (Exception ex) {
4528,25 → 4534,64
}
}
 
SQLTable.setUndefID(rootCommon.getSchema(), "DEVISE", 1);
SQLTable.setUndefID(rootCommon.getSchema(), "TYPE_MODELE", 1);
SQLTable.setUndefID(conf.getRoot().getSchema(), "DEVISE", 1);
SQLTable.setUndefID(conf.getRoot().getSchema(), "TYPE_MODELE", 1);
 
// DSN
final DSNInstallationUtils dsnUtils = new DSNInstallationUtils();
dsnUtils.updateDSNCommonTable(rootCommon);
SQLRow rowRubNetPAS = createPasCommon(rootCommon);
dsnUtils.updateDSNCommonTable(conf.getRoot());
SQLRow rowRubNetPAS = createPasCommon(conf.getRoot());
// ECo contribution
final EcoContributionInstallationUtils ecoUtils = new EcoContributionInstallationUtils();
ecoUtils.updateEcoCommonTable(rootCommon);
ecoUtils.updateEcoCommonTable(conf.getRoot());
 
 
// we need to upgrade all roots
// ///////////////////////////
systemRoot.mapAllRoots();
systemRoot.refetch();
conf.getSystemRoot().mapAllRoots();
conf.getSystemRoot().refetch();
 
final Set<String> childrenNames = systemRoot.getChildrenNames();
// Merge IDCC
final SQLTable societeCommon = conf.getRoot().getTable("SOCIETE_COMMON");
if (!societeCommon.contains("ID_IDCC")) {
SQLCreateTable createIDCCCommon = new SQLCreateTable(conf.getRoot(), "IDCC");
createIDCCCommon.addVarCharColumn("CODE", 45, false, "''", true);
createIDCCCommon.addVarCharColumn("NOM", 2048, false, "''", true);
AddMDFields.addFields(createIDCCCommon, conf.getRoot().getTable("USER_COMMON"));
 
societeCommon.getDBRoot().createTable(createIDCCCommon);
societeCommon.getDBRoot().refetchTable("IDCC");
 
AlterTable alter = new AlterTable(societeCommon);
alter.addForeignColumn("ID_IDCC", conf.getRoot().getTable("IDCC"));
societeCommon.getDBRoot().getDBSystemRoot().getDataSource().execute(alter.asString());
societeCommon.getDBRoot().refetchTable("SOCIETE_COMMON");
 
}
final Set<String> childrenNames = conf.getSystemRoot().getChildrenNames();
MergeTable mergeIDCC = new MergeTable(conf.getRoot().getDBSystemRoot());
mergeIDCC.setDestTable(conf.getRoot().getTable("IDCC"));
 
final List<String> mdFields = Arrays.asList("ID_USER_COMMON_CREATE", "ID_USER_COMMON_MODIFY", "CREATION_DATE", "MODIFICATION_DATE");
for (final String childName : childrenNames) {
final DBRoot root = conf.getSystemRoot().getRoot(childName);
if (!root.getName().contains("Common") && root.contains("IDCC")) {
final SQLTable table = root.getTable("IDCC");
AlterTable alter = new AlterTable(table);
alter.alterColumnNullable("ARCHIVE", false);
// Drop MD Fields to be sure having same column properties
for (String field : mdFields) {
alter.dropColumn(field);
}
root.getDBSystemRoot().getDataSource().execute(alter.asString());
root.refetchTable("IDCC");
new AddMDFields(root.getDBSystemRoot()).change(table);
 
mergeIDCC.change(table);
}
}
// final Set<String> childrenNames = conf.getSystemRoot().getChildrenNames();
 
SwingUtilities.invokeLater(new Runnable() {
 
@Override
4568,9 → 4613,9
}
});
i++;
final DBRoot root = systemRoot.getRoot(childName);
final DBRoot root = conf.getSystemRoot().getRoot(childName);
try {
systemRoot.getDataSource().execute("CREATE LANGUAGE plpgsql;");
conf.getSystemRoot().getDataSource().execute("CREATE LANGUAGE plpgsql;");
} catch (Exception e) {
System.err.println("Warning: cannot add language plpgsql" + e.getMessage());
}
4601,7 → 4646,7
fixUnboundedNumeric(root);
fixCompletion(root);
try {
updateSocieteSchema(conf, root);
updateSocieteSchema(root);
} catch (Exception e) {
throw new SQLException(e);
}
/trunk/OpenConcerto/src/org/openconcerto/erp/config/DSNInstallationUtils.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
56,7 → 56,7
private void insertValues(List<Tuple2<String, String>> values, SQLTable table) throws SQLException {
SQLSelect sel = new SQLSelect();
sel.addSelect(table.getField("CODE"));
List<String> codes = (List<String>) table.getDBSystemRoot().getDataSource().executeA(sel.asString());
List<String> codes = (List<String>) table.getDBSystemRoot().getDataSource().executeCol(sel.asString());
for (Tuple2<String, String> tuple2 : values) {
if (!codes.contains(tuple2.get0())) {
SQLRowValues rowVals = new SQLRowValues(table);
86,6 → 86,14
root.getSchema().updateVersion();
}
 
if (!societeCommonT.contains("ORG_PROTECTION_SOCIAL_ID")) {
AlterTable t = new AlterTable(societeCommonT);
t.addVarCharColumn("ORG_PROTECTION_SOCIAL_ID", 256);
root.getBase().getDataSource().execute(t.asString());
root.refetchTable("SOCIETE_COMMON");
root.getSchema().updateVersion();
}
 
SQLTable tableRubCot = root.getTable("RUBRIQUE_COTISATION");
if (!tableRubCot.contains("ASSIETTE_PLAFONNEE")) {
AlterTable tableRub = new AlterTable(tableRubCot);
187,7 → 195,6
}
}
 
 
if (!root.contains("TYPE_PREAVIS")) {
final SQLCreateTable createTableMotif = new SQLCreateTable(root, "TYPE_PREAVIS");
createTableMotif.addVarCharColumn("CODE", 25);
1037,6 → 1044,7
v.add(Tuple2.create("102", "Cotisation Allocation Familiale - taux réduit"));
v.add(Tuple2.create("103", "Contribution actions gratuites"));
v.add(Tuple2.create("226", "Assiette du Versement Transport"));
 
v.add(Tuple2.create("901", "Cotisation épargne retraite"));
 
insertValues(v, table);
1351,8 → 1359,39
final SQLTable tableCotInd = root.getTable("CODE_COTISATION_INDIVIDUELLE");
List<Tuple2<String, String>> vCodeIndiv = new ArrayList<>();
vCodeIndiv.add(Tuple2.create("104", "Pénibilité Cotisation de base"));
vCodeIndiv.add(Tuple2.create("105", "Montant de cotisation Régime Unifié Agirc-Arrco y compris Apec"));
vCodeIndiv.add(Tuple2.create("106", "Réduction générale des cotisations patronales Agirc-Arrco"));
vCodeIndiv.add(Tuple2.create("105", " Montant de cotisation Régime Unifié Agirc Arrco, y compris Apec"));
vCodeIndiv.add(Tuple2.create("106", " Réduction générale des cotisations patronales de retraite complémentaire"));
vCodeIndiv.add(Tuple2.create("107", " Forfait marin"));
vCodeIndiv.add(Tuple2.create("108", " Demi rôle marin"));
vCodeIndiv.add(Tuple2.create("109", " Exonération de cotisations salariales de retraite complémentaire au titre de l'emploi d'un apprenti"));
vCodeIndiv.add(Tuple2.create("110", " Exonération de cotisations patronales de retraite complémentaire applicable dans les DOM (LODEOM) SMIC 130% à 220%"));
vCodeIndiv.add(Tuple2.create("111", " Exonération de cotisations de retraite complémentaire applicable aux entreprises et associations d'aide à domicile"));
vCodeIndiv.add(Tuple2.create("112", " Exonération de cotisations patronales de retraite complémentaire applicable dans les DOM (LODEOM) SMIC 170% à 270%"));
vCodeIndiv.add(Tuple2.create("113", " Exonération de cotisations patronales de retraite complémentaire applicable dans les DOM (LODEOM) SMIC 170% à 350%"));
vCodeIndiv.add(Tuple2.create("114", " Montant de réduction des heures supplémentaires/complémentaires"));
vCodeIndiv.add(Tuple2.create("115", " Cotisation Assurance Maladie pour le Régime Local Alsace Moselle"));
vCodeIndiv.add(Tuple2.create("116", " Cotisation absente de la norme en cas de régularisation prud'homale"));
vCodeIndiv.add(Tuple2.create("128", " Contribution à la formation professionnelle (CFP)"));
vCodeIndiv.add(Tuple2.create("129", " Contribution dédiée au financement du Compte Professionnel de Formation pour les titulaires de CDD (CPFCDD)"));
vCodeIndiv.add(Tuple2.create("130", " Part principale de la taxe d'apprentissage"));
vCodeIndiv.add(Tuple2.create("131", " Cotisation régime unifié Agirc Arrco"));
vCodeIndiv.add(Tuple2.create("132", " Cotisation Apec"));
vCodeIndiv.add(Tuple2.create("133", " Contribution maladie spécifique Mayotte"));
vCodeIndiv.add(Tuple2.create("902", " Contribution à la formation professionnelle des Artisans assimilés salariés"));
vCodeIndiv.add(Tuple2.create("903", " Cotisation AFNCA"));
vCodeIndiv.add(Tuple2.create("904", " Cotisation ANEFA"));
vCodeIndiv.add(Tuple2.create("905", " Cotisation ASCPA"));
vCodeIndiv.add(Tuple2.create("906", " Cotisation PROVEA"));
vCodeIndiv.add(Tuple2.create("907", " Complément de cotisation Assurance Maladie"));
vCodeIndiv.add(Tuple2.create("908", " Taxe forfaitaire CDDU Assurance Chômage"));
vCodeIndiv.add(Tuple2.create("909", " Cotisation au titre du financement des régimes de retraites supplémentaires à prestation définies"));
vCodeIndiv.add(Tuple2.create("910", " Exonération de cotisations patronales pour les entreprises affectées par la crise sanitaire"));
vCodeIndiv.add(Tuple2.create("911", " Réduction de cotisations patronales pour les entreprises du secteur de la vigne affectées par la crise sanitaire"));
vCodeIndiv.add(Tuple2.create("912", " Exonération du forfait social à 10%"));
vCodeIndiv.add(Tuple2.create("913", " Potentielle nouvelle cotisation C"));
vCodeIndiv.add(Tuple2.create("914", " Potentielle nouvelle cotisation A"));
vCodeIndiv.add(Tuple2.create("915", " Potentielle nouvelle cotisation B"));
 
insertValues(vCodeIndiv, tableCotInd);
 
final SQLTable tableCTP = root.getTable("CODE_CAISSE_TYPE_RUBRIQUE");
1360,6 → 1399,40
vCTP.add(Tuple2.create("003", "Réduction cotisations salariale heures supplémentaires"));
vCTP.add(Tuple2.create("510", "Prime exceptionnelle de pouvoir d’achat"));
vCTP.add(Tuple2.create("060", "RR Chômage CSG-CRDS taux plein"));
vCTP.add(Tuple2.create("917", "MOBILITE ADD JOURNALISTE TX MINO 20%"));
vCTP.add(Tuple2.create("920", "EMPL AGRIC (1500 TONNES CANNE) RMI OM"));
vCTP.add(Tuple2.create("921", "MOBILITE ARTISTES TX MINORE 30%"));
vCTP.add(Tuple2.create("922", "ENTR.DE PRODUCTION D ELECTRICITE"));
vCTP.add(Tuple2.create("922", "ENTR.DE PRODUCTION D ELECTRICITE"));
vCTP.add(Tuple2.create("926", "AT SEULEMENT - GESTION TOTALE"));
vCTP.add(Tuple2.create("927", "MOBILITE ADD ARTISTES TX MINO 30%"));
vCTP.add(Tuple2.create("936", "CNIEG PRESTATION COMPL. INVALIDITE"));
vCTP.add(Tuple2.create("937", "COTISATIONS AGS CAS GENERAL U2"));
vCTP.add(Tuple2.create("938", "CONTRATS AIDES ATELIER INSERTION"));
vCTP.add(Tuple2.create("939", "ATELIER INSERTION MAYOTTE"));
vCTP.add(Tuple2.create("939", "ATELIER INSERTION MAYOTTE"));
vCTP.add(Tuple2.create("940", "CNIEG DROITS SPE. PASSES NON REGULES"));
vCTP.add(Tuple2.create("948", "CONTRAT EMPLOI SOLIDARITE"));
vCTP.add(Tuple2.create("950", "CONTRAT EMPLOI SOLIDARITE CAS PART"));
vCTP.add(Tuple2.create("951", "CONTRATS EMPLOI SOLIDARITE CAS PART"));
vCTP.add(Tuple2.create("952", "CONTRAT EMPLOI CONSOLIDE CAS GENERAL"));
vCTP.add(Tuple2.create("954", "CONTRAT EMPLOI CONSOLIDE CAS PART"));
vCTP.add(Tuple2.create("955", "CNIEG PETIT POOL"));
vCTP.add(Tuple2.create("959", "CFP ENTREPRISE < 11 SALARIES"));
vCTP.add(Tuple2.create("967", "CONTR.ROYALTIES ART.ET MANNEQUINS"));
vCTP.add(Tuple2.create("969", "COT.MAL.ROYALTIES ART.ETRANGER"));
vCTP.add(Tuple2.create("971", "CFP ENTREPRISE >= 11 SALARIES"));
vCTP.add(Tuple2.create("983", "CFP INTERMITTENTS DU SPECTACLE"));
vCTP.add(Tuple2.create("985", "PENALITE PENIBILITE"));
vCTP.add(Tuple2.create("987", "CONTRIBUTION CPF CDD "));
vCTP.add(Tuple2.create("992", "TA PRINCIPALE HORS ALSACE MOSELLE"));
vCTP.add(Tuple2.create("993", "TA ALSACE MOSELLE"));
vCTP.add(Tuple2.create("994", "TA DEDUCTION CFA ET OFFRE NOUVELLE"));
vCTP.add(Tuple2.create("995", "TA - SOLDE VERSEMENT LIBERATOIRE"));
vCTP.add(Tuple2.create("995", "TA - SOLDE VERSEMENT LIBERATOIRE"));
vCTP.add(Tuple2.create("996", "TA - DEDUCTION AU SOLDE CFA"));
vCTP.add(Tuple2.create("997", "TA - DEDUCTION SOLDE CREANCE ALTERN"));
vCTP.add(Tuple2.create("998", "CSA CONTRIBUTION ANNUELLE"));
insertValues(vCTP, tableCTP);
 
final SQLTable tableTypeBrut = root.getTable("CODE_TYPE_RUBRIQUE_BRUT");
1369,11 → 1442,94
vbrutType.add(Tuple3.create("018", "Heures supplémentaires structurelles", DsnTypeCodeBrut.REMUNERATION.getName()));
vbrutType.add(Tuple3.create("019", "Heures d'activité partielle", DsnTypeCodeBrut.REMUNERATION.getName()));
vbrutType.add(Tuple3.create("020", "Heures affectées à un travail d’aide à domicile de publics fragiles", DsnTypeCodeBrut.REMUNERATION.getName()));
 
vbrutType.add(Tuple3.create("021", "[FP] Taux de rémunération de la situation administrative", DsnTypeCodeBrut.REMUNERATION.getName()));
vbrutType.add(Tuple3.create("022", "Potentiel nouveau type de rémunération B", DsnTypeCodeBrut.REMUNERATION.getName()));
vbrutType.add(Tuple3.create("023", "Potentiel nouveau type de rémunération C", DsnTypeCodeBrut.REMUNERATION.getName()));
vbrutType.add(Tuple3.create("025", "Heures correspondant à du chômage intempéries", DsnTypeCodeBrut.REMUNERATION.getName()));
vbrutType.add(Tuple3.create("026", "Heures supplémentaires exonérées", DsnTypeCodeBrut.REMUNERATION.getName()));
vbrutType.add(Tuple3.create("027", "Potentiel nouveau type de rémunération A", DsnTypeCodeBrut.REMUNERATION.getName()));
 
DsnBrutCode dsnBurCode = new DsnBrutCode();
dsnBurCode.updateTable(vbrutType, tableTypeBrut);
 
// P21
final SQLTable tableArret = root.getTable("MOTIF_ARRET_TRAVAIL");
List<Tuple2<String, String>> vArret = new ArrayList<Tuple2<String, String>>();
vArret.add(Tuple2.create("09", "adoption"));
vArret.add(Tuple2.create("15", "temps partiel thérapeutique (risque maladie)"));
vArret.add(Tuple2.create("16", "temps partiel thérapeutique (risque accident de travail)"));
vArret.add(Tuple2.create("17", "temps partiel thérapeutique (risque accident de trajet)"));
vArret.add(Tuple2.create("18", "temps partiel thérapeutique (risque maladie professionnelle)"));
insertValues(vArret, tableArret);
 
if (!root.contains("CODE_CAISSE_CONGES_PAYES")) {
final SQLCreateTable createTableCode = new SQLCreateTable(root, "CODE_CAISSE_CONGES_PAYES");
createTableCode.addVarCharColumn("CODE", 25);
createTableCode.addVarCharColumn("NOM", 512);
 
try {
root.getBase().getDataSource().execute(createTableCode.asString());
insertUndef(createTableCode);
root.refetchTable("CODE_CAISSE_CONGES_PAYES");
root.getSchema().updateVersion();
 
} catch (SQLException ex) {
throw new IllegalStateException("Erreur lors de la création de la table " + "CODE_CAISSE_CONGES_PAYES", ex);
}
}
 
if (!root.contains("MOTIF_NON_ASSUJETIS_TA")) {
final SQLCreateTable createTableCode = new SQLCreateTable(root, "MOTIF_NON_ASSUJETIS_TA");
createTableCode.addVarCharColumn("CODE", 25);
createTableCode.addVarCharColumn("NOM", 512);
 
try {
root.getBase().getDataSource().execute(createTableCode.asString());
insertUndef(createTableCode);
root.refetchTable("MOTIF_NON_ASSUJETIS_TA");
root.getSchema().updateVersion();
 
final SQLTable tableMotif = root.getTable("MOTIF_NON_ASSUJETIS_TA");
List<Tuple2<String, String>> vMotif = new ArrayList<Tuple2<String, String>>();
vMotif.add(Tuple2.create("001", "Non assujetti par choix du régime fiscal (option IR en catégorie BNC)"));
vMotif.add(Tuple2.create("002", "Collectivités publiques"));
vMotif.add(Tuple2.create("003", "Etablissements publics de recherche et les établissements publics d'enseignement supérieurs"));
vMotif.add(Tuple2.create("004", "Personnes morales créées pour la gestion d'un pôle de recherche et d'enseignement supérieur ou d'un réseau thématique de recherche avancée"));
vMotif.add(Tuple2.create("005", "Fondations reconnues d'utilité public du secteur de la recherche"));
vMotif.add(Tuple2.create("006", "Sociétés et personnes morales ayant pour objet exclusif l'enseignement"));
vMotif.add(Tuple2.create("007", "Associations sans but lucratif"));
vMotif.add(Tuple2.create("008", "Syndicats professionnels"));
vMotif.add(Tuple2.create("009", "Entreprises sans établissement en France (ESEF)"));
vMotif.add(Tuple2.create("010", "Sociétés civiles de moyens (SCM) non commerciale"));
vMotif.add(Tuple2.create("011", "Personnes physiques ou morales assujetties aux BNC ou BA"));
vMotif.add(Tuple2.create("012", "Les coopératives agricoles"));
vMotif.add(Tuple2.create("013", "Les coopératives artisanales, transport (y compris fluvial et maritime) et leurs unions"));
vMotif.add(Tuple2.create("014", "Les groupements d'employeurs dont agricoles"));
vMotif.add(Tuple2.create("015", "Les sociétés civiles agricoles"));
vMotif.add(Tuple2.create("016", "Les mutuelles et organismes mutualistes"));
vMotif.add(Tuple2.create("017",
"Les organismes HLM, SA de crédit immobilier (I et au II de l'article L. 422-4 du code de la construction et de l'habitation ) et unions d'économie sociale"));
vMotif.add(Tuple2.create("018", "Les sociétés coopératives de construction désignées à l'article L. 432-2 du code de la construction et de l'habitation."));
vMotif.add(Tuple2.create("019", "Organismes chargés de l'organisation en France d'une compétition sportive internationale en France (Article L6131-1 du code du travail)"));
 
insertValues(vMotif, tableMotif);
} catch (SQLException ex) {
throw new IllegalStateException("Erreur lors de la création de la table " + "MOTIF_NON_ASSUJETIS_TA", ex);
}
}
if (!societeCommonT.contains("ASSUJETTISSEMENT_TA")) {
AlterTable alterSoc = new AlterTable(societeCommonT);
alterSoc.addBooleanColumn("ASSUJETTISSEMENT_TA", Boolean.TRUE, false);
alterSoc.addBooleanColumn("ASSUJETTISSEMENT_CFP", Boolean.TRUE, false);
alterSoc.addBooleanColumn("ASSUJETTISSEMENT_CFP_CDD", Boolean.TRUE, false);
alterSoc.addForeignColumn("ID_MOTIF_NON_ASSUJETIS_TA", root.findTable("MOTIF_NON_ASSUJETIS_TA"));
 
root.getBase().getDataSource().execute(alterSoc.asString());
root.getSchema().updateVersion();
}
}
 
public void updateDSN(final DBRoot root) throws SQLException {
final SQLTable tableCodeStatutCat = root.getTable("CODE_STATUT_CATEGORIEL");
SQLRow rowNonCadre = tableCodeStatutCat.getRow(4);
1882,6 → 2038,35
throw new IllegalStateException("Erreur lors de la création de la table " + "CODE_PENIBILITE_CONTRAT_SALARIE", ex);
}
}
 
if (!root.contains("ARRET_CHOMAGE_INTEMPERIE")) {
 
final SQLCreateTable createTableSal = new SQLCreateTable(root, "ARRET_CHOMAGE_INTEMPERIE");
final SQLTable tableInfosSalarie = root.getTable("INFOS_SALARIE_PAYE");
createTableSal.addForeignColumn("ID_INFOS_SALARIE_PAYE", tableInfosSalarie);
createTableSal.addForeignColumn("ID_CODE_AMENAGEMENT_PARTIEL", root.findTable("CODE_AMENAGEMENT_PARTIEL"));
createTableSal.addForeignColumn("ID_CODE_SUSPENSION", root.findTable("CODE_SUSPENSION"));
createTableSal.addColumn("DATE_DEBUT_SUSPENSION", "date");
createTableSal.addColumn("DATE_FIN_SUSPENSION", "date");
 
try {
root.getBase().getDataSource().execute(createTableSal.asString());
insertUndef(createTableSal);
root.refetchTable("ARRET_CHOMAGE_INTEMPERIE");
root.getSchema().updateVersion();
} catch (SQLException ex) {
throw new IllegalStateException("Erreur lors de la création de la table " + "ARRET_CHOMAGE_INTEMPERIE", ex);
}
}
 
if (!tableContrat.contains("ID_CODE_CAISSE_CONGES_PAYES")) {
AlterTable alterContrat = new AlterTable(tableContrat);
alterContrat.addForeignColumn("ID_CODE_CAISSE_CONGES_PAYES", root.findTable("CODE_CAISSE_CONGES_PAYES"));
alterContrat.addDecimalColumn("TAUX_FRAIS_PROFESSIONNELS", 16, 4, null, true);
root.getBase().getDataSource().execute(alterContrat.asString());
root.getSchema().updateVersion();
}
 
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/config/MenuManager.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
24,10 → 24,14
public class MenuManager {
private static MenuManager instance = null;
 
public static synchronized final void setInstance(final MenuAndActions baseMA) {
instance = new MenuManager(baseMA);
public static final void setInstance(final MenuAndActions baseMA) {
setInstance(new MenuManager(baseMA));
}
 
public static synchronized final void setInstance(final MenuManager mm) {
instance = mm;
}
 
public static synchronized final MenuManager getInstance() {
if (instance == null)
throw new IllegalStateException("Not inited");
/trunk/OpenConcerto/src/org/openconcerto/erp/config/MainFrame.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
33,6 → 33,7
 
import java.awt.Color;
import java.awt.Container;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
43,6 → 44,9
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
75,6 → 79,10
public static final String FILE_MENU = "menu.file";
public static final String HELP_MENU = "menu.help";
 
public static final String PREFS_MENU_ITEM = "preferences";
public static final String QUIT_MENU_ITEM = "quit";
public static final String ABOUT_MENU_ITEM = "information";
 
static private final List<Runnable> runnables = new ArrayList<Runnable>();
@GuardedBy("MainFrame")
static private MainFrame instance = null;
185,8 → 193,6
final File confFile = new File(conf.getConfDir(), "Configuration" + File.separator + "Frame" + File.separator + "mainFrame" + confSuffix + ".xml");
new WindowStateManager(this, confFile).loadState();
 
registerForMacOSXEvents();
 
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent arg0) {
211,10 → 217,10
if (im != null) {
image.setImage(im);
}
new NewsUpdater(this.image);
 
}
 
// create the UI menu from the menu manager
// create the UI menu from the MenuAndActions and hide items handled by java.awt.Desktop
public final void initMenuBar() {
final MenuManager mm = MenuManager.getInstance();
final PropertyChangeListener listener = new PropertyChangeListener() {
382,10 → 388,59
MenuUtils.removeMenuItem(item);
}
 
public void registerDesktopEvents(final MenuAndActions menuAndActions) {
// First try standard >=9 way, otherwise fall back to com.apple.eawt.Application
if (!this.registerAWTDesktopEvents(menuAndActions))
this.registerForMacOSXEvents(menuAndActions);
}
 
private boolean registerAWTDesktopEvents(final MenuAndActions menuAndActions) {
if (!Desktop.isDesktopSupported())
return false;
final Desktop desktop = Desktop.getDesktop();
final boolean quitHandled = registerAWTDesktopEvent(desktop, "QuitHandler", "APP_QUIT_HANDLER", menuAndActions, QUIT_MENU_ITEM);
final boolean aboutHandled = registerAWTDesktopEvent(desktop, "AboutHandler", "APP_ABOUT", menuAndActions, ABOUT_MENU_ITEM);
final boolean prefsHandled = registerAWTDesktopEvent(desktop, "PreferencesHandler", "APP_PREFERENCES", menuAndActions, PREFS_MENU_ITEM);
return quitHandled && aboutHandled && prefsHandled;
}
 
private boolean registerAWTDesktopEvent(final Desktop desktop, final String handlerClassName, final String desktopActionName, final MenuAndActions menuAndActions, final String menuActionName) {
final Desktop.Action appPrefsAction;
try {
appPrefsAction = Desktop.Action.valueOf(desktopActionName);
} catch (Exception e) {
// JRE <9, fallback to the old way
return false;
}
if (!desktop.isSupported(appPrefsAction)) {
// JRE >= 9, but not supported
return false;
}
try {
final Class<?> prefHandlerClass = Class.forName("java.awt.desktop." + handlerClassName);
final Object prefHandler = Proxy.newProxyInstance(prefHandlerClass.getClassLoader(), new Class<?>[] { prefHandlerClass }, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
menuAndActions.getAction(menuActionName).actionPerformed(null);
return null;
}
});
desktop.getClass().getMethod("set" + handlerClassName, prefHandlerClass).invoke(desktop, prefHandler);
menuAndActions.setMenuItemVisible(menuActionName, false);
return true;
} catch (Exception e) {
// Unknown error, still try to fallback to the old way
e.printStackTrace();
return false;
}
}
 
// Generic registration with the Mac OS X application menu
// Checks the platform, then attempts to register with the Apple EAWT
// See OSXAdapter.java to see how this is done without directly referencing any Apple APIs
public void registerForMacOSXEvents() {
// Remove once depending on Java 11.
@Deprecated
public void registerForMacOSXEvents(final MenuAndActions menuAndActions) {
if (Gestion.MAC_OS_X) {
try {
// Generate and register the OSXAdapter, passing it a hash of all the methods we
393,6 → 448,9
OSXAdapter.setQuitHandler(this, getClass().getDeclaredMethod("quit", new Class[0]));
OSXAdapter.setAboutHandler(this, getClass().getDeclaredMethod("about", new Class[0]));
OSXAdapter.setPreferencesHandler(this, getClass().getDeclaredMethod("preferences", new Class[0]));
menuAndActions.setMenuItemVisible(QUIT_MENU_ITEM, false);
menuAndActions.setMenuItemVisible(ABOUT_MENU_ITEM, false);
menuAndActions.setMenuItemVisible(PREFS_MENU_ITEM, false);
// no OSXAdapter.setFileHandler() for now
} catch (Exception e) {
System.err.println("Error while loading the OSXAdapter:");
402,12 → 460,14
}
 
// used by OSXAdapter
@Deprecated
public final void preferences() {
MenuManager.getInstance().getActionForId("preferences").actionPerformed(null);
MenuManager.getInstance().getActionForId(PREFS_MENU_ITEM).actionPerformed(null);
}
 
@Deprecated
public final void about() {
MenuManager.getInstance().getActionForId("information").actionPerformed(null);
MenuManager.getInstance().getActionForId(ABOUT_MENU_ITEM).actionPerformed(null);
}
 
public boolean quit() {
/trunk/OpenConcerto/src/org/openconcerto/erp/config/ComptaPropsConfiguration.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
83,6 → 83,7
import org.openconcerto.erp.core.humanresources.employe.element.ObjectifSQLElement;
import org.openconcerto.erp.core.humanresources.employe.element.SituationFamilialeSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.AcompteSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.ArretChomageIntemperieSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.AyantDroitContratPrevSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.AyantDroitSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.AyantDroitTypeSQLElement;
92,6 → 93,7
import org.openconcerto.erp.core.humanresources.payroll.element.ClassementConventionnelSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.CodeAmenagementPartielSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.CodeBaseAssujettieSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.CodeCaisseCongesPayesSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.CodeCaisseTypeRubriqueSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.CodeCaractActiviteSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.CodeContratTravailSQLElement;
131,6 → 133,7
import org.openconcerto.erp.core.humanresources.payroll.element.ModeReglementPayeSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.MotifArretTravailSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.MotifFinContratSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.MotifNonAssujettisTASQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.MotifRepriseArretTravailSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.PasSQLElement;
import org.openconcerto.erp.core.humanresources.payroll.element.PeriodeValiditeSQLElement;
171,11 → 174,14
import org.openconcerto.erp.core.sales.pos.element.TicketCaisseSQLElement;
import org.openconcerto.erp.core.sales.pos.io.BarcodeReader;
import org.openconcerto.erp.core.sales.price.element.DeviseSQLElement;
import org.openconcerto.erp.core.sales.price.element.TarifPromotionSQLElement;
import org.openconcerto.erp.core.sales.price.element.TarifSQLElement;
import org.openconcerto.erp.core.sales.product.element.ArticleCatComptableSQLElement;
import org.openconcerto.erp.core.sales.product.element.ArticleCodeClientSQLElement;
import org.openconcerto.erp.core.sales.product.element.ArticleDeclinaisonSQLElement;
import org.openconcerto.erp.core.sales.product.element.ArticleDesignationSQLElement;
import org.openconcerto.erp.core.sales.product.element.ArticleFournisseurSecondaireSQLElement;
import org.openconcerto.erp.core.sales.product.element.ArticleTarifPromotionSQLElement;
import org.openconcerto.erp.core.sales.product.element.ArticleTarifSQLElement;
import org.openconcerto.erp.core.sales.product.element.CoutRevientSQLElement;
import org.openconcerto.erp.core.sales.product.element.CustomerProductFamilyQtyPriceSQLElement;
183,6 → 189,7
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;
import org.openconcerto.erp.core.sales.product.element.LotSQLElement;
import org.openconcerto.erp.core.sales.product.element.MetriqueSQLElement;
import org.openconcerto.erp.core.sales.product.element.ModeVenteArticleSQLElement;
import org.openconcerto.erp.core.sales.product.element.ProductItemSQLElement;
191,6 → 198,7
import org.openconcerto.erp.core.sales.product.element.ReliquatSQLElement;
import org.openconcerto.erp.core.sales.product.element.ReliquatSQLElement.ReliquatBRSQLElement;
import org.openconcerto.erp.core.sales.product.element.SupplierPriceListSQLElement;
import org.openconcerto.erp.core.sales.product.element.TaxeCatComptableSQLElement;
import org.openconcerto.erp.core.sales.product.element.UniteVenteArticleSQLElement;
import org.openconcerto.erp.core.sales.quote.element.DevisItemSQLElement;
import org.openconcerto.erp.core.sales.quote.element.DevisLogMailSQLElement;
254,7 → 262,9
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.QteLineDocProvider;
import org.openconcerto.erp.generationDoc.provider.QteTotalDocProvider;
import org.openconcerto.erp.generationDoc.provider.QteTotalLineDocProvider;
import org.openconcerto.erp.generationDoc.provider.QteTotalProvider;
import org.openconcerto.erp.generationDoc.provider.RecapFactureProvider;
import org.openconcerto.erp.generationDoc.provider.RefClientValueProvider;
292,6 → 302,7
import org.openconcerto.erp.injector.DevisBlSQLInjector;
import org.openconcerto.erp.injector.DevisCommandeFournisseurSQLInjector;
import org.openconcerto.erp.injector.DevisCommandeSQLInjector;
import org.openconcerto.erp.injector.DevisEltCmdEltSQLInjector;
import org.openconcerto.erp.injector.DevisEltFactureEltSQLInjector;
import org.openconcerto.erp.injector.DevisFactureSQLInjector;
import org.openconcerto.erp.injector.DmdAchatDmdPrixEltSQLInjector;
357,6 → 368,7
import java.util.Collection;
import java.util.List;
import java.util.Properties;
import java.util.Set;
 
import javax.imageio.ImageIO;
import javax.swing.JFrame;
438,7 → 450,8
// b/ dans le jar
try {
final Properties props;
// webstart should be self-contained, e.g. if a user launches from the web it shoudln't
// webstart should be self-contained, e.g. if a user launches from the web it
// shoudln't
// read an old preference file but should always read its own configuration.
if (confFile != null && confFile.exists() && !inWebStart) {
props = create(new FileInputStream(confFile), defaults);
474,6 → 487,7
private File portableDir = null;
private Currency currency = null;
private final ModuleManager moduleMngr = new ModuleManager();
private boolean isExperimental;
 
public ComptaPropsConfiguration(Properties props, final ProductInfo productInfo) {
super(props, productInfo);
488,6 → 502,7
this.isMain = main;
this.inWebstart = inWebstart;
this.isPortable = Boolean.parseBoolean(this.getProperty("portable", "false"));
this.isExperimental = Boolean.parseBoolean(this.getProperty("experimental", "false"));
String pDir = this.getProperty("portableDir", null);
if (isPortable) {
if (pDir == null) {
577,10 → 592,11
}
this.setProperty("server.ip", getProperty("server.ip").replace(DATA_DIR_VAR, getDataDir().getPath()));
final SQLSystem system = getSystem();
this.isServerless = system == SQLSystem.H2 && system.getHostname(getServerIp()) == null;
this.isServerless = system == SQLSystem.H2 && system.getHostnameAndPath(getServerIp()).get0() == null;
}
if (this.isMain) {
// ATTN this works because this is executed last (i.e. if you put this in a superclass
// ATTN this works because this is executed last (i.e. if you put this in a
// superclass
// this won't work since e.g. app.name won't have its correct value)
try {
this.setupLogging("logs");
590,6 → 606,10
registerAccountingProvider();
registerCellValueProvider();
}
 
// Early so that other apps may add jars before setUpSocieteDataBaseConnexion()
// Perhaps add a folder relative to VMLauncher.getJPackageAppDir()
this.getModuleManager().setFolders(new File(Gestion.MODULES_DIR_NAME), new File(this.getBaseDirs().getAppDataFolder(), Gestion.MODULES_DIR_NAME));
}
 
public final TM getERP_TM() {
622,6 → 642,8
AdresseVilleNomClientValueProvider.register();
AdresseFullClientValueProvider.register();
QteTotalProvider.register();
QteLineDocProvider.register();
QteTotalLineDocProvider.register();
QteTotalDocProvider.register();
StockLocationProvider.register();
RefClientValueProvider.register();
657,6 → 679,10
return getProperty("token");
}
 
public boolean isExperimental() {
return isExperimental;
}
 
public final boolean isServerless() {
return this.isServerless;
}
722,7 → 748,8
return;
try {
// H2 create the database on connection
// don't create if root explicitly excluded (e.g. map no roots just to quickly test
// don't create if root explicitly excluded (e.g. map no roots just to quickly
// test
// connection)
if (sysRoot.shouldMap(getRootName()) && !sysRoot.contains(getRootName())) {
Log.get().warning("Creating DB");
749,8 → 776,10
@Override
protected DBSystemRoot createSystemRoot() {
final DBSystemRoot res = super.createSystemRoot();
// Don't create a separate server for createDB() as on normal databases just setting up a
// data source can take 2 seconds (e.g. validateConnectionFactory()). And this is for every
// Don't create a separate server for createDB() as on normal databases just
// setting up a
// data source can take 2 seconds (e.g. validateConnectionFactory()). And this
// is for every
// boot.
this.createDB(res);
return res;
777,6 → 806,8
dir.addSQLElement(CodeBaseAssujettieSQLElement.class, root);
dir.addSQLElement(ContratModaliteTempsSQLElement.class, root);
dir.addSQLElement(CodeCaisseTypeRubriqueSQLElement.class, root);
dir.addSQLElement(CodeCaisseCongesPayesSQLElement.class, root);
dir.addSQLElement(MotifNonAssujettisTASQLElement.class, root);
dir.addSQLElement(CodeTypeRubriqueBrutSQLElement.class, root);
dir.addSQLElement(MotifArretTravailSQLElement.class, root);
dir.addSQLElement(ContratDispositifPolitiqueSQLElement.class, root);
816,6 → 847,8
dir.addSQLElement(CodeCotisationIndividuelleSQLElement.class, root);
dir.addSQLElement(CodeCotisationEtablissementSQLElement.class, root);
dir.addSQLElement(CodePenibiliteSQLElement.class, root);
dir.addSQLElement(CodeIdccSQLElement.class, root);
 
dir.addSQLElement(new ImpressionRubriqueSQLElement(root));
 
dir.addSQLElement(new VariablePayeSQLElement(root));
831,8 → 864,15
}
// Check 1.6 updated
if (!this.getRootSociete().contains("ETAT_STOCK")) {
throw new DBStructureItemNotFound("Base de données non à jour");
throw new DBStructureItemNotFound("Base de données non à jour (<1.6)");
}
// Check 1.7 updated
if (!this.getRootSociete().contains("AGENCE")) {
throw new DBStructureItemNotFound("Base de données non à jour (< 1.7.0)");
}
if (!this.getRootSociete().getTable("NUMEROTATION_AUTO").contains("ARTICLE_FORMAT")) {
throw new DBStructureItemNotFound("Base de données non à jour (< 1.7.1)");
}
SQLElementDirectory dir = this.getDirectory();
 
dir.addSQLElement(AttachmentSQLElement.class);
849,6 → 889,7
dir.addSQLElement(ProductItemSQLElement.class);
dir.addSQLElement(CategorieComptableSQLElement.class);
dir.addSQLElement(ArticleCatComptableSQLElement.class);
dir.addSQLElement(TaxeCatComptableSQLElement.class);
dir.addSQLElement(ArticleFournisseurSecondaireSQLElement.class);
dir.addSQLElement(SupplierPriceListSQLElement.class);
dir.addSQLElement(FraisDocumentSQLElement.class);
886,7 → 927,14
dir.addSQLElement(new AcompteSQLElement());
 
dir.addSQLElement(new AxeAnalytiqueSQLElement());
Set<SQLTable> tablesInRoot = dir.getElement(ReferenceArticleSQLElement.class).getTable().getDBRoot().getTables();
for (SQLTable table : tablesInRoot) {
if (table.getName().startsWith("ARTICLE_DECLINAISON_")) {
dir.addSQLElement(new ArticleDeclinaisonSQLElement(table.getName()));
}
}
 
dir.addSQLElement(LotSQLElement.class);
dir.addSQLElement(new BonDeLivraisonItemSQLElement());
dir.addSQLElement(new BonDeLivraisonSQLElement());
dir.addSQLElement(new TransferShipmentSQLElement());
972,8 → 1020,6
 
dir.addSQLElement(new FournisseurSQLElement());
 
dir.addSQLElement(new CodeIdccSQLElement());
 
dir.addSQLElement(new InfosSalariePayeSQLElement());
 
dir.addSQLElement(new JournalSQLElement());
1021,10 → 1067,9
dir.addSQLElement(SituationFamilialeSQLElement.class);
dir.addSQLElement(new StockSQLElement());
dir.addSQLElement(new StyleSQLElement());
 
dir.addSQLElement(new SalarieSQLElement());
 
dir.addSQLElement(TarifSQLElement.class);
dir.addSQLElement(TarifPromotionSQLElement.class);
dir.addSQLElement(ArticleTarifPromotionSQLElement.class);
dir.addSQLElement(new TaxeSQLElement());
dir.addSQLElement(TaxeComplementaireSQLElement.class);
dir.addSQLElement(TicketCaisseSQLElement.class);
1036,8 → 1081,17
dir.addSQLElement(new TypeReglementSQLElement());
dir.addSQLElement(new SDDMessageSQLElement(this));
dir.addSQLElement(new SEPAMandateSQLElement(this));
dir.addSQLElement(TarifSQLElement.class);
dir.addSQLElement(TarifPromotionSQLElement.class);
dir.addSQLElement(ArticleTarifPromotionSQLElement.class);
dir.addSQLElement(new TaxeSQLElement());
dir.addSQLElement(TaxeComplementaireSQLElement.class);
dir.addSQLElement(TicketCaisseSQLElement.class);
dir.addSQLElement(ClôtureCaisseSQLElement.class);
dir.addSQLElement(CaisseJournalSQLElement.class);
 
dir.addSQLElement(new VariableSalarieSQLElement());
dir.addSQLElement(SalarieSQLElement.class);
dir.addSQLElement(UniteVenteArticleSQLElement.class);
 
dir.addSQLElement(CalendarItemSQLElement.class);
1045,6 → 1099,8
dir.addSQLElement(DeviseHistoriqueSQLElement.class);
dir.addSQLElement(EmailTemplateSQLElement.class);
 
dir.addSQLElement(ArretChomageIntemperieSQLElement.class);
 
if (getRootSociete().contains("FWK_LIST_PREFS")) {
dir.addSQLElement(new FWKListPrefs(getRootSociete()));
}
1109,6 → 1165,7
new FactureCommandeSQLInjector(rootSociete);
new DevisFactureSQLInjector(rootSociete);
new DevisCommandeSQLInjector(rootSociete);
new DevisEltCmdEltSQLInjector(rootSociete);
new DevisCommandeFournisseurSQLInjector(rootSociete);
new DevisBlEltSQLInjector(rootSociete);
new DevisBlSQLInjector(rootSociete);
1191,8 → 1248,15
 
List<String> listFieldDevisElt = new ArrayList<String>();
listFieldDevisElt.add("NUMERO");
listFieldDevisElt.add("OBJET");
listFieldDevisElt.add("DATE");
listFieldDevisElt.add("ID_CLIENT");
if (root.getTable("DEVIS").contains("DATE_LIVRAISON")) {
listFieldDevisElt.add("DATE_LIVRAISON");
}
if (root.getTable("DEVIS").contains("TRANSFORMATION")) {
listFieldDevisElt.add("TRANSFORMATION");
}
 
listFieldDevisElt.add("ID_ETAT_DEVIS");
showAs.showField("DEVIS_ELEMENT.ID_DEVIS", listFieldDevisElt);
1243,21 → 1307,14
 
List<String> listFieldFactureElt = new ArrayList<String>();
listFieldFactureElt.add("NUMERO");
listFieldFactureElt.add("NOM");
listFieldFactureElt.add("DATE");
listFieldFactureElt.add("ID_COMMERCIAL");
listFieldFactureElt.add("ID_CLIENT");
showAs.showField("SAISIE_VENTE_FACTURE_ELEMENT.ID_SAISIE_VENTE_FACTURE", listFieldFactureElt);
 
showAs.show("SALARIE", SQLRow.toList("CODE,NOM,PRENOM"));
showAs.show("SITUATION_FAMILIALE", "NOM");
 
showAs.show("SITUATION_FAMILIALE", "NOM");
if (root.getTable("STOCK").contains("ID_ARTICLE")) {
List<String> listFieldArtElt = new ArrayList<String>();
listFieldArtElt.add("CODE");
listFieldArtElt.add("NOM");
listFieldArtElt.add("ID_FAMILLE_ARTICLE");
showAs.showField("STOCK.ID_ARTICLE", listFieldArtElt);
}
showAs.show("STYLE", "NOM");
 
showAs.show("TAXE", "TAUX");
1308,7 → 1365,6
// Prefetch undefined
rootSociete.getTables().iterator().next().getUndefinedID();
 
this.getModuleManager().addFactories(Gestion.MODULES_DIR);
this.getModuleManager().setup(this.getRootSociete(), this);
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/config/DefaultMenuConfiguration.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
40,6 → 40,7
import org.openconcerto.erp.core.finance.accounting.action.GestionPlanComptableEAction;
import org.openconcerto.erp.core.finance.accounting.action.ImportEcritureAction;
import org.openconcerto.erp.core.finance.accounting.action.ImportEcritureFECAction;
import org.openconcerto.erp.core.finance.accounting.action.ImportEcritureRImportAction;
import org.openconcerto.erp.core.finance.accounting.action.ImpressionJournauxAnalytiqueAction;
import org.openconcerto.erp.core.finance.accounting.action.ImpressionLivrePayeAction;
import org.openconcerto.erp.core.finance.accounting.action.ImpressionRepartitionAnalytiqueAction;
80,7 → 81,6
import org.openconcerto.erp.core.humanresources.employe.action.ListeDesContratsPrevoyanceAction;
import org.openconcerto.erp.core.humanresources.employe.action.ListeDesSalariesAction;
import org.openconcerto.erp.core.humanresources.employe.action.ListeDesSecretairesAction;
import org.openconcerto.erp.core.humanresources.employe.action.N4DSAction;
import org.openconcerto.erp.core.humanresources.payroll.action.ClotureMensuellePayeAction;
import org.openconcerto.erp.core.humanresources.payroll.action.EditionFichePayeAction;
import org.openconcerto.erp.core.humanresources.payroll.action.ListeDesInfosSalariePayeAction;
124,6 → 124,7
import org.openconcerto.erp.core.sales.order.action.ListeDesElementsACommanderClientAction;
import org.openconcerto.erp.core.sales.order.action.ListeDesFacturationCommandesClientAction;
import org.openconcerto.erp.core.sales.order.action.NouvelleCommandeClientAction;
import org.openconcerto.erp.core.sales.order.element.CommandeClientSQLElement;
import org.openconcerto.erp.core.sales.pos.action.ListeDesCaissesTicketAction;
import org.openconcerto.erp.core.sales.product.action.FamilleArticleAction;
import org.openconcerto.erp.core.sales.product.action.ListeDesArticlesAction;
260,10 → 261,8
if (UserRightsManager.getCurrentUserRights().haveRight(BackupPanel.RIGHT_CODE))
group.addItem("backup");
group.addItem("modules");
if (!Gestion.MAC_OS_X) {
group.addItem("preferences");
group.addItem("quit");
}
group.addItem(MainFrame.PREFS_MENU_ITEM);
group.addItem(MainFrame.QUIT_MENU_ITEM);
return group;
}
 
310,7 → 309,7
 
public Group createHelpMenuGroup() {
final Group group = new Group(MainFrame.HELP_MENU);
group.addItem("information");
group.addItem(MainFrame.ABOUT_MENU_ITEM);
group.addItem("tips");
return group;
}
441,7 → 440,7
group.addItem("accounting.costs.report");
group.addItem("accounting.balance.report");
// group.addItem("accounting.2050Report");
group.addItem("employe.social.report");
// group.addItem("employe.social.report");
return group;
}
 
463,6 → 462,9
final Group gIO = new Group("menu.accounting.io", LayoutHints.DEFAULT_NOLABEL_SEPARATED_GROUP_HINTS);
gIO.addItem("accounting.import");
gIO.addItem("accounting.import.fec");
if (this.configuration.isExperimental()) {
gIO.addItem("accounting.import.rimport");
}
gIO.addItem("accounting.export");
group.add(gIO);
 
516,6 → 518,7
}
 
gCustomer.addItem("customer.credit.list");
gCustomer.addItem("sales.quote.element.list");
gCustomer.addItem("customer.invoice.details.list");
 
final Group gSupplier = new Group("menu.list.supplier", LayoutHints.DEFAULT_NOLABEL_SEPARATED_GROUP_HINTS);
555,6 → 558,9
 
public Group createTestMenuGroup() {
final Group group = new Group("menu.test");
group.addItem("test.checkReplannedCmd");
group.addItem("test.checkReplannedMultiCmd");
 
group.addItem("test.lettrage.fact");
group.addItem("test.lettrage.compt");
group.addItem("test.lettrage.achat");
581,13 → 587,13
FrameUtil.show(this.frame);
}
}, "modules");
mManager.putAction(new PreferencesAction(getConfiguration().getModuleManager()), "preferences");
mManager.putAction(new PreferencesAction(getConfiguration().getModuleManager()), MainFrame.PREFS_MENU_ITEM);
mManager.putAction(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
MainFrame.getInstance().quit();
}
}, "quit");
}, MainFrame.QUIT_MENU_ITEM);
}
 
public void registerCreationMenuActions(final MenuAndActions mManager) {
668,6 → 674,7
 
mManager.putAction(new ListeDesAvoirsClientsAction(conf), "customer.credit.list");
mManager.putAction(new ListeDesFactureItemsAction(conf), "customer.invoice.details.list");
mManager.putAction(new ListeDesElementsDevisAction(conf), "sales.quote.element.list");
 
mManager.putAction(new ListeDesFournisseursAction(), "supplier.list");
mManager.putAction(new ListeDesContactsFournisseursAction(), "supplier.contact.list");
713,6 → 720,7
mManager.putAction(new ImportEcritureAction(), "accounting.import");
mManager.putAction(new ExportRelationExpertAction(), "accounting.export");
mManager.putAction(new ImportEcritureFECAction(), "accounting.import.fec");
mManager.putAction(new ImportEcritureRImportAction(), "accounting.import.rimport");
}
 
public void registerStatsDocumentsActions(final MenuAndActions mManager) {
719,7 → 727,7
// mManager.putAction("accounting.vat.report", new DeclarationTVAAction());
mManager.putAction(new EtatChargeAction(), "accounting.costs.report");
mManager.putAction(new CompteResultatBilanAction(), "accounting.balance.report");
mManager.putAction(new N4DSAction(), "employe.social.report");
// mManager.putAction(new N4DSAction(), "employe.social.report");
// mManager.putAction("accounting.2050Report", new CompteResultatBilan2050Action());
}
 
881,7 → 889,7
}
 
public void registerHelpMenuActions(final MenuAndActions mManager) {
mManager.putAction(new AboutAction(getConfiguration()), "information");
mManager.putAction(new AboutAction(getConfiguration()), MainFrame.ABOUT_MENU_ITEM);
mManager.putAction(new AstuceAction(), "tips");
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/config/translation_fr.xml
161,6 → 161,11
<menu id="menu.supplier.invoice.list" label="Factures" />
<menu id="menu.supplier.credit.list" label="Avoirs" />
 
<!-- Standard labels -->
<item id="button.cancel" label="Annuler" />
<item id="button.close" label="Fermer" />
<item id="button.add" label="Ajouter" />
<item id="button.save.modification" label="Enregistrer les modifications" />
 
 
<!-- Quote -->
179,9 → 184,7
<action id="sales.quote.clone" label="Créer à partir de" />
<action id="sales.quote.create.customer.order" label="Transfert vers commande client" />
<action id="sales.quote.create.customer.delivery" label="Transfert vers bon de livraison" />
 
<action id="sales.quote.accept.create.customer.order"
label="Marquer comme accepté et Transfert en commande client" />
<action id="sales.quote.accept.create.customer.order" label="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" />
211,6 → 214,7
<action id="sales.shipment.create.invoice" label="Transfert en facture" />
 
<!-- Document -->
<action id="modify" label="Modifier" />
<action id="document.quickprint" label="Impression rapide" />
<action id="document.print" label="Imprimer..." />
<action id="document.print.all" label="Imprimer les documents" />
219,6 → 223,8
<action id="document.create" label="Générer le document" />
<action id="document.pdf.send.email" label="Envoyer le document PDF par email" />
<action id="document.send.email" label="Envoyer le document par email" />
<action id="document.saveToPDF" label="Enregistrer le PDF sous ..." />
<action id="ticket.document.generate" label="Générer une facture" />
 
<!-- Supplier order -->
<action id="supplychain.order.create.purchase" label="Transfert vers saisie achat" />
230,6 → 236,7
<action id="sales.order.create.deliverynote" label="Transfert vers bon de livraison" />
<action id="sales.order.create.invoice" label="Transfert vers facture" />
<action id="sales.order.create.supplier.order" label="Transfert vers commande fournisseur" />
<action id="sales.order.reliquat.show" label="Voir les reliquats" />
<item id="sales.order.state.waiting" label="A préparer" />
<item id="sales.order.state.running" label="En préparation" />
<item id="sales.order.state.noStock" label="Rupture de stock" />
238,7 → 245,15
<item id="sales.order.state.block" label="Bloquée" />
<item id="sales.order.state.cancelled" label="Annulée" />
 
 
 
<item id="sales.order.state.kd.waiting" label="En attente" />
<item id="sales.order.state.kd.rapportrecu" label="Facturable(Rapport reçu)" />
<item id="sales.order.state.kd.facture" label="Facturé" />
<item id="sales.order.state.kd.cancelled" label="Annulée" />
 
<!-- Customer -->
<item id="customerrelationship.customer" label="Clients" />
<item id="delivery.address.same.main.address" label="Adresse identique à l'adresse du siège" />
<item id="invoice.address.same.main.address" label="Adresse identique à l'adresse du siège" />
<item id="customerrelationship.customer.address" label="Adresses" />
322,4 → 337,51
<item id="csg.imp" label="CSG/CRDS non déductible à l'impôt sur le revenu" />
<item id="allegement" label="Allégement de cotisation" />
<action id="email" label="Email" />
 
<!-- Affaire -->
<action id="controle.project.seeAttribution" label="Voir la fiche d'attribution" />
<action id="controle.project.invoice" label="Facturer" />
<action id="controle.project.history" label="Historique" />
<action id="controle.project.seeAdminLabel" label="Voir l'étiquette administrative" />
<action id="controle.project.generateAdminLabel" label="Générer l'étiquette administrative" />
<action id="controle.project.seeTechLabel" label="Voir l'étiquette technique" />
<action id="controle.project.generateTechLabel" label="Générer l'étiquette technique" />
 
<!-- Avoir fournisseur -->
<item id="supplychain.credit.note.amounts" label="Montant" />
<item id="supplychain.credit.note.accounting" label="Comptabilité" />
<item id="supplychain.credit.note.information" label="Informations Complémentaires" />
 
<!-- Finances -->
<item id="finance.accounting.userentry.table" label="Comptabilité" />
<item id="finance.accounting.userentry.create.account" label=" " />
<item id="finance.accounting.userentry.create.lineauto" label=" " />
<item id="finance.accounting.userentry.total.credit" label="Crédit" />
<item id="finance.accounting.userentry.total.debit" label="Débit" />
<item id="finance.accounting.userentry.total" label="Totaux" />
<item id="finance.accounting.userentry.warning" label=" " />
 
<!-- Commercial -->
<item id="humanresources.employe.salesman.tab1" label="Informations" />
<item id="humanresources.employe.salesman.tab2" label="Objectifs" />
<item id="humanresources.employe.salesman.initial" label="Initiales" />
 
<!-- Fournisseur -->
<item id="supplychain.supplier" label="Fournisseurs" />
<item id="supplychain.supplier.tab1" label="Adresses" />
<item id="supplychain.supplier.tab2" label="Contacts" />
<item id="supplychain.supplier.tab3" label="Mode de règlement" />
<item id="supplychain.supplier.tab4" label="Banque et comptes" />
<item id="supplychain.supplier.tab5" label="Comptes associés" />
<item id="supplychain.supplier.contacts" label="Contacts fournisseur" />
 
<!-- Societe Common -->
<item id="common.SOCIETE_COMMON.grp1" label="Informations générales" />
<item id="common.SOCIETE_COMMON.grp2" label="Adresse" />
<item id="common.SOCIETE_COMMON.grp3" label="Contact" />
<item id="common.SOCIETE_COMMON.grp4" label="Dates exercice" />
<item id="common.SOCIETE_COMMON.grp5" label="Plan comptable de l'entreprise" />
<item id="common.SOCIETE_COMMON.accounting.plan" label="Choix du plan comptable" />
 
 
</translation>
/trunk/OpenConcerto/src/org/openconcerto/erp/config/mappingCompta_fr.xml
1,6 → 1,5
<?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" />
12,9 → 11,21
<FIELD name="MONTANT" label="Montant" />
<FIELD name="ID_MOUVEMENT" label="Mouvement" />
</element>
<element refid="humanresources.payroll.suspension.contract" nameClass="masculine"
name="Arrêt chômage, intempérie">
<FIELD name="ID_INFOS_SALARIE_PAYE" label="Salarié" />
<FIELD name="ID_CODE_AMENAGEMENT_PARTIEL" label="Code d'aménagement" />
<FIELD name="ID_CODE_SUSPENSION" label="Code de suspension" />
<FIELD name="DATE_DEBUT_SUSPENSION" label="Début de suspension" />
<FIELD name="DATE_FIN_SUSPENSION" label="Fin de suspension" />
</element>
 
 
 
<element refid="customerrelationship.customer.category" nameClass="feminine" name="catégorie de client">
<FIELD name="name" label="Nom" />
</element>
 
<element refid="sales.customer.product.qty.price" nameClass="masculine" name="tarif client">
<FIELD name="QUANTITE" label="Quantité" />
<FIELD name="ID_ARTICLE" label="Article" />
114,11 → 125,25
<FIELD name="SITUATION_ADMIN" label="Situation administrative" />
<FIELD name="NOTA" label="Nota" />
</element>
 
<element refid="sales.product.ARTICLE_DECLINAISON_TAILLE.name" nameClass="feminine" name="déclinaison taille">
<FIELD name="NOM" label="Taille" />
</element>
 
<element refid="sales.product.ARTICLE_DECLINAISON_COULEUR.name" nameClass="feminine" name="déclinaison couleur">
<FIELD name="NOM" label="Couleur" />
</element>
 
<element refid="sales.product.ref" nameClass="masculine" name="article">
<FIELD name="OPTION" label="Option" />
<FIELD name="HAUTEUR" label="Hauteur" />
<FIELD name="LARGEUR" label="Largeur" />
<FIELD name="LONGUEUR" label="Longueur" />
<FIELD name="POIDS_COLIS_NET" label="Poids colis" />
<FIELD name="OPTION" label="Option" />
<FIELD name="ID_ARTICLE_VIRTUEL_PERE" label="Article référent" />
<FIELD name="ID_ARTICLE_DECLINAISON_TAILLE" label="Taille" />
<FIELD name="ID_ARTICLE_DECLINAISON_COULEUR" label="Couleur" />
<FIELD name="MARGE_WITH_COUT_REVIENT" label="Inclure le coût de revient dans le calcul du prix de vente" />
<FIELD name="ID_COUT_REVIENT" label="%CR" />
<FIELD name="QTE_UNITAIRE" label="Quantité unitaire par défaut" />
182,6 → 207,13
<FIELD name="ID_COMPTE_PCE_VENTE" label="Compte spécifique de vente" />
<FIELD name="ID_COMPTE_PCE_ACHAT" label="Compte spécifique d'achat" />
</element>
<element refid="sales.product.taxe.compta" nameClass="feminine" name="liaison taxe catégorie comptable"
namePlural="liaisons taxe catégorie comptable">
<FIELD name="ID_TAXE" label="TVA" />
<FIELD name="ID_CATEGORIE_COMPTABLE" label="Catégorie comptable" />
<FIELD name="ID_COMPTE_PCE_VENTE" label="Compte spécifique de vente" />
<FIELD name="ID_COMPTE_PCE_ACHAT" label="Compte spécifique d'achat" />
</element>
<element refid="sales.product.customcode" nameClass="masculine" name="code article client"
namePlural="codes articles clients">
<FIELD name="ID_ARTICLE" label="Article" />
211,6 → 243,19
<FIELD name="PRIX_FINAL_TTC" label="Prix client final ttc" />
<FIELD name="PV_HT" label="Prix vente HT" />
<FIELD name="PV_TTC" label="Prix vente TTC" />
<FIELD name="POURCENT_REMISE" label="% Remise" />
<FIELD name="PRIX_METRIQUE_VT_1" label="P.V. UV HT" />
</element>
<element refid="sales.product.promo" nameClass="masculine" name="tarif promotionnel d'article"
namePlural="tarifs promotionnels d'article">
<FIELD name="ID_TARIF_PROMOTION" label="Tarif promotionnel" />
<FIELD name="ID_TAXE" label="Taxe" />
<FIELD name="QTE" label="Qté" />
<FIELD name="ID_DEVISE" label="Devise" />
<FIELD name="PRIX_REVENTE_HT" label="Prix de revente ht" />
<FIELD name="PRIX_FINAL_TTC" label="Prix client final ttc" />
<FIELD name="PV_HT" label="Prix vente HT" />
<FIELD name="PV_TTC" label="Prix vente TTC" />
 
<FIELD name="PRIX_METRIQUE_VT_1" label="P.V. UV HT" />
</element>
310,6 → 355,8
<FIELD name="ID_TAXE_PORT" label="Taxe sur port" />
</element>
<element refid="sales.credit.item" nameClass="masculine" name="élément d'avoir" namePlural="éléments d'avoir">
<FIELD name="ID_ARTICLE_DECLINAISON_TAILLE" label="Taille" />
<FIELD name="ID_ARTICLE_DECLINAISON_COULEUR" label="Couleur" />
<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." />
440,6 → 487,7
</element>
<element refid="supplychain.receipt.note" nameClass="masculine" name="bon de réception"
namePlural="bons de réception">
<FIELD name="ID_MODELE" label="Modèle" />
<FIELD name="DATE" label="Date" />
<FIELD name="ID_FOURNISSEUR" label="Fournisseur" />
<FIELD name="NUMERO" label="Numéro du bon" titlelabel="Numéro BR" />
459,6 → 507,8
</element>
<element refid="supplychain.receipt.item" nameClass="masculine" name="élément de bon"
namePlural="éléments de bon">
<FIELD name="ID_ARTICLE_DECLINAISON_TAILLE" label="Taille" />
<FIELD name="ID_ARTICLE_DECLINAISON_COULEUR" label="Couleur" />
<FIELD name="NB_COLIS" label="Nb Colis" />
<FIELD name="POIDS_COLIS_NET" label="Pds Colis" />
<FIELD name="T_POIDS_COLIS_NET" label="Pds Colis Total" />
539,6 → 589,8
</element>
<element refid="sales.shipment.item" nameClass="masculine" name="élément de bon de livraison"
namePlural="éléments de bon de livraison">
<FIELD name="ID_ARTICLE_DECLINAISON_TAILLE" label="Taille" />
<FIELD name="ID_ARTICLE_DECLINAISON_COULEUR" label="Couleur" />
<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." />
680,7 → 732,7
</element>
<!-- Mapping pour client partagé KD/Preventec -->
<element refid="controle.customer" nameClass="masculine" name="client">
 
<FIELD name="ALERTE" label="Alerte" />
<FIELD name="ID_SEPA_MANDATE_DEFAULT" label="Mandat par défaut" />
<FIELD name="ID_FRAIS_DOCUMENT" label="Frais de création de documents" />
<FIELD name="CODE_FOURNISSEUR" label="Code interne fournisseur" />
763,6 → 815,15
<FIELD name="BLOQUE_LIVRAISON" label="Bloquer les livraisons" />
<FIELD name="OBSOLETE" label="Obsolète" />
 
<FIELD name="USE_CLIENT_FORMAT" label="Utiliser la numérotation du client (GARI)" />
<FIELD name="NOMENCLATURE_RAPPORT" label="Nomenclature des rapports" />
<FIELD name="SEND_FAX" label="Envoyer une copie des rapports par fax " />
<FIELD name="SEND_POST_MAIL" label="Envoyer une copie des rapports par courrier " />
<FIELD name="MAIL_SUPPL_OBL_GARI" label="Email dest. suppl. GARI requis" />
 
 
 
 
</element>
<!-- Mapping pour client standard OpenConcerto -->
<element refid="customerrelationship.customer" nameClass="masculine" name="client">
848,7 → 909,7
<FIELD name="GROUPE" label="Groupe" />
<FIELD name="BLOQUE_LIVRAISON" label="Bloquer les livraisons" />
<FIELD name="OBSOLETE" label="Obsolète" />
 
<FIELD name="ALERTE" label="Message d'alerte" />
</element>
<element refid="customerrelationship.customer.department" nameClass="masculine" name="service client"
namePlural="services client">
1029,9 → 1090,20
<FIELD name="NB_AYANT_DROIT_AUTRE" label="Nombre d'ayants-droit autres (ascendants, collatéraux...)" />
<FIELD name="NB_ENFANT_AYANT_DROIT" label="Nombre d'enfants ayants-droit" />
</element>
<element refid="humanresources.payroll.suspention.contract" nameClass="masculine"
name="arrêt chômage ou intempéries" namePlural="arrêts chômages ou intempéries">
<FIELD name="ID_INFOS_SALARIE_PAYE" label="Contrat salarié" />
<FIELD name="ID_CODE_AMENAGEMENT_PARTIEL" label="Aménagement temps partiel (S21.G00.40.078)" />
<FIELD name="ID_CODE_SUSPENSION" label="Motif de suspension (S21.G00.65.001)" />
<FIELD name="DATE_FIN_SUSPENSION" label="Fin de supension (S21.G00.65.003)" />
<FIELD name="DATE_DEBUT_SUSPENSION" label="Début de supension (S21.G00.65.002)" />
</element>
 
<element refid="humanresources.payroll.contract.employe" nameClass="masculine" name="contrat salarié"
namePlural="contrats salariés">
<FIELD name="ID_DIPLOME_PREPARE" label="Diplôme préparé (S21.G00.30.025)" />
<FIELD name="ID_CODE_CAISSE_CONGES_PAYES" label="Caisse de congés payés (S21.G00.40.022)" />
<FIELD name="TAUX_FRAIS_PROFESSIONNELS" label="Taux frais professionnels (S21.G00.40.023)" />
<FIELD name="ID_CODE_AMENAGEMENT_PARTIEL" label="Aménagement temps partiel (S21.G00.40.078)" />
<FIELD name="ID_CODE_SUSPENSION" label="Motif de suspension (S21.G00.65.001)" />
<FIELD name="DATE_FIN_SUSPENSION" label="Fin de supension (S21.G00.65.003)" />
1103,6 → 1175,8
</element>
<element refid="supplychain.order.item" nameClass="masculine" name="élément de commande"
namePlural="éléments de commande">
<FIELD name="ID_ARTICLE_DECLINAISON_TAILLE" label="Taille" />
<FIELD name="ID_ARTICLE_DECLINAISON_COULEUR" label="Couleur" />
<FIELD name="NB_COLIS" label="Nb Colis" />
<FIELD name="POIDS_COLIS_NET" label="Pds Colis" />
<FIELD name="T_POIDS_COLIS_NET" label="Pds Colis Total" />
1153,6 → 1227,10
<FIELD name="ID_MODE_VENTE_ARTICLE" label="Mode de vente" />
</element>
<element refid="sales.order" nameClass="feminine" name="commande client" namePlural="commandes clients">
<FIELD name="FACTURATION_INTERNE" label="Facturation interne" />
<FIELD name="T_ACOMPTE" label="Acompte" />
<FIELD name="ID_COMMANDE_CLIENT_PRECEDENT" label="Commande précedente" />
 
<FIELD name="ID_TAXE_FRAIS_DOCUMENT" label="TVA sur frais documents" />
<FIELD name="FRAIS_DOCUMENT_HT" label="Frais de document HT" />
<FIELD name="DATE_LIVRAISON_PREV" label="Livraison prévue le" />
1189,6 → 1267,8
<FIELD name="DATE_LIVRAISON_REELLE" label="Date livraison réelle" />
</element>
<element refid="sales.order.item" nameClass="masculine" name="article commandé" namePlural="articles commandés">
<FIELD name="ID_ARTICLE_DECLINAISON_TAILLE" label="Taille" />
<FIELD name="ID_ARTICLE_DECLINAISON_COULEUR" label="Couleur" />
<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." />
1367,6 → 1447,8
</element>
<element refid="supplychain.order.demande.item" nameClass="masculine" name="élement de demande de prix"
namePlural="élements de demandes de prix">
<FIELD name="ID_ARTICLE_DECLINAISON_TAILLE" label="Taille" />
<FIELD name="ID_ARTICLE_DECLINAISON_COULEUR" label="Couleur" />
<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." />
1440,6 → 1522,9
<FIELD name="REGION_ADMIN" label="Région administrative" />
</element>
<element refid="sales.quote" nameClass="masculine" name="devis">
 
<FIELD name="TRANSFORMATION" label="Taux de transformation estimé" />
<FIELD name="DATE_LIVRAISON" label="Livraison prévue le" />
<FIELD name="ID_TAXE_FRAIS_DOCUMENT" label="TVA sur frais documents" />
<FIELD name="FRAIS_DOCUMENT_HT" label="Frais de document HT" />
<FIELD name="ID_TAXE_PORT" label="TVA sur Port" />
1508,6 → 1593,8
<FIELD name="T_ECO_CONTRIBUTION" label="Dont Eco-Contrib." />
</element>
<element refid="sales.quote.item" nameClass="masculine" name="élément de devis" namePlural="éléments de devis">
<FIELD name="ID_ARTICLE_DECLINAISON_TAILLE" label="Taille" />
<FIELD name="ID_ARTICLE_DECLINAISON_COULEUR" label="Couleur" />
<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." />
1787,6 → 1874,8
<FIELD name="POIDS_COLIS_NET" label="Pds Colis" />
<FIELD name="T_POIDS_COLIS_NET" label="Pds Colis Total" />
<FIELD name="ID_COMPTE_PCE" label="Compte charge spécifique" />
<FIELD name="ID_ARTICLE_DECLINAISON_TAILLE" label="Taille" />
<FIELD name="ID_ARTICLE_DECLINAISON_COULEUR" label="Couleur" />
<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." />
1849,6 → 1938,7
<FIELD name="NET_IMP" label="Salaire net imposable" />
<FIELD name="NET_A_PAYER" label="Salaire net à payer" />
<FIELD name="CSG" label="Base CSG" />
<FIELD name="PERTE_TPT" label="Perte TPT" />
<FIELD name="ID_CUMULS_PAYE" label="Cumuls" />
<FIELD name="ACOMPTE" label="Acompte" />
<FIELD name="ID_MOIS" label="Mois" />
1968,6 → 2058,7
<FIELD name="TEL" label="Téléphone" />
<FIELD name="FAX" label="Fax" />
<FIELD name="ID_MODE_REGLEMENT" label="Mode de règlement par défaut" />
<FIELD name="CONDITIONS_PORT" label="Conditions frais de port" />
</element>
<element refid="finance.accounting.FRAIS_DOCUMENT">
<FIELD name="CODE" label="Code" />
1976,11 → 2067,7
<FIELD name="MONTANT_HT" label="Montant HT" />
<FIELD name="MONTANT_TTC" label="Montant TTC" />
</element>
<element refid="humanresources.payroll.conventions.code" nameClass="masculine" name="code de convention"
namePlural="codes de conventions">
<FIELD name="CODE" label="Code" />
<FIELD name="NOM" label="Libellé" />
</element>
 
<element refid="humanresources.payroll.info" nameClass="feminine" name="fiche d'informations salarié-paye"
namePlural="fiches d'informations salariés-payes">
<FIELD name="ID_IDCC" label="Convention collective (*)" titlelabel="Convention collective" />
2082,6 → 2169,8
namePlural="numérotations automatiques">
<FIELD name="AFFAIRE_FORMAT" label="Format" />
<FIELD name="AFFAIRE_START" label="Prochain numéro" />
<FIELD name="ARTICLE_FORMAT" label="Format" />
<FIELD name="ARTICLE_START" label="Prochain numéro" />
<FIELD name="AVOIR_FORMAT" label="Format" />
<FIELD name="AVOIR_START" label="Prochain numéro" />
<FIELD name="AVOIR_F_FORMAT" label="Format" />
2444,6 → 2533,7
<FIELD name="TYPE_INTERVENTION" label="Type d'intervention" />
<FIELD name="ID_REFERENCE_CLIENT" label="Référence client" />
<FIELD name="ID_VERIFICATEUR" label="Vérificateur" />
<FIELD name="ID_VERIFICATEUR_SOUS_TRAITANCE" label="Sous-traitée par" />
<FIELD name="ID_MODELE" label="Modèle" />
<FIELD name="CONTROLE_TECHNIQUE" label="Facture CTC" />
<FIELD name="COMPTE_SERVICE_AUTO" label="Gestion automatique du compte de service" />
2452,6 → 2542,8
<FIELD name="ID_SDD_MESSAGE" label="Ordre de prélèvement SEPA" titlelabel="Prélèv. SEPA" />
</element>
<element refid="sales.invoice.item" nameClass="masculine" name="article facturé" namePlural="articles facturés">
<FIELD name="ID_ARTICLE_DECLINAISON_TAILLE" label="Taille" />
<FIELD name="ID_ARTICLE_DECLINAISON_COULEUR" label="Couleur" />
<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." />
2597,7 → 2689,14
<FIELD name="ID_TAXE" label="TVA" />
<FIELD name="ID_DEVISE" label="Devise" />
</element>
<element refid="sales.product.qty.price">
<element refid="sales.price.promo.list" nameClass="masculine" name="tarif promotionnel">
<FIELD name="NOM" label="Tarif" />
<FIELD name="ID_TAXE" label="TVA" />
<FIELD name="ID_DEVISE" label="Devise" />
<FIELD name="START" label="Du" />
<FIELD name="END" label="Au" />
</element>
<element refid="sales.product.qty.price" nameClass="masculine" name="tarif par quantité">
<FIELD name="QUANTITE" label="Qté (A partir de)" />
<FIELD name="POURCENT_REMISE" label="% de remise" />
<FIELD name="PRIX_METRIQUE_VT_1" label="Prix de vente HT remisé" />
/trunk/OpenConcerto/src/org/openconcerto/erp/config/Gestion.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
100,7 → 100,7
 
public class Gestion {
 
public static final File MODULES_DIR = new File("Modules");
static final String MODULES_DIR_NAME = "Modules";
 
/**
* When this system property is set to <code>true</code>, Gestion will hide most of its normal
316,6 → 316,7
ex2.printStackTrace();
}
System.out.println("Application working directory folder : " + conf.getWD().getAbsolutePath());
System.out.println("Modules folders : " + conf.getModuleManager().getFolders().toString());
if (inWebStart()) {
// needed since our classes aren't loaded by the same loader as the library classes
Helper.setURLStreamHandlerFactory();
339,6 → 340,9
SQLRequestLog.setEnabled(true);
}
 
// columns order/visibility per company
IListFrame.setConfDirFunction((elem) -> conf.getConfDir(elem.getTable().getDBRoot()));
 
if (Boolean.valueOf(conf.getProperty("minimal", "false"))) {
System.setProperty(MINIMAL_PROP, Boolean.TRUE.toString());
}
584,6 → 588,7
 
// needed so that we can uninstall modules
System.setProperty(SQLBase.ALLOW_OBJECT_REMOVAL, "true");
NewsChecker.check(pTOS, conf.getConfDir(), conf.getServer().getSQLSystem().equals(SQLSystem.H2));
}
 
private static void saveProperties(File fTOS, Properties pTOS) {
792,6 → 797,7
return realIp;
}
 
// TODO : n'est plus utilisé
public static PostgreSQLFrame pgFrameStart = null;
 
private static JDialog frameExit = null;
/trunk/OpenConcerto/src/org/openconcerto/erp/config/mapping_fr.xml
7,9 → 7,13
<FIELD name="ID_CLIENT" label="Client" />
<FIELD name="POURCENT_REMISE" label="% remise" />
</element>
<element refid="humanresources.payroll.conventions.code" nameClass="masculine" name="code de convention"
namePlural="codes de conventions">
<FIELD name="CODE" label="Code" />
<FIELD name="NOM" label="Libellé" />
</element>
 
 
 
<element refid="common.address" nameClass="feminine" name="adresse">
<FIELD name="RAISON_SOCIALE" label="Raison sociale" />
<FIELD name="RUE" label="Rue" />
262,8 → 266,13
<FIELD name="CAPITAL" label="Capital" />
<FIELD name="NUMERO_URSSAF" label="Identifiant personnel URSSAF" />
<FIELD name="ID_DEVISE" label="Devise" />
<FIELD name="ID_IDCC" label="Convention collective applicable" />
<FIELD name="ORG_PROTECTION_SOCIAL_ID" label="Siret URSSAF" />
<FIELD name="SEPA_CREDITOR_ID" label="Identifiant Créancier SEPA" />
<FIELD name="ID_MOTIF_NON_ASSUJETIS_TA" label="Motif non assuj. TA (S21.G00.44.004)" />
<FIELD name="ASSUJETTISSEMENT_TA" label="Assujettisement TA (S21.G00.44.001)" />
<FIELD name="ASSUJETTISSEMENT_CFP" label="Assujettisement CFP (S21.G00.44.001)" />
<FIELD name="ASSUJETTISSEMENT_CFP_CDD" label="Assujettisement CFP CDD (S21.G00.44.001)" />
</element>
<element refid="document.template-type" nameClass="masculine" name="type de modèle"
namePlural="types de modèles">
/trunk/OpenConcerto/src/org/openconcerto/erp/config/NewsChecker.java
New file
0,0 → 1,316
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011-2019 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.config;
 
import org.openconcerto.utils.Base64;
import org.openconcerto.utils.FileUtils;
import org.openconcerto.utils.JImage;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
 
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
 
import net.minidev.json.JSONObject;
import net.minidev.json.parser.JSONParser;
 
public class NewsChecker {
public static class DateHash {
Long t;
String h;
 
public DateHash(Long time, String hash) {
this.t = time;
this.h = hash;
}
 
}
 
public static void check(Properties pTOS, File confDir, boolean useH2) {
if (!confDir.exists()) {
System.out.println("missing conf dir " + confDir.getAbsolutePath());
}
final boolean hasCloud = pTOS.getProperty("hasCloud", "false").equals("true");
final int launchCounter = Integer.parseInt(pTOS.getProperty("launchCounter", "0"));
Thread t = new Thread(new Runnable() {
 
@Override
public void run() {
try {
 
File historyFile = new File(confDir, "history.log");
if (!historyFile.exists()) {
FileUtils.writeUTF8("", historyFile);
}
List<DateHash> history = new ArrayList<>();
long today = System.currentTimeMillis();
// 60 days
long maxDate = today - 60 * 24 * 3600 * 1000;
try (BufferedReader reader = new BufferedReader(new FileReader(historyFile))) {
String line = reader.readLine();
while (line != null) {
Long t = Long.parseLong(line);
String h = reader.readLine();
if (t > maxDate) {
history.add(new DateHash(t, h));
}
line = reader.readLine();
}
} catch (Exception e) {
e.printStackTrace();
}
byte[] data = download("https://www.ilm-informatique.fr/openconcerto/ocnews");
MessageDigest digester = MessageDigest.getInstance("SHA-256");
digester.update(data);
String h = Base64.encodeBytes(digester.digest());
boolean found = false;
for (DateHash d : history) {
if (d.h.equals(h)) {
found = true;
break;
}
}
DateHash newLine = new DateHash(System.currentTimeMillis(), h);
history.add(newLine);
if (!found) {
final JSONParser jsonParser = new JSONParser(JSONParser.MODE_PERMISSIVE);
final String jsonString = new String(data, StandardCharsets.UTF_8);
JSONObject obj = (JSONObject) jsonParser.parse(jsonString);
 
String title = obj.getOrDefault("title", "").toString();
String text = obj.getOrDefault("text", "").toString();
String imageURL = obj.getOrDefault("image", "").toString();
String end = obj.getOrDefault("end", "1/12/2133").toString();
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Date dateEnd = df.parse(end);
boolean includeCloud = (Boolean) obj.getOrDefault("include-cloud", Boolean.FALSE);
boolean includeMono = (Boolean) obj.getOrDefault("include-mono", Boolean.FALSE);
boolean includeMulti = (Boolean) obj.getOrDefault("include-multi", Boolean.FALSE);
boolean isMono = useH2;
boolean isMulti = !hasCloud && !isMono;
int minLaunch = (Integer) obj.getOrDefault("min-launch", 0);
if (launchCounter < minLaunch) {
System.out.println("launch counter too small (" + launchCounter + ")");
} else {
if (dateEnd.before(new Date())) {
System.out.println("outdated news");
} else {
if (includeCloud && hasCloud || includeMono && isMono || includeMulti && isMulti) {
BufferedImage image = null;
if (imageURL != null && imageURL.length() > 5) {
try {
byte[] imageData = download(imageURL);
image = ImageIO.read(new ByteArrayInputStream(imageData));
} catch (Exception e) {
e.printStackTrace();
}
}
showFrame(title, text, image, history, historyFile);
} else {
System.out.println("news not relevant");
}
 
}
}
 
} else {
System.out.println("news already displayed");
}
 
} catch (Exception e) {
e.printStackTrace();
}
 
}
 
private byte[] download(String u) throws MalformedURLException, IOException {
URL url = new URL(u);
URLConnection connection = url.openConnection();
InputStream is = connection.getInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[2048];
int length = 0;
while ((length = is.read(buffer)) != -1) {
out.write(buffer, 0, length);
}
is.close();
out.close();
byte[] data = out.toByteArray();
return data;
}
});
t.setPriority(Thread.MIN_PRIORITY);
t.setName("News checker");
t.setDaemon(true);
t.start();
 
}
 
protected static void showFrame(String title, String text, BufferedImage image, List<DateHash> history, File historyFile) {
SwingUtilities.invokeLater(new Runnable() {
 
@Override
public void run() {
JFrame f = new JFrame();
f.setIconImages(Gestion.getFrameIcon());
f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
if (title != null && !title.isEmpty()) {
f.setTitle(title);
} else {
f.setTitle("OpenConcerto");
}
JPanel p = new JPanel();
p.setBackground(Color.WHITE);
p.setLayout(new BorderLayout());
if (image != null) {
p.add(new JImage(image), BorderLayout.PAGE_START);
}
if (text != null && !text.isEmpty()) {
final String t = text.replace("\\n", "\n");
final JTextArea ta = new JTextArea(t);
ta.setBorder(BorderFactory.createLineBorder(Color.WHITE, 10));
Font font = new JTextField("hello").getFont();
font = font.deriveFont(font.getSize() + 2f);
ta.setFont(font);
ta.setEditable(false);
 
p.add(ta, BorderLayout.CENTER);
}
final JButton bOk = new JButton();
bOk.setEnabled(false);
Thread t = new Thread(new Runnable() {
 
@Override
public void run() {
for (int i = 10; i > 0; i--) {
 
final int c = i;
SwingUtilities.invokeLater(new Runnable() {
 
@Override
public void run() {
bOk.setText(String.valueOf(c) + "s");
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// Nothing
}
}
SwingUtilities.invokeLater(new Runnable() {
 
@Override
public void run() {
bOk.setText("OK");
bOk.setEnabled(true);
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
});
}
});
t.start();
bOk.addActionListener(new ActionListener() {
 
@Override
public void actionPerformed(ActionEvent e) {
// save history
if (history != null) {
try (FileOutputStream fOp = new FileOutputStream(historyFile)) {
PrintStream prt = new PrintStream(new BufferedOutputStream(fOp));
for (DateHash d : history) {
prt.println(d.t);
prt.println(d.h);
}
prt.close();
} catch (IOException e1) {
e1.printStackTrace();
}
System.out.println(historyFile.getAbsolutePath() + " saved");
}
// close
f.dispose();
 
}
});
 
final FlowLayout flowLayout = new FlowLayout(FlowLayout.RIGHT);
final JPanel pButtons = new JPanel();
pButtons.setLayout(flowLayout);
pButtons.setOpaque(false);
pButtons.add(bOk);
p.add(pButtons, BorderLayout.PAGE_END);
f.setContentPane(p);
f.pack();
f.setMinimumSize(new Dimension(300, 400));
f.setLocationRelativeTo(null);
f.setVisible(true);
}
 
});
 
}
 
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
 
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
showFrame("Hello", "world\\nhhhf the window is enlarged or the center and the bottom.", null, null, null);
// showFrame("Hello", "world\\nhhh",
// ImageIO.read(this.getClass().getResourceAsStream("256.png")), null);
} catch (Exception e) {
e.printStackTrace();
}
 
}
});
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/config/update/Updater_1_5.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
29,6 → 29,7
import org.openconcerto.erp.core.supplychain.stock.element.DepotStockSQLElement;
import org.openconcerto.erp.core.supplychain.stock.element.StockItem;
import org.openconcerto.sql.changer.convert.AddMDFields;
import org.openconcerto.sql.changer.convert.SetFKDefault;
import org.openconcerto.sql.model.AliasedTable;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLField;
41,6 → 42,7
import org.openconcerto.sql.model.SQLSyntax;
import org.openconcerto.sql.model.SQLSystem;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.SQLUpdate;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.sql.request.UpdateBuilder;
140,6 → 142,14
tClient.fetchFields();
}
 
if (!tClient.contains("ALERTE")) {
final AlterTable alterClient = new AlterTable(tClient);
alterClient.addVarCharColumn("ALERTE", 4096);
tClient.getBase().getDataSource().execute(alterClient.asString());
tClient.getSchema().updateVersion();
tClient.fetchFields();
}
 
final SQLTable tCompteClient = root.getTable("COMPTE_CLIENT_TRANSACTION");
if (!tCompteClient.contains("ID_MOUVEMENT")) {
final AlterTable alterClient = new AlterTable(tCompteClient);
817,7 → 827,7
 
String field = sqlField.getName();
if (!field.equalsIgnoreCase("ID_USER_COMMON_CREATE") && !field.equalsIgnoreCase("ID_USER_COMMON_MODIFY") && !field.equalsIgnoreCase("MODIFICATION_DATE")
&& !field.equalsIgnoreCase("CREATION_DATE") && !field.equalsIgnoreCase("HEURE_TRAV")) {
&& !field.equalsIgnoreCase("CREATION_DATE") && !field.equalsIgnoreCase("HEURE_TRAV") && !tableVarSal.contains(field + "_DEFAULT_VAL")) {
alterB.addColumn(field + "_DEFAULT_VAL", "real DEFAULT 0");
}
}
859,6 → 869,14
root.getSchema().updateVersion();
}
 
if (!tableFpaye.contains("PERTE_TPT")) {
final AlterTable alterB = new AlterTable(tableFpaye);
alterB.addDecimalColumn("PERTE_TPT", 16, 2, BigDecimal.ZERO, false);
root.getBase().getDataSource().execute(alterB.asString());
root.refetchTable("FICHE_PAYE");
root.getSchema().updateVersion();
}
 
SQLTable tableCpaye = root.findTable("CUMULS_PAYE");
if (!tableCpaye.contains("TAXE_CM_SAL_C")) {
final AlterTable alterB = new AlterTable(tableCpaye);
934,6 → 952,14
tableArticle.getSchema().updateVersion();
tableArticle.fetchFields();
}
if (!tableArticle.contains("OPTION")) {
final AlterTable alterArticle = new AlterTable(tableArticle);
alterArticle.addBooleanColumn("OPTION", Boolean.FALSE, false);
tableArticle.getBase().getDataSource().execute(alterArticle.asString());
tableArticle.getSchema().updateVersion();
tableArticle.fetchFields();
}
 
SQLTable tableFournisseur = root.getTable("FOURNISSEUR");
if (!tableFournisseur.contains("NUMERO_TVA")) {
final AlterTable alter = new AlterTable(tableFournisseur);
943,6 → 969,13
tableFournisseur.getSchema().updateVersion();
tableFournisseur.fetchFields();
}
if (!tableFournisseur.contains("CONDITIONS_PORT")) {
final AlterTable alter = new AlterTable(tableFournisseur);
alter.addVarCharColumn("CONDITIONS_PORT", 128);
tableFournisseur.getBase().getDataSource().execute(alter.asString());
tableFournisseur.getSchema().updateVersion();
tableFournisseur.fetchFields();
}
 
// POS
final SQLTable caisseT = root.getTable("CAISSE");
1058,6 → 1091,31
root.getSchema().updateVersion();
}
 
SQLTable tableCommandeAcompte = root.getTable("COMMANDE_CLIENT");
if (!tableCommandeAcompte.contains("T_ACOMPTE")) {
final AlterTable alterB = new AlterTable(tableCommandeAcompte);
alterB.addLongColumn("T_ACOMPTE", 0L, false);
root.getBase().getDataSource().execute(alterB.asString());
root.refetchTable("COMMANDE_CLIENT");
root.getSchema().updateVersion();
 
SQLTable tableEncaisse = root.getTable("ENCAISSER_MONTANT");
final AlterTable alterC = new AlterTable(tableEncaisse);
alterC.addForeignColumn("ID_COMMANDE_CLIENT", tableDevisAcompte);
root.getBase().getDataSource().execute(alterC.asString());
root.refetchTable("ENCAISSER_MONTANT");
root.getSchema().updateVersion();
}
 
if (!tableDevisAcompte.contains("DATE_LIVRAISON")) {
final AlterTable alterB = new AlterTable(tableDevisAcompte);
alterB.addColumn("DATE_LIVRAISON", "date");
alterB.addVarCharColumn("TRANSFORMATION", 200);
root.getBase().getDataSource().execute(alterB.asString());
root.refetchTable("DEVIS");
root.getSchema().updateVersion();
}
 
// Paye Simplifiée
if (!tableFpaye.contains("ALLEGEMENT_COTISATION")) {
final AlterTable alterB = new AlterTable(tableFpaye);
1654,6 → 1712,7
}
 
// Gestion multidepot
final SQLTable userT = root.findTable("USER_COMMON");
{
// Ajout table depot
if (!root.contains("DEPOT_STOCK")) {
1661,7 → 1720,7
createTable.addVarCharColumn("CODE", 25);
createTable.addVarCharColumn("NOM", 256);
createTable.addVarCharColumn("UI_LOCK", 256);
createTable.addForeignColumn("ID_USER_UI_LOCK", root.findTable("USER_COMMON"));
createTable.addForeignColumn("ID_USER_UI_LOCK", userT);
// sqlRowValues.put("UI_LOCK", "ro");
// sqlRowValues.put("ID_USER_UI_LOCK", 2);
 
1867,7 → 1926,7
 
String field = sqlField.getName();
if (!field.equalsIgnoreCase("ID_USER_COMMON_CREATE") && !field.equalsIgnoreCase("ID_USER_COMMON_MODIFY") && !field.equalsIgnoreCase("MODIFICATION_DATE")
&& !field.equalsIgnoreCase("CREATION_DATE") && !field.endsWith("_DEFAULT_VAL")) {
&& !field.equalsIgnoreCase("CREATION_DATE") && !field.endsWith("_DEFAULT_VAL") && !tableVarSal.contains(field + "_CUMUL_VAL")) {
alterB.addColumn(field + "_CUMUL_VAL", "real DEFAULT 0");
}
}
1885,6 → 1944,14
root.getSchema().updateVersion();
}
 
if (!tableBL.contains("VERROU_FACTURATION")) {
final AlterTable alterB = new AlterTable(tableBL);
alterB.addBooleanColumn("VERROU_FACTURATION", Boolean.FALSE, false);
root.getBase().getDataSource().execute(alterB.asString());
root.refetchTable("BON_DE_LIVRAISON");
root.getSchema().updateVersion();
}
 
// fix stock
{
SQLTable tableStock = root.getTable("STOCK");
1941,15 → 2008,17
}
}
 
SQLSelect selArt = new SQLSelect();
selArt.addSelectStar(tableArt);
Where w = new Where(tableArt.getField("ID_STOCK"), "=", 1);
selArt.setWhere(w);
List<SQLRow> badStock = SQLRowListRSH.execute(selArt);
for (SQLRow sqlRow : badStock) {
initStock(sqlRow);
// Remove useless since 1.7.1
// SQLSelect selArt = new SQLSelect();
// selArt.addSelectStar(tableArt);
// Where w = new Where(tableArt.getField("ID_STOCK"), "=", 1);
// selArt.setWhere(w);
// List<SQLRow> badStock = SQLRowListRSH.execute(selArt);
// for (SQLRow sqlRow : badStock) {
// initStock(sqlRow);
// }
 
}
}
 
// Tarification client par quantite
if (root.getTable("TARIF_ARTICLE_CLIENT") == null) {
2096,7 → 2165,7
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"));
alter.addForeignColumn("ID_USER_COMMON", userT);
exec(alter);
root.refetchTable(tableSalarie.getName());
root.getSchema().updateVersion();
2420,8 → 2489,258
tableVF.fetchFields();
}
 
SQLTable tableNumAuto = root.getTable("NUMEROTATION_AUTO");
if (!tableNumAuto.contains("ARTICLE_FORMAT")) {
 
final AlterTable alterNumero = new AlterTable(tableNumAuto);
alterNumero.addVarCharColumn("ARTICLE_FORMAT", 128);
alterNumero.addIntegerColumn("ARTICLE_START", 1);
root.getBase().getDataSource().execute(alterNumero.asString());
root.refetchTable("NUMEROTATION_AUTO");
root.getSchema().updateVersion();
}
 
if (!tableArticle.contains("VIRTUEL")) {
 
final SQLCreateTable createTableDeclinaisonCouleur = new SQLCreateTable(root, "ARTICLE_DECLINAISON_COULEUR");
createTableDeclinaisonCouleur.addVarCharColumn("NOM", 256);
root.getBase().getDataSource().execute(createTableDeclinaisonCouleur.asString());
InstallationPanel.insertUndef(createTableDeclinaisonCouleur);
root.refetchTable("ARTICLE_DECLINAISON_COULEUR");
root.getSchema().updateVersion();
 
final SQLCreateTable createTableDeclinaisonTaille = new SQLCreateTable(root, "ARTICLE_DECLINAISON_TAILLE");
createTableDeclinaisonTaille.addVarCharColumn("NOM", 256);
root.getBase().getDataSource().execute(createTableDeclinaisonTaille.asString());
InstallationPanel.insertUndef(createTableDeclinaisonTaille);
root.refetchTable("ARTICLE_DECLINAISON_TAILLE");
root.getSchema().updateVersion();
 
final AlterTable alter = new AlterTable(tableArticle);
alter.addBooleanColumn("VIRTUEL", false, false);
alter.addForeignColumn("ID_ARTICLE_VIRTUEL_PERE", tableArticle);
alter.addForeignColumn("ID_ARTICLE_DECLINAISON_TAILLE", root.getTable("ARTICLE_DECLINAISON_TAILLE"));
alter.addForeignColumn("ID_ARTICLE_DECLINAISON_COULEUR", root.getTable("ARTICLE_DECLINAISON_COULEUR"));
tableArticle.getBase().getDataSource().execute(alter.asString());
tableArticle.getSchema().updateVersion();
tableArticle.fetchFields();
}
 
for (String string : achatItems) {
boolean alter = false;
SQLTable tableItems = root.getTable(string);
final AlterTable t = new AlterTable(tableItems);
 
if (!tableItems.getFieldsName().contains("ID_ARTICLE_DECLINAISON_TAILLE")) {
t.addForeignColumn("ID_ARTICLE_DECLINAISON_TAILLE", root.getTable("ARTICLE_DECLINAISON_TAILLE"));
alter = true;
}
if (!tableItems.getFieldsName().contains("ID_ARTICLE_DECLINAISON_COULEUR")) {
t.addForeignColumn("ID_ARTICLE_DECLINAISON_COULEUR", root.getTable("ARTICLE_DECLINAISON_COULEUR"));
alter = true;
}
 
if (alter) {
tableItems.getBase().getDataSource().execute(t.asString());
tableItems.getSchema().updateVersion();
tableItems.fetchFields();
}
}
 
for (String tableName : tableElementWithTable) {
final SQLTable tableToDecl = root.getTable(tableName);
boolean alter = false;
 
final AlterTable alterDecl = new AlterTable(tableToDecl);
if (!tableToDecl.getFieldsName().contains("ID_ARTICLE_DECLINAISON_TAILLE")) {
alterDecl.addForeignColumn("ID_ARTICLE_DECLINAISON_TAILLE", root.getTable("ARTICLE_DECLINAISON_TAILLE"));
alter = true;
}
if (!tableToDecl.getFieldsName().contains("ID_ARTICLE_DECLINAISON_COULEUR")) {
alterDecl.addForeignColumn("ID_ARTICLE_DECLINAISON_COULEUR", root.getTable("ARTICLE_DECLINAISON_COULEUR"));
alter = true;
}
 
if (alter) {
tableToDecl.getBase().getDataSource().execute(alterDecl.asString());
tableToDecl.getSchema().updateVersion();
tableToDecl.fetchFields();
}
}
 
// Création de la table Tarif promotion
if (!root.contains("TARIF_PROMOTION")) {
 
SQLCreateTable createTarif = new SQLCreateTable(root, "TARIF_PROMOTION");
createTarif.addVarCharColumn("NOM", 256);
createTarif.addColumn("START", "date");
createTarif.addColumn("END", "date");
root.getBase().getDataSource().execute(createTarif.asString());
InstallationPanel.insertUndef(createTarif);
tableDevis.getSchema().updateVersion();
root.refetchTable(createTarif.getName());
}
 
// Création de la table article Tarif promotion
if (!root.contains("ARTICLE_TARIF_PROMOTION")) {
 
SQLCreateTable createTarif = new SQLCreateTable(root, "ARTICLE_TARIF_PROMOTION");
createTarif.addForeignColumn("ID_DEVISE", root.findTable("DEVISE", true));
createTarif.addForeignColumn("ID_TAXE", root.findTable("TAXE", true));
createTarif.addForeignColumn("ID_TARIF_PROMOTION", root.findTable("TARIF_PROMOTION", true));
createTarif.addForeignColumn("ID_ARTICLE", root.findTable("ARTICLE", true));
createTarif.addIntegerColumn("QTE", 1);
createTarif.addDecimalColumn("PV_HT", 16, 6, BigDecimal.ZERO, false);
createTarif.addDecimalColumn("PV_TTC", 16, 6, BigDecimal.ZERO, false);
createTarif.addDecimalColumn("PRIX_METRIQUE_VT_1", 16, 6, BigDecimal.ZERO, false);
createTarif.addDecimalColumn("PRIX_METRIQUE_VT_2", 16, 6, BigDecimal.ZERO, false);
createTarif.addDecimalColumn("PRIX_METRIQUE_VT_3", 16, 6, BigDecimal.ZERO, false);
root.getBase().getDataSource().execute(createTarif.asString());
InstallationPanel.insertUndef(createTarif);
tableDevis.getSchema().updateVersion();
root.refetchTable(createTarif.getName());
}
 
if (!root.contains("TAXE_CATEGORIE_COMPTABLE")) {
 
final SQLCreateTable createTableTaxeCat = new SQLCreateTable(root, "TAXE_CATEGORIE_COMPTABLE");
createTableTaxeCat.addForeignColumn("ID_CATEGORIE_COMPTABLE", root.getTable("CATEGORIE_COMPTABLE"));
createTableTaxeCat.addForeignColumn("ID_TAXE", root.getTable("TAXE"));
createTableTaxeCat.addForeignColumn("ID_COMPTE_PCE_VENTE", root.getTable("COMPTE_PCE"));
createTableTaxeCat.addForeignColumn("ID_COMPTE_PCE_ACHAT", root.getTable("COMPTE_PCE"));
 
try {
root.getBase().getDataSource().execute(createTableTaxeCat.asString());
InstallationPanel.insertUndef(createTableTaxeCat);
root.refetchTable("TAXE_CATEGORIE_COMPTABLE");
root.getSchema().updateVersion();
} catch (SQLException ex) {
throw new IllegalStateException("Erreur lors de la création de la table " + "TAXE_CATEGORIE_COMPTABLE", ex);
}
 
}
 
if (!root.contains("LOT_RECEPTION")) {
SQLCreateTable createLotReception = new SQLCreateTable(root, "LOT_RECEPTION");
createLotReception.addDateAndTimeColumn("DATE_RECEPTION");
createLotReception.addVarCharColumn("FOURNISSEUR", 256);
createLotReception.addVarCharColumn("ARTICLE", 256);
createLotReception.addForeignColumn("ID_ARTICLE", root.findTable("ARTICLE", true));
createLotReception.addForeignColumn("ID_DEPOT_STOCK", root.findTable("DEPOT_STOCK", true));
createLotReception.addDecimalColumn("QUANTITE", 16, 6, BigDecimal.ONE, false);
createLotReception.addVarCharColumn("NUMERO_LOT", 256);
createLotReception.addVarCharColumn("NUMERO_SERIE", 256);
createLotReception.addDateAndTimeColumn("DLC");
createLotReception.addDateAndTimeColumn("DLUO");
createLotReception.addForeignColumn("ID_BON_RECEPTION_ELEMENT", root.findTable("BON_RECEPTION_ELEMENT", true));
root.getBase().getDataSource().execute(createLotReception.asString());
InstallationPanel.insertUndef(createLotReception);
 
SQLCreateTable createLotLivraison = new SQLCreateTable(root, "LOT_LIVRAISON");
createLotLivraison.addDateAndTimeColumn("DATE_LIVRAISON");
createLotLivraison.addVarCharColumn("CLIENT", 256);
createLotLivraison.addVarCharColumn("ARTICLE", 256);
createLotLivraison.addForeignColumn("ID_ARTICLE", root.findTable("ARTICLE", true));
createLotLivraison.addForeignColumn("ID_DEPOT_STOCK", root.findTable("DEPOT_STOCK", true));
createLotLivraison.addDecimalColumn("QUANTITE", 16, 6, BigDecimal.ONE, false);
createLotLivraison.addVarCharColumn("NUMERO_LOT", 256);
createLotLivraison.addVarCharColumn("NUMERO_SERIE", 256);
createLotLivraison.addDateAndTimeColumn("DLC");
createLotLivraison.addDateAndTimeColumn("DLUO");
createLotLivraison.addForeignColumn("ID_BON_DE_LIVRAISON_ELEMENT", root.findTable("BON_DE_LIVRAISON_ELEMENT", true));
root.getBase().getDataSource().execute(createLotLivraison.asString());
InstallationPanel.insertUndef(createLotLivraison);
}
 
if (!root.contains("LOT")) {
SQLCreateTable createLot = new SQLCreateTable(root, "LOT");
createLot.addForeignColumn("ID_STOCK", root.findTable("STOCK", true));
createLot.addDecimalColumn("QUANTITE", 16, 6, BigDecimal.ONE, false);
createLot.addVarCharColumn("NUMERO_LOT", 256);
createLot.addVarCharColumn("NUMERO_SERIE", 256);
createLot.addDateAndTimeColumn("DLC");
createLot.addDateAndTimeColumn("DLUO");
root.getBase().getDataSource().execute(createLot.asString());
InstallationPanel.insertUndef(createLot);
 
SQLCreateTable createTransfertStock = new SQLCreateTable(root, "TRANSFERT_STOCK");
createTransfertStock.addDateAndTimeColumn("DATE");
createTransfertStock.addForeignColumn("ID_ARTICLE", root.findTable("ARTICLE", true));
createTransfertStock.addForeignColumn("ID_DEPOT_STOCK_SOURCE", root.findTable("DEPOT_STOCK", true));
createTransfertStock.addForeignColumn("ID_DEPOT_STOCK_DEST", root.findTable("DEPOT_STOCK", true));
createTransfertStock.addDecimalColumn("QUANTITE", 16, 6, BigDecimal.ONE, false);
createTransfertStock.addVarCharColumn("NUMEROS_SERIE", 50000);
createTransfertStock.addVarCharColumn("NUMEROS_LOT", 50000);
createTransfertStock.addVarCharColumn("CONTEXTE", 256);
 
root.getBase().getDataSource().execute(createTransfertStock.asString());
InstallationPanel.insertUndef(createTransfertStock);
 
final AlterTable alterArticle = new AlterTable(tableArticle);
alterArticle.addBooleanColumn("NUMERO_LOT_REQUIS", false, false);
alterArticle.addBooleanColumn("NUMERO_SERIE_REQUIS", false, false);
alterArticle.addBooleanColumn("DLC_REQUIS", false, false);
alterArticle.addBooleanColumn("DLUO_REQUIS", false, false);
tableArticle.getBase().getDataSource().execute(alterArticle.asString());
tableArticle.getSchema().updateVersion();
tableArticle.fetchFields();
 
final AlterTable alterBonReceptionElement = new AlterTable(root.getTable("BON_RECEPTION_ELEMENT"));
alterBonReceptionElement.addForeignColumn("ID_LOT", createLot);
tableArticle.getBase().getDataSource().execute(alterBonReceptionElement.asString());
 
final AlterTable alterBonLivraisonElement = new AlterTable(root.getTable("BON_DE_LIVRAISON"));
alterBonLivraisonElement.addForeignColumn("ID_LOT", createLot);
tableArticle.getBase().getDataSource().execute(alterBonLivraisonElement.asString());
tableArticle.getSchema().updateVersion();
root.refetch();
}
 
SQLTable tableBR = root.getTable("BON_RECEPTION");
SQLTable tableModele = root.getTable("MODELE");
if (!tableBR.contains("ID_MODELE")) {
AlterTable a = new AlterTable(tableBR);
a.addForeignColumn("ID_MODELE", tableModele);
root.getBase().getDataSource().execute(a.asString());
tableBR.getSchema().updateVersion();
root.refetchTable(tableBR.getName());
}
 
SQLTable typeModele = tableModele.getForeignTable("ID_TYPE_MODELE");
SQLSelect sel = new SQLSelect();
sel.addSelect(typeModele.getKey());
sel.setWhere(new Where(typeModele.getField("TABLE"), "=", "BON_RECEPTION"));
List<SQLRow> l = SQLRowListRSH.execute(sel);
if (l.isEmpty()) {
SQLRowValues rowVals = new SQLRowValues(typeModele);
rowVals.put("TABLE", "BON_RECEPTION");
rowVals.put("NOM", "Bon de réception");
rowVals.put("DEFAULT_MODELE", "BonReception");
rowVals.commit();
}
// Fix undefined
new SetFKDefault(root.getDBSystemRoot()).changeAll(root);
List<SQLUpdate> ups = new ArrayList<>();
if (userT.getUndefinedIDNumber() != null) {
for (SQLField userF : root.getDBSystemRoot().getGraph().getReferentKeys(userT)) {
if (userF.getTable().getDBRoot() == root) {
SQLUpdate up = new SQLUpdate(Where.isNull(userF));
up.add(userF, userT.getUndefinedIDNumber());
ups.add(up);
}
}
}
if (!ups.isEmpty()) {
SQLUpdate.executeMultipleWithBatch(root.getDBSystemRoot(), ups);
System.err.println("Updater_1_5.update() fixed " + ups.size() + " error(s) on FK to USER_COMMON");
} else {
System.err.println("Updater_1_5.update() no error on FK to USER_COMMON");
}
}
 
public static void initStock(SQLRow rowArticle, int idDepot) {
 
SQLSelect selStock = new SQLSelect();
/trunk/OpenConcerto/src/org/openconcerto/erp/config/MinimalMenuConfiguration.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
42,9 → 42,7
 
final Group fileMenu = new Group(MainFrame.FILE_MENU);
fileMenu.addItem("backup");
if (!Gestion.MAC_OS_X) {
fileMenu.addItem("quit");
}
fileMenu.addItem(MainFrame.QUIT_MENU_ITEM);
res.add(fileMenu);
 
if (rights.haveRight(LockAdminUserRight.LOCK_MENU_ADMIN)) {
54,7 → 52,7
}
 
final Group helpMenu = new Group(MainFrame.HELP_MENU);
helpMenu.addItem("information");
helpMenu.addItem(MainFrame.ABOUT_MENU_ITEM);
 
res.add(helpMenu);
}
/trunk/OpenConcerto/src/org/openconcerto/erp/modules/AvailableModulesPanel.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
32,6 → 32,7
import java.text.MessageFormat;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
 
import javax.swing.AbstractAction;
227,21 → 228,16
JOptionPane.showMessageDialog(panel, "Impossible d'installer le module. Le fichier n'est pas un module.");
return;
}
final File dir = Gestion.MODULES_DIR;
// TODO test symlink in Java 7
if (!dir.isDirectory()) {
if (dir.exists()) {
JOptionPane.showMessageDialog(panel, "Le fichier existe mais n'est pas un dossier : " + dir.getAbsolutePath());
return;
final List<File> dirs = panel.getModuleManager().getFolders();
final File dir = ModuleManager.getFolderToWrite(dirs);
if (dir == null) {
if (dirs.isEmpty()) {
JOptionPane.showMessageDialog(panel, "Aucun dossier configuré");
} else {
try {
FileUtils.mkdir_p(dir);
} catch (IOException e) {
JOptionPane.showMessageDialog(panel, "Impossible de créer le dossier des modules : " + dir.getAbsolutePath());
JOptionPane.showMessageDialog(panel, "Impossible de créer le dossier des modules : " + dirs);
}
return;
}
}
}
File out = null;
if (dir.canWrite()) {
try {
/trunk/OpenConcerto/src/org/openconcerto/erp/modules/ModuleLauncher.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
16,10 → 16,12
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.config.Gestion;
import org.openconcerto.erp.modules.ModulePackager.ModuleFiles;
import org.openconcerto.utils.FileUtils;
import org.openconcerto.utils.BaseDirs;
 
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
 
/**
* Package a module from a project and launch it. The system property {@link #MODULE_DIR_PROP} must
50,10 → 52,6
 
// always update dist/ to avoid out of date problems
final File jar = ModulePackager.createDist(moduleFiles);
// to avoid out of date modules from OpenConcerto (e.g. when launching this module, the jars
// of MODULES_DIR are used for dependencies)
FileUtils.mkdir_p(Gestion.MODULES_DIR);
FileUtils.copyFile(jar, new File(Gestion.MODULES_DIR, jar.getName()));
 
final PropsModuleFactory factory;
if (launchFromPackage) {
68,7 → 66,14
}
 
Gestion.main(args);
 
final ModuleManager moduleManager = ComptaPropsConfiguration.getInstanceCompta().getModuleManager();
// to avoid out of date modules from OpenConcerto (e.g. when launching this module, the jars
// of MODULES_DIR are used for dependencies)
final File modulesDir = BaseDirs.getFolderToWrite(moduleManager.getFolders().get(0));
Files.copy(jar.toPath(), modulesDir.toPath().resolve(jar.getName()), StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES);
 
// add after main() otherwise we could be overwritten by an older jar
ComptaPropsConfiguration.getInstanceCompta().getModuleManager().addFactoryAndStart(factory, false);
moduleManager.addFactoryAndStart(factory, false);
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/modules/ModuleManager.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
54,6 → 54,7
import org.openconcerto.sql.utils.SQLUtils.SQLFactory;
import org.openconcerto.sql.view.list.IListeAction;
import org.openconcerto.ui.SwingThreadUtils;
import org.openconcerto.utils.BaseDirs;
import org.openconcerto.utils.CollectionMap2.Mode;
import org.openconcerto.utils.CollectionUtils;
import org.openconcerto.utils.ExceptionHandler;
225,6 → 226,8
 
// final (thus safely published) and thread-safe
private final FactoriesByID factories;
@GuardedBy("this")
private List<File> folders = Collections.emptyList();
// to avoid starting twice the same module
// we synchronize the whole install/start and stop/uninstall
@GuardedBy("this")
316,6 → 319,41
 
// *** factories (thread-safe)
 
public final void setFolders(final File... dirs) {
this.setFolders(Arrays.asList(dirs));
}
 
// The system directories should be before the user directories.
// This order is important for getFolderToWrite() and allow the user modules to replace the
// system ones.
public final void setFolders(final List<File> dirs) {
final List<File> absolutes = new ArrayList<>(dirs.size());
for (final File dir : dirs) {
final File abs = dir.getAbsoluteFile();
this.addFactories(abs);
absolutes.add(abs);
}
synchronized (this) {
this.folders = Collections.unmodifiableList(absolutes);
}
}
 
public synchronized final List<File> getFolders() {
return this.folders;
}
 
public static final File getFolderToWrite(final List<File> dirs) {
// Try to install in system directory first, then fall back to user directory.
for (final File dir : dirs) {
try {
return BaseDirs.getFolderToWrite(dir);
} catch (IOException e) {
// try next one
}
}
return null;
}
 
public final int addFactories(final File dir) {
if (!dir.exists()) {
L.warning("Module factory directory not found: " + dir.getAbsolutePath());
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/CommandeFactureEltSQLInjector.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
20,7 → 20,9
public CommandeFactureEltSQLInjector(final DBRoot root) {
super(root, "COMMANDE_CLIENT_ELEMENT", "SAISIE_VENTE_FACTURE_ELEMENT", false);
createDefaultMap();
if (getSource().contains("QTE_LIVREE") && getDestination().contains("QTE_LIVREE")) {
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/DevisEltCmdEltSQLInjector.java
New file
0,0 → 1,27
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011-2019 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.injector;
 
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLInjector;
 
public class DevisEltCmdEltSQLInjector extends SQLInjector {
public DevisEltCmdEltSQLInjector(final DBRoot root) {
super(root, "DEVIS_ELEMENT", "COMMANDE_CLIENT_ELEMENT", false);
createDefaultMap();
if (getDestination().contains("ID_DEVIS_ELEMENT")) {
map(getSource().getKey(), getDestination().getField("ID_DEVIS_ELEMENT"));
}
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/CommandeFactureClientSQLInjector.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
32,6 → 32,9
if (tableCommande.contains("ID_TAXE_PORT")) {
map(tableCommande.getField("ID_TAXE_PORT"), tableFacture.getField("ID_TAXE_PORT"));
}
if (tableCommande.contains("T_ACOMPTE")) {
map(tableCommande.getField("T_ACOMPTE"), tableFacture.getField("T_ACOMPTE"));
}
if (tableCommande.contains("PORT_HT")) {
map(tableCommande.getField("PORT_HT"), tableFacture.getField("PORT_HT"));
}
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/CommandeBlSQLInjector.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
72,7 → 72,10
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().contains("ID_COMMERCIAL") && getDestination().contains("ID_COMMERCIAL")) {
map(getSource().getField("ID_COMMERCIAL"), getDestination().getField("ID_COMMERCIAL"));
}
}
 
@Override
protected void merge(SQLRowAccessor srcRow, SQLRowValues rowVals) {
/trunk/OpenConcerto/src/org/openconcerto/erp/injector/BonReceptionFactureFournisseurSQLInjector.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
45,6 → 45,13
@Override
protected void merge(SQLRowAccessor srcRow, SQLRowValues rowVals) {
super.merge(srcRow, rowVals);
SQLRowAccessor rowFournisseur = srcRow.getNonEmptyForeign("ID_FOURNISSEUR");
if (rowFournisseur != null) {
SQLRowAccessor rowCompte = rowFournisseur.getNonEmptyForeign("ID_COMPTE_PCE_CHARGE");
if (rowCompte != null) {
rowVals.put("ID_COMPTE_PCE", rowCompte.getID());
}
}
 
// Merge elements
final SQLTable tableElementSource = getSource().getTable("BON_RECEPTION_ELEMENT");
/trunk/OpenConcerto/src/org/openconcerto/erp/action/AboutAction.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
15,7 → 15,6
 
import org.openconcerto.erp.config.Benchmark;
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.config.Gestion;
import org.openconcerto.sql.ui.InfoPanel;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JLabelBold;
30,7 → 29,6
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
 
import javax.swing.AbstractAction;
import javax.swing.Action;
115,18 → 113,14
p.add(new JLabel(dbPath), c);
}
c.gridy++;
try {
c.gridx = 0;
c.weightx = 0;
c.anchor = GridBagConstraints.EAST;
p.add(new JLabelBold("Dossier des modules : "), c);
p.add(new JLabelBold("Dossiers des modules : "), c);
c.gridx++;
c.weightx = 1;
c.anchor = GridBagConstraints.WEST;
p.add(new JLabel(Gestion.MODULES_DIR.getCanonicalPath()), c);
} catch (IOException e) {
e.printStackTrace();
}
p.add(new JLabel(this.conf.getModuleManager().getFolders().toString()), c);
 
return p;
}
/trunk/OpenConcerto/src/org/openconcerto/erp/action/NouvelleConnexionAction.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
31,6 → 31,7
import org.openconcerto.erp.modules.ModuleManager;
import org.openconcerto.erp.panel.ComptaTipsFrame;
import org.openconcerto.erp.preferences.GestionClientPreferencePanel;
import org.openconcerto.erp.rights.DepotStockViewRightEditor;
import org.openconcerto.erp.rights.GroupUIComboRightEditor;
import org.openconcerto.erp.rights.MenuComboRightEditor;
import org.openconcerto.erp.utils.NXDatabaseAccessor;
197,9 → 198,11
MenuComboRightEditor.register();
GroupUIComboRightEditor.register();
SQLTableRightEditor.register();
DepotStockViewRightEditor.register();
// even for quick login, check the license before displaying the main
// frame
 
 
MutableListComboPopupListener.setLockOverridable(rights.isSuperUser());
 
StatusPanel.getInstance().fireStatusChanged();
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/SheetUtils.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
19,15 → 19,22
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.FileUtils;
 
import java.awt.Color;
import java.awt.Desktop;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
34,9 → 41,13
 
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentInformation;
import org.apache.pdfbox.pdmodel.PDDocumentNameDictionary;
import org.apache.pdfbox.pdmodel.PDEmbeddedFilesNameTreeNode;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.common.filespecification.PDComplexFileSpecification;
import org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile;
import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
import org.apache.pdfbox.util.Matrix;
import org.jopendocument.model.OpenDocument;
139,7 → 150,12
}
 
public static void convert2PDF(final OpenDocument doc, final File pdfFileToCreate) throws Exception {
convert2PDF(doc, pdfFileToCreate, Collections.emptyList());
}
 
public static void convert2PDF(final OpenDocument doc, final File pdfFileToCreate, final List<PDFAttachment> attachments) throws Exception {
assert (!SwingUtilities.isEventDispatchThread());
System.out.println("SheetUtils convert2PDF " + doc.getLoadedFile().getAbsolutePath() + " -> " + pdfFileToCreate.getAbsolutePath());
try {
PDDocument document = new PDDocument();
PDDocumentInformation info = new PDDocumentInformation();
149,8 → 165,29
info.setModificationDate(Calendar.getInstance());
document.setDocumentInformation(info);
 
FileOutputStream fileOutputStream = new FileOutputStream(pdfFileToCreate);
// Attachments
final PDEmbeddedFilesNameTreeNode efTree = new PDEmbeddedFilesNameTreeNode();
final Map<String, PDComplexFileSpecification> efMap = new HashMap<>();
for (final PDFAttachment att : attachments) {
// first create the file specification, which holds the embedded file
final PDComplexFileSpecification fs = new PDComplexFileSpecification();
fs.setFile(att.getFileName());
final InputStream is = new ByteArrayInputStream(att.getBytes());
final PDEmbeddedFile ef = new PDEmbeddedFile(document, is);
// set some of the attributes of the embedded file
ef.setSubtype(att.getMimetype());
ef.setSize(att.getBytes().length);
ef.setCreationDate(new GregorianCalendar());
fs.setEmbeddedFile(ef);
efMap.put(att.getName(), fs);
}
 
efTree.setNames(efMap);
// attachments are stored as part of the "names" dictionary in the document catalog
final PDDocumentNameDictionary names = new PDDocumentNameDictionary(document.getDocumentCatalog());
names.setEmbeddedFiles(efTree);
document.getDocumentCatalog().setNames(names);
 
PdfBoxGraphics2DFontTextDrawer fontTextDrawer = new PdfBoxGraphics2DFontTextDrawerDefaultFonts();
final File dir = new File("Fonts");
if (dir.exists()) {
169,23 → 206,24
// Configure the renderer
ODTRenderer renderer = new ODTRenderer(doc);
renderer.setIgnoreMargins(false);
renderer.setResizeFactor(100);
renderer.setPaintMaxResolution(true);
PDRectangle pageSize = PDRectangle.A4;
 
// Scale the renderer to fit width or height
final double widthFactor = renderer.getPrintWidth() / pageSize.getWidth();
final double heightFactor = renderer.getPrintHeight() / pageSize.getHeight();
renderer.setResizeFactor(Math.max(widthFactor, heightFactor));
 
final int resizeFactor = (int) Math.ceil(Math.max(widthFactor, heightFactor));
renderer.setResizeFactor(resizeFactor);
// Print pages
for (int i = 0; i < renderer.getPrintedPagesNumber(); i++) {
PDPage page = new PDPage(pageSize);
final PDPage page = new PDPage(pageSize);
document.addPage(page);
PdfBoxGraphics2D g2 = new PdfBoxGraphics2D(document, pageSize.getWidth(), pageSize.getHeight());
g2.setFontTextDrawer(fontTextDrawer);
 
// centrage horizontal, alignement vertical en haut
g2.translate((PageSize.A4.getWidth() - renderer.getPrintWidthInPixel()) / 2.0, 0);
final double hMargin = (pageSize.getWidth() - renderer.getPageWidthInPixel()) / 2.0;
g2.translate(hMargin, 0);
 
// Render
renderer.setCurrentPage(i);
199,8 → 237,9
contentStream.transform(matrix);
contentStream.drawForm(xform);
contentStream.close();
 
}
document.save(fileOutputStream);
document.save(pdfFileToCreate);
// Close the PDF document
document.close();
 
226,4 → 265,12
final File f = new File(file.getParent(), name);
return f;
}
 
public static void main(String[] args) throws Exception {
// final OpenDocument doc = new OpenDocument(new File("Documents/Facture_FACT128.ods"));
final OpenDocument doc = new OpenDocument(new File("../ODSViewer/documents/bug_marges_pdf/Devis.ods"));
final File file = new File("out.pdf");
convert2PDF(doc, file);
Desktop.getDesktop().open(file);
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/SheetXml.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
15,9 → 15,12
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.common.ui.PreviewFrame;
import org.openconcerto.erp.core.customerrelationship.mail.EmailTemplate;
import org.openconcerto.erp.core.customerrelationship.mail.ValueListener;
import org.openconcerto.erp.core.sales.invoice.report.VenteFactureXmlSheet;
import org.openconcerto.erp.core.sales.quote.report.PaypalStamper;
import org.openconcerto.erp.generationDoc.element.TypeModeleSQLElement;
import org.openconcerto.erp.model.MouseSheetXmlListeListener;
import org.openconcerto.erp.preferences.PayPalPreferencePanel;
import org.openconcerto.erp.storage.CloudStorageEngine;
import org.openconcerto.erp.storage.StorageEngine;
25,13 → 28,21
import org.openconcerto.openoffice.OOUtils;
import org.jopendocument.link.Component;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.EditPanel.EditMode;
import org.openconcerto.ui.FrameUtil;
import org.openconcerto.utils.Action;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.cc.ITransformer;
import org.openconcerto.utils.i18n.Grammar;
import org.openconcerto.utils.i18n.TranslationManager;
 
import java.awt.GraphicsEnvironment;
import java.awt.print.PrinterJob;
49,7 → 60,9
import java.net.URLConnection;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
140,15 → 153,19
return this.elt;
}
 
public Future<SheetXml> showPrintAndExportAsynchronous(final boolean showDocument, final boolean printDocument, final boolean exportToPDF) {
return showPrintAndExportAsynchronous(showDocument, printDocument, exportToPDF, Collections.emptyList());
}
 
/**
* Show, print and export the document to PDF. This method is asynchronous, but is executed in a
* single threaded queue shared with createDocument
*/
public Future<SheetXml> showPrintAndExportAsynchronous(final boolean showDocument, final boolean printDocument, final boolean exportToPDF) {
public Future<SheetXml> showPrintAndExportAsynchronous(final boolean showDocument, final boolean printDocument, final boolean exportToPDF, List<Action> actions) {
final Callable<SheetXml> c = new Callable<SheetXml>() {
@Override
public SheetXml call() throws Exception {
showPrintAndExport(showDocument, printDocument, exportToPDF);
showPrintAndExport(showDocument, printDocument, exportToPDF, actions);
return SheetXml.this;
}
};
156,6 → 173,55
 
}
 
public Future<SheetXml> showPrintAndExportAsynchronous(final boolean showDocument, final boolean printDocument, final boolean exportToPDF, final SQLElement element, SQLRow row) {
final Callable<SheetXml> c = new Callable<SheetXml>() {
 
@Override
public SheetXml call() throws Exception {
final List<Action> actions = new ArrayList<>();
if (SheetXml.this instanceof AbstractSheetXml) {
final SQLTable table = element.getTable();
final Action emailAction = new Action(TranslationManager.getInstance().getTranslationForAction("document.pdf.send.email")) {
 
@Override
public void run(Object source) {
EmailTemplate.askTemplate(null, table.getDBRoot(), new ValueListener() {
 
@Override
public void valueSelected(Object value) {
final MouseSheetXmlListeListener l = new MouseSheetXmlListeListener(element, ((AbstractSheetXml) SheetXml.this).getClass());
l.sendMail((EmailTemplate) value, (AbstractSheetXml) SheetXml.this, true);
}
});
 
}
};
actions.add(emailAction);
}
final Action modifyAction = new Action(TranslationManager.getInstance().getTranslationForAction("modify") + " " + element.getName().getVariant(Grammar.DEFINITE_ARTICLE_SINGULAR)) {
 
@Override
public void run(Object source) {
if (source instanceof PreviewFrame) {
((PreviewFrame) source).dispose();
}
 
final SQLComponent component = element.createDefaultComponent();
final EditFrame f = new EditFrame(component, EditMode.MODIFICATION);
f.selectionId(row.getID());
FrameUtil.show(f);
 
}
};
actions.add(modifyAction);
showPrintAndExport(showDocument, printDocument, exportToPDF, actions);
return SheetXml.this;
}
};
return runnableQueue.submit(c);
 
}
 
public static Future<?> submitInQueue(final Runnable r) {
 
return runnableQueue.submit(r);
162,13 → 228,21
}
 
public void showPrintAndExport(final boolean showDocument, final boolean printDocument, boolean exportToPDF) {
showPrintAndExport(showDocument, printDocument, exportToPDF, Boolean.getBoolean("org.openconcerto.oo.useODSViewer"), false);
showPrintAndExport(showDocument, printDocument, exportToPDF, Boolean.getBoolean("org.openconcerto.oo.useODSViewer"), false, Collections.emptyList());
}
 
public void showPrintAndExport(final boolean showDocument, final boolean printDocument, boolean exportToPDF, List<Action> actions) {
showPrintAndExport(showDocument, printDocument, exportToPDF, Boolean.getBoolean("org.openconcerto.oo.useODSViewer"), false, actions);
}
 
public void showPrintAndExport(final boolean showDocument, final boolean printDocument, boolean exportToPDF, boolean useODSViewer, boolean exportPDFSynch) {
showPrintAndExport(showDocument, printDocument, exportToPDF, useODSViewer, exportPDFSynch, Collections.emptyList());
}
 
/**
* Show, print and export the document to PDF. This method is synchronous
*/
public void showPrintAndExport(final boolean showDocument, final boolean printDocument, boolean exportToPDF, boolean useODSViewer, boolean exportPDFSynch) {
public void showPrintAndExport(final boolean showDocument, final boolean printDocument, boolean exportToPDF, boolean useODSViewer, boolean exportPDFSynch, List<Action> actions) {
 
final File generatedFile = getGeneratedFile();
final File pdfFile = getGeneratedPDFFile();
200,7 → 274,7
final OpenDocument doc = new OpenDocument(generatedFile);
 
if (showDocument) {
showPreviewDocument();
showPreviewDocument(actions);
}
if (printDocument) {
// Print !
262,88 → 336,17
throw new IllegalArgumentException("null PDF file");
}
try {
if (VenteFactureXmlSheet.TEMPLATE_ID.equals(getDefaultTemplateId())) {
final SQLPreferences prefs = SQLPreferences.getMemCached(getElement().getTable().getDBRoot());
if (prefs.getBoolean(PayPalPreferencePanel.PAYPAL_INVOICE, false)) {
try {
final File inFile = File.createTempFile("oc_", pdfFile.getName());
SheetUtils.convert2PDF(doc, inFile);
PaypalStamper s = new PaypalStamper();
int x = prefs.getInt(PayPalPreferencePanel.PAYPAL_INVOICE_X, 0);
int y = prefs.getInt(PayPalPreferencePanel.PAYPAL_INVOICE_Y, 0);
 
// Reference
String ref = getSQLRow().getString("NUMERO");
// Montant : ex : 10.55
long cents = getSQLRow().getLong("NET_A_PAYER");
String amount = cents / 100 + "." + cents % 100;
// Devise
// TODO : autres devises
String currency = "EUR";
// POST
final URL url = new URL("https://cloud.openconcerto.org/payment");
final URLConnection con = url.openConnection();
final HttpURLConnection http = (HttpURLConnection) con;
http.setRequestMethod("POST");
http.setDoOutput(true);
http.setDefaultUseCaches(false);
 
String hyperlink = null;
// x-www-form-urlencoded
final Map<String, String> arguments = new HashMap<>();
arguments.put("pI", prefs.get(PayPalPreferencePanel.PAYPAL_CLIENTID, ""));
arguments.put("pS", prefs.get(PayPalPreferencePanel.PAYPAL_SECRET, ""));
arguments.put("ref", ref);
arguments.put("amount", amount);
arguments.put("currency", currency);
arguments.put("type", "paypal");
final StringJoiner sj = new StringJoiner("&");
for (Map.Entry<String, String> entry : arguments.entrySet()) {
sj.add(URLEncoder.encode(entry.getKey(), "UTF-8") + "=" + URLEncoder.encode(entry.getValue(), "UTF-8"));
}
final String postData = sj.toString();
System.err.println("SheetXml.createPDF() " + postData);
byte[] out = postData.getBytes(StandardCharsets.UTF_8);
int length = out.length;
http.setFixedLengthStreamingMode(length);
http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
http.connect();
try (OutputStream os = http.getOutputStream()) {
os.write(out);
}
if (http.getResponseCode() != 401) {
 
InputStream is = http.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
 
int numCharsRead;
char[] charArray = new char[1024];
StringBuilder sb = new StringBuilder();
while ((numCharsRead = isr.read(charArray)) > 0) {
sb.append(charArray, 0, numCharsRead);
}
//
hyperlink = sb.toString();
}
s.addLink(inFile, pdfFile, x, y, hyperlink);
SheetUtils.convert2PDF(doc, pdfFile);
} catch (Exception e) {
e.printStackTrace();
SheetUtils.convert2PDF(doc, pdfFile);
}
 
} else {
SheetUtils.convert2PDF(doc, pdfFile);
}
} else {
SheetUtils.convert2PDF(doc, pdfFile);
}
 
} catch (Throwable e) {
ExceptionHandler.handle("Impossible de créer le PDF " + pdfFile.getAbsolutePath(), e);
}
if (!pdfFile.canRead()) {
ExceptionHandler.handle("Le fichier PDF " + pdfFile.getAbsolutePath() + " ne peut être lu.");
}
storeWithStorageEngines(generatedFile, pdfFile, storagePath);
}
 
protected void storeWithStorageEngines(final File generatedFile, final File pdfFile, String storagePath) {
List<StorageEngine> engines = StorageEngines.getInstance().getActiveEngines();
for (StorageEngine storageEngine : engines) {
if (storageEngine.isConfigured() && storageEngine.allowAutoStorage()) {
490,12 → 493,12
File f = getGeneratedPDFFile();
if (!f.exists()) {
getOrCreateDocumentFile();
showPrintAndExport(false, false, true, useODSViewer, true);
showPrintAndExport(false, false, true, useODSViewer, true, Collections.emptyList());
return f;
} else {
File fODS = getOrCreateDocumentFile();
if (fODS.lastModified() > f.lastModified()) {
showPrintAndExport(false, false, true, useODSViewer, true);
showPrintAndExport(false, false, true, useODSViewer, true, Collections.emptyList());
}
return f;
}
547,13 → 550,13
}
 
public void showPreviewDocument() throws Exception {
showPreviewDocument(null, null);
showPreviewDocument(Collections.emptyList());
}
 
public void showPreviewDocument(String actionName, Runnable r) throws Exception {
public void showPreviewDocument(List<Action> actions) throws Exception {
File f = null;
f = getOrCreateDocumentFile();
PreviewFrame.show(f, actionName, r);
PreviewFrame.show(f, actions);
}
 
public void printDocument() {
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/gestcomm/ReleveChequeEmisSheet.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
83,5 → 83,6
 
// Total
this.mCell.put("L45", new Double(GestionDevise.currencyToString(montantTotal, false)));
this.nbPage = 1;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/gestcomm/AvoirClientXmlSheet.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
38,6 → 38,7
super(row);
this.printer = PrinterNXProps.getInstance().getStringProperty("BonPrinter");
this.elt = Configuration.getInstance().getDirectory().getElement("AVOIR_CLIENT");
this.setPostProcess(new OptionDocProcessor());
}
 
 
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/gestcomm/EtatVentesXmlSheet.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
30,6 → 30,7
import org.openconcerto.sql.model.SQLSelectJoin;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.utils.ListMap;
import org.openconcerto.utils.Tuple2;
 
import java.math.BigDecimal;
146,13 → 147,19
// 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");
SQLRowValues rowValsStock = new SQLRowValues(tableFactureElement.getTable("STOCK"));
rowValsStock.putNulls("QTE_REEL", "QTE_TH", "QTE_MIN", "QTE_RECEPT_ATTENTE", "QTE_LIV_ATTENTE").put("ID_ARTICLE", rowValsArtStock);
SQLRowValuesListFetcher fetcherStock = SQLRowValuesListFetcher.create(rowValsArtStock);
List<SQLRowValues> resultStock = fetcherStock.fetch();
Map<Integer, SQLRowValues> mapStock = new HashMap<>();
 
ListMap<Integer, SQLRowValues> mapStock = new ListMap<>();
for (SQLRowValues sqlRowValues : resultStock) {
mapStock.put(sqlRowValues.getID(), sqlRowValues);
final Set<SQLRowValues> referentRows = sqlRowValues.getReferentRows(tableFactureElement.getTable("STOCK").getField("ID_ARTICLE"));
for (SQLRowValues sqlRowValues2 : referentRows) {
 
mapStock.add(sqlRowValues.getID(), sqlRowValues2);
}
}
 
// Requete Pour obtenir les quantités pour chaque type de réglement
SQLSelect sel = new SQLSelect();
324,17 → 331,28
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"));
List<SQLRowValues> rowValsArt = mapStock.get(articleID);
BigDecimal totalTh = BigDecimal.ZERO;
BigDecimal totalReel = BigDecimal.ZERO;
BigDecimal min = BigDecimal.ZERO;
BigDecimal attentR = BigDecimal.ZERO;
BigDecimal attenteL = BigDecimal.ZERO;
for (SQLRowValues rowStock : rowValsArt) {
totalTh = totalTh.add(new BigDecimal(rowStock.getFloat("QTE_TH")));
totalReel = totalReel.add(new BigDecimal(rowStock.getFloat("QTE_REEL")));
min = min.add(new BigDecimal(rowStock.getFloat("QTE_MIN")));
attentR = attentR.add(new BigDecimal(rowStock.getFloat("QTE_RECEPT_ATTENTE")));
attenteL = attenteL.add(new BigDecimal(rowStock.getFloat("QTE_LIV_ATTENTE")));
}
 
mValuesStock.put("QTE_TH", totalTh);
mValuesStock.put("QTE_REEL", totalReel);
mValuesStock.put("QTE_MIN", min);
mValuesStock.put("QTE_RECEPT_ATTENTE", attentR);
mValuesStock.put("QTE_LIV_ATTENTE", attenteL);
styleStock.put(listValuesStock.size(), "Normal");
listValuesStock.add(mValuesStock);
 
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/gestcomm/OptionDocProcessor.java
New file
0,0 → 1,78
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011-2019 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.gestcomm;
 
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.utils.cc.ITransformer;
import org.openconcerto.utils.DecimalUtils;
 
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
 
public class OptionDocProcessor implements ITransformer<List<SQLRowAccessor>, List<SQLRowAccessor>> {
 
@Override
public List<SQLRowAccessor> transformChecked(List<SQLRowAccessor> input) {
 
List<SQLRowValues> resultRowValues = new ArrayList(input.size());
SQLRowValues lastRowNonOptionnal = null;
Set<SQLRowValues> recalculPrixUnitaire = new HashSet<SQLRowValues>();
for (SQLRowAccessor sqlRowAccessor : input) {
final SQLRowAccessor nonEmptyForeign = sqlRowAccessor.getNonEmptyForeign("ID_ARTICLE");
final SQLRowValues asRowValues = sqlRowAccessor.asRowValues();
if (lastRowNonOptionnal != null && nonEmptyForeign != null && nonEmptyForeign.getBoolean("OPTION")) {
lastRowNonOptionnal.put("T_PV_HT", lastRowNonOptionnal.getBigDecimal("T_PV_HT").add(asRowValues.getBigDecimal("T_PV_HT")));
lastRowNonOptionnal.put("T_PV_TTC", lastRowNonOptionnal.getBigDecimal("T_PV_TTC").add(asRowValues.getBigDecimal("T_PV_TTC")));
recalculPrixUnitaire.add(lastRowNonOptionnal);
asRowValues.put("PRIX_METRIQUE_VT_1", null);
asRowValues.put("PV_HT", null);
asRowValues.put("T_PV_HT", null);
asRowValues.put("T_PV_TTC", null);
asRowValues.putEmptyLink("ID_TAXE");
} else {
lastRowNonOptionnal = asRowValues;
}
resultRowValues.add(asRowValues);
}
List<SQLRowAccessor> result = new ArrayList(input.size());
 
for (SQLRowValues sqlRowValues : resultRowValues) {
if (recalculPrixUnitaire.contains(sqlRowValues)) {
 
String fieldQte = sqlRowValues.getTable().getName().startsWith("BON_DE_LIVRAISON") ? "QTE_LIVREE" : "QTE";
 
BigDecimal qte = sqlRowValues.getBigDecimal("QTE_UNITAIRE").multiply(new BigDecimal(sqlRowValues.getInt(fieldQte), DecimalUtils.HIGH_PRECISION));
if (qte.signum() != 0) {
 
BigDecimal totalHT = sqlRowValues.getBigDecimal("T_PV_HT");
final BigDecimal remisePercent = sqlRowValues.getBigDecimal("POURCENT_REMISE");
if (remisePercent != null && remisePercent.signum() > 0) {
totalHT = totalHT.divide(BigDecimal.ONE.subtract(remisePercent.movePointLeft(2)), org.openconcerto.utils.DecimalUtils.HIGH_PRECISION);
}
BigDecimal unitPrice = totalHT.divide(qte, DecimalUtils.HIGH_PRECISION);
sqlRowValues.put("PV_HT", unitPrice);
sqlRowValues.put("PRIX_METRIQUE_VT_1", unitPrice);
}
}
result.add(sqlRowValues);
}
 
return result;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOXMLField.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
60,7 → 60,10
this.row = row;
if ((this.row == null || !this.row.getTable().getSchema().getName().equalsIgnoreCase("Common")) && base != null && base.equalsIgnoreCase("COMMON")) {
this.row = ((ComptaPropsConfiguration) Configuration.getInstance()).getRowSociete();
if (!this.row.getString("DATABASE_NAME").equalsIgnoreCase(row.getTable().getDBRoot().getName())) {
this.row = this.row.getTable().getRow(Integer.valueOf(row.getTable().getDBRoot().getName().replaceAll("OpenConcerto", "")));
}
}
if (this.row == null) {
this.row = sqlElt.getTable().getRow(id);
}
530,7 → 533,7
 
private Object getTraduction() {
if (this.rowLanguage == null || this.rowLanguage.isUndefined()) {
return null;
return this.row.getObject(this.elt.getAttributeValue("name"));
}
int id = ReferenceArticleSQLElement.getIdForCNM(row.asRowValues(), false);
SQLTable table = Configuration.getInstance().getBase().getTable("ARTICLE_DESIGNATION");
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOgenerationXML.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
257,16 → 257,21
lastColumn = sheet.resolveHint(oLastColTmp.toString() + 1).x + 1;
}
 
Map<String, Map<Integer, String>> mapStyle = searchStyle(sheet, lastColumn, endPageLine);
int firstLine = Integer.parseInt(tableau.getAttributeValue("firstLine"));
int endLine = Integer.parseInt(tableau.getAttributeValue("endLine"));
Object printRangeObj = sheet.getPrintRanges();
 
final Map<String, Map<Integer, String>> mapStyle;
 
if (tableau.getAttributeValue("table").equalsIgnoreCase("TVA")) {
fillTaxeDocumentMap(tableau, sheet, mapStyle, false);
mapStyle = null;
fillTaxeDocumentMap(tableau, sheet, false);
return;
} else {
mapStyle = searchStyle(sheet, firstLine, lastColumn, endLine);
}
 
int nbPage = fillTable(tableau, row, sheet, mapStyle, true, rowLanguage);
int firstLine = Integer.parseInt(tableau.getAttributeValue("firstLine"));
int endLine = Integer.parseInt(tableau.getAttributeValue("endLine"));
Object printRangeObj = sheet.getPrintRanges();
 
System.err.println("Nombre de page == " + nbPage);
if (nbPage == 1) {
281,10 → 286,9
range[i] = string.subSequence(string.indexOf('.') + 1, string.length()).toString();
}
 
int rowEnd = -1;
if (range.length > 1) {
rowEnd = sheet.resolveHint(range[1]).y + 1;
int rowEndNew = rowEnd * (nbPage);
int rowEnd = sheet.resolveHint(range[1]).y + 1;
int rowEndNew = rowEnd * nbPage;
String sNew = s.replaceAll(String.valueOf(rowEnd), String.valueOf(rowEndNew));
sheet.setPrintRanges(sNew);
System.err.println(" ****** Replace print ranges; Old:" + rowEnd + "--" + s + " New:" + rowEndNew + "--" + sNew);
752,7 → 756,7
return nbCellule;
}
 
private void fillTaxeDocumentMap(Element tableau, Sheet sheet, Map<String, Map<Integer, String>> mapStyle, boolean test) {
private void fillTaxeDocumentMap(Element tableau, Sheet sheet, boolean test) {
 
int line = Integer.parseInt(tableau.getAttributeValue("firstLine"));
List<Element> listElts = tableau.getChildren("element");
892,7 → 896,13
 
// on divise en 2 cellules si il y a des retours à la ligne
if (controleMultiline && value != null && value.toString().indexOf('\n') >= 0) {
String[] values = value.toString().split("\n");
String[] values;
if (cell.getRowsSpanned() < 2) {
// TODO : mettre une option pour splitter ou pas
values = value.toString().split("\n");
} else {
values = new String[] { value.toString() };
}
 
Point p = sheet.resolveHint(location);
int y = 0;
1030,7 → 1040,7
/**
* parcourt l'ensemble de la feuille pour trouver les style définit
*/
private Map<String, Map<Integer, String>> searchStyle(Sheet sheet, int colEnd, int rowEnd) {
private Map<String, Map<Integer, String>> searchStyle(Sheet sheet, int rowDeb, int colEnd, int rowEnd) {
 
if (cacheStyle.get(sheet) != null) {
return cacheStyle.get(sheet);
1043,8 → 1053,10
System.err.println("End column search : " + columnCount);
 
int rowCount = (rowEnd > 0) ? rowEnd : sheet.getRowCount();
int start = (rowDeb - 1 > 0) ? rowDeb - 1 : 0;
 
System.err.println("End row search : " + rowCount);
for (int i = 0; i < rowCount; i++) {
for (int i = start; i < rowCount; i++) {
int x = 0;
Map<Integer, String> mapCellStyle = new HashMap<>();
String style = "";
1119,12 → 1131,13
 
Object oLastColTmp = tableau.getAttributeValue("lastColumn");
int lastColumn = -1;
int endPageLine = Integer.parseInt(tableau.getAttributeValue("endPageLine"));
if (oLastColTmp != null) {
lastColumn = sheet.resolveHint(oLastColTmp.toString() + 1).x + 1;
}
int firstLine = Integer.parseInt(tableau.getAttributeValue("firstLine"));
int endLine = Integer.parseInt(tableau.getAttributeValue("endLine"));
 
Map<String, Map<Integer, String>> mapStyle = searchStyle(sheet, lastColumn, endPageLine);
Map<String, Map<Integer, String>> mapStyle = searchStyle(sheet, firstLine, lastColumn, endLine);
 
int nbPage = fillTable(tableau, row, sheet, mapStyle, true, rowLanguage);
 
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOXMLTableElement.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
83,47 → 83,20
}
 
public List<? extends SQLRowAccessor> getRows() {
SQLTable tableElt = Configuration.getInstance().getRoot().findTable(this.tableau.getAttributeValue("table"));
String foreignTableName = this.tableau.getAttributeValue("table");
 
SQLTable tableElt = null;
if (!this.row.isEmpty()) {
SQLTable tableRow = this.row.get(0).getTable();
if (tableRow.getDBRoot().contains(foreignTableName)) {
tableElt = tableRow.getDBRoot().getTable(foreignTableName);
} else {
tableElt = Configuration.getInstance().getRoot().findTable(foreignTableName);
}
}
 
if (tableElt != null) {
 
// // #if gestionnx
// Set<SQLField> fields =
// tablePourcentService.getForeignKeys(tableElt);
//
// if (((ComptaPropsConfiguration)
// Configuration.getInstance()).customerIsPreventec() && fields !=
// null && fields.size() > 0) {
// SQLSelect sel = new
// SQLSelect(Configuration.getInstance().getBase());
//
// sel.addSelectStar(tableElt);
// Set<SQLField> fieldsElt =
// tableElt.getForeignKeys(this.row.getTable());
// Where w = new Where(fieldsElt.iterator().next(), "=",
// this.row.getTable().getKey());
// w = w.and(new Where(fields.iterator().next(), "=",
// tableElt.getKey()));
// w = w.and(new Where(this.row.getTable().getKey(), "=",
// this.row.getID()));
// sel.setWhere(w);
// sel.addFieldOrder(tablePourcentService.getField("ID_VERIFICATEUR"));
// sel.addFieldOrder(fields.iterator().next());
// List<SQLRow> l = (List<SQLRow>)
// Configuration.getInstance().getBase().getDataSource().execute(sel.asString(),
// SQLRowListRSH.createFromSelect(sel, tableElt));
//
// // Suppression des doublons
// List<SQLRow> list = new ArrayList<SQLRow>();
// for (SQLRow sqlRow : l) {
// if (!list.contains(sqlRow)) {
// list.add(sqlRow);
// }
// }
// return list;
// }
// // #endif
 
return cache.getReferentRows(this.row, tableElt, this.tableau.getAttributeValue("groupBy"), this.tableau.getAttributeValue("orderBy"),
Boolean.valueOf(this.tableau.getAttributeValue("expandNomenclature")), this.tableau.getAttributeValue("foreignField"),
Boolean.valueOf(this.tableau.getAttributeValue("excludeZeroQty")));
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/PDFAttachment.java
New file
0,0 → 1,45
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011-2019 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;
 
public class PDFAttachment {
private String name;
private String fileName;
private byte[] bytes;
private String mimetype;
 
public PDFAttachment(String name, String fileName, byte[] bytes, String mimetype) {
this.name = name;
this.fileName = fileName;
this.bytes = bytes;
this.mimetype = mimetype;
}
 
public String getName() {
return name;
}
 
public String getFileName() {
return this.fileName;
}
 
public byte[] getBytes() {
return this.bytes;
}
 
public String getMimetype() {
return this.mimetype;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOgenerationListeColumnXML.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
152,49 → 152,8
}
Map<String, Map<Integer, String>> mapStyle = searchStyle(sheet, lastColumn, endPageLine);
 
// int nbPage = fillTable(tableau, liste, sheet, mapStyle, true, style);
// int firstLine = Integer.valueOf(tableau.getAttributeValue("firstLine"));
// int endLine = Integer.valueOf(tableau.getAttributeValue("endLine"));
// Object printRangeObj = sheet.getPrintRanges();
//
// System.err.println("Nombre de page == " + nbPage);
// if (nbPage == 1) {
// fillTable(tableau, liste, sheet, mapStyle, false, style);
// } else {
//
// if (printRangeObj != null) {
// String s = printRangeObj.toString();
// String[] range = s.split(":");
//
// for (int i = 0; i < range.length; i++) {
// String string = range[i];
// range[i] = string.subSequence(string.indexOf('.') + 1, string.length()).toString();
// }
//
// int rowEnd = -1;
// if (range.length > 1) {
// rowEnd = sheet.resolveHint(range[1]).y + 1;
// int rowEndNew = rowEnd * (nbPage + 1);
// String sNew = s.replaceAll(String.valueOf(rowEnd), String.valueOf(rowEndNew));
// sheet.setPrintRanges(sNew);
// System.err.println(" ****** Replace print ranges; Old:" + rowEnd + "--" + s + " New:" +
// rowEndNew + "--" + sNew);
// }
// }
//
// // le nombre d'éléments ne tient pas dans le tableau du modéle
// sheet.duplicateFirstRows(endLine, 1);
//
// int lineToAdd = endPageLine - endLine;
// sheet.insertDuplicatedRows(firstLine, lineToAdd);
//
// // On duplique la premiere page si on a besoin de plus de deux pages
// System.err.println("nbPage == " + nbPage);
// if (nbPage > 2) {
// sheet.duplicateFirstRows(endPageLine, nbPage - 2);
// }
fillTable(tableau, liste, sheet, mapStyle, false, style);
// }
}
 
/**
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOXMLElement.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
129,6 → 129,10
if (rmBreakLines) {
res = (res == null ? res : res.toString().replaceAll("\n", ","));
}
final String brk = this.elt.getAttributeValue("replaceWithBreakLine");
if (brk != null && brk.trim().length() > 0) {
res = (res == null ? res : res.toString().replaceAll(brk, "\n"));
}
return res;
}
 
145,8 → 149,24
 
protected String getStringProposition(SQLRowAccessor rowProp) {
 
if (rowProp.getTable().getName().equalsIgnoreCase("AFFAIRE")) {
final SQLRowAccessor nonEmptyForeignProp = rowProp.getNonEmptyForeign("ID_PROPOSITION");
String result = "";
if (rowProp.getString("NUMERO_PROPOSITION").trim().length() > 0) {
return "Notre proposition " + rowProp.getString("NUMERO_PROPOSITION");
}
if (nonEmptyForeignProp != null && !nonEmptyForeignProp.isUndefined()) {
if (result.length() == 0) {
result = "Notre proposition " + nonEmptyForeignProp.getString("NUMERO_PROPOSITION");
}
result += " du " + format.format(rowProp.getObject("DATE"));
}
return result;
} else {
 
return "Notre proposition " + rowProp.getString("NUMERO") + " du " + format.format(rowProp.getObject("DATE"));
}
}
 
 
public Double getTotalHTTable(SQLRowAccessor rowFact) {
215,4 → 235,8
public boolean isImage() {
return this.elt.getAttributeValue("type").equalsIgnoreCase("image");
}
 
public SQLElement getSQLElement() {
return this.sqlElt;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/QteLineDocProvider.java
New file
0,0 → 1,71
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011-2019 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 java.math.BigDecimal;
 
public class QteLineDocProvider extends UserInitialsValueProvider {
 
protected enum TypePoidsDocProvider {
POIDS_NET, POIDS_BRUT
};
 
protected final TypePoidsDocProvider type;
 
public QteLineDocProvider(TypePoidsDocProvider t) {
this.type = t;
}
 
@Override
public Object getValue(SpreadSheetCellValueContext context) {
SQLRowAccessor sqlRowAccessor = context.getRow();
return getPoidsFromRow(sqlRowAccessor);
 
}
 
protected BigDecimal getPoidsFromRow(SQLRowAccessor sqlRowAccessor) {
final BigDecimal nbColis;
if (sqlRowAccessor.getObject("NB_COLIS") != null) {
nbColis = new BigDecimal(sqlRowAccessor.getInt("NB_COLIS"));
} else {
nbColis = BigDecimal.ZERO;
}
 
final BigDecimal qteUV = sqlRowAccessor.getBigDecimal("QTE_UNITAIRE");
final BigDecimal qte = new BigDecimal(sqlRowAccessor.getInt("QTE"));
 
final BigDecimal tare;
if (sqlRowAccessor.getObject("TARE") != null) {
tare = new BigDecimal(sqlRowAccessor.getInt("NB_COLIS"));
} else {
tare = BigDecimal.ZERO;
}
 
BigDecimal pdsNet = nbColis.multiply(qte).multiply(qteUV);
if (this.type == TypePoidsDocProvider.POIDS_NET) {
return pdsNet;
} else {
return pdsNet.add(tare.multiply(nbColis));
}
}
 
public static void register() {
SpreadSheetCellValueProviderManager.put("sales.poids.net.line", new QteLineDocProvider(TypePoidsDocProvider.POIDS_NET));
SpreadSheetCellValueProviderManager.put("sales.poids.brut.line", new QteLineDocProvider(TypePoidsDocProvider.POIDS_BRUT));
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/PrixUnitaireRemiseProvider.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
13,6 → 13,7
package org.openconcerto.erp.generationDoc.provider;
 
import org.openconcerto.erp.core.finance.tax.model.TaxeCache;
import org.openconcerto.erp.generationDoc.SpreadSheetCellValueContext;
import org.openconcerto.erp.generationDoc.SpreadSheetCellValueProviderManager;
import org.openconcerto.sql.model.SQLRowAccessor;
25,6 → 26,8
 
public static int UNITAIRE_REMISE = 0;
public static int TOTAL_NON_ACOMPTE = 1;
public static int UNITAIRE_REMISE_TTC = 2;
public static int UNITAIRE_TTC = 3;
public final int type;
 
public PrixUnitaireRemiseProvider(int t) {
34,8 → 37,10
@Override
public Object getValue(SpreadSheetCellValueContext context) {
SQLRowAccessor row = context.getRow();
if (this.type == UNITAIRE_REMISE) {
return getPrixUnitaire(row);
if (this.type == UNITAIRE_REMISE || this.type == UNITAIRE_REMISE_TTC) {
return getPrixUnitaire(row, true);
} else if (this.type == UNITAIRE_TTC) {
return getPrixUnitaire(row, false);
} else {
return getPrixTotalOrigin(row);
}
43,8 → 48,11
 
public Object getPrixTotalOrigin(SQLRowAccessor row) {
final BigDecimal pv = row.getBigDecimal("PV_HT");
if (pv == null) {
return null;
}
BigDecimal remise = (BigDecimal) row.getObject("POURCENT_REMISE");
if (remise == null) {
if (pv == null || remise == null) {
remise = BigDecimal.ZERO;
}
BigDecimal acompte = BigDecimal.ONE;
54,10 → 62,13
return result.multiply(row.getBigDecimal("QTE_UNITAIRE")).multiply(new BigDecimal(row.getInt("QTE"))).setScale(2, RoundingMode.HALF_UP);
}
 
public Object getPrixUnitaire(SQLRowAccessor row) {
public Object getPrixUnitaire(SQLRowAccessor row, boolean withRemise) {
final BigDecimal pv = row.getBigDecimal("PV_HT");
if (pv == null) {
return null;
}
BigDecimal remise = (BigDecimal) row.getObject("POURCENT_REMISE");
if (remise == null) {
if (remise == null || !withRemise) {
remise = BigDecimal.ZERO;
}
BigDecimal acompte = BigDecimal.ONE;
66,11 → 77,19
}
BigDecimal result = BigDecimal.ONE.subtract(remise.movePointLeft(2)).multiply(pv, DecimalUtils.HIGH_PRECISION).multiply(acompte, DecimalUtils.HIGH_PRECISION);
 
return result.setScale(2, RoundingMode.HALF_UP);
if (this.type == UNITAIRE_REMISE_TTC) {
float t = TaxeCache.getCache().getTauxFromId(row.getForeignID("ID_TAXE"));
result = result.multiply(new BigDecimal(t).movePointLeft(2).add(BigDecimal.ONE));
}
 
final BigDecimal setScale = result.setScale(2, RoundingMode.HALF_UP);
return setScale;
}
 
public static void register() {
SpreadSheetCellValueProviderManager.put("PrixUnitaireTTC", new PrixUnitaireRemiseProvider(UNITAIRE_TTC));
SpreadSheetCellValueProviderManager.put("PrixUnitaireRemise", new PrixUnitaireRemiseProvider(UNITAIRE_REMISE));
SpreadSheetCellValueProviderManager.put("PrixUnitaireRemiseTTC", new PrixUnitaireRemiseProvider(UNITAIRE_REMISE_TTC));
SpreadSheetCellValueProviderManager.put("PrixTotalSansAcompte", new PrixUnitaireRemiseProvider(TOTAL_NON_ACOMPTE));
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/QteTotalProvider.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
31,7 → 31,7
 
BigDecimal pv = row.getBigDecimal("PV_HT");
 
if (pv.compareTo(BigDecimal.ZERO) == 0) {
if (pv != null && pv.compareTo(BigDecimal.ZERO) == 0) {
return null;
} else {
return result;
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/PaiementRemainedProvider.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
65,6 → 65,7
long total = totalEch;
if (t == Type.DONE) {
total = r.getLong("T_TTC") - total;
//TODO deduire T avoir
}
return new BigDecimal(total).movePointLeft(2);
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/FormatedGlobalQtyTotalProvider.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
27,7 → 27,7
private final boolean shortName, alwaysShowOnZeroQty, pieceName;
 
public static enum Type {
NORMAL, SHIPMENT
NORMAL, SHIPMENT, REMAIND
}
 
public final Type type;
46,16 → 46,34
public Object getValue(SpreadSheetCellValueContext context) {
final SQLRowAccessor row = context.getRow();
final BigDecimal pv = row.getBigDecimal("PV_HT");
if (!this.alwaysShowOnZeroQty && pv.compareTo(BigDecimal.ZERO) == 0) {
if (!this.alwaysShowOnZeroQty && pv != null && pv.compareTo(BigDecimal.ZERO) == 0) {
return null;
}
 
final String field = this.type == Type.NORMAL ? "QTE" : "QTE_LIVREE";
final String field;
if (this.type == Type.NORMAL) {
field = "QTE";
} else if (row.getTable().contains("QTE_LIVREE")) {
field = "QTE_LIVREE";
} else if (row.getTable().contains("QTE_ORIGINE")) {
field = "QTE_ORIGINE";
} else {
return null;
}
if (row.getObject(field) == null) {
return null;
}
 
final int qte = row.getInt(field);
int qte = row.getInt(field);
if (this.type == Type.REMAIND) {
if (row.getObject("QTE") != null) {
if (field.equalsIgnoreCase("QTE_ORIGINE")) {
qte = qte - row.getInt("QTE");
} else {
qte = row.getInt("QTE") - qte;
}
}
}
 
if (!this.pieceName && row.getInt("ID_UNITE_VENTE") == UniteVenteArticleSQLElement.A_LA_PIECE) {
return String.valueOf(qte);
81,10 → 99,15
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.deliver.short", new FormatedGlobalQtyTotalProvider(Type.SHIPMENT, true));
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.deliver", new FormatedGlobalQtyTotalProvider(Type.SHIPMENT, false));
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.deliver.short.with.quantity", new FormatedGlobalQtyTotalProvider(Type.SHIPMENT, true, true, true));
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.remainder.short", new FormatedGlobalQtyTotalProvider(Type.REMAIND, true));
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.remainder", new FormatedGlobalQtyTotalProvider(Type.REMAIND, false));
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.remainder.short.with.quantity", new FormatedGlobalQtyTotalProvider(Type.REMAIND, true, true, true));
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.alwaysnamed.short.with.quantity", new FormatedGlobalQtyTotalProvider(Type.NORMAL, true, true, true));
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.alwaysnamed.short", new FormatedGlobalQtyTotalProvider(Type.NORMAL, true, false, true));
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.alwaysnamed", new FormatedGlobalQtyTotalProvider(Type.NORMAL, false, false, true));
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.alwaysnamed.deliver.short", new FormatedGlobalQtyTotalProvider(Type.SHIPMENT, true, false, true));
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.alwaysnamed.deliver", new FormatedGlobalQtyTotalProvider(Type.SHIPMENT, false, false, true));
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.alwaysnamed.remainder.short", new FormatedGlobalQtyTotalProvider(Type.REMAIND, true, false, true));
SpreadSheetCellValueProviderManager.put("supplychain.element.qtyunit.alwaysnamed.remainder", new FormatedGlobalQtyTotalProvider(Type.REMAIND, false, false, true));
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/QteTotalLineDocProvider.java
New file
0,0 → 1,51
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011-2019 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 QteTotalLineDocProvider extends QteLineDocProvider {
 
public QteTotalLineDocProvider(TypePoidsDocProvider t) {
super(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) {
 
total = total.add(getPoidsFromRow(sqlRowAccessor));
}
}
return total;
}
 
public static void register() {
SpreadSheetCellValueProviderManager.put("sales.poids.net.lines.sum", new QteTotalLineDocProvider(TypePoidsDocProvider.POIDS_NET));
SpreadSheetCellValueProviderManager.put("sales.poids.brut.lines.sum", new QteTotalLineDocProvider(TypePoidsDocProvider.POIDS_BRUT));
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/PrixUVProvider.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
33,7 → 33,7
public Object getValue(SpreadSheetCellValueContext context) {
final SQLRowAccessor row = context.getRow();
final BigDecimal pv = row.getBigDecimal("PV_HT");
if (pv.compareTo(BigDecimal.ZERO) == 0) {
if (pv == null || pv.compareTo(BigDecimal.ZERO) == 0) {
return null;
}
String result = decimalFormat.format(pv);
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/AdresseFullClientValueProvider.java
21,10 → 21,12
 
private final int type;
private final boolean withName;
private final boolean noCountry;
 
public AdresseFullClientValueProvider(int type, boolean withName) {
public AdresseFullClientValueProvider(int type, boolean withName, boolean noCountry) {
this.type = type;
this.withName = withName;
this.noCountry = noCountry;
}
 
@Override
32,25 → 34,32
final SQLRowAccessor r = getAdresse(context.getRow(), this.type);
String result = "";
if (this.withName) {
result = context.getRow().getForeign("ID_CLIENT").getString("NOM") + "\n";
result = context.getRow().getForeign("ID_CLIENT").getString("NOM") + "\n\n";
}
result = getFormattedAddress(r, result);
result = getFormattedAddress(r, result, !this.noCountry);
 
return result;
}
 
public static String getFormattedAddress(final SQLRowAccessor rAddress, String prefix) {
return getFormattedAddress(rAddress, prefix, true);
}
 
public static String getFormattedAddress(final SQLRowAccessor rAddress, String prefix, boolean withCountry) {
String result = prefix;
if (getStringTrimmed(rAddress, "LIBELLE").length() > 0) {
boolean notEmptyLib = getStringTrimmed(rAddress, "LIBELLE").length() > 0;
if (notEmptyLib) {
result = getStringTrimmed(rAddress, "LIBELLE") + "\n";
}
if (getStringTrimmed(rAddress, "DEST").length() > 0) {
boolean notEmptyDest = getStringTrimmed(rAddress, "DEST").length() > 0;
if (notEmptyDest) {
result = getStringTrimmed(rAddress, "DEST") + "\n";
}
if (getStringTrimmed(rAddress, "RUE").length() > 0) {
boolean notEmptyRue = getStringTrimmed(rAddress, "RUE").length() > 0;
if (notEmptyRue) {
result += getStringTrimmed(rAddress, "RUE") + "\n";
}
result += "\n" + getStringTrimmed(rAddress, "CODE_POSTAL");
result += notEmptyDest && notEmptyLib && notEmptyLib ? ("\n" + getStringTrimmed(rAddress, "CODE_POSTAL")) : getStringTrimmed(rAddress, "CODE_POSTAL");
result += " ";
if (rAddress.getTable().contains("DISTRICT")) {
result += getStringTrimmed(rAddress, "DISTRICT") + " ";
64,17 → 73,23
}
}
if (rAddress.getTable().contains("PROVINCE")) {
String province = getStringTrimmed(rAddress, "PROVINCE");
boolean department = rAddress.getTable().contains("DEPARTEMENT");
if (province.length() > 0 || (department && getStringTrimmed(rAddress, "DEPARTEMENT").length() > 0)) {
result += "\n";
if (getStringTrimmed(rAddress, "PROVINCE").length() > 0) {
}
if (province.length() > 0) {
 
result += getStringTrimmed(rAddress, ("PROVINCE")) + " ";
}
 
if (rAddress.getTable().contains("DEPARTEMENT")) {
if (department && getStringTrimmed(rAddress, "DEPARTEMENT").length() > 0) {
 
result += getStringTrimmed(rAddress, "DEPARTEMENT");
}
}
 
if (getStringTrimmed(rAddress, "PAYS").length() > 0) {
if (withCountry && getStringTrimmed(rAddress, "PAYS").length() > 0) {
result += "\n" + getStringTrimmed(rAddress, "PAYS");
}
return result;
88,11 → 103,17
}
 
public static void register() {
SpreadSheetCellValueProviderManager.put("address.customer.full", new AdresseFullClientValueProvider(ADRESSE_PRINCIPALE, false));
SpreadSheetCellValueProviderManager.put("address.customer.invoice.full", new AdresseFullClientValueProvider(ADRESSE_FACTURATION, false));
SpreadSheetCellValueProviderManager.put("address.customer.shipment.full", new AdresseFullClientValueProvider(ADRESSE_LIVRAISON, false));
SpreadSheetCellValueProviderManager.put("address.customer.full.withname", new AdresseFullClientValueProvider(ADRESSE_PRINCIPALE, true));
SpreadSheetCellValueProviderManager.put("address.customer.invoice.full.withname", new AdresseFullClientValueProvider(ADRESSE_FACTURATION, true));
SpreadSheetCellValueProviderManager.put("address.customer.shipment.full.withname", new AdresseFullClientValueProvider(ADRESSE_LIVRAISON, true));
SpreadSheetCellValueProviderManager.put("address.customer.full", new AdresseFullClientValueProvider(ADRESSE_PRINCIPALE, false, false));
SpreadSheetCellValueProviderManager.put("address.customer.invoice.full", new AdresseFullClientValueProvider(ADRESSE_FACTURATION, false, false));
SpreadSheetCellValueProviderManager.put("address.customer.shipment.full", new AdresseFullClientValueProvider(ADRESSE_LIVRAISON, false, false));
SpreadSheetCellValueProviderManager.put("address.customer.full.nocountry", new AdresseFullClientValueProvider(ADRESSE_PRINCIPALE, false, true));
SpreadSheetCellValueProviderManager.put("address.customer.invoice.full.nocountry", new AdresseFullClientValueProvider(ADRESSE_FACTURATION, false, true));
SpreadSheetCellValueProviderManager.put("address.customer.shipment.full.nocountry", new AdresseFullClientValueProvider(ADRESSE_LIVRAISON, false, true));
SpreadSheetCellValueProviderManager.put("address.customer.full.withname", new AdresseFullClientValueProvider(ADRESSE_PRINCIPALE, true, false));
SpreadSheetCellValueProviderManager.put("address.customer.invoice.full.withname", new AdresseFullClientValueProvider(ADRESSE_FACTURATION, true, false));
SpreadSheetCellValueProviderManager.put("address.customer.shipment.full.withname", new AdresseFullClientValueProvider(ADRESSE_LIVRAISON, true, false));
SpreadSheetCellValueProviderManager.put("address.customer.full.withname.nocountry", new AdresseFullClientValueProvider(ADRESSE_PRINCIPALE, true, true));
SpreadSheetCellValueProviderManager.put("address.customer.invoice.full.withname.nocountry", new AdresseFullClientValueProvider(ADRESSE_FACTURATION, true, true));
SpreadSheetCellValueProviderManager.put("address.customer.shipment.full.withname.nocountry", new AdresseFullClientValueProvider(ADRESSE_LIVRAISON, true, true));
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/PrixUnitaireProvider.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
29,7 → 29,7
public Object getValue(SpreadSheetCellValueContext context) {
final SQLRowAccessor row = context.getRow();
final BigDecimal pv = row.getBigDecimal("PV_HT");
if (pv.compareTo(BigDecimal.ZERO) == 0) {
if (pv == null || pv.compareTo(BigDecimal.ZERO) == 0) {
return null;
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/MergedGlobalQtyTotalProvider.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
34,8 → 34,9
 
public Object getValue(SpreadSheetCellValueContext context) {
final SQLRowAccessor row = context.getRow();
// FIXME pb si on est dans achat avec le check PV_HT
final BigDecimal pv = row.getBigDecimal("PV_HT");
if (pv.compareTo(BigDecimal.ZERO) == 0) {
if (pv != null && pv.compareTo(BigDecimal.ZERO) == 0) {
return null;
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOgenerationListeXML.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
182,13 → 182,12
range[i] = string.subSequence(string.indexOf('.') + 1, string.length()).toString();
}
 
int rowEnd = -1;
if (range.length > 1) {
rowEnd = sheet.resolveHint(range[1]).y + 1;
int rowEndNew = rowEnd * (nbPage + 1);
int rowEnd = sheet.resolveHint(range[1]).y + 1;
int rowEndNew = rowEnd * nbPage;
String sNew = s.replaceAll(String.valueOf(rowEnd), String.valueOf(rowEndNew));
sheet.setPrintRanges(sNew);
System.err.println(" ****** Replace print ranges; Old:" + rowEnd + "--" + s + " New:" + rowEndNew + "--" + sNew);
System.err.println("OOgenerationListXML ****** Replace print ranges; Old:" + rowEnd + "--" + s + " New:" + rowEndNew + "--" + sNew);
}
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/SpreadSheetGeneratorCompta.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
71,7 → 71,10
System.err.println("Set Column Count to :: " + (colEnd + 1));
sheet.setColumnCount(colEnd + 1);
}
sheet.duplicateFirstRows(this.nbRowsPerPage, this.nbPage);
if (this.nbPage < 1) {
throw new IllegalArgumentException("invalid page count : " + this.nbPage);
}
sheet.duplicateFirstRows(this.nbRowsPerPage, this.nbPage - 1);
 
Object printRangeObj = sheet.getPrintRanges();
if (printRangeObj != null) {
82,13 → 85,12
range2[i] = string.subSequence(string.indexOf('.') + 1, string.length()).toString();
}
 
int end = -1;
if (range2.length > 1) {
end = sheet.resolveHint(range2[1]).y + 1;
long rowEndNew = end * (this.nbPage + 1);
int end = sheet.resolveHint(range2[1]).y + 1;
int rowEndNew = end * this.nbPage;
String sNew = s.replaceAll(String.valueOf(end), String.valueOf(rowEndNew));
sheet.setPrintRanges(sNew);
System.err.println(" ****** Replace print ranges; Old:" + end + "--" + s + " New:" + rowEndNew + "--" + sNew);
System.err.println("SpreadSheetGenerator ****** Replace print ranges; Old:" + end + "--" + s + " New:" + rowEndNew + "--" + sNew);
}
} else {
sheet.removePrintRanges();
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOXMLCache.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
134,10 → 134,18
} else {
for (SQLRowAccessor rowAccess : row) {
if (rowAccess != null && !rowAccess.isUndefined()) {
final Object[] array = tableForeign.getForeignKeys(rowAccess.getTable()).toArray();
final SQLField field1;
if (array == null || array.length == 0) {
field1 = tableForeign.getField("ID_" + tableForeign.getName().replaceAll("_ELEMENT", ""));
} else {
 
field1 = (SQLField) array[0];
}
if (w == null) {
w = new Where((SQLField) tableForeign.getForeignKeys(rowAccess.getTable()).toArray()[0], "=", rowAccess.getID());
w = new Where(field1, "=", rowAccess.getID());
} else {
w = w.or(new Where((SQLField) tableForeign.getForeignKeys(rowAccess.getTable()).toArray()[0], "=", rowAccess.getID()));
w = w.or(new Where(field1, "=", rowAccess.getID()));
}
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/Mouvement.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
101,6 → 101,25
 
}
 
public String asString() {
StringBuilder s = new StringBuilder();
BigDecimal d = BigDecimal.ZERO;
BigDecimal c = BigDecimal.ZERO;
s.append("Mouvement N°");
s.append(this.numero);
s.append("\n");
for (Ecriture e : this.ecritures) {
 
s.append("D : " + e.getDebit());
s.append("\tC : " + e.getCredit());
 
d = d.add(e.getDebit());
c = c.add(e.getCredit());
s.append("\tS : " + (d.subtract(c)) + "\n");
}
return s.toString();
}
 
public boolean isEmpty() {
return this.ecritures.isEmpty();
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtReglementAchat.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
80,7 → 80,7
// this.nom = saisieRow.getObject("NOM").toString();
 
// si paiement comptant
if ((modeRegRow.getInt("AJOURS") == 0) && (modeRegRow.getInt("LENJOUR") == 0)) {
if (typeRegRow.getID() != TypeReglementSQLElement.INDEFINI && (modeRegRow.getInt("AJOURS") == 0) && (modeRegRow.getInt("LENJOUR") == 0)) {
 
System.out.println("Règlement Comptant");
// test Cheque
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtSaisieAchat.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
49,7 → 49,7
 
// iniatilisation des valeurs de la map
this.date = (Date) saisieRow.getObject("DATE");
this.nom = "Achat : " + rowFournisseur.getString("NOM") + " Facture : " + this.saisieRow.getObject("NUMERO_FACTURE").toString() + " " + saisieRow.getObject("NOM").toString();
this.nom = " Fourn. : " + rowFournisseur.getString("NOM") + " " + saisieRow.getObject("NOM").toString() + " Facture : " + this.saisieRow.getObject("NUMERO_FACTURE").toString();
this.putValue("DATE", this.date);
AccountingRecordsProvider provider = AccountingRecordsProviderManager.get(ID);
provider.putLabel(saisieRow, this.mEcritures);
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtSaisieVenteFacture.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
17,6 → 17,7
import org.openconcerto.erp.core.finance.accounting.element.ComptePCESQLElement;
import org.openconcerto.erp.core.finance.accounting.element.JournalSQLElement;
import org.openconcerto.erp.generationDoc.SheetXml;
import org.openconcerto.erp.core.finance.tax.model.TaxeCache;
import org.openconcerto.erp.generationEcritures.provider.AccountingRecordsProvider;
import org.openconcerto.erp.generationEcritures.provider.AccountingRecordsProviderManager;
import org.openconcerto.erp.model.PrixTTC;
140,13 → 141,20
SQLTable tableEchantillon = null;
BigDecimal portHT = BigDecimal.valueOf(saisieRow.getLong("PORT_HT")).movePointLeft(2);
BigDecimal fraisDocHT = BigDecimal.valueOf(saisieRow.getLong("FRAIS_DOCUMENT_HT")).movePointLeft(2);
SQLRow taxeDoc = saisieRow.getNonEmptyForeign("ID_TAXE_FRAIS_DOCUMENT") == null ? TaxeCache.getCache().getFirstTaxe()
: TaxeCache.getCache().getRowFromId(saisieRow.getForeignID("ID_TAXE_FRAIS_DOCUMENT")).asRow();
 
TotalCalculator calc;
SQLRow taxePort = saisieRow.getNonEmptyForeign("ID_TAXE_PORT") == null ? TaxeCache.getCache().getFirstTaxe()
: TaxeCache.getCache().getRowFromId(saisieRow.getForeignID("ID_TAXE_PORT")).asRow();
 
if (clientRow.getTable().contains("ID_COMPTE_PCE_PRODUIT") && !clientRow.isForeignEmpty("ID_COMPTE_PCE_PRODUIT")) {
calc = getValuesFromElement(false, false, "T_PV_HT", saisieRow, saisieVFTable.getTable("SAISIE_VENTE_FACTURE_ELEMENT"), portHT, saisieRow.getForeign("ID_TAXE_PORT"), fraisDocHT,
saisieRow.getForeign("ID_TAXE_FRAIS_DOCUMENT"), tableEchantillon, clientRow.getForeign("ID_COMPTE_PCE_PRODUIT"));
 
calc = getValuesFromElement(false, false, "T_PV_HT", saisieRow, saisieVFTable.getTable("SAISIE_VENTE_FACTURE_ELEMENT"), portHT, taxePort, fraisDocHT, taxeDoc, tableEchantillon,
clientRow.getForeign("ID_COMPTE_PCE_PRODUIT"));
} else {
calc = getValuesFromElement(saisieRow, saisieVFTable.getTable("SAISIE_VENTE_FACTURE_ELEMENT"), portHT, saisieRow.getForeign("ID_TAXE_PORT"), fraisDocHT,
saisieRow.getForeign("ID_TAXE_FRAIS_DOCUMENT"), tableEchantillon);
 
calc = getValuesFromElement(saisieRow, saisieVFTable.getTable("SAISIE_VENTE_FACTURE_ELEMENT"), portHT, taxePort, fraisDocHT, taxeDoc, tableEchantillon);
}
 
// On génére les ecritures si la facture n'est pas un acompte
/trunk/OpenConcerto/src/org/openconcerto/erp/core/reports/history/ui/ListeHistoriquePanel.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
224,7 → 224,7
for (TableModelListener listener : l) {
liste.getListe().getTableModel().addTableModelListener(listener);
if (elementSheet.get(liste.getElement()) != null) {
liste.getListe().addIListeActions(new MouseSheetXmlListeListener(elementSheet.get(liste.getElement())).getRowActions());
liste.getListe().addIListeActions(new MouseSheetXmlListeListener(liste.getElement(), elementSheet.get(liste.getElement())).getRowActions());
}
}
}
462,6 → 462,11
}, true);
actionDrop.setPredicate(IListeEvent.createSelectionCountPredicate(0, Integer.MAX_VALUE));
liste.getListe().addIListeAction(actionDrop);
} else if (createTableSource.getPrimaryTable().getName().endsWith("_ELEMENT")) {
liste.setAddVisible(false);
liste.setShowReadOnlyFrameOnDoubleClick(false);
liste.setModifyVisible(false);
liste.setDeleteVisible(false);
}
}
 
469,7 → 474,7
 
setRenderer(liste);
if (elementSheet.get(liste.getElement()) != null) {
liste.getListe().addIListeActions(new MouseSheetXmlListeListener(elementSheet.get(liste.getElement())).getRowActions());
liste.getListe().addIListeActions(new MouseSheetXmlListeListener(liste.getElement(), elementSheet.get(liste.getElement())).getRowActions());
}
liste.getListe().getModel().setCellsEditable(false);
liste.setOpaque(false);
556,7 → 561,13
 
@Override
public void ancestorRemoved(AncestorEvent event) {
ListeHistoriquePanel.this.vectListePanel.clear();
ListeHistoriquePanel.this.mapListener = null;
ListeHistoriquePanel.this.jListePanel.removeListSelectionListener(ListeHistoriquePanel.this.listListener);
ListeHistoriquePanel.this.jListePanel.removeAllTableListener();
ListeHistoriquePanel.this.jListePanel = null;
ListeHistoriquePanel.this.listFieldMap = null;
ListeHistoriquePanel.this.whereList = null;
}
});
 
602,6 → 613,14
}
 
public SQLRowAccessor getSelectedRow() {
// FIXME null pointer avec historique client frame, surement un pb de garbage
if (this.jListePanel == null) {
return null;
}
if (this.jListePanel.getModel() == null) {
return null;
}
 
return this.jListePanel.getModel().getRowAt(this.jListePanel.getSelectedIndex());
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/reports/history/ui/HistoriqueClientFrame.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
57,6 → 57,7
mapList.put("Relances", Arrays.asList("RELANCE"));
mapList.put("Devis", Arrays.asList("DEVIS"));
mapList.put("Commandes", Arrays.asList("COMMANDE_CLIENT"));
mapList.put("Bons de livraison", Arrays.asList("BON_DE_LIVRAISON"));
mapList.put("Avoirs", Arrays.asList("AVOIR_CLIENT"));
mapList.put("Articles facturés", Arrays.asList("SAISIE_VENTE_FACTURE_ELEMENT"));
mapList.put("Articles proposés", Arrays.asList("DEVIS_ELEMENT"));
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/component/FactureFournisseurSQLComponent.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
805,14 → 805,14
// Création des articles
this.table.createArticle(idFacture, this.getElement());
 
final SQLRow rowA = getTable().getRow(idFacture);
new GenerationMvtFactureFournisseur(rowA);
final SQLRow row = getTable().getRow(idFacture);
new GenerationMvtFactureFournisseur(row);
 
final FactureFournisseurXmlSheet sheet = new FactureFournisseurXmlSheet(rowA);
final FactureFournisseurXmlSheet sheet = new FactureFournisseurXmlSheet(row);
sheet.createDocumentAsynchronous();
sheet.showPrintAndExportAsynchronous(this.panelOO.isVisualisationSelected(), this.panelOO.isImpressionSelected(), true);
sheet.showPrintAndExportAsynchronous(this.panelOO.isVisualisationSelected(), this.panelOO.isImpressionSelected(), true, getElement(), row);
 
commitAvoir(null, rowA);
commitAvoir(null, row);
 
return idFacture;
}
850,7 → 850,7
}
final FactureFournisseurXmlSheet sheet = new FactureFournisseurXmlSheet(row);
sheet.createDocumentAsynchronous();
sheet.showPrintAndExportAsynchronous(this.panelOO.isVisualisationSelected(), this.panelOO.isImpressionSelected(), true);
sheet.showPrintAndExportAsynchronous(this.panelOO.isVisualisationSelected(), this.panelOO.isImpressionSelected(), true, getElement(), row);
commitAvoir(rowFactureOld, row);
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/component/CommandeSQLComponent.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
23,6 → 23,7
import org.openconcerto.erp.core.common.ui.TotalPanel;
import org.openconcerto.erp.core.finance.tax.model.TaxeCache;
import org.openconcerto.erp.core.sales.product.element.ReferenceArticleSQLElement;
import org.openconcerto.erp.core.supplychain.order.element.CommandeSQLElement;
import org.openconcerto.erp.core.supplychain.order.element.DemandeAchatItemSQLElement;
import org.openconcerto.erp.core.supplychain.order.ui.CommandeItemTable;
import org.openconcerto.erp.core.supplychain.stock.element.StockItemsUpdater;
700,7 → 701,7
final JPanel panelPoids = new JPanel(new GridBagLayout());
GridBagConstraints cPoids = new DefaultGridBagConstraints();
cPoids.weightx = 0;
panelPoids.add(new JLabel(getLabelFor("T_POIDS")), cPoids);
panelPoids.add(new JLabel(getLabelFor("T_POIDS"), SwingConstants.RIGHT), cPoids);
cPoids.weightx = 1;
textPoidsTotal.setEnabled(false);
textPoidsTotal.setHorizontalAlignment(JTextField.RIGHT);
728,14 → 729,48
ElementComboBox comboTaxePort = new ElementComboBox(false, 10);
 
if (getTable().contains("PORT_HT")) {
 
addSQLObject(textPortHT, "PORT_HT");
final JPanel panelPoids = new JPanel(new GridBagLayout());
GridBagConstraints cPort = new DefaultGridBagConstraints();
cPort.gridx = 0;
cPort.fill = GridBagConstraints.NONE;
cPort.fill = GridBagConstraints.HORIZONTAL;
cPort.weightx = 0;
panelPoids.add(new JLabel(getLabelFor("PORT_HT")), cPort);
// Condition frais de port
if (getTable().getForeignTable("ID_FOURNISSEUR").contains("CONDITIONS_PORT")) {
cPort.gridwidth = 2;
final JLabel labelConditionPort = new JLabel();
labelConditionPort.setVisible(false);
panelPoids.add(labelConditionPort, cPort);
 
fourn.addModelListener("wantedID", (evt) -> {
int wantedID = fourn.getWantedID();
 
if (wantedID != SQLRow.NONEXISTANT_ID && wantedID >= SQLRow.MIN_VALID_ID) {
 
final SQLRow rowF = getTable().getForeignTable("ID_FOURNISSEUR").getRow(wantedID);
 
final String conditions = rowF.getString("CONDITIONS_PORT");
if (conditions.trim().length() > 0) {
labelConditionPort.setText(conditions);
labelConditionPort.setVisible(true);
} else {
labelConditionPort.setText("");
labelConditionPort.setVisible(false);
}
 
} else {
labelConditionPort.setText("");
labelConditionPort.setVisible(false);
}
 
});
cPort.gridwidth = 1;
cPort.gridy++;
}
addSQLObject(textPortHT, "PORT_HT");
cPort.gridx = 0;
cPort.fill = GridBagConstraints.HORIZONTAL;
cPort.weightx = 0;
panelPoids.add(new JLabel(getLabelFor("PORT_HT"), SwingConstants.RIGHT), cPort);
textPortHT.setHorizontalAlignment(JTextField.RIGHT);
cPort.gridx++;
cPort.weightx = 1;
745,7 → 780,7
cPort.gridx = 0;
cPort.weightx = 0;
addRequiredSQLObject(comboTaxePort, "ID_TAXE_PORT");
panelPoids.add(new JLabel(getLabelFor("ID_TAXE_PORT")), cPort);
panelPoids.add(new JLabel(getLabelFor("ID_TAXE_PORT"), SwingConstants.RIGHT), cPort);
cPort.gridx++;
cPort.weightx = 1;
panelPoids.add(comboTaxePort, cPort);
753,9 → 788,9
addSQLObject(textRemiseHT, "REMISE_HT");
cPort.gridy++;
cPort.gridx = 0;
cPort.fill = GridBagConstraints.NONE;
cPort.fill = GridBagConstraints.HORIZONTAL;
cPort.weightx = 0;
panelPoids.add(new JLabel(getLabelFor("REMISE_HT")), cPort);
panelPoids.add(new JLabel(getLabelFor("REMISE_HT"), SwingConstants.RIGHT), cPort);
textRemiseHT.setHorizontalAlignment(JTextField.RIGHT);
cPort.gridx++;
cPort.weightx = 1;
914,9 → 949,10
}
 
// generation du document
final CommandeXmlSheet sheet = new CommandeXmlSheet(getTable().getRow(idCommande));
final SQLRow row = getTable().getRow(idCommande);
final CommandeXmlSheet sheet = new CommandeXmlSheet(row);
sheet.createDocumentAsynchronous();
sheet.showPrintAndExportAsynchronous(this.panelOO.isVisualisationSelected(), this.panelOO.isImpressionSelected(), true);
sheet.showPrintAndExportAsynchronous(this.panelOO.isVisualisationSelected(), this.panelOO.isImpressionSelected(), true, getElement(), row);
 
// incrémentation du numéro auto
if (NumerotationAutoSQLElement.getNextNumero(getElement().getClass()).equalsIgnoreCase(this.numeroUniqueCommande.getText().trim())) {
934,6 → 970,8
DemandeAchatItemSQLElement elt = getElement().getDirectory().getElement(DemandeAchatItemSQLElement.class);
elt.updateStatus(getTable(), getTable().getTable("COMMANDE_ELEMENT"), idCommande);
 
((CommandeSQLElement) getElement()).fireInsertedCmdListener(row);
 
if (attempt > 0) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
1000,9 → 1038,10
elt.updateStatus(getTable(), getTable().getTable("COMMANDE_ELEMENT"), getSelectedID());
 
// generation du document
final CommandeXmlSheet sheet = new CommandeXmlSheet(getTable().getRow(id));
final SQLRow row = getTable().getRow(id);
final CommandeXmlSheet sheet = new CommandeXmlSheet(row);
sheet.createDocumentAsynchronous();
sheet.showPrintAndExportAsynchronous(this.panelOO.isVisualisationSelected(), this.panelOO.isImpressionSelected(), true);
sheet.showPrintAndExportAsynchronous(this.panelOO.isVisualisationSelected(), this.panelOO.isImpressionSelected(), true, getElement(), row);
 
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/table/ChiffrageCommandeTable.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
66,7 → 66,16
 
final List<SQLTableElement> list = new Vector<SQLTableElement>();
 
final SQLTableElement tableElementNom = new SQLTableElement(e.getTable().getField("NOM"));
final SQLTableElement tableElementNom = new SQLTableElement(e.getTable().getField("NOM")) {
@Override
public boolean isCellEditable(SQLRowValues vals, int rowIndex, int columnIndex) {
if (e.getTable().contains("ID_CATEGORIE_HEURE")) {
return false;
} else {
return super.isCellEditable(vals, rowIndex, columnIndex);
}
}
};
list.add(tableElementNom);
if (e.getTable().contains("ID_TYPE_CMD")) {
final SQLTableElement cat = new SQLTableElement(e.getTable().getField("ID_TYPE_CMD"));
82,13 → 91,19
 
final SQLField fieldHA = e.getTable().getField("PA_HT");
final DeviseNumericCellEditor editorPAHT = new DeviseNumericCellEditor(fieldHA);
final SQLTableElement pa = new SQLTableElement(fieldHA, BigDecimal.class, editorPAHT);
final SQLTableElement pa = new SQLTableElement(fieldHA, BigDecimal.class, editorPAHT) {
@Override
public boolean isCellEditable(SQLRowValues vals, int rowIndex, int columnIndex) {
if (e.getTable().contains("ID_CATEGORIE_HEURE")) {
return false;
} else {
return super.isCellEditable(vals, rowIndex, columnIndex);
}
}
};
DeviseTableCellRenderer renderer = new DeviseTableCellRenderer();
renderer.setHideZeroValue(true);
pa.setRenderer(renderer);
if (e.getTable().contains("ID_CATEGORIE_HEURE")) {
pa.setEditable(false);
}
list.add(pa);
 
final SQLField fieldPV = e.getTable().getField("PV_HT");
102,6 → 117,15
protected Object getDefaultNullValue() {
return BigDecimal.ZERO;
}
 
@Override
public boolean isCellEditable(SQLRowValues vals, int rowIndex, int columnIndex) {
if (e.getTable().contains("ID_CATEGORIE_HEURE")) {
return vals.getObject("ID_CATEGORIE_HEURE") == null || vals.isForeignEmpty("ID_CATEGORIE_HEURE");
} else {
return super.isCellEditable(vals, rowIndex, columnIndex);
}
}
};
qteU.setRenderer(renderer);
list.add(qteU);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/DemandePrixSQLComponent.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
23,6 → 23,7
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.ElementSQLObject;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLBackgroundTableCache;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
30,6 → 31,7
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.sql.sqlobject.JUniqueTextField;
import org.openconcerto.sql.ui.RadioButtons;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.list.RowValuesTable;
import org.openconcerto.ui.DefaultGridBagConstraints;
183,7 → 185,17
// this.add(boxEtat, c);
// this.addView(boxEtat, "ID_ETAT_DEMANDE_PRIX");
 
c.gridx = 0;
c.gridy++;
c.weightx = 0;
this.add(new JLabel(getLabelFor("ID_COMMERCIAL"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 1;
final ElementComboBox boxCom = new ElementComboBox();
this.add(boxCom, c);
this.addView(boxCom, "ID_COMMERCIAL", REQ);
 
c.weightx = 0;
c.gridheight = 1;
c.gridx = 0;
c.gridy++;
470,9 → 482,10
// this.table.createArticle(idCommande, this.getElement());
 
// generation du document
DemandePrixSheetXML sheet = new DemandePrixSheetXML(getTable().getRow(idCommande));
final SQLRow row = getTable().getRow(idCommande);
DemandePrixSheetXML sheet = new DemandePrixSheetXML(row);
sheet.createDocumentAsynchronous();
sheet.showPrintAndExportAsynchronous(true, false, true);
sheet.showPrintAndExportAsynchronous(true, false, true, getElement(), row);
 
// incrémentation du numéro auto
if (NumerotationAutoSQLElement.getNextNumero(DemandePrixSQLElement.class).equalsIgnoreCase(this.field.getText().trim())) {
522,9 → 535,10
DemandeAchatItemSQLElement elt = getElement().getDirectory().getElement(DemandeAchatItemSQLElement.class);
elt.updateStatus(getTable(), getTable().getTable("DEMANDE_PRIX_ELEMENT"), getSelectedID());
 
DemandePrixSheetXML sheet = new DemandePrixSheetXML(getTable().getRow(getSelectedID()));
final SQLRow row = getTable().getRow(getSelectedID());
DemandePrixSheetXML sheet = new DemandePrixSheetXML(row);
sheet.createDocumentAsynchronous();
sheet.showPrintAndExportAsynchronous(true, false, true);
sheet.showPrintAndExportAsynchronous(true, false, true, getElement(), row);
 
}
 
532,6 → 546,15
protected SQLRowValues createDefaults() {
SQLRowValues rowVals = new SQLRowValues(getTable());
rowVals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(DemandePrixSQLElement.class));
SQLElement eltComm = getElement().getForeignElement("ID_COMMERCIAL");
int idUser = UserManager.getInstance().getCurrentUserID();
 
SQLRow rowsComm = SQLBackgroundTableCache.getInstance().getCacheForTable(eltComm.getTable()).getFirstRowContains(idUser, eltComm.getTable().getField("ID_USER_COMMON"));
 
if (rowsComm != null) {
rowVals.put("ID_COMMERCIAL", rowsComm.getID());
}
 
if (getTable().getUndefinedID() == SQLRow.NONEXISTANT_ID) {
rowVals.put("ID_ETAT_DEMANDE_PRIX", EtatDemandePrixSQLElement.EN_ATTENTE);
} else {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/CommandeSQLElement.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
17,6 → 17,7
import org.openconcerto.erp.core.common.component.TransfertBaseSQLComponent;
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.edm.AttachmentAction;
import org.openconcerto.erp.core.sales.order.ui.ReliquatCommandeTableModel;
import org.openconcerto.erp.core.supplychain.order.component.CommandeSQLComponent;
import org.openconcerto.erp.core.supplychain.order.component.SaisieAchatSQLComponent;
import org.openconcerto.erp.core.supplychain.receipt.component.BonReceptionSQLComponent;
34,6 → 35,9
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLSelectJoin;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.SQLTableEvent;
import org.openconcerto.sql.model.SQLTableEvent.Mode;
import org.openconcerto.sql.model.SQLTableModifiedListener;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.sql.view.EditFrame;
42,9 → 46,12
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.ui.PanelFrame;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.cc.ITransformer;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.sql.SQLException;
import java.util.ArrayList;
54,6 → 61,9
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingWorker;
 
import org.apache.commons.dbutils.handlers.ArrayListHandler;
69,7 → 79,7
getRowActions().add(actionAttachment);
}
 
getRowActions().addAll(new MouseSheetXmlListeListener(CommandeXmlSheet.class).getRowActions());
getRowActions().addAll(new MouseSheetXmlListeListener(this, CommandeXmlSheet.class).getRowActions());
 
// Transfert vers BR
PredicateRowAction bonAction = new PredicateRowAction(new AbstractAction() {
155,8 → 165,34
}, false, "supplychain.order.valid");
tagValidAction.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(tagValidAction);
 
// Reliquat
PredicateRowAction reliquatAction = new PredicateRowAction(new AbstractAction() {
public void actionPerformed(ActionEvent e) {
JPanel panelReliquat = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
final ReliquatCommandeTableModel dm = new ReliquatCommandeTableModel(IListe.get(e).getSelectedRowAccessor());
if (dm.getRowCount() > 0) {
JTable table = new JTable(dm);
JScrollPane comp = new JScrollPane(table);
c.weightx = 1;
c.weighty = 1;
c.fill = GridBagConstraints.BOTH;
panelReliquat.add(comp, c);
PanelFrame frame = new PanelFrame(panelReliquat, "Reliquat commande");
frame.pack();
frame.setVisible(true);
} else {
JOptionPane.showMessageDialog(null, "Aucun reliquat restant");
}
}
 
}, false, "sales.order.reliquat.show");
 
reliquatAction.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(reliquatAction);
}
 
@Override
protected List<String> getListFields() {
final List<String> l = new ArrayList<>(8);
193,6 → 229,22
return new CommandeSQLComponent();
}
 
private final List<SQLTableModifiedListener> listenerCmdInserted = new ArrayList<>();
 
public void addInsertedCmdListener(SQLTableModifiedListener l) {
this.listenerCmdInserted.add(l);
}
 
public void removeInsertedCmdListener(SQLTableModifiedListener l) {
this.listenerCmdInserted.remove(l);
}
 
public void fireInsertedCmdListener(SQLRow row) {
for (SQLTableModifiedListener sqlTableModifiedListener : this.listenerCmdInserted) {
sqlTableModifiedListener.tableModified(new SQLTableEvent(row, Mode.ROW_ADDED, null));
}
}
 
public void transfertBR(final List<SQLRowValues> selectedRows) {
 
EditFrame f = TransfertBaseSQLComponent.openTransfertFrame(selectedRows, "BON_RECEPTION");
219,6 → 271,7
}
});
comp.loadQuantity(fetcher.fetch());
comp.removeZeroQtyLines();
}
 
/**
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/CommandeElementSQLElement.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
15,10 → 15,12
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.common.ui.DeviseField;
import org.openconcerto.erp.preferences.GestionArticleGlobalPreferencePanel;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.UISQLComponent;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.sql.request.UpdateBuilder;
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.sql.users.UserManager;
104,6 → 106,15
l.add("ID_STYLE");
l.add("CODE");
l.add("NOM");
SQLPreferences prefs = new SQLPreferences(getTable().getDBRoot());
if (prefs.getBoolean(GestionArticleGlobalPreferencePanel.ACTIVER_DECLINAISON, false)) {
 
for (String fieldName : getTable().getFieldsName()) {
if (fieldName.startsWith("ID_ARTICLE_DECLINAISON_")) {
l.add(fieldName);
}
}
}
l.add("ID_COMMANDE");
l.add("ID_ARTICLE");
l.add("PA_HT");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/FactureFournisseurSQLElement.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
22,6 → 22,7
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.model.FieldPath;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.sql.view.EditFrame;
32,6 → 33,7
import org.openconcerto.sql.view.list.SQLTableModelSource;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.sql.view.list.action.ListEvent;
import org.openconcerto.ui.table.PercentTableCellRenderer;
import org.openconcerto.utils.CollectionUtils;
import org.openconcerto.utils.DecimalUtils;
52,7 → 54,7
 
public FactureFournisseurSQLElement() {
super("FACTURE_FOURNISSEUR", "une facture fournisseur", "factures fournisseur");
MouseSheetXmlListeListener mouseSheetXmlListeListener = new MouseSheetXmlListeListener(FactureFournisseurXmlSheet.class);
MouseSheetXmlListeListener mouseSheetXmlListeListener = new MouseSheetXmlListeListener(this, FactureFournisseurXmlSheet.class);
mouseSheetXmlListeListener.setGenerateHeader(true);
mouseSheetXmlListeListener.setShowHeader(true);
getRowActions().addAll(mouseSheetXmlListeListener.getRowActions());
70,8 → 72,7
editFrame.setVisible(true);
}
}, true, "supplychain.invoice.clone") {
public boolean enabledFor(IListeEvent evt) {
List<? extends SQLRowAccessor> l = evt.getSelectedRows();
public boolean enabledFor(List<SQLRowValues> l) {
return (l != null && l.size() == 1);
}
};
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/order/element/DemandePrixSQLElement.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
57,35 → 57,6
@Override
protected void _initTableSource(SQLTableModelSource source) {
super._initTableSource(source);
// {
// BaseSQLTableModelColumn cmd = new BaseSQLTableModelColumn("Commande associée",
// String.class) {
//
// @Override
// protected Object show_(SQLRowAccessor r) {
// Collection<? extends SQLRowAccessor> l =
// r.getReferentRows(r.getTable().getTable("COMMANDE"));
// String s = "";
// if (l != null && l.size() > 0) {
// for (SQLRowAccessor sqlRowAccessor : l) {
// s += sqlRowAccessor.getString("NUMERO") + " ";
// }
// }
//
// return s;
// }
//
// @Override
// public Set<FieldPath> getPaths() {
// // TODO Raccord de méthode auto-généré
// Path p = new Path(getTable());
// p = p.add(getTable().getTable("COMMANDE").getField("ID_DEMANDE_PRIX"));
//
// return CollectionUtils.createSet(new FieldPath(p, "NUMERO"));
// }
// };
// source.getColumns().add(cmd);
// }
 
}
 
92,11 → 63,10
public DemandePrixSQLElement() {
super("DEMANDE_PRIX");
 
MouseSheetXmlListeListener l = new MouseSheetXmlListeListener(DemandePrixSheetXML.class) {
MouseSheetXmlListeListener l = new MouseSheetXmlListeListener(this, DemandePrixSheetXML.class) {
 
@Override
protected String getMailObject(SQLRow row) {
// TODO Raccord de méthode auto-généré
return "Veuillez trouver en pièce jointe notre demande de prix.";
}
 
121,16 → 91,6
final CommandeSQLComponent sqlComponent = (CommandeSQLComponent) f.getPanel().getSQLComponent();
sqlComponent.select(inj.createRowValuesFrom(row.getID()));
 
// SQLRowAccessor foreignRow = row.getForeign("ID_ADRESSE");
// if (foreignRow != null && !foreignRow.isUndefined()) {
// ElementSQLObject obj = (ElementSQLObject)
// sqlComponent.getView("ID_ADRESSE").getComp();
// obj.setCreated(true);
//
// SQLRowValues asRowValues = getLivraisonAdr(row.getForeign("ID_AFFAIRE"));
// asRowValues.clearPrimaryKeys();
// obj.getSQLChild().select(asRowValues);
// }
sqlComponent.loadItem(sqlComponent.getRowValuesTablePanel(), Configuration.getInstance().getDirectory().getElement("DEMANDE_PRIX"), row.getID(),
Configuration.getInstance().getDirectory().getElement("DEMANDE_PRIX_ELEMENT"));
f.setVisible(true);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/receipt/component/BonReceptionSQLComponent.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
586,7 → 586,7
@Override
public void run() {
try {
updateStock(idBonFinal);
((BonReceptionSQLElement) getElement()).updateStock(idBonFinal);
((BonReceptionSQLElement) getElement()).updateCmdElement(((BonReceptionSQLElement) getElement()).getCmdFrom(idBonFinal), idBonFinal);
} catch (Exception e) {
ExceptionHandler.handle("Update error", e);
598,9 → 598,10
elt.updateStatus(getTable(), getTable().getTable("BON_RECEPTION_ELEMENT"), idBon);
 
// generation du document
final BonReceptionXmlSheet sheet = new BonReceptionXmlSheet(getTable().getRow(idBonFinal));
final SQLRow row = getTable().getRow(idBonFinal);
final BonReceptionXmlSheet sheet = new BonReceptionXmlSheet(row);
sheet.createDocumentAsynchronous();
sheet.showPrintAndExportAsynchronous(this.panelOO.isVisualisationSelected(), this.panelOO.isImpressionSelected(), true);
sheet.showPrintAndExportAsynchronous(this.panelOO.isVisualisationSelected(), this.panelOO.isImpressionSelected(), true, getElement(), row);
 
} catch (Exception e) {
throw new IllegalStateException(e);
671,6 → 672,16
}
}
 
public void removeZeroQtyLines() {
int count = this.tableBonItem.getModel().getRowCount() - 1;
for (int i = count; i >= 0; i--) {
final SQLRowValues rowValuesAt = this.tableBonItem.getModel().getRowValuesAt(i);
if (rowValuesAt.getInt("QTE") == 0) {
this.tableBonItem.getModel().removeRowAt(i);
}
}
}
 
@Override
public void update() {
 
700,7 → 711,7
try {
 
// Mise à jour du stock
updateStock(id);
((BonReceptionSQLElement) getElement()).updateStock(id);
((BonReceptionSQLElement) getElement()).updateCmdElement(cmdFrom, id);
 
DemandeAchatItemSQLElement elt = getElement().getDirectory().getElement(DemandeAchatItemSQLElement.class);
716,9 → 727,10
elt.updateStatus(getTable(), getTable().getTable("BON_RECEPTION_ELEMENT"), id);
 
// generation du document
final BonReceptionXmlSheet sheet = new BonReceptionXmlSheet(getTable().getRow(id));
final SQLRow row = getTable().getRow(id);
final BonReceptionXmlSheet sheet = new BonReceptionXmlSheet(row);
sheet.createDocumentAsynchronous();
sheet.showPrintAndExportAsynchronous(this.panelOO.isVisualisationSelected(), this.panelOO.isImpressionSelected(), true);
sheet.showPrintAndExportAsynchronous(this.panelOO.isVisualisationSelected(), this.panelOO.isImpressionSelected(), true, getElement(), row);
 
}
}
775,40 → 787,7
}
}
 
protected String getLibelleStock(SQLRowAccessor row, SQLRowAccessor rowElt) {
return "Bon de réception N°" + row.getString("NUMERO");
}
 
/**
* Mise à jour des stocks pour chaque article composant du bon
*
* @throws SQLException
*/
private void updateStock(int id) throws SQLException {
 
SQLRow row = getTable().getRow(id);
StockItemsUpdater stockUpdater = new StockItemsUpdater(new StockLabel() {
 
@Override
public String getLabel(SQLRowAccessor rowOrigin, SQLRowAccessor rowElt) {
 
return getLibelleStock(rowOrigin, rowElt);
}
}, row, row.getReferentRows(getTable().getTable("BON_RECEPTION_ELEMENT")),
getTable().contains("CREATE_VIRTUAL_STOCK") && row.getBoolean("CREATE_VIRTUAL_STOCK") ? TypeStockUpdate.REAL_VIRTUAL_RECEPT : TypeStockUpdate.REAL_RECEPT);
 
if (getTable().getDBRoot().contains("RELIQUAT_BR")) {
List<SQLRow> l = row.getReferentRows(getTable().getTable("RELIQUAT_BR").getField("ID_BON_RECEPTION_ORIGINE"));
for (SQLRow sqlRow : l) {
stockUpdater.addReliquat(sqlRow.getForeign("ID_ARTICLE"), sqlRow.getInt("QTE"), sqlRow.getBigDecimal("QTE_UNITAIRE"));
}
}
 
stockUpdater.update();
 
}
 
@Override
public void select(SQLRowAccessor r) {
super.select(r);
if (this.tableBonReliquatItem != null) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/receipt/element/CodeFournisseurSQLElement.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
14,10 → 14,8
package org.openconcerto.erp.core.supplychain.receipt.element;
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.common.ui.DeviseField;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.UISQLComponent;
import org.openconcerto.sql.sqlobject.ElementComboBox;
 
import java.util.ArrayList;
import java.util.List;
42,6 → 40,11
return l;
}
 
@Override
protected String getParentFFName() {
return "ID_ARTICLE";
}
 
/*
* (non-Javadoc)
*
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/receipt/element/BonReceptionSQLElement.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
51,6 → 51,10
import javax.swing.SwingWorker;
 
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.openconcerto.erp.core.supplychain.stock.element.StockItemsUpdater;
import org.openconcerto.erp.core.supplychain.stock.element.StockLabel;
import org.openconcerto.erp.core.supplychain.stock.element.StockItemsUpdater.TypeStockUpdate;
import org.openconcerto.sql.model.SQLRowAccessor;
 
public class BonReceptionSQLElement extends ComptaSQLConfElement {
 
112,7 → 116,7
getRowActions().add(actionsTRFA);
getRowActions().add(actionTRSimple);
 
MouseSheetXmlListeListener mouseSheetXmlListeListener = new MouseSheetXmlListeListener(BonReceptionXmlSheet.class);
MouseSheetXmlListeListener mouseSheetXmlListeListener = new MouseSheetXmlListeListener(this, BonReceptionXmlSheet.class);
mouseSheetXmlListeListener.setGenerateHeader(true);
mouseSheetXmlListeListener.setShowHeader(true);
getRowActions().addAll(mouseSheetXmlListeListener.getRowActions());
226,4 → 230,37
protected String createCodeSuffix() {
return ".note";
}
 
/**
* Mise à jour des stocks pour chaque article composant du bon
*
* @throws SQLException
*/
public void updateStock(int id) throws SQLException {
 
SQLRow row = getTable().getRow(id);
StockItemsUpdater stockUpdater = new StockItemsUpdater(new StockLabel() {
 
@Override
public String getLabel(SQLRowAccessor rowOrigin, SQLRowAccessor rowElt) {
 
return getLibelleStock(rowOrigin, rowElt);
}
}, row, row.getReferentRows(getTable().getTable("BON_RECEPTION_ELEMENT")),
getTable().contains("CREATE_VIRTUAL_STOCK") && row.getBoolean("CREATE_VIRTUAL_STOCK") ? TypeStockUpdate.REAL_VIRTUAL_RECEPT : TypeStockUpdate.REAL_RECEPT);
 
if (getTable().getDBRoot().contains("RELIQUAT_BR")) {
List<SQLRow> l = row.getReferentRows(getTable().getTable("RELIQUAT_BR").getField("ID_BON_RECEPTION_ORIGINE"));
for (SQLRow sqlRow : l) {
stockUpdater.addReliquat(sqlRow.getForeign("ID_ARTICLE"), sqlRow.getInt("QTE"), sqlRow.getBigDecimal("QTE_UNITAIRE"));
}
}
 
stockUpdater.update();
 
}
 
public String getLibelleStock(SQLRowAccessor row, SQLRowAccessor rowElt) {
return "Bon de réception N°" + row.getString("NUMERO");
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/product/element/ArticleFournisseurSQLElement.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
33,7 → 33,7
public ArticleFournisseurSQLElement() {
super("ARTICLE_FOURNISSEUR", "un article fournisseur", "articles fournisseurs");
 
getRowActions().addAll(new MouseSheetXmlListeListener(FicheArticleXmlSheet.class).getRowActions());
getRowActions().addAll(new MouseSheetXmlListeListener(this, FicheArticleXmlSheet.class).getRowActions());
 
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/stock/action/ListeDesMouvementsStockAction.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
18,8 → 18,13
import org.openconcerto.erp.core.common.ui.IListFilterDatePanel;
import org.openconcerto.erp.core.supplychain.stock.element.MouvementStockSQLElement;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.view.IListFrame;
import org.openconcerto.sql.view.list.SQLTableModelSource;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.utils.cc.ITransformer;
 
import java.awt.GridBagConstraints;
import java.awt.event.ActionEvent;
32,14 → 37,40
 
public class ListeDesMouvementsStockAction extends CreateIListFrameAbstractAction<MouvementStockSQLElement> {
 
private final SQLRowAccessor rowArtFilter;
 
public ListeDesMouvementsStockAction(final ComptaPropsConfiguration conf) {
this(conf, null);
}
 
public ListeDesMouvementsStockAction(final ComptaPropsConfiguration conf, SQLRowAccessor rowArticleFilter) {
super(conf, MouvementStockSQLElement.class);
this.rowArtFilter = rowArticleFilter;
}
 
protected SQLTableModelSource createTableSource() {
 
SQLTableModelSource source = this.getElem().createTableSource();
if (this.rowArtFilter != null && !this.rowArtFilter.isUndefined()) {
source.getReq().setSelectTransf(new ITransformer<SQLSelect, SQLSelect>() {
 
@Override
public SQLSelect transformChecked(SQLSelect input) {
input.setWhere(new Where(input.getTable("MOUVEMENT_STOCK").getField("ID_ARTICLE"), "=", ListeDesMouvementsStockAction.this.rowArtFilter.getID()));
return input;
}
});
}
return source;
}
 
@Override
protected void initFrame(IListFrame frame) {
super.initFrame(frame);
 
if (this.rowArtFilter != null && !this.rowArtFilter.isUndefined()) {
frame.setTextTitle("Mouvements de stocks, article " + this.rowArtFilter.getString("CODE") + " " + this.rowArtFilter.getString("NOM"));
}
final SQLElement element = getElem();
 
JTable table = frame.getPanel().getListe().getJTable();
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/stock/action/ListeDesStocksAction.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
16,8 → 16,7
import org.openconcerto.erp.action.CreateFrameAbstractAction;
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.common.ui.IListTotalPanel;
import org.openconcerto.erp.core.common.ui.ListeViewPanel;
import org.openconcerto.erp.core.common.ui.PanelFrame;
import org.openconcerto.erp.rights.DepotStockViewRightEditor;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.FieldPath;
28,6 → 27,7
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.BaseSQLTableModelColumn;
import org.openconcerto.sql.view.list.IListe;
34,6 → 34,7
import org.openconcerto.sql.view.list.SQLTableModelColumn;
import org.openconcerto.sql.view.list.SQLTableModelSourceOnline;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.PanelFrame;
import org.openconcerto.utils.CollectionUtils;
import org.openconcerto.utils.DecimalUtils;
import org.openconcerto.utils.Tuple2;
53,8 → 54,15
 
public class ListeDesStocksAction extends CreateFrameAbstractAction {
 
private final boolean besoin;
 
public ListeDesStocksAction() {
this(false);
}
 
public ListeDesStocksAction(boolean b) {
super();
this.besoin = b;
this.putValue(Action.NAME, "Liste des stocks");
 
}
67,9 → 75,32
List<SQLRow> rowsEtat = SQLBackgroundTableCache.getInstance().getCacheForTable(depotTable).getRows();
 
JTabbedPane tabs = new JTabbedPane();
 
boolean canViewAll = true;
for (final SQLRow sqlRow : rowsEtat) {
boolean canView = UserRightsManager.getCurrentUserRights().haveRight(DepotStockViewRightEditor.ID_RIGHT, String.valueOf(sqlRow.getID()));
canViewAll &= canView;
if (canView) {
 
ListeAddPanel panel = createPanel(eltStock, stockTable, sqlRow);
tabs.add(sqlRow.getString("NOM"), panel);
}
 
}
 
if (canViewAll && this.besoin) {
tabs.insertTab("Global", null, createPanel(eltStock, stockTable, null), null, 0);
}
 
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints c = new DefaultGridBagConstraints();
c.fill = GridBagConstraints.BOTH;
c.weightx = 1;
c.weighty = 1;
panel.add(tabs, c);
return new PanelFrame(panel, "Liste des stocks");
}
 
private ListeAddPanel createPanel(SQLElement eltStock, final SQLTable stockTable, final SQLRow sqlRow) {
final SQLTableModelSourceOnline tableSource = eltStock.getTableSource(true);
 
SQLTableModelColumn colStock;
100,7 → 131,6
@Override
public Set<FieldPath> getPaths() {
final SQLTable table = stockTable;
Path p = new Path(table);
Path p2 = new Path(table).addForeignField("ID_ARTICLE");
return CollectionUtils.createSet(new FieldPath(p2, "PA_HT"));
}
113,7 → 143,11
 
@Override
public SQLSelect transformChecked(SQLSelect input) {
input.setWhere(new Where(input.getTable("STOCK").getField("ID_DEPOT_STOCK"), "=", sqlRow.getID()));
Where w = sqlRow == null ? null : new Where(input.getTable("STOCK").getField("ID_DEPOT_STOCK"), "=", sqlRow.getID());
if (besoin) {
w = Where.and(w, new Where(input.getTable("STOCK").getField("QTE_TH"), "<", input.getTable("STOCK").getField("QTE_MIN")));
}
input.setWhere(w);
return input;
}
});
132,14 → 166,6
c2.weightx = 0;
c2.fill = GridBagConstraints.NONE;
panel.add(total, c2);
tabs.add(sqlRow.getString("NOM"), panel);
return panel;
}
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints c = new DefaultGridBagConstraints();
c.fill = GridBagConstraints.BOTH;
c.weightx = 1;
c.weighty = 1;
panel.add(tabs, c);
return new PanelFrame(panel, "Liste des stocks");
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/stock/element/StockSQLElement.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
13,6 → 13,7
package org.openconcerto.erp.core.supplychain.stock.element;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.common.ui.PanelFrame;
import org.openconcerto.erp.core.sales.product.action.InventairePanel;
20,24 → 21,30
import org.openconcerto.erp.model.MouseSheetXmlListeListener;
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLInjector;
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.sql.sqlobject.ElementComboBox;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.FrameUtil;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.DecimalUtils;
import org.openconcerto.utils.ListMap;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Collection;
47,6 → 54,7
 
import javax.swing.AbstractAction;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
 
public class StockSQLElement extends ComptaSQLConfElement {
53,20 → 61,34
 
public StockSQLElement() {
super("STOCK", "un stock", "stocks");
getRowActions().addAll(new MouseSheetXmlListeListener(FicheArticleXmlSheet.class).getRowActions());
getRowActions().addAll(new MouseSheetXmlListeListener(this, FicheArticleXmlSheet.class).getRowActions());
PredicateRowAction stock = new PredicateRowAction(new AbstractAction("Mettre à jour les stocks") {
 
@Override
public void actionPerformed(ActionEvent e) {
 
PanelFrame p = new PanelFrame(new InventairePanel(IListe.get(e), IListe.get(e).getSelectedRows()), "Mise à jour des stocks");
if (UserRightsManager.getCurrentUserRights().canAdd(getTable().getDBRoot().getTable("STOCK"))) {
final PanelFrame p = new PanelFrame(new InventairePanel(IListe.get(e), IListe.get(e).getSelectedRows()), "Mise à jour des stocks");
FrameUtil.show(p);
 
} else {
JOptionPane.showMessageDialog(null, "Vous n'avez les droits suffisants pour modifier manuellement les stocks!");
}
}
}, true, false);
stock.setPredicate(IListeEvent.getNonEmptySelectionPredicate());
getRowActions().add(stock);
 
PredicateRowAction cmd = new PredicateRowAction(new AbstractAction("Passer une commande") {
 
@Override
public void actionPerformed(ActionEvent e) {
 
transfertCommande(IListe.get(e).getSelectedRowAccessors());
 
}
}, true, false);
cmd.setPredicate(IListeEvent.getNonEmptySelectionPredicate());
getRowActions().add(cmd);
}
 
protected List<String> getListFields() {
return Arrays.asList("ID_ARTICLE", "QTE_MIN", "QTE_TH", "QTE_REEL", "QTE_LIV_ATTENTE", "QTE_RECEPT_ATTENTE", "ID_DEPOT_STOCK");
128,7 → 150,7
return rowStock;
}
 
public static SQLRowAccessor getStock(SQLRowAccessor rowValsSource) {
public static SQLRowAccessor getStock(SQLRowAccessor rowValsSource) throws SQLException {
 
SQLRowAccessor rowStock = null;
final int idDepot;
144,30 → 166,32
}
idDepot = rowValsArt.getForeignID("ID_DEPOT_STOCK");
}
SQLTable stockTable = rowValsSource.getTable().getTable("STOCK");
final int idArticle = rowValsSource.getForeignID("ID_ARTICLE");
DBRoot root = rowValsSource.getTable().getDBRoot();
 
SQLTable stockTable = root.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"), "=", idDepot);
Where w2 = new Where(putRowValuesStock.getTable().getField("ID_ARTICLE"), "=", rowValsSource.getForeignID("ID_ARTICLE"));
Where w = new Where(stockTable.getField("ID_DEPOT_STOCK"), "=", idDepot);
 
Where w2 = new Where(stockTable.getField("ID_ARTICLE"), "=", idArticle);
Collection<SQLRowValues> rowValsResult = fetch.fetch(w.and(w2));
if (rowValsResult.isEmpty()) {
SQLRowValues rowValsStock = new SQLRowValues(stockTable);
rowValsStock.put("ID_ARTICLE", rowValsSource.getForeignID("ID_ARTICLE"));
rowValsStock.put("ID_ARTICLE", idArticle);
rowValsStock.put("ID_DEPOT_STOCK", idDepot);
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();
if (idDepot == DepotStockSQLElement.DEFAULT_ID) {
rowValsSource.getForeign("ID_ARTICLE").createEmptyUpdateRow().put("ID_STOCK", rowStock.getID()).commit();
}
} 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) {
176,6 → 200,44
return rowStock;
}
 
/**
* Stock d'un article dans un dépôt donné
*
* @param idDepot dépôt
* @param idArticle article
* @param createIfMissing initialisation du stock à 0 si n'existe pas
* @return le stock (null si createIfMissing à false et que que le stock n'existe pas)
*/
public SQLRow getStock(int idDepot, int idArticle, boolean createIfMissing) throws SQLException {
final SQLTable stockTable = getTable();
final SQLRowValues putRowValuesStock = new SQLRowValues(stockTable);
putRowValuesStock.putNulls(stockTable.getFieldsName());
final SQLRowValuesListFetcher fetch = SQLRowValuesListFetcher.create(putRowValuesStock);
final Where w = new Where(stockTable.getField("ID_DEPOT_STOCK"), "=", idDepot);
final Where w2 = new Where(stockTable.getField("ID_ARTICLE"), "=", idArticle);
final Collection<SQLRowValues> rowValsResult = fetch.fetch(w.and(w2));
SQLRow result;
if (rowValsResult.isEmpty()) {
if (!createIfMissing) {
return null;
}
final SQLRowValues rowValsStock = new SQLRowValues(stockTable);
rowValsStock.put("ID_ARTICLE", idArticle);
rowValsStock.put("ID_DEPOT_STOCK", idDepot);
rowValsStock.put("QTE_TH", 0F);
rowValsStock.put("QTE_REEL", 0F);
rowValsStock.put("QTE_RECEPT_ATTENTE", 0F);
rowValsStock.put("QTE_LIV_ATTENTE", 0F);
result = rowValsStock.insert();
 
} else if (rowValsResult.size() == 1) {
result = rowValsResult.iterator().next().asRow();
} else {
throw new IllegalStateException("2 lignes de stocks pour le même dépôt! Article " + idArticle + " Depot " + idDepot);
}
return result;
}
 
/*
* (non-Javadoc)
*
271,7 → 333,63
};
}
 
/**
* Transfert d'une commande en commande fournisseur
*
* @param commandeID
*/
public void transfertCommande(List<SQLRowAccessor> rows) {
 
ComptaPropsConfiguration.getInstanceCompta().getNonInteractiveSQLExecutor().execute(new Runnable() {
 
@Override
public void run() {
 
SQLTable tableCmdElt = getDirectory().getElement("COMMANDE_ELEMENT").getTable();
SQLElement eltArticle = getDirectory().getElement("ARTICLE");
 
final ListMap<SQLRow, SQLRowValues> map = new ListMap<SQLRow, SQLRowValues>();
 
for (SQLRowAccessor sqlRow : rows) {
 
SQLRowAccessor rowArticleFind = sqlRow.getForeign("ID_ARTICLE");
int qte = 1;
BigDecimal qteUV = BigDecimal.ONE;
 
qte = -Math.round(sqlRow.getFloat("QTE_TH") - sqlRow.getFloat("QTE_MIN"));
 
SQLInjector inj = SQLInjector.getInjector(eltArticle.getTable(), tableCmdElt);
SQLRowValues rowValsElt = new SQLRowValues(inj.createRowValuesFrom(rowArticleFind.asRow()));
rowValsElt.put("ID_DEPOT_STOCK", sqlRow.getForeignID("ID_DEPOT_STOCK"));
rowValsElt.put("QTE", qte);
rowValsElt.put("QTE_UNITAIRE", qteUV);
 
rowValsElt.put("T_POIDS", rowValsElt.getLong("POIDS") * rowValsElt.getInt("QTE"));
// TODO récupérer le prix depuis les tarifs d'achat
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 fournisseur = rowArticleFind.asRow().getForeignRow("ID_FOURNISSEUR");
if (fournisseur != null && !fournisseur.isUndefined() && !rowArticleFind.isUndefined()) {
SQLRowValues rowValsCode = new SQLRowValues(tableCmdElt.getForeignTable("ID_CODE_FOURNISSEUR"));
rowValsCode.putNulls("ID");
final Where w = new Where(rowValsCode.getTable().getField("ID_ARTICLE"), "=", rowArticleFind.getID())
.and(new Where(rowValsCode.getTable().getField("ID_FOURNISSEUR"), "=", fournisseur.getID()));
final List<SQLRowValues> fetch = SQLRowValuesListFetcher.create(rowValsCode).fetch(w);
for (SQLRowValues sqlRowAccessor : fetch) {
rowValsElt.put("ID_CODE_FOURNISSEUR", sqlRowAccessor.getID());
}
}
map.add(fournisseur, rowValsElt);
}
 
MouvementStockSQLElement.createCommandeF(map, null, "");
}
});
 
}
 
@Override
protected String createCode() {
return "supplychain.stock";
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/stock/element/MouvementStockSQLElement.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
17,8 → 17,10
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.sales.product.model.ProductComponent;
import org.openconcerto.erp.core.supplychain.order.component.CommandeSQLComponent;
import org.openconcerto.erp.core.supplychain.order.ui.CommandeItemTable;
import org.openconcerto.erp.core.supplychain.stock.element.StockItem.TypeStockMouvement;
import org.openconcerto.erp.core.supplychain.supplier.component.MouvementStockSQLComponent;
import org.openconcerto.erp.preferences.GestionArticleGlobalPreferencePanel;
import org.openconcerto.erp.preferences.GestionCommercialeGlobalPreferencePanel;
26,10 → 28,14
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.element.TreesOfSQLRows;
import org.openconcerto.sql.model.ConnectionHandlerNoSetup;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLBackgroundTableCache;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLDataSource;
import org.openconcerto.sql.model.SQLInjector;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLSelect;
38,17 → 44,22
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.sql.request.ListSQLRequest;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.utils.SQLUtils;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.EditPanel;
import org.openconcerto.sql.view.EditPanel.EditMode;
import org.openconcerto.sql.view.list.RowValuesTableModel;
import org.openconcerto.ui.FrameUtil;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.ListMap;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map.Entry;
 
55,6 → 66,8
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
 
import org.apache.commons.dbutils.ResultSetHandler;
 
public class MouvementStockSQLElement extends ComptaSQLConfElement {
 
public MouvementStockSQLElement() {
119,9 → 132,16
// QTE_RECEPT_ATTENTE
 
final ListMap<SQLRow, SQLRowValues> map = new ListMap<>();
final SQLTable tableCommandeElement = Configuration.getInstance().getBase().getTable("COMMANDE_ELEMENT");
final SQLElement elementStock = Configuration.getInstance().getDirectory().getElement("STOCK");
 
if (rowsMvt == null || rowsMvt.isEmpty()) {
return map;
}
 
final DBRoot root = rowsMvt.iterator().next().getTable().getDBRoot();
 
final SQLTable tableCommandeElement = root.getTable("COMMANDE_ELEMENT");
final SQLTable tableStock = root.getTable("STOCK");
 
for (SQLRow rowMvtStock : rowsMvt) {
 
boolean retour = rowMvtStock.getString("SOURCE") == null || rowMvtStock.getString("SOURCE").startsWith("AVOIR_CLIENT");
138,7 → 158,7
float qte = rowStock.getFloat("QTE_REEL");
float qteMvt = rowMvtStock.getFloat("QTE");
 
SQLRowValues rowVals = new SQLRowValues(elementStock.getTable());
SQLRowValues rowVals = new SQLRowValues(tableStock);
 
float qteNvlle;
float qteNvlleEnAttenteRecept = rowStock.getFloat("QTE_RECEPT_ATTENTE");
173,7 → 193,7
try {
rowVals.update(rowStock.getID());
 
SQLPreferences prefs = new SQLPreferences(getTable().getDBRoot());
SQLPreferences prefs = new SQLPreferences(root);
boolean gestionStockMin = prefs.getBoolean(GestionArticleGlobalPreferencePanel.WARNING_STOCK_MIN, true);
 
if (!archive && gestionStockMin && rowStock.getObject("QTE_MIN") != null && qteNvlle < rowStock.getFloat("QTE_MIN")) {
203,7 → 223,7
float qte = rowStock.getFloat("QTE_TH");
float qteMvt = rowMvtStock.getFloat("QTE");
 
SQLRowValues rowVals = new SQLRowValues(elementStock.getTable());
SQLRowValues rowVals = new SQLRowValues(tableStock);
 
float qteNvlle;
float qteNvlleEnAttenteRecept = rowStock.getFloat("QTE_RECEPT_ATTENTE");
321,6 → 341,9
 
for (int i = 0; i < model.getRowCount(); i++) {
final SQLRowValues rowValsCmdElt = model.getRowValuesAt(i);
Number lineArticleNumber = rowValsCmdElt.contains("ID_ARTICLE") ? rowValsCmdElt.getNonEmptyForeignIDNumber("ID_ARTICLE") : null;
Number lineToAddArticleNumber = rowValsElt.contains("ID_ARTICLE") ? rowValsElt.getNonEmptyForeignIDNumber("ID_ARTICLE") : null;
if (lineToAddArticleNumber == null || lineArticleNumber == null || lineArticleNumber.equals(lineToAddArticleNumber)) {
if (ReferenceArticleSQLElement.isReferenceEquals(rowValsCmdElt, rowValsElt)) {
rowValsMatch = rowValsCmdElt;
index = i;
327,6 → 350,7
break;
}
}
}
if (rowValsMatch != null) {
 
int qte = rowValsMatch.getInt("QTE");
411,7 → 435,100
}
}
 
public void transfertStock(BigDecimal qteReel, final Date dateValue, final SQLRow selectedRowArticle, final SQLRow selectedRowDepotDepart, final SQLRow selectedRowDepotArrivee,
final String labelTrStock) {
final boolean usePrice = getTable().contains("PRICE");
try {
SQLUtils.executeAtomic(selectedRowDepotDepart.getTable().getDBSystemRoot().getDataSource(), new ConnectionHandlerNoSetup<Object, SQLException>() {
@Override
public Object handle(SQLDataSource ds) throws SQLException {
List<StockItem> stockItems = new ArrayList<StockItem>();
List<String> multipleRequestsHundred = new ArrayList<String>(100);
{
// DEPART
final SQLRowAccessor rowStockDepart = ProductComponent.findOrCreateStock(selectedRowArticle, selectedRowDepotDepart);
StockItem item = new StockItem(selectedRowArticle, rowStockDepart);
if (!item.isStockInit()) {
SQLRowValues rowVals = new SQLRowValues(getTable().getTable("STOCK"));
rowVals.put("ID_ARTICLE", selectedRowArticle.getID());
rowVals.put("ID_DEPOT_STOCK", selectedRowDepotDepart.getID());
rowVals.commit();
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, getLabel(labelTrStock, selectedRowDepotDepart, selectedRowDepotArrivee), true, usePrice));
item.updateQty(diff, TypeStockMouvement.THEORIQUE);
multipleRequestsHundred.add(getMvtRequest(dateValue, BigDecimal.ZERO, diff, item, getLabel(labelTrStock, selectedRowDepotDepart, selectedRowDepotArrivee), false, usePrice));
multipleRequestsHundred.add(item.getUpdateRequest());
}
// ARRIVEE
{
final SQLRowAccessor rowStockArrivee = ProductComponent.findOrCreateStock(selectedRowArticle, selectedRowDepotArrivee);
StockItem item = new StockItem(selectedRowArticle, rowStockArrivee);
if (!item.isStockInit()) {
SQLRowValues rowVals = new SQLRowValues(getTable().getTable("STOCK"));
rowVals.put("ID_ARTICLE", selectedRowArticle.getID());
rowVals.put("ID_DEPOT_STOCK", selectedRowDepotArrivee.getID());
rowVals.commit();
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, getLabel(labelTrStock, selectedRowDepotDepart, selectedRowDepotArrivee), true, usePrice));
item.updateQty(diff, TypeStockMouvement.THEORIQUE);
multipleRequestsHundred.add(getMvtRequest(dateValue, BigDecimal.ZERO, diff, item, getLabel(labelTrStock, selectedRowDepotDepart, selectedRowDepotArrivee), false, usePrice));
multipleRequestsHundred.add(item.getUpdateRequest());
}
 
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(selectedRowArticle.getTable().getDBSystemRoot(), multipleRequestsHundred, handlers);
 
final DBRoot root = getTable().getDBRoot();
if (root.contains("ARTICLE_ELEMENT")) {
// Mise à jour des stocks des nomenclatures
ComposedItemStockUpdater comp = new ComposedItemStockUpdater(root, stockItems);
comp.update();
}
return null;
}
});
} catch (SQLException e1) {
ExceptionHandler.handle("Stock update error", e1);
}
}
 
private String getLabel(String label, SQLRowAccessor fromDepot, SQLRowAccessor toDepot) {
return label + " de " + fromDepot.getString("NOM") + " vers " + toDepot.getString("NOM");
}
 
private String getMvtRequest(Date time, BigDecimal prc, double qteFinal, StockItem item, String label, boolean reel, boolean usePrice) {
String mvtStockTableQuoted = getTable().getSQLName().quote();
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;
}
 
@Override
protected String createCode() {
return createCodeOfPackage() + ".transaction";
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/stock/element/ImportInventairePanel.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
92,7 → 92,8
 
@Override
public void run() {
final InventaireFromEtatStockImporter impoter = new InventaireFromEtatStockImporter(rowDepot);
// FIXME ajouter une barre de progression
final InventaireFromEtatStockImporter impoter = new InventaireFromEtatStockImporter(depotElt.getDirectory().getElement("ARTICLE"), rowDepot);
try {
SQLUtils.executeAtomic(depotElt.getTable().getDBSystemRoot().getDataSource(), new ConnectionHandlerNoSetup<Object, IOException>() {
@Override
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/stock/element/EtatStockFromInventoryFileCreator.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
16,11 → 16,19
import org.openconcerto.erp.core.sales.product.model.PriceByQty;
import org.openconcerto.erp.importer.ArrayTableModel;
import org.openconcerto.erp.importer.DataImporter;
import org.openconcerto.erp.preferences.GestionArticleGlobalPreferencePanel;
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.SQLRowListRSH;
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.preferences.SQLPreferences;
import org.openconcerto.utils.Tuple3;
 
import java.io.File;
import java.io.IOException;
27,6 → 35,7
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
33,8 → 42,11
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
 
import javax.swing.JOptionPane;
 
public class EtatStockFromInventoryFileCreator {
 
// Map<String, SQLRowValues> kits = new HashMap<String, SQLRowValues>();
41,11 → 53,102
// List<String> codeKits = new ArrayList<String>();
// List<SQLRowValues> rowValsArtNonSync = new ArrayList<SQLRowValues>();
 
private static String FAMILLE = "Famille";
private static String CODE = "Code";
private static String NOM = "Nom";
private static String TAILLE = "Taille";
private static String COULEUR = "Couleur";
private static String QTE = "Qté réelle relevée";
private final Map<String, Integer> mapCouleur = new HashMap<String, Integer>();
private final Map<String, Integer> mapTaille = new HashMap<String, Integer>();
private final DBRoot root;
private final SQLElement artElt;
 
public EtatStockFromInventoryFileCreator(SQLElement artElt) {
this.artElt = artElt;
this.root = artElt.getTable().getDBRoot();
}
 
public void importArticles(File file, Date d) throws IOException, SQLException {
 
final SQLTable table = Configuration.getInstance().getRoot().findTable("ARTICLE");
Map<String, SQLRowValues> articles = getArticles();
final SQLTable table = this.root.findTable("ARTICLE");
 
{
SQLSelect sel = new SQLSelect();
sel.addSelect(table.getDBRoot().getTable("ARTICLE_DECLINAISON_COULEUR").getKey());
sel.addSelect(table.getDBRoot().getTable("ARTICLE_DECLINAISON_COULEUR").getField("NOM"));
 
List<SQLRow> l = SQLRowListRSH.execute(sel);
 
for (SQLRow sqlRow : l) {
mapCouleur.put(sqlRow.getString("NOM").trim(), sqlRow.getID());
}
}
 
{
SQLSelect sel = new SQLSelect();
sel.addSelect(table.getDBRoot().getTable("ARTICLE_DECLINAISON_TAILLE").getKey());
sel.addSelect(table.getDBRoot().getTable("ARTICLE_DECLINAISON_TAILLE").getField("NOM"));
 
List<SQLRow> l = SQLRowListRSH.execute(sel);
 
for (SQLRow sqlRow : l) {
mapTaille.put(sqlRow.getString("NOM").trim(), sqlRow.getID());
}
}
 
fillArticles();
 
Map<String, Integer> columnMapping = new HashMap<String, Integer>();
columnMapping.put(CODE, null);
columnMapping.put(NOM, null);
columnMapping.put(TAILLE, null);
columnMapping.put(FAMILLE, null);
columnMapping.put(COULEUR, null);
columnMapping.put(QTE, null);
{
// Searching column index from column Header
final DataImporter importer = new DataImporter(table);
importer.setSkipFirstLine(false);
ArrayTableModel m = importer.createModelFrom(file);
List<Object> line = m.getLineValuesAt(0);
for (int i = 0; i < line.size(); i++) {
Object object = line.get(i);
if (object != null) {
for (String key : columnMapping.keySet()) {
if (object.toString().equalsIgnoreCase(key)) {
columnMapping.put(key, i);
}
}
}
}
}
 
String msg = "Colonnes importées : \n";
final SQLPreferences prefs = SQLPreferences.getMemCached(table.getDBRoot());
final boolean hasDeclinaison = prefs.getBoolean(GestionArticleGlobalPreferencePanel.ACTIVER_DECLINAISON, false);
List<String> required;
if (hasDeclinaison) {
required = Arrays.asList(CODE, QTE, TAILLE, COULEUR);
} else {
required = Arrays.asList(CODE, QTE);
}
 
for (Entry<String, Integer> e : columnMapping.entrySet()) {
if (e.getValue() != null) {
msg += e.getKey() + " : " + getColumnName(e.getValue()) + "\n";
} else {
if (required.contains(e.getKey())) {
JOptionPane.showMessageDialog(null, "Aucune colonne " + e.getKey() + " trouvée, import annulé!\nCette colonne est obligatoire.");
return;
}
msg += e.getKey() + " : non importée\n";
}
}
msg += "\nVoulez vous continuer ?";
int a = JOptionPane.showConfirmDialog(null, msg);
if (a == JOptionPane.YES_OPTION) {
 
final DataImporter importer = new DataImporter(table) {
@Override
protected void customizeRowValuesToFetch(SQLRowValues vals) {
63,14 → 166,25
BigDecimal total = BigDecimal.ZERO;
for (int i = 0; i < m.getRowCount(); i++) {
List<Object> o = m.getLineValuesAt(i);
String code = o.get(0).toString();
String code = o.get(columnMapping.get(CODE)).toString();
if (code.trim().length() == 0) {
break;
}
final String stringQty = o.get(3).toString();
 
final String stringQty = o.get(columnMapping.get(QTE)).toString();
Integer qty = stringQty.trim().length() == 0 ? 0 : Integer.valueOf(stringQty);
 
SQLRowValues match = articles.get(code);
String couleur = "";
if (columnMapping.get(COULEUR) != null) {
couleur = o.get(columnMapping.get(COULEUR)).toString();
}
 
String taille = "";
if (columnMapping.get(TAILLE) != null) {
taille = o.get(columnMapping.get(TAILLE)).toString();
}
 
SQLRowAccessor match = findArticle(code, couleur, taille);
if (match != null) {
 
SQLRowValues stockValues = new SQLRowValues(table.getTable("ETAT_STOCK_ELEMENT"));
95,8 → 209,9
}
etatStock.createEmptyUpdateRow().put("MONTANT_HA", total).commit();
}
}
 
public BigDecimal getPRC(SQLRowValues rowVals, int qty, Date d) {
public BigDecimal getPRC(SQLRowAccessor rowVals, int qty, Date d) {
if (rowVals.getTable().getDBRoot().contains("ARTICLE_PRIX_REVIENT")) {
SQLTable table = rowVals.getTable().getDBRoot().getTable("ARTICLE_PRIX_REVIENT");
Collection<SQLRow> prcs = rowVals.asRow().getReferentRows(table);
126,7 → 241,10
}
}
 
private Map<String, SQLRowValues> getArticles() throws SQLException {
private final Map<String, SQLRowAccessor> mapArticle = new HashMap<String, SQLRowAccessor>();
private final Map<Tuple3<String, String, String>, SQLRowAccessor> mapDeclArticle = new HashMap<Tuple3<String, String, String>, SQLRowAccessor>();
 
private void fillArticles() throws SQLException {
final SQLTable table = Configuration.getInstance().getRoot().findTable("ARTICLE");
SQLRowValues graph = new SQLRowValues(table);
graph.put("ID", null);
135,6 → 253,8
graph.put("NOM", null);
graph.put("PA_HT", null);
graph.putRowValues("ID_STOCK").putNulls("ID", "QTE_REEL", "QTE_TH", "QTE_LIV_ATTENTE", "QTE_RECEPT_ATTENTE");
graph.putRowValues("ID_ARTICLE_DECLINAISON_COULEUR").putNulls("ID", "NOM");
graph.putRowValues("ID_ARTICLE_DECLINAISON_TAILLE").putNulls("ID", "NOM");
 
final SQLTable tableArtElt = table.getTable("ARTICLE_ELEMENT");
SQLRowValues artElt = new SQLRowValues(tableArtElt);
142,24 → 262,110
artElt.put("QTE", null);
artElt.put("QTE_UNITAIRE", null);
artElt.put("ID_ARTICLE_PARENT", graph);
artElt.putRowValues("ID_ARTICLE").putNulls("ID", "CODE", "NOM").putRowValues("ID_STOCK").putNulls("QTE_TH", "QTE_REEL", "QTE_LIV_ATTENTE", "QTE_RECEPT_ATTENTE");
final SQLRowValues putRowValues = artElt.putRowValues("ID_ARTICLE");
putRowValues.putNulls("ID", "CODE", "NOM").putRowValues("ID_STOCK").putNulls("QTE_TH", "QTE_REEL", "QTE_LIV_ATTENTE", "QTE_RECEPT_ATTENTE");
putRowValues.putRowValues("ID_ARTICLE_DECLINAISON_TAILLE").putNulls("ID", "NOM");
putRowValues.putRowValues("ID_ARTICLE_DECLINAISON_COULEUR").putNulls("ID", "NOM");
 
SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(graph);
List<SQLRowValues> results = fetcher.fetch();
 
Map<String, SQLRowValues> vals = new HashMap<String, SQLRowValues>();
for (SQLRowValues sqlRowValues : results) {
 
final Set<SQLRowValues> referentRows = sqlRowValues.getReferentRows(tableArtElt.getField("ID_ARTICLE_PARENT"));
// On ne prend que les articles simples
if (referentRows.size() == 0) {
final String code = sqlRowValues.getString("CODE");
vals.put(code, sqlRowValues);
final SQLRowAccessor couleur = sqlRowValues.getObject("ID_ARTICLE_DECLINAISON_COULEUR") == null ? null : sqlRowValues.getNonEmptyForeign("ID_ARTICLE_DECLINAISON_COULEUR");
final SQLRowAccessor taille = sqlRowValues.getObject("ID_ARTICLE_DECLINAISON_TAILLE") == null ? null : sqlRowValues.getNonEmptyForeign("ID_ARTICLE_DECLINAISON_TAILLE");
if (couleur == null && taille == null) {
mapArticle.put(sqlRowValues.getString("CODE"), sqlRowValues);
} else if (couleur == null) {
mapDeclArticle.put(Tuple3.create(sqlRowValues.getString("CODE"), null, taille.getString("NOM")), sqlRowValues);
} else if (taille == null) {
mapDeclArticle.put(Tuple3.create(sqlRowValues.getString("CODE"), couleur.getString("NOM"), null), sqlRowValues);
} else {
mapDeclArticle.put(Tuple3.create(sqlRowValues.getString("CODE"), couleur.getString("NOM"), taille.getString("NOM")), sqlRowValues);
}
 
} else {
 
}
}
return vals;
 
}
 
private SQLRowAccessor findArticle(String code, String couleur, String taille) throws SQLException {
if (!mapCouleur.containsKey(couleur)) {
SQLRowValues rowVals = new SQLRowValues(root.getTable("ARTICLE_DECLINAISON_COULEUR"));
rowVals.put("NOM", couleur);
mapCouleur.put(couleur, rowVals.commit().getID());
}
if (!mapTaille.containsKey(taille)) {
SQLRowValues rowVals = new SQLRowValues(root.getTable("ARTICLE_DECLINAISON_TAILLE"));
rowVals.put("NOM", taille);
mapTaille.put(taille, rowVals.commit().getID());
}
 
SQLRowAccessor sqlRowAccessor;
if ((couleur == null || couleur.trim().length() == 0) && (taille == null || taille.trim().length() == 0)) {
 
sqlRowAccessor = mapArticle.get(code);
 
} else if (couleur == null || couleur.trim().length() == 0) {
sqlRowAccessor = mapDeclArticle.get(Tuple3.create(code, null, taille.trim()));
if (sqlRowAccessor == null) {
sqlRowAccessor = cloneFromArticle(mapArticle.get(code), null, mapTaille.get(taille.trim()));
mapDeclArticle.put(Tuple3.create(code, null, taille.trim()), sqlRowAccessor);
}
} else if (taille == null || taille.trim().length() == 0) {
sqlRowAccessor = mapDeclArticle.get(Tuple3.create(code, couleur.trim(), null));
if (sqlRowAccessor == null) {
sqlRowAccessor = cloneFromArticle(mapArticle.get(code), mapCouleur.get(couleur.trim()), null);
mapDeclArticle.put(Tuple3.create(code, couleur.trim(), null), sqlRowAccessor);
}
} else {
sqlRowAccessor = mapDeclArticle.get(Tuple3.create(code, couleur.trim(), taille.trim()));
if (sqlRowAccessor == null) {
if (mapArticle.get(code) != null) {
sqlRowAccessor = cloneFromArticle(mapArticle.get(code),
 
mapCouleur.get(couleur.trim()), mapTaille.get(taille.trim()));
mapDeclArticle.put(Tuple3.create(code, couleur.trim(), taille.trim()), sqlRowAccessor);
}
}
}
return sqlRowAccessor;
}
 
public SQLRow cloneFromArticle(SQLRowAccessor rArt, Integer idCouleur, Integer idTaille) throws SQLException {
if (rArt == null) {
return null;
}
SQLRowValues copy = artElt.createCopy(rArt.getID());
if (idCouleur != null) {
copy.put("ID_ARTICLE_DECLINAISON_COULEUR", idCouleur);
}
if (idTaille != null) {
copy.put("ID_ARTICLE_DECLINAISON_TAILLE", idTaille);
}
return copy.commit();
}
 
private String getColumnName(int columnNumber) {
int dividend = columnNumber;
String columnName = "";
int modulo;
 
while (dividend >= 0) {
modulo = dividend % 26;
columnName = String.valueOf((char) (65 + modulo)) + columnName;
dividend = (int) ((dividend - modulo) / 26);
if (dividend <= 0) {
break;
} else {
dividend--;
}
}
 
return columnName;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/stock/element/EtatStockSQLElement.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
32,6 → 32,7
 
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
 
49,8 → 50,8
 
@Override
public void actionPerformed(ActionEvent e) {
EtatStockSnapshotCreator creator = new EtatStockSnapshotCreator(getTable().getTable("DEPOT_STOCK").getRow(DepotStockSQLElement.DEFAULT_ID), new Date(), getTable().getDBRoot());
creator.create();
PanelFrame frame = new PanelFrame(new EtatStockCreationPanel(getDirectory().getElement(DepotStockSQLElement.class)), "Création état de stock");
FrameUtil.showPacked(frame);
}
}, true);
action.setPredicate(IListeEvent.createSelectionCountPredicate(0, Integer.MAX_VALUE));
79,7 → 80,7
EtatStockInventaireXmlSheet sheet = new EtatStockInventaireXmlSheet(IListe.get(e).getSelectedRow().asRow());
try {
sheet.createDocument();
sheet.showPrintAndExport(true, false, false, false, false);
sheet.showPrintAndExport(true, false, false, false, false, Collections.emptyList());
} catch (Exception e1) {
ExceptionHandler.handle("Erreur lors de la création de l'inventaire", e1);
}
97,7 → 98,7
FrameUtil.showPacked(frame);
}
}, true);
action.setPredicate(IListeEvent.getSingleSelectionPredicate());
action.setPredicate(IListeEvent.createSelectionCountPredicate(0, Integer.MAX_VALUE));
getRowActions().add(action);
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/stock/element/InventaireFromEtatStockImporter.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
18,16 → 18,22
import org.openconcerto.erp.core.sales.product.model.ProductHelper.SupplierPriceField;
import org.openconcerto.erp.importer.ArrayTableModel;
import org.openconcerto.erp.importer.DataImporter;
import org.openconcerto.erp.preferences.GestionArticleGlobalPreferencePanel;
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.SQLRowListRSH;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLRowValuesCluster.StoreMode;
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.sql.utils.SQLUtils;
import org.openconcerto.utils.Tuple2;
import org.openconcerto.utils.Tuple3;
 
import java.io.File;
import java.io.IOException;
34,6 → 40,7
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
40,8 → 47,11
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
 
import javax.swing.JOptionPane;
 
import org.apache.commons.dbutils.ResultSetHandler;
 
public class InventaireFromEtatStockImporter {
49,18 → 59,107
private Map<String, SQLRowValues> kits = new HashMap<String, SQLRowValues>();
private List<String> codeKits = new ArrayList<String>();
private SQLRowAccessor depot;
private static String FAMILLE = "Famille";
private static String CODE = "Code";
private static String NOM = "Nom";
private static String TAILLE = "Taille";
private static String COULEUR = "Couleur";
private static String QTE = "Qté réelle relevée";
private static String QTE_OPENCONCERTO = "QTE OpenConcerto";
private final Map<String, Integer> mapCouleur = new HashMap<String, Integer>();
private final Map<String, Integer> mapTaille = new HashMap<String, Integer>();
private final DBRoot root;
private final SQLElement artElt;
 
public InventaireFromEtatStockImporter(SQLRowAccessor depot) {
public InventaireFromEtatStockImporter(SQLElement articleElt, SQLRowAccessor depot) {
this.depot = depot;
this.root = articleElt.getTable().getDBRoot();
this.artElt = articleElt;
{
SQLSelect sel = new SQLSelect();
sel.addSelect(articleElt.getTable().getTable("ARTICLE_DECLINAISON_COULEUR").getKey());
sel.addSelect(articleElt.getTable().getTable("ARTICLE_DECLINAISON_COULEUR").getField("NOM"));
 
List<SQLRow> l = SQLRowListRSH.execute(sel);
 
for (SQLRow sqlRow : l) {
mapCouleur.put(sqlRow.getString("NOM").trim(), sqlRow.getID());
}
}
 
{
SQLSelect sel = new SQLSelect();
sel.addSelect(articleElt.getTable().getTable("ARTICLE_DECLINAISON_TAILLE").getKey());
sel.addSelect(articleElt.getTable().getTable("ARTICLE_DECLINAISON_TAILLE").getField("NOM"));
 
List<SQLRow> l = SQLRowListRSH.execute(sel);
 
for (SQLRow sqlRow : l) {
mapTaille.put(sqlRow.getString("NOM").trim(), sqlRow.getID());
}
}
}
 
public void importArticles(File file, DBRoot root) throws IOException, SQLException {
 
final SQLTable table = root.findTable("ARTICLE");
final SQLTable tableArtElt = root.findTable("ARTICLE_ELEMENT");
 
Map<String, Tuple2<SQLRowValues, SQLRowValues>> articles = getArticles();
// Récupération des couples articles/stocks existant
fillArticles();
 
// Matching des colonnes
Map<String, Integer> columnMapping = new HashMap<String, Integer>();
columnMapping.put(CODE, null);
columnMapping.put(NOM, null);
columnMapping.put(TAILLE, null);
columnMapping.put(FAMILLE, null);
columnMapping.put(COULEUR, null);
columnMapping.put(QTE, null);
columnMapping.put(QTE_OPENCONCERTO, null);
{
// Searching column index from column Header
final DataImporter importer = new DataImporter(table);
importer.setSkipFirstLine(false);
ArrayTableModel m = importer.createModelFrom(file);
List<Object> line = m.getLineValuesAt(0);
for (int i = 0; i < line.size(); i++) {
Object object = line.get(i);
if (object != null) {
for (String key : columnMapping.keySet()) {
if (object.toString().equalsIgnoreCase(key)) {
columnMapping.put(key, i);
}
}
}
}
}
 
String msg = "Colonnes importées : \n";
final SQLPreferences prefs = SQLPreferences.getMemCached(table.getDBRoot());
final boolean hasDeclinaison = prefs.getBoolean(GestionArticleGlobalPreferencePanel.ACTIVER_DECLINAISON, false);
List<String> required;
if (hasDeclinaison) {
required = Arrays.asList(CODE, QTE, QTE_OPENCONCERTO, TAILLE, COULEUR);
} else {
required = Arrays.asList(CODE, QTE, QTE_OPENCONCERTO);
}
 
for (Entry<String, Integer> e : columnMapping.entrySet()) {
if (e.getValue() != null) {
msg += e.getKey() + " : " + getColumnName(e.getValue()) + "\n";
} else {
if (required.contains(e.getKey())) {
JOptionPane.showMessageDialog(null, "Aucune colonne " + e.getKey() + " trouvée, import annulé!\nCette colonne est obligatoire.");
return;
}
msg += e.getKey() + " : non importée\n";
}
}
msg += "\nVoulez vous continuer ?";
int a = JOptionPane.showConfirmDialog(null, msg);
if (a == JOptionPane.YES_OPTION) {
 
final DataImporter importer = new DataImporter(table) {
@Override
protected void customizeRowValuesToFetch(SQLRowValues vals) {
90,15 → 189,27
List<Object> o = m.getLineValuesAt(i);
if (o.size() >= 5) {
System.err.println(o);
String code = o.get(1).toString();
String code = o.get(columnMapping.get(CODE)).toString();
if (code.trim().length() > 0) {
 
final String stringQty = o.get(4).toString();
final String stringQty = o.get(columnMapping.get(QTE)).toString();
Double qty = stringQty.trim().length() == 0 ? 0 : Double.valueOf(stringQty);
final String stringQtyOld = o.get(3).toString();
final String stringQtyOld = o.get(columnMapping.get(QTE_OPENCONCERTO)).toString();
float qtyOld = stringQtyOld.trim().length() == 0 ? 0 : Float.valueOf(stringQtyOld);
 
Tuple2<SQLRowValues, SQLRowValues> match = articles.get(code);
String couleur = "";
if (columnMapping.get(COULEUR) != null) {
couleur = o.get(columnMapping.get(COULEUR)).toString();
}
 
String taille = "";
if (columnMapping.get(TAILLE) != null) {
taille = o.get(columnMapping.get(TAILLE)).toString();
}
 
// SQLRowAccessor match = findArticle(code, couleur, taille);
 
Tuple2<SQLRowValues, SQLRowValues> match = findArticle(code, couleur, taille);
if (match != null) {
 
SQLRowAccessor stockValues = match.get1();
174,11 → 285,12
for (String code : codeKits) {
System.err.println(code);
SQLRowValues rowValsKit = kits.get(code);
StockItem item = new StockItem(rowValsKit, rowValsKit.getForeign("ID_STOCK"));
StockItem item = new StockItem(rowValsKit, ProductComponent.findOrCreateStock(rowValsKit, depot));
Collection<SQLRowValues> elts = rowValsKit.getReferentRows(tableArtElt.getField("ID_ARTICLE_PARENT"));
for (SQLRowValues sqlRowValues : elts) {
if (sqlRowValues.getForeign("ID_ARTICLE") != null) {
item.addItemComponent(new StockItemComponent(new StockItem(sqlRowValues.getForeign("ID_ARTICLE"), sqlRowValues.getForeign("ID_ARTICLE").getForeign("ID_STOCK")),
item.addItemComponent(
new StockItemComponent(new StockItem(sqlRowValues.getForeign("ID_ARTICLE"), ProductComponent.findOrCreateStock(sqlRowValues.getForeign("ID_ARTICLE"), depot)),
sqlRowValues.getBigDecimal("QTE_UNITAIRE"), sqlRowValues.getInt("QTE")));
}
}
231,8 → 343,8
// checkMinPrice(rowVals, mapLastValidRows.get(qte));
// }
// }
 
}
}
 
private void checkMinPrice(SQLRow rowValsSuplierLastValid, SQLRow lastValidRow) {
boolean update = false;
309,18 → 421,29
// return result;
}
 
private Map<String, Tuple2<SQLRowValues, SQLRowValues>> getArticles() throws SQLException {
private final Map<String, Tuple2<SQLRowValues, SQLRowValues>> mapArticle = new HashMap<String, Tuple2<SQLRowValues, SQLRowValues>>();
private final Map<String, Tuple2<SQLRowValues, SQLRowValues>> mapArticleVirtuel = new HashMap<String, Tuple2<SQLRowValues, SQLRowValues>>();
private final Map<Tuple3<String, String, String>, Tuple2<SQLRowValues, SQLRowValues>> mapDeclArticle = new HashMap<Tuple3<String, String, String>, Tuple2<SQLRowValues, SQLRowValues>>();
 
private void fillArticles() throws SQLException {
final SQLTable table = Configuration.getInstance().getRoot().findTable("ARTICLE");
SQLRowValues graph = new SQLRowValues(table);
graph.put("ID", null);
graph.put("CODE", null);
graph.put("NOM", null);
graph.put("NOM", null);
graph.put("VIRTUEL", null);
graph.putRowValues("ID_ARTICLE_DECLINAISON_COULEUR").putNulls("ID", "NOM");
graph.putRowValues("ID_ARTICLE_DECLINAISON_TAILLE").putNulls("ID", "NOM");
 
final SQLTable foreignTableStock = table.getForeignTable("ID_STOCK");
SQLRowValues graphStock = new SQLRowValues(foreignTableStock);
graphStock.putNulls("ID_DEPOT_STOCK", "ID", "QTE_REEL", "QTE_TH", "QTE_LIV_ATTENTE", "QTE_RECEPT_ATTENTE");
graphStock.put("ID_ARTICLE", graph);
 
SQLRowValues graphStockArt = new SQLRowValues(foreignTableStock);
graphStockArt.putNulls("ID_DEPOT_STOCK", "ID", "QTE_REEL", "QTE_TH", "QTE_LIV_ATTENTE", "QTE_RECEPT_ATTENTE");
graph.put("ID_STOCK", graphStockArt);
 
final SQLTable tableArtElt = table.getTable("ARTICLE_ELEMENT");
SQLRowValues artElt = new SQLRowValues(tableArtElt);
artElt.put("ID", null);
328,11 → 451,17
artElt.put("QTE_UNITAIRE", null);
artElt.put("ID_ARTICLE_PARENT", graph);
final SQLRowValues articleParent = artElt.putRowValues("ID_ARTICLE");
articleParent.putNulls("ID", "CODE", "NOM");
articleParent.putNulls("ID", "CODE", "NOM", "VIRTUEL");
articleParent.putRowValues("ID_ARTICLE_DECLINAISON_COULEUR").putNulls("ID", "NOM");
articleParent.putRowValues("ID_ARTICLE_DECLINAISON_TAILLE").putNulls("ID", "NOM");
 
SQLRowValues graphStockItem = new SQLRowValues(foreignTableStock);
graphStockItem.putNulls("ID_DEPOT_STOCK", "ID", "QTE_REEL", "QTE_TH", "QTE_LIV_ATTENTE", "QTE_RECEPT_ATTENTE");
graphStockItem.put("ID_ARTICLE", articleParent);
 
SQLRowValues graphStockArtItem = new SQLRowValues(foreignTableStock);
graphStockArtItem.putNulls("ID_DEPOT_STOCK", "ID", "QTE_REEL", "QTE_TH", "QTE_LIV_ATTENTE", "QTE_RECEPT_ATTENTE");
articleParent.put("ID_STOCK", graphStockArtItem);
 
SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(graph);
List<SQLRowValues> results = fetcher.fetch();
 
342,7 → 471,6
c.set(Calendar.DAY_OF_MONTH, 31);
Date dEndYear = c.getTime();
 
Map<String, Tuple2<SQLRowValues, SQLRowValues>> vals = new HashMap<String, Tuple2<SQLRowValues, SQLRowValues>>();
for (SQLRowValues sqlRowValues : results) {
final String code = sqlRowValues.getString("CODE");
 
354,11 → 482,25
rowValsStock = sqlRowValues2;
}
}
if (rowValsStock == null) {
rowValsStock = ProductComponent.findOrCreateStock(sqlRowValues, depot).asRowValues();
// if (rowValsStock == null) {
// rowValsStock = ProductComponent.findOrCreateStock(sqlRowValues, depot).asRowValues();
// }
 
if (sqlRowValues.getBoolean("VIRTUEL")) {
mapArticleVirtuel.put(sqlRowValues.getString("CODE"), Tuple2.create(sqlRowValues, rowValsStock));
}
 
vals.put(code, Tuple2.create(sqlRowValues, rowValsStock));
final SQLRowAccessor couleur = sqlRowValues.getObject("ID_ARTICLE_DECLINAISON_COULEUR") == null ? null : sqlRowValues.getNonEmptyForeign("ID_ARTICLE_DECLINAISON_COULEUR");
final SQLRowAccessor taille = sqlRowValues.getObject("ID_ARTICLE_DECLINAISON_TAILLE") == null ? null : sqlRowValues.getNonEmptyForeign("ID_ARTICLE_DECLINAISON_TAILLE");
if (couleur == null && taille == null) {
mapArticle.put(sqlRowValues.getString("CODE"), Tuple2.create(sqlRowValues, rowValsStock));
} else if (couleur == null) {
mapDeclArticle.put(Tuple3.create(sqlRowValues.getString("CODE"), null, taille.getString("NOM")), Tuple2.create(sqlRowValues, rowValsStock));
} else if (taille == null) {
mapDeclArticle.put(Tuple3.create(sqlRowValues.getString("CODE"), couleur.getString("NOM"), null), Tuple2.create(sqlRowValues, rowValsStock));
} else {
mapDeclArticle.put(Tuple3.create(sqlRowValues.getString("CODE"), couleur.getString("NOM"), taille.getString("NOM")), Tuple2.create(sqlRowValues, rowValsStock));
}
 
final Set<SQLRowValues> referentRows = sqlRowValues.getReferentRows(tableArtElt.getField("ID_ARTICLE_PARENT"));
if (referentRows.size() == 0) {
403,6 → 545,99
// }
}
}
return vals;
}
 
private Tuple2<SQLRowValues, SQLRowValues> findArticle(String code, String couleur, String taille) throws SQLException {
if (!mapCouleur.containsKey(couleur)) {
SQLRowValues rowVals = new SQLRowValues(root.getTable("ARTICLE_DECLINAISON_COULEUR"));
rowVals.put("NOM", couleur);
mapCouleur.put(couleur, rowVals.commit().getID());
}
if (!mapTaille.containsKey(taille)) {
SQLRowValues rowVals = new SQLRowValues(root.getTable("ARTICLE_DECLINAISON_TAILLE"));
rowVals.put("NOM", taille);
mapTaille.put(taille, rowVals.commit().getID());
}
 
Tuple2<SQLRowValues, SQLRowValues> t;
if ((couleur == null || couleur.trim().length() == 0) && (taille == null || taille.trim().length() == 0)) {
 
t = mapArticle.get(code);
if (t.get1() == null) {
t = Tuple2.create(t.get0(), ProductComponent.findOrCreateStock(t.get0(), depot).asRowValues());
mapArticle.put(code, t);
}
} else if (couleur == null || couleur.trim().length() == 0) {
t = mapDeclArticle.get(Tuple3.create(code, null, taille.trim()));
if (t == null) {
SQLRowValues artRow = cloneFromArticle(mapArticleVirtuel.get(code).get0(), null, mapTaille.get(taille.trim())).asRowValues();
final SQLRowValues stockRow = ProductComponent.findOrCreateStock(artRow, depot).asRowValues();
t = Tuple2.create(artRow, stockRow);
mapDeclArticle.put(Tuple3.create(code, null, taille.trim()), t);
} else if (t.get1() == null) {
t = Tuple2.create(t.get0(), ProductComponent.findOrCreateStock(t.get0(), depot).asRowValues());
mapDeclArticle.put(Tuple3.create(code, null, taille.trim()), t);
}
} else if (taille == null || taille.trim().length() == 0) {
t = mapDeclArticle.get(Tuple3.create(code, couleur.trim(), null));
if (t == null) {
SQLRowValues artRow = cloneFromArticle(mapArticleVirtuel.get(code).get0(), mapCouleur.get(couleur.trim()), null).asRowValues();
final SQLRowValues stockRow = ProductComponent.findOrCreateStock(artRow, depot).asRowValues();
t = Tuple2.create(artRow, stockRow);
mapDeclArticle.put(Tuple3.create(code, couleur.trim(), null), t);
} else if (t.get1() == null) {
t = Tuple2.create(t.get0(), ProductComponent.findOrCreateStock(t.get0(), depot).asRowValues());
mapDeclArticle.put(Tuple3.create(code, couleur.trim(), null), t);
}
} else {
t = mapDeclArticle.get(Tuple3.create(code, couleur.trim(), taille.trim()));
if (t == null) {
if (mapArticle.get(code) != null) {
SQLRowValues artRow = cloneFromArticle(mapArticleVirtuel.get(code).get0(), mapCouleur.get(couleur.trim()), mapTaille.get(taille.trim())).asRowValues();
final SQLRowValues stockRow = ProductComponent.findOrCreateStock(artRow, depot).asRowValues();
t = Tuple2.create(artRow, stockRow);
mapDeclArticle.put(Tuple3.create(code, couleur.trim(), taille.trim()), t);
}
} else if (t.get1() == null) {
t = Tuple2.create(t.get0(), ProductComponent.findOrCreateStock(t.get0(), depot).asRowValues());
mapDeclArticle.put(Tuple3.create(code, couleur.trim(), taille.trim()), t);
}
}
return t;
}
 
public SQLRow cloneFromArticle(SQLRowAccessor rArt, Integer idCouleur, Integer idTaille) throws SQLException {
if (rArt == null) {
return null;
}
SQLRowValues copy = artElt.createCopy(rArt.getID());
copy.put("VIRTUEL", Boolean.FALSE);
copy.put("ID_ARTICLE_VIRTUEL_PERE", rArt.getID());
if (idCouleur != null) {
copy.put("ID_ARTICLE_DECLINAISON_COULEUR", idCouleur);
}
if (idTaille != null) {
copy.put("ID_ARTICLE_DECLINAISON_TAILLE", idTaille);
}
return copy.commit();
}
 
private String getColumnName(int columnNumber) {
int dividend = columnNumber;
String columnName = "";
int modulo;
 
while (dividend >= 0) {
modulo = dividend % 26;
columnName = String.valueOf((char) (65 + modulo)) + columnName;
dividend = (int) ((dividend - modulo) / 26);
if (dividend <= 0) {
break;
} else {
dividend--;
}
}
 
return columnName;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/stock/element/EtatStockSnapshotCreator.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
38,11 → 38,13
private final Date d;
private final DBRoot root;
private final SQLRowAccessor depot;
private final boolean withAllProducts;
 
public EtatStockSnapshotCreator(SQLRowAccessor depot, Date d, DBRoot root) {
public EtatStockSnapshotCreator(SQLRowAccessor depot, Date d, DBRoot root, boolean withAllProducts) {
this.d = d;
this.depot = depot;
this.root = root;
this.withAllProducts = withAllProducts;
}
 
public void create() {
73,12 → 75,12
 
Map<Integer, EtatStock> mapStockSnap = new HashMap<Integer, EtatStock>();
{
final SQLTable tableStock = this.root.getTable("MOUVEMENT_STOCK");
final SQLTable tableMvtStock = this.root.getTable("MOUVEMENT_STOCK");
 
final SQLRowValues vals = new SQLRowValues(tableStock);
final SQLRowValues vals = new SQLRowValues(tableMvtStock);
 
vals.put("QTE", null);
if (tableStock.contains("PRICE")) {
if (tableMvtStock.contains("PRICE")) {
vals.put("PRICE", null);
}
vals.put("ID_ARTICLE", null);
121,15 → 123,15
@Override
public SQLSelect transformChecked(SQLSelect sel) {
 
Where w = (new Where(tableStock.getField("DATE"), "<=", d));
Where w = (new Where(tableMvtStock.getField("DATE"), "<=", d));
 
if (dateDeb != null) {
w = w.and(new Where(tableStock.getField("DATE"), ">=", dateDeb));
w = w.and(new Where(tableStock.getKey(), ">=", idMvtStockDeb));
w = w.and(new Where(tableStock.getField("CLOTURE"), "!=", Boolean.TRUE));
w = w.and(new Where(tableMvtStock.getField("DATE"), ">=", dateDeb));
w = w.and(new Where(tableMvtStock.getKey(), ">=", idMvtStockDeb));
w = w.and(new Where(tableMvtStock.getField("CLOTURE"), "!=", Boolean.TRUE));
}
w = w.and(new Where(tableStock.getField("REEL"), "=", Boolean.TRUE));
w = w.and(new Where(sel.getJoin(tableStock.getField("ID_STOCK")).getJoinedTable().getField("ID_DEPOT_STOCK"), "=", depot.getID()));
w = w.and(new Where(tableMvtStock.getField("REEL"), "=", Boolean.TRUE));
w = w.and(new Where(sel.getJoin(tableMvtStock.getField("ID_STOCK")).getJoinedTable().getField("ID_DEPOT_STOCK"), "=", depot.getID()));
 
sel.setWhere(w);
return sel;
149,7 → 151,7
EtatStock et = mapStockSnap.get(foreignIDArt);
et.setQte(et.getQte().add(new BigDecimal(rowVF.getFloat("QTE"))));
BigDecimal bigDecimal = BigDecimal.ZERO;
if (tableStock.contains("PRICE")) {
if (tableMvtStock.contains("PRICE")) {
bigDecimal = rowVF.getBigDecimal("PRICE");
}
et.setPa(bigDecimal);
157,6 → 159,58
}
}
 
// Ajout des articles sans mouvement de stock sur la période
final SQLTable tableStock = tableMvtStock.getTable("STOCK");
final SQLRowValues valsStock = new SQLRowValues(tableStock);
valsStock.putRowValues("ID_ARTICLE").putNulls("CODE", "NOM", "OBSOLETE");
valsStock.putNulls("QTE_REEL").putRowValues("ID_DEPOT_STOCK").putNulls("ID", "NOM", "CODE");
SQLRowValuesListFetcher fetcherStock = SQLRowValuesListFetcher.create(valsStock);
SQLTable tableArt = tableStock.getForeignTable("ID_ARTICLE");
fetcherStock.addSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
@Override
public SQLSelect transformChecked(SQLSelect input) {
Where w = new Where(tableStock.getField("ID_DEPOT_STOCK"), "=", depot.getID());
w = w.and(new Where(input.getAlias(tableArt).getField("OBSOLETE"), "=", Boolean.FALSE));
input.setWhere(w);
System.err.println(input.asString());
return input;
}
}, 0);
List<SQLRowValues> resultAllStock = fetcherStock.fetch();
 
for (SQLRowValues sqlRowValues : resultAllStock) {
final int foreignIDArt = sqlRowValues.getForeignID("ID_ARTICLE");
if (!mapStockSnap.containsKey(foreignIDArt)) {
mapStockSnap.put(foreignIDArt, new EtatStock(sqlRowValues.getForeign("ID_ARTICLE")));
}
}
 
if (this.withAllProducts) {
// Ajout de tous les articles non obsoletes
final SQLRowValues valsArt = new SQLRowValues(tableArt);
valsArt.putNulls("CODE", "NOM", "OBSOLETE");
SQLRowValuesListFetcher fetcherArt = SQLRowValuesListFetcher.create(valsArt);
fetcherArt.addSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
@Override
public SQLSelect transformChecked(SQLSelect input) {
Where w = new Where(tableArt.getField("VIRTUEL"), "=", Boolean.FALSE);
w = w.and(new Where(tableArt.getField("OBSOLETE"), "=", Boolean.FALSE));
input.setWhere(w);
System.err.println(input.asString());
return input;
}
}, 0);
List<SQLRowValues> resultArt = fetcherArt.fetch();
 
for (SQLRowValues sqlRowValues : resultArt) {
final int idArt = sqlRowValues.getID();
if (!mapStockSnap.containsKey(idArt)) {
mapStockSnap.put(idArt, new EtatStock(sqlRowValues));
}
}
 
}
 
SQLRowValues rowVals = new SQLRowValues(tableEtatStock);
rowVals.put("DATE", d);
rowVals.put("MONTANT_HA", totalHT);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/stock/element/EtatStockCreationPanel.java
New file
0,0 → 1,87
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011-2019 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.supplychain.stock.element;
 
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.sqlobject.SQLRequestComboBox;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JDate;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.util.Date;
 
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
 
public class EtatStockCreationPanel extends JPanel {
 
public EtatStockCreationPanel(final SQLElement depotElt) {
super(new GridBagLayout());
 
final SQLRequestComboBox boxDepot = new SQLRequestComboBox(false);
boxDepot.uiInit(depotElt.createComboRequest());
 
GridBagConstraints c = new DefaultGridBagConstraints();
JLabel labelCom = new JLabel("Dépôt ");
this.add(labelCom, c);
c.gridx++;
this.add(boxDepot, c);
 
c.gridx++;
JLabel labelD = new JLabel("au");
this.add(labelD, c);
final JDate dateDebut = new JDate(true);
c.gridx++;
this.add(dateDebut, c);
 
final JCheckBox box = new JCheckBox("intégrer uniquement les articles du dépôt");
box.setSelected(true);
c.gridx++;
this.add(box, c);
 
final JButton buttonValid = new JButton(new AbstractAction("Valider") {
 
@Override
public void actionPerformed(ActionEvent e) {
SQLRowAccessor row = boxDepot.getSelectedRow();
final SQLRowAccessor rowDepot;
if (row != null && !row.isUndefined()) {
rowDepot = boxDepot.getSelectedRow();
} else {
rowDepot = depotElt.getTable().getRow(DepotStockSQLElement.DEFAULT_ID);
}
 
Date d = dateDebut.getDate() == null ? new Date() : dateDebut.getDate();
 
EtatStockSnapshotCreator creator = new EtatStockSnapshotCreator(rowDepot, d, depotElt.getTable().getDBRoot(), !box.isSelected());
creator.create();
}
 
});
c.gridx++;
// buttonValid.setEnabled(false);
this.add(buttonValid, c);
 
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/supplier/component/FournisseurSQLComponent.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
217,6 → 217,20
this.addView(devise, "ID_DEVISE");
}
 
if (getTable().contains("CONDITIONS_PORT")) {
// Conditions frais port
c.gridy++;
c.gridx = 0;
c.weightx = 0;
this.add(new JLabel(getLabelFor("CONDITIONS_PORT"), SwingConstants.RIGHT), c);
c.gridx++;
c.weightx = 0.5;
JTextField textCondPort = new JTextField();
 
this.add(textCondPort, c);
this.addView(textCondPort, "CONDITIONS_PORT");
}
 
if (getTable().contains("ALG_REGISTRE")) {
c.gridy++;
c.gridx = 0;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/credit/action/ListeDesAvoirsFournisseurAction.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
69,7 → 69,7
 
final IListFrame frame = new IListFrame(panel);
frame.getPanel().setAddVisible(true);
frame.getPanel().getListe().addIListeActions(new MouseSheetXmlListeListener(AvoirFournisseurXmlSheet.class).getRowActions());
frame.getPanel().getListe().addIListeActions(new MouseSheetXmlListeListener(element, AvoirFournisseurXmlSheet.class).getRowActions());
frame.getPanel().getListe().setModificationAllowed(false);
 
return frame;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/supplychain/purchase/importer/FacturXExporter.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
13,7 → 13,9
package org.openconcerto.erp.core.supplychain.purchase.importer;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.finance.payment.element.ModeDeReglementSQLElement;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
23,6 → 25,7
import org.openconcerto.sql.model.Where;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
90,11 → 93,7
rowValsToFetch.putRowValues("ID_MODE_REGLEMENT").putNulls("COMPTANT", "AJOURS", "LENJOUR", "DATE_FACTURE", "FIN_MOIS").putRowValues("ID_TYPE_REGLEMENT").putNulls("NOM");
SQLRowValues putRowValuesClient = rowValsToFetch.putRowValues("ID_CLIENT");
putRowValuesClient.putNulls("NOM", "RESPONSABLE", "SIRET", "NUMERO_TVA", "MAIL", "TEL");
if (putRowValuesClient.getTable().contains("ID_CLIENT")) {
this.useCommonClient = true;
putRowValuesClient.putRowValues("ID_CLIENT").putNulls("NOM", "RESPONSABLE", "SIRET", "NUMERO_TVA", "MAIL", "TEL").putRowValues("ID_ADRESSE").putNulls("RUE", "VILLE", "CODE_POSTAL",
"PAYS");
}
 
putRowValuesClient.putRowValues("ID_ADRESSE").putNulls("RUE", "VILLE", "CODE_POSTAL", "PAYS");
putRowValuesClient.putRowValues("ID_ADRESSE_F").putNulls("RUE", "VILLE", "CODE_POSTAL", "PAYS");
rowValsToFetch.putRowValues("ID_ADRESSE").putNulls("RUE", "VILLE", "CODE_POSTAL", "PAYS");
186,7 → 185,7
 
final BigDecimal pHT, pTTC, totalHTLigne, totalTTCLigne;
SQLRowAccessor taxeItem = rowItem.getForeign("ID_TAXE");
BigDecimal taxValue = new BigDecimal(taxeItem.getFloat("TAUX")).setScale(2);
BigDecimal taxValue = new BigDecimal(taxeItem.getFloat("TAUX")).setScale(2, RoundingMode.HALF_UP);
if (rowItem.getInt("NIVEAU") != 1) {
pHT = BigDecimal.ZERO;
pTTC = BigDecimal.ZERO;
671,6 → 670,7
if (code == null || code.length() != 13) {
return false;
}
try {
int checkdigit = 0;
for (int i = 1; i < 12; i += 2) {
checkdigit += Integer.valueOf(code.substring(i, i + 1));
684,7 → 684,11
checkdigit = 10 - checkdigit;
}
return Integer.valueOf(code.substring(12, 13)).intValue() == checkdigit;
} catch (Exception e) {
// if not digits, parse error
return false;
}
}
 
private String resolveCountryCode(String pays) {
if (pays == null || pays.trim().length() == 0) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/ContactItemTable.java.mine
New file
0,0 → 1,150
package ilm.erp.core.customerrelationship.customer.element;
 
import ilm.sql.Configuration;
import ilm.sql.element.SQLElement;
import ilm.sql.model.SQLRowValues;
import ilm.sql.view.list.RowValuesTable;
import ilm.sql.view.list.RowValuesTableControlPanel;
import ilm.sql.view.list.RowValuesTableModel;
import ilm.sql.view.list.RowValuesTableRenderer;
import ilm.sql.view.list.SQLTableElement;
import ilm.ui.FormatEditor;
import ilm.utils.FormatGroup;
import ilm.utils.convertor.DateToSQLConvertor;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.io.File;
import java.text.DateFormat;
import java.util.Date;
import java.util.List;
import java.util.Vector;
 
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ToolTipManager;
 
public class ContactItemTable extends JPanel {
 
private RowValuesTable table;
final RowValuesTableControlPanel comp;
 
public ContactItemTable(SQLRowValues defaultRow) {
this(defaultRow, Configuration.getInstance().getDirectory().getElement(defaultRow.getTable()));
}
 
private ContactItemTable(SQLRowValues defaultRow, SQLElement elt) {
this.setOpaque(false);
this.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridwidth = 1;
c.gridheight = 1;
c.gridx = 0;
c.gridy = 0;
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1;
c.weighty = 0;
 
List<SQLTableElement> list = new Vector<SQLTableElement>();
SQLTableElement tableElementTitre = new SQLTableElement(elt.getTable().getField("ID_TITRE_PERSONNEL"));
list.add(tableElementTitre);
 
SQLTableElement tableElementNom = new SQLTableElement(elt.getTable().getField("NOM"));
list.add(tableElementNom);
 
SQLTableElement tableElementPrenom = new SQLTableElement(elt.getTable().getField("PRENOM"));
list.add(tableElementPrenom);
 
SQLTableElement tableElementFonction = new SQLTableElement(elt.getTable().getField("FONCTION"));
list.add(tableElementFonction);
 
if (elt.getTable().contains("SERVICE")) {
SQLTableElement tableElementService = new SQLTableElement(elt.getTable().getField("SERVICE"));
list.add(tableElementService);
}
 
SQLTableElement tableElementTel = new SQLTableElement(elt.getTable().getField("TEL_DIRECT"));
list.add(tableElementTel);
 
SQLTableElement tableElementFax = new SQLTableElement(elt.getTable().getField("FAX"));
list.add(tableElementFax);
 
SQLTableElement tableElementTelP = new SQLTableElement(elt.getTable().getField("TEL_MOBILE"));
list.add(tableElementTelP);
 
SQLTableElement tableElementMail = new SQLTableElement(elt.getTable().getField("EMAIL"));
list.add(tableElementMail);
 
if (elt.getTable().contains("TYPE")) {
SQLTableElement tableElementType = new SQLTableElement(elt.getTable().getField("TYPE"));
list.add(tableElementType);
}
 
if (elt.getTable().contains("PAYS")) {
SQLTableElement tableElementPays = new SQLTableElement(elt.getTable().getField("PAYS"));
list.add(tableElementPays);
}
 
if (elt.getTable().contains("ENVOI_RAPPORT_MAIL")) {
SQLTableElement tableElementEnvoiMail = new SQLTableElement(elt.getTable().getField("ENVOI_RAPPORT_MAIL"));
list.add(tableElementEnvoiMail);
 
}
 
if (elt.getTable().contains("NO_MAILING")) {
SQLTableElement tableElementNoMailing = new SQLTableElement(elt.getTable().getField("NO_MAILING"));
list.add(tableElementNoMailing);
}
 
if (elt.getTable().contains("DATE_NAISSANCE")) {
list.add(new SQLTableElement(elt.getTable().getField("DATE_NAISSANCE")) {
private final DateToSQLConvertor conv = new DateToSQLConvertor();
{
this.setEditor(new FormatEditor(
new FormatGroup(DateFormat.getDateInstance(DateFormat.SHORT), DateFormat.getDateInstance(DateFormat.MEDIUM), DateFormat.getDateInstance(DateFormat.LONG))));
}
 
@Override
public Object convertEditorValueToModel(Object value, SQLRowValues row) {
return this.conv.convert((Date) value);
}
});
}
final RowValuesTableModel model = new RowValuesTableModel(elt, list, elt.getTable().getField("NOM"), false, defaultRow);
 
this.table = new RowValuesTable(model, new File(Configuration.getInstance().getConfDir(), "Table" + File.separator + "Table_Contact.xml"));
ToolTipManager.sharedInstance().unregisterComponent(this.table);
ToolTipManager.sharedInstance().unregisterComponent(this.table.getTableHeader());
this.comp = new RowValuesTableControlPanel(this.table);
this.add(this.comp, c);
 
c.gridy++;
c.fill = GridBagConstraints.BOTH;
c.weightx = 1;
c.weighty = 1;
this.add(new JScrollPane(this.table), c);
this.table.setDefaultRenderer(Long.class, new RowValuesTableRenderer());
}
 
public void updateField(String field, int id) {
this.table.updateField(field, id);
}
 
public void insertFrom(String field, SQLRowValues row) {
this.table.insertFrom(field, row);
}
 
public void insertFrom(String field, int id) {
this.table.insertFrom(field, id);
}
 
public RowValuesTableModel getModel() {
return this.table.getRowValuesTableModel();
}
 
public void setEditable(boolean b) {
this.comp.setEditable(b);
this.table.setEditable(b);
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/AgenceSQLElement.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/CustomerGroup.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
110,6 → 110,7
gInfo.addItem("CODE_FOURNISSEUR");
gInfo.addItem("REMIND_DATE");
gInfo.addItem("CONDITIONS_LIVRAISON", new LayoutHints(true, true, true, true, true, true, true, true));
gInfo.addItem("ALERTE", new LayoutHints(true, true, true, true, true, true, true, true));
gInfo.addItem("INFOS", new LayoutHints(true, true, true, true, true, true, true, true));
gInfo.addItem("COMMENTAIRES", new LayoutHints(true, true, true, true, true, true, true, true));
gInfo.addItem("OBSOLETE");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/ClientNormalSQLElement.java
1,7 → 1,7
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
* Copyright 2011-2019 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
25,8 → 25,10
import org.openconcerto.sql.model.FieldPath;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.model.graph.Path;
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.sql.request.ComboSQLRequest;
import org.openconcerto.sql.request.ListSQLRequest;
im