OpenConcerto

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

svn://code.openconcerto.org/openconcerto

Comparer les révisions

Ignorer les espaces blanc Révision 143 → Révision 144

/trunk/OpenConcerto/.classpath
14,7 → 14,6
<classpathentry exported="true" kind="lib" path="lib/jdom-1.1.1.jar"/>
<classpathentry exported="true" kind="lib" path="lib/jgrapht-0.7.3.jar"/>
<classpathentry exported="true" kind="lib" path="lib/jpos111.jar"/>
<classpathentry exported="true" kind="lib" path="lib/mysql-connector-java-5.1.5-bin.jar"/>
<classpathentry exported="true" kind="lib" path="lib/ognl-2.6.5.jar"/>
<classpathentry exported="true" kind="lib" path="lib/resolver.jar"/>
<classpathentry exported="true" kind="lib" path="lib/RXTXcomm.jar"/>
35,10 → 34,15
<classpathentry kind="lib" path="lib/msv-20090415.jar"/>
<classpathentry exported="true" kind="lib" path="lib/jOpenCalendar.jar"/>
<classpathentry kind="lib" path="lib/h2-1.3.175-dropTableRestrict.jar"/>
<classpathentry kind="lib" path="lib/json-smart-1.3.1.jar"/>
<classpathentry kind="lib" path="lib/icu4j-56_1-module_format+calendar.jar"/>
<classpathentry kind="lib" path="lib/icu4j-56-data-western_europe.jar"/>
<classpathentry kind="lib" path="lib/DS_Desktop_Notify.jar"/>
<classpathentry kind="lib" path="lib/mime_util.jar"/>
<classpathentry kind="lib" path="lib/accessors-smart-1.1.jar"/>
<classpathentry kind="lib" path="lib/gson-2.8.1.jar"/>
<classpathentry kind="lib" path="lib/icudata_56.jar"/>
<classpathentry kind="lib" path="lib/javax.mail-1.6.0.jar"/>
<classpathentry kind="lib" path="lib/json-smart-2.2.1.jar"/>
<classpathentry kind="lib" path="lib/mysql-connector-java-5.1.40-bin.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
/trunk/OpenConcerto/Configuration/Template/PDF/3310_2.pdf
1,886 → 1,1075
-%âãÏÓ
-
-xref
-6 157
-0000000016 00000 n
-0000003843 00000 n
-0000003918 00000 n
-0000004312 00000 n
-0000004765 00000 n
-0000005056 00000 n
-0000005217 00000 n
-0000005380 00000 n
-0000005543 00000 n
-0000005674 00000 n
-0000005835 00000 n
-0000005996 00000 n
-0000006159 00000 n
-0000006318 00000 n
-0000006477 00000 n
-0000006636 00000 n
-0000006798 00000 n
-0000006959 00000 n
-0000007123 00000 n
-0000007285 00000 n
-0000007447 00000 n
-0000007609 00000 n
-0000007771 00000 n
-0000007932 00000 n
-0000008095 00000 n
-0000008257 00000 n
-0000008418 00000 n
-0000008582 00000 n
-0000008743 00000 n
-0000008904 00000 n
-0000009062 00000 n
-0000009220 00000 n
-0000009378 00000 n
-0000009536 00000 n
-0000009695 00000 n
-0000009854 00000 n
-0000010015 00000 n
-0000010174 00000 n
-0000010335 00000 n
-0000010496 00000 n
-0000010655 00000 n
-0000010814 00000 n
-0000010973 00000 n
-0000011134 00000 n
-0000011341 00000 n
-0000011571 00000 n
-0000011648 00000 n
-0000011794 00000 n
-0000012067 00000 n
-0000012161 00000 n
-0000012936 00000 n
-0000013025 00000 n
-0000013099 00000 n
-0000013170 00000 n
-0000013206 00000 n
-0000014361 00000 n
-0000014452 00000 n
-0000015536 00000 n
-0000016613 00000 n
-0000017207 00000 n
-0000017358 00000 n
-0000018303 00000 n
-0000019203 00000 n
-0000019609 00000 n
-0000019774 00000 n
-0000019823 00000 n
-0000021088 00000 n
-0000021796 00000 n
-0000021875 00000 n
-0000021957 00000 n
-0000022036 00000 n
-0000022118 00000 n
-0000022197 00000 n
-0000022279 00000 n
-0000022358 00000 n
-0000022440 00000 n
-0000022519 00000 n
-0000022601 00000 n
-0000022680 00000 n
-0000022762 00000 n
-0000022841 00000 n
-0000022923 00000 n
-0000023002 00000 n
-0000023084 00000 n
-0000023163 00000 n
-0000023245 00000 n
-0000023324 00000 n
-0000023406 00000 n
-0000023485 00000 n
-0000023567 00000 n
-0000023646 00000 n
-0000023728 00000 n
-0000023807 00000 n
-0000023889 00000 n
-0000023968 00000 n
-0000024051 00000 n
-0000024131 00000 n
-0000024214 00000 n
-0000024294 00000 n
-0000024377 00000 n
-0000024457 00000 n
-0000024540 00000 n
-0000024620 00000 n
-0000024703 00000 n
-0000024783 00000 n
-0000024866 00000 n
-0000024946 00000 n
-0000025029 00000 n
-0000025109 00000 n
-0000025192 00000 n
-0000025272 00000 n
-0000025355 00000 n
-0000025435 00000 n
-0000025518 00000 n
-0000025598 00000 n
-0000025681 00000 n
-0000025761 00000 n
-0000025844 00000 n
-0000025924 00000 n
-0000026007 00000 n
-0000026087 00000 n
-0000026170 00000 n
-0000026250 00000 n
-0000026333 00000 n
-0000026413 00000 n
-0000026496 00000 n
-0000026576 00000 n
-0000026659 00000 n
-0000026739 00000 n
-0000026822 00000 n
-0000026902 00000 n
-0000026985 00000 n
-0000027065 00000 n
-0000027148 00000 n
-0000027228 00000 n
-0000027311 00000 n
-0000027391 00000 n
-0000027474 00000 n
-0000027554 00000 n
-0000027637 00000 n
-0000027717 00000 n
-0000027800 00000 n
-0000030471 00000 n
-0000031375 00000 n
-0000032168 00000 n
-0000033011 00000 n
-0000033182 00000 n
-0000036855 00000 n
-0000037287 00000 n
-0000037591 00000 n
-0000037788 00000 n
-0000037845 00000 n
-0000038540 00000 n
-0000038752 00000 n
-0000039047 00000 n
-0000039125 00000 n
-0000003436 00000 n
-trailer
-<</Size 163/Prev 44455/Root 7 0 R/Info 5 0 R/ID[<D6D7F99391B95179C4934F04168803DF><A940CE7B8BF59E43BB240391604C126A>]>>
-startxref
-0
-%%EOF
-
-<</Length 318/Filter/FlateDecode/I 515/S 101/V 376>>stream
-xÚb``˜ÅÀÀ»:O2  faàh`À
-ÝÒ:ˆHšfA1ƒ
-ÕìêØ/4°?¨! ÈƒZ Tû ÊւЅjÊ «y4Ù¼e^ô˜9@É€Áõƒ¹c‹ Òƒb‹Ë â
- WÎj1h3= }СúåmæôÕ¨ ýq`À…ŒA“¹™™È1à?†é  eò ]ÊÀ¡ÍÌÂÊÆÎÁÉÅÍÃËÇ/ ($,"*&.!)%-#+'¯ ¨¤¬¢ª¦®¡©¥£ëèäìâêæîáéåíãë矐˜”œ’š–ž‘™•“›—_PXT\RZV^QYU]S[WßÐØÔÜÒÚÖÞÑÙ´š•aµÄI  –¬
-<</Subtype/Form/Length 88/Resources<</Font<</ZaDb 51 0 R>>/ProcSet[/PDF/Text]>>/BBox[0 0 15.432 9.87646]>>stream
-q 1 1 13.432 7.8765 re W n 0 g BT
-/ZaDb 6.0449 Tf
-5.6698 2.892 Td
-5.8212 TL
-(8) Tj
-ET
- Q
-<</Subtype/Form/Length 30/Resources<</ProcSet[/PDF]>>/BBox[0 0 15.432 9.87646]>>stream
-0.749 g 0 0 15.432 9.8765 re f
-<</Subtype/Form/Length 111/Filter/FlateDecode/Resources<</Font<</ZaDb 51 0 R>>/ProcSet[/PDF/Text]>>/BBox[0 0 15.432 9.87646]>>stream
-H‰2Ð37±THW0BCS=c#K= s3S…¢T…4…BC4K˜Ã%Âò€êÓœB¸ô£]’Ìô L€æ„¤q™ê™™YZ(éYX)„¤ùF†@–—†…¦BH—k—B @€ê'R
-<</Length 1084/Filter/FlateDecode>>stream
-y‡)˜&Á%ޝPÝl¢ƒÖ29ýö´‰ymî‚èC &6 SmJQ†DTÕÔÂ9T5W‡dhh<ªxÍ+PþÕå­è/RuÃ
-i¥ä³ìš’ð2ùn |*Ä ùá][
-<</Length 1013/Filter/FlateDecode>>stream
-H‰¼–MoÛ8†ïòæ(-b–Ã/Q{ë&Á‹½,bô²^Œ¬4,dÉÑGRì¯ß!%ײ¢mZ¬}1IÍ;/GFàôEh˜5çJZÍP
-Î¥…b»àLåð ‹ð `i“ªÅíâ¯Åã'•&µÈscAÍòÜrŽö‘šiQd¦X.pFùheÆey&Œ9“\ç¤R04Šdõ¹1RfJè$ðÛjñæê–CёtE½x³Â÷‚«{
-eÒÐ
-Uz9e;ñ}õV®ÓàÍêøú
-ºG¹°`¹e
-Ýz¶ÇõÐP'¹º9AËOyÍüE'2<o™±fz’¦Äw@U¹`–ÌýL¨/ÁûZ¥ÉŒÚµ601{;ôS}v“-½tÜ]õR•áy•½®ÌfžþÇ2û©Cm£Ò_CUS7ú2.ÒÒfŽë¸²$C‹‡Ê’¯ª¬ŸÇñ5•E-¥Á —Üã*¿ÿÛrün¢÷Òòœ•ÑǕu K,q€…ßK„ƒôwon÷G‹îUÕ5Ëÿ 0}+žE
-<</Length 1006/Filter/FlateDecode>>stream
-ãN/‰ù91½$情fNé+Þ©€>@ä× ×y9úö4/ɉ Òët̋ŽäfÀ½€?à9ËLtqsûŽ>q`صɜƒ©5ÓÄÊY6™çÌ+}™Ü'?äaûļë„üيýj©?yÂðºÀP¯
-¡øw)êÀR¥ÒÛ>0|_@dÎßo¬J_Á6­«m ”ÈC±§'a¨gŽ ÆI3íeÍ<É&ˆ¦_xk¹~Ê[Œ¬]( ÔF¤‘N¬r~a±üg¼¤cÜñ2¯·eó{w臲!Õ$̚¢Ý#0qòI‚ MÐJnd8ú]:z¸ïzrãÒæP/·´óÎËá
-῜æ™ûiDj›±ïºº7èÒpž)ýËXgGQÐ3ÜŞÌ7ti¦ÅáOh…(jê¯ïL˜ª\úí¹ì’ u}pz^ƒÀ_ áªsc
-<</Length 524/Filter/FlateDecode>>stream
-H‰ÌUM›0½Gê˜K%[
-îøslµê¡RµnKµ¢ +Q%Pûó;$ÐMVÝTé
-.Xf0oޛ÷ˆP ¢„tڈ˜VézÁP¡ãéÅ‡T>j çO ªT¡Îˆ„Šðp7‹Ø[ NI¡U8h»`âFWöî_<"—=òhl2ÞÐJ…
-Ô?·ž§X<æ.&×YÏx<WëMš„ß ýZ5r
-<</Length 875/Filter/FlateDecode>>stream
-OºiÒ½rÐݎ”fWä)3G*Ÿ9¾a°ý²ªڈ½<”Mc8öCÅÑ#7u}.Û®l/ØS^™kö¯es;å„ħèYDxIƒÎ»‚ðJ‘7éËkú
-µ:â—$ô¸0ٓ1Ί§¬ô•-†7Ghû4Á:ö™ôiQþ„º€9‚ÙFjJ?¶Çj?p¼Òºú·á-‡~Š™y¿¬Tá»Ö¬Á;³Ò¼8ü"Ê+»Ÿ
-‡à/²¸ÿ^à‹õëqÿ‘'Ÿ!ž9²šÅ°š—³:„ awHâ€øŸOLÍL¡NÞ%oW¦:p7.ðÆMFØ`ؔS6³.˜:ÙHv@jØhÇßÜÔɝګIµŒ˜Û«dPðZːӇ+…Vñ!¹Êq…0쨲!¨sç v½ŽüQñT¨„ñ±knö]^O­„‘‘}WÄÞÅ´ó¹­á ,+X-ø¸ž!’—ŠÉÓHÞ³¶`Vø(87Φ¿å/J¹§B–„%3ÀҟÀœôΧMٟ—o¶‚­d^SKê«;yö̝çù,­rgÒþòM,Ê ¾…°„–ŒˆÒâ‘°¢ëªCUÇRÀ­]Qómqnp‘qH.-–³C U#ˆùžØD98ùíPϞÇ7e˜€á­B1]çMôýxqÛ¸ÐÌ9ë y É/–T´¯ ¾6aÇ
-<</Length 830/Filter/FlateDecode>>stream
-èáJr»Ý_¿CÊr»-œ.ÊCBœ×7ú6E‘­¤Íӛì}ñ6\ÒbŚ!—V2ÁŠM’òo¬¬xHV‚ ! \Á[î;g]8UÀdtþ‘‹¨VqG—Dü¯œnHÇ­dEûmc—¯Å,Ìf£‡Ú˖ç*šŽŠKE>hž[ÐÁömŠÙJ§D¤黾mýÈJT‚Õív7ù!s2}Éü¿Û¡nKÔ@Ǿc~7d§ýø2B”µa+àÂ`äñ•­û–DFV…Íäé»»òcð÷:H®\~Ný¶áà¨óËQ;Ey²\£µWB=û÷ÔäƒQÖíIC ¬ÔÊÕCÿ›RvÏ¢œkŽ ®ÅXΌ…ÿ²ÊÉq¥8èÙ4ÊE\ì}ž¤ãºM‹Ìª´Ÿ2™§U3ç`?¾ú•iSßw_æì&‹Üƒ>5ëäJ/ŒJÂvb8À2P„2; )¦å¼h”6<ãyÄ!9ØçŠz؈ TjÔe(%· CE*Õ\weúgIûÝ]Sûÿ(ZPi5²g}ÝmÏϪqßøÖwUÑ0øqÛw›ª›ÈÿáM‘|J ºKȍåÎW$•ÏPW"[·I8Wä_Κä]òבœ¶À4¡…Ÿ%쫝S.à@r¨å€jl Ñ$+0š äL"XOsÚ-ß³î×ÅEL<cù!ZnÑâLܾ“_×¾CӍS=íQir¶ý]ÝÔc5Õttò̀ã¨~ôÎüÌ*_œ5sðX,v„xa; ë̓xÑÐ< ž° –búf7ÅaH|ï"u?±ÑŸëµ?#ŒÑ]ðiXG±(*.¡iËgÑ>
-ùjãsñõËw¸K~иÃ)wVüFçÍ<37á•Ùìêùì$"X ñŒWÎ?O„æÚÊ^èK_±˜ˆc¿¸ì%8°ürÿo¿íÚç)͖[‘{=±j»­†ªÇ0uâ«Å董¡ÞTlo­ãUšç~ÎÖº!©._ô]öžý/ÀËûh´
-<</Length 1194/Filter/FlateDecode>>stream
-»ÛëÖ‰Í]úg›>ín[Äیõˆ^O=ófßïÆvÓôĈ34ßLZ+«K©cÙÑÖЮ•×ëÅ+v—Ʀm¡Þ×¥¾@FVo†tÄŒ4Öj®0—9o2öhû2Br+dä4GAy®P‰µŽGm<-X]"+<×ÁÄh,sÄ
-‚f¼’¸5|(¿£X‡¦³ö÷áGÁå±9ÛcÏÚ<&]—îÓZŠéºzF‰¬wÜ+¨ œÀœTé¡yœ‘nàã -§ ‡(<iÅÌXÉÞJK@¾~‹þ.¤MOÜ\â~E¨ù±+–'b~o 0e6šV'C‡ÁÒ†6ZÒ¦“!bDªÅMñ†Ykû"àô~ x¶ßOöǸGûcÜ£ýê¿õ„ÔÓ¥:_¨êÝ'è.‚PÜn:œDéEυÉâtÎûøõ¢…{÷<$$ð|ÿ¿8hpÄö¯ižtH
-<</Length 638/Filter/FlateDecode>>stream
-H‰ìT»n1 ìõ,by”¨g'0Üv4Rœ/‚»âðï‡Z=¯Mw"9%ŠÌ ]€ÅêˆÉÁEqsx‡)ÁYFg@k ^ÂÅZŠÙ‚K Œ:ŽpLƒ„&‹& ›5hƒ C螳b0ê ÂN#ó„(¤”éZ9œËaa4փ‘ZÞÃâ0F¨öóQBl5u@ߓŠA‚)§JUðS#*5J ×®ø¢çØûŽ“mB›yîf”[‚c"ŒúíÖ]UvKîæNÝ䋭ы£'‡„ä;w±z=\uÕÜYôQž*t|ûx½›žfò8 Z˜MLh¢Ížˆ,‘Á²Û;¯`e|&HD«g’îØëì9Õ#ãiŒ…‰„=º4Õ)vÎéR¤‰í$·ýÇô÷aIvîx8ŠV–@Ô£™ÁPÛe)ÎÆN–ÛžºÝ5TGU9J½BktH¨€&±ÜöpT«úª~+-“K ÁÈçMšˆ8@ôŒål…ø¢÷+Ãý* Xï¿(™-o +ÁóEû§´©üJš~@ñŽ/0Þ§mšái«†ß—Ñû2z_Fÿó2ÒhØzb)Ièu0ÉrÞD‹†('—¤V´^Nê\%‘ÄoòªqIF%OS1+ ñ.ƒø†÷ã&[M³‡ç¾Õ›þá$eû©DCH°…"
-sfÒH‘‚ÌlŠ2½ÛEÝ}'2¶_•é!ïI›÷$åT!z9lnGØބUÒY˜+È80Õ
-°Óï`éƒó吰=©»Çëëéåzz…>=<fÜçM®4_ê¿^ÚèãfÝ[Ô2
-‘%Eþ¤üY¹V'3«s޺ׄ¿ zF
-<</Length 2575/Filter/FlateDecode/N 3/Alternate/DeviceRGB>>stream
-[€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó '¥ªµÕ0 Ö ÏJŒÅb¤ 
-@8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ
-Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)뫔ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW=
-߁Þô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ;ÂA4ˆÉ 䀰ÈA9Ð=¨- t°lÃ`;»Á~pŒƒÁ ðGp| ®[`Lƒ‡`<¯ "A ˆ YA+äùCb(Š‡R¡,¨*T2B-Ð
-»—½‡}Ž}ŸCâ¸qâ9
-N'çÎ)Î].ÂuæJ¸rî
-î÷ wšGä xR^¯‡÷[ÞoƜchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö
-nßLÝlÜ<9”úO¤[þ˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾
-æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû
-
-<</Length 761/FunctionType 0/Filter/FlateDecode/BitsPerSample 8/Domain[0 1]/Size[255]/Range[0 1 0 1 0 1]>>stream
-åÕæÖ æ«ùÙUü¬*~æ߁ `%/½’—VÁK-禔s“˸ɥœ¤NBIBq|Q_\a_,° 7¦ 7:¿’φ䱣rY‘¹¬ˆVD6+<›–ÕšÕ’É Î`‚3ºÁéÝAi]i]©@†*Ã/…á›ÌðIêô6öJìðLìðHhwÿÓîßæ×æKwŽ¥;ÅwŒ¡;D·ÚCZí 4[`Í&’fIµŠ Z†S,Â)æá³0²Y(ùw(ùW(ùgéGé{0é[0é+˜øLü &~
-hþhüÁ¿ù=ЏðΏð֗ðƗðÚÿÊÿè{á{î…{æ…}ê‰}â‰}ìyäyèŽyàŽ¹ïŽ¹ç†¾ë†¾Bß¡oP7]Q7\Q×]P×\š®:#¯8#/;!/9!/:".8"Î;"Î9 Î: Î8 NÛÃOÙÃOÚÃOØÁMìMlm`ÿ[L¬Œ-ÐãÆæõÿÝ3
-
-<</Length 650/FunctionType 0/Filter/FlateDecode/BitsPerSample 8/Domain[0 1]/Size[255]/Range[0 1 0 1 0 1]>>stream
-S¾cCߒ!oÈà×lÐ+6è%¨|Á<gýŸ1J¿§ŒßÆ÷1ã£|Äx+2Ÿ0ï“^÷¯»ŒçÆCy›qWÞ¢?ܤÝnè^§]¯Ñ.´³ít•vºB:^¦.Ñöʋ´Ý%e{žR£Tú”>e}–²Rž!-OS§(󓔙òezœ29®5>¦«§5ÒÓÕ¾Wù/À–ñ.2
-
-<</Length 700/FunctionType 0/Filter/FlateDecode/BitsPerSample 8/Domain[0 1]/Size[255]/Range[0 1 0 1 0 1]>>stream
-H‰úÿÿÿïß¿|ÿþõ˗ϟ>~|ÿþÝÛ7o^¿zýòÅËçϞ?}òôñ£Ç<ºïÁÝ;÷îܾ{ëæí×o^»zãê•k—/]½xáò…ó—Ν½pæô¹S'Ϟ<qúø±SGœ8røø¡ƒGî?²ß¡}{îÙ½×Î};·ïÙ¾m÷¶-;·lÞ±yãö¶nX·eÝÚMkWo\½jêëV,_»|隥KV-Y´rñ ç/[0oé¼¹KæÎ^4gÖÂY3̜>oÆ´¹Ó¦Ì™:y֔I3'M˜1±ú„¾©}=Sz»'÷tMìê˜ÐÙÞßÑÖ×ÖÒÓÚÜÝÒÔÕÔÐÙXßÑP×V_ÛZ[ÝRSÕ\]ÙTUÑPQV_^ZWVR[Z\SRT]\PY˜_QWžŸ[–—Sš›]’“UœQ”•^˜™–Ÿ‘š—–’›šœ“’”œ˜•”™Ÿ‘›“•™‘ž–èàîïæïêçâëìãäåèéàáæïîêçîâëæìãêäíâèíìèåäàéhïá`çî`ëfoãjgãbkíbcålmédmáheá`inoafgnjgnbkfbcjlmbdelhilhad`a¨on gf kª¯k¢§c¬«m¬«e¤£e¨­i ¥a ©®¯©®§¡¦«®ª£¦¢­ª¬­¢¤¥¢¤©¬¨¡¤ ®(¯¦ §*/«Dr2ʲÒJ2RŠÒ’
-RòRr’â²b2â¢2b"ÒbÂR¢Â’"B‚Bâ‚|b¼¢ü<"|ܼ\B<‚Ü\ìüœl|l¼¬<ì,Ül,\¬Ì@ÄÉÂÄÁÂÄÎÌÄÆÌÈÆÄÈ
-B ,Œ Ä D ÄFŒ0Du`å0 
-
-<</Subtype/Type1C/Length 3586/Filter/FlateDecode>>stream
-H‰lT PSgþoBnÂ+"ٛÕr#",¯,Êä!‹¢Ñ`©˜&Q
-=%8Ñs¬Ööì­¼ìy?ê5=²Ž.WÜa´³3µqÎÌáß9‡ïç8ãØ
-Q@· !Úeb²ãVÐƍSEµRüUÓߏÙÒÝ®úzª»OW=ƒCçcæ+°ðNF©Îб\ñ¢€4$Œ€Jõ
-Ì}Â1,b€@èE‚|Àd@”JO?Àà )
-LÓaBò(}O&ˆ'“3ô¹xΟõóÇò¡ìx±TïùÉvh ž[›Ç¯ˆÎÑÒw­X©6;<³ 9=üÀ`ÈzLÆ(TÁæAÜç jˆüŸŠRa6¼d°¬óð5\ڎ)°–´C*,„¤uð&šYéA wð+`yEÝv!tËí®b=mAÿ¼÷ÕÛ$x],m°r¬ŽR\¸"»ÁÜ:fä—n=P:–Äò†,mÄpÌ`e—/ݺäƒ< g°ºƒé]—O~ùM«äÅMX~
-*€dbˆJvYm,²,¯ºÎÂ~kàQ»ÑV»É.{oÃCFö>zR¾iIÒîŒÙ3”ÓçôŒ±ù4&è/†D%ÌØ}ëH—ê®ÏhQÉ;š[ºûà£=‡Bn›±LUZfÑÏWØé¡ ïô­œ‰$©
-}wªx±måVób_òb_Êí=jäVëhpWˆƒSÌez¹}p¿ØíPd¥¸»°ò Û÷£¦*A2v"`Fô2ùå[ʳí°E§­øœ.tS]ÛDgÚκ¨sd…„秆ľÖ1òބާV0[©våÍkàš½—|…J4.Ã5˜ŠÿŠ‡i0ýö „À´ä{j(*6²0õãPYJç×¥9Ÿ°‰¡ Î.@*Á‹¾(){tcäüÍ'7]R;QW„½.)ÃIhTòÉñOïâ
-ÉúCP]ƒÏ`9lœwOh´Ya5°/?´ÙWÙùâ·À(óÈùFDtN~ŒzîåÁûO²²ÇÛ¡—yüaNø"SFzÎñÁÛöö,RøoXjåŠÜDªÀ'÷hF¯êÖ—2óæ\þ¼ù,oŽÈ$*îÖ¦i‰Gª+TžŸ¬ðb¢ OìÂ.ˆeP¼ïN1”ÉÏUüJ
-“®•â¤Ã¬ZÿCžp¹Ër›;Ú8±Í-†&.Öæ®7ñˆï%S=õÂ!„,¹Ë4דk°¹4õ $wi&²\ñO»\‹ƒ÷4‚góœj€†Ù`„r¤!×óMr§
-»øÎû7ëUÅĹÀí‚ ë^¬ÛÞV*¢âU%¨|+§© ÀVꩨµˆ§Õ¶õ@$mMÔñ0€ˆÔâ5)F«‚T£‚r~tDb@-ˆ´b%©v–ÆÎ"¶¶iú‘6¹Þå½y3ó~³3î®~2×ô¥faõº²ÙáSI‚)qûäñ0—÷Õ%›óæ¡ú«çŽtæiÏæžÍ­±¹bl ƒ3 IAÃýo-èlm:tÞ®åÂsV䙎ouåeägïöÙò¬b;?ýêáPƂGð _TOX€ž[´—˜»…ܺʗħg}`Þ"š·¤nݐåJg:Ò6Êë`ö¹!Á£®DØ˃[ãCP×E_ÔlÓ¢&{š~”€ê¸ûà-b¤ËNffٍÔF®YéÀO<ê£VÆ.¡ÂÀr›Ÿ¤HŠ*ɳª*ÒH éÐ]ÀñÁ$d#QׂîšæëÀÚÈ&eÎM
+%PDF-1.7
+
+4 0 obj
+(Identity)
+endobj
+5 0 obj
+(Adobe)
+endobj
+8 0 obj
+<<
+/Filter /FlateDecode
+/Length 19263
+/Type /Stream
+>>
+stream
+xœì½y|TEÖ0\Uw¿½ï[:ݝN:K'$$B ’ˆ°š#a_THM!*;*8*àJÜA¥IX:®óÌ#Ž:‹yFud䙇AFI÷{êv‡eƙ÷}¿ï÷ý¾¸MÕ©[U§êÔ©S§Î¹uo@!¤C­ˆAõu㠋M7¬8Šn€Ü¦·LkîÝÿå!äý=äý8cébÿOCžù ¡²U “g7ϹEüúpB¾qŸÌ¹ù¶ÙmY˜EhHBCçϝ5mæzxh ðр¹a^!ÝmYá>sî-‹—÷sº2ྡ´Œ›Θö៿Ü»®CȽÿ–i˛mœy”„úþÓn™µçú¿Bèq¸%†æ…·.Nä¡OzÒH˛ÍjþïQ_Úʊ!dú­:6ÎzǑ,yÿTCÅßD—ˆèõô^
+ß5¼îÇ/ô‘˜ u%µ>½
+CâcÐ0#úñÇo7¢‹%}W'ÍÑEQâPðŽ #*D¯ú%PÊ0’£P*rr%Ѐ' ™÷Ñlb9¢XB/¶å%ºÑòaЪD›ž0z˜ÁÏïâ>ˆÅ%ÂÜ® œH$bCÜa:RÄò)’Hy*ìFÌ¯Qs‚EûÒPvÚb_@¡þ’îƒjÞ­h„§!”@Ê›Ò‡éñªÐ¿¹¸·Ô°Â4q“ÐÃìhkªl ôuïÅö¾@Oð»Ñ¿/GQZ·¯¤GAy>¤ä&Ñ1Cþ$½ÿªo[Ð7ðÖœpB½jú ô˾±öø³ò€0ÂFS¯Š_íùàþ>HkRã×BУÿÍÕ7ŽË/J×ÏÕýßñóÿ‹ ÆuýÿtQùøNj½5qáó`n¡«×Õëêuõºz]½®^W¯«×Õëêuõºz]½®^W¯«×Õëêuõºz]½®^W¯«×¿ºHê˜ÐŠšÂnü¥ãLL­så… Ë!$"¤Ñ"½™Åj³#'Bž´TÌ¬PvN.
+‰µ=Oö<ñO'Ïÿ‡—R5A©rMÅàAåËJ#%Åý‹
+ÍíÓÈÂÃfÉùhŸ¬¤R1G°yv Áj‚8†ÚG¨¢bî`õð˜+XM)ˆ1Yç͌Տm^í ¢ù1<lFpz ‡Æ aµ
+5Ðõ½ÀÄÚñ~荬Ž6ÄðjèÒOGBG•߬àpšÓ4ß“‚Cƒs7Ìo‚©qoˆ¡q·ÚÝn¥+уÜÃý&4±JO0:­:mŸmw[‡Kñ»®,)Èßg4%»OoH%´ºË³.–©)µ:MՎ»ÈYL)
+‰A%j~ÁCÅ­G™=h**ì=íiöž¥ºX…%ƒ“°°¿
+ÛÅd±`-öU¹­A†TªÂ&Û!¼‚ö Ï!$ 0Ì.æéö´ð4d¨²2ÏÁ¨ˆßƒ€ÀõÏÁXžCߧrX ê™IK»FÅò0ϖb#„V{!¼C !Þ!ÔÓPö4"ÌÓÌSíFŸ±JfžD+!æQdÀù õmF•7t,ÅJ•‘yÕC (ƌFÝ4û =€T¯m/诲°¶CÖ¡þF z#²ºlƒ«÷
+Zc‡ÅN›¿§Ý`Rñîh/Š$Fgq=pa9ÂÌ,f
+"³`:À½§33‘N¥Sé0‹[¡¿J¨^ÉØÀBñ1UŒ¬fÜÈ£V[Ò®Oö³¤='¯F<ŒqªU Œ #2B{±Ï„QTæ¯ë4”¾uíF[ñ1f5#€äcZ¡–Ãg8ÆÈ0³²:’ ’®xs•–™Ãœlñ¸¼@mhA;4Teb†3iÈe71^dXä«p'óR>扎Pš¯ûó ŠõKÚ(t?$)ZC:túâî*‰¥1æ~˜€ûÕÎ7w„£ª“ƒŠ àñJH­T…~¤6À¬m€™Ú3µˆÚ҇˜õP²ê2·£ffÚ a;¤©XÙځ¡]j"3§¸‹q1N`Œñ°C®»CÒSʜíf‹ZÍÙ¡ÕWcn9¿ÚT˜ÅgñÂ#Lž:”ü§‡"4·ƒ¸cÉ©D;’cL0‚2Æˤ·Û|±*ÜSAöÙý.9N™D> Ñé&ïÁ=…¿NÁߤà&a¢›O.
+ò[
+¹»:B™>Ãh“çÈâv¯Ï\%“§p> •ÚÐ
+‘™<Ý^FÙÜ~Ôïë"›ÉfÅY¦d)ʦ(«¨ hãÏòøËü;üUFr?(íÖ/Ùqò
+„Íd};[«ê…1ÑqÔ
+q›šj‚¸YM!ˆKϨ©J²ÕA ÐÆ
+"쵤çªp%úN…+Ð މö©ðh‡
+è$À¬Vf²§`»o0€Œv_9­-¢l:ñ˜G*y
+™ èû.ÜÀbEã;í{Ð÷ ÿ âñ©¿“ð^V'ž¤È¾£OBå*_{•LëÃþ°/cðíÈZï{ ÚÂY}øúùî/è!û> {½ÚE»ïnðõö(_«¯È·¸à¤ïVß(ß4ß8_cä·ûnð¥d¢(n {úê¡Á‘0Š¬vßµY*‰5¾Û|Š/ÛWî?Jù‹&Û-+8J9€Š“½çó²:©ŒO,ëÄ&%O8#l¦C…ÁBPÈÒ¯`Í¢QԋZQE‘Y‘ˆH´v&z”0}fgåÕÏx–Ƭš6ÓÇ{à0,4
+´núUÂrՆ|>¨RàS«`°ëԆ|Xí,Vx©JVªJéÅ*¥j_ ¾TǗ¬cÍé«ć:áÿ—׬¡aÜÑɊ×éC¢¦àðYšb—ÎuÆZ§ûýûV,I==
+ŸGå¾¾aŸˆ†F‡Ý„D#ƒ 7yÑ¡vcó*Ð]ƒÎžÃ,»&iƒCc:´¨ ª ŠÁ:£Ezú$0Uä\18à9Œw¥ŠŒm
+E}¬E´Rm¬tlm,0~r•˜2íççìVz©ÅN4|^5üƒûÅj€ßå5Ñ­?{-þ¹kɒ%·ÒhIøV„jcyãkcÆ%‚]5UG!¯__èyû$ixg¢
+Ã@^L»£©0¼.´ñm¡®Ââ··xá1ØÁWB?Ž,k/TÝg²¬##‹ú/‹;
+K“ÜU
+¢‡ÐËø‰óêYÊÝÐ^ªBU‰WPº—Ý̝ ÐÌ'f$恅”6pâãÄç(„¢èôÐÆÝì@7¡Õhv1oBêaô,Šc-id†q¯@O#Ñ$´-CÐnô.6ãzîw&qGâH¡åMóÐ7¸&ϱÚĐÄgh
+êBoÃx鯛Âîä¦Ä+O$^ïû–ñQü*WÌÝß{Wâ©ÄKH ôôŽŒ~¦£{Ыèôßè¯deb%ÆCÏo`/öãpücâ"+È
+ü>þF‰Ô_Lª¡×…dðénò yz>é Ÿ‘??“¿1“Á `Z˜§˜ÓÉg¾blˆíÇögëØÉlf¦˜»–Ïíâöp¯qgø
+®Å£ñõø< ߍ×â_âmø1ü4~ Fc Ð&Ud<™Ff‘Ud-¹ì‡ßaòù˜œ §rdÂLf$3™™Â,€1,fV0«€³0»™÷˜˜SÌ×Ìi˜5›Î.aogaw²ûÙ÷¹ë¸[à÷4÷
+ÝOpœ:I¥bAg,°qŒ\"ÏÅ s‡JӉœa㹊ފ1Ƴ£{+P%¤ ê_0LY—….ø™î
+¹Æáp£>¡"{Q>>“óo0ø}~âïĒâE<>Ãcþë^¤Åg´X{CÈA®ŠÑÜaàqãèÞƖs44¦cúV1úôÙӅ'!2™Ë1s¹­ín¼Óø«þE–È€’b»ÍÊ3BeV‡½¤¸l@i$;ÌxÄ%øߔG_|è‘iø]À•_àòû]ù®®8Îèލ¿ò▭—
+(„˜­ãåcoBx{SÿÌÌþ›6eeöÿñ¯ùié/¿üƛ/¿ü–šµI-¦®÷Mñ±d.pوj}Ža'CD #ɈÌâ1œAÿìÄæ\–þGû˜Ÿ-b ÛI¶t˜ž»‰JaãéÞ³0Õ¨²ÒXaùÍ8"¥Fˀ²BlV³ÃNf½úHیI«º×Ϲ¦4{
+ô7Ò¨è8ÄúX?cYÖ%Æ;a·N2ºb4ÕìªÎ<Ûx¦5&^(YV„â§}&E'Ùàæá‰ÌwÖÐ9,;I xq¥2õ€ó »Ëó.û–ó¸ó¸ë¸[æ–6Ì;Éõû°s7»#MäÝ~”×¹G°ÃœÃ\ÃÜb¦3ӕéfì!úuÎÇ=§=îݝ¶Û+š‘×èõ{û{—zWy7{?öŠ^:/v«-â%F­Ák„y'TV êáNòTÁZ}Ôôi µDKçN»ÃÂI'ìvØ 1rû 'ŒËˆ+½oϪ3
+•®ßÞpËIØԍ-ª^- 7RÇyÝí¦rJC»AŠÞXΊÆrN44•'ýÖè>ž ›Ð h$ËC<L-L“ªš£T2jÇ6CžDJƒàMô 80Š[A^Læ²Tƒ
+慬™Iõ,ð,/°Ú Ùƶï^šm˜+Æ¿vañÍOÏ_;º$~îZ;æâ?=„¥ßí«¼~⍳æߑöõ»ß¾4£czÕÙú¥Ñ°V<0K¹èS¥x­í¹#mcÙÁ<Ïí´ds­Ÿ9ÿàíV|Ÿý> È:Äb‡ÅðéŒZ¹g*Ú:Vt›tD§ÃöNLƒÏRh!Ê^ˇåŒ W ÀœbÈfwdëbÚn˜­Ýxb¥o“o»o¯ïçëNÔeâLwØ~± Ÿ@®¼‹‹élj9šÊ SB#zÛršîtTͨ,¥\¦ûP£%K][*÷„2ûE6!%ÅôM>Á
+fdŽÆFÝ¢±×/[4n@­oÑò†‘#fk⽞[^¿í½;ç|°bkü«ß¾ÿ¯Ì]°ªyþ/l_2ó®Õ0³)õö)«n^÷ꭞ£«_Ÿ¡ÇÌS€¯¥Ü~£’+êýÚ2ópóH×#º'õ[͟é%³Éb˜‚æÕfXtX'kµ:³ÉÔIÚ»^gÕëufÙJÍ3õx3,ë+˜xHå¡GÛÌdEç“ e"SvË;¬”Å«=â·Y+cíÄ{«Éä3I¡±ÒXgdŒ´ª‘öe1ô¬ÁL?îÀŠ;Ü>}'(fÝ2|ô8Â
+¨›JceocبJøtc˜.€F(·SòZÃa
+•öÙtª´³ÁŒlše±^œ
+ž¹,GÜ2ãËÞ?5¿éö•ñÞOÞ^ýÄÒ®©uõMSnjmr/‹^¿hqtÎ,ÆÑ辶g?þøÙÙÛóú½ã×ñy¿8±ì-<vS'ÔMmê½fñÝw.sçýtO®‚Ù±Âì8PW›jM³4·‹ëÅç¹çÅú–¨‹9 ï4í·¼Þ5u[LË$MT7Õ4ÎÒdá]Ü2û#Ž??·rs-àF`Áiöy
+eå¢<6Ë‘ µQW©æ“YÌln®8Gþš1Œâ15°Y’XAÂଠV„^bY?Ç[9ŽeÅí"«ÊÅíÈY„ax–ž•*z^ Ëb$j©SÓI¦)Vɵ‚/ÖI2É'á"©U"Òa’‰X¨!ùÁ
+qinœÑgȹ€» Zœ½ªC#uШS{n¸‚*“µwþjm?'‚±¢bí¯~•ÜR÷KIAaº‹ÖÆ4ãkcéc'ÃÆÌ$âí"+NāSöñìÀ©=5¹# üpÀÂ0Ü+ñ—[{Þ“ ÆåyノGÇ;¸Ã6oõƒ·ç§ç-`[ä£Jå²<<W¿<ï+öËJ›Äçä²ìfŸ­ÎFŠl{mÄf³3²ÌÑo͈x²›ùVžðµ9Ù{AsP³DÒD@ß«Šú)ýêû5õkî×Úos¿¶~¢¿_¨k†ù-E°•v’ýÇ÷c½`€ÏNn†ª§MƒªT“Ä–hm÷–Û¨I⦠uŸ…Z!Q¨t™ì&ye G²øB·Ê@q:éS`§ó\ pÿ¨^ÜãÔM(¸…ŒziÏÚÉ §®ÙÜøÔÒQñ/ã:œóڋy×]_;*ÿýÝØÜ:^¹í]î°÷†G¦Îy!œ}tåÌc-:‘°oÆ_ä¤ë¯­ž(q½]ñ咶qÌÐò¨=2-qŠ»ü-7úX³FZo]oߎ¶ñoI2jþÆHYRŽ6G—k͵/á–Hk8Q°‡ÅáÈ%yL'äpp[¥w˜74\%®ƒ}sœát†>h–›œÊ /x²âp°¢^ћ#úÚ©LÕ®bsFÀJÌQ2Ì2cø^? }Ô¦ÜE ÊmÙm6>¡H`˜½ϊñ÷Å1FÐIíÜ{6œa
+ûHè4P#8J+•’Xî×:f±³´\ž£Ü1µϵs厞µžG¸-Îg¢bi1gŒ¢+{¯€…”LÒQ)–ÖöŠ@¥šÌ …Æ"#1R)ôÿ¬^A:ÊLÅÈaWÝ[žþ‚I!B¨Ü€=D¼‡šîêl*(›=úžéÏö~€sþð‹²S+*n?äw8-ôZüÔ¸§mFmž}íB©Þ<éÝ»Î6멌< žÅ©mV®9V³x³ÃEÜ^ŽpœÄ°YàÉR–‰_ː2Ò`Û¯+Ò):FÇJ~LÝ ‘öò©X®òيŸYV¬'o9ë –wŲb8ÐHª'j ¤ÂÃlå…oHO¯Ÿ)៏ù!ÞòP¿¨_ÔKh‘R Ôó\–à‹ÄWÄÏE¶PÜ,QDÉ!H@%_ZcƒàÞí×iˆæJú埣¿1é¬õV˜)ñ?GßVætï`2³÷qJÛsç{ œ¥Z.Oåì3J–Är2C$9‹5ïe0à žã€A¯œèçߣ2C6*Š®^פcšu­:B™Ü¦ëÖ±:¢I’ÙM½0•ÑK®EçSO
+Ue¥Vå4£ršI*0
+þÓ}ƒ¹øۂsH5ΉŸè=Êî}…TýXCîê] cº¶ÆÄ …ê vG"õ`–
+•J«#‚8…«çZ¹ŽóqM\3w†c[9êM3H$̧¡êAL7Õ$tPÇáŽE ØþÛS‹Qj(•ê#ž–E@-¥ï^œÃþ±èxæý9î%Ä¡kw½@ÛfAc!‘åÜa.ŸR¾×åS§íŽîM5­ŽÚöŒ·‡{駑?ÐyƒÉé0Ò§¢Ñ0!1¤aX˜3QEJ‘ýƒG¤ÎDOG
+*Ϧõƒ\ˆxI”¿¾“a“e Ic’O’|Ö/ÊsÈ\v–4_^F–³ÏJ»åÒaùœô£lßÎn–¶ËoJïȟìÇÒ§ò)ò5û¥ô­¬[&-—ï!÷²÷H÷ʛ‰Ð ™Eæ³s¤¹òRr+T“Z¶Zª•¯¯—dÁ)ê#d‘˕z!Z–—$ÙFܬCR³%KœVŠy½¶¶c#CÄzQÑÐH¥^£‹ˆŠ>;¢¡d=®iB#2Ô\$‚ŒD*h•à»;Ry#.<müð4Íðt&+ЋŸ%©˜a­ Í,3’ša´,!Zl$Aôé1øIºúÝ×a2P«)IqrŒŸáŠEX)bñØJ˜…c¿FK:É@Å r¤@E¤@%T죆4££+ÃxÌË°±â/Æ
+·ËØÛÒÛRáv‚k† ãÉêg©Ë¨½ÒJÙ=–ñ°nÄDÏ>Ÿ9ê¥Êa…[¨Ø`¬>èeü>‚e,à£ñÓñ?Ä¿ˆÿL'óõ5ìÝ?­ djè‚ ÕSø?½Äð¢‹qˆ¬Vpu˜5•t]ÒaS¨äÁˆ˜bA´
+iÓtkHR·‰RªQI}2~|D*¾B‹È—i0 Aô)¸S×µpÊ„µýèàCI9¢Z¥G‘@*DRFºITjTã‘j—þEÃÔZ­5¥b«¦TØ5î~q<DcgŠ…ak˜Õ ¦ÛÄvñ$ÃÿŠyOüLdüL¡a‹uâ/™íb³WŒ1¯ˆš¤Q^R!J‰j”÷(ºÂâñÓH°–BÎVE
+‚3Û¹\Zf–™–ÛÖ°ëÅõÚ5úÕæõÖu¶uŽuÎ5n­`IpÛÌn«Ûis –ä*{ö^#Ù(ûeF¦v†¿È«x›¼ÍÞVo›—÷{Ïx‰×˜Ý†0}Þ[¤Îù½i+^¿hb©6Gcò©jåiª[Àn€UZ6 $eX!l5_ôe£ÃŠ_œ³¾WãÕññcñ®ø
+× ó5óµôéx[ð þ„$ó"/;D»<@_£¯1¢Q2YõVƒÕ8@?Àp­a‰þ6ã²f¹´ÜµÔ»NZçZãå%»UÒôãõKô«ôéŸÑsz¿NkÕé´­Mç°gYŒVÜdm³«ù”]À8õԅÌF:£Žè>ôd·ñ1¾›?γüÚæ ö‹‚$°]εŒþ3.qM•…”¤*ÇKªè‰×eO T¼¥‘2´Øžzâ°˜~$4™.q\›…þ¨õµW›îœßòãEnœ]ñ»æWԍÈÜŠ;\÷îÝÏ}’6p͞øŸpåžh ÷qfLfÃÐQS´ݍG%¾bÿ
+k'W®é2uz漙ς£bGÅæ Ïâfå,æ—ëç|ªý8¨Êõ3¢Á¹ÚÙæ9y9sò—y×x·´æ ݱÓ}
+•Y.wdlÆØ૯ٖŒ–à]wÿ+㿂|XÎÓefdËu‘`­\««Îœ¯›¼Mw{Æz݆ŒòNÝ® ‹$K:>ƒºd—Ξ!de‹“œŠËYèÄ ÛÄy˜ÌBÐBZw¹Ïƒ=VÀT-tû#ôqd=n›qŽán,â¿°Š»ÜÈb¶ Or~Ÿp`‡bqDµBvÈÝϗÝfŒßP‹¿7%'ÐUð۔Ì׎o؇”QՃc<0¼ˆºM-᳍á“I¸(|v»¤êRÍ à‡Ç;øq<¿h·”g{ÀÝ;ífzw\1˜Ëu~s¹¬ÍûZÑk!OW.;i°”_ñ>[ßÃyÛ y®4£ø8R7,£&¸C~>CFô}Ò±¹øì2[ý•F€Òa“nœÀÛ¬;«JõñFa¿{ûÚM\s]¤ë/MkW~ÿ<¶b‡?a¹óλFæı÷–Ü›@¯Ä¿ŒÿöÀºÛÆFFzÌýOºí¥æ×gÿõ]]ˌҌòHVáì[Žm\ñû›0ýƒ(tR—úh‘,”ŠØ"®^j–Z¥Í’ÀcŽd± (9nv%Ýoq"ó‚!ú1½51úzÒLZÉf—ØûBjVÆ6ì#0+ªÑ[ÑðYÕ'S:©B5?aã(¥þþ<>š½/>†}íüùŸè§hŽ‘ T¹Ðe 
+’`%"]+^+ ×K“Œ[Œ[MÛlÙwÙ?±}ɟã5:­\P!Ë"i5~Ý{Ô¨RÝ O½§ÉÃ4{Z=Äï)ò´yº=¬ƒÝíw¹º]Œ‹*÷¿t'N«Ê@5Ã-L‰]]Ú°çõ$˜A]ÐÒqŽÆ²é+ZÝ8§è®/ýöÓV/l‚_8ù–9[^bÂâñóŸm‰N{lâŠsˆþ1yМ`|<Öw ‹Ô 4—«Æç÷ H·ø1þ˜|Ê~ÊqÔÐ]ÎmÅ[È#ì6n»(2HÊԘn—aÁ…ì|.
+ñ#ѵüõ0‹ !~Œ¬0¹<sñ‰ÓI¦+<-ì(L¸Ãdý&Š¶†Å+ÙVös¶‡eÙN¬Qä•L+ó9ÓF?¬ÕPÌÎÃXƒ}ÖV„1v —=kƒÖx¶±1ì<}Ѫ<}¥MyÉbêî0&m¥`&McºQ5”Ôƒ)Æ`Y0µ,1ÑôžÅUøV<êýîðO¯³×€ã“ük ÜxêUâÁÊS&Ö#e'Ëìn‡°GzVó;ü¡À¯ÖlÃ1r[…G¥‡4»ð³ŒäÆ6!‡„(ž$¬f6p$)‚ Ä%ûÙB¹š½Nž"¯bï•`·Ëmì‡ìe];P~}L~‹}G>Î
+2‘xÀˆ¼†eD?Í! y?
+p%ù{ôSv„¥Z> ß=$™"òˆú RUë´´´ Eýq’Ïôþ[|žŒC؏¯„»ÇâGâ‡I/9ÏşôìÕãŸât/¢ÿ×¼Ñ] >/+C4¥Ý2f–c–c.™ö <ÁjŽŸ¨©Y¬~Å [q²3ÑIæ€TR~Ð(!h›'Ž`÷ûx9ŽCøâv=»C¢ü1ÂÊtO‚7“ Q’rg<w2õ~
+ìώrSÊ·aËèT`T¬ék+Nõ_¨ C콧ðÅãðÄÞ/É<flïQR}áÅÞG@âòØ]ø{؁t­jõw˜mT†{mzf¤6ªGjQE&‰©³L¦ .ö™=ÉÇÿ½ê!K#=µ‡q:ý~_ü;<ÚÃèF&¾fû±CPãe®àÓ8¯Ý=Ê3"mdÖ›¤®×õ¡Ù®9¡5¡_ºtïpwyÞr¿íÑò¼Îfç]öl>×u-#kÈþÿ&¯}%ò©‘x3‹û›òu™J¸_$SÉȁÈå,̼I2kÔóå"½!rÓsð˜÷ï^ÖëÍÇ%H\j541 ¤™*ŠÇ‘Ó t’ÅXA«“ó©m
+e*„bB|¨¡(VMzÿ˜+åè¢>ív-ÿ4.ª¢·G´îºŽ4oï§ê¤$70Ձ?wà:ÇTÇBãp•Ì«ê{âßrº‘>Š
+©~Bz¢ ™ç•þšò2ϵbžÄO’'Ù'9£i?|);X7ØRêÎÖêj-Ã= H²VâˆÜôÕ~N°Ò¹°h4$;¢»9§s 2ÐOß´¸ѓ —·2Éѧ{+¾þCÒ{8M÷?P-¸qXƒ¢™ÍϖgÛg;ç¥qàý©O¥€uæäU¶Í¢¾à•ò•Öb×Ýí¯Åã½]Sö)æÈÈÛïY5gÖîpâ§âŸ‰6%ú8É{®®yûžƒO=¡¾™c¯„•àBÿ¥Œm0DÍQû\Ã<ó<ûÎÛ\[ÉVí›Æ7Ÿ?v~Ã#~cùÆvž· ´ ´2²×8£ÚyZa¹Ì^æd–qË k¹5†õ®]æö.óA»¤W%ÔÑ«›5¢/ÑÑWzD…SDw³Hž™M¤@U¤@=T²äô0¬uŠüÓ\@…:šÐêÀÜp{„€Õån¨ºô¾NãèÓ᳧Ãô~ãÉpòù=À¤&ž&Ø'ÏôÊ8>ùQdûÇÿ¬ŸQ7ïΕ7Õ϶akøìo¾‰ÿÛO¿ö%ù®xü„v{|Ê—_µÍbgí¤þåàÝ´”ÜlV
+ÌQ>*GÍIiÙ¢q^’šÓ[ÓÉ &¢d‹¸F1ÕÚQ¶j×#’dUÅEC¥FÑk½¦Bväêu!L%Å`@îMTv¢ËÛPqq„-ç’£ZuIZõŠ@Vtóøyò<sRZøÆh Pš xÓS_.*ì´øOUû&Šÿ­ýnìê5Vß>mݪ93×>>%Š³Á;Ðc×CÄx¡y÷u ž{öÐSÛÕsà¯Ùl+JÃÏt!#¬“Mù#Ò£º-Æ]ÜNùˆtD×éE+A®åkäºô]ºƒüA÷[òÛڏåÚóÂ:]š!ͦ€†°)zSÄ`{Åöž±©Ò^©B½ ¹O—Ô\¯oÒ½ÓL½˜ƒ.O—˜Õ# ¯?y”‘›„á‚$t¦©P1€:m£Ö‹Ȟj6ÓïoXÙIٝ©PڒBT˜>5}aúöt6ݝ! OiÃðgB§é÷?V§’c­t*éˆ@;©®VwûÊ^ÕÉ1PÃL‰J攪¦°½¯*¨YÕoQ˜Ë)Ñí
+b’<D½­
+Ú¨v¯W€KzÚ©žv¯W€YIkC=hW |çÕzm©ˆûÁ`¦2Ž˜€jK[’ÞŽƒüˆ¾ÙÿóêyØúÁilæ{æîiC'g3Ë'ÝPQñ¸ÂGŸ:ðÀ@Âñ·âÇîÜ8ß|ûÊaÃnUe?>–mRwÐB<F™¾Ì»ÖKÌZ]sÿ5ºÖþ¬ƒïÏáRÂ(xÆL1D­Ñ¬I¹“€Ô› çMç-æÁºûàœ’|pzíµ9Õùg´½ù~س4Z&O«ËÖÛ¶Ü2g&•€ª¨­7©LêÐh“0'/)Á¬$ìI
+7¥á4È۟
+=ðü„‰'L½¡z[o”L}²_ň[â„Ô<69¿fÕ#½’gŠlæ̎¶+NÁâ°LçŠl'‹a¶ŒÕbµá#Ç«ËÕ$èu¼V£óƒà©Ë|OúFí¿X®²&¤ÕSþêtڋ«6ù¡Ã•«VåÔ?-\Õ±¾h¹®X¦*“`ñ²Ñø©Ì±å#‡Aø¹4>Zç#é/ÌX¿ª=îcCï6wÕt­Ž›äQ©,حʈ¯ñ)ñË6ö-ò5GÌ.Î%‘¨q’e’=êÜJ¶ñÛÄ­ÚNé#ò;î÷ÒGÚSÜ)þkq§økòüëâ›Zn‰¸ž_%2&U
+Óձ牎OSûs
+Œ}:ŒÝ„¼è ¥Ì\A"ºˆµ"m©ÖU[G¥‰Í>ìmŽH”‹Ê×ë&Y¢Ž¨{’w‡¼#í¼tN÷ƒUkBze«±%5Á`ä`d§›sÁÛ™Lª£&m2b£Û—ÜúÏ]6þ³ÿ0üpKŠó¸yòlË<Ç<×l/0›xuãNztç¾üuBfdÙ³S,ـ™îùU`&~fõÌÙëWM›öËøÍÄ~íøuÛ±#ì›<å‰k˜ýÏl:¶÷±—¨·¶!¦Lý]JÎVKz<ž›Í-á˜Bsƒ~®¾ÙÌʒAëӒMڄ–Tjë´DÛI–)¹‚+œ!¼œƒ$£T$5K¬ä^iÞn&SÍ+Í{ÍÇͬوB˜Q%€VÜn­ËTمÓPŸ³zqAŸkt>‰œI/ÖwyqRZPmÌ1ž~ôOßK+U¿5HʂCP—¹ ·Ñ5=ì¦ê¦èõ×^3x\!ÚzSuéßúUíŽÿ7Œ±V´ƘG^Sºy³&Gp›y›uköÃy’`­±ó]—þ­À—Áóºs|®n¢n–îaÍVóΌ.­PT2«Cs2f†Öš×Z×dܓ)•…†ó5šQº:CM`h†‘™*ӖèiAi¦À˜I
+8uÙڌŒŒ ™¡äߪ]n½Í¶4wIÞ:Ûª¼GmçíÏØÔµâMŽ{ä=ŸËç»FìJš/â³ãÏíØ^"ê³6e‘,Åéd¹ó՗
+Ùlˆ*H½]µ“ì8kþßØI’xÑ@ñ‹ÿÚ­In2ÿ`5&â„BôÌzé,Œ3èؼ›v_‡]¾q•#åa×ö‰Óoܽ…´Å=³×-9‰»ÁQ€qjÀœ ãÔ`bãr܅F<D1‰UÅïy”Å<£EY«?Œ˜·ä–3Pæ-ÖöÅîõGdÄi¬È¥ÉByš¤Y‹¤ÔûÜ2ÖiÕ¶4’#Âb$aÉô̦QýÊ¡Ü£˜5Hf5²$‚yHKåôy âLˉht>õMOVçp¸r¥\§¾lR¤hXR®a+Ù:–a“"0Q[ƒ¶a?ýλ´¿jK愝£O7ÂNÕèJ~UKïU ݨ¾¥ˆui‡é3’äÛä8`qЇϖƇâpöۃ¼Þø.ā{½:0Ü^P@ғ<ÕO›TžnS6æo³d›Ð…?Îè8Qp³N>‡/CÅ8Š—r‡…xPƒG Û4çùó‚”ņ„<9Â’‡±cä×Yñ:y•g²·ÈËñòCìá°üû{ù‚¬cX¼j;ëgóä¶R®a%ë’Écä›äì!öù+ 09f'É`ѳ)Ŧ5E0+ ,"*ÕS4(9˜[I¨¯ö({f„ ]:YKŸÑ`šTP¬ ]vÚƧNÛÈ-í|‰@ш³êtÛu=:FÇÐlR¢¡Ùæ3ɇpɏ?g]š£zÎvÚ5Úبž¸ýã[¸¥ïÌ-™Âÿ«½ó‹‰£ø7³{wlÛ]î8à°Ð¹¶
+ñ¥¾¿ÜÌ7ÃÜ·;vvo¾™w¥6¹n|Ó¢"ƒ‹èƒcm㳧§mnr³; Ö(¯Ì¨¢T’cÅÈþ+ߓ‹“Ùâ—7nÒmT)Þ"ۋÚß?’Š—x­êŽjk5Dâ‚-âY¯«4â5#î㎗;žŒ£¼½nÁ««¿î5)„¼jˆªŠÂmÁ¡A¼É/‘sØԍ@»Þ,Ü +|hCÜ›âbÄ#¸¹1æ¶þ¤bÕEâ|Æái¶4*B”P
+’$X›wÅ]³eõwn/Úꘃy‹w–^`iÙ½æw¸é«Ýiïdm]}Jút1öä¶ú—Î›Ø ?ƒð¢jÂ7%¬­ÒƒÅ$b­…;mú¾¥ªö„ÌP`Ýofàþ"†]B¢¼}º‚ϽÍb€]'­Å¿È¶âlêÉÔþc¯ì}9ò\bè^N:}¸J—†º¶VÝ
+Ì€RəîKÒ&hÁÊðÁI’&#ð”&Ìè3Þ70˜qÚ8gÜ6<Y¢© =­„Ë4;x~¦¨EØõ<?¡–ç…–à a ÛÆUèiFo™&œoð£Šm‘¾Ç9*ÜÇô1«ŠÞfe¬¹’èÑôª8ó·ô´RÂÖÕð6—àíç²ú}WØ-SVˆ°`8N·X*DÌyU¸ÅRCù.˜¼^i晄ˆzïèÚrÕ³ÌfÉ óò òlq…›,‹?ƒ»7ü·¢Œ¶;¹#ïa5X&ýÜÞ_ò+~ð“«ü·Tø™•Vɼš§GñÌ¢ùÞ±éۖ´Þ‘Sãxü;æ=hÇ^3Ö¡$¢aU!óׯã)¯‘/<_+>0°~>M¼Œ«v^â±Ëå¤êæ'WÉUZA-äMäWe«ò§:§Îyú9ÞÞkâ›­èª¸©õigµUmuÓȦyÁJ ã•ÀŠ~ÚøÁ¬7OT5#wƒƒðaè“êÚê‹á§k:ñÉ0Z;WûSס‘·"¿×OÔÿöÄ`ƒÒpªÑ׸и°åSöúÞYç£2®<6+ÿ‡¨¶NÓ: ‰D"‘H$‰D"‘H$‰D"‘H$ÉF@‡³Àß
+cš ôm8ˆqyyœs9ÃvvÄblßX–õæ'ó…#SY–ÊÛSy;SÈå'ÛX÷ø8KçFÇ
+3,Éڇ³ÃmýV:ѹ;ÙV˜˜ê¶s™q–›aV°3ÃىŒ}åGþ[!ôƒ…M@'ì†$f±€™˜Y…C˜Qž!·@©~Ù¸GÀ?Üø²´
+endstream
+endobj
+11 0 obj
+<<
+/BaseFont /CIDFont+F1
+/DescendantFonts [ <<
+/BaseFont /CIDFont+F1
+/CIDSystemInfo <<
+/Ordering 4 0 R
+/Registry 5 0 R
+/Supplement 0
+>>
+/CIDToGIDMap /Identity
+/FontDescriptor <<
+/Ascent 905
+/CapHeight 715
+/Descent -211
+/Flags 6
+/FontBBox 6 0 R
+/FontFile2 8 0 R
+/FontName /CIDFont+F1
+/ItalicAngle 0
+/StemV 7 0 R
+/Type /FontDescriptor
+>>
+/Subtype /CIDFontType2
+/Type /Font
+/W 9 0 R
+>> ]
+/Encoding /Identity-H
+/Subtype /Type0
+/ToUnicode 10 0 R
+/Type /Font
+>>
+endobj
+12 0 obj
+(Identity)
+endobj
+13 0 obj
+(Adobe)
+endobj
+16 0 obj
+<<
+/Filter /FlateDecode
+/Length 24310
+/Type /Stream
+>>
+stream
+ƒ£ƒgz¡#€F€’îhÓNì€@Ü5ýv¤3C§’¾èš¤7:„ö ÉÅj¦NO֎©«âDê{%ñàiÑk“(:(iM°*h0k&)NJ¬™ðlú5è®ð΢ŽuëÛetmcÂ4=:}êäº$7µž¶aK@»C’î›Nx.ÜÂËíƒëÖt/õsëj<³Ãôvݺ5áäÖ1uÝK#4®¯‡wÀ³$6´qÝPhz= âðqah¬ª¯KâUÐd˜~ ý*õûfDkhNãœpRµnN#Lo]]iõù”½éãÈW^7¾.IVû£õS‡v:к±Ëvy•°÷â’E;e›:°;-Ö `2wft•1ˆU§Ðð±]#‹i¢Ã!’áiaèI]¾©/fôEë¦õ…jpÕcx*9fdvR?¸qÜæÓç“BLŽ†×ýDOþí✩™1&ÿQâIªA¹'‰da!Ei0Ì)ôq»ïÝ£hI;‰F›ä0$0|¨Ævj}¿bþH„Nð]í
+õþ¤C6˜VüS³2·Uôgàz¸(vö(
+qÚÓûîò'‡®¯‡±š…ûQ4hg¯³SÁkÇMªÛ+ƒÜY;¾®•`2¸qPýÎ\(«ÛæÎr Í¥™ô&LoÐp ÙJt¬¾/HèVʳ v?­#–§Óò0šÖNÔ<YË#Ç«y
+Ë£å1ƒÇ×uÇF’õ=ڋÆsù»âžÐÑ\:p­‰ìÐ^.ËníRÚ¹è.»³Ô:°†6‹Y†x>„rTJO႐/C¼B „B8
+a
+¶@Y=š3Â
+!œb%
+çn½¯ úîn½‹%»æ\_Ên§ª·“Øí®«êÕtä52L­ÖO­Ö«\Íî9HMóŠÔÔ+m¡©Á\Ú1ÐŹà#]Ðñ&ˆ19„¬£ÚÊ9QáÄLŽÂÙwåÆK·äx„9Âa4…Òn5ÛJHš|‹ì(D¾!'Õrr—ÅVºeà•äS´ÂAù~&F+Èq:æWCØá „#¾… ’ãð;¿OÈ'ÈJ>FŪ!L°ÂAßBÈÇËäO”?±˜ÂÕùÄ2ù>ë#ˆ­äC€>$B×Þm­¨,ÝˀDqÅ2€ÛŸì®Òvò»Ö
+£â0ӀQû¹PC˸œÖX¯P;çi­šj'ÙN„¶,!ï¡$ªø¾-¿‡Âj!4Bh‚ ô>@ï£!l…„X± !Lނð6„÷Q B-9Ú
+Búy½5BPŽàRÒb(ȯvåÚCé6rÆ.q1„j£!L°‚H’œÖé!;¼d?z Ô÷iE_±ôô„)sBJ|0 `˜Fñ~—іð–8Q⛂[Åï¹ ÅïXâ7­ˆFñë—D£øô9Ñ(>i
+¯¢cx˜ W^…—¼
+a
+„ßBHC¡vt|‹­C¨†0Â
+ÂÓÓÐðkÃÉ3ã¢íØڊ„“öáhøøAɾ‰áíRzl²"1<)Õ^]·ã{ê!7Iւ”_׎Ó4k•ŸÚ{ƶUwûiš¿êîúzäq-©öTÛØ*‡ù‰¨1'.\ž‹àìä¦áãê’Ïg×'K)Î®žü5öâïð©š!{ñßiR_·—€¿«Kó¹Cê뇷㉬
+ã¿C=À˜¿³z:Ì´
+ƒïiC¿Å\ªseªFL€Q*@•P2ý½Žâ(þ™/˜„RAnJ¿‡¨š½}žüÿ‹Ü
+â<qµØ.þ´šR­4Fj6H{¤÷t€¯¢ÝèåîŽc|œ[ÉÕp»Ñ=¤Œ÷‚ ó[Àç)h:7’¦’mx-YŽÛH®°TìOúãQ臱~l!gHn$ŽÇ¡9¤—ú6ÑÁ?Iÿ*:É€oû-¼y©h·’oEjÅì,~+áÜoЇÜ1,ñ£xvã“äY®°àü¡E¸GÐKܼí&5Îé֏ÂÏ_Kñ÷\ÔàQ€EÜ_Ðíh.ù#: t¼=€§ó3Ñ=¨ ߂¾@ÏU7ˆ…¢¿IfóëHnC„ŽžQ¹˜èÜÀm¿% Åèo@Ÿp/B—¸‘ü)a,ž°­F Ò+Ñ2¡Žÿž‰8<ÅøãÀÝnáJù¤+€«Lž¶¨{ðÜHÈñ挼˜b3ü>ÁÍ¿
+ýƐÍ‹ÍB l:šikF`3)ax”ž©&ˆÕ@:Z±hcð»(žÁG7$NBLÁ† Ì nXªy_zaÝ sà¥Y²²G—È8d^<K¦üÑ&Ç£9’8aî»[—´.4çÝÇß[vïÞçn¹å¹çn½åÊò.æñe/NٕJ˜J¥^ÝþàËøÑÔߞÝwÎ7³WS,?¨w°Î€>T†Ԟ³ØÀ¾±Ø ~‹9Ål+ŸË¯ ÈC:þEë‘(N/`ÁoØPè("L¹\{ú8ã]|­ØzzYzÁœ+^Š<†0lñ™ €r¾ËBß%à0ØDð÷á*¼
+¬¦Œœkøîø>-^Äß<à–ÐK—¿5zYô*Á(‰g/’€2èè(»eäFi…,‡ Æ.FW*5èm²Ù“•%N0Sœ±Ùð¢—e€‚!H1ÈM+ƒ´4°@IÐD¿6ØNö+&bp»Ã!ÙFH8ü±ø½Ã4>ŒŠ)Š$ªi|¨”’éjÐd·Ö ¢·ÚˆÖÎqÅhÏ"‚šGßÝ
+¯V?€P\ÿ›ÂFþ§Z£IÛ£­±Æ”>ý…þâ~á ¸_zC÷f@fª7·Ì5M·Üd¿)ëNûûg¾Ïü§|¦ƒÆ—³ˆ_ÈÙrP F£䫃T3ì d(¾ð9Ÿ.àþ©ó8sPn'OímövìÙM¿Ñ.ïÂÄdÐÕ ª*ãf†f÷»€¼”Xñ~²…‘Œû*&Ûîj°ûæ“„'ûH.¨Nv2²k êP‚òbFoUU 5œ°Ù)®@´ÆÒ3aÖ¬J&¤Ñ`_Ԁf(1æŒÄ+ƒúP­$šÃ$—ª±€Ô%^:_Aܱ'7»í¡›o{ïÍúþwÏ\ñì+OLnß>°jZÇ­‡>»nîÏY—u䃯·×=ੵS{Q
+œ˜þœwî%pÛÎØ|{)°«û6z=
+<OaJ Üà‚¨¤…5h08ƒ>X
+šà0¨Z¾aꅡW(fIɉ–K-‘ÞÒF+¡Ä`4;Ê‘I˜p„>LŸàÄú ÙmiÇëÙ|ÿÊ`*7NS²®’?—™ØOW©²UVâŒuÄ?°Z­0ÝÌáiÐ^ Üö=ÅXVÉåô¨äøìì*úŠz@¨£8LŠ±ÒÔR[iR╦œ¤=*ï¨Ç‰¿P,ÈÞ¸ÌVæŒÚ8&›:ï þìõ×ÛR½ñ”§¹=ç¯|:õ8°²û;çR>AõÈð
+âóJV›N;‹Œi0%ÅH¡ LDqS(‹i‡vsM¡aD¤V¢PSí,6zØ|ÓJl²/æB{†Ñ6ÓáÅ‹!ètìT„­< ˜-IöL¹dãXT¸PŽC©
+HªópÊd
+ìLZY<Ü·,{]ö¦¬g³^5½oúȯÓgy,…>N_"”÷@á€ÓÈY§=+ë-‹ÕaÉrX¬f`7JíˆbÙ
+6Åª8q¦S/[yü.eE ^ížmŠ<_^!oyùÿÀT<Œ©x0òÈâјŠgcØ~÷FV|?P^ßVËîŸb.¡‹™ËE쥁ÚBÀPØ84Ø >±F×3!Ê!&‚˜ôÁ ÀNø7G|w~L&+âŒpÀhÓ!QÛyÂ/œ][ÛöõW­ÏîòAçˣ︷ëÝ}úם¸E^wס'6·Ž®v‘¿¿˜Z29uæ7îm=N9ÊHÀ/'È¡lTH¸½ ~ŸbcckÏam´t§¡Q´ "ª}Âb C&V›qª©T“ÄtA¦…¬8„§`û󃊛͠Åø…œ Ãlb“éSÌ<‘ƒn™â”›I473OÜ[âð{‡å×4Üj8)j ¸Õc®‘çïð$ûøð\nº4]7Ç>=¼H·8°J·:ð¾î=—M
+Tãªq£(*á†îEÍT÷16,y2´“ÉÍa÷Å,î¡éy]¼;~¡:³ìs%ºî}ì¾@#¼ì½*fq«SÄÉaœ<Ðuïc÷gg3º˜Ä=Ø|› ùƒ=©`»…LèÙÓ ŠB~ÐnR‚9Nïa~ƒ„•òJ›VÍР+´z8Í}Åiµ¸.šær&ZÝÉÞèd4í¼à¸Øù@-”“••]>ˆ—YGD­#¢Ú‘ÌaÕ¦}šÀy%‡fÒfé“N&uœìK/|ŸÖ´…‹3Ðe+½]¸À5Ì5,þ¹é«A_‚—£åø~‘nq¡i±ù&÷]h^ϯ֭4ÞaZm¾Ûý¶íõ,{°Ö@ØG“p¸˜&=ÂqÊS¼a
+z º±µ'î6Ò jl$HÙc¢Áæƒz¬ßGf¢D¦RB«”èâ5‰f«^cÅÈ*[‰µß«xK=ŒÁxƒñ0ãiNr˜k'3g.+Ìe…¹¬0·Ù©âa§â$΍½ÞÐdhÌ¡qºK¾uiÏöÊ6ˆT£Êð&×.@ êR)R/÷ÖüÁšòŒ 'Ëэçtg@xNÓõŸìøzî¼5w§Î|ðAê̽׮ž;k՝×Í\ÛoØÆq+·m¿mųœ¿àÁ9[?<¶õº
+Š­=Fwlø?ëŽÛ§L[sÇùôȍ£Ÿi¹íùmš?ŽRväáÖ½È
+N'ïP¢¡”I‰R6€ü”e*i?~­ËÑ­4>¥©|6FÔÿ¡Õ‹ÛúQSÅÝRÊûùF¸”èÕ®«¢×q×»æùfFoò-®÷ÝÜìzÎwÀ÷µëóð™pÖe®Ç\Û]\¿‚é"É£ÚbhË ‹áüàh˪h“øÝZUl·ÑN„4 iäÒ¼<¡}¸3ÅF:̴ب©´¶]¬&n,¢€â€¡CŒÑQL§
+#Vü±Éä™8ëþx ˛SI}—ú"µë¥ƒ\ùÃ{=²D5PÉ^0MVóq¶.ÖW ó%=«x®
+‹¼TÊõ>®Ë¬, r÷¤¬®E1֐ջÌÉAØ{øða®þðáóÏ>ŒHº!¡l\ YH65;¾×BçÛ2&Ï÷šŸDxÊùÜlY‘W-ÚL¥³*éDóT
+Œ:]ÌÊʌ̪6Ø{X¬·°÷3Xb0¶Xefq~ז¾gÔHè{뙠bBG`q±\"ÏÔÍÒ7Êk¹ò›Âëb‡|J6ê„z<‘ÔʳŒIù¦˜ÿaÑó&ÞÌ[8£A/ð¼Élщ’dX'š$Œýb+ó¨†%“ŠÇÑ<'Íã¼ÉO郂  ŠœØNš=ҙ¾R&d6 4*vS͐¸±µüþÏmä1ߎ±b¬5uHÇLÜF6Ñ{Ù*‘È
+©£[ÿ˜ÚÒ¶ ×~´ãûâ;"×ê•#}×`rï­§êqçñ…Í{ñ5|7·ÍlÿyISËÈ1wŒ^»åPêû–©ØFçò D+/9œ£x FŽÅDbx)£lþÀæ 0êՃC:´‹¡ø\ øœÂ†Ÿ¢4¡+â»ú^ÆVÆw••«i5Í/PÓhLM³ƒjêñ©+é…f¹<,lv€ 9n@[QñÅHAµè:…{27"NP×S(%x2ò7B¾Ñ(„¢S;…<Á¿_ߍož\×ÚºeCý‚…U]º]haòG»Êle¶ƒ¯På FŽêc…0rºM1aÂsAéÂT%Ï*‰¨ÃÈ1œäØ pÿ3s:óoŒ^ü)FÿyƒÊ‹(ÅRšÝô
+ùôîÛéÌ>ˆh…þɜ[1é
+Ý°EÝSèWV bÕ9ˆ_Ç/1­6ý†Ò4Ì4ÌÊð1s‘¥Ž»š_b^jYcÖ‰ «4÷±Œ&ù!’¢id1<Hâ6I›tÛ¸g%ÑN¬K‰@‚@t&³¹DШ3µŽÅ
+•=KF‘Rž*ŠL¤UȨ¬ÙÊ ¨ìh^‹ûü}¡-µçà‘Ô¾m¿ÆÙøû—}uïoS oáyøÑWROÿéXjëî_ãI¿Lý+u—cÿ.lüYê3ÿÇA[s yPé§DìF ¶÷ L
+ˆk@E¡Ê7ÇsI.—ëc-‰ÕO
+OŒNˆ]oœcžk¹Î1óÌx“ù&ëryqnsl5·Îx§yõnyUîí±ư̂¬›œÁŒZÐ#·ûã>}¼Ç*ðÙùÒ^q4ø€¹Ç2ÿ~⏹Ì=‚y1\5Tçe°‡>tqŒ1%@oPUzš4°ýQÅ'՟_é˵˜BL~¿NyŽˆ8–›y`­ù{øŠê|Øw҅z0ۆ)G2ãZ܈›ðF,âvœT,=h“´ièñ•zÍa¯×hTßµ(¦£\@YµÅBè:çi%DßYà+¨Ë3Œ#Ì#€ãvªÚÒÊv í]UûxJ­Þ^+̺]OÏ8U4ñ¬È åž Ñi:
+@gÔÑI[õ ‚éVUíÂÝoÑeUIYiÆæÏÍc‹_lïXÆãt¸]¼›•|?>ùeó”_/Ÿÿü¸ÚÉýS׏™=óÖï~þä«…}ÖíÏ%¯ì‹?¨k¹iõ¹GßHýã!üù†»¯Ô<¤ffÔ=5QñäŒù¿š>û핖»îYyõè²²¹ùýw/Y|¤yÑW”²J@ßÇ<îŸ(^‘ñ/‰Å"³Z¤ÿd»ˆÌj‘~Âv±QH A˜}Äþ—¾4ï
+Y=ˆâóžô¨‡Q2«2tQF5`´"+àÉß[õvL°³@V×í©µÕú0k±ÿÅtÓíêÆÙ"¸LµÊ0Øùëßáå=C9=ðú×;Áæ?÷‡–¦¥KùfûߕšM<Œó U<—ÀDÄ’ì!’ø/Ä0bK!0<z2²ŠuÎÊvò>]Å(½Ë9›Ö{ÔVæ¼ ßýÁ©ÙҘûøà~ÊãòR³qk©ZqóBBeŽ$¶‹LöK<“¨¿ìÚڋú‡é‘ºÓ?ÕŽô.³E{Gp[ªùƒðÝ©Ù÷‹y¬zþyüŽð
+âP£bäúº½åD±ÚÊéáˆ]pÃÑ©õ¹¼åµ¸–#
+W‹Gÿù†Œ ^@;׊Wsí¤qñò öâbvâá´êÆïÖÆ蒩o8ʕáwîýâïФ‡ÚQW¦¿äü”*È6¥HoÖz;Âsa!ÃÎ
+ T}'‘¡°ÃL'»$s %>ûŒJ‰ê“‰Ꙓ®g¨ª¢¶©èKvтÕl˜ÞSÁ~½ËóÔý­S„\N§ÃåŽÆ9Q²u#T⪦ãÀåÍWôžûáL\V³vŲì¤ç†£w®}¾VÖ»sÜך?¹tÞìYOijoŸ0ô…U£VŽrX̾ܘᆗÕ/ð,¸k¸2õʞKO[uY_üq~@ÎY|EãÕ£/»‘RÓj ¦õù¡lü¦r3LÖ\¡·P#Õ¡dˆ„B9²À @ShcHì—Uåªòpð5èÌuÖ×5¾9ºëͳ¬7¸nðu„>0}èþÐûiÖßÜóþ%ûx(ò†…bk±£D¨¶*Âk­pðaö?ù³²IvZx‘ @”°Á°=š}ãÑô_ºŠ¬Ärç5bÙ¨-F^]532Š1z2.Å3še~Š¡¨Q;´g¤»[é\Óe{ã"l#ì`C[²3âà=0œ§0ÐPǐŽS†ÅéÀ ´oÅI|
+4B·6¢­è8:šœÕjDú€®ki¥ÉpŚkÑ1¾œãg:ýi«~£¬d¸”kL„0Ý+–èa
+ÓÔ¦“õaF†Â0BaèpCC‚a'C7'C='ãwÎÜ#IÕ‘,ÌGg IL:Iê)XV[êå/?Ôe&¨rÁ5,ÌüCHv¡o=”.<Mw.,Ԗ°l•Årà øc& ’¦ö`·º7ºœÓì2Û(NqU;³¿}éÃÔ¿~uçö?…vxWLZûüSw̹¯r¿|gc˘¬Üñ¸îõ¯¾ûþ+·Ï
+¸tLݗ‚*·oŽ™ËÍCÌBoGïÀUd¼a¬c\`&™.ÌÐOs4:Bï ¿ÏúØûYÖgŽoÝõ~Æx‹+Jø(Cî£ÜIê *pOW?ÒÛ<œÔ˜‡:†®2L4Ï4&~á:‹O[dìÍZ¶Ï1J6L‡»ˆé|ÿ2c:et>¿{™ÍbÌfÕ*\Œy b²|Ԇe›bk´µØ€/QÌU¹“ÍNY‚‰cʧl"ÅsãV6f$Ñy´Yè<Ú´E›¶X@¥‘Ò"»zI=ðÁž+1å^=ù|P:"“ÒOñc´ÄIAF?LîIA•®Î0EBò1œñËk»qj±3“¨3ѝõT1Wpœªk‰† ¬†zÆ#½©`ɦb°Ü}k߇Vü~ñœ÷noÜT¼«3üââ%Oo»yéã«[îÉ-˜[7f ±œJìo¿õ«×?|û•HÃA"Ó8;SÜ!p’ \ƒÐ Ÿ`œÁÍæëguNõ?°¡:¡Œ¥Pv€s° œuœññ½ìý¼½í#}c쓽cSíó|SKÅ¥Î3äŒGF.l5»Ýµ.jr®€u£¼U&²Ìû í#ÏS*Ñ8{‡Â¦J‚¾? ؂[;5rÑ1k¦Ö¸3èGÌT5kGºÌT±£#o¦¯Òç–'ÍØì Q}9/§éËT
+ æ_=y€g˜çfd×öL(P7hVu.¨ÊlgÌìc¢šÍB-¨~z‡av3Ž°ƒ"w;¢oö~•ú;þô{lÁç¿4´®š¶¾óC2ÆÔw❷<‡'ºŸlÃ!¡&œŸú$õƒÞ±o¾õàYÏP™“èÐ"¼‹Ü¸@ :ôØê-ö–xo“÷aÓ#æçÌ:Ÿ9ߜôvxy/VÅ*Ï֙9“5`ÀN’pdñœˆ [ؑÎbc˜¥ð™ÍEl0Ý&UÅäGîØY/½ú2+FIBåö*”z½Š¨9˜ß&Ÿùmr(=£¢ŒÇ滌_ۑñkÍÄ<[Þd‡¿AÏgg`Гï¼EÐl›'q¦;ÁQ?÷i°}՝Lœl Ž*vš·Ò¦î'pÈ6Q/‰:Ð{e½Ýl¢Õ8Q¸r%N=.¤[Yïò
+ÿtZzF‹òDäÈÛX´µHêéSP]4Ô84RS0>2¾`¶4-2­ ±¨¥èü/#ßD¿Í³¹]¢³ìlËdILËaTÂq ê@GÁxm'ËY¬†šœ€Éàr–Åʺ•þNÛ+û½’Ç\1ç¨ËnÅÝènqóE0%dBãÆnƍÝ]ÜØ͸1=TÄr¿V¹1­Ee¸±[]ŠfÀYÖÏ*³æ,²âÊ 1d
+1d
+1d
+š†ú.¯¶2µú(®XsØñ‘mY=he¼ÙêM-ŠPöœuLd\±rwÍX4#ß3ôÌ݉̎êªWkˆp7ÝxÅl‰<u×4åÒn°ê™§5Þý¼Áu;Œ¥ƒ-_ë±à%ɏNÝðÎÝnzfÆG[ùõCÏ,¿eÛö›–n«ó‰•NŸT‘¼ W}ü Æël9?çû#K_à
+’Ãh0i2פM7ÛàYHÇÑÓ+e}ÊÓzÜ¡Ç.&p]
+|`ÿÕ;ïüpóC–a÷ñ“Ïm=4r:呷CTÁöЍTÌÝ)é"êÉì›ëF+чzà²;5\DêjÀðí“«è«î—+ï­¦%½Ô4GÝO§Ä€Q[…°E8&ð£!:%p!¡IhÒœÍ@8•ÙÑ71¦çMc Â`7“îœïû œ/»çc¨ŸÑ‘tI[âJ§µE¯  QüÅ@)€yÂÕ=vìîÇåm··±ívª$ã ÏDɧ{QVF–ÈÝþ‡
+°j@–¦ÁÈ`כdi‚PÖ»Ø4À¬m×Ñiȱ?*#æò‚?¡ÿ³û³°ð{áL˜¸uá¨Þãë9. ˆNªzHXŒú¼²áh oŒm‘П%¶Ñ†m<3`=ÌxeafÀ:ؑ·Ìqx€3cù٘/ئmîfÌâ%èÑuÛ,ÕÛèÇ~ր¿«?kÀO)6ڀŸÉI?ów@nJØ~mʯ¹ý´…|DÊ¢ìõQƃ¢ŒCEcø(ÂÔ¹CB¨~Gߢb%ã&HÖöAÓÿ –‘Êç5ýý´â`âYEI¦Á on¬/Ýõcî¢úê˜:Ö̓×Ðý”½ïŸÏBDU{àæ#麕ÍÝ}Ó°ÅäȊ;L6?¶›šðÖ¬®ÿÄêéÿÙ`«ênv°”Év¦þw—ò—>3gÉ¡[ßzìù]ÑÉš~ÞV7}ÄÊ~|üþQS®­Û·cOgyôú)ýîªóÒºtiíæ{;?ÈètŸ%¹ðN%KàÄ,²Mn—ÿÂ}‘uŠ;“%òtÛx Ü2?(õ÷¤=|Xç°8\vÐé°è2Ì“ECZ‹Fq–Ì€r=Ló0ÎÈ´9#ÓæŒ]ڜ‘±c«‘9ݬžisFºVϐÃhÈø}Ï(ÌAfd
+£ßq”‡²­"ªÙyNyH“g«'ééððŽ”9] o\ ‡\ {\1uW£Í–Ùlû“
+áG
+m…s¯h~–?°£¦idéòÎf²ú†yï{»“q’þ’σ™7#/>¸ÇÉþ]Q–z¾žBÿR™A!/+°K¯érñ
+ÝD±^7Sœ­Ó•Ëýìý\½=5òpûpWg²0Y?Vn°7¸Æzæ óôÓåyöy®éž±S/
+櫹ñÂxÃզ빠Ãõ&ƒ;ÀK6`TÝwœÖö!|¯d1u<×Ϭ<?C©ë±IÌۖñ'k  ÈloTÍg¶@2 C±äÆÊK$Œ$Y
+Kœtázô:܊֘G5[º¨
-4Õ"̓ó):†ö%b¨œ¨Ž¦ËûJԋ×<f¦°i“ÕšA
-<¶œRí-Š–—ñ}–%²å#£/+ü·^6ù¹—-þO^¶>çktQÁüªé”×ÿ%ë0nñð
-ŧAÒEµgZIoJ ®Ý ¡y šòÙÖ®´v³’ÜíùR¾Ç`¹v(ÿeãÑt
-
-<</Subtype/Type1C/Length 218/Filter/FlateDecode>>stream
-`xPN
-
-<</Subtype/Type1C/Length 609/Filter/FlateDecode>>stream
-À¤¹‚cJ~RªBp%АÜbϼäü¢‚ü¢Ä’Ô=ǜˆ5
-E©Å©Ee@A¨/˜´30v0¶30}ÉÀÂp‹±þ{ߏŽï7¶Ï¿&ô½i¶ð‚ï]ߥD÷Ϟ߱œ£}kÑ´³R;çÏi”;™>7evíÜêÕ§Ìæ~0yvëêÂÉÙS²§fOI›Ö8}Ñ´³«ú›6OÕ¿nIùÚ¦YÙ½E J«ºóskš[;{öÐ9csßԅ'B»B{úõ5ÎHžÐÛØSÚÚ[3hfàÊî¥sŠæew6Քg®+šÕ4ascÿ”³9‹ëÓ²›²³›
-›[³'WO©^Ý:wöì™s7\Ï1gjgy«”gQC{¢\GþìòÅí|?WÕl~¿óû™mß73îÙü]vß÷ú]ß63ÿ8øCC´mióꌕ¡;”z£,\»[s¾`ù{æC»÷ô¬ë™ÏÃ֙_]X\šh?9u»ßå¥ßyWm<s÷»@ÜdgŽ?±Ž¢¿ƒ¿ëýÖû „zßÁ4§÷;â¿ƒå6‹}·ù. „6 ú·ìo „Ó q9¾Šy?MgýŽÁöœë7@€!!
-
-<</Length 224/Filter/FlateDecode>>stream
-H‰TP»nÃ0 ÜõSd¥¥-`hIZÀC›"n»ËmˆåÁIvtàäñÈ#é©;wÎ$ _Ñ«ŒÆ鈳_¢Bp2mTÚ³ŠÊÊ4‹ûuNh;7zh[B¯™œS\áЯvð·cóô5Fã&8|³Ÿß\è—nhÑ%h@Ð8zúáSZÌô.­u¶/ôç Fé&„¶a"€Nÿçßø¥{kÎÙ³ U¶ÁûËÛ« yÄ_s™VN{˜QKŒÙg½¿Z,¦ŒÃNj‚ÅC r`žÇl¿
-
-<</Subtype/XML/Length 3649/Type/Metadata>>stream
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
-<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.0-c316 44.253921, Sun Oct 01 2006 17:14:39">
- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
- <rdf:Description rdf:about=""
- xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
- <pdf:Producer>Acrobat Distiller 5.0 (Windows)</pdf:Producer>
- </rdf:Description>
- <rdf:Description rdf:about=""
- xmlns:xap="http://ns.adobe.com/xap/1.0/">
- <xap:CreateDate>2002-01-07T10:25:57Z</xap:CreateDate>
- <xap:ModifyDate>2009-04-14T15:49:41+02:00</xap:ModifyDate>
- <xap:MetadataDate>2009-04-14T15:49:41+02:00</xap:MetadataDate>
- <xap:CreatorTool>PScript5.dll Version 5.2</xap:CreatorTool>
- </rdf:Description>
- <rdf:Description rdf:about=""
- xmlns:dc="http://purl.org/dc/elements/1.1/">
- <dc:format>application/pdf</dc:format>
- <dc:creator>
- <rdf:Seq>
- <rdf:li>GUILLE</rdf:li>
- </rdf:Seq>
- </dc:creator>
- <dc:title>
- <rdf:Alt>
- <rdf:li xml:lang="x-default">10217831_BAT_M8_BC.qxd</rdf:li>
- </rdf:Alt>
- </dc:title>
- </rdf:Description>
- <rdf:Description rdf:about=""
- xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/">
- <xapMM:DocumentID>uuid:e3285f3f-8d6d-4379-a839-6ccaac6dc85f</xapMM:DocumentID>
- <xapMM:InstanceID>uuid:b10b14b9-f4bc-44e9-ab18-0659d4f00d73</xapMM:InstanceID>
- </rdf:Description>
- </rdf:RDF>
-</x:xmpmeta>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<?xpacket end="w"?>
-xref
-0 6
+ㇶ—’zåè.7ý8aœþZáZ=êÙÞâ,ö¯-Pæ]t7þ†<uçka×ͽëXêäÞÖ5«[w­ZÓJ²pÞ=KRþ¿Ú{öð(Š<«ª{zú5Ó=ÌLÏL’Î$™L2!d’8Hó~-Fž’
+BÀ„`ÈC”••°¢øýNÅs?|žî
+&¥[™ã¸ßU†×튣²À4­’¹†œmª¶)ï¡<[“5äóŒ ÍôÌ -ò,
+-ÈëÍ{{ß}ŠûRþ* –¢ˆÏI¢y2š 7£Vô±üiàsߗکÐߐY‡7–ìNÎfqgûÕ ÓßÙÖKõˆ"^ªb( ”^…Í£ªŸ<Úã
+5oD+§F2­AkԮОÑþ¬qŠ–¯uhŸil¾v§†´1ä`z¤öÃK.WI°Š
+WHùA,Ò O QEŠ×Pý~Àܒ·U£Ù5”ÔtRJ£¾"µ _qß?.öþï÷PµWQ¾ÑîpòH,#ÿIʗeéË2cJ™éÉG‘¾=ä.eAZƒ‚’²Ä‚ªýU¨¡ª·
+n?Q:äÑ`'KÇL=(‘Ï$ÒÚ0Ë"„G¡ì`v< ÇOw]œq„‰Ç;‰](K9M¬Æq’Lµ“ºÁyœø“Ý@¤ßäS’!y…6oyÔ¥ºUÊp‡BÌ‚¶!x“çŇΈ:d¾T ÁX‰ rq6òÕ\ÂњÁtCE ²øÚµkAֈIô`ó>qNêʒhIªIÔÖ]àvŒ!™ Q´áYåÖëW_WS|÷Á-£/*Û<ó7/6»¶ËÝ­«Û|¾Êк—îÓzð7þŽ /ëj7²0P\5yíÅWÅò㓮_˜1oF]a8×#U^=¯ùÁKŸ&ckQÿ÷¨Ì¶øa>Éc™Îd[ð5{á2ˆHƒ£ PÉLŒôj@Ù!BøT!®ˆ˜b$E€tœÃžˆ&{"Ã~;?^¿À¾ÂÞkßdgfj²o·ï·±s4Ȋê£ÄJQ©C†)©Yˆô¥=Â.
+kª[åba`"%Ù»uáˆp\`…ÌD* L¤–ÅC¤vòtþ¨4*Pó‚p±vŽbͲ!\(vš“*u0ªOZ)äðËdU§Cq ÎL €EOVï25¤eek1Ÿ‚KZž%QªõÓW‘*I™†Õï_¾­Q•vI®«§O¿cÄ®vMZÞXӍîJíÜ8lâô™wނ’g?Á=$¶$Ü£"ª%ѧß[ùlœ#x¾k4òYÊρDŽßôU@j–?’ßÆ‘ç 7à]DˆßVÏöƒ¦nÐ{klD\I‘LiWRð¹Ã žlþӝx­½H´nB^AÄð†
+B¤8|xƒ>1nˆU$€Ž7Š\
+Ä{¹’çF’ØËÇòçO¶·v¬ömO5„H·ÿñDq~ þÍsé«ÙhjÝҎY+Ñ-ā‚)í?1¥©’ÐP‹ÒԌþ÷†ø³Ä¢£J‹qü¸
+e"”J"ŽáöñSúQÜP‰hIŽÐÏ%Z²Y¹‡½‡ßâ¼_ÙoÛÏí·¿©ŠáKãª5p¸´Þ!ñ•îKÙ&{“4×y/¼O¼OڋöɯKo8ßR?aÞÞq|ªžÝn«O%¸]JÀÇšÍI0…ÈDq4ܘ4d<nyç/á8ÆÎ ä8ÁÆ2x
+Qð+퀊âP%<º ‡ÄȪÈ)HՃࠀÔb xä8耎b™ñÊ2#
+(҈{²kõ+o9ílÜ×êIµï4NXÎÅ\QÂêìùVîؤ¢¬ç¬wªÌ-Þٝj}=_ßd¦2Þå ä&%ÒÞRnRŽø“ þ’ãg ’*-ÉIÂHAR0™˜¾xՔ‘Ð%š{ ÓJµŸPMÆ
+™¨Àué-ÝV./Þùaz3¼ýè'ÃÓ_¢LŸ™8tLõÙ´œzNiJÏ'”TžÎü¦¤ Z†y´€i06=úèC·
+Tߔá̈;B°uŠ"«.·1š×ã)v‹^| ÈŠK.–D,"ˆâª/qä ¬†Qeø¥0
+]='‘^ú¤+
+«Üþ>û¶!`ŽÂ³>z؂‘R*Õ$LŠ“á4Ÿ,4ªóà,4‹o.QÛá"´K¬×Ãþzávx«pö¡ÆGa)’ü£ü‡ÐNÞÚ½jN•»“IP^ˆe 4\/ŠÅá A’7-$Ñ.œ¸ÐÌe#äˆ;E´*»xÞnã^À‚À¢[ŸAM=öˆã!'NùÀÙëüÎi£‰"ò“³ˆ7@ø € ô¨WSԞ2|µ(§ŒœˆSç-5Eä¢zõ$ærOR_IkÊR¬Ü–œ‚;{w)ŒòDž5['m‰^ÙKZ‘4¥™ú¥³ Χ¤ÁãaL!`í¾ØJ
+(1H7FÔèƐª„¢?¨# Šâh‹nÐ7ëM-/ô3¬;ÇwÐñ6*ª†!ç;.«g•­Á2}/ózÊZ¡mÄs@Aw
+¾Ávàžy†kÈÊZ4à™.]•½²ƒß
+·î]¸u90ÙðÚ8HV†@h=XÌ2ÀVύd)™
+¢à>8j§ïRJP)ÌÖõ A…?œî#q}þºjšû¬óDgêhòÏ7̞³ióŒQ’‘wy4×?êþËÄى©Ýò5lЛë{éB‰9çÁ—`)\MaüžAØvæ[Ûn’}4ß)ìeéŒcƒãùlp~¥|«Þïšë:ä®ôä`x–€åìÈÙáë$à?¨uk}ÁCÛàdèdØOavîßòU½¶`|dJ!**.vÿÝÝ[ÒVª”Éq¹§¼ȆÊß½rØÔªÞªÞêGk¤Zþ<(€q°¼ö–Ú'j]§Î…ºÒ_€¶ÿ#¸y>úßÁEJÌ„A„A„A„A„A„A„A„A„A„A„A„Aøÿ'ø 뱑OÝÜ®ÄG˜Ÿð–…3@"™Ã(Îfá\nàŒ¯„¬`ÝÓÄ!ðÁ‘Ž€δp&ë<›…sY¸YŸ'ªÀP0 ƒf«@ ÞOàjüí«À
+~Pò@€þ²Ìùþ¢K]O
+endstream
+endobj
+19 0 obj
+<<
+/BaseFont /CIDFont+F2
+/DescendantFonts [ <<
+/BaseFont /CIDFont+F2
+/CIDSystemInfo <<
+/Ordering 12 0 R
+/Registry 13 0 R
+/Supplement 0
+>>
+/CIDToGIDMap /Identity
+/FontDescriptor <<
+/Ascent 905
+/CapHeight 716
+/Descent -211
+/Flags 6
+/FontBBox 14 0 R
+/FontFile2 16 0 R
+/FontName /CIDFont+F2
+/ItalicAngle 0
+/StemV 15 0 R
+/Type /FontDescriptor
+>>
+/Subtype /CIDFontType2
+/Type /Font
+/W 17 0 R
+>> ]
+/Encoding /Identity-H
+/Subtype /Type0
+/ToUnicode 18 0 R
+/Type /Font
+>>
+endobj
+20 0 obj
+<<
+/Filter /FlateDecode
+/Length 16338
+>>
+stream
+xœí}]#;nè{ÿŠ~`ßÒ·˜žÍX 79@‚<ØÁT€»/ùûW²]IQ²Ý-ÍÔg·M»Ä’(’"©iëÌÿ½OÛiÂlêï¼Û §Ië÷ÿœßþßxHi!œXí&Þÿþ_o*Ø­ !xÿ.üvò‡_ÎoÎêø£i€B°Rsz0‚Á ¼ûÛÛÿˆi« Ý3
+!åÖØ)QQxµ5‘|Ùù"“püÛ?¼ÿOBRÉ&ÿ‘¿Ât&2#QHÓÖ;mDzćI„$¢ CBET©÷K?P˜©h!÷Üó›²nëU$ËÂqŽÁ£ÛsçƏ Tq+~\Ŏ«Øq[ä ƅÀ=ž#¨w[‘ Ž {<7FҙÂV¦9ЫƒÐ= Ÿ[ƒ°ÇÅaÐغgáskva™#plݳð¹5HK)¶:ý-áغgáskÖQ)*oÍjä‚nÅq¶D-å$/ø¸Â㢗ÊÄG\TbN¤?&a­®ò´ƒ+1%€²‘bbÀsc„Õò¨m‘¨!pρçÆêÄÖzJ/î9ðÜ¡@CÔ÷–Ò {<7F(P¡ôV¦9‚×
+ߪÙA‚îYøÜ€¥9Niƒ×!€.k¥³éÿË?½MïÿýwڃO?ûç´Æÿÿß7°‚l\A‰C‰cÖÏ·ý*6c¶ …[ÅV˜¢ì ,ËCyCØ8–‡òÇÜV*yq…Š¡ÌatÓc¹‹
+¤`ÐÃF¢©d zÆÁ·¤5þ-þò;”|"øA»«'„þ¸‚,‹Þ+•ÍO&°0`$)““:A]ûȈ1îóˆW*”ƒ<±nhµ
+“Vœ0RiMVÜáßù…ã¶þh2Ëƚl[±DƖ%#°rŠŸ…£\ÝïkòmܾT»¸à˯Œô*¸›0oÉá]řùzÞ}LZ—g\”N4ö1ßTfZg с[—ïì’d#Óx§¶x§&ûÙS±žuú’ Á:¼ñö7î+è½\tìÈH4âÌ´SˆÑΰØÀŒjƒ~« ,•ìŸkÎy¡£§rüÌ̹dÈLç ™›By¼ù£í¯hK>ÝgóOô¥ß‰uó‡ëæ¿nþió_èŒ?y
+ù Ó «œÜ
+\îÚٓb42NÒéx»˜â\Õ)>ˆú±kÏyG~{î`ªýI²?Vqî¿2*D‡ k
+5 õ\¦Ó~ ¼;ôÒÄMŸÃñþ%Ocø5O»ä5O˜9~MQƒ½ÓáÉáPóØ:ëއ'RÉ­NÛû£Öbi6~ïsiro»5âõ׈×ñÒä}þÝkG˜x™W(öfØÀ½õhæè·¶•žêŠ®íD‡Øž3=\Ðý&.}ýÜræîäç9'ÃVLî÷úžœ|>ÞÏ;“4':YsÈUª¶ÇEВýK•4GÜ3ä]†ÊN'+DG¡^[͝>­sãUômҁ[…IâŠhɛœ3
+Œ  p Ý5×,qÜø5½uõ=jøiq€1xt{áÜø1¸í4=Ð}H¸çÀscp šÚêêš,Üsà¹1B†éØ)]W{<7Fҁ¹p
+ïQÜÝPzÕ×~‘NüKçùMîQS̽ƒ¸çÀsc„«¨5î9ðÜ܂ff¾w÷xnŒ®›ô6ºÀtÏÂçÖ \¢xHŠÆ½ƒ¢Ü;Ø€`.bDÐ= Ÿ[ƒÀkÐ|™2e@螅ϭAà]jv{І¯Eýú]j`Eó…‹ìâúú 2ÕSRÃØ
+x(¶Â„wK[Ιgy(oÇòPÞDT/܋+T e£ã˜Ë]4
+)¡òpü)ޕV¯Óm˜2Ì˸usÀË{©Sƒ¡jÔ³®Œ)tëÂ:mÄûWŒÖÝÕ_`JÔS¹nb„%_u1Út!½Ê-ï®â®®B¯ö wWu­ÿhÎÄë´ÃÓC{ÐH©£^LQK÷®ã䥍^¼ނM%ª@Ƶ i—u®-hÈWC½¿Ó]ž2þÒyÚÚ|í@3Zà^¹Ã©ZMœyó´{0¢û…ÌI•I²¼ÖÜ¿¦ýÌM/.T:
+*º(©ÌÞ
+n径»~¦|w‘÷5“».T®'¼»Ó¬-¹åoušW§yušï½I”B#=Qª{ ¾Æ¡+È0&z¦§3³WÊ`ÞF?ÀôŽJk»¼sü¥°Ä¸Cæv’%wÅę#æŽ ¬{Æ{7Ùáº#æÍ¥gÌOãïqkGD\ϳ=#»Š.ÌA§H'¦Â¤ØogN”ÉE]uÓãÞ;õ™páÑ¡Ù=é$06įã‡à
+T ÌZyé=ýfËGýªLðVqlÑùÛñšû‘±*_¼—.uª%þ©„ë|ê+ ‚—úÊM÷‰žwrq™®Þ¤À›Ž<Ó»“ºô^¨vaˆ3Ú<¢qTAÚÛJR»¨Noݹ0¥ê{)Š1ù—[º–§!“z>7Çsoõ,\èb]+€çÍq2ΤÆiF9ʼn—ªYý=³ 'í%ª¯äð*³®¹]ß+¬jÕÒÐæîiPN›VùûGt½9ø “]#ºâpè®]PfU¨"ºösaM/>ªµS¶1ÔüщʅdX€Ïoœ<iɓ]jÕ®Yø°äî.ˆ¹*»Æ¥Ý
+%ÒöŒ:‘’~Oà§õ2¬H¡÷c0‘YùÈxCz{“m~—ŠpK{ZNÖ/7`®–Ó´ZNÓoi9Ýå®tÁ)Ђåxc­9^`Î+ÓzÀH½¯Xú €Â۔&h!÷Üó›Sn+}
+r¶PýJçê&ÓxÃ$ýrQïÒêÇ ®[F·¶â`JkÍÒí`-ˆ5´ Ô)|…BM*[PהÈ^cTLBÿ§?ȸzgÚm5òU´÷3VíG¾õÚtD=)€«ï¸æ3¢ÌƒêÚÄumÁIæ}“QšþbiJTE¦*¾¬gL”WRxÿ\òr6è­M”…(°É-•àEÀâ*M;2]Ü.ø ÄÈS㗍hG{Þ¸Îýx惶f6œ½ñ}¸©ÍÇÇå|kürZ£éy–ƒˆ
+Q’2C¢SŸ_À\Ýsd#Dó8R±ˆÛ©a©‰S¿¤vƒ%25ª>T¤½4®D<ÙN•ªuoV}h›);!Ž1;´a Lۋ;§bPÑ~exÑD*Bç­à·\¢úGU€«š/]Ón|¤iÕ#—Ê÷Šh9D©ÅU3…FŒ¨Î¬Ã
+Fˆ©ó‚=QWeuñk»×;îÓÝíÏF;՘N_zßáäÑ,#ž7+5}N:R¼,û’Ø:V‰=á#¢æù¤ÝQOgŠo·¬f7‘¬SV©C+Áøo­f‡k5ûI{#zÍ©°®…u-|ñëçl‘|)!ÕBr×úþ¤!
+ž0l$ŸOö}>ejwZ§­§NSYÒq ÷†"×lS§Ïwî;Ïêš+wì¬!RßæE°Þ*vWeµ¬~sËX¬¾ÄÊÜ:~=æ„EÖ0ÞjuÏõ÷ò_ÉÊ~õ_Âáj³¯þëºÖµðxiOO~)^Ø­Ágßé­tÉí¸Î­ÙxEÿU_xßÀƒV+uêæãלä/pX7f5¯@¬ÉÊÜ:~=æú'®Xá{âÍÞÉa-&®ëc8\ôÕa]׺/í‡8¬WåyÇ­Ên%®{Xó¼¯Èóv;’ÊKnF,vGÂW÷Y#š°\¤Ãå%OL5=éE6ðè_gIÁAíÀ¿zõGÿDO¡±×/V.¿¹³°¦Í®ÌAÀ:^ô‘/dQßË©×"×e¯Nýc8\™Õ©_׺/íç<…~ ; eŒ!½ âNé.‹†?Ñ14ÃÇ+C›žÓ§_!šykõõˆÕ™X™[§Ã¯ÇÜçÓ¨Õ½X™ûC®ìc8\öՁ]׺/í§/ÖÑãغ©shÈY X-››€¬¶à:~‰ýVÌUóãu$ÖØ¿ÿÆyLÚ-­­Wé1®Vâê1­ka] —öóçñêt^£S“rñüy¼4·%®[ w’hiÖ¯áúãDÐeö[/ýØWœöº:ÓÆá³…DJ[>ûO77§4~tFš>v`ȳ¨t?µùÚ.ÔÍ4î;t¡nK¯Ù…ºÍŒÜ‘ï›Nš1¾ï!.P0RÊÒ§ï/´md0ËW| Æ’@$‹å]kK&Õw”×NsâÚ‚¼gÕ[%Ý4©Éð»;˜ò9¼Ö5Þ°N‡×”ØoÅ\?¥ûûSœˆ{½\íµÆwÃáêÓ®ñu-¬káñÒ~úqã£Px‡8Zî2º6ê(4HlÀ´+o©¿÷âF7/H@¨ã³'Ô`7Ý(R8Ü˜Ä ­Wïùº5×D­º^³BBıÀ¹öýŠjEÂtø="V¯
+Âîj&¨°ð˦²3(ÊUÇÀP<ȑΝðyÛ݉á:ÉîÕq: m?v~K ÄXq “ICGòíuHb»õmu€-Ñ?'Aú {q®mÉ:%¡óiãmBYg—ê NƒR½¶Çú”[±°BÀw`­¯ªn©ÀͲ/kDy!­z¸f’[ï#|õpÅájÕ¯îºÖµðxisÛj4ðûØAfBÊ­±Sځ~¾¹èí¦Îy˜Ÿoû·û‡÷ÿIHª}9ÿ‘¿J{¯?üe¦°µé/{ܾ£µcDzćI„´%ª¸%ÖFê}ÅÒOŒtOþÍ?€À=ž#¨:é’E0.î9ðÜ¡@I-±â„ãBàþM9¹Õ>½d4²
+*¶#çJÙ`oû­Wmˆ ós¤U]ÔG²uåX’kzþé
+¼™FMVl¥O7Š¼G‚L§Ëà2OùcGcŠÎUõ…Фþ¶ë]ÊR_ށzåéiö¬n”¸fdo™9ÞLrºOÄöü|Ì%7èmÕøÇ9ïëºûqº7˜À/É&=ÍöDóS ê†TóÓ£ùiHÊþ!ruíÏjrÇNÚèÍGrõŒÂD×Ô¢M$½ßi£ø¹Û½<©ºC
+7'íN:ïß5„©¥sÛíò"¸òâ¤?ÁfÚÃC§l˜œH›±×š²íé©ÖšÓnkŽß×®»Ö褏> ü…Ö„®ÖåsÊDGM¹õ.Ú
+7ããìñÑãC¹Ãaôlî”4Òÿ£r–R h(Æܪ£z?V‡=Z…Å™y0͌PcvôjB¤lªk1ã}SÝUt•y&:ÜL»¶ ¾1}#/¨ëS0¦¸ ¡<Ô ý£ûóî-cNNJœ€tŽ¤³Æ<l¥Ë¨ì|λ`VHGg?9凸‘?ÝõçÂõ/Î:Ýì†uõìŸ·×¨ïc8\£¾kÔ·k:yUyšÆK{0âx6<eoi-ó-&ÚŧÑÎ
+ÿä¦ÇÏ«:ýêhŽdï¢ÓK9â§ôXÖBYˀ?üDÿ(S#sÄr’m-(VƢ̽iyPY‘‰9¼Ø“úËä‘I, 8'
+4ϲ¢LU­Fð<ž²RTgdõVæ„$g‘À
+º~2ñÙë:ê›EsÆE&ÐH,‹ÂF|¶l.E±#Øä) Š €ó+G0Mvµ н“>/¼ˆ"/Û²²ä‹Rۓ'Т:óp…ÓŒ©Îü}Qy`¨!Š
+ú" ²Z €Ì@çófoü
+ÐYT´šøE–¦5‘/] ì¨Ð˦U 5dvmio l%ÝÁ
+,=^Æ/?- ~Ëmr¸$rö¢exh^y?ߘÝ3s¨*¢x%Uæ3óUÓW ¤aÇÇ 8P{b÷kGçÂQÊvªj§zHMÑ—ž
+aVÓÁáf·a–x'­€¬®/¸ 5 ™¯×¬f|›"®æiékñÅ՜_ÑÏ7$yQCÙ 7 û8 Tź‡ãdiº9høtyýT©e§^ž1¦ž0L·е*Óŀ¹*,e´Ð'Ò É”œÀúRÅ3²ÄóÌäˆ"²„T€Ÿ {rx°ó3E&ŒFûffc8C&"0Ź„`"eYp005¿¼ô´.é×bð³ûNJht
+Ø°» ¿. °$U@eÓ@®¿gdõz²¨"
+‡½UÙš÷ˆ‘²0z¹ŸÂXq¤“¯|3+xœÞ0fÏ-ºÈ•m(+2 Ո܀¼h˜À× ^Ž€x¨ÖøÉ=}­¼ÃÒD'ͽӟŸ\œŠXP™‹©ø”’¨Øƒ‘‹ì¨d—ä40ÏN‘à ‚‘K¤e*q |‘ÀY.Ð¥™¨] °ôþ[öԊyë^‹ÓXÞ¢V2e}‚hB dïB¬~Ȁ¬çžÍNz„üÊí/F¥.Îßbhä$j]ýÐÒáÐáYg di@îxåeæþn2ˆ8)†»Fzь¦Xe 1¦’–×kÀd+b5eK†nD \
+Ôx帲D¤ó¾;Mà鉆®Í!¨äa´¼#—£SÆí?N™â$‹êU1:GŽnâX_¶|Uח#ŸY­U±KrÀÚQtîA$¦%²Ð`43¿±êÆå °XªÅ׎^¤Å<¡Í—­8›=Ý@X‹jŒ0¦c¶• oëøDB¢û>4S!Ô³:—fîá݇ ì³ó2MF™2£o–Ìá/Çð¤¯Ùc¡g—XþÓÁ/ýÄ ÉA¼¡ñZ‘éQ{3'f©üä<2Ë\‘Ì”eÖãV@Ÿ¢Ç ¡¨~æø³ìnÀ ( ì„J/„
+[ý0ƒŠSq⠞½•A9ÍcáóB=ÑRŸ¶|I0ç!*ú’ÊN‹Ï™-}I$oÚ3Â*Þ
+$.^ÜÆy‡.§©æËÏ£hà˜3&=åw57M5Þ2LuNQ؀I<…ß“?””ßâÄ”¬Q™ŸÅÎÍl”…i£(¿EÅ0®=¤™uNX?æË۟%LìµÔÎÞF—;™—>Ð_˜|-Õüô×Õ©„Þ&“V%KfY¥Ù`öMÙtmÍ@ETìi8§O<•álÉÈYðZ   e¯œ7X\r@¥Â°{k-‹ß•=ÓR (ÂæÊ~»¼6[¢‘å8Á=SH‚äçuùƒQ¾<½dˤY˜±Å¦’€ÐfjKhu‘Xî\îaVœŒ®€1Àò⻑AU^žÉN$Lú);¶\”yN‹6šhŽ„8'ºšTý>adZU¶ÖQÙX* çªÔ9ê÷@9_§´ìÒ_þ €4/í €”eøbE5yÀ!|Ž&èz‡±žFý`¸£ìE0¹%«KgNÑ5
+ƒ1'0‡Á*èÅa0V¦¿LLеûBa°`ʑýô»¦²—Nø©T¶ ­ò!a*ÍnCg¬0•í‚ì6¸¾A欑˖óÖ@.Ûù̵F.Ûù̵F.Û4џeȯ—Ë\ñÁÅÓejt‚0к@5—ÃâüC«éh”}¨GÁƒ æl;Aâ$•šŽõËBF´˜³õüRÑRËø˺uBF]كŽw™Z)¶¢
+?¨î¯ W°SÅ± &|ݟªÚ©ÎÙ/¬èó$ªð©º?¶3’§öl–T”LÌ>{ÉÌö2—„ÉÖý•ÜÊJ'²¿* vs¿²?¦ö¢èÂ\öWø½ã¼¿î•Z·@È\RöwäšûeUØkkokÃV¼0KX6Ÿ-ûÓÕNu‹²?#åÒw\Ùp¿Ù$&~LϽΝrՖ9TZÔª¯»gB3îeŽnõ°SW•Žõ
+KUrÞ ‹ç
+;GŒ>aŒÐÊ]"Ž•knOVh}ÂUŸéO+Üä«á3æ
+jGFù€ŠO vÊ©ÒÙ0‰mó/$³Í1Pœ§Ÿ“òK’ÒT~ÐBÔÔ~ƒkž3=XoG×»ÔF×)m÷† m M]ÿEj–û>%SŽ«?º„4WxS7/ÁawjØՎ|V]– nx¶°A9Ìܝ&Âc³G3ì$ ù‹]l˜ê ‰p–§¬êg²aª´±Ù{Yñ6B~eñö†ÏÇ{ÜãÄñ 4m®J@= ®‘aa†½Ò‡WOÛÜ­CeYák‡Ê‰®Åjâ_‘3¶–m¥Qß*9y?ºC%§8_$"§ìe)WÓæî¦MåN´M›â*T›ÈjÚüò¦M vȆ Ù®¦Í×M¿uÑ´qb@ž5¡–¯ªè™ÓÎÅÁÀ³uäôçÓyéç³b`® ‡Àœváè{db
+(r /&:É¡m#A´µè êVæ€]¢bÛ´’µØJØnë|¶Ç>“xP©þw\«D3;ár©JŸÞq« ã¨:ÜAS‚±A™VÓÔ"ë^“•”Z"K&¸0@°ª™1ªünj~š)…ƒÖ@°8ê¯\ã”O_5xª7
+k×mØs­*œ^ö¿£´ð|DÅÝÛS§LþãÚH±[-ˆ`ÖÜÔKEfD),]‹Û|…êyŠÛh"Âû³·­dHmUükmÛëÔ¶U– ŒQ¬µm ,{ô4ùµmò¾Ö¶QÈ-jی_
+Ú^#åº2¥ßהë5åz³¦\§Ål3ìw)TV™®mÈOªž¾\¯ £Tt-è U3„žbÓ;_¨PÕº­Š›§77ºU
+$}:° 4¾ƒ¸Nµ+!g.ƒå'
+A{Œ)zbæÁFÍ¥+ó „’ÎA“âêî[w¦v°r1£sõíÙ¹­é\…KOÛOùaæ‚,Á€By®v^Ç刉ƒÏ
+ð~2i¸©9þq$ìDF¥j/w ‡Ǘ¼Öô¥8kÌÍ^Š<ûR´ÛgMìK‰ÓÉÆDdDx…qªù…gñ‰A¯Çr“A%y44Gk&Þi’†`?«óM¹5ñɤìòqy7 Š}“ÂD-Nuȅ´º%NÆPêÒ®’ö@w8¥:5û:/ߨ£þËÕ@Þ.d‹€Ò´Å“TP}tǯ¿\.øò+#½Šî&Ì[røPi?§“N–`|˜„Ùšã‡e‘j¤¨¾5Õ3Y  Òí6¾0­8¸?¨¥5#xƒ
+"„ÕìBóIB¯B݄÷d4ÙÝÉÖÿ}'»6Ä&hÚ@öýRâ€#2J*#‚H‘…ˆRS½nSUæ/1åðÛ%„’™0!\qtٞSµ¡‡¦‚|Òpª6]äzüÌ-¬(.œú
+VTJj&ªï
+Zù*ì?ÄÖé°Jì×dîù¶´õ‡”k×N?ø†6ü¥½—ÓfܒQº:mápuÚÖÐwLJJå³Âe‰ýÁ>Du¬ŠƒÈr7øØÙ÷<bzW®
+èQ\…­7$z‹£Í×PÎ#ŠûCÙ¥xµ0@¬ÖÓÊÜ:VæÄ{pCxÑ(9ç
+¹è£¤¶Bq-ñk(¾ƒ“ŽÒÿ†ž›J'— ¥eöÒI܏Ú'Ú4¤mºemµ a‘£›ÜҞˆI=gHåknþý"
+¿>‡¿}Ô췏 þAÚWYP¿}ö·˜O£žÔIò6u§²ÖÂûž(?䲩'N¹ãBêÝ:)OSñïr6ç¦i=›[ÕþcÑz6×;›óZÐÜ]sá9þ3Å»j6”Ùurô‰~µcOuô«}¶fºñZt„OÓºçr´ö§‘£1Ì*ÞúQ7Ý.ª*¨,-³&u@B_J>Aáb¥o4Lyq´Ìj<Ðí‚x(ô£:¦¯˓×zÖ±[T‰ï¯9(ÆÑ¿sìÒãaÝ}ëç
+ǞS鈈d1¼8­Ã•³ýîç\ât¬'ƒ¿ðtÀIˆ=GG]˜Xtø7ÎÑ)í{VGç1®ŽÎêèPGǸÍ bz@Šn¢<Ö!ÆÑlx^G‡aCÙÞI>n 0Ñ$DRŸß©Tê§V½ Úvo/KRWgí:
+Ãoó
+endstream
+endobj
+21 0 obj
+(Identity)
+endobj
+22 0 obj
+(Adobe)
+endobj
+25 0 obj
+<<
+/Filter /FlateDecode
+/Length 10670
+/Type /Stream
+>>
+stream
+xœí|y|UºèwNUuuõZ½wgëêtB:!! Á@²°Ä°“h$D¶$d#
+ .££‚Šˆ+°ƒ è¸+Ê,¿¹:‹0óp™QD\FM÷ûNu'ÀlwÞ}÷Ýßû#çäì_Õ9ç;ßz* 0Âfà`ú´Y¹ùç>¼ïmR‡½Mó—5·mÝ4q/€Ë}Gæ¯îTÆ~˜Y > @hZضhÙìcˊÜ'±ýö¢¥köݘ³ 뀯tqKó‚ß<¾ð3|×ï0-ÆÓDޏï²c;mñ²Î57~`\Ží0€£iéŠùÍ7=½ñ>€ê3¶/—5¯i3|(â\d4Â+˛—µ<0sÑ+sß æ¶+;£)š^€æÙx[GKÛ¤Yæ6€\³f¿º7Á¾Þü˜¹|®¹ô+­G ,<Ôñâ1V¾>¥rö÷¿ï_¤;%~$ž,Åq‘©P®{ìûß7Sw
+| ÂÅ!Ì`¤o¡Ÿƒ¸£ C.ÌÁU]‡óR¥Ü6²Ð
+Ÿ!e;^_,-‰%µþÄÿ ÐÇàIúXt7ü'_ kàÿ2¯ÂÑNó4 ìøoô1’…koÀTÁ¬Är)¦k/XŽb0äUK^jãõ"œ¿\…_ ø•ÑObïQŸŸŠÏ±wlþÛyp,óÿtml]ÿ¤ÿ–à0 žàÿó@^%0†ÂP
+Ca( …¡0†ÂP
+Ca( …¡0†Âÿ@ ñ+V;p¬F0iàÂ%1¥ æҀƒjUoèü»KٌÁZÞÈ¿›¶¼¢²jâ¤ÉSàò˜6}ÆÌY0§ö
+v—ÀÅ®ÛÚះ[á_îBõüû‡{1Oe·Ð¸kÃ!Êa*,ÂEµÁ*X{ᜆ?)žh@…ÉTaj  Za)t Â|Ì`¢ÿëÆùÑ÷¢]§ïƒ})¨Qóvœ‚ãgËƍ-½lLÉèâQ…ù#órGäd²†gËHOó§úoJrRb‚Çír:ì6«E6›Œ½NҊç(ìJU“Êh
+ñþI“rXÛߌÍu4…쪺&¤4©`Ê¥A„\ø7Ádp’ÈJ)”æd+•~%t¢Â¯„IÌ:¬ßZá¯WBgÕzZç3Ԇ>>¡TºW(!Ò¤T†ªV/îªlªÀ÷uëuåþò]N6tëôXÕc-äò·u×8¢V¨«rL7­WJðWT†<þ
+¶„—^Ù¼ 4}F]eE¢ÏWŸ“"åóýóBàŸ2T(W§ iÊC¢:Òʶ·(ÝÙÇ»¶‡e˜×0,ð/h¾ª.Ä5׳9,œ·"äZwÆ}¡‰/·–×m½x4‘ëªt·*¬ÙÕµU íQwñ¨åõõø|–¦W5uUáÔÛݹ¸¶|¶•Ø¦Zü•¬§é%$ù'øw]ӄ’Ђ™k}= Á¾èiH¨Tºf×ù}¡²D}sER·ºf®íõÏ¥#9Ùݲ%†Ín“9^1/®´ Ž©5œÕªg¢“°ù'#„”ù
+®¤ÎͲ–ÑÐ54‚a¨'øThCkH*oê’Ç°~ö|HH—ýJ×W€Çî?ûé¥=ÍñMºü°*#ŽAÃñz(ee1ºËñ qãÔö¨œìÕaZäo“,}0½«“‹8÷ùØ©ÞÂ<l„6Ϩ‹µ˜—ØÁÜ@}ˆ6±‘ã#Ž9ldóÀÈàãM~$ßC*s;BڌÁ³ì´U."Î1ܯžå¯žÑP§Tv5Åq[=û’Vl|ôàX¼²•×q‰4^£‰œ:Š”xÕ 0kÔB|:þhTJ^µHŠjQªBrÓ¤X^¯óùþ͇ÂÑÏÙSjqá±ø2Cc—¶/»¤}Éò ].˜Ï Õ³ººt—ŒU¡Üéêªò+U]M]Íáèæy~EöwõчéÃ]m•M'Ž½%1Tµ½7±˜ŒAj¥0¡ÛO¶Íè’m³êúdßÛf×õPB˛&Ôw§áX]Ÿ‚’Ví¥ƒ½¬¥°T¤ôªU‡û‚›ÕQ^íPÛóÃÔ>í@ùaë“Õ> 9ݳ󞡏áhè))†é^ّÏÊ‘5í5Xó7·ÐýpÓ1Lç0ñ‡ù4Ls1qøøþž ~Ï\µè:#3+/¯ÉWÛÁI±RgŒ•Ò˜X™WÀàöõV®aí}½ùcbí¬‘±vZ:N/Ó}¸ÆsjnÆ<S¦M˜xœ|_¯#9ö˜dg=ԛ˜o>FBˆ‡ð¹‡Ô%>Ôá°ušfšHύ/&ŸàÛö¨ù&5Ÿ«æejž«ææøèŸÙìj~Lͪy®š—©ù45_¡æ*<9‹ñSŒŸ`ü3ùsÐ
+Ù¼DFUä%Álô’>"}O¡wW˜èƒÅ…ÞJ¹7S2ћ¥Óú¬IÞL¾¬
+{Ã<BíÍ
+Ysv]˜xXזD¦›ûðT=[nMdetË­õõà\]æ.³Ž³”TUüƒ¬)ž.wà’P=}mžr]¯è+bs6w²æNÖt'‡î¬žUz,¹>”Ï*ÑäúêÐîYÊUu}ä)òDeEy’õu}\6yªr&ëç²+êë«ñhT8$û§ÜS¬@8í¯¡ŒÁA™ö×*Obp~É.çTÀ¯ÂùÊ%p)äI—Å
+°\èïü ò= OÀbD?È
+¯Ã ¨…]ÑÄzð ÏÕ}ÜkÜD?#Ud9Š‹D¨€™p„û Þ%<+¸…•ÑtZ%xNÐËqÝtY‹a2ztWášÁµ¾ ¿%™By”ý&TfáÌká6xÞ ;h ]E÷q¯ s¢÷Dqö;OèáV¡Ÿ×†«¾îÁ}œ#:b#/87oäËÈ_£ûpçàÆC%zŒ›á%xރà[2‡,¤:›kã~QÔ=„kNFïq
+½â ¿"¿'2UXÌn9øÓÜdn!µÑgþî.ä BN8—s¯ÁUäÇÈý'h&Óp÷ù"?âq‹q•k(On@^xz¹I¼&À!î<Op¿&8ȯ!ËÉîhe#|¥ÙÏ?Åu E|RôÈïÈÃädô(ýŠ£ops"‹È½¼ùòGȽˆ!=<ŽÏߋc?h±–ŽüxÒ«e›„\^…’ër¸š|‰sb©ˆdÂTš
+KèxQÑØÄaðX”qòrN~Ã@ùpíܜÀîÖ8aJ7%Ï bԀH‹{@àÃdÄ!t"«&àÑj6N#å½Ò•Ï£Âúº´¿tª|¾´¦¿Ê°.ÿ€ÙÈ<ŸÅgIÇ ­*øAáŽÿà{Pøã̬z22ƒ›*üLP4ßgzÒDE¬†©Tû­&_õRÓ·&çSyÙ:w__sþ¬Œ?gQIŽÌ#„Z
+­ÅEÅ ÙF¦Ü·éúÚçn]ù~õÊÈ RG–|IxkÛ»"c"S~9¹Htwd-Tg­
+ SÃæRŽ&Èa2«{[Ä׍5gÙ2úã‹h$V‹ŠÑ_ÖQ2Gî¼ÓõW<{k'ѬZ)ü2r rç_"M'¶½»‘¼B¿O¦fÜû¤³MÂq”>{ŸžjžšÔšÀ™ÂÑ·‚5&K¡AÁl˜9-!=©„+2—XƒÉRêé2ýbÛ„¦Ä¦¤ùÉóRÖÓõ\íâv'>¬ s.¯ɉYà4I žGKÅ.(hJÔ¯ýòQ<b y5ˆj+UWæNðßü”º›š³q¼~¨ž[ÙY‹«ÄUB,Ö¶¹@ ÆQÄ1ÆQ…þT8¬¨¨ ßétØE Ñˆ>qMÒü}¾­°:Õµcñ¢{|Ý ß?³áͅ‹ƒ‘×nºÁGwúoèÞóL{ÑÔê‚Ò–[wܟð³?,~vÁ·Îþæšm¥û~$¼‹'’{zïÔšå½fK¡jž›²"[
+-ŠÑRèf]#õ–BÞmwÓ {™\Å­‘yÙdw:<²Õ\bú±ž”ìd&;oÍÑsž^‚õ$L›ƒvóz“3+O$¹" “LåɅå ÊçÛk¦Î#U-;k-Ém<#÷Ÿ·”XKˆµ$††FÕ FâҀ_‹l+òåó.1#ÝY_ÄÿòÅ«"{ù*òêg¿"—ý‰ø\O'ÞùËþï÷üäkÊ'F"? •G¶î£ï~iÙsß¹·#üñ³WP"~‡vŒ›ÖËö$"®X,–Šä‰âD©Jžl­ç®´.å–ñ­Ú%R«¡Õ¸ÂÚj[‘°Öº)áfn‹¥Ëú¨õ]멄Ä= §h·†–Ï®;¤ƒŽ~Ük0by2˜€¸4Éú¤BG3Áaâ€è­ Õ¢\VZVZj±ºJØFÙ闠CbŽžî1)šg£ÇAÀÄGý/T#jµ‚Áh2éͲÅb²Ù«Óåv;¶™´’Ž¶ô
+â‘Ï0{þ¢
+›Qn ™FƒÏÞh “ï‚ ‰ÒõÌÀÞ* ßKbPÜ,RÝ7‡ƒ„HŒ:l¶õ’r™ _%‰öL‚
+L—èÂùÔSE¬Ç6 'uSÙÉ5ÖÕÄÎ=0<Àø9~Ѩ–êë¼ïúcüXA=J™eY©úrvž[7 ž'ZV^rd1†=,+:C¡ˆ"®KôÑØ6Bccì Ù)Úð‰z| HÁóß´OÈÈO~èXäí#·7™G…£ý¿ù቏õ½Ì]ý]7íôã;Nþ°Éâ¡ëðÄ8LÜLÉz´ªö¢¥zœˆ Žp»˜±“Ë{‰‡?ÑG×CL墉Rv¶‘”Ä!á
+läìÏ~׉Vž-r±Ûý˜/âÇ¡¿1
+^θ2‡¤ëÒõ~CzöÔuš\m‰ö
+ß"_˜¥çs33ŒœÒSü™ÎfÔå'dÙ:#’€Ñ™æu×L›7AÌÐå{9½«Îì$Î0ùY0%WÑd™•¨“ým~ꏦ-ÖBH‘SV¤p)ÏÒ5hÐd`®JôÆ@Í׍(ÑÕÕcÉõ²³ýg¶šFLˆ}Æg%,1ADŽþÄq®ÑøS3F¡¾Kc*o؝Ǿi‰œÆawù3l¨ùLÔ¡Jþ"N¾ú©ù»͸©y,™3Å1¢lmÇ.ßÓ£ÿÒ÷òÊ:ÏeIΧÍc3®XxÿõZ›ö7Ý8£úÉ­õ7ϲLÉSF–¥å·4Ê÷¸ºªmN[äۍÓò¯.$šeɸºäòyscßA+Ǔ¿~.L`B
+Ëxß´ôUŽ.Ë£–>‹f¸%7½,}¢£Ö±Ð¡Yç#œÕîHµá"­\R§ñÚ(õ°#sPä.ÍëՈ¶Lй½f½¤X˒$å&•%MK:—$$%…ɱ ¥,à§0)
+m¢zÖ¸q¢© ù‡—Õn¿üŽW§¯ÞxãØÖ½9YËÈõÍs÷,¼nî¼}ÅÑCÎOÿþ¯ný󞹹+:^'‡R·Ý¶…$\{ÓíwÝ·
+eÛJĵé9¶u%\«}Qâ]^µ<æ R¢»ÅB¯Jl•$­•ïÖ
+»Ó>\*'u´N«1§™féIZºÑ;Ù`ÞêՋ/Úÿu
+ÓíŠ6߬˜ƒ.¥̲¹Í|
+15.-c\Œ<1úˆ¡G%æcõ7¶ŸQm5ä”׌T:ڙ©Š´Â#¦‰Å.ú41J!¾¸ÏMeDÎ=·úåE¸ãùÿeúáKþæù‡"it6Ù¶¤óiµÞð鲓[ž"÷|úÖԙ^Ï÷­#ë’ ÛvíE.iD¥QŽ6»^ ^ãI&®/OÙNÙ7É°Y9E ïଧӂu z§—L§Ójaš‰˜‰Øi6gCŒðœÆ‰ÒÈÖiç:eÔÿÖN4êœÎ:øNB¤\fՇ©ýKzs;J›uò—ªÂFùr†©h&`Xù&÷Œª‹™a…‘95íL° ˆ~k‰üº(È¥¥"&†µv”ü6qAñ8Š¤%ª’D,ý\ã &?èu¬œ_yƒïªq£Šíî7’ßx»gû]í Æ'ßï5¿cû Š\Á߈”
+@Æ)Âô¶`1×kݙ.M¦×¨Óx“Ín·äñÔ¡5äBlI®M.âuåº6»Þqñs]P§†iú!ɯÈèÕ¾L¢Êñ½,g”éÐ&"ºÂL—¬sé
+ƒºG¸W¸¸¯8^bŽÃå¹£ §I›¥“ç•r¥=ÒA阕4 ð<á4"²7—IEÑÏ;ë™Ï4+ºÅb&¯£TÅå¼$ Ò7{¡_¸™?ÉS>¨7ò«´¨>yWí¸‹Ôg =€ˆEy˜֌(S“Ê2Êøà¸tµÕ[ë5÷a¯=3«?6”œ+“rc¥+*Ùhò0µÕãñ•]ò±¢žq³}Ù(Î@,?WÊì0Eá"® ´“â‘Ø
+8R8ˆT¼ø}þì‰ßÛøŒïƒhj#WP¿Š[+œN¼Y"¹ö+ôÐÄ'œÁh¤ÏÈ[½HF¿ŽØوŠE½FT,fD¢Ñ¨è$‰è: ñHŽS%]Ð\2ÉWÖåêÊtÓt¼®VÒÙ2 £e›®¶÷"ZV­ûFUZàOÇ̒F¢nô"ѡډê†ãäl߀Cƽo•_*ÙÁlçŌFÑ(GB@:F$ôúee\ޘÊôS‡? Œ®¾i"ÃÇ_o¼ÇRsÏûþà;Õ PŠ!j’U¬D‚sÐáœ&lN
+42Ë[¨šÌ®¸á,r~[Ü
+.c\³Ã`F(»ÄBuàU3¢4PV
+ù ê9¤à8ƱǸzqcz饘9ˆñKp-rïï¶ähóu»¶¾Õ1¹ò–÷
+…³®ö“+¯¼R½uùŒþX8 °-˜5żмڼÕüÓݶG¤PÒñ¤m¨R3XõÙjgNoþ܂z Gî´%°ÑÄ^{dÓÄc§þYšˆÄš"IŸ–Ä*K;$N
+mÅsc~4ù$eüØ¥Á¼„ëv$ï(~gFOJ÷zWzVéîÛ-£2+ýiëv"lˆlÜ޸ͩ¤âþ6#]­æ3P E‚«<Zt‡þˆxD÷‘ã·(i%éFÃMî;Ä;tsj´ÃtÅîÕâj]§a•[“MråËd ïð¸Q9:=v'êÂMxÜNSŽ‚Ö®ÍCå¨%‚ ­Ç)iÑ74{©ÞãÖ ™NV]uN¦öÌîº2‘=Ó<s=+<¼'L7ô&"‡3™dPòrR8-|.p¹B™@Kp ºÑ/ÄÅßTÆ´±¯ŸíX ܞ3Gá,jH4RTǤúÑ+êµ·I¸ÂkŒßá¨Vsüú´Xµ¡ýœçØkëïJÝ|ø6ë䉗ïjõ9“›¿ÿÈñwo]Xþm鯟“[Z>ecmqyÝ Âþ_ ïAœZ /8ý&Úe¤ý*²‰_§k3~¬×T’j5 «aä(á š„ç bwͺN´w¤i" ´’f6ËÀø®À¢³¹\ՒÜia¶„Ž™k{ÄNA8~ý®¬ÞTç¬çԋ»óÕx;†mçÏL•+[*>„²š³íìæáLY¼DÛLý ›/þ¡]µ ŠI:Á¾bŸH4bQOÌL¦—­¾ntd•Âr÷Ù|×hò o;½¡b²ñ®ŽþµÅMҞh4vï.¥LÆʉ…ý.wPGII“†aÑG>á @xõ†K…Ÿ¤Âß
+ü#ô;Õ«© Úk¹EôZÊÅ>,
+Dˆ}[I êõ.WwV’ƒ&Õ½º+»˜ 8ßf*;³zœ¸mkö½€‰GÕåS—ŽÒ
+Ò(x;=uG³eõ0þ£‡¸Ã0Í×Ç~+dÌ?Œ« ü·‘ŒûOãñ¿œ‹ûü?|2ÿŽ°EøV³Yt‹h7h7HéˆtDW®®Í0Úð©áS㍦ )dnŒïýÓøŅ(K²ï¿gý·Çû‡âPŠCq(Å¡8‡âPŠCq(Å¡8‡âPüÕ¿3ÁS0ðO~bÿ,ˆÕE˜‡­ÿ§3
+‹¡ËXË1uÂZhS{ʱՁu–7c«
+1GÆÃRŒ
+ÌľEø|'¬T[-X¶ ôjÌ äx¬·â³ ¶U…iÆÔ©¾oÂ,ò–`ß
+Xø_YË£J~ÞȑÊìÅ-J͊å+:׶µ(å+:ÚVt4w¶®X>B¿t©2³uÑâΕÊ̖•-«[ŒhÎ5*¯pD粶ñ­ÍK•Ö•J³ÒÙѼ eYsÇeÅÂþBh€ ntÆ<(Ä-vâ&ÚÔ­/‚U¸Q¶!vöÑóšäè0¸óïÿÀÿšÅã…
+endstream
+endobj
+28 0 obj
+<<
+/BaseFont /CIDFont+F3
+/DescendantFonts [ <<
+/BaseFont /CIDFont+F3
+/CIDSystemInfo <<
+/Ordering 21 0 R
+/Registry 22 0 R
+/Supplement 0
+>>
+/CIDToGIDMap /Identity
+/FontDescriptor <<
+/Ascent 905
+/CapHeight 715
+/Descent -211
+/Flags 6
+/FontBBox 23 0 R
+/FontFile2 25 0 R
+/FontName /CIDFont+F3
+/ItalicAngle 0
+/StemV 24 0 R
+/Type /FontDescriptor
+>>
+/Subtype /CIDFontType2
+/Type /Font
+/W 26 0 R
+>> ]
+/Encoding /Identity-H
+/Subtype /Type0
+/ToUnicode 27 0 R
+/Type /Font
+>>
+endobj
+29 0 obj
+<<
+/Filter /FlateDecode
+/Length 19850
+>>
+stream
+ʤóíXËI*cxßIêvÞ°rđ÷†ò©ZN]ò#v ûÏ]ÇqÞ?dÂîBž.!d™ëò¡ÜL–Göu’ùٔGÆ,Ô±¤¹2{€fæ9uZÖq´ËɞÃŅÙÅGûìi£ýÌiS†Á.‰ì ù&Ò ór eå‘66–VÒ¯ «GÚà¾^öêôú&žšß†Zê'ÜÔ§'†òT9dç‰<ÊY1¤^+dZó<ï°7Êâìw²(H,³V^ß³67
+¢ñ´‘‚¨èÄwD3¿U‚hÞºT:eAŽ²7óܐlá~n².½:°óé,_‘cØÄ"K]h§+oË££íwBUvmC …o„2ºùÎLoÁ‰’"…z夜|ӹҏSçåH çðb[æ#bçWÙbùdð‚|YŽ!Ð;ïˆ÷}éɼ=ré»ìŒÃŽ.ë!;¤l8é{!;Jtíñ/“>"f:…Tõ.ŷٞÜTÖµv§¯Yh¹+
+r åh“5–]Bߐ6â†&«[ӍÀø½¢â9
+vÃ1Ç#ƒŠÍDzˆTrr¤rÞ?k,ÿ†ÃF¦ïüY½óȑVìûê{i3£øê­Æx`U£eédÛ#*i A¡³,u²·³Ø
+Ñm)«ÇŠŒõ<+ù…ÑZ4*áƒEaÔbÑüXЛä¨æ`iŠ{!ىqùL ø’˜{‘”­øfYâÆbKäÔ£yJ©Ñ°ÿ£AKp†²GMÐB²ƒER†MâŒ(2ƒX„ßDsìðüý‰Ì­22q²øò=Ä:À£ŽJ±]&è
+µœ%ÿØ1æç`öý¾¼‹ö}Qð¢Uÿ©²#2ò‹íûcsêU{[”ÃûÃÄ[mQçyÖ¶(ËN÷À®´-ªqf'ÒæÆI5黢+T ¢S ›X6Õ2tÕ[ƒ‹¶µ"ëì,ÐRŸ±Î¹“ˆ abA"¿nAn01‚sQ¶ú3‚å1€ Åm 3×àBâuÐV¥›aa¶Ø
+²+3?øµb-„ùã¢éov­×2ׁÝõŒ.†Òü÷rU\/Î;äZWÅúÀc8Û1“ ‰¡+Þ •9<_į¢·o‡@—ƒ‹ƒexûûk:¼åöÍóIÒkš´(½¬¿ù
+ôeER²‚¼¡tžI8îhè N^ÑC 'Å‚óIޅŒQ:ÂpµóñI>,#¯[ „àõù –†1·fo©$>ù!bá`û¬ôƒ&Y?NJ+šeaz£?éü¡wE$Èb°G¿°’ãL4V $.ÌXø³„…†ˆ{HfpI¼2Í
+è¬Üª0À¾¼‚šÁ08’ì8¤û`9Sò…Æ{ ¶ilËô¢|a·Ê^)QH.û'‰®n F+Î'=CB‡CÙGàˆ<S|`zà±Æj=¿‹Åƒ1Ðà‰°~02g»>äleóÍ06~
+ëú+váDýûÄw‰]¸Ú>aä–Ø…ì÷Œ]øeíòå_Ë>ÑJ–è½bJ… câõ‘¦rJ`»çof]̅ý#IKfRæ%ÒÜk ÖÆÈû~†)8ROߝ™$+ü:ùF/‘sg0µ3\¤*¸\µÛ{,zI®RfÊ$”c!¤ÎˆjY"uBu܄äÿ!uî#lbŸxPàElÓixÝÍç‚(Hx±ñ3GàÒ¹ݹF„碳Â`¤ÍÚZ:SM2Ô[ÏTgw¼|ã♚‡·v¦0uϔœ´r¦ä˜]8S’ò±v¦’e{ÊBùá3=ÛÞp¦ÄÈ>Þ)ReiD¨+â¬Ì;—´yøTã’iÞw˜JN#ÍàÌônH¾Ål"ró mˆ@«!hR¥ƒÙWÍûÙ|vɼ4—†U/d0<±ymOÛ­ûò DŒÎºÙ.ÍQŸ0°îãögY÷½Â÷A/ó¬û¸ê~'çÒªGyݺŠõªuÿüÊgZ÷%õ01&ÊÙ#­ûiâÄÝ9eå•}õ¬§C“ñð
+æ9Qk,c~!˜Gì^¿z0ϵ<úÊ`ÿüÕƲ LúYŒe lxcÙJâéǍe][‚yž¯Â™ ³sÓ·T8ôž/¯p,—«¶T8 ÁÌéB…3áÚç7¸û<ùÊA €õ8˜W8›O%T8›üªpÆÏÜ8—z¼=¬ÄÒïEœÊäׄ]_¤#äš8=ë¥tsáÌy6Ñ F¢p¨ÃæJ`큓Úk)dI@„žB5)²×Â*C d5©Í€ð¼&•d¼ÞeÜÂipf+
+”:P`´Iև_©‚åØÇO²áàZÃ-ÞXŠý£º½,AÌ=)úíÊ –Vý}©œ °Å;•DaõDå;Ëåh™Œ¢þÁòº¾P&7wú»û'('ØXMo–t’XÛð)Œú²Ì—‹åC҅r‚­›=R3R[þ½9ý¥~Lé›ëë ¦@:ÿmê Æ’¸_S¯ˆ)óè«ÚKõ«½ü9ª½¼"¦Â:;
+†X#u4 È£.$KÑ:`¸ý’œÔ0‚]+Äi½Ý¥jַᓻ™Ìq5ƒÀgW̙NpCbR³n)Ph¸
+´öFKƒµåÁsÃä
+žÓcHy–ÏKišP‚K²mE¸çáÉ$TH½´µr¥&ÐÖ5êðx}E`4s/æài=k5»ý@±Y¤é×y`mv_Wöê}©IDÇݓ—îe×õ’âÊ©l:½[1.œ¹µem]Jv yº<$.ýÝ­'9ÍÇ÷•\z~÷ë’Kíz%—†/N.½Þ²á̵±xï_÷ë]?kéÔìçŸ8L“î‰9f†Ñ³xEœw^>‡õí\¦ÞǪ÷4ª÷ןö.tBÉԓ€°Þ×À–²pÚÑуQ*Nú$¥N»Y:{hjb¨Q4–QóR">qÄå‹óF¢S|N%4zê¼ÞÌqâ8ñü =8•Îóý®ƒUýÌ»#“X¯Ì½IÀG[^·ñ6ª\!}0'ÓzäˤˆÂ]vL§Ò§Ä
+G˜q±&Ì#Æ}AI†ˆS"5GŒXõæekhÒ@”G~ˆ:Oóà>t–Oª²åz;EŠ6Z ©d"#od²išèþaGחàý®Š¼¿bçò «¿ë xTáÈFøLÅNh;kÒªoËb'Š÷-óÝ­'9?¶Fè-ù¿$Vü óÁ"p¢pÓeøInt,'ZøÏÿ=wíN7&Xoø×åÿ‚þ£zÝèø9ù¿ç „ÛØ·CEãH–~ºÈÌÿcª?þk÷kª¶éçŠVüÇ.V
+ú®£SŸã£¾ëèÔ1gƒ¾ïèðs|Ôwݘ
+ÑAßwtÈSø¨ï9º&…3Æc¥¯w>ê»OO;ÏÞw|]ÿvØÓÛï ã¾'>~ïÙ•’bÒH¿ó„âfú_¤#QRö¾C\hXÉÙ;‘7|šÔÙ>pßed2\#Ï»ÊvÚ®FžwýmWÍç]¿§ä8€¤ß½P…Ë)FQÄÔ÷´bt¿ïÑvõòÝw|q–|Zæ"ྣTâíªñ¹ïÝä4’2ïîmÁõ˜k•c.¡ sÔ¤
+Çbml¿7b>Vk& A¥Á†Ðá‘¡m*>¨a ‡RMó9¡ÍN5 ¦éÊ¥:Á+ô#¼B?Â+ôãÉípÐàÎ?qD;~D;„.™üI‡Z Q×Iݏ•t1@«“œ|ª….B±)×bµôÂÕÅ"Ò1\ßaE«a°ÊìÝRbuR×nt;§?­øÏÃߚ~:9ÝsßC‹҄[Îñ« Y'v¯WOÑÅ?t{`Ô1EZVË°˜éµ"".ÔDËÛ
+NÈÃóå}—^¿r
+ÅÔ~ÑCù%OºfŸ«C-tTä†h0ÏòÊókR߉#)MŠl§ø»:zíš&Õ}–&5i6ÇÊzݧkR£øC^šTx
+ùºlGÜŽ*)¯vþÁi¢HË:?M¤'š¨ûUÃsl(6~Ä¢ðŽ(Øä´äõ˜éëÑ£ª)RDì€VuB5ë›ðÉ8ßë0á“Réƒø$Yv‡˜tÀh¥,®Ÿ€ \ßò ³(à“­ƒ ûÜ
+á§Âøpò¦—¶E
+—VD£<y_~GÒYr
+)3DêyÖä#Ý<kҕæJFÒùñv2Þy®:Ø©rø
+MŔƒù‚²s±œôN ^£Æñ]15Ÿ[D­ ˆ5Ǿç?F»ò™ü¾#ÆfD}É°@Nš_AtèHz„2gÍàföLÂù+ ®Uy0óYä¦Þe'É)ãER„wk‘æÊæCcyßø>—¿»„y
+£È©#1™ÓK?u„’DqF“­S§‡äHˆW_„@j²%7ré>‰F{³éì…ûxĒÁ57bÔGM%Û5GM•Ÿòàh¹%ñ먽VvïXY‹ÐØ8Ro5>uXáÁ”)֍ܤÌù`GŒ– ô7ÈöˆÂE`ƒöVëÇmöp|£±X[„6E fÒÀþP(É[>Lû°¥pW«LãœH_|•ø®ÐPœ’#‰¨%æùHé“t2æ®ÑC[=?Š¹®¼ËY*b-ú_kõP¦ç,{µ–U/mg%JË;÷²9 8‘ÆÖÙY@Z$Q™Ø)óCÌ7¸šsD£Ò?̬Ž‹ÕÁڐÔ$CŠ
+ÕÔeTéÂð ÑHÅEÐ ªŸ²±oÃÀE>Å
+÷¢Ygû
+ð®Ã¾›\œ úº}Xã–o/@ß«]œDMôu'fô%6
+â©[B¾Ò\A¾ŽT-¤P
+x½òÎ{Oä+ބ‡"ßÎÊýeäÛ»½Œ4P\ºø#/Iè¾ù&§–ä‹xö+€¯—êä7¾Áé҈\Õ¾
+†û+¬@\#{o“)•iä„ «u"¬y´BÞçaV: jžZ[i_´EÀ>fC#\»ÝûC‹ìþ2ßßrܲÜssŽÊùϚf£ÔÌQ)œäŠ•Ñ ¿ÂßæÖiëßâKu÷¨}Ínõ¿Q«;×¾jLûà•”Ãj_͚®®}•­ØEÖ¾Êí¡
+sA…$$‘T÷P.¦(—=v–e’Üxãm‚{0[öT7ld„$ÄMP{9U_ÌpI£$jŒÇ!ªX
+,XëÀP}=º^Ðwñ´W£Òƒn µÊó‚©=NÕ¾;Ç jr©J:Ê°Uށ¯î”Hnҙøyt°jċUk¼ïÖ×#H„ß OÖ$%ùˆK ©°üä#d¡I]QãêõjA(Kjº¤¨ÌÝX*ÜCtUwkRšGy(/ú{kâ"Ç ~TûföÂçU)ß½[-¦Ib¦ ,;«SAâ-jU“dÄY¼pv‰ç†eGVèO e‡‡\Ø!Ä:Sd6@aٟ‚˜G óô–'WV×o×5þW™ùML²•º•¹­ã7Ç£ž§l¯³õâÖ.ÿè0´®<9fÒ$!ª‹«ƒ£mš2¸ã÷¥@¾ȗùü
+á`÷2ÏÌÍ}Ä<ã
+ /™g\Ô5ÏpqJ
+/;ÒíHC>ÍDsÏðѲ X
+à>ïu6FùUÀeû¤ì,"Ÿ ;K¦ûnÙYBûPv–ðGùæ7ÎÎâ(h—ì ˜åæ:<Ä9s…˯âwô€Ý4;sæ:ñ¸°‚)øÕÂf¨Ã#ÄRtg•„£±@u„°Ï|C˜7óIM®«VUR¯‰™6)]›:<›s¢¡bx*[E´»–-0úí£x¥WÁ­ËÇû©+uçBAQÑìb~ïÁF7ÞÇ]£v‹uxú짝ÕáauÅk¢kÖ4Ú7Zž¦ì¨'÷‹Úâ­ ñ8­¾F£œÀi7›™Û©㘿g"åËØó)ŸÈØóU‰”/cÏËØSÿœ‰”Odì¹"å÷5ö*ÁÚ¿‹/u0´\€,ºäjP¹Ý…âBÉrHAfP´ J2/¡f{†ñ~ ç
+¬T0EòX^™µ„éŽÜ±bíª‰T›q ±€ù=êöfn¸j‰Ý«³LV½¼´ßÕ$MP©X¢«5ɯ$³Ú\4Ù¨øHçί‰×¿æû¨¾2Dœ‰˜j12gƒ4ò †f(¡î^2=uO]\@͑LM®'S/õ®ƺÃêÖÊGeç­
+¾5¹tZk7R(XǬ^Šì±ºPÓH†û˜Û_©fÄ~®”Àà‡±Pj7Þé¨à¢·ó÷;궕~7óŠ8ƒÌEO.ÉÅÑá8gƒµlÖ$Iǚœ©^Üý¹z™L¼;Š¦”Ì@p™AY»dfð4r’Ž]îÑc†Œ“­$fiÞmÑ]DÆ_რl3|þËÅk¡bÁ½yžÞîp;Uۜ:Òªö渹I7Å®t
+Ÿp Öu,:ðBÜöT¯€ÐiÖ  XaGр~q³¯‰™l-·¬‹£Êýö¹OÀŠgTO°’É´¿VÂÂ\så®ôWi){€n+-å|fßý|¥¥f®^¥¥Â­¥¥PÊ<ci)šR-”–rÑ)hYJ„¾JKU4bÅÑWח–âXì×*-u!¥ßíΟ¤´TLùë‘} p‰Jàp¥#LϯÇ2qKßÍöt «»±ò' P'þvb³@|‚œß±sXéèERF¼ÌÕ¥ÊâÙ”$s%•Å#0©,^Žþ<ŒNÄ<ÞN)l]Ê_ϧH)’:•‹_ÆJÜ1›ÞiÖف¹FÄËÌ ‰_ψœpzR{CˆÀr¶~^® tG%™œ°òàhßÅä¨"Ü Gí¬(¾TBÊBȦ^­ƒèˆ”!egD¡Æ šòà5$j‹Ïñoogš–8ï è)T„jÅP*«O`<ûaPÄpM¢<Ÿ7x³¨y.RIêÀº¼)½h}CÐl…]|hšF6‚Ï»Q˸N땑’Ðg‚7‰Ñ£ºpiUù>’P=i­DÄf×â&©â˜AЈTA|*ìo´§÷… ²uAªˆ¬pÞ,+VXé¼3Ù­‹ù¨²¬‹`'¥¢Ðê×[ƨ¯CIþÁÞ6G¼mÆÊàîR:kO¨ôU*…Y^C2ï–ïºH*T85DHNhj5Äåã"©”Ôë-üT–{ko.}ˆâxïZý±Ê™»ï%w~³Ho—þ²½êš›E¸S–Þ,Ò5Ž„eÈf*)õ—¼cMLe èÕFϨVa¢iûä»û²=9PÑKüÌDDKü­…Ù«6‰Ü<°;ŠÙ—íåEûâ´ï—íåE»§-wPùç¶XSO«iô©[kµ;Õë4jêÈ5:uVÐʤ؜{)¡L•òÔ¶À 5{
+†šFÒ)ü¹§ET œªCM]Ö*¾„¤æšÄ•Þjê}®!h
+ÁÍ£”Ålãì’Ì6"j;%kç“è;e¿ˆöAT®zƒ¤”ÕF_GR’׺•û¹&¢©&Zr:”À)! ö\ô2[D#Ôù/H—$9A¼˜2)ÄLôJT*ÑGJ`ˆ“«h=ÙĈ¸r0n0rø<ZéKR;‘ÛenQÛ 7´«JQ"1h‘´4Üs$¯ ¿ë¨Ùìp>‹ùUŒòUŒ2­)¿ŠQÖW£ÌîÑoTŒ’ådçà¿ùk£Æ[%IPÙÖ/«dP»àW·J¾ŠQ¾ŠQ^e•¼"SkLoÇ Éfjüc¦–ú3µTS,Së
+¥Ð4­<øŒTküMÿÔ5GKÁxHêê$©k\۞ó½>‚|!67’z—ˆ`]µõÝ­2—c¡„ƒV:썸:Ið5žþs;ÞIҚáUßRš‹)°5Ñ`kW£T¡›Ávª&a+õ¦Ò\“[Ksõ֜S­°‡Ô85gɁ
+»¾‡ ÿ¨VnØù™7ì’J·Ü°‹1ä£ý®ÞæŽyÝvÃî`›û/†Ð>ÿ†Ý&6À1_5°®›³ÌjÄ<øZb!m¿–Ø)FDª¾òZbÂTžçZâ¥ËD ” ©0š×µÄ!Ü£>fÓàm…ݽr ¬W›a(Ì?³Uç¼O×œ#®’µ$–ñQ¾OnmÀ„ŒLU$Ìï6V+Þ%]é‹_–ïŸ@u¸G…7N’ë¢Å2Ò’]<è"îqFÊ÷QYW]ÚGý|;gº9E1”ñÃò )Z¼Tì‹S~/äð`²›cZ2’íJ&5¸çŠ$5Þµ(TÄL‰(àÛ¸Épúê1"³pð:R—è¸ìâ+«)*‰è¸äüg¢ò'оϒ¥}¾Øw;ˆÌ,ÄäA‚e(™˜¬#  )¿Ò˜Ô2kmcÿ‰@CpIzO¡Ô†Ù,1m£<›îXÕE]ùƒ[骎ٴ¼’¥‹3XÀ‹_H¿!Ã"—(ê]Qå‹þ­$óZ6[™$³Ù€ʚTª0ž›`é¬8®tÝ­b¯h-çZº(.[¹M*•" /ŠÏ>š?ÄH?[¹q t~Ö¢„Ô°{AQGijµ³Vê®FVx…jw0W–#¼Kíl™
+QfÖ—ÿŽDã„V¹¤Tü.‰.#ù¤ª”z¸£ÊNuË«—½lÇw´K¼C$¸ÒÁÂÑ®º¯™ « Ç˵¥tta…3‘±{»ð Â.,UCJú{c†.]š-%£öD—KŒæW_*,ºh{+s*`oåä&Çg­ê‡²׆»4-¯ä·~Rfûxðy´xM[ùao~菢 KÇ°)øáù|)BˆwûvTàã혻ô¦^_t\ÙFUÏÕê€AÓPe¢8¿j>j8ÁëŽ`õ]¡·Xƒª„ªșšI‚£}û¦þ¸„ãÃT(9x½
+–ùÄ÷c¼'—ÜàÊ©•¾²,5-µ(N¢×,6Œ„ƒi&ûÁ-ó•8U{=æSÇi!F¹<¬RK³†*p!8*Š_
+_…Qòü¾'ãò[Nõ¤°œšíI%:+o7æs-ŒÅé?ÊkS“Õêè“H8!î€l€*ñ©«-…±èí £]Æ'–!#Ð\ҁ“4%MRl¨Á•ç]u,:1-D£6”i¤5×|¥yŸbª
+3çø=Ú¦\©ÑÆVå4Z1)ÇØ[\¢”XЊ% •T©-Uª;<çÖôTÓê¸ÅšÉw©I¸´¢‘Ñ(MÈ5œú¦(ñXze¬¦ÕjPÿ•k-M¸’h-ú`I‡ ns1m0ýÇ’à²IRÛz‰ËÎ
+{å;·žÝí~Ùf;å£(ýû@#š
+ƒòç½@³[\Ð
+ØZ†Ý$0©Â뤠~4±Ø‘¢á$©Ù¨ù-g?« ¤Ñëø‹wznlUœO ³&&èO
+-qý20êËÀ|Êg˜Û‰ÖãÐßųk=WŸæÙeén,F­±ˆjѳëÊ?^ ;Bæ 'ž]A[—<»î@ª-L£OßàÙ%e½k’2RQ™¸O™óÕ\~¶ŠÁWfÞÊÕ¢UÏ®µ#òV³yvWQæƒ=»¾Wܳ‹¢ ¸c×Y©c×%âU<Rr¯©óv"»ú¶;ÈÚoi‡‹(Ú¶…ÒÃp…þî›ÐM=óEmÛ%c ¯ —í·ý.¿ðíc¯ —Çg¸|óÛÇ^.¯ ÃUž;ÃeÃíc2\.û6.m
+…;¬æ.D{ۀdŸ“\qeˆêD[pî8Yýîh[”¤fðï
+îÜBŒÔÙ/gŸ;›U’í<¼ìõ£ì3"ê¬Ñ`*Ýñ`2ûêÚÜ!dÏLGôNg1³ýM®ÛÓh\sBõ®'‡·q:"9~ô„xøbs°ÀT-Z“¶·™‚aULK^ÔÑ[DgvJî#×â;u*W²ïrRE*Ì6-·+E‘g€)"T†‹V']I’ÂMÉf ryëJƒ¦g‚_¢cqª¶ÙËÈûM(­å.Eª£MF¬‚
+Šøwö aVéì¸ÁŠëÒ
+¹¥©ÒÙq¥œÃ`md6+,DÔ«­ ¹!ëãع]DÔkõˆß·ÒyœåH¶Ö6A–w«bR0ÅÃú…P.hµZȀrÎÆûg@+ó+ê<”ÏD‘w,Ízao6îÖ®Îñ½¹¬ä-9´Ü®£zŸÛ…Kz)¦¼®÷ùÈυ„ÌÛÚÆ÷;?k{Æä÷*¾ˆˆÁj—(¸± ²ób‰Ð/¤Dõ ä7vò|!ÑEJ>¬½pç"IÀFòNŠä….’ÄϓHMç\@C÷\ç×½ó¦f&⪃ý6Ìv¼§S™;Ë͈£l™hZ˜Fìòî-U«™‚}^ªë#ìÖUéK>Ð詔ó1ÇtŸ;NYÿ~š¸ƒÏÈEúUânÎEzżâ숟<îàKs‘<‹yÅ„WÜýú¯wÛΤXBôåm¹HžV¯e'Õ÷MEj›Å¶œóÐDˆÚ6Δœ;DÅnèT¤HZ
+¬¢ê¤£Ø¬Qu*’ã–õÕ©H4ï螩H°‘ûPqÿ¢m±ç>pc‘—_fêן·âër—Ís–ߺƒzvˆ>êK*̍sžÂšøµƒT$t+ÎÜYOöµškuc­ˆ–Lp`&9éʵ(¨+û˾¤Ÿ°U­U±uޒ jNòZüéu¯ÈËž
+˜é+
+ s Ìm¸tÂJ^P.¥U,*™´
+É,ÿ—ɪHÍ=£L˜}¹C?Ϻ¡4ã˪ûôr‡ê…}¹CÕx¹CÝ£/whýr‡†ŸÂšÚ¦Ð^¸—îe€û) pm N×[K6:ìwè…*:¤Ÿ°ýŽÝüGü {I\¶­8ˆø,®CÈ”¬)Œ8*zïÁÎ؀jŒøސ+A¸ÂƒÊ'¦ÙÅ O™†B,
+·»MD]):’ – °¶2“´E+J§Ú_r›(4/äÑAcþk]g•Ø=v
+4G©²X(˜‹víLŸ(œˆD {E\NýÄb¢ÚÜ„VÎæ§f‚Ý)\“KR•¡É%’éeD+3r8ˆ†£Ü=ä*“[0,vˆœÜ Ê*Yfl<F¢÷žO;Ѥ—*ÙØBoÉÕ1{…EÚjo‰¯—ҍAÄÞà2ÚÀ²ºE¦\fç–4âG¥j^]¢‡¤jºb<•Î³/©š«•wðZè;•Ù)_Y­ž#&thõœ{gòm/•Óö¸!.òž½ëŽL*¾âb7ÌÙøà²ð.§“Ä•ü}÷ÿFç«Ô
+endstream
+endobj
+30 0 obj
+<<
+/Filter /FlateDecode
+/Length 9790
+>>
+stream
+–ÝÞù”lj¦Ë Û}›Æo˼hl®&”•°û>1Øq%Ê0Ы~o3oÒïc’ØÀ†9À¼X>€áy#0¬94 ;[z×wV¡À8Ýò«ü8~[BÝø#m„LœÖ»<½´P¶ª ì'ý2èe¼´}¨7—Ø”–-Ú»ßw½Ëò¿¡]’ËîÅöÀØyi‚òªã¯âÝÉh’mQçéê>`-ß"|)à…Â/X7ÚbœVé·Ýßvÿ;œ1¾„h».?Bòû¶þ…ÆÙÔïãð³Kͯï;ôQœ€Ç=ìlì›þ÷N6‰¾ä= `Ár j“E+ [ۂ€ÆǏ>A½(5ž™ @§op\ €L‚ì01ÊãWûñkç¦GƒIA¼së“X„lå8öt‡Ó%¹
+Fùú°3x”
+´´Ppä°7þð1ç3n:7ü?Š›…ø•œæ•]Â$¬±D4øÒ¢Õ°|ˆ‰]€
+™ÇäÈ|9@61è2n\"ߖé`P²¬ß‚¯§oma*ý8µÌÉðŲ§é
+’…©SÎ]Okì$dDŽZp µTæHh¢M [( àÚ&ÑIÇ  ¦kÀùÓ8@`LiDGà_ ác²âÅÞ3–g _`!eÌt™f4ÀT7ʯ¶ÉÑ`2®Nƒé
+ÑÒ¾P¤ŽsSª&ôžAµË'€$tB°X:ñœt,–14[ñbûý)¡~…¦¥èd0_KÛñ9­DNܯ"lcQ›Ëü„kÜd?Ên7Ö\“Õpú.ìãQô<qú|‹û §Ç+gåÊ9¾¯˜go*¶µO bc¡c%S½k*¶å+£ªØ™nT±¹ÿ„*vR–}S±íÄZ"â–÷þ¨cÛ3q;6ú7¾y:½4šÊ¤¨{º…
+†E¯ô^:Ph*»…‚ˆ§dñ”`ö@[z/a[A ÁA¯*ÖQ£#’QPNÓdb6áÚ-h²u.ä†Á„°Y Ü`BK‡%O
+,  Ã¿à£NŒ¿Ðì°dÛr}!o`m;QÌEDI&[Ó TÖKŸ×\WÖ²[ª&tüE¬ E•K3’Ä(dX{ʅ!Mª É:ƒ"•Ë®a}TÓÑa6€´¬†xÎPÈÚôŠ!ƒ|Ô'Ù'4c#„tZÐ¥@§íùžÓÞá(ª§Áj֐ƒ“•¯v¥w×;Ü»&ÅÇ$aBC sÇBþÂãfMfì¹½†,bËÇAñ³|¾P
+êíy©âš®½® ˜ƒZ#»$aA[LÅNBžnÇ¢ ܾÀx26r
+4+ŽÀxbG½r
+D¨†}=Y~^pá@<^q4Žn´T4sbE/:.“+hÙ¨Îó)š§P…Ó«½X´éí?"@} CߟQü¤Öú‘¸¿ï¢<AìAA–k
+åb€"cÃޔ\"ó•lqˆ6 m¿Í"-rȄÔO:û‰-´bÍÅÑÂ>|%ú¤e ½t¯¨RؗŠ†^Xvf_b(°XÉ»¬ÌG8èràW쏊ÿD±]’H%
+¬eÓ œ8vGNƒ
+ÝöHˆ¹,¨ˆMD™ù:ÀT‚$5^j°•CчAkŠbD”%‰È\$ë¹F­À’
+[3HáRBí"lE}qšK5Ùʂÿ(Ìçô­ð\*>岕«*½BŒ.E1¤ ±$‘ s•%a“í¥M”ý[¬ç
+º1«LÉ/kî•UvS>Í]²Ê¬Y#«L€Í e•Å0°ënÐãíÓTpbnLS²²ß‰˜&xõÓcš„œfž5¦)ÚÇKèJ0KâÄ­yºº#ç Ýq|5w©û Ð}ZBÿܺ­¦Jè '!'b Ýk2²^÷¡K¦Jè
+a/@Îb„@|B‘‹xŠ<…呬.t/w¤€4û«ª¹(
+‰-oé14Ÿ£{Ü»Êã4È|0Ÿ¢å\©Ùò)ÖɧPRI’O!Ã!¬¥¬Á½v:E²(x+ 1oÍp
+C·j[ 5|ZôÂw(¡v[a‰Ìßk~}áj·^ž»tžT÷ÉÎÌ Ha«;3;ù­ðZYwfz.(¿ª3‡h• Ïvf´HJv•æÌT"ËþÎ̌S>÷Ê:-F§ۜ™Û•urƒ7óúª7óz]ÿ˜ãÈ×X]ÿœÐµ¸¸®?y€Ê÷Ó¦žº®o×¼ò÷¥e^5¼Miá“zI¥eö•¿7(-’ülJ ëök+-};ú[¾D˜Åæ{Ù|/LßK½¾Ææ{±›ïå«û^îV èKø^’=ã¿_Õ>™È-r¹
+ä¦t:E]§ÑàãH˜Ì¾ž²Å8ûNsja ‚!jëÚ°Œ^Ç%@Ô$Îë$ÕÞ´ìEØM/$ìè9x™e™ åþYªõêwÙBŸ î•5/ŒrYlC2H1~Šð Î*UKÄ(÷ܜìÙä—QÉÅV4Âò%Á +E#±Q ¼ÍD"ýœ:Lž›vÝzŽãÔ[ñK0W–R!bځÑЊœ–˜§/‘lFƼïäLî¥äÓh¹+ÔZ‘¼¬H¸Cê;½oPbÒÌ#—r0s
+í¾¦`(ڄâèö #^Œzà ¬ó":äPä-Ÿmæš%TŒê6?µ„™æܶ~ò3£¤…ê‘V}׺CZw^Ð©k^°›Ú)-(©øJÒÎ× ÔM-
+ / {Mø5f’¼›_#qˆÁå#‰_c\½ýc“Ÿã×(jô8Œ)¿Fà„mókŒ°/á×PJ¾–_£Å¥ö¶Ì»-ˆUˆt[æ¦%wb•ûŸ0ˆ5qt¸S«X‹Å´-žfçükÚzþ`A¬›­g³õÜZ@䶞G±¾²­ç11¬_ÚÖóDõC^ÄÖJj¡³Û·±ïs\5:«êB·’q`üŠ¬Š¿Pê®Cœ-YÅø[˜¬¤,ϕ+ÛºL¤5&sÁ ¨ÒG¢F¹º$ˆˆÎ+Œ&Êj£åÎ^|+0X˜4~2$Á]Árn’’}“zógÉHøžakÙÌQ_`Xœæ0âaYÛw$èDÈ«êÎáîÑò$+^IRÌôuK»(ÉhÔ£’r±Œ!äÆÒcÙûq¥áëÅg‹h.¬Y¯¡Á˜Šº•˜nI拡e³]b˧lïbzÙ#/øfõÙ¬>B¸Û¬>›Õ‡ÐºG¥.ßlõ‰þ´¹Þo×;*’Õ®wT"õ?ëzG[š{öHýK9’­¤ñ–V¿¥Õ7[I㗰HZ>fK«·–˜tÆ¿kZýýM’[Ick×0I&€=&)¯cFOʋ‚ùß=)‡
+eõ¤¼Q,CIy ©õãÌý’òÀŠtǤ¼Ö³i`¶ü
+a·Ä ·–ç
+&T,
+Œk`聬Ï]c d d}î
+d]`ºÞYO¿>/õ–[ k•Õ·8©o3NhjV
+²ºb…#suÆ(áÞD–¹bßÅÛjqÕ໘@£n9ƒ$®
+­å¶T>z@ñßÿÔüc®˜ì¾F—óŠVè}µpæ†fí ‚ˆ‰B)ØFätn­: íLZáåÅðT¶åÒ°f(ãócºF¶0!@cèš~×ô{ÍýQ~qY¯Ñƒ„&Û|bÄ>“~P$`a{nYÁï¡Ô“37ð¸"']ó{X£€×O›/VÀÄXÕb…_U’ÌtLJˆÊTZ⪙ªàPø5¿‚‡Q,8”E°hƒ¡pHB—ÒìRZځŸ¥³#Ç¿£ŸÅK|žWk\ÍȌ»(ÕAt]HuªÄ²Å}¢iq8X®àÎÙU€%tç°Ãҟ—¥/{N¦1*AÒ®çÆ"‚J-ñ6J“$H—èðEÝJdô,X\ˆJ
+ Ø*œ/r‚ÃìÈ
+‡ª–Âí~aÓ²8ÄÄS¡¾8mZn>RAIš1u;²çj3Á‘¹vdÍË¡†@—ãÜjú#։]Qkžcæۑd¤y݅ž@^·ðˆHMÅñŽÅ…‘‘A¢º£(‰l“…TÕ}^ÈÛ&,T˜©DDç@-äADµb«•Â‚&«xID¨sVð×*¦õ#«iœ1u^ÄÁb$‘Ÿå>HÜòò|î€.wô®îq9̳ºDa¥îQ偨*™Ð9îQ×xÊ} ”O6J½W£#’©ë{/é>ašKa÷¦˜.pD¡i<Î}03~yú-lÛ=Üu5±ºI”~N÷AହÙ}‚lèF÷6AÔà/ì>€±ÝÝ}°D
+ʧö|xä}vZå>;š’ZæT&oæßg;ÿ>;裗ƒÁ¥)„ „ç6]E›‰_\B5OŸ]—†!v}Ÿíš¸¹$ϲ,‡n2#á"|
+F`1̊†ˆð¤i†Èš°2cïØ c”;®JÄÔþÙ;F©ñÿ¾3J£ÔjÐ֕+@šh/–››Þ4aOªB
+¦kÇF[ú-_iÒ_÷aaùJºé…fk~~3þtÃÇÙÈ{ëþ«ù寻¿üò„DZ÷Ãéh‡%Ïn<ŽmâOë¸Ü/a__«øÖѓl:‚ºd$.?]o~ÐÙÖr<ø³8qd$Ñ[tjÈ,ØñlqSlN‚v9FaÈ!úñæI7Ó§þÊÙ¦r
+ç§ý;}ê„üßÔ%G©«2ñz¬‰'u#Õi–ýþF1„´Ìö¢§§öŠE ë­Ä§&ïݺ^µqü ¸«í
+çRÎgªOvˆª8ÑÕ$6ŽÚl_CŸ0¢ÙMn«¯`ž0[v!cáu–ì°FŒªÕ-AœªÄ-6_Š ÓR#=;ìd…:Õ¯á“¥kk›[×!$‡¬jWŅuéá ˆÅɶLK½ÂÍ߈"?ð¦_Õк
+F,Í9Ùጟa Ç̚ÞÄ0Ü4} -w•ö¯ü*¡ž~×wo~’|²åÉ\<©Í«b’›^MÿímZcbrŽÔ=*²_±§5 ÅuûÆôÂÖєÑ1·Pr›ÖèžÜj¾éÈìÜ4¦0Z[7W]³ ­Ž4MUÚeè[c-õef,Ó¾ž¼|4š´“óãŒÈ×¥›ù$WîvÅÎ#)—ÇÜ즗ªb“„QJzæï {ÆO†à›+aUS°§IË:Ó²²ë÷¶íû.Ì7貘Ó]„â%0ü]ká}צ :;`(nCïn‰·/TF8-HîBt'ÿro]\>ôÇÅÿ؂ÄÐòþ®ß'Z@3wî”]×'²Òú»
+ŸjS§µ¡¿«ð÷©Fì};Š¦¨m]tmÊ@c.nïa¿ÈF›ëÛ8|ÓuJ»ãÅf?µ‘Ç$ËStÁÀ¼DÀ²DÀß5ðûD µ‘¿]K8ý÷¤ÿ¿ÿýÏ®ÐÕæßα¶Íÿít|ßWRNü°ûûÃےûQÙx'ð¡¿K0Í
+W5Ž)×íQ?â”x¯yôõv)ñ^µ?µ]² w#mm«“¶¡¿ËÍëîf˜pqa†ôG…‹õúSÛ¥ûw§ùH·&]àës{ĝЙ_µÇaŽ—kHž ¨»ì!îïášýnˆW”°5Wt¢á÷)t:÷xé³u]›uÈÔ£A§sBý+?ˆÄ]s€´­/†?Œ·ü1uoÝøÁÙ„,Cíwlò¹bGÿFLìaÛ¾¥D:éq/?X/ØpÕÆ·S|nקž¹–>¶²4XæZòyX¸-܀ླý ’•­8Å>{䧙ƒÂmûaä!ŸÒQ°˜‹Ä øý´Ñ·!<×<n¿ÔБËh;jœoû·LP GqÚ ^õˆ0óz®ØŒ™·„{øB8Øï4nTùa[û·º/hºǬô®¯¼üݽUˆ•0YD£*ê#¤q/.‘w±õ„ísaë ‚Ù¶gé:æ%p= §ð
+w%eHV)­£Á ÃßØ7öèǝ¾3.j鎫ÝÙR¿íáãxˆ¶V¾Ê<l1ï9ÃO]í{{üñÿÐåÞ/!÷æ|45ED,=:¤G)ýýJ¨Z%ð…Ç$° (qÉbHâ«Hôûµ ')\ÕS—¸ÌÉÆM¤6ön=šµ'#¢õ*¨Ï«­tyP­ÂÅ4|{=«÷m¿w}ï]9ñÕÀ3!Øz†~º¢1±æòQJžz×¥Šfà(*»–©‡ö„ã^'™ósíEÌ}¬í‹ ›§2|@ËxÚO$ÀÝM§úd\8šIE‰Å¸ùô¥O©¿‹C`Xì~pŸÜo3Œ™c½¦ Îh—>Kê}Ü4¡MÚ4¡'ӄRŸG*ÖÚ|t]‰Ž†ûø¬2–ïÚaÔÝÈT&4¡c´«„T¦P—ÚÚzš΄ÌW’Òx:ãôøÎI›<£º’2-Œÿ¤@ƒ}KógTÉ9a
+"ðXáÄ†%‹WMÕþúTìõÖùrðZŸœÛ'p0mZ?þjEï½¥3o>ÙtÑ·Ç3>’Bu>« LeŽ(!¬^h†]É@p¬ÜwN´þT_>œÆ‹œVyM¡œµÏÝ??[Œf
+ˆ«PcYæ:MŽWVS›ÞKºí¢¬.[}¼Í¡:ÊJ«èßvÿëÈ;
+endstream
+endobj
+31 0 obj
+<<
+/Font <<
+/F1 11 0 R
+/F2 19 0 R
+/F3 28 0 R
+>>
+>>
+endobj
+3 0 obj
+<<
+/Contents [ 20 0 R 29 0 R 30 0 R ]
+/CropBox [ 0.0 0.0 595.32001 841.92004 ]
+/MediaBox [ 0.0 0.0 595.32001 841.92004 ]
+/Parent 2 0 R
+/Resources 31 0 R
+/Rotate 0
+/Type /Page
+>>
+endobj
+10 0 obj
+<<
+/Length 1193
+>>
+stream
+/CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> <FFFF> endcodespacerange 62 beginbfchar <0003> <0020> <0004> <0021> <0008> <0025> <000B> <0028> <000C> <0029> <000E> <002B> <000F> <002C> <0011> <002E> <0013> <0030> <0014> <0031> <0015> <0032> <0016> <0033> <0018> <0035> <001B> <0038> <001C> <0039> <0024> <0041> <0025> <0042> <0026> <0043> <0027> <0044> <0028> <0045> <0029> <0046> <002B> <0048> <002C> <0049> <002F> <004C> <0030> <004D> <0031> <004E> <0032> <004F> <0033> <0050> <0035> <0052> <0036> <0053> <0037> <0054> <0038> <0055> <0039> <0056> <003B> <0058> <003C> <0059> <0044> <0061> <0045> <0062> <0046> <0063> <0047> <0064> <0048> <0065> <004A> <0067> <004B> <0068> <004C> <0069> <004F> <006C> <0050> <006D> <0051> <006E> <0052> <006F> <0053> <0070> <0054> <0071> <0055> <0072> <0056> <0073> <0057> <0074> <0058> <0075> <0059> <0076> <005B> <0078> <005C> <0079> <0065> <00C9> <006A> <00E0> <0070> <00E9> <00AC> <00C0> <00B1> <2013> <00B6> <2019> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end
+endstream
+endobj
+9 0 obj
+[ 3 3 277 4 4 333 8 8 889 11 11 333 12 12 333 14 14 583 15 15 277 17 17 277 19 19 556 20 20 556 21 21 556 22 22 556 24 24 556 27 27 556 28 28 556 36 36 722 37 37 722 38 38 722 39 39 722 40 40 666 41 41 610 43 43 722 44 44 277 47 47 610 48 48 833 49 49 722 50 50 777 51 51 666 53 53 722 54 54 666 55 55 610 56 56 722 57 57 666 59 59 666 60 60 666 68 68 556 69 69 610 70 70 556 71 71 610 72 72 556 74 74 610 75 75 610 76 76 277 79 79 277 80 80 889 81 81 610 82 82 610 83 83 610 84 84 610 85 85 389 86 86 556 87 87 333 88 88 610 89 89 556 91 91 556 92 92 556 101 101 666 106 106 556 112 112 556 172 172 722 177 177 556 182 182 277 ]
+endobj
+6 0 obj
+[ -889 -211 889 905 ]
+endobj
+7 0 obj
+889
+endobj
+18 0 obj
+<<
+/Length 1319
+>>
+stream
+/CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> <FFFF> endcodespacerange 71 beginbfchar <0003> <0020> <0008> <0025> <000B> <0028> <000C> <0029> <000F> <002C> <0010> <002D> <0011> <002E> <0012> <002F> <0013> <0030> <0014> <0031> <0015> <0032> <0016> <0033> <0017> <0034> <0018> <0035> <0019> <0036> <001A> <0037> <001B> <0038> <001C> <0039> <001D> <003A> <0024> <0041> <0025> <0042> <0026> <0043> <0027> <0044> <0028> <0045> <0029> <0046> <002A> <0047> <002C> <0049> <002F> <004C> <0030> <004D> <0032> <004F> <0035> <0052> <0036> <0053> <0037> <0054> <0038> <0055> <0039> <0056> <003E> <005B> <0040> <005D> <0044> <0061> <0045> <0062> <0046> <0063> <0047> <0064> <0048> <0065> <0049> <0066> <004A> <0067> <004B> <0068> <004C> <0069> <004D> <006A> <004F> <006C> <0050> <006D> <0051> <006E> <0052> <006F> <0053> <0070> <0054> <0071> <0055> <0072> <0056> <0073> <0057> <0074> <0058> <0075> <0059> <0076> <005B> <0078> <005C> <0079> <005D> <007A> <0065> <00C9> <006A> <00E0> <006F> <00E7> <0070> <00E9> <0071> <00E8> <0072> <00EA> <007B> <00F4> <0083> <00B0> <00B1> <2013> <00B6> <2019> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end
+endstream
+endobj
+17 0 obj
+[ 3 3 277 8 8 889 11 11 333 12 12 333 15 15 277 16 16 333 17 17 277 18 18 277 19 19 556 20 20 556 21 21 556 22 22 556 23 23 556 24 24 556 25 25 556 26 26 556 27 27 556 28 28 556 29 29 277 36 36 666 37 37 666 38 38 722 39 39 722 40 40 666 41 41 610 42 42 777 44 44 277 47 47 556 48 48 833 50 50 777 53 53 722 54 54 666 55 55 610 56 56 722 57 57 666 62 62 277 64 64 277 68 68 556 69 69 556 70 70 500 71 71 556 72 72 556 73 73 277 74 74 556 75 75 556 76 76 222 77 77 222 79 79 222 80 80 833 81 81 556 82 82 556 83 83 556 84 84 556 85 85 333 86 86 500 87 87 277 88 88 556 89 89 500 91 91 500 92 92 500 93 93 500 101 101 666 106 106 556 111 111 500 112 112 556 113 113 556 114 114 556 123 123 556 131 131 399 177 177 556 182 182 222 ]
+endobj
+14 0 obj
+[ -889 -211 889 905 ]
+endobj
+15 0 obj
+889
+endobj
+27 0 obj
+<<
+/Length 731
+>>
+stream
+/CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> <FFFF> endcodespacerange 29 beginbfchar <0003> <0020> <000B> <0028> <000C> <0029> <0015> <0032> <0026> <0043> <0031> <004E> <0044> <0061> <0045> <0062> <0046> <0063> <0047> <0064> <0048> <0065> <0049> <0066> <004A> <0067> <004C> <0069> <004D> <006A> <004F> <006C> <0050> <006D> <0051> <006E> <0052> <006F> <0053> <0070> <0055> <0072> <0056> <0073> <0057> <0074> <0058> <0075> <005D> <007A> <006A> <00E0> <0070> <00E9> <0071> <00E8> <00B6> <2019> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end
+endstream
+endobj
+26 0 obj
+[ 3 3 277 11 11 333 12 12 333 21 21 556 38 38 722 49 49 722 68 68 556 69 69 556 70 70 500 71 71 556 72 72 556 73 73 277 74 74 556 76 76 222 77 77 222 79 79 222 80 80 833 81 81 556 82 82 556 83 83 556 85 85 333 86 86 500 87 87 277 88 88 556 93 93 500 106 106 556 112 112 556 113 113 556 182 182 222 ]
+endobj
+23 0 obj
+[ -833 -211 833 905 ]
+endobj
+24 0 obj
+833
+endobj
+2 0 obj
+<<
+/Count 1
+/Kids [ 3 0 R ]
+/Type /Pages
+>>
+endobj
+1 0 obj
+<<
+/Pages 2 0 R
+/Type /Catalog
+>>
+endobj
+32 0 obj
+<<
+/Author (Utilisateur)
+/CreationDate (D:20170504160720+02'00')
+/ModDate (D:20170504160720+02'00')
+/Producer (Microsoft: Print To PDF)
+/Title (3310-2016.pdf)
+>>
+endobj
+xref
+0 33
0000000000 65535 f
-0000039191 00000 n
-0000040382 00000 n
-0000040470 00000 n
-0000040521 00000 n
-0000044247 00000 n
-trailer
-<</Size 6>>
-startxref
-116
-%%EOF
+0000107898 00000 n
+0000107839 00000 n
+0000102366 00000 n
+0000000009 00000 n
+0000000035 00000 n
+0000104450 00000 n
+0000104487 00000 n
+0000000058 00000 n
+0000103805 00000 n
+0000102559 00000 n
+0000019409 00000 n
+0000019881 00000 n
+0000019908 00000 n
+0000106624 00000 n
+0000106662 00000 n
+0000019932 00000 n
+0000105878 00000 n
+0000104506 00000 n
+0000044331 00000 n
+0000044809 00000 n
+0000061222 00000 n
+0000061249 00000 n
+0000107781 00000 n
+0000107819 00000 n
+0000061273 00000 n
+0000107465 00000 n
+0000106682 00000 n
+0000072032 00000 n
+0000072510 00000 n
+0000092435 00000 n
+0000102299 00000 n
+0000107947 00000 n
+trailer
+<<
+/Info 32 0 R
+/Root 1 0 R
+/Size 33
+>>
+startxref
+108126
+%%EOF
/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/ReportingTaxeComplementaire.ods
Nouveau fichier
Changements de propriété:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/OpenConcerto/Configuration/Template/Default/ExportArticle.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/OpenConcerto/Configuration/Template/Default/ExportArticle.ods
===================================================================
--- trunk/OpenConcerto/Configuration/Template/Default/ExportArticle.ods (revision 0)
+++ trunk/OpenConcerto/Configuration/Template/Default/ExportArticle.ods (revision 144)
/trunk/OpenConcerto/Configuration/Template/Default/ExportArticle.ods
Changements de propriété:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/OpenConcerto/Configuration/Template/Default/ReportingVentes.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/OpenConcerto/Configuration/Template/Default/ReportingVentes.ods
===================================================================
--- trunk/OpenConcerto/Configuration/Template/Default/ReportingVentes.ods (revision 0)
+++ trunk/OpenConcerto/Configuration/Template/Default/ReportingVentes.ods (revision 144)
/trunk/OpenConcerto/Configuration/Template/Default/ReportingVentes.ods
Changements de propriété:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/OpenConcerto/Configuration/Template/Default/BonLivraison.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/OpenConcerto/Configuration/Template/Default/AvoirF.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/OpenConcerto/Configuration/Template/Default/DIPE.xml
===================================================================
--- trunk/OpenConcerto/Configuration/Template/Default/DIPE.xml (revision 0)
+++ trunk/OpenConcerto/Configuration/Template/Default/DIPE.xml (revision 144)
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<contentDocument>
+ <element0 location="C1" type="Value" ValueName="SOCIETE">
+ </element0>
+
+ <element0 location="C2" type="Value" ValueName="TELEPHONE">
+ </element0>
+
+ <element0 location="A5" type="Value" ValueName="LIBELLE">
+ </element0>
+
+
+ <element0 location="E16" type="Value" ValueName="BASE" />
+ <element0 location="F16" type="Value" ValueName="ANCIENNETE" />
+ <element0 location="G16" type="Value" ValueName="TRANSPORT" />
+ <element0 location="H16" type="Value" ValueName="BRUT" />
+ <element0 location="I16" type="Value" ValueName="TAXE" />
+ <element0 location="J16" type="Value" ValueName="IRPP" />
+ <element0 location="K16" type="Value" ValueName="CAC" />
+ <element0 location="L16" type="Value" ValueName="CCF" />
+ <element0 location="M16" type="Value" ValueName="TDL" />
+ <element0 location="N16" type="Value" ValueName="RAV" />
+ <element0 location="O16" type="Value" ValueName="PV" />
+ <element0 location="P16" type="Value" ValueName="TOTAL_RETENU" />
+ <element0 location="Q16" type="Value" ValueName="NET" />
+
+
+
+ <element0 location="A30" type="Value" ValueName="NUMERO_EMPLOYEUR">
+ </element0>
+
+ <element0 location="I30" type="Value" ValueName="NUMERO_IDENTIFIANT_UNIQUE">
+ </element0>
+
+ <element0 location="E21" type="Value" ValueName="BASE_PENSION_FAM">
+ </element0>
+
+ <element0 location="H21" type="Value" ValueName="MONTANT_PENSION_FAM">
+ </element0>
+
+ <element0 location="E23" type="Value" ValueName="BASE_PENSION_VIEL">
+ </element0>
+
+ <element0 location="H23" type="Value" ValueName="MONTANT_PENSION_VIEL">
+ </element0>
+
+ <element0 location="E25" type="Value" ValueName="BASE_AT">
+ </element0>
+
+ <element0 location="H25" type="Value" ValueName="MONTANT_AT">
+ </element0>
+
+ <element0 location="H26" type="Value" ValueName="TOTAL_COT">
+ </element0>
+
+ <element0 location="O21" type="Value" ValueName="BASE_CCF">
+ </element0>
+
+ <element0 location="Q21" type="Value" ValueName="MONTANT_CCF">
+ </element0>
+
+ <element0 location="O23" type="Value" ValueName="BASE_FNE">
+ </element0>
+
+ <element0 location="Q23" type="Value" ValueName="MONTANT_FNE">
+ </element0>
+
+ <element0 location="Q26" type="Value" ValueName="TOTAL_FISCAL">
+ </element0>
+
+ <element0 location="H31" type="Value" ValueName="COT_PAT">
+ </element0>
+
+ <element0 location="H33" type="Value" ValueName="COT_SAL">
+ </element0>
+ <element0 location="H34" type="Value" ValueName="COT_TOTAL">
+ </element0>
+
+ <element0 location="Q31" type="Value" ValueName="TAX_PAT">
+ </element0>
+
+ <element0 location="Q33" type="Value" ValueName="TAX_SAL">
+ </element0>
+ <element0 location="Q34" type="Value" ValueName="TAX_TOTAL">
+ </element0>
+
+ <table0 firstLine="11" endLine="16" endPageLine="36" lastColumn="Q" table="ECRITURE" pageRef="P8">
+ <element location="A" type="fill">
+ <field name="NUMERO" />
+ </element>
+
+ <element location="B" type="fill">
+ <field name="NOM" />
+ </element>
+
+ <element location="C" type="fill">
+ <field name="CNPS" />
+ </element>
+
+ <element location="D" type="fill">
+ <field name="INTERNE" />
+ </element>
+
+ <element location="E" type="fill">
+ <field name="BASE" />
+ </element>
+
+ <element location="F" type="fill">
+ <field name="ANCIENNETE" />
+ </element>
+
+ <element location="G" type="fill">
+ <field name="TRANSPORT" />
+ </element>
+
+ <element location="H" type="fill">
+ <field name="BRUT" />
+ </element>
+
+ <element location="I" type="fill">
+ <field name="TAXE" />
+ </element>
+
+ <element location="J" type="fill">
+ <field name="IRPP" />
+ </element>
+ <element location="K" type="fill">
+ <field name="CAC" />
+ </element>
+ <element location="L" type="fill">
+ <field name="CCF" />
+ </element>
+ <element location="M" type="fill">
+ <field name="TDL" />
+ </element>
+ <element location="N" type="fill">
+ <field name="RAV" />
+ </element>
+ <element location="O" type="fill">
+ <field name="PV" />
+ </element>
+ <element location="P" type="fill">
+ <field name="TOTAL_RETENU" />
+ </element>
+ <element location="Q" type="fill">
+ <field name="NET" />
+ </element>
+
+ </table0>
+</contentDocument>
\ No newline at end of file
Index: trunk/OpenConcerto/Configuration/Template/Default/FactureFournisseur.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/OpenConcerto/Configuration/Template/Default/EtatStocks.xml
===================================================================
--- trunk/OpenConcerto/Configuration/Template/Default/EtatStocks.xml (revision 0)
+++ trunk/OpenConcerto/Configuration/Template/Default/EtatStocks.xml (revision 144)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<contentDocument>
+ <element location="A3" type="Value" ValueName="DATE">
+ </element>
+
+ <table firstLine="6" endLine="57" endPageLine="57" lastColumn="D" table="SAISIE_VENTE_FACTURE">
+ <element location="A" type="fill">
+ <field name="CODE" />
+ </element>
+
+ <element location="B" type="fill">
+ <field name="NOM" />
+ </element>
+
+ <element location="C" type="fill">
+ <field name="QTE" />
+ </element>
+
+ <element location="D" type="fill">
+ <field name="TOTAL_HA" />
+ </element>
+ </table>
+</contentDocument>
\ No newline at end of file
Index: trunk/OpenConcerto/Configuration/Template/Default/EtatStocks.odsp
===================================================================
--- trunk/OpenConcerto/Configuration/Template/Default/EtatStocks.odsp (revision 0)
+++ trunk/OpenConcerto/Configuration/Template/Default/EtatStocks.odsp (revision 144)
@@ -0,0 +1,9 @@
+<odsp>
+<spliteveryrow>
+ <sheet number="0">57</sheet>
+</spliteveryrow>
+<offset x="40" y ="20"/>
+<resize percent="85"/>
+
+
+</odsp>
\ No newline at end of file
Index: trunk/OpenConcerto/Configuration/Template/Default/Devis.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.xml
===================================================================
--- trunk/OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.xml (revision 0)
+++ trunk/OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.xml (revision 144)
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<contentDocument>
+
+
+ <element0 location="B2" type="Value" ValueName="PERIODE">
+ </element0>
+
+ <element0 location="C49" type="Value" ValueName="TOTAL_QTE">
+ </element0>
+
+ <element0 location="D49" type="Value" ValueName="TOTAL">
+ </element0>
+
+
+ <table firstLine="4" blankLineBeforeStyle="Titre 1,Titre 2" endLine="1999" endPageLine="2000" lastColumn="J" base="Societe" table="AFFAIRE" sheet="1">
+
+ <element location="A" type="fill">
+ <field base="Societe" name="CODE"/>
+ </element>
+
+<element location="B" type="fill">
+ <field base="Societe" name="NOM"/>
+ </element>
+<element location="C" type="fill">
+ <field base="Societe" name="QTE"/>
+ </element>
+
+ <element location="D" type="fill" >
+ <field base="Societe" name="TOTAL_ECO"/>
+ </element>
+
+ </table>
+
+
+
+</contentDocument>
\ No newline at end of file
Index: trunk/OpenConcerto/Configuration/Template/Default/ReportingVentes.odsp
===================================================================
--- trunk/OpenConcerto/Configuration/Template/Default/ReportingVentes.odsp (revision 0)
+++ trunk/OpenConcerto/Configuration/Template/Default/ReportingVentes.odsp (revision 144)
@@ -0,0 +1,9 @@
+<odsp>
+<spliteveryrow>
+ <sheet number="0">57</sheet>
+</spliteveryrow>
+<offset x="40" y ="20"/>
+<resize percent="85"/>
+
+
+</odsp>
\ No newline at end of file
Index: trunk/OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.xml
===================================================================
--- trunk/OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.xml (revision 0)
+++ trunk/OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.xml (revision 144)
@@ -0,0 +1,198 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<contentDocument>
+ <element location="B1" type="fill">
+ <field base="Common" table="SOCIETE_COMMON" name="TYPE" />
+ <field base="Common" table="SOCIETE_COMMON" name="NOM" />
+ </element>
+
+ <element location="B2" type="fill">
+ <field base="Common" table="SOCIETE_COMMON" name="ID_ADRESSE_COMMON">
+ <field base="Common" name="RUE" />
+ <field base="Common" name="VILLE" type="villeCP" />
+ <field base="Common" name="VILLE" type="ville" />
+ </field>
+ </element>
+
+ <element location="D7" type="fill">
+ <field base="Common" table="SOCIETE_COMMON" name="NUMERO_URSSAF" />
+ </element>
+
+ <element location="G7" type="fill">
+ <field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" />
+ </element>
+
+ <element location="J7" type="fill">
+ <field base="Common" table="SOCIETE_COMMON" name="NUM_APE" />
+ </element>
+
+ <element location="B5" type="replace" replacePattern="_">
+ <field name="ID_SALARIE">
+ <field name="CODE"/>
+ </field>
+ </element>
+
+ <element location="E5" type="replace" replacePattern="_" cellSize="75">
+ <field name="ID_SALARIE">
+ <field name="ID_INFOS_SALARIE_PAYE">
+ <field name="ID_CONTRAT_SALARIE">
+ <field name="NATURE" cellSize="75"/>
+ </field>
+ </field>
+ </field>
+ </element>
+
+
+ <element location="G2" type="fill">
+ <field name="DU" prefix="Paie du " type="date" datePattern="dd/MM/yy"/>
+ <field name="AU" prefix=" au " type="date" datePattern="dd/MM/yy"/>
+ </element>
+
+ <element location="D54" type="fill">
+ <field name="DU" type="datePaye" />
+ </element>
+
+ <element location="G9" type="fill">
+ <field name="ID_SALARIE">
+ <field name="PRENOM"/>
+ <field name="NOM"/>
+ </field>
+ </element>
+ <element location="G10" type="fill">
+ <field name="ID_SALARIE">
+ <field name="ID_ETAT_CIVIL">
+ <field name="ID_ADRESSE">
+ <field name="RUE"/>
+ </field>
+ </field>
+ </field>
+ </element>
+ <element location="G12" type="fill">
+ <field name="ID_SALARIE">
+ <field name="ID_ETAT_CIVIL">
+ <field name="ID_ADRESSE">
+ <field name="CODE_POSTAL"/>
+ <field name="VILLE"/>
+ </field>
+ </field>
+ </field>
+ </element>
+
+ <element location="D12" type="fill">
+ <field name="ID_VARIABLE_SALARIE">
+ <field name="CONGES_PRIS"/>
+ </field>
+ </element>
+ <element location="E12" type="fill">
+ <field name="ID_CUMULS_CONGES">
+ <field name="RESTANT"/>
+ </field>
+ </element>
+ <element location="F12" type="fill">
+ <field name="ID_CUMULS_CONGES">
+ <field name="ACQUIS"/>
+ </field>
+ </element>
+ <element location="B6" type="replace" replacePattern="_">
+ <field name="ID_SALARIE">
+ <field name="ID_ETAT_CIVIL">
+ <field name="NUMERO_SS"/>
+ </field>
+ </field>
+ </element>
+
+ <element location="B3" type="fill" >
+ <field name="ID_SALARIE">
+ <field name="ID_INFOS_SALARIE_PAYE">
+ <field name="ID_IDCC">
+ <field name="NOM" prefix="Convention collective : " cellSize="125"/>
+ </field>
+ </field>
+ </field>
+ </element>
+
+ <element location="B9" type="fill">
+ <field name="DETAILS_CONGES"/>
+ </element>
+
+ <element location="H52" type="fill">
+ <field name="COT_SAL"/>
+ </element>
+ <element location="I52" type="fill">
+ <field name="COT_PAT"/>
+ </element>
+
+
+ <element location="I54" type="fill">
+ <field name="NET_A_PAYER"/>
+ </element>
+
+ <element location="D57" type="fill">
+ <field name="SAL_BRUT"/>
+ </element>
+ <element location="E57" type="fill">
+ <field name="COT_SAL"/>
+ </element>
+ <element location="F57" type="fill">
+ <field name="COT_PAT"/>
+ </element>
+
+ <element location="G57" type="fill">
+ <field name="AVANTAGE_NATURE"/>
+ </element>
+
+ <element location="H57" type="fill">
+ <field name="NET_IMP"/>
+ </element>
+
+ <element location="I57" type="fill">
+ <field name="ALLEGEMENT_COTISATION"/>
+ </element>
+
+ <element location="D58" type="fill">
+ <field name="SAL_BRUT" type="cumulPaye"/>
+ </element>
+ <element location="E58" type="fill">
+ <field name="COT_SAL" type="cumulPaye"/>
+ </element>
+ <element location="F58" type="fill">
+ <field name="COT_PAT" type="cumulPaye"/>
+ </element>
+ <element location="G58" type="fill">
+ <field name="AVANTAGE_NATURE" type="cumulPaye"/>
+ </element>
+
+ <element location="H58" type="fill">
+ <field name="NET_IMP" type="cumulPaye"/>
+ </element>
+
+ <element location="I58" type="fill">
+ <field name="ALLEGEMENT_COTISATION" type="cumulPaye"/>
+ </element>
+
+ <table endPageLine="60" 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">
+ <field name="NB_BASE" />
+ </element>
+ <element location="F" type="fill">
+ <field name="TAUX_SAL" />
+ </element>
+ <element location="G" type="fill">
+ <field name="MONTANT_SAL_AJ" />
+ </element>
+ <element location="H" type="fill">
+ <field name="MONTANT_SAL_DED" />
+ </element>
+ <!-- <element location="I" type="fill">
+ <field name="TAUX_PAT" type="Devise" />
+ </element> -->
+ <element location="J" type="fill">
+ <field name="MONTANT_PAT" />
+ </element>
+
+
+ </table>
+</contentDocument>
\ No newline at end of file
Index: trunk/OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.odsp
===================================================================
--- trunk/OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.odsp (revision 0)
+++ trunk/OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.odsp (revision 144)
@@ -0,0 +1,9 @@
+<odsp>
+<spliteveryrow>
+ <sheet number="0">49</sheet>
+</spliteveryrow>
+<offset x="40" y ="20"/>
+<resize percent="85"/>
+
+
+</odsp>
\ No newline at end of file
Index: trunk/OpenConcerto/Configuration/Template/Default/DIPE.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/OpenConcerto/Configuration/Template/Default/DIPE.ods
===================================================================
--- trunk/OpenConcerto/Configuration/Template/Default/DIPE.ods (revision 0)
+++ trunk/OpenConcerto/Configuration/Template/Default/DIPE.ods (revision 144)
/trunk/OpenConcerto/Configuration/Template/Default/DIPE.ods
Changements de propriété:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/OpenConcerto/Configuration/Template/Default/CommandeClient.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.odsp
===================================================================
--- trunk/OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.odsp (revision 0)
+++ trunk/OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.odsp (revision 144)
@@ -0,0 +1,9 @@
+<odsp>
+<spliteveryrow>
+ <sheet number="0">60</sheet>
+</spliteveryrow>
+<offset x="20" y ="20"/>
+<resize percent="92"/>
+
+
+</odsp>
\ No newline at end of file
Index: trunk/OpenConcerto/Configuration/Template/Default/EtatStocks.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/OpenConcerto/Configuration/Template/Default/EtatStocks.ods
===================================================================
--- trunk/OpenConcerto/Configuration/Template/Default/EtatStocks.ods (revision 0)
+++ trunk/OpenConcerto/Configuration/Template/Default/EtatStocks.ods (revision 144)
/trunk/OpenConcerto/Configuration/Template/Default/EtatStocks.ods
Changements de propriété:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/OpenConcerto/Configuration/Template/Default/BonReception.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.ods
===================================================================
--- trunk/OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.ods (revision 0)
+++ trunk/OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.ods (revision 144)
/trunk/OpenConcerto/Configuration/Template/Default/ReportingEcoContribution.ods
Changements de propriété:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/OpenConcerto/Configuration/Template/Default/DIPE.odsp
===================================================================
--- trunk/OpenConcerto/Configuration/Template/Default/DIPE.odsp (revision 0)
+++ trunk/OpenConcerto/Configuration/Template/Default/DIPE.odsp (revision 144)
@@ -0,0 +1,9 @@
+<odsp>
+<spliteveryrow>
+ <sheet number="0">68</sheet>
+</spliteveryrow>
+<offset x="40" y ="20"/>
+<resize percent="85"/>
+
+
+</odsp>
\ No newline at end of file
Index: trunk/OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.ods
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.ods
===================================================================
--- trunk/OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.ods (revision 0)
+++ trunk/OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.ods (revision 144)
/trunk/OpenConcerto/Configuration/Template/Default/FichePayeSimplifiee.ods
Changements de propriété:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/OpenConcerto/Configuration/Template/Default/VenteFacture.xml
===================================================================
--- trunk/OpenConcerto/Configuration/Template/Default/VenteFacture.xml (revision 143)
+++ trunk/OpenConcerto/Configuration/Template/Default/VenteFacture.xml (revision 144)
@@ -76,6 +76,8 @@
<element location="H11" type="address.customer.invoice.full">
</element>
+
+
<element location="L62" type="fill">
<field name="T_HT" type="devise" />
</element>
/trunk/OpenConcerto/Configuration/Template/Default/DemandePrix.xml
Nouveau fichier
0,0 → 1,106
<?xml version="1.0" encoding="UTF-8" ?>
<contentDocument>
<element location="B1" type="fill">
<field base="Common" table="SOCIETE_COMMON" name="TYPE" />
<field base="Common" table="SOCIETE_COMMON" name="NOM" />
</element>
 
<element location="B2" type="fill">
<field base="Common" table="SOCIETE_COMMON" name="ID_ADRESSE_COMMON">
<field base="Common" table="ADRESSE_COMMON" name="RUE" />
</field>
</element>
 
<element location="B3" type="fill">
<field base="Common" table="SOCIETE_COMMON" name="ID_ADRESSE_COMMON">
<field base="Common" table="ADRESSE_COMMON" name="VILLE" type="villeCP" />
<field base="Common" table="ADRESSE_COMMON" name="VILLE" type="ville" />
<field base="Common" table="ADRESSE_COMMON" name="CEDEX" prefix="CEDEX " conditionField="HAS_CEDEX" />
</field>
</element>
 
<element location="B5" type="fill">
<field base="Common" table="SOCIETE_COMMON" name="TYPE"/>
<field base="Common" table="SOCIETE_COMMON" name="CAPITAL" prefix=" au capital de " suffix="€"/>
</element>
 
<element location="B6" type="fill">
<field base="Common" table="SOCIETE_COMMON" name="NUM_SIRET" prefix="N° de SIREN "/>
</element>
 
<element location="B7" type="replace" replacePattern="_">
<field base="Common" table="SOCIETE_COMMON" name="NUM_NII" />
</element>
 
<element location="B8" type="replace" replacePattern="_">
<field base="Common" table="SOCIETE_COMMON" name="NUM_TEL" />
</element>
 
<element location="B9" type="replace" replacePattern="_">
<field base="Common" table="SOCIETE_COMMON" name="NUM_FAX" />
</element>
 
<element location="B10" type="replace" replacePattern="_">
<field base="Common" table="SOCIETE_COMMON" name="MAIL" />
</element>
 
 
<element location="B16" type="fill">
<field name="ID_COMMERCIAL">
<field name="NOM" />
</field>
</element>
 
<element location="B13" type="fill">
<field name="NUMERO" />
</element>
 
<element location="C13" type="fill">
<field name="DATE" />
</element>
 
 
 
<element location="H10" type="fill">
<field name="ID_FOURNISSEUR">
<field name="TYPE" />
<field name="NOM" />
</field>
</element>
 
<element location="H11" type="fill">
<field name="ID_FOURNISSEUR">
<field name="ID_ADRESSE">
<field name="RUE" />
</field>
</field>
</element>
 
<element location="H13" type="fill">
<field name="ID_FOURNISSEUR">
<field name="ID_ADRESSE">
<field name="VILLE" type="villeCP" />
<field name="VILLE" type="ville" />
<field name="CEDEX" prefix="CEDEX " conditionField="HAS_CEDEX" />
</field>
</field>
</element>
 
 
<table endPageLine="57" firstLine="22" endLine="52" lastColumn="L" table="DEMANDE_PRIX_ELEMENT">
<element location="B" type="fill">
<field name="NOM" />
</element>
 
<element location="K" type="fill">
<field name="QTE" />
</element>
 
 
<element location="L" type="fill">
<field name="T_POIDS" />
</element>
 
</table>
</contentDocument>
/trunk/OpenConcerto/Configuration/Template/Default/DemandePrix.odsp
Nouveau fichier
0,0 → 1,9
<odsp>
<spliteveryrow>
<sheet number="0">58</sheet>
</spliteveryrow>
<offset x="40" y ="20"/>
<resize percent="85"/>
 
 
</odsp>
/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/ReportingTaxeComplementaire.xml
Nouveau fichier
0,0 → 1,43
<?xml version="1.0" encoding="UTF-8" ?>
 
<contentDocument>
<element0 location="B2" type="Value" ValueName="PERIODE">
</element0>
<element0 location="C49" type="Value" ValueName="TOTAL_QTE">
</element0>
<element0 location="D49" type="Value" ValueName="TOTAL_BASE">
</element0>
 
<element0 location="E49" type="Value" ValueName="TOTAL_TAXE">
</element0>
<table firstLine="4" blankLineBeforeStyle="Titre 1,Titre 2" endLine="1999" endPageLine="2000" lastColumn="J" base="Societe" table="AFFAIRE" sheet="1">
<element location="A" type="fill">
<field base="Societe" name="CODE"/>
</element>
 
<element location="B" type="fill">
<field base="Societe" name="NOM"/>
</element>
<element location="C" type="fill">
<field base="Societe" name="QTE"/>
</element>
<element location="D" type="fill" >
<field base="Societe" name="TOTAL_BASE"/>
</element>
 
 
<element location="E" type="fill" >
<field base="Societe" name="TOTAL_TAXE"/>
</element>
</table>
</contentDocument>
/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/ExportArticle.xml
Nouveau fichier
0,0 → 1,44
<?xml version="1.0" encoding="UTF-8" ?>
 
<contentDocument>
 
<table firstLine="2" endLine="10000" endPageLine="10000" lastColumn="AK">
<element location="A" type="fill" controleMultiline="false">
<field base="Societe" name="CODE"/>
</element>
<element location="C" type="fill" controleMultiline="false">
<field base="Societe" name="NOM"/>
</element>
<element location="I" type="fill">
<field base="Societe" name="FOURNISSEUR"/>
</element>
<element location="P" type="fill">
<field base="Societe" name="QTE_ACHAT"/>
</element>
<element location="Q" type="fill">
<field base="Societe" name="QTE_MIN"/>
</element>
<element location="R" type="fill">
<field base="Societe" name="PA_HT"/>
</element>
<element location="T" type="fill">
<field base="Societe" name="PV_HT"/>
</element>
<element location="AF" type="fill">
<field base="Societe" name="POIDS"/>
</element>
 
<element location="AG" type="fill">
<field base="Societe" name="FAMILLE"/>
</element>
 
<element location="AJ" type="fill">
<field base="Societe" name="PAYS"/>
</element>
<element location="AK" type="fill">
<field base="Societe" name="CODE_DOUANIER"/>
</element>
</table>
</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/DemandePrix.ods
Nouveau fichier
Changements de propriété:
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/OpenConcerto/Configuration/Template/Default/ReportingTaxeComplementaire.odsp
===================================================================
--- trunk/OpenConcerto/Configuration/Template/Default/ReportingTaxeComplementaire.odsp (revision 0)
+++ trunk/OpenConcerto/Configuration/Template/Default/ReportingTaxeComplementaire.odsp (revision 144)
@@ -0,0 +1,9 @@
+<odsp>
+<spliteveryrow>
+ <sheet number="0">49</sheet>
+</spliteveryrow>
+<offset x="40" y ="20"/>
+<resize percent="85"/>
+
+
+</odsp>
\ No newline at end of file
Index: trunk/OpenConcerto/Configuration/Template/Default/ReportingVentes.xml
===================================================================
--- trunk/OpenConcerto/Configuration/Template/Default/ReportingVentes.xml (revision 0)
+++ trunk/OpenConcerto/Configuration/Template/Default/ReportingVentes.xml (revision 144)
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<contentDocument>
+ <element location="A1" type="Value" ValueName="NOM">
+ </element>
+
+ <element location="A3" type="Value" ValueName="DATE">
+ </element>
+
+ <table firstLine="6" endLine="57" endPageLine="57" lastColumn="E" table="SAISIE_VENTE_FACTURE">
+ <element location="A" type="fill">
+ <field name="CODE" />
+ </element>
+
+ <element location="B" type="fill">
+ <field name="NOM" />
+ </element>
+
+ <element location="C" type="fill">
+ <field name="QTE" />
+ </element>
+
+ <element location="D" type="fill">
+ <field name="TOTAL_HT" />
+ </element>
+
+ <element location="E" type="fill">
+ <field name="TOTAL_TTC" />
+ </element>
+ </table>
+</contentDocument>
\ No newline at end of file
Index: trunk/OpenConcerto/src/org/openconcerto/laf/WindowsTableHeaderUIFix.java
===================================================================
--- trunk/OpenConcerto/src/org/openconcerto/laf/WindowsTableHeaderUIFix.java (revision 143)
+++ trunk/OpenConcerto/src/org/openconcerto/laf/WindowsTableHeaderUIFix.java (revision 144)
@@ -1,38 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
- *
- * The contents of this file are subject to the terms of the GNU General Public License Version 3
- * only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
- * copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
- * language governing permissions and limitations under the License.
- *
- * When distributing the software, include this License Header Notice in each file.
- */
-
- package org.openconcerto.laf;
-
-import javax.swing.JComponent;
-import javax.swing.plaf.ComponentUI;
-import javax.swing.table.JTableHeader;
-
-import com.sun.java.swing.plaf.windows.WindowsTableHeaderUI;
-
-public class WindowsTableHeaderUIFix extends WindowsTableHeaderUI {
- // Fix for http://bugs.sun.com/view_bug.do?bug_id=6516888
- // ie null header when switching L&F, resuming from locked sessions, or opening/closing RDP
- // sessions on Windows...
-
- public static ComponentUI createUI(JComponent h) {
- return new WindowsTableHeaderUIFix();
- }
-
- @Override
- public void uninstallUI(JComponent c) {
- JTableHeader old = header;
- super.uninstallUI(c);
- header = old;
- }
-
-}
Index: trunk/OpenConcerto/src/org/openconcerto/laf/WindowsLookAndFeelFix.java
===================================================================
--- trunk/OpenConcerto/src/org/openconcerto/laf/WindowsLookAndFeelFix.java (revision 143)
+++ trunk/OpenConcerto/src/org/openconcerto/laf/WindowsLookAndFeelFix.java (revision 144)
@@ -1,27 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
- *
- * The contents of this file are subject to the terms of the GNU General Public License Version 3
- * only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
- * copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
- * language governing permissions and limitations under the License.
- *
- * When distributing the software, include this License Header Notice in each file.
- */
-
- package org.openconcerto.laf;
-
-import javax.swing.UIDefaults;
-
-import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
-
-public class WindowsLookAndFeelFix extends WindowsLookAndFeel {
- @Override
- protected void initClassDefaults(UIDefaults table) {
- super.initClassDefaults(table);
- Object[] uiDefaults = { "TableHeaderUI", WindowsTableHeaderUIFix.class.getCanonicalName() };
- table.putDefaults(uiDefaults);
- }
-}
Index: trunk/OpenConcerto/src/org/openconcerto/laf/LAFUtils.java
===================================================================
--- trunk/OpenConcerto/src/org/openconcerto/laf/LAFUtils.java (revision 143)
+++ trunk/OpenConcerto/src/org/openconcerto/laf/LAFUtils.java (revision 144)
@@ -163,9 +163,6 @@
* <code>true</code>.
*/
static public final String fixLookAndFeel(final String laf) {
- if (!Boolean.getBoolean(LAF_DONT_FIX) && laf.equals("com.sun.java.swing.plaf.windows.WindowsLookAndFeel")) {
- return WindowsLookAndFeelFix.class.getName();
- }
return laf;
}
}
Index: trunk/OpenConcerto/src/org/openconcerto/task/TodoListPanel.java
===================================================================
--- trunk/OpenConcerto/src/org/openconcerto/task/TodoListPanel.java (revision 143)
+++ trunk/OpenConcerto/src/org/openconcerto/task/TodoListPanel.java (revision 144)
@@ -15,8 +15,6 @@
import static org.openconcerto.task.TM.getTM;
-import org.openconcerto.sql.Configuration;
-import org.openconcerto.sql.model.DBSystemRoot;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLRowValues;
@@ -39,7 +37,6 @@
import org.openconcerto.ui.table.TimestampTableCellEditor;
import org.openconcerto.ui.table.TimestampTableCellRenderer;
import org.openconcerto.utils.ExceptionHandler;
-import org.openconcerto.utils.SwingWorker2;
import org.openconcerto.utils.TableSorter;
import org.openconcerto.utils.cc.ITransformer;
@@ -84,6 +81,7 @@
import javax.swing.JToolTip;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
+import javax.swing.SwingWorker;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
import javax.swing.event.ChangeEvent;
@@ -97,6 +95,7 @@
public class TodoListPanel extends JPanel implements ModelStateListener {
+ private final UserManager uMngr;
// Actions
private final JCheckBox detailCheckBox;
private final JCheckBox hideOldCheckBox;
@@ -120,11 +119,12 @@
final ReloadPanel reloadPanel = new ReloadPanel();
TableSorter sorter;
- public TodoListPanel() {
+ public TodoListPanel(final UserManager uMngr) {
+ this.uMngr = uMngr;
this.setOpaque(false);
this.iconTache = new ImageIcon(TodoListPanel.class.getResource("tache.png"));
this.iconPriorite = new ImageIcon(TodoListPanel.class.getResource("priorite.png"));
- this.userTableCellRenderer = new UserTableCellRenderer();
+ this.userTableCellRenderer = new UserTableCellRenderer(uMngr);
this.timestampTableCellRendererCreated = new TimestampTableCellRenderer();
this.timestampTableCellRendererDone = new TimestampTableCellRenderer();
this.timestampTableCellRendererDeadLine = new TimestampTableCellRenderer(true);
@@ -140,8 +140,8 @@
this.iconEditor = new IconTableCellRenderer(l);
this.iconRenderer = new IconTableCellRenderer(l);
- final User currentUser = UserManager.getInstance().getCurrentUser();
- this.model = new TodoListModel(currentUser);
+ final User currentUser = uMngr.getCurrentUser();
+ this.model = new TodoListModel(uMngr);
this.sorter = new TableSorter(this.model);
this.t = new LightEventJTable(this.sorter) {
public JToolTip createToolTip() {
@@ -161,7 +161,7 @@
} else {
r = "";
}
- r += getTM().trM("assignedBy", "user", UserManager.getInstance().getUser(task.getCreatorId()).getFullName(), "date", task.getDate());
+ r += getTM().trM("assignedBy", "user", uMngr.getUser(task.getCreatorId()).getFullName(), "date", task.getDate());
}
return r;
@@ -260,8 +260,12 @@
this.model.asynchronousFill();
}
+ public final UserManager getUserManager() {
+ return this.uMngr;
+ }
+
private void initViewableUsers(final User currentUser) {
- final SwingWorker2<List<User>, Object> worker = new SwingWorker2<List<User>, Object>() {
+ final SwingWorker<List<User>, Object> worker = new SwingWorker<List<User>, Object>() {
@Override
protected List<User> doInBackground() throws Exception {
@@ -271,9 +275,8 @@
canViewUsers.add(right.getIdToUser());
}
// final Vector users = new Vector();
- final SQLTable userT = UserManager.getInstance().getTable();
- final DBSystemRoot systemRoot = Configuration.getInstance().getSystemRoot();
- final SQLSelect select1 = new SQLSelect(systemRoot, false);
+ final SQLTable userT = getUserManager().getTable();
+ final SQLSelect select1 = new SQLSelect(false);
select1.addSelectStar(userT);
final Where meWhere = new Where(userT.getKey(), "=", currentUser.getId());
final Where canViewWhere = new Where(userT.getKey(), canViewUsers);
@@ -514,10 +517,10 @@
}
private void initUserCellEditor(final TableColumn userColumn) {
- SwingWorker2<List<UserTaskRight>, Object> worker = new SwingWorker2<List<UserTaskRight>, Object>() {
+ new SwingWorker<List<UserTaskRight>, Object>() {
@Override
protected List<UserTaskRight> doInBackground() throws Exception {
- return UserTaskRight.getUserTaskRight(UserManager.getInstance().getCurrentUser());
+ return UserTaskRight.getUserTaskRight(getUserManager().getCurrentUser());
}
@Override
@@ -527,12 +530,12 @@
final List<UserTaskRight> rights = get();
final List<User> canAddUsers = new ArrayList<User>();
for (final UserTaskRight right : rights) {
- assert right.getIdUser() == UserManager.getUserID();
+ assert right.getIdUser() == getUserManager().getCurrentUser().getId();
if (right.canAdd()) {
- canAddUsers.add(UserManager.getInstance().getUser(right.getIdToUser()));
+ canAddUsers.add(getUserManager().getUser(right.getIdToUser()));
}
}
- userColumn.setCellEditor(new UserTableCellEditor(new UserComboBox(canAddUsers)));
+ userColumn.setCellEditor(new UserTableCellEditor(getUserManager(), new UserComboBox(canAddUsers)));
t.setEnabled(true);
} catch (Exception e) {
ExceptionHandler.handle("Unable to get user task rights", e);
@@ -540,9 +543,7 @@
super.done();
}
- };
- worker.execute();
-
+ }.execute();
}
void initPopUp() {
/trunk/OpenConcerto/src/org/openconcerto/task/TodoListModel.java
15,7 → 15,6
 
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.DBSystemRoot;
import org.openconcerto.sql.model.IResultSetHandler;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowListRSH;
31,6 → 30,7
 
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;
import java.util.LinkedHashMap;
43,9 → 43,9
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.AbstractTableModel;
 
public class TodoListModel extends DefaultTableModel {
public class TodoListModel extends AbstractTableModel {
 
public static final int EXTENDED_MODE = 1;
public static final int SIMPLE_MODE = 2;
58,12 → 58,13
// que l'on ecoute
private JTable table = null;
private List<ModelStateListener> stateListenerList = new Vector<ModelStateListener>(1);
private transient User currentUser;
private final UserManager uMngr;
protected List<UserTaskRight> rights;
private boolean historyVisible = false;
private List<TodoListElement> elements = new ArrayList<TodoListElement>();
 
TodoListModel(User currentUser) {
this.currentUser = currentUser;
TodoListModel(final UserManager uMngr) {
this.uMngr = uMngr;
launchUpdaterThread();
this.mode = SIMPLE_MODE;
}
83,8 → 84,6
e.printStackTrace();
}
}
// System.err.println("launchUpdaterThread end");
 
}
});
// this only read data to be displayed, it can be safely interrupted at any moment
135,10 → 134,10
// size before removing
final int newSize = newDataVector.size();
final int oldSize;
synchronized (this.dataVector) {
oldSize = this.dataVector.size();
synchronized (this.elements) {
oldSize = this.elements.size();
for (int i = 0; i < oldSize; i++) {
final TodoListElement elt = (TodoListElement) this.dataVector.get(i);
final TodoListElement elt = this.elements.get(i);
final TodoListElement eltN = newDataVector.remove(elt.getRowValues().getID());
if (eltN == null) {
rowsDeleted.add(elt);
151,7 → 150,7
}
 
for (TodoListElement elt : rowsDeleted) {
int index = this.dataVector.indexOf(elt);
int index = this.elements.indexOf(elt);
if (index >= 0) {
removeRow(index);
}
158,12 → 157,12
}
 
for (Integer i : newDataVector.keySet()) {
this.dataVector.add(newDataVector.get(i));
this.elements.add(newDataVector.get(i));
}
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
if ((rowsModified.size() == newSize) && (rowsModified.size() > 0)) {
if ((rowsModified.size() == newSize) && !rowsModified.isEmpty()) {
fireTableDataChanged();
fireModelStateChanged(ModelStateListener.CONTENT_MODIFIED);
} else if (newSize != oldSize) {
174,7 → 173,7
Integer indexModified = rowsModified.get(i);
fireTableRowsUpdated(indexModified, indexModified);
}
if (rowsModified.size() > 0) {
if (!rowsModified.isEmpty()) {
fireModelStateChanged(ModelStateListener.CONTENT_MODIFIED);
}
}
193,7 → 192,7
@SuppressWarnings("unchecked")
@Override
public Set<String> createChecked() {
final SQLSelect sel = new SQLSelect(tableTache.getBase());
final SQLSelect sel = new SQLSelect();
sel.addSelect(typeF);
sel.addGroupBy(typeF);
return new HashSet<String>(tableTache.getDBSystemRoot().getDataSource().executeCol(sel.asString()));
205,15 → 204,15
private static final int societeID = ((ComptaBasePropsConfiguration) Configuration.getInstance()).getSocieteID();
private static final DBSystemRoot base = Configuration.getInstance().getSystemRoot();
private static final SQLTable tableTache = base.getRoot("Common").getTable("TACHE_COMMON");
private final static Where where2 = new Where(tableTache.getField("ID_SOCIETE_COMMON"), "=", tableTache.getUndefinedID()).or(new Where(tableTache.getField("ID_SOCIETE_COMMON"), "=", societeID));
private static final Where where2 = new Where(tableTache.getField("ID_SOCIETE_COMMON"), "=", tableTache.getUndefinedID()).or(new Where(tableTache.getField("ID_SOCIETE_COMMON"), "=", societeID));
 
private synchronized void fillFromDatabase(final Map<Integer, TodoListElement> m) {
long time1 = System.currentTimeMillis();
 
final SQLSelect select = new SQLSelect(tableTache.getBase());
final SQLSelect select = new SQLSelect();
select.addSelectStar(tableTache);
Where where = new Where(tableTache.getField("ID_USER_COMMON_TO"), this.listIdListener);
final int userID = UserManager.getInstance().getCurrentUser().getId();
final int userID = getCurrentUser().getId();
where = where.or(new Where(tableTache.getField("ID_USER_COMMON_ASSIGN_BY"), "=", userID));
 
where = where.or(getAuthorizedTaskTypes(userID, tableTache));
229,49 → 228,28
where = where.and(w3);
}
select.setWhere(where.and(where2));
 
select.addFieldOrder(tableTache.getField("ID_USER_COMMON_TO"));
select.addFieldOrder(tableTache.getField("DATE_EXP"));
 
// System.out.println(select.asString());
this.rights = UserTaskRight.getUserTaskRight(getCurrentUser());
// don't use the cache since by definition this table is shared by everyone, so we can't
// rely on our modifications
final IResultSetHandler rsh = new IResultSetHandler(SQLRowListRSH.createFromSelect(select), false);
@SuppressWarnings("unchecked")
final List<SQLRow> l = (List<SQLRow>) base.getDataSource().execute(select.asString(), rsh);
final List<SQLRow> l = SQLRowListRSH.execute(select, false, false);
for (SQLRow row : l) {
TodoListElement t = new TodoListElement(row.asRowValues());
 
// Calendar t2 = row.getDate("DATE_FAIT");
//
 
final TodoListElement t = new TodoListElement(getUserManager(), row.asRowValues());
// add tasks that we created, we must do, or that we can read
// plus for preventec, tasks with a type must visible to everybody
boolean add = false;
String type = row.getString("TYPE");
if (type != null && type.trim().length() > 0) {
// if (isHistoryVisible()) {
// m.put(row.getID(), t);
// } else if (!row.getBoolean("FAIT")) {
// m.put(row.getID(), t);
// } else if (t2 != null && t2.after(cal.getTime())) {
add = true;
// }
} else if (row.getInt("ID_USER_COMMON_CREATE") == userID || row.getInt("ID_USER_COMMON_TO") == userID) {
add = true;
} else {
for (int i = 0; i < TodoListModel.this.rights.size(); i++) {
UserTaskRight element = TodoListModel.this.rights.get(i);
 
final UserTaskRight element = TodoListModel.this.rights.get(i);
if (element.getIdToUser() == row.getInt("ID_USER_COMMON_TO") && element.canRead()) {
// if (isHistoryVisible()) {
// m.put(row.getID(), t);
// } else if (!row.getBoolean("FAIT")) {
// m.put(row.getID(), t);
// } else if (t2 != null && t2.after(cal.getTime())) {
add = true;
// }
break;
}
}
297,8 → 275,9
return 5;
}
 
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
synchronized (this.dataVector) {
synchronized (this.elements) {
// Modifier la priorité de la tache
if (columnIndex == 1) {
return true;
308,11 → 287,11
return false;
}
 
if (this.dataVector.size() <= rowIndex) {
System.err.println("Size error :" + this.dataVector.size() + " i:" + rowIndex);
if (this.elements.size() <= rowIndex) {
System.err.println("Size error :" + this.elements.size() + " i:" + rowIndex);
rowIndex = 0;
}
final TodoListElement task = (TodoListElement) this.dataVector.get(rowIndex);
final TodoListElement task = this.elements.get(rowIndex);
if (task == null)
return false;
final int size = this.rights.size();
319,14 → 298,14
if (columnIndex == 0)
// Validation
for (int i = 0; i < size; i++) {
UserTaskRight right = this.rights.get(i);
if (right.getIdToUser() == task.getUserId() && right.canValidate()) {
return true;
}
UserTaskRight right = this.rights.get(i);
if (right.getIdToUser() == task.getUserId() && right.canValidate()) {
return true;
}
}
else if (columnIndex == this.getColumnCount() - 1) {
// Colonne d'assignement
return (task.getCreatorId().equals(UserManager.getInstance().getCurrentUser().getId()));
return (task.getCreatorId().equals(getCurrentUser().getId()));
} else {
// Modification
for (int i = 0; i < size; i++) {
342,6 → 321,7
return false;
}
 
@Override
public Class<?> getColumnClass(final int columnIndex) {
switch (columnIndex) {
case 0:
353,9 → 333,10
case 3:
return Timestamp.class;
case 4:
if (this.mode != EXTENDED_MODE) {
return Integer.class;
if (this.mode == EXTENDED_MODE) {
return Timestamp.class;
}
return Integer.class;
case 5:
return Timestamp.class;
case 6:
362,19 → 343,16
return Integer.class;
default:
return String.class;
 
}
 
}
 
public Object getValueAt(int rowIndex, int columnIndex) {
synchronized (this.dataVector) {
if (this.dataVector.size() <= rowIndex) {
System.err.println("Size error :" + this.dataVector.size() + " i:" + rowIndex);
synchronized (this.elements) {
if (this.elements.size() <= rowIndex) {
System.err.println("Size error :" + this.elements.size() + " i:" + rowIndex);
rowIndex = 0;
}
TodoListElement task = (TodoListElement) this.dataVector.get(rowIndex);
 
final TodoListElement task = this.elements.get(rowIndex);
switch (columnIndex) {
case 0:
return task.isDone();
398,23 → 376,32
return task.getUserId();
default:
return "????????";
 
}
}
}
 
public TodoListElement getTaskAtRow(int rowIndex) {
return (TodoListElement) this.dataVector.get(rowIndex);
return this.elements.get(rowIndex);
}
 
@Override
public int getRowCount() {
return this.elements.size();
}
 
public void removeRow(int row) {
elements.remove(row);
fireTableRowsDeleted(row, row);
}
 
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
synchronized (this.dataVector) {
synchronized (this.elements) {
if (rowIndex >= getRowCount()) {
// Cas de la perte de l'edition de la derniere ligne supprimee
return;
}
TodoListElement task = (TodoListElement) this.dataVector.get(rowIndex);
 
final TodoListElement task = this.elements.get(rowIndex);
switch (columnIndex) {
case 0:
task.setDone((Boolean) aValue);
446,14 → 433,13
break;
default:
break;
 
}
 
task.commitChanges();
}
fireTableRowsUpdated(rowIndex, rowIndex);
}
 
@Override
public String getColumnName(int columnIndex) {
switch (columnIndex) {
case 0:
490,7 → 476,7
 
@Override
public Object doInBackground() {
final SQLRowValues rowV = new SQLRowValues(Configuration.getInstance().getBase().getTable("TACHE_COMMON"));
final SQLRowValues rowV = new SQLRowValues(tableTache);
final Calendar cal = Calendar.getInstance();
rowV.put("DATE_ENTREE", new java.sql.Timestamp(cal.getTimeInMillis()));
cal.add(Calendar.HOUR_OF_DAY, 1);
501,7 → 487,7
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.MILLISECOND, 0);
rowV.put("DATE_FAIT", new java.sql.Timestamp(cal.getTimeInMillis()));
final int currentUserId = UserManager.getInstance().getCurrentUser().getId();
final int currentUserId = getCurrentUser().getId();
rowV.put("ID_USER_COMMON_ASSIGN_BY", currentUserId);
rowV.put("ID_USER_COMMON_TO", currentUserId);
try {
535,9 → 521,9
}
 
public boolean deleteTaskAtIndex(int index) {
synchronized (this.dataVector) {
final TodoListElement t = (TodoListElement) this.dataVector.get(index);
final int currentUserId = UserManager.getInstance().getCurrentUser().getId();
synchronized (this.elements) {
final TodoListElement t = this.elements.get(index);
final int currentUserId = getCurrentUser().getId();
if (t.getCreatorId() != currentUserId) {
JOptionPane.showMessageDialog(this.table, TM.tr("deleteForbidden"));
return false;
593,10 → 579,14
}
}
 
public User getCurrentUser() {
return this.currentUser;
public final UserManager getUserManager() {
return this.uMngr;
}
 
public final User getCurrentUser() {
return this.getUserManager().getCurrentUser();
}
 
public synchronized boolean isHistoryVisible() {
return this.historyVisible;
}
604,4 → 594,5
public synchronized void setHistoryVisible(boolean historyVisible) {
this.historyVisible = historyVisible;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/task/config/TaskNX.java
16,6 → 16,7
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.ui.ConnexionPanel;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.utils.Exiter;
import org.openconcerto.sql.view.EditPanel;
import org.openconcerto.task.ModelStateListener;
51,9 → 52,9
public class TaskNX extends JFrame implements ModelStateListener {
private static TrayIcon trayIcon = null;
 
public TaskNX() {
public TaskNX(TaskPropsConfiguration conf) {
this.setTitle("Task NX");
TodoListPanel panel = new TodoListPanel();
TodoListPanel panel = new TodoListPanel(UserManager.getInstance());
panel.addModelStateListener(this);
this.setContentPane(panel);
this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
82,7 → 83,7
this.setJMenuBar(menuBar2);
 
// add state listener before, otherwise System.exit() prevents the save from happening
final WindowStateManager m = new WindowStateManager(this, new File(Configuration.getInstance().getConfDir(), this.getClass().getSimpleName() + "-window.xml"));
final WindowStateManager m = new WindowStateManager(this, new File(conf.getConfDir(), this.getClass().getSimpleName() + "-window.xml"));
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
99,7 → 100,8
 
public static void main(String[] args) {
System.setProperty(SQLBase.STRUCTURE_USE_XML, "true");
Configuration.setInstance(TaskPropsConfiguration.create());
final TaskPropsConfiguration conf = TaskPropsConfiguration.create();
Configuration.setInstance(conf);
final Runnable r = new Runnable() {
 
public void run() {
106,7 → 108,7
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TaskNX f = new TaskNX();
final TaskNX f = new TaskNX(conf);
f.setVisible(true);
}
});
/trunk/OpenConcerto/src/org/openconcerto/task/config/ComptaBasePropsConfiguration.java
187,7 → 187,7
dir.addSQLElement(new TaskRightSQLElement());
dir.addSQLElement(new TaskSQLElement());
 
dir.addSQLElement(new UserCommonSQLElement(getRoot()));
dir.addSQLElement(new UserCommonSQLElement(getRoot(), false));
dir.addSQLElement(new CompanyAccessSQLElement());
dir.addSQLElement(UserRightSQLElement.class);
dir.addSQLElement(RightSQLElement.class);
/trunk/OpenConcerto/src/org/openconcerto/task/config/TaskAdminNX.java
34,7 → 34,8
 
public static void main(String[] args) {
System.setProperty(SQLBase.STRUCTURE_USE_XML, "true");
Configuration.setInstance(TaskPropsConfiguration.create());
final TaskPropsConfiguration conf = TaskPropsConfiguration.create();
Configuration.setInstance(conf);
SwingUtilities.invokeLater(new Runnable() {
 
public void run() {
59,7 → 60,7
new Exiter(f, true);
f.setTitle("Gestion des autorisations concernant les tâches");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setContentPane(new UserRightsPrefPanel());
f.setContentPane(new UserRightsPrefPanel(conf));
f.pack();
f.setLocation(20, 20);
f.setSize(800, 600);
/trunk/OpenConcerto/src/org/openconcerto/task/ui/UserRightsPrefPanel.java
13,8 → 13,9
package org.openconcerto.task.ui;
 
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.PropsConfiguration;
import org.openconcerto.sql.users.User;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.view.IListFrame;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.ui.DisplayabilityListener;
46,7 → 47,8
private UserRightPanelDetail detail;
private JList l;
 
public UserRightsPrefPanel() {
public UserRightsPrefPanel(final PropsConfiguration conf) {
final UserManager uMngr = conf.getUserManager();
this.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
56,7 → 58,7
c.fill = GridBagConstraints.BOTH;
c.insets = new Insets(0, 0, 0, 0);
// Liste des utilisateurs
final UserListModel dataModel = new UserListModel();
final UserListModel dataModel = new UserListModel(uMngr);
this.addHierarchyListener(new DisplayabilityListener() {
@Override
protected void displayabilityChanged(Component c) {
80,7 → 82,7
this.add(sep, c);
//
c.weightx = 1;
detail = new UserRightPanelDetail();
detail = new UserRightPanelDetail(uMngr, conf.getRoot());
this.add(detail, c);
//
c.weighty = 0;
102,7 → 104,7
if (frame == null) {
frame = createFrame();
frame.pack();
new WindowStateManager(frame, new File(Configuration.getInstance().getConfDir(), UserRightsPrefPanel.this.getClass().getSimpleName() + "-window.xml"), true).loadState();
new WindowStateManager(frame, new File(conf.getConfDir(), UserRightsPrefPanel.this.getClass().getSimpleName() + "-window.xml"), true).loadState();
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
}
FrameUtil.show(frame);
109,7 → 111,7
}
 
public JFrame createFrame() {
return new IListFrame(new ListeAddPanel(Configuration.getInstance().getDirectory().getElement("USER_COMMON")));
return new IListFrame(new ListeAddPanel(conf.getDirectory().getElement("USER_COMMON")));
}
});
this.add(manageUsers, c);
/trunk/OpenConcerto/src/org/openconcerto/task/ui/UserTableCellEditor.java
24,12 → 24,11
 
public class UserTableCellEditor extends DefaultCellEditor {
 
public UserTableCellEditor() {
this(new UserComboBox());
}
private final UserManager uMngr;
 
public UserTableCellEditor(UserComboBox userComboBox) {
public UserTableCellEditor(final UserManager uMngr, UserComboBox userComboBox) {
super(userComboBox);
this.uMngr = uMngr;
}
 
public Object getCellEditorValue() {
38,7 → 37,7
 
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
if (value instanceof Integer) {
User u = UserManager.getInstance().getUser((Integer) value);
User u = this.uMngr.getUser((Integer) value);
value = new IComboSelectionItem(u.getId(), u.getFullName());
}
return super.getTableCellEditorComponent(table, value, isSelected, row, column);
/trunk/OpenConcerto/src/org/openconcerto/task/ui/UserRightPanelDetail.java
13,8 → 13,7
package org.openconcerto.task.ui;
 
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLRowValues;
22,6 → 21,7
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.User;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.task.UserTaskRight;
import org.openconcerto.ui.DisplayabilityListener;
import org.openconcerto.utils.ExceptionHandler;
48,7 → 48,8
 
JLabel labelDocumentation1 = new JLabel("");
JLabel labelDocumentation2 = new JLabel("");
UserListModel model = new UserListModel();
private final UserListModel model;
private final SQLTable tableTacheRights;
UserTaskRightListCellRenderer cellRenderer1 = new UserTaskRightListCellRenderer(UserTaskRightListCellRenderer.READ);
UserTaskRightListCellRenderer cellRenderer2 = new UserTaskRightListCellRenderer(UserTaskRightListCellRenderer.MODIFY);
UserTaskRightListCellRenderer cellRenderer3 = new UserTaskRightListCellRenderer(UserTaskRightListCellRenderer.ADD);
59,7 → 60,9
private JList list3;
private JList list4;
 
UserRightPanelDetail() {
UserRightPanelDetail(final UserManager uMngr, final DBRoot root) {
this.model = new UserListModel(uMngr);
this.tableTacheRights = root.getTable("TACHE_RIGHTS");
this.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(4, 10, 2, 2);
186,9 → 189,6
}
 
protected void swapState(User user, User toUser, String field) {
final SQLBase defaultBase = Configuration.getInstance().getBase();
final SQLTable tableTacheRights = defaultBase.getTable("TACHE_RIGHTS");
 
final SQLSelect sel = new SQLSelect();
sel.addSelectStar(tableTacheRights);
Where where = new Where(tableTacheRights.getField("ID_USER_COMMON"), "=", user.getId());
/trunk/OpenConcerto/src/org/openconcerto/task/ui/UserComboBox.java
15,7 → 15,6
 
import org.openconcerto.sql.sqlobject.IComboSelectionItem;
import org.openconcerto.sql.users.User;
import org.openconcerto.sql.users.UserManager;
 
import java.util.List;
 
22,9 → 21,6
import javax.swing.JComboBox;
 
public class UserComboBox extends JComboBox {
public UserComboBox() {
this(UserManager.getInstance().getAllUser());
}
 
public UserComboBox(final List<User> items) {
final int size = items.size();
/trunk/OpenConcerto/src/org/openconcerto/task/ui/UserListModel.java
19,15 → 19,15
import org.openconcerto.sql.users.User;
import org.openconcerto.sql.users.UserManager;
 
import java.util.List;
 
import javax.swing.DefaultListModel;
 
public class UserListModel extends DefaultListModel {
public class UserListModel extends DefaultListModel<User> {
private final UserManager uMngr;
private final SQLTableModifiedListener l;
private SQLTable t;
 
public UserListModel() {
public UserListModel(final UserManager uMngr) {
this.uMngr = uMngr;
this.l = new SQLTableModifiedListener() {
@Override
public void tableModified(SQLTableEvent evt) {
39,7 → 39,7
 
public final void start() {
if (this.t == null) {
this.t = UserManager.getInstance().getTable();
this.t = this.uMngr.getTable();
this.t.addTableModifiedListener(this.l);
this.l.tableModified(null);
}
56,9 → 56,7
* Reload
*/
private void reload() {
List<User> users = UserManager.getInstance().getAllUser();
for (int i = 0; i < users.size(); i++) {
User u = users.get(i);
for (final User u : this.uMngr.getUsers().values()) {
addElement(u);
}
}
/trunk/OpenConcerto/src/org/openconcerto/task/TodoListElementEditorPanel.java
88,7 → 88,7
c.gridwidth = 2;
c.insets = new Insets(2, 2, 2, 2);
c.fill = GridBagConstraints.HORIZONTAL;
JLabel label = new JLabel(TM.getTM().trM("todoBefore", "date", e.getExpectedDate(), "user", UserManager.getInstance().getUser(e.getUserId()).getFullName()));
JLabel label = new JLabel(TM.getTM().trM("todoBefore", "date", e.getExpectedDate(), "user", e.getUser().getFullName()));
this.add(label, c);
// Ligne 4 =====================================
JButton bOk = new JButton(TM.tr("ok"));
/trunk/OpenConcerto/src/org/openconcerto/task/TodoListElement.java
16,6 → 16,8
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.users.User;
import org.openconcerto.sql.users.UserManager;
 
import java.sql.SQLException;
import java.util.Calendar;
25,9 → 27,11
 
public class TodoListElement {
 
SQLRowValues rowVals;
private final UserManager uMngr;
private SQLRowValues rowVals;
 
public TodoListElement(SQLRowValues rowVals) {
public TodoListElement(final UserManager uMngr, SQLRowValues rowVals) {
this.uMngr = uMngr;
this.rowVals = rowVals;
}
 
151,6 → 155,10
return this.rowVals.getInt("ID_USER_COMMON_TO");
}
 
public User getUser() {
return this.uMngr.getUser(getUserId());
}
 
/**
* Returns the user who created the task.
*
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/PaiementRemainedProvider.java
57,7 → 57,7
}
if (r.getTable().contains("ACOMPTE_COMMANDE") && r.getBigDecimal("ACOMPTE_COMMANDE") != null) {
long totalAcompte = r.getBigDecimal("ACOMPTE_COMMANDE").movePointRight(2).setScale(0, RoundingMode.HALF_UP).longValue();
if (totalEch > totalAcompte) {
if (totalEch >= totalAcompte) {
totalEch -= totalAcompte;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/provider/ArticleCodeClientProvider.java
Nouveau fichier
0,0 → 1,70
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.generationDoc.provider;
 
import org.openconcerto.erp.generationDoc.SpreadSheetCellValueContext;
import org.openconcerto.erp.generationDoc.SpreadSheetCellValueProvider;
import org.openconcerto.erp.generationDoc.SpreadSheetCellValueProviderManager;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
 
import java.util.Arrays;
import java.util.List;
 
public class ArticleCodeClientProvider implements SpreadSheetCellValueProvider {
 
final private String parentTableField, field;
 
public ArticleCodeClientProvider(String parentTableField, String field) {
this.parentTableField = parentTableField;
this.field = field;
}
 
public Object getValue(SpreadSheetCellValueContext context) {
SQLRowAccessor row = context.getRow();
if (row.getObject("ID_ARTICLE") != null && !row.isForeignEmpty("ID_ARTICLE")) {
int idClient = row.getForeign(this.parentTableField).getForeignID("ID_CLIENT");
SQLSelect sel = new SQLSelect();
final SQLTable tableCodeClient = row.getTable().getTable("ARTICLE_CODE_CLIENT");
sel.addSelectStar(tableCodeClient);
Where w = new Where(tableCodeClient.getField("ID_ARTICLE"), "=", row.getForeignID("ID_ARTICLE"));
w = w.and(new Where(tableCodeClient.getField("ID_CLIENT"), "=", idClient));
sel.setWhere(w);
List<SQLRow> result = SQLRowListRSH.execute(sel);
if (result.size() > 0) {
final String val = result.get(0).getString(this.field);
if (val.length() > 0) {
return val;
}
}
}
return row.getString(this.field);
}
 
public static void register() {
List<String> fields = Arrays.asList("CODE", "NOM");
for (String string : fields) {
SpreadSheetCellValueProviderManager.put("sales.customer.product.quote." + string.toLowerCase(), new ArticleCodeClientProvider("ID_DEVIS", string));
SpreadSheetCellValueProviderManager.put("sales.customer.product.shipment." + string.toLowerCase(), new ArticleCodeClientProvider("ID_BON_DE_LIVRAISON", string));
SpreadSheetCellValueProviderManager.put("sales.customer.product.order." + string.toLowerCase(), new ArticleCodeClientProvider("ID_COMMANDE_CLIENT", string));
SpreadSheetCellValueProviderManager.put("sales.customer.product.invoice." + string.toLowerCase(), new ArticleCodeClientProvider("ID_SAISIE_VENTE_FACTURE", string));
SpreadSheetCellValueProviderManager.put("sales.customer.product.credit." + string.toLowerCase(), new ArticleCodeClientProvider("ID_AVOIR_CLIENT", string));
}
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOXMLCache.java
40,9 → 40,14
 
public class OOXMLCache {
 
private ITransformer<List<SQLRowAccessor>, List<SQLRowAccessor>> postProcess = null;
private Map<SQLRowAccessor, Map<SQLTable, List<SQLRowAccessor>>> cacheReferent = new HashMap<SQLRowAccessor, Map<SQLTable, List<SQLRowAccessor>>>();
private Map<String, Map<Integer, SQLRowAccessor>> cacheForeign = new HashMap<String, Map<Integer, SQLRowAccessor>>();
 
public void setPostProcess(ITransformer<List<SQLRowAccessor>, List<SQLRowAccessor>> postProcess) {
this.postProcess = postProcess;
}
 
protected SQLRowAccessor getForeignRow(SQLRowAccessor row, SQLField field) {
Map<Integer, SQLRowAccessor> c = cacheForeign.get(field.getName());
 
71,7 → 76,7
 
}
 
protected List<? extends SQLRowAccessor> getReferentRows(List<? extends SQLRowAccessor> row, SQLTable tableForeign) {
public List<? extends SQLRowAccessor> getReferentRows(List<? extends SQLRowAccessor> row, SQLTable tableForeign) {
return getReferentRows(row, tableForeign, null, null, false, null, false);
}
 
89,8 → 94,15
} else if (row.size() > 0 && (groupBy == null || groupBy.trim().length() == 0)) {
 
list = new ArrayList<SQLRowAccessor>();
SQLSelect sel = new SQLSelect();
sel.addSelectStar(tableForeign);
// SQLSelect sel = new SQLSelect();
// sel.addSelectStar(tableForeign);
SQLRowValues rowValsToFetch = new SQLRowValues(tableForeign);
rowValsToFetch.putNulls(tableForeign.getFieldsName());
if (tableForeign.getFieldsName().contains("ID_ARTICLE")) {
SQLRowValues rowValsToFetchArt = new SQLRowValues(tableForeign.getForeignTable("ID_ARTICLE"));
rowValsToFetchArt.putNulls(rowValsToFetchArt.getTable().getFieldsName());
rowValsToFetch.put("ID_ARTICLE", rowValsToFetchArt);
}
 
Where w = null;
if (foreignField != null && foreignField.trim().length() > 0) {
118,11 → 130,20
if (excludeQteZero) {
w = w.and(new Where(tableForeign.getField("QTE"), "!=", 0));
}
sel.setWhere(w);
addSelectOrder(tableForeign, orderBy, sel);
System.err.println(sel.asString());
list.addAll(SQLRowListRSH.execute(sel));
final Where wFinal = w;
SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(rowValsToFetch);
fetcher.setSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
@Override
public SQLSelect transformChecked(SQLSelect sel) {
sel.setWhere(wFinal);
addSelectOrder(tableForeign, orderBy, sel);
System.err.println(sel.asString());
return sel;
}
});
 
list.addAll(fetcher.fetch());
 
} else {
 
final List<String> params = SQLRow.toList(groupBy);
167,6 → 188,9
if (expandNomenclature) {
list = expandNomenclature(list);
}
if (this.postProcess != null) {
list = this.postProcess.transformChecked(list);
}
 
if (c == null) {
Map<SQLTable, List<SQLRowAccessor>> map = new HashMap<SQLTable, List<SQLRowAccessor>>();
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/AbstractJOOReportsSheet.java
174,7 → 174,7
if (ooConnexion == null) {
return;
}
final Component doc = ooConnexion.loadDocument(fileOutOO, !show);
final Component doc = ooConnexion.loadDocument(fileOutOO, true);
 
if (this.savePDF()) {
File pdfOutputDir = DocumentLocalStorageManager.getInstance().getPDFOutputDirectory(getDefaultTemplateID());
191,9 → 191,11
 
} catch (Exception e) {
e.printStackTrace();
ExceptionHandler.handle("Impossible de charger le document OpenOffice", e);
ExceptionHandler.handle("Impossible de créer le document PDF", e);
}
 
if (show) {
FileUtils.openFile(fileOutOO);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/SheetXml.java
25,7 → 25,9
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.utils.ExceptionHandler;
import org.openconcerto.utils.cc.ITransformer;
 
import java.awt.print.PrinterJob;
import java.io.BufferedInputStream;
52,6 → 54,12
 
public abstract class SheetXml {
 
private ITransformer<List<SQLRowAccessor>, List<SQLRowAccessor>> postProcess = null;
 
public ITransformer<List<SQLRowAccessor>, List<SQLRowAccessor>> getPostProcess() {
return postProcess;
}
 
// INSTEAD USE THE PREF IN L.O. CALC --> Formules, toujours recalculer
private boolean refreshFormulasRequired = false;
 
64,6 → 72,15
public String getStoragePath(SheetXml sheet);
}
 
/**
* Post process line
*
* @param postProcess
*/
public void setPostProcess(ITransformer<List<SQLRowAccessor>, List<SQLRowAccessor>> postProcess) {
this.postProcess = postProcess;
}
 
private static StorageDirs STORAGE_DIRS;
 
// allow to redirect all documents
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/gestcomm/ReportingTaxeComplementaireSheetXML.java
Nouveau fichier
0,0 → 1,213
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
/*
* Créé le 19 nov. 2012
*/
package org.openconcerto.erp.generationDoc.gestcomm;
 
import org.openconcerto.erp.generationDoc.AbstractListeSheetXml;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.utils.cc.ITransformer;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public class ReportingTaxeComplementaireSheetXML extends AbstractListeSheetXml {
 
public static final String TEMPLATE_ID = "ReportingTaxeComplementaire";
public static final String TEMPLATE_PROPERTY_NAME = DEFAULT_PROPERTY_NAME;
private Date date;
 
private Date dateD, dateF;
 
public ReportingTaxeComplementaireSheetXML(Date debut, Date fin) {
super();
 
this.dateD = debut;
this.dateF = fin;
 
}
 
@Override
public String getStoragePathP() {
return "Autres";
}
 
@Override
public String getDefaultTemplateId() {
return TEMPLATE_ID;
}
 
@Override
public String getName() {
if (this.date == null) {
this.date = new Date();
}
return "ReportingTaxeCompl" + this.date.getTime();
}
 
@Override
protected void createListeValues() {
 
this.mapAllSheetValues = new HashMap<Integer, Map<String, Object>>();
this.listAllSheetValues = new HashMap<Integer, List<Map<String, Object>>>();
this.styleAllSheetValues = new HashMap<Integer, Map<Integer, String>>();
 
fillSynthese();
 
}
 
private static SQLTable tableVF = Configuration.getInstance().getDirectory().getElement("SAISIE_VENTE_FACTURE").getTable();
 
class TaxeComplRecap {
private final String code, nom;
private BigDecimal percentTaxe, totalBase, qte;
 
public TaxeComplRecap(String code, String nom, BigDecimal percentTaxe) {
this.code = code;
this.nom = nom;
this.qte = BigDecimal.ZERO;
this.percentTaxe = percentTaxe;
this.totalBase = BigDecimal.ZERO;
}
 
public void cumul(BigDecimal qte, BigDecimal total) {
this.qte = qte.add(this.qte);
this.totalBase = total.add(this.totalBase);
}
 
public String getCode() {
return code;
}
 
public String getNom() {
return nom;
}
 
public BigDecimal getQte() {
return qte;
}
 
public BigDecimal getPercentTaxe() {
return percentTaxe;
 
}
 
public BigDecimal getTotalBase() {
return totalBase;
}
 
public BigDecimal getTotalTaxe() {
return this.totalBase.multiply(this.percentTaxe.movePointLeft(2)).setScale(2, RoundingMode.HALF_UP);
}
 
public BigDecimal getTotalBaseHT() {
return this.totalBase.subtract(getTotalTaxe());
}
}
 
private void fillSynthese() {
final SQLTable tableVF = Configuration.getInstance().getRoot().findTable("SAISIE_VENTE_FACTURE");
final SQLTable tableVFElt = Configuration.getInstance().getRoot().findTable("SAISIE_VENTE_FACTURE_ELEMENT");
 
SQLRowValues rowvalsVF = new SQLRowValues(tableVF);
rowvalsVF.put("NUMERO", null);
rowvalsVF.put("DATE", null);
 
SQLRowValues rowvalsVFElt = new SQLRowValues(tableVFElt);
rowvalsVFElt.put("ID_SAISIE_VENTE_FACTURE", rowvalsVF);
rowvalsVFElt.put("T_PV_HT", null);
rowvalsVFElt.put("QTE", null);
rowvalsVFElt.put("QTE_UNITAIRE", null);
rowvalsVFElt.putRowValues("ID_ARTICLE").putRowValues("ID_TAXE_COMPLEMENTAIRE").putNulls("CODE", "NOM", "POURCENT");
 
SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(rowvalsVFElt);
fetcher.setSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
 
@Override
public SQLSelect transformChecked(SQLSelect input) {
Where w = new Where(input.getAlias(tableVF).getField("DATE"), dateD, dateF);
input.setWhere(w);
return input;
}
});
 
Map<Integer, TaxeComplRecap> recap = new HashMap<Integer, ReportingTaxeComplementaireSheetXML.TaxeComplRecap>();
List<SQLRowValues> results = fetcher.fetch();
for (SQLRowValues sqlRowValues : results) {
TaxeComplRecap r;
if (sqlRowValues.getForeign("ID_ARTICLE") != null && !sqlRowValues.isForeignEmpty("ID_ARTICLE")) {
final SQLRowAccessor foreignArt = sqlRowValues.getForeign("ID_ARTICLE");
if (foreignArt.getForeign("ID_TAXE_COMPLEMENTAIRE") != null && !foreignArt.isForeignEmpty("ID_TAXE_COMPLEMENTAIRE")) {
final SQLRowAccessor foreignTaxeCompl = foreignArt.getForeign("ID_TAXE_COMPLEMENTAIRE");
if (recap.containsKey(foreignTaxeCompl.getID())) {
r = recap.get(foreignTaxeCompl.getID());
} else {
r = new TaxeComplRecap(foreignTaxeCompl.getString("CODE"), foreignTaxeCompl.getString("NOM"), foreignTaxeCompl.getBigDecimal("POURCENT"));
recap.put(foreignTaxeCompl.getID(), r);
}
r.cumul(sqlRowValues.getBigDecimal("QTE_UNITAIRE").multiply(new BigDecimal(sqlRowValues.getInt("QTE"))), sqlRowValues.getBigDecimal("T_PV_HT"));
}
}
}
 
List<Map<String, Object>> values = new ArrayList<Map<String, Object>>();
this.listAllSheetValues.put(0, values);
Map<Integer, String> style = new HashMap<Integer, String>();
this.styleAllSheetValues.put(0, style);
 
BigDecimal totalBaseHT = BigDecimal.ZERO;
BigDecimal totalTaxe = BigDecimal.ZERO;
BigDecimal qteTotal = BigDecimal.ZERO;
 
for (TaxeComplRecap item : recap.values()) {
Map<String, Object> vals = new HashMap<String, Object>();
 
vals.put("CODE", item.getCode());
vals.put("NOM", item.getNom());
vals.put("QTE", item.getQte());
vals.put("POURCENT", item.getPercentTaxe());
vals.put("TOTAL_BASE", item.getTotalBaseHT());
vals.put("TOTAL_TAXE", item.getTotalTaxe());
style.put(values.size(), "Normal");
totalBaseHT = totalBaseHT.add(item.getTotalBaseHT());
totalTaxe = totalTaxe.add(item.getTotalTaxe());
qteTotal = qteTotal.add(item.getQte());
values.add(vals);
}
 
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
Map<String, Object> vals = new HashMap<String, Object>();
vals.put("DATE_DEB", this.dateD);
vals.put("DATE_FIN", this.dateF);
vals.put("PERIODE", "Période du " + format.format(this.dateD) + " au " + format.format(this.dateF));
vals.put("TOTAL_TAXE", totalTaxe);
vals.put("TOTAL_BASE", totalBaseHT);
vals.put("TOTAL_QTE", qteTotal);
this.mapAllSheetValues.put(0, vals);
// style.put(values.size(), "Titre 1");
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/gestcomm/BonReceptionXmlSheet.java
25,7 → 25,7
public class BonReceptionXmlSheet extends AbstractSheetXMLWithDate {
 
public static final String TEMPLATE_ID = "BonReception";
public static final String TEMPLATE_PROPERTY_NAME = "LocationBon";
public static final String TEMPLATE_PROPERTY_NAME = "LocationBonR";
 
@Override
public SQLRow getRowLanguage() {
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/gestcomm/FactureFournisseurXmlSheet.java
25,7 → 25,7
public class FactureFournisseurXmlSheet extends AbstractSheetXMLWithDate {
 
public static final String TEMPLATE_ID = "FactureFournisseur";
public static final String TEMPLATE_PROPERTY_NAME = "LocationBon";
public static final String TEMPLATE_PROPERTY_NAME = "LocationFactureFournisseur";
 
@Override
public SQLRow getRowLanguage() {
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOXMLField.java
311,7 → 311,6
listOfExpectedValues = SQLRow.toList(this.elt.getAttributeValue("valuesExpected"));
}
 
String stringValue = (result == null) ? "" : result.toString();
if (typeComp != null && typeComp.trim().length() > 0) {
 
// Type spécial
324,6 → 323,9
sel.setWhere(w);
return this.row.getTable().getBase().getDataSource().executeScalar(sel.asString());
} else if (typeComp.equalsIgnoreCase("Devise")) {
if (result == null) {
return "";
}
Number prix = (Number) result;
if (listOfExpectedValues != null) {
for (String string : listOfExpectedValues) {
346,6 → 348,7
return result;
}
} else if (typeComp.equalsIgnoreCase("cumulPaye")) {
assertNonNull(typeComp, result, field, this.row);
double val = ((Number) result).doubleValue();
double valC;
if (this.row.getTable().getFieldsName().contains("ID_CUMULS_PAYE")) {
356,11 → 359,13
}
return new Double(val + valC);
} else if (typeComp.equalsIgnoreCase("cumulConges")) {
assertNonNull(typeComp, result, field, this.row);
double val = ((Number) result).doubleValue();
SQLRowAccessor refRow = this.row.getReferentRows(this.row.getTable().getTable("FICHE_PAYE")).iterator().next();
double valC = ((Number) refRow.getObject("CONGES_ACQUIS")).doubleValue();
return new Double(val + valC);
} else if (typeComp.equalsIgnoreCase("globalAcompte")) {
assertNonNull(typeComp, result, field, this.row);
Long prix = (Long) result;
int pourcent = this.row.getInt("POURCENT_ACOMPTE");
long l = Math.round(prix.longValue() / (pourcent / 100.0));
388,6 → 393,7
final long cumulPrecedent = getCumulPrecedent(this.row);
return new Double(GestionDevise.currencyToString(cumulPrecedent, false));
} else if (typeComp.equalsIgnoreCase("DeviseLettre")) {
assertNonNull(typeComp, result, field, this.row);
// Devise exprimée en lettre
Long prix = (Long) result;
String deviseLabel = this.elt.getAttributeValue("deviseLabel");
400,18 → 406,21
}
return getLettreFromDevise(prix.longValue(), Nombre.FR, Tuple2.create(deviseLabel, deviseCentLabel));
} else if (typeComp.equalsIgnoreCase("DeviseLettreEng")) {
assertNonNull(typeComp, result, field, this.row);
Long prix = (Long) result;
return getDeviseLettre(prix, Nombre.EN);
} else if (typeComp.equalsIgnoreCase("DeviseLettrePL")) {
assertNonNull(typeComp, result, field, this.row);
Long prix = (Long) result;
return getDeviseLettre(prix, Nombre.PL);
} else if (typeComp.equalsIgnoreCase("DeviseLettreES")) {
assertNonNull(typeComp, result, field, this.row);
Long prix = (Long) result;
return getDeviseLettre(prix, Nombre.ES);
} else if (typeComp.equalsIgnoreCase("VilleFull")) {
return this.row.getString("CODE_POSTAL") + " " + this.row.getString("VILLE");
} else if (typeComp.equalsIgnoreCase("Ville")) {
stringValue = (result == null) ? "" : result.toString();
String stringValue = (result == null) ? "" : result.toString();
return stringValue;
} else if (typeComp.equalsIgnoreCase("Traduction")) {
return getTraduction();
433,7 → 442,7
return getDateEcheance(idModeReglement, d, this.elt.getAttributeValue("datePattern"));
} else if (typeComp.equalsIgnoreCase("Jour")) {
int day = this.row.getInt(field);
stringValue = "le " + String.valueOf(day);
String stringValue = "le " + String.valueOf(day);
if (day == 31) {
return "fin de mois";
} else if (day == 0) {
455,13 → 464,13
return "";
}
} else if (typeComp.equalsIgnoreCase("initiale")) {
stringValue = (result == null) ? "" : result.toString();
String stringValue = (result == null) ? "" : result.toString();
if (stringValue.trim().length() > 0) {
stringValue = String.valueOf(stringValue.charAt(0));
}
return stringValue;
} else if (typeComp.equalsIgnoreCase("initiale2")) {
stringValue = (result == null) ? "" : result.toString();
String stringValue = (result == null) ? "" : result.toString();
if (stringValue.trim().length() > 0) {
stringValue = String.valueOf(stringValue.substring(0, 2));
}
473,6 → 482,12
return (result == null) ? "" : result;
}
 
private void assertNonNull(String type, Object result, String field, SQLRowAccessor row) {
if (result == null) {
throw new IllegalArgumentException("null value for " + type + " for field " + field + " in row : " + row.asRowValues().toString());
}
}
 
private Object getDeviseLettre(Long prix, int country) {
String deviseLabel = this.elt.getAttributeValue("deviseLabel");
if (deviseLabel == null || deviseLabel.trim().length() == 0) {
683,7 → 698,10
} else {
d2 = (o2 == null) ? BigDecimal.ZERO : new BigDecimal(o2.toString());
}
 
// Exemple cmdcliet.total - cmdclient.acompte
if (o1 != null && o1 instanceof Long && o2 != null && o2 instanceof BigDecimal) {
d2 = d2.movePointRight(2);
}
if (op.equalsIgnoreCase("+")) {
return d1.add(d2, DecimalUtils.HIGH_PRECISION);
} else {
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/OOgenerationXML.java
26,6 → 26,8
import org.openconcerto.openoffice.spreadsheet.SpreadSheet;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLBackgroundTableCache;
import org.openconcerto.sql.model.SQLBackgroundTableCacheItem;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
34,6 → 36,7
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.StreamUtils;
import org.openconcerto.utils.Tuple2;
import org.openconcerto.utils.cc.ITransformer;
 
import java.awt.Point;
import java.io.File;
46,7 → 49,6
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
88,6 → 90,10
this.row = row;
}
 
public void setPostProcess(ITransformer<List<SQLRowAccessor>, List<SQLRowAccessor>> postProcess) {
this.rowRefCache.setPostProcess(postProcess);
}
 
public synchronized File createDocument(String templateId, String typeTemplate, File outputDirectory, final String expectedFileName, SQLRow rowLanguage) {
return createDocument(templateId, typeTemplate, outputDirectory, expectedFileName, rowLanguage, null);
}
374,6 → 380,8
// BigDecimal portHT, SQLRow rowTVAPort, SQLTable tableEchantillon,
// SQLRow defaultCompte) {
SQLTable tableElt = Configuration.getInstance().getRoot().findTable(tableau.getAttributeValue("table"));
SQLBackgroundTableCacheItem cacheItem = SQLBackgroundTableCache.getInstance().getCacheForTable(tableElt.getTable("COMPTE_PCE"));
SQLBackgroundTableCacheItem prefsCpt = SQLBackgroundTableCache.getInstance().getCacheForTable(tableElt.getTable("PREFS_COMPTE"));
if (tableElt.contains("ID_TAXE") && tableElt.contains("T_PA_HT")) {
boolean achat = tableElt.contains("T_PA_TTC");
TotalCalculator calc = new TotalCalculator("T_PA_HT", achat ? "T_PA_HT" : "T_PV_HT", null, achat, null);
382,13 → 390,13
 
calc.setServiceActive(bServiceActive != null && bServiceActive);
if (row.getTable().contains("ID_COMPTE_PCE_SERVICE") && !row.isForeignEmpty("ID_COMPTE_PCE_SERVICE")) {
SQLRowAccessor serviceCompte = row.getForeign("ID_COMPTE_PCE_SERVICE");
SQLRowAccessor serviceCompte = cacheItem.getRowFromId(row.getForeignID("ID_COMPTE_PCE_SERVICE"));
if (!serviceCompte.isUndefined()) {
calc.setRowDefaultCptService(serviceCompte);
}
}
if (row.getTable().contains("ID_COMPTE_PCE_VENTE") && !row.isForeignEmpty("ID_COMPTE_PCE_VENTE")) {
SQLRowAccessor produitCompte = row.getForeign("ID_COMPTE_PCE_VENTE");
SQLRowAccessor produitCompte = cacheItem.getRowFromId(row.getForeignID("ID_COMPTE_PCE_VENTE"));
if (!produitCompte.isUndefined()) {
calc.setRowDefaultCptProduit(produitCompte);
}
396,9 → 404,6
long remise = 0;
BigDecimal totalAvtRemise = BigDecimal.ZERO;
SQLTable tableEchantillon = null;
if (row.getTable().getName().equalsIgnoreCase("SAISIE_VENTE_FACTURE") && row.getTable().getDBRoot().contains("ECHANTILLON_ELEMENT")) {
tableEchantillon = row.getTable().getTable("ECHANTILLON_ELEMENT");
}
if (row.getTable().contains("REMISE_HT")) {
remise = row.getLong("REMISE_HT");
if (remise != 0) {
409,7 → 414,7
if (tableEchantillon != null) {
List<SQLRow> rowsEch = row.getReferentRows(tableEchantillon);
for (SQLRow sqlRow : rowsEch) {
calc.addEchantillon((BigDecimal) sqlRow.getObject("T_PV_HT"), sqlRow.getForeign("ID_TAXE"));
calc.addEchantillon((BigDecimal) sqlRow.getObject("T_PV_HT"), TaxeCache.getCache().getRowFromId(sqlRow.getForeignID("ID_TAXE")));
}
}
calc.checkResult();
440,12 → 445,12
if (tableEchantillon != null) {
List<SQLRow> rowsEch = row.getReferentRows(tableEchantillon);
for (SQLRow sqlRow : rowsEch) {
calc.addEchantillon((BigDecimal) sqlRow.getObject("T_PV_HT"), sqlRow.getForeign("ID_TAXE"));
calc.addEchantillon((BigDecimal) sqlRow.getObject("T_PV_HT"), TaxeCache.getCache().getRowFromId(sqlRow.getForeignID("ID_TAXE")));
}
}
SQLRowAccessor rowTVAPort = null;
if (row.getTable().contains("ID_TAXE_PORT")) {
rowTVAPort = row.getForeign("ID_TAXE_PORT");
rowTVAPort = TaxeCache.getCache().getRowFromId(row.getForeignID("ID_TAXE_PORT"));
}
if (rowTVAPort != null && !rowTVAPort.isUndefined()) {
SQLRowValues rowValsPort = new SQLRowValues(tableElt);
453,11 → 458,10
rowValsPort.put("QTE", 1);
rowValsPort.put("ID_TAXE", rowTVAPort.getIDNumber());
 
final SQLTable tablePrefCompte = Configuration.getInstance().getRoot().findTable("PREFS_COMPTE");
final SQLRow rowPrefsCompte = tablePrefCompte.getRow(2);
final SQLRow rowPrefsCompte = prefsCpt.getRowFromId(2);
SQLRow rowDefaultCptPort;
if (rowTVAPort.getFloat("TAUX") > 0) {
rowDefaultCptPort = rowPrefsCompte.getForeign("ID_COMPTE_PCE_PORT_SOUMIS");
rowDefaultCptPort = cacheItem.getRowFromId(rowPrefsCompte.getForeignID("ID_COMPTE_PCE_PORT_SOUMIS"));
if (rowDefaultCptPort == null || rowDefaultCptPort.isUndefined()) {
try {
rowDefaultCptPort = ComptePCESQLElement.getRowComptePceDefault("PortVenteSoumisTVA");
466,7 → 470,7
}
}
} else {
rowDefaultCptPort = rowPrefsCompte.getForeign("ID_COMPTE_PCE_PORT_NON_SOUMIS");
rowDefaultCptPort = cacheItem.getRowFromId(rowPrefsCompte.getForeignID("ID_COMPTE_PCE_PORT_NON_SOUMIS"));
if (rowDefaultCptPort == null || rowDefaultCptPort.isUndefined()) {
try {
rowDefaultCptPort = ComptePCESQLElement.getRowComptePceDefault("PortVenteNonSoumisTVA");
504,7 → 508,7
int currentLineTmp = tableElement.getFirstLine();
int currentLine = tableElement.getFirstLine();
 
SQLElement styleElt = Configuration.getInstance().getDirectory().getElement("STYLE");
StyleSQLElement styleElt = Configuration.getInstance().getDirectory().getElement(StyleSQLElement.class);
 
boolean cache = false;
String ref = tableau.getAttributeValue("table") + "_" + row.getTable().getName() + row.getID();
523,7 → 527,7
final boolean included = isIncluded(tableElement.getFilterId(), tableElement.getForeignTableWhere(), tableElement.getFilterId(), tableElement.getFieldWhere(), rowElt);
String styleName = null;
if (tableElement.getSQLElement().getTable().contains("ID_STYLE")) {
styleName = styleElt.getTable().getRow(rowElt.getForeignID("ID_STYLE")).getString("NOM");
styleName = styleElt.getAllStyleByIds().get(rowElt.getForeignID("ID_STYLE"));
}
 
if ((included || tableElement.getTypeStyleWhere()) && (styleName == null || !styleName.equalsIgnoreCase("Invisible"))) {
/trunk/OpenConcerto/src/org/openconcerto/erp/generationDoc/AbstractSheetXml.java
62,6 → 62,7
templateStream.close();
}
final OOgenerationXML oXML = new OOgenerationXML(AbstractSheetXml.this.row);
oXML.setPostProcess(getPostProcess());
AbstractSheetXml.this.generatedOpenDocumentFile = oXML.createDocument(templateId, getType(), getDocumentOutputDirectory(), getValidFileName(getName()), getRowLanguage(),
AbstractSheetXml.this.getMetaGeneration());
if (isRefreshFormulasRequired()) {
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationReglementVenteNG.java
22,6 → 22,7
import org.openconcerto.erp.core.finance.payment.element.ModeDeReglementSQLElement;
import org.openconcerto.erp.core.finance.payment.element.TypeReglementSQLElement;
import org.openconcerto.erp.model.PrixTTC;
import org.openconcerto.erp.preferences.GestionCommercialeGlobalPreferencePanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
31,6 → 32,7
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.preferences.SQLPreferences;
import org.openconcerto.utils.cc.ITransformer;
 
import java.sql.SQLException;
316,8 → 318,11
private void paiementCheque(Date dateEch, SQLRow source, PrixTTC ttc, SQLRow rowClient, SQLRow modeRegl, SQLRow mvtSource, boolean avance) throws Exception {
 
SQLRowValues valCheque = new SQLRowValues(base.getTable("CHEQUE_A_ENCAISSER"));
SQLPreferences prefs = SQLPreferences.getMemCached(valCheque.getTable().getDBRoot());
boolean createEcr = prefs.getBoolean(GestionCommercialeGlobalPreferencePanel.CREATE_ECR_CHQ, true);
 
valCheque.put("ID_CLIENT", rowClient.getID());
 
valCheque.put("SANS_VALEUR_ENCAISSEMENT", !createEcr);
final String foreignBanqueFieldName = "ID_" + BanqueSQLElement.TABLENAME;
if (valCheque.getTable().contains(foreignBanqueFieldName))
valCheque.put(foreignBanqueFieldName, modeRegl.getInt(foreignBanqueFieldName));
339,40 → 344,43
rowVals.update(this.idMvt);
}
 
int idCompteClient = rowClient.getInt("ID_COMPTE_PCE");
if (avance) {
idCompteClient = rowPrefsCompte.getInt("ID_COMPTE_PCE_AVANCE_CLIENT");
if (idCompteClient <= 1) {
idCompteClient = ComptePCESQLElement.getIdComptePceDefault("AvanceClients");
}
} else {
if (createEcr) {
int idCompteClient = rowClient.getInt("ID_COMPTE_PCE");
if (avance) {
idCompteClient = rowPrefsCompte.getInt("ID_COMPTE_PCE_AVANCE_CLIENT");
if (idCompteClient <= 1) {
idCompteClient = ComptePCESQLElement.getIdComptePceDefault("AvanceClients");
}
} else {
 
// compte Clients
// compte Clients
 
if (idCompteClient <= 1) {
idCompteClient = rowPrefsCompte.getInt("ID_COMPTE_PCE_CLIENT");
if (idCompteClient <= 1) {
idCompteClient = ComptePCESQLElement.getIdComptePceDefault("Clients");
idCompteClient = rowPrefsCompte.getInt("ID_COMPTE_PCE_CLIENT");
if (idCompteClient <= 1) {
idCompteClient = ComptePCESQLElement.getIdComptePceDefault("Clients");
}
}
}
}
this.mEcritures.put("ID_JOURNAL", JournalSQLElement.BANQUES);
this.mEcritures.put("ID_COMPTE_PCE", idCompteClient);
this.mEcritures.put("DEBIT", Long.valueOf(0));
this.mEcritures.put("CREDIT", Long.valueOf(ttc.getLongValue()));
 
this.ecrClient = ajoutEcriture();
this.mEcritures.put("ID_JOURNAL", JournalSQLElement.BANQUES);
this.mEcritures.put("ID_COMPTE_PCE", idCompteClient);
this.mEcritures.put("DEBIT", Long.valueOf(0));
this.mEcritures.put("CREDIT", Long.valueOf(ttc.getLongValue()));
 
// compte de reglement, caisse, cheque, ...
int idCompteRegl = rowPrefsCompte.getInt("ID_COMPTE_PCE_VALEUR_ENCAISSEMENT");
if (idCompteRegl <= 1) {
idCompteRegl = ComptePCESQLElement.getIdComptePceDefault("ValeurEncaissement");
this.ecrClient = ajoutEcriture();
 
// compte de reglement, caisse, cheque, ...
int idCompteRegl = rowPrefsCompte.getInt("ID_COMPTE_PCE_VALEUR_ENCAISSEMENT");
if (idCompteRegl <= 1) {
idCompteRegl = ComptePCESQLElement.getIdComptePceDefault("ValeurEncaissement");
}
this.mEcritures.put("ID_COMPTE_PCE", Integer.valueOf(idCompteRegl));
this.mEcritures.put("DEBIT", Long.valueOf(ttc.getLongValue()));
this.mEcritures.put("CREDIT", Long.valueOf(0));
 
ajoutEcriture();
}
this.mEcritures.put("ID_COMPTE_PCE", Integer.valueOf(idCompteRegl));
this.mEcritures.put("DEBIT", Long.valueOf(ttc.getLongValue()));
this.mEcritures.put("CREDIT", Long.valueOf(0));
 
ajoutEcriture();
 
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtReglementAvoir.java
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.core.finance.payment.element.ModeDeReglementSQLElement;
import org.openconcerto.erp.core.finance.payment.element.TypeReglementSQLElement;
import org.openconcerto.erp.model.PrixTTC;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowValues;
92,13 → 93,16
ajoutEcriture();
 
// compte de reglement, caisse, cheque, ...
int idCompteRegl = typeRegRow.getInt("ID_COMPTE_PCE_CLIENT");
if (idCompteRegl <= 1) {
if (typeRegRow.getID() == TypeReglementSQLElement.ESPECE) {
int idCompteRegl = typeRegRow.getInt("ID_COMPTE_PCE_CLIENT");
if (idCompteRegl <= 1) {
idCompteRegl = ComptePCESQLElement.getIdComptePceDefault("VenteEspece");
}
 
idCompteRegl = ComptePCESQLElement.getIdComptePceDefault("VenteCB");
 
this.mEcritures.put("ID_COMPTE_PCE", Integer.valueOf(idCompteRegl));
} else {
fillCompteBanqueFromRow(modeRegRow, "VenteCB", false);
}
this.mEcritures.put("ID_COMPTE_PCE", new Integer(idCompteRegl));
this.mEcritures.put("DEBIT", new Long(0));
this.mEcritures.put("CREDIT", new Long(prixTTC.getLongValue()));
ajoutEcriture();
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtSaisieVenteFacture.java
127,9 → 127,6
}
 
SQLTable tableEchantillon = null;
if (saisieVFTable.getDBRoot().contains("ECHANTILLON_ELEMENT")) {
tableEchantillon = saisieVFTable.getTable("ECHANTILLON_ELEMENT");
}
BigDecimal portHT = BigDecimal.valueOf(saisieRow.getLong("PORT_HT")).movePointLeft(2);
TotalCalculator calc;
if (clientRow.getTable().contains("ID_COMPTE_PCE_PRODUIT") && !clientRow.isForeignEmpty("ID_COMPTE_PCE_PRODUIT")) {
138,29 → 135,37
} else {
calc = getValuesFromElement(saisieRow, saisieVFTable.getTable("SAISIE_VENTE_FACTURE_ELEMENT"), portHT, saisieRow.getForeign("ID_TAXE_PORT"), tableEchantillon);
}
Map<SQLRowAccessor, BigDecimal> compl = calc.getMapHtTaxeCompl();
for (SQLRowAccessor rowCompl : compl.keySet()) {
if (compl.get(rowCompl) != null) {
long taxeC = compl.get(rowCompl).multiply(rowCompl.getBigDecimal("POURCENT").movePointLeft(2)).setScale(2, RoundingMode.HALF_UP).movePointRight(2).longValue();
this.mEcritures.put("ID_COMPTE_PCE", rowCompl.getForeignID("ID_COMPTE_PCE"));
this.mEcritures.put("DEBIT", Long.valueOf(0));
this.mEcritures.put("CREDIT", Long.valueOf(taxeC));
ajoutEcriture();
 
this.mEcritures.put("ID_COMPTE_PCE", rowCompl.getForeignID("ID_COMPTE_PCE_PRODUITS"));
this.mEcritures.put("DEBIT", Long.valueOf(taxeC));
this.mEcritures.put("CREDIT", Long.valueOf(0));
ajoutEcriture();
}
}
// On génére les ecritures si la facture n'est pas un acompte
long ttcLongValue = calc.getTotalTTC().movePointRight(2).longValue();
if (acompte == null || !acompte) {
 
Map<SQLRowAccessor, Map<SQLRowAccessor, BigDecimal>> taxeCompl = calc.getMapHtTaxeCompl();
for (SQLRowAccessor row : calc.getMapHt().keySet()) {
long b = calc.getMapHt().get(row).setScale(2, RoundingMode.HALF_UP).movePointRight(2).longValue();
if (b != 0) {
final Integer idComptePCE;
long taxe = 0;
 
if (taxeCompl.containsKey(row)) {
Map<SQLRowAccessor, BigDecimal> compl = taxeCompl.get(row);
for (SQLRowAccessor rowCompl : compl.keySet()) {
if (compl.get(rowCompl) != null) {
long taxeC = compl.get(rowCompl).multiply(rowCompl.getBigDecimal("POURCENT").movePointLeft(2)).setScale(2, RoundingMode.HALF_UP).movePointRight(2).longValue();
this.mEcritures.put("ID_COMPTE_PCE", rowCompl.getForeignID("ID_COMPTE_PCE"));
this.mEcritures.put("DEBIT", Long.valueOf(0));
this.mEcritures.put("CREDIT", Long.valueOf(taxeC));
ajoutEcriture();
taxe += taxeC;
// this.mEcritures.put("ID_COMPTE_PCE",
// rowCompl.getForeignID("ID_COMPTE_PCE_PRODUITS"));
// this.mEcritures.put("DEBIT", Long.valueOf(taxeC));
// this.mEcritures.put("CREDIT", Long.valueOf(0));
// ajoutEcriture();
}
}
}
// TODO check if taxe compl > b
if (this.useComptePCEVente) {
// Utilise le compte de la facture
idComptePCE = saisieRow.getInt("ID_COMPTE_PCE_VENTE");
167,9 → 172,10
} else {
idComptePCE = Integer.valueOf(row.getID());
}
 
this.mEcritures.put("ID_COMPTE_PCE", idComptePCE);
this.mEcritures.put("DEBIT", Long.valueOf(0));
this.mEcritures.put("CREDIT", Long.valueOf(b));
this.mEcritures.put("CREDIT", Long.valueOf(b - taxe));
ajoutEcriture();
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtFichePaye.java
27,6 → 27,8
import org.openconcerto.utils.GestionDevise;
import org.openconcerto.utils.Tuple2;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
35,8 → 37,6
import java.util.Map;
import java.util.Map.Entry;
 
import org.apache.commons.dbutils.handlers.ArrayListHandler;
 
public final class GenerationMvtFichePaye extends GenerationEcritures implements Runnable {
 
private int[] idFichePaye;
114,16 → 114,43
}
// Salaire Brut Debit
// float totalSalaireBrut = 0.0F;
// Salaire Brut Debit
for (int i = 0; i < this.idFichePaye.length; i++) {
BigDecimal totalSalaireBrut = BigDecimal.ZERO;
 
// on recupere les élements de la fiche
// ensemble des net
SQLSelect selAllFicheElt = new SQLSelect();
 
selAllFicheElt.addSelectStar(tableFichePayeElt);
 
Where w = new Where(tableFichePayeElt.getField("ID_FICHE_PAYE"), "=", this.idFichePaye[i]);
w = w.and(new Where(tableFichePayeElt.getField("SOURCE"), "=", "RUBRIQUE_BRUT"));
 
selAllFicheElt.setWhere(w);
selAllFicheElt.addFieldOrder(tableFichePayeElt.getField("POSITION"));
List<SQLRow> resultElt = SQLRowListRSH.execute(selAllFicheElt);
 
for (SQLRow row : resultElt) {
 
if (row.getBigDecimal("MONTANT_SAL_DED") != null) {
totalSalaireBrut = totalSalaireBrut.subtract(row.getBigDecimal("MONTANT_SAL_DED"));
}
 
if (row.getBigDecimal("MONTANT_SAL_AJ") != null) {
totalSalaireBrut = totalSalaireBrut.add(row.getBigDecimal("MONTANT_SAL_AJ"));
}
}
 
SQLRow rowFiche = tableFichePaye.getRow(this.idFichePaye[i]);
SQLRow rowSal = tableSalarie.getRow(rowFiche.getInt("ID_SALARIE"));
this.mEcritures.put("NOM", rowSal.getString("NOM") + " " + this.nom);
this.mEcritures.put("ID_COMPTE_PCE", Integer.valueOf(idComptePaye));
 
float sal = rowFiche.getFloat("SAL_BRUT");
// float sal = rowFiche.getFloat("SAL_BRUT");
// totalSalaireBrut += sal;
 
this.mEcritures.put("DEBIT", Long.valueOf(GestionDevise.parseLongCurrency(String.valueOf(sal))));
this.mEcritures.put("DEBIT", totalSalaireBrut.setScale(2, RoundingMode.HALF_UP).movePointRight(2).longValue());
this.mEcritures.put("CREDIT", Long.valueOf(0));
ajoutEcriture();
}
196,10 → 223,10
this.mEcritures.put("DEBIT", Long.valueOf(0));
this.mEcritures.put("CREDIT", -montant);
ajoutEcriture();
// this.mEcritures.put("CREDIT", Long.valueOf(0));
// this.mEcritures.put("DEBIT", -montant);
// this.mEcritures.put("ID_COMPTE_PCE", idComptePayeRegl);
// ajoutEcriture();
// this.mEcritures.put("CREDIT", Long.valueOf(0));
// this.mEcritures.put("DEBIT", -montant);
// this.mEcritures.put("ID_COMPTE_PCE", idComptePayeRegl);
// ajoutEcriture();
}
}
}
206,8 → 233,34
 
}
 
// Salaire Brut Credit
// Salaire Net Credit
for (int i = 0; i < this.idFichePaye.length; i++) {
BigDecimal totalSalaireNet = BigDecimal.ZERO;
 
// on recupere les élements de la fiche
// ensemble des net
SQLSelect selAllFicheElt = new SQLSelect();
 
selAllFicheElt.addSelectStar(tableFichePayeElt);
 
Where w = new Where(tableFichePayeElt.getField("ID_FICHE_PAYE"), "=", this.idFichePaye[i]);
w = w.and(new Where(tableFichePayeElt.getField("SOURCE"), "=", "RUBRIQUE_NET")
.or(new Where(tableFichePayeElt.getField("SOURCE"), "=", "RUBRIQUE_BRUT").or(new Where(tableFichePayeElt.getField("SOURCE"), "=", "RUBRIQUE_COTISATION"))));
 
selAllFicheElt.setWhere(w);
selAllFicheElt.addFieldOrder(tableFichePayeElt.getField("POSITION"));
List<SQLRow> resultElt = SQLRowListRSH.execute(selAllFicheElt);
 
for (SQLRow row : resultElt) {
 
if (row.getBigDecimal("MONTANT_SAL_DED") != null) {
totalSalaireNet = totalSalaireNet.subtract(row.getBigDecimal("MONTANT_SAL_DED"));
}
 
if (row.getBigDecimal("MONTANT_SAL_AJ") != null) {
totalSalaireNet = totalSalaireNet.add(row.getBigDecimal("MONTANT_SAL_AJ"));
}
}
SQLRow rowFiche = tableFichePaye.getRow(this.idFichePaye[i]);
SQLRow rowSal = tableSalarie.getRow(rowFiche.getInt("ID_SALARIE"));
SQLRow rowRegl = tableReglementPaye.getRow(rowSal.getInt("ID_REGLEMENT_PAYE"));
218,10 → 271,10
this.mEcritures.put("ID_COMPTE_PCE", Integer.valueOf(idComptePayeRegl));
this.mEcritures.put("NOM", rowSal.getString("NOM") + " " + this.nom);
 
float sal = rowFiche.getFloat("NET_A_PAYER");
// float sal = rowFiche.getFloat("NET_A_PAYER");
 
this.mEcritures.put("DEBIT", Long.valueOf(0));
this.mEcritures.put("CREDIT", Long.valueOf(GestionDevise.parseLongCurrency(String.valueOf(sal))));
this.mEcritures.put("CREDIT", totalSalaireNet.setScale(2, RoundingMode.HALF_UP).movePointRight(2).longValue());
ajoutEcriture();
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtReglementChequeClient.java
19,6 → 19,7
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLTable;
 
33,12 → 34,14
private static final SQLTable tablePrefCompte = base.getTable("PREFS_COMPTE");
private static final SQLRow rowPrefsCompte = tablePrefCompte.getRow(2);
private int idCheque;
private SQLRowAccessor banque;
 
public GenerationMvtReglementChequeClient(int idMvt, long montant, Date d, int idCheque, String s) {
public GenerationMvtReglementChequeClient(int idMvt, long montant, Date d, int idCheque, String s, SQLRowAccessor banque) {
this.montant = montant;
this.date = d;
this.idMvt = idMvt;
this.idCheque = idCheque;
this.banque = banque;
SQLRow chequeRow = base.getTable("CHEQUE_A_ENCAISSER").getRow(this.idCheque);
String num = "";
if (chequeRow != null && !chequeRow.isUndefined() && chequeRow.getString("NUMERO").trim().length() > 0) {
62,7 → 65,12
this.mEcritures.put("NOM", this.nom);
this.mEcritures.put("ID_MOUVEMENT", new Integer(this.idMvt));
 
fillJournalBanqueFromRow(chequeRow);
if (this.banque == null || this.banque.isUndefined() || this.banque.isForeignEmpty("ID_JOURNAL")) {
fillJournalBanqueFromRow(chequeRow);
} else {
int idJrnl = this.banque.getForeignID("ID_JOURNAL");
this.mEcritures.put("ID_JOURNAL", idJrnl);
}
 
setDateReglement(this.idCheque, this.date);
 
/trunk/OpenConcerto/src/org/openconcerto/erp/generationEcritures/GenerationMvtAvoirClient.java
104,28 → 104,34
} else {
calc = getValuesFromElement(avoirRow, avoirRow.getTable().getTable("AVOIR_CLIENT_ELEMENT"), portHT, null, null);
}
Map<SQLRowAccessor, Map<SQLRowAccessor, BigDecimal>> taxeCompl = calc.getMapHtTaxeCompl();
 
Map<SQLRowAccessor, BigDecimal> compl = calc.getMapHtTaxeCompl();
for (SQLRowAccessor rowCompl : compl.keySet()) {
if (compl.get(rowCompl) != null) {
long taxeC = compl.get(rowCompl).multiply(rowCompl.getBigDecimal("POURCENT").movePointLeft(2)).setScale(2, RoundingMode.HALF_UP).movePointRight(2).longValue();
this.mEcritures.put("ID_COMPTE_PCE", rowCompl.getForeignID("ID_COMPTE_PCE"));
this.mEcritures.put("CREDIT", Long.valueOf(0));
this.mEcritures.put("DEBIT", Long.valueOf(taxeC));
ajoutEcriture();
 
this.mEcritures.put("ID_COMPTE_PCE", rowCompl.getForeignID("ID_COMPTE_PCE_PRODUITS"));
this.mEcritures.put("CREDIT", Long.valueOf(taxeC));
this.mEcritures.put("DEBIT", Long.valueOf(0));
ajoutEcriture();
}
}
 
for (SQLRowAccessor row : calc.getMapHt().keySet()) {
long b = calc.getMapHt().get(row).setScale(2, RoundingMode.HALF_UP).movePointRight(2).longValue();
if (b != 0) {
long taxe = 0;
 
if (taxeCompl.containsKey(row)) {
Map<SQLRowAccessor, BigDecimal> compl = taxeCompl.get(row);
for (SQLRowAccessor rowCompl : compl.keySet()) {
if (compl.get(rowCompl) != null) {
long taxeC = compl.get(rowCompl).multiply(rowCompl.getBigDecimal("POURCENT").movePointLeft(2)).setScale(2, RoundingMode.HALF_UP).movePointRight(2).longValue();
this.mEcritures.put("ID_COMPTE_PCE", rowCompl.getForeignID("ID_COMPTE_PCE"));
this.mEcritures.put("CREDIT", Long.valueOf(0));
this.mEcritures.put("DEBIT", Long.valueOf(taxeC));
ajoutEcriture();
taxe += taxeC;
// this.mEcritures.put("ID_COMPTE_PCE",
// rowCompl.getForeignID("ID_COMPTE_PCE_PRODUITS"));
// this.mEcritures.put("CREDIT", Long.valueOf(taxeC));
// this.mEcritures.put("DEBIT", Long.valueOf(0));
// ajoutEcriture();
}
}
}
 
this.mEcritures.put("ID_COMPTE_PCE", row.getID());
this.mEcritures.put("DEBIT", Long.valueOf(b));
this.mEcritures.put("DEBIT", Long.valueOf(b - taxe));
this.mEcritures.put("CREDIT", Long.valueOf(0));
SQLRow rowEcr = ajoutEcriture();
// addAssocAnalytiqueFromProvider(rowEcr, avoirRow);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/CustomerSQLElement.java
17,8 → 17,14
import org.openconcerto.sql.element.GlobalMapper;
import org.openconcerto.sql.element.GroupSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.request.SQLFieldTranslator;
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
import org.openconcerto.ui.light.LightUIElement;
import org.openconcerto.ui.light.LightUILine;
import org.openconcerto.ui.light.LightUIPanel;
import org.openconcerto.ui.light.SimpleTextLine;
 
import java.util.List;
 
29,7 → 35,7
final CustomerGroup group = new CustomerGroup();
GlobalMapper.getInstance().map(CustomerGroup.ID, group);
setDefaultGroup(group);
 
PredicateRowAction actionAttachment = new PredicateRowAction(new AttachmentAction().getAction(), true);
actionAttachment.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(actionAttachment);
54,4 → 60,33
fields.add("OBSOLETE");
return fields;
}
 
@Override
protected void fillDataPanel(final String sessionToken, final List<SQLRowAccessor> selection, final LightUIPanel dataPanel) {
final SQLFieldTranslator translator = this.getDirectory().getTranslator();
final SQLRowAccessor sqlRow = selection.get(0);
 
final int rowId = sqlRow.getID();
final LightUILine mainLine = new LightUILine();
final LightUIPanel mainLinePanel = new LightUIPanel(dataPanel.getId() + ".main.line." + rowId);
mainLinePanel.setWeightX(1);
 
final SimpleTextLine spacer = new SimpleTextLine("", true, LightUIElement.HALIGN_LEFT, 2);
spacer.setMarginBottom(4);
 
String name = sqlRow.getString("NOM");
 
mainLinePanel.addChild(new SimpleTextLine(name, true, LightUIElement.HALIGN_LEFT));
 
final SimpleTextLine titleSituationContact = new SimpleTextLine("Coordonnées du client", true, LightUIElement.HALIGN_LEFT, 2);
titleSituationContact.setMarginTop(10);
mainLinePanel.addChild(titleSituationContact);
 
addFieldToPanel("TEL", mainLinePanel, sqlRow, translator, true, "non renseigné");
addFieldToPanel("MAIL", mainLinePanel, sqlRow, translator, true, "non renseigné");
 
mainLine.addChild(mainLinePanel);
dataPanel.addChild(mainLine);
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/CustomerSQLComponent.java
16,6 → 16,7
import org.openconcerto.erp.core.common.component.AdresseSQLComponent;
import org.openconcerto.erp.core.common.element.NumerotationAutoSQLElement;
import org.openconcerto.erp.core.customerrelationship.customer.ui.AdresseClientItemTable;
import org.openconcerto.erp.core.sales.product.element.ClientCodeArticleTable;
import org.openconcerto.erp.preferences.ModeReglementDefautPrefPanel;
import org.openconcerto.erp.utils.TM;
import org.openconcerto.sql.Configuration;
72,6 → 73,7
 
public class CustomerSQLComponent extends GroupSQLComponent {
private ContactItemTable table;
private ClientCodeArticleTable tableCustomProduct;
private AdresseClientItemTable adresseTable = new AdresseClientItemTable();
private SQLTable contactTable = Configuration.getInstance().getDirectory().getElement("CONTACT").getTable();
private final SQLTable tableNum = getTable().getBase().getTable("NUMEROTATION_AUTO");
92,6 → 94,7
public CustomerSQLComponent(SQLElement element) {
super(element);
this.table = new ContactItemTable(this.defaultContactRowVals);
this.tableCustomProduct = new ClientCodeArticleTable();
this.table.setPreferredSize(new Dimension(this.table.getSize().width, 150));
}
 
160,6 → 163,8
return new JDate(true);
} else if (id.equals("customerrelationship.customer.contacts")) {
return this.table;
} else if (id.equals("customerrelationship.customer.customproduct")) {
return this.tableCustomProduct;
} else if (id.equals("customerrelationship.customer.addresses")) {
return createAdressesComponent();
} else if (id.equals("NOM")) {
236,6 → 241,7
super.update();
final int selectedID = getSelectedID();
this.table.updateField("ID_CLIENT", selectedID);
this.tableCustomProduct.updateField("ID_CLIENT", selectedID);
this.adresseTable.updateField("ID_CLIENT", selectedID);
}
 
246,6 → 252,7
this.checkAdrFacturation.setSelected(r == null || !r.getFields().contains("ID_ADRESSE_F") || r.isForeignEmpty("ID_ADRESSE_F"));
if (r != null) {
this.table.insertFrom("ID_CLIENT", r.asRowValues());
this.tableCustomProduct.insertFrom("ID_CLIENT", r.asRowValues());
this.adresseTable.insertFrom("ID_CLIENT", r.asRowValues());
}
}
284,6 → 291,7
} else {
id = super.insert(order);
this.table.updateField("ID_CLIENT", id);
this.tableCustomProduct.updateField("ID_CLIENT", id);
this.adresseTable.updateField("ID_CLIENT", id);
if (NumerotationAutoSQLElement.getNextNumero(getElement().getClass()).equalsIgnoreCase(this.code.getText().trim())) {
SQLRowValues rowVals = new SQLRowValues(this.tableNum);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/customerrelationship/customer/element/CustomerGroup.java
80,9 → 80,15
gState.addItem("ID_LANGUE");
gState.addItem("ID_TARIF");
 
final Group gCustomProduct = new Group("customerrelationship.customer.customproduct", LayoutHints.DEFAULT_SEPARATED_GROUP_HINTS);
gCustomProduct.addItem("customerrelationship.customer.customproduct", new LayoutHints(true, true, true, true, true, true, true, true));
this.add(gCustomProduct);
 
this.add(gState);
final Group gInfo = new Group("customerrelationship.customer.info", LayoutHints.DEFAULT_SEPARATED_GROUP_HINTS);
gInfo.addItem("CODE_FOURNISSEUR");
gInfo.addItem("REMIND_DATE");
gInfo.addItem("CONDITIONS_LIVRAISON", 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
44,43 → 44,48
 
public ClientNormalSQLElement() {
super("CLIENT", "un client", "clients");
final String property = PrinterNXProps.getInstance().getProperty("QLPrinter");
if (property != null && property.trim().length() > 0) {
PredicateRowAction actionPrintLabel = new PredicateRowAction(new AbstractAction() {
try {
final String property = PrinterNXProps.getInstance().getProperty("QLPrinter");
if (property != null && property.trim().length() > 0) {
PredicateRowAction actionPrintLabel = new PredicateRowAction(new AbstractAction() {
 
@Override
public void actionPerformed(ActionEvent e) {
final SQLRowAccessor row = IListe.get(e).fetchSelectedRow();
printLabel(row, property);
}
}, false, "customerrelationship.customer.label.print");
actionPrintLabel.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(actionPrintLabel);
}
 
PredicateRowAction actionFicheClient = new PredicateRowAction(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
final SQLRowAccessor row = IListe.get(e).fetchSelectedRow();
printLabel(row, property);
FicheClientXmlSheet sheet = new FicheClientXmlSheet(row.asRow());
sheet.createDocumentAsynchronous();
sheet.showPrintAndExportAsynchronous(true, false, true);
}
}, false, "customerrelationship.customer.label.print");
actionPrintLabel.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(actionPrintLabel);
}
}, false, "customerrelationship.customer.info.create");
actionFicheClient.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(actionFicheClient);
 
PredicateRowAction actionFicheClient = new PredicateRowAction(new AbstractAction() {
 
PredicateRowAction action = new PredicateRowAction(new AbstractAction() {
 
@Override
public void actionPerformed(ActionEvent e) {
final SQLRowAccessor row = IListe.get(e).fetchSelectedRow();
FicheClientXmlSheet sheet = new FicheClientXmlSheet(row.asRow());
sheet.createDocumentAsynchronous();
sheet.showPrintAndExportAsynchronous(true, false, true);
sendMail(IListe.get(e).getSelectedRows());
 
}
}, false, "customerrelationship.customer.info.create");
actionFicheClient.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(actionFicheClient);
}, true, "customerrelationship.customer.email.send");
action.setPredicate(IListeEvent.getNonEmptySelectionPredicate());
getRowActions().add(action);
 
 
PredicateRowAction action = new PredicateRowAction(new AbstractAction() {
 
@Override
public void actionPerformed(ActionEvent e) {
sendMail(IListe.get(e).getSelectedRows());
 
}
}, true, "customerrelationship.customer.email.send");
action.setPredicate(IListeEvent.getNonEmptySelectionPredicate());
getRowActions().add(action);
} catch (Exception e) {
e.printStackTrace();
}
}
 
public void printLabel(SQLRowAccessor row, String qlPrinterProperty) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/model/Currency.java
110,6 → 110,7
mapSymbol.put("MYR", "RM");
mapSymbol.put("MUR", "₨");
mapSymbol.put("MXN", "$");
mapSymbol.put("MRO", "UM");
mapSymbol.put("MNT", "₮");
mapSymbol.put("MZN", "MT");
mapSymbol.put("NAD", "$");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/element/ComptePCESQLElement.java
23,9 → 23,9
import org.openconcerto.sql.model.SQLBackgroundTableCache;
import org.openconcerto.sql.model.SQLBackgroundTableCacheItem;
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.SQLRowListRSH;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
47,7 → 47,9
import java.awt.event.ActionEvent;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
 
import javax.swing.AbstractAction;
60,6 → 62,75
 
public class ComptePCESQLElement extends ComptaSQLConfElement {
 
private static Map<String, String> mapCompteDefault = new HashMap<String, String>();
 
static {
// "Fournisseurs"
// "Achats"
// "Clients"
// "VentesProduits"
// "VentesServices"
// "TVACollectee"
// "TVADeductible"
// "PayeAcompte"
// "PayeReglementAcompte"
// "PayeRemunerationPersonnel"
// "PayeReglement"
// "AchatCheque"
// "AchatCB"
// "AchatTraite"
// "AchatEspece"
// "VenteCheque"
// "VenteCB"
// "VenteTraite"
// "VenteEspece"
// "TVAIntraComm"
// "TVAImmo"
// "BilanOuverture"
// "BilanFermeture"
// "Resultat"
// "AchatsIntra"
// "ResultatPerte"
// "Factor"
// "PortVenteSoumisTVA"
// "PortVenteNonSoumisTVA"
// "AvanceClients"
// "ValeurEncaissement"
 
mapCompteDefault.put("FOURNISSEURS", "40");
mapCompteDefault.put("ACHATS", "60");
mapCompteDefault.put("CLIENTS", "41");
mapCompteDefault.put("VENTESPRODUITS", "701");
mapCompteDefault.put("VENTESSERVICES", "706");
mapCompteDefault.put("TVACOLLECTEE", "4457");
mapCompteDefault.put("TVADEDUCTIBLE", "4456");
mapCompteDefault.put("PAYEACOMPTE", "425");
mapCompteDefault.put("PAYEREGLEMENTACOMPTE", "511");
mapCompteDefault.put("PAYEREMUNERATIONPERSONNEL", "641");
mapCompteDefault.put("PAYEREGLEMENT", "421");
mapCompteDefault.put("ACHATCHEQUE", "512");
mapCompteDefault.put("ACHATCB", "512");
mapCompteDefault.put("ACHATTRAITE", "512");
mapCompteDefault.put("ACHATESPECE", "53");
mapCompteDefault.put("VENTECHEQUE", "512");
mapCompteDefault.put("VENTECB", "512");
mapCompteDefault.put("VENTETRAITE", "512");
mapCompteDefault.put("VENTEESPECE", "53");
mapCompteDefault.put("TVAINTRACOMM", "4452");
mapCompteDefault.put("TVAIMMO", "445620");
mapCompteDefault.put("BILANOUVERTURE", "890");
mapCompteDefault.put("BILANFERMETURE", "891");
mapCompteDefault.put("RESULTAT", "120");
mapCompteDefault.put("ACHATSINTRA", "607120");
mapCompteDefault.put("RESULTATPERTE", "129");
mapCompteDefault.put("FACTOR", "467000");
mapCompteDefault.put("PORTVENTESOUMISTVA", "708510");
mapCompteDefault.put("PORTVENTENONSOUMISTVA", "708520");
mapCompteDefault.put("AVANCECLIENTS", "4191");
mapCompteDefault.put("VALEURENCAISSEMENT", "511");
 
}
 
public ComptePCESQLElement() {
super("COMPTE_PCE", "un compte", "comptes");
 
257,13 → 328,20
SQLBase base = ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete();
SQLTable compteTable = base.getTable("COMPTE_PCE");
 
SQLSelect selCompte = new SQLSelect();
selCompte.addSelectStar(compteTable);
selCompte.setWhere(new Where(compteTable.getField("NUMERO"), "=", numero.trim()));
final SQLBackgroundTableCacheItem cacheForTable = SQLBackgroundTableCache.getInstance().getCacheForTable(compteTable);
if (numero == null) {
throw new IllegalArgumentException("null numero");
}
 
List<SQLRow> myListCompte = SQLRowListRSH.execute(selCompte);
if (myListCompte.size() != 0) {
return myListCompte.get(0);
final SQLField field = compteTable.getField("NUMERO");
if (field == null) {
throw new IllegalArgumentException("no field NUMERO in table " + compteTable.getName());
}
 
SQLRow res = cacheForTable.getFirstRowContains(numero.trim(), field);
 
if (res != null) {
return res;
} else {
 
SQLRowValues rowVals = new SQLRowValues(compteTable);
309,14 → 387,17
* @throws IllegalArgumentException
*/
public static String getComptePceDefault(final String name) throws IllegalArgumentException {
final SQLBase base = Configuration.getInstance().getBase();
final SQLTable tableDefault = base.getTable("COMPTE_PCE_DEFAULT");
final SQLSelect sel = new SQLSelect();
sel.addSelect(tableDefault.getField("NUMERO_DEFAULT"));
// final SQLBase base = Configuration.getInstance().getBase();
// final SQLTable tableDefault = base.getTable("COMPTE_PCE_DEFAULT");
// final SQLSelect sel = new SQLSelect();
// sel.addSelect(tableDefault.getField("NUMERO_DEFAULT"));
//
// sel.setWhere(Where.quote("UPPER(%n) = %s", tableDefault.getField("NOM"),
// name.toUpperCase()));
//
// String numero = (String) base.getDataSource().executeScalar(sel.asString());
 
sel.setWhere(Where.quote("UPPER(%n) = %s", tableDefault.getField("NOM"), name.toUpperCase()));
 
String numero = (String) base.getDataSource().executeScalar(sel.asString());
String numero = mapCompteDefault.get(name.toUpperCase());
if (numero == null) {
throw new IllegalArgumentException("Impossible de trouver le compte PCE par défaut " + name);
} else {
324,12 → 405,16
}
}
 
public static int getIdComptePceDefault(final String name) throws Exception {
public static void setComptePceDefault(final String name, final String numero) {
mapCompteDefault.put(name, numero);
}
 
public static int getIdComptePceDefault(final String name) throws IllegalArgumentException {
final String numeroDefault = getComptePceDefault(name);
return getId(numeroDefault);
}
 
public static SQLRow getRowComptePceDefault(final String name) throws Exception {
public static SQLRow getRowComptePceDefault(final String name) throws IllegalArgumentException {
final String numeroDefault = getComptePceDefault(name);
return getRow(numeroDefault, "création automatique");
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/JournauxSheetXML.java
25,9 → 25,8
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.utils.GestionDevise;
import org.openconcerto.utils.StringUtils;
import org.openconcerto.utils.cc.ITransformer;
 
import java.text.DateFormat;
48,8 → 47,8
public final static int MODELETTREE = 2;
public final static int MODENONLETTREE = 3;
 
private final static DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
private final static DateFormat dateFormatEcr = DateFormat.getDateInstance(DateFormat.SHORT);
private final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
private final DateFormat dateFormatEcr = DateFormat.getDateInstance(DateFormat.SHORT);
protected Date dateDu, dateAu;
protected int id;
protected int lettrage;
141,7 → 140,7
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), (Object) JournauxSheetXML.this.compteDeb, (Object) JournauxSheetXML.this.compteEnd));
}
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/GrandLivreSheet.java
25,7 → 25,7
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.utils.GestionDevise;
import org.openconcerto.utils.cc.ITransformer;
 
51,8 → 51,8
private final static SQLTable tableMvt = base.getTable("MOUVEMENT");
private final static SQLTable tableCompte = base.getTable("COMPTE_PCE");
 
private final static DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
private final static DateFormat dateFormatEcr = DateFormat.getDateInstance(DateFormat.SHORT);
private final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
private final DateFormat dateFormatEcr = DateFormat.getDateInstance(DateFormat.SHORT);
private SQLRow rowSociete = ((ComptaPropsConfiguration) Configuration.getInstance()).getRowSociete();
 
private Date dateDu, dateAu;
189,7 → 189,7
w = w.and(new Where(tableEcriture.getField("ID_COMPTE_PCE"), lCompteSolde).not());
}
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/Map2033A.java
311,7 → 311,7
// 068 SommeSoldeDebit( 410, 418* )
// Racine = "410-411, 413, 416-418"
// S068=41(D)...411+41A(D)...41Z+413(D)+416(D)...418
long v068 = this.sommeCompte.soldeCompteDebiteur(411, 411, true, this.dateDebut, this.dateFin) + this.sommeCompte.sommeCompteFils("413", this.dateDebut, this.dateFin)
long v068 = this.sommeCompte.soldeCompteDebiteur(410, 411, true, this.dateDebut, this.dateFin) + this.sommeCompte.sommeCompteFils("413", this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteDebiteur(416, 418, true, this.dateDebut, this.dateFin);
this.m.put("ACTIF1.8", GestionDevise.currencyToString(v068, false));
 
687,8 → 687,7
- this.sommeCompte.soldeCompte(1684, 1689, true, this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("17", this.dateDebut, this.dateFin)
- this.sommeCompte.sommeCompteFils("426", this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(450, 454, true, this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(456, 456, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(458, 459, true, this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(512, 512, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(514, 514, true, this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(517, 517, true, this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("5186", this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(512, 517, true, this.dateDebut, this.dateFin) - this.sommeCompte.sommeCompteFils("518", this.dateDebut, this.dateFin)
- this.sommeCompte.sommeCompteFils("519", this.dateDebut, this.dateFin);
this.m.put("PASSIF3.25", GestionDevise.currencyToString(v156, false));
 
701,7 → 700,7
// 164 -SommeSolde( 4190, 4195* )
// Racine = "4191"
// S164=-4191
long v164 = -this.sommeCompte.soldeCompte(4191, 4191, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(510, 517, true, this.dateDebut, this.dateFin);
long v164 = -this.sommeCompte.soldeCompte(4191, 4191, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(510, 511, true, this.dateDebut, this.dateFin);
this.m.put("PASSIF3.26", GestionDevise.currencyToString(v164, false));
 
// 152
787,7 → 786,7
* false) - this.sommeCompte.sommeCompteFils("509");
*/
 
long v172 = this.sommeCompte.soldeCompteCrediteur(411, 411, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(421, 421, true, this.dateDebut, this.dateFin)
long v172 = this.sommeCompte.soldeCompteCrediteur(410, 411, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(421, 421, true, this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(422, 422, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(424, 424, true, this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(427, 427, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(4282, 4282, true, this.dateDebut, this.dateFin)
+ this.sommeCompte.soldeCompteCrediteur(4284, 4284, true, this.dateDebut, this.dateFin) + this.sommeCompte.soldeCompteCrediteur(4286, 4286, true, this.dateDebut, this.dateFin)
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/JournauxMoisSheet.java
17,7 → 17,7
import org.openconcerto.erp.rights.ComptaUserRight;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.utils.GestionDevise;
 
import java.text.DateFormat;
37,12 → 37,12
this.modele = "JournauxMois.ods";
}
 
private static DateFormat dateFormatMonth = new SimpleDateFormat("MMMM");
private static DateFormat dateFormatYear = new SimpleDateFormat("yyyy");
private static DateFormat dateFormatPG = new SimpleDateFormat("yyyy-MM-dd");
 
@Override
protected void createMap() {
final DateFormat dateFormatMonth = new SimpleDateFormat("MMMM");
final DateFormat dateFormatYear = new SimpleDateFormat("yyyy");
final DateFormat dateFormatPG = new SimpleDateFormat("yyyy-MM-dd");
 
this.mapReplace = new HashMap();
this.mCell = new HashMap();
this.mapStyleRow = new HashMap();
92,7 → 92,7
select += " AND \"" + schema + "\".\"JOURNAL\".\"ARCHIVE\"!=1";
select += " AND \"" + schema + "\".\"ECRITURE\".\"ARCHIVE\"!=1";
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
select += " AND \"" + schema + "\".\"ECRITURE\".\"COMPTE_NUMERO\" LIKE '411%'";
}
141,6 → 141,8
* CONTENU
**************************************************************************************/
Calendar cal = Calendar.getInstance();
// 1 er Jour du mois, sinon si on est aprés le 29 du mois, probleme pour février
cal.set(Calendar.DAY_OF_MONTH, 1);
// && (posLine % endFill !=0)
for (int j = 0; (j < endFill - debutFill + 1) && i < l.size(); j++) {
tmp = (Object[]) l.get(i);
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/JournauxSheet.java
25,7 → 25,7
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.utils.GestionDevise;
import org.openconcerto.utils.cc.ITransformer;
 
47,14 → 47,14
public final static int MODELETTREE = 2;
public final static int MODENONLETTREE = 3;
 
private final static DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
private final static DateFormat dateFormatEcr = DateFormat.getDateInstance(DateFormat.SHORT);
private final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
private final DateFormat dateFormatEcr = DateFormat.getDateInstance(DateFormat.SHORT);
protected Date dateDu, dateAu;
protected int[] idS;
protected int lettrage;
private String compteDeb, compteEnd;
 
public static String TEMPLATE_ID = "Journaux";
public static String TEMPLATE_ID = "JournauxAncien";
public static String TEMPLATE_PROPERTY_NAME = "LocationJournaux";
 
public static void setSize(int debut, int fin) {
81,7 → 81,7
Calendar cal = Calendar.getInstance();
cal.setTime(au);
this.printer = PrinterNXProps.getInstance().getStringProperty("JournauxPrinter");
this.modele = "Journaux.ods";
this.modele = getTemplateId() + ".ods";
this.dateAu = au;
this.dateDu = du;
this.idS = id;
167,7 → 167,7
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), (Object) JournauxSheet.this.compteDeb, (Object) JournauxSheet.this.compteEnd));
}
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/report/GrandLivreSheetXML.java
25,7 → 25,7
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.utils.GestionDevise;
import org.openconcerto.utils.cc.ITransformer;
 
48,8 → 48,8
private final static SQLTable tableMvt = base.getTable("MOUVEMENT");
private final static SQLTable tableCompte = base.getTable("COMPTE_PCE");
 
private final static DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
private final static DateFormat dateFormatEcr = DateFormat.getDateInstance(DateFormat.SHORT);
private final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
private final DateFormat dateFormatEcr = DateFormat.getDateInstance(DateFormat.SHORT);
private SQLRow rowSociete = ((ComptaPropsConfiguration) Configuration.getInstance()).getRowSociete();
 
private Date dateDu, dateAu;
204,7 → 204,7
}
w = w.and(new Where(tableEcriture.getField("NOM"), "NOT LIKE", "Fermeture du compte%"));
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(tableEcriture.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/action/ListeDesEcrituresAction.java
34,7 → 34,7
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.view.IListFrame;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.IListe;
72,7 → 72,7
 
final SQLTableModelSourceOnline src;
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
src = element.getTableSource(true);
src.getReq().setWhere(new Where(element.getTable().getField("COMPTE_NUMERO"), "LIKE", "411%"));
} else {
142,10 → 142,11
frame.getPanel().getListe().setSQLEditable(false);
 
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {
JPopupMenu menuDroit = new JPopupMenu();
menuDroit.add(new AbstractAction("Consultation du compte") {
menuDroit.add(new AbstractAction("Consultation du compte") {
public void actionPerformed(ActionEvent event) {
SQLRowAccessor row = frame.getPanel().getListe().getSelectedRow();
((EcritureSQLElement) element).consultationCompte(ComptePCESQLElement.getRow(row.getString("COMPTE_NUMERO"), row.getString("COMPTE_NOM")));
156,6 → 157,14
EcritureSQLElement.contrePassationPiece(frame.getPanel().getListe().getSelectedId());
}
});
// menuDroit.add(new AbstractAction("Valider le mouvement") {
// public void actionPerformed(ActionEvent event) {
// if (JOptionPane.showConfirmDialog(null, "Etes vous sûr de vouloir valider le
// mouvement?") == JOptionPane.YES_OPTION) {
// EcritureSQLElement.validationEcritures(frame.getPanel().getListe().getSelectedRow().getInt("ID_MOUVEMENT"));
// }
// }
// });
 
menuDroit.add(new AbstractAction("Dupliquer") {
public void actionPerformed(ActionEvent event) {
209,7 → 218,7
public void correctNomPiece() {
SQLTable tableMvt = Configuration.getInstance().getRoot().findTable("MOUVEMENT");
SQLTable tablePiece = Configuration.getInstance().getRoot().findTable("PIECE");
SQLSelect sel = new SQLSelect(tableMvt.getBase());
SQLSelect sel = new SQLSelect();
sel.addSelect(tableMvt.getKey());
sel.addSelect(tableMvt.getField("SOURCE"));
sel.addSelect(tableMvt.getField("IDSOURCE"));
238,7 → 247,6
try {
rowVals.update();
} catch (SQLException exn) {
// TODO Bloc catch auto-généré
exn.printStackTrace();
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/PointagePanel.java
27,7 → 27,7
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JDate;
581,7 → 581,7
 
Where w = new Where(this.tableEcr.getField("ID_COMPTE_PCE"), "=", idCpt);
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(this.tableEcr.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/ListeEcritureParClassePanel.java
23,7 → 23,7
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLSystem;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.sql.view.list.SQLTableModelSourceOnline;
117,13 → 117,13
String function = "REGEXP";
String match = ccTmp.getTypeNumeroCompte();
if (elementEcriture.getTable().getServer().getSQLSystem() == SQLSystem.POSTGRESQL) {
// function = "SIMILAR TO";
// function = "SIMILAR TO";
function = "~";
// match = ccTmp.getTypeNumeroCompte().replace(".*", "%");
// match = ccTmp.getTypeNumeroCompte().replace(".*", "%");
}
 
Where w = new Where(sel.getAlias(elementEcriture.getTable().getField("COMPTE_NUMERO")), function, match);
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI + Voir avec pour fonction LIKE -->
// differents par BD??
w = w.and(new Where(elementEcriture.getTable().getField("COMPTE_NUMERO"), "LIKE", "411%"));
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/EtatJournauxPanel.java
26,7 → 26,7
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.utils.GestionDevise;
 
65,7 → 65,7
 
private JTabbedPane tabbedJournaux;
private EventListenerList loadingListener = new EventListenerList();
private static final DateFormat dateFormat = new SimpleDateFormat("MMMM yyyy");
private final DateFormat dateFormat = new SimpleDateFormat("MMMM yyyy");
private static final SQLBase base = ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete();
private static final String baseName = ((ComptaPropsConfiguration) Configuration.getInstance()).getSocieteBaseName();
 
294,7 → 294,7
Where w = new Where(ecrTable.getField("ID_JOURNAL"), "=", jrnl.getId());
Where w2 = new Where(ecrTable.getField("DATE"), inf, sup);
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(ecrTable.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/ListPanelEcritures.java
15,7 → 15,6
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.common.ui.PanelFrame;
import org.openconcerto.erp.core.finance.accounting.element.EcritureSQLElement;
import org.openconcerto.erp.core.finance.accounting.element.MouvementSQLElement;
import org.openconcerto.erp.rights.ComptaUserRight;
import org.openconcerto.sql.Configuration;
22,7 → 21,7
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.view.IListener;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.IListe;
61,7 → 60,7
}
});
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
getListe().getRequest().setWhere(new Where(getElement().getTable().getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/ImportEcriturePanel.java
73,7 → 73,7
 
JLabel label = new JLabel("Import depuis un fichier CSV, XLS ou ODT.");
JLabel label2 = new JLabel("Le fichier doit contenir les colonnes :");
JLabel label3 = new JLabel(" - Date (format dd/MM/yy pour le CSV)");
JLabel label3 = new JLabel(" - Date dd/MM/yyyy (dd/MM/yy pour le CSV)");
JLabel label4 = new JLabel(" - Journal");
JLabel label5 = new JLabel(" - N° de compte");
JLabel label6 = new JLabel(" - Nom de la pièce");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/GrandLivrePanel.java
28,7 → 28,7
import org.openconcerto.sql.model.SQLSystem;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.utils.GestionDevise;
import org.openconcerto.utils.TableSorter;
203,7 → 203,7
Where w = new Where(compteTable.getField("NUMERO"), function, match);
Where w2 = new Where(ecritureTable.getField("ID_COMPTE_PCE"), "=", compteTable.getKey());
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(ecritureTable.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
229,7 → 229,8
 
Object[] objTmp = (Object[]) myList.get(i);
 
final Compte compteTmp = new Compte(((Number) objTmp[0]).intValue(), objTmp[1].toString(), objTmp[2].toString(), "", ((Number) objTmp[3]).longValue(), ((Number) objTmp[4]).longValue());
final Compte compteTmp = new Compte(((Number) objTmp[0]).intValue(), objTmp[1].toString(), objTmp[2].toString(), "", ((Number) objTmp[3]).longValue(),
((Number) objTmp[4]).longValue());
 
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/accounting/ui/LettragePanel.java
30,7 → 30,7
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JDate;
623,7 → 623,7
// filtre de selection
Where w = new Where(this.tableEcr.getField("ID_COMPTE_PCE"), "=", this.tableComptePCE.getKey());
 
if (!UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
if (!UserRightsManager.getCurrentUserRights().haveRight(ComptaUserRight.ACCES_NOT_RESCTRICTED_TO_411)) {
// TODO Show Restricted acces in UI
w = w.and(new Where(this.tableEcr.getField("COMPTE_NUMERO"), "LIKE", "411%"));
}
641,6 → 641,10
w = w.and(new Where(this.tableComptePCE.getKey(), "=", idCpt));
}
 
if (this.tableEcr.getFields().contains("HIDE_LETTRAGE")) {
w = w.and(new Where(this.tableEcr.getField("HIDE_LETTRAGE"), "=", Boolean.FALSE));
}
 
// final Calendar cal = Calendar.getInstance();
// cal.setTimeInMillis(this.rangeSlide.getValue(0));
//
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/tax/action/ReportingTaxeComplementairePanel.java
Nouveau fichier
0,0 → 1,106
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
/*
* Créé le 23 avr. 2012
*/
package org.openconcerto.erp.core.finance.tax.action;
 
import org.openconcerto.erp.generationDoc.gestcomm.ReportingTaxeComplementaireSheetXML;
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.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Calendar;
import java.util.concurrent.ExecutionException;
 
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
 
public class ReportingTaxeComplementairePanel extends JPanel {
 
public ReportingTaxeComplementairePanel() {
super(new GridBagLayout());
 
JLabel labelCom = new JLabel("Période du ");
 
GridBagConstraints c = new DefaultGridBagConstraints();
this.add(labelCom, c);
c.gridx++;
final JDate dateDeb = new JDate();
this.add(dateDeb, c);
c.gridx++;
JLabel labelYear = new JLabel("au");
final JDate dateFin = new JDate();
 
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
dateDeb.setValue(cal.getTime());
 
this.add(labelYear, c);
c.gridx++;
this.add(dateFin, c);
cal.set(Calendar.MONTH, Calendar.DECEMBER);
cal.set(Calendar.DAY_OF_MONTH, 31);
dateFin.setValue(cal.getTime());
 
final JButton buttonValid = new JButton(new AbstractAction("Valider") {
 
@Override
public void actionPerformed(ActionEvent e) {
 
new Thread() {
public void run() {
ReportingTaxeComplementaireSheetXML sheet = new ReportingTaxeComplementaireSheetXML(dateDeb.getValue(), dateFin.getValue());
try {
sheet.createDocument();
} catch (InterruptedException exn) {
exn.printStackTrace();
} catch (ExecutionException exn) {
exn.printStackTrace();
}
sheet.showPrintAndExport(true, false, false);
 
};
}.start();
 
}
 
});
c.gridx++;
// buttonValid.setEnabled(false);
this.add(buttonValid, c);
dateDeb.addValueListener(new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
buttonValid.setEnabled(dateDeb.getValue() != null && dateFin.getValue() != null);
}
});
dateFin.addValueListener(new PropertyChangeListener() {
 
@Override
public void propertyChange(PropertyChangeEvent evt) {
buttonValid.setEnabled(dateDeb.getValue() != null && dateFin.getValue() != null);
}
});
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/tax/model/TaxeCache.java
38,9 → 38,7
final DBRoot root = ((ComptaPropsConfiguration) Configuration.getInstance()).getRootSociete();
final SQLTable table = root.getTable("TAXE");
final SQLSelect sel = new SQLSelect();
sel.addSelect(table.getField("ID_TAXE"));
sel.addSelect(table.getField("TAUX"));
sel.addSelect(table.getField("DEFAULT"));
sel.addSelectStar(table);
return sel;
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/ChequeFournisseurSQLElement.java
85,7 → 85,7
}
 
@Override
public void handle(SQLRowAccessor rowCheque, Date d, String label) throws Exception {
public void handle(final SQLRowAccessor rowBanque, SQLRowAccessor rowCheque, Date d, String label) throws Exception {
new GenerationMvtReglementChequeFourn(rowCheque.getForeignID("ID_MOUVEMENT"), rowCheque.getLong("MONTANT"), rowCheque.getID(), d);
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/ChequeType.java
30,5 → 30,5
 
public void print(final List<Integer> rows, final boolean preview, final Date d);
 
public void handle(final SQLRowAccessor rowCheque, final Date d, String label) throws Exception;
public void handle(final SQLRowAccessor rowBanque, final SQLRowAccessor rowCheque, final Date d, String label) throws Exception;
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/TypeReglementSQLElement.java
30,13 → 30,15
 
public class TypeReglementSQLElement extends ComptaSQLConfElement {
 
public static final int INVALID = -1;
public static final int CHEQUE = 2;
public static final int CB = 3;
public static final int ESPECE = 4;
public static final int TRAITE = 5;
public static final int INDEFINI = 6;
public static final int VIREMENT = 7;
public static final int CESU = 8;
public static final int MULTIPLE = 6;
public static final int INDEFINI = 7;
public static final int VIREMENT = 8;
public static final int CESU = 9;
 
public TypeReglementSQLElement() {
super("TYPE_REGLEMENT", "Type de règlement", "Type de règlement");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/ChequeAEncaisserSQLElement.java
85,8 → 85,8
}
 
@Override
public void handle(SQLRowAccessor rowCheque, Date d, String label) throws Exception {
GenerationMvtReglementChequeClient gen = new GenerationMvtReglementChequeClient(rowCheque.getForeignID("ID_MOUVEMENT"), rowCheque.getLong("MONTANT"), d, rowCheque.getID(), label);
public void handle(SQLRowAccessor rowBanque, SQLRowAccessor rowCheque, Date d, String label) throws Exception {
GenerationMvtReglementChequeClient gen = new GenerationMvtReglementChequeClient(rowCheque.getForeignID("ID_MOUVEMENT"), rowCheque.getLong("MONTANT"), d, rowCheque.getID(), label, rowBanque);
gen.genere();
}
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/element/ChequeAvoirClientSQLElement.java
108,7 → 108,7
}
 
@Override
public void handle(final SQLRowAccessor rowCheque, final Date d, String label) throws Exception {
public void handle(final SQLRowAccessor rowBanque, final SQLRowAccessor rowCheque, final Date d, String label) throws Exception {
GenerationMvtReglementAvoirChequeClient gen = new GenerationMvtReglementAvoirChequeClient(rowCheque.getForeignID("ID_MOUVEMENT"), rowCheque.getLong("MONTANT"), d, rowCheque.getID());
gen.genere();
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/ui/ListeDesChequesADecaisserPanel.java
14,6 → 14,7
package org.openconcerto.erp.core.finance.payment.ui;
 
import org.openconcerto.erp.core.finance.payment.element.ChequeFournisseurSQLElement;
import org.openconcerto.sql.sqlobject.SQLRequestComboBox;
import org.openconcerto.ui.JDate;
 
import java.awt.event.ActionEvent;
30,7 → 31,7
}
 
@Override
protected JButton createSubmitBtn(final JDate dateDepot, final JCheckBox checkImpression, final JTextComponent text) {
protected JButton createSubmitBtn(final SQLRequestComboBox banqueSelect, final JDate dateDepot, final JCheckBox checkImpression, final JTextComponent text) {
final JButton res = new JButton("Valider le décaissement");
res.addActionListener(new ActionListener() {
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/ui/ListeDesChequesAvoirADecaisserPanel.java
14,6 → 14,7
package org.openconcerto.erp.core.finance.payment.ui;
 
import org.openconcerto.erp.core.finance.payment.element.ChequeAvoirClientSQLElement;
import org.openconcerto.sql.sqlobject.SQLRequestComboBox;
import org.openconcerto.ui.JDate;
 
import java.awt.event.ActionEvent;
35,7 → 36,7
}
 
@Override
protected JButton createSubmitBtn(final JDate dateDepot, final JCheckBox checkImpression, final JTextComponent text) {
protected JButton createSubmitBtn(final SQLRequestComboBox banqueSelect, final JDate dateDepot, final JCheckBox checkImpression, final JTextComponent text) {
final JButton res = new JButton("Valider le décaissement");
res.addActionListener(new ActionListener() {
@Override
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/ui/ChequeListPanel.java
18,6 → 18,7
import org.openconcerto.erp.model.GestionChequesModel;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.sqlobject.SQLRequestComboBox;
import org.openconcerto.sql.view.EditFrame;
import org.openconcerto.sql.view.ListeAddPanel;
import org.openconcerto.sql.view.list.IListe;
93,6 → 94,18
this.labelMontant = new JLabel("");
res.add(this.labelMontant, c);
 
final SQLRequestComboBox banqueSelect;
if (element.getTable().getName().equalsIgnoreCase("CHEQUE_A_ENCAISSER")) {
banqueSelect = new SQLRequestComboBox();
c.gridx++;
res.add(new JLabel(", sur la banque"), c);
c.gridx++;
banqueSelect.uiInit(element.getDirectory().getElement("BANQUE").getComboRequest());
res.add(banqueSelect, c);
} else {
banqueSelect = null;
}
 
final JButton printPreview = createPreviewBtn();
c.gridx++;
if (printPreview != null) {
136,7 → 149,7
 
c.weightx = 1;
c.fill = GridBagConstraints.HORIZONTAL;
c.gridwidth = 2;
c.gridwidth = 4;
res.add(text, c);
c.gridx += c.gridwidth;
c.weightx = 0;
146,7 → 159,7
}
 
// Bouton valider
this.boutonValide = createSubmitBtn(dateDepot, this.checkImpression, text);
this.boutonValide = createSubmitBtn(banqueSelect, dateDepot, this.checkImpression, text);
 
c.fill = GridBagConstraints.NONE;
c.anchor = GridBagConstraints.EAST;
170,7 → 183,7
return null;
}
 
protected abstract JButton createSubmitBtn(final JDate dateDepot, JCheckBox checkImpression, final JTextComponent text);
protected abstract JButton createSubmitBtn(final SQLRequestComboBox banqueSelect, final JDate dateDepot, JCheckBox checkImpression, final JTextComponent text);
 
@Override
protected final void addComponents(Container container, GridBagConstraints c) {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/finance/payment/ui/ListeDesChequesAEncaisserPanel.java
19,7 → 19,8
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.sqlobject.SQLRequestComboBox;
import org.openconcerto.sql.users.rights.UserRightsManager;
import org.openconcerto.sql.view.list.IListe;
import org.openconcerto.ui.JDate;
import org.openconcerto.utils.GestionDevise;
52,13 → 53,13
}
 
@Override
protected JButton createSubmitBtn(final JDate dateDepot, final JCheckBox checkImpression, final JTextComponent text) {
protected JButton createSubmitBtn(final SQLRequestComboBox banqueSelect, final JDate dateDepot, final JCheckBox checkImpression, final JTextComponent text) {
final JButton res = new JButton("Valider le dépôt");
res.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final String s = text.getText();
getModel().valideDepot(dateDepot.getDate(), checkImpression.isSelected(), s);
getModel().valideDepot(banqueSelect.getSelectedRow(), dateDepot.getDate(), checkImpression.isSelected(), s);
text.setText("");
}
});
68,7 → 69,7
@Override
protected void actionDroitTable() {
super.actionDroitTable();
if (UserManager.getInstance().getCurrentUser().getRights().haveRight(ComptaTotalUserRight.MENU)) {
if (UserRightsManager.getCurrentUserRights().haveRight(ComptaTotalUserRight.MENU)) {
 
getListe().addRowAction(new AbstractAction("Régularisation en comptabilité") {
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/SalarieSQLElement.java
15,6 → 15,7
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.common.element.NumerotationAutoSQLElement;
import org.openconcerto.erp.core.edm.AttachmentAction;
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.ElementSQLObject;
import org.openconcerto.sql.element.SQLComponent;
61,6 → 62,10
public SalarieSQLElement() {
super("SALARIE", "un salarié", "salariés");
 
PredicateRowAction actionAttachment = new PredicateRowAction(new AttachmentAction().getAction(), true);
actionAttachment.setPredicate(IListeEvent.getSingleSelectionPredicate());
getRowActions().add(actionAttachment);
 
PredicateRowAction actionNewContrat = new PredicateRowAction(new AbstractAction("Créer un nouveau contrat") {
 
@Override
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/CodePenibiliteContratSQLElement.java
16,10 → 16,10
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.sql.element.SQLElementLinksSetup;
import org.openconcerto.sql.element.SQLElementLink.LinkType;
import org.openconcerto.utils.ListMap;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.ArrayList;
import java.util.List;
30,6 → 30,14
super("CODE_PENIBILITE_CONTRAT_SALARIE", "un rattachement code pénibilité contrat salarié", "rattachements code pénibilité contrat salarié");
}
 
@Override
protected void setupLinks(SQLElementLinksSetup links) {
super.setupLinks(links);
if (getTable().contains("ID_INFOS_SALARIE_PAYE")) {
links.get("ID_INFOS_SALARIE_PAYE").setType(LinkType.ASSOCIATION);
}
}
 
protected List<String> getListFields() {
final List<String> l = new ArrayList<String>();
l.add("ID_CODE_PENIBILITE");
49,11 → 57,6
}
 
@Override
protected String getParentFFName() {
return "ID_INFOS_SALARIE_PAYE";
}
 
@Override
protected String createCode() {
return "humanresources.payroll.penibilite.contrat";
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/RubriqueCotisationSQLElement.java
17,11 → 17,15
import org.openconcerto.erp.core.humanresources.payroll.component.FormuleTreeNode;
import org.openconcerto.erp.core.humanresources.payroll.component.RubriqueSQLComponent;
import org.openconcerto.erp.core.humanresources.payroll.component.VariableTree;
import org.openconcerto.erp.core.humanresources.payroll.report.LignePayeSimplifieeComboBox;
import org.openconcerto.erp.core.humanresources.payroll.report.LignePayeSimplifieeRowItemView;
import org.openconcerto.erp.core.humanresources.payroll.report.LigneSimplifieeCellRenderer;
import org.openconcerto.sql.element.ConfSQLElement;
import org.openconcerto.sql.element.ElementSQLObject;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.sqlobject.ElementComboBox;
import org.openconcerto.sql.view.list.SQLTableModelSource;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.utils.ListMap;
import org.openconcerto.utils.NoneSelectedButtonGroup;
57,10 → 61,18
super("RUBRIQUE_COTISATION", "une rubrique de cotisation", "rubriques de cotisation");
}
 
@Override
protected synchronized void _initTableSource(SQLTableModelSource res) {
res.init();
res.getColumn(getTable().getField("LIGNE_PAYE_SIMPLIFIEE")).setRenderer(new LigneSimplifieeCellRenderer());
super._initTableSource(res);
}
 
protected List<String> getListFields() {
final List<String> l = new ArrayList<String>();
l.add("CODE");
l.add("NOM");
l.add("LIGNE_PAYE_SIMPLIFIEE");
l.add("ID_CAISSE_COTISATION");
l.add("BASE");
l.add("TX_PAT");
230,6 → 242,20
cPanel.weightx = 1;
panelProp.add(comboSelTypeImpression, cPanel);
 
// Ligne simplifiée
final JLabel labelEtat = new JLabel(getLabelFor("LIGNE_PAYE_SIMPLIFIEE"), SwingConstants.RIGHT);
cPanel.gridy++;
cPanel.gridx = 1;
cPanel.weightx = 0;
cPanel.fill = GridBagConstraints.HORIZONTAL;
panelProp.add(labelEtat, cPanel);
final LignePayeSimplifieeComboBox comboEtat = new LignePayeSimplifieeComboBox();
cPanel.gridx++;
cPanel.fill = GridBagConstraints.NONE;
cPanel.weightx = 1;
panelProp.add(comboEtat, cPanel);
addView(new LignePayeSimplifieeRowItemView(comboEtat), "LIGNE_PAYE_SIMPLIFIEE", REQ);
 
// Imposable
cPanel.gridx = 1;
cPanel.weightx = 0;
237,6 → 263,14
JCheckBox checkImpo = new JCheckBox(getLabelFor("IMPOSABLE"));
panelProp.add(checkImpo, cPanel);
 
// Imposable
cPanel.gridx = 1;
cPanel.weightx = 0;
cPanel.gridy++;
JCheckBox checkalle = new JCheckBox(getLabelFor("ALLEGEMENT_COTISATION"));
panelProp.add(checkalle, cPanel);
addView(checkalle, "ALLEGEMENT_COTISATION", REQ);
 
JLabel labelSelTypePersonnel = new JLabel("Code Type Personnel URSSAF (S21.G00.23)");
cPanel.gridy++;
cPanel.gridx = 1;
284,9 → 318,7
cPanel.weightx = 1;
panelProp.add(comboSelCodeInd, cPanel);
this.addView(comboSelCodeInd, "ID_CODE_COTISATION_INDIVIDUELLE");
 
JLabel labelSelCodeEta = new JLabel("Code cotisation établissement (S21.G00.82.002)");
cPanel.gridy++;
cPanel.gridx = 1;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/VariablePayeSQLElement.java
175,9 → 175,12
l.add("HEURE_150");
l.add("HEURE_200");
l.add("SAL_BRUT_C");
l.add("HEURE_TRAV_C");
l.add("NET_A_PAYER_C");
l.add("NET_IMP_C");
 
l.add("ANCIENNETE_JOUR");
 
l.add("COEFF");
l.add("ECHELON");
l.add("NIVEAU");
233,7 → 236,6
l.add(tableInfos.getField("PRIME_PANIER"));
l.add(tableInfos.getField("PRIME_TRANSPORT"));
}
 
mapTree.put("Contrat salarié", l);
 
List<SQLField> l2 = new ArrayList<SQLField>();
241,6 → 243,11
l2.add(tableFichePaye.getField("CONGES_ACQUIS"));
l2.add(tableFichePaye.getField("ACOMPTE"));
l2.add(tableFichePaye.getField("SAL_BRUT"));
l2.add(tableFichePaye.getField("SAL_BRUT_TAXABLE"));
l2.add(tableFichePaye.getField("SAL_BASE_BRUT"));
l2.add(tableFichePaye.getField("TAXE_CM_SAL"));
l2.add(tableFichePaye.getField("TAXE_CM_PAT"));
l2.add(tableFichePaye.getField("SAL_BRUT_COTISABLE"));
l2.add(tableFichePaye.getField("COT_PAT"));
l2.add(tableFichePaye.getField("COT_SAL"));
l2.add(tableFichePaye.getField("NET_IMP"));
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/VariableSalarieSQLElement.java
14,13 → 14,17
package org.openconcerto.erp.core.humanresources.payroll.element;
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.UISQLComponent;
import org.openconcerto.ui.DefaultGridBagConstraints;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
import javax.swing.JLabel;
import javax.swing.JTextField;
 
public class VariableSalarieSQLElement extends ComptaSQLConfElement {
37,7 → 41,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("CREATION_DATE") && !field.endsWith("_DEFAULT_VAL")) {
l.add(field);
}
}
62,20 → 66,39
* @see org.openconcerto.devis.SQLElement#getComponent()
*/
public SQLComponent createComponent() {
return new UISQLComponent(this) {
return new BaseSQLComponent(this) {
public void addViews() {
 
int pos = 0;
this.setLayout(new GridBagLayout());
 
GridBagConstraints c = new DefaultGridBagConstraints();
c.gridx = GridBagConstraints.RELATIVE;
this.add(new JLabel("Nom de la variable"), c);
this.add(new JLabel("Valeur période courante"), c);
this.add(new JLabel("Valeur d'initialisation par défaut(prochain bulletin)"), c);
 
final List<String> listFields = getListFields();
 
for (String i : listFields) {
for (String fieldName : listFields) {
 
if (pos % 2 == 0) {
this.addSQLObject(new JTextField(15), i, "left");
} else {
this.addSQLObject(new JTextField(15), i, "right");
c.gridy++;
this.add(new JLabel(getLabelFor(fieldName)), c);
final JTextField textFieldVal = new JTextField(15);
this.add(textFieldVal, c);
this.addView(textFieldVal, fieldName);
if (getTable().contains(fieldName + "_DEFAULT_VAL")) {
final JTextField textFieldValDef = new JTextField(15);
this.add(textFieldValDef, c);
this.addView(textFieldValDef, fieldName + "_DEFAULT_VAL");
 
}
 
// if (pos % 2 == 0) {
// this.addSQLObject(new JTextField(15), i, "left");
// } else {
// this.addSQLObject(new JTextField(15), i, "right");
// }
 
}
}
};
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/CumulsPayeSQLElement.java
113,7 → 113,7
cPanel.gridx++;
this.add(textNetAPayer, cPanel);
 
// net imposable
// heure
cPanel.gridx = 0;
cPanel.gridy++;
JLabel labelH = new JLabel(getLabelFor("HEURE_TRAV_C"));
122,6 → 122,32
cPanel.gridx++;
this.add(textH, cPanel);
 
cPanel.gridx++;
JLabel labelCice = new JLabel(getLabelFor("CICE_C"));
this.add(labelCice, cPanel);
JTextField textCice = new JTextField(10);
cPanel.gridx++;
this.add(textCice, cPanel);
 
// Allegement
cPanel.gridx = 0;
cPanel.gridy++;
JLabel labelA = new JLabel(getLabelFor("ALLEGEMENT_COTISATION_C"));
this.add(labelA, cPanel);
JTextField textA = new JTextField(10);
cPanel.gridx++;
this.add(textA, cPanel);
 
cPanel.gridx++;
JLabel labelAv = new JLabel(getLabelFor("AVANTAGE_NATURE_C"));
this.add(labelAv, cPanel);
JTextField textAv = new JTextField(10);
cPanel.gridx++;
this.add(textAv, cPanel);
 
this.addSQLObject(textAv, "AVANTAGE_NATURE_C");
this.addSQLObject(textA, "ALLEGEMENT_COTISATION_C");
 
this.addSQLObject(textCSG, "CSG_C");
this.addSQLObject(textCotPat, "COT_PAT_C");
this.addSQLObject(textCotSal, "COT_SAL_C");
129,6 → 155,7
this.addSQLObject(textNetImp, "NET_IMP_C");
this.addSQLObject(textH, "HEURE_TRAV_C");
this.addSQLObject(textSalBrut, "SAL_BRUT_C");
this.addSQLObject(textCice, "CICE_C");
}
};
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/element/FichePayeSQLElement.java
13,35 → 13,6
package org.openconcerto.erp.core.humanresources.payroll.element;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
 
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.tree.TreePath;
 
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.erp.core.common.ui.JNiceButton;
54,9 → 25,9
import org.openconcerto.sql.element.BaseSQLComponent;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.SQLElementDirectory;
import org.openconcerto.sql.element.SQLElementLink.LinkType;
import org.openconcerto.sql.element.SQLElementLinksSetup;
import org.openconcerto.sql.element.TreesOfSQLRows;
import org.openconcerto.sql.element.SQLElementLink.LinkType;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLField;
import org.openconcerto.sql.model.SQLRow;
71,10 → 42,39
import org.openconcerto.sql.view.IListFrame;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.JDate;
import org.openconcerto.ui.component.ITextArea;
import org.openconcerto.ui.component.InteractionMode;
import org.openconcerto.utils.ExceptionHandler;
import org.openconcerto.utils.checks.ValidState;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
 
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.tree.TreePath;
 
public class FichePayeSQLElement extends ComptaSQLConfElement {
 
public FichePayeSQLElement() {
264,7 → 264,20
panelTotal.setLayout(new GridBagLayout());
GridBagConstraints cPanel = new DefaultGridBagConstraints();
 
JLabel labelInfosConges = new JLabel(getLabelFor("DETAILS_CONGES"));
panelTotal.add(labelInfosConges, cPanel);
ITextArea textConges = new ITextArea();
cPanel.gridx++;
cPanel.weightx = 1;
cPanel.gridwidth = GridBagConstraints.REMAINDER;
panelTotal.add(textConges, cPanel);
addView(textConges, "DETAILS_CONGES");
 
// Salaire brut
cPanel.weightx = 0;
cPanel.gridwidth = 1;
cPanel.gridy++;
cPanel.gridx=0;
JLabel labelBrut = new JLabel(getLabelFor("SAL_BRUT"));
panelTotal.add(labelBrut, cPanel);
JTextField textSalBrut = new JTextField(10);
342,6 → 355,16
textNetAPayer.setEditable(false);
textNetAPayer.setEnabled(false);
 
cPanel.gridx++;
JLabel labelCice = new JLabel(getLabelFor("CICE"));
panelTotal.add(labelCice, cPanel);
JTextField textCice = new JTextField(10);
cPanel.gridx++;
panelTotal.add(textCice, cPanel);
textCice.setEditable(false);
textCice.setEnabled(false);
this.addSQLObject(textCice, "CICE");
 
c.gridx = 1;
c.gridy++;
c.gridwidth = GridBagConstraints.REMAINDER;
560,24 → 583,26
});
}
 
private boolean isDateValid() {
// private boolean isDateValid() {
//
// String yearS = this.textAnnee.getText().trim();
// int annee = (yearS.length() == 0) ? 0 : Integer.parseInt(yearS);
//
// int mois = this.selMois.getSelectedId();
// // System.err.println("année " + annee + " dernAnnee " + this.dernAnnee + " mois " +
// // mois + " dernMois " + this.dernMois);
//
// return ((this.dernAnnee == 0) ? true : annee > this.dernAnnee) || ((this.dernMois ==
// 0 || this.dernMois == 13) ? true : mois > this.dernMois);
// }
//
// @Override
// public synchronized ValidState getValidState() {
// // FIXME add fireValidChange()
// return super.getValidState().and(ValidState.createCached(isDateValid(), "Date
// invalide"));
// }
 
String yearS = this.textAnnee.getText().trim();
int annee = (yearS.length() == 0) ? 0 : Integer.parseInt(yearS);
 
int mois = this.selMois.getSelectedId();
// System.err.println("année " + annee + " dernAnnee " + this.dernAnnee + " mois " +
// mois + " dernMois " + this.dernMois);
 
return ((this.dernAnnee == 0) ? true : annee > this.dernAnnee) || ((this.dernMois == 0 || this.dernMois == 13) ? true : mois > this.dernMois);
}
 
@Override
public synchronized ValidState getValidState() {
// FIXME add fireValidChange()
return super.getValidState().and(ValidState.createCached(isDateValid(), "Date invalide"));
}
 
public int insert(SQLRow order) {
 
int id = super.insert(order);
656,6 → 681,9
};
}
 
private static List<String> cumulFields = Arrays.asList("SAL_BRUT", "CSG", "COT_SAL", "COT_PAT", "NET_IMP", "HEURE_TRAV", "CICE", "AVANTAGE_NATURE", "ALLEGEMENT_COTISATION", "SAL_BASE_BRUT",
"TAXE_CM_SAL", "TAXE_CM_PAT", "SAL_BRUT_COTISABLE", "SAL_BRUT_TAXABLE");
 
@Override
protected void archive(TreesOfSQLRows trees, boolean cutLinks) throws SQLException {
super.archive(trees, cutLinks);
670,23 → 698,16
 
SQLRow rowCumuls = rowSal.getForeignRow("ID_CUMULS_PAYE");
 
float salBrut = rowCumuls.getFloat("SAL_BRUT_C") - row.getFloat("SAL_BRUT");
float cgs = rowCumuls.getFloat("CSG_C") - row.getFloat("CSG");
float cotSal = rowCumuls.getFloat("COT_SAL_C") - row.getFloat("COT_SAL");
float cotPat = rowCumuls.getFloat("COT_PAT_C") - row.getFloat("COT_PAT");
float netImp = rowCumuls.getFloat("NET_IMP_C") - row.getFloat("NET_IMP");
SQLRowValues rowValsCumul = rowCumuls.createEmptyUpdateRow();
for (String string : cumulFields) {
float cumul = rowCumuls.getFloat(string + "_C") - row.getFloat(string);
rowValsCumul.put(string + "_C", new Float(cumul));
}
// TODO stocker les heures travaillées du mois pour faire déduction
// float heure = rowCumuls.getFloat("HEURE_TRAV_C") -
// row.getFloat("HEURE_TRAV");
float netAPayer = rowCumuls.getFloat("NET_A_PAYER_C") - row.getFloat("NET_A_PAYER") - row.getFloat("ACOMPTE");
 
SQLRowValues rowValsCumul = rowCumuls.createEmptyUpdateRow();
rowValsCumul.put("SAL_BRUT_C", new Float(salBrut));
rowValsCumul.put("COT_SAL_C", new Float(cotSal));
rowValsCumul.put("COT_PAT_C", new Float(cotPat));
rowValsCumul.put("NET_IMP_C", new Float(netImp));
rowValsCumul.put("NET_A_PAYER_C", new Float(netAPayer));
rowValsCumul.put("CSG_C", new Float(cgs));
// rowValsCumul.put("HEURE_TRAV_C", new Float(heure));
 
try {
772,8 → 793,12
int annee = rowFiche.getInt("ANNEE");
rowValsNewFiche.put("ID_MOIS", mois);
rowValsNewFiche.put("ANNEE", annee);
rowValsNewFiche.put("DU", rowFiche.getObject("DU"));
rowValsNewFiche.put("AU", rowFiche.getObject("AU"));
final Calendar calDu = rowFiche.getDate("DU");
calDu.add(Calendar.MONTH, 1);
calDu.set(Calendar.DAY_OF_MONTH, 1);
rowValsNewFiche.put("DU", calDu.getTime());
calDu.set(Calendar.DAY_OF_MONTH, calDu.getActualMaximum(Calendar.DAY_OF_MONTH));
rowValsNewFiche.put("AU", calDu.getTime());
rowValsNewFiche.put("ID_PROFIL_PAYE", rowFiche.getInt("ID_PROFIL_PAYE"));
 
/*
834,22 → 859,13
int idCumuls = rowSal.getInt("ID_CUMULS_PAYE");
SQLRow rowCumuls = tableCumuls.getRow(idCumuls);
 
float salBrut = rowCumuls.getFloat("SAL_BRUT_C") + rowFiche.getFloat("SAL_BRUT");
float cgs = rowCumuls.getFloat("CSG_C") + rowFiche.getFloat("CSG");
float cotSal = rowCumuls.getFloat("COT_SAL_C") + rowFiche.getFloat("COT_SAL");
float cotPat = rowCumuls.getFloat("COT_PAT_C") + rowFiche.getFloat("COT_PAT");
float netImp = rowCumuls.getFloat("NET_IMP_C") + rowFiche.getFloat("NET_IMP");
float hTrav = rowCumuls.getFloat("HEURE_TRAV_C") + rowVarSal.getFloat("HEURE_TRAV");
SQLRowValues rowValsCumul = new SQLRowValues(tableCumuls);
for (String string : cumulFields) {
float cumul = rowCumuls.getFloat(string + "_C") + rowFiche.getFloat(string);
rowValsCumul.put(string + "_C", new Float(cumul));
}
float netAPayer = rowCumuls.getFloat("NET_A_PAYER_C") + rowFiche.getFloat("NET_A_PAYER") + rowFiche.getFloat("ACOMPTE");
 
SQLRowValues rowValsCumul = new SQLRowValues(tableCumuls);
rowValsCumul.put("SAL_BRUT_C", new Float(salBrut));
rowValsCumul.put("HEURE_TRAV_C", new Float(hTrav));
rowValsCumul.put("COT_SAL_C", new Float(cotSal));
rowValsCumul.put("COT_PAT_C", new Float(cotPat));
rowValsCumul.put("NET_IMP_C", new Float(netImp));
rowValsCumul.put("NET_A_PAYER_C", new Float(netAPayer));
rowValsCumul.put("CSG_C", new Float(cgs));
 
SQLRow r = rowValsCumul.insert();
rowValsCumul.put("ID", r.getID());
918,10 → 934,16
// Remise à 0 des variables sal
final SQLRowValues rowVals = new SQLRowValues(tableVariableSal);
for (final SQLField field : tableVariableSal.getContentFields()) {
if (field.getType().getJavaType() == Integer.class) {
rowVals.put(field.getName(), 0);
} else {
rowVals.put(field.getName(), Float.valueOf(0));
if (!field.getName().endsWith("_DEFAULT_VAL")) {
if (tableVariableSal.contains(field.getName() + "_DEFAULT_VAL")) {
rowVals.put(field.getName(), rowVarSal.getObject(field.getName() + "_DEFAULT_VAL"));
} else {
if (field.getType().getJavaType() == Integer.class) {
rowVals.put(field.getName(), 0);
} else {
rowVals.put(field.getName(), Float.valueOf(0));
}
}
}
}
rowVals.put("HEURE_TRAV", rowSalInfosPaye.getObject("DUREE_MOIS"));
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/report/LignePayeSimplifiee.java
Nouveau fichier
0,0 → 1,62
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.humanresources.payroll.report;
 
import org.openconcerto.utils.i18n.TranslationManager;
 
import java.util.HashMap;
import java.util.Map;
 
public enum LignePayeSimplifiee {
 
SANTE_SECURITE("sante.securite"), SANTE_COMPLEMENAIRE_DECES("sante.complementaire.deces"), SANTE_COMPLEMENAIRE_SANTE("sante.complementaire.sante"), ACCIDENTS_TRAVAIL(
"accident.accident"), RETRAITE_SECURITE_PLAF("retraite.securite.plaf"), RETRAITE_SECURITE_NON_PLAF("retraite.securite.non.plaf"), RETRAITE_COMPLEMENTAIRE_T1(
"retraite.tranche1"), RETRAITE_COMPLEMENTAIRE_T2("retraite.tranche2"), RETRAITE_COMPLEMENTAIRE_TA("retraite.trancheA"), RETRAITE_COMPLEMENTAIRE_GMP(
"retraite.GMP"), RETRAITE_COMPLEMENTAIRE_TB("retraite.trancheB"), RETRAITE_COMPLEMENTAIRE_TC("retraite.trancheC"), RETRAITE_SUPPLEMENTAIRE(
"retraite.supplementaire"), FAMILLE_ALLOCATIONS("famille.famille.allocations"), ASSURANCE_CHOMAGE_CHOMAGE("chomage.chomage"), ASSURANCE_CHOMAGE_APEC(
"chomage.apec"), COTISATIONS_STATUAIRES("cotisations.statuaires.ligne"), AUTRES_CONTRIBUTIONS("autres.contributions.ligne"), CSG_NON_IMP(
"csg.nonimp.ligne"), CSG_IMP("csg.imp.ligne"), ALLEGEMENT_COTISATIONS("allegement.cotisations.ligne"), IGNORE("paye.simplifie.ignore");
 
private final String id;
 
private LignePayeSimplifiee(String id) {
this.id = id;
}
 
public String getId() {
return id;
}
 
public String getTranslation() {
final String translationForItem = TranslationManager.getInstance().getTranslationForItem(getId());
 
return (translationForItem == null || translationForItem.trim().length() == 0) ? getId() : translationForItem;
}
 
private static final Map<String, LignePayeSimplifiee> idToEnum = new HashMap<String, LignePayeSimplifiee>();
static {
for (LignePayeSimplifiee e : values())
idToEnum.put(e.getId(), e);
}
 
public static LignePayeSimplifiee fromID(String id) {
return idToEnum.get(id);
}
 
@Override
public String toString() {
return getTranslation();
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/report/LignePayeSimplifieeRowItemView.java
Nouveau fichier
0,0 → 1,50
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.humanresources.payroll.report;
 
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.sqlobject.itemview.VWRowItemView;
import org.openconcerto.ui.component.InteractionMode;
import org.openconcerto.ui.valuewrapper.ValueWrapper;
 
public class LignePayeSimplifieeRowItemView extends VWRowItemView<LignePayeSimplifiee> {
 
public LignePayeSimplifieeRowItemView(ValueWrapper<LignePayeSimplifiee> wrapper) {
super(wrapper);
}
 
@Override
public void setEditable(InteractionMode b) {
if (this.getComp() != null) {
this.getComp().setEnabled(b.isEnabled());
}
}
 
@Override
public void show(SQLRowAccessor r) {
 
if (r.getObject(getField().getName()) != null) {
this.getWrapper().setValue(LignePayeSimplifiee.fromID(r.getString(getField().getName())));
} else {
this.getWrapper().setValue(null);
}
}
 
@Override
public void update(SQLRowValues vals) {
vals.put(getField().getName(), this.isEmpty() ? SQLRowValues.SQL_DEFAULT : this.getWrapper().getValue().getId());
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/report/StructurePayeSimplifiee.java
Nouveau fichier
0,0 → 1,37
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.humanresources.payroll.report;
 
import java.util.Arrays;
import java.util.List;
 
public class StructurePayeSimplifiee {
 
private static final List<GroupePayeSimplifiee> nonCadre = Arrays.asList(GroupePayeSimplifiee.SANTE, GroupePayeSimplifiee.ACCIDENT_TRAVAIL, GroupePayeSimplifiee.RETRAITE_NON_CADRE,
GroupePayeSimplifiee.FAMILLE, GroupePayeSimplifiee.CHOMAGE_NON_CADRE, GroupePayeSimplifiee.AUTRES_CONTRIBUTIONS, GroupePayeSimplifiee.COTISATIONS_CONVENTION,
GroupePayeSimplifiee.CSG_NON_IMP, GroupePayeSimplifiee.CSG_IMP, GroupePayeSimplifiee.ALLEGEMENT);
 
private static final List<GroupePayeSimplifiee> cadre = Arrays.asList(GroupePayeSimplifiee.SANTE, GroupePayeSimplifiee.ACCIDENT_TRAVAIL, GroupePayeSimplifiee.RETRAITE_CADRE,
GroupePayeSimplifiee.FAMILLE, GroupePayeSimplifiee.CHOMAGE_CADRE, GroupePayeSimplifiee.AUTRES_CONTRIBUTIONS, GroupePayeSimplifiee.COTISATIONS_CONVENTION, GroupePayeSimplifiee.CSG_NON_IMP,
GroupePayeSimplifiee.CSG_IMP, GroupePayeSimplifiee.ALLEGEMENT);
 
public static List<GroupePayeSimplifiee> getStructureNonCadre() {
return nonCadre;
}
 
public static List<GroupePayeSimplifiee> getStructureCadre() {
return cadre;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/report/FichePayeSheetXML.java
13,25 → 13,246
package org.openconcerto.erp.core.humanresources.payroll.report;
 
import org.openconcerto.erp.core.common.element.StyleSQLElement;
import org.openconcerto.erp.generationDoc.AbstractSheetXMLWithDate;
import org.openconcerto.erp.preferences.PrinterNXProps;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowListRSH;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.SQLSelect;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.utils.cc.ITransformer;
 
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
 
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
 
public class FichePayeSheetXML extends AbstractSheetXMLWithDate {
 
public static final String TEMPLATE_ID = "FichePaye";
private static boolean prefBulletinSimpl = true;
public static final String TEMPLATE_ID = prefBulletinSimpl ? "FichePayeSimplifiee" : "FichePaye";
public static final String TEMPLATE_PROPERTY_NAME = "LocationFichePaye";
final Map<Integer, String> cotisationSimplifieeLink = new HashMap<>();
 
public FichePayeSheetXML(SQLRow row) {
public FichePayeSheetXML(final SQLRow row) {
super(row);
this.printer = PrinterNXProps.getInstance().getStringProperty("FichePayePrinter");
this.elt = Configuration.getInstance().getDirectory().getElement("FICHE_PAYE");
if (prefBulletinSimpl) {
SQLSelect sel = new SQLSelect();
sel.addSelect(row.getTable().getDBRoot().findTable("RUBRIQUE_COTISATION").getField("LIGNE_PAYE_SIMPLIFIEE"));
sel.addSelect(row.getTable().getDBRoot().findTable("RUBRIQUE_COTISATION").getKey());
List<SQLRow> rubCotis = SQLRowListRSH.execute(sel);
 
for (SQLRow sqlRow : rubCotis) {
cotisationSimplifieeLink.put(sqlRow.getID(), sqlRow.getString("LIGNE_PAYE_SIMPLIFIEE"));
}
 
final String codeStatu = row.getForeign("ID_SALARIE").getForeign("ID_INFOS_SALARIE_PAYE").getForeign("ID_CONTRAT_SALARIE").getForeign("ID_CODE_STATUT_CATEGORIEL").getString("CODE");
final boolean cadre = codeStatu.equals("01") || codeStatu.equals("02");
 
final Set<Integer> ignoredRubriqueComm = new HashSet<Integer>();
// Total nat
ignoredRubriqueComm.add(2);
// Total brut
// ignoredRubriqueComm.add(3);
// Ligne vide
ignoredRubriqueComm.add(7);
// Cotisations sal
ignoredRubriqueComm.add(4);
// Cotisation pat
ignoredRubriqueComm.add(5);
 
this.setPostProcess(new ITransformer<List<SQLRowAccessor>, List<SQLRowAccessor>>() {
 
@Override
public List<SQLRowAccessor> transformChecked(List<SQLRowAccessor> input) {
 
List<SQLRowAccessor> result = new ArrayList<SQLRowAccessor>(input.size());
List<SQLRowAccessor> resultCom = new ArrayList<SQLRowAccessor>(input.size());
List<SQLRowAccessor> resultNet = new ArrayList<SQLRowAccessor>(input.size());
 
List<SQLRowAccessor> resultCotis = new ArrayList<SQLRowAccessor>(input.size());
Map<String, SQLRowValues> mapLigneSimplifiee = initCotisations(cadre, resultCotis);
for (SQLRowAccessor sqlRowAccessor : input) {
if (sqlRowAccessor.getBoolean("IN_PERIODE")) {
if (sqlRowAccessor.getString("SOURCE").equals("RUBRIQUE_BRUT")) {
if (result.size() == 0) {
SQLRowValues rowValsTitle = new SQLRowValues(sqlRowAccessor.getTable());
rowValsTitle.put("ID_STYLE", eltStyle.getAllStyleByName().get("Titre 1"));
rowValsTitle.put("NOM", "Rubrique de brut");
rowValsTitle.put("IMPRESSION", Boolean.TRUE);
rowValsTitle.put("IN_PERIODE", Boolean.TRUE);
result.add(rowValsTitle);
}
SQLRowValues rowValsToAdd = sqlRowAccessor.asRowValues();
rowValsToAdd.put("ID_STYLE", 2);
result.add(rowValsToAdd);
}
if (sqlRowAccessor.getString("SOURCE").equals("RUBRIQUE_NET") && sqlRowAccessor.getBoolean("IMPRESSION") && sqlRowAccessor.getBoolean("IN_PERIODE")) {
if (resultNet.size() == 0) {
SQLRowValues rowValsTitle = new SQLRowValues(sqlRowAccessor.getTable());
rowValsTitle.put("ID_STYLE", eltStyle.getAllStyleByName().get("Titre 1"));
rowValsTitle.put("NOM", "Rubrique de net");
rowValsTitle.put("IMPRESSION", Boolean.TRUE);
rowValsTitle.put("IN_PERIODE", Boolean.TRUE);
resultNet.add(rowValsTitle);
}
SQLRowValues rowValsToAdd = sqlRowAccessor.asRowValues();
rowValsToAdd.put("ID_STYLE", 2);
resultNet.add(rowValsToAdd);
}
 
if (sqlRowAccessor.getString("SOURCE").equals("RUBRIQUE_COMM") && !ignoredRubriqueComm.contains(sqlRowAccessor.getInt("IDSOURCE"))) {
if (resultNet.size() == 0) {
result.add(sqlRowAccessor);
} else {
resultNet.add(sqlRowAccessor);
}
 
}
if (sqlRowAccessor.getString("SOURCE").equals("RUBRIQUE_COTISATION")) {
cumuls(sqlRowAccessor, mapLigneSimplifiee, cadre);
}
}
}
result.addAll(resultNet);
result.addAll(resultCom);
result.addAll(resultCotis);
return result;
}
});
}
}
 
private void cumuls(final SQLRowAccessor sqlRowAccessor, Map<String, SQLRowValues> mapLigneSimplifiee, final boolean cadre) {
// "TAUX_PAT" numeric(16,6) DEFAULT 0,
// "TAUX_SAL" numeric(16,6) DEFAULT 0,
// "NB_BASE" numeric(16,6) DEFAULT 0,
// "MONTANT_SAL_AJ" numeric(16,2) DEFAULT 0,
// "MONTANT_PAT" numeric(16,2) DEFAULT 0,
// "MONTANT_SAL_DED" numeric(16,2) DEFAULT 0,
String idLigneSimplifiee = this.cotisationSimplifieeLink.get(sqlRowAccessor.getInt("IDSOURCE"));
if (idLigneSimplifiee == null || idLigneSimplifiee.trim().length() == 0) {
final SQLRow rowRub = sqlRowAccessor.getTable().getDBRoot().findTable("RUBRIQUE_COTISATION").getRow(sqlRowAccessor.getInt("IDSOURCE"));
 
SwingUtilities.invokeLater(new Runnable() {
 
@Override
public void run() {
JOptionPane.showMessageDialog(null, "Aucune liaison définie vers une ligne de bulletin simplifié pour la cotisation " + rowRub.getString("CODE") + " - " + rowRub.getString("NOM")
+ ".\n La liaison sera faite sur autres contributions dues par l'employeur!");
}
});
idLigneSimplifiee = LignePayeSimplifiee.AUTRES_CONTRIBUTIONS.getId();
}
 
if (!idLigneSimplifiee.equals(LignePayeSimplifiee.IGNORE.getId())) {
SQLRowValues ligneSimplifiee = mapLigneSimplifiee.get(idLigneSimplifiee);
if (ligneSimplifiee == null) {
 
final LignePayeSimplifiee fromID = LignePayeSimplifiee.fromID(idLigneSimplifiee);
SwingUtilities.invokeLater(new Runnable() {
 
@Override
public void run() {
JOptionPane.showMessageDialog(null,
"Aucune ligne simplifiée " + fromID + " dans le bulletin " + (cadre ? "cadre!" : "non cadre!") + "\n La ligne " + sqlRowAccessor.getString("NOM") + " a été ignoré!");
}
});
 
} else {
BigDecimal montantPatBulletinSimpl = BigDecimal.ZERO;
BigDecimal montantSalBulletinSimpl = BigDecimal.ZERO;
if (ligneSimplifiee.getBigDecimal("MONTANT_SAL_DED") != null) {
montantSalBulletinSimpl = ligneSimplifiee.getBigDecimal("MONTANT_SAL_DED");
}
if (ligneSimplifiee.getBigDecimal("MONTANT_PAT") != null) {
montantPatBulletinSimpl = ligneSimplifiee.getBigDecimal("MONTANT_PAT");
}
 
BigDecimal montantPatLigne = BigDecimal.ZERO;
BigDecimal montantSalLigne = BigDecimal.ZERO;
if (sqlRowAccessor.getBigDecimal("MONTANT_SAL_DED") != null) {
montantSalLigne = sqlRowAccessor.getBigDecimal("MONTANT_SAL_DED");
}
if (sqlRowAccessor.getBigDecimal("MONTANT_PAT") != null) {
montantPatLigne = sqlRowAccessor.getBigDecimal("MONTANT_PAT");
}
ligneSimplifiee.put("NB_BASE", sqlRowAccessor.getBigDecimal("NB_BASE"));
ligneSimplifiee.put("MONTANT_SAL_DED", montantSalBulletinSimpl.add(montantSalLigne));
ligneSimplifiee.put("MONTANT_PAT", montantPatBulletinSimpl.add(montantPatLigne));
 
}
}
}
 
private StyleSQLElement eltStyle = Configuration.getInstance().getDirectory().getElement(StyleSQLElement.class);
 
private Map<String, SQLRowValues> initCotisations(boolean cadre, List<SQLRowAccessor> resultCotis) {
 
SQLTable tableFichePayeElt = this.row.getTable().getDBRoot().findTable("FICHE_PAYE_ELEMENT");
SQLRowValues rowValsCotis = new SQLRowValues(tableFichePayeElt);
 
rowValsCotis.put("ID_STYLE", eltStyle.getAllStyleByName().get("Titre 2"));
rowValsCotis.put("NOM", "Cotisations sociales");
// rowValsCotis.put("NB_BASE", BigDecimal.ZERO);
// rowValsCotis.put("TAUX_SAL", BigDecimal.ZERO);
// rowValsCotis.put("MONTANT_SAL_AJ", BigDecimal.ZERO);
// rowValsCotis.put("MONTANT_SAL_DED", BigDecimal.ZERO);
// rowValsCotis.put("MONTANT_PAT", BigDecimal.ZERO);
rowValsCotis.put("IMPRESSION", Boolean.TRUE);
rowValsCotis.put("IN_PERIODE", Boolean.TRUE);
resultCotis.add(rowValsCotis);
 
Map<String, SQLRowValues> mapPayeSimplifiee = new HashMap<String, SQLRowValues>();
List<GroupePayeSimplifiee> listGroupe = cadre ? StructurePayeSimplifiee.getStructureCadre() : StructurePayeSimplifiee.getStructureNonCadre();
for (GroupePayeSimplifiee groupe : listGroupe) {
SQLRowValues rowValsFichePaye = new SQLRowValues(tableFichePayeElt);
rowValsFichePaye.put("NOM", groupe.getTranslation());
rowValsFichePaye.put("IMPRESSION", Boolean.TRUE);
rowValsFichePaye.put("IN_PERIODE", Boolean.TRUE);
rowValsFichePaye.put("ID_STYLE", eltStyle.getAllStyleByName().get("Normal"));
// rowValsFichePaye.put("NB_BASE", BigDecimal.ZERO);
// rowValsFichePaye.put("TAUX_SAL", BigDecimal.ZERO);
// rowValsFichePaye.put("MONTANT_SAL_AJ", BigDecimal.ZERO);
// rowValsFichePaye.put("MONTANT_SAL_DED", BigDecimal.ZERO);
// rowValsFichePaye.put("MONTANT_PAT", BigDecimal.ZERO);
resultCotis.add(rowValsFichePaye);
mapPayeSimplifiee.put(groupe.getId(), rowValsFichePaye);
for (LignePayeSimplifiee lignePayeSimplifiee : groupe.getChildren()) {
 
if (groupe.isShowChildren()) {
SQLRowValues rowValsLPaye = new SQLRowValues(tableFichePayeElt);
rowValsLPaye.put("NOM", lignePayeSimplifiee.getTranslation());
rowValsLPaye.put("IMPRESSION", Boolean.TRUE);
rowValsLPaye.put("IN_PERIODE", Boolean.TRUE);
rowValsLPaye.put("ID_STYLE", eltStyle.getAllStyleByName().get("Normal"));
// rowValsLPaye.put("NB_BASE", BigDecimal.ZERO);
// rowValsLPaye.put("TAUX_SAL", BigDecimal.ZERO);
// rowValsLPaye.put("MONTANT_SAL_AJ", BigDecimal.ZERO);
// rowValsLPaye.put("MONTANT_SAL_DED", BigDecimal.ZERO);
// rowValsLPaye.put("MONTANT_PAT", BigDecimal.ZERO);
mapPayeSimplifiee.put(lignePayeSimplifiee.getId(), rowValsLPaye);
resultCotis.add(rowValsLPaye);
} else {
mapPayeSimplifiee.put(lignePayeSimplifiee.getId(), rowValsFichePaye);
}
}
}
return mapPayeSimplifiee;
}
 
@Override
public String getDefaultTemplateId() {
return TEMPLATE_ID;
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/report/GroupePayeSimplifiee.java
Nouveau fichier
0,0 → 1,83
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.humanresources.payroll.report;
 
import org.openconcerto.utils.i18n.TranslationManager;
 
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
public enum GroupePayeSimplifiee {
 
SANTE("sante", true, Arrays.asList(LignePayeSimplifiee.SANTE_SECURITE, LignePayeSimplifiee.SANTE_COMPLEMENAIRE_DECES, LignePayeSimplifiee.SANTE_COMPLEMENAIRE_SANTE)), ACCIDENT_TRAVAIL("accident",
false, Arrays.asList(LignePayeSimplifiee.ACCIDENTS_TRAVAIL)), RETRAITE_NON_CADRE("retraite.noncadre", true,
Arrays.asList(LignePayeSimplifiee.RETRAITE_SECURITE_PLAF, LignePayeSimplifiee.RETRAITE_SECURITE_NON_PLAF, LignePayeSimplifiee.RETRAITE_COMPLEMENTAIRE_T1,
LignePayeSimplifiee.RETRAITE_COMPLEMENTAIRE_T2, LignePayeSimplifiee.RETRAITE_SUPPLEMENTAIRE)), RETRAITE_CADRE("retraite.cadre",
true,
Arrays.asList(LignePayeSimplifiee.RETRAITE_SECURITE_PLAF, LignePayeSimplifiee.RETRAITE_SECURITE_NON_PLAF, LignePayeSimplifiee.RETRAITE_COMPLEMENTAIRE_TA,
LignePayeSimplifiee.RETRAITE_COMPLEMENTAIRE_GMP, LignePayeSimplifiee.RETRAITE_COMPLEMENTAIRE_TB, LignePayeSimplifiee.RETRAITE_COMPLEMENTAIRE_TC,
LignePayeSimplifiee.RETRAITE_SUPPLEMENTAIRE)), FAMILLE("famille", false, Arrays.asList(LignePayeSimplifiee.FAMILLE_ALLOCATIONS)), CHOMAGE_NON_CADRE(
"chomage.noncadre", false, Arrays.asList(LignePayeSimplifiee.ASSURANCE_CHOMAGE_CHOMAGE)), CHOMAGE_CADRE("chomage.cadre", false,
Arrays.asList(LignePayeSimplifiee.ASSURANCE_CHOMAGE_CHOMAGE, LignePayeSimplifiee.ASSURANCE_CHOMAGE_APEC)), AUTRES_CONTRIBUTIONS("autres",
false, Arrays.asList(LignePayeSimplifiee.AUTRES_CONTRIBUTIONS)), COTISATIONS_CONVENTION("cotisations.convention", false,
Arrays.asList(LignePayeSimplifiee.COTISATIONS_STATUAIRES)), CSG_NON_IMP("csg.nonimp", false,
Arrays.asList(LignePayeSimplifiee.CSG_NON_IMP)), CSG_IMP("csg.imp", false,
Arrays.asList(LignePayeSimplifiee.CSG_IMP)), ALLEGEMENT("allegement", false,
Arrays.asList(LignePayeSimplifiee.ALLEGEMENT_COTISATIONS));
 
public final String id;
public final List<LignePayeSimplifiee> children;
public final boolean showChildren;
 
private GroupePayeSimplifiee(String id, boolean showChildren, List<LignePayeSimplifiee> children) {
this.children = children;
this.showChildren = showChildren;
this.id = id;
}
 
public boolean isShowChildren() {
return showChildren;
}
 
public List<LignePayeSimplifiee> getChildren() {
return children;
}
 
public String getId() {
return id;
}
 
public String getTranslation() {
final String translationForItem = TranslationManager.getInstance().getTranslationForItem(getId());
 
return (translationForItem == null || translationForItem.trim().length() == 0) ? getId() : translationForItem;
}
 
private static final Map<String, GroupePayeSimplifiee> idToEnum = new HashMap<String, GroupePayeSimplifiee>();
static {
for (GroupePayeSimplifiee e : values())
idToEnum.put(e.getId(), e);
}
 
public static GroupePayeSimplifiee fromID(int id) {
return idToEnum.get(id);
}
 
@Override
public String toString() {
return getTranslation();
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/report/LigneSimplifieeCellRenderer.java
Nouveau fichier
0,0 → 1,32
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.humanresources.payroll.report;
 
import java.awt.Component;
 
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
 
public class LigneSimplifieeCellRenderer extends DefaultTableCellRenderer {
 
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
String result = "";
if (value != null && value.toString().length() > 0) {
String i = (String) value;
result = LignePayeSimplifiee.fromID(i).getTranslation();
}
return super.getTableCellRendererComponent(table, result, isSelected, hasFocus, row, column);
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/report/LignePayeSimplifieeComboBox.java
Nouveau fichier
0,0 → 1,123
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.humanresources.payroll.report;
 
import org.openconcerto.sql.request.SQLRowItemView;
import org.openconcerto.sql.sqlobject.itemview.RowItemViewComponent;
import org.openconcerto.ui.valuewrapper.ValueChangeSupport;
import org.openconcerto.ui.valuewrapper.ValueWrapper;
import org.openconcerto.utils.checks.ValidListener;
import org.openconcerto.utils.checks.ValidState;
import org.openconcerto.utils.doc.Documented;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeListener;
 
import javax.swing.JComboBox;
import javax.swing.JComponent;
 
public class LignePayeSimplifieeComboBox extends JComboBox implements ValueWrapper<LignePayeSimplifiee>, Documented, RowItemViewComponent {
private final ValueChangeSupport<LignePayeSimplifiee> supp;
 
public LignePayeSimplifieeComboBox() {
 
this.supp = new ValueChangeSupport<LignePayeSimplifiee>(this);
this.addActionListener(new ActionListener() {
 
@Override
public void actionPerformed(ActionEvent e) {
supp.fireValueChange();
}
});
 
for (LignePayeSimplifiee etat : LignePayeSimplifiee.values()) {
addItem(etat);
}
}
 
@Override
public ValidState getValidState() {
return ValidState.getTrueInstance();
}
 
@Override
public void addValidListener(ValidListener l) {
this.supp.addValidListener(l);
}
 
@Override
public void removeValidListener(ValidListener l) {
this.supp.removeValidListener(l);
}
 
@Override
public void setValue(LignePayeSimplifiee val) {
this.setSelectedItem(val);
}
 
@Override
public void resetValue() {
// TODO Auto-generated method stub
 
}
 
@Override
public LignePayeSimplifiee getValue() {
return (LignePayeSimplifiee) this.getSelectedItem();
}
 
@Override
public void addValueListener(PropertyChangeListener l) {
this.supp.addValueListener(l);
}
 
@Override
public void rmValueListener(PropertyChangeListener l) {
this.supp.addValueListener(l);
}
 
@Override
public void init(SQLRowItemView v) {
// TODO Auto-generated method stub
 
}
 
@Override
public String getGenericDoc() {
return "";
}
 
@Override
public String getDocId() {
 
return "LignePayeSimplifiee";
}
 
@Override
public boolean onScreen() {
return true;
}
 
@Override
public boolean isDocTransversable() {
return false;
}
 
@Override
public JComponent getComp() {
return this;
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/payroll/ui/CaisseCotisationRenseignementTable.java
23,6 → 23,7
import org.openconcerto.sql.view.list.RowValuesTableRenderer;
import org.openconcerto.sql.view.list.SQLTableElement;
import org.openconcerto.ui.DefaultGridBagConstraints;
import org.openconcerto.ui.PositiveIntegerTableCellEditor;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
58,6 → 59,7
// SQLTableElement(e.getTable().getField("ORGANISME_COMPLEMENTAIRE")));
tableElements.add(new SQLTableElement(e.getTable().getField("CODE_DELEGATAIRE")));
tableElements.add(new SQLTableElement(e.getTable().getField("ID_CAISSE_MODE_PAIEMENT")));
tableElements.add(new SQLTableElement(e.getTable().getField("JOUR_PAIEMENT"), Integer.class, new PositiveIntegerTableCellEditor(false)));
tableElements.add(new SQLTableElement(e.getTable().getField("PAIEMENT_TRIMESTRIEL")));
tableElements.add(new SQLTableElement(e.getTable().getField("ID_SOCIETE_COMMON")));
 
/trunk/OpenConcerto/src/org/openconcerto/erp/core/humanresources/employe/element/EtatCivilSQLElement.java
60,7 → 60,7
public boolean isPrivate() {
return true;
}
 
/*
* (non-Javadoc)
*
205,13 → 205,28
c.weightx = 0;
panelNaissance.add(labelPaysNaissance, c);
c.gridx++;
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridwidth = 1;
c.weightx = 1;
c.weighty = 1;
panelNaissance.add(this.comboPays, c);
c.gridwidth = 1;
 
// Nationnalite
c.weightx = 0;
JLabel labelNationnalite = new JLabel(getLabelFor("NATIONNALITE"));
labelNationnalite.setHorizontalAlignment(SwingConstants.RIGHT);
c.gridy++;
c.gridx = 0;
panelNaissance.add(labelNationnalite, c);
c.gridx++;
c.gridwidth = 1;
c.weightx = 1;
JTextField fieldNation = new JTextField();
panelNaissance.add(fieldNation, c);
addView(fieldNation, "NATIONNALITE");
c.gridwidth = 1;
 
c.gridx = 0;
c.weighty = 0;
c.gridy = 1;
c.weightx = 0;
218,6 → 233,7
c.gridwidth = GridBagConstraints.REMAINDER;
c.anchor = GridBagConstraints.NORTHWEST;
this.add(panelNaissance, c);
 
c.anchor = GridBagConstraints.WEST;
c.gridwidth = 1;
 
236,11 → 252,22
labelNumeroSS.setHorizontalAlignment(SwingConstants.RIGHT);
panelSituation.add(labelNumeroSS, c);
c.gridx++;
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridwidth = 1;
c.weightx = 1;
panelSituation.add(this.numeroSS, c);
 
c.weightx = 0;
c.gridwidth = 1;
c.gridx++;
panelSituation.add(new JLabel("CNPS", SwingConstants.RIGHT), c);
c.gridx++;
c.gridwidth = 1;
c.weightx = 1;
JTextField fieldCNPS = new JTextField();
panelSituation.add(fieldCNPS, c);
c.weightx = 0;
c.gridwidth = 1;
addView(fieldCNPS, "CNPS");
 
// Situation familiale
JLabel labelSitutationFamiliale = new JLabel(getLabelFor("ID_SITUATION_FAMILIALE"));
252,7 → 279,7
c.gridy++;
panelSituation.add(labelSitutationFamiliale, c);
c.gridx++;
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridwidth = 1;
c.weightx = 1;
panelSituation.add(this.comboSituationFam, c);
c.gridwidth = 1;
287,10 → 314,173
c.gridy = 2;
c.anchor = GridBagConstraints.NORTHWEST;
c.gridwidth = GridBagConstraints.REMAINDER;
c.weighty = 1;
c.weighty = 0;
this.add(panelSituation, c);
 
/***********************************************************************************
* PIECE IDENTITE
**********************************************************************************/
JPanel panelIdentite = new JPanel();
panelIdentite.setOpaque(false);
panelIdentite.setBorder(BorderFactory.createTitledBorder("Pièce d'identité"));
panelIdentite.setLayout(new GridBagLayout());
// TYPE_PIECE_IDENTITE
c.gridy = 0;
c.gridx = 0;
c.gridwidth = 1;
JTextField fieldTypePiece = new JTextField();
JLabel typePieceLabel = new JLabel(getLabelFor("TYPE_PIECE_IDENTITE"));
typePieceLabel.setHorizontalAlignment(SwingConstants.RIGHT);
panelIdentite.add(typePieceLabel, c);
c.gridx++;
c.gridwidth = 1;
c.weightx = 1;
panelIdentite.add(fieldTypePiece, c);
addView(fieldTypePiece, "TYPE_PIECE_IDENTITE");
 
c.weightx = 0;
c.gridwidth = 1;
c.gridx++;
 
panelIdentite.add(new JLabel(getLabelFor("NUMERO_PIECE")), c);
c.gridx++;
c.gridwidth = 1;
c.weightx = 1;
JTextField fieldNumeroPiece = new JTextField();
panelIdentite.add(fieldNumeroPiece, c);
c.weightx = 0;
c.gridwidth = 1;
addView(fieldNumeroPiece, "NUMERO_PIECE");
 
// Date debut
JLabel labelDateDebut = new JLabel(getLabelFor("DATE_DEBUT_PIECE"));
labelDateDebut.setHorizontalAlignment(SwingConstants.RIGHT);
c.gridx = 0;
c.gridy++;
panelIdentite.add(labelDateDebut, c);
c.gridx++;
c.gridwidth = 1;
c.weightx = 1;
JDate fieldDateDebut = new JDate();
panelIdentite.add(fieldDateDebut, c);
addView(fieldDateDebut, "DATE_DEBUT_PIECE");
c.gridwidth = 1;
c.weightx = 0;
 
// Nombre d'enfants
JLabel labelDateFin = new JLabel(getLabelFor("DATE_FIN_PIECE"));
labelDateFin.setHorizontalAlignment(SwingConstants.RIGHT);
JDate fieldDateFin = new JDate();
c.gridx++;
panelIdentite.add(labelDateFin, c);
c.gridx++;
c.weightx = 1;
panelIdentite.add(fieldDateFin, c);
addView(fieldDateFin, "DATE_FIN_PIECE");
c.weightx = 0;
 
c.gridx = 0;
c.gridy = 3;
c.anchor = GridBagConstraints.NORTHWEST;
c.gridwidth = GridBagConstraints.REMAINDER;
c.weighty = 0;
this.add(panelIdentite, c);
 
/***********************************************************************************
* FAMILLE
**********************************************************************************/
JPanel panelFamille = new JPanel();
panelFamille.setOpaque(false);
panelFamille.setBorder(BorderFactory.createTitledBorder("Famille"));
panelFamille.setLayout(new GridBagLayout());
// TYPE_PIECE_IDENTITE
c.gridy = 0;
c.gridx = 0;
c.gridwidth = 1;
JTextField fieldPere = new JTextField();
JLabel pereLabel = new JLabel(getLabelFor("NOM_PERE"));
pereLabel.setHorizontalAlignment(SwingConstants.RIGHT);
panelFamille.add(pereLabel, c);
c.gridx++;
c.gridwidth = 1;
c.weightx = 1;
panelFamille.add(fieldPere, c);
addView(fieldPere, "NOM_PERE");
 
c.weightx = 0;
c.gridwidth = 1;
c.gridx++;
panelFamille.add(new JLabel(getLabelFor("NOM_MERE")), c);
c.gridx++;
c.gridwidth = 1;
c.weightx = 1;
JTextField fieldNomMere = new JTextField();
panelFamille.add(fieldNomMere, c);
c.weightx = 0;
c.gridwidth = 1;
addView(fieldNomMere, "NOM_MERE");
 
// Nom
JLabel labelConjointNom = new JLabel(getLabelFor("CONJOINT_NOM"));
labelConjointNom.setHorizontalAlignment(SwingConstants.RIGHT);
c.gridx = 0;
c.gridy++;
panelFamille.add(labelConjointNom, c);
c.gridx++;
c.gridwidth = 1;
c.weightx = 1;
JTextField fieldConjointNom = new JTextField();
panelFamille.add(fieldConjointNom, c);
addView(fieldConjointNom, "CONJOINT_NOM");
c.gridwidth = 1;
c.weightx = 0;
 
c.weightx = 0;
c.gridwidth = 1;
c.gridx++;
panelFamille.add(new JLabel(getLabelFor("CONJOINT_PROFESSION")), c);
c.gridx++;
c.gridwidth = 1;
c.weightx = 1;
JTextField fieldProfession = new JTextField();
panelFamille.add(fieldProfession, c);
c.weightx = 0;
c.gridwidth = 1;
addView(fieldProfession, "CONJOINT_PROFESSION");
 
// Nombre d'enfants
JLabel labelDateNaissanceConjoint = new JLabel(getLabelFor("CONJOINT_DATE_NAISSANCE"));
labelDateNaissanceConjoint.setHorizontalAlignment(SwingConstants.RIGHT);
JDate fieldDateNaissanceConjoint = new JDate();
c.gridx = 0;
c.gridy++;
panelFamille.add(labelDateNaissanceConjoint, c);
c.gridx++;
c.weightx = 1;
panelFamille.add(fieldDateNaissanceConjoint, c);
addView(fieldDateNaissanceConjoint, "CONJOINT_DATE_NAISSANCE");
c.weightx = 0;
 
c.weightx = 0;
c.gridwidth = 1;
c.gridx++;
panelFamille.add(new JLabel(getLabelFor("CONJOINT_LIEU_NAISSANCE")), c);
c.gridx++;
c.gridwidth = 1;
c.weightx = 1;
JTextField fieldLieuNaissanceConjoint = new JTextField();
panelFamille.add(fieldLieuNaissanceConjoint, c);
c.weightx = 0;
c.gridwidth = 1;
addView(fieldLieuNaissanceConjoint, "CONJOINT_LIEU_NAISSANCE");
 
c.gridx = 0;
c.gridy = 4;
c.anchor = GridBagConstraints.NORTHWEST;
c.gridwidth = GridBagConstraints.REMAINDER;
c.weighty = 1;
this.add(panelFamille, c);
 
this.addRequiredSQLObject(this.dateNaissance, "DATE_NAISSANCE");
this.addSQLObject(this.lieuNaissance, "COMMUNE_NAISSANCE");
this.addSQLObject(this.nbEnfants, "NB_ENFANTS");
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/model/PriceByQty.java
36,6 → 36,10
return getPriceForQty(qty, list, new Date(System.currentTimeMillis()));
}
 
public BigDecimal getPrice() {
return price;
}
 
public static BigDecimal getPriceForQty(int qty, List<PriceByQty> list, Date d) {
BigDecimal result = null;
Collections.sort(list, new Comparator<PriceByQty>() {
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/component/ReferenceArticleSQLComponent.java
19,6 → 19,7
import org.openconcerto.erp.core.common.ui.TotalPanel;
import org.openconcerto.erp.core.finance.accounting.model.CurrencyConverter;
import org.openconcerto.erp.core.finance.tax.model.TaxeCache;
import org.openconcerto.erp.core.sales.product.element.ArticleCodeClientTable;
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.ui.ArticleDesignationTable;
94,6 → 95,7
private JLabel labelMetriqueVT1 = new JLabel(getLabelFor("PRIX_METRIQUE_VT_1"), SwingConstants.RIGHT);
 
private ArticleDesignationTable tableDes = new ArticleDesignationTable();
private ArticleCodeClientTable tableCodeClient = new ArticleCodeClientTable();
private ArticleTarifTable tableTarifVente = new ArticleTarifTable(this);
private ProductQtyPriceListTable tableTarifQteVente = new ProductQtyPriceListTable(this);
private ProductItemListTable tableBom;
217,6 → 219,7
this.tableBom.insertFrom("ID_ARTICLE_PARENT", r.getID());
}
this.tableDes.insertFrom("ID_ARTICLE", r.getID());
this.tableCodeClient.insertFrom("ID_ARTICLE", r.getID());
if (this.codeFournisseurTable != null) {
this.codeFournisseurTable.insertFrom("ID_ARTICLE", r.getID());
}
363,6 → 366,7
pane.add("Stock", createStockPanel());
pane.add("Descriptif", createDescriptifPanel());
pane.add("Désignations multilingues", createDesignationPanel());
pane.add("Désignations clients", createCodeClientPanel());
pane.add("Comptabilité", createComptaPanel());
pane.add(getLabelFor("INFOS"), createInfosPanel());
 
399,8 → 403,32
JPanel panel = new JPanel(new GridBagLayout());
panel.setOpaque(false);
GridBagConstraints c = new DefaultGridBagConstraints();
c.weightx = 0;
c.gridy++;
c.gridx = 0;
c.weightx = 0;
JLabel labelifco = new JLabel(getLabelFor("IFCO"));
 
panel.add(labelifco, c);
c.weightx = 1;
c.gridx++;
JTextField textIfco = new JTextField(40);
panel.add(textIfco, c);
addView(textIfco, "IFCO");
 
c.gridx++;
c.weightx = 0;
JLabel labelTare = new JLabel(getLabelFor("TARE"));
panel.add(labelTare, c);
c.weightx = 1;
c.gridx++;
JTextField textTare = new JTextField(40);
panel.add(textTare, c);
addView(textTare, "TARE");
 
c.gridy++;
c.gridx = 0;
c.weightx = 0;
JLabel labelEco = new JLabel(getLabelFor("ID_ECO_CONTRIBUTION"));
c.fill = GridBagConstraints.BOTH;
panel.add(labelEco, c);
559,6 → 587,22
return panel;
}
 
private Component createCodeClientPanel() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setOpaque(false);
GridBagConstraints c = new DefaultGridBagConstraints();
 
c.gridx = 0;
c.gridwidth = GridBagConstraints.REMAINDER;
c.fill = GridBagConstraints.BOTH;
c.weighty = 1;
c.weightx = 1;
this.tableCodeClient.setOpaque(false);
panel.add(this.tableCodeClient, c);
 
return panel;
}
 
private Component createStockPanel() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setOpaque(false);
1210,6 → 1254,7
}
 
this.tableDes.updateField("ID_ARTICLE", getSelectedID());
this.tableCodeClient.updateField("ID_ARTICLE", getSelectedID());
if (this.codeFournisseurTable != null) {
this.codeFournisseurTable.updateField("ID_ARTICLE", getSelectedID());
}
1272,6 → 1317,7
this.tableBom.updateField("ID_ARTICLE_PARENT", id);
}
this.tableDes.updateField("ID_ARTICLE", id);
this.tableCodeClient.updateField("ID_ARTICLE", id);
if (this.codeFournisseurTable != null) {
this.codeFournisseurTable.updateField("ID_ARTICLE", id);
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/element/ListeHistoCodeClient.java
Nouveau fichier
0,0 → 1,81
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
/*
* Créé le 3 juin 2012
*/
package org.openconcerto.erp.core.sales.product.element;
 
import org.openconcerto.erp.config.Gestion;
import org.openconcerto.erp.core.reports.history.ui.ListeHistoriquePanel;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.model.DBRoot;
import org.openconcerto.sql.request.ComboSQLRequest;
import org.openconcerto.ui.PanelFrame;
import org.openconcerto.ui.state.WindowStateManager;
 
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
 
import javax.swing.JFrame;
 
public class ListeHistoCodeClient {
private PanelFrame panelFrame;
private ListeHistoriquePanel listPanel;
 
public ListeHistoriquePanel getHistoriquePanel() {
return this.listPanel;
}
 
public ListeHistoCodeClient(DBRoot root) {
 
Map<String, List<String>> mapList = new LinkedHashMap<String, List<String>>();
mapList.put("Codes", Arrays.asList("ARTICLE_CODE_CLIENT"));
 
ComboSQLRequest request = new ComboSQLRequest(root.getTable("CLIENT"), Arrays.asList("NOM"));
request.setFieldSeparator(" ");
 
this.listPanel = new ListeHistoriquePanel("Code article client", request, mapList, null, null, null, true, null, null);
 
this.panelFrame = new PanelFrame(this.listPanel, "Code article client");
this.panelFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
listPanel.removeAllTableListener();
};
});
 
this.panelFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
 
public PanelFrame getFrame() {
 
this.panelFrame.setIconImages(Gestion.getFrameIcon());
 
WindowStateManager stateManager = new WindowStateManager(this.panelFrame,
new File(Configuration.getInstance().getConfDir(), "Configuration" + File.separator + "Frame" + File.separator + "HistoCodeArticleClient.xml"), true);
 
this.panelFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.panelFrame.pack();
 
this.panelFrame.setLocationRelativeTo(null);
 
stateManager.loadState();
 
return this.panelFrame;
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/element/ArticleCodeClientTable.java
Nouveau fichier
0,0 → 1,116
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.sales.product.element;
 
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.UndefinedRowValuesCache;
import org.openconcerto.sql.view.list.RowValuesTable;
import org.openconcerto.sql.view.list.RowValuesTableControlPanel;
import org.openconcerto.sql.view.list.RowValuesTableModel;
import org.openconcerto.sql.view.list.RowValuesTableRenderer;
import org.openconcerto.sql.view.list.SQLTableElement;
import org.openconcerto.ui.DefaultGridBagConstraints;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.List;
import java.util.Vector;
 
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.ToolTipManager;
 
public class ArticleCodeClientTable extends JPanel {
private RowValuesTable table;
private RowValuesTableModel model;
 
public ArticleCodeClientTable() {
init();
uiInit();
}
 
protected void init() {
 
final SQLElement e = getSQLElement();
 
final List<SQLTableElement> list = new Vector<SQLTableElement>();
 
final SQLTableElement tableElementClient = new SQLTableElement(e.getTable().getField("ID_CLIENT"));
list.add(tableElementClient);
 
final SQLTableElement code = new SQLTableElement(e.getTable().getField("CODE"));
list.add(code);
 
final SQLTableElement nom = new SQLTableElement(e.getTable().getField("NOM"));
list.add(nom);
 
SQLRowValues defautRow = new SQLRowValues(UndefinedRowValuesCache.getInstance().getDefaultRowValues(e.getTable()));
this.model = new RowValuesTableModel(e, list, e.getTable().getField("ID_CLIENT"), false, defautRow);
 
this.table = new RowValuesTable(this.model, null, true);
ToolTipManager.sharedInstance().unregisterComponent(this.table);
ToolTipManager.sharedInstance().unregisterComponent(this.table.getTableHeader());
}
 
/**
*
*/
protected void uiInit() {
// Ui init
this.setLayout(new GridBagLayout());
this.setOpaque(false);
final GridBagConstraints c = new DefaultGridBagConstraints();
c.weightx = 1;
c.gridx = 0;
final JPanel control = new RowValuesTableControlPanel(this.table);
control.setOpaque(false);
this.add(control, c);
 
c.gridy++;
c.fill = GridBagConstraints.BOTH;
c.weighty = 1;
c.weightx = 1;
JScrollPane comp = new JScrollPane(this.table);
comp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
this.add(comp, c);
this.table.setDefaultRenderer(Long.class, new RowValuesTableRenderer());
}
 
public SQLElement getSQLElement() {
return Configuration.getInstance().getDirectory().getElement("ARTICLE_CODE_CLIENT");
}
 
public void updateField(String field, int id) {
this.table.updateField(field, id);
}
 
public RowValuesTable getRowValuesTable() {
return this.table;
}
 
public void insertFrom(String field, int id) {
this.table.insertFrom(field, id);
}
 
public RowValuesTableModel getModel() {
return this.table.getRowValuesTableModel();
}
 
public void refreshTable() {
this.table.repaint();
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/element/ClientCodeArticleTable.java
Nouveau fichier
0,0 → 1,120
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.sales.product.element;
 
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLRowValues;
import org.openconcerto.sql.model.UndefinedRowValuesCache;
import org.openconcerto.sql.view.list.RowValuesTable;
import org.openconcerto.sql.view.list.RowValuesTableControlPanel;
import org.openconcerto.sql.view.list.RowValuesTableModel;
import org.openconcerto.sql.view.list.RowValuesTableRenderer;
import org.openconcerto.sql.view.list.SQLTableElement;
import org.openconcerto.ui.DefaultGridBagConstraints;
 
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.List;
import java.util.Vector;
 
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.ToolTipManager;
 
public class ClientCodeArticleTable extends JPanel {
private RowValuesTable table;
private RowValuesTableModel model;
 
public ClientCodeArticleTable() {
init();
uiInit();
}
 
protected void init() {
 
final SQLElement e = getSQLElement();
 
final List<SQLTableElement> list = new Vector<SQLTableElement>();
 
final SQLTableElement tableElementClient = new SQLTableElement(e.getTable().getField("ID_ARTICLE"));
list.add(tableElementClient);
 
final SQLTableElement code = new SQLTableElement(e.getTable().getField("CODE"));
list.add(code);
 
final SQLTableElement nom = new SQLTableElement(e.getTable().getField("NOM"));
list.add(nom);
 
SQLRowValues defautRow = new SQLRowValues(UndefinedRowValuesCache.getInstance().getDefaultRowValues(e.getTable()));
this.model = new RowValuesTableModel(e, list, e.getTable().getField("ID_ARTICLE"), false, defautRow);
 
this.table = new RowValuesTable(this.model, null, true);
ToolTipManager.sharedInstance().unregisterComponent(this.table);
ToolTipManager.sharedInstance().unregisterComponent(this.table.getTableHeader());
}
 
public void insertFrom(String field, SQLRowValues row) {
this.table.insertFrom(field, row);
}
 
/**
*
*/
protected void uiInit() {
// Ui init
this.setLayout(new GridBagLayout());
this.setOpaque(false);
final GridBagConstraints c = new DefaultGridBagConstraints();
c.weightx = 1;
c.gridx = 0;
final JPanel control = new RowValuesTableControlPanel(this.table);
control.setOpaque(false);
this.add(control, c);
 
c.gridy++;
c.fill = GridBagConstraints.BOTH;
c.weighty = 1;
c.weightx = 1;
JScrollPane comp = new JScrollPane(this.table);
comp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
this.add(comp, c);
this.table.setDefaultRenderer(Long.class, new RowValuesTableRenderer());
}
 
public SQLElement getSQLElement() {
return Configuration.getInstance().getDirectory().getElement("ARTICLE_CODE_CLIENT");
}
 
public void updateField(String field, int id) {
this.table.updateField(field, id);
}
 
public RowValuesTable getRowValuesTable() {
return this.table;
}
 
public void insertFrom(String field, int id) {
this.table.insertFrom(field, id);
}
 
public RowValuesTableModel getModel() {
return this.table.getRowValuesTableModel();
}
 
public void refreshTable() {
this.table.repaint();
}
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/element/ArticleCodeClientSQLElement.java
Nouveau fichier
0,0 → 1,83
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.sales.product.element;
 
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
import org.openconcerto.sql.element.SQLComponent;
import org.openconcerto.sql.element.UISQLComponent;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
public class ArticleCodeClientSQLElement extends ComptaSQLConfElement {
 
public ArticleCodeClientSQLElement() {
super("ARTICLE_CODE_CLIENT", "un code article client", "codes articles clients");
 
}
 
@Override
protected String getParentFFName() {
return "ID_ARTICLE";
}
 
/*
* (non-Javadoc)
*
* @see org.openconcerto.devis.BaseSQLElement#getComboFields()
*/
protected List<String> getComboFields() {
 
final List<String> l = Arrays.asList("ID_ARTICLE", "ID_CLIENT", "CODE");
return l;
}
 
/*
* (non-Javadoc)
*
* @see org.openconcerto.devis.BaseSQLElement#getListFields()
*/
protected List<String> getListFields() {
final List<String> l = new ArrayList<String>();
l.add("ID_ARTICLE");
l.add("CODE");
l.add("NOM");
return l;
}
 
/*
* (non-Javadoc)
*
* @see org.openconcerto.devis.SQLElement#getComponent()
*/
public SQLComponent createComponent() {
return new UISQLComponent(this) {
public void addViews() {
this.addView("ID_ARTICLE");
this.addView("ID_CLIENT");
this.addView("CODE");
this.addView("NOM");
 
}
};
 
}
 
@Override
protected String createCode() {
return createCodeFromPackage() + ".customcode";
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/product/action/ListeHistoCodeClientArticleAction.java
Nouveau fichier
0,0 → 1,36
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU General Public License Version 3
* only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
* copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*/
package org.openconcerto.erp.core.sales.product.action;
 
import org.openconcerto.erp.action.CreateFrameAbstractAction;
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.core.sales.product.element.ListeHistoCodeClient;
import org.openconcerto.sql.Configuration;
 
import javax.swing.Action;
import javax.swing.JFrame;
 
public class ListeHistoCodeClientArticleAction extends CreateFrameAbstractAction {
 
public ListeHistoCodeClientArticleAction() {
super();
this.putValue(Action.NAME, "Liste des codes articles clients");
}
 
public JFrame createFrame() {
final ListeHistoCodeClient listeHistoCodeClient = new ListeHistoCodeClient(((ComptaPropsConfiguration) Configuration.getInstance()).getRootSociete());
return listeHistoCodeClient.getFrame();
}
 
}
/trunk/OpenConcerto/src/org/openconcerto/erp/core/sales/pos/POSConfiguration.java
13,6 → 13,7
package org.openconcerto.erp.core.sales.pos;
 
import org.openconcerto.erp.action.NouvelleConnexionAction;
import org.openconcerto.erp.config.ComptaPropsConfiguration;
import org.openconcerto.erp.config.MainFrame;
import org.openconcerto.erp.core.common.ui.TotalCalculator;
25,6 → 26,8
import org.openconcerto.erp.core.sales.pos.model.Client;
import org.openconcerto.erp.core.sales.pos.model.Paiement;
import org.openconcerto.erp.core.sales.pos.model.ReceiptCode;
import org.openconcerto.erp.core.sales.pos.model.RegisterFiles.HashMode;
import org.openconcerto.erp.core.sales.pos.model.RegisterLogEntry.ReceiptEntry;
import org.openconcerto.erp.core.sales.pos.model.Ticket;
import org.openconcerto.erp.core.sales.pos.model.TicketLine;
import org.openconcerto.erp.core.supplychain.stock.element.StockItemsUpdater;
37,7 → 40,9
import org.openconcerto.erp.preferences.DefaultNXProps;
import org.openconcerto.sql.Configuration;
import org.openconcerto.sql.element.SQLElement;
import org.openconcerto.sql.model.SQLBackgroundTableCache;
import org.openconcerto.sql.model.SQLBase;
import org.openconcerto.sql.model.SQLDataSource;
import org.openconcerto.sql.model.SQLRow;
import org.openconcerto.sql.model.SQLRowAccessor;
import org.openconcerto.sql.model.SQLRowValues;
46,7 → 51,6
import org.openconcerto.sql.model.SQLSelectHandlerBuilder;
import org.openconcerto.sql.model.SQLTable;
import org.openconcerto.sql.model.Where;
import org.openconcerto.sql.users.UserManager;
import org.openconcerto.sql.utils.SQLUtils;
import org.openconcerto.utils.BaseDirs;
import org.openconcerto.utils.DecimalUtils;
59,15 → 63,17
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.file.Path;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.logging.Logger;
 
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
 
78,6 → 84,18
import org.jdom2.output.XMLOutputter;
 
public class POSConfiguration {
 
private static final Logger LOG = Logger.getLogger(org.openconcerto.erp.config.Log.get().getName() + ".pos");
 
public static final Logger getLogger() {
return LOG;
}
 
public static final void checkRegisterID(final int fsID, final int dbID) {
if (fsID != dbID)
throw new IllegalArgumentException("Not same register, FS " + fsID + ", DB " + dbID);
}
 
private static final String POS_CONFIGURATION_FILENAME = "pos.xml";
private static POSConfiguration instance;
 
208,7 → 226,7
return this.confFile;
}
 
public void createConnexion() {
public ComptaPropsConfiguration createConnexion() {
final ComptaPropsConfiguration conf = ComptaPropsConfiguration.create();
TranslationManager.getInstance().addTranslationStreamFromClass(MainFrame.class);
TranslationManager.getInstance().setLocale(Locale.getDefault());
215,22 → 233,27
 
Configuration.setInstance(conf);
try {
conf.getBase();
conf.getUserManager().setCurrentUserID(getUserID());
conf.setUpSocieteDataBaseConnexion(getCompanyID());
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Impossible de configurer la connexion à la base de donnée.\n ID société: " + getCompanyID() + " \n ID utilisateur: " + getUserID());
e.printStackTrace();
System.exit(2);
}
 
try {
UserManager.getInstance().setCurrentUser(getUserID());
final ComptaPropsConfiguration comptaPropsConfiguration = ((ComptaPropsConfiguration) Configuration.getInstance());
comptaPropsConfiguration.setUpSocieteDataBaseConnexion(getCompanyID());
} catch (Exception e) {
JOptionPane.showMessageDialog(new JFrame(), "Impossible de configurer la connexion à la base de donnée.\n ID société: " + getCompanyID() + " \n ID utilisateur: " + getUserID());
e.printStackTrace();
System.exit(2);
}
NouvelleConnexionAction.initCache(conf);
 
return conf;
}
 
public final Path getRootDir() throws IOException {
return Configuration.getInstance().getBaseDirs().getAppDataFolderToWrite().toPath();
}
 
public final void closeConnexion() {
Configuration.setInstance(null, true);
}
 
public void commitAll(final List<Ticket> tickets) {
// createConnexion();
try {
237,134 → 260,8
SQLUtils.executeAtomic(Configuration.getInstance().getSystemRoot().getDataSource(), new SQLUtils.SQLFactory<Object>() {
@Override
public Object create() throws SQLException {
final int defaultIDClient = getClientCaisse().getID();
SQLElement elt = Configuration.getInstance().getDirectory().getElement("TICKET_CAISSE");
SQLElement eltFact = Configuration.getInstance().getDirectory().getElement("SAISIE_VENTE_FACTURE_ELEMENT");
SQLElement eltEnc = Configuration.getInstance().getDirectory().getElement("ENCAISSER_MONTANT");
SQLElement eltMode = Configuration.getInstance().getDirectory().getElement("MODE_REGLEMENT");
SQLElement eltArticle = Configuration.getInstance().getDirectory().getElement("ARTICLE");
int imported = 0;
for (Ticket ticket : tickets) {
SQLSelect sel = new SQLSelect(Configuration.getInstance().getBase());
sel.addSelect(elt.getTable().getField("NUMERO"));
sel.setWhere(new Where(elt.getTable().getField("NUMERO"), "=", ticket.getCode()));
List<?> l = Configuration.getInstance().getBase().getDataSource().executeCol(sel.asString());
if (l != null && l.size() == 0) {
final int imported = importReceipts(tickets, null);
 
SQLRowValues rowVals = new SQLRowValues(elt.getTable());
rowVals.put("NUMERO", ticket.getCode());
rowVals.put("DATE", ticket.getCreationDate());
rowVals.put("ID_CAISSE", getPosID());
int idClient = ticket.getClient().getId();
if (idClient <= 0) {
idClient = defaultIDClient;
}
TotalCalculator calc = new TotalCalculator("T_PA_HT", "T_PV_HT", null);
 
String val = DefaultNXProps.getInstance().getStringProperty("ArticleService");
Boolean bServiceActive = Boolean.valueOf(val);
calc.setServiceActive(bServiceActive != null && bServiceActive);
 
// Articles
for (Pair<Article, Integer> item : ticket.getArticles()) {
SQLRowValues rowValsElt = new SQLRowValues(eltFact.getTable());
final Article article = item.getFirst();
final Integer nb = item.getSecond();
rowValsElt.put("QTE", nb);
rowValsElt.put("PV_HT", article.getPriceWithoutTax());
Float tauxFromId = TaxeCache.getCache().getTauxFromId(article.getIdTaxe());
BigDecimal tauxTVA = new BigDecimal(tauxFromId).movePointLeft(2).add(BigDecimal.ONE);
 
final BigDecimal valueHT = article.getPriceWithoutTax().multiply(new BigDecimal(nb), DecimalUtils.HIGH_PRECISION);
 
rowValsElt.put("T_PV_HT", valueHT);
rowValsElt.put("T_PV_TTC", valueHT.multiply(tauxTVA, DecimalUtils.HIGH_PRECISION));
rowValsElt.put("ID_TAXE", article.getIdTaxe());
rowValsElt.put("CODE", article.getCode());
rowValsElt.put("NOM", article.getName());
rowValsElt.put("ID_TICKET_CAISSE", rowVals);
rowValsElt.put("ID_ARTICLE", article.getId());
calc.addLine(rowValsElt, eltArticle.getTable().getRow(article.getId()), 0, false);
}
calc.checkResult();
long longValueTotalHT = calc.getTotalHT().movePointRight(2).setScale(0, RoundingMode.HALF_UP).longValue();
rowVals.put("TOTAL_HT", longValueTotalHT);
 
long longValueTotal = calc.getTotalTTC().movePointRight(2).setScale(0, RoundingMode.HALF_UP).longValue();
rowVals.put("TOTAL_TTC", longValueTotal);
long longValueTotalTVA = calc.getTotalTVA().movePointRight(2).setScale(0, RoundingMode.HALF_UP).longValue();
rowVals.put("TOTAL_TVA", longValueTotalTVA);
 
// Paiements
for (Paiement paiement : ticket.getPaiements()) {
if (paiement.getMontantInCents() > 0 && paiement.getType() != Paiement.SOLDE) {
 
SQLRowValues rowValsElt = new SQLRowValues(eltEnc.getTable());
SQLRowValues rowValsEltMode = new SQLRowValues(eltMode.getTable());
if (paiement.getType() == Paiement.CB) {
rowValsEltMode.put("ID_TYPE_REGLEMENT", TypeReglementSQLElement.CB);
} else if (paiement.getType() == Paiement.CHEQUE) {
rowValsEltMode.put("ID_TYPE_REGLEMENT", TypeReglementSQLElement.CHEQUE);
} else if (paiement.getType() == Paiement.ESPECES) {
rowValsEltMode.put("ID_TYPE_REGLEMENT", TypeReglementSQLElement.ESPECE);
}
 
rowValsElt.put("ID_MODE_REGLEMENT", rowValsEltMode);
rowValsElt.put("ID_CLIENT", idClient);
 
long montant = Long.valueOf(paiement.getMontantInCents());
if (ticket.getPaiements().size() == 1 && paiement.getType() == Paiement.ESPECES) {
montant = longValueTotal;
}
rowValsElt.put("MONTANT", montant);
rowValsElt.put("NOM", "Ticket " + ticket.getCode());
rowValsElt.put("DATE", ticket.getCreationDate());
rowValsElt.put("ID_TICKET_CAISSE", rowVals);
 
}
}
 
SQLRow rowFinal = rowVals.insert();
imported++;
GenerationMvtTicketCaisse mvt = new GenerationMvtTicketCaisse(rowFinal);
final Integer idMvt;
try {
idMvt = mvt.genereMouvement().call();
 
SQLRowValues valTicket = rowFinal.asRowValues();
valTicket.put("ID_MOUVEMENT", Integer.valueOf(idMvt));
rowFinal = valTicket.update();
 
// msie à jour du mouvement
List<SQLRow> rowsEnc = rowFinal.getReferentRows(eltEnc.getTable());
long totalEnc = 0;
for (SQLRow sqlRow : rowsEnc) {
long montant = sqlRow.getLong("MONTANT");
PrixTTC ttc = new PrixTTC(montant);
totalEnc += montant;
new GenerationReglementVenteNG(
"Règlement " + sqlRow.getForeignRow("ID_MODE_REGLEMENT").getForeignRow("ID_TYPE_REGLEMENT").getString("NOM") + " Ticket " + rowFinal.getString("NUMERO"),
sqlRow.getForeign("ID_CLIENT"), ttc, sqlRow.getDate("DATE").getTime(), sqlRow.getForeignRow("ID_MODE_REGLEMENT"), rowFinal,
rowFinal.getForeignRow("ID_MOUVEMENT"), false);
}
if (totalEnc > longValueTotal) {
final SQLTable table = Configuration.getInstance().getDirectory().getElement("TYPE_REGLEMENT").getTable();
int idComptePceCaisse = table.getRow(TypeReglementSQLElement.ESPECE).getInt("ID_COMPTE_PCE_CLIENT");
if (idComptePceCaisse == table.getUndefinedID()) {
idComptePceCaisse = ComptePCESQLElement.getId(ComptePCESQLElement.getComptePceDefault("VenteEspece"));
}
new GenerationMvtVirement(idComptePceCaisse, rowFinal.getForeign("ID_CLIENT").getInt("ID_COMPTE_PCE"), 0, totalEnc - longValueTotal,
"Rendu sur règlement " + " Ticket " + rowFinal.getString("NUMERO"), new Date(), JournalSQLElement.CAISSES, " Ticket " + rowFinal.getString("NUMERO"))
.genereMouvement();
}
} catch (Exception exn) {
exn.printStackTrace();
throw new SQLException(exn);
}
updateStock(rowFinal.getID());
 
}
}
// mark imported
for (Ticket ticket : tickets) {
final ReceiptCode code = ticket.getReceiptCode();
400,6 → 297,158
 
}
 
public final int importReceipts(final List<Ticket> tickets, final List<ReceiptEntry> entries) throws SQLException {
 
if (entries != null && entries.size() != tickets.size())
throw new IllegalArgumentException("Size mismatch");
 
final int defaultIDClient = getClientCaisse().getID();
SQLElement elt = Configuration.getInstance().getDirectory().getElement("TICKET_CAISSE");
SQLElement eltFact = Configuration.getInstance().getDirectory().getElement("SAISIE_VENTE_FACTURE_ELEMENT");
SQLElement eltEnc = Configuration.getInstance().getDirectory().getElement("ENCAISSER_MONTANT");
SQLElement eltMode = Configuration.getInstance().getDirectory().getElement("MODE_REGLEMENT");
SQLElement eltArticle = Configuration.getInstance().getDirectory().getElement("ARTICLE");
final SQLDataSource ds = elt.getTable().getDBSystemRoot().getDataSource();
int imported = 0;
 
final Iterator<ReceiptEntry> entriesIter = entries == null ? null : entries.iterator();
for (Ticket ticket : tickets) {
SQLSelect sel = new SQLSelect();
sel.addSelectFunctionStar("COUNT");
sel.setWhere(new Where(elt.getTable().getField("NUMERO"), "=", ticket.getCode()));
// if entries is null, it's the obsolete way when there was no opening/closure
if (entries != null || ((Number) ds.executeScalar(sel.asString())).intValue() == 0) {
final ReceiptEntry entry;
if (entriesIter == null) {
entry = null;
} else {
entry = entriesIter.next();
if (entry == null)
throw new IllegalArgumentException("Null log entry for " + ticket);
else if (!entry.getCodeString().equals(ticket.getCode()))
throw new IllegalArgumentException("Code mismatch for " + ticket);
}
 
SQLRowValues rowVals = new SQLRowValues(elt.getTable());
rowVals.put("NUMERO", ticket.getCode());
rowVals.put("DATE", ticket.getCreationDate());
rowVals.put("ID_CAISSE", getPosID());
if (entry != null) {
rowVals.put("FILE_HASH", entry.getFileHash());
rowVals.put("FILE_HASH_PREVIOUS", ticket.getPreviousHash());
}
int idClient = ticket.getClient().getId();
if (idClient <= 0) {
idClient = defaultIDClient;
}
TotalCalculator calc = new TotalCalculator("T_PA_HT", "T_PV_HT", null);
 
String val = DefaultNXProps.getInstance().getStringProperty("ArticleService");
Boolean bServiceActive = Boolean.valueOf(val);
calc.setServiceActive(bServiceActive != null && bServiceActive);
 
// Articles
for (Pair<Article, Integer> item : ticket.getArticles()) {
SQLRowValues rowValsElt = new SQLRowValues(eltFact.getTable());
final Article article = item.getFirst();
final Integer nb = item.getSecond();
rowValsElt.put("QTE", nb);
rowValsElt.put("PV_HT", article.getPriceWithoutTax());
Float tauxFromId = TaxeCache.getCache().getTauxFromId(article.getIdTaxe());
BigDecimal tauxTVA = new BigDecimal(tauxFromId).movePointLeft(2).add(BigDecimal.ONE);
 
final BigDecimal valueHT = article.getPriceWithoutTax().multiply(new BigDecimal(nb), DecimalUtils.HIGH_PRECISION);
 
rowValsElt.put("T_PV_HT", valueHT);
rowValsElt.put("T_PV_TTC", valueHT.multiply(tauxTVA, DecimalUtils.HIGH_PRECISION));
rowValsElt.put("ID_TAXE", article.getIdTaxe());
rowValsElt.put("CODE", article.getCode());
rowValsElt.put("NOM", article.getName());
rowValsElt.put("ID_TICKET_CAISSE", rowVals);
rowValsElt.put("ID_ARTICLE", article.getId());
calc.addLine(rowValsElt, eltArticle.getTable().getRow(article.getId()), 0, false);
}
calc.checkResult();
long longValueTotalHT = calc.getTotalHT().movePointRight(2).setScale(0, RoundingMode.HALF_UP).longValue();
rowVals.put("TOTAL_HT", longValueTotalHT);
 
long longValueTotal = calc.getTotalTTC().movePointRight(2).setScale(0, RoundingMode.HALF_UP).longValue();
rowVals.put("TOTAL_TTC", longValueTotal);
long longValueTotalTVA = calc.getTotalTVA().movePointRight(2).setScale(0, RoundingMode.HALF_UP).longValue();
rowVals.put("TOTAL_TVA", longValueTotalTVA);
 
// Paiements
for (Paiement paiement : ticket.getPaiements()) {
if (paiement.getMontantInCents() > 0 && paiement.getType() != Paiement.SOLDE) {
 
SQLRowValues rowValsElt = new SQLRowValues(eltEnc.getTable());
SQLRowValues rowValsEltMode = new SQLRowValues(eltMode.getTable());
if (paiement.getType() == Paiement.CB) {
rowValsEltMode.put("ID_TYPE_REGLEMENT", TypeReglementSQLElement.CB);
} else if (paiement.getType() == Paiement.CHEQUE) {
rowValsEltMode.put("ID_TYPE_REGLEMENT", TypeReglementSQLElement.CHEQUE);
} else if (paiement.getType() == Paiement.ESPECES) {
rowValsEltMode.put("ID_TYPE_REGLEMENT", TypeReglementSQLElement.ESPECE);
}
 
rowValsElt.put("ID_MODE_REGLEMENT", rowValsEltMode);
rowValsElt.put("ID_CLIENT", idClient);
 
long montant = Long.valueOf(paiement.getMontantInCents());
if (ticket.getPaiements().size() == 1 && paiement.getType() == Paiement.ESPECES) {
montant = longValueTotal;
}
rowValsElt.put("MONTANT", montant);
rowValsElt.put("NOM", "Ticket " + ticket.getCode());
rowValsElt.put("DATE", ticket.getCreationDate());
rowValsElt.put("ID_TICKET_CAISSE", rowVals);
 
}
}
 
SQLRow rowFinal = rowVals.insert();
imported++;
GenerationMvtTicketCaisse mvt = new GenerationMvtTicketCaisse(rowFinal);
final Integer idMvt;
try {
idMvt = mvt.genereMouvement().call();
 
SQLRowValues valTicket = rowFinal.asRowValues();
valTicket.put("ID_MOUVEMENT", Integer.valueOf(idMvt));
rowFinal = valTicket.update();
 
// msie à jour du mouvement
List<SQLRow> rowsEnc = rowFinal.getReferentRows(eltEnc.getTable());
long totalEnc = 0;
for (SQLRow sqlRow : rowsEnc) {
long montant = sqlRow.getLong("MONTANT");
PrixTTC ttc = new PrixTTC(montant);
totalEnc += montant;
new GenerationReglementVenteNG(
"Règlement " + sqlRow.getForeignRow("ID_MODE_REGLEMENT").getForeignRow("ID_TYPE_REGLEMENT").getString("NOM") + " Ticket " + rowFinal.getString("NUMERO"),
sqlRow.getForeign("ID_CLIENT"), ttc, sqlRow.getDate("DATE").getTime(), sqlRow.getForeignRow("ID_MODE_REGLEMENT"), rowFinal, rowFinal.getForeignRow("ID_MOUVEMENT"),
false);
}
if (totalEnc > longValueTotal) {
final SQLTable table = Configuration.getInstance().getDirectory().getElement("TYPE_REGLEMENT").getTable();
int idComptePceCaisse = table.getRow(TypeReglementSQLElement.ESPECE).getInt("ID_COMPTE_PCE_CLIENT");
if (idComptePceCaisse == table.getUndefinedID()) {
idComptePceCaisse = ComptePCESQLElement.getId(ComptePCESQLElement.getComptePceDefault("VenteEspece"));
}
new GenerationMvtVirement(idComptePceCaisse, rowFinal.getForeign("ID_CLIENT").getInt("ID_COMPTE_PCE"), 0, totalEnc - longValueTotal,
"Rendu sur règlement " + " Ticket " + rowFinal.getString("NUMERO"), new Date(), JournalSQLElement.CAISSES, " Ticket " + rowFinal.getString("NUMERO")).genereMouvement();
}
} catch (Exception exn) {
exn.printStackTrace();
throw new SQLException(exn);
}
updateStock(rowFinal.getID());
 
}
}
return imported;
}
 
private SQLRow rowClient = null;
 
private SQLRow getClientCaisse() throws SQLException {
455,7 → 504,8
public List<Ticket> allTickets() {
final List<Ticket> l = new ArrayList<Ticket>();
for (final File f : ReceiptCode.getReceiptsToImport(getPosID())) {
final Ticket ticket = Ticket.parseFile(f);
// old receipts have no hash files
final Ticket ticket = Ticket.parseFile(f, HashMode.NOT_REQUIRED);
if (ticket != null) {
l.add(ticket);
}
571,6 → 621,10
 
public void saveConfiguration() {
final File file = getConfigFile();
if (file.exists() && !file.canWrite()) {
JOptionPane.showMessageDialog(null, "Impossible d'enregistrer le fichier : " + file.getAbsolutePath() + "\nMerci d'accorder les droits d'écriture à ce fichier.");
return;
}
final XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
try {
System.out.println("Saving:" + file.getAbsolutePath());