From 9e2c99b42684176ab77fb18cf60be30b8d6ebcb6 Mon Sep 17 00:00:00 2001 From: Gabriel Cardoso de Faria Date: Fri, 17 Feb 2017 17:27:19 -0200 Subject: [PATCH 001/787] =?UTF-8?q?[WIP]=20No=20holerite=20de=20f=C3=A9ria?= =?UTF-8?q?s=20setar=20as=20datas=20do=20periodo=20do=20pedido=20de=20f?= =?UTF-8?q?=C3=A9rias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 14 +++++++++++++- l10n_br_hr_payroll/views/hr_payslip.xml | 10 +++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 642a6344d..45d3966b5 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -870,7 +870,9 @@ def set_employee_id(self): if record.contract_id: record.employee_id = record.contract_id.employee_id record.employee_id_readonly = record.employee_id - record._get_periodo_aquisitivo() + record.periodo_aquisitivo = record._get_periodo_aquisitivo() + if record.contract_id and record.tipo_de_folha == 'ferias': + record.buscar_periodo_de_ferias() @api.multi @api.onchange('mes_do_ano', 'ano') @@ -909,6 +911,16 @@ def set_dates(self): if data_final and ultimo_dia_do_mes > data_final: record.date_to = record.contract_id.date_end + def buscar_periodo_de_ferias(self): + holiday = self.env['hr.holidays'].search([ + ('parent_id.controle_ferias.id', '=', + self.periodo_aquisitivo.id) + ]) + date_from = fields.Datetime.from_string(holiday.date_from) + self.date_from = datetime.strftime(date_from, '%Y-%m-%d') + date_to = fields.Datetime.from_string(holiday.date_to) + self.date_to = datetime.strftime(date_from, '%Y-%m-%d') + @api.multi def compute_sheet(self): if self.tipo_de_folha in ["decimo_terceiro", "ferias", "aviso_previo"]: diff --git a/l10n_br_hr_payroll/views/hr_payslip.xml b/l10n_br_hr_payroll/views/hr_payslip.xml index bd975f81d..52d6ce448 100644 --- a/l10n_br_hr_payroll/views/hr_payslip.xml +++ b/l10n_br_hr_payroll/views/hr_payslip.xml @@ -186,22 +186,22 @@ - + - + - - + - + From d070199baade374cbd616b2452cf42bf65d7ae06 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Fri, 17 Feb 2017 17:33:27 -0200 Subject: [PATCH 002/787] =?UTF-8?q?[ADD]=20Report=20do=20aviso=20de=20f?= =?UTF-8?q?=C3=A9rias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/__openerp__.py | 1 + l10n_br_hr_payroll/data/aviso_ferias.odt | Bin 0 -> 42877 bytes l10n_br_hr_payroll/data/holerite.odt | Bin 0 -> 16895 bytes l10n_br_hr_payroll/models/hr_payslip.py | 8 ++++++ l10n_br_hr_payroll/reports/__init__.py | 5 ++++ .../reports/payslip_report_aviso_ferias.py | 20 ++++++++++++++ l10n_br_hr_payroll/reports/reports.xml | 26 ++++++++++++++++++ l10n_br_hr_payroll/views/hr_payslip.xml | 6 ++-- 8 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 l10n_br_hr_payroll/data/aviso_ferias.odt create mode 100644 l10n_br_hr_payroll/data/holerite.odt create mode 100644 l10n_br_hr_payroll/reports/__init__.py create mode 100644 l10n_br_hr_payroll/reports/payslip_report_aviso_ferias.py create mode 100644 l10n_br_hr_payroll/reports/reports.xml diff --git a/l10n_br_hr_payroll/__openerp__.py b/l10n_br_hr_payroll/__openerp__.py index 8a8ea9293..166233b56 100644 --- a/l10n_br_hr_payroll/__openerp__.py +++ b/l10n_br_hr_payroll/__openerp__.py @@ -43,6 +43,7 @@ 'views/hr_salary_rule.xml', 'views/hr_payroll_structure.xml', 'views/hr_payslip_run.xml', + 'reports/reports.xml', ], 'demo': [ 'demo/hr_contract.xml', diff --git a/l10n_br_hr_payroll/data/aviso_ferias.odt b/l10n_br_hr_payroll/data/aviso_ferias.odt new file mode 100644 index 0000000000000000000000000000000000000000..cb62271625fff1867649669f06eac0c3fff7d71a GIT binary patch literal 42877 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 J&vQLp7%(-vUN}R)_lK`<2^k+q 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 E0j^-0x&QzG literal 0 HcmV?d00001 diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 45d3966b5..6b7756760 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -135,6 +135,9 @@ def _valor_total_folha(self): holerite.inss_fmt = valor.formata_valor(holerite.inss) holerite.irpf_fmt = valor.formata_valor(holerite.irpf) + self.data_extenso = data.data_por_extenso(fields.Date.today()) + + employee_id_readonly = fields.Many2one( string=u'Funcionário', comodel_name='hr.employee', @@ -306,6 +309,11 @@ def _buscar_payslip_line(self): compute='_valor_total_folha' ) + data_extenso = fields.Char( + string=u'Data por Extenso', + compute='_valor_total_folha' + ) + medias_proventos = fields.One2many( string=u'Linhas das medias dos proventos', comodel_name='l10n_br.hr.medias', diff --git a/l10n_br_hr_payroll/reports/__init__.py b/l10n_br_hr_payroll/reports/__init__.py new file mode 100644 index 000000000..856caa565 --- /dev/null +++ b/l10n_br_hr_payroll/reports/__init__.py @@ -0,0 +1,5 @@ +# -*- encoding: utf-8 -*- +# Copyright (C) 2017 - Hendrix Costa - KMEE +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +import payslip_report_aviso_ferias diff --git a/l10n_br_hr_payroll/reports/payslip_report_aviso_ferias.py b/l10n_br_hr_payroll/reports/payslip_report_aviso_ferias.py new file mode 100644 index 000000000..03c415da9 --- /dev/null +++ b/l10n_br_hr_payroll/reports/payslip_report_aviso_ferias.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2017 Hendrix Costa +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from openerp.addons.report_py3o.py3o_parser import py3o_report_extender +from openerp import api + +@api.model +@py3o_report_extender( + "l10n_br_hr_payroll.report_payslip_py3o_aviso_ferias") +def payslip_aviso_ferias(pool, cr, uid, local_context, context): + companylogo = \ + pool['hr.payslip'] \ + .browse(cr, uid, context['active_id']).company_id.logo + d = {'companylogo': companylogo} + local_context.update(d) + + d = {'irpf_fmt': 'ewqewqeqw'} + + print(local_context) diff --git a/l10n_br_hr_payroll/reports/reports.xml b/l10n_br_hr_payroll/reports/reports.xml new file mode 100644 index 000000000..30717176e --- /dev/null +++ b/l10n_br_hr_payroll/reports/reports.xml @@ -0,0 +1,26 @@ + + + + + + + Aviso de Férias + odt + + + + + l10n_br_hr_payroll + + data/aviso_ferias.odt + + + + + diff --git a/l10n_br_hr_payroll/views/hr_payslip.xml b/l10n_br_hr_payroll/views/hr_payslip.xml index 52d6ce448..f1dc8cbb3 100644 --- a/l10n_br_hr_payroll/views/hr_payslip.xml +++ b/l10n_br_hr_payroll/views/hr_payslip.xml @@ -184,7 +184,7 @@ - + @@ -198,10 +198,10 @@ - + - + From daa056187e6e5a4465afe9079506da8a60c82a8e Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 20 Feb 2017 17:22:37 -0300 Subject: [PATCH 003/787] [ADD] Campos Formatados --- l10n_br_hr_payroll/data/aviso_ferias.odt | Bin 42877 -> 44616 bytes l10n_br_hr_payroll/models/hr_payslip.py | 91 +++++++++++++++--- .../reports/payslip_report_aviso_ferias.py | 8 +- l10n_br_hr_payroll/views/hr_payslip.xml | 22 +++-- l10n_br_hr_vacation/models/hr_contract.py | 2 - .../views/hr_holidays_view.xml | 1 + 6 files changed, 95 insertions(+), 29 deletions(-) diff --git a/l10n_br_hr_payroll/data/aviso_ferias.odt b/l10n_br_hr_payroll/data/aviso_ferias.odt index cb62271625fff1867649669f06eac0c3fff7d71a..4b25ab918d13e8addf8b1a3ed521afda41375faa 100644 GIT binary patch literal 44616 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 F{|^ogD}n$3 literal 42877 zcmV)vK$X8xO9KQH000O808E-uN?yh?3?~2p04D$d00;m80Bvb)WpsIPWnpk|Y-wX* zbZKvHFLrKZE^lFTX>%@baAj^}Z)0_BWo~pXbY*ySP)h>@6aWAS002yyQA#2aqx_I~ z005A9000;O002~Ib!}p9VQFl0FLY>iZDMX=X>2ZVZfA*5PDc$28VUda01ZhHo2eyJ8{@8)7V23|;U@O?+j~&T`ksAqcEAA>FMsA{o(AgQaGQuK=ImqS6{7->KZQ0}lyo${%ofv=He} zFp^-@1wr6>0YMS)T`aSPSR8ZZeiVg^1CJo0!Ws%=DO@4(jKVpfK}5b2Mo@*-pdIFT z*kCL9A&nu+esFTJbGO@SzzYQ)3@L%5=~!lJA>G_+5gBHBAzf3g10qJRCBP$0uHXw~ zs%nk7L=N0aQ7B2E1(wgI^K*;o))sRjkvExW3`MdjX33X!RU0%UGCmg6*mPBP)sFml z*kCLD0}K?CW^Rr7W9fpHLh~HlRI8bpPqwyNa;eN)Z$vaSz7j}}jRoy?+B*|ND5AgD ze&PJmi(fT`S7IMt2s)gG=bo-Re`?mdk`2WRp>QUX$ohgzeVsu?z%$;IeKv}aWVMZC zIe7(wpdIdbsNgR8DNNwCwT56MlSI(kW($+fPfbQ@n(e*2Y}fvAEN|3^ys+erGX*x4 zWpPgQhw}zK84YEEfecDu7{o6xrz7D^B*p+G!@rUW2U7(I%VwBl64Gi2uE0)DCiZ@- zPe;nH`z*S=1NQ)T;SUamZBDJ;NMj_1hyqWLPd?F*j;F3h#r94+xCn8=(o#Za(Hfdj zupnhJ1)E*7G#jS0s*WZajQH|$!sa%Z-9X0>W6`WiV|CeSpqk{;1sH{SUL4%5y>@Z2 zrPX4$Yd)Jk@4)t9EBzFFs#L_DJyo9>Hap74!v=S^Z^61yzNlPLhOr#@-CAi-td&in z_%IMC6&BMDJT!0@`JvdW>wdZ8%L9WQ=6Kj($A7v5TfqkWQL(ZJI|Bb#9+V-LJf0h^ z?;G$(#ma(yMmX-k!vS~7f=%TI&-15GpXN9YaMovn+k=F%2rOTLWmS0f&(g2OkdO>; zDOyy%VRb%9|45-FMKy<3_3qVwKd0I?SS2tF+rNK55C_|m9|~l%*~!VthK2@~Wj}o+ zA25`L87>9|l|Nua4mLsmtwJ$&{Z90L%dfy05QKtJQAs>t>IEe(Lplhr_`z%;!slNCvnP z?30#Mh+{bvle)?A9E##N2FIdtox=t5OeW9ib((xG2Y4c%%@Qg#iKCfxI?u2gjRvg9 z*>p-oNwkpo`8%hde&HpQ%Mi2{gT(^RqcEa`Bnbjf#N!xA<0$gElORBNkR%xnhc{#E zt?U=DxD*NnAU{4|`~e1y7es?z{eS(3Kc-q9J={cJn9uERHUGE2{oc@#W6_BlG1&0s z=MMk#_r4oQuRgrC_>JHG?T!XF zQz(4CXa)EKFf=C%#SP(C(7qKR5hv;3;Rx;(g(f;XnJYe?2rj=wH76PswSMqZ)@r3@0WoT*#=X+SfUW_Zw#YilU{c0I~ci|7Q1fLBy4*+CMl*wfrb)EnFlV5`qOa3hS`14712&uW znP*>KiLwS~%b)(~FrSP>vxOt}8VJ?w>F*jjdv?XUbm+NP4;(z0Os0^}n|^xN!QDzf z1qKgLULYxR?DMpyLejD-?mc*vWwMZ|-Ghj{2sfe-!wN1>1BwqLkeEtk9)0?yCvh~H zOak#>b=CjQ@9*MSCY{N>`ju}$BA-m9JoO!Qh?q?0jz0AghQbU}5CtAW>QNY$ty&?I z&F??-C|FZ43;|j##|zl!ZGBPnQ^m5~@P92qN>%e~be06vS?iFMcodCnVA#-mmKa~4u89sFc zci`cG4F$ob{&lFr>-?#swgbOBCXpjrR_ohu zzS-N~Ju^O@Ws&NJ#-oQ1+_-$HzPa(j#S1l!o!2j)M`*p?WH~U@2PPc+DSNIJaRmnY ze&YM0teNqXYCd%1RMy&n7gC1^eZu_uK%}>UHku)erFASXg26 z5X_eGIk_o9t$+N{y;_~|_;bgBVv&glPn^55?~y|mqdFQ2=?s<&C*C0S#^;VaVlo+% zk#N_*5Fm)nZZpX8N-o?06*tkqFtRqWPobUii~K1nZ-t9n`zv}P_oJ*ke_j|!@!5kf zCRfv7M`mJXZ<-sz=V41kcTB4PI-3M0})oEUh0m^sif!$JO_rJVHlDibGa;v6Vf&s5dr#1ER|=| zu{=cKLXOm1EqWDT9)`(NG?h!m7JQM8)@JZ{o@GfK2Z|boz&R$5;v|8<1yKYSKQGKt z2|zz>?&t~nyop?{xwSRR@T>?QI(P^X*bE}2J+^do^CFB&BMS6WHl59?C<>5{ASj;a za2(4sKx~tMM=%6QCu1B;GI4*5!CD)u6N#isMFE|bK#_Dhon<(O%_0gMPylEZ&F9jm z&tDuoa70IKpn+};TdprMhZZu?*Is{%))@Q&KS|O~r^P!nE8?pDzV7qq&%N^X-;FHK zFNV|6P(Y)%L;}m{Tmk4PfO}LbIvfhw+*Pr_3W}?=8qMG%hpiNM;=MN`;Y8c+gLYN+ zqqAo+8MdLmI^Ykf)vD!Xue-Si@W-VyAKsXY?Cxs5bm<~SY4Yi`)#Wavf@x9vjjz3e z!W(${9$F}q@$Gj$2m~SpglKE5Sy`H61hTQNx{yuG1k?YfzV;VyzhUvzF3(Oz6FF&K zQMAowOQzzrwRH>Aw^J;vRjX}gQzo4~aO_Dg8M}CMVtHn!q3^JmJ{Qj63I80Jaukll zB0)=a>ytLirL!kF(wIwzm*?mGY3%4@C?qFX-xKoN$`1lU3CBr*Tp$=srd6a$gA=3( zS$^2@=cH3oQpmE49RA)U|bCr z3o7Q*IbNe81&E|cJQ56qaT2V!I-MT8k=7cU>Qu{%i-~l~nWz(r_&SJL%dymo>n`r&w;vxqjnCzrNaH6H5NrfYe3v=Ok#%zkk z;xW|VY;0)CMiy@`EImu1eqb#_kkMl0a>*!@g>bFKS;ZHa>o+G5n2je>%KJcbLBF3x z$bo?_2)dsNJa=DTNR9dFXP?I@ibRoH<2Tg?N44F=@`Ai}G=nb<)h=L?fvy3jA#iCI zKbuWhCgyi_cSAgjqEfFHjjB2pzH#*;Pv~EM^(&clhNMV}w+NY%sRzEs{zX)TXG z@eEFqV7Z*0yxp~XZ=Kr?7M*M^k7FpXZy$T?anQS#rY6821h@%C>g(M8M4_v-v2f@J zh5<4ni*uBzrdcMV;fZ5U0y2VC7xYasiM3i3=5kn^NQ6SM#aW~vCE}t*XO18!t`%jRlPMTP-SS))5m$rZZ5{jEC7{=pquh$E{=W=Z$nwskD?A)*yoAL+fNNa1$-o3-3z%O~dIFK7wqm&E7 zGX7B1<#NjSD)q!*$r6LszZfnT8iR@}L5VHa?D#KkQz>mWQgrQARoWgb@J z!_u7_nOJb;gO%6UVn|Rb|Lm=wo*3!w?s7WZnOHa+PhvP(Uthg2HxH~t|Kgm8l05@^ zYh4ymu9CQUXE*gLto!v|S1YASE}Qtl_rL3C>}jj9u7nb8Z7pX{jsa7Srt#{=j=s)j zWetTZI=K-M?$`&Y-~&~#g(NnMS*22c#Wn5R>kPTOekx5?QA{Rc5Q=%HZ%ajj;{F>q zvlxn{Gsz`?0v36L#ldF6^K;%vETyAOvL+ywQIfWx$)>mnmG_*9@@_VnH)VdZkj08&J$!KtLYPM@|AH*}Qot+3@(CCc8m8EQfGn>p=soNT`?r3$Ia3G-8 z8VL-{XB8?izDPW_vXIBkLp@Et<)!J_`I?4i0^$G*8VuTGG;(`ls&n@qvzEH+yp&Wk z6wYOH6Sv3IMu*Ly&1N&;Ar*zsPmUJ|-9UF6h9)zqcqp5tDHV`{1g+7~cp{aznslkG z#8m}O)N3_B>C+kX{*`65!Ep85nfmTwBT+~(klCmcI4%+i^DsuE!o|^>2ah~jNJkMu zl~1R1CX0$9?uMtLvct4mwX!%LPV>83>LSsIidL!BbSe@VyET3Az;G%S$^s=D;t-6= zXOcXOnhpABEM~LXQmG_P;J_v}7z|)$Qd(^`9?nB}Xzo@Twe0C_Iq~k>w8>TFwi7US zduFkq6^ekc+z6}%s2b}e|}A6vH>dG7#*Q>4!eQ$F8KvQ*Dx)?p8j9A$)9KiczBf0w zP*vLuguyGXytJkO*IEoK<1eZ3%1__;MIe|!)f(`Yg}Di^tkig%dJPShn?nbLci(xh zp`~r&<~4sPj^ZR>JJ6kcA@8)?W+!jPS**_O(y6InB>w8xelwqreR%$IJQ!*2J9us6 z#OTgc4@2Jl>6jWd#9oo2PGCZVAzzQ90gyc|B*2sPOD0mFYqW>Vd`3)?i!1pN+h#p8?w0QudT16)tcJ6 zI(rS~wAn}uU6{T-6A-GZ+*~2oY<4zRSH+g6R}vWw2E|3ZqoXTs3*wllF*rIqd9%%) zNm>z1tD;Z{Cny4wHkb1vLP@*w<+W=A`Emd87w}9blS!x33{&VG7=ol7F-45~7_ ztOgdWZ*n3C_!q}b(rPE8AXh^`IkOhmnj0JH!974L1Pgy5TX(3II)Cy5kv8`C^c5He zlJ|e_J@5zu2`nd-ps3|J(1^QAnvNXHM4|sbs4F&hFXWuQFK8I(1`9hbV265nZ*dTD|@kZ@p2| z+|^W5TT@e4wu_x^S6e3{?~jpcK-AXPL$Wi4<#@mpkw|1S{Zw%+#A2~jDg`K+&lh&} z_5<|=!;pp9>6)evhgk>IM~73|wF@++w)QTt#(7*$X~zwazL*qn@-!pWZbw~RBMeE_ zO(APNG+cf9&z>6q~@_N1CXWz;SjG(ww#6h?|dW9ee zz?Yn)x+5fx0iuhFieI#{!LSjLNNldcZXyUW6b#v%?qtMw$-lV%r5lm9Xq<2EkyQL+ zfIk)%7AzJ^E|;TdT8YPkrwZ}#?a&I7XP^pFK&50n#g~DiI1o>PmBm#u;v@`ZD6I+1 zsmqryZNQWpVY*RZf0c}YTwtI#%O%~EKL8sxHZ%+j3~>3(^uh{B0)@=zwwYve6iUPs zgi4Kz+)5zgsjdRrr~qRcnt)O4v+-0ajvZj6G&eV!&F0{W*BeOe>gpsgacODUVs}wE z3JKi!?MZiS15ils!?pYgq3j>i>2$ky?*>UQXw{bmoj-&=nFsf09WhVp@$hmC02* zO=r(sF+1&z%^gP%?vXPOvcS_*iQZjKCo{uMyhCvn7DltRvDV> zszRYCkQ69Js9=72b^+)^>k?1O(y}Bui%W(gkjo((sF>lR1lWo`oRX^tQoJF`_hLdX zB$nHOWcLX$zrh!iSr-TtbO!VE(tKS_&Gf|WEQATL&FQp?(gs_FSw+PkUBm~fpr&$= zO-0iR$&}5vl`hos7X^Wm*8yI28COz3**73x*P84)a%_5G*=f^fGTD8P9XovZ5kYDk zDeJJ%T2o?mycH{>wCt`UqwEVQ?kFz*bWa|SE%fWV^9N4rpMClnu%Z_@9^Tyt0rQ-c z_VNlGn`Z@7$Xgs$-CZ4W6fsAT(tb?E6IC1x=>VBhuC`Riiv#W8D3Z@}a(E5`+5iTN znH-~5OG&xl9=4DNRHq0+<_A&faxRyrB!8D6t_{#AeH%Lb3R|UFMG8Jtbn_$S_#%_fVFV=<@+^V@-D{nzwCvMk@_7s=*jx^$ zXms;6Ub%>p+Gn3V4iwd{?ruN@fD$I+RVEm|$?Qe`WUescZ8`9~tubLcM+6(ZG@~lF3F_ZY~55AKVXU;c|O$ zWDSy$z;ZC23op;5cwCCu;c$lG9Tvmob7w?@=cz+`ZeG6zbR$-POgh!f?7YroF>2^| zI&aXB984f=HW*L4Ty_}3s;gYfi(ZVP&Yn0qaO7!9NQ{q9a)f?YbM@^T*ICL?XVVLW zwzZ*pWyzaNC$C?heEy4H)^5E0eHBA6pQfg!gMk%)qA=9k8Ht8P2y?p}v$w9#1XI89 z$_w*Tw+jf(=TicLrD72QA>2+!Fc7S(uMY)QU=&TIa}I|UXx_kDVG^Nej+-C5gj!nm zcYEGHan4m!2TVA<)m2yJxL;@bJ@SX*NKQsp&Ye3;s`M;hIQhYQW~*^&-YcTiGtWII zO-+G4{qZRlQwNv5Fs_!u0|M-woy`?kk<0o5AxC|)MMcF&M^ilZ?ce=2%H}?J_bn9H zc3B!C*#sD;sDEbB&r+B;a_J(DV(z*&9LFNT<=1}tTEnirppO^NeQc=iTAG`NNc+U) z)AI@RcfM9FS%8X!m#IHCdU0YQiW6i$6I)!E%cp`6VQ|>3dJ4>bDC(QNcJsEDMty+< zsiwsOPpjk} z_uu@<#cBWJhxUK}pMKgp_$1(u<=I>3#%2sUyKKR2DxwuKrlP)cXFm=Ec z76X6yZ+}0zk~ni_q>#>5YwH$fCMT!o@@ygG_iHV#+Nx*Q1-(Bl{!l{pI_e z=TlMd(z4l6wRdP3!*Hg+?b*905e|3s3;;3UaXQonvra{VHnVa6$@5qH_wNICjmhS; z7!7l`E>8xsnP?!8$-Vf}tD#U>FJ&(q)D#>xo7!3%C|cLh)W~L2v7nbEh{67Tx2IaI zBIf318#?;(jIig>;|wRx-n!D-+AOgJkk~Skir&-JGoZD{Y-au9!fY^+?>ur)gmD@b zqKPzy;{{mL+ua2?$x|n|TrQqvRWy0-)Co~z9Ud6S3y9NUr&00eZ@gJw?OK|jF*xfV zYiwKeE~zQBvAxe$-9giYMK`=_4+Ug+Lrsl{V6(GxbsYn?>ZW9l*HFktk+n5s)LUG; z`v+i*Vhe>#DrR+5Re3ym4e9rXTy8uRO#>oB7`1y~s28IxMjcpo=fLMliDhm z-BYFHXG?9^ozi!k-635t=?jHfl+q42wSbE(lZ}Kz7H5@NuaW#KFl5kaw0bEmepRKC z8!_2E;D6Ad%jHa_b4G(+!NgPQio;>6)cnDhLytd+5hPyPG{&=qr;fj%Q`57vG3AX8 zhpTvMUh!T)wW4w1VnJy?RJ}8Hu~xn#qQNtt5utn@wjiedwgFZsLwlh z@zTYaiP@viH%h&gcTmbUM=@JRA%vpegVCcYl9%l|rMp@=tF)@NQI6^q%eoiSq}HSZ zLN#>_keuxeMg}A3mew}eLR6fLqRC_~CcNB%WRWf~YS8PXWGbi>s;{sBD{vHnwkwwn zDk2HA6TnsAdFhQ3j)GXq=u+$*NU;IsFDjj>O>b5ZQyfqg2cK+8N9A1rv^s+*72y=h zq^qF7>Yq3+B?U?``cg)v4m=2n)pdn(swISul&sB%$prIbn>BbybwDjR-E3rI2W zy|Lw1!I4PWw^)3&o_QQrDR1#F_bQ%ozhBs_l|AQpSXP$Wm zTDxS3rQEd#E5vr-A%Q!`bgTM7&_+UdvxYunScl|8$gdAShR`;U+^T+1<)055Jp4#L z{1`&pK=N0w{`w9)NZ6@Q_v;R;aps-+bUUy$+=G5vu1^OSa~(vUlbn*$K7EcuFe&wo zkgr0?Tq3hAWOs#hO=A?`3-xm)%Z6*~Ka6 zZQR>7q#d|dP~^vb*QeW;&7?Bf9E#yutrijaNIYq`+hZYLmP4yumihSwgUO0xfMEy} z=I0ld98PB@ov~Q0FeGwp0ki{Sgi){aFL^~$QK3llddCp)@#M_1-XZ%#J#AE+Uc z7cO3EY3rJvnQHCmO$HZkO)Ru^AQTQQOiz1#K|PHobMVlfK{cVEvjYzj%5KliZrDbB z7`5TK=ZAK-;jWh2fuVgs!!Q^P`}Xb6X7h}I9zFI{mc`U0JU26y7Raua zI0q1dYu$8HyRA!ZnZ{N3`L7#twsy96PlucWCDta zUJk^=YF*`)dW+Seg!1)khlIwEm0V%XCC4(!Q+{?ep@jJL&1fh6O zDP_L6+Z`@t0xF3%@^_uV2$#GpP-!`XO7{pALQhHo-)dvT4t!d$jr<@vQ3H%GFY7Xp zJX)3e!HcO9@(`At`5SC3tKcXlr$K3?Xyx7^8`g`89nta2fV=Yt7(bSgHXP6tDJS{C z=~Rl=Xc4KrCZpA;%R{@(h{I;79-q83JMh5a?)gD{F8I_M!Ey{1b3GoD50uyT2FuQw#Mvi?C8y9vdMJv_B-csM`N?q zl*uu)mfRwHdj~$(u=V~184$!>U2CsxbJ{J5XxM4DH&nZ9Hk-+06b0C%C86?;^Bwq= zgS+o<5FxZybLq*L6 zE^WNN({)jqGL9%49ZE+M?C3EM6>Nh)WOoJl#88CecofCtQoXW^qGa(xP;py;QjDt{ zfGyoD7akQ>(^r*^=gMt7FUTGfskI{8m3GHKrGm-jodi4V^BKc-^2cEL401RU4jW9S zL@cV(83+s!D-IP`vdJZ3fXNM(E8wy}R75l?;ap2=PN^Y8tARqtMk%iG;95hj}JoKsU%zj*VF z!>|0#(f<0ke*R`#&u;I;^3BMG_SCuE`}b)m(qzzcEFTIk<62u=z5V>i z=p#p;q`Aa9@1Cf0Y5wj9@BFvF{I4rBH&0)g?CI(B`TSOsVSIcXSLt^5b>AAjT-Q0! z;IRpE0puMX`7Gh?`}b3U`TzI7{F%9_M@Mm||KU3plPejR%+a2~7MI#q&*XElMB>Cx z|M3t0-GBP}zx&hR%#}rNyt=7{Lh=)n6BwnPow=PV;Ex?1dh5-f$D(1{-g2nh{a1hg zlfQkf>u{&()Q7LXk;p?Tr_UEYapK+gJ{o!V?Kh|AryF*4X8jQnp)Q{P_-8--!59C> z|MTB}>kCq;J7gze_A`aM@88$jYyaR+{+O~<6Kr~M+56Gy%isLgH(&&9sIpDWELtBO zPGqubOYi^p-~ZZG+aTojv!bA;$nXC3-@N$cZ|`nzU^4L(PgiT1o3nxc^6jt8Ed@K8 zs=5ac+iCXp`26qu-k;>t(JYUrBEG&o$M)`fYMbx0Q-Gmv>V9(f|Cv0L=qOi&2<( zB=jHueTT`QtE-o`cR%5(_RdX3@rW`aOmJ5zGHr7MXc6PY#z=MbF zh-p-fSsvU{{h`t7;poWvho%Du~0y z;J*N^HB;n+e|GGbUlwf3e!(zw)ng%-iB%*8hTSn(6`l|Iw$ko+rG{FmCLJ(#l&Wg- zJ$DP=?AR~AJlL+fcSq25lff!oUT2h+3rm(CtK5mdGw=^B?3e>Puoc_`e|$4}yu_5-(9q#Q1@$*#jYTNXn$jFGvXyoLrH3H9}QuSG7Cxig_wZJgt=-qZetf-^nbUHW=G)u88tLU)cQ$9LR z(vdl~z;gUOP16k;SJ6Dj!Z6U3c^E;Ja%fVVNIE@2IxkX`YR|Kv2PA>za=Fd=B9;o& z==FM%BvA~fNIaisKpWr@633YW3skIpE{_q?nWmzY*A25QCm*g=tX?I`ai{{5M=(MZ zIO&i91j^>}kgUR&8mB>F_LwqKI@N zo=jzRMw3=ef$no$ams;aqtWQ#;Gom#+@h>@8SYvCNG6l5EiEmrts=)<92rsREb;IP zgj0wJJDv7$IMOpPtXJLjNToG|hUGf; z==D0Pni^}J_ar~cjZch^?;RcnIA1t_!BN%7r$c#&CPXm)n9FVn`j;`4H5Us;GYl9^ zcTJNXFI>Gnzia*ay68)ahY#-++;-;p7K8Tg{op}a+dV= zTZW3aLp+oH*=w)2^zTEN3`}A;L3pf&pO21dFji-;v8th1GBt7eqNQfO%4OEkr0tHV*hnrN8*zPs1!eFxW4o6W1op-7Qs>jZfU3!Zpia zP{~5_|NhsT|Lgzu9|Jc||K0ar?;hCy$bmh#uHE!_>UpaevbgI3*<=8VXMP@Eu zx_T+i<(lj3&YV2;(o4@k@+pz`I@b5Y9}1PM4$p1xjTL{isj)d0PdcA}VR(1z5B}jF z7MFZYRd&S{Rvx+XVp&=A5?~8t<2piPw6>wfwXnQmF=+~%`0VkgrE`a9ok>sRvN=de zM*+f8R!x+B5RhE)t=w|4DS5#!+ttcC%kuob!-tF}vv+QqQtQ-&I6XVBF*!SHESIlM z)$bjsLMgNM5wH~ST;3mww)Zq`*f@MgnLLdOn_cljxVER$kw|81oM!(*x~10PUG}l4 zrlsD!?43b8o~E`|cU>*dGC3Y=sj;5FaHXcU=F*vy8e1*Fq?7SDj$m$wWnJTHQka&C z_2L3b_jkA7zJ4{f66x*jjs_NP-_mO|)TN6fc27e#4YxMdafQOz)r(9#)ZE-Ca9k)9 zvbv=*u;P6saNQq&NYt@cHy>3S5t6o6opF~0Mp#w3)c0L;t1LYS_)5) z1ZX^$-=OizBWJ;9|M0Y9lrB$m@<0@QPTntEZR7*ED|P+Eu{2*T-&y#&tSPK9xj)0w@Ys zuU$X%)bm_qA(R#AJM>HH*353S3-)Ly> z(bGselhd0lxWJq}cfNJ#aBrPu?AEl+te=>S0iy!P@tK(^cU_B)#CTCs^E1i#wXvIz zKKn9}3(Un+jn%G7nge;J(`jXMPFf_SQ!J%ZyLiwM`MU_ZKvJ|)ub0wU4nAU2>gNI_ z1`LY0&OG~+`9mNn_43TEbLY-zH2Ojzdtzx(t3tdBD+ZhA*rB}zmJjqh+&nKcGv(qgdijgnC7#a;Nlg9dvj#j+fa_KmL(;t6C(gv0mb z?}bq6sb`+ycurtaKm5Tz!iGA#S(QyOzU5^wZ23$SQ|WwOESCXtTdea~u8xku5MMyF zp86KrtP#c4#?PHSL#hlcC!aN7F)Yl^!-VRYXPyO=<@2c@{qsLUpm9^N@ob*WfyUK( z|00%6=W{&NSZh0R^6bmM`FmylC>;xNaO}!? zZ$wCh7DjJOGBDZXu_beCZhG8lvyFW8i&$A=^&U@7480*<9_%9yq96}HI40qg9WF{8TPNtEiSipb{_^d23tTd zYIt`iBamPF`ZsWuUQJ=ZGR?;PC(m64N|V(<1%ffLkeK#mUVQFpe>{gv$&1AvRvZVg zr}8*};h|xYrh&;hyk}23nR)8@FF`nM&}#%<#31&)_fNF#I^0rU6*-g!0)Fi?Ci+s!6Q#O998vouCmxu+%uiK`i-t;RFqD)iA1CQ zLkH{*C!2{UGYl@~4OOiI9WfboMtiMAI!+ae$6|y=Z&afsj%oFJ1V#r3`lqg6*J*U^ zjgAe7zVTkN$~b2ETd}k2u75`BixO;uV7#xd53Go8yG3KLx*g_uudltml`G_YfuPQy zcRQ^>EQ%ZlV>o15E!S^%xD)YMLkF#)DT`e!J8hJvq4mcBWHeTHo!gX*M-!R6)9K(@ zjwFl5Gf)t~(?G814Tg9)=&oy^QRo?)i@=eto*po9s*64-xZJn^p`G1*kaR9j6;Kqk zMq4cCcX(=mIMEQu_>{M6SEpFg^TET%Uwo0K)nLK0*=+f2`Wd@NO_RNS(qVFv^hQ=& zHak42)HrQvu)UGVAxIOm8g(ZT(jqZl$j~xQb zb7k(T(k!2k|J7f9r@HHrEM*4k8mtOYs?tExUk5Ha6@BLC=^@_gu1(0eg4@*BCEA(c!683PA_l&FFLv9LkNoJ z_{r|P;=ykcfl!m#5b~{Las`LS)mT-Sn4VKN$EoCskqm&v!ZSl}Vh9UEbQpyIi7ia0KA z?5HT{Sl&%uKH0BWMMs3}4r|1}!U%}Ts0oJxJW5o#9I@qDph7}Yc?&IDD7c(8iD)32 zNSGVC4%B;;!U$zI5ug%Ok+NS&lLx{v%Dji5$ZAAGp$M)r{oWt` zaV+dRe_^DvZ-3tq%E`+_cW)2RvIr_6iIg^8YzL(C5#@!Tvv+TM_Z}2O1inkk_{XG+ zKp{i%!)!i1a^bwEq2*h@`+L%w2qTXkeNyT;SZ`$6Q{L)<+|hX1%6)(mW&6wl-3NaF z+iY}nG?`4Y@;S|*f9KDhEd`1Mxe|!v^#cE#U0x`Mk+$$`D)J+hO8I;~f*=@%0W3H_ zacgevNg#ldVC}eZ^h(7yR^=d->wdLR(1XYIKAgJUXT$md7PLuyQsUqj6aC*e2 z)HrCiv9VEE@*Z&fwv46H`VM^F;Q{kUc@~!^@+ZP>2Ywk)9=mP2L+&R(XooXCzfd`L z4@iEL1O`;G_}^6*xbrrsLNzP%?`lM};+{2`Q5BuoticWc+@``(_Dv~njCJ0|%BL#t zT!;S_-LJf7qeqHe6qHhI8{e=>f(>7~uCv8Pm3BXI;^TJq@0U(WS85GP{sFk`4}dF5 z6;|>iB6}SmC8bYTJx{OfkSHH{2~|8IMV+LGEFzz5FTkbEFHp&LEk&AyVrx#PFmhnM~!3gEoG6F?AmpxHP#M2s`4n-?klX;!V z=Map*F+_?@&>EF=^tCcmp-ehUtJN|Elq!h`#};@g1+aJz7|ue0qvQkV*Cc1atJA9( z)&lQ^iop|!5sO>`#lTBR8Ygf9MRH6*$wN^3Bz0WrnOwRt7L8CEJzaYBhK}$eRvep3 zXDF2lg@k;br)f$aR7gJN02ND|1lms}V-QMd)wFoWiI&n86wPHb1f?nyZ3BYKUVt(& zW%@t_j>}@Hyua~*<_8t$Q#SUO|NS4kcJDT5G%Bs0%Ox!}E!m}8W6SB5Dyx7|`D8Sf z%t*1A>RKip2Y7*z>)F+rjR#+U;~iIho7<*OBvXy;T{=Si;O*B}Qt0qtC(8*;Hf^#w zvxx|J1S3cliG?F^yWMtm$VloJ&5t;Or zt5>^*4iSYIVQ|;lG^1ma7PBE7jRPh?X|0BU3IYbG1a4lL9t&l$1N-}LT|AqHw4JTB z>14v>s;#n{Zr!*JL=!7O1`QpJMXy}E)V6!Cp2l@r)$H^fO5l`Q>v3A==9l`1219eV z-v4;Cf3TlravaN~vrJ80eI_1O=}gIJP=HajM!P&W38^hsH4fpFkc(fRTI}uZHtDp9 zSR|e2cXf9Y=>3!tyu1A1B&Qej;oEOItLt=HeJ&MtM%eBubuu#k!*d_F8#+ZkC-4w~ z;M0>6;NDz1nJmDKE$z2PF9xGYf8e7NOok%Vq|sv#d{gr)$viwciQc|7sn(kbXhcMa zTrvUC`f9s&axr}T@q>AWJ^RjU;T(KuU;nM~nfj*Ibj17myC3xK>Y*_)7)(SG!RqFA zKJLFZxzzlPFI_(MjyD0JP+qMzr_P;=C6j;~YTS-wGHb|V$te57SjHn~+|Liu~00 zO;c3^!m^7CbMKGcP#a84u3)fv8a?L9VCVzm4}_p!cHjo&G59tW9??3 z-tJzN)<8%>dP(+!e*ytNrO_ng2^5Cfy9XfJ0v2GLruYJ5)Q~P?%g~-Yt}@un8lzfs zYj*kQv6s@}6_irt(|ny%aAv`~?qeqtClecAoQX5BZQHhO+qP|cqKWy%=ESyk{^#s{ zb!wk=v1(OySFOJ4>VDtn`8^g{RpSO7yj|#LCue7u+wez`o1mggvBZ11LUJl?q1l&} zQIuQ!ES=x#3kyWi^7x1nb$^4etsoi5#cBcH_oBRJM1oqj1^vrYWo51eeUXL^6D%2& z6J^(7?(L2Fdb@4knpKn^FP3MxCI>zfN3 zUIy%$jaYHtUc&;%0wu)C8X>EO5hgVAx7!Mt)up*qxCr2f7j{~mbD2(n1a2u4`>@a6 z{3Gq>NLj!=oyX<&No41lNe8S?d1Dk&dDpIm@`Z1A*?=`T0688x!ML`kMus;}M8QY? zaMQKSNhKVmwSaiNlg;f10yXk~jR|nfaAm?izI6}AG)u)&z{XAEg5KWb z-_CxVc{CTRibYntWu|tb=6LV*Z5pj>nBqFjyJdrVvK9bXT)X9al4lurOWEGkscAWM zWbgkqky*NaNWGum==oZc+el#4uyV)%9IxY#4vNaH#5okGnrf8{Si?D_Q?2sB$6xDm zt!a=pu3ynk@e9=BY1{)*RhZ$Df{I_;mA_`sm}C_}6MS{%B3G^gSqD{)5uJ4jo6uqI z<%RqJH#e^P`uFA`odg42R!U*Cn_tx$Ap_|>m%UIp(WL%$$(y!L9|xzbT8|Opt%K;& zj-8v*1xt!9l8ThZkO+QFA`37LPp(!_-I)k21YRmP{zLBqH_zrbQ8K*r7t66tYk#Ft zmi|C1aD3@*ywSF3pb;rBA=M2YCV^x>|I207-8j&wq5Q6duDaik@uDX`7NBeqK@~n8 zx{RaNIe%6Ns?xkZbbA#kQLSz`t~PwFJ1n+p44!gM`cG+|&+){ZHZ;>b3z!)hmUPlw zA>Z$>L1J<@4w<*J7gl&$#|tZZ9=kLirjC(Or<_oIPyN?x`oL=`_o%@A`(y;DxT(_W zpMc!l1)d+oz&2=XO{oU2my^2L*ju%im0e1wZ9iHqwchC;hRx#%TK2t8Z4cXnRVN~= z3o1YiGv?Cy>#1Kyh>!Z@Kh1+a$LjcE6K^E*|H8dZ;EnZT7?GvwNI+VdW$z`e}?|`BX|Klsp~z_m4^d`McE^-H9sA;BO1= zlr~il7Hvd@0DEJ+l)q39CTt-8Tcv)THbFjK-U0?;*8?<7n>r&9_7^s@22?X1QV4=+R=+WGb@{RdbA@m~SPYa6EzY30W>slnLb#-n|MPEt zY$zCqc!4?@3RKM=Py_`F`f3vU_vagK6!0Xt{LO_0Qj=pfE&~tx%)dA?6c$=yylE4M zu(KYSV2GHG8lhpv(uEu)B=Q_Hw}41#$~{O~kjbJs%Z0JxW=h^Haw<55QqURl#17_R zbW8pBc= zQ}*qB(lAzJ18KkI%;>w%I9TBCUkT;8zI?$72Ng6c%8W;ZZ~%wwb@-NoYOu_ZlcR@F z$kp$Tq4Gj%+oy(%ClcDTu6i7@8%A{U1zubUIi`!)Qn=!YD_Ht8s+5FbR@~gr&k|i7tTG*-EPD$A!wu#@TTOEcE(?b&*0*| zz341zEb`__jADnE{6E?IyTmyX8`sV${cf5nUNF8jl3n;oMQS5GbE5=a!3HQTa0!fK z0c;`aEGgpTJ-S!(lFs>Mqyt5B{gET)d{0{;?c(%r9|&6RZ!LL?u87V{oD^kdxK{Xw zs5~j$Fjp9tW`3?7N@?E0QP(RAa-0{cT?$o&K)ugbyV4@!;3W*y0FHh4md-7#nXduD z&)pPwGcMO3KUo*0^gb{p@^|~^4+JmI>Ui7!#UWhS+|V&lC~+nYLk(37TJtlZ8dhm} zxt9gBdmA0ik_yGsl1bhCK}?=SbTK&UQ9+-*K_IZrbn>%BzaPO{jQ*$=&(-oTbR6|Om zYQ;J3+{Sm$oBblLuqH@TLJs-lc{?akuTPIooIjz*q&82o!`bkYhh1P}lRT8HtgQ4p zVDwT!oMjQwu@a;HO$R1H^)zOkwAms?_<)Yl`Bte9O3=cc!ynJ$a-V!5okr_|f2ldU zGiM|xe$iEpc&lu6g>Rjt_w;ulsBur4(Br=RzHU={S_#sRfcLhXgmyNU}SzbBg zDo5Mx59MB5A-6F70~w4qbw1#hM7f}uT4KB8BG?hGK|aF+aJZdX=`|*BX}DG<&06uU z7y{^(DUZK)?Bom%$Jn*!y!*MAQgqc{CB+KSpRSTiM6@ca7^8-y8|1$j-t34$r`nz! zYyoi@YfFZFY6I7R9-#Q5xQfL8^4iLh})x&{2eZ!*B{Ja@+>@6P9o z5bcG5T0Dqqc;dbMc`;rHw5EE+YiJ@au}vnXRM=$7t#1iBbO~p9*k?k`Z> zlh$ZS>XlSsKd>PZslf%4YP7zLiiC#jOoOeA*Y%BnsaDLU;?;F@fV({kx($VW!S=Z3 zlF0K%?~Rb@9F z*13iwF8Pf}pwH%n%(BemVLsQpJ#rtiRHU4*mZ-}m=)!8$ob zabbM2`#l9Qc%Q&8pec2Ex}k6k|H@Ei{u~%vVDLS}wd7@LL$|iJgn{w~wD4lw#B61+ z0hhs}#AQ;>!u+1F>T53gFTeVFu0R|~xo6HdKsp0Nr~4;ClI|Fh!VIv}aGM1ho5#7d z9CKz`wOfrROwz6@wO!QQ=+{+vPsYjfw7ImnwB~CA)!H;|NS3=M>JONc201*S`t{?T z&h7F2p*Vg)gbC5J@2=Mv6m@NTeR*A7J$-)pU48h)E$JV*l&iaUKopXVzX&-b4U{Vu z9?RwhiVOLQ{Rq4t=$I2#$1PyIU-mSAYvvXWqHgI@)J``uIBl)jvhIap{>%- zm~*83_Bk@{R6qT>=IVY$pls%rB9$C58+g`6+L`(ArQC zP!LD}+wD>^covXSynJ|W?M4@pRJ&BWX1s_zFRX8Ove9O@{WtbvLbb+jj8Ha(?*(^e z4@ZbPN#0^g@8w+y%`A>#bp9g8C+~U4plPnKjicuRpPy-U=|slZf55g)Q3OYNN%;3s ztK~#U^oTJb;WqoMf#1zAX%0S5)WWdMWdK{3sRQSwE5~M`*!qtVunF*yk&k^>MBApe zha;)zDa*{P-dJSJG8KjjTqh-V44k{a@@=9e4(^>SlJ_GmR`ha|1^n&11FtQxyiJq> zJAX13B*)*E{odFE2V!uyyS-X#iqLd0GH`LVS{+YsCg$hBFl6Oi{@`R|a&?WMHu|A@Dui%6;xGoBfDI z^80%GGA4@GQo5_19;o~Mw)k*2>UaM>gVs#Z?T!yr_tbt(GNX*vG+|6|JAu_B+g!7> zyV~mR==*rDNP?$kLrvF#8IeFp&wa|Up8k|wJ`v>q>05f2dG zsHr(rS|$p)eV$;@)|;mJr`=d>e^TJ*ccxx|KxVXCad0p+*{Cv@)5BpfyDHavb7u89 zxn=NFaW=-_d+D@n`?`0s(t&0tr^|InQ{R)DDoDZSaHH*fxfX+bx60t7AyR-h7zpGU zn@_mprtYM9ECm79eOm(+$D4NDnY-=phP8O3R9W}s5S+ba@p!(S%zps=Z5%u&UGZD< zZue6~gF)-^Y)^w~(+Z-SGz`aICog8tcob%4@4L?t%c*-Mf^vF4a;8O+PC{^x^?dF& zKk{BtX9%;~=V`O+&CT_W0bzYt1d96uf~|FSv@fF1Lh`Jj`ZGy+54Njj4Xb%v-M9nc z$|R))_b=Ly44-Fu!+REy^K*yUiWSdeKm48-&HT*zjbh06EXS`e=dj)$)lDhu(lA=D zyx*=YzO@d$!TRlB0-*7SL=bx`*1hJ15R_%tnyS03z*pd-%iJfFyQu4D$5a(rGmLU6 zXFA=HfHdUn@ZV>ywHxkuIKw9x2tjCE0{M51dj`0Hhq4)-W{q z9xDL3CM$ub7-SL**ARS6+xTARA zJ(4ZTNLAFPJxc05pF(qTrn6C~j|H9s0Y^y02d#Qu|K=LbYF`iwtslI`pC_tzt>t~6 z{OF>Vk?@|{*shLLvKjJ3F0y=BDWAv&}y@YmCS z#=3h#bg)P>VUimSIP&g zuV@Bx)OR}Iypg-d)z{vw1`@K%cY+-DXsfiD|LJ2rE4UZu+9n!4F42HU?H=9GW%pQ? zQE>=3ZMSCa5`RRAM$^1?CgYy?3~asxsi{x*_&_kX z#@)99C%*W(pG`R+KSy5 z)rcgN0RdCJcFWa2*<2%mI(WG0Y(YHmkkw%_y_Uj|GV z7wUT%mcvR4xbk@-)K3{OX6e@+TUrWPsIX!;Tkz-vT1a3@-UZ|Xt$VMhwQRCRZ_X8) z!_oJnc4==bwm8S~_$Z z)YSz}L0VT9*zw?@bP?Yp1+mBHxc{koUqSP+YUaQ}fax3GrQ!#H^MK)EI4+k_W(c0# z-|P<d+^mP{)mWuo5<5UmO}6Pv@PS zo;Y-!V+($3kIOcpis0J1AW0E>K6HvjvF@gf%^`Lr$BZlg60eK7C0q2HwiO|#NtEns z<_w>(Y2Z^7u^n4T97rNtSqO#nw8sbH;o+$E^H<2<-`|^`v*l>kuyW(8ZcbIHt=YSX ziJjd)XdTmUt}!pRdfZ`38?|OUWVl!N4`}vGB^c2nrKyI97&*YGtwx{b*8vxnD!~!d zN>iI%g>cKP9n}9gW#-!Q$fQL-V&+U0FX3==b>jp=pUSvj;~7YT=s zT!;=&;V!FaHVqqxz*)phSvQxr*>0M;v?v0|b?5~d0}E$kCYIsjEtmC=L!y?&b8M@d zY#f-8%M`rgV9;RV zzXi%j2OXiO?Frn`&I2V20lnnBfXaV59%PR&@|1~cxr_*A4lQ7UnyRN+Yx7o{5&n_r zGY#+BLSQKiGAV6jC$*TM;`E}L_i5)xEiu=QC$ys=+9KIC&*W8JR12DX2~PYryJ<-; z<>N{&3f>S7807?&&8ybdhu+EZ>Gj)~Dy?l^WZSE^17Yi#QX4)<%J{B#R|f4nQ3)xD zLddcEjkhjYTX(!CV`tZd$~?%B)oGHlYuhwp28WfnK3CR*{$z-bEnnstkw9f2pZ0Er zX^4Q~W^&zhha(*W{Gk4n5xdqg3uyUiUUoIl=0F+_i1I3CwYiVJidEf=nM@!dZ(29j zV}m5!(wGYC!ZDX_FC`qCHH)^{JY|AL=9T1a(pdU|gJA~C5N z+y;}x)3~kW=;Cc zg~H^OMPxZDfBKhJ(a71EQJutplY|f+0C1nvHFtrr=nx~8+>*o$9)JU-i#?ee^)z=R z<#PSu)mk!H$!y}r{Q5a%YdGrQy6(H8OLQGNFsT+a$O5hK45cK+61*zPR~pyj@fY!Y z)YL4Ly90o)qw3mDN2T_35?PH+M7H9SDeH72*{xIz?bz>!ch9_c;s?UxtUM(}sBa^4 zUVb$?H9lK4tg4EFGU{8Eo(*qWh&-Mc4fJ)#_%+B9N003oDc&_XymVNZh%~%0^G|Yt zKSXKbF!UP1?sW0>+tD+>v0?s6tKx->55F%iHjfy)q{sYT2u%x;)WubV!xcC(D<)0))QgUi!h~TQXt`VbEmF><#1z9B#dit#DjX0GW z6dv2%MVx*gpMC=;GEDq*q@;}U-(p3`5yScADw6jP#RmQ+e@O&r@W2+^v@Cd02WiV% zOCzT?KPf}hfQAp=ys@KxcZ!N^G)VtQ;yz|DwQkyQF{iU0teP;+%RhvQCI76?M`u2q zpL&DJQZbz|xhwwssxanCqDk!-jN|LHe>nGU<}cKa5Lz*$z>bYC#_^xc{kCllOCeXv zCm8=_KRzV@bDDE6HMcuiS=@g8GvmkU`VVdFg(ga3!~)o4Vrt;JcJLG1Ql;;6so|yv zdYktZNAjms#B55|FW0glGAb}=!=GywM1nt$u0M6sWcwbLxYMFltIC?}oRzji+_rNg z8}q!4-8gV&%8VjNHcnWMeo_%+_x#59KEEz-UJ+a6_S#&W@x7UUM$1z@!t8z9^t*LN zRKEvc4sF=7|2-(G2vi8_xtr#M8SK{K(Wf322-mDppuSdSR^7Q4@*0ipzAgN-=z4}z zREVI@nMd7-)aCKG6k`ngdS8aOfOc&6YQ!=0?*iY)CN%Hs-XmnX_76zTT%zO^&K+FLf6bOL;U&_C?Pe5GNNrC?rcX=$Ut4Unvqv_iY~GD?98n3GttBk9 z=~gxj!A9Q#Aq<%I%lnHHPEi!){N|o4$%`Ys@BMb%BNDM6>uE) zc&0h_yn$);n~_RkalW(FAVVrN^R@StAX=8It!VCyUeNBcpNUM+<(9ncZ@1a*c`zy5 zHM#(05nZX65HQ}*FHLf0VPUyst( zr2kD$Zv5GMcjT~i^=OSn$o1Km;h1hOe|+hHWY$1-P; z(t8iwhWtJ|%pEvY^zPP3VifSBzyvf^9PG&Y27*2jcsolKOve48D%}}dY4*8-3HFyh z!OanpM3A6ZVC175NdLC6SY-Oqp(0TOMRP=NV)&TPrf||Pd^a|O{Q19juMEZOv{@$kXg$nsy&G+b`g;^r*=V=@IiFvVh$w zEm2s-6^~Av8B(n$J`H-~6iZ*WksmyTi#XA=LSjL^8a)ngN1x6Vati37{A^V=*2}(; z^F)PXVPBaqt1=ZN9*XcC+7ShBo={qv8(64!T5jiCY&$wgqsRj{*+f(oup%TGhhs(p z5a1ccxnEc=Z62epF)5B3f-=;MEv+j$^k(iJ5*170rV!!9n7J`9JT%+TzXWQQ=w?1 zTg`4r0@8v->_*teP4J=Kz9Y?%vda7rVZsp*0v@77AefA}7~WY5Tt+$D+{pbLZCS{r zeyr56pr%<$m=ueEE@!2h3h^SSCKd0>lyS!ntzvd+#KRNxq;hKNj`d9d6j}w{S=JO> zg*@IMB;q)cF-N0M+6w%t*VnJ+63yUjiM1osm|yP>O J&vQLp7%(-vUN}R)_lK`<2^k+q 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 data_final: record.date_to = record.contract_id.date_end - def buscar_periodo_de_ferias(self): - holiday = self.env['hr.holidays'].search([ - ('parent_id.controle_ferias.id', '=', - self.periodo_aquisitivo.id) - ]) - date_from = fields.Datetime.from_string(holiday.date_from) - self.date_from = datetime.strftime(date_from, '%Y-%m-%d') - date_to = fields.Datetime.from_string(holiday.date_to) - self.date_to = datetime.strftime(date_from, '%Y-%m-%d') - @api.multi def compute_sheet(self): if self.tipo_de_folha in ["decimo_terceiro", "ferias", "aviso_previo"]: diff --git a/l10n_br_hr_payroll/reports/payslip_report_aviso_ferias.py b/l10n_br_hr_payroll/reports/payslip_report_aviso_ferias.py index 03c415da9..c1e4c3a20 100644 --- a/l10n_br_hr_payroll/reports/payslip_report_aviso_ferias.py +++ b/l10n_br_hr_payroll/reports/payslip_report_aviso_ferias.py @@ -5,16 +5,12 @@ from openerp.addons.report_py3o.py3o_parser import py3o_report_extender from openerp import api + @api.model -@py3o_report_extender( - "l10n_br_hr_payroll.report_payslip_py3o_aviso_ferias") +@py3o_report_extender('l10n_br_hr_payroll.reports.payslip_report_aviso_ferias') def payslip_aviso_ferias(pool, cr, uid, local_context, context): companylogo = \ pool['hr.payslip'] \ .browse(cr, uid, context['active_id']).company_id.logo d = {'companylogo': companylogo} local_context.update(d) - - d = {'irpf_fmt': 'ewqewqeqw'} - - print(local_context) diff --git a/l10n_br_hr_payroll/views/hr_payslip.xml b/l10n_br_hr_payroll/views/hr_payslip.xml index f1dc8cbb3..8fcc02120 100644 --- a/l10n_br_hr_payroll/views/hr_payslip.xml +++ b/l10n_br_hr_payroll/views/hr_payslip.xml @@ -184,24 +184,34 @@ - + - + - + + + + + + + + + + + - - + até - + diff --git a/l10n_br_hr_vacation/models/hr_contract.py b/l10n_br_hr_vacation/models/hr_contract.py index 12cec93d4..500f88f2d 100644 --- a/l10n_br_hr_vacation/models/hr_contract.py +++ b/l10n_br_hr_vacation/models/hr_contract.py @@ -52,9 +52,7 @@ def create(self, vals): controle_ferias = controle_ferias_obj.create(vals) inicio = inicio + relativedelta(years=1) lista_controle_ferias.append(controle_ferias.id) - hr_contract_id.vacation_control_ids = lista_controle_ferias - hr_contract_id.atualizar_controle_ferias() return hr_contract_id @api.model diff --git a/l10n_br_hr_vacation/views/hr_holidays_view.xml b/l10n_br_hr_vacation/views/hr_holidays_view.xml index d674350cd..7b4916f7d 100644 --- a/l10n_br_hr_vacation/views/hr_holidays_view.xml +++ b/l10n_br_hr_vacation/views/hr_holidays_view.xml @@ -34,6 +34,7 @@ + From ae9fdfbf4c2b7419ad962556b828af16931b48c9 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 20 Feb 2017 19:16:14 -0300 Subject: [PATCH 004/787] [REM] Removendo relatorio de aviso previo (portado para outro repositorio) --- l10n_br_hr_payroll/__openerp__.py | 1 - l10n_br_hr_payroll/data/aviso_ferias.odt | Bin 44616 -> 0 bytes l10n_br_hr_payroll/data/holerite.odt | Bin 16895 -> 0 bytes l10n_br_hr_payroll/reports/__init__.py | 5 ---- .../reports/payslip_report_aviso_ferias.py | 16 ----------- l10n_br_hr_payroll/reports/reports.xml | 26 ------------------ 6 files changed, 48 deletions(-) delete mode 100644 l10n_br_hr_payroll/data/aviso_ferias.odt delete mode 100644 l10n_br_hr_payroll/data/holerite.odt delete mode 100644 l10n_br_hr_payroll/reports/__init__.py delete mode 100644 l10n_br_hr_payroll/reports/payslip_report_aviso_ferias.py delete mode 100644 l10n_br_hr_payroll/reports/reports.xml diff --git a/l10n_br_hr_payroll/__openerp__.py b/l10n_br_hr_payroll/__openerp__.py index 166233b56..8a8ea9293 100644 --- a/l10n_br_hr_payroll/__openerp__.py +++ b/l10n_br_hr_payroll/__openerp__.py @@ -43,7 +43,6 @@ 'views/hr_salary_rule.xml', 'views/hr_payroll_structure.xml', 'views/hr_payslip_run.xml', - 'reports/reports.xml', ], 'demo': [ 'demo/hr_contract.xml', diff --git a/l10n_br_hr_payroll/data/aviso_ferias.odt b/l10n_br_hr_payroll/data/aviso_ferias.odt deleted file mode 100644 index 4b25ab918d13e8addf8b1a3ed521afda41375faa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44616 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 F{|^ogD}n$3 diff --git a/l10n_br_hr_payroll/data/holerite.odt b/l10n_br_hr_payroll/data/holerite.odt deleted file mode 100644 index cfd48464da2215ae326c6b63fe78aa073dcceb26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16895 zcmd73Wq4dmjxcP;%*@Qp%*@QpZZk78Q%o^4C#IO0?Usv`kdLld+*H7ooC;F zpZYmn=bSF7O6n@9N+l`EfPkU`0YL%*H3iB`>;GVer2ql~`h9)80Ftf2EuHD@9RPNw_9m{j06Q0Y7l4P0;y)4N_)-f;j0gnu`@;Mn zrfT78Yiws^Y2(b`^2aT`gPnP#qPzqgG&b}{6*wtLQRR=a0SE{f2omJuuJ?8D@T168 zlvNc21_nk!L7}6gV`F0z6BCn`mR40&)zQ&0F)^{Wwsv-Q_VV&_b#3wS=?D%Ej*gB_ zN=nMi%nS(VDl9B4FE6jFtLyCS3<>Fpj_yxR9?s4l&&!)EESxScpa1@SvA%w}y?w2( zuWw{zq`P}#c6N4kb+x~LYjkvXYU*HS=GV%~$&_4W15&EwnK z+eZiA-`_d6&LDt*5cs7;g;YIOPIaT5wp(l0p0m8cZO*3)=VoLnm7CR&e~K38{dyNT zYlI~d#1%#+|LnaRPy^7?XMNSAYr58WiyJjSa~0E5(wIZLy%+9y>u5FD^QqIWJm9$J zI9~Pa?9e*M%p6$5JDs#&ysoA^KK7fQ^s797Iv$ujUgo7^w%r?;H-58r>o|MP{P?+T zdGfLSJoR<*Q9$6JtE$THzHYhV-Su{I{@mbtqswpd>7&w~xYEKNjt%>vuZ(sbxhqyi zSAo94xW;wnn_GkK__J15+D3KCwf9VhtA2F~hr7XCIIY>}-aGyIb#+^A-SMN1U)_nu zu^*St-u$iAtD3Lm^x=5zPuqmD(dhN2d4msDT*Y4B5nNdQ> zC3^R%ta#sTbQF2;8yqdBO}?-Hh!2K1@cI4&fYV;w)HK|RTIalJfz!dlWn6GZ-#U1i zyikVpMI5p$HcBaoom>i`7c-Dju?-}`KH)ZC#jVD+wZvA9LOZQLjV)k7w?JxQh8$Cj zrqW|XI~e3^%r>_UYZg4^BWI4{i132&r>~Z%#Nfj%!Y8B{hIumB$T6c&4P_*vqFLCo zKX6ouOwTLWQbf-`abx%>!XJthOFpw3Z-V>6PFoWQd#KKw@VVBnHybK5-lP^FtUv4; zKYm{x6ry6tBhta)=XUun;36~p4B;YH(<{TSqB=r~Qpk7a1q}DdBBQF52RFt71jC@S zvnZHdudJN7t^*J>SP%EO100!j zK$bCW8}K4PHVAB1tVo9Zy{D<2vdSz#%|kxtb%;ycL4}|r&42;M>FSfd8u6O~)e_Ug zd1^v4h6QCIo2tYVz)~WJ%ndIDtu)o%^vR2r>(IAB?Wm_RVPYBQS&(uGx^+V`nlI=n zi}*;R8ktISiA5pZ$Y;6}=i(?wtt_kZ55qvj@*7Hq3 zxLeG{0lfHs>GC79(s&vyBp8CrVu;hkO?ZL}hDnY6RXv9YpVe+Ni)v3pdoX7Jf+T~%`&RPe%^UsU0)C7}ScyBXP0t&>J zDOsZ>{h(Wf{j{*L6JqSdw>8Yr7;7vPd(?fX1SY%4amm4mp=qRB{i#4MCDe^PFi~${ zg2W7eCUUII`U#YG0vM4SI_mi%P-q%GSh{yT+j1WED(50>3In=~^sZ zSpNu|K&-*i)R8{dK*R=YN?yVhraM~q3mp=y?SBV9+* zlKGy*zeMu6#5FQKe^p9`&MqcWvX*vBmgSZzZctBjA_tBVx%*Tg9_6hKj+Fzw;tFa3P33u# zt7vHtY*(4{3bp}cLt*_wV%jJyk*$saeCy`K4C2vY1&=QKvsv|W+daL+B4H&DHuhyY zi;=7dzZDdPy8^A3tVj_WF{Le+rSJt6(B6XMSW!h`;c{kA>@#zlye(0<;Ybm~S43N- zvoo11{HwhbrVe;oh0+;zMn_ZFHCDmZ8l={g084o@Y(f-kGi@-nF_$z~3ghv5hHC=g z7({4N1%Gr`a2hpI15t|*^4bd2Agq=$A>zkhbY!JMnSxQ!$z@*1{Ek+(E+g=kxoP6* z^6#6=!#AzFa|l#gT*C&)htWuDC)2y(V!VBYxd;o-=J+U9j@+i!x8Qyq4GqHOr-!f* zmyX+%S*S4$&n730_}AZGXWj1yXyd@|QLsN@p+(G=QOUc_d?FOnx0{2SlV(JejV_$# zKsLyM0*~TQ&Yk$#facF6ZIM)aVPC0`7MJ4he&KE& zCq8RBmdN2hJ6Xl%9mPHM5cH{}7Plk5dfd%mB=8lh#QDx*x`SwSjiVd_Wz+m(?~=ra zbbPOHzs(x>HYT>qCRW1W+-wKv-0pmI@cT$p-+^x@&eyGih3EWQcm?QVxmtb$5wmE& z8tux|=y{)p<`%v2#qxpM+iwOlRxP@;>b?^!Pnwlap37QmV^#L4_XNd6J5G$Rx32zm zng^W*w0`vVPxEpDT{(1qlLw=I(+2m~yk^-(AB1H;es_Ey#&!z4cs6J2|IAdpTF>zXLqGH>em{jO^tJIK`A+m6 za?5d@Gb^Q`F`1tH=7*I7x^qCDz;uqqrxYk{OX2 z1(MC>wzdmASyL3wG-|G;%VNP7+IGU@Ppu@+HXa`%I_DvtzXR~K+4+#C_rpyNaXU)nd+bX|!W##- zEC6))zozo_DNx)-R4}t&9juFr0t?=+3yo-#n$C7D-b~dIwY`Doyp>7)z=D$Lc?B}& zgq`kbk4T%Rwu>rI`bS4HWS3@wC=_*S1uxF}9iyL4GD4&C8j*H}r?<)ZIy94eWGsdT zC2m~1Iz!m>Negl(b5b;}j~}0e%LHT>Uca5EZpevzcj(+(OP!Cul$GArvA4N6sH;8D zzqoshA62l&8xgQQ78sl5`X;mh-V~nACn7@6H-1~e#=M)QHE$*ktdLTyiY6226TvL) zFv~f;C+}=khssuCl8xNEm7987=QZv!=y_c@8uMVV$h17<199KLxr^745!{Cn!z17Cm%Rwp-yUo1c-);%-yBSg5$F?H_cgz4p{&bJZO&tJn(Bl}E=RU^_|<+9 zJ2T}w4Grr_PLoXX{b1+)K|Bw3#+ zdjcSP(CvH*#u86hnTd0v+05MkEnFx?*IxMOGifZUJoegf-Q@ z1r~lZX;*p`NW+^%>zS~jb@G$r88yBF#Wrod` zB}LOKdBie>8WYn$*>bhP^n^=FC+QZzd8vd8`pzbCBXRFa_o!cX@rT)B-RHYAD72Mq z2|;1+N)ZXQXi^E$h;_P5Gv=IVRCcEiMkCmyF5(_wck9B$DitJO{fp zo7eh+7d4oXWCJWn39e7pYWCGCp}3yatTH48&mw&&n-Rb>Bu+*4YsRG$SIkyXi!lc> zfMvu=OjJHq;%Cp716Y}rtz;)~x>rj*<|$$s8TQod`y%2_)R4?8)dDqjBqs7bXl1UU zB0BG6fdH_*DNs3$coB{RS~0tk0J>j_ITMTZmQ?XN5E*`<%1&Q%cZjx@;vkxDoPV6^ zvHB-}v$I$1$7|!iFx=DP_QBkfJSE_NHB!=s9vrq?%6@NMg4~N7N&RLuAmh3F9DIJf zG|R|#sa$fU99rj$A)7au;JU(Z>yRP3d++8EU6DKK=2(ApAsRSShbPaAdJ}g5&F{qI zuPxFEeZ&wyx(T>>%Cw4zT;)W%KQP_iKkS+@`&yO&g|i59%!gS+-5X z#CO}_G0nz=1dWH5zEofp#{QbTC9e(Dh`JA%T>BD?Njwfs3U<~j&I&E#t!@edP>%5m z*CikC85(3JuZvD;L$CajTJl1I9a)C>GxLTU3vq7)3Me0aZ(~rCu85d$Ow$r>Q4871 z5)!ipAI>SQn6OlmFJkpOXgg|~&bUi~#Yp^Bq#pZKcQygRFV@7)@1UajWgI~c7*|A0 z?LV)SMSpUyHoMOBtc))V-AcFlZWp`L-O)TCUTwH8#B(H#B%rSLnw^2cA)yK5lj zr~TMd14)U=i&hC62K|>`0TL4OA5Mzjzx)9(A2%lUb}qj?5FWNRr+TY)JDeGv8>Ngt zXJgaFRu`rlf8rq|N?R!ge>)OZYpm%uHk?Atcz>L(fw-SSpxxDn9jIZ%71WRj+q0t&dv|>HVkLO< ze6$xJnXPweW{mH2&BKXv*$sO*2TFAd7R&Nx`uTMBDX<$Fo!-IlJLE0cRbFO__U=~< zB^^g;ME>R2Xo>#E86qFpOmy;kZ$MA0=O~h6XZ==icu6P}otaf z-ay(I#kqso&GFi5HtmD_Y$N0;e!0uW6}CG|$waCIBtTIr&?89PflNq|{L(q@DNy=t zQ-|ord6)Z(E<|IFBQ6&}w$Ei7R3&DU4{28R0*WLk>eCGA#6$#0VeQeo&;4DJ9|Yca zlE$M*i4>fW?ls3B6v2wiDz4ii2#-cTFzZ@+`wPhcOJ~A^RXJy*9As+`VM@|bTSF+k zx0n4mYdRNOZCg3yr7$6Ggop{+6*S05d$;5b0hF?ka_q4+5huy*UBf5wk&X0cppAM^ zAX|kHzR{+@Jk*U#{dzu<2EO@6Dk*&m9IaBT2-~-gh?p6KZQ_0U!k|mJm2-W z<7cW#kV7z!^?eWhzaM!?k3>7yC0MSY~eUMdskXIQt zndo{sLVhqJm$;s^Ov_VpBNEUgYOsW&VB3fTWsAeYvK(1w(XRW8^+f7{iVjdK8Di&a6@;gJu;7q~9_9!Naw`*?cGnoLyX`<*+wW%10bMn2*<@8PZZi__%ns%FOZ~4y zJ>U8`J88utUsb%1n;{H$`ib{R`2wrrz${D5f8OQutxzDE*Ydu*n-ytflYIFxk`?7r zHK7gUJI^(BsHuFwnwMBMq2^Y!hzo9zSSC5pLP&EW$uMd@D;eJC3yDgxXOv;F1x%t( zg!m%}J(g2mmt-U0Z79qP6Hunl2^k-Y_S0SXCaLtQavYD`IRWN+nCR+gv`PsxQ7}I_ z&J*1SBqjoyWs-UVPvB&FnA^)YBW~d~(tohJ=o;;`uYX50T|;738rS>>0f}Qa^P9Av zC-Oq%yvIPx4(&*iwM4bT>~x`MOK@DO!sc}p8!3EE7<0}9;9DCPnp))iS~6!p_G}Hg zj4Foy0%$Cr<$cc&8`?=VYGt)_rnZY2t+or^(*3Wzi%G{tmwQ;5tN6j}k!>4}?sv)Zw^n=lyVZ^_0*&~??Mxea>fN~1eOI|C7M7kY2}3mO-KSrQV@`WxLxa``U2 z!;$bxqVI9rwdZ0&sLA%yK=h^NL_i(S20NM8zaGAdAl!m+7EnV-sNzqu##(Iyc;~g` z+DCf2k_NBS22qO&y5o|=SLcAJ>Viw-XtKZv_;9=Xsl;O9_QbK=8FL)BHRFU4&9Gil zuhCh8?mMYJpAN`#PmEiiI=0n-h$nl?9{`w9;mJjke`JWy+ea~Dq%DG?(wAenh|xl^ zL_Rjh&9o4s?{U=;tG^XTu(WV3Qa*_Qr$P99zYKIwHQNNeYE-(37uCoW-o)t1xZ0WLLbz`8XC_w5blqQb! zJ_Z3S!Tcah4K@qq$?n9%?QY0rbhoeBA?dCyQ8yn0j(xk6HjOPl@eJWLRhkd0q6Ko6 z){*90P9zHZ{IKLD8xQ%W1fn1A94v+jL&V;68B#TUYRJA7P7S1Gt`uFzf-Ng%KvUZf z*rk zlI9y$2A9tLaFQKv6ALmQo-CVCIZ{VRi2!>SCdPIAIQI|k1dc5 z7}nJF9i_~!Nh>(Ej3C{mekQdcD%n6XYb=-vO(~7`jILDgk=n~^{^qWcOs(D0<%%(l z#@7rk+gQ(n^bCvYx0sf>5%cYC+;PSs*+OQD{KL;&mAu(13gsoV8uL_$W^8woNNAOl z7fM!p=eUDcIa!Y_HWsy7CPF9~Zx3rD?$2%ym1D_|?FxQPSL|JQe&x_<_bu|oO;?`{ zz`IIWob?O4RQ^%3&>!gqJcA#tKSS;CLkxaRQS$nrU06YZ_>aCplE?S$OO)=o?b$IK zuZ|Tv5oa-^the|RquZ{yqzl!FW!!USY$$B`M!$ZHBD8-?z2|`f^PoK+We|AbPCRy< z{Q|RS;D;!_<%MAcj8H|xAb{!}h!Ziw1z{@p><~m4K6n@Qsl*y-f!1k|6?W{9lb9+U zgu6DupXp_S6_5@pNO9-zMV+a~n&6#?Z^1KKWY#Wg)$vORaWe>bOERI?GV#4MNLXOI z;bK>9Sa}E~$Acrsoxo}~w5s82*tKX6Oti3irFTQRMNmd;Lozu;2y04|#ZS^`<2Y$^ zWL>p4$d0uQs!T#qza?G%GbuXm@3Y&N&uo@U0q~DQHx2K86WG^%%i<%0{C!EF)Mk!^5l{in$m*t=P5*u@HZHO{7E-n!S6h@ARj>wH0a7|68O)@av zrL5WW?6^!NZSq8TsXc=F7h4j}6_QQK2PElROl(136O3$WomRi3?b-R%-xl;ld5ARY zjco4wm~YvGRI|PcisT3sI=Q`8g;AMhgS4AMy6j@BW3KtSBb?B^?Bx0_g$U@GCINZm zysBPJcOiVTotl0A9(AuzhGlKa3qWAfsHLg*36Cj0-<8gk+yK|g!!Q@`hQ-_rAcs1r zEhB4vW)CoE!c=iX(_nH$B*Rh7mz63Hz#ziQR-4$CEL6q1us6Uzcj zR~3p#V#aZ&UY&~-V{Pe#9|`N56`RD2+K%bW=h;JD8xMiDS#gx{I%`GYf-RCJ-IxPi6scwUP-&YU$;+sFPA6@^!p+imSJ)1O5)%e? zntP$)SrtM7*|w=ahkPMTQwIv=oKe&pumG+<%{-lXwWF5zpUK?(Q|BEs6Wk@RMx1Kj zM8677=Zd0HdLdQ#nE79+Z!$E{n){rZDrl6FfhnN?>=>%j!Vwfu!sfBFrYr^T!lE4Y{z&)h1OLJMjau- z-I>${ob0RJNnHb+<*OZcY_O;K4f3%vcz%0m)^U0o71Wy)Z&Vz}W>d!k%^Ez)5EYUK zT$uh`8@R6~D9?(MnyPLsKPr}xp^CaoMv|W(WjCmY#Oyj%ENGrsf+tLBB^zP9`F6n6 znD~9$TPn)PhXE=j+J8Wy=YDrbI8=Q-KKPv;c34PK*+AII9!woFw!?PRV24#Wo#8em zS(;<|`#g1{V>FL&{Og5lbZ@RPC&(xsY4`T7%RTI3{1tT3y9X=1lx>R(f`72kNYOj8 zUw_v?S2j#4u|tRy=91vc>NIc0oVi3(sc2VHrmB;7rLkAr2>v#wd9{TTog~@q!&P48 z$|sEqF#Q_zW`5eu!th}1JX@94WJij1C(^xOBrGxvYzz@k$!X4dqXb7g7ydy~iO-3J z++0z=FjbPV1yJBjxeP(xHE)>wabJLVQD1gjG9PjYAk@F-P-8T`p}$cjm~S4r4=Dic zBT%f_qkqQeOJGFre?Z5~xoC%ZEw`GDgMN_jEKdgzh#+icv^8FX&XnCV1^Kk+T z7Y=6asVuE!i&#?F@wpXj)#{xN7QMiFyO;Cr=;o8z#nu%=>bc$e#@mdb%yv*N{RaR0 z{UAq|;xl9ZwREe&m4wp<5eflq;%i0 z^BLeTx?&2}B7I)V=No_{%j>nNqG}UamC~USNxuO)dBJq>Rmn0y7^m2A4FUB<8fmNLNS5pou58%JEn3-Ded0uc+9n+EounWMr$_`;SIs zDn6cE_Ra|zks+QTQ}w7@PnZ(37S~teww7=4k=*g%#wyEohKeP8HQ@x_75q{j(X9wQ zBrFlWcIZ$kgpZC|SO%}t(aKKxPr661Q?*KV1vp|H*o=I2;C0bTnAT>?mKGKbjYS!l zuLY>d!|1cJ561SFHjr!7$oSok?%t+U!CmZny$$xXACe~~ukgSY{IGH#o%E(Xe8jbN z@V1PLI`1Hx=ph~bLat@TJj`4!m7*nAJJ#Atj-j!51pO1Y0hdC8yK`*>xKXP*p6N_< zH?H3i4rHyVtW}t-mAINJ=Y753aTETPgf-tEUG^p34%rQKe}4%{tih0*RU^&QHalG_ zH03z|a4gn%ZGs3V;aNw2dVO~!yk~)EeQx==x+kxj39m!YTy~ zOV@izkoK*7iX+Uj4bZ}T-S$BckAtlX>2j#nRfih?0ULOR${TZK3%Zcvp1$pTR^2V zKd%DVkh?5(E|XRvXU=$EYk50RfQ>aD)o3*Q)Jnb>xcX=jdGg;7LYm<8)+3hJ(%*io zD4(=CRJLbx-72FJtDn0Q7wmQZrQ(y~BRG-BQ3DhcehMuypNfWs>)N&QmR1-7a!vCM zyBD+>0>pUw^>TCkSs{01GC@^m8w*F`eq&xcr8tL*p&>(3kfeQr>GMTHRrhh%&st_( zB^^dyZzXH36t5iE)cG`lVE4)Q#eP5n7RMb7?_nrjJ@tv*97wN)sMl8M1`Aw>UQ}w7Gl{DBKr+)S2m?y6Y=4zdC#Nm=$_{9YvSlU4m zzlWEuD!afyTi<~*3QSD&<#88Uj7l*7I?o|+!tQe;2wzDV+ z5Qf3ZlNkTKHbZQO z1S&X9M$ax`RTLdf)aA_sB>^U>3Ebr`6jmKK*gJ;A=HT@gNDWXRi;cGFNROW zsI>EivFj)k7^E%d;Wvuz5s}Zr)8i&KH^isygt(?X^$bEw2PFk=DJ3pa(ssu-i*;;P zWKx}G!%K%N8$$3cvC;#1^n;P8(ox>fUyv{qqkK8qnp;URc96)uhJ3R$5|1C;(goEu zqaM*)p+&1)^hZSlx@?n-;fmJ54Q++gzPI6oCu!9lqMqppgN3RAxl+PKWsxd^L0A(l zV+6KfsqJJIjv#P;-Bm&2}EwB+i-%n7Q z%mFqJP39}(w~zztZSW~GT2eB_y5MNdf-F!Nih5fTWs3uRHZVb!J zGNiS@h4?O5ZPmt!G~OwHnw*wm0Fg-bQ4gI~GOcA_Stl9zP|+UP^QSAyi7$RXq#CJ* zq4Ad?peo*_KbiQw6bnaCYnBFkQ?u~3O)!B_?no}A8d~Y$ZXAkl?J`$yx|MJqrZyyL zW@c@!O@rM+Y z(lM|oSPTTSUrL{_kbuX5aG;Tmlh;!07hkbwUVqd#ww!W9P(NEke?gHG1w;j^gu`YI zCC&p!Wx=he9v5EsESz}#dNwOt42#m_m8a^)Itt2$)gJr>pY!OR6(j@4ZhuOt4$`G) z0p7gI^akHlqN>hbbB_ye+_z4|!#7ib-YgDL;UMt1Jxyf2{#Md&xeOu79-JWa%BY1y zHa}1TK;LMg>@i5ttX=889BM~h&@E$7#P1lI%*w?dEG^c1I!tf(PdVoHXM< zvE$0?D-?Wg&aUI?gx6F7r{eOa+0&1viS^4oZaCOZHav!gETeLgztbOz@wqhlbakS6 z99tKCobOmt{*?_--q4H2{c_-t%rE%Gb>il85l);QJme)f(T-3^Oip~l*{%(y{CUJW zssND+5T=y8>?r#^KRMkohvEKf%(^JLTx3b2w=c?F=}}H%vwnh+Jg+2XU=GFe{hcjJU-h|lYecve3oZ9_-V!i$;h03fP%EwesW+Pngexyx?iS+_KOmF6x}`WS-asBoy|xN zO`YwjS1Tf~t-~}V?!j|Enpi`xp}=c3sv_jSG!+J za|fPwmjwo+?{`Zc){<>@4hzWg*`>e=^O15&1)y5APo*b~iEPQx-AhRq@I06BZ5Lr3 zS{%F6q|k*)gaTas6W8cn6WnhhovQ5WLPY+MVy@gWMvo z9KmwGEVpbjvT!DRD<@&iKcihbs`qcCp@NVFK(Mnv1%^= z8IP~qDO*X7!da+!l)seiO6^;!27hs!2WNd~U{8umiQ)2;n^=B%D8>8zLQQKrYkQC*=P*(@DI(gBA$qnL_I z?0E@7hg~h4_?I?*-d;V9U)5b}uErHj)A$ZzG6d4`v|2D&Wxn#6!0+EP&VRl^zjX>M z!LIo3kixg!AK@XVF0D>>^y9OiX>AU`u|_$Ml&cNne$QhpwNzZz#nnfjP90`!i&R#} zfgo{OtPaxMJR-dU3G4?{=zq0Ibg{aXW0)0je&3RMZVg;MAZ0UX=??ofLu|Z$wNrRO ztwAEUogi;yG-#CRmapT9kbY@Eg4Kk2i)=eTKCD{a2@wI(zN63`ixzxQ8D+adp1^<{ z4}B2^N(P zf~U$F2lmNehPV!Cj?-NpyU5oAUXvGquFC6)E_eZ}T-LQV&B(ate`-p;XI z*6p=<_~Z7M9v>`&n@wFAZ9$x#IuhThx5CHqw3(s1STQ-!hV5BSYY_ z0K-vM^;Iog4qsBarWQHQ4zjNs)MG%^UQ=j$H)pbc2mQUS7NI12ApAH0w-NtO>*{}m z@dI3pey^&(BrANLWkeh}_lX*!&62dCkY7z>r$H3PMGq8BXjao-m4l1K!!@t-@y_xm zYtw;hX0!KWIUlb-ynE`T4(74M0o=fELIw(2*@esu!27IqA#iMR`!});7H%g(_pM4> zVW`j4bT=J^#TDaORF;IXeap{KtIdy7QIX+mnj({fC{$`;`0`c*LUCXPZM5jBlq&iI z9noA1Jp3pI+He18Aq9ktGr9N#4?BVc*1S>Sp*r8o4Qm+Fnf>UJ>BbO)M0E3kcQzEQ zpuIl89OV}Z^I$IzS=#|&+JXTtFZiR+8oziaUN2>3mN8(c(sW|!#n-Z85~p2B*ltVA z)CM=_<=0f(2(LIN+%&bQ$7dC3?EtQC!_Nf~oSYa8pdX^Y#&vymHvKGkRoAwJLMgy;O~t50Xp6GZBaPTR0w7T^Vi zb_wlpS`iHo;qa!hiST=qj+M#qXo}`?BP?oyYuPXidY4O9!Gx>)1E8<&$auTrv9`*H z9+I@zNyc3Gg4xNeAsFjYCxPZsgrqe({Swzur)`WGXUhRb2GZJ+6QXEV2ym6tp7)i* z^G$Y9icoT(h8A~C1u8% zp+7nTG%~)4DPS@gRj)&_SQko#;B5P*#B{HcPVGN+*MqQ|X+b@TFd37UoXQr#6TX9_ zliR6a+s8~J_d=v!{_30XC#;4=&Q}HE6L5%ooxE#hGCrI3dmqu3E}`n@!)h6`kv~Po zUV#pE4&rX|mTlh=vAE13pru`d+dWA38cl!q|4Chnqn@)|$G!Dl$y_P>8yK(TE4}^M%ruBrgagmIFFvy$!(<&1c4bUb4Qq zGS}O~W;ZuSH^0k9*j4%xuva4r)S;(OZ!+v!DZEM-*b|+Cn>SL*Ue^1ch}aRI*EdX5 z6OiCI9C|?`3fULS#P=BoZ(nJKlt@j*v`wmB?F-q+(2#(QV3Lx{kO{_4eT~NmZ|MYX zj*n7=af}&9cpQoN^i^TS`T0=+Ww*{paD!YbTjZxHq#KQqmd@-D&myb>rLKL?I8t?-# zhu#wG9na9LU~O0|Cq8B=*KrP+J1ACU{C)Z!q8tnY&xmQqNwWXo1yVw>9l?*|h;BY? zuT68JdRA};_*K-4_yHcA3ePVIYR^KwkAQa{HaeLtY)nRt%QNtnvrcxCRc)6sH7}oXy>!!FRLR!SwE=a-lz;gnWfPIYZeP{ zYaV>?0XI?O9Sgs5bq*w6_2Dd^#(Is+d0xab>SEbE{RXlPpe{x7Q8er_Aj_mJWBAJ7 z?7LI=cf*C8&Nn0di)qz9{@E%(>4o7hC6Tot`v~{Q<=72lRRdo`t+kuO!`rUk7HNbQ z^;8oa2&kR<4~z6i3gaJ)#)F}i_Xjp4o>#wP5@_TV)@HJNz<#*GC4fZOHRjAI#yPYhqNhI&n7gVFOvZ5b zT*)3>aG{FHL|PQKghO{a3Z9}0>4JC{sHV_hBgaMbVAkEB8S_bzi48CD?d5du&<$%r z>Us-!!uc)UTL_YH+z;{c|6?5u{0SB4?^Cb;F>n6o>yJciMVWub`qv!m|3Ltf`?&qP zjO#zB{4qEFdP4I%qWVuL{>a@n`7^%yUlISh1^s=1^C#Go{`ENLU-ACBq48O1SaNx-g^9j`FBR)Ps~2f|E)*<*+l%a!2iVjucY=rpI`qC zr9Vx^|CI_0*Z=O%pC;u0O2zWuQ2EoO{5_T5+W1e%{Wny8bM%La`M=Ux{5N#|YI6RI z&L4yEcl&?Xjo(J+Pe9=Q-?I4|6ZD@3z&|r-_HT&()d2lHlfO;SpOEu!==?8(^v|6B zRonjacwYS=_CJdC!$AGP&L1-Rt0MWWjsFB}-oMe!iZWmy>m?u{q>qoohyL;8`~CF) E0j^-0x&QzG diff --git a/l10n_br_hr_payroll/reports/__init__.py b/l10n_br_hr_payroll/reports/__init__.py deleted file mode 100644 index 856caa565..000000000 --- a/l10n_br_hr_payroll/reports/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# -*- encoding: utf-8 -*- -# Copyright (C) 2017 - Hendrix Costa - KMEE -# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html - -import payslip_report_aviso_ferias diff --git a/l10n_br_hr_payroll/reports/payslip_report_aviso_ferias.py b/l10n_br_hr_payroll/reports/payslip_report_aviso_ferias.py deleted file mode 100644 index c1e4c3a20..000000000 --- a/l10n_br_hr_payroll/reports/payslip_report_aviso_ferias.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (C) 2017 Hendrix Costa -# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html - -from openerp.addons.report_py3o.py3o_parser import py3o_report_extender -from openerp import api - - -@api.model -@py3o_report_extender('l10n_br_hr_payroll.reports.payslip_report_aviso_ferias') -def payslip_aviso_ferias(pool, cr, uid, local_context, context): - companylogo = \ - pool['hr.payslip'] \ - .browse(cr, uid, context['active_id']).company_id.logo - d = {'companylogo': companylogo} - local_context.update(d) diff --git a/l10n_br_hr_payroll/reports/reports.xml b/l10n_br_hr_payroll/reports/reports.xml deleted file mode 100644 index 30717176e..000000000 --- a/l10n_br_hr_payroll/reports/reports.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - Aviso de Férias - odt - - - - - l10n_br_hr_payroll - - data/aviso_ferias.odt - - - - - From 389ed1e80a5cab6824b9d4f2a14865b4e42f267a Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 21 Feb 2017 10:37:24 -0300 Subject: [PATCH 005/787] [FIX] Criando holidays para os 2 ultimos periodos aquisitivos --- l10n_br_hr_vacation/models/hr_contract.py | 67 ++++++------------- l10n_br_hr_vacation/models/hr_holidays.py | 2 +- .../models/hr_vacation_control.py | 38 ++++++++++- 3 files changed, 58 insertions(+), 49 deletions(-) diff --git a/l10n_br_hr_vacation/models/hr_contract.py b/l10n_br_hr_vacation/models/hr_contract.py index 500f88f2d..0daeb7aeb 100644 --- a/l10n_br_hr_vacation/models/hr_contract.py +++ b/l10n_br_hr_vacation/models/hr_contract.py @@ -53,6 +53,11 @@ def create(self, vals): inicio = inicio + relativedelta(years=1) lista_controle_ferias.append(controle_ferias.id) hr_contract_id.vacation_control_ids = lista_controle_ferias + + # gerar automaticamente as ferias (holidays) dos 2 ultimos controles + ultimos_controles = hr_contract_id.vacation_control_ids[-2:] + for controle_ferias in ultimos_controles: + controle_ferias.gerar_holidays_ferias() return hr_contract_id @api.model @@ -74,26 +79,15 @@ def fields_view_get(self, view_id=None, view_type='form', res['arch'] = etree.tostring(doc) return res - def gerar_periodo_aquisitivo(self, controle_ferias, employee_id): - vacation_id = self.env.ref( - 'l10n_br_hr_vacation.holiday_status_vacation').id - holiday_id = self.env['hr.holidays'].create({ - 'name': 'Periodo Aquisitivo: %s ate %s' - % (controle_ferias.inicio_aquisitivo, - controle_ferias.fim_aquisitivo), - 'employee_id': employee_id.id, - 'holiday_status_id': vacation_id, - 'type': 'add', - 'holiday_type': 'employee', - 'vacations_days': 30, - 'sold_vacations_days': 0, - 'number_of_days_temp': 30, - 'controle_ferias': controle_ferias.id, - }) - return holiday_id - @api.multi def atualizar_controle_ferias(self): + """ + Função disparada por botão na view do contrato e/ou pelo cron que + dispara diarimente. + Atualiza o controle de férias, verificando por periodos + aquisitivos que se encerraram ontem, para criar novas linhas de + controle de ferias. + """ domain = [ '|', ('date_end', '>', fields.Date.today()), @@ -103,33 +97,14 @@ def atualizar_controle_ferias(self): for contrato in contratos_ids: if contrato.vacation_control_ids: - ultimo_controle = contrato.vacation_control_ids[0] - if ultimo_controle.fim_aquisitivo < fields.Date.today(): - ultimo_controle = contrato.vacation_control_ids[-1] - - if not ultimo_controle.hr_holiday_ids: - self.gerar_periodo_aquisitivo(ultimo_controle, - contrato.employee_id) - - elif ultimo_controle.fim_aquisitivo < fields.Date.today(): - controle_ferias_obj = self.env['hr.vacation.control'] - - vals = controle_ferias_obj.\ - calcular_datas_aquisitivo_concessivo( + ultimo_controles = contrato.vacation_control_ids[0] + for ultimo_controle in ultimo_controles: + if ultimo_controle.fim_aquisitivo < fields.Date.today(): + controle_ferias_obj = self.env['hr.vacation.control'] + vals = controle_ferias_obj.\ + calcular_datas_aquisitivo_concessivo( fields.Date.today() ) - controle_ferias = controle_ferias_obj.create(vals) - self.gerar_periodo_aquisitivo(controle_ferias, - contrato.employee_id) - controle_ferias.contract_id = contrato - - programacao_ferias = self.env['ir.config_parameter'].get_param( - 'l10n_br_hr_vacation_programacao_ferias_futuras', - default=False - ) - - if not programacao_ferias: - for periodo_aquisitivo in ultimo_controle.hr_holiday_ids: - if periodo_aquisitivo.type == 'add': - periodo_aquisitivo.number_of_days_temp =\ - ultimo_controle.saldo + novo_controle_ferias = controle_ferias_obj.create(vals) + novo_controle_ferias.gerar_holidays_ferias() + novo_controle_ferias.contract_id = contrato diff --git a/l10n_br_hr_vacation/models/hr_holidays.py b/l10n_br_hr_vacation/models/hr_holidays.py index 5086dcb0c..abe89ac5b 100644 --- a/l10n_br_hr_vacation/models/hr_holidays.py +++ b/l10n_br_hr_vacation/models/hr_holidays.py @@ -92,4 +92,4 @@ def _calculate_sum_vacation_days(self): def _compute_contract(self): if self.parent_id: self.controle_ferias = self.parent_id.controle_ferias - self.name = 'Férias' + self.name = 'Férias para ' + str(self.employee_id.name) diff --git a/l10n_br_hr_vacation/models/hr_vacation_control.py b/l10n_br_hr_vacation/models/hr_vacation_control.py index c3c5418f8..159e3a71c 100644 --- a/l10n_br_hr_vacation/models/hr_vacation_control.py +++ b/l10n_br_hr_vacation/models/hr_vacation_control.py @@ -59,15 +59,26 @@ class HrVacationControl(models.Model): ) dias = fields.Integer( - string=u'Dias', + string=u'Dias de Direito', + help=u'Dias que o funcionario tera direito a tirar ferias. ' + u'De acordo com a quantidade de faltas em seu perido aquisitivo', compute='calcular_dias', ) saldo = fields.Float( string=u'Saldo', + help=u'Saldo dos dias de direitos proporcionalmente aos avos ja ' + u'trabalhados no periodo aquisitivo', compute='calcular_saldo_dias', ) + dias_gozados = fields.Float( + string=u'Dias Gozados', + help=u'Quantidade de dias de ferias do periodo aquisitivo que ja foram ' + u'gozados pelo funcionario em outro periodo de ferias', + default=0, + ) + avos = fields.Integer( string=u'Avos', compute='calcular_avos', @@ -181,7 +192,8 @@ def calcular_avos(self): def calcular_saldo_dias(self): for record in self: - record.saldo = record.avos * record.dias_de_direito() / 12.0 + record.saldo = (record.avos * record.dias_de_direito() / 12.0) - \ + record.dias_gozados def calcular_dias(self): for record in self: @@ -203,3 +215,25 @@ def calcular_pagamento_dobro(self): for record in self: pagamento_dobro = (record.dias_pagamento_dobro > 0) record.pagamento_dobro = pagamento_dobro + + def gerar_holidays_ferias(self): + """ + Gera novos pedidos de férias (holidays do tipo 'add') de acordo com as + informaçoes do controle de férias em questão. + """ + vacation_id = self.env.ref( + 'l10n_br_hr_vacation.holiday_status_vacation').id + holiday_id = self.env['hr.holidays'].create({ + 'name': 'Periodo Aquisitivo: %s ate %s' + % (self.inicio_aquisitivo, + self.fim_aquisitivo), + 'employee_id': self.contract_id.employee_id.id, + 'holiday_status_id': vacation_id, + 'type': 'add', + 'holiday_type': 'employee', + 'vacations_days': 30, + 'sold_vacations_days': 0, + 'number_of_days_temp': 30, + 'controle_ferias': self.id, + }) + return holiday_id From 4d49785d3e6f996bd9934502663f1580f70ec734 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 21 Feb 2017 10:37:55 -0300 Subject: [PATCH 006/787] [FIX] Validacao para nao pegar holerites de meses iguais nas medias --- l10n_br_hr_payroll/models/l10n_br_hr_medias.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/l10n_br_hr_payroll/models/l10n_br_hr_medias.py b/l10n_br_hr_payroll/models/l10n_br_hr_medias.py index 6aecac966..48c034d1e 100644 --- a/l10n_br_hr_payroll/models/l10n_br_hr_medias.py +++ b/l10n_br_hr_payroll/models/l10n_br_hr_medias.py @@ -133,7 +133,11 @@ def gerar_media_dos_proventos(self, data_inicio, data_fim, holerite_id): folhas_periodo = folha_obj.search(domain) folhas_periodo = folhas_periodo.sorted(key=lambda r: r.date_from) medias = {} + mes_anterior = '' for folha in folhas_periodo: + if mes_anterior and mes_anterior == folha.mes_do_ano: + continue + mes_anterior = folha.mes_do_ano for linha in folha.line_ids: if linha.salary_rule_id.category_id.code == "PROVENTO" \ and linha.salary_rule_id.tipo_media: From beaf9fcc051f7d453202675562b6b25aaf6e3dfc Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 21 Feb 2017 10:38:40 -0300 Subject: [PATCH 007/787] [WIP] Controle de saldo de dias de ferias do periodo aquisitivo de acordo com dias de ferias gozados --- l10n_br_hr_payroll/models/hr_payslip.py | 30 +++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index c9c86a942..2218f34cd 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1001,6 +1001,36 @@ def compute_sheet(self): raise exceptions.Warning( _('Nenhum Holerite encontrado para médias nesse período!') ) + if not self.holidays_ferias: + raise exceptions.Warning( + _('Nenhum Pedido de Ferias encontrado!') + ) + else: + if self.holidays_ferias.number_of_days_temp > \ + self.periodo_aquisitivo.saldo: + raise exceptions.Warning( + _('Saldo de dias de ferias menor do que o ' + 'periodo selecionado!') + ) + else: + self.periodo_aquisitivo.inicio_gozo = \ + self.holidays_ferias.date_from + self.periodo_aquisitivo.fim_gozo = \ + self.holidays_ferias.date_to + + if self.periodo_aquisitivo.saldo > 0: + controle_ferias_obj = self.env['hr.vacation.control'] + vals = { + 'inicio_aquisitivo': + self.periodo_aquisitivo.inicio_aquisitivo, + 'fim_aquisitivo': + self.periodo_aquisitivo.fim_aquisitivo, + 'contract_id': + self.periodo_aquisitivo.contract_id.id, + 'hr_holiday_ids': + [(6, 0, self.periodo_aquisitivo.hr_holiday_ids.ids)], + } + controle_ferias_obj.create(vals) self.validacao_holerites_anteriores( data_de_inicio, data_final, self.contract_id) From 2c1fe7ddaf9c44e01fa02722c87d1d9cbc968afc Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Wed, 22 Feb 2017 20:57:30 -0300 Subject: [PATCH 008/787] [FIX] Alterado tipo de relacao do holiday com controle_ferias --- .../models/l10n_br_hr_medias.py | 8 ++++-- l10n_br_hr_vacation/models/hr_holidays.py | 19 +++++++++++-- .../models/hr_vacation_control.py | 27 ++++++++++--------- 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/l10n_br_hr_payroll/models/l10n_br_hr_medias.py b/l10n_br_hr_payroll/models/l10n_br_hr_medias.py index 48c034d1e..e611b9436 100644 --- a/l10n_br_hr_payroll/models/l10n_br_hr_medias.py +++ b/l10n_br_hr_payroll/models/l10n_br_hr_medias.py @@ -146,6 +146,7 @@ def gerar_media_dos_proventos(self, data_inicio, data_fim, holerite_id): linha.salary_rule_id.id: [{ 'mes': MES_DO_ANO[folha.mes_do_ano-1][1], + 'ano': folha.ano, 'valor': linha.total, 'rubrica_id': linha.salary_rule_id.id, }] @@ -153,6 +154,7 @@ def gerar_media_dos_proventos(self, data_inicio, data_fim, holerite_id): else: medias[linha.salary_rule_id.id].append({ 'mes': MES_DO_ANO[folha.mes_do_ano-1][1], + 'ano': folha.ano, 'valor': linha.total, 'rubrica_id': linha.salary_rule_id.id, }) @@ -169,14 +171,16 @@ def gerar_media_dos_proventos(self, data_inicio, data_fim, holerite_id): titulo.update({'holerite_id': holerite_id.id}) titulo.update({'linha_de_titulo': True}) for mes in medias[rubrica]: - titulo.update({'mes_' + str(mes_cont): str(mes['mes']), }) + titulo.update({'mes_' + str(mes_cont): + str(mes['mes'])[:3] + + '/' + str(mes['ano']), }) if str(mes['mes']) in meses_titulos: meses_titulos.remove(str(mes['mes'])) meses_titulos.append(str(mes['mes'])) mes_cont += 1 linha_obj.create(titulo) - # definindo a linha + # definindo a linhay for rubrica in medias: vals = {} nome_rubrica = self.env['hr.salary.rule'].\ diff --git a/l10n_br_hr_vacation/models/hr_holidays.py b/l10n_br_hr_vacation/models/hr_holidays.py index abe89ac5b..f337f4412 100644 --- a/l10n_br_hr_vacation/models/hr_holidays.py +++ b/l10n_br_hr_vacation/models/hr_holidays.py @@ -2,8 +2,16 @@ # Copyright 2016 KMEE - Hendrix Costa # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import logging from openerp import api, models, fields +_logger = logging.getLogger(__name__) + +try: + from pybrasil import data +except ImportError: + _logger.info('Cannot import pybrasil') + class HrHolidays(models.Model): _inherit = 'hr.holidays' @@ -45,8 +53,11 @@ class HrHolidays(models.Model): ondelete='restrict', index=True, ) - controle_ferias = fields.Many2one( + controle_ferias = fields.Many2many( comodel_name='hr.vacation.control', + relation='vacation_control_holidays_rel', + column1='holiday_id', + column2='hr_vacation_control_id', string=u'Controle de Férias', ) @@ -92,4 +103,8 @@ def _calculate_sum_vacation_days(self): def _compute_contract(self): if self.parent_id: self.controle_ferias = self.parent_id.controle_ferias - self.name = 'Férias para ' + str(self.employee_id.name) + date_from = data.formata_data(self.date_from) + date_to = data.formata_data(self.date_to) + self.name = \ + self.holiday_status_id.name + \ + ' [' + date_from + '-' + date_to + ']' \ No newline at end of file diff --git a/l10n_br_hr_vacation/models/hr_vacation_control.py b/l10n_br_hr_vacation/models/hr_vacation_control.py index 159e3a71c..5e92e36e3 100644 --- a/l10n_br_hr_vacation/models/hr_vacation_control.py +++ b/l10n_br_hr_vacation/models/hr_vacation_control.py @@ -111,9 +111,11 @@ class HrVacationControl(models.Model): string=u'Contrato Vigente', ) - hr_holiday_ids = fields.One2many( + hr_holiday_ids = fields.Many2many( comodel_name='hr.holidays', - inverse_name='controle_ferias', + relation='vacation_control_holidays_rel', + column1='hr_vacation_control_id', + column2='holiday_id', string='Período Aquisitivo' ) @@ -190,9 +192,10 @@ def calcular_avos(self): else: record.avos = int(avos_decimal) + @api.depends('dias_gozados') def calcular_saldo_dias(self): for record in self: - record.saldo = (record.avos * record.dias_de_direito() / 12.0) - \ + record.saldo = (record.dias_de_direito() * record.avos/ 12.0) - \ record.dias_gozados def calcular_dias(self): @@ -202,14 +205,14 @@ def calcular_dias(self): def calcular_dias_pagamento_dobro(self): for record in self: dias_pagamento_dobro = 0 - if record.fim_gozo > record.fim_concessivo: - dias_pagamento_dobro = ( - fields.Date.from_string(record.fim_gozo) - - fields.Date.from_string(record.fim_concessivo) - ).days - if dias_pagamento_dobro > 30: - dias_pagamento_dobro = 30 - record.dias_pagamento_dobro = dias_pagamento_dobro + # if record.fim_gozo > record.fim_concessivo: + # dias_pagamento_dobro = ( + # fields.Date.from_string(record.fim_gozo) - + # fields.Date.from_string(record.fim_concessivo) + # ).days + # if dias_pagamento_dobro > 30: + # dias_pagamento_dobro = 30 + # record.dias_pagamento_dobro = dias_pagamento_dobro def calcular_pagamento_dobro(self): for record in self: @@ -234,6 +237,6 @@ def gerar_holidays_ferias(self): 'vacations_days': 30, 'sold_vacations_days': 0, 'number_of_days_temp': 30, - 'controle_ferias': self.id, + 'controle_ferias': [(6, 0, [self.id])], }) return holiday_id From f4f8cbb911f12474dbcac83a8d347dc140ed89a0 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Wed, 22 Feb 2017 21:02:17 -0300 Subject: [PATCH 009/787] [FIX] Campos de controle de saldo de dias e periodo aquisitivo --- l10n_br_hr_payroll/models/hr_payslip.py | 131 +++++++++++++----------- l10n_br_hr_payroll/views/hr_payslip.xml | 14 ++- 2 files changed, 83 insertions(+), 62 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 2218f34cd..9e8186524 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -380,39 +380,50 @@ def _buscar_payslip_line(self): string=u"Holerite Resumo", ) - @api.depends('periodo_aquisitivo') - @api.model - def _get_periodo_ferias(self): - for holerite in self: - # if not holerite.periodo_aquisitivo.inicio_gozo: - holidays = holerite.periodo_aquisitivo.hr_holiday_ids - for holiday in holidays: - if holiday.type == 'remove': - holerite.holidays_ferias = holiday - holerite.date_from = holiday.date_from - holerite.date_to = holiday.date_to + @api.onchange('holidays_ferias') + def _set_holidays_ferias(self): + if self.holidays_ferias: + self.periodo_aquisitivo = self.holidays_ferias.controle_ferias[0] + self.date_from = self.holidays_ferias.date_from + self.date_to = self.holidays_ferias.date_to holidays_ferias = fields.Many2one( comodel_name='hr.holidays', - compute=_get_periodo_ferias, string=u'Solicitação de Férias', help=u'Período de férias apontado pelo funcionário em ' u'Pedidos de Férias', ) - @api.depends('contract_id') - @api.model - def _get_periodo_aquisitivo(self): - if self.contract_id: - controles_ferias = self.contract_id.vacation_control_ids - if controles_ferias: - return controles_ferias[0] - periodo_aquisitivo = fields.Many2one( comodel_name='hr.vacation.control', - default='_get_periodo_aquisitivo', string="Período Aquisitivo", domain="[('contract_id','=',contract_id)]", + ) + + @api.depends('periodo_aquisitivo') + def _set_periodo_aquisitivo_readonly(self): + for holerite in self: + holerite.periodo_aquisitivo_readonly = holerite.periodo_aquisitivo + + periodo_aquisitivo_readonly = fields.Many2one( + comodel_name='hr.vacation.control', + string="Período Aquisitivo", + compute='_set_periodo_aquisitivo_readonly', + ) + + @api.depends('periodo_aquisitivo') + @api.model + def _get_saldo_periodo_aquisitivo(self): + for holerite in self: + if holerite.periodo_aquisitivo: + holerite.saldo_periodo_aquisitivo = \ + holerite.periodo_aquisitivo.saldo + + saldo_periodo_aquisitivo = fields.Integer( + string="Saldo de dias do Periodo Aquisitivo", + compute='_get_saldo_periodo_aquisitivo', + help=u'Saldo de dias do funcionaŕio, de acordo com número de faltas' + u'dentro do período aquisitivo selecionado.', store=True, ) @@ -500,17 +511,16 @@ def get_worked_day_lines(self, contract_id, date_from, date_to): 0.0, contract_id ) ] - if hr_contract.vacation_control_ids[0].saldo: - saldo_ferias = hr_contract.vacation_control_ids[0].saldo - else: - saldo_ferias = 0 - result += [ - self.get_attendances( - u'Saldo de dias máximo para Férias', 8, - u'SALDO_FERIAS', saldo_ferias, - 0.0, contract_id - ) - ] + # se o periodo aquisitivo ja estiver definido, pega o saldo de dias + if self.periodo_aquisitivo: + saldo_ferias = self.periodo_aquisitivo.saldo + result += [ + self.get_attendances( + u'Saldo de dias máximo para Férias', 8, + u'SALDO_FERIAS', saldo_ferias, + 0.0, contract_id + ) + ] # get Dias Trabalhados quantidade_dias_trabalhados = \ @@ -1005,35 +1015,36 @@ def compute_sheet(self): raise exceptions.Warning( _('Nenhum Pedido de Ferias encontrado!') ) - else: - if self.holidays_ferias.number_of_days_temp > \ - self.periodo_aquisitivo.saldo: - raise exceptions.Warning( - _('Saldo de dias de ferias menor do que o ' - 'periodo selecionado!') + if self.holidays_ferias.number_of_days_temp > \ + self.saldo_periodo_aquisitivo: + raise exceptions.Warning( + _('Selecionado mais dias de ferias do que o saldo do ' + 'periodo aquisitivo selecionado!') + ) + + # Atualizar o controle de férias com informacao de quantos dias + # o funcionario gozara + self.periodo_aquisitivo.dias_gozados += \ + self.holidays_ferias.number_of_days_temp + + # Caso o funcionario opte por dividir as férias em dois períodos, e + # ainda tenha saldo para tal, uma nova linha de controle de féria + # é criada com base na linha atual + if self.periodo_aquisitivo.saldo > 0: + novo_controle_ferias = self.periodo_aquisitivo.copy() + novas_datas = \ + novo_controle_ferias.calcular_datas_aquisitivo_concessivo( + novo_controle_ferias.inicio_aquisitivo ) - else: - self.periodo_aquisitivo.inicio_gozo = \ - self.holidays_ferias.date_from - self.periodo_aquisitivo.fim_gozo = \ - self.holidays_ferias.date_to - - if self.periodo_aquisitivo.saldo > 0: - controle_ferias_obj = self.env['hr.vacation.control'] - vals = { - 'inicio_aquisitivo': - self.periodo_aquisitivo.inicio_aquisitivo, - 'fim_aquisitivo': - self.periodo_aquisitivo.fim_aquisitivo, - 'contract_id': - self.periodo_aquisitivo.contract_id.id, - 'hr_holiday_ids': - [(6, 0, self.periodo_aquisitivo.hr_holiday_ids.ids)], - } - controle_ferias_obj.create(vals) - - self.validacao_holerites_anteriores( - data_de_inicio, data_final, self.contract_id) + novo_controle_ferias.write(novas_datas) + + # Atualizar o controle de férias com informacoes dos dias gozados + # pelo funcionario de acordo com a payslip de férias + self.periodo_aquisitivo.inicio_gozo = \ + self.holidays_ferias.date_from + self.periodo_aquisitivo.fim_gozo = \ + self.holidays_ferias.date_to + super(HrPayslip, self).compute_sheet() self._valor_total_folha() return True diff --git a/l10n_br_hr_payroll/views/hr_payslip.xml b/l10n_br_hr_payroll/views/hr_payslip.xml index 8fcc02120..0568c8552 100644 --- a/l10n_br_hr_payroll/views/hr_payslip.xml +++ b/l10n_br_hr_payroll/views/hr_payslip.xml @@ -198,7 +198,18 @@ - + + + + + + + @@ -218,7 +229,6 @@ - From ffda7e1f5c11c2ce518bddd42b1c9c5f9eadbef0 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Wed, 22 Feb 2017 21:03:15 -0300 Subject: [PATCH 010/787] [IMP] Add funcao de atualizacao do worked_days_lines e input_lines --- l10n_br_hr_payroll/models/hr_payslip.py | 38 +++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 9e8186524..847af7218 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -910,6 +910,44 @@ def sum(self, code, from_date, to_date=None): result = [value for code, value in result_dict.items()] return result + def atualizar_worked_days_inputs(self): + """ + Atualizar os campos worked_days_line_ids e input_line_ids do holerite. + Com os campos de contrato, employee, date_from e date_to do holerite + ja setados, esse metodo exclui as variaveis base para calculo do + holerite e os instancia novamente atualizando os valore. + :return: Campos atualizados + """ + hr_payslip_worked_days_obj = self.env['hr.payslip.worked_days'] + hr_payslip_input_obj = self.env['hr.payslip.input'] + + for holerite in self: + # delete old worked days lines + if holerite.worked_days_line_ids: + for worked_day_id in holerite.worked_days_line_ids: + worked_day_id.unlink() + # get dict com valores do worked_days_lines + worked_days_line_ids = self.get_worked_day_lines( + holerite.contract_id.id, holerite.date_from, holerite.date_to + ) + # Atrelar o worked_days a payslip atual e instanciar o objeto + for wd_line in worked_days_line_ids: + wd_line['payslip_id'] = self.id + hr_payslip_worked_days_obj.create(wd_line) + + # delete old input lines + if holerite.input_line_ids: + for input_id in holerite.input_line_ids: + input_id.unlink() + # get dict com valores do Inputs_lines + input_line_ids = self.get_inputs( + holerite.contract_id.id, holerite.date_from, holerite.date_to + ) + # Atrelar o Inputs_line a payslip atual e instanciar o objeto + for input_line in input_line_ids: + input_line['payslip_id'] = self.id + hr_payslip_input_obj.create(input_line) + @api.multi def onchange_employee_id(self, date_from, date_to, contract_id): worked_days_obj = self.env['hr.payslip.worked_days'] From d3563a9dcea31a1964aa4a2f70317ed630bd2652 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Wed, 22 Feb 2017 21:04:01 -0300 Subject: [PATCH 011/787] [FIX] Validacoes da payslip --- l10n_br_hr_payroll/models/hr_payslip.py | 28 +++++++++++++++++-------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 847af7218..52a70f815 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -999,7 +999,6 @@ def set_employee_id(self): if record.contract_id: record.employee_id = record.contract_id.employee_id record.employee_id_readonly = record.employee_id - record.periodo_aquisitivo = record._get_periodo_aquisitivo() @api.multi @api.onchange('mes_do_ano', 'ano') @@ -1044,6 +1043,11 @@ def compute_sheet(self): hr_medias_ids, data_de_inicio, data_final = \ self.gerar_media_dos_proventos() + # Metodo pra validar se ja foram processadors todos os holerites + # usados no calculo das medias + self.validacao_holerites_anteriores( + data_de_inicio, data_final, self.contract_id) + if not hr_medias_ids \ and self.tipo_de_folha in ["decimo_terceiro", "ferias"]: raise exceptions.Warning( @@ -1083,6 +1087,7 @@ def compute_sheet(self): self.periodo_aquisitivo.fim_gozo = \ self.holidays_ferias.date_to + self.atualizar_worked_days_inputs() super(HrPayslip, self).compute_sheet() self._valor_total_folha() return True @@ -1107,17 +1112,22 @@ def validacao_holerites_anteriores(self, data_inicio, data_fim, contrato): folhas_sorted = folhas_periodo.sorted(key=lambda r: r.date_from) mes = fields.Date.from_string(data_inicio) + relativedelta(months=-1) + mes_anterior = '' for folha in folhas_sorted: + if mes_anterior and mes_anterior == folha.mes_do_ano: + continue + mes_anterior = folha.mes_do_ano mes = mes + relativedelta(months=1) if folha.mes_do_ano != mes.month: - raise exceptions.ValidationError(_( - "Faltando Holerite confirmado do mês de %s" - ) % MES_DO_ANO[mes.month-1][1]) - - if mes.month != fields.Date.from_string(data_fim).month: - raise exceptions.ValidationError(_( - "Não foi encontrado holerite confirmado do mês de %s" - ) % MES_DO_ANO[mes.month-1][1]) + raise exceptions.ValidationError( + _("Faltando Holerite confirmado do mês de %s de %s") % + (MES_DO_ANO[mes.month-1][1], mes.year)) + mes_final = fields.Date.from_string(data_fim) + if mes.month != mes_final.month: + raise exceptions.ValidationError( + _("Não foi encontrado o último holerite do periodo " + "aquisitivo, \nreferente ao mês de %s de %s") % + (MES_DO_ANO[mes_final.month-1][1], mes_final.year)) @api.multi def gerar_media_dos_proventos(self): From 6ea9e2e5238c352e8270982dab8aa9a10bd2b062 Mon Sep 17 00:00:00 2001 From: gabrielcardoso21 Date: Thu, 23 Feb 2017 09:43:34 -0300 Subject: [PATCH 012/787] =?UTF-8?q?[FIX]=20Cria=C3=A7=C3=A3o=20de=20per?= =?UTF-8?q?=C3=ADodo=20aquisitivo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Na criação do contrato, se a data de início do período aquisitivo fosse hoje, não era criado um controle de férias associado --- l10n_br_hr_vacation/models/hr_contract.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_vacation/models/hr_contract.py b/l10n_br_hr_vacation/models/hr_contract.py index 12cec93d4..34a635d2c 100644 --- a/l10n_br_hr_vacation/models/hr_contract.py +++ b/l10n_br_hr_vacation/models/hr_contract.py @@ -45,7 +45,7 @@ def create(self, vals): lista_controle_ferias = [] controle_ferias_obj = self.env['hr.vacation.control'] - while(inicio < hoje): + while(inicio <= hoje): vals = controle_ferias_obj.calcular_datas_aquisitivo_concessivo( str(inicio) ) From d9f4b7454a60e8b128a80a36b6669a9df94148b4 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Wed, 22 Feb 2017 21:25:17 -0300 Subject: [PATCH 013/787] [FIX] Ajustes nas regras de salario de ferias --- .../data/l10n_br_hr_payroll_data_rubricas.xml | 5 ++--- l10n_br_hr_payroll/models/l10n_br_hr_medias.py | 9 ++++++--- l10n_br_hr_payroll/views/hr_payslip.xml | 2 +- l10n_br_hr_vacation/models/hr_contract.py | 5 ++--- l10n_br_hr_vacation/models/hr_holidays.py | 2 +- l10n_br_hr_vacation/models/hr_vacation_control.py | 9 +++++---- 6 files changed, 17 insertions(+), 15 deletions(-) diff --git a/l10n_br_hr_payroll/data/l10n_br_hr_payroll_data_rubricas.xml b/l10n_br_hr_payroll/data/l10n_br_hr_payroll_data_rubricas.xml index 679bd0aea..4cbb4d1a4 100644 --- a/l10n_br_hr_payroll/data/l10n_br_hr_payroll_data_rubricas.xml +++ b/l10n_br_hr_payroll/data/l10n_br_hr_payroll_data_rubricas.xml @@ -223,8 +223,7 @@ code none - result = MEDIAS.SALARIO.media/12.0 -result_qty = MEDIAS.SALARIO.meses + result = MEDIAS.SALARIO.media @@ -237,7 +236,7 @@ result_qty = MEDIAS.SALARIO.meses code none - result = BASE_FERIAS / worked_days.SALDO_FERIAS.number_of_days + result = BASE_FERIAS / 30 result_qty = worked_days.FERIAS.number_of_days diff --git a/l10n_br_hr_payroll/models/l10n_br_hr_medias.py b/l10n_br_hr_payroll/models/l10n_br_hr_medias.py index e611b9436..cac0adeed 100644 --- a/l10n_br_hr_payroll/models/l10n_br_hr_medias.py +++ b/l10n_br_hr_payroll/models/l10n_br_hr_medias.py @@ -171,9 +171,12 @@ def gerar_media_dos_proventos(self, data_inicio, data_fim, holerite_id): titulo.update({'holerite_id': holerite_id.id}) titulo.update({'linha_de_titulo': True}) for mes in medias[rubrica]: - titulo.update({'mes_' + str(mes_cont): - str(mes['mes'])[:3] + - '/' + str(mes['ano']), }) + titulo.update( + { + 'mes_' + str(mes_cont): + str(mes['mes'])[:3] + '/' + str(mes['ano']), + } + ) if str(mes['mes']) in meses_titulos: meses_titulos.remove(str(mes['mes'])) meses_titulos.append(str(mes['mes'])) diff --git a/l10n_br_hr_payroll/views/hr_payslip.xml b/l10n_br_hr_payroll/views/hr_payslip.xml index 0568c8552..133ca9c24 100644 --- a/l10n_br_hr_payroll/views/hr_payslip.xml +++ b/l10n_br_hr_payroll/views/hr_payslip.xml @@ -168,7 +168,7 @@ - + diff --git a/l10n_br_hr_vacation/models/hr_contract.py b/l10n_br_hr_vacation/models/hr_contract.py index 0daeb7aeb..b3b1e90b2 100644 --- a/l10n_br_hr_vacation/models/hr_contract.py +++ b/l10n_br_hr_vacation/models/hr_contract.py @@ -101,10 +101,9 @@ def atualizar_controle_ferias(self): for ultimo_controle in ultimo_controles: if ultimo_controle.fim_aquisitivo < fields.Date.today(): controle_ferias_obj = self.env['hr.vacation.control'] + hoje = fields.Date.today() vals = controle_ferias_obj.\ - calcular_datas_aquisitivo_concessivo( - fields.Date.today() - ) + calcular_datas_aquisitivo_concessivo(hoje) novo_controle_ferias = controle_ferias_obj.create(vals) novo_controle_ferias.gerar_holidays_ferias() novo_controle_ferias.contract_id = contrato diff --git a/l10n_br_hr_vacation/models/hr_holidays.py b/l10n_br_hr_vacation/models/hr_holidays.py index f337f4412..c0c70aed0 100644 --- a/l10n_br_hr_vacation/models/hr_holidays.py +++ b/l10n_br_hr_vacation/models/hr_holidays.py @@ -107,4 +107,4 @@ def _compute_contract(self): date_to = data.formata_data(self.date_to) self.name = \ self.holiday_status_id.name + \ - ' [' + date_from + '-' + date_to + ']' \ No newline at end of file + ' [' + date_from + '-' + date_to + ']' diff --git a/l10n_br_hr_vacation/models/hr_vacation_control.py b/l10n_br_hr_vacation/models/hr_vacation_control.py index 5e92e36e3..1fd75156f 100644 --- a/l10n_br_hr_vacation/models/hr_vacation_control.py +++ b/l10n_br_hr_vacation/models/hr_vacation_control.py @@ -74,7 +74,7 @@ class HrVacationControl(models.Model): dias_gozados = fields.Float( string=u'Dias Gozados', - help=u'Quantidade de dias de ferias do periodo aquisitivo que ja foram ' + help=u'Quantidade de dias de ferias do periodo aquisitivo que ja foram' u'gozados pelo funcionario em outro periodo de ferias', default=0, ) @@ -195,8 +195,8 @@ def calcular_avos(self): @api.depends('dias_gozados') def calcular_saldo_dias(self): for record in self: - record.saldo = (record.dias_de_direito() * record.avos/ 12.0) - \ - record.dias_gozados + saldo = record.dias_de_direito() * record.avos / 12.0 + record.saldo = saldo - record.dias_gozados def calcular_dias(self): for record in self: @@ -204,7 +204,8 @@ def calcular_dias(self): def calcular_dias_pagamento_dobro(self): for record in self: - dias_pagamento_dobro = 0 + pass + # dias_pagamento_dobro = 0 # if record.fim_gozo > record.fim_concessivo: # dias_pagamento_dobro = ( # fields.Date.from_string(record.fim_gozo) - From 031f6d516669edb2728f2d6c75a3505b02a6d186 Mon Sep 17 00:00:00 2001 From: Ari Caldeira Date: Thu, 23 Feb 2017 14:37:10 -0300 Subject: [PATCH 014/787] =?UTF-8?q?[FIX]=20Tratar=20per=C3=ADodos=20aquisi?= =?UTF-8?q?tivos=20de=20f=C3=A9rias=20somente=20no=20c=C3=A1lculo=20de=20f?= =?UTF-8?q?=C3=A9rias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 64 +++++++++++++------------ 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 52a70f815..d47e2055f 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1053,39 +1053,41 @@ def compute_sheet(self): raise exceptions.Warning( _('Nenhum Holerite encontrado para médias nesse período!') ) - if not self.holidays_ferias: - raise exceptions.Warning( - _('Nenhum Pedido de Ferias encontrado!') - ) - if self.holidays_ferias.number_of_days_temp > \ - self.saldo_periodo_aquisitivo: - raise exceptions.Warning( - _('Selecionado mais dias de ferias do que o saldo do ' - 'periodo aquisitivo selecionado!') - ) - # Atualizar o controle de férias com informacao de quantos dias - # o funcionario gozara - self.periodo_aquisitivo.dias_gozados += \ - self.holidays_ferias.number_of_days_temp - - # Caso o funcionario opte por dividir as férias em dois períodos, e - # ainda tenha saldo para tal, uma nova linha de controle de féria - # é criada com base na linha atual - if self.periodo_aquisitivo.saldo > 0: - novo_controle_ferias = self.periodo_aquisitivo.copy() - novas_datas = \ - novo_controle_ferias.calcular_datas_aquisitivo_concessivo( - novo_controle_ferias.inicio_aquisitivo + if self.tipo_de_folha == 'ferias': + if not self.holidays_ferias: + raise exceptions.Warning( + _('Nenhum Pedido de Ferias encontrado!') + ) + if self.holidays_ferias.number_of_days_temp > \ + self.saldo_periodo_aquisitivo: + raise exceptions.Warning( + _('Selecionado mais dias de ferias do que o saldo do ' + 'periodo aquisitivo selecionado!') ) - novo_controle_ferias.write(novas_datas) - - # Atualizar o controle de férias com informacoes dos dias gozados - # pelo funcionario de acordo com a payslip de férias - self.periodo_aquisitivo.inicio_gozo = \ - self.holidays_ferias.date_from - self.periodo_aquisitivo.fim_gozo = \ - self.holidays_ferias.date_to + + # Atualizar o controle de férias com informacao de quantos dias + # o funcionario gozara + self.periodo_aquisitivo.dias_gozados += \ + self.holidays_ferias.number_of_days_temp + + # Caso o funcionario opte por dividir as férias em dois períodos, e + # ainda tenha saldo para tal, uma nova linha de controle de féria + # é criada com base na linha atual + if self.periodo_aquisitivo.saldo > 0: + novo_controle_ferias = self.periodo_aquisitivo.copy() + novas_datas = \ + novo_controle_ferias.calcular_datas_aquisitivo_concessivo( + novo_controle_ferias.inicio_aquisitivo + ) + novo_controle_ferias.write(novas_datas) + + # Atualizar o controle de férias com informacoes dos dias gozados + # pelo funcionario de acordo com a payslip de férias + self.periodo_aquisitivo.inicio_gozo = \ + self.holidays_ferias.date_from + self.periodo_aquisitivo.fim_gozo = \ + self.holidays_ferias.date_to self.atualizar_worked_days_inputs() super(HrPayslip, self).compute_sheet() From 032133496064e98ca944e7767ac60a1a6698a56d Mon Sep 17 00:00:00 2001 From: Gabriel Cardoso de Faria Date: Thu, 23 Feb 2017 17:43:12 -0300 Subject: [PATCH 015/787] =?UTF-8?q?[FIX]=20C=C3=A1lculo=20de=20m=C3=A9dias?= =?UTF-8?q?=20apenas=20de=20holerites=20com=2015=20dias=20ou=20mais?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/l10n_br_hr_payroll_data_rubricas.xml | 1 + l10n_br_hr_payroll/models/hr_payslip.py | 22 +++++++------------ .../models/l10n_br_hr_medias.py | 6 ++++- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/l10n_br_hr_payroll/data/l10n_br_hr_payroll_data_rubricas.xml b/l10n_br_hr_payroll/data/l10n_br_hr_payroll_data_rubricas.xml index 4cbb4d1a4..90f1966a9 100644 --- a/l10n_br_hr_payroll/data/l10n_br_hr_payroll_data_rubricas.xml +++ b/l10n_br_hr_payroll/data/l10n_br_hr_payroll_data_rubricas.xml @@ -308,6 +308,7 @@ else: + valor diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index d47e2055f..4309fce7e 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1048,12 +1048,6 @@ def compute_sheet(self): self.validacao_holerites_anteriores( data_de_inicio, data_final, self.contract_id) - if not hr_medias_ids \ - and self.tipo_de_folha in ["decimo_terceiro", "ferias"]: - raise exceptions.Warning( - _('Nenhum Holerite encontrado para médias nesse período!') - ) - if self.tipo_de_folha == 'ferias': if not self.holidays_ferias: raise exceptions.Warning( @@ -1071,19 +1065,19 @@ def compute_sheet(self): self.periodo_aquisitivo.dias_gozados += \ self.holidays_ferias.number_of_days_temp - # Caso o funcionario opte por dividir as férias em dois períodos, e - # ainda tenha saldo para tal, uma nova linha de controle de féria - # é criada com base na linha atual + # Caso o funcionario opte por dividir as férias em dois + # períodos, e ainda tenha saldo para tal, uma nova linha de + # controle de féria é criada com base na linha atual if self.periodo_aquisitivo.saldo > 0: novo_controle_ferias = self.periodo_aquisitivo.copy() - novas_datas = \ - novo_controle_ferias.calcular_datas_aquisitivo_concessivo( + novas_datas = novo_controle_ferias.\ + calcular_datas_aquisitivo_concessivo( novo_controle_ferias.inicio_aquisitivo ) novo_controle_ferias.write(novas_datas) - # Atualizar o controle de férias com informacoes dos dias gozados - # pelo funcionario de acordo com a payslip de férias + # Atualizar o controle de férias com informacoes dos dias + # gozados pelo funcionario de acordo com a payslip de férias self.periodo_aquisitivo.inicio_gozo = \ self.holidays_ferias.date_from self.periodo_aquisitivo.fim_gozo = \ @@ -1105,7 +1099,7 @@ def validacao_holerites_anteriores(self, data_inicio, data_fim, contrato): folha_obj = self.env['hr.payslip'] domain = [ ('date_from', '>=', data_inicio), - ('date_to', '<=', data_fim), + ('date_from', '<=', data_fim), ('contract_id', '=', contrato.id), ('state', '=', 'done'), ] diff --git a/l10n_br_hr_payroll/models/l10n_br_hr_medias.py b/l10n_br_hr_payroll/models/l10n_br_hr_medias.py index cac0adeed..b216a965c 100644 --- a/l10n_br_hr_payroll/models/l10n_br_hr_medias.py +++ b/l10n_br_hr_payroll/models/l10n_br_hr_medias.py @@ -126,7 +126,7 @@ def gerar_media_dos_proventos(self, data_inicio, data_fim, holerite_id): folha_obj = self.env['hr.payslip'] domain = [ ('date_from', '>=', data_inicio), - ('date_to', '<=', data_fim), + ('date_from', '<=', data_fim), ('contract_id', '=', holerite_id.contract_id.id), ('state', '=', 'done'), ] @@ -137,6 +137,10 @@ def gerar_media_dos_proventos(self, data_inicio, data_fim, holerite_id): for folha in folhas_periodo: if mes_anterior and mes_anterior == folha.mes_do_ano: continue + primeiro_dia = fields.Date.from_string(folha.date_from) + ultimo_dia = fields.Date.from_string(folha.date_to) + if (ultimo_dia - primeiro_dia).days < 15: + continue mes_anterior = folha.mes_do_ano for linha in folha.line_ids: if linha.salary_rule_id.category_id.code == "PROVENTO" \ From 8d6269f042c083602429d3a0aec7c0b8fc0d1e89 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Fri, 24 Feb 2017 09:22:11 -0300 Subject: [PATCH 016/787] =?UTF-8?q?[IMP]=20Adicionado=20empresa=20padr?= =?UTF-8?q?=C3=A3o=20para=20o=20contrato?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_contract.py | 1 + 1 file changed, 1 insertion(+) diff --git a/l10n_br_hr_payroll/models/hr_contract.py b/l10n_br_hr_payroll/models/hr_contract.py index 31851350e..885fc31be 100644 --- a/l10n_br_hr_payroll/models/hr_contract.py +++ b/l10n_br_hr_payroll/models/hr_contract.py @@ -134,6 +134,7 @@ def _salario_mes(self, data_inicio, data_fim): comodel_name='res.company', string='Empresa', required=True, + default=lambda self: self.env.user.company_id or '', ) # Admissão From 2e2c02d7c7eb05816b711f61019f98f268d6f9e2 Mon Sep 17 00:00:00 2001 From: Gabriel Cardoso de Faria Date: Fri, 24 Feb 2017 16:27:53 -0300 Subject: [PATCH 017/787] [FIX] Onchanges do carregamento de linhas dos holerites --- l10n_br_hr_payroll/models/hr_payslip.py | 4 ---- l10n_br_hr_payroll/views/hr_payslip.xml | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 4309fce7e..03d7111d8 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1005,10 +1005,6 @@ def set_employee_id(self): def buscar_datas_periodo(self): for record in self: record.set_dates() - if record.contract_id: - record.onchange_employee_id( - record.date_from, record.date_to, record.contract_id.id - ) def computar_mes_ano(self): for record in self: diff --git a/l10n_br_hr_payroll/views/hr_payslip.xml b/l10n_br_hr_payroll/views/hr_payslip.xml index 133ca9c24..94656e81d 100644 --- a/l10n_br_hr_payroll/views/hr_payslip.xml +++ b/l10n_br_hr_payroll/views/hr_payslip.xml @@ -222,7 +222,7 @@ até - + From 81cf8913fef08ad581d93e391620314814c85174 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Fri, 24 Feb 2017 19:00:47 -0300 Subject: [PATCH 018/787] [ADD] Adicionado modulo para gerar holerites para testes --- l10n_br_hr_gerador_holerite/README.rst | 87 +++++++++++++++++ l10n_br_hr_gerador_holerite/__init__.py | 5 + l10n_br_hr_gerador_holerite/__openerp__.py | 21 +++++ .../models/__init__.py | 5 + .../models/hr_payslip_gerador.py | 93 +++++++++++++++++++ .../views/hr_payslip_gerador.xml | 43 +++++++++ 6 files changed, 254 insertions(+) create mode 100644 l10n_br_hr_gerador_holerite/README.rst create mode 100644 l10n_br_hr_gerador_holerite/__init__.py create mode 100644 l10n_br_hr_gerador_holerite/__openerp__.py create mode 100644 l10n_br_hr_gerador_holerite/models/__init__.py create mode 100644 l10n_br_hr_gerador_holerite/models/hr_payslip_gerador.py create mode 100644 l10n_br_hr_gerador_holerite/views/hr_payslip_gerador.xml diff --git a/l10n_br_hr_gerador_holerite/README.rst b/l10n_br_hr_gerador_holerite/README.rst new file mode 100644 index 000000000..e6a5e7d31 --- /dev/null +++ b/l10n_br_hr_gerador_holerite/README.rst @@ -0,0 +1,87 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +======================================== +Gerador de Folha de Pagamento Brasileira +======================================== + +Gerador de Holerites para simulações em férias ou 13º salario. + +Installation +============ + +To install this module, you need to: + +#. Do this ... + +Configuration +============= + +To configure this module, you need to: + +#. Go to ... + +.. figure:: path/to/local/image.png + :alt: alternative description + :width: 600 px + +Usage +===== + +To use this module, you need to: + +#. Go to ... + +.. repo_id is available in https://github.com/OCA/maintainer-tools/blob/master/tools/repos_with_ids.txt +.. branch is "8.0" for example + +Known issues / Roadmap +====================== + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smashing it by providing a detailed and welcomed feedback. + +Credits +======= + +Images +------ + +* Odoo Community Association: `Icon `_. + +Contributors +------------ + +* Luis Felipe Miléo +* Matheus Felix +* Rafael da Silva Lima +* Aristides Caldeira + +Funders +------- + +The development of this module has been financially supported by: + +* Company 1 name +* Company 2 name + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/l10n_br_hr_gerador_holerite/__init__.py b/l10n_br_hr_gerador_holerite/__init__.py new file mode 100644 index 000000000..b1e7ef842 --- /dev/null +++ b/l10n_br_hr_gerador_holerite/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 KMEE - Hendrix Costa +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import models diff --git a/l10n_br_hr_gerador_holerite/__openerp__.py b/l10n_br_hr_gerador_holerite/__openerp__.py new file mode 100644 index 000000000..2ab857aca --- /dev/null +++ b/l10n_br_hr_gerador_holerite/__openerp__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 KMEE - Hendrix Costa +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Brazilian Localization HR Payroll Generator', + 'category': 'Localization', + 'license': 'AGPL-3', + 'author': 'KMEE, Odoo Community Association (OCA)', + 'maintainer': 'KMEE', + 'website': 'http://www.kmee.com.br', + 'version': '8.0.1.0.0', + 'depends': [ + 'l10n_br_hr_payroll', + ], + 'data': [ + 'views/hr_payslip_gerador.xml', + ], + 'installable': True, + 'auto_install': False, +} diff --git a/l10n_br_hr_gerador_holerite/models/__init__.py b/l10n_br_hr_gerador_holerite/models/__init__.py new file mode 100644 index 000000000..7d7528c97 --- /dev/null +++ b/l10n_br_hr_gerador_holerite/models/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 KMEE - Hendrix Costa +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import hr_payslip_gerador diff --git a/l10n_br_hr_gerador_holerite/models/hr_payslip_gerador.py b/l10n_br_hr_gerador_holerite/models/hr_payslip_gerador.py new file mode 100644 index 000000000..48b7ff9e0 --- /dev/null +++ b/l10n_br_hr_gerador_holerite/models/hr_payslip_gerador.py @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 KMEE - Hendrix Costa +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import datetime + +from dateutil.relativedelta import relativedelta +from openerp import api, fields, models + +MES_DO_ANO = [ + (1, u'Janeiro'), + (2, u'Fevereiro'), + (3, u'Marco'), + (4, u'Abril'), + (5, u'Maio'), + (6, u'Junho'), + (7, u'Julho'), + (8, u'Agosto'), + (9, u'Setembro'), + (10, u'Outubro'), + (11, u'Novembro'), + (12, u'Dezembro'), +] + + +class HrPayslipGenerator(models.Model): + _name = 'hr.payslip.generator' + + contract_id = fields.Many2one( + comodel_name='hr.contract', + string="Contrato", + ) + + mes_do_ano = fields.Selection( + selection=MES_DO_ANO, + string=u'Mês', + required=True, + default=datetime.now().month, + ) + + ano = fields.Integer( + string=u'Ano', + default=datetime.now().year, + ) + + def processar_holerites(self, holerite): + wd_model = self.env['hr.payslip.worked_days'] + input_model = self.env['hr.payslip.input'] + + holerite.set_employee_id() + + res = holerite.onchange_employee_id( + holerite.date_from, holerite.date_to, holerite.contract_id.id) + + for worked_days_line in res['value']['worked_days_line_ids']: + worked_days_line['payslip_id'] = holerite.id + wd_model.create(worked_days_line) + + for input_line in res['value']['input_line_ids']: + input_line['payslip_id'] = holerite.id + input_model.create(input_line) + + holerite.compute_sheet() + holerite.process_sheet() + + return holerite + + @api.multi + def gerar_holerites(self): + data_inicio_gerador = \ + str(self.ano) + '-' + str(self.mes_do_ano) + '-01' + cont = 0 + + data_inicio = fields.Date.from_string(data_inicio_gerador) + data_fim = data_inicio + relativedelta(months=1, days=-1) + + while cont <= 12: + + payslip_dict = { + 'contract_id': self.contract_id.id, + 'date_from': data_inicio, + 'date_to': data_fim, + 'employee_id': self.contract_id.employee_id.id, + 'mes_do_ano': data_inicio.month, + 'ano': data_inicio.year, + } + + payslip = self.env['hr.payslip'].create(payslip_dict) + self.processar_holerites(payslip) + + data_inicio += relativedelta(months=1) + data_fim = data_inicio + relativedelta(months=1, days=-1) + cont += 1 diff --git a/l10n_br_hr_gerador_holerite/views/hr_payslip_gerador.xml b/l10n_br_hr_gerador_holerite/views/hr_payslip_gerador.xml new file mode 100644 index 000000000..42cafa0e9 --- /dev/null +++ b/l10n_br_hr_gerador_holerite/views/hr_payslip_gerador.xml @@ -0,0 +1,43 @@ + + + + + + l10n_br.hr.payslip.gerador.form + hr.payslip.generator + form + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
From 2d6d7a5d172c8b3ce615620f00a5d920a617505d Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Wed, 12 Apr 2017 18:28:09 -0300 Subject: [PATCH 119/787] [FIX] Adicionado funcao para tirar acentos de alfanumericos --- l10n_br_hr_arquivos_governo/models/l10n_br_hr_grrf.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_grrf.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_grrf.py index e6acb94e8..8f3dfa266 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_grrf.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_grrf.py @@ -3,6 +3,7 @@ # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html import re +from pybrasil.base import tira_acentos class Grrf(object): @@ -30,9 +31,10 @@ def _validar(self, word, tam, tipo='AN'): :return: """ if not word: - word = '' + word = u'' if tipo == 'A': # Alfabetico + word = tira_acentos(word) # tirar tudo que nao for letra do alfabeto word = re.sub('[^a-zA-Z]', ' ', word) # Retirar 2 espaços seguidos @@ -53,11 +55,13 @@ def _validar(self, word, tam, tipo='AN'): elif tipo == 'N': # Numerico # Preenche com zeros a esquerda - + word = re.sub('[^0-9]', '', str(word)) word = str(word).zfill(tam) return word[:tam] elif tipo == 'AN': # Alfanumerico + # Tira acentos da palavras + word = tira_acentos(word) # Preenche com espaço vazio a esquerda return unicode.ljust(unicode(word), tam)[:tam] From fe739fb1a9ccecd9c078838aa2b05e6579090d01 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Wed, 12 Apr 2017 19:20:09 -0300 Subject: [PATCH 120/787] [FIX] Flake 8 --- l10n_br_hr_arquivos_governo/__openerp__.py | 11 +++++------ l10n_br_hr_arquivos_governo/demo/hr_payslip.xml | 15 --------------- .../models/l10n_br_hr_grrf.py | 13 +++++++++---- 3 files changed, 14 insertions(+), 25 deletions(-) delete mode 100644 l10n_br_hr_arquivos_governo/demo/hr_payslip.xml diff --git a/l10n_br_hr_arquivos_governo/__openerp__.py b/l10n_br_hr_arquivos_governo/__openerp__.py index 6595a482c..1bf345729 100644 --- a/l10n_br_hr_arquivos_governo/__openerp__.py +++ b/l10n_br_hr_arquivos_governo/__openerp__.py @@ -4,16 +4,15 @@ { 'name': 'l10n br hr Arquivos Governo', - 'description': """ - Modulo que gera os arquivos txt da folha de pagamento brasileira""", - 'version': '8.0.0.1', + 'version': '8.0.0.0.1', 'license': 'AGPL-3', - 'author': 'Hendrix Costa', - 'website': 'www.kmee.com.br', + 'author': 'KMEE, Odoo Community Association (OCA)', + 'maintainer': 'KMEE', + 'website': 'http://www.kmee.com.br', 'depends': [ 'document', 'l10n_br_hr_payroll', - 'l10n_br_account', # Por causa do Cnae primario + 'l10n_br_account', ], 'data': [ 'security/hr_payslip.xml', diff --git a/l10n_br_hr_arquivos_governo/demo/hr_payslip.xml b/l10n_br_hr_arquivos_governo/demo/hr_payslip.xml deleted file mode 100644 index b9195d30d..000000000 --- a/l10n_br_hr_arquivos_governo/demo/hr_payslip.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_grrf.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_grrf.py index 8f3dfa266..f665b6f43 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_grrf.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_grrf.py @@ -2,8 +2,16 @@ # (c) 2014 Kmee - Luis Felipe Mileo # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html +import logging import re -from pybrasil.base import tira_acentos + + +_logger = logging.getLogger(__name__) + +try: + from pybrasil import tira_acentos +except ImportError: + _logger.info('Cannot import pybrasil') class Grrf(object): @@ -65,9 +73,6 @@ def _validar(self, word, tam, tipo='AN'): # Preenche com espaço vazio a esquerda return unicode.ljust(unicode(word), tam)[:tam] - else: - print 'Tipo invalido. Tipo ==' + tipo - # Informações do Responsavel def _registro_00(self): registro_00 = self.tipo_de_registro_00 From 75b2c31acff35eecc4375d3fdaad8f7bd269438b Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 13 Apr 2017 17:25:23 -0300 Subject: [PATCH 121/787] [ADD] Classe abastrata com metodos comum a outros arquivos --- .../models/__init__.py | 3 +- .../models/abstract_arquivos_governo.py | 75 ++++++++++++++++++ .../{l10n_br_hr_grrf.py => arquivo_grrf.py} | 77 ++----------------- 3 files changed, 84 insertions(+), 71 deletions(-) create mode 100644 l10n_br_hr_arquivos_governo/models/abstract_arquivos_governo.py rename l10n_br_hr_arquivos_governo/models/{l10n_br_hr_grrf.py => arquivo_grrf.py} (80%) diff --git a/l10n_br_hr_arquivos_governo/models/__init__.py b/l10n_br_hr_arquivos_governo/models/__init__.py index 93378a1bf..f3634ef03 100644 --- a/l10n_br_hr_arquivos_governo/models/__init__.py +++ b/l10n_br_hr_arquivos_governo/models/__init__.py @@ -1,2 +1,3 @@ +from . import abstract_arquivos_governo +from . import arquivo_grrf from . import l10n_br_hr_payslip -from . import l10n_br_hr_grrf diff --git a/l10n_br_hr_arquivos_governo/models/abstract_arquivos_governo.py b/l10n_br_hr_arquivos_governo/models/abstract_arquivos_governo.py new file mode 100644 index 000000000..e89360cff --- /dev/null +++ b/l10n_br_hr_arquivos_governo/models/abstract_arquivos_governo.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- +# (c) 2014 Kmee - Luis Felipe Mileo +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +import logging +import re + + +_logger = logging.getLogger(__name__) + +try: + from pybrasil.base import tira_acentos +except ImportError: + _logger.info('Cannot import pybrasil') + + +class AbstractArquivosGoverno(object): + + def _gerar_arquivo_temp(self, text, tipo): + """ + Dado um texto, criar um arquivo temporario, escrever nesse arquivo + fechar o arquivo e retornar o path do arquivo criado + :param text: + :param tipo: + :return: + """ + arq = open('/tmp/'+tipo, 'w') + arq.write(text.encode('utf-8')) + arq.close() + return '/tmp/'+tipo + + def _validar(self, word, tam, tipo='AN'): + """ + Função Genérica utilizada para validação de campos que são gerados + nos arquivos TXT's + :param word: + :param tam: + :param tipo: + :return: + """ + if not word: + word = u'' + + if tipo == 'A': # Alfabetico + word = tira_acentos(word) + # tirar tudo que nao for letra do alfabeto + word = re.sub('[^a-zA-Z]', ' ', word) + # Retirar 2 espaços seguidos + word = re.sub('[ ]+', ' ', word) + return unicode.ljust(unicode(word), tam)[:tam] + + elif tipo == 'D': # Data + # Retira tudo que nao for numeral + data = re.sub(u'[^0-9]', '', str(word)) + return unicode.ljust(unicode(data), tam)[:tam] + + elif tipo == 'V': # Valor + # Pega a parte decimal como inteiro e nas duas ultimas casas + word = int(word * 100) if word else 0 + # Preenche com zeros a esquerda + word = str(word).zfill(tam) + return word[:tam] + + elif tipo == 'N': # Numerico + # Preenche com zeros a esquerda + word = re.sub('[^0-9]', '', str(word)) + word = str(word).zfill(tam) + return word[:tam] + + elif tipo == 'AN': # Alfanumerico + # Tira acentos da palavras + print (word) + word = tira_acentos(word) + # Preenche com espaço vazio a esquerda + return unicode.ljust(unicode(word), tam)[:tam] diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_grrf.py b/l10n_br_hr_arquivos_governo/models/arquivo_grrf.py similarity index 80% rename from l10n_br_hr_arquivos_governo/models/l10n_br_hr_grrf.py rename to l10n_br_hr_arquivos_governo/models/arquivo_grrf.py index f665b6f43..82ca0ad1a 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_grrf.py +++ b/l10n_br_hr_arquivos_governo/models/arquivo_grrf.py @@ -2,76 +2,10 @@ # (c) 2014 Kmee - Luis Felipe Mileo # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html -import logging -import re +from abstract_arquivos_governo import AbstractArquivosGoverno -_logger = logging.getLogger(__name__) - -try: - from pybrasil import tira_acentos -except ImportError: - _logger.info('Cannot import pybrasil') - - -class Grrf(object): - - def _gerar_arquivo_temp(self, text, tipo): - """ - Dado um texto, criar um arquivo temporario, escrever nesse arquivo - fechar o arquivo e retornar o path do arquivo criado - :param text: - :param tipo: - :return: - """ - arq = open('/tmp/'+tipo, 'w') - arq.write(text.encode('utf-8')) - arq.close() - return '/tmp/'+tipo - - def _validar(self, word, tam, tipo='AN'): - """ - Função Genérica utilizada para validação de campos que são gerados - nos arquivos TXT's - :param word: - :param tam: - :param tipo: - :return: - """ - if not word: - word = u'' - - if tipo == 'A': # Alfabetico - word = tira_acentos(word) - # tirar tudo que nao for letra do alfabeto - word = re.sub('[^a-zA-Z]', ' ', word) - # Retirar 2 espaços seguidos - word = re.sub('[ ]+', ' ', word) - return unicode.ljust(unicode(word), tam)[:tam] - - elif tipo == 'D': # Data - # Retira tudo que nao for numeral - data = re.sub(u'[^0-9]', '', str(word)) - return unicode.ljust(unicode(data), tam)[:tam] - - elif tipo == 'V': # Valor - # Pega a parte decimal como inteiro e nas duas ultimas casas - word = int(word * 100) if word else 0 - # Preenche com zeros a esquerda - word = str(word).zfill(tam) - return word[:tam] - - elif tipo == 'N': # Numerico - # Preenche com zeros a esquerda - word = re.sub('[^0-9]', '', str(word)) - word = str(word).zfill(tam) - return word[:tam] - - elif tipo == 'AN': # Alfanumerico - # Tira acentos da palavras - word = tira_acentos(word) - # Preenche com espaço vazio a esquerda - return unicode.ljust(unicode(word), tam)[:tam] +class Grrf(AbstractArquivosGoverno): # Informações do Responsavel def _registro_00(self): @@ -190,8 +124,11 @@ def _registro_90(self): return registro_90 def _gerar_grrf(self): - return self._registro_00() + self._registro_10() + \ - self._registro_40() + self._registro_90() + return \ + self._registro_00() + \ + self._registro_10() + \ + self._registro_40() + \ + self._registro_90() # campos do registro 00 --------------------------------------------------- tipo_de_registro_00 = u'00' # sempre '00' From 36fef2c6d049c7100906ddbab6e5bc0a5a50d8fb Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 13 Apr 2017 17:26:18 -0300 Subject: [PATCH 122/787] [ADD] Classe para gerar Txt do Seguro Desemprego --- .../models/__init__.py | 1 + .../models/arquivo_seguro_desemprego.py | 120 ++++++++++++++++++ .../models/l10n_br_hr_payslip.py | 97 ++++++++++++-- .../views/hr_payslip.xml | 11 +- l10n_br_hr_payroll/models/hr_payslip.py | 5 + 5 files changed, 223 insertions(+), 11 deletions(-) create mode 100644 l10n_br_hr_arquivos_governo/models/arquivo_seguro_desemprego.py diff --git a/l10n_br_hr_arquivos_governo/models/__init__.py b/l10n_br_hr_arquivos_governo/models/__init__.py index f3634ef03..3826e6324 100644 --- a/l10n_br_hr_arquivos_governo/models/__init__.py +++ b/l10n_br_hr_arquivos_governo/models/__init__.py @@ -1,3 +1,4 @@ from . import abstract_arquivos_governo from . import arquivo_grrf +from . import arquivo_seguro_desemprego from . import l10n_br_hr_payslip diff --git a/l10n_br_hr_arquivos_governo/models/arquivo_seguro_desemprego.py b/l10n_br_hr_arquivos_governo/models/arquivo_seguro_desemprego.py new file mode 100644 index 000000000..7897e039a --- /dev/null +++ b/l10n_br_hr_arquivos_governo/models/arquivo_seguro_desemprego.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- +# (c) 2014 Kmee - Luis Felipe Mileo +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from pybrasil.data import hoje + +from abstract_arquivos_governo import AbstractArquivosGoverno + + +class SeguroDesemprego(AbstractArquivosGoverno): + + # HEADER + def _registro_header(self): + registro_header = self.tipo_de_registro_00 + registro_header += self._validar(self.tipo_identificador, 1, 'N') + registro_header += self._validar(self.cnpj_empresa, 14, 'N') + registro_header += self._validar(self.versao_layout, 3, 'N') + registro_header += ''.ljust(280) + registro_header += '\r\n' + return registro_header + + # REQUERIMENTO + def _registro_requerimento(self): + registro01 = self.tipo_de_registro_01 + registro01 += self._validar(self.cpf, 11, 'N') + registro01 += self._validar(self.nome, 40, 'AN') + registro01 += self._validar(self.endereco, 40, 'AN') + registro01 += self._validar(self.complemento, 16, 'AN') + registro01 += self._validar(self.cep, 8, 'N') + registro01 += self._validar(self.uf, 2, 'A') + registro01 += self._validar(self.ddd, 2, 'N') + registro01 += self._validar(self.telefone, 8, 'N') + registro01 += self._validar(self.nome_mae, 40, 'A') + registro01 += self._validar(self.pis, 11, 'N') + registro01 += self._validar(self.carteira_trabalho_numero, 8, 'N') + registro01 += self._validar(self.carteira_trabalho_serie, 5, 'AN') + registro01 += self._validar(self.carteira_trabalho_estado, 2, 'A') + registro01 += self._validar(self.cbo, 6, 'N') + registro01 += self._validar(self.data_admissao, 8, 'D') + registro01 += self._validar(self.data_demissao, 8, 'D') + registro01 += self._validar(self.sexo, 1, 'N') + registro01 += self._validar(self.grau_instrucao, 2, 'N') + registro01 += self._validar(self.data_nascimento, 8, 'D') + registro01 += self._validar(self.horas_trabalhadas_semana, 2, 'N') + registro01 += \ + self._validar(self.remuneracao_antepenultimo_salario, 10, 'N') + registro01 += \ + self._validar(self.remuneracao_penultimo_salario, 10, 'N') + registro01 += self._validar(self.ultimo_salario, 10, 'N') + registro01 += self._validar(self.numero_meses_trabalhados, 2, 'N') + registro01 += self._validar(self.recebeu_6_salario, 1, 'N') + registro01 += self._validar(self.aviso_previo_indenizado, 1, 'N') + registro01 += self._validar(self.codigo_banco, 3, 'N') + registro01 += self._validar(self.codigo_agencia, 4, 'N') + registro01 += self._validar(self.codigo_agencia_digito, 1, 'N') + registro01 += ''.ljust(28) + registro01 += '\r\n' + return registro01 + + def _registro_trailler(self): + registro_trailler = self.tipo_de_registro_99 + registro_trailler += \ + self._validar(self.total_requerimentos_informados, 5, 'N') + registro_trailler += str.ljust('', 293) + registro_trailler += '\r\n' + return registro_trailler + + def _gerar_arquivo_seguro_desemprego(self): + return \ + self._registro_header() + \ + self._registro_requerimento() + \ + self._registro_trailler() + + def __init__(self, *args, **kwargs): + + # campos do HEADER --------------------------------------------------- + self.tipo_de_registro_00 = '00' + self.tipo_identificador = '1' + self.cnpj_empresa = '' + self.versao_layout = '001' + self.empregados = [] + # --------------------------------------------------------------------- + + # campos do REQUERIMENTO ---------------------------------------------- + self.tipo_de_registro_01 = '01' + self.cpf = '' + self.nome = '' + self.endereco = '' + self.complemento = '' + self.cep = '' + self.uf = '' + self.ddd = '' + self.telefone = '' + self.nome_mae = '' + self.pis = '' + self.carteira_trabalho_numero = '' + self.carteira_trabalho_serie = '' + self.carteira_trabalho_estado = '' + self.cbo = '' + self.data_admissao = hoje() + self.data_demissao = hoje() + self.sexo = 'M' + self.grau_instrucao = '01' + self.data_nascimento = hoje() + self.horas_trabalhadas_semana = 44 + self.remuneracao_antepenultimo_salario = 0 + self.remuneracao_penultimo_salario = 0 + self.ultimo_salario = 0 + self.numero_meses_trabalhados = '00' + self.recebeu_6_salario = '0' + self.aviso_previo_indenizado = '1' + self.codigo_banco = '' + self.codigo_agencia = '' + self.codigo_agencia_digito = '' + # --------------------------------------------------------------------- + + # campos do TRAILLER ------------------------------------------------- + self.tipo_de_registro_99 = '99' + self.total_requerimentos_informados = u'' + # --------------------------------------------------------------------- diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_payslip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_payslip.py index 0e2c4c4ff..907677e52 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_payslip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_payslip.py @@ -6,7 +6,8 @@ from openerp import api, fields, exceptions, models, _ -from l10n_br_hr_grrf import Grrf +from arquivo_grrf import Grrf +from arquivo_seguro_desemprego import SeguroDesemprego class HrPayslip(models.Model): @@ -21,24 +22,99 @@ class HrPayslip(models.Model): string=u'Attachments' ) - grrf = fields.Text( + grrf_txt = fields.Text( string='GRRF', ) + seguro_desemprego_txt = fields.Text( + string='Seguro Desemprego', + ) + @api.multi - def compute_grrf(self): + def compute_seguro_desemprego(self): """ Método que inicia o processo para gerar novo GRRF. Disparado na view. :return: """ + for holerite in self: + # Instancia a classe do seguro desemprego + seguro_desemprego = SeguroDesemprego() + # preenche o objeto com informações do holerite de rescisao + self._preencher_seguro_desemprego(holerite, seguro_desemprego) + # Gera o campo texto e atribui ao campo da payslip + holerite.seguro_desemprego_txt = \ + seguro_desemprego._gerar_arquivo_seguro_desemprego() + # Gera um arquivo temporário com o texto do seguro Desemprego + path_arquivo = seguro_desemprego._gerar_arquivo_temp( + holerite.seguro_desemprego_txt, 'SEGURO_DESEMPREGO') + # Gera anexo da payslip + self._gerar_anexo('DESLIGAMENTOS.SD', path_arquivo) + + @api.multi + def compute_grrf(self): + """ + Método que inicia o processo para gerar novo TXt do Seguro Desemprego. + Disparado na view. + :return: + """ for holerite in self: grrf = Grrf() - self._compute_grrf(holerite, grrf) - holerite.grrf = grrf._gerar_grrf() - path_arquivo = grrf._gerar_arquivo_temp(holerite.grrf, 'GRRF') + self._preencher_grrf(holerite, grrf) + holerite.grrf_txt = grrf._gerar_grrf() + path_arquivo = grrf._gerar_arquivo_temp(holerite.grrf_txt, 'GRRF') self._gerar_anexo('grrf.re', path_arquivo) - def _compute_grrf(self, holerite, grrf): + def _preencher_seguro_desemprego(self, holerite, seguro_desemprego): + """ + Dado um holerite de rescisao preencher os campos do objeto de GRRF + :param holerite: + :param seguro_desemprego: + :return: + """ + # HEADER + seguro_desemprego.tipo_de_inscricao_empresa = 1 # 1 (CNPJ) ou 2 (CEI) + seguro_desemprego.cnpj_empresa = self.company_id.cnpj_cpf + + # REQUERIMENTO + funcionario = holerite.contract_id.employee_id + seguro_desemprego.cpf = funcionario.cpf + seguro_desemprego.nome = funcionario.name + seguro_desemprego.endereco = funcionario.address_home_id.street + seguro_desemprego.complemento = funcionario.address_home_id.street2 + seguro_desemprego.cep = funcionario.address_home_id.zip + seguro_desemprego.uf = funcionario.address_home_id.state_id.code + seguro_desemprego.telefone = funcionario.address_home_id.phone + seguro_desemprego.nome_mae = funcionario.mother_name + seguro_desemprego.pis = funcionario.pis_pasep + seguro_desemprego.carteira_trabalho_numero = funcionario.ctps + seguro_desemprego.carteira_trabalho_estado = \ + funcionario.ctps_uf_id.code + seguro_desemprego.CBO = holerite.contract_id.job_id.cbo_id.code + seguro_desemprego.data_admissao = holerite.contract_id.date_start + seguro_desemprego.data_demissao = holerite.contract_id.date_end + seguro_desemprego.sexo = funcionario.gender + seguro_desemprego.grau_instrucao = \ + funcionario.educational_attainment.code + seguro_desemprego.data_nascimento = funcionario.birthday + seguro_desemprego.horas_trabalhadas_semana = \ + holerite.contract_id.weekly_hours + remuneracao_mes_rescisao = 0 + for line in holerite.line_ids: + if line.code == 'BASE_FGTS': + remuneracao_mes_rescisao = line.total + # Get Rubrica do BASE_FGTS + seguro_desemprego.ultimo_salario = remuneracao_mes_rescisao + # self.numero_meses_trabalhados = '00' + # self.recebeu_6_salario = '0' + # self.aviso_previo_indenizado = '1' + self.codigo_banco = '' + self.codigo_agencia = '' + self.codigo_agencia_digito = '' + + # TRAILLER + seguro_desemprego.sequencia = 1 + + def _preencher_grrf(self, holerite, grrf): """ Dado um holerite de rescisao preencher os campos do objeto de GRRF :param holerite: @@ -61,7 +137,7 @@ def _compute_grrf(self, holerite, grrf): grrf.inscricao_da_empresa = self.company_id.cnpj_cpf grrf.razao_social_empresa = self.company_id.legal_name grrf.endereco_empresa = \ - self.company_id.street or '' + self.company_id.number or '' + (self.company_id.street or '') + (self.company_id.number or '') grrf.bairro_empresa = self.company_id.street2 grrf.cep_empresa = self.company_id.zip grrf.cidade_empresa = self.company_id.l10n_br_city_id.name @@ -88,7 +164,6 @@ def _compute_grrf(self, holerite, grrf): grrf.sexo = funcionario.gender grrf.grau_de_instrucao = funcionario.educational_attainment.code grrf.data_nascimento = funcionario.birthday - grrf.qtd_horas_trabalhadas_semana = holerite.contract_id.weekly_hours grrf.CBO = holerite.contract_id.job_id.cbo_id.code # Data admissao grrf.data_opcao = holerite.contract_id.date_start @@ -119,7 +194,9 @@ def _compute_grrf(self, holerite, grrf): grrf.agencia_trabalhador = '' grrf.conta_trabalhador = '' # saldo do FGTS consulta manual na caixa - grrf.saldo_para_fins_rescisorios = holerite.saldo_para_fins_rescisorios + grrf.saldo_para_fins_rescisorios = \ + holerite.saldo_para_fins_rescisorios \ + if holerite.saldo_para_fins_rescisorios else '' def _gerar_anexo(self, nome_do_arquivo, path_arquivo_temp): """ diff --git a/l10n_br_hr_arquivos_governo/views/hr_payslip.xml b/l10n_br_hr_arquivos_governo/views/hr_payslip.xml index ff43fc22e..e8f4e3e3a 100644 --- a/l10n_br_hr_arquivos_governo/views/hr_payslip.xml +++ b/l10n_br_hr_arquivos_governo/views/hr_payslip.xml @@ -16,7 +16,16 @@ + + - - hr.payslip.tree (in l10n_br_hr_payment_order) - hr.payslip - - - - - Hr Payslip - hr.payslip - tree,form - [] - {} - - - - Hr Payslip - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/l10n_br_hr_payment_order/views/payment_order.xml b/l10n_br_hr_payment_order/views/payment_order.xml index 0b72cb3a7..58803f737 100644 --- a/l10n_br_hr_payment_order/views/payment_order.xml +++ b/l10n_br_hr_payment_order/views/payment_order.xml @@ -5,47 +5,47 @@ - - payment.order.form (in l10n_br_hr_payment_order) - payment.order - - - - - + + + + + + + + - - payment.order.search (in l10n_br_hr_payment_order) - payment.order - - - - - + + + + + + + + - - payment.order.tree (in l10n_br_hr_payment_order) - payment.order - - - - - + + + + + + + + - - Payment Order - payment.order - tree,form - [] - {} - + + + + + + + - - Payment Order - - - - + + + + + + From b3fef56b988ca2b91bd9080dc32f0cd8781a2c77 Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Thu, 6 Jul 2017 19:20:02 -0300 Subject: [PATCH 397/787] [ADD] Ligacao entre holerite e linha de pagamento Criado a ligacao entre um holerite para as 'n' linhas de uma ordem de pagamento. --- l10n_br_hr_payment_order/models/hr_payslip.py | 7 +++++++ l10n_br_hr_payment_order/models/payment_order.py | 9 +++++++++ l10n_br_hr_payment_order/views/hr_payslip.xml | 7 +++++++ l10n_br_hr_payment_order/views/payment_order.xml | 11 +++++++++++ 4 files changed, 34 insertions(+) diff --git a/l10n_br_hr_payment_order/models/hr_payslip.py b/l10n_br_hr_payment_order/models/hr_payslip.py index 9579cd3b7..14bf2b5f7 100644 --- a/l10n_br_hr_payment_order/models/hr_payslip.py +++ b/l10n_br_hr_payment_order/models/hr_payslip.py @@ -16,6 +16,12 @@ class HrPayslip(models.Model): # domain="[('type', '=', type)]" ) + payment_line_ids = fields.One2many( + string="Orderns de Pagamento", + comodel_name="payment.line", + inverse_name="payslip_id", + ) + def _compute_set_employee_id(self): super(HrPayslip, self)._compute_set_employee_id() print ('Ajuste o tipo de pagamento') @@ -76,6 +82,7 @@ def create_payment_order_line( # 'currency_id': currency_id, 'amount_currency': total, # date is set when the user confirms the payment order + 'payslip_id': self.id, } return payment_line_model.create(vals) diff --git a/l10n_br_hr_payment_order/models/payment_order.py b/l10n_br_hr_payment_order/models/payment_order.py index 8b11f2d98..65c1ffe38 100644 --- a/l10n_br_hr_payment_order/models/payment_order.py +++ b/l10n_br_hr_payment_order/models/payment_order.py @@ -8,3 +8,12 @@ class PaymentOrder(models.Model): _inherit = 'payment.order' + + +class PaymentLine(models.Model): + _inherit = 'payment.line' + + payslip_id = fields.Many2one( + string="Ref do Holerite", + comodel_name="hr.payslip", + ) diff --git a/l10n_br_hr_payment_order/views/hr_payslip.xml b/l10n_br_hr_payment_order/views/hr_payslip.xml index 1fe217835..878c2762e 100644 --- a/l10n_br_hr_payment_order/views/hr_payslip.xml +++ b/l10n_br_hr_payment_order/views/hr_payslip.xml @@ -20,6 +20,13 @@ + + + + + + + diff --git a/l10n_br_hr_payment_order/views/payment_order.xml b/l10n_br_hr_payment_order/views/payment_order.xml index 58803f737..3f1a157c8 100644 --- a/l10n_br_hr_payment_order/views/payment_order.xml +++ b/l10n_br_hr_payment_order/views/payment_order.xml @@ -47,5 +47,16 @@ + + payment.order.line.payslip + payment.line + + + + + + + + From add0e5af4a3fc5e510d902593dacf7873686825f Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Fri, 7 Jul 2017 09:48:01 -0300 Subject: [PATCH 398/787] [ADD] Aba das ordens de pagamento no holerite Colocado o modulo l10n_br_hr_payment_order como dependencia do modulo. --- l10n_br_hr_payment_order/__openerp__.py | 1 + l10n_br_hr_payment_order/views/hr_payslip.xml | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/l10n_br_hr_payment_order/__openerp__.py b/l10n_br_hr_payment_order/__openerp__.py index e869c9f4d..41d5ccc58 100644 --- a/l10n_br_hr_payment_order/__openerp__.py +++ b/l10n_br_hr_payment_order/__openerp__.py @@ -11,6 +11,7 @@ 'author': 'KMEE,Odoo Community Association (OCA)', 'website': 'www.kmee.com.br', 'depends': [ + 'l10n_br_hr_payroll', 'account_payment', 'account_payment_partner', ], diff --git a/l10n_br_hr_payment_order/views/hr_payslip.xml b/l10n_br_hr_payment_order/views/hr_payslip.xml index 878c2762e..46ec4d236 100644 --- a/l10n_br_hr_payment_order/views/hr_payslip.xml +++ b/l10n_br_hr_payment_order/views/hr_payslip.xml @@ -10,17 +10,17 @@ hr.payslip.form (in l10n_br_hr_payment_order) hr.payslip - + - + - + From 5fe899ad7d8b141fe6e394054fa0edd5526fa144 Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Fri, 7 Jul 2017 15:58:33 -0300 Subject: [PATCH 399/787] [ADD] Automatizar criacao de ordem de pagamento Criado opcao no menu de configuracoes de contabilidade a opcao para gerar automaticamente as ordens de pagamento dos holerites da folha de pagamento. --- l10n_br_hr_payment_order/__openerp__.py | 1 + l10n_br_hr_payment_order/models/__init__.py | 5 ++++ l10n_br_hr_payment_order/models/res_config.py | 13 ++++++++++ .../views/res_config_view.xml | 24 +++++++++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 l10n_br_hr_payment_order/models/res_config.py create mode 100644 l10n_br_hr_payment_order/views/res_config_view.xml diff --git a/l10n_br_hr_payment_order/__openerp__.py b/l10n_br_hr_payment_order/__openerp__.py index 41d5ccc58..d8325a7e3 100644 --- a/l10n_br_hr_payment_order/__openerp__.py +++ b/l10n_br_hr_payment_order/__openerp__.py @@ -20,6 +20,7 @@ 'views/hr_payslip.xml', 'security/payment_order.xml', 'views/payment_order.xml', + 'views/res_config_view.xml', ], 'demo': [ 'demo/hr_payslip.xml', diff --git a/l10n_br_hr_payment_order/models/__init__.py b/l10n_br_hr_payment_order/models/__init__.py index 4e419c04e..9b503acb7 100644 --- a/l10n_br_hr_payment_order/models/__init__.py +++ b/l10n_br_hr_payment_order/models/__init__.py @@ -1,2 +1,7 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 KMEE +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + from . import payment_order from . import hr_payslip +from . import res_config diff --git a/l10n_br_hr_payment_order/models/res_config.py b/l10n_br_hr_payment_order/models/res_config.py new file mode 100644 index 000000000..f0020bd49 --- /dev/null +++ b/l10n_br_hr_payment_order/models/res_config.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 KMEE +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp import api, fields, models, _ + + +class AccountResConfig(models.Model): + _inherit = "account.config.settings" + + automated_payslip_payment_order = fields.Boolean( + string="Gerar Ordem de Pagamento dos Holerites Automaticamente", + ) diff --git a/l10n_br_hr_payment_order/views/res_config_view.xml b/l10n_br_hr_payment_order/views/res_config_view.xml new file mode 100644 index 000000000..e8b8587f1 --- /dev/null +++ b/l10n_br_hr_payment_order/views/res_config_view.xml @@ -0,0 +1,24 @@ + + + + + + account.settings + account.config.settings + + + + + + + + + + + + From d2fc509a69dce3f6cbabbbd55c3b54f3dc25f37b Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Fri, 7 Jul 2017 16:13:23 -0300 Subject: [PATCH 400/787] [ADD] Marcar rubrica a ser paga do holerite Campo para verificar se a rubrica ira criar ordem de pagamento. --- l10n_br_hr_payment_order/__openerp__.py | 1 + l10n_br_hr_payment_order/models/__init__.py | 1 + .../models/hr_salary_rule.py | 13 +++++++++++++ .../views/hr_salary_rule_view.xml | 17 +++++++++++++++++ 4 files changed, 32 insertions(+) create mode 100644 l10n_br_hr_payment_order/models/hr_salary_rule.py create mode 100644 l10n_br_hr_payment_order/views/hr_salary_rule_view.xml diff --git a/l10n_br_hr_payment_order/__openerp__.py b/l10n_br_hr_payment_order/__openerp__.py index d8325a7e3..ebbfc49f2 100644 --- a/l10n_br_hr_payment_order/__openerp__.py +++ b/l10n_br_hr_payment_order/__openerp__.py @@ -21,6 +21,7 @@ 'security/payment_order.xml', 'views/payment_order.xml', 'views/res_config_view.xml', + 'views/hr_salary_rule_view.xml', ], 'demo': [ 'demo/hr_payslip.xml', diff --git a/l10n_br_hr_payment_order/models/__init__.py b/l10n_br_hr_payment_order/models/__init__.py index 9b503acb7..e680cf1a5 100644 --- a/l10n_br_hr_payment_order/models/__init__.py +++ b/l10n_br_hr_payment_order/models/__init__.py @@ -5,3 +5,4 @@ from . import payment_order from . import hr_payslip from . import res_config +from . import hr_salary_rule diff --git a/l10n_br_hr_payment_order/models/hr_salary_rule.py b/l10n_br_hr_payment_order/models/hr_salary_rule.py new file mode 100644 index 000000000..02d4a64d7 --- /dev/null +++ b/l10n_br_hr_payment_order/models/hr_salary_rule.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 KMEE +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp import models, fields + + +class HrSalaryRule(models.Model): + _inherit = "hr.salary.rule" + + eh_pagavel = fields.Boolean( + string="É pagavel" + ) diff --git a/l10n_br_hr_payment_order/views/hr_salary_rule_view.xml b/l10n_br_hr_payment_order/views/hr_salary_rule_view.xml new file mode 100644 index 000000000..b9c61d9b0 --- /dev/null +++ b/l10n_br_hr_payment_order/views/hr_salary_rule_view.xml @@ -0,0 +1,17 @@ + + + + + + hr.salary.rule.payment + hr.salary.rule + + + + + + + + + + From b879539dc393a01caf01bfca055bff1ec5ca0245 Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Fri, 7 Jul 2017 17:31:07 -0300 Subject: [PATCH 401/787] [ADD] Wizard para busca das linhas dos holerites Criado botao e o wizard para buscar as linhas pagaveis do(s) holerite(s) para que seja criado ordens de pagamento. --- l10n_br_hr_payment_order/__init__.py | 5 ++ l10n_br_hr_payment_order/__openerp__.py | 1 + .../views/payment_order.xml | 11 ++++ l10n_br_hr_payment_order/wizard/__init__.py | 5 ++ .../wizard/payslip_payment_create_order.py | 22 ++++++++ .../payslip_payment_create_order_view.xml | 50 +++++++++++++++++++ 6 files changed, 94 insertions(+) create mode 100644 l10n_br_hr_payment_order/wizard/__init__.py create mode 100644 l10n_br_hr_payment_order/wizard/payslip_payment_create_order.py create mode 100644 l10n_br_hr_payment_order/wizard/payslip_payment_create_order_view.xml diff --git a/l10n_br_hr_payment_order/__init__.py b/l10n_br_hr_payment_order/__init__.py index 0650744f6..ec485ab97 100644 --- a/l10n_br_hr_payment_order/__init__.py +++ b/l10n_br_hr_payment_order/__init__.py @@ -1 +1,6 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 KMEE +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + from . import models +from . import wizard diff --git a/l10n_br_hr_payment_order/__openerp__.py b/l10n_br_hr_payment_order/__openerp__.py index ebbfc49f2..79454873e 100644 --- a/l10n_br_hr_payment_order/__openerp__.py +++ b/l10n_br_hr_payment_order/__openerp__.py @@ -17,6 +17,7 @@ ], 'data': [ 'security/hr_payslip.xml', + 'wizard/payslip_payment_create_order_view.xml', 'views/hr_payslip.xml', 'security/payment_order.xml', 'views/payment_order.xml', diff --git a/l10n_br_hr_payment_order/views/payment_order.xml b/l10n_br_hr_payment_order/views/payment_order.xml index 3f1a157c8..9dce9379e 100644 --- a/l10n_br_hr_payment_order/views/payment_order.xml +++ b/l10n_br_hr_payment_order/views/payment_order.xml @@ -46,6 +46,17 @@ + + payment.order.payslip + payment.order + + + + - - - + + + + + + + + diff --git a/l10n_br_hr_payment_order/views/payment_order.xml b/l10n_br_hr_payment_order/views/payment_order.xml index 9dce9379e..3f1a157c8 100644 --- a/l10n_br_hr_payment_order/views/payment_order.xml +++ b/l10n_br_hr_payment_order/views/payment_order.xml @@ -46,17 +46,6 @@ - - payment.order.payslip - payment.order - - - - From 5ad0925b39697714c77cd74ca0d3777eadb42d94 Mon Sep 17 00:00:00 2001 From: the-bmb Date: Thu, 13 Jul 2017 08:24:17 -0300 Subject: [PATCH 428/787] [REM] status payment_line --- .../models/payment_order.py | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/l10n_br_hr_payment_order/models/payment_order.py b/l10n_br_hr_payment_order/models/payment_order.py index 741b98674..83d46dcf4 100644 --- a/l10n_br_hr_payment_order/models/payment_order.py +++ b/l10n_br_hr_payment_order/models/payment_order.py @@ -4,12 +4,6 @@ from openerp import fields, models -STATUS = [('draft', 'Rascunho'), - ('done', 'Confirmado'), - ('paid', 'Pago'), - ('error', 'Erro'), - ('cancel', 'Cancelado')] - class PaymentOrder(models.Model): @@ -25,25 +19,7 @@ def action_done(self): class PaymentLine(models.Model): _inherit = 'payment.line' - # order_id - status = fields.Selection( - selection=STATUS, - default='draft', - string='Status', - readonly=True, - ) payslip_id = fields.Many2one( string="Ref do Holerite", comodel_name="hr.payslip", ) - - def action_done(self): - self.status = 'done' - - # FIXME - def action_paid(self): - self.status = 'paid' - - # Caso de retorno - def verify_error(self): - pass \ No newline at end of file From e7a2063040478901cd0126b83de52fbab0ed6412 Mon Sep 17 00:00:00 2001 From: the-bmb Date: Thu, 13 Jul 2017 08:24:17 -0300 Subject: [PATCH 429/787] [REM] status payment_line --- l10n_br_hr_payment_order/__openerp__.py | 1 - .../payment_line_workflow.xml | 83 ------------------- .../views/payment_order.xml | 5 -- 3 files changed, 89 deletions(-) delete mode 100644 l10n_br_hr_payment_order/payment_line_workflow.xml diff --git a/l10n_br_hr_payment_order/__openerp__.py b/l10n_br_hr_payment_order/__openerp__.py index d7200c41c..756889276 100644 --- a/l10n_br_hr_payment_order/__openerp__.py +++ b/l10n_br_hr_payment_order/__openerp__.py @@ -25,7 +25,6 @@ 'views/res_config_view.xml', 'views/hr_salary_rule_view.xml', 'hr_payroll_workflow.xml', - 'payment_line_workflow.xml', ], 'demo': [ 'demo/hr_payslip.xml', diff --git a/l10n_br_hr_payment_order/payment_line_workflow.xml b/l10n_br_hr_payment_order/payment_line_workflow.xml deleted file mode 100644 index 79457eb20..000000000 --- a/l10n_br_hr_payment_order/payment_line_workflow.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - payment.line.basic - payment.line - True - - - - - draft - True - function - write({'status': 'draft'}) - OR - - - - - error - verify_error() - function - - - - - - cancel - cancel_sheet() - function - - - - - done - action_done() - function - True - - - - - done - action_paid() - function - True - - - - - - action_done - - - - - - cancel_sheet - - - - - - draft - - - - - - cancel_sheet - - - - - - - - - - diff --git a/l10n_br_hr_payment_order/views/payment_order.xml b/l10n_br_hr_payment_order/views/payment_order.xml index df1f83f98..edd08d8cb 100644 --- a/l10n_br_hr_payment_order/views/payment_order.xml +++ b/l10n_br_hr_payment_order/views/payment_order.xml @@ -14,11 +14,6 @@ From 6dc3ff843d8fc0f6f67ee5d84933ee50765c6203 Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Thu, 13 Jul 2017 17:48:32 -0300 Subject: [PATCH 443/787] [FIX] Workflow da folha de pagamento Corrigido o workflow para alterar o state do holerite para concluido quando todas as payment.lines associadas fiquem no 'state2' paid. --- cnab_payslip/hr_payroll_workflow.xml | 1 + cnab_payslip/models/hr_payslip.py | 18 +++++++++--------- cnab_payslip/views/hr_payslip.xml | 3 +++ l10n_br_hr_payment_order/models/__init__.py | 1 + .../models/bank_payment_line.py | 11 +++++++++++ l10n_br_hr_payment_order/views/hr_payslip.xml | 9 +-------- 6 files changed, 26 insertions(+), 17 deletions(-) create mode 100644 l10n_br_hr_payment_order/models/bank_payment_line.py diff --git a/cnab_payslip/hr_payroll_workflow.xml b/cnab_payslip/hr_payroll_workflow.xml index ea8c1ddcb..6e6ccd3d0 100644 --- a/cnab_payslip/hr_payroll_workflow.xml +++ b/cnab_payslip/hr_payroll_workflow.xml @@ -8,6 +8,7 @@ + paid_order diff --git a/cnab_payslip/models/hr_payslip.py b/cnab_payslip/models/hr_payslip.py index 77b012213..3ab84a023 100644 --- a/cnab_payslip/models/hr_payslip.py +++ b/cnab_payslip/models/hr_payslip.py @@ -2,30 +2,30 @@ # Copyright 2017 KMEE # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from openerp import api, fields, models, _ -from openerp.exceptions import Warning as UserError +from openerp import api, fields, models class HrPayslip(models.Model): - _inherit = 'hr.payslip' paid_order = fields.Boolean( compute='_compute_paid', - default=False, - store=False, + readonly=True, + store=True, ) - # confirmar os states + @api.multi def test_paid(self): if not self.payment_line_ids: return False for line in self.payment_line_ids: - print line.status - if line.status in ('draft', 'done', 'error'): + if not line.state2: + return False + if line.state2 != 'paid': return False return True - @api.depends('payment_line_ids') + @api.one + @api.depends('payment_line_ids.bank_line_id.state2') def _compute_paid(self): self.paid_order = self.test_paid() diff --git a/cnab_payslip/views/hr_payslip.xml b/cnab_payslip/views/hr_payslip.xml index 67ac16477..927314359 100644 --- a/cnab_payslip/views/hr_payslip.xml +++ b/cnab_payslip/views/hr_payslip.xml @@ -9,6 +9,9 @@ hr.payslip + diff --git a/l10n_br_hr_payment_order/models/__init__.py b/l10n_br_hr_payment_order/models/__init__.py index e680cf1a5..13cc8e0af 100644 --- a/l10n_br_hr_payment_order/models/__init__.py +++ b/l10n_br_hr_payment_order/models/__init__.py @@ -6,3 +6,4 @@ from . import hr_payslip from . import res_config from . import hr_salary_rule +from . import bank_payment_line diff --git a/l10n_br_hr_payment_order/models/bank_payment_line.py b/l10n_br_hr_payment_order/models/bank_payment_line.py new file mode 100644 index 000000000..bdd50691e --- /dev/null +++ b/l10n_br_hr_payment_order/models/bank_payment_line.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +from openerp import models, fields + + +class BankPaymentLine(models.Model): + _inherit = 'bank.payment.line' + + payslip_id = fields.Many2one( + string="Holerite", + comodel_name="hr.payslip" + ) diff --git a/l10n_br_hr_payment_order/views/hr_payslip.xml b/l10n_br_hr_payment_order/views/hr_payslip.xml index 42e1b2362..9a9e01fb5 100644 --- a/l10n_br_hr_payment_order/views/hr_payslip.xml +++ b/l10n_br_hr_payment_order/views/hr_payslip.xml @@ -23,14 +23,7 @@ - - - - - - - - + From 05ff028a0be9b9a23d64d50b29a06448c1585cdc Mon Sep 17 00:00:00 2001 From: the-bmb Date: Thu, 13 Jul 2017 18:16:40 -0300 Subject: [PATCH 444/787] =?UTF-8?q?[FIX]=20permiss=C3=A3o=20de=20cria?= =?UTF-8?q?=C3=A7=C3=A3o=20wizard=20holerite=20do=20payment=5Forder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payment_order/security/ir.model.access.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payment_order/security/ir.model.access.csv b/l10n_br_hr_payment_order/security/ir.model.access.csv index f77221252..2be2aa486 100644 --- a/l10n_br_hr_payment_order/security/ir.model.access.csv +++ b/l10n_br_hr_payment_order/security/ir.model.access.csv @@ -1,3 +1,3 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -access_payslip_payment_order_create,access_payslip_payment_order_create,model_payslip_payment_order_create,,1,0,0,0 +access_payslip_payment_order_create,access_payslip_payment_order_create,model_payslip_payment_order_create,,1,0,1,0 access_account_config_settings,access_account_config_settings,model_account_config_settings,,1,0,0,0 \ No newline at end of file From 7809b8d8df23d0184d93bfd519b13c94341807d6 Mon Sep 17 00:00:00 2001 From: the-bmb Date: Thu, 13 Jul 2017 18:51:06 -0300 Subject: [PATCH 445/787] [FIX] state no search de done para verify --- l10n_br_hr_payment_order/wizard/payslip_payment_create_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payment_order/wizard/payslip_payment_create_order.py b/l10n_br_hr_payment_order/wizard/payslip_payment_create_order.py index c631c71da..0e9be1b3a 100644 --- a/l10n_br_hr_payment_order/wizard/payslip_payment_create_order.py +++ b/l10n_br_hr_payment_order/wizard/payslip_payment_create_order.py @@ -57,7 +57,7 @@ def buscar_linhas_holerites(self): ('tipo_de_folha', '=', self.tipo_de_folha), ('mes_do_ano', '=', self.mes_do_ano), ('ano', '=', self.ano), - ('state', '=', 'done') + ('state', '=', 'verify') ] ) rubricas_obj = self.env['hr.salary.rule'] From 62aa8a848814eaedc39538319c1424933e2c561d Mon Sep 17 00:00:00 2001 From: Gabriel Cardoso de Faria Date: Thu, 13 Jul 2017 20:21:42 -0300 Subject: [PATCH 446/787] [ADD] Campo conta_bancaria_id no contrato --- l10n_br_hr_payment_order/__openerp__.py | 1 + l10n_br_hr_payment_order/models/__init__.py | 1 + l10n_br_hr_payment_order/models/hr_contract.py | 14 ++++++++++++++ l10n_br_hr_payment_order/views/hr_contract.xml | 14 ++++++++++++++ 4 files changed, 30 insertions(+) create mode 100644 l10n_br_hr_payment_order/models/hr_contract.py create mode 100644 l10n_br_hr_payment_order/views/hr_contract.xml diff --git a/l10n_br_hr_payment_order/__openerp__.py b/l10n_br_hr_payment_order/__openerp__.py index 756889276..29160d65d 100644 --- a/l10n_br_hr_payment_order/__openerp__.py +++ b/l10n_br_hr_payment_order/__openerp__.py @@ -25,6 +25,7 @@ 'views/res_config_view.xml', 'views/hr_salary_rule_view.xml', 'hr_payroll_workflow.xml', + 'views/hr_contract.xml', ], 'demo': [ 'demo/hr_payslip.xml', diff --git a/l10n_br_hr_payment_order/models/__init__.py b/l10n_br_hr_payment_order/models/__init__.py index 13cc8e0af..254fb69b1 100644 --- a/l10n_br_hr_payment_order/models/__init__.py +++ b/l10n_br_hr_payment_order/models/__init__.py @@ -7,3 +7,4 @@ from . import res_config from . import hr_salary_rule from . import bank_payment_line +from . import hr_contract diff --git a/l10n_br_hr_payment_order/models/hr_contract.py b/l10n_br_hr_payment_order/models/hr_contract.py new file mode 100644 index 000000000..101f5aff1 --- /dev/null +++ b/l10n_br_hr_payment_order/models/hr_contract.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 KMEE - Gabriel Cardoso de Faria +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp import fields, models + + +class HrContract(models.Model): + _inherit = 'hr.contract' + + conta_bancaria_id = fields.Many2one( + comodel_name='res.partner.bank', + required=True + ) diff --git a/l10n_br_hr_payment_order/views/hr_contract.xml b/l10n_br_hr_payment_order/views/hr_contract.xml new file mode 100644 index 000000000..920cbf461 --- /dev/null +++ b/l10n_br_hr_payment_order/views/hr_contract.xml @@ -0,0 +1,14 @@ + + + + l10n_br_hr_vacation.contract.form + hr.contract + + + + + + + + + \ No newline at end of file From 01a0718d1221b4696c40259ad041517c3195e82a Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Fri, 14 Jul 2017 11:08:02 -0300 Subject: [PATCH 447/787] =?UTF-8?q?[Fix]=20Mudar=20m=C3=A9todo=20=5Fverifi?= =?UTF-8?q?car=5Fferias=5Fvencidas=20para=20api.one?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index f0b26f539..fb15b998c 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -856,7 +856,7 @@ def buscar_estruturas_salario(self): return estrutura_provisao_decimo_terceiro @api.depends('contract_id', 'date_from', 'date_to') - @api.multi + @api.one def _verificar_ferias_vencidas(self): periodo_ferias_vencida = self.env['hr.vacation.control'].search( [ From dc51d73a899fc74d41e56369c03d6ea0c9e7527d Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Fri, 14 Jul 2017 14:02:55 -0300 Subject: [PATCH 448/787] [FIX] Cancel workflow da payment.order --- l10n_br_hr_payment_order/__openerp__.py | 1 + .../models/payment_order.py | 36 ++++++++++--------- .../models/payment_order_workflow.xml | 0 3 files changed, 20 insertions(+), 17 deletions(-) create mode 100644 l10n_br_hr_payment_order/models/payment_order_workflow.xml diff --git a/l10n_br_hr_payment_order/__openerp__.py b/l10n_br_hr_payment_order/__openerp__.py index 29160d65d..e5f4d81e3 100644 --- a/l10n_br_hr_payment_order/__openerp__.py +++ b/l10n_br_hr_payment_order/__openerp__.py @@ -25,6 +25,7 @@ 'views/res_config_view.xml', 'views/hr_salary_rule_view.xml', 'hr_payroll_workflow.xml', + 'payment_order_workflow.xml', 'views/hr_contract.xml', ], 'demo': [ diff --git a/l10n_br_hr_payment_order/models/payment_order.py b/l10n_br_hr_payment_order/models/payment_order.py index 48a1a11b3..a6d80220c 100644 --- a/l10n_br_hr_payment_order/models/payment_order.py +++ b/l10n_br_hr_payment_order/models/payment_order.py @@ -2,24 +2,26 @@ # Copyright 2017 KMEE # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from openerp import fields, models +from openerp import api, fields, models -class PaymentLine(models.Model): - _inherit = 'payment.line' +class PaymentOrder(models.Model): + _inherit = 'payment.order' + + @api.multi + def cancel(self): + for line in self.line_ids: + line.write({'payslip_id': ''}) + self.write({'state': 'cancel'}) + return True +dels - payslip_id = fields.Many2one( - string="Ref do Holerite", - comodel_name="hr.payslip", - ) - # def action_done(self): - # self.status = 'done' - # - # # FIXME - # def action_paid(self): - # self.status = 'paid' - # - # # Caso de retorno - # def verify_error(self): - # pass +class PaymentOrder(models.Model): + _inherit = 'payment.order' + + @api.multi + def cancel(self): + for line in self.line_ids: + line.write({'payslomodel_name="hr.payslip", + ) diff --git a/l10n_br_hr_payment_order/models/payment_order_workflow.xml b/l10n_br_hr_payment_order/models/payment_order_workflow.xml new file mode 100644 index 000000000..e69de29bb From 82555f38967206f4aa90952de7e81bb75e1e6881 Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Fri, 14 Jul 2017 14:03:33 -0300 Subject: [PATCH 449/787] [FIX] Tornar invisivel botao voltar para rascunho --- l10n_br_hr_payment_order/views/payment_order.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/l10n_br_hr_payment_order/views/payment_order.xml b/l10n_br_hr_payment_order/views/payment_order.xml index edd08d8cb..68e33baa0 100644 --- a/l10n_br_hr_payment_order/views/payment_order.xml +++ b/l10n_br_hr_payment_order/views/payment_order.xml @@ -14,6 +14,9 @@ - - - - - - - - diff --git a/l10n_br_hr_payment_order/__openerp__.py b/l10n_br_hr_payment_order/__openerp__.py index e5f4d81e3..b7a93fa41 100644 --- a/l10n_br_hr_payment_order/__openerp__.py +++ b/l10n_br_hr_payment_order/__openerp__.py @@ -14,6 +14,7 @@ 'l10n_br_hr_payroll', 'account_payment', 'account_payment_partner', + 'l10n_br_account_banking_payment_cnab', ], 'data': [ 'security/hr_payslip.xml', diff --git a/l10n_br_hr_payment_order/hr_payroll_workflow.xml b/l10n_br_hr_payment_order/hr_payroll_workflow.xml index 189e50655..6e6ccd3d0 100644 --- a/l10n_br_hr_payment_order/hr_payroll_workflow.xml +++ b/l10n_br_hr_payment_order/hr_payroll_workflow.xml @@ -6,8 +6,10 @@ - True - action_done + + + + paid_order diff --git a/l10n_br_hr_payment_order/models/hr_payslip.py b/l10n_br_hr_payment_order/models/hr_payslip.py index c1bed9b7e..d51d11533 100644 --- a/l10n_br_hr_payment_order/models/hr_payslip.py +++ b/l10n_br_hr_payment_order/models/hr_payslip.py @@ -22,6 +22,28 @@ class HrPayslip(models.Model): inverse_name="payslip_id", ) + paid_order = fields.Boolean( + compute='_compute_paid', + readonly=True, + store=True, + ) + + @api.multi + def test_paid(self): + if not self.payment_line_ids: + return False + for line in self.payment_line_ids: + if not line.state2: + return False + if line.state2 != 'paid': + return False + return True + + @api.one + @api.depends('payment_line_ids.bank_line_id.state2') + def _compute_paid(self): + self.paid_order = self.test_paid() + def _compute_set_employee_id(self): super(HrPayslip, self)._compute_set_employee_id() for record in self: diff --git a/l10n_br_hr_payment_order/views/hr_payslip.xml b/l10n_br_hr_payment_order/views/hr_payslip.xml index 9a9e01fb5..a4a565ee7 100644 --- a/l10n_br_hr_payment_order/views/hr_payslip.xml +++ b/l10n_br_hr_payment_order/views/hr_payslip.xml @@ -12,6 +12,12 @@ hr.payslip + + + + From fac85812963a45391c92a1f8c669d5823bb69a7d Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Sat, 15 Jul 2017 22:51:57 -0300 Subject: [PATCH 453/787] [ADD] Setar regras de liquido de salario e de pensao como regras que devem ser pagas pelas ordens de pagamento --- l10n_br_hr_payment_order/__openerp__.py | 1 + l10n_br_hr_payment_order/data/hr_salary_rule.xml | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 l10n_br_hr_payment_order/data/hr_salary_rule.xml diff --git a/l10n_br_hr_payment_order/__openerp__.py b/l10n_br_hr_payment_order/__openerp__.py index b7a93fa41..8961dd6eb 100644 --- a/l10n_br_hr_payment_order/__openerp__.py +++ b/l10n_br_hr_payment_order/__openerp__.py @@ -17,6 +17,7 @@ 'l10n_br_account_banking_payment_cnab', ], 'data': [ + 'data/hr_salary_rule.xml', 'security/hr_payslip.xml', 'security/payment_order.xml', 'security/ir.model.access.csv', diff --git a/l10n_br_hr_payment_order/data/hr_salary_rule.xml b/l10n_br_hr_payment_order/data/hr_salary_rule.xml new file mode 100644 index 000000000..15eca9911 --- /dev/null +++ b/l10n_br_hr_payment_order/data/hr_salary_rule.xml @@ -0,0 +1,16 @@ + + + + + + + True + + + + True + + + + From bb7698e5094adfb4f478ae48b5647fb82c88614f Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Sat, 15 Jul 2017 22:53:32 -0300 Subject: [PATCH 454/787] [FIX] Erro de singleton ao atualizar modulo --- l10n_br_hr_payroll/models/hr_payslip.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 816eec3bd..f391ec440 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -885,15 +885,14 @@ def buscar_estruturas_salario(self): @api.depends('contract_id', 'date_from', 'date_to') @api.multi def _verificar_ferias_vencidas(self): - periodo_ferias_vencida = self.env['hr.vacation.control'].search( - [ - ('contract_id', '=', self.contract_id.id), - ('fim_aquisitivo', '<', self.date_from), - ('fim_concessivo', '>=', self.date_to), + for record in self: + periodo_ferias_vencida = self.env['hr.vacation.control'].search([ + ('contract_id', '=', record.contract_id.id), + ('fim_aquisitivo', '<', record.date_from), + ('fim_concessivo', '>=', record.date_to), ('inicio_gozo', '=', False), - ], order='fim_aquisitivo desc' - ) - return periodo_ferias_vencida + ], order='fim_aquisitivo desc') + return periodo_ferias_vencida @api.multi def gerar_simulacao( From 6e204feab0ff05da93b0ad20f3610d15539a654f Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 17 Jul 2017 11:28:51 -0300 Subject: [PATCH 455/787] [IMP] Dependencias externas --- .travis.yml | 1 + oca_dependencies.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index d474521da..56296ba46 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,6 +26,7 @@ install: - pip install pytz - pip install pyparsing - pip install git+https://github.com/aricaldeira/pybrasil.git@bb8d47a415a973bb2a823e1f7a480d77f3e22ef8 + - pip install pyboleto - travis_install_nightly script: diff --git a/oca_dependencies.txt b/oca_dependencies.txt index f0083d7a9..d6cb3159f 100644 --- a/oca_dependencies.txt +++ b/oca_dependencies.txt @@ -2,3 +2,4 @@ server-tools https://github.com/OCA/server-tools.git account-fiscal-rule https://github.com/OCA/account-fiscal-rule.git l10n-brazil https://github.com/OCA/l10n-brazil.git bank-payment https://github.com/OCA/bank-payment.git +odoo-brazil-banking https://github.com/kmee/odoo-brazil-banking.git fix/refactory_module_payment_mode From ab442482ed68eaa684578ab6596977bd49f89130 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 17 Jul 2017 14:15:38 -0300 Subject: [PATCH 456/787] =?UTF-8?q?[FIX]=20Instala=C3=A7=C3=A3o=20cnab=20t?= =?UTF-8?q?ravis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 56296ba46..db829f14b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,6 +26,7 @@ install: - pip install pytz - pip install pyparsing - pip install git+https://github.com/aricaldeira/pybrasil.git@bb8d47a415a973bb2a823e1f7a480d77f3e22ef8 + - pip install git+https://github.com/kmee/cnab240.git@feature/pagamento - pip install pyboleto - travis_install_nightly From bd22b367c566d9281818d82b085baf5b331b0040 Mon Sep 17 00:00:00 2001 From: Daniel Sadamo Hirayama Date: Tue, 18 Jul 2017 12:23:01 -0300 Subject: [PATCH 457/787] [FIX]flake8, class oe_chatter out of form tag --- l10n_br_hr_arquivos_governo/models/l10n_br_hr_caged.py | 6 +++--- l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py | 7 +++---- l10n_br_hr_arquivos_governo/views/l10n_br_hr_caged.xml | 4 ++-- l10n_br_hr_arquivos_governo/views/l10n_br_hr_sefip.xml | 4 ++-- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_caged.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_caged.py index bb85acfbc..11f69657b 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_caged.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_caged.py @@ -88,8 +88,8 @@ class HrCaged(models.Model): comodel_name='res.users', string=u'Responsável', default=lambda self: self.env.user, - readonly = True, - states = {'draft': [('readonly', False)]}, + readonly=True, + states={'draft': [('readonly', False)]}, ) @api.depends('responsavel') @@ -434,7 +434,7 @@ def _gerar_anexo(self, nome_do_arquivo, path_arquivo_temp): caged_attachment_data = { 'name': 'Arquivo Caged', - 'attachment_ids': [(0,0, attachment_data)], + 'attachment_ids': [(0, 0, attachment_data)], 'caged_id': self.id, } caged_attach_obj.create(caged_attachment_data) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index 11e1e4513..b733dc49f 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -475,13 +475,13 @@ def _valida_centralizadora(self, companies): for company in companies: options.append(company.centralizadora) if '1' in options: - if not '2' in options: + if '2' not in options: raise ValidationError( _(u'Existe uma empresa centralizadora porém não ' u'existe nenhuma centralizada') ) if '2' in options: - if not '1' in options: + if '1' not in options: raise ValidationError( _(u'Existe uma empresa centralizada porém não ' u'existe nenhuma centralizadora') @@ -507,7 +507,6 @@ def valida_anexos(self): 'aplicativo na aba "Arquivos Anexos" para confirmar o envio') ) - @api.multi def action_sent(self): for record in self: @@ -1105,7 +1104,7 @@ def _gerar_anexo(self, nome_do_arquivo, path_arquivo_temp): sefip_attachment_data = { 'name': 'Arquivo SEFIP', 'sefip_id': self.id, - 'attachment_ids': [(0,0, attachment_data)], + 'attachment_ids': [(0, 0, attachment_data)], 'type': 'sent' } sefip_attachment_obj.create(sefip_attachment_data) diff --git a/l10n_br_hr_arquivos_governo/views/l10n_br_hr_caged.xml b/l10n_br_hr_arquivos_governo/views/l10n_br_hr_caged.xml index 19e6298f3..1ae068811 100644 --- a/l10n_br_hr_arquivos_governo/views/l10n_br_hr_caged.xml +++ b/l10n_br_hr_arquivos_governo/views/l10n_br_hr_caged.xml @@ -68,13 +68,13 @@ - -
+
+ diff --git a/l10n_br_hr_arquivos_governo/views/l10n_br_hr_sefip.xml b/l10n_br_hr_arquivos_governo/views/l10n_br_hr_sefip.xml index 63ee5d47b..725391d0f 100644 --- a/l10n_br_hr_arquivos_governo/views/l10n_br_hr_sefip.xml +++ b/l10n_br_hr_arquivos_governo/views/l10n_br_hr_sefip.xml @@ -101,13 +101,13 @@ - -
+
+ From 272e434ab5498d126e80dfd494a7ccee38d94bd9 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 18 Jul 2017 17:10:06 -0300 Subject: [PATCH 458/787] Update hr_contract.xml --- l10n_br_hr_payment_order/views/hr_contract.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payment_order/views/hr_contract.xml b/l10n_br_hr_payment_order/views/hr_contract.xml index 920cbf461..3899ea00a 100644 --- a/l10n_br_hr_payment_order/views/hr_contract.xml +++ b/l10n_br_hr_payment_order/views/hr_contract.xml @@ -11,4 +11,4 @@ - \ No newline at end of file + From c5655dee51770d316c2b85024af3a46dc6d4dbb9 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 18 Jul 2017 20:01:56 -0300 Subject: [PATCH 459/787] [FIX] String de campos --- l10n_br_hr_payment_order/models/hr_contract.py | 3 ++- l10n_br_hr_payment_order/models/hr_salary_rule.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_payment_order/models/hr_contract.py b/l10n_br_hr_payment_order/models/hr_contract.py index 101f5aff1..db3baf080 100644 --- a/l10n_br_hr_payment_order/models/hr_contract.py +++ b/l10n_br_hr_payment_order/models/hr_contract.py @@ -9,6 +9,7 @@ class HrContract(models.Model): _inherit = 'hr.contract' conta_bancaria_id = fields.Many2one( + string="Conta bancaria", comodel_name='res.partner.bank', - required=True + required=True, ) diff --git a/l10n_br_hr_payment_order/models/hr_salary_rule.py b/l10n_br_hr_payment_order/models/hr_salary_rule.py index 02d4a64d7..5b9c84311 100644 --- a/l10n_br_hr_payment_order/models/hr_salary_rule.py +++ b/l10n_br_hr_payment_order/models/hr_salary_rule.py @@ -9,5 +9,5 @@ class HrSalaryRule(models.Model): _inherit = "hr.salary.rule" eh_pagavel = fields.Boolean( - string="É pagavel" + string="É pagavel?" ) From 6f9e89754b672a6e90d0917d07b0d4820ca3b68f Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 18 Jul 2017 20:02:31 -0300 Subject: [PATCH 460/787] =?UTF-8?q?[FIX]=20Ajuste=20para=20pegar=20informa?= =?UTF-8?q?=C3=A7oes=20bancarias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payment_order/models/hr_payslip.py | 2 +- .../wizard/payslip_payment_create_order.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/l10n_br_hr_payment_order/models/hr_payslip.py b/l10n_br_hr_payment_order/models/hr_payslip.py index d51d11533..befd52227 100644 --- a/l10n_br_hr_payment_order/models/hr_payslip.py +++ b/l10n_br_hr_payment_order/models/hr_payslip.py @@ -76,7 +76,7 @@ def create_payment_order_line( payment_line_model = self.env['payment.line'] vals = { 'order_id': payment_order.id, - # 'partner_bank_id': self.partner_bank_id.id, + 'bank_id': self.contract_id.conta_bancaria_id.id, 'partner_id': partner_id.id, # 'move_line_id': self.id, 'communication': communication, diff --git a/l10n_br_hr_payment_order/wizard/payslip_payment_create_order.py b/l10n_br_hr_payment_order/wizard/payslip_payment_create_order.py index 0e9be1b3a..13686c6bf 100644 --- a/l10n_br_hr_payment_order/wizard/payslip_payment_create_order.py +++ b/l10n_br_hr_payment_order/wizard/payslip_payment_create_order.py @@ -98,8 +98,7 @@ def _preparar_linha_do_holerite(self, payment, line): amount_currency = line.total res = { 'amount_currency': amount_currency, - 'bank_id': - line.contract_id.employee_id.bank_account_id.id, + 'bank_id': line.contract_id.conta_bancaria_id.id, 'order_id': payment.id, 'partner_id': line.partner_id and line.partner_id.id or False, # account banking From 74712c9ae83ab97167dbb96e5d52fb9c89566c87 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 18 Jul 2017 20:02:49 -0300 Subject: [PATCH 461/787] [REM] Arquivo obsoleto --- l10n_br_hr_payment_order/models/payment_order_workflow.xml | 0 l10n_br_hr_payment_order/payment_order_workflow.xml | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 l10n_br_hr_payment_order/models/payment_order_workflow.xml diff --git a/l10n_br_hr_payment_order/models/payment_order_workflow.xml b/l10n_br_hr_payment_order/models/payment_order_workflow.xml deleted file mode 100644 index e69de29bb..000000000 diff --git a/l10n_br_hr_payment_order/payment_order_workflow.xml b/l10n_br_hr_payment_order/payment_order_workflow.xml index aa7045c27..e52aa37a7 100644 --- a/l10n_br_hr_payment_order/payment_order_workflow.xml +++ b/l10n_br_hr_payment_order/payment_order_workflow.xml @@ -1,4 +1,5 @@ + @@ -11,4 +12,4 @@ - \ No newline at end of file + From 9af514858d56c45942698f5f678497a852743e02 Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Wed, 19 Jul 2017 17:54:46 -0300 Subject: [PATCH 462/787] [FIX] Parent_id na geracao do hr backup --- l10n_br_hr_backup/models/hr_backup.py | 12 ++++++++---- l10n_br_hr_backup/models/hr_payroll_structure.py | 4 ++-- l10n_br_hr_backup/models/hr_salary_rule.py | 1 - 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/l10n_br_hr_backup/models/hr_backup.py b/l10n_br_hr_backup/models/hr_backup.py index 57d4a2f03..8cac4aed5 100644 --- a/l10n_br_hr_backup/models/hr_backup.py +++ b/l10n_br_hr_backup/models/hr_backup.py @@ -27,10 +27,14 @@ def get_many_to_one_field(self, field_val, field_name, field_val = field_val._get_external_ids().get(field_val.id)[0] elif criar_model_data: - self.registrar_modelo_ir_model_data(field_val) - _logger.info('Criado ir_model_data do Objeto relacional %s ' - 'do modelo %s - %s' % - (field_name, field_val._name, field_val.name)) + # self.registrar_modelo_ir_model_data(field_val) + # _logger.info('Criado ir_model_data do Objeto relacional %s ' + # 'do modelo %s - %s' % + # (field_name, field_val._name, field_val.name)) + field_val = 'l10n_br_hr_payroll.' + \ + str(field_val._model).replace('.', '_') +\ + '_' + field_val.code + else: _logger.info( diff --git a/l10n_br_hr_backup/models/hr_payroll_structure.py b/l10n_br_hr_backup/models/hr_payroll_structure.py index 8a6d63a7f..1dbe92a3d 100644 --- a/l10n_br_hr_backup/models/hr_payroll_structure.py +++ b/l10n_br_hr_backup/models/hr_payroll_structure.py @@ -36,8 +36,8 @@ def _compute_xml_rubrica(self): regra.ferias, 'ferias', criar_model_data=True) record += backup.get_many_to_one_field( regra.parent_id, 'parent_id', criar_model_data=True) - record += backup.get_many_to_many( - regra.children_ids, 'children_ids') + # record += backup.get_many_to_many( + # regra.children_ids, 'children_ids') record += backup.get_many_to_one_field( regra.company_id, 'company_id') record += backup.get_text_field( diff --git a/l10n_br_hr_backup/models/hr_salary_rule.py b/l10n_br_hr_backup/models/hr_salary_rule.py index d4560762e..42fa46912 100644 --- a/l10n_br_hr_backup/models/hr_salary_rule.py +++ b/l10n_br_hr_backup/models/hr_salary_rule.py @@ -87,7 +87,6 @@ def _compute_xml_rubrica(self): record += backup.get_text_field( regra.custom_quantity, 'custom_quantity') record += backup.get_text_field(regra.tipo_media, 'tipo_media') - record += backup.get_many_to_one_field( regra.parent_rule_id, 'parent_rule_id', criar_model_data=True) record += backup.get_many_to_one_field( From 643a8a27cd3f78987abd4ec6ee298688f8b85948 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Wed, 19 Jul 2017 18:52:34 -0300 Subject: [PATCH 463/787] [FIX] PEP8 --- l10n_br_hr_backup/models/hr_backup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/l10n_br_hr_backup/models/hr_backup.py b/l10n_br_hr_backup/models/hr_backup.py index 8cac4aed5..7e77d9aa4 100644 --- a/l10n_br_hr_backup/models/hr_backup.py +++ b/l10n_br_hr_backup/models/hr_backup.py @@ -35,7 +35,6 @@ def get_many_to_one_field(self, field_val, field_name, str(field_val._model).replace('.', '_') +\ '_' + field_val.code - else: _logger.info( "Informacao do campo %s no modelo %s nao foi salva." From 0cecd387c91b0cd4862dfed8f909bfb35b5887fd Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 20 Jul 2017 10:56:53 -0300 Subject: [PATCH 464/787] =?UTF-8?q?[ADD]=20Confirmar=20todos=20os=20Holeri?= =?UTF-8?q?tes=20de=20um=20Lote=20no=20bot=C3=A3o=20Fechar=20Lote?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/hr_payslip_run.py | 42 ++++++++++--------- l10n_br_hr_payroll/models/hr_payslip_run.py | 7 ++++ 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/l10n_br_hr_payment_order/models/hr_payslip_run.py b/l10n_br_hr_payment_order/models/hr_payslip_run.py index a0abeb566..8b92d450f 100644 --- a/l10n_br_hr_payment_order/models/hr_payslip_run.py +++ b/l10n_br_hr_payment_order/models/hr_payslip_run.py @@ -10,22 +10,26 @@ class HrPayslipRun(models.Model): @api.multi def gerar_holerites(self): - self.verificar_holerites_gerados() - for contrato in self.contract_id: - try: - payslip_obj = self.env['hr.payslip'] - payslip = payslip_obj.create({ - 'contract_id': contrato.id, - 'mes_do_ano': self.mes_do_ano, - 'ano': self.ano, - 'employee_id': contrato.employee_id.id, - 'tipo_de_folha': self.tipo_de_folha, - 'payslip_run_id': self.id, - }) - payslip._compute_set_dates() - payslip.compute_sheet() - payslip.hr_verify_sheet() - except: - payslip.unlink() - continue - self.verificar_holerites_gerados() + for lote in self: + lote.verificar_holerites_gerados() + for contrato in lote.contract_id: + try: + payslip_obj = self.env['hr.payslip'] + payslip = payslip_obj.create({ + 'contract_id': contrato.id, + 'mes_do_ano': self.mes_do_ano, + 'ano': self.ano, + 'employee_id': contrato.employee_id.id, + 'tipo_de_folha': self.tipo_de_folha, + 'payslip_run_id': self.id, + }) + payslip._compute_set_dates() + payslip.compute_sheet() + # Mudado o processo para executar o hr_verify_sheet no + # botão "Close" do Lote do Holerite ao invés do botão + # "Gerar Holerites" + #payslip.hr_verify_sheet() + except: + payslip.unlink() + continue + lote.verificar_holerites_gerados() diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index c8b6f42cd..e485ae0ba 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -127,3 +127,10 @@ def gerar_holerites(self): payslip.unlink() continue self.verificar_holerites_gerados() + + @api.multi + def close_payslip_run(self): + for lote in self: + for holerite in lote.slip_ids: + holerite.hr_verify_sheet() + super(HrPayslipRun, self).close_payslip_run() From 4eb6fa76824b6089cd438d951695472bad883c88 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 20 Jul 2017 18:34:30 -0300 Subject: [PATCH 465/787] =?UTF-8?q?fixup!=20[ADD]=20Confirmar=20todos=20os?= =?UTF-8?q?=20Holerites=20de=20um=20Lote=20no=20bot=C3=A3o=20Fechar=20Lote?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payment_order/models/hr_payslip_run.py | 4 ++-- l10n_br_hr_payroll/models/hr_payslip_run.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/l10n_br_hr_payment_order/models/hr_payslip_run.py b/l10n_br_hr_payment_order/models/hr_payslip_run.py index 8b92d450f..3091414d5 100644 --- a/l10n_br_hr_payment_order/models/hr_payslip_run.py +++ b/l10n_br_hr_payment_order/models/hr_payslip_run.py @@ -25,10 +25,10 @@ def gerar_holerites(self): }) payslip._compute_set_dates() payslip.compute_sheet() - # Mudado o processo para executar o hr_verify_sheet no + # Mudado o processo para executar o hr_verify_sheet no # botão "Close" do Lote do Holerite ao invés do botão # "Gerar Holerites" - #payslip.hr_verify_sheet() + # payslip.hr_verify_sheet() except: payslip.unlink() continue diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index e485ae0ba..c60ef4701 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -131,6 +131,6 @@ def gerar_holerites(self): @api.multi def close_payslip_run(self): for lote in self: - for holerite in lote.slip_ids: + for holerite in lote.slip_ids: holerite.hr_verify_sheet() super(HrPayslipRun, self).close_payslip_run() From 9eab7b360996253ba4672af31476fdf07aeb1657 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 20 Jul 2017 19:28:38 -0300 Subject: [PATCH 466/787] [FIX] Remove xml from salary rules and structures --- l10n_br_hr_payroll/__openerp__.py | 4 +- .../data/l10n_br_hr_payroll_estruturas.xml | 380 -- .../data/l10n_br_hr_payroll_rubricas.xml | 3275 ----------------- 3 files changed, 2 insertions(+), 3657 deletions(-) delete mode 100644 l10n_br_hr_payroll/data/l10n_br_hr_payroll_estruturas.xml delete mode 100644 l10n_br_hr_payroll/data/l10n_br_hr_payroll_rubricas.xml diff --git a/l10n_br_hr_payroll/__openerp__.py b/l10n_br_hr_payroll/__openerp__.py index 4314b126b..445cea86d 100644 --- a/l10n_br_hr_payroll/__openerp__.py +++ b/l10n_br_hr_payroll/__openerp__.py @@ -23,8 +23,8 @@ 'data': [ 'data/l10n_br_hr_payroll_categorias.xml', 'data/l10n_br_hr_contract_sequence.xml', - 'data/l10n_br_hr_payroll_rubricas.xml', - 'data/l10n_br_hr_payroll_estruturas.xml', +# 'data/l10n_br_hr_payroll_rubricas.xml', +# 'data/l10n_br_hr_payroll_estruturas.xml', 'data/l10n_br_hr_tabela_INSS.xml', 'data/l10n_br_hr_tabela_IR.xml', 'data/l10n_br_hr_tabela_IR_dependente.xml', diff --git a/l10n_br_hr_payroll/data/l10n_br_hr_payroll_estruturas.xml b/l10n_br_hr_payroll/data/l10n_br_hr_payroll_estruturas.xml deleted file mode 100644 index 37b5c379b..000000000 --- a/l10n_br_hr_payroll/data/l10n_br_hr_payroll_estruturas.xml +++ /dev/null @@ -1,380 +0,0 @@ - - - - - - - - - - - - - - - - - BASE_IRPF_SEM_INSS - Base para IRPF (sem INSS) - - - - - - - - - - - - - - - HONORARIO_PRESIDENTE - Honorario Presidente - - - - - - - - - - - - - - - JUSTA_CAUSA - Rescisão dispensa com justa causa - - - - - - - - - - rescisao - - - - - COMPLEMENTO_JUSTA_CAUSA - Rescisão Complementar (dispensa com justa causa) - - - - - - - - - - rescisao - - - - - PROVISAO_DECIMO_TERCEIRO - Provisão de Décimo Terceiro (13º) - - - - - - - - - - - - - - - PROVISAO_FERIAS - Provisão de Férias - - - - - - - - - - - - - - - FUNCIONARIO_CEDIDO - Funcionário Cedido - - - - - - - - - - normal - - - - - HONORARIO_DIRETORIA_SEM_INSS - Honorário Diretoria (sem INSS) - - - - - - - - - - normal - - - - - - - - FERIAS - Férias - - - - - - - - - - ferias - - - - - BASE_INSS_IRPF - Base para INSS e IRPF - - - - - - - - - - - - - - - BASE_FGTS - Base para FGTS - - - - - - - - - - - - - - - FUNCAO_COMISSIONADA - Função Comissionada - - - - - - - - - - - - - - - HONORARIO_PRESIDENTE - Honorario Presidente - - - - - - - - - - - - - - - HONORARIO_DIRETORIA - Honorario Diretoria - - - - - - - - - - - - - - - HONORARIO_CONSELHO - Honorario Conselho - - - - - - - - - - - - - - - PRIMEIRA_PARCELA_13 - Primeira Parcela 13 Salário - - - - - - - - - - - - - - - SEGUNDA_PARCELA_13 - Segunda Parcela 13 Salário - - - - - - - - - - - - - - - JUSTA_CAUSA - Rescisão dispensa com justa causa - - - - - - - - - - rescisao - - - - - RESCISAO - Rescisão - - - - - - - - - - rescisao - - - - - COMPLEMENTO_JUSTA_CAUSA - Rescisão Complementar (dispensa com justa causa) - - - - - - - - - - rescisao - - - - - PROVISAO_DECIMO_TERCEIRO - Provisão de Décimo Terceiro (13º) - - - - - - - - - - - - - - - PROVISAO_FERIAS - Provisão de Férias - - - - - - - - - - - - - - - diff --git a/l10n_br_hr_payroll/data/l10n_br_hr_payroll_rubricas.xml b/l10n_br_hr_payroll/data/l10n_br_hr_payroll_rubricas.xml deleted file mode 100644 index 5ded69232..000000000 --- a/l10n_br_hr_payroll/data/l10n_br_hr_payroll_rubricas.xml +++ /dev/null @@ -1,3275 +0,0 @@ - - - - - - - - - - - - - - BRUTO - Bruto - True - 201.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = categories.PROVENTO + categories.FERIAS - - code - code - - - - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - LIQUIDO - Líquido - True - 799.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = BRUTO - TOTAL_DESCONTOS - - code - code - - - - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - INSS - INSS - True - 402.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = CALCULAR.INSS(BASE_INSS) - base = BASE_INSS - -if 'BASE_INSS_FERIAS' in locals(): - base += BASE_INSS_FERIAS - -result = CALCULAR.INSS(base) - -if 'INSS_FERIAS' in locals(): - result -= INSS_FERIAS - -if result < 0: - result = 0 - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - IRPF - IRPF - True - 502.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = CALCULAR.IRRF(BASE_IRPF, INSS if 'INSS' in locals() else 0) - result = CALCULAR.IRRF(BASE_IRPF, INSS if 'INSS' in locals() else 0) - -if 'IRPF_PROPORCIONAL_REGULAR' in locals() or 'IRPF_PROPORCIONAL_FERIAS' in locals(): - result = IRPF_PROPORCIONAL_REGULAR - result += IRPF_PROPORCIONAL_FERIAS - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - BASE_INSS - Base INSS - True - 401.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = BASE_INSS - result = BRUTO - code - code - - - - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - BASE_IRPF - Base IRRF - True - 501.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = CALCULAR.BASE_IRRF(BASE_IR, INSS if 'INSS' in locals() else 0) - base = BASE_IR -inss = INSS if 'INSS' in locals() else 0 - -if 'PENSAO_ALIMENTICIA' in locals(): - base -= PENSAO_ALIMENTICIA - -result = CALCULAR.BASE_IRRF(base, inss) - -if 'BASE_IRPF_PROPORCIONAL_REGULAR' in locals() or 'BASE_IRPF_PROPORCIONAL_FERIAS' in locals(): - result = BASE_IRPF_PROPORCIONAL_REGULAR - result += BASE_IRPF_PROPORCIONAL_FERIAS - - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - TOTAL_DESCONTOS - Total de Descontos - True - 701.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = categories.DEDUCAO + INSS if 'INSS' in locals() else 0 + IRPF if 'IRPF' in locals() else 0 - result = categories.DEDUCAO -result += INSS if 'INSS' in locals() else 0 -result += IRPF if 'IRPF' in locals() else 0 - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - BASE_FGTS - Base FGTS - True - 601.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = BASE_FGTS - result = BASE_FGTS - -if 'BASE_INSS_FERIAS' in locals(): - result += BASE_INSS_FERIAS - code - code - - - - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - FGTS - FGTS - True - 602.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = BASE_FGTS * 0.08 - - code - code - - - - - - 8.0 - contract.wage - - - True - contract.wage - - - - - 1.0 - - - - - - - - - INSS_EMPRESA_BASE - INSS Empresa Base - True - 701.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result=BASE_INSS -if 'BASE_INSS_13' in locals(): - result+=BASE_INSS_13 - - - code - code - - - - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - INSS_DEDUCAO_PREVIDENCIARIA - INSS Dedução Previdenciária - True - 702.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result=0 -if 'SALARIO_FAMILIA' in locals(): - result+=SALARIO_FAMILIA -if 'LICENCA_MATERNIDADE' in locals(): - result+=LICENCA_MATERNIDADE - - - code - code - - - - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - INSS_EMPRESA - INSS Empresa - True - 703.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result=INSS_EMPRESA_BASE -result_rate=RAT_FAP.total_rate - - - code - code - - - - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - INSS_OUTRAS_ENTIDADES - INSS Outras Entidades - True - 704.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result=INSS_EMPRESA_BASE -result_rate=RAT_FAP.other_entities_rate - - - code - code - - - - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - INSS_RAT_FAP - INSS RAT/FAP - True - 705.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result=INSS_EMPRESA_BASE -result_rate=RAT_FAP.rat_rate*RAT_FAP.fap_rate - - - code - code - - - - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - INSS_EMPRESA_TOTAL - INSS Empresa Total - True - 706.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result=INSS_EMPRESA -if 'INSS_RAT_FAP' in locals(): - result+=INSS_RAT_FAP -if 'INSS_OUTRAS_ENTIDADES' in locals(): - result+=INSS_OUTRAS_ENTIDADES - - - code - code - - - - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - INSS_EMPRESA_LIQUIDO - INSS Empresa Líquido - True - 707.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result=INSS_EMPRESA_TOTAL-INSS_DEDUCAO_PREVIDENCIARIA - - - code - code - - - - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - BASE_FERIAS - Base FERIAS - - 108.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = MEDIAS.SALARIO.media - - - code - code - - - True - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - FERIAS - FERIAS - True - 109.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = contract.wage / 30 -result_qty = PEDIDO_FERIAS.DIAS_FERIAS - - result = Decimal(contract.wage) / Decimal(30) -#result_qty = PEDIDO_FERIAS.DIAS_FERIAS - code - code - True - True - True - - - - - - - True - contract.wage - - - - - 1.0 - - valor - - - - - - - 1/3_FERIAS - 1/3 FERIAS - True - 110.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = FERIAS / 3.0 - - result = CALCULAR.get_specific_rubric_value(rubrica.id) - -if 'FERIAS' in locals() and payslip.tipo_de_folha == 'ferias': - result = FERIAS / 3.0 -elif not result: - result = contract.wage / 3.0 / 12 - code - code - True - True - True - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - ABONO_PECUNIARIO - Rubrica do Abono Pecuniario das FERIAS - True - 111.0 - - python - result = PEDIDO_FERIAS.DIAS_ABONO > 0 - result = contract.wage / 30 -result_qty = PEDIDO_FERIAS.DIAS_ABONO - - - code - code - - - - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - 1/3_ABONO_PECUNIARIO - Rubrica do 1/3 Abono Pecuniario - True - 112.0 - - python - result = PEDIDO_FERIAS.DIAS_ABONO > 0 - result = ABONO_PECUNIARIO / 3.0 - - - code - code - - - - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - LIQUIDO_FERIAS - Liquido Férias - True - 799.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = categories.FERIAS - INSS - IRPF - - result = BRUTO - TOTAL_DESCONTOS - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - PAGAMENTO_FERIAS - Pagamento Antecipado de Férias - True - 999.0 - - python - result = worked_days.FERIAS.number_of_days > 0 and PAGAR_FERIAS - result = CALCULAR.rubrica_anterior_total(code='LIQUIDO_FERIAS', tipo_de_folha='ferias') - - result = CALCULAR.rubrica_anterior_total(code='LIQUIDO_FERIAS', tipo_de_folha='ferias') - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - VA/VR - Vale alimentação/Refeição - True - 305.0 - - none - result=payslip.tipo_de_folha in ('normal','rescisao') - if MEDIAS: - result = CALCULAR.get_specific_rubric_value(rubrica.id, MEDIAS) -else: - result = CALCULAR.get_specific_rubric_value(rubrica.id) - if MEDIAS: - result = CALCULAR.get_specific_rubric_value(rubrica.id, MEDIAS) -else: - result = CALCULAR.get_specific_rubric_value(rubrica.id) - - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - SALARIO - Função Comissionada - True - 101.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = worked_days.DIAS_TRABALHADOS.number_of_days * contract.wage/30 - result = CALCULAR.get_specific_rubric_value(rubrica.id) - -if not result: - result = worked_days.DIAS_TRABALHADOS.number_of_days * contract.wage/30 - code - code - True - True - True - - - - - - - True - contract.wage - - - - True - 1.0 - - valor - - - - - - - SALARIO - Honorario Presidente - True - 101.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = worked_days.DIAS_TRABALHADOS.number_of_days * contract.wage/30 - - code - code - True - True - True - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - SALARIO - Honorario Diretoria - True - 101.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = worked_days.DIAS_TRABALHADOS.number_of_days * contract.wage/30 - - code - code - True - True - True - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - SALARIO - Honorario Conselho - True - 101.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = worked_days.DIAS_TRABALHADOS.number_of_days * contract.wage/30 - - code - code - True - True - True - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - REMBOLSO_SAUDE - Reembolso Plano de Saude - True - 102.0 - - none - result=payslip.tipo_de_folha in ('normal','rescisao') - if MEDIAS: - result = CALCULAR.get_specific_rubric_value(rubrica.id, MEDIAS) -else: - result = CALCULAR.get_specific_rubric_value(rubrica.id) - - if MEDIAS: - result = CALCULAR.get_specific_rubric_value(rubrica.id, MEDIAS) -else: - result = CALCULAR.get_specific_rubric_value(rubrica.id) - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - PRIMEIRA_PARCELA_13 - Primeira parcela 13 Salario - True - 104.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = MEDIAS.SALARIO.media/12.0 -result_qty = MEDIAS.SALARIO.meses - - - code - code - - - True - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - ADIANTAMENTO_13_RESC - Adiantamento 13º Rescisao - True - 189 - - none - # -# Adiantamento é recebido até maio para quem sair de férias -# -result = payslip.tipo_de_folha == 'ferias' and payslip.date_to[5:7] <= '05' -result = result and payslip.holidays_ferias and payslip.holidays_ferias.advance_13_salary - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days. -# inputs: object containing the computed inputs. - -# Note: returned value have to be set in the variable 'result' - -result = contract.wage * 0.10 - result = CALCULAR.BUSCAR_ADIANTAMENTO_DECIMO_TERCEIRO() - fix - code - - - True - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - ADIANTAMENTO_FERIAS_RESC - Dedução Adiantamento Férias - - code - none - result = CALCULAR.BUSCAR_ADIANTAMENTO_FERIAS() - - - - - - SEGUNDA_PARCELA_13 - Segunda parcela 13 Salário - True - 105.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = MEDIAS.SALARIO.media/12.0 -result_qty = MEDIAS.SALARIO.meses - - - code - code - True - True - True - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - REMBOLSO_AUXILIO_CRECHE - Reembolso Auxilio Creche - True - 102.0 - - none - result=payslip.tipo_de_folha in ('normal','rescisao') - if MEDIAS: - result = CALCULAR.get_specific_rubric_value(rubrica.id, MEDIAS) -else: - result = CALCULAR.get_specific_rubric_value(rubrica.id) - - if MEDIAS: - result = CALCULAR.get_specific_rubric_value(rubrica.id, MEDIAS) -else: - result = CALCULAR.get_specific_rubric_value(rubrica.id) - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - AUXILIO_ALIMENTACAO - Auxílio Alimentação - Dir - True - 108.0 - - python - result=payslip.tipo_de_folha in ('normal','rescisao') - result = CALCULAR.get_specific_rubric_value(rubrica.id) - result = CALCULAR.get_specific_rubric_value(rubrica.id) - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - AUXILIO_MORADIA - Auxílio Moradia - True - 108.0 - - python - result=payslip.tipo_de_folha in ('normal','rescisao') - result = CALCULAR.get_specific_rubric_value(rubrica.id) - result = CALCULAR.get_specific_rubric_value(rubrica.id) - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - AUXILIO_SAUDE_DIRETOR - Auxílio Saúde - Diretor - True - 108.0 - - python - result=payslip.tipo_de_folha in ('normal','rescisao') - result = CALCULAR.get_specific_rubric_value(rubrica.id) - result = CALCULAR.get_specific_rubric_value(rubrica.id) - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - CONTRIBUICAO_SINDICAL - Contribuição Sindical - True - 304.0 - - python - result=payslip.tipo_de_folha in ('normal','rescisao') - result = contract.wage/30 - result = CALCULAR.get_specific_rubric_value(rubrica.id) - -if not result: - result = contract.wage/30 - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - DESCONTO_LIGACOES_TELEFONICAS - Desconto Ligações Telefônicas - True - 305.0 - - python - result=payslip.tipo_de_folha in ('normal','rescisao') - result = CALCULAR.get_specific_rubric_value(rubrica.id) - result = CALCULAR.get_specific_rubric_value(rubrica.id) - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - DIF_REEMBOLSO_AUXILIO_SAUDE - Diferença Reembolso Auxílio Saúde - True - 108.0 - - python - result=payslip.tipo_de_folha in ('normal','rescisao') - - result = CALCULAR.get_specific_rubric_value(rubrica.id) - - result = CALCULAR.get_specific_rubric_value(rubrica.id) - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - GRATIF_NATALINA_DIRETOR - Gratificação Natalina Diretor - True - 5.0 - - python - result=payslip.tipo_de_folha in ('normal','rescisao') - result = CALCULAR.get_specific_rubric_value(rubrica.id) - - result = CALCULAR.get_specific_rubric_value(rubrica.id) - code - code - True - True - True - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - DIFERENCA_SALARIOS - Diferença de salários - True - 5.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = CALCULAR.get_specific_rubric_value(rubrica.id) - - - code - code - True - True - True - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - CONTRIB_CONFEDERATIVA - Contribuição Confederativa - True - 306.0 - - python - result=payslip.tipo_de_folha in ('normal','rescisao') - result = CALCULAR.get_specific_rubric_value(rubrica.id) - result = CALCULAR.get_specific_rubric_value(rubrica.id) - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - PENSAO_ALIMENTICIA - Pensão Alimentícia - True - 307.0 - - python - result=payslip.tipo_de_folha in ('normal','rescisao') - result = CALCULAR.get_specific_rubric_value(rubrica.id, rubricas_especificas_calculadas=RUBRICAS_ESPEC_CALCULADAS) - - result = CALCULAR.get_specific_rubric_value(rubrica.id, rubricas_especificas_calculadas=RUBRICAS_ESPEC_CALCULADAS) - -if not result: - base = BASE_IR - base_ir = CALCULAR.BASE_IRRF(base, 0) - ir = CALCULAR.IRRF(base_ir, 0) - result = base - ir - result_rate = 10 - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - PREV_SUPLEMENTAR - Previdência Suplementar - True - 5.0 - - python - result=payslip.tipo_de_folha in ('normal','rescisao') - result = CALCULAR.get_specific_rubric_value(rubrica.id) - - result = CALCULAR.get_specific_rubric_value(rubrica.id) - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - PROP13 - Proporcional 13 Salário - True - 180.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = CALCULAR.BUSCAR_VALOR_PROPORCIONAL('decimo_terceiro') - - code - code - True - True - True - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - PAGAMENTO_MES_ANTERIOR - Pagamento bruto do mês anterior - True - 801.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = CALCULAR.rubrica_anterior_total(code='BRUTO', mes=payslip.mes_do_ano-1, tipo_de_folha='normal') - - - code - code - - - - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - PROP_FERIAS - Proporcional Férias - - code - none - result = CALCULAR.BUSCAR_VALOR_PROPORCIONAL('ferias') - - - - - - - - PROP_1/3_FERIAS - Proporcional 1/3 de Férias - - code - none - result = PROP_FERIAS/3 - - - - - - - - FERIAS_VENCIDAS - Férias Vencidas - - code - none - result = contract.wage / 30 -result_qty = 30 - - - - - - - - FERIAS_VENCIDAS_1/3 - Férias Vencidas 1/3 - - code - none - result = FERIAS_VENCIDAS/3 - - - - - - - - AVISO_PREV_IND - Aviso Prévio Indenizado - True - 186.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = CALCULAR.BUSCAR_VALOR_PROPORCIONAL('aviso_previo') - - code - code - True - True - True - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - PROP_13_AVISO_PREVIO - Proporcional 13 Salário Aviso Prévio - True - 187.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = CALCULAR.BUSCAR_VALOR_MEDIA_PROVENTO('decimo_terceiro') -result_qty = round(DIAS_AVISO_PREVIO/30.0) - - code - code - True - True - True - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - PROP_FERIAS_AVISO_PREVIO - Proporcional Férias Aviso Prévio - True - 188.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = AVISO_PREV_IND/12 -result_qty = round(DIAS_AVISO_PREVIO/30.0) - - code - code - True - True - True - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - PROP_1/3_FERIAS_AVISO_PREVIO - Proporcional 1/3 Férias Aviso Prévio - True - 189.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = PROP_FERIAS_AVISO_PREVIO/3 - - code - code - True - True - True - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - DESCONTO_LIGACOES_TELEFONICAS - Desconto Ligações Telefônicas - True - 188.0 - - python - result=payslip.tipo_de_folha in ('normal','rescisao') - result = CALCULAR.get_specific_rubric_value(rubrica.id) - - code - code - - - - - - - - - - True - contract.wage - - - - - 1.0 - - - - - - - - - BASE_IRPF_PROPORCIONAL_REGULAR - Base IRRF proporcional (regular) - True - 503.0 - - python - result = payslip.tipo_de_folha == 'normal' - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days. -# inputs: object containing the computed inputs. - -# Note: returned value have to be set in the variable 'result' - -result = contract.wage * 0.10 - base = BASE_IR -inss = INSS_PROPORCIONAL_REGULAR if 'INSS_PROPORCIONAL_REGULAR' in locals() else 0 -pensao = PENSAO_PROPORCIONAL_REGULAR if 'PENSAO_PROPORCIONAL_REGULAR' in locals() else 0 - -# -# Para os que recebem 1/3 de férias dentro da folha do mês, -# retirar da pensão o proporcional ao 1/3, -# e também fazer a proporção do INSS correspondente -# -if '1/3_FERIAS' in locals(): - terco = locals()['1/3_FERIAS'] - base -= terco - -base -= pensao -result = CALCULAR.BASE_IRRF(base, inss) - fix - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - BASE_IRPF_PROPORCIONAL_FERIAS - Base IRRF proporcional (férias) - True - 513.0 - - python - result = payslip.tipo_de_folha == 'normal' - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days. -# inputs: object containing the computed inputs. - -# Note: returned value have to be set in the variable 'result' - -result = contract.wage * 0.10 - base = BASE_IR -inss = INSS_PROPORCIONAL_FERIAS if 'INSS_PROPORCIONAL_FERIAS' in locals() else 0 -pensao = PENSAO_PROPORCIONAL_FERIAS if 'PENSAO_PROPORCIONAL_FERIAS' in locals() else 0 - -# -# Para os que recebem 1/3 de férias dentro da folha do mês, -# retirar da pensão o proporcional ao 1/3, -# e também fazer a proporção do INSS correspondente -# -if '1/3_FERIAS' in locals(): - terco = locals()['1/3_FERIAS'] - base = terco - base -= pensao -else: - base = 0 - -result = CALCULAR.BASE_IRRF(base, inss) - - fix - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - IRPF_PROPORCIONAL_REGULAR - IRRF proporcional (regular) - True - 504.0 - - python - result = 'BASE_IRPF_PROPORCIONAL_REGULAR' in locals() - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days. -# inputs: object containing the computed inputs. - -# Note: returned value have to be set in the variable 'result' - -result = contract.wage * 0.10 - result = CALCULAR.IRRF(BASE_IRPF_PROPORCIONAL_REGULAR, INSS_PROPORCIONAL_REGULAR) - fix - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - IRPF_PROPORCIONAL_FERIAS - IRRF proporcional (férias) - True - 514.0 - - python - result = 'BASE_IRPF_PROPORCIONAL_FERIAS' in locals() - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days. -# inputs: object containing the computed inputs. - -# Note: returned value have to be set in the variable 'result' - -result = contract.wage * 0.10 - result = CALCULAR.IRRF(BASE_IRPF_PROPORCIONAL_FERIAS, INSS_PROPORCIONAL_FERIAS) - fix - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - INSS_PROPORCIONAL_REGULAR - INSS proporcional (regular) - True - 501.0 - - python - result = payslip.tipo_de_folha == 'normal' - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days. -# inputs: object containing the computed inputs. - -# Note: returned value have to be set in the variable 'result' - -result = contract.wage * 0.10 - base = BASE_IR -inss = INSS if 'INSS' in locals() else 0 - -# -# Para os que recebem 1/3 de férias dentro da folha do mês, -# fazer a proporção do INSS correspondente -# -if '1/3_FERIAS' in locals(): - terco = locals()['1/3_FERIAS'] - proporcao = 1 - (terco / float(base or 1)) - inss *= proporcao - -result = inss - fix - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - INSS_PROPORCIONAL_FERIAS - INSS proporcional (férias) - True - 511.0 - - python - result = payslip.tipo_de_folha == 'normal' - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days. -# inputs: object containing the computed inputs. - -# Note: returned value have to be set in the variable 'result' - -result = contract.wage * 0.10 - base = BASE_IR -inss = INSS if 'INSS' in locals() else 0 - -# -# Para os que recebem 1/3 de férias dentro da folha do mês, -# fazer a proporção do INSS correspondente -# -if '1/3_FERIAS' in locals(): - terco = locals()['1/3_FERIAS'] - proporcao = (terco / float(base or 1)) - inss *= proporcao - -result = inss - fix - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - PENSAO_PROPORCIONAL_REGULAR - Pensão proporcional (regular) - True - 502.0 - - python - result = payslip.tipo_de_folha == 'normal' - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days. -# inputs: object containing the computed inputs. - -# Note: returned value have to be set in the variable 'result' - -result = contract.wage * 0.10 - base = BASE_IR -pensao = PENSAO_ALIMENTICIA if 'PENSAO_ALIMENTICIA' in locals() else 0 - -# -# Para os que recebem 1/3 de férias dentro da folha do mês, -# fazer a proporção do INSS correspondente -# -if '1/3_FERIAS' in locals(): - terco = locals()['1/3_FERIAS'] - proporcao = 1 - (terco / float(base or 1)) - pensao *= proporcao - -result = pensao - fix - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - PENSAO_PROPORCIONAL_FERIAS - Pensão proporcional (férias) - True - 512.0 - - python - result = payslip.tipo_de_folha == 'normal' - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days. -# inputs: object containing the computed inputs. - -# Note: returned value have to be set in the variable 'result' - -result = contract.wage * 0.10 - base = BASE_IR -pensao = PENSAO_ALIMENTICIA if 'PENSAO_ALIMENTICIA' in locals() else 0 - -# -# Para os que recebem 1/3 de férias dentro da folha do mês, -# fazer a proporção do INSS correspondente -# -if '1/3_FERIAS' in locals(): - terco = locals()['1/3_FERIAS'] - proporcao = (terco / float(base or 1)) - pensao *= proporcao - -result = pensao - fix - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - ADIANTAMENTO_13 - Adiantamento 13º - True - 121.0 - - python - # -# Adiantamento é recebido até maio para quem sair de férias -# -result = payslip.tipo_de_folha == 'ferias' and payslip.date_to[5:7] <= '05' -result = result and payslip.holidays_ferias and payslip.holidays_ferias.advance_13_salary - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days. -# inputs: object containing the computed inputs. - -# Note: returned value have to be set in the variable 'result' - -result = contract.wage * 0.10 - result = contract.wage / 2.0 - - fix - code - - - True - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - DESCONTO_VIAGEM - Desconto Adiantamento de Diárias de Viagem - True - 404.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days. -# inputs: object containing the computed inputs. - -# Note: returned value have to be set in the variable 'result' - -result = contract.wage * 0.10 - result = CALCULAR.get_specific_rubric_value(rubrica.id) - fix - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - REF_VALOR_VALE - Vale Alimentação/Refeição - Valor de Referência - True - 120.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days. -# inputs: object containing the computed inputs. - -# Note: returned value have to be set in the variable 'result' - -result = contract.wage * 0.10 - - fix - fix - - - - - 660.0 - - - - - - contract.wage - - - - True - 1.0 - 1 - - - - - - - - FGTS_RESCISAO - FGTS A MAIOR - True - 460 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = BASE_FGTS * 0.08 - valor = BASE_FGTS * 0.08 -if valor >= 0: - result = valor -else: - result = -1*valor - code - code - - - - - - 8.0 - contract.wage - BASE_FGTS - 0.08 - True - contract.wage - - - - True - 1.0 - 1 - - - - - - - - INSS_RESCISAO - INSS Dias Trabalhados - True - 402 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = CALCULAR.INSS(BASE_INSS) - base = SALARIO_RESCISAO - -result = CALCULAR.INSS(base) - code - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - SALARIO_RESCISAO - Função Comissionada - True - 101 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - result = worked_days.DIAS_TRABALHADOS.number_of_days * contract.wage/30 - result = CALCULAR.get_specific_rubric_value(rubrica.id) - -if not result: - result = worked_days.DIAS_TRABALHADOS.number_of_days * contract.wage/30 - code - code - - - True - - - - - - - True - contract.wage - - - - True - 1.0 - - valor - - - - - - - BASE_INSS_13 - Base INSS 13 - True - 505.0 - - none - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days -# inputs: object containing the computed inputs - -# Note: returned value have to be set in the variable 'result' - -result = rules.NET > categories.NET * 0.10 - -# Available variables: -#---------------------- -# payslip: object containing the payslips -# employee: hr.employee object -# contract: hr.contract object -# rules: object containing the rules code (previously computed) -# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). -# worked_days: object containing the computed worked days. -# inputs: object containing the computed inputs. - -# Note: returned value have to be set in the variable 'result' - -result = contract.wage * 0.10 - result = PROP13 - fix - code - - - - - - - - - - True - contract.wage - - - - True - 1.0 - - - - - - - - - From b69ced02d48ebffb571e6cf687f91a0f2050c9bf Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 20 Jul 2017 21:07:37 -0300 Subject: [PATCH 467/787] [FIX] Added xmls into demo to fix tests --- l10n_br_hr_payroll/__openerp__.py | 4 +- .../demo/l10n_br_hr_payroll_estruturas.xml | 380 ++ .../demo/l10n_br_hr_payroll_rubricas.xml | 3275 +++++++++++++++++ 3 files changed, 3657 insertions(+), 2 deletions(-) create mode 100644 l10n_br_hr_payroll/demo/l10n_br_hr_payroll_estruturas.xml create mode 100644 l10n_br_hr_payroll/demo/l10n_br_hr_payroll_rubricas.xml diff --git a/l10n_br_hr_payroll/__openerp__.py b/l10n_br_hr_payroll/__openerp__.py index 445cea86d..56d2f5db5 100644 --- a/l10n_br_hr_payroll/__openerp__.py +++ b/l10n_br_hr_payroll/__openerp__.py @@ -23,8 +23,6 @@ 'data': [ 'data/l10n_br_hr_payroll_categorias.xml', 'data/l10n_br_hr_contract_sequence.xml', -# 'data/l10n_br_hr_payroll_rubricas.xml', -# 'data/l10n_br_hr_payroll_estruturas.xml', 'data/l10n_br_hr_tabela_INSS.xml', 'data/l10n_br_hr_tabela_IR.xml', 'data/l10n_br_hr_tabela_IR_dependente.xml', @@ -55,6 +53,8 @@ ], 'demo': [ # 'demo/hr_contract.xml', + 'demo/l10n_br_hr_payroll_rubricas.xml', + 'demo/l10n_br_hr_payroll_estruturas.xml', ], 'installable': True, 'auto_install': False, diff --git a/l10n_br_hr_payroll/demo/l10n_br_hr_payroll_estruturas.xml b/l10n_br_hr_payroll/demo/l10n_br_hr_payroll_estruturas.xml new file mode 100644 index 000000000..37b5c379b --- /dev/null +++ b/l10n_br_hr_payroll/demo/l10n_br_hr_payroll_estruturas.xml @@ -0,0 +1,380 @@ + + + + + + + + + + + + + + + + + BASE_IRPF_SEM_INSS + Base para IRPF (sem INSS) + + + + + + + + + + + + + + + HONORARIO_PRESIDENTE + Honorario Presidente + + + + + + + + + + + + + + + JUSTA_CAUSA + Rescisão dispensa com justa causa + + + + + + + + + + rescisao + + + + + COMPLEMENTO_JUSTA_CAUSA + Rescisão Complementar (dispensa com justa causa) + + + + + + + + + + rescisao + + + + + PROVISAO_DECIMO_TERCEIRO + Provisão de Décimo Terceiro (13º) + + + + + + + + + + + + + + + PROVISAO_FERIAS + Provisão de Férias + + + + + + + + + + + + + + + FUNCIONARIO_CEDIDO + Funcionário Cedido + + + + + + + + + + normal + + + + + HONORARIO_DIRETORIA_SEM_INSS + Honorário Diretoria (sem INSS) + + + + + + + + + + normal + + + + + + + + FERIAS + Férias + + + + + + + + + + ferias + + + + + BASE_INSS_IRPF + Base para INSS e IRPF + + + + + + + + + + + + + + + BASE_FGTS + Base para FGTS + + + + + + + + + + + + + + + FUNCAO_COMISSIONADA + Função Comissionada + + + + + + + + + + + + + + + HONORARIO_PRESIDENTE + Honorario Presidente + + + + + + + + + + + + + + + HONORARIO_DIRETORIA + Honorario Diretoria + + + + + + + + + + + + + + + HONORARIO_CONSELHO + Honorario Conselho + + + + + + + + + + + + + + + PRIMEIRA_PARCELA_13 + Primeira Parcela 13 Salário + + + + + + + + + + + + + + + SEGUNDA_PARCELA_13 + Segunda Parcela 13 Salário + + + + + + + + + + + + + + + JUSTA_CAUSA + Rescisão dispensa com justa causa + + + + + + + + + + rescisao + + + + + RESCISAO + Rescisão + + + + + + + + + + rescisao + + + + + COMPLEMENTO_JUSTA_CAUSA + Rescisão Complementar (dispensa com justa causa) + + + + + + + + + + rescisao + + + + + PROVISAO_DECIMO_TERCEIRO + Provisão de Décimo Terceiro (13º) + + + + + + + + + + + + + + + PROVISAO_FERIAS + Provisão de Férias + + + + + + + + + + + + + + + diff --git a/l10n_br_hr_payroll/demo/l10n_br_hr_payroll_rubricas.xml b/l10n_br_hr_payroll/demo/l10n_br_hr_payroll_rubricas.xml new file mode 100644 index 000000000..5ded69232 --- /dev/null +++ b/l10n_br_hr_payroll/demo/l10n_br_hr_payroll_rubricas.xml @@ -0,0 +1,3275 @@ + + + + + + + + + + + + + + BRUTO + Bruto + True + 201.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = categories.PROVENTO + categories.FERIAS + + code + code + + + + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + LIQUIDO + Líquido + True + 799.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = BRUTO - TOTAL_DESCONTOS + + code + code + + + + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + INSS + INSS + True + 402.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = CALCULAR.INSS(BASE_INSS) + base = BASE_INSS + +if 'BASE_INSS_FERIAS' in locals(): + base += BASE_INSS_FERIAS + +result = CALCULAR.INSS(base) + +if 'INSS_FERIAS' in locals(): + result -= INSS_FERIAS + +if result < 0: + result = 0 + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + IRPF + IRPF + True + 502.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = CALCULAR.IRRF(BASE_IRPF, INSS if 'INSS' in locals() else 0) + result = CALCULAR.IRRF(BASE_IRPF, INSS if 'INSS' in locals() else 0) + +if 'IRPF_PROPORCIONAL_REGULAR' in locals() or 'IRPF_PROPORCIONAL_FERIAS' in locals(): + result = IRPF_PROPORCIONAL_REGULAR + result += IRPF_PROPORCIONAL_FERIAS + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + BASE_INSS + Base INSS + True + 401.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = BASE_INSS + result = BRUTO + code + code + + + + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + BASE_IRPF + Base IRRF + True + 501.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = CALCULAR.BASE_IRRF(BASE_IR, INSS if 'INSS' in locals() else 0) + base = BASE_IR +inss = INSS if 'INSS' in locals() else 0 + +if 'PENSAO_ALIMENTICIA' in locals(): + base -= PENSAO_ALIMENTICIA + +result = CALCULAR.BASE_IRRF(base, inss) + +if 'BASE_IRPF_PROPORCIONAL_REGULAR' in locals() or 'BASE_IRPF_PROPORCIONAL_FERIAS' in locals(): + result = BASE_IRPF_PROPORCIONAL_REGULAR + result += BASE_IRPF_PROPORCIONAL_FERIAS + + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + TOTAL_DESCONTOS + Total de Descontos + True + 701.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = categories.DEDUCAO + INSS if 'INSS' in locals() else 0 + IRPF if 'IRPF' in locals() else 0 + result = categories.DEDUCAO +result += INSS if 'INSS' in locals() else 0 +result += IRPF if 'IRPF' in locals() else 0 + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + BASE_FGTS + Base FGTS + True + 601.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = BASE_FGTS + result = BASE_FGTS + +if 'BASE_INSS_FERIAS' in locals(): + result += BASE_INSS_FERIAS + code + code + + + + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + FGTS + FGTS + True + 602.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = BASE_FGTS * 0.08 + + code + code + + + + + + 8.0 + contract.wage + + + True + contract.wage + + + + + 1.0 + + + + + + + + + INSS_EMPRESA_BASE + INSS Empresa Base + True + 701.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result=BASE_INSS +if 'BASE_INSS_13' in locals(): + result+=BASE_INSS_13 + + + code + code + + + + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + INSS_DEDUCAO_PREVIDENCIARIA + INSS Dedução Previdenciária + True + 702.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result=0 +if 'SALARIO_FAMILIA' in locals(): + result+=SALARIO_FAMILIA +if 'LICENCA_MATERNIDADE' in locals(): + result+=LICENCA_MATERNIDADE + + + code + code + + + + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + INSS_EMPRESA + INSS Empresa + True + 703.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result=INSS_EMPRESA_BASE +result_rate=RAT_FAP.total_rate + + + code + code + + + + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + INSS_OUTRAS_ENTIDADES + INSS Outras Entidades + True + 704.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result=INSS_EMPRESA_BASE +result_rate=RAT_FAP.other_entities_rate + + + code + code + + + + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + INSS_RAT_FAP + INSS RAT/FAP + True + 705.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result=INSS_EMPRESA_BASE +result_rate=RAT_FAP.rat_rate*RAT_FAP.fap_rate + + + code + code + + + + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + INSS_EMPRESA_TOTAL + INSS Empresa Total + True + 706.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result=INSS_EMPRESA +if 'INSS_RAT_FAP' in locals(): + result+=INSS_RAT_FAP +if 'INSS_OUTRAS_ENTIDADES' in locals(): + result+=INSS_OUTRAS_ENTIDADES + + + code + code + + + + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + INSS_EMPRESA_LIQUIDO + INSS Empresa Líquido + True + 707.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result=INSS_EMPRESA_TOTAL-INSS_DEDUCAO_PREVIDENCIARIA + + + code + code + + + + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + BASE_FERIAS + Base FERIAS + + 108.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = MEDIAS.SALARIO.media + + + code + code + + + True + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + FERIAS + FERIAS + True + 109.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = contract.wage / 30 +result_qty = PEDIDO_FERIAS.DIAS_FERIAS + + result = Decimal(contract.wage) / Decimal(30) +#result_qty = PEDIDO_FERIAS.DIAS_FERIAS + code + code + True + True + True + + + + + + + True + contract.wage + + + + + 1.0 + + valor + + + + + + + 1/3_FERIAS + 1/3 FERIAS + True + 110.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = FERIAS / 3.0 + + result = CALCULAR.get_specific_rubric_value(rubrica.id) + +if 'FERIAS' in locals() and payslip.tipo_de_folha == 'ferias': + result = FERIAS / 3.0 +elif not result: + result = contract.wage / 3.0 / 12 + code + code + True + True + True + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + ABONO_PECUNIARIO + Rubrica do Abono Pecuniario das FERIAS + True + 111.0 + + python + result = PEDIDO_FERIAS.DIAS_ABONO > 0 + result = contract.wage / 30 +result_qty = PEDIDO_FERIAS.DIAS_ABONO + + + code + code + + + + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + 1/3_ABONO_PECUNIARIO + Rubrica do 1/3 Abono Pecuniario + True + 112.0 + + python + result = PEDIDO_FERIAS.DIAS_ABONO > 0 + result = ABONO_PECUNIARIO / 3.0 + + + code + code + + + + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + LIQUIDO_FERIAS + Liquido Férias + True + 799.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = categories.FERIAS - INSS - IRPF + + result = BRUTO - TOTAL_DESCONTOS + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + PAGAMENTO_FERIAS + Pagamento Antecipado de Férias + True + 999.0 + + python + result = worked_days.FERIAS.number_of_days > 0 and PAGAR_FERIAS + result = CALCULAR.rubrica_anterior_total(code='LIQUIDO_FERIAS', tipo_de_folha='ferias') + + result = CALCULAR.rubrica_anterior_total(code='LIQUIDO_FERIAS', tipo_de_folha='ferias') + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + VA/VR + Vale alimentação/Refeição + True + 305.0 + + none + result=payslip.tipo_de_folha in ('normal','rescisao') + if MEDIAS: + result = CALCULAR.get_specific_rubric_value(rubrica.id, MEDIAS) +else: + result = CALCULAR.get_specific_rubric_value(rubrica.id) + if MEDIAS: + result = CALCULAR.get_specific_rubric_value(rubrica.id, MEDIAS) +else: + result = CALCULAR.get_specific_rubric_value(rubrica.id) + + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + SALARIO + Função Comissionada + True + 101.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = worked_days.DIAS_TRABALHADOS.number_of_days * contract.wage/30 + result = CALCULAR.get_specific_rubric_value(rubrica.id) + +if not result: + result = worked_days.DIAS_TRABALHADOS.number_of_days * contract.wage/30 + code + code + True + True + True + + + + + + + True + contract.wage + + + + True + 1.0 + + valor + + + + + + + SALARIO + Honorario Presidente + True + 101.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = worked_days.DIAS_TRABALHADOS.number_of_days * contract.wage/30 + + code + code + True + True + True + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + SALARIO + Honorario Diretoria + True + 101.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = worked_days.DIAS_TRABALHADOS.number_of_days * contract.wage/30 + + code + code + True + True + True + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + SALARIO + Honorario Conselho + True + 101.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = worked_days.DIAS_TRABALHADOS.number_of_days * contract.wage/30 + + code + code + True + True + True + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + REMBOLSO_SAUDE + Reembolso Plano de Saude + True + 102.0 + + none + result=payslip.tipo_de_folha in ('normal','rescisao') + if MEDIAS: + result = CALCULAR.get_specific_rubric_value(rubrica.id, MEDIAS) +else: + result = CALCULAR.get_specific_rubric_value(rubrica.id) + + if MEDIAS: + result = CALCULAR.get_specific_rubric_value(rubrica.id, MEDIAS) +else: + result = CALCULAR.get_specific_rubric_value(rubrica.id) + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + PRIMEIRA_PARCELA_13 + Primeira parcela 13 Salario + True + 104.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = MEDIAS.SALARIO.media/12.0 +result_qty = MEDIAS.SALARIO.meses + + + code + code + + + True + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + ADIANTAMENTO_13_RESC + Adiantamento 13º Rescisao + True + 189 + + none + # +# Adiantamento é recebido até maio para quem sair de férias +# +result = payslip.tipo_de_folha == 'ferias' and payslip.date_to[5:7] <= '05' +result = result and payslip.holidays_ferias and payslip.holidays_ferias.advance_13_salary + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days. +# inputs: object containing the computed inputs. + +# Note: returned value have to be set in the variable 'result' + +result = contract.wage * 0.10 + result = CALCULAR.BUSCAR_ADIANTAMENTO_DECIMO_TERCEIRO() + fix + code + + + True + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + ADIANTAMENTO_FERIAS_RESC + Dedução Adiantamento Férias + + code + none + result = CALCULAR.BUSCAR_ADIANTAMENTO_FERIAS() + + + + + + SEGUNDA_PARCELA_13 + Segunda parcela 13 Salário + True + 105.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = MEDIAS.SALARIO.media/12.0 +result_qty = MEDIAS.SALARIO.meses + + + code + code + True + True + True + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + REMBOLSO_AUXILIO_CRECHE + Reembolso Auxilio Creche + True + 102.0 + + none + result=payslip.tipo_de_folha in ('normal','rescisao') + if MEDIAS: + result = CALCULAR.get_specific_rubric_value(rubrica.id, MEDIAS) +else: + result = CALCULAR.get_specific_rubric_value(rubrica.id) + + if MEDIAS: + result = CALCULAR.get_specific_rubric_value(rubrica.id, MEDIAS) +else: + result = CALCULAR.get_specific_rubric_value(rubrica.id) + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + AUXILIO_ALIMENTACAO + Auxílio Alimentação - Dir + True + 108.0 + + python + result=payslip.tipo_de_folha in ('normal','rescisao') + result = CALCULAR.get_specific_rubric_value(rubrica.id) + result = CALCULAR.get_specific_rubric_value(rubrica.id) + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + AUXILIO_MORADIA + Auxílio Moradia + True + 108.0 + + python + result=payslip.tipo_de_folha in ('normal','rescisao') + result = CALCULAR.get_specific_rubric_value(rubrica.id) + result = CALCULAR.get_specific_rubric_value(rubrica.id) + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + AUXILIO_SAUDE_DIRETOR + Auxílio Saúde - Diretor + True + 108.0 + + python + result=payslip.tipo_de_folha in ('normal','rescisao') + result = CALCULAR.get_specific_rubric_value(rubrica.id) + result = CALCULAR.get_specific_rubric_value(rubrica.id) + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + CONTRIBUICAO_SINDICAL + Contribuição Sindical + True + 304.0 + + python + result=payslip.tipo_de_folha in ('normal','rescisao') + result = contract.wage/30 + result = CALCULAR.get_specific_rubric_value(rubrica.id) + +if not result: + result = contract.wage/30 + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + DESCONTO_LIGACOES_TELEFONICAS + Desconto Ligações Telefônicas + True + 305.0 + + python + result=payslip.tipo_de_folha in ('normal','rescisao') + result = CALCULAR.get_specific_rubric_value(rubrica.id) + result = CALCULAR.get_specific_rubric_value(rubrica.id) + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + DIF_REEMBOLSO_AUXILIO_SAUDE + Diferença Reembolso Auxílio Saúde + True + 108.0 + + python + result=payslip.tipo_de_folha in ('normal','rescisao') + + result = CALCULAR.get_specific_rubric_value(rubrica.id) + + result = CALCULAR.get_specific_rubric_value(rubrica.id) + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + GRATIF_NATALINA_DIRETOR + Gratificação Natalina Diretor + True + 5.0 + + python + result=payslip.tipo_de_folha in ('normal','rescisao') + result = CALCULAR.get_specific_rubric_value(rubrica.id) + + result = CALCULAR.get_specific_rubric_value(rubrica.id) + code + code + True + True + True + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + DIFERENCA_SALARIOS + Diferença de salários + True + 5.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = CALCULAR.get_specific_rubric_value(rubrica.id) + + + code + code + True + True + True + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + CONTRIB_CONFEDERATIVA + Contribuição Confederativa + True + 306.0 + + python + result=payslip.tipo_de_folha in ('normal','rescisao') + result = CALCULAR.get_specific_rubric_value(rubrica.id) + result = CALCULAR.get_specific_rubric_value(rubrica.id) + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + PENSAO_ALIMENTICIA + Pensão Alimentícia + True + 307.0 + + python + result=payslip.tipo_de_folha in ('normal','rescisao') + result = CALCULAR.get_specific_rubric_value(rubrica.id, rubricas_especificas_calculadas=RUBRICAS_ESPEC_CALCULADAS) + + result = CALCULAR.get_specific_rubric_value(rubrica.id, rubricas_especificas_calculadas=RUBRICAS_ESPEC_CALCULADAS) + +if not result: + base = BASE_IR + base_ir = CALCULAR.BASE_IRRF(base, 0) + ir = CALCULAR.IRRF(base_ir, 0) + result = base - ir + result_rate = 10 + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + PREV_SUPLEMENTAR + Previdência Suplementar + True + 5.0 + + python + result=payslip.tipo_de_folha in ('normal','rescisao') + result = CALCULAR.get_specific_rubric_value(rubrica.id) + + result = CALCULAR.get_specific_rubric_value(rubrica.id) + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + PROP13 + Proporcional 13 Salário + True + 180.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = CALCULAR.BUSCAR_VALOR_PROPORCIONAL('decimo_terceiro') + + code + code + True + True + True + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + PAGAMENTO_MES_ANTERIOR + Pagamento bruto do mês anterior + True + 801.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = CALCULAR.rubrica_anterior_total(code='BRUTO', mes=payslip.mes_do_ano-1, tipo_de_folha='normal') + + + code + code + + + + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + PROP_FERIAS + Proporcional Férias + + code + none + result = CALCULAR.BUSCAR_VALOR_PROPORCIONAL('ferias') + + + + + + + + PROP_1/3_FERIAS + Proporcional 1/3 de Férias + + code + none + result = PROP_FERIAS/3 + + + + + + + + FERIAS_VENCIDAS + Férias Vencidas + + code + none + result = contract.wage / 30 +result_qty = 30 + + + + + + + + FERIAS_VENCIDAS_1/3 + Férias Vencidas 1/3 + + code + none + result = FERIAS_VENCIDAS/3 + + + + + + + + AVISO_PREV_IND + Aviso Prévio Indenizado + True + 186.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = CALCULAR.BUSCAR_VALOR_PROPORCIONAL('aviso_previo') + + code + code + True + True + True + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + PROP_13_AVISO_PREVIO + Proporcional 13 Salário Aviso Prévio + True + 187.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = CALCULAR.BUSCAR_VALOR_MEDIA_PROVENTO('decimo_terceiro') +result_qty = round(DIAS_AVISO_PREVIO/30.0) + + code + code + True + True + True + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + PROP_FERIAS_AVISO_PREVIO + Proporcional Férias Aviso Prévio + True + 188.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = AVISO_PREV_IND/12 +result_qty = round(DIAS_AVISO_PREVIO/30.0) + + code + code + True + True + True + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + PROP_1/3_FERIAS_AVISO_PREVIO + Proporcional 1/3 Férias Aviso Prévio + True + 189.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = PROP_FERIAS_AVISO_PREVIO/3 + + code + code + True + True + True + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + DESCONTO_LIGACOES_TELEFONICAS + Desconto Ligações Telefônicas + True + 188.0 + + python + result=payslip.tipo_de_folha in ('normal','rescisao') + result = CALCULAR.get_specific_rubric_value(rubrica.id) + + code + code + + + + + + + + + + True + contract.wage + + + + + 1.0 + + + + + + + + + BASE_IRPF_PROPORCIONAL_REGULAR + Base IRRF proporcional (regular) + True + 503.0 + + python + result = payslip.tipo_de_folha == 'normal' + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days. +# inputs: object containing the computed inputs. + +# Note: returned value have to be set in the variable 'result' + +result = contract.wage * 0.10 + base = BASE_IR +inss = INSS_PROPORCIONAL_REGULAR if 'INSS_PROPORCIONAL_REGULAR' in locals() else 0 +pensao = PENSAO_PROPORCIONAL_REGULAR if 'PENSAO_PROPORCIONAL_REGULAR' in locals() else 0 + +# +# Para os que recebem 1/3 de férias dentro da folha do mês, +# retirar da pensão o proporcional ao 1/3, +# e também fazer a proporção do INSS correspondente +# +if '1/3_FERIAS' in locals(): + terco = locals()['1/3_FERIAS'] + base -= terco + +base -= pensao +result = CALCULAR.BASE_IRRF(base, inss) + fix + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + BASE_IRPF_PROPORCIONAL_FERIAS + Base IRRF proporcional (férias) + True + 513.0 + + python + result = payslip.tipo_de_folha == 'normal' + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days. +# inputs: object containing the computed inputs. + +# Note: returned value have to be set in the variable 'result' + +result = contract.wage * 0.10 + base = BASE_IR +inss = INSS_PROPORCIONAL_FERIAS if 'INSS_PROPORCIONAL_FERIAS' in locals() else 0 +pensao = PENSAO_PROPORCIONAL_FERIAS if 'PENSAO_PROPORCIONAL_FERIAS' in locals() else 0 + +# +# Para os que recebem 1/3 de férias dentro da folha do mês, +# retirar da pensão o proporcional ao 1/3, +# e também fazer a proporção do INSS correspondente +# +if '1/3_FERIAS' in locals(): + terco = locals()['1/3_FERIAS'] + base = terco + base -= pensao +else: + base = 0 + +result = CALCULAR.BASE_IRRF(base, inss) + + fix + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + IRPF_PROPORCIONAL_REGULAR + IRRF proporcional (regular) + True + 504.0 + + python + result = 'BASE_IRPF_PROPORCIONAL_REGULAR' in locals() + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days. +# inputs: object containing the computed inputs. + +# Note: returned value have to be set in the variable 'result' + +result = contract.wage * 0.10 + result = CALCULAR.IRRF(BASE_IRPF_PROPORCIONAL_REGULAR, INSS_PROPORCIONAL_REGULAR) + fix + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + IRPF_PROPORCIONAL_FERIAS + IRRF proporcional (férias) + True + 514.0 + + python + result = 'BASE_IRPF_PROPORCIONAL_FERIAS' in locals() + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days. +# inputs: object containing the computed inputs. + +# Note: returned value have to be set in the variable 'result' + +result = contract.wage * 0.10 + result = CALCULAR.IRRF(BASE_IRPF_PROPORCIONAL_FERIAS, INSS_PROPORCIONAL_FERIAS) + fix + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + INSS_PROPORCIONAL_REGULAR + INSS proporcional (regular) + True + 501.0 + + python + result = payslip.tipo_de_folha == 'normal' + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days. +# inputs: object containing the computed inputs. + +# Note: returned value have to be set in the variable 'result' + +result = contract.wage * 0.10 + base = BASE_IR +inss = INSS if 'INSS' in locals() else 0 + +# +# Para os que recebem 1/3 de férias dentro da folha do mês, +# fazer a proporção do INSS correspondente +# +if '1/3_FERIAS' in locals(): + terco = locals()['1/3_FERIAS'] + proporcao = 1 - (terco / float(base or 1)) + inss *= proporcao + +result = inss + fix + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + INSS_PROPORCIONAL_FERIAS + INSS proporcional (férias) + True + 511.0 + + python + result = payslip.tipo_de_folha == 'normal' + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days. +# inputs: object containing the computed inputs. + +# Note: returned value have to be set in the variable 'result' + +result = contract.wage * 0.10 + base = BASE_IR +inss = INSS if 'INSS' in locals() else 0 + +# +# Para os que recebem 1/3 de férias dentro da folha do mês, +# fazer a proporção do INSS correspondente +# +if '1/3_FERIAS' in locals(): + terco = locals()['1/3_FERIAS'] + proporcao = (terco / float(base or 1)) + inss *= proporcao + +result = inss + fix + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + PENSAO_PROPORCIONAL_REGULAR + Pensão proporcional (regular) + True + 502.0 + + python + result = payslip.tipo_de_folha == 'normal' + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days. +# inputs: object containing the computed inputs. + +# Note: returned value have to be set in the variable 'result' + +result = contract.wage * 0.10 + base = BASE_IR +pensao = PENSAO_ALIMENTICIA if 'PENSAO_ALIMENTICIA' in locals() else 0 + +# +# Para os que recebem 1/3 de férias dentro da folha do mês, +# fazer a proporção do INSS correspondente +# +if '1/3_FERIAS' in locals(): + terco = locals()['1/3_FERIAS'] + proporcao = 1 - (terco / float(base or 1)) + pensao *= proporcao + +result = pensao + fix + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + PENSAO_PROPORCIONAL_FERIAS + Pensão proporcional (férias) + True + 512.0 + + python + result = payslip.tipo_de_folha == 'normal' + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days. +# inputs: object containing the computed inputs. + +# Note: returned value have to be set in the variable 'result' + +result = contract.wage * 0.10 + base = BASE_IR +pensao = PENSAO_ALIMENTICIA if 'PENSAO_ALIMENTICIA' in locals() else 0 + +# +# Para os que recebem 1/3 de férias dentro da folha do mês, +# fazer a proporção do INSS correspondente +# +if '1/3_FERIAS' in locals(): + terco = locals()['1/3_FERIAS'] + proporcao = (terco / float(base or 1)) + pensao *= proporcao + +result = pensao + fix + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + ADIANTAMENTO_13 + Adiantamento 13º + True + 121.0 + + python + # +# Adiantamento é recebido até maio para quem sair de férias +# +result = payslip.tipo_de_folha == 'ferias' and payslip.date_to[5:7] <= '05' +result = result and payslip.holidays_ferias and payslip.holidays_ferias.advance_13_salary + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days. +# inputs: object containing the computed inputs. + +# Note: returned value have to be set in the variable 'result' + +result = contract.wage * 0.10 + result = contract.wage / 2.0 + + fix + code + + + True + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + DESCONTO_VIAGEM + Desconto Adiantamento de Diárias de Viagem + True + 404.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days. +# inputs: object containing the computed inputs. + +# Note: returned value have to be set in the variable 'result' + +result = contract.wage * 0.10 + result = CALCULAR.get_specific_rubric_value(rubrica.id) + fix + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + REF_VALOR_VALE + Vale Alimentação/Refeição - Valor de Referência + True + 120.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days. +# inputs: object containing the computed inputs. + +# Note: returned value have to be set in the variable 'result' + +result = contract.wage * 0.10 + + fix + fix + + + + + 660.0 + + + + + + contract.wage + + + + True + 1.0 + 1 + + + + + + + + FGTS_RESCISAO + FGTS A MAIOR + True + 460 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = BASE_FGTS * 0.08 + valor = BASE_FGTS * 0.08 +if valor >= 0: + result = valor +else: + result = -1*valor + code + code + + + + + + 8.0 + contract.wage + BASE_FGTS + 0.08 + True + contract.wage + + + + True + 1.0 + 1 + + + + + + + + INSS_RESCISAO + INSS Dias Trabalhados + True + 402 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = CALCULAR.INSS(BASE_INSS) + base = SALARIO_RESCISAO + +result = CALCULAR.INSS(base) + code + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + SALARIO_RESCISAO + Função Comissionada + True + 101 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + result = worked_days.DIAS_TRABALHADOS.number_of_days * contract.wage/30 + result = CALCULAR.get_specific_rubric_value(rubrica.id) + +if not result: + result = worked_days.DIAS_TRABALHADOS.number_of_days * contract.wage/30 + code + code + + + True + + + + + + + True + contract.wage + + + + True + 1.0 + + valor + + + + + + + BASE_INSS_13 + Base INSS 13 + True + 505.0 + + none + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days +# inputs: object containing the computed inputs + +# Note: returned value have to be set in the variable 'result' + +result = rules.NET > categories.NET * 0.10 + +# Available variables: +#---------------------- +# payslip: object containing the payslips +# employee: hr.employee object +# contract: hr.contract object +# rules: object containing the rules code (previously computed) +# categories: object containing the computed salary rule categories (sum of amount of all rules belonging to that category). +# worked_days: object containing the computed worked days. +# inputs: object containing the computed inputs. + +# Note: returned value have to be set in the variable 'result' + +result = contract.wage * 0.10 + result = PROP13 + fix + code + + + + + + + + + + True + contract.wage + + + + True + 1.0 + + + + + + + + + From 8d6295b4fb6163d5143c45c9c3b233752a5dfd1b Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Fri, 21 Jul 2017 08:51:29 -0300 Subject: [PATCH 468/787] [FIX] Removido required to campo identity_city_id --- l10n_br_hr_arquivos_governo/views/l10n_br_hr_employee.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/views/l10n_br_hr_employee.xml b/l10n_br_hr_arquivos_governo/views/l10n_br_hr_employee.xml index ee9ce068d..339a6ca51 100644 --- a/l10n_br_hr_arquivos_governo/views/l10n_br_hr_employee.xml +++ b/l10n_br_hr_arquivos_governo/views/l10n_br_hr_employee.xml @@ -79,10 +79,6 @@ 1 - - 1 - - From 1430e4d05e62f9f09e690b2637d59942b866913e Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Fri, 21 Jul 2017 09:30:56 -0300 Subject: [PATCH 469/787] [FIX] Removido obrigatoriedade do tipo de identidade e data de validade da identidade --- l10n_br_hr_arquivos_governo/views/l10n_br_hr_employee.xml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/views/l10n_br_hr_employee.xml b/l10n_br_hr_arquivos_governo/views/l10n_br_hr_employee.xml index 339a6ca51..1d7e6b28c 100644 --- a/l10n_br_hr_arquivos_governo/views/l10n_br_hr_employee.xml +++ b/l10n_br_hr_arquivos_governo/views/l10n_br_hr_employee.xml @@ -55,10 +55,6 @@ 1 - - 1 - - 1 @@ -71,10 +67,6 @@ 1 - - 1 - - 1 From 13400170ed74f49ae71ac7585807be629cbbf748 Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Fri, 21 Jul 2017 18:52:44 -0300 Subject: [PATCH 470/787] [FIX] Conta bancaria no contrato do funcionario --- l10n_br_hr_payroll/models/hr_contract.py | 5 +++++ l10n_br_hr_payroll/views/hr_contract.xml | 3 +++ 2 files changed, 8 insertions(+) diff --git a/l10n_br_hr_payroll/models/hr_contract.py b/l10n_br_hr_payroll/models/hr_contract.py index 2e3473187..037af2610 100644 --- a/l10n_br_hr_payroll/models/hr_contract.py +++ b/l10n_br_hr_payroll/models/hr_contract.py @@ -320,6 +320,11 @@ def _salario_mes(self, data_inicio, data_fim): inverse_name='contrato_id', string="Afastamentos" ) + conta_bancaria_id = fields.Many2one( + string="Conta bancaria", + comodel_name='res.partner.bank', + required=True, + ) class Exame(models.Model): diff --git a/l10n_br_hr_payroll/views/hr_contract.xml b/l10n_br_hr_payroll/views/hr_contract.xml index ae611137a..31cbb8e5f 100644 --- a/l10n_br_hr_payroll/views/hr_contract.xml +++ b/l10n_br_hr_payroll/views/hr_contract.xml @@ -16,6 +16,9 @@ + + + From cccca3e1408bfec7139b8d232d8b3656530ad4b2 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Sat, 22 Jul 2017 10:27:01 -0300 Subject: [PATCH 471/787] =?UTF-8?q?[FIX]=20Altera=20c=C3=B3digo=20que=20ap?= =?UTF-8?q?onta=20para=20XML=5FID=20agora=20que=20os=20xml=5Fids=20n=C3=A3?= =?UTF-8?q?o=20est=C3=A3o=20sendo=20usados=20mais?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 48 ++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 8a0b14314..e97503794 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -104,39 +104,39 @@ def _compute_valor_total_folha(self): inss = 0.00 irpf = 0.00 codigo = {} - codigo['BASE_FGTS'] = \ - holerite.env\ - .ref('l10n_br_hr_payroll.hr_salary_rule_BASE_FGTS').code - codigo['BASE_INSS'] = \ - holerite.env\ - .ref('l10n_br_hr_payroll.hr_salary_rule_BASE_INSS').code - codigo['BASE_IRPF'] = \ - holerite.env\ - .ref('l10n_br_hr_payroll.hr_salary_rule_BASE_IRPF').code - codigo['FGTS'] = \ - holerite.env\ - .ref('l10n_br_hr_payroll.hr_salary_rule_FGTS').code - codigo['INSS'] = \ - holerite.env\ - .ref('l10n_br_hr_payroll.hr_salary_rule_INSS').code - codigo['IRPF'] = \ - holerite.env\ - .ref('l10n_br_hr_payroll.hr_salary_rule_IRPF').code +# codigo['BASE_FGTS'] = \ +# holerite.env\ +# .ref('l10n_br_hr_payroll.hr_salary_rule_BASE_FGTS').code +# codigo['BASE_INSS'] = \ +# holerite.env\ +# .ref('l10n_br_hr_payroll.hr_salary_rule_BASE_INSS').code +# codigo['BASE_IRPF'] = \ +# holerite.env\ +# .ref('l10n_br_hr_payroll.hr_salary_rule_BASE_IRPF').code +# codigo['FGTS'] = \ +# holerite.env\ +# .ref('l10n_br_hr_payroll.hr_salary_rule_FGTS').code +# codigo['INSS'] = \ +# holerite.env\ +# .ref('l10n_br_hr_payroll.hr_salary_rule_INSS').code +# codigo['IRPF'] = \ +# holerite.env\ +# .ref('l10n_br_hr_payroll.hr_salary_rule_IRPF').code for line in holerite.line_ids: total += line.valor_provento - line.valor_deducao total_proventos += line.valor_provento total_descontos += line.valor_deducao - if line.code == codigo.get('BASE_FGTS'): + if line.code == 'BASE_FGTS': base_fgts = line.total - elif line.code == codigo.get('BASE_INSS'): + elif line.code == 'BASE_INSS': base_inss = line.total - elif line.code == codigo.get('BASE_IRPF'): + elif line.code == 'BASE_IRPF': base_irpf = line.total - elif line.code == codigo.get('FGTS'): + elif line.code == 'FGTS': fgts = line.total - elif line.code == codigo.get('INSS'): + elif line.code == 'INSS': inss = line.total - elif line.code == codigo.get('IRPF'): + elif line.code == 'IRPF': irpf = line.total holerite.total_folha = total holerite.total_proventos = total_proventos From 7abc8ab4eba8f7d3df44db2e28bb7279525f7980 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Sat, 22 Jul 2017 11:00:21 -0300 Subject: [PATCH 472/787] [FIX] PEP8 --- l10n_br_hr_payroll/models/hr_payslip.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index e97503794..94ef6bbd9 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -103,7 +103,7 @@ def _compute_valor_total_folha(self): fgts = 0.00 inss = 0.00 irpf = 0.00 - codigo = {} +# codigo = {} # codigo['BASE_FGTS'] = \ # holerite.env\ # .ref('l10n_br_hr_payroll.hr_salary_rule_BASE_FGTS').code From d7f9bd714746d4fddc8ed4b8448cf936a2751b9c Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 24 Jul 2017 03:24:02 -0300 Subject: [PATCH 473/787] =?UTF-8?q?[ADD]=20Integra=C3=A7=C3=A3o=20bancaria?= =?UTF-8?q?=20(payment.mode)=20para=20pagamento=20da=20folha?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payment_order/__openerp__.py | 1 + .../views/payment_mode.xml | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 l10n_br_hr_payment_order/views/payment_mode.xml diff --git a/l10n_br_hr_payment_order/__openerp__.py b/l10n_br_hr_payment_order/__openerp__.py index 8961dd6eb..005537d46 100644 --- a/l10n_br_hr_payment_order/__openerp__.py +++ b/l10n_br_hr_payment_order/__openerp__.py @@ -23,6 +23,7 @@ 'security/ir.model.access.csv', 'wizard/payslip_payment_create_order_view.xml', 'views/hr_payslip.xml', + 'views/payment_mode.xml', 'views/payment_order.xml', 'views/res_config_view.xml', 'views/hr_salary_rule_view.xml', diff --git a/l10n_br_hr_payment_order/views/payment_mode.xml b/l10n_br_hr_payment_order/views/payment_mode.xml new file mode 100644 index 000000000..ab0482be5 --- /dev/null +++ b/l10n_br_hr_payment_order/views/payment_mode.xml @@ -0,0 +1,38 @@ + + + + + + + + Pagamento Folha + payment.mode + tree,form + [('tipo_pagamento', '=', 'folha'), ('tipo_servico', '=', '30')] + {'default_tipo_pagamento': 'folha', 'default_tipo_servico': '30'} + + + + Pagamento Folha + + + + + + + + form + + + + + + + tree + + + + + + \ No newline at end of file From 911544b3a9be04257109a7e5485cceb7949391f3 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 24 Jul 2017 03:25:16 -0300 Subject: [PATCH 474/787] =?UTF-8?q?[FIX]=20Refatorar=20modulo=20de=20integ?= =?UTF-8?q?ra=C3=A7=C3=A3o=20da=20folha=20com=20o=20financial=20payment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payment_order/__openerp__.py | 12 +-- l10n_br_hr_payment_order/models/__init__.py | 1 + l10n_br_hr_payment_order/models/hr_payslip.py | 6 ++ .../models/payment_line.py | 37 ++++++++ .../models/payment_order.py | 86 ++++++++++++++++--- .../views/payment_order.xml | 84 ++++++++++++++---- 6 files changed, 191 insertions(+), 35 deletions(-) create mode 100644 l10n_br_hr_payment_order/models/payment_line.py diff --git a/l10n_br_hr_payment_order/__openerp__.py b/l10n_br_hr_payment_order/__openerp__.py index 005537d46..da00ab56b 100644 --- a/l10n_br_hr_payment_order/__openerp__.py +++ b/l10n_br_hr_payment_order/__openerp__.py @@ -12,24 +12,26 @@ 'website': 'www.kmee.com.br', 'depends': [ 'l10n_br_hr_payroll', - 'account_payment', - 'account_payment_partner', - 'l10n_br_account_banking_payment_cnab', + 'l10n_br_financial_payment_order', ], 'data': [ 'data/hr_salary_rule.xml', + 'security/hr_payslip.xml', 'security/payment_order.xml', 'security/ir.model.access.csv', + 'wizard/payslip_payment_create_order_view.xml', + + 'views/hr_contract.xml', 'views/hr_payslip.xml', + 'views/hr_salary_rule_view.xml', 'views/payment_mode.xml', 'views/payment_order.xml', 'views/res_config_view.xml', - 'views/hr_salary_rule_view.xml', + 'hr_payroll_workflow.xml', 'payment_order_workflow.xml', - 'views/hr_contract.xml', ], 'demo': [ 'demo/hr_payslip.xml', diff --git a/l10n_br_hr_payment_order/models/__init__.py b/l10n_br_hr_payment_order/models/__init__.py index 77310632a..a0fef6f4b 100644 --- a/l10n_br_hr_payment_order/models/__init__.py +++ b/l10n_br_hr_payment_order/models/__init__.py @@ -3,6 +3,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from . import payment_order +from . import payment_line from . import hr_payslip from . import hr_payslip_run from . import res_config diff --git a/l10n_br_hr_payment_order/models/hr_payslip.py b/l10n_br_hr_payment_order/models/hr_payslip.py index befd52227..0f92df432 100644 --- a/l10n_br_hr_payment_order/models/hr_payslip.py +++ b/l10n_br_hr_payment_order/models/hr_payslip.py @@ -16,6 +16,12 @@ class HrPayslip(models.Model): # domain="[('type', '=', type)]" ) + payment_order_id = fields.Many2one( + string="Payment Mode", + comodel_name='payment.order', + # domain="[('type', '=', type)]" + ) + payment_line_ids = fields.One2many( string="Ordens de Pagamento", comodel_name="payment.line", diff --git a/l10n_br_hr_payment_order/models/payment_line.py b/l10n_br_hr_payment_order/models/payment_line.py new file mode 100644 index 000000000..da335ebee --- /dev/null +++ b/l10n_br_hr_payment_order/models/payment_line.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 KMEE +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp import api, fields, models + + +class PaymentLine(models.Model): + _inherit = 'payment.line' + + payslip_id = fields.Many2one( + string="Ref do Holerite", + comodel_name="hr.payslip", + ) + + def _get_payment_line_reference(self): + res = super(PaymentLine, self)._get_payment_line_reference() + res.append(( + self.env['hr.payslip']._name, + self.env['hr.payslip']._description + )) + return res + + @api.multi + @api.depends('payslip_id', 'financial_id') + def _compute_reference_id(self): + + # if not mode == 'folha': + # return super + + for record in self: + if record.payslip_id: + record.reference_id = ( + record.payslip_id._name + + ',' + + str(record.payslip_id.id) + ) diff --git a/l10n_br_hr_payment_order/models/payment_order.py b/l10n_br_hr_payment_order/models/payment_order.py index 2d6977e5f..8b8d43136 100644 --- a/l10n_br_hr_payment_order/models/payment_order.py +++ b/l10n_br_hr_payment_order/models/payment_order.py @@ -2,24 +2,86 @@ # Copyright 2017 KMEE # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from openerp import api, fields, models +from openerp import api, fields, models, _ + +from openerp.addons.l10n_br_hr_payroll.models.hr_payslip import ( + TIPO_DE_FOLHA, +) class PaymentOrder(models.Model): _inherit = 'payment.order' + tipo_de_folha = fields.Selection( + selection=TIPO_DE_FOLHA, + string=u'Tipo de folha', + default='normal', + states={'done': [('readonly', True)]}, + ) + + hr_payslip_ids = fields.One2many( + string='Holerites', + comodel_name='hr.payslip', + inverse_name='payment_order_id', + ) + @api.multi - def cancel(self): - for line in self.line_ids: - line.write({'payslip_id': ''}) - self.write({'state': 'cancel'}) - return True + def _prepare_folha_payment_line(self, line): + self.ensure_one() + date_to_pay = False # no payment date => immediate payment + state = 'normal' + communication = 'Holerite: ' + line.display_name or '-' + amount_currency = line.total + # Seta no Holerite em qual remessa esta o pagamento + line.slip_id.payment_order_id = self.id -class PaymentLine(models.Model): - _inherit = 'payment.line' + res = { + 'amount_currency': amount_currency, + 'bank_id': line.contract_id.conta_bancaria_id.id, + 'order_id': self.id, + 'partner_id': line.partner_id and line.partner_id.id or False, + # account banking + 'communication': communication, + 'state': state, + # end account banking + 'date': date_to_pay, + 'payslip_id': line.slip_id.id, + # 'financial_id': line.id, + } + return res - payslip_id = fields.Many2one( - string="Ref do Holerite", - comodel_name="hr.payslip", - ) + @api.one + def folha_payment_import(self): + """ A importação de holerites nas payment orders funciona da + seguinte maneira: + + 1. Busca holerites que estão no status: "Aguardando pagamento" e + coincidem com o tipo setado no filtro + + 2. Preparar: Prepara os dados para inclusão: + _prepare_financial_payment_line + 3. Criar + """ + self.line_ids.unlink() + + payslip_ids = self.env['hr.payslip'].search([ + ('tipo_de_folha', '=', self.tipo_de_folha), + ('state', '=', 'verify') + ]) + + rubricas_pagaveis = self.env['hr.salary.rule'].search([ + ('eh_pagavel', '=', True) + ]) + + payslip_line_ids = self.env['hr.payslip.line'].search([ + ('slip_id', 'in', payslip_ids.ids), + ('salary_rule_id', 'in', rubricas_pagaveis.ids) + ]) + + # Populate the current payment with new lines: + for line in payslip_line_ids: + vals = self._prepare_folha_payment_line(line) + self.env['payment.line'].create(vals) + + return diff --git a/l10n_br_hr_payment_order/views/payment_order.xml b/l10n_br_hr_payment_order/views/payment_order.xml index 68e33baa0..2dc425a51 100644 --- a/l10n_br_hr_payment_order/views/payment_order.xml +++ b/l10n_br_hr_payment_order/views/payment_order.xml @@ -1,35 +1,83 @@ - - - payment.order.payslip + + + payment.order.folha.form (in l10n_br_financial_payment_order) payment.order - + primary + - - + + + - - - - payment.order.line.payslip - payment.line - - - - + + + + + + + + + + + + + + + + + + + + Remessa de Folha de Pagamento + payment.order + tree,form + [('tipo_pagamento', '=', 'folha')] + {'default_tipo_pagamento': 'folha'} + + + + Remessa de Folha de Pagamento + + + + + + + + form + + + + + + + tree + + + + From a570997897bc5a09d7b59bd0b581c318f32d7ca0 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 24 Jul 2017 06:29:11 -0300 Subject: [PATCH 475/787] [FIX] Data de pagamento da remessa de folha --- l10n_br_hr_payment_order/models/payment_order.py | 3 +-- l10n_br_hr_payment_order/views/payment_order.xml | 6 +++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/l10n_br_hr_payment_order/models/payment_order.py b/l10n_br_hr_payment_order/models/payment_order.py index 8b8d43136..987ebe179 100644 --- a/l10n_br_hr_payment_order/models/payment_order.py +++ b/l10n_br_hr_payment_order/models/payment_order.py @@ -45,9 +45,8 @@ def _prepare_folha_payment_line(self, line): 'communication': communication, 'state': state, # end account banking - 'date': date_to_pay, + 'date': self.date_scheduled, 'payslip_id': line.slip_id.id, - # 'financial_id': line.id, } return res diff --git a/l10n_br_hr_payment_order/views/payment_order.xml b/l10n_br_hr_payment_order/views/payment_order.xml index 2dc425a51..9b3387d89 100644 --- a/l10n_br_hr_payment_order/views/payment_order.xml +++ b/l10n_br_hr_payment_order/views/payment_order.xml @@ -47,6 +47,10 @@ + + 1 + + @@ -55,7 +59,7 @@ payment.order tree,form [('tipo_pagamento', '=', 'folha')] - {'default_tipo_pagamento': 'folha'} + {'default_tipo_pagamento': 'folha', 'default_date_prefered': 'fixed'} From e916a9ff25d87ad35da13bc8a5a490386f0906d7 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 24 Jul 2017 06:29:31 -0300 Subject: [PATCH 476/787] [FIX] Tabelas readonly --- l10n_br_hr_payment_order/models/payment_order.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/l10n_br_hr_payment_order/models/payment_order.py b/l10n_br_hr_payment_order/models/payment_order.py index 987ebe179..88e90474c 100644 --- a/l10n_br_hr_payment_order/models/payment_order.py +++ b/l10n_br_hr_payment_order/models/payment_order.py @@ -23,6 +23,8 @@ class PaymentOrder(models.Model): string='Holerites', comodel_name='hr.payslip', inverse_name='payment_order_id', + readonly=True, + states={'draft': [('readonly', False)]}, ) @api.multi @@ -63,6 +65,7 @@ def folha_payment_import(self): 3. Criar """ self.line_ids.unlink() + self.hr_payslip_ids = False payslip_ids = self.env['hr.payslip'].search([ ('tipo_de_folha', '=', self.tipo_de_folha), From 640596a0f510703d2d763dcee0f5638b60c43f69 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 24 Jul 2017 06:29:59 -0300 Subject: [PATCH 477/787] [FIX] Criacao de payment a partir do holerite --- l10n_br_hr_payment_order/models/hr_payslip.py | 4 ++-- l10n_br_hr_payment_order/views/hr_payslip.xml | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/l10n_br_hr_payment_order/models/hr_payslip.py b/l10n_br_hr_payment_order/models/hr_payslip.py index 0f92df432..6851b0b64 100644 --- a/l10n_br_hr_payment_order/models/hr_payslip.py +++ b/l10n_br_hr_payment_order/models/hr_payslip.py @@ -13,7 +13,7 @@ class HrPayslip(models.Model): payment_mode_id = fields.Many2one( string="Payment Mode", comodel_name='payment.mode', - # domain="[('type', '=', type)]" + domain="[('tipo_pagamento', '=', 'folha')]" ) payment_order_id = fields.Many2one( @@ -100,7 +100,7 @@ def create_payment_order(self): payment_order_model = self.env['payment.order'] for holerite in self: - if holerite.state != 'draft': + if holerite.state != 'verify': raise UserError(_( "The payslip %s is not in Open state") % holerite.contract_id.nome_contrato) diff --git a/l10n_br_hr_payment_order/views/hr_payslip.xml b/l10n_br_hr_payment_order/views/hr_payslip.xml index a4a565ee7..27c8497e1 100644 --- a/l10n_br_hr_payment_order/views/hr_payslip.xml +++ b/l10n_br_hr_payment_order/views/hr_payslip.xml @@ -5,8 +5,6 @@ - - hr.payslip.form (in l10n_br_hr_payment_order) hr.payslip @@ -25,10 +23,10 @@ - + From b57d4d9ceb68465bf33656c22011b7f11597d1c3 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Tue, 25 Jul 2017 09:02:19 -0300 Subject: [PATCH 478/787] =?UTF-8?q?[FIX]=20Retirado=20conta=20corrente=20d?= =?UTF-8?q?o=20contrato,=20ser=C3=A1=20usado=20do=20hr.employee?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payment_order/__openerp__.py | 1 - l10n_br_hr_payment_order/models/__init__.py | 1 - l10n_br_hr_payment_order/models/hr_contract.py | 15 --------------- l10n_br_hr_payment_order/views/hr_contract.xml | 14 -------------- 4 files changed, 31 deletions(-) delete mode 100644 l10n_br_hr_payment_order/models/hr_contract.py delete mode 100644 l10n_br_hr_payment_order/views/hr_contract.xml diff --git a/l10n_br_hr_payment_order/__openerp__.py b/l10n_br_hr_payment_order/__openerp__.py index da00ab56b..fa99f16ac 100644 --- a/l10n_br_hr_payment_order/__openerp__.py +++ b/l10n_br_hr_payment_order/__openerp__.py @@ -23,7 +23,6 @@ 'wizard/payslip_payment_create_order_view.xml', - 'views/hr_contract.xml', 'views/hr_payslip.xml', 'views/hr_salary_rule_view.xml', 'views/payment_mode.xml', diff --git a/l10n_br_hr_payment_order/models/__init__.py b/l10n_br_hr_payment_order/models/__init__.py index a0fef6f4b..ae84d61c2 100644 --- a/l10n_br_hr_payment_order/models/__init__.py +++ b/l10n_br_hr_payment_order/models/__init__.py @@ -9,4 +9,3 @@ from . import res_config from . import hr_salary_rule from . import bank_payment_line -from . import hr_contract diff --git a/l10n_br_hr_payment_order/models/hr_contract.py b/l10n_br_hr_payment_order/models/hr_contract.py deleted file mode 100644 index db3baf080..000000000 --- a/l10n_br_hr_payment_order/models/hr_contract.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2016 KMEE - Gabriel Cardoso de Faria -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from openerp import fields, models - - -class HrContract(models.Model): - _inherit = 'hr.contract' - - conta_bancaria_id = fields.Many2one( - string="Conta bancaria", - comodel_name='res.partner.bank', - required=True, - ) diff --git a/l10n_br_hr_payment_order/views/hr_contract.xml b/l10n_br_hr_payment_order/views/hr_contract.xml deleted file mode 100644 index 3899ea00a..000000000 --- a/l10n_br_hr_payment_order/views/hr_contract.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - l10n_br_hr_vacation.contract.form - hr.contract - - - - - - - - - From 519fded69b12a8774adbdc1adb912b01315b224f Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Tue, 25 Jul 2017 09:33:11 -0300 Subject: [PATCH 479/787] [FIX] FLAKE8 --- l10n_br_hr_payment_order/models/payment_order.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/l10n_br_hr_payment_order/models/payment_order.py b/l10n_br_hr_payment_order/models/payment_order.py index 88e90474c..95d92ae26 100644 --- a/l10n_br_hr_payment_order/models/payment_order.py +++ b/l10n_br_hr_payment_order/models/payment_order.py @@ -2,7 +2,7 @@ # Copyright 2017 KMEE # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from openerp import api, fields, models, _ +from openerp import api, fields, models from openerp.addons.l10n_br_hr_payroll.models.hr_payslip import ( TIPO_DE_FOLHA, @@ -30,7 +30,7 @@ class PaymentOrder(models.Model): @api.multi def _prepare_folha_payment_line(self, line): self.ensure_one() - date_to_pay = False # no payment date => immediate payment +# date_to_pay = False # no payment date => immediate payment state = 'normal' communication = 'Holerite: ' + line.display_name or '-' amount_currency = line.total @@ -54,12 +54,12 @@ def _prepare_folha_payment_line(self, line): @api.one def folha_payment_import(self): - """ A importação de holerites nas payment orders funciona da + """ A importação de holerites nas payment orders funciona da seguinte maneira: - 1. Busca holerites que estão no status: "Aguardando pagamento" e + 1. Busca holerites que estão no status: "Aguardando pagamento" e coincidem com o tipo setado no filtro - + 2. Preparar: Prepara os dados para inclusão: _prepare_financial_payment_line 3. Criar From e04c669a0f1dabbeddfa7761421a4503f452e06d Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Tue, 25 Jul 2017 16:20:46 -0300 Subject: [PATCH 480/787] [FIX] Moved hr_salary_rule.xml to demo --- l10n_br_hr_payment_order/__openerp__.py | 3 +-- l10n_br_hr_payment_order/{data => demo}/hr_salary_rule.xml | 0 2 files changed, 1 insertion(+), 2 deletions(-) rename l10n_br_hr_payment_order/{data => demo}/hr_salary_rule.xml (100%) diff --git a/l10n_br_hr_payment_order/__openerp__.py b/l10n_br_hr_payment_order/__openerp__.py index fa99f16ac..15630fa8e 100644 --- a/l10n_br_hr_payment_order/__openerp__.py +++ b/l10n_br_hr_payment_order/__openerp__.py @@ -15,8 +15,6 @@ 'l10n_br_financial_payment_order', ], 'data': [ - 'data/hr_salary_rule.xml', - 'security/hr_payslip.xml', 'security/payment_order.xml', 'security/ir.model.access.csv', @@ -33,6 +31,7 @@ 'payment_order_workflow.xml', ], 'demo': [ + 'demo/hr_salary_rule.xml', 'demo/hr_payslip.xml', 'demo/payment_order.xml', ], diff --git a/l10n_br_hr_payment_order/data/hr_salary_rule.xml b/l10n_br_hr_payment_order/demo/hr_salary_rule.xml similarity index 100% rename from l10n_br_hr_payment_order/data/hr_salary_rule.xml rename to l10n_br_hr_payment_order/demo/hr_salary_rule.xml From 4f28e8076c063aae44e9e60aa938fe842b037a59 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Wed, 26 Jul 2017 16:47:50 -0300 Subject: [PATCH 481/787] =?UTF-8?q?[FIX]=20Ajustado=20ordena=C3=A7=C3=A3o?= =?UTF-8?q?=20das=20rubricas=20na=20view=20do=20payslip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/views/hr_payslip.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/views/hr_payslip.xml b/l10n_br_hr_payroll/views/hr_payslip.xml index f145aea40..aec9caf7a 100644 --- a/l10n_br_hr_payroll/views/hr_payslip.xml +++ b/l10n_br_hr_payroll/views/hr_payslip.xml @@ -47,7 +47,13 @@ - + From e655a777eeb485c12ff63ee0a3b38452ad20125a Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Wed, 26 Jul 2017 21:52:19 -0300 Subject: [PATCH 482/787] =?UTF-8?q?[FIX]=20C=C3=A1lculo=20de=20Regras=20Es?= =?UTF-8?q?pec=C3=ADficas=20com=20Benefici=C3=A1rio=20definido?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 81 ++++++++++++++----------- 1 file changed, 47 insertions(+), 34 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 94ef6bbd9..b51bf7907 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -750,16 +750,21 @@ def IRRF(self, BASE_IRRF, INSS): @api.model def get_contract_specific_rubrics(self, contract_id, rule_ids): contract = self.env['hr.contract'].browse(contract_id.id) - applied_specific_rule = [] + applied_specific_rule = {} for specific_rule in contract.specific_rule_ids: if self.date_from >= specific_rule.date_start: if not specific_rule.date_stop or \ self.date_to <= specific_rule.date_stop: - rule_ids.append((specific_rule.rule_id.id, + + rule_ids.append((specific_rule.rule_id.id, specific_rule.rule_id.sequence)) - applied_specific_rule.append( - (specific_rule.id, specific_rule.rule_id.id) - ) + + if specific_rule.rule_id.id not in applied_specific_rule: + applied_specific_rule[specific_rule.rule_id.id] = [] + + applied_specific_rule[specific_rule.rule_id.id].append( + specific_rule) + return applied_specific_rule def get_ferias_rubricas(self, payslip, rule_ids): @@ -1391,7 +1396,7 @@ def sum(self, code, from_date, to_date=None): rule_ids = self.env['hr.payroll.structure'].browse( structure_ids).get_all_rules() - applied_specific_rule = [] + applied_specific_rule = {} # Caso nao esteja computando holerite de ferias # recuperar as regras especificas do contrato if not payslip.tipo_de_folha == 'ferias': @@ -1575,21 +1580,25 @@ def sum(self, code, from_date, to_date=None): localdict['rubrica'] = rule id_rubrica_especifica = 0 beneficiario_id = False - # se a rubrica estiver nas rubricas especificas cadastradas - # no contrato para serem computadas, recuperar o - # beneficiario da rubrica, remover a rubrica da variavel - # local de rubricas_aplicadas a adicionar no localdict - # a rubrica especifica ja computada - if rule.id in [rubrica_id for rubrica_spec, rubrica_id in - applied_specific_rule]: - for key, value in applied_specific_rule: - if rule.id == value: - regra_especifica = \ - rubricas_spec_model.browse(key) + + # + # Tratamos as rubricas específicas que têm beneficiários + # + if rule.id in applied_specific_rule: + lista_rubricas_especificas = \ + applied_specific_rule[rule.id] + + if len(lista_rubricas_especificas) > 0: + rubrica_especifica = lista_rubricas_especificas[0] + + if rubrica_especifica.partner_id: beneficiario_id = \ - regra_especifica.partner_id.id - applied_specific_rule.remove((key, value)) - id_rubrica_especifica = key + rubrica_especifica.partner_id.id + + del lista_rubricas_especificas[0] + + applied_specific_rule[rule.id] = \ + lista_rubricas_especificas # check if the rule can be applied if obj_rule.satisfy_condition(rule.id, localdict) \ @@ -1619,20 +1628,6 @@ def sum(self, code, from_date, to_date=None): tot_rule = tot_rule.quantize(Decimal('0.01')) localdict[rule.code] = tot_rule rules[rule.code] = rule - if rule.category_id.code == 'DEDUCAO': - if rule.compoe_base_INSS: - localdict['BASE_INSS'] -= tot_rule - if rule.compoe_base_IR: - localdict['BASE_IR'] -= tot_rule - if rule.compoe_base_FGTS: - localdict['BASE_FGTS'] -= tot_rule - else: - if rule.compoe_base_INSS: - localdict['BASE_INSS'] += tot_rule - if rule.compoe_base_IR: - localdict['BASE_IR'] += tot_rule - if rule.compoe_base_FGTS: - localdict['BASE_FGTS'] += tot_rule # Adiciona a rubrica especifica ao localdict if id_rubrica_especifica: @@ -1680,10 +1675,28 @@ def sum(self, code, from_date, to_date=None): 'rate': rate, 'partner_id': beneficiario_id or 1, } + + blacklist.append(rule.id) else: rules_seq = rule._model._recursive_search_of_rules( self._cr, self._uid, rule, self._context) blacklist += [id for id, seq in rules_seq] + continue + + if rule.category_id.code == 'DEDUCAO': + if rule.compoe_base_INSS: + localdict['BASE_INSS'] -= tot_rule + if rule.compoe_base_IR: + localdict['BASE_IR'] -= tot_rule + if rule.compoe_base_FGTS: + localdict['BASE_FGTS'] -= tot_rule + else: + if rule.compoe_base_INSS: + localdict['BASE_INSS'] += tot_rule + if rule.compoe_base_IR: + localdict['BASE_IR'] += tot_rule + if rule.compoe_base_FGTS: + localdict['BASE_FGTS'] += tot_rule result = [value for code, value in result_dict.items()] return result From 89c4ba29b2eed9bc31687d5ca23e81d0c2c788c4 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Wed, 26 Jul 2017 22:58:08 -0300 Subject: [PATCH 483/787] [FIX] Holerites diversos sem usar self.env.ref --- l10n_br_hr_payroll/models/hr_payslip.py | 37 ++++++++++++------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index b51bf7907..f16920ecd 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -859,44 +859,43 @@ def buscar_estruturas_salario(self): return self.contract_id.struct_id elif self.tipo_de_folha == "decimo_terceiro": if self.is_simulacao: - estrutura_decimo_terceiro = self.env.ref( - 'l10n_br_hr_payroll.' - 'hr_salary_structure_SEGUNDA_PARCELA_13' + estrutura_decimo_terceiro = \ + self.env['hr.payroll.structure'].search( + [('code', '=', 'SEGUNDA_PARCELA_13')], limit=1 ) return estrutura_decimo_terceiro else: if self.mes_do_ano < 12: - estrutura_decimo_terceiro = self.env.ref( - 'l10n_br_hr_payroll.' - 'hr_salary_structure_PRIMEIRA_PARCELA_13' + estrutura_decimo_terceiro = \ + self.env['hr.payroll.structure'].search( + [('code', '=', 'PRIMEIRA_PARCELA_13')], limit=1 ) return estrutura_decimo_terceiro else: - estrutura_decimo_terceiro = self.env.ref( - 'l10n_br_hr_payroll.' - 'hr_salary_structure_SEGUNDA_PARCELA_13' + estrutura_decimo_terceiro = \ + self.env['hr.payroll.structure'].search( + [('code', '=', 'SEGUNDA_PARCELA_13')], limit=1 ) return estrutura_decimo_terceiro elif self.tipo_de_folha == "ferias": - estrutura_ferias = self.env.ref( - 'l10n_br_hr_payroll.' - 'hr_salary_structure_FERIAS' + estrutura_ferias = self.env['hr.payroll.structure'].search( + [('code', '=', 'FERIAS')], limit=1 ) return estrutura_ferias elif self.tipo_de_folha == "rescisao": - estrutura_rescisao = self.env.ref( - 'l10n_br_hr_payroll.' - 'hr_salary_structure_RESCISAO' + estrutura_rescisao = self.env['hr.payroll.structure'].search( + [('code', '=', 'RESCISAO')], limit=1 ) return estrutura_rescisao elif self.tipo_de_folha == "provisao_ferias": - estrutura_provisao_ferias = self.env.ref( - 'l10n_br_hr_payroll.hr_salary_structure_PROVISAO_FERIAS' + estrutura_provisao_ferias = self.env['hr.payroll.structure'].search( + [('code', '=', 'PROVISAO_FERIAS')], limit=1 ) return estrutura_provisao_ferias elif self.tipo_de_folha == "provisao_decimo_terceiro": - estrutura_provisao_decimo_terceiro = self.env.ref( - 'l10n_br_hr_payroll.hr_salary_structure_PROVISAO_13' + estrutura_provisao_decimo_terceiro = \ + self.env['hr.payroll.structure'].search( + [('code', '=', 'PROVISAO_13')], limit=1 ) return estrutura_provisao_decimo_terceiro From 9e2d9a4cd0efc9d73f06f34c3661fb05d23a9257 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 27 Jul 2017 12:06:52 -0300 Subject: [PATCH 484/787] =?UTF-8?q?[FIX]=20Retirado=20state=20do=20domain?= =?UTF-8?q?=20da=20gera=C3=A7=C3=A3o=20do=20SEFIP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index b733dc49f..30aab3733 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -465,7 +465,7 @@ def _get_folha_ids(self): folha_ids = self.env['hr.payslip'].search([ ('mes_do_ano', '=', self.mes), ('ano', '=', self.ano), - ('state', '=', 'done'), +# ('state', 'in', ['done','verify']), ('company_id.partner_id.cnpj_cpf', 'like', raiz) ]) return folha_ids From 1a9d762863c3a4d89d513db9afeadd77ba92d3c1 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 27 Jul 2017 16:35:02 -0300 Subject: [PATCH 485/787] [FIX] Escondido 'state' do Lote de Holerite --- l10n_br_hr_payroll/views/hr_payslip_run.xml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/l10n_br_hr_payroll/views/hr_payslip_run.xml b/l10n_br_hr_payroll/views/hr_payslip_run.xml index 5057431ee..825277a6b 100644 --- a/l10n_br_hr_payroll/views/hr_payslip_run.xml +++ b/l10n_br_hr_payroll/views/hr_payslip_run.xml @@ -5,12 +5,27 @@ + + hr.payslip.run.tree + hr.payslip.run + + + + 1 + + + + hr.payslip.run.form hr.payslip.run + From 93ffcce473a31397053d29ca6af255483d0f89ae Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 27 Jul 2017 20:19:54 -0300 Subject: [PATCH 487/787] [ADD] Sefip liberando holerites para pagamento --- .../models/__init__.py | 1 + .../models/hr_payslip.py | 14 ++++++++++ .../models/l10n_br_hr_sefip.py | 28 +++++++++++++++++++ .../views/l10n_br_hr_sefip.xml | 1 + 4 files changed, 44 insertions(+) create mode 100644 l10n_br_hr_arquivos_governo/models/hr_payslip.py diff --git a/l10n_br_hr_arquivos_governo/models/__init__.py b/l10n_br_hr_arquivos_governo/models/__init__.py index 8e05c8aae..db02e82ee 100644 --- a/l10n_br_hr_arquivos_governo/models/__init__.py +++ b/l10n_br_hr_arquivos_governo/models/__init__.py @@ -4,6 +4,7 @@ from . import arquivo_grrf from . import arquivo_seguro_desemprego from . import hr_contract_type +from . import hr_payslip from . import l10n_br_hr_caged from . import l10n_br_hr_contract from . import l10n_br_hr_payslip diff --git a/l10n_br_hr_arquivos_governo/models/hr_payslip.py b/l10n_br_hr_arquivos_governo/models/hr_payslip.py new file mode 100644 index 000000000..6345e5793 --- /dev/null +++ b/l10n_br_hr_arquivos_governo/models/hr_payslip.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 KMEE - Hendrix Costa +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp import fields, models + + +class HrPayslip(models.Model): + _inherit = 'hr.payslip' + + sefip_id = fields.Many2one( + comodel_name='l10n_br.hr.sefip', + string='Sefip', + ) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index 30aab3733..af16561cd 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -270,6 +270,14 @@ def _buscar_isencao_filantropia(self): states={'draft': [('readonly', False)]}, ) + folha_ids = fields.One2many( + string='Holerites', + comodel_name='hr.payslip', + inverse_name='sefip_id', + readonly=True, + states={'draft': [('readonly', False)]}, + ) + def _valida_tamanho_linha(self, linha): """Valida tamanho da linha (sempre igual a 360 posições) e adiciona quebra caso esteja correto""" @@ -553,6 +561,26 @@ def gerar_sefip(self): record._preencher_registro_32(sefip, folha)) record.sefip += sefip._registro_90_totalizador_do_arquivo() + # + # Liberar holerites para pagamento + # + for holerite in folha_ids: + holerite.sefip_id = self.id + holerite.hr_verify_sheet() + + @api.multi + def gerar_boletos(self): + ''' + Criar ordem de pagamento para boleto de sindicato + ''' + contribuicao_sindical_total = 0 + for record in self: + for holerite in self.folha_ids: + for line in holerite.line_ids: + if line.code == 'CONTRIBUICAO_SINDICAL': + contribuicao_sindical_total += line.total + print ('contribuicao_sindical == ' + str(contribuicao_sindical_total)) + def _preencher_registro_00(self, sefip): sefip.tipo_inscr_resp = '1' if \ diff --git a/l10n_br_hr_arquivos_governo/views/l10n_br_hr_sefip.xml b/l10n_br_hr_arquivos_governo/views/l10n_br_hr_sefip.xml index 725391d0f..24fa0c65d 100644 --- a/l10n_br_hr_arquivos_governo/views/l10n_br_hr_sefip.xml +++ b/l10n_br_hr_arquivos_governo/views/l10n_br_hr_sefip.xml @@ -36,6 +36,7 @@ - - + diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 25176ec7d..e60c62f8d 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -35,6 +35,21 @@ (13, u'13º Salário'), ] +MES_DO_ANO2 = [ + (1, u'Janeiro'), + (2, u'Fevereiro'), + (3, u'Marco'), + (4, u'Abril'), + (5, u'Maio'), + (6, u'Junho'), + (7, u'Julho'), + (8, u'Agosto'), + (9, u'Setembro'), + (10, u'Outubro'), + (11, u'Novembro'), + (12, u'Dezembro'), +] + TIPO_DE_FOLHA = [ ('normal', u'Folha normal'), ('rescisao', u'Rescisão'), @@ -281,6 +296,17 @@ def _buscar_payslip_line(self): default=datetime.now().month, ) + mes_do_ano2 = fields.Selection( + selection=MES_DO_ANO2, + string=u'Mês', + required=True, + default=datetime.now().month, + ) + + @api.onchange('mes_do_ano2') + def on_change_mes_do_ano(self): + self.mes_do_ano = self.mes_do_ano2 + ano = fields.Integer( string=u'Ano', default=datetime.now().year, @@ -889,15 +915,12 @@ def buscar_estruturas_salario(self): ) return estrutura_rescisao elif self.tipo_de_folha == "provisao_ferias": - estrutura_provisao_ferias = self.env['hr.payroll.structure'].search( - [('code', '=', 'PROVISAO_FERIAS')], limit=1 - ) + estrutura_provisao_ferias = \ + self.contract_id.struct_id.estrutura_ferias_id return estrutura_provisao_ferias elif self.tipo_de_folha == "provisao_decimo_terceiro": estrutura_provisao_decimo_terceiro = \ - self.env['hr.payroll.structure'].search( - [('code', '=', 'PROVISAO_13')], limit=1 - ) + self.contract_id.struct_id.estrutura_13_id return estrutura_provisao_decimo_terceiro @api.depends('contract_id', 'date_from', 'date_to') diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index c60ef4701..275196b57 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -7,23 +7,25 @@ from openerp import api, fields, models MES_DO_ANO = [ - (1, u'Jan'), - (2, u'Fev'), - (3, u'Mar'), - (4, u'Abr'), - (5, u'Mai'), - (6, u'Jun'), - (7, u'Jul'), - (8, u'Ago'), - (9, u'Set'), - (10, u'Out'), - (11, u'Nov'), - (12, u'Dez'), + (1, u'Janeiro'), + (2, u'Fevereiro'), + (3, u'Março'), + (4, u'Abril'), + (5, u'Maio'), + (6, u'Junho'), + (7, u'Julho'), + (8, u'Agosto'), + (9, u'Setembro'), + (10, u'Outubro'), + (11, u'Novembro'), + (12, u'Dezembro'), + (13, u'13º Salário') ] TIPO_DE_FOLHA = [ ('normal', u'Folha normal'), - ('decimo_terceiro', u'Décimo terceiro (13º)'), + ('adiantamento_13', u'13º Salário - Adiantamento'), + ('decimo_terceiro', u'13º Salário'), ('provisao_ferias', u'Provisão de Férias'), ('provisao_decimo_terceiro', u'Provisão de Décimo Terceiro (13º)'), ] @@ -65,26 +67,54 @@ class HrPayslipRun(models.Model): default=lambda self: self.env.user.company_id or '', ) + @api.onchange('tipo_de_folha') + def fixa_decimo_terceiro(self): + if self.tipo_de_folha == 'adiantamento_13' and self.mes_do_ano == 12: + self.tipo_de_folha = 'decimo_terceiro' + self.mes_do_ano = 13 + else: + if self.tipo_de_folha == 'decimo_terceiro': + self.mes_do_ano = 13 + elif self.mes_do_ano == 13: + self.mes_do_ano = datetime.now().month + @api.onchange('mes_do_ano', 'ano') def buscar_datas_periodo(self): + if self.tipo_de_folha == 'adiantamento_13' and self.mes_do_ano == 12: + self.tipo_de_folha = 'decimo_terceiro' + self.mes_do_ano = 13 + + mes = self.mes_do_ano + if mes > 12: + mes = 12 + self.tipo_de_folha = 'decimo_terceiro' + elif self.tipo_de_folha == 'decimo_terceiro': + self.tipo_de_folha = 'normal' + ultimo_dia_do_mes = str( self.env['resource.calendar'].get_ultimo_dia_mes( - self.mes_do_ano, self.ano)) + mes, self.ano)) primeiro_dia_do_mes = str( - datetime.strptime(str(self.mes_do_ano) + '-' + + datetime.strptime(str(mes) + '-' + str(self.ano), '%m-%Y')) self.date_start = primeiro_dia_do_mes self.date_end = ultimo_dia_do_mes + @api.multi def verificar_holerites_gerados(self): - for lote in self: - contracts_id = self.env['hr.contract'].search([ + dominio_contratos = [ ('date_start', '<', lote.date_end), - ('company_id', '=', lote.company_id.id) - ]) + ('company_id', '=', lote.company_id.id), + ] + if self.tipo_de_folha != 'normal': + dominio_contratos += [ + ('categoria', 'not in', ['721', '722']), + ] + for lote in self: + contracts_id = self.env['hr.contract'].search(dominio_contratos) payslips = self.env['hr.payslip'].search([ ('tipo_de_folha', '=', self.tipo_de_folha), diff --git a/l10n_br_hr_payroll/views/hr_payslip.xml b/l10n_br_hr_payroll/views/hr_payslip.xml index 5f859b146..d6f9ab4c5 100644 --- a/l10n_br_hr_payroll/views/hr_payslip.xml +++ b/l10n_br_hr_payroll/views/hr_payslip.xml @@ -205,7 +205,7 @@ @@ -213,7 +213,12 @@ - + + diff --git a/l10n_br_hr_payroll/views/hr_payslip_run.xml b/l10n_br_hr_payroll/views/hr_payslip_run.xml index 825277a6b..fc2bc2a52 100644 --- a/l10n_br_hr_payroll/views/hr_payslip_run.xml +++ b/l10n_br_hr_payroll/views/hr_payslip_run.xml @@ -48,7 +48,9 @@ - + @@ -65,6 +67,10 @@ + + 1 + + diff --git a/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_account_view.xml b/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_account_view.xml index e4e7f5fb8..335803c99 100644 --- a/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_account_view.xml +++ b/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_account_view.xml @@ -11,10 +11,10 @@ @@ -20,7 +17,7 @@ + @@ -295,7 +301,7 @@ - + @@ -328,7 +334,7 @@ - + From a565552acb49cd2f337333a54c3bc3d63ef8f976 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Fri, 8 Sep 2017 11:13:28 -0300 Subject: [PATCH 541/787] =?UTF-8?q?[FIX]=20N=C3=A3o=20perder=20sequencias?= =?UTF-8?q?=20ao=20atualizar=20hr=5Fpayroll?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip_line.py | 6 +++--- l10n_br_hr_payroll/models/hr_salary_rule.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip_line.py b/l10n_br_hr_payroll/models/hr_payslip_line.py index ef52e36d6..9645740c2 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_line.py +++ b/l10n_br_hr_payroll/models/hr_payslip_line.py @@ -38,9 +38,9 @@ class HrPayslipeLine(models.Model): compute='_compute_arredondamento' ) - sequence = fields.Float( - string=u'Sequence', - ) + #sequence = fields.Integer( + # string=u'Sequence', + #) rate = fields.Float( digits=(18, 11), diff --git a/l10n_br_hr_payroll/models/hr_salary_rule.py b/l10n_br_hr_payroll/models/hr_salary_rule.py index 69f202dda..64705c65d 100644 --- a/l10n_br_hr_payroll/models/hr_salary_rule.py +++ b/l10n_br_hr_payroll/models/hr_salary_rule.py @@ -36,7 +36,7 @@ class HrSalaryRule(models.Model): _inherit = 'hr.salary.rule' - sequence = fields.Float( + sequence = fields.Integer( string=u'Sequence', ) compoe_base_INSS = fields.Boolean( From 82d253e59996dc1fc7a5fb2f66fa4ba2e4bb5498 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Fri, 8 Sep 2017 17:21:48 -0300 Subject: [PATCH 542/787] =?UTF-8?q?[FIX]=20Corrige=20c=C3=A1lculo=20do=20A?= =?UTF-8?q?VOS=5F13=20quando=20contrato=20inicia=20no=20mesmo=20ano?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 0c70c3057..e499c15f0 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1530,7 +1530,7 @@ def sum(self, code, from_date, to_date=None): fields.Date.from_string(payslip.contract_id.date_start).day mes_inicio_contrato = \ fields.Date.from_string(payslip.contract_id.date_start).month - avos_13 = int(payslip.mes_do_ano) - int(mes_inicio_contrato) + avos_13 = int(payslip.mes_do_ano) - int(mes_inicio_contrato) + 1 if dia_inicio_contrato > 15: avos_13 -= 1 else: From bb7f4a1c1835618b2a9f437480ea84afa8077169 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Sun, 10 Sep 2017 10:41:03 -0300 Subject: [PATCH 543/787] =?UTF-8?q?[FIX]=20Ajusta=20c=C3=A1lculo=20de=20m?= =?UTF-8?q?=C3=A9dia=20e=20cria=20m=C3=A9todo=20de=20c=C3=A1lculo=20de=20m?= =?UTF-8?q?=C3=A9dias=20mais=20simples?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 78 +++++++++++++++++++ .../models/l10n_br_hr_medias.py | 2 +- 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index e499c15f0..c3e01087e 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -7,6 +7,7 @@ from datetime import datetime, timedelta from dateutil.relativedelta import relativedelta +from dateutil.rrule import rrule, MONTHLY from lxml import etree from openerp import api, fields, models, exceptions, _ from mako.template import Template @@ -809,6 +810,83 @@ def IRRF(self, BASE_IRRF, INSS): else: return 0 + def MEDIA_RUBRICA(self, codigo): + # + # Calcular o período desejado e a quantidade de meses + # Para ser usado no cálculo da média + # + meses = 12 + if self.tipo_de_folha in \ + ['ferias', 'aviso_previo', 'provisao_ferias']: + if self.tipo_de_folha in ['provisao_ferias', 'aviso_previo']: + periodo_aquisitivo = \ + self.contract_id.vacation_control_ids[0] + else: + periodo_aquisitivo = self.periodo_aquisitivo + + if self.tipo_de_folha in ['aviso_previo']: + data_de_inicio = fields.Date.from_string( + self.date_from) - relativedelta(months=12) + data_inicio_mes = fields.Date.from_string( + self.date_from).replace(day=1) - relativedelta( + months=12) + else: + data_de_inicio = fields.Date.from_string( + periodo_aquisitivo.inicio_aquisitivo) + data_inicio_mes = fields.Date.from_string( + periodo_aquisitivo.inicio_aquisitivo).replace(day=1) + + # Se trabalhou mais do que 15 dias, contabilizar o mes corrente + if (data_de_inicio - data_inicio_mes).days < 15: + data_de_inicio = data_inicio_mes + # Senão começar contabilizar medias apartir do mes seguinte + else: + data_de_inicio = data_inicio_mes + relativedelta(months=1) + if self.tipo_de_folha in ['provisao_ferias']: + data_final = self.date_to + else: + data_final = data_inicio_mes + relativedelta(months=12) + + dtstart = datetime.strptime(data_de_inicio, '%Y-%m-%d') + dtend = datetime.strptime(data_final, '%Y-%m-%d') + dates = [dt for dt in rrule(MONTHLY, dtstart=dtstart, until=dtend)] + meses = len(dates) + + elif self.tipo_de_folha in [ + 'decimo_terceiro', 'provisao_decimo_terceiro' + ]: + if self.contract_id.date_start > str(self.ano) + '-01-01': + data_de_inicio = self.contract_id.date_start + else: + data_de_inicio = str(self.ano) + '-01-01' + data_final = self.date_to + + # + # Buscar Holerites do Período + # + folha_obj = self.env['hr.payslip'] + domain = [ + ('date_from', '>=', data_de_inicio), + ('date_to', '<=', data_final), + ('contract_id', '=', self.contract_id.id), + ('tipo_de_folha', '=', 'normal'), + ('state', 'in', ['done', 'verify']), + ] + folhas_periodo = folha_obj.search(domain) + folhas_periodo = folhas_periodo.sorted(key=lambda r: r.date_from) + + # + # Buscar dentro dos holerites pela rubrica requerida + # + valor = 0 + for folha in folhas_periodo: + for linha in folha.line_ids: + if linha.salary_rule_id.code == codigo: + valor += linha.total + + media = valor / meses + return media + @api.model def get_contract_specific_rubrics(self, contract_id, rule_ids): contract = self.env['hr.contract'].browse(contract_id.id) diff --git a/l10n_br_hr_payroll/models/l10n_br_hr_medias.py b/l10n_br_hr_payroll/models/l10n_br_hr_medias.py index cb9b79487..fe0a4fcf2 100644 --- a/l10n_br_hr_payroll/models/l10n_br_hr_medias.py +++ b/l10n_br_hr_payroll/models/l10n_br_hr_medias.py @@ -142,7 +142,7 @@ def gerar_media_dos_proventos(self, data_inicio, data_fim, holerite_id): ('date_to', '<=', data_fim), ('contract_id', '=', holerite_id.contract_id.id), ('tipo_de_folha', '=', 'normal'), - ('state', '=', 'done'), + ('state', 'in', ['done', 'verify']), ] folhas_periodo = folha_obj.search(domain) folhas_periodo = folhas_periodo.sorted(key=lambda r: r.date_from) From da077c34cead1b1ae2890be8a276cd8a5c2646af Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Mon, 11 Sep 2017 13:26:42 -0300 Subject: [PATCH 544/787] =?UTF-8?q?[FIX]=20Evita=20que=20a=20busca=20por?= =?UTF-8?q?=20adiantamento=20de=2013=C2=BA=20busque=20em=20m=C3=AAs=20post?= =?UTF-8?q?eriores=20ao=20m=C3=AAs=20atual?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 5 +++-- l10n_br_hr_payroll/models/hr_payslip_run.py | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index c3e01087e..16ed8bd00 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1395,7 +1395,7 @@ def BUSCAR_PRIMEIRA_PARCELA(self): return line.total return 0 - def busca_adiantamento_13(self, ano): + def busca_adiantamento_13(self): '''Metodo para recuperar valor pago de adiantamento de 13º no ano :param ano: int - Ano para buscar :return: float - Valor pago neste ano @@ -1404,7 +1404,8 @@ def busca_adiantamento_13(self, ano): ('tipo_de_folha', '=', 'normal'), ('contract_id', '=', self.contract_id.id), ('state', 'in', ['done','verify']), - ('ano', '=', ano), + ('ano', '=', self.ano.ano), + ('mes', '<=', self.mes_do_ano), ] holerites = self.search( domain, order='mes_do_ano DESC') diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index a71178e44..0161f062a 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -139,7 +139,8 @@ def verificar_holerites_gerados(self): contratos_sem_holerite = [ contrato.id for contrato in contracts_id - if contrato.id not in contratos_com_holerites] + if (contrato.id not in contratos_com_holerites) + and (contrato.date_end <= lote.date_start)] lote.write({ 'contract_id': [(6, 0, contratos_sem_holerite)], From 826b3715561f7a443d1463c41d3846af90460f55 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Mon, 11 Sep 2017 13:32:33 -0300 Subject: [PATCH 545/787] [FIX] Pequeno erro no ano --- l10n_br_hr_payroll/models/hr_payslip.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 16ed8bd00..dbc10a62a 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1404,7 +1404,7 @@ def busca_adiantamento_13(self): ('tipo_de_folha', '=', 'normal'), ('contract_id', '=', self.contract_id.id), ('state', 'in', ['done','verify']), - ('ano', '=', self.ano.ano), + ('ano', '=', self.ano), ('mes', '<=', self.mes_do_ano), ] holerites = self.search( From 648dab7ac34c9e9db3f1d17e59f5d82ec7b78dcd Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Mon, 11 Sep 2017 13:35:15 -0300 Subject: [PATCH 546/787] =?UTF-8?q?[FIX]=20Pequeno=20erro=20no=20m=C3=AAs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index dbc10a62a..db570569d 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1405,7 +1405,7 @@ def busca_adiantamento_13(self): ('contract_id', '=', self.contract_id.id), ('state', 'in', ['done','verify']), ('ano', '=', self.ano), - ('mes', '<=', self.mes_do_ano), + ('mes_do_ano', '<=', self.mes_do_ano), ] holerites = self.search( domain, order='mes_do_ano DESC') From df5c20a2bf32f179264c35d099c2cb284c8a624c Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Mon, 11 Sep 2017 14:20:29 -0300 Subject: [PATCH 547/787] =?UTF-8?q?[FIX]=20Corrige=20calculo=20do=20AVOS?= =?UTF-8?q?=5F13=20quando=20contrato=20tiver=20date=5Fend=20maior=20que=20?= =?UTF-8?q?o=20m=C3=AAs=20atual?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index db570569d..830996377 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1615,10 +1615,12 @@ def sum(self, code, from_date, to_date=None): else: avos_13 = payslip.mes_do_ano if payslip.contract_id.date_end: - dia_fim_contrato = \ - fields.Date.from_string(payslip.contract_id.date_end).day - if dia_fim_contrato <= 15: - avos_13 -= 1 + if datetime.strptime(payslip.contract_id.date_end, '%Y-%m-%d').month \ + == payslip.mes_do_ano: + dia_fim_contrato = \ + fields.Date.from_string(payslip.contract_id.date_end).day + if dia_fim_contrato <= 15: + avos_13 -= 1 # Obtém os avos do payslip para as Provisão de Férias From f7dd4400d05390b5cd40c7b853b7991c5811e101 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Mon, 11 Sep 2017 21:01:27 -0300 Subject: [PATCH 548/787] =?UTF-8?q?[FIX]=20Corrige=20campo=20Per=C3=ADodo?= =?UTF-8?q?=20Aquisitivo=20n=C3=A3o=20sendo=20preenchido?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 4 ++-- l10n_br_hr_payroll/views/hr_payslip.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 830996377..7b07f15f7 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -2013,11 +2013,11 @@ def _compute_data_mes_ano(self): # @api.depends('mes_do_ano', 'ano', 'holidays_ferias', 'data_afastamento') @api.multi - @api.onchange('mes_do_ano', 'ano', 'data_afastamento', 'date_from', 'date_to') + @api.onchange('mes_do_ano', 'ano', 'data_afastamento', 'date_from', 'date_to', 'holidays_ferias') def _compute_set_dates(self): for record in self: if not record.mes_do_ano: - record.mes_do_ano = datetime.now().month + record.mes_do_ano = datetime.now().months record.mes_do_ano2 = datetime.now().month if record.tipo_de_folha == 'ferias' and record.holidays_ferias: record.periodo_aquisitivo =\ diff --git a/l10n_br_hr_payroll/views/hr_payslip.xml b/l10n_br_hr_payroll/views/hr_payslip.xml index 25c8580ea..14d2fd0ce 100644 --- a/l10n_br_hr_payroll/views/hr_payslip.xml +++ b/l10n_br_hr_payroll/views/hr_payslip.xml @@ -253,7 +253,7 @@ attrs="{'readonly': False, 'required': [('tipo_de_folha', '=', 'ferias'), ('is_simulacao', '=', False)]}"/> + attrs="{'invisible' : [('tipo_de_folha', '!=', 'ferias')]}" /> From 778a615daf1282c8f1cf4991a071c927d62d5101 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Mon, 11 Sep 2017 21:31:48 -0300 Subject: [PATCH 549/787] =?UTF-8?q?[FIX]=20Calcula=20corretamente=20mes=5F?= =?UTF-8?q?do=5Fano=20e=20ano=20quando=20for=20f=C3=A9rias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 7b07f15f7..a3b3e3371 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -2024,6 +2024,10 @@ def _compute_set_dates(self): record.holidays_ferias.controle_ferias[0] record.date_from = record.holidays_ferias.data_inicio record.date_to = record.holidays_ferias.data_fim + record.mes_do_ano = \ + datetime.strptime(record.date_from, '%Y-%m-%d').month + record.ano = \ + datetime.strptime(record.date_from, '%Y-%m-%d').year continue mes = record.mes_do_ano From 48d640407db36c2618080f98075a5ea5bfd29289 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Tue, 12 Sep 2017 09:23:48 -0300 Subject: [PATCH 550/787] =?UTF-8?q?[FIX]=20Corrige=20Busca=20de=20Contrato?= =?UTF-8?q?s=20para=20pegar=20contratos=20com=20data=20de=20rescis=C3=A3o?= =?UTF-8?q?=20maior=20que=20a=20data=20final=20do=20lote?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip_run.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index 0161f062a..48b2305c2 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -140,7 +140,7 @@ def verificar_holerites_gerados(self): contratos_sem_holerite = [ contrato.id for contrato in contracts_id if (contrato.id not in contratos_com_holerites) - and (contrato.date_end <= lote.date_start)] + and (contrato.date_end >= lote.date_end)] lote.write({ 'contract_id': [(6, 0, contratos_sem_holerite)], From bc70d18b9fb722790ebca6eae09240df47cf87fa Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Tue, 12 Sep 2017 13:51:26 -0300 Subject: [PATCH 551/787] [FIX] Corrige busca de contratos dentro do lote --- l10n_br_hr_payroll/models/hr_payslip_run.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index 48b2305c2..31d56a436 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -140,7 +140,9 @@ def verificar_holerites_gerados(self): contratos_sem_holerite = [ contrato.id for contrato in contracts_id if (contrato.id not in contratos_com_holerites) - and (contrato.date_end >= lote.date_end)] + and (contrato.date_start <= lote.date_start) + and ((contrato.date_end >= lote.date_end) + or (not contrato.date_end))] lote.write({ 'contract_id': [(6, 0, contratos_sem_holerite)], From c865dbed5b01a32ae9a09727828a64522ce2ed22 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Tue, 19 Sep 2017 13:35:39 -0300 Subject: [PATCH 552/787] =?UTF-8?q?[FIX]=20Bloqueia=20Sal=C3=A1rio=20no=20?= =?UTF-8?q?Contrato=20ap=C3=B3s=20Holerite=20criado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_contract.py | 25 ++++++++++++++++++++++++ l10n_br_hr_payroll/views/hr_contract.xml | 25 +++++++++++++++++++----- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_contract.py b/l10n_br_hr_payroll/models/hr_contract.py index 2f1a13fe3..7716b4611 100644 --- a/l10n_br_hr_payroll/models/hr_contract.py +++ b/l10n_br_hr_payroll/models/hr_contract.py @@ -18,6 +18,31 @@ class HrContract(models.Model): readonly=True ) + is_editable = fields.Boolean( + string="Pode Alterar ?", + compute="_is_editable", + default=True, + store=True, + ) + payslip_ids_confirmados = fields.One2many( + "hr.payslip", + "contract_id", + "Holerites Confirmados", + domain=[ + ('state', '!=', 'draft'), + ('is_simulacao', '=', False) + ] + ) + + @api.multi + @api.depends('payslip_ids_confirmados', 'payslip_ids_confirmados.state') + def _is_editable(self): + for contrato in self: + if len(contrato.payslip_ids_confirmados) != 0: + contrato.is_editable = False + else: + contrato.is_editable = True + @api.model def create(self, vals): if vals.get('codigo_contrato', '/') == '/': diff --git a/l10n_br_hr_payroll/views/hr_contract.xml b/l10n_br_hr_payroll/views/hr_contract.xml index fe185e9ed..3b381cd98 100644 --- a/l10n_br_hr_payroll/views/hr_contract.xml +++ b/l10n_br_hr_payroll/views/hr_contract.xml @@ -10,6 +10,13 @@ hr.contract + + + + + {'readonly': [ + ('is_editable', '=', False)]} +

@@ -38,19 +45,27 @@ - + + + + + + + + + - + - + - + - + From 561a39578e0e62712e3b41dd3c5edd507d9fae08 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Tue, 19 Sep 2017 17:36:48 -0300 Subject: [PATCH 553/787] =?UTF-8?q?[FIX]=20C=C3=A1lculo=20de=20M=C3=A9dia?= =?UTF-8?q?=20para=20Provis=C3=A3o=20de=20F=C3=A9rias=20reescrito?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 192 +++++++++++++++--------- 1 file changed, 122 insertions(+), 70 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index a3b3e3371..888b1354b 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -811,81 +811,133 @@ def IRRF(self, BASE_IRRF, INSS): return 0 def MEDIA_RUBRICA(self, codigo): - # - # Calcular o período desejado e a quantidade de meses - # Para ser usado no cálculo da média - # - meses = 12 - if self.tipo_de_folha in \ - ['ferias', 'aviso_previo', 'provisao_ferias']: - if self.tipo_de_folha in ['provisao_ferias', 'aviso_previo']: - periodo_aquisitivo = \ - self.contract_id.vacation_control_ids[0] - else: - periodo_aquisitivo = self.periodo_aquisitivo - - if self.tipo_de_folha in ['aviso_previo']: - data_de_inicio = fields.Date.from_string( - self.date_from) - relativedelta(months=12) - data_inicio_mes = fields.Date.from_string( - self.date_from).replace(day=1) - relativedelta( - months=12) - else: - data_de_inicio = fields.Date.from_string( - periodo_aquisitivo.inicio_aquisitivo) - data_inicio_mes = fields.Date.from_string( - periodo_aquisitivo.inicio_aquisitivo).replace(day=1) - - # Se trabalhou mais do que 15 dias, contabilizar o mes corrente - if (data_de_inicio - data_inicio_mes).days < 15: - data_de_inicio = data_inicio_mes - # Senão começar contabilizar medias apartir do mes seguinte - else: - data_de_inicio = data_inicio_mes + relativedelta(months=1) - if self.tipo_de_folha in ['provisao_ferias']: - data_final = self.date_to - else: - data_final = data_inicio_mes + relativedelta(months=12) - dtstart = datetime.strptime(data_de_inicio, '%Y-%m-%d') - dtend = datetime.strptime(data_final, '%Y-%m-%d') - dates = [dt for dt in rrule(MONTHLY, dtstart=dtstart, until=dtend)] - meses = len(dates) + if self.tipo_de_folha == 'provisao_ferias': + # + # Identifica os períodos aquisitivos com saldo de férias + # + media = 0 + periodos_aquisitivos = [] + for periodo in self.contract_id.vacation_control_ids: + if periodo.saldo != 0: + periodos_aquisitivos.append(periodo) + # + # Buscar Holerites do Período + # + inicio = datetime.strptime( + periodo.inicio_aquisitivo, '%Y-%m-%d') + fim = datetime.strptime( + periodo.fim_aquisitivo, '%Y-%m-%d') + r = relativedelta(fim, inicio) + meses = r.months + if r.days >= 15: + meses += 1 + folha_obj = self.env['hr.payslip'] + data_fim = min([fim, + datetime.strptime(self.date_to, + '%Y-%m-%d')]) + domain = [ + ('date_from', '>=', periodo.inicio_aquisitivo), + ('date_from', '<=', data_fim), + # ('date_to', '>=', periodo.inicio_aquisitivo), + # ('date_to', '<=', periodo.fim_aquisitivo), + ('contract_id', '=', self.contract_id.id), + ('tipo_de_folha', '=', 'normal'), + ('state', 'in', ['done', 'verify']), + ] + folhas_periodo = folha_obj.search(domain) + folhas_periodo = folhas_periodo.sorted(key=lambda r: r.date_from) - elif self.tipo_de_folha in [ - 'decimo_terceiro', 'provisao_decimo_terceiro' - ]: - if self.contract_id.date_start > str(self.ano) + '-01-01': - data_de_inicio = self.contract_id.date_start - else: - data_de_inicio = str(self.ano) + '-01-01' - data_final = self.date_to + # + # Obter os valores das rubricas especificadas nos holerites + # + valor = 0 + for holerite in folhas_periodo: + for linha in holerite.line_ids: + if linha.code == codigo: + valor += linha.total - # - # Buscar Holerites do Período - # - folha_obj = self.env['hr.payslip'] - domain = [ - ('date_from', '>=', data_de_inicio), - ('date_to', '<=', data_final), - ('contract_id', '=', self.contract_id.id), - ('tipo_de_folha', '=', 'normal'), - ('state', 'in', ['done', 'verify']), - ] - folhas_periodo = folha_obj.search(domain) - folhas_periodo = folhas_periodo.sorted(key=lambda r: r.date_from) + if meses != 0: + media += ((valor / meses) / 30) * periodo.saldo - # - # Buscar dentro dos holerites pela rubrica requerida - # - valor = 0 - for folha in folhas_periodo: - for linha in folha.line_ids: - if linha.salary_rule_id.code == codigo: - valor += linha.total + return media + + else: + # + # Calcular o período desejado e a quantidade de meses + # Para ser usado no cálculo da média + # + meses = 12 + if self.tipo_de_folha in \ + ['ferias', 'aviso_previo']: + if self.tipo_de_folha in ['provisao_ferias', 'aviso_previo']: + periodo_aquisitivo = \ + self.contract_id.vacation_control_ids[0] + else: + periodo_aquisitivo = self.periodo_aquisitivo + + if self.tipo_de_folha in ['aviso_previo']: + data_de_inicio = fields.Date.from_string( + self.date_from) - relativedelta(months=12) + data_inicio_mes = fields.Date.from_string( + self.date_from).replace(day=1) - relativedelta( + months=12) + else: + data_de_inicio = fields.Date.from_string( + periodo_aquisitivo.inicio_aquisitivo) + data_inicio_mes = fields.Date.from_string( + periodo_aquisitivo.inicio_aquisitivo).replace(day=1) + + # Se trabalhou mais do que 15 dias, contabilizar o mes corrente + if (data_de_inicio - data_inicio_mes).days < 15: + data_de_inicio = data_inicio_mes + # Senão começar contabilizar medias apartir do mes seguinte + else: + data_de_inicio = data_inicio_mes + relativedelta(months=1) + if self.tipo_de_folha in ['provisao_ferias']: + data_final = self.date_to + else: + data_final = data_inicio_mes + relativedelta(months=12) + + dtstart = datetime.strptime(data_de_inicio, '%Y-%m-%d') + dtend = datetime.strptime(data_final, '%Y-%m-%d') + dates = [dt for dt in rrule(MONTHLY, dtstart=dtstart, until=dtend)] + meses = len(dates) + + elif self.tipo_de_folha in [ + 'decimo_terceiro', 'provisao_decimo_terceiro' + ]: + if self.contract_id.date_start > str(self.ano) + '-01-01': + data_de_inicio = self.contract_id.date_start + else: + data_de_inicio = str(self.ano) + '-01-01' + data_final = self.date_to + + # + # Buscar Holerites do Período + # + folha_obj = self.env['hr.payslip'] + domain = [ + ('date_from', '>=', data_de_inicio), + ('date_to', '<=', data_final), + ('contract_id', '=', self.contract_id.id), + ('tipo_de_folha', '=', 'normal'), + ('state', 'in', ['done', 'verify']), + ] + folhas_periodo = folha_obj.search(domain) + folhas_periodo = folhas_periodo.sorted(key=lambda r: r.date_from) - media = valor / meses - return media + # + # Buscar dentro dos holerites pela rubrica requerida + # + valor = 0 + for folha in folhas_periodo: + for linha in folha.line_ids: + if linha.salary_rule_id.code == codigo: + valor += linha.total + + media = valor / meses + return media @api.model def get_contract_specific_rubrics(self, contract_id, rule_ids): From aae097afa19670e64a4545d4848f5791e691b13f Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Sat, 30 Sep 2017 09:18:24 -0300 Subject: [PATCH 554/787] =?UTF-8?q?[FIX]=20Corre=C3=A7=C3=A3o=20erros=20de?= =?UTF-8?q?=20valida=C3=A7=C3=A3o=20SEFIP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_arquivos_governo/constantes_rh.py | 4 ++-- l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/constantes_rh.py b/l10n_br_hr_arquivos_governo/constantes_rh.py index 2c753d9b5..4f2c6f8ba 100644 --- a/l10n_br_hr_arquivos_governo/constantes_rh.py +++ b/l10n_br_hr_arquivos_governo/constantes_rh.py @@ -86,9 +86,9 @@ ('08', u'Agosto'), ('09', u'Setembro'), ('10', u'Outubro'), - ('11', u'NOvembro'), + ('11', u'Novembro'), ('12', u'Dezembro'), - ('13', u'Décimo Terceiro'), + ('13', u'13º Salário'), ] MODALIDADE_ARQUIVO = [ diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index c3752b34d..3f720eaf4 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -503,6 +503,7 @@ def _get_folha_ids(self): folha_ids = self.env['hr.payslip'].search([ ('mes_do_ano', '=', self.mes), ('ano', '=', self.ano), + ('tipo_de_folha', 'in', ['normal','rescisao']), # ('state', 'in', ['done','verify']), ('company_id.partner_id.cnpj_cpf', 'like', raiz) ]) From b88adc9bd6b6f5e72f5bb3101af87b26d1b76e21 Mon Sep 17 00:00:00 2001 From: Luiz Felipe Divino Date: Mon, 2 Oct 2017 07:39:23 -0300 Subject: [PATCH 555/787] [ADD] Criar lancamentos financeiros - Criar lancamentos financeiros da DARF e da GPS --- .../models/l10n_br_hr_sefip.py | 93 +++++++++++++++++++ .../models/res_company.py | 36 +++++++ .../views/res_company.xml | 14 +++ 3 files changed, 143 insertions(+) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index c3752b34d..b30e49dbd 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -10,6 +10,7 @@ import logging import base64 import pybrasil +from datetime import timedelta from openerp import api, fields, models, _ from openerp.exceptions import ValidationError @@ -589,6 +590,63 @@ def prepara_financial_move(self, partner_id, sindicato_info): 'sefip_id': self.id, } + def prepara_financial_move_darf(self, DARF): + ''' + Tratar dados do sefip e criar um dict para criar financial.move de + guia DARF. + :param DARF: float com valor total do recolhimento + :return: dict com valores para criar financial.move + ''' + date = fields.Date.from_string(fields.Date.today()) + date = date + timedelta(days=31) + data_vencimento = fields.Date.from_string( + str(date.year) + '-' + str(date.month) + '-' + + str(self.company_id.darf_dia_vencimento) + ) + + return { + 'date_document': fields.Date.today(), + 'partner_id': self.env.ref('base.user_root').id, + 'doc_source_id': 'l10n_br.hr.sefip,' + str(self.id), + 'company_id': self.company_id.id, + 'amount_document': DARF, + 'document_number': '1234', + 'account_id': self.company_id.darf_account_id.id, + 'document_type_id': self.company_id.darf_document_type.id, + 'type': '2pay', + 'date_maturity': data_vencimento, + 'payment_mode_id': self.company_id.darf_carteira_cobranca.id, + 'sefip_id': self.id, + } + + def prepara_financial_move_gps(self, GPS): + ''' + Tratar dados do sefip e criar um dict para criar financial.move de + guia GPS. + :param GPS: float com valor total do recolhimento + :return: dict com valores para criar financial.move + ''' + date = fields.Date.from_string(fields.Date.today()) + date = date + timedelta(days=31) + data_vencimento = fields.Date.from_string( + str(date.year) + '-' + str(date.month) + '-' + + str(self.company_id.darf_dia_vencimento) + ) + + return { + 'date_document': fields.Date.today(), + 'partner_id': self.env.ref('base.user_root').id, + 'doc_source_id': 'l10n_br.hr.sefip,' + str(self.id), + 'company_id': self.company_id.id, + 'amount_document': GPS, + 'document_number': '1234', + 'account_id': self.company_id.gps_account_id.id, + 'document_type_id': self.company_id.gps_document_type.id, + 'type': '2pay', + 'date_maturity': data_vencimento, + 'payment_mode_id': self.company_id.gps_carteira_cobranca.id, + 'sefip_id': self.id, + } @api.multi def gerar_boletos(self): ''' @@ -599,7 +657,18 @@ def gerar_boletos(self): contribuicao_sindical = {} for record in self: created_ids = [] + empresas = {} for holerite in self.folha_ids: + if not empresas.get(holerite.company_id.id): + empresas.update({ + holerite.company_id.id: { + 'INSS_funcionarios': 0.00, + 'INSS_empresa': 0.00, + 'INSS_outras_entidades': 0.00, + 'INSS_rat_fap': 0.00, + 'DARF': 0.00, + } + }) for line in holerite.line_ids: remuneracao = line.slip_id.line_ids.filtered( lambda x: x.code == 'LIQUIDO') @@ -621,6 +690,22 @@ def gerar_boletos(self): 'qtd_contribuintes'] = 1 contribuicao_sindical[id_sindicato][ 'total_remuneracao'] = remuneracao.total + elif line.code == 'INSS': + empresas[line.slip_id.company_id.id][ + 'INSS_funcionarios'] += line.total + elif line.code == 'INSS_EMPRESA': + empresas[line.slip_id.company_id.id][ + 'INSS_empresa'] += line.total + elif line.code == 'INSS_OUTRAS_ENTIDADES': + empresas[line.slip_id.company_id.id][ + 'INSS_outras_entidades'] += line.total + elif line.code == 'INSS_RAT_FAP': + empresas[line.slip_id.company_id.id][ + 'INSS_rat_fap'] += line.total + elif line.code == 'IRPF': + empresas[line.slip_id.company_id.id][ + 'DARF'] += line.total + for sindicato in contribuicao_sindical: vals = self.prepara_financial_move( @@ -629,6 +714,14 @@ def gerar_boletos(self): financial_move = self.env['financial.move'].create(vals) created_ids.append(financial_move.id) + vals_darf = self.prepara_financial_move_darf(DARF) + financial_move_darf = self.env['financial.move'].create(vals_darf) + created_ids.append(financial_move_darf.id) + vals_gps = self.prepara_financial_move_gps(GPS) + financial_move_darf = self.env['financial.move'].create(vals_gps) + created_ids.append(financial_move_darf.id) + + return { 'domain': "[('id', 'in', %s)]" % created_ids, 'name': _("Boletos para sindicatos"), diff --git a/l10n_br_hr_arquivos_governo/models/res_company.py b/l10n_br_hr_arquivos_governo/models/res_company.py index 9039c8357..a70d5cee0 100644 --- a/l10n_br_hr_arquivos_governo/models/res_company.py +++ b/l10n_br_hr_arquivos_governo/models/res_company.py @@ -81,3 +81,39 @@ def _check_phone_br(self): comodel_name=u'payment.mode', help=u'Carteira padrão para geração de boletos do sindicato.', ) + + darf_account_id = fields.Many2one( + string=u'Conta', + comodel_name=u'financial.account', + help=u'Conta para lançamentos da DARF' + ) + darf_document_type = fields.Many2one( + string=u'Tipo do documento', + comodel_name=u'financial.document.type', + help=u'Tipo do documento que irá aparecer no lançamento financeiro' + ) + darf_carteira_cobranca = fields.Many2one( + string=u'Carteira de cobrança', + comodel_name=u'payment.mode', + help=u'Nome da carteira de cobrança caso exista' + ) + darf_dia_vencimento = fields.Integer( + string=u'Dia de vencimento', + help=u'Dia de vencimento da guia do DARF de todo mês' + ) + + gps_account_id = fields.Many2one( + string=u'Conta', + comodel_name=u'financial.account', + help=u'Conta para lançamentos da DARF' + ) + gps_document_type = fields.Many2one( + string=u'Tipo do documento', + comodel_name=u'financial.document.type', + help=u'Tipo do documento que irá aparecer no lançamento financeiro' + ) + gps_carteira_cobranca = fields.Many2one( + string=u'Carteira de cobrança', + comodel_name=u'payment.mode', + help=u'Nome da carteira de cobrança caso exista' + ) \ No newline at end of file diff --git a/l10n_br_hr_arquivos_governo/views/res_company.xml b/l10n_br_hr_arquivos_governo/views/res_company.xml index 621164b99..6ab7c86e8 100644 --- a/l10n_br_hr_arquivos_governo/views/res_company.xml +++ b/l10n_br_hr_arquivos_governo/views/res_company.xml @@ -27,7 +27,21 @@ + + + + + + + + + + + + + +
From 620cf60ecf996d55c28162b15eb547236e78ef41 Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Mon, 2 Oct 2017 10:34:46 -0300 Subject: [PATCH 556/787] [FIX] Criacao lancamentos financeiros DARF e GPS - Criado o campo de sequencia para ambos os documentos, acertado a data de validade dos lancamentos financeiros e diferenciado as guias em caso de multiplas empresas. --- .../models/l10n_br_hr_sefip.py | 80 +++++++++++-------- .../models/res_company.py | 10 ++- .../views/res_company.xml | 29 +++---- 3 files changed, 72 insertions(+), 47 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index b30e49dbd..54411f646 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -590,63 +590,72 @@ def prepara_financial_move(self, partner_id, sindicato_info): 'sefip_id': self.id, } - def prepara_financial_move_darf(self, DARF): + def prepara_financial_move_darf(self, empresa_id, dados_empresa): ''' Tratar dados do sefip e criar um dict para criar financial.move de guia DARF. :param DARF: float com valor total do recolhimento :return: dict com valores para criar financial.move ''' - date = fields.Date.from_string(fields.Date.today()) - date = date + timedelta(days=31) - data_vencimento = fields.Date.from_string( - str(date.year) + '-' + str(date.month) + '-' + - str(self.company_id.darf_dia_vencimento) + data = self.ano + '-' + self.mes + '-' + str( + self.company_id.darf_dia_vencimento) + data_vencimento = fields.Date.from_string(data ) + data_vencimento = data_vencimento + timedelta(days=31) + + empresa = self.env['res.company'].browse(empresa_id) + + sequence_id = empresa.darf_sequence_id.id + doc_number = str(self.env['ir.sequence'].next_by_id(sequence_id)) return { 'date_document': fields.Date.today(), 'partner_id': self.env.ref('base.user_root').id, 'doc_source_id': 'l10n_br.hr.sefip,' + str(self.id), - 'company_id': self.company_id.id, - 'amount_document': DARF, - 'document_number': '1234', - 'account_id': self.company_id.darf_account_id.id, - 'document_type_id': self.company_id.darf_document_type.id, + 'company_id': empresa_id, + 'amount_document': dados_empresa['DARF'], + 'document_number': 'DARF-' + str(doc_number), + 'account_id': empresa.darf_account_id.id, + 'document_type_id': empresa.darf_document_type.id, 'type': '2pay', 'date_maturity': data_vencimento, - 'payment_mode_id': self.company_id.darf_carteira_cobranca.id, + 'payment_mode_id': empresa.darf_carteira_cobranca.id, 'sefip_id': self.id, } - def prepara_financial_move_gps(self, GPS): + def prepara_financial_move_gps(self, empresa_id, dados_empresa): ''' Tratar dados do sefip e criar um dict para criar financial.move de guia GPS. :param GPS: float com valor total do recolhimento :return: dict com valores para criar financial.move ''' - date = fields.Date.from_string(fields.Date.today()) - date = date + timedelta(days=31) - data_vencimento = fields.Date.from_string( - str(date.year) + '-' + str(date.month) + '-' + - str(self.company_id.darf_dia_vencimento) - ) + + empresa = self.env['res.company'].browse(empresa_id) + + sequence_id = empresa.darf_sequence_id.id + doc_number = str(self.env['ir.sequence'].next_by_id(sequence_id)) + + GPS = dados_empresa['INSS_funcionarios'] + \ + dados_empresa['INSS_empresa'] + \ + dados_empresa['INSS_outras_entidades'] + \ + dados_empresa['INSS_rat_fap'] return { 'date_document': fields.Date.today(), 'partner_id': self.env.ref('base.user_root').id, 'doc_source_id': 'l10n_br.hr.sefip,' + str(self.id), - 'company_id': self.company_id.id, + 'company_id': empresa_id, 'amount_document': GPS, - 'document_number': '1234', - 'account_id': self.company_id.gps_account_id.id, - 'document_type_id': self.company_id.gps_document_type.id, + 'document_number': 'GPS-' + str(doc_number), + 'account_id': empresa.gps_account_id.id, + 'document_type_id': empresa.gps_document_type.id, 'type': '2pay', - 'date_maturity': data_vencimento, - 'payment_mode_id': self.company_id.gps_carteira_cobranca.id, + 'date_maturity': self.data_recolhimento_gps, + 'payment_mode_id': empresa.gps_carteira_cobranca.id, 'sefip_id': self.id, } + @api.multi def gerar_boletos(self): ''' @@ -714,13 +723,20 @@ def gerar_boletos(self): financial_move = self.env['financial.move'].create(vals) created_ids.append(financial_move.id) - vals_darf = self.prepara_financial_move_darf(DARF) - financial_move_darf = self.env['financial.move'].create(vals_darf) - created_ids.append(financial_move_darf.id) - vals_gps = self.prepara_financial_move_gps(GPS) - financial_move_darf = self.env['financial.move'].create(vals_gps) - created_ids.append(financial_move_darf.id) - + for company in empresas: + dados_empresa = empresas[company] + vals_darf = self.prepara_financial_move_darf( + company, dados_empresa) + financial_move_darf = self.env['financial.move'].create( + vals_darf + ) + created_ids.append(financial_move_darf.id) + vals_gps = self.prepara_financial_move_gps( + company, dados_empresa) + financial_move_darf = self.env['financial.move'].create( + vals_gps + ) + created_ids.append(financial_move_darf.id) return { 'domain': "[('id', 'in', %s)]" % created_ids, diff --git a/l10n_br_hr_arquivos_governo/models/res_company.py b/l10n_br_hr_arquivos_governo/models/res_company.py index a70d5cee0..c25648375 100644 --- a/l10n_br_hr_arquivos_governo/models/res_company.py +++ b/l10n_br_hr_arquivos_governo/models/res_company.py @@ -97,6 +97,10 @@ def _check_phone_br(self): comodel_name=u'payment.mode', help=u'Nome da carteira de cobrança caso exista' ) + darf_sequence_id = fields.Many2one( + string=u'Sequencia dos documentos', + comodel_name=u'ir.sequence' + ) darf_dia_vencimento = fields.Integer( string=u'Dia de vencimento', help=u'Dia de vencimento da guia do DARF de todo mês' @@ -116,4 +120,8 @@ def _check_phone_br(self): string=u'Carteira de cobrança', comodel_name=u'payment.mode', help=u'Nome da carteira de cobrança caso exista' - ) \ No newline at end of file + ) + gps_sequence_id = fields.Many2one( + string=u'Sequencia dos documentos', + comodel_name=u'ir.sequence' + ) diff --git a/l10n_br_hr_arquivos_governo/views/res_company.xml b/l10n_br_hr_arquivos_governo/views/res_company.xml index 6ab7c86e8..9a2487774 100644 --- a/l10n_br_hr_arquivos_governo/views/res_company.xml +++ b/l10n_br_hr_arquivos_governo/views/res_company.xml @@ -27,21 +27,22 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + + From 78617892d79abd6be3c9f73a7d486e16cbf4e097 Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Tue, 3 Oct 2017 18:01:50 -0300 Subject: [PATCH 557/787] [ADD] Guias em formato py3o --- l10n_br_hr_arquivos_governo/__openerp__.py | 1 + l10n_br_hr_arquivos_governo/data/gps.odt | Bin 0 -> 32746 bytes l10n_br_hr_arquivos_governo/data/guia_darf.odt | Bin 0 -> 34124 bytes 3 files changed, 1 insertion(+) create mode 100644 l10n_br_hr_arquivos_governo/data/gps.odt create mode 100644 l10n_br_hr_arquivos_governo/data/guia_darf.odt diff --git a/l10n_br_hr_arquivos_governo/__openerp__.py b/l10n_br_hr_arquivos_governo/__openerp__.py index b954b69fe..e6e61ccef 100644 --- a/l10n_br_hr_arquivos_governo/__openerp__.py +++ b/l10n_br_hr_arquivos_governo/__openerp__.py @@ -14,6 +14,7 @@ 'l10n_br_hr_payroll', 'l10n_br_account', 'l10n_br_financial_payment_order', + 'report_py3o', ], 'external_dependencies': { 'python': ['pybrasil'], diff --git a/l10n_br_hr_arquivos_governo/data/gps.odt b/l10n_br_hr_arquivos_governo/data/gps.odt new file mode 100644 index 0000000000000000000000000000000000000000..c224df58025ed6008239f0eccee0bacc9d049204 GIT binary patch literal 32746 zcmb@sbyOTp^esC01PB?N1cJM}>)-^};10oEgKKbi3+`^g-QC^Y-R;e{-hJ|0>;8GG zR(03(RM$w=IcJ}}TmA1hR)lvR`O!nJ|k~bF{0Qj%rKqgcE z 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 literal 0 HcmV?d00001 diff --git a/l10n_br_hr_arquivos_governo/data/guia_darf.odt b/l10n_br_hr_arquivos_governo/data/guia_darf.odt new file mode 100644 index 0000000000000000000000000000000000000000..dde960423f070f68fd975bc30f1a805bd6775965 GIT binary patch literal 34124 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 BN>cy; literal 0 HcmV?d00001 From 9bd8765800b72c4fb3418a1f564b68f645ff8a03 Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Wed, 4 Oct 2017 17:52:07 -0300 Subject: [PATCH 558/787] [REM] Relatorios py3o --- l10n_br_hr_arquivos_governo/__openerp__.py | 1 - l10n_br_hr_arquivos_governo/data/gps.odt | Bin 32746 -> 0 bytes l10n_br_hr_arquivos_governo/data/guia_darf.odt | Bin 34124 -> 0 bytes 3 files changed, 1 deletion(-) delete mode 100644 l10n_br_hr_arquivos_governo/data/gps.odt delete mode 100644 l10n_br_hr_arquivos_governo/data/guia_darf.odt diff --git a/l10n_br_hr_arquivos_governo/__openerp__.py b/l10n_br_hr_arquivos_governo/__openerp__.py index e6e61ccef..b954b69fe 100644 --- a/l10n_br_hr_arquivos_governo/__openerp__.py +++ b/l10n_br_hr_arquivos_governo/__openerp__.py @@ -14,7 +14,6 @@ 'l10n_br_hr_payroll', 'l10n_br_account', 'l10n_br_financial_payment_order', - 'report_py3o', ], 'external_dependencies': { 'python': ['pybrasil'], diff --git a/l10n_br_hr_arquivos_governo/data/gps.odt b/l10n_br_hr_arquivos_governo/data/gps.odt deleted file mode 100644 index c224df58025ed6008239f0eccee0bacc9d049204..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32746 zcmb@sbyOTp^esC01PB?N1cJM}>)-^};10oEgKKbi3+`^g-QC^Y-R;e{-hJ|0>;8GG zR(03(RM$w=IcJ}}TmA1hR)lvR`O!nJ|k~bF{0Qj%rKqgcE z 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 diff --git a/l10n_br_hr_arquivos_governo/data/guia_darf.odt b/l10n_br_hr_arquivos_governo/data/guia_darf.odt deleted file mode 100644 index dde960423f070f68fd975bc30f1a805bd6775965..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34124 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 BN>cy; From 1e05261faaf9ea5576678bc3512d15d93b06495a Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Thu, 5 Oct 2017 16:48:14 -0300 Subject: [PATCH 559/787] [ADD] Campo do codigo da Darf na regra de salario --- l10n_br_hr_arquivos_governo/__openerp__.py | 1 + l10n_br_hr_arquivos_governo/models/__init__.py | 1 + .../models/inherited_hr_salary_rule.py | 15 +++++++++++++++ .../views/inherited_hr_salary_rule_view.xml | 17 +++++++++++++++++ 4 files changed, 34 insertions(+) create mode 100644 l10n_br_hr_arquivos_governo/models/inherited_hr_salary_rule.py create mode 100644 l10n_br_hr_arquivos_governo/views/inherited_hr_salary_rule_view.xml diff --git a/l10n_br_hr_arquivos_governo/__openerp__.py b/l10n_br_hr_arquivos_governo/__openerp__.py index b954b69fe..167aa81cc 100644 --- a/l10n_br_hr_arquivos_governo/__openerp__.py +++ b/l10n_br_hr_arquivos_governo/__openerp__.py @@ -29,5 +29,6 @@ 'views/l10n_br_hr_employee.xml', 'views/l10n_br_hr_sefip.xml', 'views/res_company.xml', + 'views/inherited_hr_salary_rule_view.xml' ], } diff --git a/l10n_br_hr_arquivos_governo/models/__init__.py b/l10n_br_hr_arquivos_governo/models/__init__.py index 428598511..6cce1a483 100644 --- a/l10n_br_hr_arquivos_governo/models/__init__.py +++ b/l10n_br_hr_arquivos_governo/models/__init__.py @@ -11,3 +11,4 @@ from . import l10n_br_hr_payslip from . import res_company from . import l10n_br_hr_sefip +from . import inherited_hr_salary_rule diff --git a/l10n_br_hr_arquivos_governo/models/inherited_hr_salary_rule.py b/l10n_br_hr_arquivos_governo/models/inherited_hr_salary_rule.py new file mode 100644 index 000000000..f783a169c --- /dev/null +++ b/l10n_br_hr_arquivos_governo/models/inherited_hr_salary_rule.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 KMEE INFORMATICA LTDA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from __future__ import division, print_function, unicode_literals + +from openerp import models, fields + + +class HrSalaryRule(models.Model): + _inherit = b"hr.salary.rule" + + codigo_darf = fields.Char( + string=b"Código da DARF" + ) diff --git a/l10n_br_hr_arquivos_governo/views/inherited_hr_salary_rule_view.xml b/l10n_br_hr_arquivos_governo/views/inherited_hr_salary_rule_view.xml new file mode 100644 index 000000000..241c3a197 --- /dev/null +++ b/l10n_br_hr_arquivos_governo/views/inherited_hr_salary_rule_view.xml @@ -0,0 +1,17 @@ + + + + + + hr.salary.rule (Financial Payment Order) + hr.salary.rule + + + + + + + + + + From 9952accbe67a4173e2edf60f14f0d20f1ce8d975 Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Thu, 5 Oct 2017 16:48:38 -0300 Subject: [PATCH 560/787] [REF] Lancamentos financeiros de DARF Separadas pelo codigo de darf definido nas regras de salario --- .../models/l10n_br_hr_sefip.py | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index 54411f646..6fe2c214c 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -590,7 +590,7 @@ def prepara_financial_move(self, partner_id, sindicato_info): 'sefip_id': self.id, } - def prepara_financial_move_darf(self, empresa_id, dados_empresa): + def prepara_financial_move_darf(self, valor): ''' Tratar dados do sefip e criar um dict para criar financial.move de guia DARF. @@ -603,23 +603,21 @@ def prepara_financial_move_darf(self, empresa_id, dados_empresa): ) data_vencimento = data_vencimento + timedelta(days=31) - empresa = self.env['res.company'].browse(empresa_id) - - sequence_id = empresa.darf_sequence_id.id + sequence_id = self.company_id.darf_sequence_id.id doc_number = str(self.env['ir.sequence'].next_by_id(sequence_id)) return { 'date_document': fields.Date.today(), 'partner_id': self.env.ref('base.user_root').id, 'doc_source_id': 'l10n_br.hr.sefip,' + str(self.id), - 'company_id': empresa_id, - 'amount_document': dados_empresa['DARF'], + 'company_id': self.company_id.id, + 'amount_document': valor, 'document_number': 'DARF-' + str(doc_number), - 'account_id': empresa.darf_account_id.id, - 'document_type_id': empresa.darf_document_type.id, + 'account_id': self.company_id.darf_account_id.id, + 'document_type_id': self.company_id.darf_document_type.id, 'type': '2pay', 'date_maturity': data_vencimento, - 'payment_mode_id': empresa.darf_carteira_cobranca.id, + 'payment_mode_id': self.company_id.darf_carteira_cobranca.id, 'sefip_id': self.id, } @@ -667,6 +665,7 @@ def gerar_boletos(self): for record in self: created_ids = [] empresas = {} + darfs = {} for holerite in self.folha_ids: if not empresas.get(holerite.company_id.id): empresas.update({ @@ -675,7 +674,6 @@ def gerar_boletos(self): 'INSS_empresa': 0.00, 'INSS_outras_entidades': 0.00, 'INSS_rat_fap': 0.00, - 'DARF': 0.00, } }) for line in holerite.line_ids: @@ -712,9 +710,15 @@ def gerar_boletos(self): empresas[line.slip_id.company_id.id][ 'INSS_rat_fap'] += line.total elif line.code == 'IRPF': - empresas[line.slip_id.company_id.id][ - 'DARF'] += line.total - + if darfs.get(line.salary_rule_id.codigo_darf): + darfs[line.salary_rule_id.codigo_darf] += \ + line.total + else: + darfs.update( + { + line.salary_rule_id.codigo_darf: line.total + } + ) for sindicato in contribuicao_sindical: vals = self.prepara_financial_move( @@ -725,17 +729,18 @@ def gerar_boletos(self): for company in empresas: dados_empresa = empresas[company] - vals_darf = self.prepara_financial_move_darf( - company, dados_empresa) - financial_move_darf = self.env['financial.move'].create( - vals_darf - ) - created_ids.append(financial_move_darf.id) vals_gps = self.prepara_financial_move_gps( company, dados_empresa) - financial_move_darf = self.env['financial.move'].create( + financial_move_gps = self.env['financial.move'].create( vals_gps ) + created_ids.append(financial_move_gps.id) + + for cod_darf in darfs: + vals_darf = self.prepara_financial_move_darf(darfs[cod_darf]) + financial_move_darf = self.env['financial.move'].create( + vals_darf + ) created_ids.append(financial_move_darf.id) return { From f3e13bee838b153b642ed66e13e53d45b57fc2a9 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Sun, 8 Oct 2017 09:38:49 -0300 Subject: [PATCH 561/787] [FIX] Incluso categoria_sefip na ordem dos holerites --- l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index 1a2cd18ef..9c8453658 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -803,8 +803,11 @@ def gerar_sefip(self): self._preencher_registro_12(company_id, sefip)) for folha in folhas_da_empresa.sorted( - key=lambda folha: punctuation_rm( - folha.employee_id.pis_pasep)): + key=lambda folha: + ( + punctuation_rm(folha.employee_id.pis_pasep), + folha.contract_id.categoria_sefip + )): record.sefip += self._valida_tamanho_linha( record._preencher_registro_30(sefip, folha)) From 3fbe4b346ca8d3c74d2b5f385230c6cbf698f73c Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Wed, 18 Oct 2017 23:00:10 -0200 Subject: [PATCH 562/787] [ADD] Impressao da GPS no Registro Financeiro --- .../models/l10n_br_hr_sefip.py | 90 +++++++++++++++++-- 1 file changed, 81 insertions(+), 9 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index 9c8453658..53448c670 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -7,12 +7,18 @@ division, print_function, unicode_literals, absolute_import ) +import os +import tempfile import logging import base64 import pybrasil +import sh +from py3o.template import Template from datetime import timedelta from openerp import api, fields, models, _ from openerp.exceptions import ValidationError +from pybrasil.valor import formata_valor +from pybrasil.data import formata_data from openerp.addons.l10n_br_base.tools.misc import punctuation_rm @@ -26,6 +32,7 @@ ) _logger = logging.getLogger(__name__) +CURDIR = os.path.dirname(os.path.abspath(__file__)) class SefipAttachments(models.Model): @@ -624,10 +631,9 @@ def prepara_financial_move_darf(self, valor): def prepara_financial_move_gps(self, empresa_id, dados_empresa): ''' - Tratar dados do sefip e criar um dict para criar financial.move de - guia GPS. - :param GPS: float com valor total do recolhimento - :return: dict com valores para criar financial.move + Criar financial.move de guia GPS, imprimir GPS e anexá-la ao move. + :param GPS: float com valor total do recolhimento + :return: financial.move ''' empresa = self.env['res.company'].browse(empresa_id) @@ -640,7 +646,56 @@ def prepara_financial_move_gps(self, empresa_id, dados_empresa): dados_empresa['INSS_outras_entidades'] + \ dados_empresa['INSS_rat_fap'] - return { + INSS = dados_empresa['INSS_funcionarios'] + \ + dados_empresa['INSS_empresa'] + \ + dados_empresa['INSS_rat_fap'] + + TERCEIROS = dados_empresa['INSS_outras_entidades'] + + dir_base = os.path.dirname(os.path.dirname(os.path.dirname(CURDIR))) + arquivo_template_gps = os.path.join(dir_base, + 'kmee_odoo_addons', + 'l10n_br_hr_payroll_report', + 'data', + 'gps.odt' + ) + + if os.path.exists(arquivo_template_gps): + + template_gps = open(arquivo_template_gps, 'rb') + arquivo_temporario = tempfile.NamedTemporaryFile(delete=False) + + vals_impressao = { + 'codigo': self.codigo_recolhimento_gps or '', + 'cnpj_cpf': self.company_id.cnpj_cpf or '', + 'legal_name': self.company_id.legal_name or '', + 'endereco': self.company_id.street or '' + + self.company_id.number or '', + 'telefone': self.company_id.phone or '', + 'bairro': self.company_id.district or '', + 'cidade': self.company_id.l10n_br_city_id.name or '', + 'estado': self.company_id.state_id.name or '', + 'cep': self.company_id.zip or '', + 'data_vencimento': + formata_data(self.data_recolhimento_gps), + 'mes_do_ano': self.mes or '', + 'ano': self.ano or '', + 'valor_inss': formata_valor(INSS), + 'total_bruto_inss_terceiros': formata_valor(TERCEIROS), + 'total_liquido_inss': formata_valor(GPS), + } + + template = Template(template_gps, arquivo_temporario.name) + template.render(vals_impressao) + sh.libreoffice('--headless', '--invisible', '--convert-to', 'pdf', + '--outdir', '/tmp', arquivo_temporario.name) + + pdf = open(arquivo_temporario.name + '.pdf', 'rb').read() + + os.remove(arquivo_temporario.name + '.pdf') + os.remove(arquivo_temporario.name) + + vals_gps = { 'date_document': fields.Date.today(), 'partner_id': self.env.ref('base.user_root').id, 'doc_source_id': 'l10n_br.hr.sefip,' + str(self.id), @@ -655,6 +710,26 @@ def prepara_financial_move_gps(self, empresa_id, dados_empresa): 'sefip_id': self.id, } + financial_move_gps = self.env['financial.move'].create( + vals_gps + ) + + if os.path.exists(arquivo_template_gps): + vals_anexo = { + 'name': 'GPS.pdf', + 'datas_fname': 'GPS.pdf', + 'res_model': 'financial.move', + 'res_id': financial_move_gps.id, + 'datas': pdf.encode('base64'), + 'mimetype': 'application/pdf', + } + + anexo = self.env['ir.attachment'].create( + vals_anexo + ) + + return financial_move_gps + @api.multi def gerar_boletos(self): ''' @@ -730,11 +805,8 @@ def gerar_boletos(self): for company in empresas: dados_empresa = empresas[company] - vals_gps = self.prepara_financial_move_gps( + financial_move_gps = self.prepara_financial_move_gps( company, dados_empresa) - financial_move_gps = self.env['financial.move'].create( - vals_gps - ) created_ids.append(financial_move_gps.id) for cod_darf in darfs: From 951cd626996d37fd0b40b67e41ba3326dfd256a9 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 19 Oct 2017 12:17:43 -0200 Subject: [PATCH 563/787] =?UTF-8?q?[FIX]=20Corre=C3=A7=C3=A3o=20views=20hr?= =?UTF-8?q?.holiday=20trocando=20date=5Ffrom,=20date=5Fto=20para=20data=5F?= =?UTF-8?q?inicio,=20data=5Ffim?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/hr_holidays_view.xml | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/l10n_br_hr_vacation/views/hr_holidays_view.xml b/l10n_br_hr_vacation/views/hr_holidays_view.xml index 2bfa3fd41..a512a4f82 100644 --- a/l10n_br_hr_vacation/views/hr_holidays_view.xml +++ b/l10n_br_hr_vacation/views/hr_holidays_view.xml @@ -83,6 +83,12 @@ + + + + + + @@ -98,11 +104,31 @@ + + + + + + + + l10n_br_hr_vacation.holiday.calendar + hr.holidays + + + + data_inicio + + + data_fim + + + + From e742d88d790776ac6cf3de135e759c5c5fef1b34 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 19 Oct 2017 12:19:36 -0200 Subject: [PATCH 564/787] [ADD] Emitir guias do DARF --- .../models/l10n_br_hr_sefip.py | 90 ++++++++++++++++--- 1 file changed, 80 insertions(+), 10 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index 53448c670..7fc4ce722 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -598,7 +598,7 @@ def prepara_financial_move(self, partner_id, sindicato_info): 'sefip_id': self.id, } - def prepara_financial_move_darf(self, valor): + def prepara_financial_move_darf(self, codigo_receita, valor): ''' Tratar dados do sefip e criar um dict para criar financial.move de guia DARF. @@ -614,7 +614,46 @@ def prepara_financial_move_darf(self, valor): sequence_id = self.company_id.darf_sequence_id.id doc_number = str(self.env['ir.sequence'].next_by_id(sequence_id)) - return { + dir_base = os.path.dirname(os.path.dirname(os.path.dirname(CURDIR))) + arquivo_template_darf = os.path.join(dir_base, + 'kmee_odoo_addons', + 'l10n_br_hr_payroll_report', + 'data', + 'darf.odt' + ) + + if os.path.exists(arquivo_template_darf): + + template_darf = open(arquivo_template_darf, 'rb') + arquivo_temporario = tempfile.NamedTemporaryFile(delete=False) + + vals_impressao = { + 'vias': '11', + 'razao_social': self.company_id.legal_name or '', + 'telefone': self.company_id.phone or '', + 'mes': self.mes or '', + 'ano': self.ano or '', + 'cnpj_cpf': self.company_id.cnpj_cpf or '', + 'codigo_receita': codigo_receita or '', + 'referencia': '', + 'vencimento': formata_data(data_vencimento) or '', + 'valor': formata_valor(valor) or '', + 'multa': formata_valor(0) or '', + 'juros': formata_valor(0) or '', + 'total': formata_valor(valor) or '', + } + + template = Template(template_darf, arquivo_temporario.name) + template.render(vals_impressao) + sh.libreoffice('--headless', '--invisible', '--convert-to', 'pdf', + '--outdir', '/tmp', arquivo_temporario.name) + + pdf = open(arquivo_temporario.name + '.pdf', 'rb').read() + + os.remove(arquivo_temporario.name + '.pdf') + os.remove(arquivo_temporario.name) + + vals_darf = { 'date_document': fields.Date.today(), 'partner_id': self.env.ref('base.user_root').id, 'doc_source_id': 'l10n_br.hr.sefip,' + str(self.id), @@ -629,6 +668,27 @@ def prepara_financial_move_darf(self, valor): 'sefip_id': self.id, } + financial_move_darf = self.env['financial.move'].create( + vals_darf + ) + + if os.path.exists(arquivo_template_darf): + vals_anexo = { + 'name': 'DARF.pdf', + 'datas_fname': 'DARF.pdf', + 'res_model': 'financial.move', + 'res_id': financial_move_darf.id, + 'datas': pdf.encode('base64'), + 'mimetype': 'application/pdf', + } + + anexo = self.env['ir.attachment'].create( + vals_anexo + ) + + return financial_move_darf + + def prepara_financial_move_gps(self, empresa_id, dados_empresa): ''' Criar financial.move de guia GPS, imprimir GPS e anexá-la ao move. @@ -737,6 +797,13 @@ def gerar_boletos(self): 1. Configurar os dados para criação das financial.moves 2. Criar os financial.moves ''' + + # + # Excluir registros financeiros anteriores + # + for id in self. + id.unlink() + contribuicao_sindical = {} for record in self: created_ids = [] @@ -786,13 +853,18 @@ def gerar_boletos(self): empresas[line.slip_id.company_id.id][ 'INSS_rat_fap'] += line.total elif line.code == 'IRPF': - if darfs.get(line.salary_rule_id.codigo_darf): - darfs[line.salary_rule_id.codigo_darf] += \ - line.total + if line.slip_id.contract_id.categoria in \ + ['721', '722']: + codigo_darf = '0588' + else: + codigo_darf = '0561' + + if darfs.get(codigo_darf): + darfs[codigo_darf] += line.total else: darfs.update( { - line.salary_rule_id.codigo_darf: line.total + codigo_darf: line.total } ) @@ -810,10 +882,8 @@ def gerar_boletos(self): created_ids.append(financial_move_gps.id) for cod_darf in darfs: - vals_darf = self.prepara_financial_move_darf(darfs[cod_darf]) - financial_move_darf = self.env['financial.move'].create( - vals_darf - ) + financial_move_darf = \ + self.prepara_financial_move_darf(cod_darf, darfs[cod_darf]) created_ids.append(financial_move_darf.id) return { From 01e3e1c0a2dce67ebde5b52c3035c737124b1f4a Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 19 Oct 2017 12:22:50 -0200 Subject: [PATCH 565/787] =?UTF-8?q?[FIX]=20N=C3=A3o=20excluir=20movimentos?= =?UTF-8?q?=20financeiros=20(ainda)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index 7fc4ce722..c5d9b4fb2 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -801,8 +801,8 @@ def gerar_boletos(self): # # Excluir registros financeiros anteriores # - for id in self. - id.unlink() + #for id in self. + # id.unlink() contribuicao_sindical = {} for record in self: From 14cab2a0cf2a200d179e0615e5f9323e268f7a07 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 19 Oct 2017 12:33:43 -0200 Subject: [PATCH 566/787] =?UTF-8?q?[FIX]=20Altera=20xpath=20do=20calend?= =?UTF-8?q?=C3=A1rio=20para=20evitar=20erro=20de=20atualiza=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_vacation/views/hr_holidays_view.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/l10n_br_hr_vacation/views/hr_holidays_view.xml b/l10n_br_hr_vacation/views/hr_holidays_view.xml index a512a4f82..061f92159 100644 --- a/l10n_br_hr_vacation/views/hr_holidays_view.xml +++ b/l10n_br_hr_vacation/views/hr_holidays_view.xml @@ -121,11 +121,11 @@ hr.holidays - - data_inicio + + data_inicio - - data_fim + + data_fim From 56bf31473ab3e3ec606ad0d18c07c2d7b6bd137d Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 19 Oct 2017 17:14:14 -0200 Subject: [PATCH 567/787] [FIX] Corrige erro de timezone no hr.holidays --- l10n_br_hr_vacation/models/hr_holidays.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/l10n_br_hr_vacation/models/hr_holidays.py b/l10n_br_hr_vacation/models/hr_holidays.py index a45bb57e5..59b6aeb8a 100644 --- a/l10n_br_hr_vacation/models/hr_holidays.py +++ b/l10n_br_hr_vacation/models/hr_holidays.py @@ -17,6 +17,27 @@ class HrHolidays(models.Model): _inherit = 'hr.holidays' + @api.multi + def _check_date(self): + for holiday in self: + domain = [ + ('data_inicio', '<=', holiday.data_inicio), + ('data_fim', '>=', holiday.data_fim), + ('employee_id', '=', holiday.employee_id.id), + ('id', '!=', holiday.id), + ('type', '=', holiday.type), + ('state', 'not in', ['cancel', 'refuse']), + ] + nholidays = self.search_count(domain) + if nholidays: + return False + return True + + _constraints = [ + (_check_date, 'You can not have 2 leaves that overlaps on same day!', + ['data_inicio', 'data_fim']), + ] + sell_vacation = fields.Boolean( string=u'Sell Vacation', help=u'Indicates if the employee desires to sell some of its ' From 1ee22491f3fc827174660ba76312c11b483ffa5f Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 19 Oct 2017 17:24:24 -0200 Subject: [PATCH 568/787] [FIX] Correcao na visao calendario para exibir com campos de data --- l10n_br_hr_vacation/views/hr_holidays_view.xml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/l10n_br_hr_vacation/views/hr_holidays_view.xml b/l10n_br_hr_vacation/views/hr_holidays_view.xml index 061f92159..4cb22f3ff 100644 --- a/l10n_br_hr_vacation/views/hr_holidays_view.xml +++ b/l10n_br_hr_vacation/views/hr_holidays_view.xml @@ -120,12 +120,15 @@ l10n_br_hr_vacation.holiday.calendar hr.holidays + -20 - - data_inicio - - - data_fim + + + + + From 460c3a718bc9edbda5642526637fdf89ae03bb72 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 19 Oct 2017 17:54:07 -0200 Subject: [PATCH 569/787] [FIX] Rename --- l10n_br_hr_vacation/views/hr_holidays_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_vacation/views/hr_holidays_view.xml b/l10n_br_hr_vacation/views/hr_holidays_view.xml index 4cb22f3ff..50901cbc2 100644 --- a/l10n_br_hr_vacation/views/hr_holidays_view.xml +++ b/l10n_br_hr_vacation/views/hr_holidays_view.xml @@ -123,7 +123,7 @@ -20 - From ed1af38c278509c9836296e9c579d3b1c36c09da Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 19 Oct 2017 21:14:17 -0200 Subject: [PATCH 570/787] =?UTF-8?q?[ADD]=20Cria=C3=A7=C3=A3o=20de=20Guias?= =?UTF-8?q?=20de=20Pagamento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/l10n_br_hr_sefip.py | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index c5d9b4fb2..1238ae4c2 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -1085,25 +1085,25 @@ def _trabalhador_remun_sem_13(self, folha): # if folha.tipo_de_folha == 'decimo_terceiro': return result - # # - # # As remunerações pagas após rescisão do contrato de trabalho e - # # conforme determinação do Art. 466 da CLT, - # # não devem vir acompanhadas das respectivas movimentações. - # # - # elif False: - # # TODO: - # result = 0.00 + # + # As remunerações pagas após rescisão do contrato de trabalho e + # conforme determinação do Art. 466 da CLT, + # não devem vir acompanhadas das respectivas movimentações. + # + #elif False: + # # TODO: + # result = 0.00 - # # - # # Obrigatório - # # + # + # Obrigatório + # # elif folha.contract_id.categoria_sefip in ( # '05', '11', '13', '14', '15', '16', '17', '18', '22', '23', # '24', '25'): # result = folha.base_inss - # # - # # Opcional - # # + # + # Opcional + # # elif folha.contract_id.categoria_sefip in ( # '01', '02', '03', '04', '06', '07', '12', '19', '20', '21', # '26'): @@ -1449,7 +1449,7 @@ def _preencher_registro_30(self, sefip, folha): folha.contract_id.job_id.cbo_id.code[:4] # Revisar daqui para a frente sefip.trabalhador_remun_sem_13 = \ - self._trabalhador_remun_sem_13(folha) or '' + self._trabalhador_remun_sem_13(folha) or '' sefip.trabalhador_remun_13 = self._trabalhador_remun_13(folha) or '' From e605d77ab055b259618249b1fdc18e5c294f9c11 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Sun, 22 Oct 2017 14:01:08 -0200 Subject: [PATCH 571/787] =?UTF-8?q?[FIX]=20Consist=C3=AAncias=20na=20tela?= =?UTF-8?q?=20SEFIP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/l10n_br_hr_sefip.py | 30 ++++++++++++++-- .../views/l10n_br_hr_sefip.xml | 35 +++++++++++-------- 2 files changed, 49 insertions(+), 16 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index 1238ae4c2..9f353d5b5 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -61,6 +61,21 @@ class L10nBrSefip(models.Model): _name = b'l10n_br.hr.sefip' _inherit = [b'abstract.arquivos.governo.workflow', b'mail.thread'] + @api.multi + @api.onchange('company_id') + def onchange_company_id(self): + for sefip in self: + if sefip.responsible_user_id: + if sefip.responsible_user_id.parent_id != \ + sefip.company_id.partner_id: + sefip.responsible_user_id = False + return { + 'domain': { + 'responsible_user_id': + [('parent_id', '=', sefip.company_id.partner_id.id)] + } + } + @api.multi def name_get(self): result = [] @@ -607,8 +622,7 @@ def prepara_financial_move_darf(self, codigo_receita, valor): ''' data = self.ano + '-' + self.mes + '-' + str( self.company_id.darf_dia_vencimento) - data_vencimento = fields.Date.from_string(data - ) + data_vencimento = fields.Date.from_string(data) data_vencimento = data_vencimento + timedelta(days=31) sequence_id = self.company_id.darf_sequence_id.id @@ -992,9 +1006,21 @@ def _preencher_registro_00(self, sefip): sefip.data_recolh_ps = fields.Datetime.from_string( self.data_recolhimento_gps).strftime('%d%m%Y') \ if self.data_recolhimento_gps else '' + if not self.company_id.supplier_partner_id: + raise ValidationError( + 'Campo "Fornecedor do Sistema" não está preenchido nesta ' + 'Empresa ! - Favor preenchê-lo antes de gerar a SEFIP' + ) + elif not self.company_id.supplier_partner_id.cnpj_cpf: + raise ValidationError( + 'Campo "CNPJ/CPF" do Fornecedor do Sistema ' + 'não está preenchido! - Favor preenchê-lo ' + 'antes de gerar a SEFIP' + ) sefip.tipo_inscr_fornec = ( '1' if self.company_id.supplier_partner_id.is_company else '3') sefip.inscr_fornec = self.company_id.supplier_partner_id.cnpj_cpf + return sefip._registro_00_informacoes_responsavel() def _preencher_registro_10(self, company_id, sefip): diff --git a/l10n_br_hr_arquivos_governo/views/l10n_br_hr_sefip.xml b/l10n_br_hr_arquivos_governo/views/l10n_br_hr_sefip.xml index 9a07dfbe8..db3223f9f 100644 --- a/l10n_br_hr_arquivos_governo/views/l10n_br_hr_sefip.xml +++ b/l10n_br_hr_arquivos_governo/views/l10n_br_hr_sefip.xml @@ -41,30 +41,37 @@ - - - - - + + + + + - - - + + + - - - + + + - - + + - + From 7749fe3dba2f60248ef4c1093db9e890e07836b7 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Mon, 23 Oct 2017 15:25:34 -0200 Subject: [PATCH 572/787] [FIX] Consistir campos data fgts e gps --- l10n_br_hr_arquivos_governo/models/arquivo_sefip.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/models/arquivo_sefip.py b/l10n_br_hr_arquivos_governo/models/arquivo_sefip.py index b1886470e..0341f2436 100644 --- a/l10n_br_hr_arquivos_governo/models/arquivo_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/arquivo_sefip.py @@ -35,9 +35,15 @@ def _registro_00_informacoes_responsavel(self): registro_00 += self._validar(self.cod_recolhimento, 3, 'N') registro_00 += self._validar(self.indic_recolhimento_fgts, 1, 'N') registro_00 += self._validar(self.modalidade_arq, 1, 'N') - registro_00 += self._validar(self.data_recolhimento_fgts, 8, 'D') + if self.indic_recolhimento_fgts in ['2', '3', '5', '6']: + registro_00 += self._validar(self.data_recolhimento_fgts, 8, 'D') + else: + registro_00 += self._validar(False, 8, 'D') registro_00 += self._validar(self.indic_recolh_ps, 1, 'N') - registro_00 += self._validar(self.data_recolh_ps, 8, 'D') + if self.indic_recolh_ps == '2': + registro_00 += self._validar(self.data_recolh_ps, 8, 'D') + else: + registro_00 += self._validar(False, 8, 'D') registro_00 += self._validar(self.indice_recolh_atraso_ps, 7, 'N') registro_00 += self._validar(self.tipo_inscr_fornec, 1, 'N') registro_00 += self._validar(self.inscr_fornec, 14, 'N') From 12a8c2019afe2671a227f66ddca389a075cbc408 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Tue, 24 Oct 2017 17:14:11 -0200 Subject: [PATCH 573/787] [FIX] Corrige Busca de Contratos --- l10n_br_hr_payroll/models/hr_payslip_run.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index 31d56a436..06ae98556 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -140,8 +140,8 @@ def verificar_holerites_gerados(self): contratos_sem_holerite = [ contrato.id for contrato in contracts_id if (contrato.id not in contratos_com_holerites) - and (contrato.date_start <= lote.date_start) - and ((contrato.date_end >= lote.date_end) + and (contrato.date_start <= lote.date_end) + and ((contrato.date_end >= lote.date_start) or (not contrato.date_end))] lote.write({ From 908e755ce9c741f164b937f45898c3586b33bc2f Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 26 Oct 2017 16:15:21 -0200 Subject: [PATCH 574/787] =?UTF-8?q?[FIX]=20Automatizar=20Ocorr=C3=AAncia?= =?UTF-8?q?=20SEFIP=20quando=20v=C3=ADnculo=20=C3=A9=20cedido?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index 9f353d5b5..2689002c5 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -1254,6 +1254,9 @@ def _trabalhador_ocorrencia(self, folha): - """ + if folha.contract_id.cnpj_empregador_cedente: + return '05' + folha_ids = self._get_folha_ids() count = 0 for folha_id in folha_ids: From a12e2287c3dec4a83c0d27d9f7383a2bc078ea9d Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Fri, 3 Nov 2017 15:17:28 -0200 Subject: [PATCH 575/787] =?UTF-8?q?[FIX]=20Revis=C3=A3o=20do=20m=C3=A9todo?= =?UTF-8?q?=20de=20c=C3=A1lculo=20do=20Sal=C3=A1rio=20em=20datas=20passada?= =?UTF-8?q?=20e=20per=C3=ADodos=20aquisitivos=20-=20Parte=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/__openerp__.py | 2 +- l10n_br_hr_payroll/models/hr_contract.py | 110 +++++++++++++----- l10n_br_hr_payroll/models/hr_payslip.py | 57 +++++---- .../models/l10n_br_hr_contract.py | 5 + .../l10n_br_hr_contract_cargo_atividade.xml | 4 +- .../l10n_br_hr_contract_filiacao_sindical.xml | 18 +-- .../views/l10n_br_hr_contract_jornada.xml | 4 +- .../l10n_br_hr_contract_lotacao_local.xml | 4 +- .../views/l10n_br_hr_contract_remuneracao.xml | 26 ++++- l10n_br_hr_vacation/models/hr_contract.py | 53 ++++++++- .../models/hr_vacation_control.py | 21 ++-- 11 files changed, 231 insertions(+), 73 deletions(-) diff --git a/l10n_br_hr_payroll/__openerp__.py b/l10n_br_hr_payroll/__openerp__.py index 56d2f5db5..0721f9306 100644 --- a/l10n_br_hr_payroll/__openerp__.py +++ b/l10n_br_hr_payroll/__openerp__.py @@ -39,11 +39,11 @@ 'views/hr_salary_rule.xml', 'views/l10n_br_hr_child_benefit_view.xml', 'views/l10n_br_hr_contract.xml', + 'views/l10n_br_hr_contract_remuneracao.xml', 'views/l10n_br_hr_contract_cargo_atividade.xml', 'views/l10n_br_hr_contract_filiacao_sindical.xml', 'views/l10n_br_hr_contract_jornada.xml', 'views/l10n_br_hr_contract_lotacao_local.xml', - 'views/l10n_br_hr_contract_remuneracao.xml', 'views/l10n_br_hr_income_tax_deductable_amount_family_view.xml', 'views/l10n_br_hr_income_tax_view.xml', 'views/l10n_br_hr_minimum_wage_view.xml', diff --git a/l10n_br_hr_payroll/models/hr_contract.py b/l10n_br_hr_payroll/models/hr_contract.py index 7716b4611..50bd9b45b 100644 --- a/l10n_br_hr_payroll/models/hr_contract.py +++ b/l10n_br_hr_payroll/models/hr_contract.py @@ -3,8 +3,8 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from openerp import api, fields, models -from datetime import datetime - +from openerp import exceptions +from datetime import datetime, timedelta class HrContract(models.Model): @@ -85,44 +85,102 @@ def _compute_nome_contrato(self): @api.multi def _buscar_salario_vigente_periodo(self, data_inicio, data_fim): contract_change_obj = self.env['l10n_br_hr.contract.change'] + + # + # Checa se há alterações contratuais em estado Rascunho + # Não continua se houver + # + change = contract_change_obj.search( + [ + ('contract_id', '=', self.id), + ('change_type', '=', 'remuneracao'), + ('state', '=', 'draft'), + ], + order="change_date DESC", + ) + if change: + raise exceptions.ValidationError( + "Há alteração de remuneração em estado Rascunho " + "neste contrato, por favor exclua o alteração " + "contratual ou Aplique-a para torná-la efetiva " + "antes de calcular um holerite!" + ) + + # Busca todas as alterações de remuneração deste contrato + # change = contract_change_obj.search( [ - ('change_date', '>=', data_inicio), - ('change_date', '<=', data_fim), - ('wage', '>', 0), + ('contract_id', '=', self.id), + ('change_type', '=', 'remuneracao'), + ('state', '=', 'applied'), ], order="change_date DESC", - limit=1, ) - return change.wage + + # Calcular o salário proporcional dentro do período especificado + # Pega o salário do contrato caso nunca tenha havido uma alteração + # contratual + # + salario_medio = self.wage + for i in range(len(change)): + + # Dentro deste período houve alteração contratual ? + # + if change[i].change_date >= data_inicio and \ + change[i].change_date <= data_fim: + i_2 = i + 1 + data_mudanca = \ + datetime.strptime(change[i].change_date, "%Y-%m-%d") + d_inicio = datetime.strptime(data_inicio, "%Y-%m-%d") + d_fim = datetime.strptime(data_fim, "%Y-%m-%d") + + # Calcula o número de dias dentro do período e quantos dias + # são de cada lado da alteração contratual + # + dias = (d_fim - d_inicio) + timedelta(days=1) + dias_2 = dias.days - data_mudanca.day + dias_1 = (data_mudanca.day - d_inicio.day) + 1 + + # Calcula cada valor de salário nos dias em com valores + # diferentes + # + salario_dia_2 = change[i].wage / dias.days + salario_dia_1 = change[i_2].wage / dias.days + salario_medio_2 = salario_dia_2 * dias_2 + salario_medio_1 = salario_dia_1 * dias_1 + + # Soma os 2 lados e temos o salário proporcional dentro + # do período + # + salario_medio = salario_medio_2 + salario_medio_1 + break + + # Houve alteração contratual anterior ao período atual + # + elif change[i].change_date < data_inicio: + salario_medio = change[i].wage + break + + return salario_medio @api.multi def _salario_dia(self, data_inicio, data_fim): - if data_inicio >= self.date_start and \ - (data_fim <= self.date_end or not self.date_end): - return self.wage / 30 - else: - return self._buscar_salario_vigente_periodo( - data_inicio, data_fim) / 30 + return self._salario_mes_proporcional( + data_inicio, data_fim) / 30 @api.multi def _salario_hora(self, data_inicio, data_fim): - if data_inicio >= self.date_start and \ - (data_fim <= self.date_end or not self.date_end): - return self.wage / ( - 220 if not self.monthly_hours else self.monthly_hours) - else: - wage = self._buscar_salario_vigente_periodo(data_inicio, data_fim) - hours_total = 220 if not self.monthly_hours else self.monthly_hours - return wage / hours_total + wage = self._salario_mes_proporcional(data_inicio, data_fim) + hours_total = 220 if not self.monthly_hours else self.monthly_hours + return wage / hours_total @api.multi def _salario_mes(self, data_inicio, data_fim): - if data_inicio >= self.date_start and \ - (data_fim <= self.date_end or not self.date_end): - return self.wage - else: - return self._buscar_salario_vigente_periodo(data_inicio, data_fim) + return self._buscar_salario_vigente_periodo(data_inicio, data_fim) + + @api.multi + def _salario_mes_proporcional(self, data_inicio, data_fim): + return self._buscar_salario_vigente_periodo(data_inicio, data_fim) specific_rule_ids = fields.One2many( comodel_name='hr.contract.salary.rule', diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 888b1354b..dbb24a601 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -24,7 +24,7 @@ MES_DO_ANO = [ (1, u'Janeiro'), (2, u'Fevereiro'), - (3, u'Marco'), + (3, u'Março'), (4, u'Abril'), (5, u'Maio'), (6, u'Junho'), @@ -40,7 +40,7 @@ MES_DO_ANO2 = [ (1, u'Janeiro'), (2, u'Fevereiro'), - (3, u'Marco'), + (3, u'Março'), (4, u'Abril'), (5, u'Maio'), (6, u'Junho'), @@ -532,6 +532,18 @@ def on_change_mes_do_ano(self): #store=True, ) + data_inicio_periodo_aquisitivo = fields.Date( + string="Inicio do Período Aquisitivo", + related="periodo_aquisitivo.inicio_aquisitivo", + store=True, + ) + + data_fim_periodo_aquisitivo = fields.Date( + string="Fim do Período Aquisitivo", + related="periodo_aquisitivo.fim_aquisitivo", + store=True, + ) + # Rescisão data_afastamento = fields.Date( string="Data do afastamento" @@ -732,25 +744,28 @@ def get_inputs(self, contract_ids, date_from, date_to): salario_mes_dic = { 'name': 'Salário Mês', 'code': 'SALARIO_MES', - 'amount': contract._salario_mes(date_from, date_to) if not - self.medias_proventos else self.medias_proventos[0].media, + 'amount': contract._salario_mes(date_from, date_to), 'contract_id': contract.id, } salario_dia_dic = { 'name': 'Salário Dia', 'code': 'SALARIO_DIA', - 'amount': contract._salario_dia(date_from, date_to)if not - self.medias_proventos else self.medias_proventos[0].media / 30, + 'amount': contract._salario_dia(date_from, date_to), 'contract_id': contract.id, } salario_hora_dic = { 'name': 'Salário Hora', 'code': 'SALARIO_HORA', - 'amount': contract._salario_hora(date_from, date_to) - if not self.medias_proventos - else self.medias_proventos[0].media / 220, + 'amount': contract._salario_hora(date_from, date_to), 'contract_id': contract.id, } + salario_mes_proporcional_dic = { + 'name': 'Salário Mês Proporcional', + 'code': 'SALARIO_MES_PROPORCIONAL', + 'amount': contract._salario_mes_proporcional(date_from, date_to), + 'contract_id': contract.id, + } + res += [salario_mes_proporcional_dic] res += [salario_mes_dic] res += [salario_dia_dic] res += [salario_hora_dic] @@ -965,7 +980,7 @@ def get_ferias_rubricas(self, payslip, rule_ids): ('date_from', '>=', payslip.date_from), ('date_from', '<=', payslip.date_to), ('contract_id', '=', payslip.contract_id.id), - ('state', '=', 'done') + ('state', 'in', ['done', 'verify']) ]) if holerite_ferias: for line in holerite_ferias.line_ids: @@ -986,7 +1001,7 @@ def buscar_ferias_do_mes(self, payslip): ('date_from', '>=', payslip.date_from), ('date_from', '<=', payslip.date_to), ('contract_id', '=', payslip.contract_id.id), - ('state', '=', 'done'), + ('state', 'in', ['done', 'verify']), ('is_simulacao', '=', False) ]) if holerite_ferias: @@ -1264,7 +1279,7 @@ def BUSCAR_VALOR_PROPORCIONAL( ('is_simulacao', '=', True), ('mes_do_ano', '=', mes_verificacao), ('ano', '=', ano_verificacao), - ('state', '=', 'done'), + ('state', 'in', ['done', 'verify']), ] ) else: @@ -1281,7 +1296,7 @@ def BUSCAR_VALOR_PROPORCIONAL( ('is_simulacao', '=', True), ('mes_do_ano', '=', mes_verificacao), ('ano', '=', ano_verificacao), - ('state', '=', 'done'), + ('state', 'in', ['done', 'verify']), ] domain.append( @@ -1305,7 +1320,7 @@ def BUSCAR_VALOR_PROPORCIONAL( ('is_simulacao', '=', True), ('mes_do_ano', '=', mes_verificacao), ('ano', '=', ano_verificacao), - ('state', '=', 'done'), + ('state', 'in', ['done', 'verify']), ] domain.append( ('periodo_aquisitivo', '=', @@ -1480,7 +1495,7 @@ def rubrica_anterior_total(self, code, mes=-1, tipo_de_folha='normal'): domain = [ ('tipo_de_folha', '=', tipo_de_folha), ('contract_id', '=', self.contract_id.id), - ('state', '=', 'done') + ('state', 'in', ['done', 'verify']) ] if mes and mes > 0: domain.append(('mes_do_ano', '=', mes)) @@ -1792,7 +1807,7 @@ def sum(self, code, from_date, to_date=None): line.total) if line.category_id.code == 'DEDUCAO': - if line.salary_rule_id.compoe_base_INSS: + if line.salary_rule_id.compoeq: baselocaldict['BASE_INSS'] -= line.total if line.salary_rule_id.compoe_base_IR: baselocaldict['BASE_IR'] -= line.total @@ -2126,7 +2141,7 @@ def _buscar_holerites_periodo_aquisitivo(self): self.periodo_aquisitivo.inicio_aquisitivo), ('date_to', '<=', self.periodo_aquisitivo.fim_aquisitivo), ('tipo_de_folha', '=', 'normal'), - ('state', '=', 'done'), + ('state', 'in', ['done', 'verify']), ] ) return payslips @@ -2137,7 +2152,7 @@ def _checar_holerites_aprovados(self): [ ('contract_id', '=', self.contract_id.id), ('tipo_de_folha', '=', 'normal'), - ('state', '=', 'done') + ('state', 'in', ['done', 'verify']) ] ) @@ -2299,7 +2314,7 @@ def validacao_holerites_anteriores(self, data_inicio, data_fim, contrato): ('date_from', '<=', data_fim), ('contract_id', '=', contrato.id), ('tipo_de_folha', '=', 'normal'), - ('state', '=', 'done'), + ('state', 'in', ['done', 'verify']), ] folhas_periodo = folha_obj.search(domain) @@ -2402,7 +2417,7 @@ def BUSCAR_VALOR_MEDIA_PROVENTO(self, tipo_simulacao): ('is_simulacao', '=', True), ('mes_do_ano', '=', self.mes_do_ano), ('ano', '=', ano_verificacao), - ('state', '=', 'done'), + ('state', 'in', ['done', 'verify']), ] ) else: @@ -2422,7 +2437,7 @@ def BUSCAR_VALOR_MEDIA_PROVENTO(self, tipo_simulacao): ('ano', '=', ano_verificacao), ('periodo_aquisitivo', '=', periodos_ferias_simulacao[0].id), - ('state', '=', 'done'), + ('state', 'in', ['done', 'verify']), ] ) if not payslip_simulacao: diff --git a/l10n_br_hr_payroll/models/l10n_br_hr_contract.py b/l10n_br_hr_payroll/models/l10n_br_hr_contract.py index f5a5327f1..cf12e6af8 100644 --- a/l10n_br_hr_payroll/models/l10n_br_hr_contract.py +++ b/l10n_br_hr_payroll/models/l10n_br_hr_contract.py @@ -22,6 +22,7 @@ class HrContractChange(models.Model): _name = 'l10n_br_hr.contract.change' _description = u"Alteração contratual" _inherit = 'hr.contract' + _order = 'change_date desc, contract_id' def _get_default_type(self): change_type = self._context.get('change_type', False) @@ -124,6 +125,7 @@ def apply_contract_changes(self): 'change_reason_id': change.change_reason_id.id, 'wage': contract.wage, 'struct_id': change.struct_id.id, + 'state': 'applied', } self.env['l10n_br_hr.contract.change'].create(vals) contract.wage = self.wage @@ -140,6 +142,7 @@ def apply_contract_changes(self): 'wage': contract.wage, 'working_hours': contract.working_hours.id, 'struct_id': change.struct_id.id, + 'state': 'applied', } self.env['l10n_br_hr.contract.change'].create(vals) contract.working_hours = self.working_hours @@ -161,6 +164,7 @@ def apply_contract_changes(self): 'labor_bond_type_id': contract.labor_bond_type_id.id, 'labor_regime_id': contract.labor_regime_id.id, 'struct_id': change.struct_id.id, + 'state': 'applied', } self.env['l10n_br_hr.contract.change'].create(vals) contract.job_id = self.job_id @@ -184,6 +188,7 @@ def apply_contract_changes(self): contract.discount_union_contribution, 'month_base_date': contract.month_base_date, 'struct_id': change.struct_id.id, + 'state': 'applied', } self.env['l10n_br_hr.contract.change'].create(vals) contract.union = self.union diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_cargo_atividade.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_cargo_atividade.xml index 49afcde2f..aef524f32 100644 --- a/l10n_br_hr_payroll/views/l10n_br_hr_contract_cargo_atividade.xml +++ b/l10n_br_hr_payroll/views/l10n_br_hr_contract_cargo_atividade.xml @@ -55,6 +55,7 @@ + @@ -64,7 +65,8 @@ l10n_br_hr.contract.change tree,form [('change_type','=','cargo-atividade')] - {'search_default_current':1, 'change_type': 'cargo-atividade'} + {'search_default_state_draft':1, 'change_type': 'cargo-atividade'} + diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_filiacao_sindical.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_filiacao_sindical.xml index aa7b9e61a..e751ccc51 100644 --- a/l10n_br_hr_payroll/views/l10n_br_hr_contract_filiacao_sindical.xml +++ b/l10n_br_hr_payroll/views/l10n_br_hr_contract_filiacao_sindical.xml @@ -49,13 +49,14 @@ - - - - - - - + + + + + + + + @@ -66,7 +67,8 @@ l10n_br_hr.contract.change tree,form [('change_type','=','filiacao-sindical')] - {'search_default_current':1, 'change_type': 'filiacao-sindical'} + {'search_default_state_draft':1, 'change_type': 'filiacao-sindical'} + diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_jornada.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_jornada.xml index bea1a4561..be205ca02 100644 --- a/l10n_br_hr_payroll/views/l10n_br_hr_contract_jornada.xml +++ b/l10n_br_hr_payroll/views/l10n_br_hr_contract_jornada.xml @@ -53,6 +53,7 @@ + @@ -63,7 +64,8 @@ l10n_br_hr.contract.change tree,form [('change_type','=','jornada')] - {'search_default_current':1, 'change_type': 'jornada'} + {'search_default_state_draft':1, 'change_type': 'jornada'} + diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_lotacao_local.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_lotacao_local.xml index 3c1294d8c..84fb2eafc 100644 --- a/l10n_br_hr_payroll/views/l10n_br_hr_contract_lotacao_local.xml +++ b/l10n_br_hr_payroll/views/l10n_br_hr_contract_lotacao_local.xml @@ -43,6 +43,7 @@ + @@ -53,7 +54,8 @@ l10n_br_hr.contract.change tree,form [('change_type','=','lotacao-local')] - {'search_default_current':1, 'change_type': 'lotacao-local'} + {'search_default_state_draft':1, 'change_type': 'lotacao-local'} + diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_remuneracao.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_remuneracao.xml index 22117c4e9..07b4882ef 100644 --- a/l10n_br_hr_payroll/views/l10n_br_hr_contract_remuneracao.xml +++ b/l10n_br_hr_payroll/views/l10n_br_hr_contract_remuneracao.xml @@ -5,6 +5,27 @@ + + l10n_br_hr.contract.change.form (searches) + l10n_br_hr.contract.change + + + + + + + + + + + + + + + + + + l10n_br_hr.contract.change.form (remuneracao) l10n_br_hr.contract.change @@ -50,6 +71,7 @@ + @@ -59,8 +81,10 @@ l10n_br_hr.contract.change tree,form [('change_type','=','remuneracao')] - {'search_default_current':1, 'change_type': 'remuneracao'} + {'search_default_state_draft':1, 'change_type': 'remuneracao'} + + tree diff --git a/l10n_br_hr_vacation/models/hr_contract.py b/l10n_br_hr_vacation/models/hr_contract.py index d04f44fac..4d918fcc6 100644 --- a/l10n_br_hr_vacation/models/hr_contract.py +++ b/l10n_br_hr_vacation/models/hr_contract.py @@ -129,10 +129,57 @@ def verificar_controle_ferias(self): def action_button_update_controle_ferias(self): """ Ação disparada pelo botão na view, que atualiza as linhas de controle - de férias desde que nao contenham férias atreladas a elas + de férias """ - self.verificar_controle_ferias() - self.atualizar_linhas_controle_ferias(self.date_start) + + for contrato in self: + + # Apagar todos os períodos aquisitivos do contrato + # + for periodo_aquisitivo in contrato.vacation_control_ids: + periodo_aquisitivo.unlink() + + # Criar os períodos aquisitivos + # + inicio = fields.Date.from_string(contrato.date_start) + hoje = fields.Date.from_string(fields.Date.today()) + lista_controle_ferias = [] + controle_ferias_obj = self.env['hr.vacation.control'] + + while inicio <= hoje: + vals = \ + controle_ferias_obj.calcular_datas_aquisitivo_concessivo( + str(inicio) + ) + controle_ferias = controle_ferias_obj.create(vals) + inicio = inicio + relativedelta(years=1) + lista_controle_ferias.append(controle_ferias.id) + self.vacation_control_ids = sorted(lista_controle_ferias, + reverse=True) + + # Buscar Férias registradas e atualizar os períodos aquisitivos + # + domain = [ + ('contract_id', '=', contrato.id), + ('tipo_de_folha', '=', 'ferias'), + ('is_simulacao', '=', False), + ('state', 'in', ['done', 'verify']), + ] + holerites_ids = \ + self.env['hr.payslip'].search(domain, order='date_from') + + #for holerite in holerites_ids: + + + # Atualizar último periodo aquisitivo caso a data de demissão + # esteja definida + # + self.atualizar_data_demissao() + + + + + # self.atualizar_linhas_controle_ferias(self.date_start) @api.multi def atualizar_linhas_controle_ferias(self, date_start): diff --git a/l10n_br_hr_vacation/models/hr_vacation_control.py b/l10n_br_hr_vacation/models/hr_vacation_control.py index eedc045cd..ee1704499 100644 --- a/l10n_br_hr_vacation/models/hr_vacation_control.py +++ b/l10n_br_hr_vacation/models/hr_vacation_control.py @@ -10,7 +10,7 @@ class HrVacationControl(models.Model): _name = 'hr.vacation.control' - _order = 'inicio_aquisitivo desc' + _order = 'inicio_aquisitivo desc, inicio_gozo desc' _rec_name = 'display_name' inicio_aquisitivo = fields.Date( @@ -118,6 +118,7 @@ class HrVacationControl(models.Model): column1='hr_vacation_control_id', column2='holiday_id', string=u'Período Aquisitivo', + ondelete='set null', ) display_name = fields.Char( @@ -275,12 +276,12 @@ def action_create_periodo_aquisitivo(self): for controle in self: controle.gerar_holidays_ferias() - @api.multi - def unlink(self): - """ - Se excluir o controle de ferias, excluir todos os holidays atrelados - FIXTO: utilizar o ondelete=cascade na definição do campo - """ - for holidays in self.hr_holiday_ids: - holidays.unlink() - return super(HrVacationControl, self).unlink() + # @api.multi + # def unlink(self): + # """ + # Se excluir o controle de ferias, excluir todos os holidays atrelados + # FIXTO: utilizar o ondelete=cascade na definição do campo + # """ + # for holidays in self.hr_holiday_ids: + # holidays.unlink() + # return super(HrVacationControl, self).unlink() From 5241af447d11e79917db07ceb1f7770c7b0c91dd Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Mon, 6 Nov 2017 12:42:06 -0200 Subject: [PATCH 576/787] =?UTF-8?q?[ADD]=20Relat=C3=B3rios=20de=20RH?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll_report/README.rst | 89 +++++ l10n_br_hr_payroll_report/__init__.py | 7 + l10n_br_hr_payroll_report/__openerp__.py | 28 ++ l10n_br_hr_payroll_report/data/analitico.odt | Bin 0 -> 35765 bytes .../data/aviso_ferias.odt | Bin 0 -> 44616 bytes l10n_br_hr_payroll_report/data/darf.odt | Bin 0 -> 27909 bytes l10n_br_hr_payroll_report/data/gps.odt | Bin 0 -> 31335 bytes .../data/holerite-fixo.odt | Bin 0 -> 17311 bytes .../data/holerite-variavel.odt | Bin 0 -> 17311 bytes l10n_br_hr_payroll_report/data/rescisao.odt | Bin 0 -> 31786 bytes l10n_br_hr_payroll_report/models/__init__.py | 4 + .../models/hr_contract.py | 39 ++ .../models/hr_employee.py | 27 ++ .../models/hr_field_rescission.py | 59 +++ .../models/hr_salary_rule.py | 12 + l10n_br_hr_payroll_report/reports/__init__.py | 8 + .../reports/payslip_report_analitico.py | 348 ++++++++++++++++++ .../reports/payslip_report_analitico.xml | 28 ++ .../reports/payslip_report_aviso_ferias.py | 16 + .../reports/payslip_report_aviso_ferias.xml | 27 ++ .../reports/payslip_report_holerite.py | 16 + .../reports/payslip_report_holerite.xml | 34 ++ .../reports/payslip_report_rescisao.py | 94 +++++ .../reports/payslip_report_rescisao.xml | 27 ++ .../security/ir.model.access.csv | 2 + .../static/src/img/icon-previdencia.png | Bin 0 -> 12284 bytes .../views/hr_field_rescission.xml | 46 +++ .../views/hr_salary_rule.xml | 16 + .../views/res_company.xml | 17 + l10n_br_hr_payroll_report/wizards/__init__.py | 1 + ...zard_l10n_br_hr_payroll_analytic_report.py | 64 ++++ ...ard_l10n_br_hr_payroll_analytic_report.xml | 59 +++ 32 files changed, 1068 insertions(+) create mode 100644 l10n_br_hr_payroll_report/README.rst create mode 100644 l10n_br_hr_payroll_report/__init__.py create mode 100644 l10n_br_hr_payroll_report/__openerp__.py create mode 100644 l10n_br_hr_payroll_report/data/analitico.odt create mode 100644 l10n_br_hr_payroll_report/data/aviso_ferias.odt create mode 100644 l10n_br_hr_payroll_report/data/darf.odt create mode 100644 l10n_br_hr_payroll_report/data/gps.odt create mode 100644 l10n_br_hr_payroll_report/data/holerite-fixo.odt create mode 100644 l10n_br_hr_payroll_report/data/holerite-variavel.odt create mode 100644 l10n_br_hr_payroll_report/data/rescisao.odt create mode 100644 l10n_br_hr_payroll_report/models/__init__.py create mode 100644 l10n_br_hr_payroll_report/models/hr_contract.py create mode 100644 l10n_br_hr_payroll_report/models/hr_employee.py create mode 100644 l10n_br_hr_payroll_report/models/hr_field_rescission.py create mode 100644 l10n_br_hr_payroll_report/models/hr_salary_rule.py create mode 100644 l10n_br_hr_payroll_report/reports/__init__.py create mode 100644 l10n_br_hr_payroll_report/reports/payslip_report_analitico.py create mode 100644 l10n_br_hr_payroll_report/reports/payslip_report_analitico.xml create mode 100644 l10n_br_hr_payroll_report/reports/payslip_report_aviso_ferias.py create mode 100644 l10n_br_hr_payroll_report/reports/payslip_report_aviso_ferias.xml create mode 100644 l10n_br_hr_payroll_report/reports/payslip_report_holerite.py create mode 100644 l10n_br_hr_payroll_report/reports/payslip_report_holerite.xml create mode 100644 l10n_br_hr_payroll_report/reports/payslip_report_rescisao.py create mode 100644 l10n_br_hr_payroll_report/reports/payslip_report_rescisao.xml create mode 100644 l10n_br_hr_payroll_report/security/ir.model.access.csv create mode 100644 l10n_br_hr_payroll_report/static/src/img/icon-previdencia.png create mode 100644 l10n_br_hr_payroll_report/views/hr_field_rescission.xml create mode 100644 l10n_br_hr_payroll_report/views/hr_salary_rule.xml create mode 100644 l10n_br_hr_payroll_report/views/res_company.xml create mode 100644 l10n_br_hr_payroll_report/wizards/__init__.py create mode 100644 l10n_br_hr_payroll_report/wizards/wizard_l10n_br_hr_payroll_analytic_report.py create mode 100644 l10n_br_hr_payroll_report/wizards/wizard_l10n_br_hr_payroll_analytic_report.xml diff --git a/l10n_br_hr_payroll_report/README.rst b/l10n_br_hr_payroll_report/README.rst new file mode 100644 index 000000000..15bb22b52 --- /dev/null +++ b/l10n_br_hr_payroll_report/README.rst @@ -0,0 +1,89 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +=============================== +Reports para l10n_br_hr_payroll +=============================== + +Este modulo provê relatórios para o modulo da folha de pagamento brasileira + +Installation +============ + +To install this module, you need to: + +#. Do this ... + +Configuration +============= + +To configure this module, you need to: + +#. Go to ... + +.. figure:: path/to/local/image.png + :alt: alternative description + :width: 600 px + +Usage +===== + +To use this module, you need to: + +#. Go to ... + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/{repo_id}/{branch} + +.. repo_id is available in https://github.com/OCA/maintainer-tools/blob/master/tools/repos_with_ids.txt +.. branch is "8.0" for example + +Known issues / Roadmap +====================== + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smash it by providing detailed and welcomed feedback. + +Credits +======= + +Images +------ + +* Odoo Community Association: `Icon `_. + +Contributors +------------ + +* Hendrix Costa +* Albert De La Fuente + +Funders +------- + +The development of this module has been financially supported by: + +* Company 1 name +* Company 2 name + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/l10n_br_hr_payroll_report/__init__.py b/l10n_br_hr_payroll_report/__init__.py new file mode 100644 index 000000000..57a82cd5f --- /dev/null +++ b/l10n_br_hr_payroll_report/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 KMEE - Hendrix Costa +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import reports +from . import models +from . import wizards diff --git a/l10n_br_hr_payroll_report/__openerp__.py b/l10n_br_hr_payroll_report/__openerp__.py new file mode 100644 index 000000000..8910d8f0b --- /dev/null +++ b/l10n_br_hr_payroll_report/__openerp__.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 KMEE - Hendrix Costa +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Reports for l10n_br_hr_payslip', + 'summary': 'Reports for l10n_br_hr_payslip', + 'version': '8.0.1.0.0', + 'category': 'Reports', + 'website': 'http://www.kmee.com.br', + 'author': "KMEE, Odoo Community Association (OCA)", + "license": "AGPL-3", + 'depends': [ + 'l10n_br_hr_payroll', + 'report_py3o', + ], + 'data': [ + 'reports/payslip_report_analitico.xml', + 'reports/payslip_report_aviso_ferias.xml', + 'reports/payslip_report_holerite.xml', + 'reports/payslip_report_rescisao.xml', + 'wizards/wizard_l10n_br_hr_payroll_analytic_report.xml', + 'views/hr_salary_rule.xml', + 'views/hr_field_rescission.xml', + 'security/ir.model.access.csv', + ], + 'installable': True, +} diff --git a/l10n_br_hr_payroll_report/data/analitico.odt b/l10n_br_hr_payroll_report/data/analitico.odt new file mode 100644 index 0000000000000000000000000000000000000000..10da97d88822ceb1ea62e07451b024f3019b7504 GIT binary patch literal 35765 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

0eZn=cz1 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 F{|^ogD}n$3 literal 0 HcmV?d00001 diff --git a/l10n_br_hr_payroll_report/data/darf.odt b/l10n_br_hr_payroll_report/data/darf.odt new file mode 100644 index 0000000000000000000000000000000000000000..3c81d3f9346cb3ea693ada0c23beeb15478fd5b7 GIT binary patch literal 27909 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 Q=+no`_Cx<*@%_I0Uz*Wre*gdg literal 0 HcmV?d00001 diff --git a/l10n_br_hr_payroll_report/data/holerite-variavel.odt b/l10n_br_hr_payroll_report/data/holerite-variavel.odt new file mode 100644 index 0000000000000000000000000000000000000000..6ba420907ebe0c6f7063368b851451734ae00808 GIT binary patch literal 17311 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 Q=+no`_Cx<*@%_I0Uz*Wre*gdg literal 0 HcmV?d00001 diff --git a/l10n_br_hr_payroll_report/data/rescisao.odt b/l10n_br_hr_payroll_report/data/rescisao.odt new file mode 100644 index 0000000000000000000000000000000000000000..9eaed29bdbd285df6f14651748f7639764cd7343 GIT binary patch literal 31786 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

@aguzf=Xri+S9IfGaLHmPOSPW(M>GYZm{E_@Aq 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 +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import payslip_report_analitico +from . import payslip_report_aviso_ferias +from . import payslip_report_holerite +from . import payslip_report_rescisao diff --git a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py new file mode 100644 index 000000000..f5080467b --- /dev/null +++ b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py @@ -0,0 +1,348 @@ +# -*- encoding: utf-8 -*- +# Copyright (C) 2017 - TODAY Albert De La Fuente - KMEE +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html +from datetime import datetime + +from openerp import api +from openerp.addons.report_py3o.py3o_parser import py3o_report_extender + + +class inss_empresa_obj(object): + def __init__(self, valores_inss_empresa): + self.base = valores_inss_empresa['base'] + self.inss_empresa = valores_inss_empresa['inss_empresa'] + self.rat_fap = valores_inss_empresa['rat_fap'] + self.terceiros = valores_inss_empresa['terceiros'] + self.total = valores_inss_empresa['total'] + + +class rubrica_obj(object): + def __init__(self, rubrica): + self.code = rubrica['code'] + self.name = rubrica['name'] + self.quantity = rubrica['quantity'] + self.sum = rubrica['sum'] + + +def format_money_mask(value): + """ + Function to transform float values to pt_BR currency mask + :param value: float value + :return: value with brazilian money format + """ + import locale + locale.setlocale(locale.LC_ALL, 'pt_BR.utf8') + value_formated = locale.currency(value, grouping=True) + + return value_formated[3:] + + +def process_data_format(data): + for line in data: + if type(data[line]) is float: + data[line] = format_money_mask(data[line]) + continue + if type(data[line]) is inss_empresa_obj: + data[line].base = format_money_mask(data[line].base) + data[line].inss_empresa = format_money_mask( + data[line].inss_empresa) + data[line].rat_fap = format_money_mask(data[line].rat_fap) + data[line].terceiros = format_money_mask(data[line].terceiros) + data[line].total = format_money_mask(data[line].total) + continue + if line == 'proventos': + for line_proventos in data[line]: + line_proventos.sum = format_money_mask(line_proventos.sum) + continue + if line == 'descontos': + for line_proventos in data[line]: + line_proventos.sum = format_money_mask(line_proventos.sum) + continue + + return data + + +@api.model +@py3o_report_extender( + "l10n_br_hr_payroll_report.report_analytic_py3o_report") +def analytic_report(pool, cr, uid, local_context, context): + active_model = context['active_model'] + if active_model == 'wizard.l10n_br_hr_payroll.analytic_report': + proxy = pool['wizard.l10n_br_hr_payroll.analytic_report'] + wizard = proxy.browse(cr, uid, context['active_id']) + busca = [ + ('company_id', '=', wizard.company_id.id), + ('mes_do_ano', '=', wizard.mes_do_ano), + ('ano', '=', wizard.ano), + ] + if wizard.tipo_de_folha == "('normal', 'rescisao')": + busca.append(('tipo_de_folha', 'in', eval(wizard.tipo_de_folha))) + else: + busca.append(('tipo_de_folha', '=', eval(wizard.tipo_de_folha))) + payslip_ids = \ + pool['hr.payslip'].search(cr, uid, busca) + + payslips = [] + for payslip_id in payslip_ids: + payslips += \ + pool['hr.payslip']\ + .browse(cr, uid, payslip_id) + else: + payslips = \ + pool['hr.payslip.run']\ + .browse(cr, uid, context['active_id']).slip_ids + SQL_BUSCA_RUBRICAS = ''' + SELECT + salary_rule.code, + salary_rule.name, + sum(payslip_line.quantity) as quantity, + payslip_line.rate, + sum(payslip_line.total), + rule_category.code as category + FROM + hr_payslip payslip + join hr_payslip_line payslip_line on payslip_line.slip_id = payslip.id + join hr_salary_rule salary_rule on salary_rule.id = + payslip_line.salary_rule_id + join hr_salary_rule_category rule_category on rule_category.id = + salary_rule.category_id + WHERE + payslip.mes_do_ano = {mes_do_ano} + AND payslip.ano = {ano} + AND payslip.company_id = {company_id} + AND payslip.tipo_de_folha in {tipo_de_folha} + AND payslip.is_simulacao = false + GROUP BY + salary_rule.code, + salary_rule.name, + payslip_line.rate, + category + ORDER BY + salary_rule.name; + ''' + SQL_BUSCA_SEFIP = ''' + SELECT + salary_rule.code, + salary_rule.name, + sum(payslip_line.quantity) as quantity, + payslip_line.rate, + sum(payslip_line.total), + rule_category.code as category + FROM + hr_payslip payslip + join hr_payslip_line payslip_line on payslip_line.slip_id = payslip.id + join hr_salary_rule salary_rule on salary_rule.id = + payslip_line.salary_rule_id + join hr_salary_rule_category rule_category on rule_category.id = + salary_rule.category_id + WHERE + rule_category.code = 'SEFIP' + AND payslip.mes_do_ano = {mes_do_ano} + AND payslip.ano = {ano} + AND payslip.company_id = {company_id} + AND payslip.tipo_de_folha in {tipo_de_folha} + AND payslip.is_simulacao = false + GROUP BY + salary_rule.code, + salary_rule.name, + payslip_line.rate, + category + ORDER BY + salary_rule.name; + ''' + SQL_BUSCA_RUBRICAS = SQL_BUSCA_RUBRICAS.format( + mes_do_ano=wizard.mes_do_ano, + ano=wizard.ano, + company_id=wizard.company_id.id, + tipo_de_folha=wizard.tipo_de_folha + ) + cr.execute(SQL_BUSCA_RUBRICAS) + payslip_lines = cr.dictfetchall() + SQL_BUSCA_SEFIP = SQL_BUSCA_SEFIP.format( + mes_do_ano=wizard.mes_do_ano, + ano=wizard.ano, + company_id=wizard.company_id.id, + tipo_de_folha=wizard.tipo_de_folha + ) + cr.execute(SQL_BUSCA_SEFIP) + payslip_lines_sefip = cr.dictfetchall() + proventos = [] + descontos = [] + total_proventos = 0.00 + total_descontos = 0.00 + taxa_inss_empresa = 0.00 + taxa_rat_fap = 0.00 + taxa_terceiros = 0.00 + inss_funcionario_retido = 0.00 + inss_pro_labore_retido = 0.00 + inss_autonomo_retido = 0.00 + total_inss_retido = 0.00 + salario_familia_deducao = 0.00 + licenca_maternidade_deducao = 0.00 + valor_retencao_do_mes_deducao = 0.00 + total_inss_deducao = 0.00 + base_fgts = 0.00 + + for rubrica in payslip_lines_sefip: + if rubrica['code'] == 'INSS_EMPRESA': + taxa_inss_empresa = rubrica['rate']/100 + elif rubrica['code'] == 'INSS_RAT_FAP': + taxa_rat_fap = rubrica['rate']/100 + elif rubrica['code'] == 'INSS_OUTRAS_ENTIDADES': + taxa_terceiros = rubrica['rate']/100 + + inss_empresa_vals = \ + { + 'base': 0.0, + 'inss_empresa': 0.0, + 'rat_fap': 0.0, + 'terceiros': 0.0, + 'total': 0.0, + } + inss_empresa_funcionario = inss_empresa_obj(inss_empresa_vals) + inss_empresa_pro_labore = inss_empresa_obj(inss_empresa_vals) + inss_empresa_autonomo = inss_empresa_obj(inss_empresa_vals) + inss_empresa_cooperativa = inss_empresa_obj(inss_empresa_vals) + for rubrica in payslip_lines: +# Somar os valores do INSS_EMPRESA e outros calculados nos holerites +# Ao invés de recalcular os valores aqui + if rubrica['code'] in ('INSS_EMPRESA_BASE', 'INSS_EMPRESA_BASE_FERIAS'): + inss_empresa_funcionario.base += rubrica['sum'] + elif rubrica['code'] in ('INSS_EMPRESA', 'INSS_EMPRESA_FERIAS'): + inss_empresa_funcionario.inss_empresa += rubrica['sum'] + inss_empresa_funcionario.total += rubrica['sum'] + elif rubrica['code'] in ('INSS_RAT_FAP', 'INSS_RAT_FAP_FERIAS'): + inss_empresa_funcionario.rat_fap += rubrica['sum'] + inss_empresa_funcionario.total += rubrica['sum'] + elif rubrica['code'] in ('INSS_OUTRAS_ENTIDADES', 'INSS_OUTRAS_ENTIDADES_FERIAS'): + inss_empresa_funcionario.terceiros += rubrica['sum'] + inss_empresa_funcionario.total += rubrica['sum'] +# if rubrica['code'] == 'INSS_EMPRESA': +# inss_empresa_funcionario.base = rubrica['sum'] +# inss_empresa_funcionario.inss_empresa = \ +# rubrica['sum'] * taxa_inss_empresa +# inss_empresa_funcionario.rat_fap = rubrica['sum'] * taxa_rat_fap +# inss_empresa_funcionario.terceiros = \ +# rubrica['sum'] * taxa_terceiros +# inss_empresa_funcionario.total = \ +# inss_empresa_funcionario.inss_empresa + \ +# inss_empresa_funcionario.rat_fap + \ +# inss_empresa_funcionario.terceiros + if rubrica['category'] == 'PROVENTO': + proventos.append(rubrica_obj(rubrica)) + total_proventos += rubrica['sum'] + elif rubrica['category'] in ['DEDUCAO', 'INSS', 'IRPF']: + descontos.append(rubrica_obj(rubrica)) + total_descontos += rubrica['sum'] + if rubrica['category'] == 'INSS': + inss_funcionario_retido += rubrica['sum'] + if rubrica['code'] == 'BASE_FGTS': + base_fgts = rubrica['sum'] + + legal_name = payslips[0].company_id.legal_name + endereco = \ + (payslips[0].company_id.street or "") + " " +\ + (payslips[0].company_id.street2 or "") + telefone = payslips[0].company_id.phone + bairro = payslips[0].company_id.district + cidade = payslips[0].company_id.city + estado = payslips[0].company_id.state_id.code + cep = payslips[0].company_id.zip + cnpj_cpf = payslips[0].company_id.cnpj_cpf + mes_do_ano = payslips[0].mes_do_ano + ano = payslips[0].ano + + total_bruto_inss_base = \ + inss_empresa_funcionario.base + inss_empresa_pro_labore.base + \ + inss_empresa_autonomo.base + inss_empresa_cooperativa.base + total_bruto_inss_empresa = \ + inss_empresa_funcionario.inss_empresa + \ + inss_empresa_pro_labore.inss_empresa + \ + inss_empresa_autonomo.inss_empresa + \ + inss_empresa_cooperativa.inss_empresa + total_bruto_inss_rat_fap = \ + inss_empresa_funcionario.rat_fap + \ + inss_empresa_pro_labore.rat_fap + \ + inss_empresa_autonomo.rat_fap + \ + inss_empresa_cooperativa.rat_fap + total_bruto_inss_terceiros = \ + inss_empresa_funcionario.terceiros + \ + inss_empresa_pro_labore.terceiros + \ + inss_empresa_autonomo.terceiros + inss_empresa_cooperativa.terceiros + total_bruto_inss_encargos = \ + inss_empresa_funcionario.total + \ + inss_empresa_pro_labore.total + \ + inss_empresa_autonomo.total + \ + inss_empresa_cooperativa.total + + total_inss_retido += \ + inss_funcionario_retido + inss_pro_labore_retido +\ + inss_autonomo_retido + total_inss_deducao += \ + salario_familia_deducao + licenca_maternidade_deducao +\ + valor_retencao_do_mes_deducao + + total_liquido_inss = \ + total_bruto_inss_encargos + total_inss_retido - total_inss_deducao + + aliquota_fgts = 8 + valor_total_fgts = base_fgts * aliquota_fgts/100.00 + mes_vencimento = mes_do_ano+1 if mes_do_ano < 12 else 1 + data_vencimento = \ + '20/' + ('0' + str(mes_vencimento)) if mes_vencimento < 10 else str( + mes_vencimento) + "/" + str(ano) + data_atual = datetime.now() + dia_atual = \ + str(data_atual.day) + "/" + str(data_atual.month) + "/" +\ + str(data_atual.year) + data = { + 'data_atual': dia_atual, + 'legal_name': legal_name, + 'endereco': endereco, + 'telefone': telefone if telefone else "", + 'bairro': bairro, + 'cidade': cidade, + 'estado': estado, + 'cep': cep, + 'cnpj_cpf': cnpj_cpf, + 'mes_do_ano': mes_do_ano, + 'ano': ano, + 'data_vencimento': data_vencimento, + 'objects': payslips, + 'proventos': proventos, + 'descontos': descontos, + 'total_proventos': total_proventos, + 'total_descontos': total_descontos, + 'total_liquido': total_proventos - total_descontos, + 'taxa_inss_empresa': taxa_inss_empresa * 100, + 'taxa_rat_fap': taxa_rat_fap * 100, + 'taxa_terceiros': taxa_terceiros * 100, + 'inss_empresa_funcionario': inss_empresa_funcionario, + 'inss_empresa_pro_labore': inss_empresa_pro_labore, + 'inss_empresa_autonomo': inss_empresa_autonomo, + 'inss_empresa_cooperativa': inss_empresa_cooperativa, + 'total_bruto_inss_base': total_bruto_inss_base, + 'total_bruto_inss_empresa': total_bruto_inss_empresa, + 'total_bruto_inss_rat_fap': total_bruto_inss_rat_fap, + 'total_bruto_inss_terceiros': total_bruto_inss_terceiros, + 'total_bruto_inss_encargos': total_bruto_inss_encargos, + 'inss_funcionario_retido': inss_funcionario_retido, + 'inss_pro_labore_retido': inss_pro_labore_retido, + 'inss_autonomo_retido': inss_autonomo_retido, + 'valor_inss': + total_bruto_inss_empresa + total_bruto_inss_rat_fap + + total_inss_retido, + 'total_inss_retido': total_inss_retido, + 'salario_familia_deducao': salario_familia_deducao, + 'licenca_maternidade_deducao': licenca_maternidade_deducao, + 'valor_retencao_do_mes_deducao': valor_retencao_do_mes_deducao, + 'total_inss_deducao': total_inss_deducao, + 'total_liquido_inss': total_liquido_inss, + 'base_fgts': base_fgts, + 'aliquota': aliquota_fgts, + 'valor_total_fgts': valor_total_fgts, + 'empresa_abc': + total_bruto_inss_empresa + total_bruto_inss_rat_fap + + inss_empresa_cooperativa.total + } + local_context.update(process_data_format(data)) diff --git a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.xml b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.xml new file mode 100644 index 000000000..3ecce71a0 --- /dev/null +++ b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.xml @@ -0,0 +1,28 @@ + + + + + + + analytic-report + odt + + + + + l10n_br_hr_payroll_report + + data/analitico.odt + + + + + diff --git a/l10n_br_hr_payroll_report/reports/payslip_report_aviso_ferias.py b/l10n_br_hr_payroll_report/reports/payslip_report_aviso_ferias.py new file mode 100644 index 000000000..9f9f75b1f --- /dev/null +++ b/l10n_br_hr_payroll_report/reports/payslip_report_aviso_ferias.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 KMEE - Hendrix Costa +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp.addons.report_py3o.py3o_parser import py3o_report_extender +from openerp import api + + +@api.model +@py3o_report_extender('l10n_br_hr_payroll.reports.payslip_report_aviso_ferias') +def payslip_aviso_ferias(pool, cr, uid, local_context, context): + companylogo = \ + pool['hr.payslip'] \ + .browse(cr, uid, context['active_id']).company_id.logo + d = {'companylogo': companylogo} + local_context.update(d) diff --git a/l10n_br_hr_payroll_report/reports/payslip_report_aviso_ferias.xml b/l10n_br_hr_payroll_report/reports/payslip_report_aviso_ferias.xml new file mode 100644 index 000000000..dd54d44f0 --- /dev/null +++ b/l10n_br_hr_payroll_report/reports/payslip_report_aviso_ferias.xml @@ -0,0 +1,27 @@ + + + + + + + Aviso de Férias + odt + + + + + l10n_br_hr_payroll_report + + data/aviso_ferias.odt + + + + + diff --git a/l10n_br_hr_payroll_report/reports/payslip_report_holerite.py b/l10n_br_hr_payroll_report/reports/payslip_report_holerite.py new file mode 100644 index 000000000..eff2a3513 --- /dev/null +++ b/l10n_br_hr_payroll_report/reports/payslip_report_holerite.py @@ -0,0 +1,16 @@ +# -*- encoding: utf-8 -*- +# Copyright (C) 2017 - TODAY Albert De La Fuente - KMEE +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from openerp.addons.report_py3o.py3o_parser import py3o_report_extender + + +@py3o_report_extender( + "l10n_br_hr_payroll_report.report_payslip_py3o_report") +def payslip_report(pool, cr, uid, local_context, context): + payslip_pool = pool['hr.payslip'] + + company_logo = \ + payslip_pool.browse(cr, uid, context['active_id']).company_id.logo + + local_context['company_logo'] = company_logo diff --git a/l10n_br_hr_payroll_report/reports/payslip_report_holerite.xml b/l10n_br_hr_payroll_report/reports/payslip_report_holerite.xml new file mode 100644 index 000000000..6d1d4c509 --- /dev/null +++ b/l10n_br_hr_payroll_report/reports/payslip_report_holerite.xml @@ -0,0 +1,34 @@ + + + + + + + Holerite + odt + + + + + l10n_br_hr_payroll_report + + data/holerite-fixo.odt + + + + + + + + diff --git a/l10n_br_hr_payroll_report/reports/payslip_report_rescisao.py b/l10n_br_hr_payroll_report/reports/payslip_report_rescisao.py new file mode 100644 index 000000000..7e67e251b --- /dev/null +++ b/l10n_br_hr_payroll_report/reports/payslip_report_rescisao.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 KMEE - Hendrix Costa +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp.addons.report_py3o.py3o_parser import py3o_report_extender + +from openerp import api, _, exceptions +import logging + +_logger = logging.getLogger(__name__) +try: + from pybrasil import valor, data + +except ImportError: + _logger.info('Cannot import pybrasil') + + +class linha(object): + def __init__(self, one, two, three): + self.one = one + self.two = two + self.three = three + + +class item_obj(object): + def __init__(self, line_ids): + self.display_name = line_ids['display_name'] + self.valor_fmt = line_ids['valor_fmt'] + + +def buscar_ultimo_salario(self): + mes = self.mes_do_ano - 1 + ano = self.ano + if mes == 0: + mes = 12 + ano -= 1 + + ultimo_holerite_id = self.env['hr.payslip'].search( + [ + ('contract_id', '=', self.contract_id.id), + ('mes_do_ano', '=', mes), + ('ano', '=', ano), + ('tipo_de_folha', '=', 'normal'), + ] + ) + for line in ultimo_holerite_id.line_ids: + if line.code == "SALARIO": + return line.total + + +@api.model +@py3o_report_extender( + 'l10n_br_hr_payroll_report.report_payslip_py3o_rescisao') +def payslip_rescisao(pool, cr, uid, localcontext, context): + self = localcontext['objects'] + companylogo = self.env.user.company_id.logo + data = { + 'companylogo': companylogo, + 'ultimo_salario': + buscar_ultimo_salario(self), + 'provento_line': popula_valor(self, 'PROVENTO'), + 'deducao_line': popula_valor(self, ['DEDUCAO', 'INSS', 'IRPF']), + } + localcontext.update(data) + + +def popula_valor(self, tipo): + + # Popula as linhas para impressão + coluna = 1 + linhas = [] + for registro in self.rescisao_ids: + if registro.tipo in tipo: + line = {} + line['display_name'] = str(registro.codigo_fmt) + ' ' + registro.name + line['valor_fmt'] = valor.formata_valor(registro.valor) + if coluna == 1: + objeto1 = item_obj(line) + coluna = 2 + elif coluna == 2: + objeto2 = item_obj(line) + coluna = 3 + elif coluna == 3: + objeto3 = item_obj(line) + linha_obj = linha(objeto1, objeto2, objeto3) + linhas.append(linha_obj) + coluna = 1 + objeto_branco = item_obj({'display_name': '', 'valor_fmt': ''}) + if coluna == 3: + linhas.append(linha(objeto1, objeto2, objeto_branco)) + elif coluna == 2: + linhas.append(linha(objeto1, objeto_branco, objeto_branco)) + + return linhas diff --git a/l10n_br_hr_payroll_report/reports/payslip_report_rescisao.xml b/l10n_br_hr_payroll_report/reports/payslip_report_rescisao.xml new file mode 100644 index 000000000..e2d8adab0 --- /dev/null +++ b/l10n_br_hr_payroll_report/reports/payslip_report_rescisao.xml @@ -0,0 +1,27 @@ + + + + + + + Rescisão + odt + + + + + l10n_br_hr_payroll_report + + data/rescisao.odt + + + + + diff --git a/l10n_br_hr_payroll_report/security/ir.model.access.csv b/l10n_br_hr_payroll_report/security/ir.model.access.csv new file mode 100644 index 000000000..7b3f0c9aa --- /dev/null +++ b/l10n_br_hr_payroll_report/security/ir.model.access.csv @@ -0,0 +1,2 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_hr_field_rescission","access_hr_field_rescission","model_hr_field_rescission","base.group_hr_user",1,1,1,1 diff --git a/l10n_br_hr_payroll_report/static/src/img/icon-previdencia.png b/l10n_br_hr_payroll_report/static/src/img/icon-previdencia.png new file mode 100644 index 0000000000000000000000000000000000000000..54be75cd870beb4d228716e81be1518b914f042e GIT binary patch literal 12284 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 + + + + hr_field_rescission_tree + hr.field.rescission + + + + + + + + + + hr_field_rescission_form + hr.field.rescission + +

+ + + + + + + + + + + + + + + + + diff --git a/l10n_br_hr_payroll_report/views/hr_salary_rule.xml b/l10n_br_hr_payroll_report/views/hr_salary_rule.xml new file mode 100644 index 000000000..539067ecd --- /dev/null +++ b/l10n_br_hr_payroll_report/views/hr_salary_rule.xml @@ -0,0 +1,16 @@ + + + + + view_salary_rule_form_inherited + hr.salary.rule + + + + + + + + + + diff --git a/l10n_br_hr_payroll_report/views/res_company.xml b/l10n_br_hr_payroll_report/views/res_company.xml new file mode 100644 index 000000000..a75b0d2ec --- /dev/null +++ b/l10n_br_hr_payroll_report/views/res_company.xml @@ -0,0 +1,17 @@ + + + + + view_company_form_inherited + res.company + + + + + + + + + + + diff --git a/l10n_br_hr_payroll_report/wizards/__init__.py b/l10n_br_hr_payroll_report/wizards/__init__.py new file mode 100644 index 000000000..783206858 --- /dev/null +++ b/l10n_br_hr_payroll_report/wizards/__init__.py @@ -0,0 +1 @@ +from . import wizard_l10n_br_hr_payroll_analytic_report diff --git a/l10n_br_hr_payroll_report/wizards/wizard_l10n_br_hr_payroll_analytic_report.py b/l10n_br_hr_payroll_report/wizards/wizard_l10n_br_hr_payroll_analytic_report.py new file mode 100644 index 000000000..5033a2eee --- /dev/null +++ b/l10n_br_hr_payroll_report/wizards/wizard_l10n_br_hr_payroll_analytic_report.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 KMEE +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp import api, fields, models, _ +from openerp.addons.l10n_br_hr_payroll.models.hr_payslip import ( + MES_DO_ANO, +) +from openerp.exceptions import ValidationError + + +class WizardL10n_br_hr_payrollAnalytic_report(models.TransientModel): + + _name = 'wizard.l10n_br_hr_payroll.analytic_report' + + tipo_de_folha = fields.Selection( + selection=(("('normal', 'rescisao')", "Folha Normal"), + ("('ferias')", "Férias"), + ("('decimo_terceiro')", "Décimo Terceiro (13º)"), + ("('provisao_decimo_terceiro')", "Provisão 13º Salário"), + ("('provisao_ferias')", "Provisão de Férias"), + ), + string=u'Tipo de folha', + default="('normal', 'rescisao')", + ) + + mes_do_ano = fields.Selection( + selection=MES_DO_ANO, + string=u'Mês', + default=fields.Date.from_string(fields.Date.today()).month + ) + + ano = fields.Integer( + string=u'Ano', + default=fields.Date.from_string(fields.Date.today()).year + ) + + company_id = fields.Many2one( + comodel_name='res.company', + string=u'Empresa', + default=lambda self: self.env.user.company_id.id or '', + ) + + @api.multi + def doit(self): + busca = [ + ('company_id', '=', self.company_id.id), + ('mes_do_ano', '=', self.mes_do_ano), + ('ano', '=', self.ano), + ] + if self.tipo_de_folha == "('normal', 'rescisao')": + busca.append(('tipo_de_folha', 'in', eval(self.tipo_de_folha))) + else: + busca.append(('tipo_de_folha', '=', eval(self.tipo_de_folha))) + payslip_ids = self.env['hr.payslip'].search(busca) + + if not payslip_ids: + raise ValidationError( + _('Não foi encontrado lote de holerite ' + 'dentro do período selecionado.')) + + else: + return self.env['report'].get_action( + self, "l10n_br_hr_payroll_report.report_analyticreport") diff --git a/l10n_br_hr_payroll_report/wizards/wizard_l10n_br_hr_payroll_analytic_report.xml b/l10n_br_hr_payroll_report/wizards/wizard_l10n_br_hr_payroll_analytic_report.xml new file mode 100644 index 000000000..a95295c10 --- /dev/null +++ b/l10n_br_hr_payroll_report/wizards/wizard_l10n_br_hr_payroll_analytic_report.xml @@ -0,0 +1,59 @@ + + + + + + + + wizard.l10n_br_hr_payroll.analytic_report.form (in l10n_br_hr_payroll_report) + wizard.l10n_br_hr_payroll.analytic_report + +
+ + + + + + + +
+
+
+
+
+ + + Relatorio analitico + wizard.l10n_br_hr_payroll.analytic_report + form + {} + new + + + + + + Relatorio analitico + + + + + +
+
From 73e82f4210c8fa3db2bad8989b943de13fbad168 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Mon, 6 Nov 2017 13:16:14 -0200 Subject: [PATCH 577/787] [FIX] Ajustes do processo identificados pelo cliente --- .../models/payment_order.py | 29 +++++++++++++++++-- .../views/payment_order.xml | 15 +++++++++- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/l10n_br_hr_payment_order/models/payment_order.py b/l10n_br_hr_payment_order/models/payment_order.py index 2ea59e7fe..f0ff47368 100644 --- a/l10n_br_hr_payment_order/models/payment_order.py +++ b/l10n_br_hr_payment_order/models/payment_order.py @@ -27,6 +27,11 @@ class PaymentOrder(models.Model): states={'draft': [('readonly', False)]}, ) + mesmo_banco = fields.Boolean( + string="Somente para Mesmo Banco ?", + default=True, + ) + @api.multi def _prepare_folha_payment_line(self, line): self.ensure_one() @@ -38,9 +43,14 @@ def _prepare_folha_payment_line(self, line): # Seta no Holerite em qual remessa esta o pagamento line.slip_id.payment_order_id = self.id + if line.partner_id != line.slip_id.employee_id.address_home_id: + banco = line.partner_id.bank_ids[0].id, + else: + banco = line.slip_id.employee_id.bank_account_id.id, + res = { 'amount_currency': amount_currency, - 'bank_id': line.slip_id.employee_id.bank_account_id.id, + 'bank_id': banco, 'order_id': self.id, 'partner_id': line.partner_id and line.partner_id.id or False, # account banking @@ -64,6 +74,10 @@ def folha_payment_import(self): _prepare_financial_payment_line 3. Criar """ + + # Identifica o banco de pagamento + banco = self.mode.bank_id.bank.id + self.line_ids.unlink() self.hr_payslip_ids = False @@ -83,7 +97,16 @@ def folha_payment_import(self): # Populate the current payment with new lines: for line in payslip_line_ids: - vals = self._prepare_folha_payment_line(line) - self.env['payment.line'].create(vals) + + # Identifica o banco de pagamento do holerite + if line.partner_id != line.slip_id.employee_id.address_home_id: + banco_holerite = line.partner_id.bank_ids[0].bank.id + else: + banco_holerite = \ + line.slip_id.employee_id.bank_account_id.bank.id, + + if banco == banco_holerite: + vals = self._prepare_folha_payment_line(line) + self.env['payment.line'].create(vals) return diff --git a/l10n_br_hr_payment_order/views/payment_order.xml b/l10n_br_hr_payment_order/views/payment_order.xml index b14424439..db27f3026 100644 --- a/l10n_br_hr_payment_order/views/payment_order.xml +++ b/l10n_br_hr_payment_order/views/payment_order.xml @@ -28,13 +28,18 @@
+ + + + + - + @@ -51,6 +56,14 @@ 1 + + {'no_create': True} + + + + {'no_create': True} + + From e5d4eb9267eec192fa783414fe74b7fde375c7e5 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Mon, 6 Nov 2017 13:40:28 -0200 Subject: [PATCH 578/787] =?UTF-8?q?[FIX]=20Corrige=20erro=20python=20quand?= =?UTF-8?q?o=20parceiro=20n=C3=A3o=20tiver=20conta=20banc=C3=A1ria=20defin?= =?UTF-8?q?ida?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payment_order/models/payment_order.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/l10n_br_hr_payment_order/models/payment_order.py b/l10n_br_hr_payment_order/models/payment_order.py index f0ff47368..929031d9c 100644 --- a/l10n_br_hr_payment_order/models/payment_order.py +++ b/l10n_br_hr_payment_order/models/payment_order.py @@ -100,7 +100,10 @@ def folha_payment_import(self): # Identifica o banco de pagamento do holerite if line.partner_id != line.slip_id.employee_id.address_home_id: - banco_holerite = line.partner_id.bank_ids[0].bank.id + if line.partner_id.bank_ids: + banco_holerite = line.partner_id.bank_ids[0].bank.id + else: + banco_holerite = False else: banco_holerite = \ line.slip_id.employee_id.bank_account_id.bank.id, From 1c4c620ef276b1d262f6fbe4f7f59e2da07ecb4b Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Mon, 6 Nov 2017 13:43:37 -0200 Subject: [PATCH 579/787] [FIX] Mais um detalhe de parceiro sem banco --- l10n_br_hr_payment_order/models/payment_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payment_order/models/payment_order.py b/l10n_br_hr_payment_order/models/payment_order.py index 929031d9c..2969f5b24 100644 --- a/l10n_br_hr_payment_order/models/payment_order.py +++ b/l10n_br_hr_payment_order/models/payment_order.py @@ -108,7 +108,7 @@ def folha_payment_import(self): banco_holerite = \ line.slip_id.employee_id.bank_account_id.bank.id, - if banco == banco_holerite: + if banco and banco == banco_holerite: vals = self._prepare_folha_payment_line(line) self.env['payment.line'].create(vals) From 44c255a61daf3acdfd8488cf157e8780ae36071e Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Mon, 6 Nov 2017 13:46:17 -0200 Subject: [PATCH 580/787] [FIX] Mais um ajustezinho --- l10n_br_hr_payment_order/models/payment_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payment_order/models/payment_order.py b/l10n_br_hr_payment_order/models/payment_order.py index 2969f5b24..1e4abe5bd 100644 --- a/l10n_br_hr_payment_order/models/payment_order.py +++ b/l10n_br_hr_payment_order/models/payment_order.py @@ -108,7 +108,7 @@ def folha_payment_import(self): banco_holerite = \ line.slip_id.employee_id.bank_account_id.bank.id, - if banco and banco == banco_holerite: + if banco_holerite and banco == banco_holerite: vals = self._prepare_folha_payment_line(line) self.env['payment.line'].create(vals) From e931b4510f0046b66fe5e93972782af0ca67dd24 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Mon, 6 Nov 2017 13:56:04 -0200 Subject: [PATCH 581/787] =?UTF-8?q?[FIX]=20Retirado=20v=C3=ADrgula=20que?= =?UTF-8?q?=20transformava=20o=20valor=20em=20tupla?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payment_order/models/payment_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payment_order/models/payment_order.py b/l10n_br_hr_payment_order/models/payment_order.py index 1e4abe5bd..50ca746c3 100644 --- a/l10n_br_hr_payment_order/models/payment_order.py +++ b/l10n_br_hr_payment_order/models/payment_order.py @@ -106,7 +106,7 @@ def folha_payment_import(self): banco_holerite = False else: banco_holerite = \ - line.slip_id.employee_id.bank_account_id.bank.id, + line.slip_id.employee_id.bank_account_id.bank.id if banco_holerite and banco == banco_holerite: vals = self._prepare_folha_payment_line(line) From 24d2c4861ec20584e8a1f13b1a3d18bf9049cc22 Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Wed, 8 Nov 2017 16:43:28 -0200 Subject: [PATCH 582/787] =?UTF-8?q?[FIX]=20Lan=C3=A7amentos=20cont=C3=A1be?= =?UTF-8?q?is=20folha=20de=20pagamento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ao realizar a contabilização de um holerite ou um lote de holerites será gerado um lançamento contábil para cada rúbrica. --- .../models/account_move.py | 15 +- .../models/l10n_br_hr_payroll_account.py | 172 ++++++----- .../models/l10n_br_hr_payroll_run_account.py | 273 ++++++++---------- .../views/l10n_br_hr_payroll_account_view.xml | 4 +- .../l10n_br_hr_payroll_run_account_view.xml | 3 +- 5 files changed, 225 insertions(+), 242 deletions(-) diff --git a/l10n_br_hr_payroll_account/models/account_move.py b/l10n_br_hr_payroll_account/models/account_move.py index b7d63557e..6d76d7d59 100644 --- a/l10n_br_hr_payroll_account/models/account_move.py +++ b/l10n_br_hr_payroll_account/models/account_move.py @@ -2,7 +2,7 @@ # Copyright (C) 2016 KMEE (http://www.kmee.com.br) # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html -from openerp import models, fields +from openerp import models, fields, api class AccountMove(models.Model): @@ -18,6 +18,19 @@ class AccountMove(models.Model): string="Payslip Run", ) + @api.multi + def name_get(self): + res = [] + for record in self: + if record.payslip_id or record.payslip_run_id: + name = record.name + res.append((record.id, name)) + + if res: + return res + else: + return super(AccountMove, self).name_get() + class AccountMoveLine(models.Model): _inherit = "account.move.line" diff --git a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py index ed2376a1b..1552c3a02 100644 --- a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py +++ b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py @@ -38,8 +38,9 @@ def _buscar_lancamentos(self): ] ) - move_id = fields.Many2one( + move_id = fields.One2many( comodel_name='account.move', + inverse_name='payslip_id', string='Accounting Entry', ) @@ -101,42 +102,23 @@ def processar_folha(self): timenow = time.strftime('%Y-%m-%d') for slip in self: - line_ids = [] debit_sum = 0.0 credit_sum = 0.0 + contador_lancamentos = 1 period_id = period_obj.find(slip.date_to) if slip.move_id: - move = slip.move_id - move_lines = self.env['account.move.line'].search( - [ - ('move_id', '=', move.id) - ] - ) - for line in move_lines: - line.unlink() - else: - name = \ - NOME_LANCAMENTO[slip.tipo_de_folha] \ - + str(slip.mes_do_ano) + "/" + str(slip.ano) \ - + " - " + slip.contract_id.nome_contrato - move = { - 'name': name, - 'display_name': name, - 'narration': name, - 'date': slip.date_from, - 'ref': slip.number, - 'journal_id': slip.journal_id.id, - 'period_id': period_id.id, - 'payslip_id': slip.id, - } - move_anterior_id = self._verificar_lancamentos_anteriores( - slip.tipo_de_folha, period_id.id - ) + slip.move_id.unlink() + for line in slip.details_by_salary_rule_category: - if line.total: + line_ids = [] + + if line.total > 0: debit_account_id, credit_account_id = \ slip._buscar_contas(line.salary_rule_id) if debit_account_id or credit_account_id: + move, move_anterior_id = self.criar_lancamento_contabil( + period_id, slip, contador_lancamentos) + contador_lancamentos += 1 amt = slip.credit_note and - \ line.total or line.total if float_is_zero(amt, precision_digits=precision): @@ -206,72 +188,80 @@ def processar_folha(self): credit_sum += \ credit_line[2]['credit'] - credit_line[2][ 'debit'] - else: - pass - # raise exceptions.Warning( - # "Não foi selecionada nenhuma conta de - # crédito ou débito para a rúbrica ", - # (line.display_name) - # ) - if float_compare( - credit_sum, debit_sum, precision_digits=precision - ) == -1: - acc_id = slip.journal_id.default_credit_account_id.id - if not acc_id: - raise Warning(_('Configuration Error!'), - _('The Expense Journal "%s" has not ' - 'properly configured the ' - 'Credit Account!' - ) % slip.journal_id.name) - adjust_credit = (0, 0, { - 'name': _('Adjustment Entry'), - 'date': timenow, - 'partner_id': False, - 'account_id': acc_id, - 'journal_id': slip.journal_id.id, - 'period_id': period_id.id, - 'debit': 0.0, - 'credit': debit_sum - credit_sum, - 'payslip_id': slip.id, - }) - line_ids.append(adjust_credit) - elif float_compare( - debit_sum, credit_sum, precision_digits=precision - ) == -1: - acc_id = slip.journal_id.default_debit_account_id.id - if not acc_id: - raise Warning(_('Configuration Error!'), - _('The Expense Journal "%s" ' - 'has not properly configured' - ' the Debit Account!' - ) % slip.journal_id.name) - adjust_debit = (0, 0, { - 'name': _('Adjustment Entry'), - 'date': timenow, - 'partner_id': False, - 'account_id': acc_id, - 'journal_id': slip.journal_id.id, - 'period_id': period_id.id, - 'debit': credit_sum - debit_sum, - 'credit': 0.0, - 'payslip_id': slip.id, - }) - line_ids.append(adjust_debit) - if not slip.move_id: - move.update({'line_id': line_ids}) - move_id = move_obj.create(move) - else: - for line in line_ids: - line[2].update({'move_id': slip.move_id.id}) - self.env['account.move.line'].create(line[2]) - move_id = slip.move_id - self.write({'move_id': move_id.id}) - if slip.journal_id.entry_posted: - move_obj.post(move_id) + if float_compare( + credit_sum, debit_sum, precision_digits=precision + ) == -1: + acc_id = slip.journal_id.default_credit_account_id.id + if not acc_id: + raise Warning(_('Configuration Error!'), + _('The Expense Journal "%s" has not ' + 'properly configured the ' + 'Credit Account!' + ) % slip.journal_id.name) + adjust_credit = (0, 0, { + 'name': _('Adjustment Entry'), + 'date': timenow, + 'partner_id': False, + 'account_id': acc_id, + 'journal_id': slip.journal_id.id, + 'period_id': period_id.id, + 'debit': 0.0, + 'credit': debit_sum - credit_sum, + 'payslip_id': slip.id, + }) + line_ids.append(adjust_credit) + + elif float_compare( + debit_sum, credit_sum, precision_digits=precision + ) == -1: + acc_id = slip.journal_id.default_debit_account_id.id + if not acc_id: + raise Warning(_('Configuration Error!'), + _('The Expense Journal "%s" ' + 'has not properly configured' + ' the Debit Account!' + ) % slip.journal_id.name) + adjust_debit = (0, 0, { + 'name': _('Adjustment Entry'), + 'date': timenow, + 'partner_id': False, + 'account_id': acc_id, + 'journal_id': slip.journal_id.id, + 'period_id': period_id.id, + 'debit': credit_sum - debit_sum, + 'credit': 0.0, + 'payslip_id': slip.id, + }) + line_ids.append(adjust_debit) + move.update({'line_id': line_ids}) + move_id = move_obj.create(move) + if slip.journal_id.entry_posted: + move_obj.post(move_id) else: raise Warning( _('Erro!'), _('É preciso selecionar um diário para realizar ' 'a contabilização!') ) + + def criar_lancamento_contabil(self, period_id, slip, contador_lancamento): + name = \ + NOME_LANCAMENTO[slip.tipo_de_folha] \ + + str(slip.mes_do_ano) + "/" + str(slip.ano) \ + + " - " + slip.contract_id.nome_contrato + " - " + \ + str("%03d" % contador_lancamento) + move = { + 'name': name, + 'display_name': name, + 'narration': name, + 'date': slip.date_from, + 'ref': slip.number, + 'journal_id': slip.journal_id.id, + 'period_id': period_id.id, + 'payslip_id': slip.id, + } + move_anterior_id = self._verificar_lancamentos_anteriores( + slip.tipo_de_folha, period_id.id + ) + return move, move_anterior_id diff --git a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py index b2612f11a..1785fc511 100644 --- a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py +++ b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py @@ -76,9 +76,11 @@ def _buscar_lancamentos(self): comodel_name='account.account', string='Conta crédito Décimo 13º', ) - move_id = fields.Many2one( + + move_id = fields.One2many( comodel_name='account.move', - string='Accounting Entry', + inverse_name='payslip_run_id', + string='Movimentações Contábeis', ) move_lines_id = fields.One2many( @@ -192,48 +194,8 @@ def _verificar_existencia_conta_rubrica(self, rubrica, tipo_de_folha): @api.multi def processar_folha(self): if self.journal_id: - conta_debito, conta_credito = self._buscar_contas_lotes() -# if conta_debito or conta_credito: - + rubricas = {} for payslip_run in self: - move_obj = self.env['account.move'] - period_obj = self.env['account.period'] - precision = \ - self.env['decimal.precision'].precision_get('Payroll') - timenow = time.strftime('%Y-%m-%d') - period_id = period_obj.find(payslip_run.date_start) - line_ids = [] - debit_sum = 0.0 - credit_sum = 0.0 - - # Exclui o lançamento se já existir - if payslip_run.move_id: - move = payslip_run.move_id - move.unlink() - #move_lines = self.env['account.move.line'].search( - # [ - # ('move_id', '=', move.id) - # ] - #) - #for line in move_lines: - # line.unlink() - - # Cria o lançamento do zero - name = \ - NOME_LANCAMENTO_LOTE[payslip_run.tipo_de_folha] + \ - " - " + str(payslip_run.mes_do_ano) + \ - "/" + str(payslip_run.ano) - move = { - 'name': name, - 'display_name': name, - 'narration': name, - 'date': payslip_run.date_end, - 'ref': payslip_run.display_name, - 'journal_id': payslip_run.journal_id.id, - 'period_id': period_id.id, - 'payslip_run_id': payslip_run.id, - } - rubricas = {} for payslip in self.slip_ids: for line in payslip.details_by_salary_rule_category: if payslip_run._verificar_existencia_conta_rubrica( @@ -251,93 +213,77 @@ def processar_folha(self): else: rubricas[line.salary_rule_id.id].total += \ line.total - move_anterior_id = \ - self._verificar_lancamentos_lotes_anteriores( - payslip_run.tipo_de_folha, period_id.id + self.processar_contabilidade_folha(rubricas) + else: + raise exceptions.Warning( + ("Erro!"), + ("É preciso selecionar um diário para realizar " + "a contabilização!") + ) + + @api.multi + def processar_contabilidade_folha(self, rubricas): + conta_debito, conta_credito = self._buscar_contas_lotes() + + for payslip_run in self: + move_obj = self.env['account.move'] + period_obj = self.env['account.period'] + precision = \ + self.env['decimal.precision'].precision_get('Payroll') + timenow = time.strftime('%Y-%m-%d') + period_id = period_obj.find(payslip_run.date_start) + debit_sum = 0.0 + credit_sum = 0.0 + contador_lancamentos = 1 + + # Exclui o lançamento se já existir + if payslip_run.move_id: + payslip_run.move_id.unlink() + + for rubrica in rubricas: + line_ids = [] + + if rubricas[rubrica].total > 0: + move = self.criar_lancamento_contabil( + line_ids, payslip_run, period_id, + timenow, contador_lancamentos ) + contador_lancamentos += 1 + debito, credito = \ + self._valor_lancamento_lote_anterior_rubrica( + rubricas[rubrica].line + ) - # - # Desfaz o lançamento anterior - # - if move_anterior_id: - for linha in move_anterior_id.line_id: - if "(Anterior)" not in linha.name: - line_anterior = (0, 0, { - 'name': linha.name + " (Anterior)", - 'date': timenow, - 'account_id': linha.account_id.id, - 'journal_id': linha.journal_id, - 'period_id': period_id, - 'debit': 0.0 if linha.credit else linha.debit, - 'credit': 0.0 if linha.debit else linha.credit, - 'payslip_run_id': payslip_run.id, - }) - line_ids.append(line_anterior) - - for rubrica in rubricas: - if rubricas[rubrica].total: - debito, credito = \ - self._valor_lancamento_lote_anterior_rubrica( - rubricas[rubrica].line - ) - #if payslip_run.tipo_de_folha in [ - # 'provisao_ferias', - # 'provisao_decimo_terceiro' - #]: - # if move_anterior_id: - # if debito or credito: - # line_anterior = (0, 0, { - # 'name': rubricas[rubrica].name + " (Anterior)", - # 'date': timenow, - # 'account_id': - # conta_debito.id if debito else - # conta_credito.id, - # 'journal_id': - # payslip_run.journal_id.id, - # 'period_id': period_id.id, - # 'debit': credito or 0.0, - # 'credit': debito or 0.0, - # 'payslip_run_id': payslip_run.id, - # }) - # line_ids.append(line_anterior) - # if debito: - # debit_sum += \ - # line_anterior[2]['debit'] - \ - # line_anterior[2]['credit'] - # else: - # credit_sum += \ - # line_anterior[2]['credit'] - \ - # line_anterior[2]['debit'] - if credito: - credit_line = (0, 0, { - 'name': rubricas[rubrica].name, - 'date': timenow, - 'account_id': credito.id, - 'journal_id': payslip_run.journal_id.id, - 'period_id': period_id.id, - 'debit': 0.0, - 'credit': rubricas[rubrica].total, - 'payslip_run_id': payslip_run.id, - }) - line_ids.append(credit_line) - credit_sum += \ - credit_line[2]['credit'] - credit_line[2][ - 'debit'] - if debito: - debit_line = (0, 0, { - 'name': rubricas[rubrica].name, - 'date': timenow, - 'account_id': debito.id, - 'journal_id': payslip_run.journal_id.id, - 'period_id': period_id.id, - 'debit': rubricas[rubrica].total, - 'credit': 0.0, - 'payslip_run_id': payslip_run.id, - }) - line_ids.append(debit_line) - debit_sum += \ - debit_line[2]['debit'] - debit_line[2][ - 'credit'] + if credito: + credit_line = (0, 0, { + 'name': rubricas[rubrica].name, + 'date': timenow, + 'account_id': credito.id, + 'journal_id': payslip_run.journal_id.id, + 'period_id': period_id.id, + 'debit': 0.0, + 'credit': rubricas[rubrica].total, + 'payslip_run_id': payslip_run.id, + }) + line_ids.append(credit_line) + credit_sum += \ + credit_line[2]['credit'] - credit_line[2][ + 'debit'] + if debito: + debit_line = (0, 0, { + 'name': rubricas[rubrica].name, + 'date': timenow, + 'account_id': debito.id, + 'journal_id': payslip_run.journal_id.id, + 'period_id': period_id.id, + 'debit': rubricas[rubrica].total, + 'credit': 0.0, + 'payslip_run_id': payslip_run.id, + }) + line_ids.append(debit_line) + debit_sum += \ + debit_line[2]['debit'] - debit_line[2][ + 'credit'] if float_compare( credit_sum, debit_sum, precision_digits=precision ) == -1: @@ -368,28 +314,61 @@ def processar_folha(self): 'payslip_run_id': payslip_run.id }) line_ids.append(adjust_debit) - if not payslip_run.move_id: - move.update({'line_id': line_ids}) - move_id = move_obj.create(move) - else: - for line in line_ids: - line[2].update({'move_id': payslip_run.move_id.id}) - self.env['account.move.line'].create(line[2]) - move_id = payslip_run.move_id - self.write({'move_id': move_id.id}) + move.update({'line_id': line_ids}) + move_id = move_obj.create(move) + # if not payslip_run.move_id: + # move.update({'line_id': line_ids}) + # move_id = move_obj.create(move) + # else: + # for line in line_ids: + # line[2].update({'move_id': payslip_run.move_id.id}) + # self.env['account.move.line'].create(line[2]) + # move_id = payslip_run.move_id if payslip_run.journal_id.entry_posted: move_obj.post(move_id) -# else: -# raise exceptions.Warning( -# "Não foi selecionada nenhuma conta de crédito ou " -# "débito para o lote de holerites!" -# ) - else: - raise exceptions.Warning( - ("Erro!"), - ("É preciso selecionar um diário para realizar " - "a contabilização!") + + def criar_lancamento_contabil(self, line_ids, payslip_run, period_id, + timenow, contador_lancamento): + # Cria o lançamento do zero + name = \ + NOME_LANCAMENTO_LOTE[payslip_run.tipo_de_folha] + \ + " - " + str(payslip_run.mes_do_ano) + \ + "/" + str(payslip_run.ano) + " - " + \ + str("%03d" % contador_lancamento) + + move = { + 'name': name, + 'display_name': name, + 'narration': name, + 'date': payslip_run.date_end, + 'ref': payslip_run.display_name, + 'journal_id': payslip_run.journal_id.id, + 'period_id': period_id.id, + 'payslip_run_id': payslip_run.id, + } + + move_anterior_id = \ + self._verificar_lancamentos_lotes_anteriores( + payslip_run.tipo_de_folha, period_id.id ) + # + # Desfaz o lançamento anterior + # + if move_anterior_id: + for linha in move_anterior_id.line_id: + if "(Anterior)" not in linha.name: + line_anterior = (0, 0, { + 'name': linha.name + " (Anterior)", + 'date': timenow, + 'account_id': linha.account_id.id, + 'journal_id': linha.journal_id, + 'period_id': period_id, + 'debit': 0.0 if linha.credit else linha.debit, + 'credit': 0.0 if linha.debit else linha.credit, + 'payslip_run_id': payslip_run.id, + }) + line_ids.append(line_anterior) + return move @api.model def fields_view_get(self, view_id=None, view_type='form', diff --git a/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_account_view.xml b/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_account_view.xml index 335803c99..7b20a3495 100644 --- a/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_account_view.xml +++ b/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_account_view.xml @@ -13,9 +13,9 @@ - + diff --git a/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_run_account_view.xml b/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_run_account_view.xml index 442d03375..39fac18d5 100644 --- a/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_run_account_view.xml +++ b/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_run_account_view.xml @@ -60,10 +60,11 @@ ---> + +--> From 52c2fc6b4157e8f323e04a0513f2b9dc4d6f20dd Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Wed, 8 Nov 2017 16:49:12 -0200 Subject: [PATCH 583/787] [FIX] PEP 8 --- .../models/l10n_br_hr_payroll_account.py | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py index 1552c3a02..8085c6a65 100644 --- a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py +++ b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py @@ -116,8 +116,10 @@ def processar_folha(self): debit_account_id, credit_account_id = \ slip._buscar_contas(line.salary_rule_id) if debit_account_id or credit_account_id: - move, move_anterior_id = self.criar_lancamento_contabil( - period_id, slip, contador_lancamentos) + move, move_anterior_id = \ + self.criar_lancamento_contabil( + period_id, slip, contador_lancamentos + ) contador_lancamentos += 1 amt = slip.credit_note and - \ line.total or line.total @@ -190,13 +192,16 @@ def processar_folha(self): 'debit'] if float_compare( - credit_sum, debit_sum, precision_digits=precision + credit_sum, debit_sum, + precision_digits=precision ) == -1: - acc_id = slip.journal_id.default_credit_account_id.id + acc_id = slip.journal_id\ + .default_credit_account_id.id if not acc_id: raise Warning(_('Configuration Error!'), - _('The Expense Journal "%s" has not ' - 'properly configured the ' + _('The Expense Journal "%s" ' + 'has not properly ' + 'configured the ' 'Credit Account!' ) % slip.journal_id.name) adjust_credit = (0, 0, { @@ -213,14 +218,17 @@ def processar_folha(self): line_ids.append(adjust_credit) elif float_compare( - debit_sum, credit_sum, precision_digits=precision + debit_sum, credit_sum, + precision_digits=precision ) == -1: - acc_id = slip.journal_id.default_debit_account_id.id + acc_id = slip.journal_id\ + .default_debit_account_id.id if not acc_id: raise Warning(_('Configuration Error!'), _('The Expense Journal "%s" ' - 'has not properly configured' - ' the Debit Account!' + 'has not properly ' + 'configured the ' + 'Debit Account!' ) % slip.journal_id.name) adjust_debit = (0, 0, { 'name': _('Adjustment Entry'), From 97f285256ab4db662615fe8ff924434055687c03 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 9 Nov 2017 06:51:06 -0200 Subject: [PATCH 584/787] =?UTF-8?q?[FIX]=20Ajuste=20para=20refactory=20do?= =?UTF-8?q?=20c=C3=A1lculo=20do=20per=C3=ADodo=20aquisitivo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 21 +++++++++++++++++++++ l10n_br_hr_payroll/views/hr_payslip.xml | 2 ++ 2 files changed, 23 insertions(+) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index dbb24a601..de57d97a7 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -465,6 +465,27 @@ def on_change_mes_do_ano(self): compute='_compute_valor_total_folha', ) + inicio_aquisitivo = fields.Date( + string=u'Início do Período Aquisitivo', + compute='_compute_periodo_aquisitivo', + store=True, + ) + fim_aquisitivo = fields.Date( + string=u'Fim do Período Aquisitivo', + compute='_compute_periodo_aquisitivo', + store=True, + ) + + @api.multi + @api.depends('periodo_aquisitivo') + def _compute_periodo_aquisitivo(self): + for holerite in self: + if holerite.periodo_aquisitivo: + holerite.inicio_aquisitivo = \ + holerite.periodo_aquisitivo.inicio_aquisitivo + holerite.fim_aquisitivo = \ + holerite.periodo_aquisitivo.fim_aquisitivo + inicio_aquisitivo_fmt = fields.Char( string=u'Inicio do Período Aquisitivo Formatado', compute='_compute_valor_total_folha', diff --git a/l10n_br_hr_payroll/views/hr_payslip.xml b/l10n_br_hr_payroll/views/hr_payslip.xml index 14d2fd0ce..08d94ec6e 100644 --- a/l10n_br_hr_payroll/views/hr_payslip.xml +++ b/l10n_br_hr_payroll/views/hr_payslip.xml @@ -78,6 +78,8 @@ + + From ef897bec8410bc6995399873f26d5b0827e5e2d9 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 9 Nov 2017 06:57:58 -0200 Subject: [PATCH 585/787] =?UTF-8?q?[FIX]=20Refactory=20(parcial)=20do=20c?= =?UTF-8?q?=C3=A1lculo=20do=20per=C3=ADodo=20aquisitivo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_vacation/models/hr_contract.py | 159 +++++++++++------- l10n_br_hr_vacation/models/hr_holidays.py | 31 +++- .../models/hr_vacation_control.py | 8 +- .../views/hr_vacation_control_view.xml | 4 +- 4 files changed, 134 insertions(+), 68 deletions(-) diff --git a/l10n_br_hr_vacation/models/hr_contract.py b/l10n_br_hr_vacation/models/hr_contract.py index d04f44fac..522af5b4e 100644 --- a/l10n_br_hr_vacation/models/hr_contract.py +++ b/l10n_br_hr_vacation/models/hr_contract.py @@ -7,6 +7,11 @@ from lxml import etree from openerp.exceptions import Warning as UserError +try: + from pybrasil import data + +except ImportError: + _logger.info('Cannot import pybrasil') class HrContract(models.Model): _inherit = 'hr.contract' @@ -99,73 +104,107 @@ def atualizar_data_demissao(self): ultimo_controle.inicio_concessivo = vals.get('inicio_concessivo') ultimo_controle.fim_concessivo = vals.get('fim_concessivo') - def verificar_controle_ferias(self): - """ - Função que verifica se em algum controle de férias ja tem um pedido de - Férias ja aprovado. Se nao existir nenhum, exclui todas as linhas de - controle de férias e chama a função para criar novas - :return: - """ - vacation_id = self.env.ref( - 'l10n_br_hr_holiday.holiday_status_vacation').id - - holidays_ferias_do_contrato = self.env['hr.holidays'].search([ - ('type', '=', 'remove'), - ('contrato_id', '=', self.id), - ('holiday_status_id', '=', vacation_id), - ]) - if holidays_ferias_do_contrato: - raise UserError(_( - "Não é possível modificar contratos " - "que possuem ocorrências ou férias confirmadas.")) - - for holiday in holidays_ferias_do_contrato: - holiday.unlink() - - for linha in self.vacation_control_ids: - linha.unlink() - @api.multi def action_button_update_controle_ferias(self): """ Ação disparada pelo botão na view, que atualiza as linhas de controle de férias desde que nao contenham férias atreladas a elas """ - self.verificar_controle_ferias() - self.atualizar_linhas_controle_ferias(self.date_start) + #self.verificar_controle_ferias() + #self.atualizar_linhas_controle_ferias(self.date_start) - @api.multi - def atualizar_linhas_controle_ferias(self, date_start): - """ - Dada uma data inicial, Apagar todo o controle de férias existente e - gerar novas linhas de controle de férias - :param date_start: string - 2017-05-01 Data de admissao do funcionario - :return: - """ - for linha in self.vacation_control_ids: - linha.unlink() - if not date_start: - date_start = self.date_start - inicio = fields.Date.from_string(date_start) - hoje = fields.Date.from_string(fields.Date.today()) - lista_controle_ferias = [] - controle_ferias_obj = self.env['hr.vacation.control'] - - while(inicio <= hoje): - vals = controle_ferias_obj.calcular_datas_aquisitivo_concessivo( - str(inicio) - ) - controle_ferias = controle_ferias_obj.create(vals) - inicio = inicio + relativedelta(years=1) - lista_controle_ferias.append(controle_ferias.id) - self.vacation_control_ids = sorted(lista_controle_ferias, reverse=True) - # verificar se o contrato ja foi encerrado - self.atualizar_data_demissao() - # gerar automaticamente as ferias (holidays) dos 2 ultimos controles - ultimos_controles = self.vacation_control_ids[:2] - for controle_ferias in ultimos_controles: - controle_ferias.gerar_holidays_ferias() - return self + for contrato in self: + + # Apagar todos os períodos aquisitivos do contrato + # + for periodo_aquisitivo in contrato.vacation_control_ids: + periodo_aquisitivo.unlink() + + # Criar os períodos aquisitivos + # + inicio = fields.Date.from_string(contrato.date_start) + hoje = fields.Date.from_string(fields.Date.today()) + lista_controle_ferias = [] + controle_ferias_obj = self.env['hr.vacation.control'] + + while inicio <= hoje: + vals = \ + controle_ferias_obj.calcular_datas_aquisitivo_concessivo( + str(inicio) + ) + controle_ferias = controle_ferias_obj.create(vals) + inicio = inicio + relativedelta(years=1) + lista_controle_ferias.append(controle_ferias.id) + + # Ordena períodos aquisitivos recalculados + # + contrato.vacation_control_ids = sorted(lista_controle_ferias, + reverse=True) + + # Buscar Férias registradas e atualizar os períodos aquisitivos + # + domain = [ + ('contract_id', '=', contrato.id), + ('tipo_de_folha', '=', 'ferias'), + ('is_simulacao', '=', False), + ('state', 'in', ['done', 'verify']), + ] + holerites_ids = \ + self.env['hr.payslip'].search(domain, order='date_from') + + for holerite in holerites_ids: + for periodo in contrato.vacation_control_ids: + + # Busca o aviso de férias do mesmo período aquisitivo + if periodo.inicio_aquisitivo == holerite.inicio_aquisitivo\ + and not periodo.inicio_gozo: + + # Calcula dias gozados + # + data_inicio = \ + fields.Date.from_string(holerite.date_from) + data_fim = fields.Date.from_string(holerite.date_to) + abono_pecuniario = \ + holerite.holidays_ferias.sold_vacations_days + dias_gozados = (data_fim - data_inicio).days + 1 + \ + abono_pecuniario + + # Cria novo período aquisitivo se ainda houver saldo + # + if (periodo.saldo - dias_gozados) > 0: + novo_periodo = periodo.copy() + novo_periodo.dias_gozados_anteriormente = \ + dias_gozados + \ + periodo.dias_gozados_anteriormente + + # Altera os valores do período aquisitivo com os dados + # do aviso de férias + # + periodo.inicio_gozo = holerite.date_from + periodo.fim_gozo = holerite.date_to + periodo.data_aviso = holerite.date_from + periodo.dias_gozados = dias_gozados + holerite.periodo_aquisitivo = periodo + + domain = [ + ('contrato_id', '=', contrato.id), + ('holiday_status_id.tipo', '=', 'ferias'), + ] + holidays = self.env['hr.holidays'].search(domain) + + for holiday in holidays: + if holiday.inicio_aquisitivo: + for periodo in contrato.vacation_control_ids: + if holiday.inicio_aquisitivo == \ + periodo.inicio_aquisitivo: + holiday.controle_ferias = [periodo.id] + + # Atualizar último periodo aquisitivo caso a data de demissão + # esteja definida + # + self.atualizar_data_demissao() + + # self.atualizar_linhas_controle_ferias(self.date_start) @api.model def fields_view_get(self, view_id=None, view_type='form', diff --git a/l10n_br_hr_vacation/models/hr_holidays.py b/l10n_br_hr_vacation/models/hr_holidays.py index a45bb57e5..98503a678 100644 --- a/l10n_br_hr_vacation/models/hr_holidays.py +++ b/l10n_br_hr_vacation/models/hr_holidays.py @@ -93,6 +93,27 @@ class HrHolidays(models.Model): string=u'Fim', ) + inicio_aquisitivo = fields.Date( + string=u'Início do Período Aquisitivo', + compute='_compute_periodo_aquisitivo', + store=True, + ) + fim_aquisitivo = fields.Date( + string=u'Fim do Período Aquisitivo', + compute='_compute_periodo_aquisitivo', + store=True, + ) + + @api.multi + @api.depends('controle_ferias') + def _compute_periodo_aquisitivo(self): + for holiday in self: + if holiday.controle_ferias: + holiday.inicio_aquisitivo = \ + holiday.controle_ferias[0].inicio_aquisitivo + holiday.fim_aquisitivo = \ + holiday.controle_ferias[0].fim_aquisitivo + @api.depends('parent_id') def _compute_verificar_regularidade(self): for holiday in self: @@ -101,11 +122,11 @@ def _compute_verificar_regularidade(self): dias_de_direito = holiday.parent_id.number_of_days_temp dias_selecionados = holiday.number_of_days_temp holiday.saldo_final = dias_de_direito - dias_selecionados - if holiday.saldo_final >= 0 and holiday.date_from >= \ - holiday.controle_ferias[0].inicio_concessivo: - holiday.regular = True - else: - holiday.regular = False + holiday.regular = False + if holiday.controle_ferias: + if holiday.saldo_final >= 0 and holiday.date_from >= \ + holiday.controle_ferias[0].inicio_concessivo: + holiday.regular = True @api.depends('vacations_days', 'sold_vacations_days') def _compute_days_temp(self): diff --git a/l10n_br_hr_vacation/models/hr_vacation_control.py b/l10n_br_hr_vacation/models/hr_vacation_control.py index eedc045cd..658465e50 100644 --- a/l10n_br_hr_vacation/models/hr_vacation_control.py +++ b/l10n_br_hr_vacation/models/hr_vacation_control.py @@ -80,6 +80,11 @@ class HrVacationControl(models.Model): default=0, ) + dias_gozados_anteriormente = fields.Float( + string=u'Dias Gozados Anteriormente', + default=0, + ) + avos = fields.Integer( string=u'Avos', compute='_compute_calcular_avos', @@ -219,7 +224,8 @@ def _compute_calcular_avos(self): def _compute_calcular_saldo_dias(self): for record in self: saldo = record.dias_de_direito() * record.avos / 12.0 - record.saldo = saldo - record.dias_gozados + record.saldo = saldo - record.dias_gozados - \ + record.dias_gozados_anteriormente def _compute_calcular_dias(self): for record in self: diff --git a/l10n_br_hr_vacation/views/hr_vacation_control_view.xml b/l10n_br_hr_vacation/views/hr_vacation_control_view.xml index addc084dd..665a430f4 100644 --- a/l10n_br_hr_vacation/views/hr_vacation_control_view.xml +++ b/l10n_br_hr_vacation/views/hr_vacation_control_view.xml @@ -10,7 +10,7 @@ - + @@ -23,8 +23,8 @@ - + From e0d8dd7972ffd9500bed1c60b5edc1f45ed27d3d Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 9 Nov 2017 10:12:14 -0200 Subject: [PATCH 586/787] =?UTF-8?q?[FIX]=20C=C3=A1lculo=20do=20Dias=20de?= =?UTF-8?q?=20Direito?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_vacation/models/hr_vacation_control.py | 1 + 1 file changed, 1 insertion(+) diff --git a/l10n_br_hr_vacation/models/hr_vacation_control.py b/l10n_br_hr_vacation/models/hr_vacation_control.py index 971588869..6f409bbb4 100644 --- a/l10n_br_hr_vacation/models/hr_vacation_control.py +++ b/l10n_br_hr_vacation/models/hr_vacation_control.py @@ -197,6 +197,7 @@ def dias_de_direito(self): dias_de_direito = 18 elif self.faltas > 5: dias_de_direito = 24 + dias_de_direito -= self.dias_gozados_anteriormente return dias_de_direito def _compute_calcular_avos(self): From c090217364f3252fec87d9265ee47cc9b8e22b17 Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Wed, 8 Nov 2017 16:43:28 -0200 Subject: [PATCH 587/787] =?UTF-8?q?[FIX]=20Lan=C3=A7amentos=20cont=C3=A1be?= =?UTF-8?q?is=20folha=20de=20pagamento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ao realizar a contabilização de um holerite ou um lote de holerites será gerado um lançamento contábil para cada rúbrica. --- .../models/account_move.py | 15 +- .../models/l10n_br_hr_payroll_account.py | 172 ++++++----- .../models/l10n_br_hr_payroll_run_account.py | 273 ++++++++---------- .../views/l10n_br_hr_payroll_account_view.xml | 4 +- .../l10n_br_hr_payroll_run_account_view.xml | 3 +- 5 files changed, 225 insertions(+), 242 deletions(-) diff --git a/l10n_br_hr_payroll_account/models/account_move.py b/l10n_br_hr_payroll_account/models/account_move.py index b7d63557e..6d76d7d59 100644 --- a/l10n_br_hr_payroll_account/models/account_move.py +++ b/l10n_br_hr_payroll_account/models/account_move.py @@ -2,7 +2,7 @@ # Copyright (C) 2016 KMEE (http://www.kmee.com.br) # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html -from openerp import models, fields +from openerp import models, fields, api class AccountMove(models.Model): @@ -18,6 +18,19 @@ class AccountMove(models.Model): string="Payslip Run", ) + @api.multi + def name_get(self): + res = [] + for record in self: + if record.payslip_id or record.payslip_run_id: + name = record.name + res.append((record.id, name)) + + if res: + return res + else: + return super(AccountMove, self).name_get() + class AccountMoveLine(models.Model): _inherit = "account.move.line" diff --git a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py index ed2376a1b..1552c3a02 100644 --- a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py +++ b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py @@ -38,8 +38,9 @@ def _buscar_lancamentos(self): ] ) - move_id = fields.Many2one( + move_id = fields.One2many( comodel_name='account.move', + inverse_name='payslip_id', string='Accounting Entry', ) @@ -101,42 +102,23 @@ def processar_folha(self): timenow = time.strftime('%Y-%m-%d') for slip in self: - line_ids = [] debit_sum = 0.0 credit_sum = 0.0 + contador_lancamentos = 1 period_id = period_obj.find(slip.date_to) if slip.move_id: - move = slip.move_id - move_lines = self.env['account.move.line'].search( - [ - ('move_id', '=', move.id) - ] - ) - for line in move_lines: - line.unlink() - else: - name = \ - NOME_LANCAMENTO[slip.tipo_de_folha] \ - + str(slip.mes_do_ano) + "/" + str(slip.ano) \ - + " - " + slip.contract_id.nome_contrato - move = { - 'name': name, - 'display_name': name, - 'narration': name, - 'date': slip.date_from, - 'ref': slip.number, - 'journal_id': slip.journal_id.id, - 'period_id': period_id.id, - 'payslip_id': slip.id, - } - move_anterior_id = self._verificar_lancamentos_anteriores( - slip.tipo_de_folha, period_id.id - ) + slip.move_id.unlink() + for line in slip.details_by_salary_rule_category: - if line.total: + line_ids = [] + + if line.total > 0: debit_account_id, credit_account_id = \ slip._buscar_contas(line.salary_rule_id) if debit_account_id or credit_account_id: + move, move_anterior_id = self.criar_lancamento_contabil( + period_id, slip, contador_lancamentos) + contador_lancamentos += 1 amt = slip.credit_note and - \ line.total or line.total if float_is_zero(amt, precision_digits=precision): @@ -206,72 +188,80 @@ def processar_folha(self): credit_sum += \ credit_line[2]['credit'] - credit_line[2][ 'debit'] - else: - pass - # raise exceptions.Warning( - # "Não foi selecionada nenhuma conta de - # crédito ou débito para a rúbrica ", - # (line.display_name) - # ) - if float_compare( - credit_sum, debit_sum, precision_digits=precision - ) == -1: - acc_id = slip.journal_id.default_credit_account_id.id - if not acc_id: - raise Warning(_('Configuration Error!'), - _('The Expense Journal "%s" has not ' - 'properly configured the ' - 'Credit Account!' - ) % slip.journal_id.name) - adjust_credit = (0, 0, { - 'name': _('Adjustment Entry'), - 'date': timenow, - 'partner_id': False, - 'account_id': acc_id, - 'journal_id': slip.journal_id.id, - 'period_id': period_id.id, - 'debit': 0.0, - 'credit': debit_sum - credit_sum, - 'payslip_id': slip.id, - }) - line_ids.append(adjust_credit) - elif float_compare( - debit_sum, credit_sum, precision_digits=precision - ) == -1: - acc_id = slip.journal_id.default_debit_account_id.id - if not acc_id: - raise Warning(_('Configuration Error!'), - _('The Expense Journal "%s" ' - 'has not properly configured' - ' the Debit Account!' - ) % slip.journal_id.name) - adjust_debit = (0, 0, { - 'name': _('Adjustment Entry'), - 'date': timenow, - 'partner_id': False, - 'account_id': acc_id, - 'journal_id': slip.journal_id.id, - 'period_id': period_id.id, - 'debit': credit_sum - debit_sum, - 'credit': 0.0, - 'payslip_id': slip.id, - }) - line_ids.append(adjust_debit) - if not slip.move_id: - move.update({'line_id': line_ids}) - move_id = move_obj.create(move) - else: - for line in line_ids: - line[2].update({'move_id': slip.move_id.id}) - self.env['account.move.line'].create(line[2]) - move_id = slip.move_id - self.write({'move_id': move_id.id}) - if slip.journal_id.entry_posted: - move_obj.post(move_id) + if float_compare( + credit_sum, debit_sum, precision_digits=precision + ) == -1: + acc_id = slip.journal_id.default_credit_account_id.id + if not acc_id: + raise Warning(_('Configuration Error!'), + _('The Expense Journal "%s" has not ' + 'properly configured the ' + 'Credit Account!' + ) % slip.journal_id.name) + adjust_credit = (0, 0, { + 'name': _('Adjustment Entry'), + 'date': timenow, + 'partner_id': False, + 'account_id': acc_id, + 'journal_id': slip.journal_id.id, + 'period_id': period_id.id, + 'debit': 0.0, + 'credit': debit_sum - credit_sum, + 'payslip_id': slip.id, + }) + line_ids.append(adjust_credit) + + elif float_compare( + debit_sum, credit_sum, precision_digits=precision + ) == -1: + acc_id = slip.journal_id.default_debit_account_id.id + if not acc_id: + raise Warning(_('Configuration Error!'), + _('The Expense Journal "%s" ' + 'has not properly configured' + ' the Debit Account!' + ) % slip.journal_id.name) + adjust_debit = (0, 0, { + 'name': _('Adjustment Entry'), + 'date': timenow, + 'partner_id': False, + 'account_id': acc_id, + 'journal_id': slip.journal_id.id, + 'period_id': period_id.id, + 'debit': credit_sum - debit_sum, + 'credit': 0.0, + 'payslip_id': slip.id, + }) + line_ids.append(adjust_debit) + move.update({'line_id': line_ids}) + move_id = move_obj.create(move) + if slip.journal_id.entry_posted: + move_obj.post(move_id) else: raise Warning( _('Erro!'), _('É preciso selecionar um diário para realizar ' 'a contabilização!') ) + + def criar_lancamento_contabil(self, period_id, slip, contador_lancamento): + name = \ + NOME_LANCAMENTO[slip.tipo_de_folha] \ + + str(slip.mes_do_ano) + "/" + str(slip.ano) \ + + " - " + slip.contract_id.nome_contrato + " - " + \ + str("%03d" % contador_lancamento) + move = { + 'name': name, + 'display_name': name, + 'narration': name, + 'date': slip.date_from, + 'ref': slip.number, + 'journal_id': slip.journal_id.id, + 'period_id': period_id.id, + 'payslip_id': slip.id, + } + move_anterior_id = self._verificar_lancamentos_anteriores( + slip.tipo_de_folha, period_id.id + ) + return move, move_anterior_id diff --git a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py index b2612f11a..1785fc511 100644 --- a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py +++ b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py @@ -76,9 +76,11 @@ def _buscar_lancamentos(self): comodel_name='account.account', string='Conta crédito Décimo 13º', ) - move_id = fields.Many2one( + + move_id = fields.One2many( comodel_name='account.move', - string='Accounting Entry', + inverse_name='payslip_run_id', + string='Movimentações Contábeis', ) move_lines_id = fields.One2many( @@ -192,48 +194,8 @@ def _verificar_existencia_conta_rubrica(self, rubrica, tipo_de_folha): @api.multi def processar_folha(self): if self.journal_id: - conta_debito, conta_credito = self._buscar_contas_lotes() -# if conta_debito or conta_credito: - + rubricas = {} for payslip_run in self: - move_obj = self.env['account.move'] - period_obj = self.env['account.period'] - precision = \ - self.env['decimal.precision'].precision_get('Payroll') - timenow = time.strftime('%Y-%m-%d') - period_id = period_obj.find(payslip_run.date_start) - line_ids = [] - debit_sum = 0.0 - credit_sum = 0.0 - - # Exclui o lançamento se já existir - if payslip_run.move_id: - move = payslip_run.move_id - move.unlink() - #move_lines = self.env['account.move.line'].search( - # [ - # ('move_id', '=', move.id) - # ] - #) - #for line in move_lines: - # line.unlink() - - # Cria o lançamento do zero - name = \ - NOME_LANCAMENTO_LOTE[payslip_run.tipo_de_folha] + \ - " - " + str(payslip_run.mes_do_ano) + \ - "/" + str(payslip_run.ano) - move = { - 'name': name, - 'display_name': name, - 'narration': name, - 'date': payslip_run.date_end, - 'ref': payslip_run.display_name, - 'journal_id': payslip_run.journal_id.id, - 'period_id': period_id.id, - 'payslip_run_id': payslip_run.id, - } - rubricas = {} for payslip in self.slip_ids: for line in payslip.details_by_salary_rule_category: if payslip_run._verificar_existencia_conta_rubrica( @@ -251,93 +213,77 @@ def processar_folha(self): else: rubricas[line.salary_rule_id.id].total += \ line.total - move_anterior_id = \ - self._verificar_lancamentos_lotes_anteriores( - payslip_run.tipo_de_folha, period_id.id + self.processar_contabilidade_folha(rubricas) + else: + raise exceptions.Warning( + ("Erro!"), + ("É preciso selecionar um diário para realizar " + "a contabilização!") + ) + + @api.multi + def processar_contabilidade_folha(self, rubricas): + conta_debito, conta_credito = self._buscar_contas_lotes() + + for payslip_run in self: + move_obj = self.env['account.move'] + period_obj = self.env['account.period'] + precision = \ + self.env['decimal.precision'].precision_get('Payroll') + timenow = time.strftime('%Y-%m-%d') + period_id = period_obj.find(payslip_run.date_start) + debit_sum = 0.0 + credit_sum = 0.0 + contador_lancamentos = 1 + + # Exclui o lançamento se já existir + if payslip_run.move_id: + payslip_run.move_id.unlink() + + for rubrica in rubricas: + line_ids = [] + + if rubricas[rubrica].total > 0: + move = self.criar_lancamento_contabil( + line_ids, payslip_run, period_id, + timenow, contador_lancamentos ) + contador_lancamentos += 1 + debito, credito = \ + self._valor_lancamento_lote_anterior_rubrica( + rubricas[rubrica].line + ) - # - # Desfaz o lançamento anterior - # - if move_anterior_id: - for linha in move_anterior_id.line_id: - if "(Anterior)" not in linha.name: - line_anterior = (0, 0, { - 'name': linha.name + " (Anterior)", - 'date': timenow, - 'account_id': linha.account_id.id, - 'journal_id': linha.journal_id, - 'period_id': period_id, - 'debit': 0.0 if linha.credit else linha.debit, - 'credit': 0.0 if linha.debit else linha.credit, - 'payslip_run_id': payslip_run.id, - }) - line_ids.append(line_anterior) - - for rubrica in rubricas: - if rubricas[rubrica].total: - debito, credito = \ - self._valor_lancamento_lote_anterior_rubrica( - rubricas[rubrica].line - ) - #if payslip_run.tipo_de_folha in [ - # 'provisao_ferias', - # 'provisao_decimo_terceiro' - #]: - # if move_anterior_id: - # if debito or credito: - # line_anterior = (0, 0, { - # 'name': rubricas[rubrica].name + " (Anterior)", - # 'date': timenow, - # 'account_id': - # conta_debito.id if debito else - # conta_credito.id, - # 'journal_id': - # payslip_run.journal_id.id, - # 'period_id': period_id.id, - # 'debit': credito or 0.0, - # 'credit': debito or 0.0, - # 'payslip_run_id': payslip_run.id, - # }) - # line_ids.append(line_anterior) - # if debito: - # debit_sum += \ - # line_anterior[2]['debit'] - \ - # line_anterior[2]['credit'] - # else: - # credit_sum += \ - # line_anterior[2]['credit'] - \ - # line_anterior[2]['debit'] - if credito: - credit_line = (0, 0, { - 'name': rubricas[rubrica].name, - 'date': timenow, - 'account_id': credito.id, - 'journal_id': payslip_run.journal_id.id, - 'period_id': period_id.id, - 'debit': 0.0, - 'credit': rubricas[rubrica].total, - 'payslip_run_id': payslip_run.id, - }) - line_ids.append(credit_line) - credit_sum += \ - credit_line[2]['credit'] - credit_line[2][ - 'debit'] - if debito: - debit_line = (0, 0, { - 'name': rubricas[rubrica].name, - 'date': timenow, - 'account_id': debito.id, - 'journal_id': payslip_run.journal_id.id, - 'period_id': period_id.id, - 'debit': rubricas[rubrica].total, - 'credit': 0.0, - 'payslip_run_id': payslip_run.id, - }) - line_ids.append(debit_line) - debit_sum += \ - debit_line[2]['debit'] - debit_line[2][ - 'credit'] + if credito: + credit_line = (0, 0, { + 'name': rubricas[rubrica].name, + 'date': timenow, + 'account_id': credito.id, + 'journal_id': payslip_run.journal_id.id, + 'period_id': period_id.id, + 'debit': 0.0, + 'credit': rubricas[rubrica].total, + 'payslip_run_id': payslip_run.id, + }) + line_ids.append(credit_line) + credit_sum += \ + credit_line[2]['credit'] - credit_line[2][ + 'debit'] + if debito: + debit_line = (0, 0, { + 'name': rubricas[rubrica].name, + 'date': timenow, + 'account_id': debito.id, + 'journal_id': payslip_run.journal_id.id, + 'period_id': period_id.id, + 'debit': rubricas[rubrica].total, + 'credit': 0.0, + 'payslip_run_id': payslip_run.id, + }) + line_ids.append(debit_line) + debit_sum += \ + debit_line[2]['debit'] - debit_line[2][ + 'credit'] if float_compare( credit_sum, debit_sum, precision_digits=precision ) == -1: @@ -368,28 +314,61 @@ def processar_folha(self): 'payslip_run_id': payslip_run.id }) line_ids.append(adjust_debit) - if not payslip_run.move_id: - move.update({'line_id': line_ids}) - move_id = move_obj.create(move) - else: - for line in line_ids: - line[2].update({'move_id': payslip_run.move_id.id}) - self.env['account.move.line'].create(line[2]) - move_id = payslip_run.move_id - self.write({'move_id': move_id.id}) + move.update({'line_id': line_ids}) + move_id = move_obj.create(move) + # if not payslip_run.move_id: + # move.update({'line_id': line_ids}) + # move_id = move_obj.create(move) + # else: + # for line in line_ids: + # line[2].update({'move_id': payslip_run.move_id.id}) + # self.env['account.move.line'].create(line[2]) + # move_id = payslip_run.move_id if payslip_run.journal_id.entry_posted: move_obj.post(move_id) -# else: -# raise exceptions.Warning( -# "Não foi selecionada nenhuma conta de crédito ou " -# "débito para o lote de holerites!" -# ) - else: - raise exceptions.Warning( - ("Erro!"), - ("É preciso selecionar um diário para realizar " - "a contabilização!") + + def criar_lancamento_contabil(self, line_ids, payslip_run, period_id, + timenow, contador_lancamento): + # Cria o lançamento do zero + name = \ + NOME_LANCAMENTO_LOTE[payslip_run.tipo_de_folha] + \ + " - " + str(payslip_run.mes_do_ano) + \ + "/" + str(payslip_run.ano) + " - " + \ + str("%03d" % contador_lancamento) + + move = { + 'name': name, + 'display_name': name, + 'narration': name, + 'date': payslip_run.date_end, + 'ref': payslip_run.display_name, + 'journal_id': payslip_run.journal_id.id, + 'period_id': period_id.id, + 'payslip_run_id': payslip_run.id, + } + + move_anterior_id = \ + self._verificar_lancamentos_lotes_anteriores( + payslip_run.tipo_de_folha, period_id.id ) + # + # Desfaz o lançamento anterior + # + if move_anterior_id: + for linha in move_anterior_id.line_id: + if "(Anterior)" not in linha.name: + line_anterior = (0, 0, { + 'name': linha.name + " (Anterior)", + 'date': timenow, + 'account_id': linha.account_id.id, + 'journal_id': linha.journal_id, + 'period_id': period_id, + 'debit': 0.0 if linha.credit else linha.debit, + 'credit': 0.0 if linha.debit else linha.credit, + 'payslip_run_id': payslip_run.id, + }) + line_ids.append(line_anterior) + return move @api.model def fields_view_get(self, view_id=None, view_type='form', diff --git a/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_account_view.xml b/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_account_view.xml index 335803c99..7b20a3495 100644 --- a/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_account_view.xml +++ b/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_account_view.xml @@ -13,9 +13,9 @@ - + diff --git a/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_run_account_view.xml b/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_run_account_view.xml index 442d03375..39fac18d5 100644 --- a/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_run_account_view.xml +++ b/l10n_br_hr_payroll_account/views/l10n_br_hr_payroll_run_account_view.xml @@ -60,10 +60,11 @@ ---> + +--> From af4f48f2499b04a9d8fafc801b699b69c1f7947c Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Wed, 8 Nov 2017 16:49:12 -0200 Subject: [PATCH 588/787] [FIX] PEP 8 --- .../models/l10n_br_hr_payroll_account.py | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py index 1552c3a02..8085c6a65 100644 --- a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py +++ b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py @@ -116,8 +116,10 @@ def processar_folha(self): debit_account_id, credit_account_id = \ slip._buscar_contas(line.salary_rule_id) if debit_account_id or credit_account_id: - move, move_anterior_id = self.criar_lancamento_contabil( - period_id, slip, contador_lancamentos) + move, move_anterior_id = \ + self.criar_lancamento_contabil( + period_id, slip, contador_lancamentos + ) contador_lancamentos += 1 amt = slip.credit_note and - \ line.total or line.total @@ -190,13 +192,16 @@ def processar_folha(self): 'debit'] if float_compare( - credit_sum, debit_sum, precision_digits=precision + credit_sum, debit_sum, + precision_digits=precision ) == -1: - acc_id = slip.journal_id.default_credit_account_id.id + acc_id = slip.journal_id\ + .default_credit_account_id.id if not acc_id: raise Warning(_('Configuration Error!'), - _('The Expense Journal "%s" has not ' - 'properly configured the ' + _('The Expense Journal "%s" ' + 'has not properly ' + 'configured the ' 'Credit Account!' ) % slip.journal_id.name) adjust_credit = (0, 0, { @@ -213,14 +218,17 @@ def processar_folha(self): line_ids.append(adjust_credit) elif float_compare( - debit_sum, credit_sum, precision_digits=precision + debit_sum, credit_sum, + precision_digits=precision ) == -1: - acc_id = slip.journal_id.default_debit_account_id.id + acc_id = slip.journal_id\ + .default_debit_account_id.id if not acc_id: raise Warning(_('Configuration Error!'), _('The Expense Journal "%s" ' - 'has not properly configured' - ' the Debit Account!' + 'has not properly ' + 'configured the ' + 'Debit Account!' ) % slip.journal_id.name) adjust_debit = (0, 0, { 'name': _('Adjustment Entry'), From 762430c44e2c868e6ca970f223bf6c0dac23aee3 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 9 Nov 2017 09:50:57 -0200 Subject: [PATCH 589/787] =?UTF-8?q?[FIX]=20Refactory=20views=20altera?= =?UTF-8?q?=C3=A7=C3=A3o=20contratual?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/__openerp__.py | 18 +-- .../l10n_br_hr_contract_cargo_atividade.xml | 94 --------------- .../cargo_atividade.xml | 83 ++++++++++++++ .../filiacao_sindical.xml | 84 ++++++++++++++ .../l10n_br_hr_contract_change/jornada.xml | 83 ++++++++++++++ .../l10n_br_hr_contract_change_base.xml | 91 +++++++++++++++ .../l10n_br_hr_contract_change_menu.xml} | 0 .../lotacao_local.xml | 70 ++++++++++++ .../remuneracao.xml | 76 ++++++++++++ .../l10n_br_hr_contract_filiacao_sindical.xml | 95 --------------- .../views/l10n_br_hr_contract_jornada.xml | 92 --------------- .../l10n_br_hr_contract_lotacao_local.xml | 69 ----------- .../views/l10n_br_hr_contract_remuneracao.xml | 108 ------------------ 13 files changed, 497 insertions(+), 466 deletions(-) delete mode 100644 l10n_br_hr_payroll/views/l10n_br_hr_contract_cargo_atividade.xml create mode 100644 l10n_br_hr_payroll/views/l10n_br_hr_contract_change/cargo_atividade.xml create mode 100644 l10n_br_hr_payroll/views/l10n_br_hr_contract_change/filiacao_sindical.xml create mode 100644 l10n_br_hr_payroll/views/l10n_br_hr_contract_change/jornada.xml create mode 100644 l10n_br_hr_payroll/views/l10n_br_hr_contract_change/l10n_br_hr_contract_change_base.xml rename l10n_br_hr_payroll/views/{l10n_br_hr_contract.xml => l10n_br_hr_contract_change/l10n_br_hr_contract_change_menu.xml} (100%) create mode 100644 l10n_br_hr_payroll/views/l10n_br_hr_contract_change/lotacao_local.xml create mode 100644 l10n_br_hr_payroll/views/l10n_br_hr_contract_change/remuneracao.xml delete mode 100644 l10n_br_hr_payroll/views/l10n_br_hr_contract_filiacao_sindical.xml delete mode 100644 l10n_br_hr_payroll/views/l10n_br_hr_contract_jornada.xml delete mode 100644 l10n_br_hr_payroll/views/l10n_br_hr_contract_lotacao_local.xml delete mode 100644 l10n_br_hr_payroll/views/l10n_br_hr_contract_remuneracao.xml diff --git a/l10n_br_hr_payroll/__openerp__.py b/l10n_br_hr_payroll/__openerp__.py index 0721f9306..20d0abb35 100644 --- a/l10n_br_hr_payroll/__openerp__.py +++ b/l10n_br_hr_payroll/__openerp__.py @@ -38,23 +38,25 @@ 'views/hr_payslip_run.xml', 'views/hr_salary_rule.xml', 'views/l10n_br_hr_child_benefit_view.xml', - 'views/l10n_br_hr_contract.xml', - 'views/l10n_br_hr_contract_remuneracao.xml', - 'views/l10n_br_hr_contract_cargo_atividade.xml', - 'views/l10n_br_hr_contract_filiacao_sindical.xml', - 'views/l10n_br_hr_contract_jornada.xml', - 'views/l10n_br_hr_contract_lotacao_local.xml', 'views/l10n_br_hr_income_tax_deductable_amount_family_view.xml', 'views/l10n_br_hr_income_tax_view.xml', 'views/l10n_br_hr_minimum_wage_view.xml', 'views/l10n_br_hr_rat_fap_view.xml', 'views/l10n_br_hr_social_security_tax_view.xml', 'views/res_config_view.xml', + # Alterações Contratuais + 'views/l10n_br_hr_contract_change/l10n_br_hr_contract_change_menu.xml', + 'views/l10n_br_hr_contract_change/l10n_br_hr_contract_change_base.xml', + 'views/l10n_br_hr_contract_change/remuneracao.xml', + 'views/l10n_br_hr_contract_change/lotacao_local.xml', + 'views/l10n_br_hr_contract_change/jornada.xml', + 'views/l10n_br_hr_contract_change/filiacao_sindical.xml', + 'views/l10n_br_hr_contract_change/cargo_atividade.xml', ], 'demo': [ # 'demo/hr_contract.xml', - 'demo/l10n_br_hr_payroll_rubricas.xml', - 'demo/l10n_br_hr_payroll_estruturas.xml', + # 'demo/l10n_br_hr_payroll_rubricas.xml', + # 'demo/l10n_br_hr_payroll_estruturas.xml', ], 'installable': True, 'auto_install': False, diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_cargo_atividade.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_cargo_atividade.xml deleted file mode 100644 index aef524f32..000000000 --- a/l10n_br_hr_payroll/views/l10n_br_hr_contract_cargo_atividade.xml +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - l10n_br_hr.contract.change.form (cargo/atividade) - l10n_br_hr.contract.change - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - - l10n_br_hr.contract.change.tree (cargo/atividade) - l10n_br_hr.contract.change - - - - - - - - - - - - - - - - - Cargo/Atividade - l10n_br_hr.contract.change - tree,form - [('change_type','=','cargo-atividade')] - {'search_default_state_draft':1, 'change_type': 'cargo-atividade'} - - - - - Cargo/Atividade - - - - - - - - tree - - - - - - - form - - - - -
-
diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/cargo_atividade.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/cargo_atividade.xml new file mode 100644 index 000000000..ccfedb07d --- /dev/null +++ b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/cargo_atividade.xml @@ -0,0 +1,83 @@ + + + + + + + + l10n_br_hr.contract.change.form(cargo/atividade) + l10n_br_hr.contract.change + + primary + + + + + + + + + + + + + + + + + + + + + + l10n_br_hr.contract.change.tree (cargo/atividade) + l10n_br_hr.contract.change + + primary + + + + + + + + + + + + + + Cargo/Atividade + l10n_br_hr.contract.change + tree,form + [('change_type','=','cargo-atividade')] + {'search_default_state_draft':1,'change_type': 'cargo-atividade'} + + + + + + + tree + + + + + + + + form + + + + + + + Cargo/Atividade + + + + + + + diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/filiacao_sindical.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/filiacao_sindical.xml new file mode 100644 index 000000000..0a7df4c94 --- /dev/null +++ b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/filiacao_sindical.xml @@ -0,0 +1,84 @@ + + + + + + + + l10n_br_hr.contract.change.form (filiacao sindical) + l10n_br_hr.contract.change + + primary + + + + + + + + + + + + + + + + + + + + + + l10n_br_hr.contract.change.tree (filiacao sindical) + l10n_br_hr.contract.change + + primary + + + + + + + + + + + + + + Filiação Sindical + l10n_br_hr.contract.change + tree,form + [('change_type','=','filiacao-sindical')] + {'search_default_state_draft':1,'change_type': 'filiacao-sindical'} + + + + + + + tree + + + + + + + + form + + + + + + + Filiação Sindical + + + + + + + diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/jornada.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/jornada.xml new file mode 100644 index 000000000..745b27fc7 --- /dev/null +++ b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/jornada.xml @@ -0,0 +1,83 @@ + + + + + + + + + l10n_br_hr.contract.change.form (jornada) + l10n_br_hr.contract.change + + primary + + + + + + + + + + + + + + + + + + + + + + l10n_br_hr.contract.change.tree (jornada) + l10n_br_hr.contract.change + + primary + + + + + + + + + + + + + Jornada + l10n_br_hr.contract.change + tree,form + [('change_type','=','jornada')] + {'search_default_state_draft':1,'change_type': 'jornada'} + + + + + + + tree + + + + + + + form + + + + + + + Jornada + + + + + + + diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/l10n_br_hr_contract_change_base.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/l10n_br_hr_contract_change_base.xml new file mode 100644 index 000000000..f55b8ffb9 --- /dev/null +++ b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/l10n_br_hr_contract_change_base.xml @@ -0,0 +1,91 @@ + + + + + + + + + l10n_br_hr.contract.change.base.form + l10n_br_hr.contract.change + +
+
+
+

+

Alteração de

+

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + l10n_br_hr.contract.change.base.tree + l10n_br_hr.contract.change + + + + + + + + + + + + + l10n_br_hr.contract.change.search (searches) + l10n_br_hr.contract.change + + + + + + + + + + + + + + + + + + + +
+
diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/l10n_br_hr_contract_change_menu.xml similarity index 100% rename from l10n_br_hr_payroll/views/l10n_br_hr_contract.xml rename to l10n_br_hr_payroll/views/l10n_br_hr_contract_change/l10n_br_hr_contract_change_menu.xml diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/lotacao_local.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/lotacao_local.xml new file mode 100644 index 000000000..42259cbe2 --- /dev/null +++ b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/lotacao_local.xml @@ -0,0 +1,70 @@ + + + + + + + + + l10n_br_hr.contract.change.form (lotacao/local) + l10n_br_hr.contract.change + + primary + + + + + + + + + + + + + l10n_br_hr.contract.change.tree (lotacao/local) + l10n_br_hr.contract.change + + primary + + + + + + + + + + Lotação/Local de trabalho + l10n_br_hr.contract.change + tree,form + [('change_type','=','lotacao-local')] + {'search_default_state_draft':1,'change_type': 'lotacao-local'} + + + + + + + tree + + + + + + form + + + + + + + Lotação/Local de trabalho + + + + + + + diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/remuneracao.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/remuneracao.xml new file mode 100644 index 000000000..69367d857 --- /dev/null +++ b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/remuneracao.xml @@ -0,0 +1,76 @@ + + + + + + + + + l10n_br_hr.contract.change.form (remuneracao) + l10n_br_hr.contract.change + + primary + + + + + + + + + + + + + + + + + + l10n_br_hr.contract.change.tree (remuneracao) + l10n_br_hr.contract.change + + primary + + + + + + + + + + + Remuneração + l10n_br_hr.contract.change + tree,form + [('change_type','=','remuneracao')] + {'search_default_state_draft':1, 'change_type': 'remuneracao'} + + + + + + + tree + + + + + + form + + + + + + + Remuneração + + + + + + + diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_filiacao_sindical.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_filiacao_sindical.xml deleted file mode 100644 index e751ccc51..000000000 --- a/l10n_br_hr_payroll/views/l10n_br_hr_contract_filiacao_sindical.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - l10n_br_hr.contract.change.form (filiacao sindical) - l10n_br_hr.contract.change - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - l10n_br_hr.contract.change.tree (filiacao sindical) - l10n_br_hr.contract.change - - - - - - - - - - - - - - - - - - Filiação Sindical - l10n_br_hr.contract.change - tree,form - [('change_type','=','filiacao-sindical')] - {'search_default_state_draft':1, 'change_type': 'filiacao-sindical'} - - - - - Filiação Sindical - - - - - - - - tree - - - - - - form - - - - -
-
diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_jornada.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_jornada.xml deleted file mode 100644 index be205ca02..000000000 --- a/l10n_br_hr_payroll/views/l10n_br_hr_contract_jornada.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - l10n_br_hr.contract.change.form (jornada) - l10n_br_hr.contract.change - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - - l10n_br_hr.contract.change.tree (jornada) - l10n_br_hr.contract.change - - - - - - - - - - - - - - - - - Jornada - l10n_br_hr.contract.change - tree,form - [('change_type','=','jornada')] - {'search_default_state_draft':1, 'change_type': 'jornada'} - - - - - Jornada - - - - - - - - tree - - - - - - form - - - - -
-
diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_lotacao_local.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_lotacao_local.xml deleted file mode 100644 index 84fb2eafc..000000000 --- a/l10n_br_hr_payroll/views/l10n_br_hr_contract_lotacao_local.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - l10n_br_hr.contract.change.form (lotacao/local) - l10n_br_hr.contract.change - -
-
-
- - - - - - - - - - - - - - - - - - -
-
-
- - - l10n_br_hr.contract.change.tree (lotacao/local) - l10n_br_hr.contract.change - - - - - - - - - - - - - Lotação/Local de trabalho - l10n_br_hr.contract.change - tree,form - [('change_type','=','lotacao-local')] - {'search_default_state_draft':1, 'change_type': 'lotacao-local'} - - - - - Lotação/Local de trabalho - - - - - -
-
diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_remuneracao.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_remuneracao.xml deleted file mode 100644 index 07b4882ef..000000000 --- a/l10n_br_hr_payroll/views/l10n_br_hr_contract_remuneracao.xml +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - l10n_br_hr.contract.change.form (searches) - l10n_br_hr.contract.change - - - - - - - - - - - - - - - - - - - - l10n_br_hr.contract.change.form (remuneracao) - l10n_br_hr.contract.change - -
-
-
- - - - - - - - - - - - - - - - - - - - - -
-
-
- - - l10n_br_hr.contract.change.tree (remuneracao) - l10n_br_hr.contract.change - - - - - - - - - - - - - - - Remuneração - l10n_br_hr.contract.change - tree,form - [('change_type','=','remuneracao')] - {'search_default_state_draft':1, 'change_type': 'remuneracao'} - - - - - - tree - - - - - - form - - - - - Remuneração - - - - - -
-
From fef715a5863774d083c862a6dceef4dbc5d8df37 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 9 Nov 2017 09:55:43 -0200 Subject: [PATCH 590/787] =?UTF-8?q?[FIX]=20Refatorar=20M=C3=A9todos=20da?= =?UTF-8?q?=20altera=C3=A7=C3=A3o=20contratual.=20-=20Adicionar=20campo=20?= =?UTF-8?q?para=20rec=5Fname=20-=20Adicionar=20m=C3=A9todo=20para=20desfaz?= =?UTF-8?q?er=20alteracao=20contratual=20-=20Validacao=20para=20exclusao?= =?UTF-8?q?=20-=20validacao=20para=20incluir=20alteracao=20apenas=20mais?= =?UTF-8?q?=20recente=20que=20a=20ultima=20alteracao=20aplicada?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/l10n_br_hr_contract.py | 366 ++++++++++++------ 1 file changed, 239 insertions(+), 127 deletions(-) diff --git a/l10n_br_hr_payroll/models/l10n_br_hr_contract.py b/l10n_br_hr_payroll/models/l10n_br_hr_contract.py index cf12e6af8..98c7bbe93 100644 --- a/l10n_br_hr_payroll/models/l10n_br_hr_contract.py +++ b/l10n_br_hr_payroll/models/l10n_br_hr_contract.py @@ -2,11 +2,23 @@ # Copyright 2017 KMEE # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from openerp import api, fields, models +from openerp import api, fields, models, _ from openerp.exceptions import Warning as UserError +from openerp.exceptions import ValidationError +from pybrasil.data import formata_data -STATES = [('draft', 'Rascunho'), - ('applied', 'Aplicada')] +STATES = [ + ('draft', 'Rascunho'), + ('applied', 'Aplicada') +] + +CHANGE_TYPE = [ + ('remuneracao', u'Remuneração'), + ('jornada', u'Jornada'), + ('cargo-atividade', u'Cargo/Atividade'), + ('filiacao-sindical', u'Filiação Sindical'), + ('lotacao-local', u'Lotação/Local de trabalho'), +] class HrContractChangeReason(models.Model): @@ -20,90 +32,105 @@ class HrContractChangeReason(models.Model): class HrContractChange(models.Model): _name = 'l10n_br_hr.contract.change' - _description = u"Alteração contratual" + _rec_name = 'nome_alteracao' + _description = u'Alteração contratual' _inherit = 'hr.contract' _order = 'change_date desc, contract_id' - def _get_default_type(self): - change_type = self._context.get('change_type', False) - if change_type: - return change_type - else: - raise UserError(u'Sem tipo de alteração definido!') - - @api.depends('contract_id', 'change_history_ids') - def _get_change_history(self): - change_type = self._context.get('change_type', False) - full_history = self.search( - [('contract_id', '=', self.contract_id.id), - ('change_type', '=', change_type), - ('state', '=', 'applied')]) - self.change_history_ids = full_history + nome_alteracao = fields.Char( + string='Nome de exibição', + ) contract_id = fields.Many2one( - 'hr.contract', - string="Contrato" + comodel_name='hr.contract', + string='Contrato', + ondelete='cascade', ) + change_type = fields.Selection( - selection=[ - ('remuneracao', u'Remuneração'), - ('jornada', u'Jornada'), - ('cargo-atividade', u'Cargo/Atividade'), - ('filiacao-sindical', u'Filiação Sindical'), - ('lotacao-local', u'Lotação/Local de trabalho'), - ], + selection=CHANGE_TYPE, string=u"Tipo de alteração contratual", - default=_get_default_type + default=lambda self: self._get_default_type(), ) + change_reason_id = fields.Many2one( comodel_name='l10n_br_hr.contract.change_reason', string=u"Motivo", required=True, ) - change_date = fields.Date(u'Data da alteração') + + change_date = fields.Date( + string=u'Data da alteração', + required=True, + ) + change_history_ids = fields.Many2many( comodel_name='l10n_br_hr.contract.change', inverse_name='contract_id', string=u"Histórico", - compute=_get_change_history, + compute='_get_change_history', + ) + + employee_id = fields.Many2one( + string='Employee', + comodel_name='hr.employee', + required=False ) - name = fields.Char(string='Contract Reference', required=False) - employee_id = fields.Many2one(string='Employee', - comodel_name='hr.employee', - required=False) - type_id = fields.Many2one(string='Contract Type', - comodel_name='hr.contract.type', - required=False) - state = fields.Selection(string=u'Alteração aplicada', selection=STATES, - default='draft') + + type_id = fields.Many2one( + string='Contract Type', + comodel_name='hr.contract.type', + required=False + ) + + state = fields.Selection( + string=u'Alteração aplicada', + selection=STATES, + default='draft' + ) + user_id = fields.Many2one( comodel_name='res.users', string='Alterado por', + default=lambda self: self.env.user, ) + def _get_default_type(self): + change_type = self._context.get('change_type', False) + if change_type: + return change_type + else: + raise UserError(u'Sem tipo de alteração definido!') + + @api.depends('contract_id', 'change_history_ids') + def _get_change_history(self): + change_type = self._context.get('change_type', False) + full_history = self.search( + [('contract_id', '=', self.contract_id.id), + ('change_type', '=', change_type), + ('state', '=', 'applied')]) + self.change_history_ids = full_history + @api.onchange('contract_id') def _onchange_contract_id(self): contract = self.contract_id - self.change_date = fields.datetime.now() + self.change_date = fields.Date.today() self.notes = contract.notes + self.wage = contract.wage if self.change_type == 'remuneracao': - self.wage = contract.wage self.salary_unit = contract.salary_unit self.struct_id = contract.struct_id elif self.change_type == 'jornada': - self.wage = contract.wage self.working_hours = contract.working_hours self.schedule_pay = contract.schedule_pay self.monthly_hours = contract.monthly_hours self.weekly_hours = contract.weekly_hours elif self.change_type == 'cargo-atividade': - self.wage = contract.wage self.job_id = contract.job_id self.type_id = contract.type_id self.admission_type_id = contract.admission_type_id self.labor_bond_type_id = contract.labor_bond_type_id self.labor_regime_id = contract.labor_regime_id elif self.change_type == 'filiacao-sindical': - self.wage = contract.wage self.union = contract.union self.union_cnpj = contract.union_cnpj self.union_entity_code = contract.union_entity_code @@ -112,94 +139,179 @@ def _onchange_contract_id(self): self.month_base_date = contract.month_base_date @api.multi - def apply_contract_changes(self): + def verificar_primeira_alteracao(self): + """ + Se for primeira alteração do contrato criar uma alteração para + registrar dados iniciais do contrato + :return: + """ for change in self: contract = change.contract_id - if self.change_type == 'remuneracao': - if not self.env['l10n_br_hr.contract.change'].search( - [('wage', '>', 0), - ('change_date', '<', change.change_date)]): - vals = { - 'contract_id': contract.id, - 'change_date': contract.date_start, - 'change_reason_id': change.change_reason_id.id, - 'wage': contract.wage, - 'struct_id': change.struct_id.id, - 'state': 'applied', - } - self.env['l10n_br_hr.contract.change'].create(vals) - contract.wage = self.wage - contract.salary_unit = self.salary_unit - contract.struct_id = self.struct_id - elif self.change_type == 'jornada': - if not self.env['l10n_br_hr.contract.change'].search( - [('working_hours', '!=', False), - ('change_date', '<', change.change_date)]): - vals = { - 'contract_id': contract.id, - 'change_date': contract.date_start, - 'change_reason_id': change.change_reason_id.id, - 'wage': contract.wage, - 'working_hours': contract.working_hours.id, - 'struct_id': change.struct_id.id, - 'state': 'applied', - } - self.env['l10n_br_hr.contract.change'].create(vals) - contract.working_hours = self.working_hours - contract.schedule_pay = self.schedule_pay - contract.monthly_hours = self.monthly_hours - contract.weekly_hours = self.weekly_hours - elif self.change_type == 'cargo-atividade': - if not self.env['l10n_br_hr.contract.change'].search( - [('job_id', '!=', False), - ('change_date', '<', change.change_date)]): - vals = { - 'contract_id': contract.id, - 'change_date': contract.date_start, - 'change_reason_id': change.change_reason_id.id, - 'wage': contract.wage, - 'job_id': contract.job_id.id, - 'type_id': contract.type_id.id, - 'adminission_type_id': contract.admission_type_id.id, - 'labor_bond_type_id': contract.labor_bond_type_id.id, - 'labor_regime_id': contract.labor_regime_id.id, - 'struct_id': change.struct_id.id, - 'state': 'applied', - } - self.env['l10n_br_hr.contract.change'].create(vals) - contract.job_id = self.job_id - contract.type_id = self.type_id - contract.admission_type_id = self.admission_type_id - contract.labor_bond_type_id = self.labor_bond_type_id - contract.labor_regime_id = self.labor_regime_id - elif self.change_type == 'filiacao-sindical': - if not self.env['l10n_br_hr.contract.change'].search( - [('union', '!=', False), - ('change_date', '<', change.change_date)]): - vals = { - 'contract_id': contract.id, - 'change_date': contract.date_start, - 'change_reason_id': change.change_reason_id.id, - 'wage': contract.wage, - 'union': contract.union, - 'union_cnpj': contract.union_cnpj, - 'union_entity_code': contract.union_entity_code, - 'discount_union_contribution': + # Buscar se existe alterações anteriores + domain = [ + ('id', '!=', change.id), + ('change_type', '=', change.change_type), + ('contract_id', '=', contract.id), + ('state', '=', 'applied'), + ] + alteracoes_anteriores = self.search_count(domain) + + # se nao existir alterações anteriores, criar a primeira alteração + # com registro dos dados iniciais do contrato. + if not alteracoes_anteriores: + vals = { + 'contract_id': contract.id, + 'change_date': contract.date_start, + 'change_reason_id': change.change_reason_id.id, + 'wage': contract.wage, + 'struct_id': change.struct_id.id, + 'state': 'applied', + } + + if change.change_type == 'jornada': + vals.update(working_hours=contract.working_hours.id) + elif change.change_type == 'cargo-atividade': + vals.update( + job_id= contract.job_id.id, + type_id= contract.type_id.id, + adminission_type_id= contract.admission_type_id.id, + labor_bond_type_id= contract.labor_bond_type_id.id, + labor_regime_id= contract.labor_regime_id.id, + ) + elif change.change_type == 'filiacao-sindical': + vals.update( + union=contract.union, + union_cnpj=contract.union_cnpj, + union_entity_code=contract.union_entity_code, + discount_union_contribution= contract.discount_union_contribution, - 'month_base_date': contract.month_base_date, - 'struct_id': change.struct_id.id, - 'state': 'applied', - } - self.env['l10n_br_hr.contract.change'].create(vals) - contract.union = self.union - contract.union_cnpj = self.union_cnpj - contract.union_entity_code = self.union_entity_code + month_base_date=contract.month_base_date + ) + # Criar o registro inicial + self.create(vals) + + @api.multi + def apply_contract_changes(self): + """ + Aplica a alteração no contrato, e se for a primeira alteração daquele + tipo cria um registro de alteração inicial. + :return: + """ + for alteracao in self: + # Verificar se ja existe alguma alteracao do mesmo tipo + alteracao.verificar_primeira_alteracao() + # alias para o contrato corrente + contract = alteracao.contract_id + if alteracao.change_type == 'remuneracao': + contract.wage = alteracao.wage + contract.salary_unit = alteracao.salary_unit + contract.struct_id = alteracao.struct_id + elif alteracao.change_type == 'jornada': + contract.working_hours = alteracao.working_hours + contract.schedule_pay = alteracao.schedule_pay + contract.monthly_hours = alteracao.monthly_hours + contract.weekly_hours = alteracao.weekly_hours + elif alteracao.change_type == 'cargo-atividade': + contract.job_id = alteracao.job_id + contract.type_id = alteracao.type_id + contract.admission_type_id = alteracao.admission_type_id + contract.labor_bond_type_id = alteracao.labor_bond_type_id + contract.labor_regime_id = alteracao.labor_regime_id + elif self.change_type == 'filiacao-sindical': + contract.union = alteracao.union + contract.union_cnpj = alteracao.union_cnpj + contract.union_entity_code = alteracao.union_entity_code contract.discount_union_contribution = \ - self.discount_union_contribution - contract.month_base_date = self.month_base_date + alteracao.discount_union_contribution + contract.month_base_date = alteracao.month_base_date self.state = 'applied' + @api.multi + def action_back_to_draft(self): + """ + Permitir Suporte Voltar alterações para Rascunho, + desfazendo a alteração no contrato + :return: + """ + for alteracao in self: + # verificar se selecionou a ultima alteracao, pois nao sera + # possível desfazer alterações que nao forem a ultima + ultima_alteracao = self.search([ + ('change_type', '=', alteracao.change_type), + ('contract_id', '=', alteracao.contract_id.id), + ('state', '=', 'applied'), + ], order='change_date DESC', limit=1) + + if not ultima_alteracao.id == self.id: + raise UserError( + u'Só é possível desfazer a última alteração contratual.' + u'\nA última alteração é do dia %s' % + formata_data(ultima_alteracao.change_date)) + + # Aplicar a penultima alteração contratual + penultima_alteracao = self.search([ + ('id', '!=', alteracao.id), + ('change_type', '=', alteracao.change_type), + ('contract_id', '=', alteracao.contract_id.id), + ('state', '=', 'applied'), + ], order='change_date DESC', limit=1) + + # Se nao tiver uma alteração anterior, isso é, + # se for a primeira alteração contratual não é possível desfazer + if not penultima_alteracao: + raise UserError( + u'Não é possível desfazer a primeira alteração contratual.' + u'\nA primeira alteração contem as informações iniciais ' + u'do contrato.') + + penultima_alteracao.apply_contract_changes() + self.state = 'draft' + @api.model def create(self, vals): - vals.update({'user_id': self.env.user.id}) + # Criação de um nome para o _rec_name + # PS.: Nao consegui criar um campo computed. =( + if vals.get('change_type') and vals.get('contract_id') and \ + vals.get('change_date'): + contrato_id = \ + self.env['hr.contract'].browse(vals.get('contract_id')) + nome_contrato = \ + 'Contrato ' + contrato_id.nome_contrato[:6] + ' ' + \ + contrato_id.employee_id.name + vals.update({ + 'nome_alteracao' : + u'Alteração de ' + + dict(CHANGE_TYPE).get(vals.get('change_type')) + ' ' + + 'em ' + formata_data(vals.get('change_date')) + ' ' + + nome_contrato + }) return super(HrContractChange, self).create(vals) + + @api.multi + def unlink(self): + for alteracao in self: + if alteracao.state in ['applied']: + raise ValidationError(_('You can\'t delete applied changes!')) + return super(HrContractChange, self).unlink() + + @api.constrains('change_date') + def _check_date(self): + ''' + Não permitir incluir uma alteração de remuneração + com data anterior a última + :return: + ''' + ultima_alteracao = self.search([ + ('id', '!=', self.id), + ('change_type', '=', self.change_type), + ('contract_id', '=', self.contract_id.id), + ('state', '=', 'applied'), + ], order='change_date DESC', limit=1) + + if ultima_alteracao and \ + self.change_date <= ultima_alteracao.change_date: + raise UserError( + u'Não é possível criar uma alteração contratual com ' + u'data inferior à última alteração.' + u'\n Data da última alteração contratual: %s' % + formata_data(ultima_alteracao.change_date)) From c647ee92159ede581d74fc58a8fe9643c549a374 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 9 Nov 2017 09:56:05 -0200 Subject: [PATCH 591/787] [FIX] Remover datas do rec_name do contrato --- l10n_br_hr_payroll/models/hr_contract.py | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_contract.py b/l10n_br_hr_payroll/models/hr_contract.py index 50bd9b45b..347258a11 100644 --- a/l10n_br_hr_payroll/models/hr_contract.py +++ b/l10n_br_hr_payroll/models/hr_contract.py @@ -49,31 +49,12 @@ def create(self, vals): vals['codigo_contrato'] = self.env['ir.sequence'].get(self._name) return super(HrContract, self).create(vals) - @api.depends('employee_id', 'date_start') + @api.depends('employee_id') def _compute_nome_contrato(self): for contrato in self: nome = contrato.employee_id.name - inicio_contrato = contrato.date_start - fim_contrato = contrato.date_end - - if inicio_contrato: - inicio_contrato = datetime.strptime(inicio_contrato, - '%Y-%m-%d') - inicio_contrato = inicio_contrato.strftime('%d/%m/%y') - - if fim_contrato: - fim_contrato = datetime.strptime(fim_contrato, '%Y-%m-%d') - fim_contrato = fim_contrato.strftime('%d/%m/%y') - if fim_contrato > fields.Date.today(): - fim_contrato = "- D. %s" % fim_contrato - else: - fim_contrato = "- %s" % fim_contrato - else: - fim_contrato = '' matricula = contrato.codigo_contrato - nome_contrato = '[%s] %s - %s %s' % (matricula, - nome, inicio_contrato, - fim_contrato) + nome_contrato = '[%s] %s' % (matricula, nome) contrato.nome_contrato = nome_contrato if nome else '' nome_contrato = fields.Char( From e6ba29201c5737e6ee8f00e9d2a3cb095027f113 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 9 Nov 2017 09:56:28 -0200 Subject: [PATCH 592/787] =?UTF-8?q?[FIX]=20Adicionar=20icone=20para=20m?= =?UTF-8?q?=C3=B3dulo=20da=20folha=20de=20pagamento=20brasileira?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../static/description/icon.png | Bin 9455 -> 5940 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/l10n_br_hr_payroll/static/description/icon.png b/l10n_br_hr_payroll/static/description/icon.png index 3a0328b516c4980e8e44cdb63fd945757ddd132d..d00cbc2de1801b8f04ff33df79acb8d3a6d9b1be 100644 GIT binary patch literal 5940 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I From fa85984515b2e601af454eacdc3bc2047f5e172c Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 9 Nov 2017 09:58:51 -0200 Subject: [PATCH 593/787] [FIX] Code style nas regras de acesso --- .../l10n_br_hr_payslip_security_rule.xml | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/l10n_br_hr_payroll/security/l10n_br_hr_payslip_security_rule.xml b/l10n_br_hr_payroll/security/l10n_br_hr_payslip_security_rule.xml index a1852696d..00c593cc9 100644 --- a/l10n_br_hr_payroll/security/l10n_br_hr_payslip_security_rule.xml +++ b/l10n_br_hr_payroll/security/l10n_br_hr_payslip_security_rule.xml @@ -2,24 +2,26 @@ - + - - + + - - Employee Payslip - - ['|', ('employee_id.user_id', '=', user.id), ('employee_id.department_id.manager_id.user_id', '=', user.id)] - - + + + Employee Payslip + + ['|', ('employee_id.user_id', '=',user.id), ('employee_id.department_id.manager_id.user_id', '=',user.id)] + + - - Official Payslip test - - [(1,'=',1)] - - + + + Official Payslip test + + [(1,'=',1)] + + - + From c0374112f7ebd6fe1238b5f4d94ef53a84fb02c6 Mon Sep 17 00:00:00 2001 From: Luiz Felipe Divino Date: Thu, 9 Nov 2017 12:44:53 -0200 Subject: [PATCH 594/787] [FIX] Cria o novo relacionamento do holiday - com o novo periodo aquisitivo criado. --- l10n_br_hr_vacation/models/hr_contract.py | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/l10n_br_hr_vacation/models/hr_contract.py b/l10n_br_hr_vacation/models/hr_contract.py index dfbfa2a3d..609a20564 100644 --- a/l10n_br_hr_vacation/models/hr_contract.py +++ b/l10n_br_hr_vacation/models/hr_contract.py @@ -185,19 +185,13 @@ def action_button_update_controle_ferias(self): periodo.data_aviso = holerite.date_from periodo.dias_gozados = dias_gozados holerite.periodo_aquisitivo = periodo - - domain = [ - ('contrato_id', '=', contrato.id), - ('holiday_status_id.tipo', '=', 'ferias'), - ] - holidays = self.env['hr.holidays'].search(domain) - - for holiday in holidays: - if holiday.inicio_aquisitivo: - for periodo in contrato.vacation_control_ids: - if holiday.inicio_aquisitivo == \ - periodo.inicio_aquisitivo: - holiday.controle_ferias = [periodo.id] + domain = [ + ('data_inicio', '=', periodo.inicio_gozo), + ('data_fim', '=', periodo.fim_gozo) + ] + holidays = self.env['hr.holidays'].search(domain) + if holidays: + holidays.controle_ferias = [(4, periodo.id)] # Atualizar último periodo aquisitivo caso a data de demissão # esteja definida From f00524e9cde23a85baffbf85c43f2ab8f2d5a1e0 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Fri, 10 Nov 2017 12:07:17 -0200 Subject: [PATCH 595/787] =?UTF-8?q?[FIX]=20Corre=C3=A7=C3=A3o=20em=20caso?= =?UTF-8?q?=20de=20somente=201=20altera=C3=A7=C3=A3o=20contratual?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_contract.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_contract.py b/l10n_br_hr_payroll/models/hr_contract.py index 50bd9b45b..8f73f51b4 100644 --- a/l10n_br_hr_payroll/models/hr_contract.py +++ b/l10n_br_hr_payroll/models/hr_contract.py @@ -145,7 +145,10 @@ def _buscar_salario_vigente_periodo(self, data_inicio, data_fim): # diferentes # salario_dia_2 = change[i].wage / dias.days - salario_dia_1 = change[i_2].wage / dias.days + if len(change) >= 2: + salario_dia_1 = change[i_2].wage / dias.days + else: + salario_dia_1 = change[i].wage / dias.days salario_medio_2 = salario_dia_2 * dias_2 salario_medio_1 = salario_dia_1 * dias_1 From f77b493a7c213f665c971c5c57394ea8d1247d63 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Sun, 12 Nov 2017 18:01:24 -0200 Subject: [PATCH 596/787] =?UTF-8?q?[FIX]=20Ajuste=20para=20c=C3=A1lculo=20?= =?UTF-8?q?de=20sal=C3=A1rio=20passado=20quando=20houver=20somente=201=20a?= =?UTF-8?q?ltera=C3=A7=C3=A3o=20contratual?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_contract.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/l10n_br_hr_payroll/models/hr_contract.py b/l10n_br_hr_payroll/models/hr_contract.py index 8f73f51b4..8f019e9b2 100644 --- a/l10n_br_hr_payroll/models/hr_contract.py +++ b/l10n_br_hr_payroll/models/hr_contract.py @@ -145,6 +145,10 @@ def _buscar_salario_vigente_periodo(self, data_inicio, data_fim): # diferentes # salario_dia_2 = change[i].wage / dias.days + if len(change) >= 2: + salario_dia_1 = change[i_2].wage / dias.days + else: + salario_dia_1 = change[i].wage / dias.days if len(change) >= 2: salario_dia_1 = change[i_2].wage / dias.days else: From 3b997396276ef29e3efec5c19bb3de9c901d771d Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 14 Nov 2017 17:35:08 -0200 Subject: [PATCH 597/787] =?UTF-8?q?[FIX]=20Setando=20tipo=20de=20altera?= =?UTF-8?q?=C3=A7ao=20utilizando=20funcionalidade=20das=20views?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/l10n_br_hr_contract.py | 18 ++++++------------ .../cargo_atividade.xml | 4 +++- .../filiacao_sindical.xml | 2 +- .../l10n_br_hr_contract_change/jornada.xml | 2 +- .../l10n_br_hr_contract_change_base.xml | 2 +- .../lotacao_local.xml | 12 ++++++++---- .../l10n_br_hr_contract_change/remuneracao.xml | 2 +- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/l10n_br_hr_payroll/models/l10n_br_hr_contract.py b/l10n_br_hr_payroll/models/l10n_br_hr_contract.py index 98c7bbe93..7d95281f6 100644 --- a/l10n_br_hr_payroll/models/l10n_br_hr_contract.py +++ b/l10n_br_hr_payroll/models/l10n_br_hr_contract.py @@ -50,7 +50,6 @@ class HrContractChange(models.Model): change_type = fields.Selection( selection=CHANGE_TYPE, string=u"Tipo de alteração contratual", - default=lambda self: self._get_default_type(), ) change_reason_id = fields.Many2one( @@ -94,20 +93,15 @@ class HrContractChange(models.Model): default=lambda self: self.env.user, ) - def _get_default_type(self): - change_type = self._context.get('change_type', False) - if change_type: - return change_type - else: - raise UserError(u'Sem tipo de alteração definido!') @api.depends('contract_id', 'change_history_ids') def _get_change_history(self): - change_type = self._context.get('change_type', False) - full_history = self.search( - [('contract_id', '=', self.contract_id.id), - ('change_type', '=', change_type), - ('state', '=', 'applied')]) + change_type = self.change_type + full_history = self.search([ + ('contract_id', '=', self.contract_id.id), + ('change_type', '=', change_type), + ('state', '=', 'applied') + ]) self.change_history_ids = full_history @api.onchange('contract_id') diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/cargo_atividade.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/cargo_atividade.xml index ccfedb07d..0ece73ab4 100644 --- a/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/cargo_atividade.xml +++ b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/cargo_atividade.xml @@ -51,7 +51,9 @@ l10n_br_hr.contract.change tree,form [('change_type','=','cargo-atividade')] - {'search_default_state_draft':1,'change_type': 'cargo-atividade'} + { + 'search_default_state_draft':1, + 'default_change_type': 'cargo-atividade'} diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/filiacao_sindical.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/filiacao_sindical.xml index 0a7df4c94..69724175a 100644 --- a/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/filiacao_sindical.xml +++ b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/filiacao_sindical.xml @@ -52,7 +52,7 @@ l10n_br_hr.contract.change tree,form [('change_type','=','filiacao-sindical')] - {'search_default_state_draft':1,'change_type': 'filiacao-sindical'} + {'search_default_state_draft':1,'default_change_type': 'filiacao-sindical'} diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/jornada.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/jornada.xml index 745b27fc7..5252dc563 100644 --- a/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/jornada.xml +++ b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/jornada.xml @@ -52,7 +52,7 @@ l10n_br_hr.contract.change tree,form [('change_type','=','jornada')] - {'search_default_state_draft':1,'change_type': 'jornada'} + {'search_default_state_draft':1,'default_change_type': 'jornada'} diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/l10n_br_hr_contract_change_base.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/l10n_br_hr_contract_change_base.xml index f55b8ffb9..173e0476d 100644 --- a/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/l10n_br_hr_contract_change_base.xml +++ b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/l10n_br_hr_contract_change_base.xml @@ -19,7 +19,7 @@

-

Alteração de

+

Alteração de

diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/lotacao_local.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/lotacao_local.xml index 42259cbe2..d3a56d30c 100644 --- a/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/lotacao_local.xml +++ b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/lotacao_local.xml @@ -13,10 +13,13 @@ primary - + + + - + + @@ -29,7 +32,8 @@ primary - + + @@ -40,7 +44,7 @@ l10n_br_hr.contract.change tree,form [('change_type','=','lotacao-local')] - {'search_default_state_draft':1,'change_type': 'lotacao-local'} + {'search_default_state_draft':1, 'default_change_type': 'lotacao-local'} diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/remuneracao.xml b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/remuneracao.xml index 69367d857..fbf3cd8b1 100644 --- a/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/remuneracao.xml +++ b/l10n_br_hr_payroll/views/l10n_br_hr_contract_change/remuneracao.xml @@ -46,7 +46,7 @@ l10n_br_hr.contract.change tree,form [('change_type','=','remuneracao')] - {'search_default_state_draft':1, 'change_type': 'remuneracao'} + {'search_default_state_draft':1, 'default_change_type': 'remuneracao'} From 64caa95ca4dcd226b00bd3374f20f39fe7b37a24 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 14 Nov 2017 17:38:44 -0200 Subject: [PATCH 598/787] [FIX] Alteracao contratual para departamento com validacoes para alterar apenas pelo menu de alteracao contratual --- l10n_br_hr_payroll/__openerp__.py | 1 + .../data/l10n_br_hr_contract_sequence.xml | 4 ++ l10n_br_hr_payroll/models/hr_employee.py | 26 +++++++--- .../models/l10n_br_hr_contract.py | 49 ++++++++++++++++--- .../views/l10n_br_hr_employee.xml | 20 ++++++++ 5 files changed, 86 insertions(+), 14 deletions(-) create mode 100644 l10n_br_hr_payroll/views/l10n_br_hr_employee.xml diff --git a/l10n_br_hr_payroll/__openerp__.py b/l10n_br_hr_payroll/__openerp__.py index 20d0abb35..bb9c38999 100644 --- a/l10n_br_hr_payroll/__openerp__.py +++ b/l10n_br_hr_payroll/__openerp__.py @@ -33,6 +33,7 @@ 'security/ir.model.access.csv', 'security/l10n_br_hr_rat_fap_security_rule.xml', 'views/hr_contract.xml', + 'views/l10n_br_hr_employee.xml', 'views/hr_payroll_structure.xml', 'views/hr_payslip.xml', 'views/hr_payslip_run.xml', diff --git a/l10n_br_hr_payroll/data/l10n_br_hr_contract_sequence.xml b/l10n_br_hr_payroll/data/l10n_br_hr_contract_sequence.xml index ea6dee54a..6754cd923 100644 --- a/l10n_br_hr_payroll/data/l10n_br_hr_contract_sequence.xml +++ b/l10n_br_hr_payroll/data/l10n_br_hr_contract_sequence.xml @@ -17,5 +17,9 @@ + + Valores Iniciais do Contrato + + diff --git a/l10n_br_hr_payroll/models/hr_employee.py b/l10n_br_hr_payroll/models/hr_employee.py index c9b47fde8..12fd1e988 100644 --- a/l10n_br_hr_payroll/models/hr_employee.py +++ b/l10n_br_hr_payroll/models/hr_employee.py @@ -11,11 +11,23 @@ class HrEmployee(models.Model): @api.multi def write(self, vals): - for dict_key in ['work_location', 'department_id', 'job_id', - 'registration', 'manager']: - if dict_key in vals: - raise UserError(u'Alteração no campo %s só pode ser ' - u'realizada através do menu ' - u'Alterações Contratuais' % dict_key) - + # Não permitir alterações do cadastro de funcionario. + # Apenas permitir pelo menu de alteração contratual. + # O menu de alteração contratual seta uma variavel de contexto para + # indicar que a modificação partiu de lá. + # + # Se a variavel de alteracaocontratual nao for setada validar alteração + if not self.env.context.get('alteracaocontratual'): + for dict_key in ['work_location', 'department_id', 'job_id', + 'registration', 'manager']: + if dict_key in vals: + # Se a variavel nao foi setada ainda, permitir setar via + # cadastro de contratoss, se ja estiver definida disparar + # erro informando ao usuário para alterar campo pelo + # menu de Alteração contratual. + if eval('self.'+dict_key): + raise UserError( + u'Alteração no campo %s só pode ser ' + u'realizada através do menu ' + u'Alterações Contratuais' % dict_key) return super(HrEmployee, self).write(vals) diff --git a/l10n_br_hr_payroll/models/l10n_br_hr_contract.py b/l10n_br_hr_payroll/models/l10n_br_hr_contract.py index 7d95281f6..bd201c190 100644 --- a/l10n_br_hr_payroll/models/l10n_br_hr_contract.py +++ b/l10n_br_hr_payroll/models/l10n_br_hr_contract.py @@ -41,6 +41,10 @@ class HrContractChange(models.Model): string='Nome de exibição', ) + name = fields.Char( + string='Nome do contrato', + ) + contract_id = fields.Many2one( comodel_name='hr.contract', string='Contrato', @@ -93,6 +97,10 @@ class HrContractChange(models.Model): default=lambda self: self.env.user, ) + departamento_id = fields.Many2one( + comodel_name='hr.department', + string='Departamento', + ) @api.depends('contract_id', 'change_history_ids') def _get_change_history(self): @@ -107,6 +115,7 @@ def _get_change_history(self): @api.onchange('contract_id') def _onchange_contract_id(self): contract = self.contract_id + self.name = contract.name self.change_date = fields.Date.today() self.notes = contract.notes self.wage = contract.wage @@ -131,6 +140,10 @@ def _onchange_contract_id(self): self.discount_union_contribution = \ contract.discount_union_contribution self.month_base_date = contract.month_base_date + elif self.change_type == 'lotacao-local': + self.departamento_id = contract.department_id + # self.lotacao_cliente_fornecedor = contract.lotacao_cliente_fornecedor + # self.month_base_data = contract.month_base_data @api.multi def verificar_primeira_alteracao(self): @@ -153,13 +166,17 @@ def verificar_primeira_alteracao(self): # se nao existir alterações anteriores, criar a primeira alteração # com registro dos dados iniciais do contrato. if not alteracoes_anteriores: + reason = \ + self.env.ref('l10n_br_hr_payroll.' + 'l10n_br_hr_contract_change_valores_iniciais') vals = { 'contract_id': contract.id, 'change_date': contract.date_start, - 'change_reason_id': change.change_reason_id.id, + 'change_reason_id': reason.id, 'wage': contract.wage, 'struct_id': change.struct_id.id, 'state': 'applied', + 'name': change.nome_alteracao, } if change.change_type == 'jornada': @@ -181,6 +198,9 @@ def verificar_primeira_alteracao(self): contract.discount_union_contribution, month_base_date=contract.month_base_date ) + elif change.change_type == 'lotacao-local': + vals.update(departamento_id=contract.department_id.id) + # Criar o registro inicial self.create(vals) @@ -218,6 +238,15 @@ def apply_contract_changes(self): contract.discount_union_contribution = \ alteracao.discount_union_contribution contract.month_base_date = alteracao.month_base_date + elif self.change_type == 'lotacao-local': + # Setar variavel de contexto para indicar que a alteração + # partiu do menu de alterações contratuais. + contract.with_context( + alteracaocontratual=True).department_id = \ + alteracao.departamento_id + # contract.lotacao_cliente_fornecedor = \ + # alteracao.lotacao_cliente_fornecedor + # contract.month_base_data = alteracao.month_base_data self.state = 'applied' @api.multi @@ -265,19 +294,25 @@ def action_back_to_draft(self): def create(self, vals): # Criação de um nome para o _rec_name # PS.: Nao consegui criar um campo computed. =( - if vals.get('change_type') and vals.get('contract_id') and \ + change_type = vals.get('change_type') or \ + self.env.context.get('default_change_type') + if change_type and vals.get('contract_id') and \ vals.get('change_date'): contrato_id = \ self.env['hr.contract'].browse(vals.get('contract_id')) nome_contrato = \ 'Contrato ' + contrato_id.nome_contrato[:6] + ' ' + \ contrato_id.employee_id.name + nome_alteracao = \ + u'Alteração de ' + \ + dict(CHANGE_TYPE).get(change_type) + \ + ' ' + u'em ' + \ + formata_data(vals.get('change_date')) + ' ' + \ + nome_contrato vals.update({ - 'nome_alteracao' : - u'Alteração de ' + - dict(CHANGE_TYPE).get(vals.get('change_type')) + ' ' + - 'em ' + formata_data(vals.get('change_date')) + ' ' + - nome_contrato + 'nome_alteracao' : nome_alteracao, + 'name': nome_alteracao, + 'change_type': change_type, }) return super(HrContractChange, self).create(vals) diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_employee.xml b/l10n_br_hr_payroll/views/l10n_br_hr_employee.xml new file mode 100644 index 000000000..16e44e596 --- /dev/null +++ b/l10n_br_hr_payroll/views/l10n_br_hr_employee.xml @@ -0,0 +1,20 @@ + + + + + + + + hr.employee.view.form (in l10n_br_hr_payroll) + hr.employee + + + + 1 + + + + + + From 8e9fe612870db8a9b7b835dab4a301d6dd4037f5 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 14 Nov 2017 17:39:44 -0200 Subject: [PATCH 599/787] [FIX] onchange setar o departamento no holiday --- l10n_br_hr_holiday/models/hr_holidays.py | 24 +++++++++++++++++------- l10n_br_hr_holiday/views/hr_holidays.xml | 5 +++++ l10n_br_hr_payroll/models/hr_contract.py | 9 +++++---- l10n_br_hr_payroll/views/hr_contract.xml | 2 +- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/l10n_br_hr_holiday/models/hr_holidays.py b/l10n_br_hr_holiday/models/hr_holidays.py index 69d627229..b8bdfe4e8 100644 --- a/l10n_br_hr_holiday/models/hr_holidays.py +++ b/l10n_br_hr_holiday/models/hr_holidays.py @@ -44,11 +44,23 @@ class HrHolidays(models.Model): string=u'Contrato Associado', ) + department_id=fields.Many2one( + string="Departamento/lotação", + comodel_name='hr.department', + compute='_compute_department_id', + store=True, + ) + + @api.depends('contrato_id') + def _compute_department_id(self): + for holiday in self: + if holiday.contrato_id: + holiday.department_id = holiday.contrato_id.department_id + @api.onchange('contrato_id') def onchange_contrato(self): for holiday in self: holiday.employee_id = holiday.contrato_id.employee_id - holiday.department_id = holiday.contrato_id.departamento_lotacao @api.constrains('attachment_ids', 'holiday_status_id', 'date_from', 'date_to', 'number_of_days_temp') @@ -129,10 +141,8 @@ def get_ocurrences(self, employee_id, data_from, data_to): def holidays_validate(self): super(HrHolidays, self).holidays_validate() model_obj_id = self.env.ref("hr_holidays.model_hr_holidays").id - self.meeting_id.write( - { - 'models_id': model_obj_id, - 'class': 'private', - } - ) + self.meeting_id.write({ + 'models_id': model_obj_id, + 'class': 'private', + }) return True diff --git a/l10n_br_hr_holiday/views/hr_holidays.xml b/l10n_br_hr_holiday/views/hr_holidays.xml index 9cd5e615e..a8abc2397 100644 --- a/l10n_br_hr_holiday/views/hr_holidays.xml +++ b/l10n_br_hr_holiday/views/hr_holidays.xml @@ -30,6 +30,11 @@ + + + {'invisible':[('holiday_type','=','category')]} + + diff --git a/l10n_br_hr_payroll/models/hr_contract.py b/l10n_br_hr_payroll/models/hr_contract.py index 6c1ee04d2..578becb6e 100644 --- a/l10n_br_hr_payroll/models/hr_contract.py +++ b/l10n_br_hr_payroll/models/hr_contract.py @@ -273,10 +273,11 @@ def _salario_mes_proporcional(self, data_inicio, data_fim): string="Início da segunda experiência" ) - # Lotação - departamento_lotacao = fields.Many2one( - string="Departamento/lotação", - comodel_name='hr.department' + department_id = fields.Many2one( + comodel_name='hr.department', + string='Departamento/Lotação', + related=False, + readonly=False, ) lotacao_cliente_fornecedor = fields.Selection( diff --git a/l10n_br_hr_payroll/views/hr_contract.xml b/l10n_br_hr_payroll/views/hr_contract.xml index 3b381cd98..af1609317 100644 --- a/l10n_br_hr_payroll/views/hr_contract.xml +++ b/l10n_br_hr_payroll/views/hr_contract.xml @@ -92,7 +92,7 @@ - + From dc535c38dd7f9f78e06770f44b89d39eb308fc18 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 14 Nov 2017 17:53:26 -0200 Subject: [PATCH 600/787] [ADD] Salvar arquivo de remessa do cnab na payment.order --- l10n_br_hr_payment_order/models/payment_order.py | 7 +++++++ l10n_br_hr_payment_order/views/payment_order.xml | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/l10n_br_hr_payment_order/models/payment_order.py b/l10n_br_hr_payment_order/models/payment_order.py index 50ca746c3..81be428fa 100644 --- a/l10n_br_hr_payment_order/models/payment_order.py +++ b/l10n_br_hr_payment_order/models/payment_order.py @@ -32,6 +32,13 @@ class PaymentOrder(models.Model): default=True, ) + cnab_file = fields.Binary( + string='CNAB File', + readonly=True, + ) + + cnab_filename = fields.Char("CNAB Filename") + @api.multi def _prepare_folha_payment_line(self, line): self.ensure_one() diff --git a/l10n_br_hr_payment_order/views/payment_order.xml b/l10n_br_hr_payment_order/views/payment_order.xml index db27f3026..740cac484 100644 --- a/l10n_br_hr_payment_order/views/payment_order.xml +++ b/l10n_br_hr_payment_order/views/payment_order.xml @@ -64,6 +64,13 @@ {'no_create': True}
+ + + + + + +
From 73c211f51db074a7f3fafaae3bbd131c637210a9 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 14 Nov 2017 18:02:34 -0200 Subject: [PATCH 601/787] =?UTF-8?q?[FIX]=20Ajuste=20no=20nome=20do=20estad?= =?UTF-8?q?o=20no=20aviso=20de=20f=C3=A9rias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/aviso_ferias.odt | Bin 44616 -> 20203 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/l10n_br_hr_payroll_report/data/aviso_ferias.odt b/l10n_br_hr_payroll_report/data/aviso_ferias.odt index 4b25ab918d13e8addf8b1a3ed521afda41375faa..9213b23f332eeb8961d0442d918eb30c0a436f2f 100644 GIT binary patch delta 18377 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 NQlfhkS@DPZ{{VpKqXqx~ From c942ea8d04f710b4ef42a1305e116235f0756158 Mon Sep 17 00:00:00 2001 From: Isabella Maia Date: Tue, 14 Nov 2017 20:06:10 -0200 Subject: [PATCH 602/787] =?UTF-8?q?[FIX]=20Relat=C3=B3rio=20Holerite=20Fix?= =?UTF-8?q?o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/holerite-fixo.odt | Bin 17311 -> 18852 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/l10n_br_hr_payroll_report/data/holerite-fixo.odt b/l10n_br_hr_payroll_report/data/holerite-fixo.odt index 6ba420907ebe0c6f7063368b851451734ae00808..6479bee53c92fa1e6ae4437b54fa19dbb6881a2b 100644 GIT binary patch delta 14204 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 LGjVpl{U!Y$h2)aG delta 12598 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 Date: Thu, 16 Nov 2017 08:02:41 -0200 Subject: [PATCH 603/787] [ADD] Ajustar wrapper para pegar logo da nfe no relatorio do holerite --- .../reports/payslip_report_holerite.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_payroll_report/reports/payslip_report_holerite.py b/l10n_br_hr_payroll_report/reports/payslip_report_holerite.py index eff2a3513..6cd9b301e 100644 --- a/l10n_br_hr_payroll_report/reports/payslip_report_holerite.py +++ b/l10n_br_hr_payroll_report/reports/payslip_report_holerite.py @@ -4,7 +4,6 @@ from openerp.addons.report_py3o.py3o_parser import py3o_report_extender - @py3o_report_extender( "l10n_br_hr_payroll_report.report_payslip_py3o_report") def payslip_report(pool, cr, uid, local_context, context): @@ -13,4 +12,8 @@ def payslip_report(pool, cr, uid, local_context, context): company_logo = \ payslip_pool.browse(cr, uid, context['active_id']).company_id.logo - local_context['company_logo'] = company_logo + company_nfe_logo =\ + payslip_pool.browse(cr, uid, context['active_id']).company_id.nfe_logo + + local_context['company_logo'] = \ + company_nfe_logo if company_nfe_logo else company_logo From 45af1c5c28938bfe5a6224bb325e79c338e0e708 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 16 Nov 2017 13:26:32 -0200 Subject: [PATCH 604/787] =?UTF-8?q?[FIX]=20Adicionado=20m=C3=B3dulo=20l10n?= =?UTF-8?q?=5Fbr=5Faccount=5Fbanking=5Fpayment=5Fcnab=20como=20depend?= =?UTF-8?q?=C3=AAncia?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payment_order/__openerp__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/l10n_br_hr_payment_order/__openerp__.py b/l10n_br_hr_payment_order/__openerp__.py index 9b61714a4..a86f1a553 100644 --- a/l10n_br_hr_payment_order/__openerp__.py +++ b/l10n_br_hr_payment_order/__openerp__.py @@ -13,6 +13,7 @@ 'depends': [ 'l10n_br_hr_payroll', 'l10n_br_financial_payment_order', + 'l10n_br_account_banking_payment_cnab', 'account_payment_purchase', ], 'data': [ From daedd42668f60491e683f7139cc6536c7a3cb223 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 16 Nov 2017 17:09:49 -0200 Subject: [PATCH 605/787] [ADD] Impressao do relatorio em 2 paginas para casos com muitas linhas de pagamento do holerite --- .../data/holerite-fixo.odt | Bin 18852 -> 20640 bytes .../data/old_holerite-fixo.odt | Bin 0 -> 18852 bytes .../reports/payslip_report_holerite.py | 19 +++++++++++++----- 3 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 l10n_br_hr_payroll_report/data/old_holerite-fixo.odt diff --git a/l10n_br_hr_payroll_report/data/holerite-fixo.odt b/l10n_br_hr_payroll_report/data/holerite-fixo.odt index 6479bee53c92fa1e6ae4437b54fa19dbb6881a2b..95e730886ab2a34c11348cb14dd24e967bbd07a1 100644 GIT binary patch delta 19088 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 delta 17267 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 H7my49++dq5 diff --git a/l10n_br_hr_payroll_report/data/old_holerite-fixo.odt b/l10n_br_hr_payroll_report/data/old_holerite-fixo.odt new file mode 100644 index 0000000000000000000000000000000000000000..6479bee53c92fa1e6ae4437b54fa19dbb6881a2b GIT binary patch literal 18852 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%0D|vlk>UZ03R91K^sJ#VYGJJFG8RHQhW^ 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 max_linhas: + local_context['grupo_rubricas_2'] = \ + payslip_id.line_resume_ids[max_linhas:] From 3d716657672d7b3fe71d0581136993cf1224295b Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Thu, 16 Nov 2017 17:39:59 -0200 Subject: [PATCH 606/787] [FIX] Criar holidays de feras de 30 dias MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - E atrelar o novo holiday aos pedidos de férias já criados pelos usuários. --- l10n_br_hr_vacation/models/hr_contract.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_vacation/models/hr_contract.py b/l10n_br_hr_vacation/models/hr_contract.py index 609a20564..deec8f23d 100644 --- a/l10n_br_hr_vacation/models/hr_contract.py +++ b/l10n_br_hr_vacation/models/hr_contract.py @@ -140,7 +140,8 @@ def action_button_update_controle_ferias(self): # contrato.vacation_control_ids = sorted(lista_controle_ferias, reverse=True) - + for vacation_control in contrato.vacation_control_ids: + vacation_control.gerar_holidays_ferias() # Buscar Férias registradas e atualizar os períodos aquisitivos # domain = [ @@ -187,11 +188,17 @@ def action_button_update_controle_ferias(self): holerite.periodo_aquisitivo = periodo domain = [ ('data_inicio', '=', periodo.inicio_gozo), - ('data_fim', '=', periodo.fim_gozo) + ('data_fim', '=', periodo.fim_gozo), + ('contrato_id', '=', self.id), + ('type', '=', 'remove') ] holidays = self.env['hr.holidays'].search(domain) if holidays: + holerite.holidays_ferias = holidays.id holidays.controle_ferias = [(4, periodo.id)] + for holiday in periodo.hr_holiday_ids: + if holiday.type == "add": + holidays.parent_id = holiday # Atualizar último periodo aquisitivo caso a data de demissão # esteja definida From 66e6d2b965e5a1616cc1e2d0b899212376574e43 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 16 Nov 2017 19:20:27 -0200 Subject: [PATCH 607/787] [REM] Validacao do numero do endereco pois constara no campo complemento --- l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index 2689002c5..5e8ea4927 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -359,8 +359,8 @@ def _logadouro_bairro_cep_cidade_uf_telefone(self, type, partner_id): # TODO: Pode ser que este campo precise ser revisto por conta da # formatação erro += _("Telefone {0} não preenchido\n".format(type)) - if not partner_id.number: - erro += _("Número {0} não preenchido\n".format(type)) + # if not partner_id.number: + # erro += _("Número {0} não preenchido\n".format(type)) if erro: raise ValidationError(erro) From ebbd5fd96b54e77ab950dbf8e541309e8471fbad Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Fri, 17 Nov 2017 10:38:18 -0200 Subject: [PATCH 608/787] [ADD] Validacao de exclusao para CAGED e SEFIP --- .../models/abstract_workflow.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/l10n_br_hr_arquivos_governo/models/abstract_workflow.py b/l10n_br_hr_arquivos_governo/models/abstract_workflow.py index fa5940984..0e34023f5 100644 --- a/l10n_br_hr_arquivos_governo/models/abstract_workflow.py +++ b/l10n_br_hr_arquivos_governo/models/abstract_workflow.py @@ -56,3 +56,13 @@ def action_open(self): def action_sent(self): for record in self: record.change_state('sent') + + @api.multi + def unlink(self): + for record in self: + if record.state not in ['draft']: + raise UserError( + _('You cannot delete a record which is not ' + 'draft or cancelled state!') + ) + return super(AbstractArquivosGovernoWorkflow, self).unlink() From 4ccb7af57b4f9df864d2862519c5fe79be86d875 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Fri, 17 Nov 2017 10:39:02 -0200 Subject: [PATCH 609/787] [FIX] Validacao de exclusao do holerite --- l10n_br_hr_payroll/models/hr_payslip.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index de57d97a7..46f916634 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -633,12 +633,11 @@ def get_attendances(self, nome, sequence, code, number_of_days, @api.multi def unlink(self): for payslip in self: - if not payslip.user_has_groups('base.group_hr_manager'): - if payslip.state not in ['draft', 'cancel']: - raise exceptions.Warning( - _('You cannot delete a payslip which is not ' - 'draft or cancelled or permission!') - ) + if payslip.state not in ['draft', 'cancel']: + raise exceptions.Warning( + _('You cannot delete a payslip which is not ' + 'draft or cancelled or permission!') + ) payslip.cancel_sheet() return super(HrPayslip, self).unlink() From 05187a908e9288dfedfaf90f1d48870d5fe88fa2 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Fri, 17 Nov 2017 10:39:19 -0200 Subject: [PATCH 610/787] [ADD] Validacao de exclusao do lote de holerites --- l10n_br_hr_payroll/models/hr_payslip_run.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index 06ae98556..8f90d7694 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -4,7 +4,8 @@ from datetime import datetime -from openerp import api, fields, models +from openerp import api, fields, models, _ +from openerp.exceptions import Warning as UserError MES_DO_ANO = [ (1, u'Janeiro'), @@ -177,3 +178,18 @@ def close_payslip_run(self): for holerite in lote.slip_ids: holerite.hr_verify_sheet() super(HrPayslipRun, self).close_payslip_run() + + @api.multi + def unlink(self): + """ + Validacao para exclusao de lote de holerites + Nao permitir excluir o lote se ao menos um holerite nao estiver no + state draft.vali + """ + for lote in self: + if any(l != 'draft' for l in lote.slip_ids.mapped('state')): + raise UserError( + _('Não é permitido deletar um lote que contem holerites ' + 'com state diferente de rascunho!') + ) + return super(HrPayslipRun, self).unlink() From b23f07c111bd6f505151f098ef20cda055a937b3 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 20 Nov 2017 16:58:01 -0200 Subject: [PATCH 611/787] =?UTF-8?q?[FIX]=20Corrigir=20atualiza=C3=A7=C3=A3?= =?UTF-8?q?o=20do=20controle=20de=20f=C3=A9rias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 2 +- l10n_br_hr_vacation/models/hr_contract.py | 265 +++++++++++------- l10n_br_hr_vacation/models/hr_holidays.py | 6 + .../models/hr_vacation_control.py | 53 ++-- .../views/hr_vacation_control_view.xml | 19 +- 5 files changed, 209 insertions(+), 136 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index de57d97a7..a39d01ee3 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -2109,7 +2109,7 @@ def _compute_set_dates(self): record.mes_do_ano2 = datetime.now().month if record.tipo_de_folha == 'ferias' and record.holidays_ferias: record.periodo_aquisitivo =\ - record.holidays_ferias.controle_ferias[0] + record.holidays_ferias.parent_id.controle_ferias_ids[0] record.date_from = record.holidays_ferias.data_inicio record.date_to = record.holidays_ferias.data_fim record.mes_do_ano = \ diff --git a/l10n_br_hr_vacation/models/hr_contract.py b/l10n_br_hr_vacation/models/hr_contract.py index deec8f23d..1deebc5a1 100644 --- a/l10n_br_hr_vacation/models/hr_contract.py +++ b/l10n_br_hr_vacation/models/hr_contract.py @@ -7,6 +7,10 @@ from lxml import etree from openerp.exceptions import Warning as UserError +import logging + +_logger = logging.getLogger(__name__) + try: from pybrasil import data @@ -59,10 +63,10 @@ def write(self, vals): criadas novas linhas de controle de férias e holidays do tipo add para a nova data de início do contrato. """ - if vals.get('date_start') and \ - (vals.get('date_start') != self.date_start): - self.verificar_controle_ferias() - self.atualizar_linhas_controle_ferias(vals.get('date_start')) + # if vals.get('date_start') and \ + # (vals.get('date_start') != self.date_start): + # self.verificar_controle_ferias() + # self.atualizar_linhas_controle_ferias(vals.get('date_start')) contract_id = super(HrContract, self).write(vals) # se o contrato ja se encerrou, replicar no controle de férias if 'date_end' in vals: @@ -110,22 +114,20 @@ def action_button_update_controle_ferias(self): Ação disparada pelo botão na view, que atualiza as linhas de controle de férias """ - #self.verificar_controle_ferias() - #self.atualizar_linhas_controle_ferias(self.date_start) - for contrato in self: - # Apagar todos os períodos aquisitivos do contrato + controle_ferias_obj = self.env['hr.vacation.control'] + lista_controle_ferias = [] + + # Apagar o controle de férias (períodos aquisitivos) do contrato # - for periodo_aquisitivo in contrato.vacation_control_ids: - periodo_aquisitivo.unlink() + contrato.vacation_control_ids.unlink() # Criar os períodos aquisitivos # inicio = fields.Date.from_string(contrato.date_start) - hoje = fields.Date.from_string(fields.Date.today()) - lista_controle_ferias = [] - controle_ferias_obj = self.env['hr.vacation.control'] + hoje = fields.Date.today() + hoje = fields.Date.from_string(hoje) while inicio <= hoje: vals = \ @@ -138,11 +140,15 @@ def action_button_update_controle_ferias(self): # Ordena períodos aquisitivos recalculados # - contrato.vacation_control_ids = sorted(lista_controle_ferias, - reverse=True) - for vacation_control in contrato.vacation_control_ids: - vacation_control.gerar_holidays_ferias() - # Buscar Férias registradas e atualizar os períodos aquisitivos + contrato.vacation_control_ids = \ + sorted(lista_controle_ferias, reverse=True) + + # Criar holiday de férias para cada controle de férias + # + # for vacation_control in contrato.vacation_control_ids: + # vacation_control.gerar_holidays_ferias() + + # Buscar holerites de Férias registradas # domain = [ ('contract_id', '=', contrato.id), @@ -153,57 +159,150 @@ def action_button_update_controle_ferias(self): holerites_ids = \ self.env['hr.payslip'].search(domain, order='date_from') + # Laço para percorrer todos os holerites de férias(aviso de férias) + # for holerite in holerites_ids: - for periodo in contrato.vacation_control_ids: - - # Busca o aviso de férias do mesmo período aquisitivo - if periodo.inicio_aquisitivo == holerite.inicio_aquisitivo\ - and not periodo.inicio_gozo: - - # Calcula dias gozados - # - data_inicio = \ - fields.Date.from_string(holerite.date_from) - data_fim = fields.Date.from_string(holerite.date_to) - abono_pecuniario = \ - holerite.holidays_ferias.sold_vacations_days - dias_gozados = (data_fim - data_inicio).days + 1 + \ - abono_pecuniario - - # Cria novo período aquisitivo se ainda houver saldo - # - if (periodo.saldo - dias_gozados) > 0: - novo_periodo = periodo.copy() - novo_periodo.dias_gozados_anteriormente = \ - dias_gozados + \ - periodo.dias_gozados_anteriormente - - # Altera os valores do período aquisitivo com os dados - # do aviso de férias - # - periodo.inicio_gozo = holerite.date_from - periodo.fim_gozo = holerite.date_to - periodo.data_aviso = holerite.date_from - periodo.dias_gozados = dias_gozados - holerite.periodo_aquisitivo = periodo - domain = [ - ('data_inicio', '=', periodo.inicio_gozo), - ('data_fim', '=', periodo.fim_gozo), - ('contrato_id', '=', self.id), - ('type', '=', 'remove') - ] - holidays = self.env['hr.holidays'].search(domain) - if holidays: - holerite.holidays_ferias = holidays.id - holidays.controle_ferias = [(4, periodo.id)] - for holiday in periodo.hr_holiday_ids: - if holiday.type == "add": - holidays.parent_id = holiday - - # Atualizar último periodo aquisitivo caso a data de demissão - # esteja definida + + # Buscar controle de férias referente ao aviso de férias que + # esta sendo processado + # + controle_id = controle_ferias_obj.search([ + ('inicio_aquisitivo', '=', holerite.inicio_aquisitivo), + ('fim_aquisitivo', '=', holerite.fim_aquisitivo), + ('inicio_gozo', '=', False), + ('fim_gozo', '=', False), + ('contract_id', '=', contrato.id) + ]) + + # Recuperar datas do aviso de férias para construir + # controle de ferias + # + data_inicio = \ + fields.Date.from_string(holerite.date_from) + data_fim = fields.Date.from_string(holerite.date_to) + abono_pecuniario = \ + holerite.holidays_ferias.sold_vacations_days + dias_gozados = (data_fim - data_inicio).days + 1 + \ + abono_pecuniario + + # se houver saldo de dias, isto é, se o funcinoario tirou + # apenas uma parte das férias, duplicar controle vazio + # + if (controle_id.saldo - dias_gozados) > 0: + novo_periodo = controle_id.copy() + novo_periodo.dias_gozados_anteriormente += dias_gozados + + # Setar datas do novo controle de férias baseado no holerite + # de férias (aaviso de férias) + controle_id.inicio_gozo = holerite.date_from + controle_id.fim_gozo = holerite.date_to + controle_id.data_aviso = holerite.date_from + controle_id.dias_gozados = dias_gozados + + # Recuperar a solicitação de férias (holiday remove) holerite + # + controle_id.hr_holiday_remove_id = holerite.holidays_ferias + + + # Recuperar a alocação de férias (holiday add) da + # solicitação de férias + # + controle_id.hr_holiday_add_id = \ + holerite.holidays_ferias.parent_id + + # Setar o holidays de férias ao novo holiday do tipo remove + # + # holerite.holidays_ferias.parent_id = \ + # controle_id.hr_holiday_add_id + + # Buscar os holiday do tipo ADD que perderam a relação com o + # controle de férias # - self.atualizar_data_demissao() + holidays_ids = self.env['hr.holidays'].search([ + ('controle_ferias', '=', False), + ('contrato_id', '=', contrato.id), + ('type', '=', 'add') + ]) + + # Se algum holiday coincidir data com o controle de ferias, + # criar um relacionamento entre eles + # + for holiday_id in holidays_ids: + for controle_id in contrato.vacation_control_ids: + if not controle_id.hr_holiday_add_id: + if controle_id.inicio_aquisitivo == holiday_id.inicio_aquisitivo and controle_id.fim_aquisitivo == holiday_id.fim_aquisitivo: + controle_id.hr_holiday_add_id = holiday_id + + # Para controle de férias que são novos, não ira encontrar nenhum + # holiday do tipo ADD. + # Entao se ficar vazio mesmo depois de toda a rotina, gerar holiday + for controle_id in contrato.vacation_control_ids: + if not controle_id.hr_holiday_add_id: + controle_id.gerar_holidays_ferias() + # + # + # holidays.holidays_reset() + # holidays.unlink() + # + # + # + # + # + # for periodo in contrato.vacation_control_ids: + # + # # Busca o aviso de férias do mesmo período aquisitivo + # if periodo.inicio_aquisitivo == holerite.inicio_aquisitivo\ + # and not periodo.inicio_gozo: + # + # # Calcula dias gozados + # # + # data_inicio = \ + # fields.Date.from_string(holerite.date_from) + # data_fim = fields.Date.from_string(holerite.date_to) + # abono_pecuniario = \ + # holerite.holidays_ferias.sold_vacations_days + # dias_gozados = (data_fim - data_inicio).days + 1 + \ + # abono_pecuniario + # + # # Altera os valores do período aquisitivo com os dados + # # do holerite (aviso de férias) + # # + # periodo.inicio_gozo = holerite.date_from + # periodo.fim_gozo = holerite.date_to + # periodo.data_aviso = holerite.date_from + # periodo.dias_gozados = dias_gozados + # + # # Como os periodos foram excluidos, marcar o holerite + # # com o periodo de férias que esta sendo criado + # # + # holerite.periodo_aquisitivo = periodo + # + # # Cria novo período aquisitivo se ainda houver saldo + # # + # if (periodo.saldo - dias_gozados) > 0: + # novo_periodo = periodo.copy() + # novo_periodo.dias_gozados_anteriormente = \ + # dias_gozados + \ + # periodo.dias_gozados_anteriormente + # + # domain = [ + # ('data_inicio', '=', periodo.inicio_gozo), + # ('data_fim', '=', periodo.fim_gozo), + # ('contrato_id', '=', self.id), + # ('type', '=', 'remove') + # ] + # holidays = self.env['hr.holidays'].search(domain) + # if holidays: + # holerite.holidays_ferias = holidays.id + # holidays.controle_ferias = [(4, periodo.id)] + # for holiday in periodo.hr_holiday_ids: + # if holiday.type == "add": + # holidays.parent_id = holiday + # + # # Atualizar último periodo aquisitivo caso a data de demissão + # # esteja definida + # # + # self.atualizar_data_demissao() # self.atualizar_linhas_controle_ferias(self.date_start) @@ -240,34 +339,4 @@ def atualizar_controle_ferias(self): ('date_end', '=', False), ] contratos_ids = self.env['hr.contract'].search(domain) - - for contrato in contratos_ids: - # Se o contrato estiver encerrado nao atualizar - if contrato.date_end: - contrato.atualizar_data_demissao() - continue - if contrato.vacation_control_ids: - ultimo_controles = contrato.vacation_control_ids[0] - for ultimo_controle in ultimo_controles: - if ultimo_controle.fim_aquisitivo < fields.Date.today(): - controle_ferias_obj = self.env['hr.vacation.control'] - hoje = fields.Date.today() - vals = controle_ferias_obj.\ - calcular_datas_aquisitivo_concessivo(hoje) - novo_controle_ferias = controle_ferias_obj.create(vals) - novo_controle_ferias.gerar_holidays_ferias() - novo_controle_ferias.contract_id = contrato - - programacao_ferias = self.env['ir.config_parameter'].get_param( - 'l10n_br_hr_vacation_programacao_ferias_futuras', - default=False - ) - - if programacao_ferias: - dias = ultimo_controle.dias - else: - dias = ultimo_controle.saldo - - for periodo_aquisitivo in ultimo_controle.hr_holiday_ids: - if periodo_aquisitivo.type == 'add': - periodo_aquisitivo.number_of_days_temp = dias + contratos_ids.action_button_update_controle_ferias() diff --git a/l10n_br_hr_vacation/models/hr_holidays.py b/l10n_br_hr_vacation/models/hr_holidays.py index c16fb4154..bf1c6b46c 100644 --- a/l10n_br_hr_vacation/models/hr_holidays.py +++ b/l10n_br_hr_vacation/models/hr_holidays.py @@ -82,6 +82,12 @@ def _check_date(self): column2='hr_vacation_control_id', string=u'Controle de Férias', ) + controle_ferias_ids = fields.One2many( + comodel_name='hr.vacation.control', + string=u'Controle de Férias', + inverse_name='hr_holiday_add_id', + ) + saldo_disponivel = fields.Float( string='Saldo de dias de férias', related='parent_id.number_of_days_temp', diff --git a/l10n_br_hr_vacation/models/hr_vacation_control.py b/l10n_br_hr_vacation/models/hr_vacation_control.py index 6f409bbb4..6058f7a09 100644 --- a/l10n_br_hr_vacation/models/hr_vacation_control.py +++ b/l10n_br_hr_vacation/models/hr_vacation_control.py @@ -117,13 +117,23 @@ class HrVacationControl(models.Model): string=u'Contrato Vigente', ) - hr_holiday_ids = fields.Many2many( + # hr_holiday_ids = fields.Many2many( + # comodel_name='hr.holidays', + # relation='vacation_control_holidays_rel', + # column1='hr_vacation_control_id', + # column2='holiday_id', + # string=u'Período Aquisitivo', + # ondelete='set null', + # ) + + hr_holiday_add_id = fields.Many2one( comodel_name='hr.holidays', - relation='vacation_control_holidays_rel', - column1='hr_vacation_control_id', - column2='holiday_id', - string=u'Período Aquisitivo', - ondelete='set null', + string=u'Férias (ADD)', + ) + + hr_holiday_remove_id = fields.Many2one( + comodel_name='hr.holidays', + string=u'Pedido de férias', ) display_name = fields.Char( @@ -132,20 +142,20 @@ class HrVacationControl(models.Model): store=True ) - @api.depends('hr_holiday_ids') - @api.multi - def _compute_have_holidays(self): - for controle in self: - if controle.hr_holiday_ids: - for holiday in controle.hr_holiday_ids: - if holiday.type == 'add': - controle.have_holidays = True - - have_holidays = fields.Boolean( - string=u'Have Holidays?', - compute='_compute_have_holidays', - default=False, - ) + # @api.depends('hr_holiday_ids') + # @api.multi + # def _compute_have_holidays(self): + # for controle in self: + # if controle.hr_holiday_ids: + # for holiday in controle.hr_holiday_ids: + # if holiday.type == 'add': + # controle.have_holidays = True + + # have_holidays = fields.Boolean( + # string=u'Have Holidays?', + # compute='_compute_have_holidays', + # default=False, + # ) @api.depends('inicio_aquisitivo', 'fim_aquisitivo') def _compute_display_name(self): @@ -226,8 +236,7 @@ def _compute_calcular_avos(self): def _compute_calcular_saldo_dias(self): for record in self: saldo = record.dias_de_direito() * record.avos / 12.0 - record.saldo = saldo - record.dias_gozados - \ - record.dias_gozados_anteriormente + record.saldo = saldo - record.dias_gozados def _compute_calcular_dias(self): for record in self: diff --git a/l10n_br_hr_vacation/views/hr_vacation_control_view.xml b/l10n_br_hr_vacation/views/hr_vacation_control_view.xml index 665a430f4..8b91d72e3 100644 --- a/l10n_br_hr_vacation/views/hr_vacation_control_view.xml +++ b/l10n_br_hr_vacation/views/hr_vacation_control_view.xml @@ -31,13 +31,6 @@ - - + + Período From 609cc626e7d8e556f1fd15759a74fc2fdd0c0ae7 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Fri, 22 Dec 2017 08:36:04 -0200 Subject: [PATCH 644/787] =?UTF-8?q?[FIX]=20C=C3=A1lculo=20de=20sal=C3=A1ri?= =?UTF-8?q?o=20m=C3=A9dio=20incorreto=20quando=20a=20mudan=C3=A7a=20=C3=A9?= =?UTF-8?q?=20no=20primeiro=20dia=20do=20per=C3=ADodo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_contract.py | 46 ++++++++++++++---------- l10n_br_hr_payroll/models/hr_payslip.py | 2 +- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_contract.py b/l10n_br_hr_payroll/models/hr_contract.py index ae1f8067d..5ec7a4dd3 100644 --- a/l10n_br_hr_payroll/models/hr_contract.py +++ b/l10n_br_hr_payroll/models/hr_contract.py @@ -109,35 +109,45 @@ def _buscar_salario_vigente_periodo( # Dentro deste período houve alteração contratual ? # if data_inicio <= change[i].change_date <= data_fim: - # >= data_inicio and change[i].change_date <= data_fim: i_2 = i + 1 data_mudanca = \ datetime.strptime(change[i].change_date, "%Y-%m-%d") d_inicio = datetime.strptime(data_inicio, "%Y-%m-%d") d_fim = datetime.strptime(data_fim, "%Y-%m-%d") - # Calcula o número de dias dentro do período e quantos dias - # são de cada lado da alteração contratual - # dias = (d_fim - d_inicio) + timedelta(days=1) - dias_2 = dias.days - data_mudanca.day - dias_1 = (data_mudanca.day - d_inicio.day) + 1 - # Calcula cada valor de salário nos dias em com valores - # diferentes + # Se a mudança for exatamente no primeiro dia do período + # Considere o salário pronto no período inteiro # - salario_dia_2 = change[i].wage / dias.days - if i_2 in range(len(change)): - salario_dia_1 = change[i_2].wage / dias.days + if data_mudanca == d_inicio: + if i_2 in range(len(change)): + salario_medio = change[i].wage + salario_dia_1 = change[i].wage / dias.days + salario_dia_2 = change[i].wage / dias.days else: - salario_dia_1 = change[i].wage / dias.days - salario_medio_2 = salario_dia_2 * dias_2 - salario_medio_1 = salario_dia_1 * dias_1 - # Soma os 2 lados e temos o salário proporcional dentro - # do período - # - salario_medio = salario_medio_2 + salario_medio_1 + # Calcula o número de dias dentro do período e quantos dias + # são de cada lado da alteração contratual + # + dias_2 = dias.days - data_mudanca.day + dias_1 = (data_mudanca.day - d_inicio.day) + 1 + + # Calcula cada valor de salário nos dias em com valores + # diferentes + # + salario_dia_2 = change[i].wage / dias.days + if i_2 in range(len(change)): + salario_dia_1 = change[i_2].wage / dias.days + else: + salario_dia_1 = change[i].wage / dias.days + salario_medio_2 = salario_dia_2 * dias_2 + salario_medio_1 = salario_dia_1 * dias_1 + + # Soma os 2 lados e temos o salário proporcional dentro + # do período + # + salario_medio = salario_medio_2 + salario_medio_1 # Se for para buscar o salário inicial # diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 0a9f03d22..20d40b859 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -906,7 +906,7 @@ def MEDIA_RUBRICA(self, codigo): # valor = 0 for holerite in folhas_periodo: - if holerite.date_to <= data_fim: + if holerite.date_to <= fields.Date.to_string(data_fim): for linha in holerite.line_ids: if linha.code == codigo: valor += linha.total From 345a5bd6e17cd0f5984c762e5ad70b54f5bc4d92 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Tue, 26 Dec 2017 10:44:39 -0200 Subject: [PATCH 645/787] =?UTF-8?q?[FIX]=20M=C3=A9todo=20de=20c=C3=A1lculo?= =?UTF-8?q?=20de=20=C3=A1vos=20de=20per=C3=ADodo=20aquisitivo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/hr_vacation_control.py | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/l10n_br_hr_vacation/models/hr_vacation_control.py b/l10n_br_hr_vacation/models/hr_vacation_control.py index 8143ec767..03c539960 100644 --- a/l10n_br_hr_vacation/models/hr_vacation_control.py +++ b/l10n_br_hr_vacation/models/hr_vacation_control.py @@ -2,11 +2,12 @@ # Copyright 2016 KMEE - Hendrix Costa # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from datetime import datetime +from datetime import datetime, timedelta from dateutil.relativedelta import relativedelta from openerp import api, models, fields -from pybrasil.data import parse_datetime, idade_meses +from pybrasil.data import parse_datetime, idade_meses, ultimo_dia_mes, \ + primeiro_dia_mes class HrVacationControl(models.Model): @@ -232,9 +233,32 @@ def _compute_calcular_avos(self): # # Calcula os avos # - record.avos = idade_meses(parse_datetime(date_begin), - parse_datetime(date_end), - quinze_dias=True) + ultimo_dia_primeiro_mes = ultimo_dia_mes(date_begin) + if ultimo_dia_primeiro_mes - \ + parse_datetime(date_begin).date() >= \ + timedelta(days=15): + avos_primeiro_mes = 1 + else: + avos_primeiro_mes = 0 + + primeiro_dia_ultimo_mes = primeiro_dia_mes(date_end) + ultimo_dia_ultimo_mes = ultimo_dia_mes(date_end) + avos_ultimo_mes = 0 + dias = primeiro_dia_ultimo_mes - parse_datetime(date_end).date() + dias_mes = ultimo_dia_ultimo_mes - primeiro_dia_ultimo_mes + if dias > timedelta(days=15): + avos_ultimo_mes = 1 + elif dias == timedelta(days=15): + if dias_mes != timedelta(days=30): + avos_ultimo_mes = 1 + + primeiro_dia_mes_cheio = ultimo_dia_mes(date_begin) + \ + timedelta(days=1) + ultimo_dia_mes_cheio = primeiro_dia_mes(date_end) + avos_meio = idade_meses(parse_datetime(primeiro_dia_mes_cheio), + parse_datetime(ultimo_dia_mes_cheio)) + + record.avos = avos_primeiro_mes + avos_meio + avos_ultimo_mes # avos_decimal = (date_end - date_begin).days / 30.0 # decimal = avos_decimal - int(avos_decimal) From 67f39904b205f1dda1d2fa78eaab17a8637cc2c1 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Wed, 27 Dec 2017 08:42:15 -0200 Subject: [PATCH 646/787] =?UTF-8?q?[FIX]=20Bug=20no=20c=C3=A1lculo=20do=20?= =?UTF-8?q?=C3=BAltimo=20avo=20do=20per=C3=ADodo=20aquisitivo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_vacation/models/hr_vacation_control.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_vacation/models/hr_vacation_control.py b/l10n_br_hr_vacation/models/hr_vacation_control.py index 03c539960..f1e6d67e7 100644 --- a/l10n_br_hr_vacation/models/hr_vacation_control.py +++ b/l10n_br_hr_vacation/models/hr_vacation_control.py @@ -244,7 +244,7 @@ def _compute_calcular_avos(self): primeiro_dia_ultimo_mes = primeiro_dia_mes(date_end) ultimo_dia_ultimo_mes = ultimo_dia_mes(date_end) avos_ultimo_mes = 0 - dias = primeiro_dia_ultimo_mes - parse_datetime(date_end).date() + dias = parse_datetime(date_end).date() - primeiro_dia_ultimo_mes dias_mes = ultimo_dia_ultimo_mes - primeiro_dia_ultimo_mes if dias > timedelta(days=15): avos_ultimo_mes = 1 From fb7307ab51b5c2b6123c86396e3b588aeb9cff3a Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Wed, 27 Dec 2017 11:42:06 -0200 Subject: [PATCH 647/787] =?UTF-8?q?[FIX]=20N=C3=A3o=20incluir=20Rubricas?= =?UTF-8?q?=20Espec=C3=ADficas=20em=20Provis=C3=A3o=20de=20F=C3=A9rias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 20d40b859..fc3dd549c 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1762,7 +1762,7 @@ def sum(self, code, from_date, to_date=None): applied_specific_rule = {} # Caso nao esteja computando holerite de ferias # recuperar as regras especificas do contrato - if not payslip.tipo_de_folha == 'ferias': + if not payslip.tipo_de_folha in ['ferias', 'provisao_ferias']: applied_specific_rule = payslip.get_contract_specific_rubrics( contract_ids, rule_ids) From 8fe086d6674cb8fb18b3ea8bb17fda22f7827d07 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 28 Dec 2017 13:53:49 -0200 Subject: [PATCH 648/787] [ADD] Campos readonly para holiday aprovado --- l10n_br_hr_holiday/views/hr_holidays.xml | 2 +- l10n_br_hr_vacation/views/hr_holidays_view.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/l10n_br_hr_holiday/views/hr_holidays.xml b/l10n_br_hr_holiday/views/hr_holidays.xml index e75c2d7f5..49dce2300 100644 --- a/l10n_br_hr_holiday/views/hr_holidays.xml +++ b/l10n_br_hr_holiday/views/hr_holidays.xml @@ -24,7 +24,7 @@ - + diff --git a/l10n_br_hr_vacation/views/hr_holidays_view.xml b/l10n_br_hr_vacation/views/hr_holidays_view.xml index db041ac32..c38a78919 100644 --- a/l10n_br_hr_vacation/views/hr_holidays_view.xml +++ b/l10n_br_hr_vacation/views/hr_holidays_view.xml @@ -29,11 +29,11 @@ attrs="{'required':[('type', '=', 'remove')], 'invisible': 1}" class="oe_inline"/> + attrs="{'required':[('type', '=', 'remove')], 'invisible': 0, 'readonly':[('state','in',['validate','validate1','refuse'])]}"/> + attrs="{'required':[('type', '=', 'remove')], 'invisible': 0, 'readonly':[('state','in',['validate','validate1','refuse'])]}"/> Date: Thu, 11 Jan 2018 13:08:31 -0200 Subject: [PATCH 649/787] =?UTF-8?q?[FIX]=20Corrige=20c=C3=A1lculo=20do=20a?= =?UTF-8?q?vo=20do=20primeiro=20m=C3=AAs=20do=20per=C3=ADodo=20aquisitivo,?= =?UTF-8?q?=20quando=20for=20exatamente=20igual=20a=2015?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_vacation/models/hr_vacation_control.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_vacation/models/hr_vacation_control.py b/l10n_br_hr_vacation/models/hr_vacation_control.py index f1e6d67e7..b0368e50b 100644 --- a/l10n_br_hr_vacation/models/hr_vacation_control.py +++ b/l10n_br_hr_vacation/models/hr_vacation_control.py @@ -236,7 +236,7 @@ def _compute_calcular_avos(self): ultimo_dia_primeiro_mes = ultimo_dia_mes(date_begin) if ultimo_dia_primeiro_mes - \ parse_datetime(date_begin).date() >= \ - timedelta(days=15): + timedelta(days=14): avos_primeiro_mes = 1 else: avos_primeiro_mes = 0 From cb440c20b52a56eedead27aa85db690c25672277 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Mon, 15 Jan 2018 11:54:46 -0200 Subject: [PATCH 650/787] =?UTF-8?q?[FIX]=20Invers=C3=A3o=20do=20lan=C3=A7a?= =?UTF-8?q?mento=20de=20revers=C3=A3o=20de=20provis=C3=B5es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/l10n_br_hr_payroll_run_account.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py index 1f031cacc..6e6617260 100644 --- a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py +++ b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py @@ -386,8 +386,8 @@ def processar_contabilidade_folha(self, rubricas): 'account_id': linha.account_id.id, 'journal_id': linha.journal_id, 'period_id': period_id, - 'debit': 0.0 if linha.credit else linha.debit, - 'credit': 0.0 if linha.debit else linha.credit, + 'debit': linha.credit if linha.credit else 0.0, + 'credit': linha.debit if linha.debit else 0.0, 'payslip_run_id': payslip_run.id, }) line_ids.append(line_anterior) From 243c89521bb23ea644b50b64e1806d17770d9d92 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Mon, 15 Jan 2018 12:06:58 -0200 Subject: [PATCH 651/787] =?UTF-8?q?[FIX]=20Acumular=20FGTS=20total=20ao=20?= =?UTF-8?q?inv=C3=A9s=20de=20calcular=20sobre=20o=20acumulado=20da=20base?= =?UTF-8?q?=5Ffgts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reports/payslip_report_analitico.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py index f5080467b..8e0b364e5 100644 --- a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py +++ b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py @@ -182,6 +182,7 @@ def analytic_report(pool, cr, uid, local_context, context): valor_retencao_do_mes_deducao = 0.00 total_inss_deducao = 0.00 base_fgts = 0.00 + fgts = 0.00 for rubrica in payslip_lines_sefip: if rubrica['code'] == 'INSS_EMPRESA': @@ -238,6 +239,8 @@ def analytic_report(pool, cr, uid, local_context, context): inss_funcionario_retido += rubrica['sum'] if rubrica['code'] == 'BASE_FGTS': base_fgts = rubrica['sum'] + if rubrica['code'] == 'FGTS': + fgts = rubrica['sum'] legal_name = payslips[0].company_id.legal_name endereco = \ @@ -286,7 +289,8 @@ def analytic_report(pool, cr, uid, local_context, context): total_bruto_inss_encargos + total_inss_retido - total_inss_deducao aliquota_fgts = 8 - valor_total_fgts = base_fgts * aliquota_fgts/100.00 + #valor_total_fgts = base_fgts * aliquota_fgts/100.00 + valor_total_fgts = fgts mes_vencimento = mes_do_ano+1 if mes_do_ano < 12 else 1 data_vencimento = \ '20/' + ('0' + str(mes_vencimento)) if mes_vencimento < 10 else str( From 633a8a257eb4f79ad44912fbcc871c658b6c3440 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Wed, 17 Jan 2018 21:16:54 -0200 Subject: [PATCH 652/787] =?UTF-8?q?[FIX]=20Inclui=20rubricas=20espec=C3=AD?= =?UTF-8?q?ficas=20em=20f=C3=A9rias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index fc3dd549c..467e0e511 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -56,7 +56,7 @@ ('normal', u'Folha normal'), ('rescisao', u'Rescisão'), ('ferias', u'Férias'), - ('decimo_terceiro', u'Décimo terceiro (13º)'), + ('decimo_terceiro', u'Décim o terceiro (13º)'), ('aviso_previo', u'Aviso Prévio'), ('provisao_ferias', u'Provisão de Férias'), ('provisao_decimo_terceiro', u'Provisão de Décimo terceiro (13º)'), @@ -1760,9 +1760,10 @@ def sum(self, code, from_date, to_date=None): structure_ids).get_all_rules() applied_specific_rule = {} - # Caso nao esteja computando holerite de ferias + # Caso nao esteja computando holerite de provisão de ferias # recuperar as regras especificas do contrato - if not payslip.tipo_de_folha in ['ferias', 'provisao_ferias']: + if not payslip.tipo_de_folha in \ + ['provisao_ferias', 'provisao_decimo_terceiro']: applied_specific_rule = payslip.get_contract_specific_rubrics( contract_ids, rule_ids) @@ -1894,7 +1895,8 @@ def sum(self, code, from_date, to_date=None): ('code', '=', 'ADIANTAMENTO_13_RESC'), ] ) - sorted_rule_ids.remove(salary_rule_id.id) + if salary_rule_id.id in sorted_rule_ids: + sorted_rule_ids.remove(salary_rule_id.id) if not payslip._verificar_ferias_vencidas(): ferias_vencida_rubrica = self.env['hr.salary.rule'].search( [ From bdc64dabfb37bd9fd640661e90103ab30bf8cce0 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 18 Jan 2018 14:36:21 -0200 Subject: [PATCH 653/787] =?UTF-8?q?[FIX]=20Feita=20altera=C3=A7=C3=A3o=20n?= =?UTF-8?q?o=20c=C3=A1lculo=20de=20avos=20do=20per=C3=ADodo=20aquisitivo?= =?UTF-8?q?=20na=20rescis=C3=A3o,=20levando=20em=20conta=20o=20dia=20de=20?= =?UTF-8?q?anivers=C3=A1rio=20do=20contrato,=20de=20acordo=20com=20instru?= =?UTF-8?q?=C3=A7=C3=B5es=20do=20cliente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/hr_vacation_control.py | 59 ++++++++++++++++++- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_vacation/models/hr_vacation_control.py b/l10n_br_hr_vacation/models/hr_vacation_control.py index b0368e50b..cddc4a4d0 100644 --- a/l10n_br_hr_vacation/models/hr_vacation_control.py +++ b/l10n_br_hr_vacation/models/hr_vacation_control.py @@ -227,12 +227,16 @@ def _compute_calcular_avos(self): else: date_end = record.fim_aquisitivo - date_end = fields.Date.from_string(date_end) + relativedelta(days=1) + date_end2 = date_end + date_end = fields.Date.from_string(date_end) + \ + relativedelta(days=1) date_end = fields.Date.to_string(date_end) # # Calcula os avos # + dias_para_adicionar = fields.Date.from_string(date_begin) - \ + primeiro_dia_mes(date_begin) ultimo_dia_primeiro_mes = ultimo_dia_mes(date_begin) if ultimo_dia_primeiro_mes - \ parse_datetime(date_begin).date() >= \ @@ -241,7 +245,58 @@ def _compute_calcular_avos(self): else: avos_primeiro_mes = 0 - primeiro_dia_ultimo_mes = primeiro_dia_mes(date_end) + # + # Se for para cálculo de rescisão, calcule o avo do fim do + # período aquisitivo de acordo com instruções abaixo. + # + """ + +O cálculo de férias usa a regra dos 15 dias trabalhados no mês, mas leva em +consideração a data de "aniversário" do período aquisitivo, ou seja, dia 06 de +cada mês no caso do Antônio, assim teremos; Mar (trabalhou mais de 15 dias), +Abr, Mai, Jun, Jul, Ago, Set, Out, Nov e Dez/2016 totalizando 10 avos, +para jan/2017, levando em consideração o dia 06 e a data da rescisão (16/01), +dá menos que 15 dias trabalhados, não considera o avo. + +Transcrevo abaixo o Art. 130 da CLT: + +Art. 130 - Após cada período de 12 (doze) meses de vigência do contrato de +trabalho, o empregado terá direito a férias, na seguinte proporção: (Redação +dada pelo Decreto-lei nº 1.535, de 13.4.1977) + +I - 30 (trinta) dias corridos, quando não houver faltado ao serviço mais de 5 +(cinco) vezes; (Incluído pelo Decreto-lei nº 1.535, de 13.4.1977) + +II - 24 (vinte e quatro) dias corridos, quando houver tido de 6 (seis) a 14 +(quatorze) faltas; (Incluído pelo Decreto-lei nº 1.535, de 13.4.1977) + +III - 18 (dezoito) dias corridos, quando houver tido de 15 (quinze) a 23 +(vinte e três) faltas; (Incluído pelo Decreto-lei nº 1.535, de 13.4.1977) + +IV - 12 (doze) dias corridos, quando houver tido de 24 (vinte e quatro) a 32 +(trinta e duas) faltas. (Incluído pelo Decreto-lei nº 1.535, de 13.4.1977) + +§ 1º - É vedado descontar, do período de férias, as faltas do empregado ao +serviço. (Incluído pelo Decreto-lei nº 1.535, de 13.4.1977) + +§ 2º - O período das férias será computado, para todos os efeitos, como tempo +de serviço.(Incluído pelo Decreto-lei nº 1.535, de 13.4.1977) + +Como podemos observar, o artigo leva em consideração a vigência do contrato, +isto é, a data de admissão do funcionário, e combinado com o Art. 146 da CLT, +fica interpretado que os avos são considerados a partir da data de admissão e +não do mês civil. + + Observação: Além das informações acima, consultamos o nosso apoio jurídico + trabalhista IOB. + Carlos Eduardo Silva + """ + if date_end2 == record.contract_id.date_end: + primeiro_dia_ultimo_mes = \ + primeiro_dia_mes(date_end) + dias_para_adicionar + else: + primeiro_dia_ultimo_mes = primeiro_dia_mes(date_end) + ultimo_dia_ultimo_mes = ultimo_dia_mes(date_end) avos_ultimo_mes = 0 dias = parse_datetime(date_end).date() - primeiro_dia_ultimo_mes From 52a5aa078e8449259cb6d76d4a4dc18e2e3ccce0 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Mon, 22 Jan 2018 20:49:50 -0200 Subject: [PATCH 654/787] [FIX] Erro na busca de contratos --- l10n_br_hr_payroll/models/hr_payslip_run.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index c4e16acb2..458aaed61 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -132,10 +132,10 @@ def verificar_holerites_gerados(self): dominio_contratos += [ ('categoria', 'not in', ['721', '722']), ] - else: - dominio_contratos += [ - ('date_end', '>', lote.date_start), - ] + # else: + # dominio_contratos += [ + # ('date_end', '>', lote.date_start), + # ] contracts_id = self.env['hr.contract'].search(dominio_contratos) dominio_payslips = [ @@ -163,7 +163,7 @@ def verificar_holerites_gerados(self): contrato.id for contrato in contracts_id if (contrato.id not in contratos_com_holerites) and (contrato.date_start <= lote.date_end) - and ((contrato.date_end >= lote.date_start) + and ((contrato.date_end < lote.date_start) or (not contrato.date_end))] lote.write({ From fd6a8a1f8adab55615ba8c4fb7e4339c2ff17d61 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Tue, 23 Jan 2018 15:40:31 -0200 Subject: [PATCH 655/787] [FIX] Ajuste busca de contratos --- l10n_br_hr_payroll/models/hr_payslip_run.py | 1 + 1 file changed, 1 insertion(+) diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index 458aaed61..078ba6d8d 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -166,6 +166,7 @@ def verificar_holerites_gerados(self): and ((contrato.date_end < lote.date_start) or (not contrato.date_end))] + lote.write({ 'contract_id': [(6, 0, contratos_sem_holerite)], 'contract_id_readonly': [(6, 0, contratos_sem_holerite)], From ecbed76fb13aa1863313be5f73fbec2c71761250 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Thu, 25 Jan 2018 08:19:03 -0200 Subject: [PATCH 656/787] =?UTF-8?q?[FIX]=20Mais=20corre=C3=A7=C3=B5es=20de?= =?UTF-8?q?=20c=C3=A1lculo=20de=20folha=20e=20lotes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 28 +++++++++++++++++---- l10n_br_hr_payroll/models/hr_payslip_run.py | 15 +++++------ 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 467e0e511..2363d8d4f 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1544,18 +1544,36 @@ def rubrica_anterior_total(self, code, mes=-1, tipo_de_folha='normal'): ('is_simulacao', '=', False), ('state', 'in', ['done', 'verify']) ] + + # Calcula mes_anterior + anos = [self.ano] + mes_anterior = self.mes_do_ano - 1 + if mes_anterior == 0: + mes_anterior = 12 + anos.append(self.ano - 1) + if mes and mes > 0: domain.append(('mes_do_ano', '=', mes)) + if mes == -1 and tipo_de_folha == 'ferias': + domain.append(('mes_do_ano', 'in', + [self.mes_do_ano, mes_anterior])) + domain.append(('ano', 'in', anos)) + holerite_anterior = self.search( domain, order='create_date DESC', limit=1) + valores = 0 + if holerite_anterior: - for line in holerite_anterior.line_ids: - if line.code == code: - return line.total - else: - return 0 + for holerite in holerite_anterior: + if self.date_from <= holerite.date_from <= self.date_to or \ + self.date_from <= holerite.date_to <= self.date_to: + for line in holerite.line_ids: + if line.code == code: + valores += line.total + + return valores @api.multi def get_payslip_lines(self, payslip_id): diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index 078ba6d8d..4f6734330 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -159,13 +159,14 @@ def verificar_holerites_gerados(self): if payslip.contract_id.id not in contratos_com_holerites: contratos_com_holerites.append(payslip.contract_id.id) - contratos_sem_holerite = [ - contrato.id for contrato in contracts_id - if (contrato.id not in contratos_com_holerites) - and (contrato.date_start <= lote.date_end) - and ((contrato.date_end < lote.date_start) - or (not contrato.date_end))] - + contratos_sem_holerite = [] + for contrato in contracts_id: + if contrato.id not in contratos_com_holerites: + if not contrato.date_end: + contratos_sem_holerite.append(contrato.id) + else: + if contrato.date_end > lote.date_end: + contratos_sem_holerite.append(contrato.id) lote.write({ 'contract_id': [(6, 0, contratos_sem_holerite)], From 80ab96df3f6fd16f0648239ce8c36c74018197d4 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Sat, 27 Jan 2018 09:54:51 -0200 Subject: [PATCH 657/787] =?UTF-8?q?[FIX]=20Refactor=20da=20cria=C3=A7?= =?UTF-8?q?=C3=A3o=20do=20lan=C3=A7amento=20cont=C3=A1bil=20de=20um=20hole?= =?UTF-8?q?rite=20espec=C3=ADfico?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/l10n_br_hr_payroll_account.py | 280 ++++++++---------- 1 file changed, 122 insertions(+), 158 deletions(-) diff --git a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py index 8085c6a65..76dbe5de6 100644 --- a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py +++ b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py @@ -95,163 +95,130 @@ def _buscar_contas(self, salary_rule): @api.multi def processar_folha(self): - if self.journal_id: + for holerite in self: move_obj = self.env['account.move'] period_obj = self.env['account.period'] - precision = self.env['decimal.precision'].precision_get('Payroll') timenow = time.strftime('%Y-%m-%d') - - for slip in self: - debit_sum = 0.0 - credit_sum = 0.0 - contador_lancamentos = 1 - period_id = period_obj.find(slip.date_to) - if slip.move_id: - slip.move_id.unlink() - - for line in slip.details_by_salary_rule_category: - line_ids = [] - - if line.total > 0: - debit_account_id, credit_account_id = \ - slip._buscar_contas(line.salary_rule_id) - if debit_account_id or credit_account_id: - move, move_anterior_id = \ - self.criar_lancamento_contabil( - period_id, slip, contador_lancamentos - ) - contador_lancamentos += 1 - amt = slip.credit_note and - \ - line.total or line.total - if float_is_zero(amt, precision_digits=precision): - continue - if slip.tipo_de_folha in [ - 'provisao_ferias', 'provisao_decimo_terceiro' - ]: - if move_anterior_id: - debito, credito, \ - periodo_anterior_id = self.\ - _valor_lancamento_anterior_rubrica( - move_anterior_id, - line.salary_rule_id - ) - if debito or credito: - line_anterior = (0, 0, { - 'name': line.name + " (Anterior)", - 'date': timenow, - 'account_id': - debit_account_id.id if debito - else credit_account_id.id, - 'journal_id': slip.journal_id.id, - 'period_id': - periodo_anterior_id.id, - 'debit': credito or 0.0, - 'credit': debito or 0.0, - 'payslip_id': slip.id, - }) - line_ids.append(line_anterior) - if debito: - debit_sum += \ - line_anterior[2]['debit'] - \ - line_anterior[2]['credit'] - else: - credit_sum += \ - line_anterior[2]['credit'] - \ - line_anterior[2]['debit'] - if debit_account_id and slip.tipo_de_folha not in [ - 'provisao_ferias', 'provisao_decimo_terceiro' - ]: - debit_line = (0, 0, { - 'name': line.name, - 'date': timenow, - 'account_id': debit_account_id.id, - 'journal_id': slip.journal_id.id, - 'period_id': period_id.id, - 'debit': amt > 0.0 and amt or 0.0, - 'credit': amt < 0.0 and -amt or 0.0, - 'payslip_id': slip.id, - }) - line_ids.append(debit_line) - debit_sum += \ - debit_line[2]['debit'] - debit_line[2][ - 'credit'] - if credit_account_id: - credit_line = (0, 0, { - 'name': line.name, - 'date': timenow, - 'account_id': credit_account_id.id, - 'journal_id': slip.journal_id.id, - 'period_id': period_id.id, - 'debit': amt < 0.0 and -amt or 0.0, - 'credit': amt > 0.0 and amt or 0.0, - 'payslip_id': slip.id, - }) - line_ids.append(credit_line) - credit_sum += \ - credit_line[2]['credit'] - credit_line[2][ - 'debit'] - - if float_compare( - credit_sum, debit_sum, - precision_digits=precision - ) == -1: - acc_id = slip.journal_id\ - .default_credit_account_id.id - if not acc_id: - raise Warning(_('Configuration Error!'), - _('The Expense Journal "%s" ' - 'has not properly ' - 'configured the ' - 'Credit Account!' - ) % slip.journal_id.name) - adjust_credit = (0, 0, { - 'name': _('Adjustment Entry'), - 'date': timenow, - 'partner_id': False, - 'account_id': acc_id, - 'journal_id': slip.journal_id.id, - 'period_id': period_id.id, - 'debit': 0.0, - 'credit': debit_sum - credit_sum, - 'payslip_id': slip.id, - }) - line_ids.append(adjust_credit) - - elif float_compare( - debit_sum, credit_sum, - precision_digits=precision - ) == -1: - acc_id = slip.journal_id\ - .default_debit_account_id.id - if not acc_id: - raise Warning(_('Configuration Error!'), - _('The Expense Journal "%s" ' - 'has not properly ' - 'configured the ' - 'Debit Account!' - ) % slip.journal_id.name) - adjust_debit = (0, 0, { - 'name': _('Adjustment Entry'), - 'date': timenow, - 'partner_id': False, - 'account_id': acc_id, - 'journal_id': slip.journal_id.id, - 'period_id': period_id.id, - 'debit': credit_sum - debit_sum, - 'credit': 0.0, - 'payslip_id': slip.id, - }) - line_ids.append(adjust_debit) - move.update({'line_id': line_ids}) - move_id = move_obj.create(move) - if slip.journal_id.entry_posted: - move_obj.post(move_id) - else: - raise Warning( - _('Erro!'), - _('É preciso selecionar um diário para realizar ' - 'a contabilização!') - ) + period_id = period_obj.find(holerite.date_to) + contador_lancamentos = 1 + + if not holerite.journal_id: + raise Warning(_('Erro de Dados!'), + _('O campo Diário neste holerite ' + 'não foi definido, por favor escolha o ' + 'Diário antes de calcular o Lançamento ' + 'Contábil!' + )) + + # Roda as Rubricas e Cria os lançamentos contábeis + for line in holerite.details_by_salary_rule_category: + linhas = [] + if line.total > 0: + conta_credito, conta_debito = False, False + credito, debito = 0, 0 + if holerite.tipo_de_folha == 'normal': + if line.salary_rule_id.holerite_normal_account_debit: + debito = line.total + conta_debito = \ + line.salary_rule_id.\ + holerite_normal_account_debit + if line.salary_rule_id.holerite_normal_account_credit: + debito = line.total + conta_credito = \ + line.salary_rule_id.\ + holerite_normal_account_credit + elif holerite.tipo_de_folha == 'ferias': + if line.salary_rule_id.ferias_account_debit: + debito = line.total + conta_debito = \ + line.salary_rule_id.ferias_account_debit + if line.salary_rule_id.ferias_account_credit: + debito = line.total + conta_credito = \ + line.salary_rule_id.ferias_account_credit + elif holerite.tipo_de_folha == 'decimo_terceiro': + if line.salary_rule_id.decimo_13_account_debit: + debito = line.total + conta_debito = \ + line.salary_rule_id.decimo_13_account_debit + if line.salary_rule_id.decimo_13_account_credit: + debito = line.total + conta_credito = \ + line.salary_rule_id.decimo_13_account_credit + elif holerite.tipo_de_folha == 'rescisao': + if line.salary_rule_id.rescisao_account_debit: + debito = line.total + conta_debito = \ + line.salary_rule_id.rescisao_account_debit + if line.salary_rule_id.rescisao_account_credit: + debito = line.total + conta_credito = \ + line.salary_rule_id.rescisao_account_credit + elif holerite.tipo_de_folha == 'provisao_ferias': + if line.salary_rule_id.provisao_ferias_account_debit: + debito = line.total + conta_debito = \ + line.salary_rule_id.\ + provisao_ferias_account_debit + if line.salary_rule_id.provisao_ferias_account_credit: + debito = line.total + conta_credito = \ + line.salary_rule_id.\ + provisao_ferias_account_credit + elif holerite.tipo_de_folha == 'provisao_decimo_terceiro': + if line.salary_rule_id.provisao_13_account_debit: + debito = line.total + conta_debito = \ + line.salary_rule_id.provisao_13_account_debit + if line.salary_rule_id.provisao_13_account_credit: + debito = line.total + conta_credito = \ + line.salary_rule_id.provisao_13_account_credit + + # + # Cria o Lançamento Contábil para esta Rubrica + # + if conta_credito or conta_debito: + move = self.criar_lancamento_contabil( + period_id, holerite, contador_lancamentos + ) + + # Cria a linha do lançamento contábil para Crédito + if conta_credito: + credit_line = (0, 0, { + 'name': line.name, + 'date': timenow, + 'account_id': conta_credito.id, + 'journal_id': holerite.journal_id.id, + 'period_id': period_id.id, + 'debit': 0, + 'credit': credito, + 'payslip_id': holerite.id, + }) + linhas.append(credit_line) + + # Cria a linha do lançamento contábil para Débito + if conta_debito: + debit_line = (0, 0, { + 'name': line.name, + 'date': timenow, + 'account_id': conta_debito.id, + 'journal_id': holerite.journal_id.id, + 'period_id': period_id.id, + 'debit': debito, + 'credit': 0, + 'payslip_id': holerite.id, + }) + linhas.append(debit_line) + + # Fecha e Posta o Lançamento Contábil + move.update({'line_id': linhas}) + move_id = move_obj.create(move) + if holerite.journal_id.entry_posted: + move_obj.post(move_id) + + # Incrementa o contador para a próxima linha + contador_lancamentos += 1 def criar_lancamento_contabil(self, period_id, slip, contador_lancamento): name = \ @@ -269,7 +236,4 @@ def criar_lancamento_contabil(self, period_id, slip, contador_lancamento): 'period_id': period_id.id, 'payslip_id': slip.id, } - move_anterior_id = self._verificar_lancamentos_anteriores( - slip.tipo_de_folha, period_id.id - ) - return move, move_anterior_id + return move From beae19463b521b7518fb86fd86a25ccae79d3a93 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Sat, 27 Jan 2018 09:57:35 -0200 Subject: [PATCH 658/787] =?UTF-8?q?[FIX]=20Evita=20calcular=20contabiliza?= =?UTF-8?q?=C3=A7=C3=A3o=20de=20um=20holerite=20que=20faz=20parte=20de=20u?= =?UTF-8?q?m=20Lote?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/l10n_br_hr_payroll_account.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py index 76dbe5de6..f76616bad 100644 --- a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py +++ b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py @@ -102,6 +102,13 @@ def processar_folha(self): period_id = period_obj.find(holerite.date_to) contador_lancamentos = 1 + if holerite.payslip_run_id: + raise Warning(_('Erro de Consistência!'), + _('Este Holerite faz parte de um lote ' + 'neste caso a contabilização deve ser feita ' + 'pelo Lote!' + )) + if not holerite.journal_id: raise Warning(_('Erro de Dados!'), _('O campo Diário neste holerite ' From 659af5066b6fa96e8ed686d1db11e2815466be05 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Sat, 27 Jan 2018 10:01:20 -0200 Subject: [PATCH 659/787] =?UTF-8?q?[FIX]=20Corre=C3=A7=C3=A3o=20do=20lan?= =?UTF-8?q?=C3=A7amento=20que=20gerava=20valor=20de=20cr=C3=A9dito=20zerad?= =?UTF-8?q?o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/l10n_br_hr_payroll_account.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py index f76616bad..94c52105c 100644 --- a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py +++ b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py @@ -130,7 +130,7 @@ def processar_folha(self): line.salary_rule_id.\ holerite_normal_account_debit if line.salary_rule_id.holerite_normal_account_credit: - debito = line.total + credito = line.total conta_credito = \ line.salary_rule_id.\ holerite_normal_account_credit @@ -140,7 +140,7 @@ def processar_folha(self): conta_debito = \ line.salary_rule_id.ferias_account_debit if line.salary_rule_id.ferias_account_credit: - debito = line.total + credito = line.total conta_credito = \ line.salary_rule_id.ferias_account_credit elif holerite.tipo_de_folha == 'decimo_terceiro': @@ -149,7 +149,7 @@ def processar_folha(self): conta_debito = \ line.salary_rule_id.decimo_13_account_debit if line.salary_rule_id.decimo_13_account_credit: - debito = line.total + credito = line.total conta_credito = \ line.salary_rule_id.decimo_13_account_credit elif holerite.tipo_de_folha == 'rescisao': @@ -158,7 +158,7 @@ def processar_folha(self): conta_debito = \ line.salary_rule_id.rescisao_account_debit if line.salary_rule_id.rescisao_account_credit: - debito = line.total + credito = line.total conta_credito = \ line.salary_rule_id.rescisao_account_credit elif holerite.tipo_de_folha == 'provisao_ferias': @@ -168,7 +168,7 @@ def processar_folha(self): line.salary_rule_id.\ provisao_ferias_account_debit if line.salary_rule_id.provisao_ferias_account_credit: - debito = line.total + credito = line.total conta_credito = \ line.salary_rule_id.\ provisao_ferias_account_credit @@ -178,7 +178,7 @@ def processar_folha(self): conta_debito = \ line.salary_rule_id.provisao_13_account_debit if line.salary_rule_id.provisao_13_account_credit: - debito = line.total + credito = line.total conta_credito = \ line.salary_rule_id.provisao_13_account_credit From 65dc4e9d6a367af58eb9ce1fd88f74ad430844ab Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Sat, 27 Jan 2018 10:06:44 -0200 Subject: [PATCH 660/787] =?UTF-8?q?[FIX]=20Excluir=20o=20Lan=C3=A7amento?= =?UTF-8?q?=20Cont=C3=A1bil=20anterior=20quando=20necess=C3=A1rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/l10n_br_hr_payroll_account.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py index 94c52105c..1e53ffcea 100644 --- a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py +++ b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_account.py @@ -117,6 +117,9 @@ def processar_folha(self): 'Contábil!' )) + # Exclui os Lançamento Contábeis anteriors + holerite.move_id.unlink() + # Roda as Rubricas e Cria os lançamentos contábeis for line in holerite.details_by_salary_rule_category: linhas = [] From 4ee1f932848da7018d8e358c0f575172bb538695 Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Sat, 27 Jan 2018 11:37:41 -0200 Subject: [PATCH 661/787] =?UTF-8?q?[FIX]=20Corre=C3=A7=C3=B5es=20para=20C?= =?UTF-8?q?=C3=A1lculo=20de=20Adiantamento=20de=2013=C2=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 22 +++++++++++----------- l10n_br_hr_payroll/views/hr_payslip.xml | 8 ++++---- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 2363d8d4f..843b1f236 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -2403,17 +2403,17 @@ def validacao_holerites_anteriores(self, data_inicio, data_fim, contrato): continue mes_anterior = folha.mes_do_ano mes = mes + relativedelta(months=1) - if folha.mes_do_ano != mes.month: - raise exceptions.ValidationError( - _("Faltando Holerite confirmado do mês de %s de %s") % - (MES_DO_ANO[mes.month - 1][1], mes.year)) - if mes.month != fields.Datetime.from_string(data_fim).month: - mes = fields.Datetime.from_string(data_fim).month - raise exceptions.ValidationError( - _("Não foi encontrado o último holerite do periodo " - "aquisitivo, \nreferente ao mês de %s de %s") % - (MES_DO_ANO[mes - 1][1], - fields.Datetime.from_string(data_fim).year)) + # if folha.mes_do_ano != mes.month: + # raise exceptions.ValidationError( + # _("Faltando Holerite confirmado do mês de %s de %s") % + # (MES_DO_ANO[mes.month - 1][1], mes.year)) + # if mes.month != fields.Datetime.from_string(data_fim).month: + # mes = fields.Datetime.from_string(data_fim).month + # raise exceptions.ValidationError( + # _("Não foi encontrado o último holerite do periodo " + # "aquisitivo, \nreferente ao mês de %s de %s") % + # (MES_DO_ANO[mes - 1][1], + # fields.Datetime.from_string(data_fim).year)) @api.multi def gerar_media_dos_proventos(self): diff --git a/l10n_br_hr_payroll/views/hr_payslip.xml b/l10n_br_hr_payroll/views/hr_payslip.xml index 947e08f5b..3e2d3e5bb 100644 --- a/l10n_br_hr_payroll/views/hr_payslip.xml +++ b/l10n_br_hr_payroll/views/hr_payslip.xml @@ -356,7 +356,7 @@ {'default_tipo_de_folha': 'decimo_terceiro'} - [('tipo_de_folha','=','decimo_terceiro')] + [('tipo_de_folha','=','decimo_terceiro'),('is_simulacao','=',False)] @@ -369,7 +369,7 @@ hr.aviso.previo.tree hr.payslip - + @@ -421,7 +421,7 @@ hr.ferias.simulacao.tree hr.payslip - + @@ -481,7 +481,7 @@ hr.decimo.terceiro.simulacao.tree hr.payslip - + From 8c5c6b436246ad01b0c327bd8be40edecae930ab Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Sat, 27 Jan 2018 12:02:19 -0200 Subject: [PATCH 662/787] =?UTF-8?q?[FIX]=20C=C3=A1lculo=20de=20Adiamento?= =?UTF-8?q?=20de=2013=C2=BA=20Falhando?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 2 +- l10n_br_hr_payroll/models/hr_payslip_run.py | 49 +++++++++++---------- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 843b1f236..8614ccca9 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -56,7 +56,7 @@ ('normal', u'Folha normal'), ('rescisao', u'Rescisão'), ('ferias', u'Férias'), - ('decimo_terceiro', u'Décim o terceiro (13º)'), + ('decimo_terceiro', u'Décimo terceiro (13º)'), ('aviso_previo', u'Aviso Prévio'), ('provisao_ferias', u'Provisão de Férias'), ('provisao_decimo_terceiro', u'Provisão de Décimo terceiro (13º)'), diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index 4f6734330..9196208bd 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -215,29 +215,32 @@ def gerar_holerites(self): continue contrato.action_button_update_controle_ferias() else: - try: - payslip_obj = self.env['hr.payslip'] - payslip = payslip_obj.create({ - 'contract_id': contrato.id, - 'mes_do_ano': self.mes_do_ano, - 'mes_do_ano2': self.mes_do_ano, - 'ano': self.ano, - 'employee_id': contrato.employee_id.id, - 'tipo_de_folha': self.tipo_de_folha, - 'payslip_run_id': self.id, - }) - payslip._compute_set_dates() - payslip.compute_sheet() - _logger.info( - u"Holerite " + contrato.name + - u" processado com sucesso!") - self.env.cr.commit() - except: - _logger.warning( - u"Holerite " + contrato.name + - u" falhou durante o cálculo!") - payslip.unlink() - continue + # try: + tipo_de_folha = self.tipo_de_folha + if tipo_de_folha == 'adiantamento_13': + tipo_de_folha = 'decimo_terceiro' + payslip_obj = self.env['hr.payslip'] + payslip = payslip_obj.create({ + 'contract_id': contrato.id, + 'mes_do_ano': self.mes_do_ano, + 'mes_do_ano2': self.mes_do_ano, + 'ano': self.ano, + 'employee_id': contrato.employee_id.id, + 'tipo_de_folha': tipo_de_folha, + 'payslip_run_id': self.id, + }) + payslip._compute_set_dates() + payslip.compute_sheet() + _logger.info( + u"Holerite " + contrato.name + + u" processado com sucesso!") + self.env.cr.commit() + # except: + # _logger.warning( + # u"Holerite " + contrato.name + + # u" falhou durante o cálculo!") + # payslip.unlink() + # continue self.verificar_holerites_gerados() @api.multi From 092a5b9041ce90e8d0e511ba71272f7863c30a2c Mon Sep 17 00:00:00 2001 From: Wagner Pereira Date: Sat, 27 Jan 2018 12:05:46 -0200 Subject: [PATCH 663/787] [FIX] Retornado try except --- l10n_br_hr_payroll/models/hr_payslip_run.py | 52 ++++++++++----------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index 9196208bd..3186a7f0c 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -215,32 +215,32 @@ def gerar_holerites(self): continue contrato.action_button_update_controle_ferias() else: - # try: - tipo_de_folha = self.tipo_de_folha - if tipo_de_folha == 'adiantamento_13': - tipo_de_folha = 'decimo_terceiro' - payslip_obj = self.env['hr.payslip'] - payslip = payslip_obj.create({ - 'contract_id': contrato.id, - 'mes_do_ano': self.mes_do_ano, - 'mes_do_ano2': self.mes_do_ano, - 'ano': self.ano, - 'employee_id': contrato.employee_id.id, - 'tipo_de_folha': tipo_de_folha, - 'payslip_run_id': self.id, - }) - payslip._compute_set_dates() - payslip.compute_sheet() - _logger.info( - u"Holerite " + contrato.name + - u" processado com sucesso!") - self.env.cr.commit() - # except: - # _logger.warning( - # u"Holerite " + contrato.name + - # u" falhou durante o cálculo!") - # payslip.unlink() - # continue + try: + tipo_de_folha = self.tipo_de_folha + if tipo_de_folha == 'adiantamento_13': + tipo_de_folha = 'decimo_terceiro' + payslip_obj = self.env['hr.payslip'] + payslip = payslip_obj.create({ + 'contract_id': contrato.id, + 'mes_do_ano': self.mes_do_ano, + 'mes_do_ano2': self.mes_do_ano, + 'ano': self.ano, + 'employee_id': contrato.employee_id.id, + 'tipo_de_folha': tipo_de_folha, + 'payslip_run_id': self.id, + }) + payslip._compute_set_dates() + payslip.compute_sheet() + _logger.info( + u"Holerite " + contrato.name + + u" processado com sucesso!") + self.env.cr.commit() + except: + _logger.warning( + u"Holerite " + contrato.name + + u" falhou durante o cálculo!") + payslip.unlink() + continue self.verificar_holerites_gerados() @api.multi From 3a4bb924a65fbd087c95d04c28fe1e9381d6fcb4 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Wed, 31 Jan 2018 15:50:13 -0200 Subject: [PATCH 664/787] [FIX] Ajuste no filtro dos contratos do lote de holerites para nao pegar contratos que ja tiveram adiantamento naquele ano --- l10n_br_hr_payroll/models/hr_payslip_run.py | 60 +++++++++++++++++++-- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index 3186a7f0c..fb2c1d81a 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -123,11 +123,30 @@ def buscar_datas_periodo(self): @api.multi def verificar_holerites_gerados(self): + + # remover holerites que foram gerados pelo lote mas nao foram + # confirmados + not_done = self.slip_ids.filtered(lambda s: not s.state == 'done') + not_done.unlink() + + # holerites que ja foram confirmados + done = self.slip_ids.filtered(lambda s: s.state == 'done') + for lote in self: + # pegar todos contratos da empresa que são válidos, dominio_contratos = [ - ('date_start', '<=', lote.date_end), - ('company_id', '=', lote.company_id.id), + ('date_start', '<=', lote.date_end), + ('company_id', '=', lote.company_id.id), + ] + + # Se existir holerites ja concluidos nao buscar os contratos + # destes holerites + if done: + dominio_contratos += [ + ('id', 'not in', done.mapped('contract_id').ids), ] + + # Se for lote de folha normal nao pegar as categorias inválidas if lote.tipo_de_folha != 'normal': dominio_contratos += [ ('categoria', 'not in', ['721', '722']), @@ -136,24 +155,35 @@ def verificar_holerites_gerados(self): # dominio_contratos += [ # ('date_end', '>', lote.date_start), # ] + + # Buscar contratos validos contracts_id = self.env['hr.contract'].search(dominio_contratos) + # buscar payslip ja processadas dos contratos validos dominio_payslips = [ ('tipo_de_folha', '=', self.tipo_de_folha), ('contract_id', 'in', contracts_id.ids) ] + + # se o lote for de provisao de ferias, buscar entre o periodo todo if lote.tipo_de_folha != 'provisao_ferias': dominio_payslips += [ ('date_from', '>=', self.date_start), ('date_to', '<=', self.date_end), ] + + # Se o lote for de qualquer utro tipo, buscar apenas paylisps + # do mes setado no lote. else: dominio_payslips += [ ('mes_do_ano', '=', self.mes_do_ano), ('ano', '=', self.ano), ] + + # Buscar payslips dos contratos validos que ja foram processadas payslips = self.env['hr.payslip'].search(dominio_payslips) + # grupo contendo os contratos que ja foram processados naquele período contratos_com_holerites = [] for payslip in payslips: if payslip.contract_id.id not in contratos_com_holerites: @@ -161,13 +191,37 @@ def verificar_holerites_gerados(self): contratos_sem_holerite = [] for contrato in contracts_id: + # se o contrato valido nao esta nos contratos que ja possuem + # payslip naquele periodo if contrato.id not in contratos_com_holerites: + # remover contratos finalizados if not contrato.date_end: contratos_sem_holerite.append(contrato.id) else: if contrato.date_end > lote.date_end: contratos_sem_holerite.append(contrato.id) + # Adiantamento eh uma rubrica + # no processamento do lote de adiantamento de 13, + # filtrar os contratos que ja foram processados naquele intervalo + # com aquela rubrica + if lote.tipo_de_folha == 'adiantamento_13': + # buscar as rubricas que foram processadas de adiantamento 13 + rubricas_ids = self.env['hr.payslip.line'].search([ + ('contract_id', 'in', contratos_sem_holerite), + ('code', '=', 'ADIANTAMENTO_13'), + ('slip_id.ano', '=', self.ano), + ('slip_id.mes_do_ano', '<', self.mes_do_ano), + ('slip_id.state', '=', 'done'), + ]) + + # filtrar os contratos dessas rubricas + contratos_ids = rubricas_ids.mapped('contract_id') + + # remover esses contratos dos contratos validos + contratos_sem_holerite = \ + list(set(contratos_sem_holerite) - set(contratos_ids.ids)) + lote.write({ 'contract_id': [(6, 0, contratos_sem_holerite)], 'contract_id_readonly': [(6, 0, contratos_sem_holerite)], @@ -241,7 +295,7 @@ def gerar_holerites(self): u" falhou durante o cálculo!") payslip.unlink() continue - self.verificar_holerites_gerados() + # self.verificar_holerites_gerados() @api.multi def close_payslip_run(self): From c7e450703f92cfc33dac20010e8db560e786968d Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Wed, 31 Jan 2018 15:57:47 -0200 Subject: [PATCH 665/787] [FIX] Desabilitando melhorias temporarimante --- l10n_br_hr_payroll/models/hr_payslip_run.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index fb2c1d81a..4cc3e90f1 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -126,11 +126,11 @@ def verificar_holerites_gerados(self): # remover holerites que foram gerados pelo lote mas nao foram # confirmados - not_done = self.slip_ids.filtered(lambda s: not s.state == 'done') - not_done.unlink() + # not_done = self.slip_ids.filtered(lambda s: not s.state == 'done') + # not_done.unlink() # holerites que ja foram confirmados - done = self.slip_ids.filtered(lambda s: s.state == 'done') + # done = self.slip_ids.filtered(lambda s: s.state == 'done') for lote in self: # pegar todos contratos da empresa que são válidos, @@ -141,10 +141,10 @@ def verificar_holerites_gerados(self): # Se existir holerites ja concluidos nao buscar os contratos # destes holerites - if done: - dominio_contratos += [ - ('id', 'not in', done.mapped('contract_id').ids), - ] + # if done: + # dominio_contratos += [ + # ('id', 'not in', done.mapped('contract_id').ids), + # ] # Se for lote de folha normal nao pegar as categorias inválidas if lote.tipo_de_folha != 'normal': @@ -295,7 +295,7 @@ def gerar_holerites(self): u" falhou durante o cálculo!") payslip.unlink() continue - # self.verificar_holerites_gerados() + self.verificar_holerites_gerados() @api.multi def close_payslip_run(self): From fae7afdfb2fc13f178f7b264e54126d3ffa8e36a Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Wed, 31 Jan 2018 21:08:24 -0200 Subject: [PATCH 666/787] [ADD] Modo de pagamento vindo do contrato --- l10n_br_hr_payment_order/__openerp__.py | 1 + l10n_br_hr_payment_order/models/__init__.py | 1 + .../models/hr_contract.py | 15 +++++++++++++ l10n_br_hr_payment_order/models/hr_payslip.py | 21 ++++++++++++------- .../models/payment_order.py | 3 ++- .../views/hr_contract.xml | 20 ++++++++++++++++++ 6 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 l10n_br_hr_payment_order/models/hr_contract.py create mode 100644 l10n_br_hr_payment_order/views/hr_contract.xml diff --git a/l10n_br_hr_payment_order/__openerp__.py b/l10n_br_hr_payment_order/__openerp__.py index a86f1a553..40391ffa3 100644 --- a/l10n_br_hr_payment_order/__openerp__.py +++ b/l10n_br_hr_payment_order/__openerp__.py @@ -24,6 +24,7 @@ 'wizard/payslip_payment_create_order_view.xml', 'views/hr_payslip.xml', + 'views/hr_contract.xml', 'views/hr_salary_rule_view.xml', 'views/payment_mode.xml', 'views/payment_order.xml', diff --git a/l10n_br_hr_payment_order/models/__init__.py b/l10n_br_hr_payment_order/models/__init__.py index a8e85ba7d..424de0b3f 100644 --- a/l10n_br_hr_payment_order/models/__init__.py +++ b/l10n_br_hr_payment_order/models/__init__.py @@ -5,6 +5,7 @@ from . import payment_order from . import payment_line from . import hr_payslip +from . import hr_contract # from . import hr_payslip_run from . import res_config from . import hr_salary_rule diff --git a/l10n_br_hr_payment_order/models/hr_contract.py b/l10n_br_hr_payment_order/models/hr_contract.py new file mode 100644 index 000000000..71f1b97ea --- /dev/null +++ b/l10n_br_hr_payment_order/models/hr_contract.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 KMEE - Hendrix Costa +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp import fields, models + + +class HrContract(models.Model): + _inherit = 'hr.contract' + + payment_mode_id = fields.Many2one( + string="Forma de Pagamento padrão do holerite", + comodel_name='payment.mode', + domain="[('tipo_pagamento', '=', 'folha')]" + ) \ No newline at end of file diff --git a/l10n_br_hr_payment_order/models/hr_payslip.py b/l10n_br_hr_payment_order/models/hr_payslip.py index 6851b0b64..bf5a7d776 100644 --- a/l10n_br_hr_payment_order/models/hr_payslip.py +++ b/l10n_br_hr_payment_order/models/hr_payslip.py @@ -11,24 +11,27 @@ class HrPayslip(models.Model): _inherit = 'hr.payslip' payment_mode_id = fields.Many2one( - string="Payment Mode", + string="Modo de Pagamento", comodel_name='payment.mode', domain="[('tipo_pagamento', '=', 'folha')]" ) payment_order_id = fields.Many2one( - string="Payment Mode", + string="Ordem de pagamento", comodel_name='payment.order', - # domain="[('type', '=', type)]" + readonly=True, + # domain="[('type', '=', type)]", ) payment_line_ids = fields.One2many( - string="Ordens de Pagamento", + string="Pagamentos", comodel_name="payment.line", inverse_name="payslip_id", + readonly=True, ) paid_order = fields.Boolean( + string='Pago', compute='_compute_paid', readonly=True, store=True, @@ -51,12 +54,16 @@ def _compute_paid(self): self.paid_order = self.test_paid() def _compute_set_employee_id(self): + """ + Setar a forma de pagamento no compute do holerite, buscando do contrato + """ super(HrPayslip, self)._compute_set_employee_id() for record in self: if record.contract_id: - partner_id = \ - record.contract_id.employee_id.parent_id.user_id.partner_id - record.payment_mode_id = partner_id.supplier_payment_mode + record.payment_mode_id = record.contract_id.payment_mode_id + # partner_id = \ + # record.contract_id.employee_id.parent_id.user_id.partner_id + # record.payment_mode_id = partner_id.supplier_payment_mode @api.multi def action_done(self): diff --git a/l10n_br_hr_payment_order/models/payment_order.py b/l10n_br_hr_payment_order/models/payment_order.py index 81be428fa..e5268c677 100644 --- a/l10n_br_hr_payment_order/models/payment_order.py +++ b/l10n_br_hr_payment_order/models/payment_order.py @@ -90,7 +90,8 @@ def folha_payment_import(self): payslip_ids = self.env['hr.payslip'].search([ ('tipo_de_folha', '=', self.tipo_de_folha), - ('state', '=', 'verify') + ('state', '=', 'verify'), + ('payment_mode_id', '=', self.mode.id), ]) rubricas_pagaveis = self.env['hr.salary.rule'].search([ diff --git a/l10n_br_hr_payment_order/views/hr_contract.xml b/l10n_br_hr_payment_order/views/hr_contract.xml new file mode 100644 index 000000000..f49156245 --- /dev/null +++ b/l10n_br_hr_payment_order/views/hr_contract.xml @@ -0,0 +1,20 @@ + + + + + + + + hr.contract.form (in l10n_br_hr_payment_order) + hr.contract + + + + + + + + + + From 17af6e9fa6e8eb0abfb5961b7310a0d2eabec819 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Wed, 31 Jan 2018 21:13:48 -0200 Subject: [PATCH 667/787] Update hr_contract.py --- l10n_br_hr_payment_order/models/hr_contract.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payment_order/models/hr_contract.py b/l10n_br_hr_payment_order/models/hr_contract.py index 71f1b97ea..a69c8a286 100644 --- a/l10n_br_hr_payment_order/models/hr_contract.py +++ b/l10n_br_hr_payment_order/models/hr_contract.py @@ -12,4 +12,4 @@ class HrContract(models.Model): string="Forma de Pagamento padrão do holerite", comodel_name='payment.mode', domain="[('tipo_pagamento', '=', 'folha')]" - ) \ No newline at end of file + ) From c2b52a20e76df245ffa7935cbe300aeca22b097f Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 1 Feb 2018 18:11:09 -0200 Subject: [PATCH 668/787] [FIX] Removendo as rubricas zeradas da contagem --- l10n_br_hr_payroll/models/hr_payslip_run.py | 1 + 1 file changed, 1 insertion(+) diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index 4cc3e90f1..d55fd210d 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -213,6 +213,7 @@ def verificar_holerites_gerados(self): ('slip_id.ano', '=', self.ano), ('slip_id.mes_do_ano', '<', self.mes_do_ano), ('slip_id.state', '=', 'done'), + ('total', '>', 0), ]) # filtrar os contratos dessas rubricas From 0588d7a4ebe981bccc06060dca26fcd15bcaa777 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 5 Feb 2018 16:38:20 -0200 Subject: [PATCH 669/787] =?UTF-8?q?[ADD]=20Adicionando=20informa=C3=A7?= =?UTF-8?q?=C3=A3o=20da=20quantidade=20de=20avos=20apartir=20do=20mes=20de?= =?UTF-8?q?=20entrada?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 8614ccca9..5c1fefa5c 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1729,6 +1729,10 @@ def sum(self, code, from_date, to_date=None): ) ferias_abono = InputLine(payslip.employee_id.id, dias_abono_ferias) + # Variavel para contabilizar os avos na contabilização do + # adiantamento do decimo terceiro salario + adiantamento_avos_13 = 12 + # Calcula os Avos do payslip para Provisão de 13º Salário if fields.Date.from_string(payslip.contract_id.date_start) > \ fields.Date.from_string(str(payslip.ano)+'-01-01'): @@ -1737,10 +1741,15 @@ def sum(self, code, from_date, to_date=None): mes_inicio_contrato = \ fields.Date.from_string(payslip.contract_id.date_start).month avos_13 = int(payslip.mes_do_ano) - int(mes_inicio_contrato) + 1 + + adiantamento_avos_13 = 13 - int(mes_inicio_contrato) + if dia_inicio_contrato > 15: avos_13 -= 1 + adiantamento_avos_13 -= 1 else: avos_13 = payslip.mes_do_ano + if payslip.contract_id.date_end: if datetime.strptime(payslip.contract_id.date_end, '%Y-%m-%d').month \ == payslip.mes_do_ano: @@ -1759,7 +1768,7 @@ def sum(self, code, from_date, to_date=None): 'SALARIO_DIA': salario_dia, 'SALARIO_HORA': salario_hora, 'RAT_FAP': rat_fap, 'MEDIAS': medias_obj, 'PEDIDO_FERIAS': ferias_abono, 'PAGAR_FERIAS': False, - 'AVOS_13': avos_13, + 'AVOS_13': avos_13, 'adiantamento_avos_13': adiantamento_avos_13, 'DIAS_AVISO_PREVIO': payslip.dias_aviso_previo, 'RUBRICAS_ESPEC_CALCULADAS': [], 'locals': locals, From 12d22fa060b6155cd91f2e6b6d291f1daa1e9eb1 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 5 Feb 2018 16:38:54 -0200 Subject: [PATCH 670/787] [FIX] Ajuste para pegar adiantamentos de ferias incluindo o mes corrente --- l10n_br_hr_payroll/models/hr_payslip_run.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index d55fd210d..bc1425e7e 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -211,7 +211,7 @@ def verificar_holerites_gerados(self): ('contract_id', 'in', contratos_sem_holerite), ('code', '=', 'ADIANTAMENTO_13'), ('slip_id.ano', '=', self.ano), - ('slip_id.mes_do_ano', '<', self.mes_do_ano), + ('slip_id.mes_do_ano', '<=', self.mes_do_ano), ('slip_id.state', '=', 'done'), ('total', '>', 0), ]) From aa446b815bb4c9194748c56232a2ad0bffdc037b Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 6 Feb 2018 18:34:26 -0200 Subject: [PATCH 671/787] =?UTF-8?q?[ADD]=20Automatizando=20a=20atualiza?= =?UTF-8?q?=C3=A7=C3=A3o=20do=20modo=20de=20pagamento=20nos=20lotes=20de?= =?UTF-8?q?=20holerites?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip_run.py | 1 + 1 file changed, 1 insertion(+) diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index bc1425e7e..4b990b527 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -285,6 +285,7 @@ def gerar_holerites(self): 'payslip_run_id': self.id, }) payslip._compute_set_dates() + payslip._compute_set_employee_id() payslip.compute_sheet() _logger.info( u"Holerite " + contrato.name + From cf3957bebcdeb5a587036815c9301d0069f2d987 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Wed, 7 Feb 2018 16:40:39 -0200 Subject: [PATCH 672/787] =?UTF-8?q?[FIX]=20Adicionar=20holerites=20de=2013?= =?UTF-8?q?=C2=BA=20=20na=20busca=20por=20adiantamento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 5c1fefa5c..5a2be18fd 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1508,22 +1508,23 @@ def busca_adiantamento_13(self): :return: float - Valor pago neste ano ''' domain = [ - ('tipo_de_folha', '=', 'normal'), + ('tipo_de_folha', 'in', ['normal','decimo_terceiro']), ('contract_id', '=', self.contract_id.id), ('state', 'in', ['done', 'verify']), ('ano', '=', self.ano), ('is_simulacao', '=', False), ('mes_do_ano', '<=', self.mes_do_ano), ] - holerites = self.search( - domain, order='mes_do_ano DESC') + holerites = self.search(domain, order='mes_do_ano DESC') + valor = 0 if holerites: for holerite in holerites: for line in holerite.line_ids: if line.code in [ 'ADIANTAMENTO_13', - 'ADIANTAMENTO_13_FERIAS' + 'ADIANTAMENTO_13_FERIAS', + 'PRIMEIRA_PARCELA_13', ]: if not (self.tipo_de_folha == 'ferias' and holerite.mes_do_ano == self.mes_do_ano): From 9d6f6ffa30aeafcf8cad278a33128da9753144d4 Mon Sep 17 00:00:00 2001 From: the-bmb Date: Thu, 8 Feb 2018 16:13:17 -0200 Subject: [PATCH 673/787] =?UTF-8?q?[FIX]=20m=C3=AAs=20do=20holerite=20de?= =?UTF-8?q?=20f=C3=A9rias=20de=20acordo=20com=20a=20data=20das=20f=C3=A9ri?= =?UTF-8?q?as?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit estava sendo mostrada a data do processamento e não das férias --- l10n_br_hr_payroll/models/hr_payslip.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 5a2be18fd..f9164258b 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -2159,8 +2159,9 @@ def _compute_set_dates(self): record.mes_do_ano = datetime.now().months record.mes_do_ano2 = datetime.now().month if record.tipo_de_folha == 'ferias' and record.holidays_ferias: - record.periodo_aquisitivo =\ - record.holidays_ferias.parent_id.controle_ferias_ids[0] + if record.holidays_ferias.parent_id.controle_ferias_ids: + record.periodo_aquisitivo =\ + record.holidays_ferias.parent_id.controle_ferias_ids[0] record.date_from = record.holidays_ferias.data_inicio record.date_to = record.holidays_ferias.data_fim record.mes_do_ano = \ From 6149d06112ef7632b850ba43e0c9861f4a80e0fd Mon Sep 17 00:00:00 2001 From: Luis Felipe Mileo Date: Mon, 19 Feb 2018 13:14:30 -0300 Subject: [PATCH 674/787] =?UTF-8?q?[FIX]=20O=20adiantamento=20tamb=C3=A9m?= =?UTF-8?q?=20deve=20considerar=20as=20f=C3=A9rias=20que=20adiantam=20o=20?= =?UTF-8?q?1/2=20do=2013=20e=20podem=20ser=20tiradas=20antes=20do=20dissid?= =?UTF-8?q?io?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index f9164258b..abffc571a 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1508,7 +1508,7 @@ def busca_adiantamento_13(self): :return: float - Valor pago neste ano ''' domain = [ - ('tipo_de_folha', 'in', ['normal','decimo_terceiro']), + ('tipo_de_folha', 'in', ['normal', 'decimo_terceiro', 'ferias']), ('contract_id', '=', self.contract_id.id), ('state', 'in', ['done', 'verify']), ('ano', '=', self.ano), From 1387c00bedeed17befbd7b565f52beb1ef694a4d Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 20 Feb 2018 10:29:09 -0300 Subject: [PATCH 675/787] [FIX] PEP8 --- l10n_br_hr_payroll/models/hr_contract.py | 26 ++++++++++-------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_contract.py b/l10n_br_hr_payroll/models/hr_contract.py index 5ec7a4dd3..b6438fe37 100644 --- a/l10n_br_hr_payroll/models/hr_contract.py +++ b/l10n_br_hr_payroll/models/hr_contract.py @@ -72,31 +72,27 @@ def _buscar_salario_vigente_periodo( # Checa se há alterações contratuais em estado Rascunho # Não continua se houver # - change = contract_change_obj.search( - [ - ('contract_id', '=', self.id), - ('change_type', '=', 'remuneracao'), - ('state', '=', 'draft'), - ], - order="change_date DESC", + change = contract_change_obj.search([ + ('contract_id', '=', self.id), + ('change_type', '=', 'remuneracao'), + ('state', '=', 'draft'), + ], order="change_date DESC", ) if change: raise exceptions.ValidationError( "Há alteração de remuneração em estado Rascunho " - "neste contrato, por favor exclua o alteração " + "neste contrato, por favor exclua a alteração " "contratual ou Aplique-a para torná-la efetiva " "antes de calcular um holerite!" ) # Busca todas as alterações de remuneração deste contrato # - change = contract_change_obj.search( - [ - ('contract_id', '=', self.id), - ('change_type', '=', 'remuneracao'), - ('state', '=', 'applied'), - ], - order="change_date DESC", + change = contract_change_obj.search([ + ('contract_id', '=', self.id), + ('change_type', '=', 'remuneracao'), + ('state', '=', 'applied'), + ], order="change_date DESC", ) # Calcular o salário proporcional dentro do período especificado From 567977c910929865ef4df48f8bc4831214ffaf61 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 20 Feb 2018 10:30:15 -0300 Subject: [PATCH 676/787] [REM] Validacao de acesso a tupla invalida --- l10n_br_hr_payroll/models/hr_contract.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_contract.py b/l10n_br_hr_payroll/models/hr_contract.py index b6438fe37..23e5fbe8d 100644 --- a/l10n_br_hr_payroll/models/hr_contract.py +++ b/l10n_br_hr_payroll/models/hr_contract.py @@ -113,14 +113,14 @@ def _buscar_salario_vigente_periodo( dias = (d_fim - d_inicio) + timedelta(days=1) - # Se a mudança for exatamente no primeiro dia do período - # Considere o salário pronto no período inteiro + # Se a alteração salarial for exatamente no primeiro dia do + # período do holerite, Considere o salário no período inteiro # if data_mudanca == d_inicio: - if i_2 in range(len(change)): - salario_medio = change[i].wage - salario_dia_1 = change[i].wage / dias.days - salario_dia_2 = change[i].wage / dias.days + # if i_2 in range(len(change)): + salario_medio = change[i].wage + salario_dia_1 = change[i].wage / dias.days + salario_dia_2 = change[i].wage / dias.days else: # Calcula o número de dias dentro do período e quantos dias From 4accb3ccfe7278502b191ad6ce03dff392a5589c Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 20 Feb 2018 16:33:49 -0300 Subject: [PATCH 677/787] =?UTF-8?q?[FIX]=20Modifica=C3=A7=C3=B5es=20no=20l?= =?UTF-8?q?ayout=20do=20relat=C3=B3rio=20para=20exibir=20o=20tipo=20de=20r?= =?UTF-8?q?elat=C3=B3rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll_report/data/analitico.odt | Bin 35765 -> 36556 bytes .../reports/payslip_report_analitico.py | 10 +++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll_report/data/analitico.odt b/l10n_br_hr_payroll_report/data/analitico.odt index 10da97d88822ceb1ea62e07451b024f3019b7504..c7484a4df4319250fef3d611793ca9177915020f 100644 GIT binary patch delta 22743 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 diff --git a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py index 8e0b364e5..ff8401a07 100644 --- a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py +++ b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py @@ -5,7 +5,7 @@ from openerp import api from openerp.addons.report_py3o.py3o_parser import py3o_report_extender - +from openerp.addons.l10n_br_hr_payroll.models.hr_payslip import TIPO_DE_FOLHA class inss_empresa_obj(object): def __init__(self, valores_inss_empresa): @@ -218,6 +218,7 @@ def analytic_report(pool, cr, uid, local_context, context): elif rubrica['code'] in ('INSS_OUTRAS_ENTIDADES', 'INSS_OUTRAS_ENTIDADES_FERIAS'): inss_empresa_funcionario.terceiros += rubrica['sum'] inss_empresa_funcionario.total += rubrica['sum'] +# # if rubrica['code'] == 'INSS_EMPRESA': # inss_empresa_funcionario.base = rubrica['sum'] # inss_empresa_funcionario.inss_empresa = \ @@ -299,7 +300,14 @@ def analytic_report(pool, cr, uid, local_context, context): dia_atual = \ str(data_atual.day) + "/" + str(data_atual.month) + "/" +\ str(data_atual.year) + + # aproveitar o selection construido no wizard do relatorio analitico + tipo_de_folha = eval(wizard.tipo_de_folha) + if isinstance(tipo_de_folha, tuple): + tipo_de_folha = tipo_de_folha[0] + data = { + 'tipo_de_folha': dict(TIPO_DE_FOLHA)[tipo_de_folha], 'data_atual': dia_atual, 'legal_name': legal_name, 'endereco': endereco, From e380cba814eb38747e1b162db750a0326b7f2508 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 20 Feb 2018 16:34:29 -0300 Subject: [PATCH 678/787] =?UTF-8?q?[FIX]=20Ajustando=20a=20busca=20de=20ho?= =?UTF-8?q?lerites=20v=C3=A1lidos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll_report/reports/payslip_report_analitico.py | 3 +++ .../wizards/wizard_l10n_br_hr_payroll_analytic_report.py | 1 + 2 files changed, 4 insertions(+) diff --git a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py index ff8401a07..e0231587c 100644 --- a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py +++ b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py @@ -74,6 +74,7 @@ def analytic_report(pool, cr, uid, local_context, context): ('company_id', '=', wizard.company_id.id), ('mes_do_ano', '=', wizard.mes_do_ano), ('ano', '=', wizard.ano), + ('state', 'in', ['done', 'verify']), ] if wizard.tipo_de_folha == "('normal', 'rescisao')": busca.append(('tipo_de_folha', 'in', eval(wizard.tipo_de_folha))) @@ -112,6 +113,7 @@ def analytic_report(pool, cr, uid, local_context, context): AND payslip.company_id = {company_id} AND payslip.tipo_de_folha in {tipo_de_folha} AND payslip.is_simulacao = false + AND payslip.state in ('verify', 'done') GROUP BY salary_rule.code, salary_rule.name, @@ -142,6 +144,7 @@ def analytic_report(pool, cr, uid, local_context, context): AND payslip.company_id = {company_id} AND payslip.tipo_de_folha in {tipo_de_folha} AND payslip.is_simulacao = false + AND payslip.state in ('verify', 'done') GROUP BY salary_rule.code, salary_rule.name, diff --git a/l10n_br_hr_payroll_report/wizards/wizard_l10n_br_hr_payroll_analytic_report.py b/l10n_br_hr_payroll_report/wizards/wizard_l10n_br_hr_payroll_analytic_report.py index 5033a2eee..55c919d26 100644 --- a/l10n_br_hr_payroll_report/wizards/wizard_l10n_br_hr_payroll_analytic_report.py +++ b/l10n_br_hr_payroll_report/wizards/wizard_l10n_br_hr_payroll_analytic_report.py @@ -47,6 +47,7 @@ def doit(self): ('company_id', '=', self.company_id.id), ('mes_do_ano', '=', self.mes_do_ano), ('ano', '=', self.ano), + ('state', 'in', ['done', 'verify']), ] if self.tipo_de_folha == "('normal', 'rescisao')": busca.append(('tipo_de_folha', 'in', eval(self.tipo_de_folha))) From 3aad284354dff692ee1d7c49f2cf334cd93abcac Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 20 Feb 2018 16:34:47 -0300 Subject: [PATCH 679/787] [FIX] PEP8 --- .../reports/payslip_report_analitico.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py index e0231587c..69fe6b11e 100644 --- a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py +++ b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py @@ -80,14 +80,12 @@ def analytic_report(pool, cr, uid, local_context, context): busca.append(('tipo_de_folha', 'in', eval(wizard.tipo_de_folha))) else: busca.append(('tipo_de_folha', '=', eval(wizard.tipo_de_folha))) - payslip_ids = \ - pool['hr.payslip'].search(cr, uid, busca) + + payslip_ids = pool['hr.payslip'].search(cr, uid, busca) payslips = [] for payslip_id in payslip_ids: - payslips += \ - pool['hr.payslip']\ - .browse(cr, uid, payslip_id) + payslips += pool['hr.payslip'].browse(cr, uid, payslip_id) else: payslips = \ pool['hr.payslip.run']\ @@ -160,6 +158,7 @@ def analytic_report(pool, cr, uid, local_context, context): tipo_de_folha=wizard.tipo_de_folha ) cr.execute(SQL_BUSCA_RUBRICAS) + payslip_lines = cr.dictfetchall() SQL_BUSCA_SEFIP = SQL_BUSCA_SEFIP.format( mes_do_ano=wizard.mes_do_ano, @@ -168,6 +167,7 @@ def analytic_report(pool, cr, uid, local_context, context): tipo_de_folha=wizard.tipo_de_folha ) cr.execute(SQL_BUSCA_SEFIP) + payslip_lines_sefip = cr.dictfetchall() proventos = [] descontos = [] @@ -208,8 +208,8 @@ def analytic_report(pool, cr, uid, local_context, context): inss_empresa_autonomo = inss_empresa_obj(inss_empresa_vals) inss_empresa_cooperativa = inss_empresa_obj(inss_empresa_vals) for rubrica in payslip_lines: -# Somar os valores do INSS_EMPRESA e outros calculados nos holerites -# Ao invés de recalcular os valores aqui + # Somar os valores do INSS_EMPRESA e outros calculados nos holerites + # Ao invés de recalcular os valores aqui if rubrica['code'] in ('INSS_EMPRESA_BASE', 'INSS_EMPRESA_BASE_FERIAS'): inss_empresa_funcionario.base += rubrica['sum'] elif rubrica['code'] in ('INSS_EMPRESA', 'INSS_EMPRESA_FERIAS'): From 722e88b9e32bf2191cf53ac993dc5ed6f1720c59 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 27 Feb 2018 15:36:03 -0300 Subject: [PATCH 680/787] [FIX] Efetuar a reversao de lancamentos contabeis apenas para lotes de provisionamento --- .../models/l10n_br_hr_payroll_run_account.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py index 6e6617260..ff0f6c6b1 100644 --- a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py +++ b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py @@ -211,6 +211,8 @@ def processar_folha(self): for payslip_run in self: for payslip in self.slip_ids: for line in payslip.details_by_salary_rule_category: + # Verificar se na rubrica o cadastro das contas para + # debito e credito estao OK if payslip_run._verificar_existencia_conta_rubrica( line.salary_rule_id, payslip_run.tipo_de_folha @@ -236,6 +238,11 @@ def processar_folha(self): @api.multi def processar_contabilidade_folha(self, rubricas): + """ + + :param rubricas: + :return: + """ conta_debito, conta_credito = self._buscar_contas_lotes() for payslip_run in self: @@ -343,9 +350,13 @@ def processar_contabilidade_folha(self, rubricas): move_obj.post(move_id) # - # Desfazer lançamentos do mês anterior + # Se não for a contabilização do lote de alguma provisão + # Não precisa Desfazer lançamentos do mês anterior # + if payslip_run.tipo_de_folha not in ['provisao_ferias', 'provisao_decimo_terceiro']: + return + # Identificar os lançamentos do mês anterior # move_anterior_ids = \ From 9c2aabdbdf9ade014b412af34b9bf3c008aa9e34 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 1 Mar 2018 15:43:23 -0300 Subject: [PATCH 681/787] [FIX] Quando for provisao pegar as alteracoes salarias do mes --- l10n_br_hr_payroll/models/hr_payslip.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index abffc571a..a148dd83a 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -16,6 +16,7 @@ try: from pybrasil import valor, data + from pybrasil.data import ultimo_dia_mes from pybrasil.valor.decimal import Decimal except ImportError: @@ -796,6 +797,16 @@ def get_inputs(self, contract_ids, date_from, date_to): 'amount': contract._salario_mes_inicial(date_from, date_to), 'contract_id': contract.id, } + + # Caso tenha alteracao contratual no mês corrente, o provisionamento + # devera calcular com a remuneração alterada. Por isso na busca + # do salario, levamos em conta o inicio e o fim do mes. O sistema entao + # encontrara as alterações caso existam naquele mes + if self.tipo_de_folha in ['provisao_ferias', 'provisao_decimo_terceiro']: + date_from = str(self.ano).zfill(4) + '-' + \ + str(self.mes_do_ano).zfill(2) + '-01' + date_to = str(ultimo_dia_mes(date_from)) + salario_mes_final_dic = { 'name': 'Salário Mês Final', 'code': 'SALARIO_MES_FINAL', From b444cb8d59cfd8bde4ab601f1b60dfcd6b2e19d3 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 12 Mar 2018 10:51:48 -0300 Subject: [PATCH 682/787] =?UTF-8?q?[FIX]=20Utilizando=20campo=20do=20tipo?= =?UTF-8?q?=20Date=20ao=20inv=C3=A9s=20do=20datetime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/resource_calendar.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_payroll/models/resource_calendar.py b/l10n_br_hr_payroll/models/resource_calendar.py index a65c1e850..6fc4d5e77 100644 --- a/l10n_br_hr_payroll/models/resource_calendar.py +++ b/l10n_br_hr_payroll/models/resource_calendar.py @@ -110,8 +110,8 @@ def get_quantidade_dias_ferias(self, contract_id, date_from, date_to): # filtrar apenas ferias que esta dentro do periodo a ser validado ferias_atuais = ferias_holidays_ids.filtered( lambda holiday: - (date_from <= holiday.date_from <= date_to) or - (date_from <= holiday.date_to <= date_to) + (date_from <= holiday.data_inicio <= date_to) or + (date_from <= holiday.data_fim <= date_to) ) for holiday in ferias_atuais: From 85c6785d7d049509613441fcb5f261dd6e454a47 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 12 Mar 2018 16:51:14 -0300 Subject: [PATCH 683/787] [FIX] Melhorando busca dos lancamentos antigos --- .../models/l10n_br_hr_payroll_run_account.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py index ff0f6c6b1..fe03b91ba 100644 --- a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py +++ b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py @@ -86,7 +86,7 @@ def _buscar_lancamentos(self): move_lines_id = fields.One2many( comodel_name='account.move.line', string=u'Lançamentos', - compute=_buscar_lancamentos + compute=_buscar_lancamentos, ) journal_id = fields.Many2one( @@ -146,7 +146,8 @@ def _verificar_lancamentos_lotes_anteriores(self, tipo_folha, period_id): move_ids = self.env['account.move'].search( [ ('ref', 'like', lote_anterior.display_name), - ('period_id', '=', periodo_anterior_id.id) + ('period_id', '=', periodo_anterior_id.id), + ('payslip_run_id', '!=', False), ], ) @@ -211,7 +212,7 @@ def processar_folha(self): for payslip_run in self: for payslip in self.slip_ids: for line in payslip.details_by_salary_rule_category: - # Verificar se na rubrica o cadastro das contas para + # Verificar se na rubrica, o cadastro das contas para # debito e credito estao OK if payslip_run._verificar_existencia_conta_rubrica( line.salary_rule_id, @@ -238,11 +239,6 @@ def processar_folha(self): @api.multi def processar_contabilidade_folha(self, rubricas): - """ - - :param rubricas: - :return: - """ conta_debito, conta_credito = self._buscar_contas_lotes() for payslip_run in self: From e3944ef481fe02bcb9e1f7de30de3b19870f3542 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 12 Mar 2018 16:51:35 -0300 Subject: [PATCH 684/787] [FIX] Removendo lancamentos anteriores em cascata com o lote --- l10n_br_hr_payroll_account/models/account_move.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/l10n_br_hr_payroll_account/models/account_move.py b/l10n_br_hr_payroll_account/models/account_move.py index 6d76d7d59..ced037480 100644 --- a/l10n_br_hr_payroll_account/models/account_move.py +++ b/l10n_br_hr_payroll_account/models/account_move.py @@ -11,11 +11,13 @@ class AccountMove(models.Model): payslip_id = fields.Many2one( comodel_name="hr.payslip", string="Payslip", + ondelete='cascade', ) payslip_run_id = fields.Many2one( comodel_name="hr.payslip.run", string="Payslip Run", + ondelete='cascade', ) @api.multi From 186a14a4e278e3492229fa1ccba45827c8393b8a Mon Sep 17 00:00:00 2001 From: Douglas Ferreira Date: Tue, 13 Mar 2018 11:12:42 -0300 Subject: [PATCH 685/787] =?UTF-8?q?[FIX]=20Corre=C3=A7=C3=A3o=20no=20valor?= =?UTF-8?q?=20final=20ap=C3=B3s=20multiplica=C3=A7=C3=A3o=20da=20aliquota?= =?UTF-8?q?=20na=20confronta=C3=A7=C3=A3o=20com=20o=20SEFIP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll_report/data/analitico.odt | Bin 36556 -> 36498 bytes .../reports/payslip_report_analitico.py | 10 +++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/l10n_br_hr_payroll_report/data/analitico.odt b/l10n_br_hr_payroll_report/data/analitico.odt index c7484a4df4319250fef3d611793ca9177915020f..9161a9bb986cfb2f2ab85085899bbd68b03f038c 100644 GIT binary patch delta 22446 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 L>Ci!uzjglst`H?E delta 22624 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 diff --git a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py index 69fe6b11e..564678e6f 100644 --- a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py +++ b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py @@ -185,7 +185,7 @@ def analytic_report(pool, cr, uid, local_context, context): valor_retencao_do_mes_deducao = 0.00 total_inss_deducao = 0.00 base_fgts = 0.00 - fgts = 0.00 +# fgts = 0.00 for rubrica in payslip_lines_sefip: if rubrica['code'] == 'INSS_EMPRESA': @@ -243,8 +243,8 @@ def analytic_report(pool, cr, uid, local_context, context): inss_funcionario_retido += rubrica['sum'] if rubrica['code'] == 'BASE_FGTS': base_fgts = rubrica['sum'] - if rubrica['code'] == 'FGTS': - fgts = rubrica['sum'] +# if rubrica['code'] == 'FGTS': +# fgts = rubrica['sum'] legal_name = payslips[0].company_id.legal_name endereco = \ @@ -293,8 +293,8 @@ def analytic_report(pool, cr, uid, local_context, context): total_bruto_inss_encargos + total_inss_retido - total_inss_deducao aliquota_fgts = 8 - #valor_total_fgts = base_fgts * aliquota_fgts/100.00 - valor_total_fgts = fgts + valor_total_fgts = base_fgts * aliquota_fgts/100.00 + #valor_total_fgts = fgts mes_vencimento = mes_do_ano+1 if mes_do_ano < 12 else 1 data_vencimento = \ '20/' + ('0' + str(mes_vencimento)) if mes_vencimento < 10 else str( From c8429bdc7aec5826d11dbbbcad4603317b2ce3b4 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 13 Mar 2018 12:38:42 -0300 Subject: [PATCH 686/787] [FIX] AJuste nas medias da provisao de ferias --- l10n_br_hr_payroll/models/hr_payslip.py | 41 +++++++++++++++++-------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index a148dd83a..dc9e06001 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -881,29 +881,44 @@ def MEDIA_RUBRICA(self, codigo): # # Identifica os períodos aquisitivos com saldo de férias # + folha_obj = self.env['hr.payslip'] media = 0 periodo = self.periodo_aquisitivo if periodo.saldo != 0: # # Buscar Holerites do Período # - inicio = datetime.strptime( - periodo.inicio_aquisitivo, '%Y-%m-%d') - fim = datetime.strptime( - periodo.fim_aquisitivo, '%Y-%m-%d') - r = relativedelta(fim, inicio) + dt_inicio_aquis = datetime.strptime(periodo.inicio_aquisitivo, '%Y-%m-%d') + + dt_fim_aquis = datetime.strptime(periodo.fim_aquisitivo, '%Y-%m-%d') + + r = relativedelta(dt_fim_aquis, dt_inicio_aquis) + meses = r.months + if r.days >= 15: meses += 1 - folha_obj = self.env['hr.payslip'] - data_fim = min([fim, - datetime.strptime(self.date_to, - '%Y-%m-%d')]) + + # Se tem data de demissao pegar a menor data + data_fim = min([dt_fim_aquis, datetime.strptime(self.date_to, '%Y-%m-%d')]) + + # recuperar data do inicio de mes + dt_inicio_mes = fields.Datetime.from_string(periodo.inicio_aquisitivo).replace(day=1) + + # Se nao trabalhou mais do que 15 dias no mês, contabilizar o mes corrente + dias_nao_trabalhados = dt_inicio_aquis - dt_inicio_mes + + if dias_nao_trabalhados.days < 15: + # Trabalhou mais do que 15 dias no mes + dt_data_de_inicio = dt_inicio_mes + # Senão começar contabilizar medias apartir do mes seguint + else: + dt_data_de_inicio = dt_inicio_mes + relativedelta(months=1) + data_fim = dt_data_de_inicio + relativedelta(months=12) + domain = [ - # ('date_from', '>=', periodo.inicio_aquisitivo), - # ('date_from', '<=', data_fim), - ('date_to', '>=', periodo.inicio_aquisitivo), - ('date_to', '<=', data_fim), + ('date_to', '>=', fields.Date.to_string(dt_data_de_inicio)), + ('date_from', '<=', fields.Date.to_string(data_fim)), ('contract_id', '=', self.contract_id.id), ('tipo_de_folha', '=', 'normal'), ('state', 'in', ['done', 'verify']), From 873c9e521c98ba38dcfc82ffeaf5fc254ac0c3c3 Mon Sep 17 00:00:00 2001 From: Hendrix Costa <7250580+hendrixcosta@users.noreply.github.com> Date: Tue, 13 Mar 2018 21:33:11 -0300 Subject: [PATCH 687/787] Revert "[FIX] AJuste nas medias da provisao de ferias" --- l10n_br_hr_payroll/models/hr_payslip.py | 41 ++++++++----------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index dc9e06001..a148dd83a 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -881,44 +881,29 @@ def MEDIA_RUBRICA(self, codigo): # # Identifica os períodos aquisitivos com saldo de férias # - folha_obj = self.env['hr.payslip'] media = 0 periodo = self.periodo_aquisitivo if periodo.saldo != 0: # # Buscar Holerites do Período # - dt_inicio_aquis = datetime.strptime(periodo.inicio_aquisitivo, '%Y-%m-%d') - - dt_fim_aquis = datetime.strptime(periodo.fim_aquisitivo, '%Y-%m-%d') - - r = relativedelta(dt_fim_aquis, dt_inicio_aquis) - + inicio = datetime.strptime( + periodo.inicio_aquisitivo, '%Y-%m-%d') + fim = datetime.strptime( + periodo.fim_aquisitivo, '%Y-%m-%d') + r = relativedelta(fim, inicio) meses = r.months - if r.days >= 15: meses += 1 - - # Se tem data de demissao pegar a menor data - data_fim = min([dt_fim_aquis, datetime.strptime(self.date_to, '%Y-%m-%d')]) - - # recuperar data do inicio de mes - dt_inicio_mes = fields.Datetime.from_string(periodo.inicio_aquisitivo).replace(day=1) - - # Se nao trabalhou mais do que 15 dias no mês, contabilizar o mes corrente - dias_nao_trabalhados = dt_inicio_aquis - dt_inicio_mes - - if dias_nao_trabalhados.days < 15: - # Trabalhou mais do que 15 dias no mes - dt_data_de_inicio = dt_inicio_mes - # Senão começar contabilizar medias apartir do mes seguint - else: - dt_data_de_inicio = dt_inicio_mes + relativedelta(months=1) - data_fim = dt_data_de_inicio + relativedelta(months=12) - + folha_obj = self.env['hr.payslip'] + data_fim = min([fim, + datetime.strptime(self.date_to, + '%Y-%m-%d')]) domain = [ - ('date_to', '>=', fields.Date.to_string(dt_data_de_inicio)), - ('date_from', '<=', fields.Date.to_string(data_fim)), + # ('date_from', '>=', periodo.inicio_aquisitivo), + # ('date_from', '<=', data_fim), + ('date_to', '>=', periodo.inicio_aquisitivo), + ('date_to', '<=', data_fim), ('contract_id', '=', self.contract_id.id), ('tipo_de_folha', '=', 'normal'), ('state', 'in', ['done', 'verify']), From f2b2e7eb6bf3558c913757026dc914fffdb480e3 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 13 Mar 2018 21:38:57 -0300 Subject: [PATCH 688/787] [FIX] Computar com a media cheia independente do saldo do periodo aquisitivo --- l10n_br_hr_payroll/models/hr_payslip.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index dc9e06001..619a53400 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -937,7 +937,13 @@ def MEDIA_RUBRICA(self, codigo): if linha.code == codigo: valor += linha.total - media += ((valor / 12) / 30) * periodo.saldo + # Conforme e-mail enviado pela GECON-ABGF no dia 14/03/2018 às + # 16h52, foi considerado para o cálculo das médias o mês "cheio" + # e para o cálculo dos avos, foi aplicada a regra dos 15 dias de + # trab. + + media = valor / 12 + # media += ((valor / 12) / 30) * periodo.saldo return media From 1e4265749d8e42f92bb9311fae0648a50a04421b Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 13 Mar 2018 22:05:13 -0300 Subject: [PATCH 689/787] [FIX] Ajuste para nao processar rubricas especificas no 13 salario --- l10n_br_hr_payroll/models/hr_payslip.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index a07a9b823..ecf1bcc6c 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1805,10 +1805,10 @@ def sum(self, code, from_date, to_date=None): structure_ids).get_all_rules() applied_specific_rule = {} - # Caso nao esteja computando holerite de provisão de ferias - # recuperar as regras especificas do contrato + # Caso nao esteja computando holerite de provisão de ferias ou + # de decimo terceiro recuperar as regras especificas do contrato if not payslip.tipo_de_folha in \ - ['provisao_ferias', 'provisao_decimo_terceiro']: + ['provisao_ferias', 'provisao_decimo_terceiro', 'decimo_terceiro']: applied_specific_rule = payslip.get_contract_specific_rubrics( contract_ids, rule_ids) From 73b60fdce03ded6881095faab7c67846683498db Mon Sep 17 00:00:00 2001 From: Douglas Ferreira Date: Tue, 13 Mar 2018 22:55:17 -0300 Subject: [PATCH 690/787] =?UTF-8?q?[FIX]=20Ocultar=20contratos=20quando=20?= =?UTF-8?q?os=20holerites=20forem=20gerados=20em=20adiantamento=20de=2013?= =?UTF-8?q?=C2=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip_run.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index 4b990b527..d2aea10e9 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -159,6 +159,12 @@ def verificar_holerites_gerados(self): # Buscar contratos validos contracts_id = self.env['hr.contract'].search(dominio_contratos) + # Caso o tipo de lote for "Adiantamento de 13º", deverá ser trocado + # por "decimo_terceiro", já que os holerites são criados com esse + # tipo + if self.tipo_de_folha == 'adiantamento_13': + self.tipo_de_folha = 'decimo_terceiro' + # buscar payslip ja processadas dos contratos validos dominio_payslips = [ ('tipo_de_folha', '=', self.tipo_de_folha), From 26dd194476b24aadfbf6828cd220caf20356c8bd Mon Sep 17 00:00:00 2001 From: Douglas Ferreira Date: Tue, 13 Mar 2018 23:02:22 -0300 Subject: [PATCH 691/787] =?UTF-8?q?[FIX]=20Corre=C3=A7=C3=A3o=20no=20calcu?= =?UTF-8?q?lo=20da=20base=20do=20FGTS=20no=20tipo=20de=20folha=20adiantame?= =?UTF-8?q?nto=20de=2013=C2=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reports/payslip_report_analitico.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py index 564678e6f..6385e8a8b 100644 --- a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py +++ b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py @@ -241,8 +241,12 @@ def analytic_report(pool, cr, uid, local_context, context): total_descontos += rubrica['sum'] if rubrica['category'] == 'INSS': inss_funcionario_retido += rubrica['sum'] - if rubrica['code'] == 'BASE_FGTS': - base_fgts = rubrica['sum'] + if wizard.tipo_de_folha == "('decimo_terceiro')": + if rubrica['code'] == 'BASE_FGTS_13': + base_fgts = rubrica['sum'] + else: + if rubrica['code'] == 'BASE_FGTS': + base_fgts = rubrica['sum'] # if rubrica['code'] == 'FGTS': # fgts = rubrica['sum'] From 3e7d477ecbf74886ae837c4176910dcc99f58a7c Mon Sep 17 00:00:00 2001 From: Douglas Ferreira Date: Tue, 13 Mar 2018 23:45:52 -0300 Subject: [PATCH 692/787] =?UTF-8?q?[FIX]=20Corre=C3=A7=C3=A3o=20no=20tipo?= =?UTF-8?q?=20de=20folha?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip_run.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index d2aea10e9..ed2906d32 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -163,11 +163,13 @@ def verificar_holerites_gerados(self): # por "decimo_terceiro", já que os holerites são criados com esse # tipo if self.tipo_de_folha == 'adiantamento_13': - self.tipo_de_folha = 'decimo_terceiro' + tipo_de_folha = 'decimo_terceiro' + else: + tipo_de_folha = self.tipo_de_folha # buscar payslip ja processadas dos contratos validos dominio_payslips = [ - ('tipo_de_folha', '=', self.tipo_de_folha), + ('tipo_de_folha', '=', tipo_de_folha), ('contract_id', 'in', contracts_id.ids) ] From fd24438995d1ef64229a530b56cd0ee1c1b1409a Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Wed, 14 Mar 2018 09:54:01 -0300 Subject: [PATCH 693/787] [FIX] COntabilizando a provisao proporcionalmente --- l10n_br_hr_payroll/models/hr_payslip.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index ecf1bcc6c..d182b1c28 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -927,8 +927,8 @@ def MEDIA_RUBRICA(self, codigo): # e para o cálculo dos avos, foi aplicada a regra dos 15 dias de # trab. - media = valor / 12 - # media += ((valor / 12) / 30) * periodo.saldo + # media = valor / 12 + media += ((valor / 12) / 30) * periodo.saldo return media From e6d2efcfb2cda57a42397cf3d8828508fbef074e Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Wed, 14 Mar 2018 09:54:01 -0300 Subject: [PATCH 694/787] [FIX] COntabilizando a provisao proporcionalmente --- l10n_br_hr_payroll/models/hr_payslip.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index ecf1bcc6c..d182b1c28 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -927,8 +927,8 @@ def MEDIA_RUBRICA(self, codigo): # e para o cálculo dos avos, foi aplicada a regra dos 15 dias de # trab. - media = valor / 12 - # media += ((valor / 12) / 30) * periodo.saldo + # media = valor / 12 + media += ((valor / 12) / 30) * periodo.saldo return media From d93093c5ecf8e3ce3cb657a7502f4df147864aee Mon Sep 17 00:00:00 2001 From: Douglas Ferreira Date: Wed, 14 Mar 2018 12:10:11 -0300 Subject: [PATCH 695/787] =?UTF-8?q?[FIX]=20Adicionar=20a=20base=20do=20FGT?= =?UTF-8?q?S=20de=2013=C2=BA=20=C3=A0=20soma=20da=20base=20que=20aparece?= =?UTF-8?q?=20em=20cada=20holerite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index d182b1c28..383c034d4 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -163,8 +163,8 @@ def _compute_valor_total_folha(self): total += line.valor_provento - line.valor_deducao total_proventos += line.valor_provento total_descontos += line.valor_deducao - if line.code == 'BASE_FGTS': - base_fgts = line.total + if line.code in ['BASE_FGTS', 'BASE_FGTS_13']: + base_fgts += line.total elif line.code == 'BASE_INSS': base_inss = line.total elif line.code == 'BASE_IRPF': From 86036ee6d1196ad839d0ed9b503218f5b0960f9f Mon Sep 17 00:00:00 2001 From: Douglas Ferreira Date: Wed, 14 Mar 2018 12:12:39 -0300 Subject: [PATCH 696/787] =?UTF-8?q?[FIX]=20Mudan=C3=A7a=20no=20entendiment?= =?UTF-8?q?o=20na=20condi=C3=A7=C3=A3o=20da=20soma=20da=20base=20de=20fgts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reports/payslip_report_analitico.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py index 6385e8a8b..b2e22cb57 100644 --- a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py +++ b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py @@ -241,11 +241,7 @@ def analytic_report(pool, cr, uid, local_context, context): total_descontos += rubrica['sum'] if rubrica['category'] == 'INSS': inss_funcionario_retido += rubrica['sum'] - if wizard.tipo_de_folha == "('decimo_terceiro')": - if rubrica['code'] == 'BASE_FGTS_13': - base_fgts = rubrica['sum'] - else: - if rubrica['code'] == 'BASE_FGTS': + if rubrica['code'] in ['BASE_FGTS', 'BASE_FGTS_13']: base_fgts = rubrica['sum'] # if rubrica['code'] == 'FGTS': # fgts = rubrica['sum'] From a628d882aff612f8f018a0098e12d0c366842372 Mon Sep 17 00:00:00 2001 From: Douglas Ferreira Date: Wed, 14 Mar 2018 12:32:52 -0300 Subject: [PATCH 697/787] =?UTF-8?q?[FIX]=20Melhoria=20de=20c=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll_report/reports/payslip_report_analitico.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py index b2e22cb57..ce327fd5f 100644 --- a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py +++ b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py @@ -242,7 +242,7 @@ def analytic_report(pool, cr, uid, local_context, context): if rubrica['category'] == 'INSS': inss_funcionario_retido += rubrica['sum'] if rubrica['code'] in ['BASE_FGTS', 'BASE_FGTS_13']: - base_fgts = rubrica['sum'] + base_fgts += rubrica['sum'] # if rubrica['code'] == 'FGTS': # fgts = rubrica['sum'] From 97f069b0a4ff204da129a0d63972fb0c3ddd4967 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Wed, 14 Mar 2018 14:37:35 -0300 Subject: [PATCH 698/787] [FIX] Busca do adiantamento estava duplicada --- l10n_br_hr_payroll/models/hr_payslip.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index d182b1c28..f33f56107 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1525,7 +1525,7 @@ def busca_adiantamento_13(self): :return: float - Valor pago neste ano ''' domain = [ - ('tipo_de_folha', 'in', ['normal', 'decimo_terceiro', 'ferias']), + ('tipo_de_folha', 'in', ['decimo_terceiro', 'ferias']), ('contract_id', '=', self.contract_id.id), ('state', 'in', ['done', 'verify']), ('ano', '=', self.ano), From de73a0391f65a42c1cb97e4102ce9ecdcb4e2f82 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Wed, 14 Mar 2018 14:37:51 -0300 Subject: [PATCH 699/787] [FIX] Correcoes das bases dos INSS --- l10n_br_hr_payroll/models/hr_payslip.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index f33f56107..1cffea846 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -165,8 +165,8 @@ def _compute_valor_total_folha(self): total_descontos += line.valor_deducao if line.code == 'BASE_FGTS': base_fgts = line.total - elif line.code == 'BASE_INSS': - base_inss = line.total + elif line.code in ['BASE_INSS', 'BASE_INSS_13']: + base_inss += line.total elif line.code == 'BASE_IRPF': base_irpf = line.total elif line.code == 'FGTS': From 6e673d54a3674dcd991fa658b1a8490afb644387 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Wed, 14 Mar 2018 17:10:21 -0300 Subject: [PATCH 700/787] [FIX] Incluindo parametros da rescisao no sefip --- l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index 5e8ea4927..3567764c1 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -1505,11 +1505,11 @@ def _preencher_registro_32(self, sefip, folha): """ tipo_afastamento = folha.struct_id.tipo_afastamento_sefip - sefip.trabalhador_codigo_movimentacao = tipo_afastamento or '' - sefip.trabalhador_data_movimentacao = folha.data_afastamento or '' - # No exemplo de SEFIP da ABGF todos os registros 32 tem o seguinte - # campo em branco - sefip.trabalhador_indic_recolhimento_fgts = ' ' + sefip.trabalhador_codigo_movimentacao = tipo_afastamento or ' ' + sefip.trabalhador_data_movimentacao = \ + formata_data(folha.data_afastamento) or '' + # Gerado GRRF + sefip.trabalhador_indic_recolhimento_fgts = 'S' return sefip._registro_32_movimentacao_do_trabalhador() From b5cf4a3c547be0910d2cf2c30fe7d9da22cf3192 Mon Sep 17 00:00:00 2001 From: Douglas Ferreira Date: Wed, 14 Mar 2018 17:40:44 -0300 Subject: [PATCH 701/787] =?UTF-8?q?[FIX]=20O=20relat=C3=B3rio=20anal=C3=AD?= =?UTF-8?q?tico=20n=C3=A3o=20pegar=20mais=20as=20simula=C3=A7=C3=B5es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll_report/reports/payslip_report_analitico.py | 1 + 1 file changed, 1 insertion(+) diff --git a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py index ce327fd5f..77c67dfc5 100644 --- a/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py +++ b/l10n_br_hr_payroll_report/reports/payslip_report_analitico.py @@ -75,6 +75,7 @@ def analytic_report(pool, cr, uid, local_context, context): ('mes_do_ano', '=', wizard.mes_do_ano), ('ano', '=', wizard.ano), ('state', 'in', ['done', 'verify']), + ('is_simulacao', '=', False), ] if wizard.tipo_de_folha == "('normal', 'rescisao')": busca.append(('tipo_de_folha', 'in', eval(wizard.tipo_de_folha))) From a59b79320087d1affd87c187a69ddb82f19a3c09 Mon Sep 17 00:00:00 2001 From: Douglas Ferreira Date: Thu, 15 Mar 2018 00:29:49 -0300 Subject: [PATCH 702/787] =?UTF-8?q?[FIX]=20Corre=C3=A7=C3=A3o=20na=20exibi?= =?UTF-8?q?=C3=A7=C3=A3o=20da=20recis=C3=A3o=20no=20relat=C3=B3rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll_report/data/analitico.odt | Bin 36498 -> 39942 bytes .../data/old_analitico.odt | Bin 0 -> 36498 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 l10n_br_hr_payroll_report/data/old_analitico.odt diff --git a/l10n_br_hr_payroll_report/data/analitico.odt b/l10n_br_hr_payroll_report/data/analitico.odt index 9161a9bb986cfb2f2ab85085899bbd68b03f038c..1b683728e8b2210350b48fc189a02b3a453316b4 100644 GIT binary patch delta 26184 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 delta 22573 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 Date: Thu, 15 Mar 2018 00:38:05 -0300 Subject: [PATCH 703/787] [FIX] sefip sem remuneracao --- l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index 3567764c1..8af07aa55 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -1161,6 +1161,9 @@ def _trabalhador_remun_13(self, folha): # Não pode ser informado para a competência 13 # if folha.tipo_de_folha == 'rescisao': + + result += self._valor_rubrica(folha.line_ids, "DESCONTO_ADIANTAMENTO_13") + return result # # @@ -1185,8 +1188,7 @@ def _trabalhador_remun_13(self, folha): # result = 0.00 # return result - return self._valor_rubrica( - folha.line_ids, 'ADIANTAMENTO_13_FERIAS') + return self._valor_rubrica(folha.line_ids, 'ADIANTAMENTO_13_FERIAS') def _trabalhador_classe_contrib(self, folha): """ Registro 30. Item 18 From 72d5cdddb67b3a6fe46eb785ccb78e3be3111660 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 15 Mar 2018 14:00:15 -0300 Subject: [PATCH 704/787] [FIX] Ajuste nas comparacoes do tipo de lote para processar contabilizacao no lote de decimo terceiro salario --- .../models/l10n_br_hr_payroll_run_account.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py index fe03b91ba..e65df2f2a 100644 --- a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py +++ b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py @@ -10,6 +10,7 @@ NOME_LANCAMENTO_LOTE = { 'provisao_ferias': u'Provisão de Férias em Lote', + 'adiantamento_13': u'Décimo Terceiro Salário em Lote', 'provisao_decimo_terceiro': u'Provisão de 13 em Lote', 'normal': u'Folha normal em Lote', } @@ -100,7 +101,7 @@ def _buscar_contas_lotes(self): if self.tipo_de_folha == "normal": return self.holerite_normal_account_debit, self.\ holerite_normal_account_credit - elif self.tipo_de_folha == "decimo_terceiro": + elif self.tipo_de_folha in ["decimo_terceiro",'adiantamento_13']: return self.decimo_13_account_debit, self.\ decimo_13_account_credit elif self.tipo_de_folha == "provisao_ferias": @@ -171,7 +172,7 @@ def _valor_lancamento_lote_anterior_rubrica(self, rubrica): return \ rubrica.salary_rule_id.ferias_account_debit, \ rubrica.salary_rule_id.ferias_account_credit - if self.tipo_de_folha == "decimo_terceiro": + if self.tipo_de_folha in ["decimo_terceiro", 'adiantamento_13']: return \ rubrica.salary_rule_id.decimo_13_account_debit, \ rubrica.salary_rule_id.decimo_13_account_credit @@ -202,6 +203,10 @@ def _verificar_existencia_conta_rubrica(self, rubrica, tipo_de_folha): if rubrica.holerite_normal_account_debit or \ rubrica.holerite_normal_account_credit: return True + elif tipo_de_folha in ['adiantamento_13', 'decimo_terceiro']: + if rubrica.decimo_13_account_debit or \ + rubrica.decimo_13_account_credit: + return True else: return False @@ -239,13 +244,15 @@ def processar_folha(self): @api.multi def processar_contabilidade_folha(self, rubricas): - conta_debito, conta_credito = self._buscar_contas_lotes() - + """ + :param rubricas: + :return: + """ for payslip_run in self: move_obj = self.env['account.move'] period_obj = self.env['account.period'] - precision = \ - self.env['decimal.precision'].precision_get('Payroll') + precision = self.env['decimal.precision'].precision_get('Payroll') + timenow = time.strftime('%Y-%m-%d') period_id = period_obj.find(payslip_run.date_start) debit_sum = 0.0 From 3390ab24fd8a36cbef8e506a48f5a5b42da00c28 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 15 Mar 2018 14:36:06 -0300 Subject: [PATCH 705/787] [FIX] Na Folha de adiantamento as contas devem serem setadas no mesmo campo em que os holerites normais --- .../models/l10n_br_hr_payroll_run_account.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py index e65df2f2a..3b88bc702 100644 --- a/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py +++ b/l10n_br_hr_payroll_account/models/l10n_br_hr_payroll_run_account.py @@ -164,7 +164,7 @@ def _verificar_lancamentos_lotes_anteriores(self, tipo_folha, period_id): @api.multi def _valor_lancamento_lote_anterior_rubrica(self, rubrica): - if self.tipo_de_folha == "normal": + if self.tipo_de_folha in ["normal", 'adiantamento_13']: return \ rubrica.salary_rule_id.holerite_normal_account_debit, \ rubrica.salary_rule_id.holerite_normal_account_credit @@ -172,7 +172,7 @@ def _valor_lancamento_lote_anterior_rubrica(self, rubrica): return \ rubrica.salary_rule_id.ferias_account_debit, \ rubrica.salary_rule_id.ferias_account_credit - if self.tipo_de_folha in ["decimo_terceiro", 'adiantamento_13']: + if self.tipo_de_folha in ["decimo_terceiro"]: return \ rubrica.salary_rule_id.decimo_13_account_debit, \ rubrica.salary_rule_id.decimo_13_account_credit @@ -199,11 +199,11 @@ def _verificar_existencia_conta_rubrica(self, rubrica, tipo_de_folha): if rubrica.provisao_13_account_debit or \ rubrica.provisao_13_account_credit: return True - elif tipo_de_folha == "normal": + elif tipo_de_folha in ["normal", 'adiantamento_13']: if rubrica.holerite_normal_account_debit or \ rubrica.holerite_normal_account_credit: return True - elif tipo_de_folha in ['adiantamento_13', 'decimo_terceiro']: + elif tipo_de_folha in ['decimo_terceiro']: if rubrica.decimo_13_account_debit or \ rubrica.decimo_13_account_credit: return True From 7bd9f2b8e07839e0c70495ece0d88ccffbd70033 Mon Sep 17 00:00:00 2001 From: Douglas Ferreira Date: Thu, 15 Mar 2018 14:46:19 -0300 Subject: [PATCH 706/787] [FIX] Verificar a data de nascimento do dependente para calcular o IRPF --- l10n_br_hr_payroll/models/hr_payslip.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 846e95794..596d310c0 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -860,7 +860,8 @@ def BASE_IRRF(self, TOTAL_IRRF, INSS): ) dependent_values = 0 for dependente in self.employee_id.dependent_ids: - if dependente.dependent_verification: + if dependente.dependent_verification and \ + dependente.dependent_dob Date: Thu, 15 Mar 2018 15:56:07 -0300 Subject: [PATCH 707/787] Update hr_payslip.py --- l10n_br_hr_payroll/models/hr_payslip.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 596d310c0..6ebb626f2 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -861,7 +861,7 @@ def BASE_IRRF(self, TOTAL_IRRF, INSS): dependent_values = 0 for dependente in self.employee_id.dependent_ids: if dependente.dependent_verification and \ - dependente.dependent_dob Date: Thu, 15 Mar 2018 16:03:39 -0300 Subject: [PATCH 708/787] [FIX] Ajuste nos Comparativos de datas no calculo das medias --- l10n_br_hr_payroll/models/hr_payslip.py | 26 ++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 846e95794..b1cc78d90 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -883,27 +883,31 @@ def MEDIA_RUBRICA(self, codigo): # media = 0 periodo = self.periodo_aquisitivo + folha_obj = self.env['hr.payslip'] + if periodo.saldo != 0: # # Buscar Holerites do Período # - inicio = datetime.strptime( + dt_inicio_aquis = datetime.strptime( periodo.inicio_aquisitivo, '%Y-%m-%d') - fim = datetime.strptime( + + dt_fim_aquis = datetime.strptime( periodo.fim_aquisitivo, '%Y-%m-%d') - r = relativedelta(fim, inicio) + + r = relativedelta(dt_fim_aquis, dt_inicio_aquis) + meses = r.months if r.days >= 15: meses += 1 - folha_obj = self.env['hr.payslip'] - data_fim = min([fim, - datetime.strptime(self.date_to, - '%Y-%m-%d')]) + + # Se tem data de demissao pegar a menor data + data_fim = min([dt_fim_aquis, + datetime.strptime(self.date_to, '%Y-%m-%d')]) + domain = [ - # ('date_from', '>=', periodo.inicio_aquisitivo), - # ('date_from', '<=', data_fim), ('date_to', '>=', periodo.inicio_aquisitivo), - ('date_to', '<=', data_fim), + ('date_from', '<=', fields.Date.to_string(data_fim)), ('contract_id', '=', self.contract_id.id), ('tipo_de_folha', '=', 'normal'), ('state', 'in', ['done', 'verify']), @@ -917,7 +921,7 @@ def MEDIA_RUBRICA(self, codigo): # valor = 0 for holerite in folhas_periodo: - if holerite.date_to <= fields.Date.to_string(data_fim): + if holerite.date_from <= fields.Date.to_string(data_fim): for linha in holerite.line_ids: if linha.code == codigo: valor += linha.total From cde211a1d795d533ec66a7f9dec6f2620c9054db Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 15 Mar 2018 19:26:55 -0300 Subject: [PATCH 709/787] [FIX] Refactory na funcao que calcula as medias de substituicao --- l10n_br_hr_payroll/models/hr_payslip.py | 37 ++++++++----------------- 1 file changed, 11 insertions(+), 26 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 3af12676e..148ff7361 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -877,43 +877,29 @@ def IRRF(self, BASE_IRRF, INSS): return 0 def MEDIA_RUBRICA(self, codigo): - + media = 0 if self.tipo_de_folha in ['ferias', 'provisao_ferias']: # # Identifica os períodos aquisitivos com saldo de férias # - media = 0 periodo = self.periodo_aquisitivo - folha_obj = self.env['hr.payslip'] + + # Seta a Data final do aquisitivo apartir da inicial, para sempre + # pegar os holerites validos do periodo cheio + dt_fim = fields.Datetime.from_string(periodo.inicio_aquisitivo) + relativedelta(years=1, days=-1) if periodo.saldo != 0: # - # Buscar Holerites do Período + # Buscar Holerites do Período Aquisitivo # - dt_inicio_aquis = datetime.strptime( - periodo.inicio_aquisitivo, '%Y-%m-%d') - - dt_fim_aquis = datetime.strptime( - periodo.fim_aquisitivo, '%Y-%m-%d') - - r = relativedelta(dt_fim_aquis, dt_inicio_aquis) - - meses = r.months - if r.days >= 15: - meses += 1 - - # Se tem data de demissao pegar a menor data - data_fim = min([dt_fim_aquis, - datetime.strptime(self.date_to, '%Y-%m-%d')]) - domain = [ ('date_to', '>=', periodo.inicio_aquisitivo), - ('date_from', '<=', fields.Date.to_string(data_fim)), + ('date_to', '<', str(dt_fim.date())), ('contract_id', '=', self.contract_id.id), ('tipo_de_folha', '=', 'normal'), ('state', 'in', ['done', 'verify']), ] - folhas_periodo = folha_obj.search(domain) + folhas_periodo = self.env['hr.payslip'].search(domain) folhas_periodo = \ folhas_periodo.sorted(key=lambda r: r.date_from) @@ -922,10 +908,9 @@ def MEDIA_RUBRICA(self, codigo): # valor = 0 for holerite in folhas_periodo: - if holerite.date_from <= fields.Date.to_string(data_fim): - for linha in holerite.line_ids: - if linha.code == codigo: - valor += linha.total + for linha in holerite.line_ids: + if linha.code == codigo: + valor += linha.total # Conforme e-mail enviado pela GECON-ABGF no dia 14/03/2018 às # 16h52, foi considerado para o cálculo das médias o mês "cheio" From c1a4b2b52d730b92df2c32baad005bb07e50f9ec Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Thu, 15 Mar 2018 20:48:01 -0300 Subject: [PATCH 710/787] [FIX] Buscar remuneracao 13 dos funcionarios para compor sefip --- .../models/l10n_br_hr_sefip.py | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index 8af07aa55..11b0baa69 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -1157,14 +1157,23 @@ def _trabalhador_remun_13(self, folha): """ result = 0.00 - # - # Não pode ser informado para a competência 13 - # - if folha.tipo_de_folha == 'rescisao': - result += self._valor_rubrica(folha.line_ids, "DESCONTO_ADIANTAMENTO_13") + result += self._valor_rubrica(folha.line_ids, 'ADIANTAMENTO_13_FERIAS') - return result + # Buscar folha de 13 salario + folha_ids = self.env['hr.payslip'].search([ + ('ano', '=', self.ano), + ('tipo_de_folha', 'in', ['decimo_terceiro']), + ('state', 'in', ['done','verify']), + ('contract_id', '=', folha.contract_id.id), + # ('company_id.partner_id.cnpj_cpf', 'like', raiz) + ], limit=1) + + if folha_ids: + result += \ + self._valor_rubrica(folha_ids.line_ids, "PRIMEIRA_PARCELA_13") + + return result # # # # As remunerações pagas após rescisão do contrato de trabalho e @@ -1188,7 +1197,7 @@ def _trabalhador_remun_13(self, folha): # result = 0.00 # return result - return self._valor_rubrica(folha.line_ids, 'ADIANTAMENTO_13_FERIAS') + # return self._valor_rubrica(folha.line_ids, 'ADIANTAMENTO_13_FERIAS') def _trabalhador_classe_contrib(self, folha): """ Registro 30. Item 18 From 3e84edd2b5dffb793dd178a388a07eb2b364f864 Mon Sep 17 00:00:00 2001 From: the-bmb Date: Wed, 14 Mar 2018 20:23:37 -0300 Subject: [PATCH 711/787] =?UTF-8?q?[FIX]=20pensao=20f=C3=A9rias=20holerite?= =?UTF-8?q?=20folha=20normal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [WIP] 2 - Dar amend --- l10n_br_hr_payroll/models/hr_payslip.py | 64 +++++++++++++++++++++---- 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index abffc571a..86c330560 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1561,19 +1561,65 @@ def rubrica_anterior_total(self, code, mes=-1, tipo_de_folha='normal'): [self.mes_do_ano, mes_anterior])) domain.append(('ano', 'in', anos)) - holerite_anterior = self.search( - domain, order='create_date DESC', limit=1) + holerite = self.search( + domain, order='date_from DESC', limit=1) valores = 0 - if holerite_anterior: - for holerite in holerite_anterior: - if self.date_from <= holerite.date_from <= self.date_to or \ - self.date_from <= holerite.date_to <= self.date_to: - for line in holerite.line_ids: - if line.code == code: - valores += line.total + if holerite: + print 'Lala' + print (self.date_from <= holerite.date_from <= self.date_to or + self.date_from <= holerite.date_to <= self.date_to) + if (self.date_from <= holerite.date_from <= self.date_to or + self.date_from <= holerite.date_to <= self.date_to): + for line in holerite.line_ids: + if line.code == code: + valores += line.total + + return valores + + def rubrica_pensao_alimentar(self): + ''' + :param code: string - Code de identificação da rubrica + :param meses: int [1-12] Identificar um mes especifico + -1 Selecionar o ultimo payslip calculado + :param tipo_de_folha: + :return: + ''' + + domain = [ + ('tipo_de_folha', '=', 'ferias'), + ('contract_id', '=', self.contract_id.id), + ('is_simulacao', '=', False), + ('state', 'in', ['done', 'verify']) + ] + + # Calcula mes_anterior + anos = [self.ano] + mes_anterior = self.mes_do_ano - 1 + if mes_anterior == 0: + mes_anterior = 12 + anos.append(self.ano - 1) + + if self.mes_do_ano and mes_anterior > 0: + domain.append(('mes_do_ano', 'in', [self.mes_do_ano, mes_anterior])) + if mes_anterior == -1: + domain.append(('mes_do_ano', 'in', + [self.mes_do_ano, mes_anterior])) + domain.append(('ano', 'in', anos)) + + holerite = self.search( + domain, order='create_date DESC', limit=1) + + valores = 0 + + if holerite: + if self.date_from <= holerite.date_from <= self.date_to or \ + self.date_from <= holerite.date_to <= self.date_to: + for line in holerite.line_ids: + if line.code == 'PENSAO_ALIMENTICIA': + valores += line.total return valores @api.multi From 52857d80c77716d5592b520db5bb22edb7719877 Mon Sep 17 00:00:00 2001 From: Bruna M Braga Date: Tue, 20 Mar 2018 16:01:25 -0300 Subject: [PATCH 712/787] [REM] print --- l10n_br_hr_payroll/models/hr_payslip.py | 1 - 1 file changed, 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 86c330560..5a9f1bf2f 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1567,7 +1567,6 @@ def rubrica_anterior_total(self, code, mes=-1, tipo_de_folha='normal'): valores = 0 if holerite: - print 'Lala' print (self.date_from <= holerite.date_from <= self.date_to or self.date_from <= holerite.date_to <= self.date_to) if (self.date_from <= holerite.date_from <= self.date_to or From 3fd2a52b048d8bd310489578aba65a9b1c938cb6 Mon Sep 17 00:00:00 2001 From: Douglas Ferreira Date: Wed, 21 Mar 2018 14:20:51 -0300 Subject: [PATCH 713/787] =?UTF-8?q?[FIX]=20Considerar=20tamb=C3=A9m=20os?= =?UTF-8?q?=20lan=C3=A7amentos=20de=20INSS=20de=2013=C2=BA=20sal=C3=A1rio?= =?UTF-8?q?=20na=20soma=20do=20GPS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index 11b0baa69..5c6c34208 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -854,7 +854,7 @@ def gerar_boletos(self): 'qtd_contribuintes'] = 1 contribuicao_sindical[id_sindicato][ 'total_remuneracao'] = remuneracao.total - elif line.code == 'INSS': + elif line.code in ['INSS', 'INSS_13']: empresas[line.slip_id.company_id.id][ 'INSS_funcionarios'] += line.total elif line.code == 'INSS_EMPRESA': From bff4829abf17b57cb0d23d0f7f5b7fc3bee3e97d Mon Sep 17 00:00:00 2001 From: Bruna M Braga Date: Wed, 21 Mar 2018 16:18:37 -0300 Subject: [PATCH 714/787] [REM] print --- l10n_br_hr_payroll/models/hr_payslip.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index 5a9f1bf2f..b673795e1 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -1566,9 +1566,7 @@ def rubrica_anterior_total(self, code, mes=-1, tipo_de_folha='normal'): valores = 0 - if holerite: - print (self.date_from <= holerite.date_from <= self.date_to or - self.date_from <= holerite.date_to <= self.date_to) + if holerite: if (self.date_from <= holerite.date_from <= self.date_to or self.date_from <= holerite.date_to <= self.date_to): for line in holerite.line_ids: From a34f70010e1af21850576d1d98f8a6ef371b1253 Mon Sep 17 00:00:00 2001 From: Douglas Ferreira Date: Wed, 21 Mar 2018 17:35:33 -0300 Subject: [PATCH 715/787] =?UTF-8?q?[FIX]=20Considerar=20tamb=C3=A9m=20os?= =?UTF-8?q?=20lan=C3=A7amentos=20de=20IRPF=20de=2013=C2=BA=20sal=C3=A1rio?= =?UTF-8?q?=20na=20soma=20do=20DARF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index 5c6c34208..834bc1d2d 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -866,7 +866,7 @@ def gerar_boletos(self): elif line.code == 'INSS_RAT_FAP': empresas[line.slip_id.company_id.id][ 'INSS_rat_fap'] += line.total - elif line.code == 'IRPF': + elif line.code in ['IRPF', 'IRPF_13']: if line.slip_id.contract_id.categoria in \ ['721', '722']: codigo_darf = '0588' From 54ef93b882bce833c7491b45c1aef755077e2d73 Mon Sep 17 00:00:00 2001 From: Douglas Ferreira Date: Thu, 22 Mar 2018 09:19:30 -0300 Subject: [PATCH 716/787] =?UTF-8?q?[FIX]=20Corre=C3=A7=C3=A3o=20na=20gera?= =?UTF-8?q?=C3=A7=C3=A3o=20das=20guias=20em=20PDF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/l10n_br_hr_sefip.py | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index 834bc1d2d..96860d0ba 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -12,13 +12,13 @@ import logging import base64 import pybrasil -import sh from py3o.template import Template from datetime import timedelta from openerp import api, fields, models, _ from openerp.exceptions import ValidationError from pybrasil.valor import formata_valor from pybrasil.data import formata_data +import subprocess from openerp.addons.l10n_br_base.tools.misc import punctuation_rm @@ -630,7 +630,7 @@ def prepara_financial_move_darf(self, codigo_receita, valor): dir_base = os.path.dirname(os.path.dirname(os.path.dirname(CURDIR))) arquivo_template_darf = os.path.join(dir_base, - 'kmee_odoo_addons', + 'odoo-brazil-hr', 'l10n_br_hr_payroll_report', 'data', 'darf.odt' @@ -659,8 +659,11 @@ def prepara_financial_move_darf(self, codigo_receita, valor): template = Template(template_darf, arquivo_temporario.name) template.render(vals_impressao) - sh.libreoffice('--headless', '--invisible', '--convert-to', 'pdf', - '--outdir', '/tmp', arquivo_temporario.name) + + p = subprocess.Popen(['libreoffice', '--headless', '--invisible', + '--convert-to', 'pdf', '--outdir', '/tmp', + arquivo_temporario.name]) + p.wait() pdf = open(arquivo_temporario.name + '.pdf', 'rb').read() @@ -728,7 +731,7 @@ def prepara_financial_move_gps(self, empresa_id, dados_empresa): dir_base = os.path.dirname(os.path.dirname(os.path.dirname(CURDIR))) arquivo_template_gps = os.path.join(dir_base, - 'kmee_odoo_addons', + 'odoo-brazil-hr', 'l10n_br_hr_payroll_report', 'data', 'gps.odt' @@ -761,8 +764,11 @@ def prepara_financial_move_gps(self, empresa_id, dados_empresa): template = Template(template_gps, arquivo_temporario.name) template.render(vals_impressao) - sh.libreoffice('--headless', '--invisible', '--convert-to', 'pdf', - '--outdir', '/tmp', arquivo_temporario.name) + + p = subprocess.Popen(['libreoffice', '--headless', '--invisible', + '--convert-to', 'pdf', '--outdir', '/tmp', + arquivo_temporario.name]) + p.wait() pdf = open(arquivo_temporario.name + '.pdf', 'rb').read() From ffa8fe3e7a21d6310c389900377df7e292f5e616 Mon Sep 17 00:00:00 2001 From: Hendrix Date: Thu, 22 Mar 2018 11:09:00 -0300 Subject: [PATCH 717/787] [FIX] Ajuste para pegar apenas 13 do mes --- l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py | 1 + 1 file changed, 1 insertion(+) diff --git a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py index 96860d0ba..5c9bc96cd 100644 --- a/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py +++ b/l10n_br_hr_arquivos_governo/models/l10n_br_hr_sefip.py @@ -1169,6 +1169,7 @@ def _trabalhador_remun_13(self, folha): # Buscar folha de 13 salario folha_ids = self.env['hr.payslip'].search([ ('ano', '=', self.ano), + ('mes_do_ano', '=', self.mes), ('tipo_de_folha', 'in', ['decimo_terceiro']), ('state', 'in', ['done','verify']), ('contract_id', '=', folha.contract_id.id), From 9f66e307d40b444c579bb616572f5b6f031d024c Mon Sep 17 00:00:00 2001 From: Douglas Ferreira Date: Wed, 28 Mar 2018 11:26:37 -0300 Subject: [PATCH 718/787] =?UTF-8?q?[FIX]=20N=C3=A3o=20permitir=20que=20um?= =?UTF-8?q?=20per=C3=ADodo=20aquisitivo=20de=20f=C3=A9rias=20tenha=20mais?= =?UTF-8?q?=20que=2012=20meses?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_vacation/models/hr_vacation_control.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/l10n_br_hr_vacation/models/hr_vacation_control.py b/l10n_br_hr_vacation/models/hr_vacation_control.py index cddc4a4d0..aa89dbaf1 100644 --- a/l10n_br_hr_vacation/models/hr_vacation_control.py +++ b/l10n_br_hr_vacation/models/hr_vacation_control.py @@ -313,7 +313,15 @@ def _compute_calcular_avos(self): avos_meio = idade_meses(parse_datetime(primeiro_dia_mes_cheio), parse_datetime(ultimo_dia_mes_cheio)) - record.avos = avos_primeiro_mes + avos_meio + avos_ultimo_mes + avos = avos_primeiro_mes + avos_meio + avos_ultimo_mes + + # TODO: Essa correção foi criada para que o sistema não aceite + # mais que 12 avos em um só período, mas deverá ser corrigido + # por uma correção definitiva. + if avos > 12: + avos = 12; + + record.avos = avos # avos_decimal = (date_end - date_begin).days / 30.0 # decimal = avos_decimal - int(avos_decimal) From 226db460c34351282ec4d38189afde104fd12051 Mon Sep 17 00:00:00 2001 From: Hendrix Date: Wed, 28 Mar 2018 16:54:31 -0300 Subject: [PATCH 719/787] =?UTF-8?q?[FIX]=20Geracao=20controle=20de=20f?= =?UTF-8?q?=C3=A9rias=20para=20funcionarios=20com=20vinculos=20cedentes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_vacation/models/hr_contract.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/l10n_br_hr_vacation/models/hr_contract.py b/l10n_br_hr_vacation/models/hr_contract.py index 1910ecf9d..25fa6453c 100644 --- a/l10n_br_hr_vacation/models/hr_contract.py +++ b/l10n_br_hr_vacation/models/hr_contract.py @@ -150,6 +150,12 @@ def action_button_update_controle_ferias( # Criar os períodos aquisitivos # inicio = fields.Date.from_string(contrato.date_start) + + # para casos como funcionario cedente, utilizar a data de + # admissao no orgao cedente + if self.data_admissao_cedente: + inicio = fields.Date.from_string(self.data_admissao_cedente) + hoje = fields.Date.from_string(data_referencia) while inicio <= hoje: From 86b6070bb6e3a9c4f329c7be14e99a04d34e4f95 Mon Sep 17 00:00:00 2001 From: Hendrix Date: Wed, 28 Mar 2018 16:55:04 -0300 Subject: [PATCH 720/787] =?UTF-8?q?[FIX]=20Nome=20para=20holidays=20do=20t?= =?UTF-8?q?ipo=20ADD=20de=20f=C3=A9rias,=20afim=20de=20identificar=20o=20p?= =?UTF-8?q?eriodo=20aquisitivo=20correto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_vacation/models/hr_holidays.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/l10n_br_hr_vacation/models/hr_holidays.py b/l10n_br_hr_vacation/models/hr_holidays.py index debbab83e..64bfe7028 100644 --- a/l10n_br_hr_vacation/models/hr_holidays.py +++ b/l10n_br_hr_vacation/models/hr_holidays.py @@ -233,6 +233,17 @@ def _compute_name_holiday(self): holiday.holiday_status_id.name[:30] + \ ' (' + date_from + '-' + date_to + ')' + elif holiday.holiday_status_id and holiday.employee_id: + holiday.name = holiday.holiday_status_id.name[:30] + \ + '[' + holiday.employee_id.name[:10] + '] ' + + if holiday.controle_ferias_ids and holiday.type == 'add': + holiday.name = \ + 'Periodo Aquisitivo ' + \ + ' (' + data.formata_data(holiday.controle_ferias_ids[0].inicio_aquisitivo) + \ + ' - ' + \ + data.formata_data(holiday.controle_ferias_ids[0].fim_aquisitivo) + ') ' + @api.onchange('data_inicio', 'data_fim', 'date_from', 'date_to') def setar_datas_core(self): for holiday in self: From ab9223605b96c31006a4fda3d3b1f7e1863dced0 Mon Sep 17 00:00:00 2001 From: Hendrix Date: Thu, 29 Mar 2018 12:11:39 -0300 Subject: [PATCH 721/787] [ADD] test hubflow --- test | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test diff --git a/test b/test new file mode 100644 index 000000000..e69de29bb From 94207bfc1a6a77b874ef10f4e25862fe2546a7df Mon Sep 17 00:00:00 2001 From: Hendrix Date: Thu, 29 Mar 2018 15:09:16 -0300 Subject: [PATCH 722/787] [FIX] Ajuste para setar o holidays tipo ADD --- l10n_br_hr_vacation/models/hr_vacation_control.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_vacation/models/hr_vacation_control.py b/l10n_br_hr_vacation/models/hr_vacation_control.py index aa89dbaf1..d59d7fecd 100644 --- a/l10n_br_hr_vacation/models/hr_vacation_control.py +++ b/l10n_br_hr_vacation/models/hr_vacation_control.py @@ -141,7 +141,7 @@ class HrVacationControl(models.Model): display_name = fields.Char( string=u'Display name', compute='_compute_display_name', - store=True + store=True, ) # @api.depends('hr_holiday_ids') @@ -170,7 +170,7 @@ def _compute_display_name(self): ) nome = '%s - %s' % ( inicio_aquisitivo.strftime('%d/%m/%y'), - fim_aquisitivo.strftime('%d/%m/%y') + fim_aquisitivo.strftime('%d/%m/%y'), ) controle_ferias.display_name = nome @@ -379,6 +379,7 @@ def gerar_holidays_ferias(self): 'sold_vacations_days': 0, 'number_of_days_temp': 30, 'controle_ferias': [(6, 0, [self.id])], + 'controle_ferias_ids': [(6, 0, [self.id])], }) return holiday_id From 580c4c674ed4e66c3ba189cf9cc3e2503b609a13 Mon Sep 17 00:00:00 2001 From: Hendrix Date: Thu, 29 Mar 2018 15:11:46 -0300 Subject: [PATCH 723/787] [ADD] Campo para informacao do periodo aquisitivo no holerite de provisao --- l10n_br_hr_payroll/models/hr_payslip_run.py | 20 ++++++++++++++++++++ l10n_br_hr_payroll/views/hr_payslip.xml | 3 +++ l10n_br_hr_vacation/models/__init__.py | 1 + l10n_br_hr_vacation/models/hr_payslip.py | 16 ++++++++++++++++ 4 files changed, 40 insertions(+) create mode 100644 l10n_br_hr_vacation/models/hr_payslip.py diff --git a/l10n_br_hr_payroll/models/hr_payslip_run.py b/l10n_br_hr_payroll/models/hr_payslip_run.py index ed2906d32..0fb64b1be 100644 --- a/l10n_br_hr_payroll/models/hr_payslip_run.py +++ b/l10n_br_hr_payroll/models/hr_payslip_run.py @@ -5,6 +5,7 @@ from datetime import datetime from dateutil.relativedelta import relativedelta from pybrasil.data import ultimo_dia_mes +from pybrasil.data import formata_data import logging from openerp import api, fields, models, _ @@ -240,20 +241,37 @@ def verificar_holerites_gerados(self): def gerar_holerites(self): self.verificar_holerites_gerados() for contrato in self.contract_id: + # Provisionamento de férias if self.tipo_de_folha == 'provisao_ferias': + + # recuperar primeiro dia do mes inicio_mes = str(self.ano).zfill(4) + '-' + \ str(self.mes_do_ano).zfill(2) + '-01' + + # se o contrato iniciou na metade do mes corrente + # ex.: provisionando mes março e contrato iniciou 15/03 if contrato.date_start > inicio_mes: inicio_mes = contrato.date_start + data_inicio = fields.Date.to_string(ultimo_dia_mes(inicio_mes)) + contrato.action_button_update_controle_ferias( data_referencia=data_inicio) + for periodo in contrato.vacation_control_ids: if periodo.saldo > 0 and not periodo.inicio_gozo: try: data_fim = fields.Date.from_string(inicio_mes) + \ relativedelta(days=periodo.saldo) payslip_obj = self.env['hr.payslip'] + + periodo_aquisitivo_provisao = \ + str(int(periodo.saldo)) + \ + ' dias referente à ' + \ + formata_data(periodo.inicio_aquisitivo) + \ + ' - ' + \ + formata_data(periodo.fim_aquisitivo) + payslip = payslip_obj.create({ 'contract_id': contrato.id, 'periodo_aquisitivo': periodo.id, @@ -265,6 +283,8 @@ def gerar_holerites(self): 'employee_id': contrato.employee_id.id, 'tipo_de_folha': self.tipo_de_folha, 'payslip_run_id': self.id, + 'periodo_aquisitivo_provisao': + periodo_aquisitivo_provisao, }) # payslip._compute_set_dates() payslip.compute_sheet() diff --git a/l10n_br_hr_payroll/views/hr_payslip.xml b/l10n_br_hr_payroll/views/hr_payslip.xml index 3e2d3e5bb..751d28bf7 100644 --- a/l10n_br_hr_payroll/views/hr_payslip.xml +++ b/l10n_br_hr_payroll/views/hr_payslip.xml @@ -261,6 +261,9 @@ + + diff --git a/l10n_br_hr_vacation/models/__init__.py b/l10n_br_hr_vacation/models/__init__.py index 784f468c2..0da543040 100644 --- a/l10n_br_hr_vacation/models/__init__.py +++ b/l10n_br_hr_vacation/models/__init__.py @@ -6,3 +6,4 @@ from . import hr_holidays from . import hr_vacation_control from . import res_config +from . import hr_payslip diff --git a/l10n_br_hr_vacation/models/hr_payslip.py b/l10n_br_hr_vacation/models/hr_payslip.py new file mode 100644 index 000000000..d7cec9722 --- /dev/null +++ b/l10n_br_hr_vacation/models/hr_payslip.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 KMEE Hendrix Costa +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp import fields, models + + +class HrPayslip(models.Model): + + _inherit = 'hr.payslip' + + periodo_aquisitivo_provisao = fields.Char( + string=u'Período Aquisitivo do Calculo', + readonly=True, + help=u'Campo apenas para informação do período aquisitivo', + ) From c018a5948f152f2cd172858e8c3625e92d034bd2 Mon Sep 17 00:00:00 2001 From: Hendrix Date: Thu, 29 Mar 2018 15:12:26 -0300 Subject: [PATCH 724/787] =?UTF-8?q?[REM]=20Domain=20na=20solicita=C3=A7?= =?UTF-8?q?=C3=A3o=20de=20ferias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_vacation/views/hr_holidays_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_vacation/views/hr_holidays_view.xml b/l10n_br_hr_vacation/views/hr_holidays_view.xml index c38a78919..1bc93e662 100644 --- a/l10n_br_hr_vacation/views/hr_holidays_view.xml +++ b/l10n_br_hr_vacation/views/hr_holidays_view.xml @@ -14,7 +14,7 @@ + domain="[('type', '=', 'add'), ('holiday_status_id', '=', %(l10n_br_hr_holiday.holiday_status_vacation)d), ('contrato_id', '=' , contrato_id)]}"/>

+ + + + +
+ + + + hr.ramal.tree + hr.ramal + + + + + + + + + Ramais + hr.ramal + tree,form + + + + Ramais + + + + + + + + \ No newline at end of file diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_employee.xml b/l10n_br_hr_payroll/views/l10n_br_hr_employee.xml index 16e44e596..0d3863c24 100644 --- a/l10n_br_hr_payroll/views/l10n_br_hr_employee.xml +++ b/l10n_br_hr_payroll/views/l10n_br_hr_employee.xml @@ -13,6 +13,9 @@ 1 + + + From 8d24c7b7012a4cd267cd4d2362bf1fed99dba029 Mon Sep 17 00:00:00 2001 From: Douglas Ferreira Date: Fri, 4 May 2018 11:49:13 -0300 Subject: [PATCH 746/787] [ADD] Criado o modelo de ramais e adicionado campo ramal no employee --- l10n_br_hr_payroll/__openerp__.py | 1 + l10n_br_hr_payroll/models/__init__.py | 1 + l10n_br_hr_payroll/models/hr_employee.py | 10 ++++- l10n_br_hr_payroll/models/hr_ramal.py | 14 ++++++ .../security/ir.model.access.csv | 3 +- .../views/hr_telefonia_view.xml | 44 +++++++++++++++++++ .../views/l10n_br_hr_employee.xml | 3 ++ 7 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 l10n_br_hr_payroll/models/hr_ramal.py create mode 100644 l10n_br_hr_payroll/views/hr_telefonia_view.xml diff --git a/l10n_br_hr_payroll/__openerp__.py b/l10n_br_hr_payroll/__openerp__.py index bb9c38999..2c13a1fe7 100644 --- a/l10n_br_hr_payroll/__openerp__.py +++ b/l10n_br_hr_payroll/__openerp__.py @@ -45,6 +45,7 @@ 'views/l10n_br_hr_rat_fap_view.xml', 'views/l10n_br_hr_social_security_tax_view.xml', 'views/res_config_view.xml', + 'views/hr_telefonia_view.xml', # Alterações Contratuais 'views/l10n_br_hr_contract_change/l10n_br_hr_contract_change_menu.xml', 'views/l10n_br_hr_contract_change/l10n_br_hr_contract_change_base.xml', diff --git a/l10n_br_hr_payroll/models/__init__.py b/l10n_br_hr_payroll/models/__init__.py index a5ca12e5d..7bee18cf6 100644 --- a/l10n_br_hr_payroll/models/__init__.py +++ b/l10n_br_hr_payroll/models/__init__.py @@ -22,3 +22,4 @@ from . import hr_payslip_run from . import res_config from . import hr_holidays +from . import hr_ramal diff --git a/l10n_br_hr_payroll/models/hr_employee.py b/l10n_br_hr_payroll/models/hr_employee.py index 12fd1e988..6de40901e 100644 --- a/l10n_br_hr_payroll/models/hr_employee.py +++ b/l10n_br_hr_payroll/models/hr_employee.py @@ -2,7 +2,7 @@ # Copyright 2017 KMEE # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from openerp import api, models +from openerp import api, models, fields from openerp.exceptions import Warning as UserError @@ -31,3 +31,11 @@ def write(self, vals): u'realizada através do menu ' u'Alterações Contratuais' % dict_key) return super(HrEmployee, self).write(vals) + + ramais = fields.Many2many( + comodel_name='hr.ramal', + relation='employee_ramal_rel', + column1='ramal_id', + column2='employee_id', + string=u'Ramais' + ) diff --git a/l10n_br_hr_payroll/models/hr_ramal.py b/l10n_br_hr_payroll/models/hr_ramal.py new file mode 100644 index 000000000..fbec5f08c --- /dev/null +++ b/l10n_br_hr_payroll/models/hr_ramal.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 KMEE +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp import models, fields + + +class HrRamal(models.Model): + _name = 'hr.ramal' + + name = fields.Char( + string=u'Nº Ramal', + required=True + ) diff --git a/l10n_br_hr_payroll/security/ir.model.access.csv b/l10n_br_hr_payroll/security/ir.model.access.csv index 8bd567315..2f750af08 100644 --- a/l10n_br_hr_payroll/security/ir.model.access.csv +++ b/l10n_br_hr_payroll/security/ir.model.access.csv @@ -20,4 +20,5 @@ "access_hr_payslip_input_officer","access_hr_payslip_input_officer","hr_payroll.model_hr_payslip_input","base.group_hr_user",1,1,1,1 "access_hr_rule_input_officer","access_hr_rule_input_officer","hr_payroll.model_hr_rule_input","base.group_hr_user",1,1,1,1 "access_hr_rule_rat_fap_officer","access_hr_rule_rat_fap_officer","model_l10n_br_hr_rat_fap","base.group_hr_user",1,1,1,1 -"access_hr_campos_rescisao","access_hr_campos_rescisao","model_hr_campos_rescisao","base.group_hr_user",1,1,1,1 \ No newline at end of file +"access_hr_campos_rescisao","access_hr_campos_rescisao","model_hr_campos_rescisao","base.group_hr_user",1,1,1,1 +"access_hr_ramal_manager","access_hr_ramal_manager","model_hr_ramal","base.group_hr_manager",1,1,1,1 diff --git a/l10n_br_hr_payroll/views/hr_telefonia_view.xml b/l10n_br_hr_payroll/views/hr_telefonia_view.xml new file mode 100644 index 000000000..f61d85189 --- /dev/null +++ b/l10n_br_hr_payroll/views/hr_telefonia_view.xml @@ -0,0 +1,44 @@ + + + + + + + + hr.ramal.form + hr.ramal + +
+ + + +
+
+
+ + + hr.ramal.tree + hr.ramal + + + + + + + + + Ramais + hr.ramal + tree,form + + + + Ramais + + + + + + +
+
diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_employee.xml b/l10n_br_hr_payroll/views/l10n_br_hr_employee.xml index 16e44e596..0d3863c24 100644 --- a/l10n_br_hr_payroll/views/l10n_br_hr_employee.xml +++ b/l10n_br_hr_payroll/views/l10n_br_hr_employee.xml @@ -13,6 +13,9 @@ 1 + + + From 2426bb50bd5d044a81cdd2c03db86e5d63129f57 Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Fri, 4 May 2018 16:17:07 -0300 Subject: [PATCH 747/787] =?UTF-8?q?[ADD]=20Modelo=20para=20registros=20tel?= =?UTF-8?q?ef=C3=B4nicos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/__init__.py | 1 + l10n_br_hr_payroll/models/hr_ramal.py | 2 +- l10n_br_hr_payroll/models/hr_telefonia.py | 83 ++++++++++++++++++ .../security/ir.model.access.csv | 3 + .../views/hr_telefonia_view.xml | 84 ++++++++++++++++++- 5 files changed, 170 insertions(+), 3 deletions(-) create mode 100644 l10n_br_hr_payroll/models/hr_telefonia.py diff --git a/l10n_br_hr_payroll/models/__init__.py b/l10n_br_hr_payroll/models/__init__.py index 7bee18cf6..6bdcaa1e7 100644 --- a/l10n_br_hr_payroll/models/__init__.py +++ b/l10n_br_hr_payroll/models/__init__.py @@ -23,3 +23,4 @@ from . import res_config from . import hr_holidays from . import hr_ramal +from . import hr_telefonia diff --git a/l10n_br_hr_payroll/models/hr_ramal.py b/l10n_br_hr_payroll/models/hr_ramal.py index fbec5f08c..2a34510f3 100644 --- a/l10n_br_hr_payroll/models/hr_ramal.py +++ b/l10n_br_hr_payroll/models/hr_ramal.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright 2017 KMEE +# Copyright 2018 KMEE # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from openerp import models, fields diff --git a/l10n_br_hr_payroll/models/hr_telefonia.py b/l10n_br_hr_payroll/models/hr_telefonia.py new file mode 100644 index 000000000..42bea7876 --- /dev/null +++ b/l10n_br_hr_payroll/models/hr_telefonia.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- +# Copyright 2018 KMEE +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp import models, fields +from openerp.addons.l10n_br_hr_payroll.models.hr_payslip import MES_DO_ANO + + +class HrTelefonia(models.Model): + _name = 'hr.telefonia' + _rec_name = 'display_name' + + def _get_display_name(self): + for record in self: + display_name = "Registros Telefônicos - {}/{}".format( + record.mes, record.ano + ) + record.display_name = display_name + + display_name = fields.Char( + compute='_get_display_name' + ) + + arquivo_ligacoes = fields.Binary( + string='Arquivo de retorno', + filters='*.csv', + require=True, + copy=False + ) + + mes = fields.Selection( + string=u'Mês Competência', + selection=MES_DO_ANO, + require=True + ) + + ano = fields.Char( + string=u'Ano Competência', + required=True + ) + + ligacoes_id = fields.One2many( + comodel_name='hr.telefonia.line', + inverse_name='registro_telefonico_id' + ) + + +class HrTelefoniaLine(models.Model): + _name = 'hr.telefonia.line' + + ramal = fields.Many2one( + string='Ramal', + comodel_name='hr.ramal', + required=True + ) + + employee_id = fields.Many2one( + string='Empregado', + comodel_name='hr.employee' + ) + + valor = fields.Float( + string='Valor' + ) + + data = fields.Datetime( + string='Data e Hora', + required=True + ) + + tipo = fields.Selection( + string='Tipo', + selection=[ + ('particular', 'Particular'), + ('empresa', 'Empresa') + ] + ) + + registro_telefonico_id = fields.Many2one( + string='Registro Telefonico', + comodel_name='hr.telefonia', + required=True + ) diff --git a/l10n_br_hr_payroll/security/ir.model.access.csv b/l10n_br_hr_payroll/security/ir.model.access.csv index 2f750af08..5e7bf4241 100644 --- a/l10n_br_hr_payroll/security/ir.model.access.csv +++ b/l10n_br_hr_payroll/security/ir.model.access.csv @@ -22,3 +22,6 @@ "access_hr_rule_rat_fap_officer","access_hr_rule_rat_fap_officer","model_l10n_br_hr_rat_fap","base.group_hr_user",1,1,1,1 "access_hr_campos_rescisao","access_hr_campos_rescisao","model_hr_campos_rescisao","base.group_hr_user",1,1,1,1 "access_hr_ramal_manager","access_hr_ramal_manager","model_hr_ramal","base.group_hr_manager",1,1,1,1 +"access_hr_telefonia_manager","access_hr_telefonia_manager","model_hr_telefonia","base.group_hr_manager",1,1,1,1 +"access_hr_telefonia_line_manager","access_hr_telefonia_line_manager","model_hr_telefonia_line","base.group_hr_manager",1,1,1,1 +"access_hr_telefonia_line_officer","access_hr_telefonia_line_officer","model_hr_telefonia_line","base.group_hr_user",1,1,1,1 diff --git a/l10n_br_hr_payroll/views/hr_telefonia_view.xml b/l10n_br_hr_payroll/views/hr_telefonia_view.xml index dddda92a8..01b3d5367 100644 --- a/l10n_br_hr_payroll/views/hr_telefonia_view.xml +++ b/l10n_br_hr_payroll/views/hr_telefonia_view.xml @@ -10,7 +10,10 @@
- +

Registro Ramal

+ + +
@@ -40,6 +43,83 @@ - + + hr.telefonia.form + hr.telefonia + +
+ +

+ + + + + + + + +
+
+
+
+ + + hr.telefonia.tree + hr.telefonia + + + + + + + + + + hr.telefonia.line.form + hr.telefonia.line + +
+ + + + + + + + +
+
+
+ + + hr.telefonia.line.tree + hr.telefonia.line + + + + + + + + + + + + + + Registros Telefonicos + hr.telefonia + tree,form + + + + Registros Telefonicos + + + + + + + From bb65c5eb5eaab1a479c7bef576e86e7b4c4c0de3 Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Fri, 4 May 2018 16:54:22 -0300 Subject: [PATCH 748/787] =?UTF-8?q?[FIX]=20Layout=20da=20view=20de=20regis?= =?UTF-8?q?tros=20telef=C3=B4nicos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_telefonia.py | 3 ++- l10n_br_hr_payroll/views/hr_telefonia_view.xml | 11 ++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_telefonia.py b/l10n_br_hr_payroll/models/hr_telefonia.py index 42bea7876..23a5254c8 100644 --- a/l10n_br_hr_payroll/models/hr_telefonia.py +++ b/l10n_br_hr_payroll/models/hr_telefonia.py @@ -36,7 +36,8 @@ def _get_display_name(self): ano = fields.Char( string=u'Ano Competência', - required=True + required=True, + size=4 ) ligacoes_id = fields.One2many( diff --git a/l10n_br_hr_payroll/views/hr_telefonia_view.xml b/l10n_br_hr_payroll/views/hr_telefonia_view.xml index 01b3d5367..b854f04f2 100644 --- a/l10n_br_hr_payroll/views/hr_telefonia_view.xml +++ b/l10n_br_hr_payroll/views/hr_telefonia_view.xml @@ -52,12 +52,17 @@

- - - + + + + + + + + From d8afc3127a8941e80dca8cb09f43a33b87d67f65 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 7 May 2018 08:26:47 -0300 Subject: [PATCH 749/787] =?UTF-8?q?[ADD]=20Fun=C3=A7=C3=A3o=20para=20impor?= =?UTF-8?q?tar=20ligacoes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_telefonia.py | 42 ++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_telefonia.py b/l10n_br_hr_payroll/models/hr_telefonia.py index 23a5254c8..ba2054808 100644 --- a/l10n_br_hr_payroll/models/hr_telefonia.py +++ b/l10n_br_hr_payroll/models/hr_telefonia.py @@ -2,7 +2,7 @@ # Copyright 2018 KMEE # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from openerp import models, fields +from openerp import api, models, fields from openerp.addons.l10n_br_hr_payroll.models.hr_payslip import MES_DO_ANO @@ -45,6 +45,46 @@ def _get_display_name(self): inverse_name='registro_telefonico_id' ) + @api.multi + def button_importar_csv(self): + for record in self: + if record.arquivo_ligacoes: + + # import csv, sys + import base64 + + arq = base64.b64decode(record.arquivo_ligacoes) + linhas = arq.splitlines(True) + + for linha in linhas: + + l = linha.split(';') + + if len(l) > 7 and len(l[0]) == 4: + name_ramal = l[0] + ramal = self.env['hr.ramal'].search([('name', '=', name_ramal)]) + + data = l[1] + numero_discado = l[2] + concessionaria = l[3] + localidade = l[4] + inicio = l[5] + duracao = l[6] + valor = l[7] + + vals = { + 'ramal': ramal.id if ramal else False, + 'data': data, + 'numero_discado': numero_discado, + 'concessionaria': concessionaria, + 'localidade': localidade, + 'inicio': inicio, + 'duracao': duracao, + 'registro_telefonico_id': record.id, + } + + self.env['hr.telefonia.line'].create(vals) + class HrTelefoniaLine(models.Model): _name = 'hr.telefonia.line' From 91ca8f0804ebb8b5c2b4bc8e1c642bce262c7b40 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 7 May 2018 08:27:26 -0300 Subject: [PATCH 750/787] [ADD] Campos complementares do modelo --- l10n_br_hr_payroll/models/hr_telefonia.py | 29 ++++++++++++++++++----- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_telefonia.py b/l10n_br_hr_payroll/models/hr_telefonia.py index ba2054808..c145f1838 100644 --- a/l10n_br_hr_payroll/models/hr_telefonia.py +++ b/l10n_br_hr_payroll/models/hr_telefonia.py @@ -92,33 +92,50 @@ class HrTelefoniaLine(models.Model): ramal = fields.Many2one( string='Ramal', comodel_name='hr.ramal', - required=True ) employee_id = fields.Many2one( string='Empregado', - comodel_name='hr.employee' + comodel_name='hr.employee', ) valor = fields.Float( - string='Valor' + string='Valor', ) data = fields.Datetime( string='Data e Hora', - required=True + required=True, ) tipo = fields.Selection( string='Tipo', selection=[ + ('', ''), ('particular', 'Particular'), ('empresa', 'Empresa') - ] + ], + default='empresa', ) registro_telefonico_id = fields.Many2one( string='Registro Telefonico', comodel_name='hr.telefonia', - required=True + required=True, + ) + + concessionaria = fields.Char( + string='Concessionária', + ) + + localidade = fields.Char( + string='Localidade', + ) + + hora_inicio = fields.Datetime( + string='Hora de Início', + ) + + duracao = fields.Char( + string='Duração da ligação', ) From ec3fcd2b45fb5941f13cf27f7554ee6c6349a762 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 7 May 2018 08:27:48 -0300 Subject: [PATCH 751/787] =?UTF-8?q?[ADD]=20Bot=C3=A3o=20e=20view=20para=20?= =?UTF-8?q?Ligacoes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/hr_telefonia_view.xml | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/views/hr_telefonia_view.xml b/l10n_br_hr_payroll/views/hr_telefonia_view.xml index b854f04f2..6ac2bc263 100644 --- a/l10n_br_hr_payroll/views/hr_telefonia_view.xml +++ b/l10n_br_hr_payroll/views/hr_telefonia_view.xml @@ -48,6 +48,11 @@ hr.telefonia
+
+

@@ -91,7 +96,6 @@ -
@@ -126,5 +130,20 @@ + + + + Registros Telefonicos + hr.telefonia.line + tree,form + + + + Registros Ligações + + + + + From fb4fcbc0fe35364cb0f2cb920aa3f8ed77f11c9d Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 7 May 2018 09:05:52 -0300 Subject: [PATCH 752/787] =?UTF-8?q?[ADD]=20Se=20n=C3=A3o=20identificar=20r?= =?UTF-8?q?amal,=20criar=20automaticamente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_telefonia.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_telefonia.py b/l10n_br_hr_payroll/models/hr_telefonia.py index c145f1838..1eee5591c 100644 --- a/l10n_br_hr_payroll/models/hr_telefonia.py +++ b/l10n_br_hr_payroll/models/hr_telefonia.py @@ -47,10 +47,13 @@ def _get_display_name(self): @api.multi def button_importar_csv(self): + + ramal_obj = self.env['hr.ramal'] + for record in self: if record.arquivo_ligacoes: - # import csv, sys + # import csv import base64 arq = base64.b64decode(record.arquivo_ligacoes) @@ -62,7 +65,10 @@ def button_importar_csv(self): if len(l) > 7 and len(l[0]) == 4: name_ramal = l[0] - ramal = self.env['hr.ramal'].search([('name', '=', name_ramal)]) + ramal_id = ramal_obj.search([('name', '=', name_ramal)]) + + if not ramal_id: + ramal_id = ramal_obj.create({'name': name_ramal}) data = l[1] numero_discado = l[2] @@ -73,7 +79,7 @@ def button_importar_csv(self): valor = l[7] vals = { - 'ramal': ramal.id if ramal else False, + 'ramal': ramal_id.id, 'data': data, 'numero_discado': numero_discado, 'concessionaria': concessionaria, @@ -92,6 +98,7 @@ class HrTelefoniaLine(models.Model): ramal = fields.Many2one( string='Ramal', comodel_name='hr.ramal', + required=True, ) employee_id = fields.Many2one( From e81926a36759f8ea93d5e1c7b17793f28d00fd54 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 7 May 2018 09:06:49 -0300 Subject: [PATCH 753/787] [ADD] Preencher campo referente valor da ligacao do modelo e o funcionario --- l10n_br_hr_payroll/models/hr_ramal.py | 10 ++++++++-- l10n_br_hr_payroll/models/hr_telefonia.py | 4 +++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_ramal.py b/l10n_br_hr_payroll/models/hr_ramal.py index 2a34510f3..78dde0dcb 100644 --- a/l10n_br_hr_payroll/models/hr_ramal.py +++ b/l10n_br_hr_payroll/models/hr_ramal.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright 2018 KMEE +# Copyright 2018 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from openerp import models, fields @@ -10,5 +10,11 @@ class HrRamal(models.Model): name = fields.Char( string=u'Nº Ramal', - required=True + required=True, + ) + + hr_employee_ids = fields.One2many( + comodel_name='hr.employee', + inverse_name='ramais', + string=u'Funcionários', ) diff --git a/l10n_br_hr_payroll/models/hr_telefonia.py b/l10n_br_hr_payroll/models/hr_telefonia.py index 1eee5591c..32de727b1 100644 --- a/l10n_br_hr_payroll/models/hr_telefonia.py +++ b/l10n_br_hr_payroll/models/hr_telefonia.py @@ -76,7 +76,7 @@ def button_importar_csv(self): localidade = l[4] inicio = l[5] duracao = l[6] - valor = l[7] + valor = float(l[7].replace(',','.')) vals = { 'ramal': ramal_id.id, @@ -86,7 +86,9 @@ def button_importar_csv(self): 'localidade': localidade, 'inicio': inicio, 'duracao': duracao, + 'valor': valor, 'registro_telefonico_id': record.id, + 'employee_id': ramal_id.hr_employee_ids[0].id if len(ramal_id.hr_employee_ids) == 1 else False } self.env['hr.telefonia.line'].create(vals) From 14e5b91e9df88cd26b52c7bc2ebab2316045f9c7 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 7 May 2018 09:07:14 -0300 Subject: [PATCH 754/787] [ADD] Colocar funcionario relacionado ao ramal nas visoes --- l10n_br_hr_payroll/views/hr_telefonia_view.xml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/l10n_br_hr_payroll/views/hr_telefonia_view.xml b/l10n_br_hr_payroll/views/hr_telefonia_view.xml index 6ac2bc263..04a5d688d 100644 --- a/l10n_br_hr_payroll/views/hr_telefonia_view.xml +++ b/l10n_br_hr_payroll/views/hr_telefonia_view.xml @@ -13,6 +13,7 @@

Registro Ramal

+ @@ -25,6 +26,7 @@ + @@ -91,11 +93,13 @@
- - - - - + + + + + + +
From 820985f4920527ccf6c6c3e6d3356206a42080f9 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 7 May 2018 09:54:17 -0300 Subject: [PATCH 755/787] =?UTF-8?q?[ADD]=20Campos=20de=20informa=C3=A7?= =?UTF-8?q?=C3=B5es=20complementares=20e=20fun=C3=A7=C3=A3o=20para=20setar?= =?UTF-8?q?=20tipo=20de=20ligacoes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_telefonia.py | 32 ++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_telefonia.py b/l10n_br_hr_payroll/models/hr_telefonia.py index 32de727b1..db50d028f 100644 --- a/l10n_br_hr_payroll/models/hr_telefonia.py +++ b/l10n_br_hr_payroll/models/hr_telefonia.py @@ -112,7 +112,7 @@ class HrTelefoniaLine(models.Model): string='Valor', ) - data = fields.Datetime( + data = fields.Date( string='Data e Hora', required=True, ) @@ -145,6 +145,36 @@ class HrTelefoniaLine(models.Model): string='Hora de Início', ) + inicio = fields.Char( + string='Inicio', + required=True, + ) + duracao = fields.Char( string='Duração da ligação', + required=True, + ) + + numero_discado = fields.Char( + string='Numero Discado', ) + + @api.multi + def set_particular(self): + """ + Setar as ligações para particular + :return: + """ + for record in self: + record.tipo = 'particular' + # record.employee_id = self.env.user.employee_ids[0] + + @api.multi + def set_empresa(self): + """ + Setar as ligações como ligações da empresa + :return: + """ + for record in self: + record.tipo = 'empresa' + # record.employee_id = self.env.user.employee_ids[0] From 4b920d479e52e475c1643f6579509b2ed987e85e Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 7 May 2018 09:54:43 -0300 Subject: [PATCH 756/787] [ADD] Campos e botoes de acoes para ligacoes --- .../views/hr_telefonia_view.xml | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/l10n_br_hr_payroll/views/hr_telefonia_view.xml b/l10n_br_hr_payroll/views/hr_telefonia_view.xml index 04a5d688d..50b07711e 100644 --- a/l10n_br_hr_payroll/views/hr_telefonia_view.xml +++ b/l10n_br_hr_payroll/views/hr_telefonia_view.xml @@ -13,7 +13,11 @@

Registro Ramal

- + + + + + @@ -92,13 +96,28 @@ hr.telefonia.line
+
+
- - - - + + + + + + + + + + + +
From 50f3966a904e4b0f1eccac52904577121b772d7b Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 7 May 2018 13:23:53 -0300 Subject: [PATCH 757/787] [ADD] rec_name --- l10n_br_hr_payroll/models/hr_telefonia.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/l10n_br_hr_payroll/models/hr_telefonia.py b/l10n_br_hr_payroll/models/hr_telefonia.py index db50d028f..d142d2b06 100644 --- a/l10n_br_hr_payroll/models/hr_telefonia.py +++ b/l10n_br_hr_payroll/models/hr_telefonia.py @@ -97,6 +97,12 @@ def button_importar_csv(self): class HrTelefoniaLine(models.Model): _name = 'hr.telefonia.line' + name = fields.Char( + compute='compute_name', + string=u'Descrição', + store=True, + ) + ramal = fields.Many2one( string='Ramal', comodel_name='hr.ramal', @@ -159,6 +165,14 @@ class HrTelefoniaLine(models.Model): string='Numero Discado', ) + @api.multi + @api.depends('ramal', 'employee_id') + def compute_name(self): + for record in self: + if record.employee_id and record.ramal: + record.name = 'Ligação Ramal: {} ({})'.format( + record.ramal.name,record.employee_id[0].name[:14]) + @api.multi def set_particular(self): """ From 21c1a0bc46a06f82ff41b64f06fdde1f9b107e94 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 7 May 2018 13:24:38 -0300 Subject: [PATCH 758/787] [ADD] Campo de controle de situacao --- l10n_br_hr_payroll/models/hr_telefonia.py | 24 +++++++++++++++++++ .../views/hr_telefonia_view.xml | 6 +++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_telefonia.py b/l10n_br_hr_payroll/models/hr_telefonia.py index d142d2b06..23d1ab4c5 100644 --- a/l10n_br_hr_payroll/models/hr_telefonia.py +++ b/l10n_br_hr_payroll/models/hr_telefonia.py @@ -107,20 +107,24 @@ class HrTelefoniaLine(models.Model): string='Ramal', comodel_name='hr.ramal', required=True, + states={'validate': [('readonly', True)]}, ) employee_id = fields.Many2one( string='Empregado', comodel_name='hr.employee', + states={'validate': [('readonly', True)]}, ) valor = fields.Float( string='Valor', + states={'validate': [('readonly', True)]}, ) data = fields.Date( string='Data e Hora', required=True, + states={'validate': [('readonly', True)]}, ) tipo = fields.Selection( @@ -131,38 +135,56 @@ class HrTelefoniaLine(models.Model): ('empresa', 'Empresa') ], default='empresa', + states={'validate': [('readonly', True)]}, ) + state = fields.Selection( + string=u'Situação', + selection=[ + ('draft', 'Em aberto'), + ('validate', 'Atestado') + ], + default='draft', + ) + + registro_telefonico_id = fields.Many2one( string='Registro Telefonico', comodel_name='hr.telefonia', required=True, + states={'validate': [('readonly', True)]}, ) concessionaria = fields.Char( string='Concessionária', + states={'validate': [('readonly', True)]}, ) localidade = fields.Char( string='Localidade', + states={'validate': [('readonly', True)]}, ) hora_inicio = fields.Datetime( string='Hora de Início', + states={'validate': [('readonly', True)]}, ) inicio = fields.Char( string='Inicio', required=True, + states={'validate': [('readonly', True)]}, ) duracao = fields.Char( string='Duração da ligação', required=True, + states={'validate': [('readonly', True)]}, ) numero_discado = fields.Char( string='Numero Discado', + states={'validate': [('readonly', True)]}, ) @api.multi @@ -181,6 +203,7 @@ def set_particular(self): """ for record in self: record.tipo = 'particular' + record.state = 'validate' # record.employee_id = self.env.user.employee_ids[0] @api.multi @@ -191,4 +214,5 @@ def set_empresa(self): """ for record in self: record.tipo = 'empresa' + record.state = 'validate' # record.employee_id = self.env.user.employee_ids[0] diff --git a/l10n_br_hr_payroll/views/hr_telefonia_view.xml b/l10n_br_hr_payroll/views/hr_telefonia_view.xml index 50b07711e..7628e5363 100644 --- a/l10n_br_hr_payroll/views/hr_telefonia_view.xml +++ b/l10n_br_hr_payroll/views/hr_telefonia_view.xml @@ -108,6 +108,7 @@ + @@ -128,13 +129,14 @@ hr.telefonia.line.tree hr.telefonia.line - + + - + From f5080e36b984f278685c28d85e96a25cd4184324 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 7 May 2018 13:24:52 -0300 Subject: [PATCH 759/787] [ADD] Wizard para ateste de ligacoes --- l10n_br_hr_payroll/__init__.py | 1 + l10n_br_hr_payroll/__openerp__.py | 4 ++ l10n_br_hr_payroll/wizards/__init__.py | 5 ++ .../wizards/hr_ateste_telefonia_wizard.py | 38 +++++++++++++++ .../wizards/hr_ateste_telefonia_wizard.xml | 47 +++++++++++++++++++ 5 files changed, 95 insertions(+) create mode 100644 l10n_br_hr_payroll/wizards/__init__.py create mode 100644 l10n_br_hr_payroll/wizards/hr_ateste_telefonia_wizard.py create mode 100644 l10n_br_hr_payroll/wizards/hr_ateste_telefonia_wizard.xml diff --git a/l10n_br_hr_payroll/__init__.py b/l10n_br_hr_payroll/__init__.py index 31ead9482..3ebd92033 100644 --- a/l10n_br_hr_payroll/__init__.py +++ b/l10n_br_hr_payroll/__init__.py @@ -3,3 +3,4 @@ # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html from . import models +from . import wizards diff --git a/l10n_br_hr_payroll/__openerp__.py b/l10n_br_hr_payroll/__openerp__.py index 2c13a1fe7..6d93ccd43 100644 --- a/l10n_br_hr_payroll/__openerp__.py +++ b/l10n_br_hr_payroll/__openerp__.py @@ -54,6 +54,10 @@ 'views/l10n_br_hr_contract_change/jornada.xml', 'views/l10n_br_hr_contract_change/filiacao_sindical.xml', 'views/l10n_br_hr_contract_change/cargo_atividade.xml', + + # wizards + 'wizards/hr_ateste_telefonia_wizard.xml', + ], 'demo': [ # 'demo/hr_contract.xml', diff --git a/l10n_br_hr_payroll/wizards/__init__.py b/l10n_br_hr_payroll/wizards/__init__.py new file mode 100644 index 000000000..ea93d50cd --- /dev/null +++ b/l10n_br_hr_payroll/wizards/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2018 +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from . import hr_ateste_telefonia_wizard diff --git a/l10n_br_hr_payroll/wizards/hr_ateste_telefonia_wizard.py b/l10n_br_hr_payroll/wizards/hr_ateste_telefonia_wizard.py new file mode 100644 index 000000000..55ab1ff09 --- /dev/null +++ b/l10n_br_hr_payroll/wizards/hr_ateste_telefonia_wizard.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Copyright 2018 KMEE +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp import api, models, fields +from openerp.exceptions import ValidationError + + +class HrTelefoniaWizard(models.TransientModel): + _name = 'hr.ateste.telefonia.wizard' + + mensagem_ateste = fields.Char( + string='Mensagem do Ateste', + readonly=True, + default=u'Atesto que as ligações previamente selecionadas foram particulares.', + ) + + ligacoes_ids = fields.Many2many( + comodel_name='hr.telefonia.line', + string=u'Ligacoes', + relation='ateste_ligacoes_wizard_rel', + column1='wizard_id', + column2='ligacoes_id', + ) + + @api.multi + def atestar_ligacoes_particulares(self): + ''' + Setar ligacoes do wizard como particulares + :return: + ''' + proxy = self.env['hr.telefonia.line'] + + for record in proxy.browse(self._context.get('active_ids', [])): + if not record.employee_id or not record.ramal: + raise ValidationError('Faltando informações na ligação!') + record.set_particular() + return {'type': 'ir.actions.act_window_close'} diff --git a/l10n_br_hr_payroll/wizards/hr_ateste_telefonia_wizard.xml b/l10n_br_hr_payroll/wizards/hr_ateste_telefonia_wizard.xml new file mode 100644 index 000000000..1b262d997 --- /dev/null +++ b/l10n_br_hr_payroll/wizards/hr_ateste_telefonia_wizard.xml @@ -0,0 +1,47 @@ + + + + + + hr.ateste.telefonia.wizard + hr.ateste.telefonia.wizard + +
+ +

+ +

+
+ + + + + + + + +
+
+
+
+
+ + + +
+
From 347ac2a695a73dcd8a85edd067b519830dc78c8e Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Mon, 7 May 2018 13:38:05 -0300 Subject: [PATCH 760/787] =?UTF-8?q?[ADD]=20Domain=20para=20visualiza=C3=A7?= =?UTF-8?q?=C3=A3o=20dos=20empregados=20=C3=A0s=20liga=C3=A7=C3=B5es=20tel?= =?UTF-8?q?ef=C3=B4nicas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_telefonia.py | 15 +++++++++++++++ l10n_br_hr_payroll/views/hr_telefonia_view.xml | 17 +++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/l10n_br_hr_payroll/models/hr_telefonia.py b/l10n_br_hr_payroll/models/hr_telefonia.py index 23d1ab4c5..10f8ef6ed 100644 --- a/l10n_br_hr_payroll/models/hr_telefonia.py +++ b/l10n_br_hr_payroll/models/hr_telefonia.py @@ -96,6 +96,21 @@ def button_importar_csv(self): class HrTelefoniaLine(models.Model): _name = 'hr.telefonia.line' + _rec_name = 'display_name' + + @api.multi + def _get_telefonia_line_name(self): + for record in self: + title = '{} - {}{}'.format( + record.ramal.name, + record.employee_id.name + ' - ' if record.employee_id else '', + record.data + ) + record.display_name = title + + display_name = fields.Char( + compute='_get_telefonia_line_name' + ) name = fields.Char( compute='compute_name', diff --git a/l10n_br_hr_payroll/views/hr_telefonia_view.xml b/l10n_br_hr_payroll/views/hr_telefonia_view.xml index 7628e5363..4172ee599 100644 --- a/l10n_br_hr_payroll/views/hr_telefonia_view.xml +++ b/l10n_br_hr_payroll/views/hr_telefonia_view.xml @@ -155,11 +155,28 @@ + + hr.telefonia.line.search + hr.telefonia.line + + + + + + + + + + + + Registros Telefonicos hr.telefonia.line + ['|', ('employee_id.user_id.id', '=', uid), ('employee_id', '=', False)] + {'search_default_group_by_data': True, 'search_default_group_by_employee': True} tree,form From e43279a9ffa79591fdcc512095b481dd1eea6aca Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 7 May 2018 14:11:36 -0300 Subject: [PATCH 761/787] [FIX] Alterar ordem e adicionar campo --- l10n_br_hr_payroll/views/hr_telefonia_view.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_payroll/views/hr_telefonia_view.xml b/l10n_br_hr_payroll/views/hr_telefonia_view.xml index 4172ee599..7580f3c3e 100644 --- a/l10n_br_hr_payroll/views/hr_telefonia_view.xml +++ b/l10n_br_hr_payroll/views/hr_telefonia_view.xml @@ -131,10 +131,11 @@ + + + - - From 6145f135e92d65b7ca304b5cf9540cbd80947069 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 7 May 2018 14:38:58 -0300 Subject: [PATCH 762/787] [FIX] Input do ramal --- l10n_br_hr_payroll/views/l10n_br_hr_employee.xml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/l10n_br_hr_payroll/views/l10n_br_hr_employee.xml b/l10n_br_hr_payroll/views/l10n_br_hr_employee.xml index 0d3863c24..2aabcb0ef 100644 --- a/l10n_br_hr_payroll/views/l10n_br_hr_employee.xml +++ b/l10n_br_hr_payroll/views/l10n_br_hr_employee.xml @@ -13,8 +13,11 @@ 1 - - + + + + + From d31e72fc84db15a92cb54e18c878c0961289d111 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 7 May 2018 14:57:07 -0300 Subject: [PATCH 763/787] =?UTF-8?q?[FIX]=20Bloquear=20a=20adi=C3=A7=C3=A3o?= =?UTF-8?q?=20de=20registros=20manuais?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/views/hr_telefonia_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/views/hr_telefonia_view.xml b/l10n_br_hr_payroll/views/hr_telefonia_view.xml index 7580f3c3e..19bc02e51 100644 --- a/l10n_br_hr_payroll/views/hr_telefonia_view.xml +++ b/l10n_br_hr_payroll/views/hr_telefonia_view.xml @@ -73,7 +73,7 @@
- + From b4d5ffcb236e6cfff57d3bd8e627c735899f53de Mon Sep 17 00:00:00 2001 From: Luiz Felipe do Divino Date: Mon, 7 May 2018 15:53:25 -0300 Subject: [PATCH 764/787] =?UTF-8?q?[ADD]=20Valida=C3=A7=C3=A3o=20para=20n?= =?UTF-8?q?=C3=A3o=20criar=20ramais=20iguais?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_ramal.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/l10n_br_hr_payroll/models/hr_ramal.py b/l10n_br_hr_payroll/models/hr_ramal.py index 78dde0dcb..375015b11 100644 --- a/l10n_br_hr_payroll/models/hr_ramal.py +++ b/l10n_br_hr_payroll/models/hr_ramal.py @@ -2,12 +2,20 @@ # Copyright 2018 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from openerp import models, fields +from openerp import api, models, fields +from openerp.exceptions import ValidationError class HrRamal(models.Model): _name = 'hr.ramal' + @api.constrains('name') + def _check_description(self): + if len(self.search([('name', '=', self.name)]).ids) > 1: + raise ValidationError( + "Este ramal já está cadastrado!" + ) + name = fields.Char( string=u'Nº Ramal', required=True, From 31847c6e29c1f5dcd7878cb03efeaed002b482fc Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Mon, 7 May 2018 17:14:25 -0300 Subject: [PATCH 765/787] =?UTF-8?q?[WIP]=20Integra=C3=A7=C3=A3o=20ligacao?= =?UTF-8?q?=20com=20folha=20de=20pagamento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- l10n_br_hr_payroll/models/hr_payslip.py | 34 ++++++++++++++++++ l10n_br_hr_payroll/models/hr_telefonia.py | 35 +++++++++++-------- l10n_br_hr_payroll/views/hr_payslip.xml | 15 ++++++++ .../views/hr_telefonia_view.xml | 21 ++++++----- 4 files changed, 82 insertions(+), 23 deletions(-) diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index de14c7aa3..df619b884 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -85,6 +85,9 @@ def hr_verify_sheet(self): # Atualizar o controle de férias, o controle de férias do # contrato é baseado nos holerites validados holerite.contract_id.action_button_update_controle_ferias() + # setar as ligacoes telefonicas como debitadas + for ligacao_id in holerite.ligacoes_ids: + ligacao_id.state = 'paid' @api.multi def draft(self): @@ -94,6 +97,9 @@ def draft(self): # Atualizar o controle de férias, o controle de férias do # contrato é baseado nos holerites validados holerite.contract_id.action_button_update_controle_ferias() + # setar as ligacoes telefonicas como atestadas + for ligacao_id in holerite.ligacoes_ids: + ligacao_id = 'validate' @api.multi def name_get(self): @@ -610,6 +616,12 @@ def _compute_periodo_aquisitivo(self): string=u'Campo de Rescisão' ) + ligacoes_ids = fields.One2many( + comodel_name='hr.telefonia.line', + inverse_name='payslip_id', + string=u'Ligações', + ) + @api.depends('periodo_aquisitivo') @api.model def _compute_saldo_periodo_aquisitivo(self): @@ -1092,6 +1104,28 @@ def get_specific_rubric_value(self, rubrica_id, medias_obj=False, rubrica.specific_percentual / 100 * \ rubrica.specific_amount + @api.multi + def get_desconto_ligacao_telefonica(self): + """ + Função para buscar descontos de ligacoes telefonicas atestadas pelo + funcionario + :return: + """ + ligacao_obj = self.env['hr.telefonia.line'] + for holerite_id in self: + domain = [ + ('state','=','validate'), + ('tipo','=','particular'), + ('employee_id','=', holerite_id.contract_id.employee_id.id), + ] + ligacoes_ids = ligacao_obj.search(domain) + if ligacoes_ids: + # Criar relacao entre a ligacao e o holerite + for ligacao_id in ligacoes_ids: + ligacao_id.payslip_id = holerite_id.id + return sum(ligacoes_ids.mapped('valor')) + return 0.0 + @api.multi def _buscar_valor_salario(self, codigo): for tipo_salario in self.input_line_ids: diff --git a/l10n_br_hr_payroll/models/hr_telefonia.py b/l10n_br_hr_payroll/models/hr_telefonia.py index 10f8ef6ed..9e56168de 100644 --- a/l10n_br_hr_payroll/models/hr_telefonia.py +++ b/l10n_br_hr_payroll/models/hr_telefonia.py @@ -122,24 +122,24 @@ def _get_telefonia_line_name(self): string='Ramal', comodel_name='hr.ramal', required=True, - states={'validate': [('readonly', True)]}, + # states={'validate': [('readonly', True)]}, ) employee_id = fields.Many2one( string='Empregado', comodel_name='hr.employee', - states={'validate': [('readonly', True)]}, + # states={'validate': [('readonly', True)]}, ) valor = fields.Float( string='Valor', - states={'validate': [('readonly', True)]}, + # states={'validate': [('readonly', True)]}, ) data = fields.Date( string='Data e Hora', required=True, - states={'validate': [('readonly', True)]}, + # states={'validate': [('readonly', True)]}, ) tipo = fields.Selection( @@ -150,56 +150,61 @@ def _get_telefonia_line_name(self): ('empresa', 'Empresa') ], default='empresa', - states={'validate': [('readonly', True)]}, + # states={'validate': [('readonly', True)]}, ) state = fields.Selection( string=u'Situação', selection=[ - ('draft', 'Em aberto'), - ('validate', 'Atestado') + ('open', 'Em aberto'), + ('validate', 'Atestado'), + ('paid', 'Debitado'), ], - default='draft', + default='open', ) + payslip_id = fields.Many2one( + comodel_name='hr.payslip', + string='Holerite', + ) registro_telefonico_id = fields.Many2one( string='Registro Telefonico', comodel_name='hr.telefonia', required=True, - states={'validate': [('readonly', True)]}, + # states={'validate': [('readonly', True)]}, ) concessionaria = fields.Char( string='Concessionária', - states={'validate': [('readonly', True)]}, + # states={'validate': [('readonly', True)]}, ) localidade = fields.Char( string='Localidade', - states={'validate': [('readonly', True)]}, + # states={'validate': [('readonly', True)]}, ) hora_inicio = fields.Datetime( string='Hora de Início', - states={'validate': [('readonly', True)]}, + # states={'validate': [('readonly', True)]}, ) inicio = fields.Char( string='Inicio', required=True, - states={'validate': [('readonly', True)]}, + # states={'validate': [('readonly', True)]}, ) duracao = fields.Char( string='Duração da ligação', required=True, - states={'validate': [('readonly', True)]}, + # states={'validate': [('readonly', True)]}, ) numero_discado = fields.Char( string='Numero Discado', - states={'validate': [('readonly', True)]}, + # states={'validate': [('readonly', True)]}, ) @api.multi diff --git a/l10n_br_hr_payroll/views/hr_payslip.xml b/l10n_br_hr_payroll/views/hr_payslip.xml index 751d28bf7..1ac77e6c4 100644 --- a/l10n_br_hr_payroll/views/hr_payslip.xml +++ b/l10n_br_hr_payroll/views/hr_payslip.xml @@ -206,6 +206,21 @@ + + + + + + + + + + + + + +
diff --git a/l10n_br_hr_payroll/views/hr_telefonia_view.xml b/l10n_br_hr_payroll/views/hr_telefonia_view.xml index 19bc02e51..08d27a540 100644 --- a/l10n_br_hr_payroll/views/hr_telefonia_view.xml +++ b/l10n_br_hr_payroll/views/hr_telefonia_view.xml @@ -105,10 +105,13 @@ + - - + + + + @@ -129,15 +132,17 @@ hr.telefonia.line.tree hr.telefonia.line - - - + + + + + - - - + + + From 2d7423bca81e9c0e776287113d30ead435bca275 Mon Sep 17 00:00:00 2001 From: Hendrix Costa Date: Tue, 8 May 2018 11:13:35 -0300 Subject: [PATCH 766/787] [FIX] Primeira versao do ateste de ligacoes --- l10n_br_hr_payroll/__openerp__.py | 3 ++ l10n_br_hr_payroll/models/hr_payslip.py | 9 ++++- l10n_br_hr_payroll/models/hr_telefonia.py | 20 ++++++++--- l10n_br_hr_payroll/views/hr_payslip.xml | 1 + .../views/hr_telefonia_view.xml | 36 ++++++++++++++----- .../wizards/hr_ateste_telefonia_wizard.py | 2 +- .../wizards/hr_ateste_telefonia_wizard.xml | 2 +- 7 files changed, 56 insertions(+), 17 deletions(-) diff --git a/l10n_br_hr_payroll/__openerp__.py b/l10n_br_hr_payroll/__openerp__.py index 6d93ccd43..c5beb1b52 100644 --- a/l10n_br_hr_payroll/__openerp__.py +++ b/l10n_br_hr_payroll/__openerp__.py @@ -28,10 +28,13 @@ 'data/l10n_br_hr_tabela_IR_dependente.xml', 'data/l10n_br_hr_tabela_RAT_FAP.xml', 'data/l10n_br_hr_payroll_decimal_precision.xml', + 'security/l10n_br_hr_contract.xml', 'security/l10n_br_hr_payslip_security_rule.xml', 'security/ir.model.access.csv', 'security/l10n_br_hr_rat_fap_security_rule.xml', + 'security/hr_telefonia_line_security_rule.xml', + 'views/hr_contract.xml', 'views/l10n_br_hr_employee.xml', 'views/hr_payroll_structure.xml', diff --git a/l10n_br_hr_payroll/models/hr_payslip.py b/l10n_br_hr_payroll/models/hr_payslip.py index df619b884..30a39e7b7 100644 --- a/l10n_br_hr_payroll/models/hr_payslip.py +++ b/l10n_br_hr_payroll/models/hr_payslip.py @@ -85,6 +85,7 @@ def hr_verify_sheet(self): # Atualizar o controle de férias, o controle de férias do # contrato é baseado nos holerites validados holerite.contract_id.action_button_update_controle_ferias() + # setar as ligacoes telefonicas como debitadas for ligacao_id in holerite.ligacoes_ids: ligacao_id.state = 'paid' @@ -97,9 +98,10 @@ def draft(self): # Atualizar o controle de férias, o controle de férias do # contrato é baseado nos holerites validados holerite.contract_id.action_button_update_controle_ferias() + # setar as ligacoes telefonicas como atestadas for ligacao_id in holerite.ligacoes_ids: - ligacao_id = 'validate' + ligacao_id.write({'state': 'validate'}) @api.multi def name_get(self): @@ -1113,10 +1115,15 @@ def get_desconto_ligacao_telefonica(self): """ ligacao_obj = self.env['hr.telefonia.line'] for holerite_id in self: + + # Desvincular antigas + holerite_id.ligacoes_ids = False + domain = [ ('state','=','validate'), ('tipo','=','particular'), ('employee_id','=', holerite_id.contract_id.employee_id.id), + ('payslip_id','=', False) ] ligacoes_ids = ligacao_obj.search(domain) if ligacoes_ids: diff --git a/l10n_br_hr_payroll/models/hr_telefonia.py b/l10n_br_hr_payroll/models/hr_telefonia.py index 9e56168de..e0ac95beb 100644 --- a/l10n_br_hr_payroll/models/hr_telefonia.py +++ b/l10n_br_hr_payroll/models/hr_telefonia.py @@ -137,7 +137,7 @@ def _get_telefonia_line_name(self): ) data = fields.Date( - string='Data e Hora', + string='Data', required=True, # states={'validate': [('readonly', True)]}, ) @@ -215,6 +215,17 @@ def compute_name(self): record.name = 'Ligação Ramal: {} ({})'.format( record.ramal.name,record.employee_id[0].name[:14]) + @api.multi + def set_validate_ligacoes(self): + """ + Rotina para atestar ligacoes como particulares ou nao + depois dessa rotina a ligacao sera bloqueada para edicoes + :return: + """ + for record in self: + # Atesta as ligacoes + record.state = 'validate' + @api.multi def set_particular(self): """ @@ -222,9 +233,9 @@ def set_particular(self): :return: """ for record in self: + # record.particular = True record.tipo = 'particular' - record.state = 'validate' - # record.employee_id = self.env.user.employee_ids[0] + @api.multi def set_empresa(self): @@ -233,6 +244,5 @@ def set_empresa(self): :return: """ for record in self: + # record.particular = False record.tipo = 'empresa' - record.state = 'validate' - # record.employee_id = self.env.user.employee_ids[0] diff --git a/l10n_br_hr_payroll/views/hr_payslip.xml b/l10n_br_hr_payroll/views/hr_payslip.xml index 1ac77e6c4..bc8f9616c 100644 --- a/l10n_br_hr_payroll/views/hr_payslip.xml +++ b/l10n_br_hr_payroll/views/hr_payslip.xml @@ -217,6 +217,7 @@ + diff --git a/l10n_br_hr_payroll/views/hr_telefonia_view.xml b/l10n_br_hr_payroll/views/hr_telefonia_view.xml index 08d27a540..227d418ec 100644 --- a/l10n_br_hr_payroll/views/hr_telefonia_view.xml +++ b/l10n_br_hr_payroll/views/hr_telefonia_view.xml @@ -97,10 +97,10 @@
-
@@ -123,6 +123,9 @@ + + +
@@ -132,16 +135,31 @@ hr.telefonia.line.tree hr.telefonia.line - + + + + + + +